From 85d086dab13c7c38268afe018a6fb28b45c1a0b5 Mon Sep 17 00:00:00 2001 From: tomo Date: Tue, 4 Sep 2001 11:09:30 +0000 Subject: [PATCH] This commit was manufactured by cvs2svn to create branch 'unlabeled-1.1.2.4.2'. --- ChangeLog | 999 - ChangeLog.1 | 4121 ---- ChangeLog.2 | 620 - ChangeLog.3 | 2916 --- GNUS-NEWS | 112 - Makefile.in | 188 - Mule23@1934.en | 155 - Mule23@1934.ja | 160 - README-gnus-bbdb.en | 127 - README-gnus-bbdb.ja | 161 - README-offline.en | 203 - README-offline.ja | 206 - README.T-gnus | 38 - README.branch | 162 - README.branch.ja | 163 - README.semi | 132 - README.semi.ja | 135 - TODO.ja | 110 - aclocal.m4 | 270 - configure | 1595 -- configure.in | 13 - contrib/ChangeLog | 73 - contrib/README | 3 - contrib/base64.el | 278 - contrib/canlock.el | 475 - contrib/gpg-ring.el | 483 - contrib/gpg.el | 1321 -- contrib/md5.el | 409 - contrib/one-line-cookie.diff | 28 - contrib/sha1.el | 397 - contrib/ssl.el | 201 - contrib/timer.el | 308 - contrib/vcard.el | 308 - contrib/xml.el | 518 - etc/Makefile.in | 47 - etc/gnus-tut.txt | 294 - etc/gnus/bar.xbm | 7 - etc/gnus/bar.xpm | 54 - etc/gnus/catchup.pbm | Bin 81 -> 0 bytes etc/gnus/catchup.xpm | 73 - etc/gnus/cu-exit.pbm | Bin 81 -> 0 bytes etc/gnus/cu-exit.xpm | 64 - etc/gnus/describe-group.pbm | Bin 81 -> 0 bytes etc/gnus/describe-group.xpm | 72 - etc/gnus/exit-gnus.pbm | Bin 81 -> 0 bytes etc/gnus/exit-gnus.xpm | 76 - etc/gnus/exit-summ.pbm | Bin 81 -> 0 bytes etc/gnus/exit-summ.xpm | 45 - etc/gnus/followup.pbm | Bin 81 -> 0 bytes etc/gnus/followup.xpm | 54 - etc/gnus/fuwo.pbm | Bin 81 -> 0 bytes etc/gnus/fuwo.xpm | 53 - etc/gnus/get-news.pbm | Bin 81 -> 0 bytes etc/gnus/get-news.xpm | 68 - etc/gnus/gnntg.pbm | Bin 81 -> 0 bytes etc/gnus/gnntg.xpm | 64 - etc/gnus/gnus-group-catchup-current-up.xbm | 12 - etc/gnus/gnus-group-catchup-current-up.xpm | 39 - etc/gnus/gnus-group-catchup-current.xbm | 12 - etc/gnus/gnus-group-catchup-current.xpm | 39 - etc/gnus/gnus-group-describe-group-up.xbm | 12 - etc/gnus/gnus-group-describe-group-up.xpm | 39 - etc/gnus/gnus-group-exit-up.xbm | 12 - etc/gnus/gnus-group-exit-up.xpm | 39 - etc/gnus/gnus-group-get-new-news-this-group-up.xbm | 12 - etc/gnus/gnus-group-get-new-news-this-group-up.xpm | 39 - etc/gnus/gnus-group-get-new-news-up.xbm | 12 - etc/gnus/gnus-group-get-new-news-up.xpm | 39 - etc/gnus/gnus-group-kill-group-up.xbm | 12 - etc/gnus/gnus-group-kill-group-up.xpm | 38 - etc/gnus/gnus-group-subscribe-up.xbm | 12 - etc/gnus/gnus-group-subscribe-up.xpm | 38 - etc/gnus/gnus-group-unsubscribe-up.xbm | 12 - etc/gnus/gnus-group-unsubscribe-up.xpm | 38 - etc/gnus/gnus-pointer.xbm | 6 - etc/gnus/gnus-pointer.xpm | 22 - etc/gnus/gnus-summary-caesar-message-up.xbm | 12 - etc/gnus/gnus-summary-caesar-message-up.xpm | 38 - etc/gnus/gnus-summary-cancel-article-up.xbm | 12 - etc/gnus/gnus-summary-cancel-article-up.xpm | 39 - etc/gnus/gnus-summary-catchup-and-exit-up.xbm | 12 - etc/gnus/gnus-summary-catchup-and-exit-up.xpm | 39 - etc/gnus/gnus-summary-catchup-up.xbm | 12 - etc/gnus/gnus-summary-catchup-up.xpm | 37 - etc/gnus/gnus-summary-exit-up.xbm | 12 - etc/gnus/gnus-summary-exit-up.xpm | 37 - etc/gnus/gnus-summary-followup-up.xbm | 12 - etc/gnus/gnus-summary-followup-up.xpm | 38 - .../gnus-summary-followup-with-original-up.xbm | 12 - .../gnus-summary-followup-with-original-up.xpm | 38 - etc/gnus/gnus-summary-mail-copy-up.xbm | 12 - etc/gnus/gnus-summary-mail-copy-up.xpm | 38 - etc/gnus/gnus-summary-mail-delete-up.xbm | 12 - etc/gnus/gnus-summary-mail-delete-up.xpm | 39 - etc/gnus/gnus-summary-mail-forward-up.xbm | 12 - etc/gnus/gnus-summary-mail-forward-up.xpm | 38 - etc/gnus/gnus-summary-mail-get-up.xbm | 12 - etc/gnus/gnus-summary-mail-get-up.xpm | 38 - etc/gnus/gnus-summary-mail-originate-up.xbm | 12 - etc/gnus/gnus-summary-mail-originate-up.xpm | 38 - etc/gnus/gnus-summary-mail-reply-up.xbm | 12 - etc/gnus/gnus-summary-mail-reply-up.xpm | 38 - etc/gnus/gnus-summary-mail-save-up.xbm | 12 - etc/gnus/gnus-summary-mail-save-up.xpm | 41 - etc/gnus/gnus-summary-next-unread-up.xbm | 12 - etc/gnus/gnus-summary-next-unread-up.xpm | 39 - etc/gnus/gnus-summary-post-news-up.xbm | 12 - etc/gnus/gnus-summary-post-news-up.xpm | 38 - etc/gnus/gnus-summary-prev-unread-up.xbm | 12 - etc/gnus/gnus-summary-prev-unread-up.xpm | 39 - etc/gnus/gnus-summary-reply-up.xbm | 12 - etc/gnus/gnus-summary-reply-up.xpm | 39 - etc/gnus/gnus-summary-reply-with-original-up.xbm | 12 - etc/gnus/gnus-summary-reply-with-original-up.xpm | 39 - etc/gnus/gnus-summary-save-article-file-up.xbm | 12 - etc/gnus/gnus-summary-save-article-file-up.xpm | 41 - etc/gnus/gnus-summary-save-article-up.xbm | 12 - etc/gnus/gnus-summary-save-article-up.xpm | 41 - etc/gnus/gnus-uu-decode-uu-up.xbm | 12 - etc/gnus/gnus-uu-decode-uu-up.xpm | 39 - etc/gnus/gnus-uu-post-news-up.xbm | 12 - etc/gnus/gnus-uu-post-news-up.xpm | 39 - etc/gnus/gnus.xbm | 622 - etc/gnus/gnus.xpm | 284 - etc/gnus/kill-group.pbm | Bin 81 -> 0 bytes etc/gnus/kill-group.xpm | 50 - etc/gnus/mail-reply.pbm | Bin 81 -> 0 bytes etc/gnus/mail-reply.xpm | 51 - etc/gnus/next-ur.pbm | Bin 81 -> 0 bytes etc/gnus/next-ur.xpm | 66 - etc/gnus/post.pbm | Bin 81 -> 0 bytes etc/gnus/post.xpm | 53 - etc/gnus/prev-ur.pbm | Bin 81 -> 0 bytes etc/gnus/prev-ur.xpm | 65 - etc/gnus/reply-wo.pbm | Bin 81 -> 0 bytes etc/gnus/reply-wo.xpm | 65 - etc/gnus/reply.pbm | Bin 81 -> 0 bytes etc/gnus/reply.xpm | 64 - etc/gnus/rot13.pbm | Bin 81 -> 0 bytes etc/gnus/rot13.xpm | 50 - etc/gnus/save-aif.pbm | Bin 81 -> 0 bytes etc/gnus/save-aif.xpm | 55 - etc/gnus/save-art.pbm | Bin 81 -> 0 bytes etc/gnus/save-art.xpm | 62 - etc/gnus/subscribe.pbm | Bin 81 -> 0 bytes etc/gnus/subscribe.xpm | 49 - etc/gnus/unsubscribe.pbm | Bin 81 -> 0 bytes etc/gnus/unsubscribe.xpm | 48 - etc/gnus/uu-decode.pbm | Bin 81 -> 0 bytes etc/gnus/uu-decode.xpm | 48 - etc/gnus/uu-post.pbm | Bin 81 -> 0 bytes etc/gnus/uu-post.xpm | 57 - etc/gnus/x-splash | Bin 4621 -> 0 bytes etc/smilies/frown.pbm | Bin 37 -> 0 bytes etc/smilies/smile.pbm | Bin 37 -> 0 bytes etc/smilies/wry.pbm | Bin 37 -> 0 bytes install-sh | 250 - lisp/ChangeLog | 5141 ----- lisp/ChangeLog.1 |10100 --------- lisp/Makefile.in | 119 - lisp/base64.el | 54 - lisp/binhex.el | 301 - lisp/dgnushack.el | 782 - lisp/dgnuspath.el.in | 18 - lisp/dig.el | 169 - lisp/earcon.el | 233 - lisp/flow-fill.el | 104 - lisp/format-spec.el | 71 - lisp/gnus-agent.el | 1774 -- lisp/gnus-art.el | 6257 ------ lisp/gnus-async.el | 375 - lisp/gnus-audio.el | 149 - lisp/gnus-bbdb.el | 651 - lisp/gnus-bcklg.el | 162 - lisp/gnus-cache.el | 715 - lisp/gnus-cite.el | 1000 - lisp/gnus-clfns.el | 411 - lisp/gnus-cus.el | 762 - lisp/gnus-delay.el | 161 - lisp/gnus-demon.el | 325 - lisp/gnus-draft.el | 277 - lisp/gnus-dup.el | 165 - lisp/gnus-eform.el | 133 - lisp/gnus-ems.el | 347 - lisp/gnus-gl.el | 860 - lisp/gnus-group.el | 4006 ---- lisp/gnus-i18n.el | 95 - lisp/gnus-int.el | 534 - lisp/gnus-kill.el | 730 - lisp/gnus-logic.el | 230 - lisp/gnus-mailcap.el | 963 - lisp/gnus-mh.el | 114 - lisp/gnus-ml.el | 201 - lisp/gnus-mlspl.el | 228 - lisp/gnus-move.el | 185 - lisp/gnus-msg.el | 1681 -- lisp/gnus-nocem.el | 390 - lisp/gnus-offline.el | 978 - lisp/gnus-ofsetup.el | 761 - lisp/gnus-picon.el | 757 - lisp/gnus-range.el | 397 - lisp/gnus-salt.el | 1052 - lisp/gnus-score.el | 3008 --- lisp/gnus-setup.el | 194 - lisp/gnus-soup.el | 576 - lisp/gnus-spec.el | 712 - lisp/gnus-srvr.el | 912 - lisp/gnus-start.el | 2882 --- lisp/gnus-sum.el |10924 --------- lisp/gnus-topic.el | 1678 -- lisp/gnus-undo.el | 195 - lisp/gnus-util.el | 1125 - lisp/gnus-uu.el | 2151 -- lisp/gnus-vers.el | 88 - lisp/gnus-vm.el | 167 - lisp/gnus-win.el | 559 - lisp/gnus-xmas.el | 965 - lisp/gnus.el | 3292 --- lisp/ietf-drums.el | 250 - lisp/imap.el | 2633 --- lisp/lpath.el | 130 - lisp/mail-parse.el | 71 - lisp/mail-prsvr.el | 44 - lisp/mail-source.el | 970 - lisp/mailheader.el | 182 - lisp/md5.el | 413 - lisp/message.el | 5910 ----- lisp/messagexmas.el | 132 - lisp/messcompat.el | 94 - lisp/mm-bodies.el | 292 - lisp/mm-decode.el | 1350 -- lisp/mm-encode.el | 176 - lisp/mm-extern.el | 166 - lisp/mm-partial.el | 151 - lisp/mm-util.el | 573 - lisp/mm-uu.el | 440 - lisp/mm-view.el | 378 - lisp/mmgnus.el | 92 - lisp/mml-sec.el | 112 - lisp/mml-smime.el | 194 - lisp/mml.el | 952 - lisp/mml2015.el | 643 - lisp/nnagent.el | 208 - lisp/nnbabyl.el | 673 - lisp/nndb.el | 324 - lisp/nndir.el | 101 - lisp/nndoc.el | 922 - lisp/nndraft.el | 276 - lisp/nneething.el | 377 - lisp/nnfolder.el | 1235 -- lisp/nngateway.el | 94 - lisp/nnheader.el | 1202 - lisp/nnheaderxm.el | 66 - lisp/nnimap.el | 1421 -- lisp/nnkiboze.el | 393 - lisp/nnlistserv.el | 157 - lisp/nnmail.el | 1829 -- lisp/nnmbox.el | 710 - lisp/nnmh.el | 602 - lisp/nnml.el | 1007 - lisp/nnoo.el | 323 - lisp/nnrss.el | 599 - lisp/nnshimbun.el | 808 - lisp/nnslashdot.el | 518 - lisp/nnsoup.el | 818 - lisp/nnspool.el | 467 - lisp/nntp.el | 1725 -- lisp/nnultimate.el | 481 - lisp/nnvirtual.el | 821 - lisp/nnwarchive.el | 755 - lisp/nnweb.el | 985 - lisp/nnwfm.el | 433 - lisp/parse-time.el | 214 - lisp/pop3.el | 800 - lisp/qp.el | 161 - lisp/read-passwd.el | 113 - lisp/rfc1843.el | 185 - lisp/rfc2045.el | 43 - lisp/rfc2047.el | 562 - lisp/rfc2104.el | 117 - lisp/rfc2231.el | 222 - lisp/score-mode.el | 115 - lisp/smiley-ems.el | 157 - lisp/smiley.el | 441 - lisp/smime.el | 597 - lisp/starttls.el | 82 - lisp/time-date.el | 149 - lisp/utf7.el | 180 - lisp/uudecode.el | 221 - lisp/webmail.el | 1192 - make.bat | 77 - mkinstalldirs | 38 - sample.lpath.el | 42 - texi/ChangeLog | 1527 -- texi/Makefile.in | 260 - texi/TRANSLATION.ja | 27 - texi/bembo.sty | 32 - texi/dir | 10 - texi/doclicense.texi | 368 - texi/emacs-mime.texi | 1479 -- texi/gnus-faq-ja.texi | 441 - texi/gnus-faq.texi | 673 - texi/gnus-ja.texi |22539 ------------------- texi/gnus-terms.ja | 177 - texi/gnus.texi |23115 -------------------- texi/gnuslogo.refcard | 243 - texi/gnusref-ja.tex | 924 - texi/gnusref.tex | 1041 - texi/infohack.el | 146 - texi/message-ja.texi | 1582 -- texi/message.texi | 1630 -- texi/pagestyle.sty | 85 - texi/postamble.tex | 46 - texi/ps/gnus-big-logo.eps | 213 - texi/ps/gnus-head.eps | 150 - texi/ptexinfmt.el | 762 - texi/refcard-ja.tex | 83 - texi/refcard.tex | 188 - texi/splitindex | 6 - texi/texi2latex.el | 345 - todo | 1486 -- 321 files changed, 198258 deletions(-) delete mode 100644 ChangeLog delete mode 100644 ChangeLog.1 delete mode 100644 ChangeLog.2 delete mode 100644 ChangeLog.3 delete mode 100644 GNUS-NEWS delete mode 100644 Makefile.in delete mode 100644 Mule23@1934.en delete mode 100644 Mule23@1934.ja delete mode 100644 README-gnus-bbdb.en delete mode 100644 README-gnus-bbdb.ja delete mode 100644 README-offline.en delete mode 100644 README-offline.ja delete mode 100644 README.T-gnus delete mode 100644 README.branch delete mode 100644 README.branch.ja delete mode 100644 README.semi delete mode 100644 README.semi.ja delete mode 100644 TODO.ja delete mode 100644 aclocal.m4 delete mode 100755 configure delete mode 100644 configure.in delete mode 100644 contrib/ChangeLog delete mode 100644 contrib/README delete mode 100644 contrib/base64.el delete mode 100644 contrib/canlock.el delete mode 100644 contrib/gpg-ring.el delete mode 100644 contrib/gpg.el delete mode 100644 contrib/md5.el delete mode 100644 contrib/one-line-cookie.diff delete mode 100644 contrib/sha1.el delete mode 100644 contrib/ssl.el delete mode 100644 contrib/timer.el delete mode 100644 contrib/vcard.el delete mode 100644 contrib/xml.el delete mode 100644 etc/Makefile.in delete mode 100644 etc/gnus-tut.txt delete mode 100644 etc/gnus/bar.xbm delete mode 100644 etc/gnus/bar.xpm delete mode 100644 etc/gnus/catchup.pbm delete mode 100644 etc/gnus/catchup.xpm delete mode 100644 etc/gnus/cu-exit.pbm delete mode 100644 etc/gnus/cu-exit.xpm delete mode 100644 etc/gnus/describe-group.pbm delete mode 100644 etc/gnus/describe-group.xpm delete mode 100644 etc/gnus/exit-gnus.pbm delete mode 100644 etc/gnus/exit-gnus.xpm delete mode 100644 etc/gnus/exit-summ.pbm delete mode 100644 etc/gnus/exit-summ.xpm delete mode 100644 etc/gnus/followup.pbm delete mode 100644 etc/gnus/followup.xpm delete mode 100644 etc/gnus/fuwo.pbm delete mode 100644 etc/gnus/fuwo.xpm delete mode 100644 etc/gnus/get-news.pbm delete mode 100644 etc/gnus/get-news.xpm delete mode 100644 etc/gnus/gnntg.pbm delete mode 100644 etc/gnus/gnntg.xpm delete mode 100644 etc/gnus/gnus-group-catchup-current-up.xbm delete mode 100644 etc/gnus/gnus-group-catchup-current-up.xpm delete mode 100644 etc/gnus/gnus-group-catchup-current.xbm delete mode 100644 etc/gnus/gnus-group-catchup-current.xpm delete mode 100644 etc/gnus/gnus-group-describe-group-up.xbm delete mode 100644 etc/gnus/gnus-group-describe-group-up.xpm delete mode 100644 etc/gnus/gnus-group-exit-up.xbm delete mode 100644 etc/gnus/gnus-group-exit-up.xpm delete mode 100644 etc/gnus/gnus-group-get-new-news-this-group-up.xbm delete mode 100644 etc/gnus/gnus-group-get-new-news-this-group-up.xpm delete mode 100644 etc/gnus/gnus-group-get-new-news-up.xbm delete mode 100644 etc/gnus/gnus-group-get-new-news-up.xpm delete mode 100644 etc/gnus/gnus-group-kill-group-up.xbm delete mode 100644 etc/gnus/gnus-group-kill-group-up.xpm delete mode 100644 etc/gnus/gnus-group-subscribe-up.xbm delete mode 100644 etc/gnus/gnus-group-subscribe-up.xpm delete mode 100644 etc/gnus/gnus-group-unsubscribe-up.xbm delete mode 100644 etc/gnus/gnus-group-unsubscribe-up.xpm delete mode 100644 etc/gnus/gnus-pointer.xbm delete mode 100644 etc/gnus/gnus-pointer.xpm delete mode 100644 etc/gnus/gnus-summary-caesar-message-up.xbm delete mode 100644 etc/gnus/gnus-summary-caesar-message-up.xpm delete mode 100644 etc/gnus/gnus-summary-cancel-article-up.xbm delete mode 100644 etc/gnus/gnus-summary-cancel-article-up.xpm delete mode 100644 etc/gnus/gnus-summary-catchup-and-exit-up.xbm delete mode 100644 etc/gnus/gnus-summary-catchup-and-exit-up.xpm delete mode 100644 etc/gnus/gnus-summary-catchup-up.xbm delete mode 100644 etc/gnus/gnus-summary-catchup-up.xpm delete mode 100644 etc/gnus/gnus-summary-exit-up.xbm delete mode 100644 etc/gnus/gnus-summary-exit-up.xpm delete mode 100644 etc/gnus/gnus-summary-followup-up.xbm delete mode 100644 etc/gnus/gnus-summary-followup-up.xpm delete mode 100644 etc/gnus/gnus-summary-followup-with-original-up.xbm delete mode 100644 etc/gnus/gnus-summary-followup-with-original-up.xpm delete mode 100644 etc/gnus/gnus-summary-mail-copy-up.xbm delete mode 100644 etc/gnus/gnus-summary-mail-copy-up.xpm delete mode 100644 etc/gnus/gnus-summary-mail-delete-up.xbm delete mode 100644 etc/gnus/gnus-summary-mail-delete-up.xpm delete mode 100644 etc/gnus/gnus-summary-mail-forward-up.xbm delete mode 100644 etc/gnus/gnus-summary-mail-forward-up.xpm delete mode 100644 etc/gnus/gnus-summary-mail-get-up.xbm delete mode 100644 etc/gnus/gnus-summary-mail-get-up.xpm delete mode 100644 etc/gnus/gnus-summary-mail-originate-up.xbm delete mode 100644 etc/gnus/gnus-summary-mail-originate-up.xpm delete mode 100644 etc/gnus/gnus-summary-mail-reply-up.xbm delete mode 100644 etc/gnus/gnus-summary-mail-reply-up.xpm delete mode 100644 etc/gnus/gnus-summary-mail-save-up.xbm delete mode 100644 etc/gnus/gnus-summary-mail-save-up.xpm delete mode 100644 etc/gnus/gnus-summary-next-unread-up.xbm delete mode 100644 etc/gnus/gnus-summary-next-unread-up.xpm delete mode 100644 etc/gnus/gnus-summary-post-news-up.xbm delete mode 100644 etc/gnus/gnus-summary-post-news-up.xpm delete mode 100644 etc/gnus/gnus-summary-prev-unread-up.xbm delete mode 100644 etc/gnus/gnus-summary-prev-unread-up.xpm delete mode 100644 etc/gnus/gnus-summary-reply-up.xbm delete mode 100644 etc/gnus/gnus-summary-reply-up.xpm delete mode 100644 etc/gnus/gnus-summary-reply-with-original-up.xbm delete mode 100644 etc/gnus/gnus-summary-reply-with-original-up.xpm delete mode 100644 etc/gnus/gnus-summary-save-article-file-up.xbm delete mode 100644 etc/gnus/gnus-summary-save-article-file-up.xpm delete mode 100644 etc/gnus/gnus-summary-save-article-up.xbm delete mode 100644 etc/gnus/gnus-summary-save-article-up.xpm delete mode 100644 etc/gnus/gnus-uu-decode-uu-up.xbm delete mode 100644 etc/gnus/gnus-uu-decode-uu-up.xpm delete mode 100644 etc/gnus/gnus-uu-post-news-up.xbm delete mode 100644 etc/gnus/gnus-uu-post-news-up.xpm delete mode 100644 etc/gnus/gnus.xbm delete mode 100644 etc/gnus/gnus.xpm delete mode 100644 etc/gnus/kill-group.pbm delete mode 100644 etc/gnus/kill-group.xpm delete mode 100644 etc/gnus/mail-reply.pbm delete mode 100644 etc/gnus/mail-reply.xpm delete mode 100644 etc/gnus/next-ur.pbm delete mode 100644 etc/gnus/next-ur.xpm delete mode 100644 etc/gnus/post.pbm delete mode 100644 etc/gnus/post.xpm delete mode 100644 etc/gnus/prev-ur.pbm delete mode 100644 etc/gnus/prev-ur.xpm delete mode 100644 etc/gnus/reply-wo.pbm delete mode 100644 etc/gnus/reply-wo.xpm delete mode 100644 etc/gnus/reply.pbm delete mode 100644 etc/gnus/reply.xpm delete mode 100644 etc/gnus/rot13.pbm delete mode 100644 etc/gnus/rot13.xpm delete mode 100644 etc/gnus/save-aif.pbm delete mode 100644 etc/gnus/save-aif.xpm delete mode 100644 etc/gnus/save-art.pbm delete mode 100644 etc/gnus/save-art.xpm delete mode 100644 etc/gnus/subscribe.pbm delete mode 100644 etc/gnus/subscribe.xpm delete mode 100644 etc/gnus/unsubscribe.pbm delete mode 100644 etc/gnus/unsubscribe.xpm delete mode 100644 etc/gnus/uu-decode.pbm delete mode 100644 etc/gnus/uu-decode.xpm delete mode 100644 etc/gnus/uu-post.pbm delete mode 100644 etc/gnus/uu-post.xpm delete mode 100644 etc/gnus/x-splash delete mode 100644 etc/smilies/frown.pbm delete mode 100644 etc/smilies/smile.pbm delete mode 100644 etc/smilies/wry.pbm delete mode 100644 install-sh delete mode 100644 lisp/ChangeLog delete mode 100644 lisp/ChangeLog.1 delete mode 100644 lisp/Makefile.in delete mode 100644 lisp/base64.el delete mode 100644 lisp/binhex.el delete mode 100644 lisp/dgnushack.el delete mode 100644 lisp/dgnuspath.el.in delete mode 100644 lisp/dig.el delete mode 100644 lisp/earcon.el delete mode 100644 lisp/flow-fill.el delete mode 100644 lisp/format-spec.el delete mode 100644 lisp/gnus-agent.el delete mode 100644 lisp/gnus-art.el delete mode 100644 lisp/gnus-async.el delete mode 100644 lisp/gnus-audio.el delete mode 100644 lisp/gnus-bbdb.el delete mode 100644 lisp/gnus-bcklg.el delete mode 100644 lisp/gnus-cache.el delete mode 100644 lisp/gnus-cite.el delete mode 100644 lisp/gnus-clfns.el delete mode 100644 lisp/gnus-cus.el delete mode 100644 lisp/gnus-delay.el delete mode 100644 lisp/gnus-demon.el delete mode 100644 lisp/gnus-draft.el delete mode 100644 lisp/gnus-dup.el delete mode 100644 lisp/gnus-eform.el delete mode 100644 lisp/gnus-ems.el delete mode 100644 lisp/gnus-gl.el delete mode 100644 lisp/gnus-group.el delete mode 100644 lisp/gnus-i18n.el delete mode 100644 lisp/gnus-int.el delete mode 100644 lisp/gnus-kill.el delete mode 100644 lisp/gnus-logic.el delete mode 100644 lisp/gnus-mailcap.el delete mode 100644 lisp/gnus-mh.el delete mode 100644 lisp/gnus-ml.el delete mode 100644 lisp/gnus-mlspl.el delete mode 100644 lisp/gnus-move.el delete mode 100644 lisp/gnus-msg.el delete mode 100644 lisp/gnus-nocem.el delete mode 100644 lisp/gnus-offline.el delete mode 100644 lisp/gnus-ofsetup.el delete mode 100644 lisp/gnus-picon.el delete mode 100644 lisp/gnus-range.el delete mode 100644 lisp/gnus-salt.el delete mode 100644 lisp/gnus-score.el delete mode 100644 lisp/gnus-setup.el delete mode 100644 lisp/gnus-soup.el delete mode 100644 lisp/gnus-spec.el delete mode 100644 lisp/gnus-srvr.el delete mode 100644 lisp/gnus-start.el delete mode 100644 lisp/gnus-sum.el delete mode 100644 lisp/gnus-topic.el delete mode 100644 lisp/gnus-undo.el delete mode 100644 lisp/gnus-util.el delete mode 100644 lisp/gnus-uu.el delete mode 100644 lisp/gnus-vers.el delete mode 100644 lisp/gnus-vm.el delete mode 100644 lisp/gnus-win.el delete mode 100644 lisp/gnus-xmas.el delete mode 100644 lisp/gnus.el delete mode 100644 lisp/ietf-drums.el delete mode 100644 lisp/imap.el delete mode 100644 lisp/lpath.el delete mode 100644 lisp/mail-parse.el delete mode 100644 lisp/mail-prsvr.el delete mode 100644 lisp/mail-source.el delete mode 100644 lisp/mailheader.el delete mode 100644 lisp/md5.el delete mode 100644 lisp/message.el delete mode 100644 lisp/messagexmas.el delete mode 100644 lisp/messcompat.el delete mode 100644 lisp/mm-bodies.el delete mode 100644 lisp/mm-decode.el delete mode 100644 lisp/mm-encode.el delete mode 100644 lisp/mm-extern.el delete mode 100644 lisp/mm-partial.el delete mode 100644 lisp/mm-util.el delete mode 100644 lisp/mm-uu.el delete mode 100644 lisp/mm-view.el delete mode 100644 lisp/mmgnus.el delete mode 100644 lisp/mml-sec.el delete mode 100644 lisp/mml-smime.el delete mode 100644 lisp/mml.el delete mode 100644 lisp/mml2015.el delete mode 100644 lisp/nnagent.el delete mode 100644 lisp/nnbabyl.el delete mode 100644 lisp/nndb.el delete mode 100644 lisp/nndir.el delete mode 100644 lisp/nndoc.el delete mode 100644 lisp/nndraft.el delete mode 100644 lisp/nneething.el delete mode 100644 lisp/nnfolder.el delete mode 100644 lisp/nngateway.el delete mode 100644 lisp/nnheader.el delete mode 100644 lisp/nnheaderxm.el delete mode 100644 lisp/nnimap.el delete mode 100644 lisp/nnkiboze.el delete mode 100644 lisp/nnlistserv.el delete mode 100644 lisp/nnmail.el delete mode 100644 lisp/nnmbox.el delete mode 100644 lisp/nnmh.el delete mode 100644 lisp/nnml.el delete mode 100644 lisp/nnoo.el delete mode 100644 lisp/nnrss.el delete mode 100644 lisp/nnshimbun.el delete mode 100644 lisp/nnslashdot.el delete mode 100644 lisp/nnsoup.el delete mode 100644 lisp/nnspool.el delete mode 100644 lisp/nntp.el delete mode 100644 lisp/nnultimate.el delete mode 100644 lisp/nnvirtual.el delete mode 100644 lisp/nnwarchive.el delete mode 100644 lisp/nnweb.el delete mode 100644 lisp/nnwfm.el delete mode 100644 lisp/parse-time.el delete mode 100644 lisp/pop3.el delete mode 100644 lisp/qp.el delete mode 100644 lisp/read-passwd.el delete mode 100644 lisp/rfc1843.el delete mode 100644 lisp/rfc2045.el delete mode 100644 lisp/rfc2047.el delete mode 100644 lisp/rfc2104.el delete mode 100644 lisp/rfc2231.el delete mode 100644 lisp/score-mode.el delete mode 100644 lisp/smiley-ems.el delete mode 100644 lisp/smiley.el delete mode 100644 lisp/smime.el delete mode 100644 lisp/starttls.el delete mode 100644 lisp/time-date.el delete mode 100644 lisp/utf7.el delete mode 100644 lisp/uudecode.el delete mode 100644 lisp/webmail.el delete mode 100755 make.bat delete mode 100644 mkinstalldirs delete mode 100644 sample.lpath.el delete mode 100644 texi/ChangeLog delete mode 100644 texi/Makefile.in delete mode 100644 texi/TRANSLATION.ja delete mode 100644 texi/bembo.sty delete mode 100644 texi/dir delete mode 100644 texi/doclicense.texi delete mode 100644 texi/emacs-mime.texi delete mode 100644 texi/gnus-faq-ja.texi delete mode 100644 texi/gnus-faq.texi delete mode 100644 texi/gnus-ja.texi delete mode 100644 texi/gnus-terms.ja delete mode 100644 texi/gnus.texi delete mode 100644 texi/gnuslogo.refcard delete mode 100644 texi/gnusref-ja.tex delete mode 100644 texi/gnusref.tex delete mode 100644 texi/infohack.el delete mode 100644 texi/message-ja.texi delete mode 100644 texi/message.texi delete mode 100644 texi/pagestyle.sty delete mode 100644 texi/postamble.tex delete mode 100644 texi/ps/gnus-big-logo.eps delete mode 100644 texi/ps/gnus-head.eps delete mode 100644 texi/ptexinfmt.el delete mode 100644 texi/refcard-ja.tex delete mode 100644 texi/refcard.tex delete mode 100755 texi/splitindex delete mode 100644 texi/texi2latex.el delete mode 100644 todo diff --git a/ChangeLog b/ChangeLog deleted file mode 100644 index 9941366..0000000 --- a/ChangeLog +++ /dev/null @@ -1,999 +0,0 @@ -2001-09-04 KOSEKI Yoshinori - - * lisp/nnir.el: Add namazu support. - -2001-09-04 TSUCHIYA Masatoshi - - * lisp/nnir.el: Import from - ftp://ls6-ftp.cs.uni-dortmund.de/pub/src/emacs/nnir.el. - -2001-08-29 Katsumi Yamaoka - - * lisp/gnus-util.el (gnus-truncate-string): Abolished. - -2001-08-18 TSUCHIYA Masatoshi - - * lisp/nnshimbun.el (gnus-group-make-shimbun-group): Call - `shimbun-groups' to detect avaiable groups of specified server. - -2001-08-17 KANEMATSU Daiji - - * lisp/message.el (message-signature-separator-for-insertion): New - customizable variable which is used for signature separator. - * lisp/message.el (message-insert-signature): Use variable - `message-signature-separator-for-insertion' instead of hard code. - -2001-08-15 Yoichi NAKAYAMA - - * texi/gnus-ja.texi (Browsing the Web): Fix typo. - -2001-08-13 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 06. - -2001-08-10 Katsumi Yamaoka - - * lisp/gnus-art.el (gnus-request-article-this-buffer): Insert an - article into `gnus-original-article-buffer' instead of - `gnus-article-buffer'. - -2001-07-31 Katsumi Yamaoka - - * lisp/mml2015.el: Require `gnus-clfns' when compiling. - * lisp/gnus-clfns.el (string-to-list): New compiler macro. - -2001-07-30 Katsumi Yamaoka - - * lisp/gnus-sum.el (gnus-select-newsgroup): Don't examine cached - articles with `gnus-cache-articles-in-group' even if the current - group is not a virtual group (see ChangeLog.1 1999-03-02). - -2001-07-30 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 05. - - * lisp/nnmh.el (nnmh-retrieve-parsed-headers): Abolished. - - * lisp/gnus-sum.el (gnus-get-newsgroup-headers-xover): Don't use - `gnus-retrieve-parsed-headers'. - (gnus-fetch-headers): Ditto. - - * lisp/gnus-int.el (gnus-retrieve-parsed-headers): Abolished. - - * lisp/gnus-cache.el (gnus-cache-braid-headers): Abolished. - (gnus-cache-retrieve-parsed-headers): Abolished. - -2001-07-30 Katsumi Yamaoka - - * lisp/nnshimbun.el (nnshimbun-request-expire-articles): Bind - `nnmail-expiry-wait-function' to nil if the group's parameter - `expiry-wait' is specified by the user or the shimbun's default - value is provided. - -2001-07-27 Katsumi Yamaoka - - * lisp/gnus-msg.el (gnus-message-make-user-agent): New - implementation. - -2001-07-24 Katsumi Yamaoka - - * lisp/gnus-clfns.el (copy-list): New compiler macro. - -2001-07-23 Katsumi Yamaoka - - * lisp/gnus-delay.el (gnus-delay-initialize): Don't use the macro - `kbd'. - - * lisp/nnheader.el (mm-read-coding-system): New function which is - a substitute for mm-util.el. - -2001-07-19 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 04. - - * lisp/nntp.el (nntp-request-newgroups): Use UTC date for - NEWGROUPS command. - - * lisp/gnus-start.el (gnus-find-new-newsgroups): Use - `message-make-date' instead of `current-time-string'. - (gnus-ask-server-for-new-groups): Ditto. - (gnus-check-first-time-used): Ditto. - -2001-07-17 Katsumi Yamaoka - - * texi/message-ja.texi (message-citation-line-function): Add a - comma just after the `@xref' form. - - * lisp/nnheader.el (nnheader-header-value): Ignore leading - whitespaces. - - * lisp/dgnushack.el (dgnushack-make-auto-load): Advise - `make-autoload' to handle `define-derived-mode'. - -2001-07-12 Katsumi Yamaoka - - * lisp/message.el (message-yank-original): Unwind-protect while - suspending font-lock. - (message-mode): Modify for the following changes. - (message-font-lock-keywords-2): Abolished. - (message-font-lock-keywords-1): Abolished. - (message-font-lock-keywords): Unified. - (message-font-lock-cited-text-matcher): Abolished. - (font-lock-after-change-function): Don't advise it. - (message-font-lock-last-position): Abolished. - (message-font-lock-citation-name-max-column): Abolished. - (message-font-lock-cited-text-regexp) Abolished. - (message-font-lock-fence-close-position): Abolished. - (message-font-lock-fence-open-position): Abolished. - (message-font-lock-fence-close-regexp): Abolished. - (message-font-lock-fence-open-regexp): Abolished. - -2001-07-10 Katsumi Yamaoka - - * lisp/message.el (message-font-lock-keywords-1): Replace regexp - for mml tags with `mime-edit-tag-regexp'. - -2001-07-10 Katsumi Yamaoka - - * lisp/message.el (message-font-lock-keywords-2): Move definitions - for cited texts and mml tags to `message-font-lock-keywords-1'. - -2001-07-10 Katsuhiro Hermit Endo - - * texi/gnus-ja.texi (Mail Group Commands): Fix a slight mistake. - -2001-07-09 Katsumi Yamaoka - - * lisp/dgnushack.el: Add the parent directory of the directory - where the APEL modules are installed to `load-path' according to - the description of the file Mule23@1934. - -2001-07-04 Yair Friedman - - * make.bat: Use infohack.el to create info files. - -2001-07-09 Akihiro Arisawa - - * README.semi: Modify URI of emacs-w3m. - * README.semi.ja: Ditto. - * Mule23@1934.en: Ditto. - * Mule23@1934.ja: Ditto. - * lisp/nnshimbun.el: Ditto. - - * texi/gnus-ja.texi (Top, Article Treatment): Fix typo. - (Web Newspaper): Modify URI of emacs-w3m. - -2001-07-06 KITAGAWA Takurou - - * lisp/Makefile.in (clever): Use `if test... then' instead of - `test... &&'. - -2001-07-06 Katsumi Yamaoka - - * lisp/Makefile.in (clever): Change the quoting style for the - elisp form to check for XEmacs-p. - - * lisp/dgnushack.el: Require `path-util' first, and then search - for the path if it is not found. - -2001-07-05 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 03. - -2001-06-28 Akitada Koyama - - * texi/gnus-ja.texi (Web Newspaper): Add a description how to show - html documents inline. - -2001-06-28 Katsumi Yamaoka - - * texi/message-ja.texi (message-suspend-font-lock-when-citing): Add - a description. - * texi/message.texi (message-suspend-font-lock-when-citing): Ditto. - - * lisp/message.el (message-yank-original): Suspend font-lock'ing - while citing an original message. - (message-suspend-font-lock-when-citing): New user option. - -2001-06-25 Katsumi Yamaoka - - * lisp/gnus-clfns.el (find-cl-run-time-functions): New - implementation. - -2001-06-22 Katsumi Yamaoka - - * lisp/gnus-art.el (article-display-x-face): Don't gather X-Face - fields in `gnus-original-article-buffer'. - -2001-06-18 Katsumi Yamaoka - - * lisp/nnshimbun.el (nnshimbun-find-parameter): Undo the last - bogus changes; use the value of `nnshimbun-pre-fetch-article' if - the value of the group parameter `prefetch-articles' is nil; do - likewise for `encapsulate-images'. - -2001-06-18 Katsumi Yamaoka - - * lisp/nnshimbun.el (nnshimbun-find-parameter): Use the value of - `nnshimbun-pre-fetch-article' if the value of the group parameter - `prefetch-articles' is `off'; do likewise for `encapsulate-images'. - -2001-06-18 Katsumi Yamaoka - - * lisp/nnshimbun.el (nnshimbun-encapsulate-images): Fix a - doc-string that both the values `off' and nil specifies not to - encapsulate images. - (nnshimbun-pre-fetch-article): Default to `off'. - -2001-06-18 Katsumi Yamaoka - - * lisp/nnshimbun.el (nnshimbun-encapsulate-images): Renamed from - `nnshimbun-encapsulate-article'. - (nnshimbun-request-article-1): Replace `encapsulate-article' with - `encapsulate-images'. - (nnshimbun-find-parameter): Ditto. - (nnshimbun-group-parameters): Ditto. - (nnshimbun-group-parameters-custom): Ditto. - -2001-06-15 TSUCHIYA Masatoshi - - * lisp/nnshimbun.el (nnshimbun-group-parameters-custom): Add - `encapsulate-article' as a customizable option, and modified - `prefetch-articles'. - (nnshimbun-group-parameters): Add document for - `encapsulate-article'. - (nnshimbun-encapsulate-article): New server variable. - (nnshimbun-find-parameter): Add code for `encapsulate-article'. - (nnshimbun-request-article-1): Refer `encapsulate-article' group - parameter to control `shimbun-encapsulate-article' value when - `shimbun-article' is called. - -2001-06-14 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 02. - -2001-06-14 Katsumi Yamaoka - - * lisp/nnshimbun.el (nnshimbun-request-expire-articles): Use - `nnshimbun-find-parameter'. - (nnshimbun-generate-nov-database): Bind a full group name while - processing. - (nnshimbun-find-parameter): New implementation to refer to the - nnshimbun group parameters. - (nnshimbun-index-range): Add a document that it's just a default. - (nnshimbun-pre-fetch-article): Ditto. - (nnshimbun-group-parameters): Specify a parameter type as `list'. - (TopLevel): Remove the local variable "-*- coding: junet; -*-". - -2001-06-13 Katsumi Yamaoka - - * lisp/nnshimbun.el (nnshimbun-group-parameters): New group - parameter. It also provides the user option - `nnshimbun-group-parameters-alist' and the function - `nnshimbun-find-group-parameters'. - (nnshimbun-group-parameters-custom): New variable. - (TopLevel): Require `gnus' expressly. - -2001-06-12 TSUCHIYA Masatoshi - - * lisp/nnshimbun.el (nnshimbun-find-parameter): New macro. - (nnshimbun-generate-nov-database): Use `nnshimbun-find-parameter'. - (nnshimbun-request-expire-articles): Fixed. - -2001-06-12 Katsumi Yamaoka - - * lisp/nnshimbun.el (Gnus-p): Use `file-exists-p' instead of - `locate-library' to check for the existence of mailcap.el in the - same directory of gnus.el. - (nnshimbun-retrieve-headers-with-nov): Remove a redundant check - that I made. - -2001-06-11 Katsumi Yamaoka - - * lisp/lpath.el: Don't Fbind `xml-node-children'. - -2001-06-11 Akihiro Arisawa - - * lisp/nnshimbun.el (nnshimbun-request-expire-articles): Fix - inhibiting the expiring when `nnshimbun-keep-unparsable-dated-articles' - is nil. - -2001-06-11 TSUCHIYA Masatoshi - - * lisp/gnus-group.el (toplevel): Removed autoload code for - "nnshimbun". - - * texi/gnus-ja.texi (Web Newspaper): Add documents about - `nnshimbun-index-range'. - -2001-06-11 Katsumi Yamaoka - - * lisp/nnshimbun.el (nnshimbun-request-expire-articles): Don't - refer to the variable `nnshimbun-keep-last-article', we should - keep the last article anyway. - (nnshimbun-keep-last-article): Abolished. - - * lisp/gnus.el: Autoload "nnshimbun" for the command `gnus-group- - make-shimbun-group'. - -2001-06-11 TSUCHIYA Masatoshi - - * lisp/nnshimbun.el: Remove some garbage. - -2001-06-10 Katsumi Yamaoka - - * texi/message-ja.texi: Use `iso-2022-7bit' instead of - `iso-2022-7bit-ss2' to keep a compatibility between XEmacsen and - FSF Emacsen. - * texi/gnus-ja.texi: Ditto. - -2001-06-09 TSUCHIYA Masatoshi - - * lisp/nnshimbun.el (top-level): Updated comments. - (nnshimbun): New customize group. - (nnshimbun-keep-last-article): Defined as customize variable. - (nnshimbun-keep-unparsable-dated-articles): Ditto. - (nnshimbun-insert-nov): Use `when' instead of `if'. - (gnus-group-shimbun-server-history): Imported from - `gnus-group.el'. - (gnus-group-make-shimbun-group): Ditto. - - * lisp/gnus-group.el (gnus-group-make-shimbun-group): Its real - definition is moved to `nnshimbun.el' and autload code is added. - (gnus-group-shimbun-server-history): Its definition is moved to - `nnshimbun.el'. - -2001-06-08 TSUCHIYA Masatoshi - - * lisp/nnshimbun.el (nnshimbun-use-entire-index): Removed. - (nnshimbun-index-range): New variable. - (nnshimbun-close-server): Check status strictly to close server - safely. - (nnshimbun-generate-nov-database): Refer the group paramter - `nnshimbun-index-range' as the second parameter of - `shimbun-headers'. - (shimbun-mua-use-entire-index): Removed. - (nnshimbun-request-article-1): Replace a date string in - `gnus-newsgroup-data' only when article header has non-nil value. - (nnshimbun-insert-nov): Fixed condition to decide whether - `X-Nnshimbun-Id' should be inseted or not. - -2001-06-08 Katsumi Yamaoka - - * lisp/nnshimbun.el (nnshimbun-expire-nov-databases): Removed. - (nnshimbun-request-expire-articles): Simplified; refer to the - shimbun's default expiration days. - -2001-06-08 Katsumi Yamaoka - - * lisp/lpath.el: Fbind `xml-node-children' for XEmacsen and old FSF - Emacsen. - -2001-06-07 Katsumi Yamaoka - - * lisp/nnshimbun.el (nnshimbun-request-expire-articles): Prefer the - group parameter `expiry-wait' when expiring a closed group. - -2001-06-07 Katsumi Yamaoka - - * lisp/nnshimbun.el (nnshimbun-request-article-1): Replace a date - string in `gnus-newsgroup-data' based on the newly retrieved - article. - -2001-06-07 Katsumi Yamaoka - - * lisp/nnshimbun.el (nnshimbun-request-expire-articles): Fix - inhibiting the expiring. - -2001-06-06 Katsumi Yamaoka - - * lisp/nnshimbun.el (nnshimbun-expire-nov-databases): New command. - (nnshimbun-request-expire-articles): New function. - (nnshimbun-keep-unparsable-dated-articles): New variable. - (nnshimbun-keep-last-article): New variable. - (nnshimbun-insert-nov): Rewrite using `nnshimbun-string-or'. - (nnshimbun-string-or): New macro. - (nnshimbun-tmp-string): New internal variable. - (TopLevel): Require `message' for `message-make-date'. - -2001-05-30 Katsumi Yamaoka - - * lisp/gnus-clfns.el (find-cl-run-time-functions): Remove a - useless non-global var; scroll the output window automatically. - -2001-05-31 TSUCHIYA Masatoshi - - * lisp/nnshimbun.el (nnshimbun-header-xref): Removed. - (nnshimbun-check-header): Removed. - (nnshimbun-make-shimbun-header): Don't call - `nnshimbun-header-xref'. - (nnshimbun-request-group): Simplified. - (nnshimbun-request-article-1): Call `nnshimbun-replace-nov-entry' - instead of `nnshimbun-check-header'. - (nnshimbun-insert-nov): New function. - (nnshimbun-generate-nov-database): Call `nnshimbun-insert-nov' - instead of `nnheader-insert-nov'. - (nnshimbun-replace-nov-entry): New function. - -2001-05-29 Katsumi Yamaoka - - * lisp/gnus-clfns.el (find-cl-run-time-functions): Add a parser for - `dolist'; protect against errors. - -2001-05-29 Katsumi Yamaoka - - * lisp/nnshimbun.el (nnshimbun-retrieve-headers-with-nov): Don't - use `last'. - (nnshimbun-make-shimbun-header): Use the following macros. - (nnshimbun-mail-header-from): New macro whose definition will be - changed statically for Gnus or gnus. - (nnshimbun-mail-header-subject): Ditto. - (TopLevel): Don't require `gnus-clfns'. - - * lisp/gnus.el: Add autoload for `find-cl-run-time-functions'. - - * lisp/gnus-clfns.el (find-cl-run-time-functions): New command for - the developers. - (cl-run-time-functions): New variable. - (TopLevel): Don't require `cl' at run-time. - -2001-05-28 TSUCHIYA Masatoshi - - * texi/gnus-ja.texi (Web Newspaper): Updated. - -2001-05-28 Katsumi Yamaoka - - * lisp/dgnushack.el (dgnushack-unexporting-files): Add - "nnshimbun.el" if the library "shimbun" is not found. - (TopLevel): Add "/somewhere/apel/" to `load-path' if it is needed. - (locate-library): Redefine it for Mule before it is called. - - * README.semi.ja: Update for the use of Emacs-W3M. - * README.semi: Ditto. - * Mule23@1934.ja: Ditto. - * Mule23@1934.en: Ditto. - -2001-05-28 TSUCHIYA Masatoshi - - * lisp/nnshimbun.el: Reconstructed to use `shimbun'. - - * lisp/gnus-group.el (gnus-group-make-shimbun-group): - Reconstructed to use `shimbun'. - - * lisp/dgnushack.el (toplevel): Add paths if and only if APEL and - FLIM can't be found. - -2001-05-17 Kai =?iso-8859-1?q?Gro=DFjohann?= - - * etc/Makefile.in (datadir): Set this variable, like in the other - Makefile.in's. Patch from Gaute B Strokkenes . - -2001-05-16 Katsumi Yamaoka - - * lisp/dgnushack.el (dgnushack-bind-colon-keywords): Don't ignore - `widget-convert-button', `widget-create' and `widget-put'; ignore - `defface'. - -2001-05-14 Katsumi Yamaoka - - * lisp/gnus.el: Require `base64' if `base64-encode-string' is not a - built-in function. - - * lisp/dgnushack.el (dgnushack-bind-colon-keywords): Ignore - `defgroup'. - -2001-05-14 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 01. - - * lisp/nnmail.el: Don't bind the colon keywords here. - * lisp/gnus.el (gnus-colon-keywords): New variable which will - default to the value of `dgnushack-colon-keywords'; bind them. - * lisp/dgnushack.el (dgnushack-unexporting-files): Add - dgnuskwds.el. - (dgnushack-colon-keywords): New constant which will have the colon - keywords shuld be bound at run-time for old Emacsen; cache them in - the file dgnuskwds.el and bind them. - (dgnushack-bind-colon-keywords): New function. - (locate-library): Make the function to be silent for Mule. - * lisp/Makefile.in (clean): Remove dgnuskwds.el. - -2001-05-07 Katsumi Yamaoka - - * lisp/message.el (message-maybe-encode): Don't use - `end-of-invisible'. - -2001-05-07 Katsumi Yamaoka - - * lisp/gnus-vers.el: T-gnus 6.15.4 revision 00. - -2001-04-27 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 01. - - * lisp/gnus-art.el (gnus-article-mime-edit-exit): Set buffer to - `gnus-article-buffer' just before `gnus-article-prepare-display' is - called. - (gnus-article-mime-edit-article-setup): Ditto. - (gnus-article-prepare-display): Don't bind `buffer-read-only' - because of `inhibit-read-only'; don't set the value of - `gnus-article-current-summary' here; delete all extents or overlays - and clear the value of `gnus-button-marker-list' in advance; make - it to run in `gnus-article-buffer'. - (gnus-article-prepare): Make it to run in `gnus-article-buffer'. - (article-toggle-headers): Don't bind `buffer-read-only' because of - `inhibit-read-only'. - (article-hide-headers): Ditto. - -2001-04-16 Katsumi Yamaoka - - * lisp/gnus-vers.el: T-gnus 6.15.3 revision 00. - -2001-04-16 Katsumi Yamaoka - - * lisp/gnus-vers.el: T-gnus 6.15.2 revision 00. - -2001-04-16 Katsumi Yamaoka - - * lisp/gnus-vers.el: T-gnus 6.15.1 revision 00. - -2001-04-13 Katsumi Yamaoka - - * lisp/lpath.el: Fbind `xml-parse-region' for XEmacsen and old FSF - Emacsen; don't bind `mh-lib-progs'. - -2001-04-10 Katsumi Yamaoka - - * lisp/nnshimbun.el: Enclose w3m stuff with `eval-and-compile'; - bind `w3m-work-buffer-name' and `w3m-retrieve' when compiling. - -2001-04-09 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 10. - -2001-04-03 TSUCHIYA Masatoshi - - * lisp/nnshimbun.el (nnshimbun-type-definition: Follow changes in - asahi.com. - (nnshimbun-asahi-get-headers): Ditto. - (nnshimbun-retrieve-url): Use `w3m-retrieve' if it is available. - -2001-04-02 Katsumi Yamaoka - - * lisp/gnus-msg.el (gnus-inews-yank-articles): Make it to work with - multiple articles even if there is a detached minibuffer frame on - some window managers. - -2001-03-21 Thierry Emery - - * lisp/mm-decode.el (mm-copy-to-buffer): Copy buffer in unibyte - mode. - -2001-03-19 Katsumi Yamaoka - - * lisp/gnus-kill.el (gnus-execute): Work with the extra headers. - * lisp/gnus-sum.el (gnus-summary-execute-command): Ditto. - -2001-03-13 Katsumi Yamaoka - - * lisp/message.el (message-fix-before-sending): Hide again the - invisible property of encoded binary data parts after checking is - done. - (message-find-invisible-regions): New function. - (message-save-drafts, message-send): Inherit the invisible property - of encoded binary data parts to make MIME-Edit find the MIME part - boundaries. - - * lisp/dgnushack.el (dgnushack-compose-package): Tidy up. - (dgnushack-make-load): Ditto. - -2001-03-12 Katsumi Yamaoka - - * lisp/dgnushack.el (dgnushack-compose-package): New function. - (dgnushack-make-load): Add autoload for cus-load if it is missing. - - * lisp/Makefile.in (compose-package): Use - `dgnushack-compose-package'. - (clean, clever): Remove custom-load.el. - - * Makefile.in (elclean): Remove custom-load.el. - -2001-03-08 Katsumi Yamaoka - - * lisp/gnus-art.el (gnus-article-prepare-display): Setup MIME - entity even if `gnus-show-mime' is nil. - -2001-03-08 Katsumi Yamaoka - - * lisp/dgnushack.el: Load gnus-clfns.el after `load-path' is - adjusted. - - * lisp/gnus-clfns.el (string): New compiler macro. - (string): Defun-maybe as an ordinary function since it won't be - provided in cl. - * lisp/gnus-score.el (gnus-score-find-bnews): Use it as Gnus does. - -2001-03-06 Katsumi Yamaoka - - * lisp/nnshimbun.el (nnshimbun-retrieve-url): Check if - `url-current-mime-charset' is bound. - -2001-03-04 Katsumi Yamaoka - - * lisp/gnus.el (gnus-info-find-node): Pretend to be - `gnus-article-mode' in the article buffer. - -2001-03-02 Katsumi Yamaoka - - * lisp/nnshimbun.el (nnshimbun-kinsoku-eol-list): Simplified. - (nnshimbun-kinsoku-bol-list): Ditto. - -2001-03-01 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 09. - - * lisp/gnus-offline.el (gnus-offline-get-menu-items): Rewrite using - `dolist'. - - * lisp/gnus-group.el (gnus-group-make-shimbun-group): Simplified. - - * lisp/dgnushack.el: Load cl-macs to ensure that the macro `dolist' - is defined properly. - -2001-02-28 Katsumi Yamaoka - - * lisp/nnwfm.el: Require `gnus-clfns' when compiling. - * lisp/nnshimbun.el: Ditto. - * lisp/nnfolder.el: Ditto. - * lisp/mm-util.el: Ditto. - * lisp/gnus-vers.el: Ditto. - * lisp/gnus-sum.el: Ditto. - * lisp/gnus-score.el: Ditto. - * lisp/gnus-nocem.el: Ditto. - - * lisp/gnus-ofsetup.el: Don't require `gnus-clfns'. - (gnus-ofsetup-customize-done): Use `dolist' instead of `mapc'. - (gnus-setup-for-offline): Ditto. - - * lisp/gnus-offline.el: Don't use `mapc' for binding some vars; - don't require `gnus-clfns'. - - * lisp/gnus-clfns.el (subseq, merge, coerce, butlast): New compiler - macros. - (mapc): Remove. - - * lisp/gnus-art.el: Use `dolist' instead of `mapcar' for defining - `gnus-article-read-summary-keys'. - -2001-02-28 Katsumi Yamaoka - - * lisp/gnus-art.el (gnus-article-mime-edit-article-setup): Leave - the forwarded parts undecoded. - (gnus-article-decode-article-as-default-mime-charset): Set the - value of `default-mime-charset' buffer-locally. - -2001-02-27 Katsumi Yamaoka - - * lisp/gnus.el: Add autoloads for - `gnus-summary-digest-post-forward' and - `gnus-summary-digest-mail-forward'. - - * lisp/gnus-sum.el (gnus-summary-post-menu): Replace - `gnus-uu-digest-mail-forward' and `gnus-uu-digest-post-forward' - with `gnus-summary-digest-post-forward' and - `gnus-summary-digest-mail-forward'. - - * lisp/gnus-msg.el (gnus-summary-digest-post-forward): Restore and - repair the command `gnus-summary-post-digest' and rename it. - (gnus-summary-digest-mail-forward): Ditto. - (gnus-summary-send-map): Replace `gnus-uu-digest-mail-forward' and - `gnus-uu-digest-post-forward' with - `gnus-summary-digest-post-forward' and - `gnus-summary-digest-mail-forward'. - -2001-02-27 Katsumi Yamaoka - - * lisp/gnus-sum.el (gnus-summary-show-article): Bind - `gnus-inhibit-treatment' to t while fetching the raw article. - - * lisp/gnus-art.el (gnus-article-mime-edit-exit): Bind - `mime-edit-insert-user-agent-field' to nil while `mime-edit-exit' - is being done; turn off font-lock first; query if the buffer is - modified. - (gnus-article-mime-edit-done): New function. - (gnus-article-mime-edit-article-setup): Make the window fill its - frame; clear the buffere modified flag; substitute key definition - `gnus-article-edit-done' with `gnus-article-mime-edit-done'; don't - turn off font-lock here; bind `mime-edit-insert-user-agent-field' - to nil while `mime-edit-exit' is being done. - (gnus-article-mime-edit-article-unwind): Turn off font-lock first. - -2001-02-23 Katsumi Yamaoka - - * lisp/dgnushack.el: Don't require `emu'. - -2001-02-16 Katsumi Yamaoka - - * lisp/message.el (message-forward-subject-author-subject): Decode - `From' field. - -2001-02-16 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 08. - - * lisp/gnus-sum.el (gnus-get-newsgroup-headers-xover): Don't use - `gnus-retrieve-parsed-headers' when the backend is nnimap. It is - only a temporary fix for an infloop on nnimap. FIXME!!! - (gnus-select-newsgroup): Ditto. - -2001-02-16 Katsumi Yamaoka - - * texi/gnus-ja.texi (New features in Gnus 5.8): Remove annotation - about `gnus-article-display-hook.' - * texi/gnus-faq-ja.texi (Q2.1): Remove mention of - `gnus-article-display-hook.' - - * lisp/gnus.el (gnus-article-display-hook): Abolished. - - * lisp/gnus-uu.el (gnus-uu-grab-articles): Don't care about - `gnus-article-display-hook'. - * lisp/gnus-sum.el (gnus-summary-show-article): Ditto. - (gnus-summary-search-article): Ditto. - - * lisp/gnus-bbdb.el (gnus-bbdb-insinuate): Use - `gnus-article-prepare-hook' instead of `gnus-article-display-hook'. - - * lisp/gnus-art.el (gnus-article-prepare-display): Evaluate - `gnus-article-prepare-hook' after an article has been prepared; - don't evaluate `gnus-article-display-hook'. - -2001-02-15 Katsumi Yamaoka - - * lisp/message.el (message-cite-original-without-signature): - Extract from field for the simple citation line. - -2001-02-14 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 07. - - * lisp/dgnushack.el (dgnushack-make-autoloads): Remove function. - (dgnushack-make-load): Ignore cus-load.el if it does not exist. - (dgnushack-make-auto-load): Remove auto-autoloads.el. - (dgnushack-make-cus-load): Do nothing if loading cus-dep is failed. - - * lisp/Makefile.in (clean): Remove gnus-load.el instead of - custom-load.el. - (compose-package): Call `gnus-load.elc' and then rename - gnus-load.el(c) to auto-autoloads.el(c) instead of the use of - `dgnushack-make-autoloads'. - (clever): No need to remove custom-load.el. - - * Makefile.in (elclean): Remove gnus-load.el instead of - custom-load.el. - - * aclocal.m4 (AC_CHECK_URL): Ignore cache. - -2001-02-13 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 06. - -2001-02-11 18:00:00 ShengHuo ZHU - - * GNUS-NEWS: Copyright and others. - -2001-02-09 20:00:00 ShengHuo ZHU - - * aclocal.m4 (AC_CHECK_URL): Add. - - * configure.in: Use it. - -2001-02-08 Katsumi Yamaoka - - * lisp/nnshimbun.el (nnshimbun-fml-get-headers): Fix unbalanced - parentheses. - -2001-02-08 Akihiro Arisawa - - * lisp/nnshimbun.el: Add `bbdb-ml' support. - -2001-02-02 Akihiro Arisawa - - * lisp/nnshimbun.el (nnshimbun-type-definition): Follow URL change - of `xemacs'. - (nnshimbun-xemacs-get-headers): Ditto. - -2001-02-06 Katsumi Yamaoka - - * README-gnus-bbdb.{en,ja}: Update the patch for BBDB v2.2. - -2001-02-01 Katsumi Yamaoka - - * texi/Makefile.in (.texi, %.info): Don't use makeinfo command when - gnus-ja.texi or message-ja.texi is given. It is needed for some - make command if which can not understand "%-ja:" or "%-ja.info:". - -2001-01-31 Katsumi Yamaoka - - * lisp/gnus-sum.el (gnus-summary-display-article): Replace - `mm-enable-multibyte-mule4' with `set-buffer-multibyte'. - -2001-01-29 Katsumi Yamaoka - - * lisp/gnus-art.el (gnus-article-mime-edit-exit): Use - `buffer-substring-no-properties' instead of `format'. - -2001-01-23 TAKAHASHI Kaoru - - * texi/ptexinfmt.el: Support @letterpaper and @afivepaper. - -2001-01-22 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 05. - - * Makefile.in (install-package-lisp): Use - `install-without-compiling' instead of `install'. - - * lisp/Makefile.in (install): Use `install-without-compiling'. - (install-without-compiling): New target. - -2001-01-22 Katsumi Yamaoka - - * texi/Makefile.in (.texi, %.info, %-ja.info, %-ja): Use - `infohack-texi-format'. - - * texi/infohack: (infohack-texi-format): New function. - * lisp/dgnushack.el (dgnushack-texi-format): Move to - texi/infohack.el and rename. - (dgnushack-texi-add-suffix-and-format): Remove. - - * texi/ptexinfmt.el: New file. - * lisp/ptexinfmt.el: Move to texi/. - -2001-01-18 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 04. - -2001-01-17 Katsumi Yamaoka - - * lisp/dgnushack.el (dgnushack-make-autoloads): Do nothing if the - files for autoloads already exist. - (dgnushack-unexporting-files): More useful message. - - * lisp/Makefile.in (install): Call `clever' before installing. - (install-lisp): Remove. - (clever): Check for whether the all elc files should be recompiled. - - * Makefile.in (xclever): New target. - (install-package-lisp): Replace `install-lisp' with `install'. - (install-package-ja): Replace `xlick' with `xclever'. - (install-package): Ditto. - -2001-01-17 KOSEKI Yoshinori - - * Makefile.in: Unset `PWD' for Meadow/NTEmacs. - -2001-01-15 Jesper Harder - - * make.bat: Fix doc. - -2001-01-15 Katsumi Yamaoka - - * lisp/nnheader.el: Require `pces', `poem' and `std11' to reduce - the required value of `recursive-load-depth-limit' for Emacs 21. - - * lisp/message.el (message-followup): Handle "Mail-Copies-To:" - correctly. - (message-get-reply-headers): Ditto. - -2001-01-15 Keiichi Suzuki - - * lisp/gnus-bbdb.el (gnus-bbdb/update-record): Save excursion - while `bbdb-annotate-message-sender' is being done. - -2001-01-13 Kinji Itoh - - * Makefile.in (install-package-lisp): Specify EMACS=$(XEMACS). - -2001-01-11 Katsumi Yamaoka - - * lisp/gnus-msg.el (gnus-copy-article-buffer): Remove smiley - extents for XEmacs 21.1 using `format'. - - * lisp/dgnushack.el (dgnushack-texi-format): Cancel last change. - -2001-01-10 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 03. - - * lisp/gnus.el: Don't autoload "smiley" for `smiley-toggle-buffer'; - don't autoload "gnus-bitmap" or "x-face-mule" when Emacs 21 is - running. - - * lisp/gnus-art.el (TopLevel): Autoload "gnus-bitmap" for - `smiley-toggle-buffer' when compiling. - (gnus-treatment-function-alist): Use `gnus-smiley-display' for - `gnus-treat-display-smileys' by default when XEmacs or Emacs 21 is - running. - (gnus-treat-display-smileys): Check for `smiley-mule' instead of - `gnus-bitmap'. - (gnus-article-x-face-command): Don't check for xbm for x-face-e21. - -2001-01-05 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 02. - - * lisp/dgnushack.el (dgnushack-texi-format): Remove "@anchor" if it - is not supported. - -2000-12-26 Katsumi Yamaoka - - * lisp/gnus.el: Bind `:parameter-type', `:parameter-document', - `:function', `:function-document', `:variable', - `:variable-document', `:variable-group', `:variable-type' and - `:variable-default' for old Emacsen. - -2000-12-22 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 01. - - * configure: Regenerate. - * configure.in: Add `AC_PATH_ETCDIR'. - * Makefile.in (install-etc): New target. - - * lisp/nnheader.el (mm-image-load-path): Alias to - `nnheader-image-load-path'. - (nnheader-image-load-path): New function copied from - the function `mm-image-load-path' in mm-util.el. - - * lisp/drums.el: Remove. - -2000-12-22 03:00:00 ShengHuo ZHU - - * configure.in: Add etc/Makefile. - -2000-12-22 Katsumi Yamaoka - - * lisp/gnus-msg.el (gnus-debug): Use `sit-for' in the inside of - `save-excursion'. - (gnus-bug): Pop up the sending buffer first. - - * lisp/gnus-art.el (article-treat-dumbquotes): Quote backslashes in - doc-string. - - * lisp/dgnushack.el - (byte-compile-file-form-custom-declare-variable): Use `defvar' - instead of `custom-declare-variable' to make the variable - uncustomizable if the arguments has the keyword `:version'. - -2000-12-22 Katsuhiro Hermit Endo - - * README.semi.ja: Fix typo. - -2000-12-21 Katsumi Yamaoka - - * lisp/lpath.el: Fbind `compose-mail' for Mule. - - * lisp/dgnushack.el (TopLevel): Byte-optimize - `custom-declare-variable', `custom-declare-group, and - `custom-declare-face' to omit unsupported keywords when Mule is - running. - -2000-12-20 Katsumi Yamaoka - - * lisp/gnus-vers.el: T-gnus 6.15.0 revision 00. - - * lisp/dgnushack.el (TopLevel): Advise `custom-handle-keyword' not - to signal an error when Mule is running. - (TopLevel): Bind `:ascent', `:foreground', `:help', `:version' and - `:set-after' if colon keyword is not available. - (TopLevel): Require `custom'. - - * lisp/lpath.el (TopLevel): Fbind `shell-command-to-string' for - Mule. - (TopLevel): Don't require `custom' here. - -2000-12-20 Jesper Harder - - * make.bat: set max-lisp-eval-depth. - -See ChangeLog.3 for earlier changes. diff --git a/ChangeLog.1 b/ChangeLog.1 deleted file mode 100644 index 2b2a04e..0000000 --- a/ChangeLog.1 +++ /dev/null @@ -1,4121 +0,0 @@ -1999-06-08 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 16. - - * lisp/gnus-sum.el (gnus-article-sort-by-author): Bug fix - use the - car of the return value of `mime-read-field'. - -1999-05-28 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 15. - - * texi/gnus.texi (Customizing Articles): Abolish the treatment - variable `nomime' and rename - `gnus-treat-decode-message-body-as-default-mime-charset' with - `gnus-treat-decode-article-as-default-mime-charset'. - - * lisp/gnus-art.el (gnus-treat-predicate): Abolish the treatment - variable `nomime'. - (gnus-article-prepare-mime-display): Call `gnus-treat-article' with - the 1st arg t for treating if the part is not the last one. - (gnus-article-decode-article-as-default-mime-charset): Renamed from - `gnus-article-decode-message-body-as-default-mime-charset'; Don't - work if `gnus-show-mime' is non-nil. - (gnus-treat-decode-article-as-default-mime-charset): Renamed from - `gnus-treat-decode-message-body-as-default-mime-charset'; add - choice item for decoding the whole article. - -1999-05-28 Yoshiki Hayashi - - * lisp/message.el (message-header-hook): Pass optional argument - code-conversion. - -1999-05-26 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 14. - - * lisp/gnus-art.el (gnus-article-prepare-display): Narrow to - header with trailing newline instead of the use of - `std11-narrow-to-header'. - (article-date-ut): Use `text-property-any' instead of - `next-single-property-change'. - (article-toggle-headers): Use `text-property-any' and - `text-property-not-all' instead of `get-text-property' or - `next-single-property-change'; use `gnus-hidden-properties' instead - of the property `invisible' with the function `add-text-properties' - or `remove-text-properties'; use `article-hide-headers' instead of - `gnus-article-maybe-hide-headers'; re-display X-Face image under - XEmacs after sorting fields. - -1999-05-25 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 13. - (TopLevel): Autoload "gnus-art" for `gnus-article-toggle-headers'. - - * texi/gnus.texi, texi/gnus-ja.texi (Article Hiding): Replace - `gnus-article-hide-headers' with `gnus-article-toggle-headers'. - - * lisp/gnus-sum.el (gnus-summary-article-menu, - gnus-summary-wash-hide-map, gnus-summary-wash-map, - gnus-summary-mode-map): Use `gnus-article-toggle-headers' instead - of `gnus-article-hide-headers'. - - * lisp/gnus-msg.el (gnus-copy-article-buffer): Remove bitmap images - with text property `x-face-mule-bitmap-image'; - don't bind `inhibit-read-only'. - - * lisp/gnus-art.el (gnus-article-display-x-face-with-x-face-mule): - Do nothing if `window-system' is nil. - (gnus-article-decode-message-body-as-default-mime-charset): Don't - bind `buffer-read-only'; decode from (point-min) instead of (point). - (gnus-article-prepare-display): Bind `inhibit-read-only' to t; bind - `buffer-read-only' to nil; don't bind - `mime-preview-over-to-next-method-alist'; - strip read-only properties after preparing. - (gnus-article-prepare-mime-display): Put text property - `article-treated-header' to the header; don't use - `mime-preview-move-to-next'; reduce a number of bound variables. - (gnus-article-display-traditional-message): Don't bind - `inhibit-read-only'. - (gnus-article-make-menu-bar): Use `gnus-article-toggle-headers' - instead of `gnus-article-hide-headers'. - (article-toggle-headers): New function. - -1999-05-24 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 12. - - * texi/gnus.texi (Customizing Articles): Remove duplicates; add the - function `gnus-treat-decode-message-body-as-default-mime-charset'. - - * lisp/gnus-msg.el (gnus-copy-article-buffer): Bind - `inhibit-read-only' to t during modifying the destination buffer. - - * lisp/gnus-art.el (gnus-article-prepare-mime-display): Rewrite. - (article-date-ut): If there is a forwarded message, fetch Date from - its header instead of `gnus-current-headers'. - (gnus-article-display-x-face-with-x-face-mule): New function. - (TopLevel): Autoload "x-face-mule" for the function - `x-face-mule-x-face-decode-message-header'. - (gnus-treatment-function-alist): Remove duplicates. - -1999-05-21 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 11. - - * lisp/gnus-art.el (gnus-article-prepare-mime-display): Don't treat - as a MIME message if the article is not so. - (gnus-article-display-traditional-message): Bind - `inhibit-read-only' to t. - (article-hide-headers): Ditto. - -1999-05-19 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 10. - (gnus-article-display-hook): Default to nil; annotate that it is an - obsolete variable. - - * texi/gnus.texi (Customizing Articles): Document the new treatment - variables `mime' and `nomime'. - - * lisp/gnus-art.el (gnus-treat-predicate): Handle the new treatment - variables `mime' and `nomime'. - (gnus-article-decode-message-body-as-default-mime-charset): New - function. - (gnus-article-prepare-display): Rewrite for the use of - `gnus-treat-article'. - (gnus-article-prepare-mime-display): New function. - (article-date-ut): Use `next-single-property-change' instead of - re-search. - (gnus-treatment-function-alist): Add a pair of - `gnus-treat-decode-message-body-as-default-mime-charset' and - `gnus-article-decode-message-body-as-default-mime-charset'. - (gnus-treat-decode-message-body-as-default-mime-charset): New user - option. - -1999-05-19 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 09. - - * lisp/gnus-art.el (article-date-ut): Keep the original X-Sent - field, fix the position of the converted date to be displayed, - etc. - -1999-05-18 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 08. - - * lisp/gnus-art.el (gnus-article-prepare-display): Undo the last - change - don't call `gnus-treat-article'. - -1999-05-17 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 07. - - * lisp/gnus-art.el (gnus-article-prepare-display): Call - `gnus-treat-article'. - -1999-05-17 Daiki Ueno - - * lisp/gnus-art.el (article-date-ut): Always detete the last - newline of any old Date fields. - -1999-05-17 Daiki Ueno - Tsukamoto Tetsuo - - * lisp/gnus.el (gnus-revision-number): Increment to 06. - - * lisp/mail-source.el (mail-source-keyword-map): New keyword - :connection for pop. It is introduced to enable SSL connection. - (mail-source-fetch-pop): Use it to bind `pop3-connection-type'. - - * lisp/pop3.el : Add an autoload for `open-ssl-stream' defined in - `ssl'. - (pop3-connection-type, pop3-ssl-program-arguments): New variables. - (pop3-open-ssl-stream-1, pop3-open-ssl-stream): New functions. - (pop3-open-server): Call the latter when `pop3-connection-type' is - ssl. - -1999-05-17 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 05. - (TopLevel): Remove autoloads for `gnus-picons-display-x-face' and - `gnus-picons-article-display-x-face'. - -1999-05-16 Tsukamoto Tetsuo - - * texi/gnusref-ja.tex (subsec Notes): Complete words. - (sec GroupMode): Translate description of "P". - -1999-05-15 Tsukamoto Tetsuo - - * texi/gnusref-ja.tex: Undo the last change. - -1999-05-15 Tsukamoto Tetsuo - - * texi/gnusref-ja.tex: Fix typo. - -1999-05-14 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 04. - - * lisp/*.el: Undo all of the last changes. - -1999-05-13 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 03. - - * lisp/nnsoup.el (nnsoup-store-reply): Use `forward-char' instead - of `backward-char'. - * lisp/message.el (message-send-news-with-gnus, - message-send-mail-with-smtp, message-send-mail-with-qmail, - message-send-mail-with-sendmail): Ditto. - * lisp/gnus-picon.el (gnus-group-display-picons): Ditto. - - * lisp/nnsoup.el (nnsoup-store-reply): Use `(bolp)' instead of - `(= (preceding-char) ?\n)'. - * lisp/message.el (message-send-news, message-send-mail): Ditto. - - * lisp/gnus-sum.el (gnus-summary-reparent-thread): Use - `(end-of-line 0)' to go to the end of the previous line. - - * lisp/nnmail.el (nnmail-decode-status): Don't use regexp search. - * lisp/message.el (message-next-header, message-remove-header): - Ditto. - * lisp/gnus-art.el (gnus-article-add-buttons-to-head, - gnus-article-highlight-headers, gnus-article-hide-header, - article-hide-boring-headers, article-hide-headers): Ditto. - - * lisp/nntp.el (nntp-snarf-error-message, nntp-read-server-type): - Use `buffer-substring' instead of `buffer-string'. - * lisp/nnspool.el (nnspool-inews-sentinel): Ditto. - * lisp/message.el (message-wash-subject, message-reply, - message-make-from, message-make-organization): Ditto. - * lisp/md5.el (md5): Ditto. - * lisp/mail-source.el (mail-source-movemail): Ditto. - * lisp/gnus.el (gnus-getenv-nntpserver): Ditto. - * lisp/gnus-xmas.el (gnus-xmas-article-display-xface): Ditto. - * lisp/gnus-util.el (gnus-mode-string-quote): Ditto. - * lisp/gnus-sum.el (gnus-summary-edit-article-done, - gnus-simplify-subject-fuzzy): Ditto. - * lisp/gnus-spec.el (gnus-parse-simple-format): Ditto. - * lisp/gnus-picon.el (gnus-picons-make-glyph): Ditto. - * lisp/gnus-msg.el (gnus-copy-article-buffer): Ditto. - * lisp/gnus-mh.el (gnus-summary-save-in-folder): Ditto. - * lisp/gnus-kill.el (gnus-kill-file-apply-buffer): Ditto. - * lisp/gnus-art.el (gnus-article-mime-edit-exit, - gnus-article-edit-exit): Ditto. - * lisp/format-spec.el (format-spec): Ditto. - * lisp/dgnushack.el (dgnushack-make-package): Ditto. - * lisp/base64.el (base64-decode, base64-encode, - base64-run-command-on-region): Ditto. - -1999-05-13 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 02. - - * lisp/gnus-ofsetup.el (gnus-setup-for-offline): Don't specify - the authentication scheme if `password' is selected. - -1999-05-06 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 01. - - * texi/gnus-ja.texi: (gnus-summary-enter-digest-group): Change the - key assignment "C-d" into "A D". - (Article treatment): Document the new variable - `gnus-article-date-lapsed-new-header'. - - * lisp/mail-source.el: Use the original source without any changes. - - * lisp/gnus-art.el (article-hide-headers): To work toggle hiding. - - * README.T-gnus: Update what is the latest T-gnus. - -1999-05-04 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.10.064. - (gnus-revision-number): Fresh start from 00. - - * Sync up with Pterodactyl Gnus v0.84. - -1999-04-28 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 03. - - * lisp/gnus-vm.el (gnus-summary-save-in-vm): Use - `vm-read-file-name' instead of `read-file-name'. This allows to use - the optional sixth argument HISTORY for the various environments. - (gnus-summary-save-article-vm): Ditto. - (TopLevel): Autoload "vm" for the function `vm-read-file-name'. - -1999-04-27 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 02. - - * lisp/gnus-vm.el (gnus-summary-save-in-vm): To read the name of - FOLDER in the way of VM; give the value of `gnus-current-article' - to the function `gnus-summary-select-article' if it is called non - interactively. - (gnus-summary-save-article-vm): Accept the optional 2nd arg FOLDER. - If it is called interactively the name of FOLDER is read from the - minibuffer; bind `mime-display-header-hook', - `mime-display-text/plain-hook', `mime-text-decode-hook', - `mime-view-define-keymap-hook' and `mime-view-mode-hook' to nil - when the function `gnus-summary-save-article' is called. - (gnus-summary-save-article-vm-count, - gnus-summary-save-article-vm-folder): New internal variables. - (gnus-vm-make-folder): Bind `mime-display-header-hook', - `mime-display-text/plain-hook', `mime-text-decode-hook', - `mime-view-define-keymap-hook' and `mime-view-mode-hook' to nil - when the function `vm-mode' is called. - (vm-use-toolbar, vm-primary-inbox, vm-folder-history, - vm-folder-directory): Define variables for avoiding byte compile - warning. - (gnus-vm-inhibit-window-system): Abolish variable; don't require - `win-vm'. - (TopLevel): Don't autoload "vm" for the functions - `vm-forward-message', `vm-reply' or `vm-mail'; don't require - `sendmail', `message', `gnus' or `gnus-msg' but `gnus-art'. - -1999-04-20 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 01. - - * lisp/pop3.el (pop3-munge-message-separator): Don't put the - Content-Length field break into the other fields. - -1999-04-18 Sin'ya Kanematsu - - * texi/gnus-ja.texi: Fix typo - `gnus-auto-expirable-newgroups' -> - `gnus-auto-expirable-newsgroups'. - -1999-04-18 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.10.063. - (gnus-revision-number): Fresh start from 00. - - * Sync up with Pterodactyl Gnus v0.83. - -1999-04-15 NAKAGAWA Tsuneo - - * REDME.semi.ja: Fix where the required packages are. - -1999-04-13 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 09. - -1999-04-13 Keiichi Suzuki - - * lisp/gnus-sum.el (gnus-summary-move-article): Fix, - `gnus-article-mark-lists' will be broken by side effect. - -1999-04-09 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 08. - - * lisp/gnus-art.el (TopLevel): Remove symbol's function definition - for `gnus-article-mime-decode-quoted-printable'. - -1999-04-05 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 07. - -1999-03-30 Yoshiki Hayashi - - * texi/gnus-ja.texi: Some fixes. - -1999-03-26 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 06. - - * lisp/pop3.el (pop3-munge-message-separator): If a retrieved - message has a illegal date field, use `(current-time)' instead. - -1999-03-25 Katsumi Yamaoka - - * lisp/message.el (message-send): Kill `message-encoding-buffer' - after sending. - -1999-03-25 Katsumi Yamaoka - - * lisp/message.el (message-maybe-encode): Inherit the buffer local - variable `mime-edit-pgp-processing' and call - `mime-edit-pgp-enclose-buffer'. - -1999-03-24 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 05. - - * lisp/gnus-art.el (gnus-article-display-mime-message): Set up the - buffer local variable `default-mime-charset' of - `gnus-article-buffer' before `mime-display-message' is called. - - * lisp/gnus-i18n.el (gnus-newsgroup-default-charset-alist): Be also - matched with the group name which has a method name and/or a - foreign server name. - (gnus-set-summary-default-charset): Cancel the last change. - -1999-03-24 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 04. - - * lisp/gnus-i18n.el (gnus-set-summary-default-charset): Strip - method and foreign server name from the newsgroup name. - -1999-03-22 Tsukamoto Tetsuo - - * lisp/gnus-offline.el (gnus-offline-popup-menu): Fix. - -1999-03-22 Tsukamoto Tetsuo - - * lisp/gnus.el (gnus-revision-number): Increment to 03. - - * lisp/gnus-offline.el (gnus-offline-popup-menu): Modify so that - the title of a popup menu is displayed under Emacs 19.34. - (gnus-offline-define-menu-and-key): Rewrite the function to change - the behavior of "Get new news" button, under XEmacs. - - * lisp/gnus-ofsetup.el: Modify for Semi-gnus 6.10.xx so that - `pop3-fma-password' can be saved in .newsrc.eld. - - * README-offline.en: Update. - * README-offline.ja: Ditto. - -1999-03-09 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 02. - - * lisp/message.el (message-yank-original): Keep the existing - references. - -1999-03-04 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 01. - (gnus-other-frame): Rewrite on the model of `toolbar-gnus'. - (gnus-frame): New internal variable. - (gnus-frame-properties): New user option. - -1999-03-04 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.10.062. - (gnus-revision-number): Fresh start from 00. - - * Sync up with Pterodactyl Gnus v0.80. - - * lisp/gnus-sum.el (gnus-summary-edit-article): Don't use - `mime-to-mml' nor `mml-to-mime'. - -1999-03-02 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 03. - - * lisp/gnus-sum.el (gnus-select-newsgroup): Examine cached articles - with `gnus-cache-articles-in-group' if the current group is not - a virtual group. - (TopLevel): Autoload `gnus-cache-articles-in-group' - -1999-03-01 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 02. - - * texi/gnus-ja.texi: Sync up with Semi-gnus 6.10. - - * lisp/dgnushack.el (dgnushack-install-package): Don't refer to - `configure-package-path'. Use `early-packages', `late-packages' or - `last-packages' instead. - -1999-03-01 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 01. - - * lisp/message.el (messgage-inhibit-body-encoding): Default to t. - (message-mode): Abolish `message-mime-attach-file' from doc - string. - (message-mode-map): Abolish `message-mime-attach-file' from - `message-mode-menu'. - - * lisp/gnus-start.el (save-buffer-as-coding-system): Abolished. It - is given in APEL 9.13 by now. - - * lisp/gnus-ems.el (gnus-decode-coding-string): Abolished. - (gnus-encode-coding-string): Abolished. - (gnus-mule-cite-add-face): Restored. - (gnus-cite-add-face): Restored. - - * README.semi.ja: Note that APEL 9.13 or later is required. - * README.semi: Ditto. - * README.T-gnus: Ditto. - -1999-02-27 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.10.061. - (gnus-revision-number): Fresh start from 00. - - * Sync up with Pterodactyl Gnus v0.79. - -1999-02-27 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.10.060. - (gnus-revision-number): Fresh start from 00. - - * Sync up with Pterodactyl Gnus v0.78. - -1999-02-26 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 05. - - * Makefile.in (add-info-suffix, remove-info-suffix): New targets. - (package, install-package, package-ja, install-package-ja): Use - them. - (xinfo, xinfo-ja): Only build infos. - - * texi/Makefile.in (add-info-suffix): Chdir ../lisp first. - - * lisp/dgnushack.el (dgnushack-add-info-suffix-maybe): Chdir - ../texi first. - (dgnushack-install-package): Don't refer to `package-path'; error - if the package path does not found. - (TopLevel): Don't define `gnus-revision-number', - `gnus-version-number' and `package-path'. - -1999-02-24 Tatsuya Ichikawa - - * README.ichikawa : Removed. - - * README.T-gnus : Renamed from README.ichikawa - Remove description about T-gnus 6.8. - -1999-02-24 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 04. - - * Makefile.in (xinfo, xinfo-ja): Make add-info-suffix, formatting, - and make remove-info-suffix. - - * texi/Makefile.in (.texi): Don't specify the output filename when - makeinfo command is used. - (add-info-suffix, remove-info-suffix): New targets. - - * lisp/dgnushack.el (dgnushack-add-info-suffix-maybe): New - function. It will be used for adding ".info" suffix to @setfilename - line in each .texi files. - (dgnushack-texi-file-regexp): New constant. - (dgnushack-info-file-regexp): Add ".info" suffix. - -1999-02-24 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 03. - - * lisp/Makefile.in (all, total): Remove "auto-autoloads.el" and - "custom-load.el" as well. - - * Makefile.in (xlick, xinfo, xinfo-ja): New targets. - (install-package-ja, package-ja, install-package, package): Use - them; use $XEMACS instead of $EMACS. - (osome): Use $XEMACS instead of "xemacs21". - (x): Ditto. - (XEMACS): Use "xemacs" instead of "xemacs21" in default. - - * lisp/dgnushack.el (dgnushack-install-package): Remove extra files - in destination lisp directory. - (dgnushack-make-package): Don't generate "_pkg.el" file; don't - remove "auto-autoloads.el*" files. - (dgnushack-compile): Don't remove "_pkg.el" from the list. - -1999-02-23 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 02. - - * lisp/mail-source.el (mail-source-fetch-pop): Fix typo in original - source and merged it. - - * README.ichikawa: Update description about the latest T-gnus. - -1999-02-22 Tatsuya Ichikawa - - * lisp/gnus-art.el (gnus-narrow-to-page): Fix that "^L" do not work. - - * lisp/gnus.el (gnus-revision-number): Increment to 01. - -1999-02-21 Tatsuya Ichikawa - - * lisp/mail-source.el (mail-source-fetch-pop): Comment out - postscript block - I don't know why it does not work. - There is no Bug report from ding ML. - - * lisp/gnus.el (gnus-version-number): Update to 6.10.059. - (gnus-revision-number): Fresh start from 00. - - * Sync up with Pterodactyl Gnus v0.77. - -1999-02-18 Tsukamoto Tetsuo - - * lisp/gnus.el (gnus-revision-number): Increment to 09. - - * lisp/gnus-start.el (save-buffers-kill-emacs): Rewrite the - advice. Call `gnus-offer-save-summaries'. - -1999-02-18 Tsukamoto Tetsuo - - * lisp/gnus.el (gnus-revision-number): Increment to 08. - - * lisp/gnus-start.el (save-buffers-kill-emacs): Advice. Call - `gnus-save-newsrc-file' before `save-some-buffers' is called. - - * README-offline.en: Update. - - * README-offline.ja: Fix typo. - - * lisp/gnus-ofsetup.el (gnus-setup-for-offline): Set - `gnus-offline-hangup-program' and `gnus-offline-dialup-program' to - nil when null string is given. - -1999-02-18 Tatsuya Ichikawa - - * texi/Makefile.in: Change to work on Windows environment and - other platforms. - - * lisp/gnus.el (gnus-revision-number): Increment to 07. - -1999-02-17 Katsumi Yamaoka - - * lisp/dgnushack.el (dgnushack-make-package): Fix typo. - -1999-02-17 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 06. - - * Makefile.in (install-package-ja, package-ja, install-package, - package): New targets. - (PACKAGEDIR): New user option. - - * lisp/Makefile.in (install-package, package): New targets. - (PACKAGEDIR): New user option. - - * lisp/dgnushack.el (dgnushack-install-package): New function. - (dgnushack-make-package): New function. - (dgnushack-info-file-regexp): New constant. - (dgnushack-compile): Remove "_pkg.el" from the list. - - * configure: Regenerate by autoconf-2.13. - -1999-02-17 Yoshiki Hayashi - - * aclocal.m4: install .el files to site-lisp/gnus instead of - site-lisp. - * Makefile.in: add new rule `all-ja'. - -1999-02-15 Tatsuya Ichikawa - - * lisp/gnus-ofsetup.el (gnus-setup-for-offline): Bug fix when - using nnspool. - - * lisp/gnus.el (gnus-revision-number): Increment to 05. - -1999-02-12 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-revision-number): Increment to 04. - - * lisp/read-passwd.el: Change location of (provide 'read-passwd) - - * lisp/gnus-offline.el: ditto. - -1999-02-12 Hidekazu Nakamura - - * lisp/gnus-ofsetup.el (gnus-setup-for-offline): To work with APOP - authentication scheme. - - * lisp/read-passwd..el (read-pw-set-mail-source-passwd-cache): - Undo my change. - -1999-02-12 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 03. - - * lisp/gnus-sum.el (gnus-summary-mode-map): Bound the command - `gnus-article-hide-headers' to "t". - - * lisp/gnus-art.el (article-hide-headers): Show all headers when - unhiding. - - * texi/gnus.texi: Fix latin chars. - -1999-02-12 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 02. - - * texi/emacs-mime.texi: Fix latin chars. - -1999-02-12 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-revision-number): Increment to 01. - - * lisp/gnus-sum.el (gnus-nov-parse-line): Use - `nnheader-nov-read-message-id' instead of `nnheader-nov-field' or - `nnheader-generate-fake-message-id'; use `(eobp)' instead of - `(eq (char-after) ?\n)'. - -1999-02-11 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.10.058. - (gnus-revision-number): Fresh start from 00. - - * lisp/message.el (message-forward): Get back to the previous - design. - * lisp/gnus-msg.el (gnus-summary-mail-forward): Ditto. - - * lisp/mail-source.el (mail-source-fetch-pop): Ignore program and - authentication scheme.. - - * lisp/message.el (message-forward-start-separator): Restored. - (message-forward-end-separator): Restored. - (message-signature-before-forwarded-message): Restored. - (message-included-forward-headers): Restored. - - * lisp/message.el (message-make-forward-subject): Use "(none)" if - the original article has no subject. - - * Sync up with Pterodactyl Gnus v0.76. - - * lisp/gnus-ofsetup.el (gnus-setup-for-offline): Change for pGnus 0.76. - -1999-02-09 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 08. - - * lisp/score-mode.el (gnus-score-edit-exit): Use - `save-buffer-as-coding-system' instead of - `write-region-as-coding-system'. - * lisp/gnus-start.el (gnus-save-newsrc-file): Ditto. - - * lisp/gnus-start.el (save-buffer-as-coding-system): New function - defined with `defun-maybe'. NOTE: It should be deleted in the - future. - - * lisp/gnus-sum.el (TopLevel): Require `mime-play' when compile. - -1999-02-09 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 07. - - * lisp/gnus-sum.el (gnus-mime-extract-message/rfc822): New - implementation. - -1999-02-08 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 06. - -1999-02-08 Masatoshi Tsuchiya - - * lisp/gnus-sum.el (gnus-articles-to-read): Use maximum number in - default instead of `gnus-large-newsgroup'. - -1999-02-08 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 05. - -1999-02-08 Masatoshi Tsuchiya , - Katsumi Yamaoka , - Keiichi Suzuki - - * lisp/gnus-sum.el (gnus-articles-to-read): If the number of - unread articles is more than `gnus-large-newsgroup', use it in - default instead of the maximum number. - -1999-02-08 MORIOKA Tomohiko , - Katsumi Yamaoka - - * lisp/gnus-sum.el (gnus-mime-extract-multipart): New function; - add it to the acting-condition for extracting mulitpart messages. - (gnus-mime-extract-message/rfc822): New function; add it to the - acting-condition for extracting message/rfc822 or message/news. - -1999-02-08 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-revision-number): Increment to 04. - - * lisp/nntp.el: Change nnmail-read-passwd -> mail-source-read-passwd. - -1999-02-08 Tsukamoto Tetsuo - - * README-offline.ja: Change for current version. - * README-offline.en: Ditto. - -1999-02-07 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-revision-number): Increment to 03. - -1999-02-04 Tsukamoto Tetsuo - - * lisp/gnus-offline.el: Delete security notice. - (gnus-offline-pop-password-file): Removed. - (gnus-offline-pop-password-decoding-function): Removed. - (gnus-offline-gnus-get-new-news): Revert to its original. - -1999-02-04 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 02. - -1999-02-04 YOSHIZAWA Masahiro - - * README-offline.en: New description. - * README-offline.ja: Ditto. - -1999-02-03 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-revision-number): Change to 01 - - * lisp/gnus-ofsetup.el (gnus-setup-for-offline): Add default value. - -1999-02-03 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-revision-number): New constant. - -1999-02-02 Tatsuya Ichikawa - - * lisp/gnus-ofsetup.el (gnus-setup-for-offline): Ask save password - information to .newsrc file. - - * lisp/gnus.el (gnus-variable-list): Undo my last change. - - * lisp/read-password.el (read-pw-set-mail-source-passwd-cache): Do - not input password if mail-source-password-cache is non nil. - -1999-02-03 Hidekazu Nakamura - - * lisp/read-passwd.el (read-pw-set-mail-source-passwd-cache): To - work with APOP authentication scheme. - -1999-02-02 Tatsuya Ichikawa - - * lisp/gnus-ofsetup.el (gnus-setup-for-offline): To work with - external movemail program. - - * lisp/gnus.el (gnus-variable-list): Add - mail-source-password-cache to save password information. - -1999-02-01 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.10.057. - - * Sync up with Pterodactyl Gnus v0.75. - -1999-02-01 Tatsuya Ichikawa - - * lisp/gnus-offline.el (gnus-offline-gnus-get-new-news): Undo my - change. - -1999-02-01 Katsumi Yamaoka - - * lisp/gnus-offline.el (gnus-offline-define-menu-on-miee): Close - parentheses. - (gnus-offline-define-menu-on-agent): Ditto. - -1999-02-01 Katsumi Yamaoka - - * README.ichikawa: Fix about the last version of T-gnus based on - Gnus 5.6. - -1999-02-01 Akihiro Arisawa - - * lisp/nndoc.el (nndoc-mime-digest-type-p): Add the element of - `header-begin' to type-alist for mime-digest. - -1999-02-01 Tatsuya Ichikawa - - * README-offline.ja: Add description written by YOSHIZAWA Masahiro - - -1999-02-01 Tatsuya Ichikawa - Tsukamoto Tetsuo - - * lisp/gnus-offline.el (gnus-offline-gnus-get-new-news): Modify for - pGnus with mail-source.el. - - * lisp/gnus-offline.el: Use (running-pterodactyl-gnus-0_73-or-later) - to check pGnus 0.73 or later instead of (locate-library "mail-source") - -1999-02-01 Katsumi Yamaoka - - * lisp/nndoc.el (nndoc-mime-parts-type-p): Strip leading white - space from the matching pattern. - -1999-02-01 Katsumi Yamaoka - - * lisp/gnus-sum.el (gnus-nov-parse-extra): Abolished. - (gnus-nov-parse-line): Use `char-after' instead of `following-char' - ; use `nnheader-nov-parse-extra' instead of `gnus-nov-parse-extra'. - -1999-01-31 MORIOKA Tomohiko - - * lisp/gnus-sum.el: Abolish macro `gnus-nov-read-integer', - `gnus-nov-skip-field' and `gnus-nov-field'. - (gnus-nov-parse-line): Use `nnheader-nov-field' and - `nnheader-nov-read-integer' instead of `gnus-nov-field' and - `gnus-nov-read-integer'. - (gnus-get-newsgroup-headers-xover): Use - `gnus-retrieve-parsed-headers'. - - * lisp/gnus-cache.el (gnus-cache-retrieve-parsed-headers): Use - `gnus-cache-braid-headers', - `nnheader-get-newsgroup-headers-xover*' and - `nnheader-retrieve-headers-from-directory*' instead of - `gnus-get-newsgroup-headers-xover', `gnus-cache-braid-parsed-nov' - nor `gnus-cache-braid-parsed-heads'; abolish function - `gnus-cache-braid-parsed-nov' and `gnus-cache-braid-parsed-nov'. - (gnus-cache-braid-headers): New function. - - * lisp/nnheader.el (nnheader-nov-read-integer): Use - `(search-forward "\t" eol 'move)' instead of `(forward-char 1)' as - same as `gnus-nov-read-integer'. - (nnheader-retrieve-headers-from-directory*): New function. - (nnheader-retrieve-headers-from-directory): Use - `nnheader-retrieve-headers-from-directory*'. - (nnheader-get-newsgroup-headers-xover*): New function. - -1999-01-30 MORIOKA Tomohiko - - * lisp/nnmh.el (nnmh-retrieve-parsed-headers): Use - `nnheader-retrieve-headers-from-directory'. - - * lisp/nnheader.el (nnheader-retrieve-headers-from-directory): New - function. - -1999-01-29 MORIOKA Tomohiko - - * lisp/gnus.el (gnus-version): Modify for SEMI 1.13. - - * lisp/gnus-int.el (gnus-retrieve-parsed-headers): Use - `gnus-cache-retrieve-parsed-headers' instead of - `gnus-cache-retrieve-headers'. - - * lisp/gnus-cache.el (gnus-cache-retrieve-parsed-headers): New - function. - (gnus-cache-braid-parsed-nov): New function. - (gnus-cache-braid-parsed-heads): New function. - -1999-01-30 Tatsuya Ichikawa - - * lisp/gnus-offline.el: Rewrite to work with pGnus v0.74 based T-gnus. - * lisp/gnus-ofsetup.el: Ditto. - - * lisp/pop3-fma.el: Removed because after pGnus0.73 , pGnus can treat - multiple pop3 account. - -1999-01-29 Tatsuya Ichikawa - - * lisp/read-passwd.el: New file. - -1999-01-28 Katsumi Yamaoka - - * lisp/gnus.el (running-pterodactyl-gnus-0_73-or-later): Provide as - a new feature. - - * lisp/mail-source.el (mail-source-read-passwd): Don't load - "passwd" if the function `read-passwd' already exists. - - * lisp/gnus-start.el (gnus-read-active-file): Eliminate duplicated - select methods. - - * lisp/gnus-group.el (gnus-group-catchup-current): Fix typo. - -1999-01-27 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.10.056. - - * Sync up with Pterodactyl Gnus v0.74. - -1999-01-28 Katsumi Yamaoka - - * lisp/gnus-msg.el (gnus-summary-mail-digest): Reselect the message - frame after selecting a new article if the value of - `message-use-multi-frames' is non-nil and more than one articles - are given. - -1999-01-28 Keiichi Suzuki - - * lisp/gnus-sum.el (gnus-summary-move-article): Fix, could not - respool article. - -1999-01-26 Katsumi Yamaoka - - * lisp/nnmh.el (nnmh-retrieve-parsed-headers): Bind `in-reply-to' - and `cur' as temporary variables. - -1999-01-25 MORIOKA Tomohiko - - * lisp/gnus-sum.el (gnus-article-sort-by-author): fixed. - -1999-01-12 MORIOKA Tomohiko - - * lisp/gnus-int.el (gnus-retrieve-parsed-headers): Add new - optional arguments `dependencies' and `force-new'; new - implementation; call `retrieve-parsed-headers' if it is found. - - * lisp/nnmh.el (nnmh-retrieve-parsed-headers): New function. - -1999-01-12 MORIOKA Tomohiko - - * lisp/gnus-sum.el (gnus-select-newsgroup): Use - `gnus-retrieve-parsed-headers' instead of `gnus-retrieve-headers' - and `gnus-get-newsgroup-headers-xover' or - `gnus-get-newsgroup-headers'. - - * lisp/gnus-int.el (gnus-retrieve-parsed-headers): New function. - -1999-01-26 Tsukamoto Tetsuo - - * lisp/gnus-offline.el: Add security notice. - -1999-01-25 Tatsuya Ichikawa - - * README-offline.ja: New file - Variable and command description - for gnus-offline(Japanese edition). - * README-offline.en: New file - Ditto (English edition). - -1999-01-25 Tsukamoto Tetsuo - - * lisp/gnus-offline.el (gnus-offline-pop-password-file): New - variable. - (gnus-offline-pop-password-decoding-function): New variable. - (gnus-offline-get-new-news): When `gnus-offline-pop-password-file' - is non-nil, get one's password information from a file specified - by this variable, and don't store the passwords as a variable. - * lisp/smiley.el (smiley-buffer): Avoid a few duplicate - translations. - -1999-01-23 Kiyokazu SUTO - - * lisp/gnus-msg.el (gnus-inews-yank-articles): Use - `message-list-references' for gathering IDs from yanked articles. - - * lisp/message.el (message-list-references): New function. - (message-yank-original): Use it for gathering IDs from a yanked - article. - -1999-01-22 Katsumi Yamaoka - - * lisp/message.el (message-reply): Get the references from - `In-Reply-To' field if there were no references and `In-Reply-To' - field looks promising. - (message-yank-original): Try to fetch ID from `In-Reply-To' field - if `References' field does not exist. - (message-yank-original): Use `std11-narrow-to-header' instead of - `message-narrow-to-head'. - -1999-01-22 Katsumi Yamaoka - - * lisp/gnus-msg.el (gnus-inews-yank-articles): Fetch IDs from - `gnus-current-headers' instead of article header. - -1999-01-22 Katsumi Yamaoka - - * lisp/gnus-msg.el (gnus-inews-yank-articles): Save the beginning - position of the yanked articles -- apologize to SUTO-san, it has - been supported in his original code, but I didn't. - - * lisp/message.el: Replace line endings from `CRLF' to `LF'. - -1999-01-21 Hiroaki Matsui - - * lisp/message.el : Fix typo. - -1999-01-20 Katsumi Yamaoka - - * lisp/message.el (message-yank-original): If - `message-yank-add-new-references' is non-nil and this command is - called interactively, new IDs from the yanked article will be added - to `References' field. - (message-yank-add-new-references): New user option. - (message-header-format-alist): Use `message-shorten-references' for - `References' in default. - -1999-01-20 Kiyokazu SUTO , - Katsumi Yamaoka - - * lisp/gnus-msg.el (gnus-inews-yank-articles): Replace `References' - field with the gathered Message-IDs and References if more than one - articles are given. - -1999-01-20 Katsumi Yamaoka - - * lisp/gnus-msg.el (gnus-inews-yank-articles): Reselect the message - frame after selecting a new article if the value of - `message-use-multi-frames' is non-nil and more than one articles - are given. - -1999-01-20 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.10.055. - - * Sync up with Pterodactyl Gnus v0.72. - -1999-01-19 Katsumi Yamaoka - - * README.semi.ja: Add keiichi and nana-gnus to the branches info. - Modify the directory name for the daily snapshots. - * README.semi: Ditto. - - * README.branch.ja: Modified for Semi-gnus 6.10, etc. - * README.branch: Ditto. - -1999-01-19 Katsumi Yamaoka - - * lisp/message.el (message-reply): Cancel the last change. - (message-followup): Cancel the last change. - (message-wide-reply): Cancel the last change. - - * lisp/gnus-msg.el (gnus-summary-gather-references): Abolished. - (gnus-summary-reply): Cancel the last change. - (gnus-post-news): Cancel the last change. - -1999-01-18 Katsumi Yamaoka - - * lisp/gnus-sum.el (gnus-summary-move-article): Don't copy - expirable marks if the destination group is not expirable. - -1999-01-16 Kiyokazu SUTO - - * lisp/message.el (message-reply): Accept references as a new - optional arg. - (message-followup): Ditto. - (message-wide-reply): Ditto. - - * lisp/gnus-msg.el (gnus-summary-gather-references): New function. - (gnus-summary-reply): Use it - (gnus-post-news): Use it. - -1999-01-16 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.10.054. - - * Sync up with Pterodactyl Gnus v0.71. - -1999-01-16 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.10.053. - - * Sync up with Pterodactyl Gnus v0.70. - -1999-01-13 Kiyokazu SUTO - - * lisp/nnspool.el (nnspool-retrieve-headers): Protect against empty - body. - -1999-01-13 Tatsuya Ichikawa - - * lisp/gnus-offline.el: Add Tsukamoto Tetsuo - to author and maintainer. - -1999-01-12 Katsumi Yamaoka - - * lisp/nnmail.el (nnmail-article-group): Don't infloop. - -1999-01-12 Katsumi Yamaoka - - * TODO.ja: Modified for Cancel-Lock feature. - - * lisp/nntp.el (nntp-request-post): Put a Message-ID generated by - server if it does not exist in the article. - (nntp-request-post): Run `nntp-prepare-post-hook'. - (nntp-async-trigger): Save a response from the server in - `nntp-process-response' after sending a command. - (nntp-wait-for): Ditto. - (nntp-prepare-post-hook): New hook, run just before posting an - article. - - * lisp/nnheader.el (nnheader-init-server-buffer): Make - `nntp-process-response' be buffer-local in `nntp-server-buffer'. - (nntp-process-response): New variable, used for holding a response - from the server after sending a command. - -1999-01-11 Tsukamoto Tetsuo - - * lisp/message.el (message-draft-coding-system): Don't Call - `coding-system-p'. Find its default value using - `find-coding-system' instead. - -1999-01-11 Katsumi Yamaoka - - * lisp/pop3.el (pop3-munge-message-separator): Use - `parse-time-string'. - - * lisp/gnus-vm.el (gnus-summary-save-in-vm): Save window config, - select the article before saving. - -1999-01-09 Tsukamoto Tetsuo - - * lisp/gnus-offline.el (gnus-offline-popup-menu): Bug fix -- Use - `gnus-offline-menu-on-agent' if `miee-popup-menu' does not exist. - -1999-01-08 Katsumi Yamaoka - - * lisp/pop3.el (pop3-last): Use `split-string' instead of - `pop3-string-to-list'. - (pop3-stat): Ditto. - (pop3-munge-message-separator): Ditto. - (pop3-string-to-list): Abolished. - -1999-01-06 Tsukamoto Tetsuo - - * lisp/gnus-offline.el (gnus-offline-setup): Don't call - `gnus-offline-agent-expire' when 'gnus-agent-expire-all' is - non-nil. - (gnus-offline-define-menu-on-miee): Call `easy-menu-add' under - XEmacs. - (gnus-offline-popup-menu): New function. - (gnus-offline-define-menu-and-key): Call it under Emacs to create - a popup menu in the group buffer. - -1999-01-04 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.10.052. - - * Sync up with Pterodactyl Gnus v0.69. - -1998-12-28 Katsumi Yamaoka - - * lisp/gnus-sum.el (gnus-summary-preview-mime-message): Always - select the article before previewing. Abolish prefix arg. - - * lisp/gnus-art.el (gnus-mime-preview-quitting-method): re-select - the article without reservation. - (gnus-article-display-mime-message): Show all headers if - `gnus-have-all-headers' the local var of summary buffer is non-nil. - -1998-12-25 Katsumi Yamaoka - - * lisp/gnus-art.el (gnus-article-check-buffer): Rewrite (checking - for buffer object). - -1998-12-22 Katsumi Yamaoka - - * lisp/gnus-art.el (mime-preview-over-to-next-method-alist): Use - `gnus-summary-next-article' in `gnus-original-article-mode'. - (mime-preview-over-to-previous-method-alist): Use - `gnus-summary-prev-article' in `gnus-original-article-mode'. - -1998-12-22 Katsumi Yamaoka - - * lisp/gnus-bbdb.el (toplevel): Define `bbdb-pop-up-elided-display' - for avoiding byte-compile warning. - - * lisp/gnus-art.el (gnus-article-mode-map): Define almost undefined - keys to `gnus-article-read-summary-keys'. - (gnus-article-check-buffer): Check for a major-mode in - `gnus-original-article-buffer' as well. - (gnus-article-prepare-display): Set `gnus-article-current-summary' - to `gnus-summary-buffer'. - -1998-12-21 Tatsuya Ichikawa - - * lisp/pop3-fma.el (pop3-fma-movemail): Work with movemail.exe - with APOP extention. - -1998-12-18 Katsumi Yamaoka - - * lisp/gnus-start.el (gnus-read-newsrc-el-file): Bug (referring to - unbounded variable) fix. - -1998-12-17 Katsumi Yamaoka - - * lisp/gnus-start.el (gnus-read-newsrc-el-file): Don't load newsrc - file if it does not exist. - -1998-12-16 Tatsuya Ichikawa - - * lisp/gnus-offline.el: (gnus-offline-define-menu-on-miee) - (gnus-offline-define-menu-on-agent): Use Japanized menu when using - under Meadow. - -1998-12-16 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.10.051. - - * Sync up with Pterodactyl Gnus v0.68. - -1998-12-14 Tatsuya Ichikawa - - * lisp/gnus-offline.el (gnus-offline-define-menu-on-miee): Bug - fix. - -1998-12-14 Katsumi Yamaoka - - * lisp/nnheader.el (nnheader-find-file-noselect): Call - `find-file-noselect-as-coding-system' with CODING-SYSTEM as the - 1st arg. - - * lisp/gnus-score.el (gnus-score-load-score-alist): Call - `insert-file-contents-as-coding-system' with CODING-SYSTEM as the - 1st arg. - * lisp/nnmail.el (nnmail-find-file): Ditto. - * lisp/nnheader.el (nnheader-insert-file-contents): Ditto. - - * lisp/score-mode.el (gnus-score-edit-exit): Call - `write-region-as-coding-system' as the 1st arg. - * lisp/gnus-start.el (gnus-save-newsrc-file): Ditto. - - * lisp/gnus-start.el (gnus-read-newsrc-el-file): Call - `insert-file-contents-as-coding-system' with CODING-SYSTEM as the - 1st arg. - - * lisp/gnus-score.el (gnus-score-save): Call - `gnus-write-buffer-as-coding-system' with CODING-SYSTEM as the 1st - arg. - * lisp/gnus-cache.el (gnus-cache-possibly-enter-article): Ditto. - (gnus-cache-save-buffers): Ditto. - - * lisp/gnus-util.el (gnus-write-buffer-as-coding-system): Be - CODING-SYSTEM the 1st arg. - - * lisp/nnmail.el (nnmail-write-region): Call - `write-region-as-coding-system' as the 1st arg. - * lisp/gnus-agent.el (gnus-agent-expire): Ditto. - (gnus-agent-fetch-headers): Ditto. - (gnus-agent-flush-cache): Ditto. - (gnus-agent-fetch-articles): Ditto. - (gnus-agent-save-history): Ditto. - (gnus-agent-save-groups): Ditto. - (gnus-agent-save-active): Ditto. - -1998-12-14 Tsukamoto Tetsuo - - * lisp/gnus-offline.el (gnus-offline-define-menu-and-key): Bug - fix. - Overwrite the toolbar spec for gnus-group-mode, under XEmacs. - -1998-12-14 Katsumi Yamaoka - - * lisp/nnheader.el (nnheader-find-file-noselect): Use - `find-file-noselect-as-coding-system' (renamed from - `find-file-noselect-as-specified-coding-system'). - - * lisp/gnus-score.el (gnus-score-load-score-alist): Use - `insert-file-contents-as-coding-system' (renamed from - `insert-file-contents-as-specified-coding-system'). - * lisp/nnmail.el (nnmail-find-file): Ditto. - * lisp/nnheader.el (nnheader-insert-file-contents): Ditto. - - * lisp/score-mode.el (gnus-score-edit-exit): Use - `write-region-as-coding-system' (renamed from - `write-region-as-specified-coding-system'). - * lisp/gnus-start.el (gnus-save-newsrc-file): Ditto. - - * lisp/gnus-start.el (gnus-read-newsrc-el-file): Use - `insert-file-contents-as-coding-system' (renamed from - `insert-file-contents-as-specified-coding-system'). - - * lisp/gnus-score.el (gnus-score-save): Use - `gnus-write-buffer-as-coding-system' (renamed from - `gnus-write-buffer-as-specified-coding-system'). - * lisp/gnus-cache.el (gnus-cache-possibly-enter-article): Ditto. - (gnus-cache-save-buffers): Ditto. - - * lisp/gnus-util.el (gnus-write-buffer-as-coding-system): Renamed - from 'gnus-write-buffer-as-specified-coding-system'. - - * lisp/nnmail.el (nnmail-write-region): Use - `write-region-as-coding-system' (renamed from - `write-region-as-specified-coding-system'). - * lisp/gnus-agent.el (gnus-agent-expire): Ditto. - (gnus-agent-fetch-headers): Ditto. - (gnus-agent-flush-cache): Ditto. - (gnus-agent-fetch-articles): Ditto. - (gnus-agent-save-history): Ditto. - (gnus-agent-save-groups): Ditto. - (gnus-agent-save-active): Ditto. - -1998-12-14 Tsukamoto Tetsuo - - * lisp/gnus-offline.el (gnus-offline-define-menu-on-miee): Bug - fix. - (gnus-offline-set-offline-sendmail-function): Bug fix. - -1998-12-12 Hidekazu Nakamura - - * lisp/gnus-ofsetup.el (gnus-setup-for-offline): Bug fix. - -1998-12-12 Tsukamoto Tetsuo - - * lisp/gnus-offline.el (gnus-offline-define-menu-on-miee): Bug - fix. - (gnus-offline-set-offline-sendmail-function): Bug fix. - -1998-12-11 Tatsuya Ichikawa - - * lisp/gnus-offline.el (gnus-offline-define-menu-on-miee): Change - easy-menu-define to easy-menu-change to override miee menu. - -1998-12-11 Katsumi Yamaoka - - * lisp/nnheader.el (nnheader-find-file-noselect): Call - `find-file-noselect-as-specified-coding-system' directly. - -1998-12-10 Tatsuya Ichikawa - - * lisp/gnus-offline.el (gnus-offline-setup): Add - gnus-offline-setup to gnus-group-mode-hook. - (gnus-offline-set-offline-sendmail-function): Bug fix. - -1998-12-10 Tsukamoto Tetsuo - - * lisp/gnus-offline.el (gnus-offline-define-menu-on-miee): Bug - fix. - (gnus-offline-define-menu-on-agent): Bug fix. - -1998-12-10 Katsumi Yamaoka - - * lisp/pop3.el (pop3-movemail): Use `write-region-as-binary' - instead of `append-to-file'. - (pop3-movemail-file-coding-system): Abolished. - - * lisp/nnheader.el (nnheader-find-file-noselect): Use - `find-file-noselect-as-specified-coding-system' instead of - `find-file-noselect'. - - * lisp/gnus-score.el (gnus-score-load-score-alist): Use - `insert-file-contents-as-specified-coding-system' instead of - `insert-file-contents'. - * lisp/nnmail.el (nnmail-find-file): Ditto. - * lisp/nnheader.el (nnheader-insert-file-contents): Ditto. - - * lisp/message.el (message-send-mail-with-qmail): Enclose - `call-process-region' with `as-binary-process'. - (message-send-mail-with-sendmail): Ditto. - (message-send-coding-system): Abolished. - - * lisp/score-mode.el (gnus-score-edit-exit): Emulate - `save-buffer' with `write-region-as-specified-coding-system'. - * lisp/gnus-start.el (gnus-save-newsrc-file): Ditto. - - * lisp/gnus-start.el (gnus-read-newsrc-el-file): Emulate `load' - with `insert-file-contents-as-specified-coding-system' and - `eval-region'. - - * lisp/gnus-score.el (gnus-score-save): Use - `gnus-write-buffer-as-specified-coding-system' instead of - `gnus-write-buffer'. - * lisp/gnus-cache.el (gnus-cache-possibly-enter-article): Ditto. - (gnus-cache-save-buffers): Ditto. - - * lisp/gnus-util.el (gnus-output-to-mail): Use - `write-region-as-binary' instead of `append-to-file'. - (gnus-output-to-mail): Use `gnus-write-buffer-as-binary' instead - of `gnus-write-buffer'. - (gnus-write-buffer-as-specified-coding-system): New function. - (gnus-write-buffer-as-binary): New function. - - * lisp/nnmail.el (nnmail-write-region): Use - `write-region-as-specified-coding-system' instead of - `write-region'. - * lisp/gnus-agent.el (gnus-agent-expire): Ditto. - (gnus-agent-fetch-headers): Ditto. - (gnus-agent-flush-cache): Ditto. - (gnus-agent-fetch-articles): Ditto. - (gnus-agent-save-history): Ditto. - (gnus-agent-save-groups): Ditto. - (gnus-agent-save-active): Ditto. - -1998-12-10 Tatsuya Ichikawa - - * lisp/gnus-offline.el (gnus-offline-after-jobs-done): Create menu - using 'easymenu'. - -1998-12-09 Tsukamoto Tetsuo - - * lisp/gnus-offline.el (gnus-offline-after-jobs-done): Don't call - `gnus-offline-agent-expire' under XEmacs. - -1998-12-08 Katsumi Yamaoka - - * texi/gnus-ja.texi: Fix latin chars. - * texi/gnus.texi: Ditto. - - * texi/ChangeLog: Shrunk. - - * text/widget.texi: Removed. - * texi/custom.texi: Removed. - - * lisp/ChangeLog: Fix latin chars. - - * lisp/pop3.el (pop3-open-server): Use - `open-network-stream-as-binary' instead of `open-network-stream'. - * lisp/nntp.el (nntp-open-network-stream): Ditto. - * lisp/gnus-gl.el (bbb-connect-to-bbbd): Ditto. - - * lisp/nntp.el (nntp-open-rlogin): Enclose `start-process' with - `as-binary-process'. - (nntp-open-telnet): Ditto. - - * lisp/nntp.el (nntp-coding-system-for-write): Abolished. - (nntp-coding-system-for-read): Abolished. - - * lisp/nndb.el: Don't require `tcp'. - -1998-12-07 Katsumi Yamaoka - - * lisp/message.el (message-get-parameter-with-eval): Call - `message-get-parameter' with arg `key' first. - -1998-12-07 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.10.050. - - * Sync up with Pterodactyl Gnus 0.65. - -1998-12-06 Tatsuya Ichikawa - - * lisp/message.el (message-cite-original-without-signature): Do - not use mml-quote-region. - - * lisp/message.el (message-cite-original): Ditto. - - * lisp/gnus.el (gnus-version-number): Update to 6.10.049. - - * Sync up with Pterodactyl Gnus 0.64. - -1998-12-04 Katsumi Yamaoka - - * lisp/gnus-sum.el (gnus-summary-show-article): Don't use - `mm-destroy-parts'. - -1998-12-04 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.10.048. - - * Sync up with Pterodactyl Gnus 0.63. - -1998-12-04 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.10.047. - - * Sync up with Pterodactyl Gnus 0.62. - - * README.ichikawa: Add description of required APEL/FLIM/SEMI. - -1998-12-03 Katsumi Yamaoka - - * lisp/nndraft.el (nndraft-request-article): Don't bind - `nnmail-file-coding-system'. - -1998-12-03 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.10.046. - - * Sync up with Pterodactyl Gnus 0.61. - -1998-12-02 Tatsuya Ichikawa - - * lisp/smtp.el: Abolished - Use smtp.el in FLIM. - - * lisp/gnus.el (gnus-version-number): Update to 6.10.045. - - * Sync up with Pterodactyl Gnus 0.59. - -1998-12-01 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.10.044. - - * Sync up with Pterodactyl Gnus 0.58. - -1998-12-01 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.10.043. - - * Sync up with Pterodactyl Gnus 0.57. - -1998-11-30 Katsumi Yamaoka - - * lisp/base64.el (base64-decode-region): Use `defun-maybe'. - (base64-encode-region): Ditto. - - * lisp/gnus.el (gnus-version-number): Update to 6.10.042. - - * Sync up with Pterodactyl Gnus 0.56. - -1998-11-29 Tatsuya Ichikawa - - * lisp/gnus-offline.el: Fix typo of DOC string. - - * lisp/score-mode.el: Change default value - score-mode-coding-system 'binary to 'ctext. - -1998-11-28 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.10.041. - - * Sync up with Pterodactyl Gnus 0.55. - -1998-11-26 Katsumi Yamaoka - - * lisp/gnus-msg.el (gnus-summary-supersede-article): Bind - `gnus-message-setup-hook' to minimum setting. - - * lisp/message.el (message-supersede-setup-for-mime-edit): New - function. - (message-supersede-setup-function): New user option. Use - `message-supersede-setup-for-mime-edit' in default. - (message-supersede): Call `message-supersede-setup-function' if it - is non-nil. - (message-supersede-setup-hook): New user option. - - * lisp/message.el (message-bounce-setup-for-mime-edit): Don't - delete header separator. It is up to MIME-Edit to do so. - -1998-11-24 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.10.040. - - * Sync up with Pterodactyl Gnus 0.54. - -1998-11-24 Tatsuya Ichikawa - - * lisp/gnus-offline.el (gnus-offline-version-number): Update to - 2.00. - - * lisp/pop3-fma.el (pop3-fma-save-password-information): New - variable. Do not save password information when - `pop3-fma-save-password-information' set to nil (in default). - (pop3-fma-encode-string): abolished - because of difference of - FLIM API. - (pop3-fma-decode-string): Ditto. - -1998-11-21 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.10.039. - - * Sync up with Pterodactyl Gnus 0.53. - - * lisp/pop3-fma.el (pop3-fma-init-message-hook): Change - message-send-hook to mime-edit-translate-hook - enbug. - -1998-11-20 Tatsuya Ichikawa - - * lisp/gnus-offline.el: Update to beta5. - - * lisp/gnus-ofsetup.el: Update to beta5. - - * lisp/gnus.el (gnus-version-number): Update to 6.10.038. - - * Sync up with Pterodactyl Gnus 0.52. - -1998-11-19 Keiichi Suzuki - - * lisp/message.el (message-get-reply-buffer): Abolished. - (message-get-original-reply-buffer): Abolished. - (message-get-parameter): New inline function. - (message-get-parameter-with-eval): New macro. - (message-fetch-reply-field): Do not use `message-get-reply-buffer'. - (message-yank-original): Ditto. - (message-setup): Use `message-get-parameter'. - (message-mime-insert-article): Use - `message-get-parameter-with-eval' instead of - `message-get-original-reply-buffer'. - - * lisp/gnus-msg.el (gnus-inews-add-send-actions): Do not add - `set-window-configuration' to action when - `message-use-multi-frames' is non-`nil'. - -1998-11-19 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.10.037. - - * Sync up with Pterodactyl Gnus 0.51. - - * lisp/gnus-ofsetup.el (gnus-setup-for-offline): Force set - `use-miee' to t if `news-method' is equal to "nnspool". - (gnus-setup-for-offline): Put a question for "Agent directory" - only if `gnus-offline-news-fetch-method' is equal to `nnagent'. - (Top-Level): Defvar `use-miee' for avoiding byte-compile warning. - -1998-11-18 Katsumi Yamaoka - - * lisp/gnus-sum.el (gnus-summary-save-article-rmail): Use - `gnus-summary-save-in-rmail' instead of - `rmail-output-to-rmail-file'. - -1998-11-18 Katsumi Yamaoka - - * lisp/message.el (message-mimic-kill-buffer): Rewrite. - -1998-11-18 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.10.036. - - * Sync up with Pterodactyl Gnus 0.50. - -1998-11-18 Katsumi Yamaoka - - * lisp/message.el (message-mimic-kill-buffer): New function. - (message-mode-map): Use it for `C-x k'. - -1998-11-18 Keiichi Suzuki - - * lisp/message.el (message-dont-send): Use `message-delete-frame'. - -1998-11-18 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.10.035. - - * Sync up with Pterodactyl Gnus 0.49. - -1998-11-17 Tsukamoto Tetsuo - - * lisp/message.el (message-dont-send): Use `message-save-drafts' - instead of `save-buffer'. - -1998-11-17 Hiroaki Matsui - - * lisp/message.el (message-clone-locals): Add - "user-mail-address" and "user-full-name" to matching pattern. - -1998-11-14 Kenji Itoh - - * lisp/nnmail.el (nnmail-read-passwd): Use `read-passwd' if it - exists as a function. - - * lisp/pop3.el (pop3-read-passwd): Ditto. - -1998-11-16 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.10.034. - (gnus-version): Modify for SEMI 1.11, FLIM 1.12. - -1998-11-16 Katsumi Yamaoka - - * make.bat: Replace line endings from `LF' to `CRLF'. - -1998-11-16 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.10.033. - - * Sync up with Pterodactyl Gnus 0.48. - -1998-11-16 Katsumi Yamaoka - - * texi/emacs-mime.texi: Fix iso-8859-1 chars. - - * lisp/message.el (message-send-news): Call - `message-maybe-split-and-send-news' with an arg `method'. - (message-maybe-split-and-send-news): Accept an arg `method'. - - * lisp/rfc1843.el: Defvar `gnus-decode-encoded-word-function'. - - * lisp/mm-uu.el: Require `gnus-mailcap'. - * lisp/mm-decode.el: Require `gnus-mailcap' instead of `mailcap'. - * lisp/mm-encode.el: Ditto. - * lisp/gnus-mailcap.el: Provide `gnus-mailcap' instead of `mailcap'. - -1998-11-16 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.10.032. - - * Sync up with Pterodactyl Gnus 0.47. - -1998-11-15 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.10.031. - - * Sync up with Pterodactyl Gnus 0.46. - -1998-11-14 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.10.030. - - * Sync up with Pterodactyl Gnus 0.44. - -1998-11-13 Katsumi Yamaoka - - * lisp/gnus-art.el (gnus-article-header-presentation-method): Use - `mime-insert-header' instead of `mime-insert-decoded-header'. - - * lisp/nnheader.el (nnheader-decode-subject): Change the 2nd arg of - `mime-find-field-decoder' to 'nov'. - (nnheader-decode-from): Ditto. - - * lisp/message.el (message-maybe-split-and-send-mail): Discard - a return from `message-send-mail-function'. - -1998-11-12 Tatsuya Ichikawa - - * lisp/gnus-offline.el: bug fix. - - * lisp/gnus-ofsetup.el: Bug fix. - -1998-11-12 Katsumi Yamaoka - - * texi/Makefile.in (.texi:): Don't escape double quote. - (texi2latex.elc:): Ditto. - -1998-11-12 Tatsuya Ichikawa - - * texi/gnus-ja.texi: Add infos about `pop3-fma' and `gnus-offline'. - -1998-11-12 Katsumi Yamaoka - - * lisp/message.el (message-maybe-split-and-send-mail): Use - `defsubst' instead of `defun'. - (message-maybe-split-and-send-news): Ditto. - -1998-11-12 Katsumi Yamaoka - - * lisp/gnus-msg.el (gnus-summary-resend-bounced-mail): Bind - `gnus-message-setup-hook' to minimum setting. - - * lisp/message.el (message-bounce-setup-for-mime-edit): New - function. - (message-bounce-setup-function): New user option. Use - `message-bounce-setup-for-mime-edit' in default. - (message-bounce): Call `message-bounce-setup-function' if it is - non-nil. - (message-bounce-setup-hook): New user option. - (message-send-mail): Delete useless things. - -1998-11-12 Katsumi Yamaoka - - * lisp/message.el (message-maybe-split-and-send-mail): New function. - (message-send-mail): Use it. - (message-maybe-split-and-send-news): New function. - (message-send-news): Use it. - -1998-11-11 Tatsuya Ichikawa - - * lisp/gnus-offline.el: bug fix. - - * lisp/gnus-ofsetup.el: Bug fix. - -1998-11-11 Katsumi Yamaoka - - * lisp/message.el (message-send-mail): Protect against errors. - (message-send-news): Ditto. - -1998-11-11 Keiichi Suzuki - - * lisp/message.el (message-do-fcc): Sync up with Semi-gnus 6.8. - (message-8bit-encoding-list): New variable. - (message-check-encoding): Use `message-8bit-encoding-list'. Change - search pattern. - -1998-11-11 Keiichi Suzuki - - * lisp/gnus-bbdb.el (gnus-bbdb/extract-address-components): Normalize - return value. - (gnus-bbdb/update-record): Change condition for checking own message. - -1998-11-11 Yoshiki Hayashi - - * README.semi.ja, README.branch.ja: New file. - -1998-11-10 Tatsuya Ichikawa - - * lisp/gnus-offline.el: bug fix. - - * lisp/gnus-ofsetup.el: Bug fix. - -1998-11-09 Tatsuya Ichikawa - - * lisp/gnus-offline.el: v2.00b1 Separate setting part and - functional part - setting part move to gnus-ofsetup.el (New file). - - * lisp/gnus-ofsetup.el: New file - setting function for - gnus-offline. - -1998-11-09 Katsumi Yamaoka - - * lisp/nnheader.el (nnheader-decode-subject): Call - `mime-find-field-decoder' with `summary' as the 2nd arg. - (nnheader-decode-from): Ditto. - -1998-11-09 Katsumi Yamaoka - - * lisp/pop3-fma.el: Set the value of `nnmail-read-passwd' as a - symbol `pop3-fma-read-passwd'. - -1998-11-09 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.10.029. - - * Sync up with Pterodactyl Gnus 0.42. - -1998-11-09 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.10.028. - - * Sync up with Pterodactyl Gnus 0.41. - -1998-11-06 Katsumi Yamaoka - - * lisp/gnus-art.el (gnus-article-make-full-mail-header): New - function. - (gnus-article-mime-edit-article-setup): Use it. - (gnus-article-mime-edit-exit): Use it. - - (gnus-article-mime-edit-article-setup): Set `gnus-show-mime' to t. - - * lisp/gnus-bbdb.el: Modify header description. - -1998-11-05 Katsumi Yamaoka - - * lisp/gnus-art.el (gnus-article-edit-done): Remove - `gnus-article-mime-edit-article-unwind' from - `gnus-article-mode-hook' before run `gnus-article-edit-exit'. - (gnus-article-mime-edit-article-setup): Revised. - (gnus-article-mime-edit-article-unwind): New function. - (gnus-article-mime-edit-exit): New function. - - (gnus-insert-mime-button): Fix typo. - -1998-11-04 Yoshiki Hayashi - - * lisp/message.el: (message-do-fcc): Don't run message-header-hook - and message-before-do-fcc-hook. - -1998-11-04 MORIOKA Tomohiko - - * lisp/mmgnus.el (entity-buffer): Must move to (point-min) before - search boundary between header and body (to fix problem with - Emacs). - -1998-11-03 MORIOKA Tomohiko - - * lisp/nnmh.el (nnmh-retrieve-headers): Don't use - `nnheader-fold-continuation-lines'. - - * lisp/gnus-sum.el (gnus-get-newsgroup-headers): Don't expect - unfolded (to fix problem when using gnus-cache). - -1998-11-04 Katsumi Yamaoka - - * lisp/message.el (message-make-in-reply-to): Quote date. - -1998-11-02 Keiichi Suzuki - - * lisp/gnus-bbdb.el (gnus-bbdb/canonicalize-full-name-methods): - New variable. (Merged from `mime-bbdb.el' in SEMI.) - (gnus-bbdb/extract-address-components): New function. (Merged from - `mime-bbdb.el' in SEMI.) - (gnus-bbdb/canonicalize-spaces): Ditto. - (gnus-bbdb/canonicalize-dots): Ditto. - (gnus-bbdb/update-record): Use - `gnus-bbdb/extract-address-components'. - (gnus-bbdb/lines-and-from): Ditto. - (gnus-bbdb/summary-get-author): Ditto. - (gnus-bbdb/summary-author-in-bbdb): Ditto. - (gnus-bbeb/decode-field-body-function): New variable. - (gnus-bbdb/decode-field-body): New macro. - (gnus-bbdb/update-record): Use `gnus-bbdb/decode-field-body'. - (gnus-bbdb/extract-field-value): Ditto. - (gnus-bbdb/decode-field-body-function): Fix typo. - (gnus-bbdb/decode-field-body): Ditto. - (gnus-bbdb/update-record): Use `save-excursion' and change timing - of `save-restriction'. - -1998-10-31 Katsumi Yamaoka - - * lisp/gnus-draft.el (gnus-draft-decoding-function): Use - `mime-edit-decode-message-in-buffer' instead of - `mime-edit-decode-buffer'. - -1998-10-31 Tatsuya Ichikawa - - * lisp/nnheader.el (nnheader-decode-field-body): New inline - function. - - * lisp/gnus-draft.el (gnus-draft-decoding-function): Use - `mime-edit-decode-buffer' and `mime-decode-header-in-buffer'. - - * lisp/gnus-bbdb.el (gnus-bbdb/update-record): Use - `nnheader-decode-field-body' instead of `mime-decode-field-body'. - (gnus-bbdb/extract-field-value): Ditto. - -1998-10-30 Keiichi Suzuki - - * lisp/gnus-bbdb.el (gnus-bbdb/update-record): Check existance of - `To' field before decoding. - -1998-10-30 Katsumi Yamaoka - - * README-gnus-bbdb.en: New file, translated by courtesy of - Hiroshi Kawaguchi . - -1998-10-30 Katsumi Yamaoka - - * lisp/dgnushack.el (dgnushack-compile): Add `gnus-bbdb.el'. - - * lisp/gnus-bbdb.el: New file. By courtesy of Keiichi Suzuki. - * README-gnus-bbdb.ja: Ditto (A part of Nana-TIPS.ja). - -1998-10-30 Tatsuya Ichikawa - - * lisp/gnus.el: Add autoload setting for `gnus-offline' and - `pop3-fma'. - -1998-10-30 Katsumi Yamaoka - - * lisp/gnus-art.el (article-decode-encoded-words): Use - `mime-decode-header-in-buffer' instead of `eword-decode-header'. - (gnus-article-display-message-with-encoded-word): Likewise. - - * lisp/gnus-art.el (gnus-article-mime-edit-article-setup): Fix - typo. - -1998-10-29 MORIOKA Tomohiko - - * lisp/gnus-draft.el (gnus-draft-decoding-function): Use - `mime-edit-decode-buffer' simply as initial value. - - * lisp/message.el (message-make-forward-subject): Use - `nnheader-decode-subject' instead of - `eword-decode-unstructured-field-body'. - - * lisp/nnheader.el (nnheader-decode-subject): New alias. - (nnheader-decode-from): New alias. - (make-full-mail-header): Use `nnheader-decode-subject' and - `nnheader-decode-from' instead of - `eword-decode-and-unfold-unstructured-field' and - `eword-decode-and-unfold-structured-field'. - -1998-10-29 Katsumi Yamaoka - - * lisp/gnus-art.el (gnus-article-mime-edit-article-setup): Force - `font-lock' to turn on at the beginning. Turn off `font-lock' - after editing article. - -1998-10-29 Katsumi Yamaoka - - * lisp/gnus-sum.el (gnus-summary-edit-article-done): Abolish - `gnus-article-decoded-p'. - - * lisp/nnheader.el: Delete useless comments. - - * lisp/gnus-art.el (gnus-article-edit-article): Call - `gnus-article-edit-article-setup-function' if it is non nil. - (gnus-article-mime-edit-article-setup): New function. - (gnus-article-mime-edit-article-setup-hook): New hook. - (gnus-article-edit-article-setup-function): New user option. Use - `gnus-article-mime-edit-article-setup' in default. - -1998-10-28 Tatsuya Ichikawa - - * lisp/pop3-fma.el: Determin base64 encode/decode function by FLIM. - -1998-10-26 Tatsuya Ichikawa - - * lisp/pop3-fma.el: Require `mel-b-el' if `mel-b' does not exist. - -1998-10-26 Katsumi Yamaoka - - * lisp/pop3-fma.el: Require `mel-b-ccl' or `mel-b-el' if `mel-b' - does not exist. - - * lisp/nnheader.el (nnheader-file-coding-system): Restore the - previous default value. - -1998-10-26 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.10.027. - - * Sync up with Pterodactyl Gnus 0.40. - -1998-10-23 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.10.026. - (gnus-version): Modify supported version for FLIM and SEMI. - -1998-10-22 Katsumi Yamaoka - - * lisp/gnus-cache.el (gnus-cache-possibly-enter-article): Use - `mime-fetch-field' for getting Subject and From field. - -1998-10-20 MORIOKA Tomohiko - - * lisp/nnheader.el (nnheader-insert-nov): Use `mime-fetch-field' - for Subject and From field. - -1998-10-20 Katsumi Yamaoka - - * lisp/nnheader.el (nnheader-parse-nov): Use - `make-full-mail-header'. - -1998-10-20 MORIOKA Tomohiko - - * lisp/nnheader.el (nnheader-parse-head): Use - `make-full-mail-header'. - -1998-10-20 Katsumi Yamaoka - - * lisp/nnheader.el (make-full-mail-header): Sync up with - "chao-6_9" branch. - (mail-header-set-xref): Use `mime-entity-set-xref-internal'. - (mail-header-xref): Use `mime-entity-xref-internal' - (mail-header-set-lines): mime-entity-set-lines-internal'. - (mail-header-lines): Use `mime-entity-lines-internal' - (mail-header-set-chars): Use `mime-entity-set-chars-internal'. - (mail-header-chars): Use `mime-entity-chars-internal'. - (mail-header-set-references): Use - `mime-entity-set-references-internal'. - (mail-header-references): Use `mime-entity-references-internal'. - (mail-header-set-message-id): Use - `mime-entity-set-message-id-internal'. - (mail-header-message-id): Use `mime-entity-message-id-internal'. - (mail-header-set-date): Use `mime-entity-set-date-internal'. - (mail-header-date): Use `mime-entity-date-internal'. - (mail-header-set-from): Use - `mime-entity-set-decoded-from-internal'. - (mail-header-from): Use `mime-entity-decoded-from-internal'. - (mail-header-set-subject): Use - `mime-entity-set-decoded-subject-internal'. - (mail-header-subject): Use `mime-entity-decoded-subject-internal'. - All changes are imported from "chao-6_9" branch. - - * lisp/message.el (message-reply): Use - `make-full-mail-header-from-decoded-header`. - (message-followup): Ditto. - (message-get-reply-buffer-function): Abolished. - (message-fill-address): Don't fold if the current column number is - less than 79. - - * lisp/gnus-sum.el (gnus-summary-insert-line): Use - `gnus-put-text-property-excluding-characters-with-faces' instead - of `gnus-put-text-property'. - (gnus-summary-mode-map): Abolish key definition - "b" for `gnus-article-view-part'. - (gnus-encoded-word-method-alist): Abolished. - (gnus-multi-decode-encoded-word-string) Abolished. - - * lisp/gnus-int.el (gnus-request-replace-article): Don't encode - message body. - - * lisp/gnus-i18n.el (gnus-get-summary-default-charset): Abolished. - (gnus-set-summary-default-charset): Sync up with "chao-6_9" branch. - - * lisp/gnus-art.el (gnus-article-display-method-for-encoded-word): - Abolished. - (gnus-article-display-message-with-encoded-word): Abolished. - -1998-10-14 MORIOKA Tomohiko - - * lisp/gnus-sum.el (gnus-summary-line-format-alist): Use - `mime-read-field', `std11-address-string' and - `std11-full-name-string' instead of - `gnus-extract-address-components'. - (gnus-article-sort-by-author): Likewise. - -1998-10-12 MORIOKA Tomohiko - - * lisp/nnheader.el (make-full-mail-header-from-decoded-header): - New function. - -1998-10-05 MORIOKA Tomohiko - - * lisp/gnus-art.el (gnus-article-display-mime-message): Set up - buffer local variable `default-mime-charset' of - `gnus-original-article-buffer' and `gnus-article-buffer'. - -1998-09-30 MORIOKA Tomohiko - - * lisp/nnheader.el: Use `mime-entity' as gnus-header structure. - (mail-header-number): Use `mime-entity-location-internal'. - (mail-header-set-number): Use `mime-entity-set-location-internal'. - - Change other `mail-header-*' and `mail-header-set-*' to alias of - reference and set functions for mime-entity-internal. - - * lisp/mmgnus.el: New module. - - * lisp/gnus-sum.el: Abolish variable - `gnus-structured-field-decoder' and - `gnus-unstructured-field-decoder'. - (gnus-nov-parse-line): Don't decode from and subject. - (gnus-get-newsgroup-headers): Likewise. - - * lisp/gnus-score.el (gnus-header-index): Modify to use - mime-entity structure as gnus-header structure. - - * lisp/gnus-art.el (gnus-article-prepare-display): Use content of - `gnus-current-headers' as mime-message-structure. - -1998-09-29 MORIOKA Tomohiko - - * lisp/gnus-sum.el (gnus-update-summary-mark-positions): Use - `make-full-mail-header'. - -1997-11-27 MORIOKA Tomohiko - - (gnus-parse-headers-hook): Use - `(gnus-set-summary-default-charset)' in default. - - -1998-10-21 Katsumi Yamaoka - - * lisp/gnus-xmas.el (gnus-tilde-pad-form): Guard for non string - symbol. - -1998-10-21 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.10.025. - (gnus-version): Fix supported version for FLIM and SEMI. - - * Sync up with Pterodactyl Gnus 0.36. - -1998-10-20 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.10.024. - Fix supported version for FLIM and SEMI. - - * Sync up with Pterodactyl Gnus 0.35. - -1998-10-17 Tatsuya Ichikawa - - * lisp/gnus-offline.el (gnus-offline-setup-needed-hooks): Change - message-send-hook to mime-edit-translate-hook. - - * lisp/pop3-fma.el (pop3-fma-init-message-hook): Change - message-send-hook to mime-edit-translate-hook. - - * lisp/message.el (message-save-drafts): New function to save - drafts in network code. - -1998-10-16 Katsumi Yamaoka - - * lisp/gnus-msg.el (gnus-message-setup-hook): Replace the default - value to `gnus-maybe-setup-default-charset'. - (gnus-maybe-setup-default-charset): New function. It is called - `message-maybe-setup-default-charset' at one time. - - * lisp/message.el (message-maybe-setup-default-charset): Abolished. - -1998-10-16 Tatsuya Ichikawa - - * TODO.ja: Update. - -1998-10-15 Keiichi Suzuki - - * lisp/gnus-spec.el (gnus-update-format-specifications): Force - update `gnus-format-specs' when `gnus-version' is differ from - saved version. - -1998-10-14 Katsumi Yamaoka - - * lisp/pop3-fma.el (pop3-fma-read-char-exclusive): New macro. Use - `next-command-event' instead of `read-char-exclusive' under XEmacs. - (pop3-fma-read-noecho): Use it. - -1998-10-13 Katsumi Yamaoka - - * lisp/nnheaderxm.el (nnheader-xmas-Y-or-n-p): New function. - It will be used for the substitute of `nnheader-Y-or-n-p' under - XEmacs. - - * lisp/nnheader.el (nnheader-Y-or-n-p): Rewrite for Emacs 19 or - later except for XEmacs. - -1998-10-12 Katsumi Yamaoka - - * lisp/uudecode.el: New file. - -1998-10-11 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.10.023. - Add version information for SEMI-1.9/FLIM-1.10. - - * Sync up with Pterodactyl Gnus 0.34. - -1998-10-10 Katsumi Yamaoka - - * lisp/gnus-msg.el (gnus-message-make-user-agent): Fix typo in doc - string. - -1998-10-07 Yoshiki Hayashi - - * lisp/nnagent.el (nnagent-open-server): Small bug fix. - -1998-10-07 Keiichi Suzuki - - * TODO.ja: New file. - -1998-10-06 Katsumi Yamaoka - - * lisp/message.el (message-mime-insert-article): Don't refer to - `mark' position. - - * lisp/message.el (message-mime-insert-article): If the optional - arg FULL-HEADERS is non-nil, include full headers when inserting. - -1998-10-06 Keiichi Suzuki - - * lisp/message.el (message-parameter-alist): New variable. - (message-startup-parameter-alist): New variable. - (message-fetch-reply-field): Get reply buffer with - `message-get-reply-buffer()'. - (message-yank-original): Ditto. - (message-eval-parameter): New function. - (message-get-reply-buffer): Ditto. - (message-get-original-reply-buffer): Ditto. - (message-mode): New buffer local variable - `message-parameter-alist'. - (message-setup): Set up `message-reply-buffer' from - `message-parameter-alist'. - (message-mime-insert-article): Get `Original message buffer' with - `message-get-original-reply-buffer' instead of - `gnus-original-article-buffer'. - Remove bogus header fields for forwarding message. - - * lisp/gnus-msg.el (gnus-setup-message): Setup - `message-startup-parameter-alist'. - -1998-10-05 Yoshiki Hayashi - - * lisp/gnus.el (gnus-info-filename): New variable. - (gnus-info-find-node): Use `gnus-info-filename' and - `current-language-environment'. - -1998-10-05 Katsumi Yamaoka - - * lisp/message.el (message-send-mail): Remove misplaced - `interactive'. - - * lisp/message.el (message-yank-original): Get back to the previous - state. - (message-fetch-reply-field): Ditto. - (message-setup): Ditto. - * lisp/gnus-msg.el (gnus-setup-message): Ditto. - -1998-10-05 Katsumi Yamaoka - - * lisp/gnus-draft.el: Remove some useless comments. - - * lisp/gnus-draft.el (gnus-draft-send-draft): Abolished. - -1998-10-05 Katsumi Yamaoka - - * lisp/message.el (message-yank-original): Use the value of - `message-reply-buffer' as a function if it is a function. - (message-fetch-reply-field): Ditto. - - * lisp/message.el (message-setup): Set the value of - `message-reply-buffer' if the variable - `gnus-message-get-reply-buffer' exists. - - * lisp/gnus-msg.el (gnus-setup-message): Bind - `gnus-message-get-reply-buffer' as the function - `gnus-copy-article-buffer'. - -1998-10-03 MORIOKA Tomohiko - - * lisp/gnus-draft.el (gnus-draft-send): Call - `message-send-news-function' or `message-send-mail-function' - instead of `message-send-and-exit'. - -1998-10-03 Katsumi Yamaoka - - * lisp/message.el (message-mode-map): Use `define-key' instead of - `substitute-key-definition' for `message-kill-buffer'. - -1998-10-03 Katsumi Yamaoka - - * lisp/message.el (message-make-user-agent): Replace with the - new code again. It is based on MORIOKA-san's code. - -1998-10-03 Katsumi Yamaoka - - * lisp/message.el (message-make-user-agent): Replace with the - new code. - - * lisp/gnus-msg.el (gnus-message-make-user-agent): New function. - - * lisp/gnus-msg.el (gnus-extended-version): Needn't be interactive. - - * lisp/gnus-msg.el (gnus-inviolable-extended-version): Abolished. - -1998-10-03 Katsumi Yamaoka - - * lisp/message.el (message-kill-buffer): Change the prompt string. - - * lisp/message.el (message-mode-map): Substitute key definition - from `kill-buffer' to `message-kill-buffer'. - -1998-10-03 Katsumi Yamaoka - - * lisp/gnus-msg.el (gnus-message-setup-hook): Set the default value - to `message-maybe-setup-default-charset'. - - * lisp/message.el (message-setup-hook): Move - 'message-maybe-setup-default-charset' to `gnus-message-setup-hook'. - -1998-10-02 Katsumi Yamaoka - - * lisp/message.el (message-kill-buffer): Refer to - `message-kill-buffer-query-function'. - - * lisp/message.el (message-kill-buffer-query-function): New user - option. - - * lisp/nnheader.el (nnheader-Y-or-n-p): New function. - -1998-10-01 Tatsuya Ichikawa - - * lisp/pop3-fma.el (pop3-fma-movemail): Bug fix. - Delete variable pop3-fma-movemail options. - Add new variabel pop3-fma-commandline-arguments. - -1998-10-01 Katsumi Yamaoka - - * lisp/message.el: Fix my stupid changes. - -1998-09-30 Katsumi Yamaoka - - * lisp/message.el (message-make-user-agent): Add the value of - `system-configuration' to Emacs and XEmacs as a comment. - - * lisp/message.el (message-make-user-agent): Fold up the return - value if the optional arg MAX-COLUMN is specified. - -1998-09-29 Katsumi Yamaoka - - * lisp/message.el (message-make-user-agent): Make a user-agent - string without MUA info, if the value of `message-user-agent' is - nil nor `gnus-inviolable-extended-version' is not exists. - -1998-09-28 Tatsuya Ichikawa - - * lisp/nnmh.el (nnmh-request-accept-article): Insert `Message-ID' - only if `group' name is neither "queue" nor "draft". - Fix typo (at 23:25). - - * lisp/message.el (message-send-mail): Add different Message-ID in - each message/partial - -1998-09-26 Katsumi Yamaoka - - * texi/gnus-ja.texi: Sync up with Semi-gnus 6.8.19. - - * lisp/gnus.el: Add autoload setting for - `gnus-quote-arg-for-sh-or-csh'. - -1998-09-26 Katsumi Yamaoka - - * lisp/gnus-sum.el (gnus-summary-insert-pseudos): Use - `gnus-quote-arg-for-sh-or-csh' instead of `mm-quote-arg'. - - * lisp/nndoc.el (nndoc-possibly-change-buffer): Don't eval - `mm-enable-multibyte'. - * lisp/nnmbox.el (nnmbox-possibly-change-newsgroup): Ditto. - -1998-09-25 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.10.022. - - * Sync up with Pterodactyl Gnus 0.32. - -1998-09-24 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.10.021. - - * Sync up with Pterodactyl Gnus 0.31. - -1998-09-23 Katsumi Yamaoka - - * lisp/message.el (message-make-user-agent): Add extended version - number to Emacs/{VERSION} (e.g. "Emacs/20.3.90"). - -1998-09-22 Tatsuya Ichikawa - - * lisp/gnus-agent.el (gnus-agent-expire): Bug fix when variable - expired is nil. - -1998-09-18 Tsukamoto Tetsuo - - * lisp/gnus-draft.el: (gnus-draft-edit-message): Fix typo. - -1998-09-17 Katsumi Yamaoka - - * lisp/message.el (message-make-user-agent): Use - `gnus-inviolable-extended-version' if `message-user-agent' is nil. - - * lisp/message.el (message-make-user-agent): In message-mode, make - the most of the `User-Agent' field value if already exists. - - * lisp/gnus-msg.el (gnus-inviolable-extended-version): New constant. - - * lisp/gnus-msg.el (gnus-extended-version): Remove trailing white - space. - -1998-09-17 Tsukamoto Tetsuo - - * lisp/gnus-draft.el (gnus-draft-send-draft): Expire queued message - after news posting. - -1998-09-17 Tatsuya Ichikawa - - * lisp/gnus-draft.el (gnus-draft-send-draft): Error if no - recipients. - -1998-09-17 Tsukamoto Tetsuo - - * lisp/gnus-draft.el (gnus-draft-decoding-function): Uncommented. - -1998-09-17 Tatsuya Ichikawa - - * lisp/gnus-draft.el (gnus-draft-edit-message): Use - `gnus-draft-setup-for-editing' instead of `gnus-draft-setup'. - (gnus-draft-send): Use `gnus-draft-setup-for-sending' instead of - `gnus-draft-setup'. - (gnus-draft-setup-for-editing): New function (renamed from - `gnus-draft-setup'). - (gnus-draft-setup-for-sending): New function. - (gnus-draft-send-draft-buffer): New variable. - -1998-09-16 Katsumi Yamaoka - - * texi/gnus-ja.texi: Sync up with Semi-gnus 6.8.18. - - * Makefile.in: Add entry `info-ja'. - * texi/Makefile.in: Add entry `ja'. - -1998-09-16 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.10.020. - - * lisp/ietf-drums.el: New file. - * lisp/date.el: Abolished. - * lisp/mm.el: Abolished. - - * Sync up with Pterodactyl Gnus 0.31. - -1998-09-14 Katsumi Yamaoka - - * lisp/message.el (message-encode-message-body): Copied from - Pterodactyl Gnus 0.30. It is useless for Semi-gnus but usefull for - reducing differences while at work for synchronizing up. It will - be removed when the Gnus becomes stable. - * lisp/gnus-art.el (gnus-mime-display-alternative) - (gnus-display-mime) (gnus-widget-press-button) - (gnus-insert-mime-button) (gnus-mime-copy-part) - (gnus-mime-view-part) (gnus-mime-pipe-part) (gnus-mime-save-part) - (gnus-mime-button-map) (gnus-mime-button-line-format-alist) - (gnus-mime-button-line-format) - (article-mime-decode-quoted-printable-buffer) - (article-de-quoted-unreadable) (article-decode-charset) - (article-decode-mime-words) (gnus-decode-header-function) - (gnus-display-mime-function): Ditto. - -1998-09-14 Katsumi Yamaoka - - * lisp/gnus-art.el (article-decode-encoded-words): Renamed from - `gnus-article-decode-rfc1522'. - - * lisp/mail-parse.el: New file. - * lisp/mm-view.el: New file. - * lisp/rfc2231.el: New file. - * texi/emacs-mime.texi: New file. - - * lisp/gnus.el (gnus-version-number): Update to 6.10.019. - - * Sync up with Pterodactyl Gnus 0.30. - -1998-09-11 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.10.018. - - * Sync up with Pterodactyl Gnus 0.26. - -1998-09-11 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.10.017. - - * lisp/gnus-art.el (gnus-show-mime) (gnus-summary-toggle-mime): - Revived. - - * lisp/gnus-mailcap.el: New file. Renamed from `mailcap.el'. - - * Sync up with Pterodactyl Gnus 0.25. - -1998-09-11 Katsumi Yamaoka - - * lisp/gnus-art.el (article-make-date-line): Add TZ value to - `local' and `ut' date. - - * lisp/gnus-art.el (article-make-date-line): Fix `ut' date. - - * lisp/parse-time.el (parse-time-string): The last element of the - return list should be TZ. - - * lisp/message.el (message-send): Eval 'message-fix-before-sending' - after encoding. - -1998-09-10 Katsumi Yamaoka - - * lisp/gnus-spec.el (gnus-tilde-pad-form): Use old macro form. - - * lisp/gnus-art.el (article-decode-mime-words): Abolished. - -1998-09-10 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.10.016. - - * Sync up with Pterodactyl Gnus 0.24. - -1998-09-09 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.10.015. - - * Sync up with Pterodactyl Gnus 0.23. - -1998-09-09 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.10.014. - - * Sync up with Pterodactyl Gnus 0.22. - -1998-09-08 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.10.013. - - * Sync up with Pterodactyl Gnus 0.19. - -1998-09-08 Tatsuya Ichikawa - - * lisp/gnus-draft.el (gnus-draft-send-draft) (gnus-draft-send): New - implementations for testing. - - * lisp/gnus-agent.el (gnus-agent-expire) (gnus-agent-fetch-headers) - (gnus-agent-flush-cache) (gnus-agent-save-history) - (gnus-agent-save-groups): Bind `coding-system-for-write' by - `gnus-agent-file-coding-system' while writing a file. - - * lisp/gnus-agent.el (gnus-agent-file-coding-system): Renamed from - `gnus-agent-article-file-coding-system'. - -1998-09-08 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.10.012. - - * Sync up with Pterodactyl Gnus 0.18. - -1998-09-07 Tatsuya Ichikawa - - * lisp/gnus-draft.el (gnus-draft-setup): Do not use message mode. - (gnus-draft-send): Ditto. - gnus-draft-send-draft-buffer: New variable. - - * lisp/gnus-msg.el (gnus-extended-version): Display original Gnus - version. - - * lisp/gnus-agent.el : Use pGnus 0.17 gnus-agent.el - -1998-09-07 Katsumi Yamaoka - - * lisp/gnus.el (gnus-continuum-version): Use `char-int' instead of - `mm-char-int'. - * lisp/messagexmas.el (message-xmas-make-caesar-translation-table): - Ditto. - - * lisp/gnus-art.el (gnus-article-setup-buffer): Don't use - `mm-enable-multibyte'. - -1998-09-07 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.10.011. - - * Sync up with Pterodactyl Gnus 0.17. - -1998-09-06 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.10.010. - - * Sync up with Pterodactyl Gnus 0.16. - -1998-09-04 Tatsuya Ichikawa - - * lisp/pop3-fma.el (pop3-fma-movemail): Add error handle. - (pop3-fma-get-movemail-type): Fix typo. - -1998-09-04 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.9.09. - - * Sync up with Pterodactyl Gnus 0.14. - -1998-09-03 Katsumi Yamaoka - - * lisp/nndoc.el (nndoc-transform-mime-parts): Insert - "MIME-Version:" instead of "Mime-Version:". - - * lisp/message.el (message-encode-message-body): Abolished. - - * lisp/message.el: Don't require `rfc2047'. - - * lisp/gnus.el: Delete autoload settings for `qp' and `rfc2047'. - - * lisp/gnus.el (semi-gnus-developers): New constant. - - * lisp/gnus.el (gnus-version-number): Update to 6.9.08. - - * lisp/gnus-xmas.el (gnus-tilde-pad-form): Move to - `gnus-xmas-redefine' from `gnus-xmas-define'. - - * lisp/gnus-sum.el (gnus-set-mode-line): Use `gnus-truncate-string' - instead of `truncate-string'. - - * lisp/gnus-sum.el: Don't define menu for "MIME". - - * lisp/gnus-sum.el: Delete key definitions for - `gnus-article-decode-mime-words' and `gnus-article-decode-charset'. - - * lisp/gnus-spec.el (gnus-tilde-pad-form): New function for the - benefit of avoiding byte-compile warning. - - * lisp/gnus-soup.el (gnus-soup-send-packet): Set - `message-user-agent' instead of `message-newsreader'. - - * lisp/message.el (message-set-work-buffer) (message-mode): Don't - use `mm-enable-multibyte'. - * lisp/gnus-util.el (gnus-set-work-buffer): Ditto. - * lisp/gnus-sum.el (gnus-summary-mode): Ditto. - * lisp/gnus-msg.el (gnus-copy-article-buffer): Ditto. - * lisp/gnus-art.el (gnus-article-mode): Ditto. - - * lisp/gnus-art.el (gnus-article-decode-mime-words) - (gnus-article-decode-charset) (gnus-decode-rfc1522) - (article-decode-rfc1522) (article-de-quoted-unreadable) - (article-mime-decode-quoted-printable-buffer): Abolished. - - * lisp/message.el: Don't require `mm-bodies'. - * lisp/gnus-art.el: Ditto. - - * lisp/gnus-agent.el (gnus-category-line-format-alist): Change - variable name `name' and `groups' to `gnus-tmp-name' and - `gnus-tmp-groups'. - (gnus-category-insert-line): Ditto. - - * lisp/gnus-agent.el (gnus-agent-fetch-articles): Delete useless - binding variables. - -1998-09-01 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.9.07. - - * Sync up with Pterodactyl Gnus 0.13. - -1998-08-31 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.9.04. - - * Sync up with Pterodactyl Gnus 0.10. - - * lisp/gnus-agent.el : back to version Gnus 5.6.32. - -1998-08-31 Katsumi Yamaoka - - * lisp/rfc1522.el: Abolished. - - * lisp/message.el: (message-send-mail) (message-send-news): Don't - use `mm-encode-message-header'. - - * lisp/gnus.el: Delete autoload settings for - `hexl-hex-string-to-integer', `mm-decode-words-region', - `mm-decode-words-string', `gnus-hack-decode-rfc1522', - `gnus-article-de-quoted-unreadable', `gnus-decode-rfc1522' and - `article-decode-rfc1522'. - - * lisp/gnus-sum.el: Delete key definitions for - `gnus-article-decode-mime-words', `gnus-article-decode-mime-words' - and `gnus-article-de-quoted-unreadable'. - - * lisp/gnus-art.el (gnus-article-decode-mime-words) - (gnus-decode-rfc1522) (article-de-quoted-unreadable) - (article-mime-decode-quoted-printable-buffer): Abolished. - - * lisp/gnus.el (gnus-version-number): Update to 6.9.03. - - * Sync up with Pterodactyl Gnus 0.9. - -1998-08-31 Tatsuya Ichikawa - - * lisp/gnus-agent.el: Do not use nnheader-temp-write. - - * lisp/gnus-ems.el: Do not use nnheader-temp-write. - - * lisp/gnus.el (gnus-version-number): Update to 6.9.02. - - * Sync up with Pterodactyl Gnus 0.8. - -1998-08-30 Tatsuya Ichikawa - - * New branch ... pgnus-ichikawa - - * lisp/gnus.el (gnus-original-version-number) - (gnus-original-product-name) : New variable. - - * lisp/gnus.el (gnus-version-number): Update to 6.9.01. - Third version number 0x means Original gnus's status in beta version. - - * Sync up with Pterodactyl Gnus 0.6. - -1998-08-30 Tatsuya Ichikawa - - * lisp/gnus-agent.el (gnus-agent-fetch-headers): Bug Fix. - When add a new newsgroup , gnus-agent cannot fetch articles. - - * lisp/gnus.el (gnus-version-number): Update to 6.8.17. - - * Sync up with Gnus 5.6.42. - -1998-08-28 Shuhei KOBAYASHI - - * lisp/gnus-i18n.el (gnus-set-summary-default-charset): Try - "qualified" newsgroup name first. - -1998-08-28 Shuhei KOBAYASHI - - * lisp/gnus-i18n.el (gnus-set-summary-default-charset): Match - "real" newsgroup name; strip "backend+server" prefix. - -1998-08-28 Katsumi Yamaoka - - * lisp/message.el (message-make-user-agent): New function. - (message-generate-headers): Use it. - These changes are copied from Shoe-gnus. - -1998-08-28 Shuhei KOBAYASHI - - * lisp/message.el (message-make-in-reply-to): - Use `std11-extract-address-components'. - (message-use-mail-reply-to): Doc fix. - -1998-08-27 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.8.16. - - * Sync up with Gnus 5.6.41. - -1998-08-26 Katsumi Yamaoka - - * lisp/gnus-spec.el (gnus-parse-simple-format): Use - `gnus-tilde-pad-form' instead of the padding faculty of `format' - under XEmacs-mule. - - * lisp/gnus-xmas.el - (gnus-xmas-redefine): Redifine `gnus-truncate-string', - `gnus-tilde-max-form' and `gnus-tilde-cut-form' for XEmacs-mule. - (gnus-xmas-define): New function 'gnus-tilde-pad-form' for - XEmacs-mule. - -1998-08-26 Shuhei KOBAYASHI - - * lisp/gnus-art.el (gnus-article-narrow-to-signature): - Removed TM stuff. - (gnus-article-display-mime-message): - Set `mime-button-mother-dispatcher' in correct buffer. - (gnus-url-mailto): Use `gnus-setup-message'. - (gnus-button-mailto): Ditto. - (gnus-button-reply): Ditto. - - * lisp/gnus-ems.el (gnus-mule-max-width-function): Removed. - (gnus-truncate-string): Use `truncate-string-to-width' if available. - (gnus-tilde-max-form): New implementation. - (gnus-tilde-cut-form): Ditto. - - * lisp/gnus-msg.el (gnus-summary-mail-digest): New function. - (gnus-summary-post-digest): New function. - - * lisp/gnus-sum.el (gnus-summary-make-menu-bar): Use - `gnus-summary-mail-digest' and `gnus-summary-post-digest' instead - of `gnus-uu-digest-mail-forward' and `gnus-uu-digest-post-forward'. - - * lisp/gnus-util.el (gnus-truncate-string): Ignore more than two - arguments. - - * lisp/message.el (message-forward-end-separator): Use - `text/plain' tag. - -1998-08-25 Tatsuya Ichikawa - - * lisp/gnus-cache.el (gnus-cache-possibly-enter-article): Write - file in raw-text coding system. - (gnus-cache-save-buffers): Ditto. - * lisp/gnus-cache.el (gnus-cache-write-file-coding-system): New variable. - * lisp/gnus-util.el (gnus-write-buffer): Undo change. - - * lisp/gnus-util.el (gnus-write-file-coding-system): Delete variable. - -1998-08-25 Shuhei KOBAYASHI - - * lisp/gnus-msg.el (gnus-bug-message): About Semi-gnus. - (gnus-extended-version): Return gnus version only. - (gnus-bug): Add Semi-gnus developers to recipients. - - * lisp/message.el (message-make-user-agent): New function. - (message-generate-headers): Use it. - -1998-08-24 Tatsuya Ichikawa - - * lisp/gnus-offline.el (gnus-offline-setup): Bug fix and version - changed to 1.53. - - * lisp/gnus-util.el (gnus-write-buffer): Write file in raw-text coding - system. - - * lisp/gnus-util.el (gnus-write-file-coding-system): New variable. - -1998-08-23 Shuhei KOBAYASHI - - * lisp/message.el: Suppress some byte-compile warnings. - (message-make-forward-subject): Failed to sync. - (message-setup): Ditto. - (message-clone-locals): Modify regexp. - - * lisp/message.el (message-fill-references): Reverted. - -1998-08-23 Shuhei KOBAYASHI - - * lisp/gnus-agent.el (gnus-agent-braid-nov): Use - `nnheader-insert-file-contents'. - - * lisp/gnus-i18n.el (gnus-set-summary-default-charset): Sync up - with "akr" branch. - -1998-08-23 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.8.15. - - * Sync up with Gnus 5.6.39. - -1998-08-20 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.8.14. - - * Sync up with Gnus 5.6.38. - - * lisp/gnus-offline.el (gnus-offline-enable-fetch-mail): Enable to get - APOP server. - - * lisp/pop3-fma.el (pop3-fma-movemail): Enable to get from APOP server. - (pop3-fma-set-pop3-password) Enable to get from APOP server. - -1998-08-16 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.8.13. - - * Sync up with Gnus 5.6.37. - - * lisp/gnus-offline.el (gnus-offline-setup) : To create spol directory - if not exists. - Change default value of gnus-offline-drafts-queue-type 'miee to 'agent - -1998-08-16 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.8.12. - - * Sync up with Gnus 5.6.36. - - * lisp/gnus-offline.el : New file. - Merge gnus-offline to ichikawa branch. - -1998-08-15 Yoshiki Hayashi - - * texi/gnus-ja.texi: Update. - -1998-08-14 Katsumi Yamaoka - - * lisp/gnus-start.el (gnus-save-newsrc-file): Bind - `coding-system-for-write' by `gnus-startup-file-coding-system' - while saving the quick newsrc file. - - * lisp/gnus-start.el (gnus-startup-file-coding-system): Change - default value to `ctext'. - -1998-08-13 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.8.11. - - * Sync up with Gnus 5.6.34. - -1998-08-12 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.8.10. - - * Sync up with Gnus 5.6.33. - -1998-08-11 Keiichi Suzuki - - * lisp/message.el (message-frames): New custom group. - (message-original-frame): New variable. - (message-use-multi-frames): New variable. - (message-delete-frame-on-exit): New variable. - (message-send-and-exit): Delete frame which made for editing - message. - (message-kill-buffer): Ditto. - (message-delete-frame): New function. - (message-pop-to-buffer): Make new frame when edit message. - -1998-08-11 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.8.9. - - * Sync up with Gnus 5.6.31. - -1998-08-10 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.8.8. - - * Sync up with Gnus 5.6.30. - -1998-08-10 Shuhei KOBAYASHI - - * lisp/gnus.el (gnus-version-number): Update to 6.8.7. - -1998-08-06 Katsumi Yamaoka - - * lisp/smtp.el: Do not insert empty line at the end of message. - -1998-08-06 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.8.6. - - * Sync up with Gnus 5.6.29. - -1998-08-05 Tatsuya Ichikawa - - * lisp/gnus-start.el (gnus-read-init-file): Fix indent. - * lisp/gnus-ems.el (gnus-tilde-max-form): Redefine instead of - (gnus-summary-line-format-spec) to display Japanese character - correctly in Gnus summaly. - -1998-08-05 Keiichi Suzuki - - * lisp/gnus-start.el (gnus-read-init-file): Don't restrict - `coding-system-for-read' by `binary' when loading `.gnus'. - -1998-08-04 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.8.5. - - * Sync up with Gnus 5.6.28. - -1998-07-27 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.8.4. - - * Sync up with Gnus 5.6.27. - -1998-07-27 Yoshiki Hayashi - - * texi/message-ja.texi: Japanese translation of "message.texi". - -1998-07-26 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.8.3. - - * Sync up with Gnus 5.6.26. - -1998-07-23 Shuhei KOBAYASHI - - * lisp/gnus.el (gnus-version-number): Update to 6.8.2. - (gnus-version): Change to "Semi-gnus". Change comment format. - -1998-07-21 Keisuke Mori - - * texi/gnus-ja.texi: Add "Appendices". - -1998-07-21 Yoshiki Hayashi - - * texi/gnus-ja.texi: Add "Appendices". - -1998-07-16 Shuhei KOBAYASHI - - * lisp/gnus.el (gnus-version-number): Update to 6.8.1. - - * Sync up with Gnus 5.6.24. - -1998-07-10 Keiichi Suzuki - - * lisp/gnus-ems.el (gnus-mule-cite-add-face): Fix problem when multi - bytes charactors are used in cite prefix. (for Emacs 20.1 and 20.2) - (gnus-ems-redefine): for Emacs 20.1 and 20.2 - - * lisp/gnus-cite.el (gnus-cite-add-face): Abolish my last bogus change. - -1998-07-09 Keiichi Suzuki - - * lisp/gnus-cite.el (gnus-cite-add-face): Fix problem when multi - bytes charactors are used in cite prefix. - -1998-07-07 Yoshiki Hayashi - - * texi/gnus-ja.texi: Add "The End". - -1998-07-06 Keisuke Mori - - * texi/gnus-ja.texi: Add "Various". - -1998-07-06 Yoshiki Hayashi - - * texi/gnus-ja.texi: Add "Various". - * texi/gnus-ja.texi: Sync up with Gnus 5.6.22 - -1998-07-02 MORIOKA Tomohiko - - * lisp/message.el (message-header-format-alist): Repair to use - `message-fill-references' for References. - -1998-07-01 MORIOKA Tomohiko - - * lisp/gnus-art.el (gnus-article-header-presentation-method): - Delete nil optional arguments. - - Delete setting for `mime-raw-representation-type-alist'. - -1998-07-01 MORIOKA Tomohiko - - * lisp/gnus.el (gnus-version-number): Update to 6.8.0. - (gnus-version): Modify for FLIM 1.8. - - * lisp/gnus-art.el (gnus-article-header-presentation-method): - Modify for FLIM 1.8. - -1998-06-30 Keisuke Mori - - * texi/gnus-ja.texi: Add "Scroing". - -1998-06-30 Yoshiki Hayashi - - * texi/gnus-ja.texi: Add "Scoring". - -1998-06-30 Tatsuya Ichikawa - - * Sync up with Gnus 5.6.22 - * lisp/gnus.el (gnus-version-number): Update to 6.7.8. - * lisp/pop3-fma.el : Enable to get localhost mail spool. - -1998-06-29 MORIOKA Tomohiko - - * lisp/gnus.el (gnus-version-number): Update to 6.7.7. - - * lisp/gnus-art.el (gnus-article-prepare): Set up - `gnus-article-current-summary' of gnus-article-buffer. - (gnus-request-article-this-buffer): Don't set up - `gnus-article-current-summary'. - -1998-06-27 MORIOKA Tomohiko - - * lisp/gnus.el (gnus-version-number): Update to 6.7.6. - -1998-06-27 MORIOKA Tomohiko - - * lisp/gnus-art.el (gnus-mime-preview-quitting-method): Renamed - from `mime-preview-quitting-method-for-gnus'. - -1998-06-27 MORIOKA Tomohiko - - * lisp/gnus-sum.el (gnus-summary-preview-mime-message): New - implementation. - - * lisp/gnus-art.el (mime-preview-quitting-method-for-gnus): Use - `gnus-article-show-summary' is `gnus-show-mime' is not nil. - -1998-06-27 MORIOKA Tomohiko - - * texi/ChangeLog, texi/gnus.texi, texi/message.texi, - lisp/ChangeLog, lisp/gnus.el, lisp/nngateway.el, lisp/nnfolder.el, - lisp/message.el, lisp/gnus-sum.el, lisp/gnus-soup.el: Sync up with - Gnus 5.6.20. - -1998-06-26 MORIOKA Tomohiko - - * README, texi/ChangeLog, texi/gnus.texi, texi/message.texi, - lisp/ChangeLog, lisp/nnweb.el, lisp/nnmail.el, lisp/nndoc.el, - lisp/message.el, lisp/lpath.el, lisp/gnus.el, lisp/gnus-util.el, - lisp/gnus-topic.el, lisp/gnus-sum.el, lisp/gnus-score.el, - lisp/gnus-group.el, lisp/gnus-ems.el, lisp/gnus-demon.el, - lisp/gnus-art.el: Sync up with Gnus 5.6.16. - -1998-06-26 MORIOKA Tomohiko - - * lisp/gnus.el (gnus-version-number): Update to 6.7.3. - - * lisp/gnus-sum.el (gnus-summary-move-article): Use - `gnus-request-article-this-buffer'. - (gnus-request-partial-message): Likewise. - - * lisp/gnus-art.el (gnus-article-prepare): Use - `gnus-request-article-this-buffer'. - (gnus-request-article-this-buffer): Renamed from - `gnus-request-original-article'; abolish conventional - implementation. - - Abolish unused setting for `mime-view-show-summary-method'. - -1998-06-26 MORIOKA Tomohiko - - * readme, texi/ChangeLog, texi/gnus.texi, texi/message.texi, - lisp/ChangeLog, lisp/gnus.el, lisp/nnmail.el, lisp/nnheader.el, - lisp/nngateway.el, lisp/nnfolder.el, lisp/nnagent.el, - lisp/message.el, lisp/gnus-sum.el, lisp/gnus-score.el, - lisp/gnus-salt.el, lisp/gnus-msg.el, lisp/gnus-cus.el, - lisp/gnus-cache.el, lisp/gnus-art.el: Sync up with Gnus 5.6.15. - -1998-06-24 MORIOKA Tomohiko - - * texi/gnus.texi, texi/message.texi, texi/ChangeLog: Sync up with - Gnus 5.6.13. - -1998-06-14 Tatsuya Ichikawa - - * Sync up with Gnus 5.6.13. - -1998-06-24 MORIOKA Tomohiko - - * lisp/gnus-art.el (gnus-article-display-mime-message): Don't - `save-excursion'. - (gnus-article-prepare): Use `mime-fetch-field' instead of - `mime-entity-fetch-field'. - -1998-06-19 MORIOKA Tomohiko - - * lisp/gnus-art.el (gnus-article-display-mime-message): Use - `mime-display-message' instead of `mime-view-buffer'. - (gnus-article-display-traditional-message): Set - `gnus-article-buffer'. - (gnus-article-display-message-with-encoded-word): Modify for - `gnus-article-display-traditional-message'. - (gnus-article-prepare): Use `mime-parse-buffer' and - `mime-entity-fetch-field'; don't set gnus-article-buffer. - -1998-06-19 MORIOKA Tomohiko - - * lisp/gnus-sum.el (gnus-summary-move-article): Use - `gnus-request-original-article' instead of - `gnus-request-article-this-buffer'. - -1998-06-19 MORIOKA Tomohiko - - * texi/gnus-ja.texi, texi/gnus.texi (Using MIME): Modify - description about new display mechanism. - -1998-06-19 MORIOKA Tomohiko - - * lisp/gnus.el (gnus-version-number): Update to 6.6.0. - (gnus-version): Modify for this branch. - - * lisp/gnus-art.el (gnus-article-display-method-for-mime): New - variable; abolish `gnus-show-mime-method'. - (gnus-article-display-method-for-encoded-word): New variable; - abolish `gnus-decode-encoded-word-method'. - (gnus-article-display-method-for-traditional): New variable. - (gnus-article-display-mime-message): New function; abolish - `gnus-article-preview-mime-message'. - (gnus-article-display-traditional-message): New function. - (gnus-article-display-message-with-encoded-word): New function; - abolish `gnus-article-decode-encoded-word'. - (gnus-article-prepare): Change display mechanism; use - `gnus-request-original-article' instead of - `gnus-request-article-this-buffer'. - (gnus-request-original-article): New function. - -1998-06-22 MORIOKA Tomohiko - - * lisp/gnus.el (gnus-version-number): Update to 6.6.0. - (gnus-version): Modify for SEMI 1.8. - - * lisp/gnus-sum.el: Modify for interface change in SEMI 1.8 about - automatic message/partial combining. - -1998-06-19 MORIOKA Tomohiko - - * lisp/gnus.el (gnus-version-number): Update to 6.5.0. - (gnus-version): Modify for SEMI 1.7. - - * lisp/gnus-sum.el: Rename - `mime-method-to-combine-message/partial-pieces' to - `mime-combine-message/partial-pieces-automatically'. - - * lisp/gnus-art.el (gnus-article-preview-mime-message): Use - `mime-view-buffer'. - (gnus-article-decode-encoded-word): Fix DOC-string. - (gnus-article-header-presentation-method): New function; abolish - `gnus-content-header-filter'. - Modify for SEMI 1.7. - -1998-06-18 Keisuke Mori - - * texi/gnus-ja.texi: Add "Select Methods". - -1998-06-18 Yoshiki Hayashi - - * texi/gnus-ja.texi: Add "Select Methods". - -1998-06-17 Tatsuya Ichikawa - - * lisp/pop3-fma.el: Small bug fix. - - * lisp/pop3-fma.el: Delete variable pop3-fma-cypher-key - Use base64-encode-string , base64-decode-string instead. - Both change by Yasuo OKABE - -1998-06-13 Tatsuya Ichikawa - - * lisp/pop3-fma.el: New function pop3-fma-cypher-string - New variable pop3-fma-cypher-key - -1998-06-12 Shuhei KOBAYASHI - - * lisp/message.el (message-required-news-headers): `X-Newsreader' - was replaced by `User-Agent'. - (message-required-mail-headers): `X-Mailer' was replaced by - `User-Agent'. - (message-header-format-alist): `X-Mailer' and `X-Newsreader' were - replaced by `User-Agent'. - (message-generate-headers): Ditto. - - (message-user-agent): New variable. - (message-newsreader): Replaced by `message-user-agent'. - (message-mailer): Ditto. - (message-mode): `message-mailer' and `message-newsreader' were - replaced by `message-user-agent'. - - * lisp/gnus-msg.el (gnus-inews-add-send-actions): `message-mailer' - and `message-newsreader' were replaced by `message-user-agent'. - (gnus-extended-version): Generate "PRODUCT/VERSION" style strings. - - * lisp/gnus-soup.el (gnus-soup-send-packet): `message-mailer' and - `message-newsreader' were replaced by `message-user-agent'. - -1998-06-07 MORIOKA Tomohiko - - * lisp/gnus-art.el: Delete setting for - `article-de-quoted-unreadable' and - `article-mime-decode-quoted-printable' because they have been - already abolished. - -1998-06-07 MORIOKA Tomohiko - - * texi/gnus-ja.texi: Sync up with latest gnus.texi. - - * texi/gnus.texi: Modify for Semi-gnus 6.4.0. - -1998-06-06 MORIOKA Tomohiko - - * lisp/gnus.el (gnus-extract-address-components): Add - `std11-extract-address-components' as a choice. - -1998-06-06 Yoshiki Hayashi - - * texi/gnus-ja.texi: Add "Composing Messages". - -1998-06-04 MORIOKA Tomohiko - - * lisp/gnus-ems.el (gnus-ems-redefine): Must require 'path-util - before call `module-installed-p'. - - * lisp/gnus.el (gnus-version-number): Update to 6.4.0. - (gnus-version): Modify for SEMI 1.5. - - * lisp/gnus-art.el: Modify for SEMI 1.5 API. - -1998-06-04 Tatsuya Ichikawa - - * lisp/pop3-fma.el: New file. To handle multiple POP account. - - * lisp/gnus.el (gnus-version-number): Update to 6.3.4. - And fix typo 5.6.10 -> 5.6.11. - -1998-06-03 Shuhei KOBAYASHI - - * lisp/gnus.el (gnus-version-number): Update to 6.3.3. - - * Sync up with Gnus 5.6.11. - -1998-06-03 Keisuke Mori - - * texi/gnus-ja.texi: Add "The Article Buffer". - -1998-06-03 Yoshiki Hayashi - - * texi/gnus-ja.texi: Add "The Summary Buffer". - -1998-06-02 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-version-number): Update to 6.3.2. - - * Sync up with Gnus 5.6.10. - -1998-05-30 Shuhei KOBAYASHI - - * README.semi: Add description of `shuhei-k' branch. - -1998-05-17 MORIOKA Tomohiko - - * lisp/gnus.el (gnus-version-number): Update to 6.3.1. - -1998-05-17 MORIOKA Tomohiko - - * lisp/gnus-util.el (gnus-output-to-rmail): Guard as binary. - - * lisp/gnus-util.el (gnus-output-to-mail): Guard as binary. - -1998-04-24 Yoshiki Hayashi - - * texi/gnus-ja.texi: Add "The Active File". - -1998-05-04 MORIOKA Tomohiko - - * lisp/gnus.el (gnus-version-number): Update to 6.3.0. - (gnus-version): Modify for SEMI 1.4. - - * lisp/gnus-sum.el: Use 'mime-add-condition to set up - acting-condition. - -1998-05-04 MORIOKA Tomohiko - - * lisp/lpath.el: Must add "flim" instead of "mel" to load-path. - -1998-05-03 MORIOKA Tomohiko - - * lisp/gnus.el (gnus-version-number): Update to 6.2.5. - - * texi/gnus.texi, lisp/ChangeLog: Sync up with Gnus v5.6.9. - - * lisp/gnus.el, lisp/message.el, lisp/gnus-sum.el, - lisp/gnus-msg.el, lisp/gnus-draft.el, lisp/gnus-agent.el: Sync up - with Gnus v5.6.9. - -1998-04-30 MORIOKA Tomohiko - - * lisp/gnus.el (gnus-version-number): Update to 6.2.4. - - * texi/gnus.texi, lisp/ChangeLog: Sync up with Gnus 5.6.7. - - * lisp/gnus.el, lisp/message.el, lisp/gnus-sum.el, - lisp/gnus-msg.el, lisp/gnus-cache.el, lisp/gnus-art.el: Sync up - with Gnus 5.6.7. - -1998-04-28 Shuhei KOBAYASHI - - * lisp/gnus.el (gnus-version-number): Update to 6.2.3. - - * Sync up with Gnus 5.6.6. - -1998-04-27 MORIOKA Tomohiko - - * lisp/nnheader.el: Sync up with Gnus 5.6.5. - -1998-04-26 Shuhei KOBAYASHI - - * lisp/gnus.el (gnus-version-number): Update to 6.2.2. - - * Sync up with Gnus 5.6.5. - - * texi/custom.texi, texi/widget.texi: Removed from Semi-gnus. - -1998-04-25 MORIOKA Tomohiko - - * README.semi (How to get? (via CVS)): Modify descriptions about - TAG. - -1998-04-23 MORIOKA Tomohiko - - * lisp/gnus.el (gnus-version-number): Update to 6.2.1. - -1998-04-23 MORIOKA Tomohiko - - * lisp/message.el (message-make-forward-subject): Use - `eword-decode-unstructured-field-body' for subject. - - * lisp/gnus-msg.el (gnus-summary-mail-forward): Make local - variable `default-mime-charset' of `gnus-original-article-buffer' - and set up by `default-mime-charset' of `gnus-summary-buffer'. - -1998-04-23 MORIOKA Tomohiko - - * texi/gnus-ja.texi: Fix typos. - - * texi/gnus.texi: Modify for Semi-gnus. - -1998-04-23 Yoshiki Hayashi - - * texi/gnus-ja.texi: Add "Auto Save". - -1998-04-22 Yoshiki Hayashi - - * texi/gnus-ja.texi: Add "Startup Files". - -1998-04-21 MORIOKA Tomohiko - - * lisp/gnus.el (gnus-version-number): Update to 6.2.0. - (gnus-version): Modify for SEMI 1.3. - - * lisp/gnus-sum.el: Use 'ctree-set-calist-strictly instead of - 'set-atype to set up for 'mime-acting-condition. - -1998-04-21 Yoshiki Hayashi - - * texi/gnus-ja.texi: Add "Changing Servers". - -1998-04-20 MORIOKA Tomohiko - - * texi/gnus-ja.texi: Modify styles. - - * texi/gnus.texi: Modify for Semi-gnus (sync up with - gnus-ja.texi). - -1998-04-20 Yoshiki Hayashi - - * texi/gnus-ja.texi: Add "New Groups". - -1998-04-20 Yoshiki Hayashi - - * texi/gnus-ja.texi: Modify styles. - -1998-04-18 MORIOKA Tomohiko - - * texi/gnus-ja.texi: Check and modify for Semi-gnus. - -1998-04-18 Yoshiki Hayashi - - * texi/gnus-ja.texi: New file. - -1998-04-19 MORIOKA Tomohiko - - * lisp/gnus.el (gnus-version-number): Update to 6.1.3. - -1998-04-19 MORIOKA Tomohiko - - * lisp/gnus-art.el (gnus-following-method): New function; set up - for 'mime-view-following-method-alist. - -1998-04-18 MORIOKA Tomohiko - - * texi/gnus.texi: Add and modify description for Semi-gnus. - -1998-04-16 MORIOKA Tomohiko - - * texi/gnus.texi: "Gnus 5.6.4" -> "Semi-gnus 6.1.2". - (Top): "Gnus" -> "gnus". - (Starting Up): "Gnus" -> "gnus". - -1998-04-10 Shuhei KOBAYASHI - - * lisp/ChangeLog, lisp/gnus-agent.el: Sync up with Gnus 5.6.4. - -1998-04-08 MORIOKA Tomohiko - - * lisp/gnus.el (gnus-version-number): Update to 6.1.2. - (gnus-version): Include corresponding SEMI version. - - * lisp/gnus.el, lisp/nnkiboze.el, lisp/message.el, - lisp/gnus-sum.el, lisp/gnus-agent.el: Sync up with Gnus 5.6.4. - -1998-03-27 Shuhei KOBAYASHI - - * README.semi: Change descriptions of sending bug report. - -1998-03-20 Shuhei KOBAYASHI - - * lisp/gnus.el (gnus-version-number): Update to 6.1.1. - (gnus-version): Include corresponding SEMI version. - - * Sync up with Gnus 5.6.3. - -1998-03-15 Shuhei KOBAYASHI - - * lisp/gnus-agent.el (gnus-agent-crosspost): Use - `nnheader-insert-file-contents'. - (gnus-agent-braid-nov): Ditto. - (gnus-agent-expire): Ditto. - - * lisp/gnus-cache.el (gnus-cache-request-article): Ditto. - (gnus-cache-retrieve-headers): Ditto. - (gnus-cache-change-buffer): Ditto. - (gnus-cache-braid-nov): Ditto. - - * lisp/gnus-sum.el (gnus-summary-import-article): Ditto. - - * lisp/nnkiboze.el (nnkiboze-retrieve-headers): Ditto. - - * lisp/message.el (message-generate-headers): Fix regexp. - (cf. [semi-gnus-ja:107]) - -1998-03-14 MORIOKA Tomohiko - - * lisp/gnus-art.el: Add setting for - `mime-raw-buffer-coding-system-alist'. - -1998-03-13 MORIOKA Tomohiko - - * lisp/gnus-art.el: Rename `mime-view-quitting-method-for-gnus' -> - `mime-preview-quitting-method-for-gnus'. - - * lisp/gnus-art.el: Rename `mime-view-quitting-method-alist' -> - `mime-preview-quitting-method-alist'. - - * lisp/gnus-art.el: Rename `mime-view-kill-buffer' -> - `mime-preview-kill-buffer'. - - * lisp/gnus.el (gnus-version-number): Update to 6.0.10. - - * lisp/gnus-sum.el: Add code to check latest SEMI. - (mime-acting-condition): Separate type and subtype; rename - `mime-combine-message/partials-automatically' -> - `mime-method-to-combine-message/partial-pieces'. - -1998-03-08 Shuhei KOBAYASHI - - * lisp/gnus.el (gnus-version-number): Update to 6.0.9. - - * README.semi (How to get?): Add description of daily snapshot. - (How to join development): Change mailing list command address. - - * Sync up with Gnus 5.6.2. - -1998-03-01 Tatsuya Ichikawa - - * lisp/gnus-ems.el: Change variable name - gnus-bdf-image-file to gnus-mule-bitmap-image-file. - -1998-02-28 MORIOKA Tomohiko - - * lisp/gnus.el (gnus-version-number): Update to 6.0.8. - - * lisp/gnus.el: Sync up with qgnus-0.34. - -1998-02-28 MORIOKA Tomohiko - - * lisp/message.el: Sync up with qgnus-0.33. - - * lisp/gnus-ems.el (gnus-bdf-image-file): New variable; moved from - gnus.el. - (gnus-mule-group-startup-message): New function; moved and renamed - from `gnus-group-startup-message' of gnus.el. - - * lisp/gnus.el, lisp/gnus-sum.el, lisp/gnus-art.el, - lisp/gnus-agent.el: Sync up with qgnus-0.33. - -1998-02-28 Tatsuya Ichikawa - - * lisp/gnus.el (gnus-bdf-image-file): New variable. - (gnus-mule-group-startup-message): Display bitmap image using - bitmap.el running with Emacs 20. - - * lisp/gnus-agent.el (gnus-agent-fetch-headers): Fix problem when - Xref field is not exist. - -1998-02-26 MORIOKA Tomohiko - - * README.semi (How to join development): Modify for Semi-gnus - mailing list. - - * lisp/gnus.el (gnus-version-number): Update to 6.0.7. - - * lisp/gnus.el (gnus-article-display-hook): Delete - `gnus-article-de-quoted-unreadable' from options. - - * lisp/gnus-sum.el (gnus-article-make-menu-bar): Delete key for - `gnus-article-de-quoted-unreadable'. - (gnus-summary-make-menu-bar): Delete menu for - `gnus-article-de-quoted-unreadable'. - - * lisp/gnus-art.el (gnus-article-make-menu-bar): Delete menu for - `gnus-article-de-quoted-unreadable'. - -1998-02-24 MORIOKA Tomohiko - - * lisp/gnus.el, lisp/message.el: Sync up with qgnus-0.32. - -1998-02-23 MORIOKA Tomohiko - - * lisp/gnus.el (gnus-version-number): Update to 6.0.6. - - * lisp/message.el (message-fill-references): Abolish unused local - variables. - - * lisp/pop3.el, lisp/message.el, lisp/gnus.el, lisp/gnus-sum.el, - lisp/gnus-art.el: Sync up with qgnus-0.31. - - * lisp/gnus.el, lisp/message.el, lisp/gnus-sum.el, - lisp/gnus-art.el: Sync up with qgnus-0.30. - -1998-02-20 Christophe Broult - - * README.semi (How to get?): The command `update' must come before - `-r semi-gnus'. (cf. [tm-en:1559]) - -1998-02-17 MORIOKA Tomohiko - - * lisp/gnus.el: Sync up with qgnus-0.29. - - * lisp/gnus.el, lisp/message.el: Sync up with qgnus-0.28. - - * lisp/message.el: Abolish variable - `message-references-generator'. Abolish function - `message-generate-filled-references', - `message-generate-folded-references' and - `message-generate-unfolded-references'. - (message-reply): Don't use `message-references-generator'. - (message-followup): Don't use `message-references-generator'. - - (message-fill-references): New function. - (message-header-format-alist): Use `message-fill-references' for - References. - -1998-02-17 MORIOKA Tomohiko - - * lisp/gnus.el (gnus-version-number): Update to 6.0.5. - -1998-02-17 MORIOKA Tomohiko - - * lisp/gnus-sum.el: Check SEMI-0.118.2 (Otomaru) or later. - (gnus-structured-field-decoder): Use - `eword-decode-and-unfold-structured-field'. - - * lisp/gnus-art.el (gnus-article-decode-rfc1522): Use charset - conversion option of `eword-decode-header'. - (gnus-article-decode-encoded-word): Use charset conversion option - of `eword-decode-header'; use `gnus-run-hooks'. - (gnus-content-header-filter): Use charset conversion option of - `eword-decode-header'. - - * README.semi (How to get?): Should specify "-r semi-gnus". - -1998-02-16 MORIOKA Tomohiko - - * lisp/gnus-art.el (gnus-article-decode-rfc1522): Decode header by - localized code. - -1998-02-16 MORIOKA Tomohiko - - * lisp/gnus-msg.el: Delete commented-out function - `gnus-inews-insert-mime-headers'. - - * lisp/gnus.el, lisp/message.el, lisp/gnus-sum.el, - lisp/gnus-art.el: Sync up with qgnus-0.27. - -1998-02-16 MORIOKA Tomohiko - - * lisp/nnheader.el: Use original. - - * lisp/gnus.el, lisp/pop3.el, lisp/message.el, lisp/gnus-sum.el, - lisp/gnus-msg.el, lisp/gnus-draft.el, lisp/gnus-art.el: Sync up - with qgnus-0.26. - -1998-02-15 MORIOKA Tomohiko - - * lisp/nnmail.el, lisp/nnmh.el: Use original. - - * lisp/gnus.el, lisp/gnus-draft.el, lisp/gnus-sum.el, - lisp/message.el, lisp/gnus-art.el: Sync up with qgnus-0.25. - -1998-02-11 Shuhei Kobayashi - - * texi/message.texi, texi/gnus.texi, texi/ChangeLog, - lisp/message.el, lisp/gnus.el, lisp/gnus-uu.el, - lisp/gnus-topic.el, lisp/gnus-sum.el, lisp/gnus-start.el, - lisp/gnus-score.el, lisp/gnus-group.el, lisp/gnus-art.el, - lisp/gnus-agent.el, lisp/ChangeLog: Importing qgnus-0.24 - -1998-02-10 MORIOKA Tomohiko - - * lisp/gnus-art.el (gnus-article-prepare): Don't bind coding - systems. - - * lisp/gnus.el (gnus-version-number): Update to 6.0.4. - (gnus-version): Sync with qgnus-0.23. - - * lisp/pop3.el, lisp/nnmh.el, lisp/nnheader.el, lisp/message.el, - lisp/gnus-sum.el, lisp/gnus-msg.el, lisp/gnus-draft.el, - lisp/gnus-art.el: Merge qgnus-0.23. - -1998-02-09 Shuhei Kobayashi - - * texi/message.texi, texi/gnus.texi, texi/ChangeLog, lisp/nntp.el, - lisp/nnheader.el, lisp/message.el, lisp/gnus.el, - lisp/gnus-xmas.el, lisp/gnus-sum.el, lisp/gnus-start.el, - lisp/gnus-msg.el, lisp/gnus-group.el, lisp/gnus-draft.el, - lisp/gnus-art.el, lisp/gnus-agent.el, lisp/ChangeLog: Importing - qgnus-0.23 - -1998-02-04 MORIOKA Tomohiko - - * lisp/message.el (message-references-generator): New variable. - (message-generate-filled-references): New function. - (message-generate-folded-references): New function. - (message-generate-unfolded-references): New function. - (message-reply): Refer `message-references-generator'. - (message-followup): Refer `message-references-generator'. - -1998-01-17 MORIOKA Tomohiko - - * lisp/message.el (message-send-mail-with-sendmail): Guard - `coding-system-for-write' by binary. - (message-send-mail-with-qmail): Likewise. - -1998-01-16 MORIOKA Tomohiko - - * lisp/lpath.el: Require path-util; add load-path of APEL, MEL and - SEMI. - -1998-01-12 MORIOKA Tomohiko - - * lisp/message.el: Require smtp.el when compile. - - * lisp/message.el (message-send-mail-with-smtp): Use - `(current-buffer)' instead of `tembuf'; rename - `smtp-recipient-address-list' -> `recipient-address-list'. - -1998-01-12 MORIOKA Tomohiko - - * lisp/smtp.el (smtp-deduce-address-list): Don't use - `smtp-recipient-address-list' as global variable. - - * lisp/message.el (message-send-mail-with-smtp): Don't use - `smtp-recipient-address-list' as global variable. - - * lisp/smtpmail.el (smtpmail-recipient-address-list): New - variable; renamed from `smtp-recipient-address-list'. - (smtpmail-send-it): Remove `(not (null ...))'. - (smtpmail-send-queued-mail): Likewise. - -1998-01-12 MORIOKA Tomohiko - - * lisp/message.el (message-send-mail-with-smtp): Don't generate - temporary buffer for message; don't generate and kill - `smtp-address-buffer' for `smtp-deduce-address-list'. - - * lisp/smtpmail.el (smtpmail-send-it): Don't generate and kill - `smtp-address-buffer' for `smtp-deduce-address-list'. - - * lisp/smtp.el (smtp-deduce-address-list): Bind and generate - `smtp-address-buffer' in itself. - -1998-01-12 MORIOKA Tomohiko - - * lisp/gnus.el (gnus-version-number): Update to version 6.0.3. - -1998-01-11 MORIOKA Tomohiko - - * lisp/smtp.el: New file. - - * lisp/smtpmail.el: Split basic features into smtp.el. - - * lisp/message.el (message-send-mail-function): Add - `message-send-mail-with-smtp' as an item. - (message-send-mail-with-smtp): New function. - - * ChangeLog: New file. - -1998-01-08 MORIOKA Tomohiko - - * lisp/smtpmail.el (smtpmail-via-smtp): Bind - `coding-system-for-read' by `smtpmail-coding-system' to avoid - dead-locking in Emacs 20. - - * lisp/gnus.el: gnus.el (gnus-version-number): Update to version - 6.0.2. - -1998-01-07 MORIOKA Tomohiko - - * lisp/nnmail.el, lisp/message.el: Sync with Quassia Gnus v0.22. - - * lisp/gnus.el: Delete autoload setting for `metamail-buffer'. - - * lisp/gnus.el, lisp/gnus-sum.el: Sync with Quassia Gnus v0.22. - - * lisp/gnus-msg.el: Abolish function - `gnus-inews-insert-mime-headers'. - - * lisp/gnus-msg.el, lisp/gnus-draft.el, lisp/gnus-art.el: Sync - with Quassia Gnus v0.22. - - * lisp/smtpmail.el (smtpmail-coding-system): New variable; abolish - `smtpmail-code-conv-from'. - (smtpmail-via-smtp): Guard `coding-system-for-write' by - `smtpmail-coding-system'. - - * lisp/smtpmail.el: Imported from Emacs 20.2. - - * lisp/pop3.el (pop3-movemail-file-coding-system): Change default - value to `binary'. - (pop3-open-server): Guard `coding-system-for-read' by `binary'. - -1998-01-06 Shuhei Kobayashi - - * texi/message.texi, texi/gnus.texi, texi/ChangeLog, lisp/nnoo.el, - lisp/nnml.el, lisp/message.el, lisp/gnus.el, lisp/gnus-sum.el, - lisp/gnus-start.el, lisp/gnus-ems.el, lisp/gnus-draft.el, - lisp/gnus-agent.el, lisp/ChangeLog: Importing qgnus-0.22 - - * texi/message.texi, texi/gnus.texi, lisp/gnus.el, lisp/ChangeLog: - Importing qgnus-0.21 - - * texi/message.texi, texi/gnus.texi, texi/ChangeLog, - lisp/nnvirtual.el, lisp/nnsoup.el, lisp/nnoo.el, lisp/nnmh.el, - lisp/nnmail.el, lisp/nndraft.el, lisp/gnus.el, lisp/gnus-xmas.el, - lisp/gnus-sum.el, lisp/gnus-start.el, lisp/gnus-score.el, - lisp/gnus-msg.el, lisp/gnus-group.el, lisp/gnus-draft.el, - lisp/gnus-art.el, lisp/ChangeLog: Importing qgnus-0.20 - - * texi/message.texi, texi/gnus.texi, texi/ChangeLog, lisp/pop3.el, - lisp/nntp.el, lisp/nnml.el, lisp/nnmail.el, lisp/nndoc.el, - lisp/message.el, lisp/gnus.el, lisp/gnus-uu.el, - lisp/gnus-topic.el, lisp/gnus-sum.el, lisp/gnus-start.el, - lisp/gnus-score.el, lisp/gnus-group.el, lisp/gnus-cache.el, - lisp/gnus-agent.el, lisp/ChangeLog: Importing qgnus-0.19 - -1997-12-27 MORIOKA Tomohiko - - * lisp/gnus.el (gnus-version-number): Update to version 6.0.1. - - * lisp/message.el (message-resend): Enclose `message-setup' with - `(let (message-setup-hook) ...)' to avoid to `turn-on-mime-edit'; - must setup `message-encoding-buffer' and `message-edit-buffer' for - `message-send-mail'. - -1997-12-08 Shuhei Kobayashi - - * lisp/pop3.el, lisp/message.el, lisp/gnus.el, lisp/gnus-sum.el, - lisp/gnus-art.el, lisp/ChangeLog: Synch'ed up to qgnus-0.18. - - * texi/message.texi, texi/gnus.texi, texi/ChangeLog, - lisp/smiley.el, lisp/pop3.el, lisp/nnweb.el, lisp/nntp.el, - lisp/nnml.el, lisp/nnmail.el, lisp/nnheader.el, lisp/nndraft.el, - lisp/message.el, lisp/lpath.el, lisp/gnus.el, lisp/gnus-util.el, - lisp/gnus-sum.el, lisp/gnus-start.el, lisp/gnus-picon.el, - lisp/gnus-nocem.el, lisp/gnus-mh.el, lisp/gnus-group.el, - lisp/gnus-ems.el, lisp/gnus-cite.el, lisp/gnus-art.el, - lisp/gnus-agent.el, lisp/dgnushack.el, lisp/ChangeLog: Importing - qgnus-0.18 - -1997-11-29 MORIOKA Tomohiko - - * README.semi: New file. - - * lisp/gnus.el (gnus-version): Rename to "Semi-gnus". - -1997-11-28 MORIOKA Tomohiko - - * lisp/gnus-draft.el (gnus-draft-decoding-function): New variable. - (gnus-draft-setup): Use `gnus-draft-decoding-function'. - -1997-11-27 MORIOKA Tomohiko - - * lisp/nnmail.el, lisp/nnheader.el, lisp/message.el, lisp/gnus.el, - lisp/gnus-sum.el, lisp/gnus-msg.el, lisp/gnus-art.el: sync with - qgnus-0.17. - - * texi/message.texi, texi/gnus.texi, lisp/smiley.el, lisp/nnoo.el, - lisp/nnml.el, lisp/nnmail.el, lisp/nnheader.el, - lisp/messagexmas.el, lisp/message.el, lisp/gnus.el, - lisp/gnus-xmas.el, lisp/gnus-util.el, lisp/gnus-sum.el, - lisp/gnus-start.el, lisp/gnus-spec.el, lisp/gnus-score.el, - lisp/gnus-picon.el, lisp/gnus-move.el, lisp/gnus-msg.el, - lisp/gnus-kill.el, lisp/gnus-group.el, lisp/gnus-draft.el, - lisp/gnus-demon.el, lisp/gnus-cite.el, lisp/gnus-art.el, - lisp/ChangeLog: Quassia Gnus v0.17. - - * lisp/gnus-i18n.el: New file. - - * lisp/nnmail.el (nnmail-file-coding-system): Use `raw-text' in - default. - - * lisp/nnheader.el (nnheader-file-coding-system): Use `raw-text' - in default. - - * lisp/message.el (message-encode-function): New variable. - (message-forward-start-separator): Modify for mime-edit. - (message-forward-end-separator): Modify for mime-edit. - (message-setup-hook): Use `(message-maybe-setup-default-charset - turn-on-mime-edit)' in default. - (message-header-hook): Use `(eword-encode-header)' in default. - - (message-send): Use local variable `message-encoding-buffer', - `message-edit-buffer' and `message-mime-mode' as public variables; - use `message-encode-function'. - (message-send-mail): Use `message-encoding-buffer' to get contents - of body; abolish `message-encode-mail-hook'; use - `mime-edit-maybe-split-and-send'; use `message-edit-buffer' to - refer original editing buffer. - (message-send-news): Use `message-encoding-buffer' to get contents - of body; abolish `message-encode-news-hook'; use - `mime-edit-maybe-split-and-send'; use `message-edit-buffer' to - refer original editing buffer. - (message-check-news-syntax): Call `message-check-news-body-syntax' - in `mime-edit-buffer'. - (message-do-fcc): Use `message-encoding-buffer' to get contents; - run `message-header-hook'. - (message-cancel-news): Use `std11-extract-address-components' - instead of `mail-extract-address-components'; bind - `message-encoding-buffer' and `message-edit-buffer'. - - (message-maybe-setup-default-charset): New function. - (message-maybe-encode): New function. - (message-mime-insert-article): New function. - Add setting for mime-view. - - * lisp/gnus.el (gnus-version-number): for version number for Open - gnus. - (gnus-version): Modify for Open gnus. - - * lisp/gnus-sum.el: Autoload gnus-i18n. - - (gnus-show-mime): `t' in default. - (gnus-structured-field-decoder): Use - `eword-decode-structured-field-body' in default. - (gnus-unstructured-field-decoder): Use - `eword-decode-unstructured-field-body' in default. - - (gnus-parse-headers-hook): Use - `(gnus-set-summary-default-charset)' in default. - - (gnus-summary-mode-map): Add binding for - `gnus-summary-scroll-down' and - `gnus-summary-preview-mime-message'. - - (gnus-summary-preview-mime-message): New function. - (gnus-mime-partial-preview-function): New function. - Add setting for mime-view. - - * lisp/gnus-msg.el (gnus-summary-cancel-article): Display - `gnus-article-buffer' instead ofb `gnus-original-article-buffer'. - (gnus-extended-version): Don't return version of emacsen. - (gnus-inews-do-gcc): Refer `message-encoding-buffer'. - - * lisp/gnus-art.el (gnus-show-mime-method): Use - `gnus-article-preview-mime-message' instead of `metamail-buffer' - in default. - (gnus-decode-encoded-word-method): Use - `gnus-article-decode-encoded-word' instead of - `gnus-article-de-quoted-unreadable' in default. - - Abolish `gnus-hack-decode-rfc1522', `gnus-decode-rfc1522', - `article-decode-rfc1522', `article-de-quoted-unreadable', - `article-mime-decode-quoted-printable-buffer' and - `article-mime-decode-quoted-printable'. - (gnus-article-decode-rfc1522): New implementation (use - `eword-decode-header'). - - (gnus-article-preview-mime-message): New function. - (gnus-article-decode-encoded-word): New function. - (gnus-content-header-filter): New function. - (mime-view-quitting-method-for-gnus): New function. - Add setting for mime-view. - - * lisp/message.el: Abolish `message-max-size' because it is not - used. - - * lisp/message.el: sync with qgnus-0.16. - - * texi/Makefile, texi/message.texi, texi/gnus.texi, lisp/nnweb.el, - lisp/nnmh.el, lisp/nnheader.el, lisp/nnfolder.el, lisp/message.el, - lisp/gnus.el, lisp/gnus-xmas.el, lisp/gnus-uu.el, - lisp/gnus-sum.el, lisp/gnus-srvr.el, lisp/gnus-picon.el, - lisp/gnus-group.el, lisp/gnus-cite.el, lisp/gnus-art.el: Quassia - Gnus v0.16. - - * lisp/nnmh.el (nnmh-request-list-1): fix maybe. - - * lisp/message.el (message-do-fcc): Guard - `coding-system-for-write' by `raw-text'; run - `message-before-do-fcc-hook'. - - * lisp/gnus-msg.el (gnus-inews-do-gcc): Guard - `coding-system-for-write' by `raw-text'; run - `gnus-before-do-gcc-hook'. - - * texi/message.texi, texi/gnus.texi, texi/ChangeLog, lisp/nntp.el, - lisp/nnoo.el, lisp/nnml.el, lisp/nndraft.el, lisp/nnbabyl.el, - lisp/message.el, lisp/gnus.el, lisp/gnus-xmas.el, lisp/gnus-uu.el, - lisp/gnus-util.el, lisp/gnus-sum.el, lisp/gnus-start.el, - lisp/gnus-spec.el, lisp/gnus-soup.el, lisp/gnus-score.el, - lisp/gnus-msg.el, lisp/gnus-gl.el, lisp/gnus-ems.el, - lisp/gnus-draft.el, lisp/gnus-cache.el, lisp/gnus-audio.el, - lisp/gnus-art.el, lisp/gnus-agent.el, lisp/ChangeLog: Quassia Gnus - v0.15. - - * lisp/message.el, lisp/ChangeLog: sync with qgnus-0.14. - - * texi/Makefile, texi/gnus.texi: Quassia Gnus v0.14. - - * texi/dir: New file. - - * texi/dir, lisp/pop3.el, lisp/nntp.el, lisp/nnml.el, - lisp/nnmail.el, lisp/nnfolder.el, lisp/message.el, lisp/lpath.el, - lisp/gnus.el, lisp/gnus-win.el, lisp/gnus-util.el, - lisp/gnus-topic.el, lisp/gnus-sum.el, lisp/gnus-start.el, - lisp/gnus-score.el, lisp/gnus-msg.el, lisp/gnus-mh.el, - lisp/gnus-cus.el, lisp/gnus-art.el, lisp/gnus-agent.el, - lisp/ChangeLog: Quassia Gnus v0.14. - - * lisp/message.el, lisp/ChangeLog: sync with qgnus-0.13. - - * texi/gnus.texi, texi/ChangeLog, lisp/pop3.el, lisp/nnweb.el, - lisp/nnmail.el: Quassia Gnus v0.13. - - * lisp/nnlistserv.el: New file. - - * lisp/nnlistserv.el, lisp/message.el, lisp/md5.el, lisp/lpath.el, - lisp/gnus.el, lisp/gnus-topic.el, lisp/gnus-sum.el, - lisp/gnus-score.el, lisp/gnus-picon.el, lisp/gnus-msg.el, - lisp/gnus-group.el, lisp/gnus-art.el, lisp/gnus-agent.el, - lisp/dgnushack.el, lisp/ChangeLog, GNUS-NEWS: Quassia Gnus v0.13. - - * lisp/message.el: sync with qgnus-0.12. - - * texi/message.texi, texi/gnus.texi, texi/gnus-faq.texi, - texi/ChangeLog, lisp/nntp.el, lisp/nnmh.el, lisp/nnmail.el, - lisp/nndraft.el, lisp/messcompat.el, lisp/message.el, - lisp/gnus.el, lisp/gnus-xmas.el, lisp/gnus-uu.el, - lisp/gnus-sum.el, lisp/gnus-score.el, lisp/gnus-salt.el, - lisp/gnus-msg.el, lisp/gnus-int.el, lisp/gnus-group.el, - lisp/gnus-demon.el, lisp/gnus-cache.el, lisp/gnus-art.el, - lisp/gnus-agent.el, lisp/ChangeLog, GNUS-NEWS: Quassia Gnus v0.12. - - * lisp/message.el (message-send-news-function): Use - `message-send-news-with-gnus' in default. - (message-send-via-news): Use `message-send-news' instead of - `message-send-news-function'. - (message-send-mail): Don't avoid text properties; run - `message-encode-mail-hook'. - (message-send-news): Don't avoid text properties; run - `message-encode-news-hook'; use `message-send-news-function'. - (message-send-news-with-gnus): New function. - (message-cancel-news): Use `message-send-news' instead of - `message-send-news-function'. diff --git a/ChangeLog.2 b/ChangeLog.2 deleted file mode 100644 index 616c7b3..0000000 --- a/ChangeLog.2 +++ /dev/null @@ -1,620 +0,0 @@ -1999-08-03 NAKAJI Hiroyuki - - * Makefile.in (clean): Exec make clean in both lisp and texi - subdirectories. - (distclean): Use $(MAKE), not `make'. - -1999-08-03 Katsumi Yamaoka - - * message.el (TopLevel): Autoload "mu-cite" for the function - `mu-cite-original' instead of the function `mu-cite/cite-original'. - (message-cite-function): Replace `mu-cite/cite-original' with - `mu-cite-original'. - -1999-08-02 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 06. - - * lisp/Makefile.in (distclean): Remove dgnuspath.el instead of - paths.el. - (install): Don't install dgnuspath.el; don't touch the installed - files. - -1999-08-01 YAMAMOTO Kouji - - * lisp/nnmail.el (nnmail-split-it): Don't compare ".*" and VALUE - of each element of `nnmail-split-fancy' if the length of VALUE is - less than 2. - -1999-07-30 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 05. - -1999-07-30 NAKAJI Hiroyuki - - * lisp/Makefile.in (install): install *.el files too. - to avoid warning about el is newer than elc, exec touch - $(lispdir)/*.elc. - -1999-07-29 Yoshiki Hayashi - - * texi/gnus-ja.texi: Sync up with pGnus 0.95. - -1999-07-28 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 04. - - * lisp/gnus-cite.el (gnus-ems-redefine): Don't replace the function - `gnus-cite-add-face' with `gnus-mule-cite-add-face' because the - former will work well under old Emacsen by now. - (gnus-mule-cite-add-face): Abolish function. - -1999-07-27 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 03. - - * texi/Makefile.in (prefix): Define it first. - - * lisp/dgnuspath.el.in: Rename from paths.el. - - * lisp/dgnushack.el (dgnushack-install-package): Don't install - dgnuspath.el nor dgnuspath.elc. - (dgnushack-make-package): Don't enter dgnuspath.el nor - dgnuspath.elc to MANIFEST file. - (dgnushack-compile): Don't compile dgnuspath.el. - (TopLevel): Use `expand-file-name' for the file "./dgnuspath.el"; - use dgnuspath.el instead of paths.el. - - * lisp/Makefile.in (PACKAGEDIR): Default to @PACKAGEDIR@. - - * configure.in (AC_OUTPUT): Use dgnuspath.el instead of paths.el. - (TopLevel): Add options `--with-xemacs' and `--with-packagedir'. - (ADDITIONAL_LOAD_PATH): Default to empty string. - - * configure: Regenerate. - - * README.T-gnus: Update for the new features. - - * Makefile.in (PACKAGEDIR): Default to @PACKAGEDIR@. - (XEMACS): Default to @XEMACS@. - -1999-07-26 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 02. - - * lisp/dgnushack.el: Load ./paths.el. - - * lisp/paths.el.in: New file. - - * lisp/Makefile.in (distclean): Remove paths.el. - - * Mule23@1934: Update for the new configure usage. - - * configure: Regenerate. - -1999-07-22 TSUCHIYA Masatoshi - - * configure.in: Add an option `--with-addpath' to specify load-path. - - * aclocal.m4: New implementation. - - * acinclude.m4: New file. - -1999-07-20 Tsukamoto Tetsuo - - * lisp/gnus.el (gnus-revision-number): Increment to 01. - - * lisp/gnus-ofsetup.el (gnus-ofsetup-prepare-for-miee, - gnus-ofsetup-write-setting-file): New functions. - (gnus-setup-for-offline): Use them. - (gnus-ofsetup-parameters, gnus-ofsetup-customize, - gnus-ofsetup-customize-done): New functions for customization - support. - - * lisp/gnus-offline.el (gnus-offline-version-number): Update to - 2.20. - (gnus-offline-define-menu-on-miee, - gnus-offline-define-menu-on-agent): Add a menu item which calls - `gnus-ofsetup-customize'. - -1999-07-11 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.11.08. - (gnus-revision-number): Fresh start from 00. - - * texi/{gnus.texi,gnus-ja.texi,ChangeLog}: Update for T-gnus - 6.11.08. - - * lisp{pop3.el,nnmh.el,nnfolder.el,mm-util.el,mm-encode.el, - mm-decode.el,message.el,mail-source.el,gnus-util.el,gnus-topic.el, - gnus-sum.el,gnus-mlspl.el,gnus-mailcap.el,gnus-group.el, - gnus-cus.el,gnus-art.el,ChangeLog}: Sync up with Pterodactyl Gnus - v0.95. - - * README.T-gnus: Update for T-gnus 6.11.08. - -1999-07-08 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 01. - - * lisp/nnheader.el (make-full-mail-header-from-decoded-header): Add - `extra' as a luna-class. - (make-full-mail-header): Ditto. - (nnheader-decode-field-body): Redefine as a regular function. - (mail-header-set-extra): Alias to - `mime-gnus-entity-set-extra-internal'. - (mail-header-extra): Alias to `mime-gnus-entity-extra-internal'. - - * lisp/mmgnus.el (TopLevel): Add definition of `extra' as a - luna-class. - - * lisp/gnus-sum.el (gnus-summary-from-or-to-or-newsgroups): Bind - the value of `default-mime-charset' to its local value in - `gnus-summary-buffer'; don't bind `mail-parse-charset' and - `mail-parse-ignored-charsets'. - (gnus-decode-encoded-word-function): New variable. - -1999-07-07 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.11.07. - - * texi/{gnus.texi,gnus-ja.texi,ChangeLog}: Sync up with Pterodactyl - Gnus v0.93. - - * lisp/{pop3.el,nnmail.el,mml.el,mm-view.el,mm-uu.el,mm-util.el, - mm-decode.el,message.el,gnus-util.el,gnus-sum.el,gnus-start.el, - gnus-srvr.el,gnus-score.el,gnus-mlspl.el,gnus-art.el,gnus-agent.el, - ChangeLog}: Sync up with Pterodactyl Gnus v0.93. - - * README.T-gnus: Update for T-gnus 6.11.07. - -1999-07-06 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.11.06. - (gnus-revision-number): Fresh start from 00. - - * texi/{gnus-ja.texi,gnus.texi,emacs-mime.texi,ChangeLog}: Sync up - with Pterodactyl Gnus v0.92. - - * lisp/gnus-mlspl.el: New file copied from Pterodactyl Gnus v0.92. - - * lisp/{nntp.el,nnmail.el,nnfolder.el,nndraft.el,nndoc.el,mml.el, - mm-view.el,mm-util.el,mm-decode.el,message.el,gnus-xmas.el, - gnus-util.el,gnus-sum.el,gnus-start.el,gnus-mailcap.el, - gnus-group.el,gnus-art.el,gnus-agent.el,Makefile.in,ChangeLog}: - Sync up with Pterodactyl Gnus v0.92. - - * README.T-gnus: Update for T-gnus 6.11.06. - -1999-07-06 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 01. - - * lisp/gnus-util.el (gnus-point-at-eol, gnus-point-at-bol): Use - `static-cond'. NOTE: It requires APEL 9.20 or later. - -1999-07-05 Tsukamoto Tetsuo - - * lisp/gnus-agent.el (gnus-agent-expire): Refresh the value of - `gnus-active-hashtb' for each method. - -1999-07-05 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.11.05. - (gnus-revision-number): Fresh start from 00. - - * texi/gnus-ja.texi (Mail in a Newsreader): Translate into Japanese. - - * README.T-gnus: Update for T-gnus 6.11.05. - - * lisp/nnmbox.el (nnmbox-save-buffer): Bind `output-coding-system' - instead of `coding-system-for-write' Under Mule 2. - - * lisp/nnmbox.el (nnmbox-active-file-coding-system, - nnmbox-file-coding-system): Default to `raw-text-dos' or 'raw-text'. - * lisp/nnfolder.el (nnfolder-file-coding-system, - nnfolder-active-file-coding-system): Ditto. - - * lisp/mm-view.el (TopLevel): Don't bind vars `w3-meta-*'. - - * lisp/gnus-util.el (gnus-write-active-file): Abolish function. - (gnus-write-active-file-as-coding-system): New function. - - * lisp/gnus-cache.el (gnus-cache-write-active): Use - `gnus-write-active-file-as-coding-system' instead of - `gnus-write-active-file'. - * lisp/gnus-agent.el (gnus-agent-expire, gnus-agent-write-active): - Ditto. - - * lisp/gnus-agent.el (gnus-agent-expire, gnus-agent-write-active, - gnus-agent-save-active-1): Use - `insert-file-contents-as-coding-system' instead of - `insert-file-contents-literally' or `insert-file-contents'. - -1999-07-05 Katsumi Yamaoka - - * texi/{emacs-mime.texi,ChangeLog}: Sync up with Pterodactyl Gnus - v0.91. - * lisp/{smiley.el,rfc2047.el,qp.el,nnml.el,nnmbox.el,nnmail.el, - nnheader.el,nnfolder.el,mml.el,mm-view.el,mm-uu.el,mm-util.el, - mm-encode.el,mm-decode.el,message.el,lpath.el,gnus-util.el, - gnus-sum.el,gnus-start.el,gnus-srvr.el,gnus-msg.el,gnus-mailcap.el, - gnus-cache.el,gnus-art.el,gnus-agent.el,base64.el}: Ditto. - * GNUS-NEWS: Ditto. - -1999-07-04 Yoshiki Hayashi - - * texi/{gnusref-ja.tex,refcard-ja.tex}: Update to the version 5.5. - -1999-07-04 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 03. - -1999-07-04 Tsukamoto Tetsuo - - * lisp/gnus-sum.el (gnus-get-newsgroup-headers): Don't bind the - value of `mail-parse-ignored-charsets' if its local value in - `gnus-summary-buffer' is nil. - -1999-07-02 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 02. - (gnus-other-frame): Use `static-if'. - (TopLevel): Require `static'. - - * lisp/score-mode.el (score-mode-coding-system): Use `static-if'. - (TopLevel): Require `static'. - - * lisp/gnus-util.el (gnus-point-at-eol, gnus-point-at-bol): Use - `static-cond' if it exists. NOTE: It should be simplified in the - future. - - * lisp/gnus-start.el (gnus-startup-file-coding-system): Use - `static-if'. - (TopLevel): Require `static'. - - * lisp/gnus-art.el (gnus-article-display-x-face-with-x-face-mule): - Abolish function. - - * lisp/dgnushack.el (dgnushack-make-package): Suppress verbose - messages while generating auto-autoloads.el. - (TopLevel): Set coding priority of Shift-JIS to the bottom. - -1999-06-30 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 01. - - * lisp/message.el (message-pop-to-buffer-1): New macro. - (message-pop-to-buffer): Use it. - (message-delete-frame): Use `static-if'. - (TopLevel): Autoload "mu-cite". - (message-cite-function): Add `mu-cite/cite-original'. - - * lisp/dgnushack.el (TopLevel): Bind functions defined by - `defun-maybe' for all Emacsen. - - * lisp/Makefile.in (clean): Fix typo. - - * Makefile.in (elclean): Remove auto-autoloads.el and - custom-load.el as well. - -1999-06-28 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.11.04. - (gnus-revision-number): Fresh start from 00. - - * configure: Regenerate. - - * lisp/mm-view.el (TopLevel): Define `gnus-article-mime-handles' - for avoiding byte compile warning. - - * lisp/{rfc2047.el,nnmail.el,mml.el,mm-view.el,mm-util.el, - mm-bodies.el,message.el,mail-prsvr.el,gnus-xmas.el,gnus-sum.el, - gnus-start.el,gnus-draft.el,gnus-cus.el,gnus-cache.el,gnus-art.el, - ChangeLog}: Sync up with Pterodactyl Gnus v0.89. - * aclocal.m4: Ditto. - - * README.T-gnus: Update for T-gnus 6.11.04. - -1999-06-24 Katsumi Yamaoka - - * Mule23@1934: New file. - -1999-06-23 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 06. - - * lisp/gnus-sum.el (gnus-articles-to-read): Use - `read-from-minibuffer' with specifying the input position instead - of the use of `read-string' with modifying `minibuffer-setup-hook'. - Exceptionally, don't specify the input position under Emacs 19 or - earlier against the mysterious bug. [cf. ] - (TopLevel): Require `static'. - -1999-06-22 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 05. - -1999-06-22 NAKAJI Hiroyuki - - * texi/Makefile.in (distclean, veryclean): Use `clean' instead of - `make clean'. - (complete, tmps, latexboth, psout, pss, latexps): Use `$(MAKE)' - instead of `make'. - (TopLevel): Use `@SET_MAKE@'. - - * lisp/Makefile.in (distclean): New target. - (clean): Renamed from `distclean'; don't remove Makefile. - - * Makefile.in (distclean): Use `clean' instead of `make clean'. - (x, osome): Use `$(MAKE)' instead of `make'. - (elclean): Use the arg `-f'. - (clean): Remove MANIFEST.*. - -1999-06-22 Katsumi Yamaoka - - * lisp/gnus-sum.el (gnus-dont-select-after-jump-to-other-group): - New user option. - (gnus-summary-jump-to-other-group): Use it. - - * lisp/gnus-cite.el (gnus-cite-add-face): Add check for Emacs 21 or - later. - -1999-06-21 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 04. - - * lisp/gnus-cite.el (gnus-cite-add-face): Use `move-to-column' - statically to skip the prefix string under Emacs 20.2 or earlier. - (TopLevel): Require `static'. - - * lisp/gnus-msg.el (gnus-extended-version): Move - `gnus-revision-number' to the last. - -1999-06-21 Daiji KANEMATSU - - * lisp/gnus-sum.el (gnus-summary-jump-to-other-group): Call - `gnus-summary-read-group' with the 3rd arg T. - -1999-06-21 NAKAJI Hiroyuki - - * texi/Makefile.in (clean): Remove gnus.info*, gnus-ja.info*, - message.info*, message-ja.info*, *.texi_ and emacs-mime.info. - - * lisp/Makefile.in (distclean): Remove auto-autoload.el and - custom-load.el. - -1999-06-18 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 03. - - * lisp/gnus-sum.el (gnus-summary-mark-article): Call - `gnus-cache-possibly-enter-article' with the arg `headers'. - (gnus-summary-mark-article-as-unread): Ditto. - (gnus-summary-move-article): Ditto. - - * lisp/gnus-cache.el (gnus-cache-update-article): Call - `gnus-cache-possibly-enter-article' with the arg `headers'. - (gnus-cache-enter-article): Ditto. - (gnus-cache-possibly-enter-article): Accept parameter `headers'. - -1999-06-17 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 02. - - * lisp/gnus-sum.el (gnus-summary-jump-to-other-group): Rewrite as - an independent function. - (gnus-summary-read-group): Revert to the previous form. - - * lisp/gnus-msg.el (gnus-extended-version): Include - `gnus-revision-number' if it is non-zero. - -1999-06-16 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 01. - (TopLevel): Autoload "gnus-sum" for the command - `gnus-summary-jump-to-other-group'. - - * lisp/gnus-art.el (gnus-article-read-summary-keys): Add key "ZJ" - to the list `nosaves'; convert key events to string statically - under XEmacs. - (gnus-article-display-x-face-with-x-face-mule): Use `gnus-xemacs' - instead of `featurep' with an arg `xemacs'. - (article-toggle-headers): Ditto. - (TopLevel): Require `static'. - - * lisp/gnus-sum.el (gnus-summary-exit-map): New keystroke "ZJ" for - the command `gnus-summary-jump-to-other-group'. - -1999-06-16 Katsumi Yamaoka - Daiji KANEMATSU - - * lisp/gnus-sum.el (gnus-summary-read-group): Allow it to be an - user command. - (gnus-summary-jump-to-other-group): Defalias to - `gnus-summary-read-group'. - -1999-06-15 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.11.03. - (gnus-revision-number): Fresh start from 00. - - * lisp/{gnus-sum.el,nnmail.el,ChangeLog}: Sync up with Pterodactyl - Gnus v0.88. - - * README.T-gnus: Update for T-gnus 6.11.03. - -1999-06-14 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 01. - - * lisp/message.el (message-send-news): Don't generate the Lines - field; don't make `tembuf' as unmodified. - (message-send-mail): Ditto. - -1999-06-14 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.11.02. - - * lisp/{mail-source.el,gnus-sum.el,gnus-art.el}: Sync up with - Pterodactyl Gnus v0.87. - - * text/gnus-ja.text (Troubleshooting): Make the return value of - `gnus-version' ambiguous. - - * lisp/message.el (message-send-news): Make `tembuf' as unmodified - after inserting a text from `message-encoding-buffer'. - (message-send-mail): Ditto. - -1999-06-14 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.11.01. - (gnus-revision-number): Fresh start from 00. - - * lisp/mm-view.el (TopLevel): Avoid byte compile warnings for the - use of old W3. - - * lisp/dgnushack.el (TopLevel): Bind `:file' for old Emacsen. - - * texi/{gnus.texi,gnus-ja.texi,ChangeLog}: Sync up with Pterodactyl - Gnus v0.86. - * lisp/{nnmail.el,nnheader.el,nndoc.el,mml.el,mm-view.el, - mm-decode.el,mm-bodies.el,message.el,mail-source.el,lpath.el, - gnus.el,gnus-xmas.el,gnus-uu.el,gnus-util.el,gnus-sum.el, - gnus-start.el,gnus-score.el,gnus-range.el,gnus-msg.el, - gnus-mailcap.el,gnus-group.el,gnus-cus.el,gnus-cite.el, - gnus-cache.el,gnus-art.el,gnus-agent.el,ChangeLog}: Ditto. - - * etc/gnus/x-splash: New file copied from pgnus 0.86. - -1999-06-12 Daiki Ueno - - * lisp/gnus-msg.el (gnus-copy-article-buffer): Bind - `inhibit-read-only' to t during modifying the destination buffer. - -1999-06-11 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 02. - - * sample.lpath.el: New file. It is supposed to be used for telling - old Emacsen where EMU, APEL or CUSTOM packages have already - installed. - - * lisp/score-mode.el (score-mode-coding-system): Default to - `*ctext*' under Mule 2. - - * lisp/nnmail.el (nnmail-save-active): Bind `output-coding-system' - to the value of `nnmail-active-file-coding-system'. - - * lisp/message.el (message-set-auto-save-file-name): Use - `set-file-coding-system' statically under Mule 2. - (message-do-fcc): Bind `output-coding-system' to `raw-text'. - (message-draft-coding-system): Default to `*junet*' under Mule 2. - (TopLevel): Require `static'. - - * lisp/gnus-util.el (gnus-point-at-eol): Defun statically for the - various Emacsen. - (gnus-point-at-bol): Ditto. - (TopLevel): Require `static'. - - * lisp/gnus-start.el (gnus-startup-file-coding-system): Default to - `*ctext*' under Mule 2. - - * lisp/gnus-msg.el (gnus-inews-do-gcc): Bind `output-coding-system' - to `raw-text'. - - * lisp/gnus-ems.el (language-info-alist): Defvar-maybe for old - Emacsen. - (current-language-environment): Ditto. - (set-language-info): Defun-maybe for old Emacsen. - (get-language-info): Ditto. - (assoc-ignore-case): Ditto. - - * lisp/gnus-cite.el (gnus-cite-parse): Bind `mc-flag' to nil. - - * lisp/dgnushack.el (TopLevel): Define some unknown functions for - avoiding byte compile warnings. - (TopLevel): Require `emu' for picking up some macros, bind some - colon keywords, bind functions defined by `defun-maybe', bind - defcustom'ed variables and optimize byte code for `char-after' and - `char-before' for old Emacsen. - (TopLevel): Attempt to load ~/.lpath.el. - - * configure: Regenerate by autoconf 2.14.1. - -1999-06-11 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 01. - - * lisp/gnus-art.el (gnus-article-display-x-face-with-x-face-mule): - Warn if it is used with X-Face-Mule 0.25 or later. Note that it - should be abolished in the future. - -1999-06-08 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version): Modify for SEMI 1.13, FLIM 1.13. - (gnus-revision-number): Fresh start from 00. - (gnus-version-number): Update to 6.11.0. - (gnus-product-name): Rename to ET-gnus. E is short for Experimental. - - * lisp/gnus-sum.el (gnus-summary-reselect-current-group): Rescan - the current newsgroup before exiting. - - * lisp/gnus-art.el (gnus-article-prepare-display): Change - representation-type of `mime-message-structure'. - - * ChangeLog: New file. - * ChangeLog.1: Renamed from ChangeLog. - -1999-06-01 MORIOKA Tomohiko - - * lisp/gnus-score.el (gnus-header-index): Use - `luna-class-slot-index' and `luna-find-class' to get index number - for an entity. - -1999-05-31 MORIOKA Tomohiko - - * lisp/nnheader.el: Require `mmgnus'. - (mail-header-subject): Now an alias for - `mime-gnus-entity-subject-internal'. - (mail-header-set-subject): Now an alias for - `mime-gnus-entity-set-subject-internal)'. - (mail-header-from): Now an alias for - `mime-gnus-entity-from-internal'. - (mail-header-set-from): Now an alias for - `mime-gnus-entity-set-from-internal'. - (mail-header-date): Now an alias for - `mime-gnus-entity-date-internal'. - (mail-header-set-date): Now an alias for - `mime-gnus-entity-set-date-internal'. - (mail-header-message-id): Now an alias for - `mime-gnus-entity-id-internal'. - (mail-header-id): Likewise. - (mail-header-set-message-id): Now an alias for - `mime-gnus-entity-set-id-internal'. - (mail-header-set-id): Likewise. - (mail-header-references): Now an alias for - `mime-gnus-entity-references-internal'. - (mail-header-set-references): Now an alias for - `mime-gnus-entity-set-references-internal'. - (mail-header-chars): Now an alias for - `mime-gnus-entity-chars-internal. - (mail-header-set-chars): Now an alias for - `mime-gnus-entity-set-chars-internal. - (mail-header-lines): Now an alias for - `mime-gnus-entity-lines-internal'. - (mail-header-set-lines): Now an alias for - `mime-gnus-entity-set-lines-internal'. - (mail-header-xref): Now an alias for - `mime-gnus-entity-xref-internal'. - (mail-header-set-xref): Now an alias for - `mime-gnus-entity-set-xref-internal'. - (make-full-mail-header): New implementation [use - `luna-make-entity']. - (make-full-mail-header-from-decoded-header): Likewise. - - * lisp/mmgnus.el (mime-gnus-entity): New definition of luna-class. - (mime-entity-buffer): Abolished. - (initialize-instance): New method. - -See ChangeLog.1 for earlier changes. diff --git a/ChangeLog.3 b/ChangeLog.3 deleted file mode 100644 index 6859e0f..0000000 --- a/ChangeLog.3 +++ /dev/null @@ -1,2916 +0,0 @@ -2000-12-06 Katsumi Yamaoka - - * lisp/nnshimbun.el (TopLevel): Defalias `coding-system-category' - to `get-code-mnemonic' for Mule. - (TopLevel): Make codesys `euc-japan' and `shift_jis' for Mule. - (nnshimbun-type-definition): Use `static-if' to determine codesys. - (TopLevel): Require `static'. - -2000-12-06 TSUCHIYA Masatoshi - - * lisp/nnshimbun.el (nnshimbun-retrieve-url): coding detection is - improved. - (nnshimbun-meta-content-type-charset-regexp): New constant. - (nnshimbun-meta-charset-content-type-regexp): Ditto. - -2000-12-03 Tetsuo Tsukamoto - - * texi/gnus-ja.texi: Fixes for the last modification. - -2000-12-02 Tetsuo Tsukamoto - - * texi/gnus-ja.texi: Translate description about - `nnmail-split-fancy-with-parent'. - - * texi/message-ja.texi: Use two lines for direntry. - -2000-12-01 Katsumi Yamaoka - - * lisp/dgnushack.el: Attempt to add another FLIM path to `load-path' - if the module `mel' does not found. This procedure may be needed - when recent FLIM 1.14 is used under old Emacsen. - -2000-11-27 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 08. - - * lisp/message.el (message-send-mail-with-smtp): Leave the error - handling in `smtp-send-buffer's own care. - -2000-11-22 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 07. - - * lisp/gnus.el: Add autoloads for x-face-e21. - - * lisp/gnus-sum.el (gnus-summary-search-article-position-point): - Search for `x-face-image' as well as `x-face-mule-bitmap-image'. - - * lisp/gnus-art.el (gnus-article-x-face-command): Default to - `x-face-decode-message-header' when Emacs 21 is running and - x-face-e21 is installed. - -2000-11-21 Katsumi Yamaoka - - * lisp/message.el (message-send-mail-with-smtp): Use - `smtp-send-buffer' if it exists instead of `smtp-via-smtp'. - - * lisp/dgnushack.el (describe-key-briefly): New compiler macro for - old Emacsen. - -2000-11-17 Akihiro Arisawa - - * lisp/nnheader.el (nnheader-header-value): Save point. - -2000-11-16 Katsuhiro Hermit Endo - - * texi/gnus-ja.texi (Drafts): Fix typo. - -2000-11-14 Katsumi Yamaoka - - * lisp/gnus-art.el (article-verify-x-pgp-sig): Autoload "mm-uu". - (gnus-treat-x-pgp-sig): Default to nil. - -2000-11-10 Katsumi Yamaoka - - * Mule23@1934.en, Mule23@1934.ja, sample.lpath.el: Upgrade. - - * configure: Regenerate. - * aclocal.m4 (AC_PATH_PACKAGEDIR): No need to quote a string for - `AC_MSG_RESULT'. - (AC_CHECK_W3): Ignore cache; no need to quote a string for - `AC_MSG_RESULT'. - (AC_CHECK_EMACS_FLAVOR): Ignore cache. - (AC_CHECK_EMACS): Ignore cache. - (AC_DEFINE_GNUS_PRODUCT_NAME): Cache. - -2000-11-09 Katsumi Yamaoka - - * configure: Regenerate. - - * aclocal.m4 (AC_CHECK_W3): Substitute `W3' with empty string - instead of "no" if it is not acceptable. - - * lisp/dgnushack.el: Load dgnuspath.el and ~/.lpath.el just before - path-util is loaded. - (dgnushack-compile): Show `load-path'. - (dgnushack-w3-dir): Ignore the env var W3DIR if it is empty. - - * lisp/lpath.el: Move out `load-path' modification for APEL, FLIM - and SEMI to dgnushack.el. - * lisp/dgnushack.el: Move here. - - * lisp/lpath.el (md5): Don't bind. - (url-insert-file-contents): Fbind for FSF Emacsen. - -2000-11-08 Katsumi Yamaoka - - * texi/Makefile.in (install-ja-info): Specify `EMACS' and - `infodir'. - (install-info): Ditto. - (install-ja): Ditto. - - * lisp/lpath.el (md5): Fbind using `maybe-fbind'. - - * lisp/dgnushack.el (dgnushack-compose-package): Remove function. - (dgnushack-install-package-info-ja): Remove function. - (dgnushack-install-package-info): Remove function. - (dgnushack-install-package-lick): Remove function. - (dgnushack-install-package-pkginfo): Remove function. - (dgnushack-install-package-info-files): Remove function. - (dgnushack-install-package-manifest): New function. - (dgnushack-remove-extra-files-in-package): New function. - (dgnushack-gnus-product-name): Remove function. - (dgnushack-examine-package-dir): Remove function. - (dgnushack-exporting-files): Rename from `dgnushack-exported-files'. - (dgnushack-unexporting-files): Rename from - `dgnushack-unexported-files'; attempt to fix `load-path' for W3 and - retry to load `w3-forms' if it is failed. - (dgnushack-w3-dir): New variable. - - * lisp/Makefile.in (remove-extra-files-in-package): New target. - (install-package-manifest): New target. - (install-package-info-ja): Remove target. - (install-package-info): Remove target. - (install-package-lick): Remove target. - (install-lisp): New target detached from `install'. - (install): Call `clever' and `install-lisp'. - (EXPORTING_FILES, GNUS_PRODUCT_NAME): New variables. - - * configure: Regenerate. - - * aclocal.m4 (AC_PATH_PACKAGEDIR): Examine `PACKAGEDIR' if it is - not specified under XEmacs. - (AC_EXAMINE_PACKAGEDIR): New function. - (AC_PATH_LISPDIR): Don't say annotations about install-package if - FSFmacs is used. - (AC_DEFINE_GNUS_PRODUCT_NAME): Add substitution for - `GNUS_PRODUCT_NAME'. - - * Makefile.in (remove-extra-files-in-package): New target. - (install-package-manifest): New target. - (install-package-info-ja): Examine `PACKAGEDIR' if it is not - specified; call install-ja-info in texi/Makefile. - (install-package-info): Examine `PACKAGEDIR' if it is not - specified; call install-info in texi/Makefile. - (install-package-lisp): Rename from `install-package-lick'; examine - `PACKAGEDIR' if it is not specified; call `install-lisp' in - lisp/Makefile. - (install-package-ja): Call `xlick', `compose-package', - `remove-extra-files-in-package', `install-package-lisp', - `install-package-info', `install-package-info-ja' and - `install-package-manifest'. - (install-package): Call `xlick', `compose-package', - `remove-extra-files-in-package', `install-package-lisp', - `install-package-info' and `install-package-manifest'. - (install-info-ja, install-info): Specify `infodir'. - (EXAMINE_PACKAGEDIR, GNUS_PRODUCT_NAME, infodir): New variables. - -2000-11-07 Tetsuo Tsukamoto - - * texi/gnus-ja.texi: Do not use characters other than ascii ones - for direntries. - * texi/message-ja.texi: Ditto. - -2000-11-06 Katsumi Yamaoka - - * lisp/Makefile.in (install): Don't check for the file names. - -2000-11-04 Katsuhiro Hermit Endo - - * lisp/gnus-topic.el (gnus-group-topic-map): Define "T" prefix - command in `gnus-topic-mode-map' instead of `gnus-group-mode-map'. - -2000-10-25 Katsuhiro Hermit Endo - - * lisp/gnus-topic.el (gnus-topic-rename): Use current topic as - initial value for read-string. - -2000-11-06 Katsumi Yamaoka - - * lisp/Makefile.in (install): Use the lisp function - `dgnushack-exported-files'. - - * lisp/nnmail.el (nnmail-pathname-coding-system): Default to - `binary'. - * lisp/nnheader.el (nnheader-pathname-coding-system): Ditto. - - * lisp/message.el (message-get-reply-headers): Remove useless - `concat'. - - * lisp/md5.el: Restore the file. - - * lisp/dgnushack.el (dgnushack-compile): Refer to the constant - `dgnushack-exported-files'. - (dgnushack-exported-files): New function. - (dgnushack-exported-files): New constant. - (dgnushack-unexported-files): Add some files. - (dgnushack-tool-files): Remove, merge it into - `dgnushack-unexported-files'. - - * lisp/base64.el: New file -- base64 encoding functions using MEL. - -2000-11-05 Tetsuo Tsukamoto - - * lisp/smiley.el (smiley-deformed-regexp-alist): Modify regexp for - the winking face. - -2000-11-02 Katsumi Yamaoka - - * lisp/dgnushack.el (dgnushack-make-manifest): Fix info directory. - -2000-11-02 Katsumi Yamaoka - - * Makefile.in (install-package-ja): Compile and install lisp files - first. - (install-package): Ditto. - (compose-package, install-package-info-ja, install-package-info, - install-package-lick): New sub targets. - - * lisp/Makefile.in (install-package-info-ja, install-package-info, - install-package-lick): New targets. - (compose-package): Rename from `package'. - (install-package): Remove. - - * lisp/dgnushack.el (dgnushack-install-package-info-ja, - dgnushack-install-package-info, dgnushack-install-package-lick, - dgnushack-install-package-pkginfo, - dgnushack-install-package-info-files, dgnushack-make-manifest, - dgnushack-gnus-product-name, dgnushack-examine-package-dir, - dgnushack-make-autoloads): New functions. - (dgnushack-install-package): Remove. - (dgnushack-compose-package): Rename from `dgnushack-make-package'. - (dgnushack-info-file-regexp-ja, dgnushack-info-file-regexp-en): - Split from `dgnushack-info-file-regexp'. - (dgnushack-texi-file-regexp): Remove. - -2000-11-01 Katsumi Yamaoka - - * lisp/dgnushack.el (dgnushack-texi-format): Remove @ignore'd areas - before processing. - -2000-11-01 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 06. - - * lisp/gnus.el (gnus-product-variable-file-list): Check for - `emacs-version' in the file "cache" as well. - * lisp/gnus-start.el (gnus-product-read-variable-file-1): Make it - talkative. - -2000-10-31 Katsumi Yamaoka - - * lisp/dgnushack.el: Bind `:key-type' and `:value-type' for old - Emacsen. - -2000-10-31 TAKAHASHI Kaoru - - * lisp/ptexinfmt.el (texinfo-format-direntry): Fixed broken - direntry generate probrem. - (Advised by Tetsuo Tsukamoto ) - -2000-10-31 Katsumi Yamaoka - - * lisp/gnus-sum.el (gnus-summary-insert-line): Work with quoted - double-quote characters. - (gnus-summary-prepare-threads): Ditto. - -2000-10-30 TAKAHASHI Kaoru - - * lisp/ptexinfmt.el (ptexinfmt-disable-broken-notice-flag): Renamed - from `ptexinfmt-disable-broken-notice'. - -2000-10-27 TAKAHASHI Kaoru - - * lisp/ptexinfmt.el (texinfo-format-printindex): Mule for Windows - detection fixed. - -2000-10-26 Katsumi Yamaoka - - * lisp/gnus.el (gnus-group-startup-message): Rewrite for Emacs 21. - * lisp/lpath.el: Fbind `propertize'. - -2000-10-22 Katsuhiro Hermit Endo - - * texi/gnus-ja.texi (Changing Servers): Fix typo. - -2000-10-19 TSUCHIYA Masatoshi - - * lisp/nnshimbun.el (nnshimbun-netbsd-get-headers): Fix regular - expression to extract xover urls. - -2000-10-12 Jesper Harder - - * make.bat: Makes it possible to generate the Info files on - windows again. - -2000-10-11 Katsumi Yamaoka - - * Makefile.in (info-ja, xinfo-ja): No need to use `MAKEINFO=no'. - (install-info-ja, install-info, install-lisp, install-ja): New - targets (possibly for FSF Emacsen). - - * texi/Makefile.in (install-ja-info, install-info, install-ja, - %-ja.info, %-ja): New targets. - - * texi/message-ja.texi (direntry): Replace "message" with - "message-ja". - -2000-10-08 TSUCHIYA Masatoshi - - * lisp/nnshimbun.el (nnshimbun-type-definition): Fix regular - expression to extract article body from `ZDNet'. - -2000-10-06 Katsumi Yamaoka - - * lisp/imap.el: Require `base64' instead of to autoload it. - -2000-10-05 Katsumi Yamaoka - - * lisp/gnus-xmas.el (gnus-xmas-group-startup-message): Don't use - `gnus-point-at-eol'. - * lisp/gnus.el (gnus-group-startup-message): Ditto. - - * lisp/gnus-ems.el (gnus-ems-redefine): Revive annulling of - `gnus-summary-set-display-table'. - -2000-10-04 Akihiro Arisawa - - * lisp/gnus-sum.el (gnus-build-sparse-threads): Use - `make-full-mail-header-from-decoded-header' instead of - `make-full-mail-header'. - -2000-10-03 Katsumi Yamaoka - - * lisp/gnus-group.el (gnus-group-get-new-news): Update modeline - using `gnus-agent-toggle-plugged' if agent is activated. - * lisp/gnus-agent.el (gnus-group-get-new-news): Don't advise it, - merge it into gnus-group.el instead. - - * lisp/gnus-offline.el (gnus-offline-after-jobs-done): Use `ding' - with `play-sound-file' for XEmacs statically. - - * lisp/gnus-art.el (gnus-article-add-button): Quote - `:button-keymap' for Mule 2.3 but it won't work. - -2000-09-29 Katsumi Yamaoka - - * lisp/message.el (message-ignored-supersedes-headers): Synch with - Gnus. - -2000-09-27 TAKAHASHI Kaoru - - * list/ptexinfmt.el (texinfo-multitable-widths): Fix - broken-facility probrem when use multitable unsupported - texinfmt.el. - -2000-09-26 TAKAHASHI Kaoru - - * lisp/ptexinfmt.el (texinfo-format-printindex): Use (featurep - 'meadow) instead of `texinfmt-version'. - -2000-09-25 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 05. - - * texi/gnus-faq-ja.texi, lisp/gnus.el, README.semi.ja, README.semi, - README: Replace "" with - "". - -2000-09-22 TAKAHASHI Kaoru - - * lisp/ptexinfmt.el (texinfo-format-printindex): Add - broken-facility check, for Mule for Windows. - (texinfo-format-printindex): New function. - -2000-09-19 Katsumi Yamaoka - - * lisp/gnus-msg.el (gnus-copy-article-buffer): Encode bitmap - smileys to ordinary text before removing any text properties. It - is synchronized with the latest smiley-mule.el. - -2000-09-19 TSUCHIYA Masatoshi - - * lisp/nnshimbun.el (nnshimbun-type-definition): Follow URL change - of `ZDNet'. - -2000-09-15 Daiki Ueno - - * lisp/gnus-art.el: Always require `wid-edit'. - -2000-09-14 Katsumi Yamaoka - - * lisp/dgnushack.el (dgnushack-compile): Don't compile gnus-ml.el - when FSFmacs is running. - - * lisp/gnus-ml.el: Bind some undeclared variables. - - * lisp/gnus-art.el (gnus-article-add-button): Add widget button. - (gnus-article-display-mime-message): Don't set - `mime-button-mother-dispatcher'. - - * lisp/message.el: Require `reporter' for the function - `define-mail-user-agent' when Mule 2.3 is running. - -2000-09-07 Tadashi Watanabe - - * lisp/smiley.el (smiley-buffer, smiley-create-glyph): Work with - GTK XEmacs as well. - -2000-09-06 TSUCHIYA Masatoshi - - * lisp/nnshimbun.el (nnshimbun-header-xref): New function. - (nnshimbun-insert-header): Use `nnshimbun-header-xref', instead of - `mail-header-xref'. - (nnshimbun-make-mhonarc-contents): Took a measure against - unexpected TAB characters. - -2000-09-05 TSUCHIYA Masatoshi - - * lisp/nnshimbun.el: Add `netbsd' support. - (nnshimbun-nov-fix-header): Change a form storing Message-Id. - (nnshimbun-search-id): Ditto. - (nnshimbun-make-mhonarc-contents): Use optional header - information. - -2000-09-05 Daiki Ueno - - * lisp/pop3.el (pop3-quit): Don't clear `pop3-uidl-obarray'. - (pop3-save-uidls): Clear `pop3-uidl-obarray' here. - -2000-09-04 Daiki Ueno - - * lisp/mail-source.el (pop3-leave-mail-on-server): Declare. - (mail-source-keyword-map): New keyword `:leave' for pop. - (mail-source-fetch-pop): Refer it. - - * lisp/pop3.el (pop3-ssl-program-name): New variable. - -2000-08-31 TAKAHASHI Kaoru - - * lisp/ptexinfmt.el (texinfo-multitable-widths, - texinfo-multitable-item): Apply char-width probrem fix patch - (by KOIE Hidetaka ). - Newsgroups: fj.editor.emacs - Message-ID: <5dzom3nxq7.fsf@skipjack.koie.org> - - * lisp/ptexinfmt.el (ptexinfmt-disable-broken-notice): New - variable. - -2000-08-29 TSUCHIYA Masatoshi - - * lisp/nnshimbun.el (nnshimbun-zdnet-get-headers): Follow changes - of ZDNet. - -2000-08-25 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 04. - -2000-08-25 Yagi Tatsuya - Katsumi Yamaoka - - * lisp/nntp.el (nntp-list-options, nntp-options-subscribe, - nntp-options-not-subscribe): New server variables. - (nntp-request-list): Use them. - * texi/gnus.texi, texi/gnus-ja.texi: Update for them. - -2000-08-23 Katsumi Yamaoka - - * lisp/gnus.el (gnus-group-startup-message): Use `image-size' to - simplify the program. - - * lisp/gnus-group.el (gnus-group-rename-group): Inhibit renaming of - zombie or killed groups. - -2000-08-21 Katsumi Yamaoka - - * lisp/nnheader.el (nnheader-replace-chars-in-string): Use - `static-if'. - * lisp/message.el (message-replace-chars-in-string): Ditto. - -2000-08-19 TSUCHIYA Masatoshi - - * lisp/nnshimbun.el (nnshimbun-type-definition): Follow changes of - ZDNet. - (nnshimbun-make-text-or-html-contents): Ditto. - (nnshimbun-make-html-contents): Ditto. - -2000-08-18 TSUCHIYA Masatoshi - Akihiro Arisawa - - * lisp/nnshimbun.el: Add `mew' and `xemacs' support. - -2000-08-17 Katsumi Yamaoka - - * lisp/dgnushack.el (dgnushack-texi-format): Require `ptexinfmt' - instead of `texinfmt'. - (dgnushack-install-package): Don't install ptexinfmt.el. - (dgnushack-make-package): Don't include ptexinfmt.el in MANIFEST. - (dgnushack-compile): Don't compile dgnushack.el nor ptexinfmt.el. - (dgnushack-unexported-files, dgnushack-tool-files): New constants. - - * lisp/Makefile.in (install-package): No need to remove - dgnushack.elc. - (install): Don't install ptexinfmt.el; no need to remove - dgnushack.elc. - - * lisp/ptexinfmt.el: New file imported from Wanderlust. - -2000-08-09 Katsumi Yamaoka - - * lisp/nntp.el (nntp-open-telnet): Wait for the telnet prompt - before sending a command; allow the rtelnet prompt as well. - - * lisp/message.el (message-make-forward-subject): Remove garbage - line. - -2000-08-01 Katsumi Yamaoka - - * configure: Regenerate. - * aclocal.m4 (AC_CHECK_EMACS): Unset `EMACS' environment variable - if it is `t'. - -2000-07-24 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 03. - - * configure: Regenerate with autoconf v2.14.1. - - * configure.in: Rewrite for using new macros in aclocal.m4. - - * aclocal.m4: (AC_ADD_LOAD_PATH, AC_PATH_PACKAGEDIR, - AC_CHECK_EMACS, AC_DEFINE_GNUS_PRODUCT_NAME): New macros. - (AC_PATH_LISPDIR): Set `lispdir' to ".../site-lisp/t-gnus" by - default. - (AC_CHECK_EMACS_FLAVOR): Rename from `AC_XEMACS_P'; check for - `MULE' as well. - (AM_PATH_LISPDIR): Remove. - - * acinclude.m4: Remove. - - * lisp/dgnushack.el: Don't add "/usr/share/emacs/site-lisp" to - `load-path'. - - * lisp/gnus-ems.el (gnus-ems-redefine): Defalias - `gnus-summary-set-display-table' to `(lambda ())' instead of - `ignore' (don't synch. with Gnus). - -2000-07-21 Daiki Ueno - - * lisp/gnus-bbdb.el (gnus-bbdb/update-record): Use - mime-entity-fetch-field instead of mail-header-from. - -2000-07-18 Daiki Ueno - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 02. - - * lisp/gnus-bbdb.el (gnus-bbdb/update-record): Don't refer - gnus-original-article-buffer. - (gnus-bbdb-insinuate): Set gnus-article-display-hook instead of - gnus-article-prepare-hook. - (gnus-bbdb/extract-field-value): Use mime-entity-fetch-field - instead of mail-fetch-field. - (gnus-bbdb/extract-field-value-init): Just return extractor. - -2000-07-15 Daiki Ueno - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 01. - - * README-gnus-bbdb.{ja|en}: Add example setting about - gnus-bbdb-insinuate-message. - (bbdb-auto-notes-hook): Don't use pop. - - * lisp/gnus-bbdb.el: Check defvaralias when compiling. - - * lisp/gnus-art.el (gnus-article-setup-buffer): Set - gnus-original-article-buffer as unibyte. - (gnus-request-article-this-buffer): Ditto. - - * lisp/nnimap.el (nnimap-callback): Don't use nnimap-demule. - (nnimap-request-article-part): Ditto. - - * lisp/imap.el (imap-open): Set process buffer as unibyte. - -2000-07-13 10:09:52 Katsumi Yamaoka - - * acinclude.m4 (AC_CHECK_W3): Fix typo. - -2000-07-13 Katsumi Yamaoka - - * configure: Regenerate with autoconf v2.14.1. - * aclocal.m4: Regenerate with aclocal v1.4. - - * configure.in: Don't call `AC_CHECK_PROG' for `EMACS'. - - * acinclude.m4: Merge ShengHuo's changes. - (AC_CHECK_W3): Use `quote' instead of '. - (AC_XEMACS_P): Don't modify the value of `XEMACS'. - (AC_EMACS_LISP): Safely quote the elisp form. - -2000-07-12 15:47:06 ShengHuo ZHU - - * aclocal.m4: Stolen macros from w3. - * configure.in: Use them. - * configure: Generate it. - -2000-07-03 Katsumi Yamaoka - - * lisp/gnus-vers.el (T-gnus): Update to 6.14.5. - (gnus-revision-number): Clear to 00. - - * README.T-gnus: Update. - - * lisp/{webmail.el,rfc2047.el,qp.el,pop3.el,nnwarchive.el, - nnsoup.el,nnslashdot.el,nnml.el,nnmh.el,nnmbox.el,nnmail.el, - nnimap.el,nnheader.el,nnfolder.el,nndraft.el,nndoc.el,mml.el, - mm-view.el,mm-uu.el,mm-util.el,mm-decode.el,mm-bodies.el, - message.el,mail-source.el,lpath.el,imap.el,gnus.el,gnus-uu.el, - gnus-util.el,gnus-topic.el,gnus-sum.el,gnus-start.el,gnus-srvr.el, - gnus-soup.el,gnus-score.el,gnus-msg.el,gnus-mailcap.el, - gnus-group.el,gnus-ems.el,gnus-demon.el,gnus-cus.el,gnus-art.el, - gnus-agent.el,ChangeLog}: Sync up with Gnus v5.8.7. - - * texi/{message.texi,gnus.texi,gnus-ja.texi,ChangeLog}: Sync up - with Gnus v5.8.7. - - * contrib/rfc2015.el: New file. - -2000-06-27 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 04. - - * lisp/gnus-sum.el (gnus-mime-extract-message/rfc822): Use - `mime-insert-entity-content' instead of obsolete functions. - -2000-06-13 Hirokazu FUKUI - - * lisp/gnus-bbdb.el(gnus-bbdb/update-record): Fix to fetch last - mail field. - -2000-06-09 Katsumi Yamaoka - - * lisp/gnus.el (gnus-news-group-p): Sync with Gnus. - (gnus-select-method): Remove "*" from doc string. - (gnus-group-startup-message): Use `dino' colors. - -2000-06-08 Katsumi Yamaoka - - * lisp/message.el (message-fix-before-sending): Expose all - invisible text with the property `message-invisible'; don't expose - invisible X-Face fields; widen at first. - (message-invisible-region): New function, substitute for - `invisible-region'. - (message-send): Call `message-fix-before-sending' after evaluating - `message-send-hook'. - (message-check-ignore-invisible-x-face-field): Remove. You can use - (add-hook 'message-send-hook 'x-face-xmas-remove-x-face-glyph) - instead. - -2000-06-06 Katsumi Yamaoka - - * lisp/message.el (message-save-drafts): Rewrite. - - * lisp/nnheader.el (nnheader-text-coding-system-for-write, - nnheader-text-coding-system): New variables, substitutes for - `mm-text-coding-system-for-write' or `mm-text-coding-system'. - - * lisp/nnmbox.el (nnmbox-active-file-coding-system, - nnmbox-file-coding-system): Use `nnheader-text-coding-system'. - * lisp/nnmail.el (nnmail-incoming-coding-system): Ditto. - * lisp/nnfolder.el (nnfolder-file-coding-system): Ditto. - (nnfolder-active-file-coding-system): Ditto. - - * lisp/mail-source.el (mail-source-text-coding-system): Remove. - (TopLevel): require `nnheader'. - - * lisp/nndraft.el (nndraft-request-article): Bind coding system to - `nnheader-text-coding-system'. - (nndraft-request-replace-article): Ditto. - * lisp/mail-source.el (mail-source-fetch-maildir): Ditto. - * lisp/gnus-uu.el (gnus-uu-save-article): Ditto. - * lisp/gnus-util.el (gnus-output-to-mail, gnus-output-to-rmail): - Ditto. - * lisp/gnus-soup.el (gnus-soup-write-prefixes): Ditto. - - * lisp/gnus-util.el (gnus-write-buffer): Bind - `file-name-coding-system' to `nnmail-pathname-coding-system'. - * lisp/gnus-start.el (gnus-slave-save-newsrc): Bind coding system - to `gnus-startup-file-coding-system'. - -2000-06-06 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 03. - - * lisp/message.el (message-fix-before-sending): Don't check for - invisible X-Face fields if - `message-check-ignore-invisible-x-face-field' is non-nil. - (message-send): Call `message-fix-before-sending' before encoding. - (message-check-ignore-invisible-x-face-field): New user option. - -2000-06-01 KANEMATSU Daiji - - * texi/gnus-ja.texi (gnus-summary-hide-all-threads): Fix typo. - -2000-05-28 TSUCHIYA Masatoshi - - * nnshimbun.el (nnshimbun-request-article-1): Fix to insert x-face - unless SERVER. - (nnshimbun-asahi-get-headers): Fix for subjects which contain ^M. - -2000-05-26 TSUCHIYA Masatoshi - - * lisp/nnshimbun.el (nnshimbun-write-nov): New function. - (nnshimbun-close-group): Call nnshimbun-write-nov. - (nnshimbun-generate-nov-database): Ditto. - (nnshimbun-generate-nov-for-each-group): Fix bug which occur new - entries add NOV database. - (nnshimbun-generate-nov-for-all-groups): Ditto. - (nnshimbun-search-id): Add argument to return header, and modify - for search of original message id. - (nnshimbun-nov-fix-header): New function. - (nnshimbun-make-date-string): Fix for a two-digit year. - -2000-05-26 Katsumi Yamaoka - - * lisp/nnshimbun.el (nnshimbun-make-html-contents): Show X-Face. - (nnshimbun-make-text-or-html-contents): Ditto. - (nnshimbun-request-article-1): Ditto. - (nnshimbun-x-face-alist): New variable. - -2000-05-25 Tanaka Akira - - * README.semi, README.semi.ja: Update for CVS via SSH. - -2000-05-25 Katsumi Yamaoka - - * texi/gnus-ja.texi: Change coding-system to `iso-2022-7bit-ss2'. - * texi/TRANSLATION.ja: Replace CRLF with LF. - -2000-05-25 Keiichi Suzuki - - * lisp/nnshimbun.el (nnshimbun-fill-line): Use - `nnshimbun-fill-column' instead of `fill-column'. - -2000-05-25 TSUCHIYA Masatoshi - - * lisp/nnshimbun.el: Clean up codes. - - * lisp/gnus-group.el (gnus-group-make-shimbun-group): Follow - changes in nnshimbun.el. - * texi/gnus-ja.texi (nnshimbun): Ditto. - -2000-05-24 TSUCHIYA Masatoshi - - * lisp/nnshimbun.el: Add `ZDNet Japan', `Yomiuri', and `Wired - News' support. - (nnshimbun-regexp-opt): New function. - (nnshimbun-wired-get-all-headers): Replace regexp-opt with - nnshimbun-regexp-opt. - -2000-05-24 Katsumi Yamaoka - - * lisp/gnus-group.el (gnus-group-make-shimbun-group): Complete - completions. - -2000-05-24 TSUCHIYA Masatoshi - - * lisp/nnshimbun.el: Add `CNET Japan' support. - (nnshimbun-make-date-string): New function. - (nnshimbun-asahi-get-headers): Use nnshimbun-make-date-string. - (nnshimbun-sponichi-get-headers): Ditto. - -2000-05-24 TSUCHIYA Masatoshi - - * lisp/nnshimbun.el (nnshimbun-retrieve-url): Add argument to - ignore w3's cache. - -2000-05-24 Katsumi Yamaoka - - * lisp/gnus-group.el (gnus-group-make-shimbun-group): Add - completion to the shimbun address; delete empty strings from - `gnus-group-shimbun-type-history' and - `gnus-group-shimbun-address-history'. - - * lisp/nnshimbun.el (nnshimbun-asahi-get-headers): Don't use - `timezone'. - (nnshimbun-type-definition): Add address. - -2000-05-23 Tatsuya Ichikawa - - * lisp/nnshimbun.el: Add `sponichi' support. - -2000-05-23 KOSEKI Yoshinori - - * lisp/nnshimbun.el (nnshimbun-mime-encode-string): Fix wrong - close brackets. - -2000-05-23 TSUCHIYA Masatoshi - - * lisp/nnshimbun.el: Change coding-system. - -2000-05-21 TSUCHIYA Masatoshi - - * texi/gnus-ja.texi (nnshimbun): Add description. - -2000-05-21 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 02. - - * lisp/dgnushack.el (dgnushack-texi-format): Fix last change. - -2000-05-21 TSUCHIYA Masatoshi - - * lisp/nnshimbun.el: New backend. - - * lisp/gnus-group.el (gnus-group-make-shimbun-group): New command. - -2000-05-17 Kenichi OKADA - - * lisp/imap.el (imap-digest-md5-auth): Rewrite for the use of - `sasl-digest-md5-digest-response' instead of - `digest-md5-digest-response'. - (TopLevel): Require `sasl' when compiling instead of `digest-md5'; - don't autoload "digest-md5". - -2000-05-17 Katsumi Yamaoka - - * lisp/nndraft.el (nndraft-request-replace-article): Replace - `mm-text-coding-system' with `mail-source-text-coding-system'; - Replace `mm-auto-save-coding-system' with - `message-draft-coding-system'. - - * lisp/mail-source.el (mail-source-fetch-maildir): Replace - `mm-text-coding-system' with `mail-source-text-coding-system'. - (mail-source-text-coding-system): New variable. - - * lisp/dgnushack.el (dgnushack-texi-format): Use - `output-coding-system' instead of `coding-system-for-write' when - old Mule is used. - -2000-05-16 Katsumi Yamaoka - - * lisp/message.el (message-forward) Replace the use of `eolp' with - `bolp' for detecting the start of the line. - (message-indent-citation): Ditto. - -2000-05-10 Daiki Ueno - - * lisp/gnus-bbdb.el (gnus-bbdb/pop-up-bbdb-buffer): Don't bind - `bbdb-use-pop-up' while executing `bbdb-pop-up-bbdb-buffer'. - -2000-05-10 Katsumi Yamaoka - - * lisp/gnus-msg.el (gnus-debug): Break MIME tags from the snoopies. - (gnus-bug): Insert text/plain tag at the end of the buffer. - -2000-05-10 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 01. - -2000-05-10 Keiichi Suzuki - - * lisp/message.el (message-list-references): Do not insert - duplicate Message-Id, when specified - `message-list-references-add-position'. - - * lisp/gnus-bbdb.el (gnus-bbdb/split-mail): Support group address. - (gnus-bbdb/insert-address-regexp): New function. - -2000-05-09 Katsumi Yamaoka - - * lisp/gnus-msg.el (gnus-debug): Add "nntp.el" and `defvoo'. - -2000-05-08 Katsumi Yamaoka - - * lisp/gnus-vers.el (T-gnus): Update to 6.14.4. - - * README.T-gnus: Update. - - * lisp/{webmail.el,rfc2047.el,nnmbox.el,nndoc.el,mml.el,mm-view.el, - mm-partial.el,mm-decode.el,mm-bodies.el,message.el,lpath.el, - gnus.el,gnus-vers.el,gnus-util.el,gnus-start.el,gnus-score.el, - gnus-msg.el,gnus-mailcap.el,gnus-ems.el,gnus-draft.el,gnus-art.el, - ChangeLog}: Sync up with Gnus v5.8.6. - * texi/{postamble.tex,message.texi,message-ja.texi,gnusref.tex, - gnus.texi,gnus-ja.texi,emacs-mime.texi,Makefile.in,ChangeLog}: Sync - up with Gnus v5.8.6. - -2000-04-28 Katsumi Yamaoka - - * texi/gnus.texi, texi/gnus-ja.texi, texi/gnus-faq-ja.texi, README: - You might be able to use T-gnus with the versions of XEmacs prior - to 21.1.1. - - * contrib/timer.el: New file. Imported from fsf-compat-1.07-pkg. - -2000-04-27 Katsumi Yamaoka - - * lisp/mm-view.el (gnus-article-mime-handles): Don't bind it. - - * lisp/gnus-sum.el (gnus-article-mime-handles): Restore from Gnus. - (gnus-article-decoded-p): Ditto. - - * lisp/gnus-art.el (gnus-article-mime-handles): Don't bind it. - (gnus-article-decoded-p): Ditto. - -2000-04-25 NAKAJI Hiroyuki - - * lisp/dgnushack.el: Add code to avoid mule-2.3@19.34 failing to - make info from texi. Thanks to Hayashi-san. - -2000-04-25 Katsumi Yamaoka - - * lisp/dgnushack.el (union, member-if, mapcon, last): Remove - compiler macros. - -2000-04-24 Katsumi Yamaoka - - * lisp/gnus-vers.el (T-gnus): Update to 6.14.3. - - * README.T-gnus: Update. - - * GNUS-NEWS: Sync up with Gnus v5.8.5. - * lisp/{webmail.el,utf7.el,time-date.el,smiley.el,rfc2047.el, - rfc1843.el,qp.el,pop3.el,parse-time.el,nnweb.el,nnwarchive.el, - nnvirtual.el,nnultimate.el,nntp.el,nnspool.el,nnslashdot.el, - nnml.el,nnmail.el,nnimap.el,nnheader.el,nnfolder.el,nndraft.el, - nndoc.el,nnagent.el,mml.el,mm-view.el,mm-uu.el,mm-util.el, - mm-encode.el,mm-decode.el,mm-bodies.el,message.el,mail-source.el, - mail-prsvr.el,mail-parse.el,lpath.el,imap.el,ietf-drums.el,gnus.el, - gnus-xmas.el,gnus-win.el,gnus-uu.el,gnus-util.el,gnus-topic.el, - gnus-sum.el,gnus-start.el,gnus-srvr.el,gnus-spec.el,gnus-score.el, - gnus-msg.el,gnus-move.el,gnus-mlspl.el,gnus-mh.el,gnus-mailcap.el, - gnus-logic.el,gnus-kill.el,gnus-int.el,gnus-group.el,gnus-ems.el, - gnus-eform.el,gnus-dup.el,gnus-draft.el,gnus-cite.el,gnus-cache.el, - gnus-bcklg.el,gnus-async.el,gnus-art.el,gnus-agent.el, - format-spec.el,flow-fill.el,fill-flowed.el,dgnushack.el,ChangeLog}: - Sync up with Gnus v5.8.5. - * texi/{refcard.tex,gnusref.tex,gnus.texi,gnus-ja.texi, - gnus-faq-ja.texi,Makefile.in,ChangeLog}: Sync up with Gnus v5.8.5. - - * README: Requires XEmacs 21.1.1 and later. - * texi/{gnus.texi, gnus-faq-ja.texi}: Ditto. - -2000-04-20 Katsumi Yamaoka - - * lisp/gnus-vers.el (T-gnus): Update to 6.14.2. - (gnus-revision-number): Clear to 00. - - * README.T-gnus: Update. - - * lisp/{webmail.el,utf7.el,time-date.el,rfc2047.el,qp.el,pop3.el, - parse-time.el,nnweb.el,nnwarchive.el,nnultimate.el,nntp.el, - nnslashdot.el,nnml.el,nnmail.el,nnimap.el,nnheader.el,nnfolder.el, - mm-view.el,mm-util.el,mm-decode.el,mm-bodies.el,message.el, - mail-source.el,mail-parse.el,lpath.el,imap.el,ietf-drums.el, - gnus.el,gnus-win.el,gnus-vers.el,gnus-uu.el,gnus-topic.el, - gnus-sum.el,gnus-start.el,gnus-srvr.el,gnus-mailcap.el, - gnus-group.el,gnus-cus.el,gnus-art.el,gnus-agent.el,base64.el, - ChangeLog}: Sync up with Gnus v5.8.4. - - * lisp/fill-flowed.el: New file. - - * texi/{gnus.texi,gnus-ja.texi,ChangeLog}: Sync up with Gnus v5.8.4. - - * contrib/{vcard.el,one-line-cookie.diff,README}: New files. - -2000-04-14 Katsumi Yamaoka - - * lisp/gnus-msg.el (gnus-summary-yank-message): Rewrite for the use - of the separated message frames; use `gnus-copy-article-buffer'. - -2000-04-13 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 18. - (gnus-extended-version): Use `gnus-product-name' and - `gnus-version-number' instead of the use of `product-string'. - (gnus-version-number): Exclude `gnus-revision-number'. - (Defining product): Include `gnus-revision-number'. - (TopLevel): Require `poe' for the function `butlast'. - -2000-04-13 Keiichi Suzuki - - * lisp/gnus-spec.el (gnus-update-format): Fix a bug in last - modification. - (gnus-search-or-regist-spec): Change interface. - -2000-04-12 Katsumi Yamaoka - - * lisp/gnus-art.el (gnus-article-prev-page): Bind - `window-pixel-scroll-increment' to nil while scrolling for - canceling a backlash and a modeline erosion. It may work under - XEmacs 21.2.20 and later. - (gnus-article-next-page): Ditto. - -2000-04-12 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 17. - - * lisp/gnus-spec.el (gnus-format-specs-compiled): Fix doc string. - -2000-04-11 Keiichi Suzuki - - * lisp/gnus-start.el (gnus-product-variable-touch): Support multiple - arguments. - - * lisp/gnus-spec.el (gnus-search-or-regist-spec): New utility macro. - (gnus-update-format-specifications): Support new data structure of - `gnus-format-specs-compiled'. - (gnus-update-format-specification-1): Likewise. - (gnus-update-format): Support new data structure of - `gnus-format-specs'. - (gnus-format-specs): Modify data structure. - -2000-04-10 Daiki Ueno - - * lisp/imap.el (imap-body-lines): Check Content-Type: of the - article case insensitively. - -2000-04-07 Katsumi Yamaoka - - * lisp/message.el (message-cite-original): Use "unknown sender" if - from field does not exist in the yanked article. - -2000-04-06 Katsumi Yamaoka - - * lisp/message.el (message-cite-original): Extract from field for - the simple citation line. - -2000-03-21 Katsumi Yamaoka - - * lisp/nnimap.el (nnimap-request-article-part): Returns nil if the - article does not exist. - -2000-03-17 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 16. - - * lisp/nnweb.el (nnweb-fetch-url): Bind `input-coding-system' and - `output-coding-system' for Mule 2.3. - * lisp/mail-source.el (mail-source-fetch-imap): Ditto. - * lisp/imap.el (imap-ssl-open): Ditto. - * lisp/gnus-start.el (gnus-product-read-variable-file-1): Ditto. - -2000-03-17 Katsumi Yamaoka - - * lisp/gnus-start.el (gnus-re-read-newsrc-el-file): New function. - (gnus-read-newsrc-el-file): If it fails, attempt to re-read the - file using `gnus-re-read-newsrc-el-file'. In that case, the - compiled format specs in the file which may be created by the other - Gnusae should be ignored. - -2000-03-16 Katsumi Yamaoka - - * lisp/gnus.el (gnus-product-variable-file-list): Use `*ctext*' - when Mule 2.3 is running. - -2000-03-16 Katsumi Yamaoka - - * lisp/gnus-vers.el (gnus-revision-number): Increment to 15. - - * lisp/gnus.el (gnus-continuum-version): Remove. - (gnus-product-variable-file-list): Use `product-version' instead of - the constant values. - (TopLevel): Don't autoload "gnus-msg" for the function - `gnus-extended-version'. - (gnus-version): Move to gnus-vers.el. - (gnus-version): Ditto. - (gnus-version-number): Ditto. - (gnus-product-name): Ditto. - (gnus-original-product-name): Ditto. - (running-pterodactyl-gnus-0_73-or-later): Ditto. - (gnus-original-version-number): Ditto. - (gnus-revision-number): Ditto. - - * lisp/gnus-vers.el (gnus-extended-version): Move from gnus-msg.el. - (gnus-version): Move from gnus.el. - (gnus-version): Ditto. - (gnus-version-number): Ditto. - (gnus-product-name): Ditto. - (gnus-original-product-name): Ditto. - (running-pterodactyl-gnus-0_73-or-later): Ditto. - (gnus-original-version-number): Ditto. - (gnus-revision-number): Ditto. - - * lisp/gnus-start.el (gnus-product-quick-file-format): Use - `gnus-vers' instead of `gnus' for the product. - (gnus-product-save-variable-file-1): Message an absolute file name; - use `save-buffer-as-coding-system'; use `gnus-vers' instead of - `gnus' for the product. - (gnus-convert-old-ticks): Remove. - (gnus-convert-old-newsrc): Remove. - (gnus-read-newsrc-file): Don't call `gnus-read-newsrc-file'. - - * lisp/gnus-spec.el (gnus-compile): Modify for the new form of - `gnus-format-specs-compiled'. - (gnus-update-format-specifications): Specify the arg `format' for - `gnus-update-format-specification-1'. - (gnus-update-format-specification-1): Modify for the new form of - `gnus-format-specs-compiled'; add a new arg `format'. - (gnus-format-specs-compiled): Allow the plural compiled functions - for each element. - - * lisp/gnus-msg.el (gnus-extended-version): Move to gnus-vers.el. - -2000-03-14 Keiichi Suzuki - - NOTE: It requires `product' in APEL 10.0 or later. - Will be created ``~/News/.T-gnus/'' directory automatically by - default. You can customize location by `gnus-product-directory'. - ``cache'' and ``strict-cache'' files will be created under the - directory. - - * lisp/gnus.el (TopLevel): Require `gnus-vers'. - (gnus-product-name): Abolished. - (gnus-version-number): Ditto. - (gnus-version): Use `product-string'. (Format changed) - (gnus-variable-list): Delete `gnus-format-specs'. - (gnus-product-variable-file-list): New variable. - (TopLevel): Use `product-provide'. - - * lisp/gnus-vers.el: New file. - - * lisp/gnus-start.el (gnus-product-directory): New user option. - (gnus-clear-quick-file-variables): New function. - (gnus-clear-system): Use `gnus-clear-quick-file-variables'. - (gnus-read-newsrc-file): Likewise. - (gnus-read-newsrc-el-file): Read product's variable files. - (gnus-product-read-variable-file-1): New function. - (gnus-save-newsrc-file): Save product's variable files. - (gnus-product-variable-touch): New function. - (gnus-product-variables-dirty-p): Ditto. - (gnus-product-save-variable-file): Ditto. - (gnus-product-save-variable-file-1): Ditto. - (gnus-product-quick-file-format): Ditto. - - * lisp/gnus-spec.el (gnus-update-format): Use - `gnus-product-variable-touch'. - (gnus-update-format-specification-1): Likewise. - (gnus-update-format-specifications): Do not check `emacs-version' - and `gnus-newsrc-file-version'. Use - `gnus-product-variable-touch'. - - * lisp/gnus-msg.el (gnus-inews-add-send-actions): Use - `product-string'. - -2000-03-09 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 14. - (gnus-compile-user-specs): New user option. - - * texi/gnus.texi: Update. - * texi/gnus-ja.texi: Update. - - * lisp/gnus-start.el (gnus-setup-news): Revert. - (gnus-setup-news-hook): Revert. - - * lisp/gnus-spec.el (gnus-compile): Modify the actual format specs - as well; don't bind `gnus-tmp-func'. - (gnus-update-format-specifications): Revert; use - `gnus-update-format-specification-1'. - (gnus-update-format-specification-1): New function. - (gnus-format-specs-compiled): Modify the form. - (TopLevel): Require `alist'. - -2000-03-09 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 13. - - * texi/gnus.texi: Update. - * texi/gnus-ja.texi: Update. - - * lisp/gnus-start.el (gnus-setup-news): Update all format specs - just before `gnus-setup-news-hook' is evaluated. - (gnus-setup-news-hook): Default to `gnus-compile'. - - * lisp/gnus-spec.el (gnus-compile): Don't modify the value of - `gnus-format-specs', generate compiled specs in - `gnus-format-specs-compiled' instead; don't touch the dribble - buffer. - (gnus-update-format-specifications): Bind `gnus-format-specs' to - `gnus-format-specs-compiled' if the latter is non-nil; use - `gnus-update-format-specifications-1'. - (gnus-update-format-specifications-1): Rename from - `gnus-update-format-specifications'; update the value of - `gnus-newsrc-file-version' if the updating is forced. - (gnus-format-specs-compiled): New internal variable. - -2000-03-05 Keiichi Suzuki - - * lisp/gnus-spec.el (gnus-update-format-specifications): Force - update format specifications, when differ `gnus-version' and - `gnus-newsrc-file-version' instead of `gnus-version' and - `gnus-version' in `gnus-format-specs'. - Do not add `gnus-version' into `gnus-format-specs'. - -2000-03-04 Daiki Ueno - - * lisp/gnus-spec.el (gnus-compile): Remove gnus-version entry - from gnus-format-specs. - -2000-02-21 Yoshiki Hayashi - - * nnvirtual.el (nnvirtual-request-article): - Bind gnus-override-method to nil. - (nnvirtual-request-update-mark): Don't update mark when - article is not there. - -2000-03-03 Daiki Ueno - - * lisp/gnus.el (gnus-revision-number): Increment to 12. - - * lisp/gnus-sum.el: Add autoload setting for `pgg-decrypt-region' - and `pgg-verify-region'. - (gnus-summary-decrypt-article): New command. - (gnus-summary-verify-article): New command. - (gnus-summary-article-map): Bind them. - (gnus-wheel-summary-scroll): Fix paren style. - -2000-03-02 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 11. - -2000-03-01 MORIOKA Tomohiko - - * lisp/nnheader.el (nnheader-insert-nov): Use - `mime-entity-fetch-field' instead of `mime-fetch-field'. - - * lisp/gnus-sum.el (gnus-summary-line-format-alist): Use - `mime-entity-read-field' instead of `mime-read-field'. - (gnus-article-sort-by-author): Likewise. - -2000-03-02 Daiki Ueno - - * lisp/nnimap.el (nnimap-request-article-part): Don't use - `imap-capability' to detect BODYDETAIL response. - -2000-03-01 Daiki Ueno - - * lisp/gnus.el (gnus-revision-number): Increment to 10. - - * lisp/nnimap.el - (nnimap-request-article-part): Handle `BODY' fetch response when - the server implements IMAP4 rev1 capabilities. - (nnimap-request-article): Use BODY.PEEK rather than RFC822.PEEK. - this attribute was obsoleted in RFC2060. - (nnimap-request-body): Ditto. - -2000-02-29 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 09. - - * lisp/gnus-ems.el (gnus-tilde-cut-form, gnus-tilde-max-form): Copy - from gnus-xmas.el; share them with XEmacs-MULE. - - * lisp/gnus-xmas.el (gnus-tilde-cut-form, gnus-tilde-max-form): - Move to gnus-ems.el. - -2000-02-20 Daiki Ueno - - * lisp/gnus.el (gnus-revision-number): Increment to 08. - - * lisp/gnus-bbdb.el: Sync up with Nana-gnus 7 for supporting - `gnus-bbdb/split-mail'. - * README-gnus-bbdb.ja: Ditto. - -2000-02-08 Yoshiki Hayashi - - * gnus-art.el (article-display-face): Show folded X-Face. - -2000-02-08 Keiichi Suzuki - - * lisp/gnus.el (gnus-revision-number): Increment to 07. - - * lisp/nnmail.el (nnmail-get-new-mail): Do not check - `nnmail-spool-file'. - -2000-02-06 Daiki Ueno - - * lisp/gnus.el (gnus-revision-number): Increment to 06. - - * lisp/gnus-ofsetup.el: Provide `gnus-ofsetup'. - (gnus-setup-for-offline): Add `starttls' to IMAP streams; add - `digest-md5' to IMAP authenticators. - - * lisp/gnus-offline.el (gnus-group-get-new-news, - gnus-agent-toggle-plugged,gnus-agent-expire, - gnus-agent-mode): Check whether `gnus-ofsetup' is provided before - redefining. - - * lisp/imap.el (imap-stream-alist): Remove redundant entry for TLS. - - * lisp/nnimap.el (nnimap-retrieve-headers-progress): Remove - confusing tabs from original header. - -2000-02-02 Katsumi Yamaoka - - * lisp/pop3.el (pop3-md5): Fset to `md5' if the module `md5' is - installed. - (pop3-apop): Use built-in `md5' if it exists. - -2000-01-27 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 05. - - * lisp/gnus-art.el (gnus-treat-display-smileys): Check for the - module `gnus-bitmap' instead of `smiley-mule'. - - * lisp/gnus-sum.el (gnus-summary-exit): Recenter the group buffer - without redisplaying if the point is out of view. - -2000-01-25 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 04. - -2000-01-24 SANETO Takanori - - * lisp/gnus-spec.el: Call `gnus-ems-redefine'. - - * lisp/pop3.el (pop3-movemail): Don't use `format' for `message'. - * lisp/gnus-offline.el (gnus-offline-toggle-articles-to-fetch): - Ditto. - - * lisp/read-passwd.el (read-pw-read-noecho): Use "%s" for the 1st - arg of `message'. - * lisp/gnus.el (gnus-version): Ditto. - * lisp/gnus-sum.el (gnus-summary-simplify-subject-query): Ditto. - * lisp/gnus-offline.el (gnus-offline-set-interval-time, - gnus-offline-empting-spool, gnus-offline-toggle-on/off-send-mail, - gnus-offline-set-auto-ppp, gnus-offline-after-jobs-done, - gnus-offline-hangup-line, gnus-offline-get-new-news-function, - gnus-offline-connect-server): Ditto. - * lisp/dgnushack.el (dgnushack-make-package): Ditto. - -2000-01-18 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 03. - - * lisp/gnus-sum.el (gnus-summary-exit): Don't recenter the group - buffer if it is called non-interactively. - -2000-01-18 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 02. - - * lisp/gnus-sum.el (gnus-summary-exit): Recenter the group buffer - if the point is out of view. - -2000-01-15 Tsukamoto Tetsuo - - * lisp/gnus-art.el (gnus-article-next-page): Scroll up LINES if - `pos-visible-in-window-p' returns nil. - -2000-01-15 Tsukamoto Tetsuo - - * lisp/gnus-offline.el (gnus-agent-mode): New advice. - -2000-01-12 Hirokazu FUKUI - - * lisp/base64.el: Unbound base64-*-string and base64-*-region - when defined by autoload. - -2000-01-11 Katsumi Yamaoka - - * lisp/gnus-sum.el (gnus-summary-reselect-current-group): Restore - the original code; hide group contents while rescanning. - -2000-01-07 Katsumi Yamaoka - - * lisp/gnus-sum.el (gnus-summary-reselect-current-group): Truncate - lines in the imitation buffer; turn off h-scrollbar for XEmacs. - -2000-01-07 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 01. - - * lisp/{rfc2231.el,nnweb.el,nnultimate.el,nntp.el,nnspool.el, - nnslashdot.el,nnml.el,nnmh.el,nnkiboze.el,nnimap.el,gnus-topic.el, - gnus-ofsetup.el,gnus-offline.el,gnus-mlspl.el,gnus-cache.el, - gnus-agent.el}: Require `gnus-clfns' when compiling. - - * lisp/rfc2231.el: Require `cl' when compiling. - - * lisp/gnus-clfns.el: New file. - - * lisp/dgnushack.el: Move compiler macros to gnus-clfns.el; load - gnus-clfns.el. - - * lisp/gnus-sum.el (gnus-summary-reselect-current-group): Don't - rescan the current newsgroup before exiting; wear an imitation - summary buffer while rescanning. - -2000-01-06 Hirokazu FUKUI - - * lisp/dgnushack.el (char-before): Use the byte-optimaization. - -2000-01-05 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.14.1. - (gnus-revision-number): Clear to 00. - - * README.T-gnus: Update. - - * lisp/{webmail.el,uudecode.el,utf7.el,time-date.el,smiley.el, - score-mode.el,rfc2047.el,rfc1843.el,qp.el,pop3.el,parse-time.el, - nnweb.el,nnwarchive.el,nnvirtual.el,nnultimate.el,nntp.el, - nnspool.el,nnsoup.el,nnslashdot.el,nnml.el,nnmh.el,nnmbox.el, - nnmail.el,nnlistserv.el,nnkiboze.el,nnimap.el,nnheader.el, - nnfolder.el,nneething.el,nndraft.el,nndoc.el,nndb.el,nnbabyl.el, - nnagent.el,mml.el,mm-view.el,mm-uu.el,mm-util.el,mm-encode.el, - mm-decode.el,mm-bodies.el,messcompat.el,message.el,md5.el, - mail-source.el,mail-prsvr.el,lpath.el,imap.el,ietf-drums.el, - gnus-xmas.el,gnus-win.el,gnus-vm.el,gnus-uu.el,gnus-util.el, - gnus-undo.el,gnus-topic.el,gnus-sum.el,gnus-start.el,gnus-srvr.el, - gnus-spec.el,gnus-soup.el,gnus-setup.el,gnus-score.el,gnus-salt.el, - gnus-range.el,gnus-picon.el,gnus-nocem.el,gnus-msg.el, - gnus-mlspl.el,gnus-mh.el,gnus-mailcap.el,gnus-logic.el, - gnus-load.el,gnus-kill.el,gnus-group.el,gnus-gl.el,gnus-ems.el, - gnus-draft.el,gnus-demon.el,gnus-cus.el,gnus-cite.el,gnus-cache.el, - gnus-bcklg.el,gnus-audio.el,gnus-async.el,gnus-art.el, - gnus-agent.el,binhex.el,base64.el,ChangeLog}: Sync up with Gnus - v5.8.3. - - * texi/{postamble.tex,message.texi,gnus.texi,gnus-ja.texi, - emacs-mime.texi,ChangeLog}: Sync up with Gnus v5.8.3. - -2000-01-05 Katsumi Yamaoka - - * README.semi, README.semi.ja, texi/gnus-faq-ja.texi: Update for - the new CVS server. - - * lisp/gnus-sum.el (gnus-articles-to-read): Bind - `cursor-in-echo-area' to nil while `read-from-minibuffer'. - -1999-12-30 Tsukamoto Tetsuo - - * lisp/gnus-offline.el (TopLevel): Call - `define-process-argument-editiong' only under Meadow -- i.e. don't - call this function under NTEmacs. - -1999-12-28 Tsukamoto Tetsuo - - * lisp/gnus.el (gnus-revision-number): Increment to 15. - - * lisp/gnus-offline.el (gnus-offline-auto-expire): Rename from - `gnus-offline-agent-automatic-expire'. - (gnus-agent-expire): Fix the advice. - (gnus-offline-after-jobs-done): Refer to - `gnus-offline-auto-expire'. - - * lisp/gnus-ofsetup.el (gnus-offline-resource-en): Reorder the - messages. - (gnus-offline-resource-ja): Ditto. - - * lisp/imap.el (imap-ssl-open-2): If `system-type' is windows-nt, - bind `coding-system-for-read' to raw-text-dos, else bind it to - binary. - -1999-12-28 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 14. - - * lisp/dgnushack.el (mapcon): Bind the 1st arg `fn' as a temp var. - -1999-12-27 Tsukamoto Tetsuo - - * lisp/pop3.el (pop3-ssl-program-arguments): Add "s_client". - (pop3-open-ssl-stream-1): Bind `ssl-program-name' because its - value depends on the version of ssl.el. - (pop3-open-ssl-stream): If `system-type' is windows-nt, bind - `coding-system-for-read' to raw-text-dos, else bind it to binary. - -1999-12-23 Keiichi Suzuki - - * lisp/gnus-bbdb.el (gnus-bbdb/update-record): Fix timing of - `save-restriction'. - -1999-12-21 Daiki Ueno - - * lisp/imap.el (imap-streams,imap-stream-alist, - imap-authenticators,imap-authenticator-alist, - imap-digest-md5-p): Sync with latest Gnus. - (imap-starttls-p): Rename from `imap-tls-p'. - (imap-starttls-open): Rename from `imap-tls-open'. - -1999-12-21 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 13. - - * lisp/dgnuspath.el.in: Add the path of APEL to `load-path' as well - as its parent directory. - - * lisp/imap.el (base64-encode-string, base64-decode-string): - Autoload "base64" instead of the tricky definitions. - - * lisp/base64.el: Restore the original code and invalidate it; use - mel for the base64 codec. - -1999-12-20 Katsumi Yamaoka - - * lisp/imap.el (mel-find-function): Always require `mel' instead of - the use of autoloading. Because the function `mel-find-function' - is defined by `defsubst'. - -1999-12-18 Tsukamoto Tetsuo - - * lisp/gnus-offline.el (gnus-offline-after-get-new-news): Refer to - `gnus-offline-connected', not `gnus-plugged'. - - * lisp/gnus-ofsetup.el (gnus-setup-for-offline): No need to use - `unless'. Use `when'. - - * lisp/imap.el (base64-encode-string): Fix. May work. - -1999-12-16 Katsumi Yamaoka - - * lisp/message.el (message-goto-mail-copies-to): If the field is - newly created, a string "never" is inserted in default. - (message-goto-mail-followup-to): If the field is newly created and - To field contains only one address, the address is inserted in - default. - (message-mode-map): New key stroke `C-c C-f c' for the command - `message-goto-mail-copies-to'. - -1999-12-15 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 12. - - * lisp/nnimap.el (nnimap-request-newgroups): Use `member-if'. - - * lisp/lpath.el (toolbar-gnus, get-charset-property, - font-lock-set-defaults, find-coding-system, coding-system-get): - Bind them for FSF Emacsen. - (read-color, x-defined-colors, compute-motion): Don't bind. - - * lisp/imap.el (imap-digest-md5-auth, imap-cram-md5-auth): Use - `base64-encode-string' and `base64-decode-string' instead of - `imap-base64-encode-string' or `imap-base64-decode-string'. - (base64-encode-string): New function. It won't be defined if it - is already bound and the optional second arg is allowed. - (base64-decode-string): New function defined by `defun-maybe'. - (imap-base64-encode-string, imap-base64-decode-string): Remove. - (mel-find-function): Autoload "mel". - - * lisp/dgnushack.el (read-color, x-defined-colors, event-object, - get-popup-menu-response, toolbar-gnus, get-charset-property, - find-coding-system, coding-system-get, font-lock-set-defaults): - Don't bind. - (union, member-if, mapcon, mapc, last): Don't define as compiler - macros under XEmacs. It is based on Hrvoje's advice. - (member-if): New compiler macro for emulating cl function. - -1999-12-14 Katsumi Yamaoka - - * lisp/imap.el (imap-base64-encode-string): Use `static-if' instead - of `static-condition-case'. - -1999-12-14 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 11. - - * lisp/imap.el (imap-base64-encode-string): Allow the optional 2nd - arg `no-line-break'. - -1999-12-14 Daiki Ueno - - * lisp/imap.el: Require `digest-md5' when compiling; add autoload - settings for `digest-md5-parse-digest-challenge' and - `digest-md5-digest-response'. - (imap-authenticators): Add `digest-md5'. - (imap-authenticator-alist): Setup for `digest-md5'. - (imap-digest-md5-p): New function. - (imap-digest-md5-auth): New function. - -1999-12-12 Tsukamoto Tetsuo - - * lisp/mail-source.el (mail-source-fetch-imap): Each temporary - buffer name must be specific to its mail source. - -1999-12-11 Tsukamoto Tetsuo - - * lisp/gnus.el (gnus-revision-number): Increment to 10. - - * lisp/gnus-offline.el (gnus-offline-define-menu-and-key): Don't - call too many `static-if's. - - * lisp/gnus-uu.el (gnus-uu-grab-move): Simply copy FILE if - `make-symbolic-link' is not availabe. - - * lisp/lpath.el (TopLevel): Don't warn about `make-symbolic-link'. - -1999-12-11 Tsukamoto Tetsuo - - * lisp/gnus-offline.el (gnus-offline-set-unplugged-state): Call - the original `gnus-agent-toggle-plugged'. - - * lisp/mail-source.el (mail-source-fetch-imap): Don't create - multiple temporary buffers, and don't kill one. - -1999-12-10 Tsukamoto Tetsuo - - * lisp/gnus.el (gnus-revision-number): Increment to 09. - - * lisp/gnus-ofsetup.el (gnus-setup-for-offline): Accept an - optional argument `force'. Use `read-file-name' instead of - `read-directory-name'. - -1999-12-10 Tsukamoto Tetsuo - - * lisp/gnus.el (gnus-revision-numbser): Increment to 08. - - * lisp/gnus-agent.el (gnus): Give up to advise here. - (gnus-group-get-new-news): New advice instead. - - * lisp/gnus-offline.el (gnus-offline-setup): Call - `gnus-offline-processed-by-timer' and `gnus-offline-error-check' - here. - (gnus-offline-define-menu-and-key): Simplify. - (gnus-offline-processed-by-timer): Call `gnus-group-get-new-news' - interactively. - - * lisp/gnus-ofsetup.el (TopLevel): Require `read-passwd' here, not in - `gnus-offline-setting-file'. - (gnus-nntp-service): Set this variable here, not in - `gnus-offline-setting-file' - (gnus-nntp-server): Ditto. - (gnus-after-getting-new-news-hook): Ditto. - (message-send-hook): Ditto. - (mail-source-read-passwd): Ditto. - (gnus-setup-news-hook): Ditto. - (gnus-setup-for-offline): Now one can get mails from `imap', - `file', `directory' or `maildir'. - - * lisp/read-passwd.el (read-pw-set-mail-source-passwd-cache): - Ignore non-POP mail sources. - -1999-12-10 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 07. - - * lisp/gnus-util.el (gnus-union): Remove. - (gnus-ems-redefine): Don't call it; don't require `gnus-ems'. - - * lisp/gnus-agent.el (gnus-agent-fetch-headers): Use `union' - instead of `gnus-union'. - -1999-12-10 A.Hitachi - Katsumi Yamaoka - - * lisp/dgnushack.el (union): New compiler macro for emulating cl - function. - -1999-12-10 Katsumi Yamaoka - - * lisp/gnus-util.el: Require `gnus-ems'. - (gnus-ems-redefine): Call it to redefine the functions - `gnus-truncate-string', etc. - (gnus-union): Fix doc string. - - * lisp/dgnushack.el (mapcon, mapc): Eliminate the redundant code. - -1999-12-09 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 06. - -1999-12-09 Tsukamoto Tetsuo - - * lisp/dgnushack.el (dgnushack-install-package): Preserve any file - in $(PACKAGEDIR)/lisp/t-gnus if it is without .el or .elc suffix. - -1999-12-09 Katsumi Yamaoka - - * lisp/dgnushack.el (mapcon): New compiler macro for emulating cl - function. - (mapc): Bug fix - treat the last arg as a list. - -1999-12-08 Tsukamoto Tetsuo - - * lisp/gnus.el (gnus-revision-number): Increment to 05. - - * lisp/gnus-agent.el (gnus): New advice. Always synchronize the - modeline "Plugged" status display with the value of - `gnus-plugged'. - - * lisp/gnus-offline.el (TopLevel): Require `gnus-group' at the - compile time. - (gnus-offline-set-online-sendmail-function): defsubst. - (gnus-offline-set-offline-sendmail-function): Ditto. - (gnus-offline-set-offline-post-news-function): Ditto. - (gnus-offline-set-online-post-news-function): Ditto. - (gnus-offline-disable-fetch-mail): Ditto. - (gnus-offline-enable-fetch-mail): Ditto. - (gnus-offline-setup): Fix typo. - (gnus-offline-gnus-get-new-news): Abolish. - (gnus-offline-toggle-plugged): Ditto. - (gnus-offline-agent-expire): Ditto. - (gnus-group-get-new-news): New advice which does things - `gnus-offline-gnus-get-new-news' was doing. - (gnus-agent-toggle-plugged): New advice which does thing - `gnus-offline-toggle-plugged' was doing. - (gnus-agent-expire): New advice which does things - `gnus-offline-agent-expire' was doing. - (gnus-offline-define-menu-and-key): No longer substitute key - definitions on `gnus-group-mode-map'. No longer swap commands for - a toolbar button. - (gnus-offline-after-get-new-news): Do jobs only when - `gnus-plugged' is t. - - * lisp/gnus-ofsetup.el (gnus-ofsetup-customize): Compile lambda - expressions. - -1999-12-08 Katsumi Yamaoka - - * lisp/message.el (message-yank-add-new-references): Fix doc string. - - * texi/{message-ja.texi, message.texi} - (message-list-references-add-position, - message-yank-add-new-references): Add documentations. - -1999-12-07 Tsukamoto Tetsuo - - * lisp/gnus-offline.el (gnus-offline-gettext): Rename from - `gnus-offline-get-message'. - - * lisp/gnus-ofsetup.el (gnus-ofsetup-gettext): Rename from - `gnus-ofsetup-get-message'. - -1999-12-07 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 04. - (smiley-toggle-buffer): Autoload "smiley" or "gnus-bitmap". - - * lisp/gnus-art.el (gnus-article-prepare-mime-display): Don't use - `get-text-property' in the outside of the boundary. - (gnus-article-smiley-display): New function. - (gnus-treatment-function-alist): Use it. - - * lisp/dgnushack.el (byte-optimize-form-code-walker): Replace with - the bug fixed version rigidly instead of the use of `defadvice'. - - * lisp/message.el (font-lock-after-change-function): Don't use - `compile' for the arg of `defadvice'. - -1999-12-06 Keiichi Suzuki - - * lisp/message.el (message-yank-add-new-references): New option - value `message-id-only'. - (message-yank-original): Likewise. - (message-list-references-add-position): New user option. - (message-list-references): When - `message-list-references-add-position' is integer value, the order - of designate number message-ids is kept. - -1999-12-06 Tsukamoto Tetsuo - - * lisp/gnus.el (gnus-revision-number): Increment to 03. - - * lisp/gnus-offline.el (gnus): Don't advise here. - (TopLevel): Call `gnus-offline-define-menu-and-key'. - (gnus-offline-setup): Don't call - `gnus-offline-define-menu-and-key' here. - - * lisp/gnus-ofsetup.el (gnus-offline-update-setting-file): Don't - rely on `gnus-load-hook'. - (gnus): New advice. Call `gnus-offline-setup' when everything is - done. - - * lisp/gnus-start.el (save-buffers-kill-emacs): Compile the advice - at the compile time. Use `gnus-alive-p'. - -1999-12-06 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 02. - - * lisp/dgnushack.el (char-after): Uncomment the byte-optimization; - don't use `byte-defop-compiler'. - (byte-optimize-form-code-walker): Advise it for fixing the bug in - and/or forms. The original idea is devised by FUKUI-san, modified - by KOBAYASHI-san. - (max-specpdl-size): Set 3000. - -1999-12-05 Tsukamoto Tetsuo - - * lisp/gnus.el (gnus-revision-number): Increment to 01. - - * lisp/gnus-offline.el (gnus): New advice. synchronize - `gnus-offline-connected' with `gnus-plugged'. - -1999-12-04 Daiki Ueno - - * lisp/gnus.el (gnus-version-number): Update to 6.14.0. - (gnus-revision-number): Clear to 00. - - * README.branch.ja: Update for t-gnus-6_14 branch. - * README.branch: Ditto. - * README.T-gnus: Ditto. - * README.semi.ja: Ditto. - * README.semi: Ditto. - - * lisp/{rfc2047.el,nnweb.el,nnultimate.el,nntp.el,nnslashdot.el, - nnmh.el,nnfolder.el,nndoc.el,mml.el,mm-view.el,mm-util.el, - mm-bodies.el,message.el,mail-source.el,gnus.el,gnus-uu.el, - gnus-sum.el,gnus-start.el,gnus-msg.el,gnus-int.el,gnus-cache.el, - gnus-art.el,dgnushack.el,ChangeLog}: Sync up with Gnus v5.8.2. - - * texi/{message.texi,message-ja.texi,gnus.texi,gnus-ja.texi, - gnus-faq-ja.texi,ChangeLog}: Modify for T-gnus 6.14; sync up with - Gnus v5.8.2. - - * t-gnus-6_14: NEW PUBLIC BRANCH. - -1999-12-03 Hirokazu FUKUI - Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 01. - - * lisp/dgnushack.el (char-before): Use compiler macro instead of - byte-optimizer. - (char-after): Comment out the byte-optimization. - - * imap.el (imap-base64-encode-string, imap-base64-decode-string): - New functions. They are identical to the built-in codec if - possible, otherwise the functions defined in mel are used. - (imap-cram-md5-auth): Use them. - -1999-12-02 Katsumi Yamaoka - - * lisp/imap.el: Remove autoload settings for `base64-decode-string' - and `base64-encode-string'. - -1999-12-02 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.13.4. - (gnus-revision-number): Clear to 00. - - * README.T-gnus: Update. - - * GNUS-NEWS: Sync up with Pterodactyl Gnus v0.99. - - * lisp/{rfc2047.el,rfc1843.el,nnweb.el,nnvirtual.el,nntp.el, - nnmh.el,nnmail.el,nnimap.el,nnheader.el,nnfolder.el,nndraft.el, - nndoc.el,mml.el,mm-view.el,mm-uu.el,mm-util.el,mm-encode.el, - mm-decode.el,mm-bodies.el,message.el,mail-source.el,lpath.el, - gnus-xmas.el,gnus-uu.el,gnus-util.el,gnus-topic.el,gnus-sum.el, - gnus-start.el,gnus-srvr.el,gnus-spec.el,gnus-score.el,gnus-salt.el, - gnus-picon.el,gnus-msg.el,gnus-mailcap.el,gnus-int.el, - gnus-group.el,gnus-ems.el,gnus-cus.el,gnus-cache.el,gnus-async.el, - gnus-art.el,gnus-agent.el,dgnushack.el,base64.el,Makefile.in, - ChangeLog}: Sync up with Pterodactyl Gnus v0.99. - - * lisp/{webmail.el,nnwarchive.el,nnultimate.el,nnslashdot.el}: New - files. - - * texi/{message.texi,message-ja.texi,gnus.texi,gnus-ja.texi, - emacs-mime.texi,Makefile.in,ChangeLog}: Sync up with Pterodactyl - Gnus v0.99. - -1999-12-02 Katsumi Yamaoka - - * lisp/gnus.el (gnus-select-method): Undo (`if' -> `when'). - * lisp/gnus-picon.el (gnus-picons-file-suffixes): Ditto. - * lisp/gnus-start.el (save-buffers-kill-emacs): Ditto. - (gnus-after-getting-new-news-hook): Ditto. - - * lisp/gnus-group.el (gnus-useful-groups): Undo (`or' -> `unless'). - -1999-12-01 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 10. - - * lisp/gnus-art.el (article-treat-overstrike): Work for multibyte - char with old Emacsen as well. - -1999-12-01 Daiki Ueno - - * lisp/gnus-agent.el (gnus-category-edit-predicate): Expand `setf' - appears in the backquoted form. - (gnus-category-edit-score): Ditto. - - * lisp/gnus-sum.el (gnus-data-set-header): Expand `setf' - appears in the backquoted form. - -1999-11-30 Tsukamoto Tetsuo - - * lisp/gnus.el (gnus-revision-number): Increment to 09. - - * lisp/gnus-offline.el (gnus-offline-define-menu-and-key): Fix a - bug -- do add-hook. - (gnus-offline-popup): Examine whether `easy-menu-create-menu' is - defined. If not, call `easy-menu-create-keymaps'. - -1999-11-30 Tsukamoto Tetsuo - - * lisp/gnus.el (gnus-revision-number): Increment to 08. - - * lisp/gnus-offline.el (TopLevel): Use `static-if', requiring - "static" at the compile time. - (gnus-offline-hangup-function): Abolish. - (gnus-offline-auto-ppp): New variable. - (gnus-offline-gnus-get-new-news): Refer to it. - (gnus-offline-set-unplugged-state): Ditto. - (gnus-offline-set-auto-ppp): New function. It replaces the - function `gnus-offline-toggle-auto-hangup'. - (gnus-offline-toggle-auto-hangup): Abolish. - (gnus-offline-define-menu-and-key): Use `static-if' and - `static-cond'. - (gnus-offline-popup-menu): Do not define this function under XEmacs. - (gnus-offline-popup): New function. - - * gnus-ofsetup.el (gnus-ofsetup-update-setting-file): Typo. - (gnus-ofsetup-resource-en): Fix doc strings. - (gnus-ofsetup-resource-ja): Ditto. - -1999-11-30 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 07. - - * lisp/gnus-art.el (gnus-article-wash-status): Sync up with - Pterodactyl Gnus v0.98. - -1999-11-30 Katsumi Yamaoka - - * lisp/nnimap.el (nnimap-request-newgroups): Don't use `member-if'. - - * lisp/gnus.el (gnus-select-method): Use `if' instead of `when'. - - * lisp/gnus-sum.el (gnus-summary-make-marking-command-1): Use - `car' and `cdr' instead of `cadr'. - - * lisp/gnus-picon.el (gnus-picons-file-suffixes): Use `cons' - instead of `push'; use `if' instead of `when'. - - * lisp/gnus-group.el (gnus-group-iterate): Use `car' and `cdr' - instead of `pop'. - (gnus-useful-groups): Use `or' instead of `unless'. - - * lisp/gnus-art.el (gnus-emphasis-alist): Use `car' and `cdr' - instead of `cadr'. - -1999-11-30 Katsumi Yamaoka - - * lisp/gnus-start.el (save-buffers-kill-emacs): Don't use the macro - `when' in the body of `defadvice'. Use `if' instead. - - * lisp/dgnushack.el (last, mapc): New compiler macros for emulating - cl functions. - -1999-11-29 Katsumi Yamaoka - - * lisp/gnus-start.el (gnus-after-getting-new-news-hook): Don't use - the macro `when' in the arg of `defcustom'. Use `if' instead. - -1999-11-27 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 06. - - * lisp/gnus-art.el (gnus-signature-toggle): Specify the 4th arg of - `next-single-property-change' LIMIT as `point-max'. - (gnus-article-prepare-mime-display): Ditto. - (article-hide-signature): Ditto. - -1999-11-26 NAKAJI Hiroyuki - - * lisp/gnus.el (gnus-version): Parentheses of gnus-revision-number - are removed to fill gnus-version within 80 columns. - -1999-11-25 NAKAJI Hiroyuki - - * lisp/gnus.el (gnus-version): Shows also gnus-revision-number. - -1999-11-24 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 05. - - * lisp/gnus-agent.el (gnus-agent-fetch-headers): Use `gnus-union' - instead of `union'. - - * lisp/gnus-util.el (gnus-union): New function. - - * lisp/gnus-sum.el (gnus-summary-exit-no-update): Use - `copy-sequence' instead of `copy-list'. - * lisp/gnus-art.el (gnus-article-setup-highlight-words): Ditto. - - * lisp/dgnushack.el (union, copy-list): Remove compiler macros. - -1999-11-24 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 04. - - * lisp/dgnushack.el (union, copy-list): New compiler macros for - emulating cl functions. - -1999-11-22 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 03. - (gnus-select-method): Use `condition-case' instead of - `ignore-errors'. - - * lisp/gnus-start.el (gnus-site-init-file): Use `condition-case' - instead of `ignore-errors'. - - * lisp/{gnus-ofsetup.el,gnus-offline.el}: Remove RCS magic cookie. - - * lisp/{time-date.el,smiley.el,score-mode.el,pop3.el,nnweb.el, - nnvirtual.el,nntp.el,nnspool.el,nnsoup.el,nnoo.el,nnml.el,nnmh.el, - nnmbox.el,nnmail.el,nnlistserv.el,nnimap.el,nnheader.el, - nneething.el,nndraft.el,nndoc.el,nnbabyl.el,message.el,imap.el, - gnus-win.el,gnus-vm.el,gnus-util.el,gnus-topic.el,gnus-sum.el, - gnus-start.el,gnus-srvr.el,gnus-spec.el,gnus-score.el,gnus-salt.el, - gnus-range.el,gnus-picon.el,gnus-ofsetup.el,gnus-offline.el, - gnus-msg.el,gnus-mlspl.el,gnus-mailcap.el,gnus-logic.el, - gnus-kill.el,gnus-group.el,gnus-cite.el,gnus-async.el,gnus-art.el, - gnus-agent.el,earcon.el}: Require `cl' using `eval-when-compile'. - -1999-11-22 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 02. - - * lisp/{time-date.el,smiley.el,pop3.el,nnweb.el,nnvirtual.el, - nntp.el,nnspool.el,nnsoup.el,nnoo.el,nnml.el,nnmh.el,nnmbox.el, - nnmail.el,nnlistserv.el,nnimap.el,nnheader.el,nneething.el, - nndoc.el,nnbabyl.el,message.el,imap.el,gnus.el,gnus-win.el, - gnus-util.el,gnus-topic.el,gnus-sum.el,gnus-start.el,gnus-srvr.el, - gnus-spec.el,gnus-score.el,gnus-salt.el,gnus-range.el, - gnus-picon.el,gnus-ofsetup.el,gnus-offline.el,gnus-mlspl.el, - gnus-mailcap.el,gnus-logic.el,gnus-kill.el,gnus-group.el, - gnus-cite.el,gnus-async.el,gnus-art.el,gnus-agent.el,earcon.el}: - Require `cl' at the top level. - - * lisp/gnus.el (gnus-select-method): Undo last change. - * lisp/gnus-util.el (copy-list): Undo last change (remove it). - * lisp/gnus-start.el (gnus-site-init-file): Undo last change. - - * lisp/gnus-ems.el (gnus-split-string): Remove. - -1999-11-21 Daiki Ueno - - * lisp/pop3.el: Add description about STLS extension; add autoload - setting for `starttls-open-stream' and `starttls-negotiate'. - (pop3-stls): New function. - (pop3-open-tls-stream): New function. - (pop3-open-server): Use `pop3-open-tls-stream' if - 'pop3-connection-type' is bound to `tls'. - -1999-11-20 Daiki Ueno - - * lisp/imap.el: Add autoload setting for `starttls-open-stream' - and `starttls-negotiate'. - (imap-stream-alist): Add TLS entry. - (imap-tls-p): New function. - (imap-tls-open): New function. - (imap-ssl-open): Enclose `open-ssl-stream' with - `as-binary-process'. - -1999-11-19 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 01. - (gnus-select-method): Use `condition-case' instead of - `ignore-errors'. - - * lisp/pop3.el (pop3-apop): Move the autoload seting to the top - level. - - * lisp/md5.el (md5): Allow the optional 4th and 5th arguments - `coding' and `noerror' for the stopgaps. - - * lisp/lpath.el (md5): Allow the optional 4th and 5th arguments - `coding' and `noerror'. - (function-max-args): Maybe-fbind for FSF Emacsen. - - * lisp/imap.el (imap-cram-md5-auth): Specify the 4th arg to `md5' - as `binary' if possible. - (imap-log): Default to nil (synched with pgnus 0.99). - (base64-decode-string): Autoload "mel" instead of "base64". - (md5): Autoload "md5" without `eval-and-compile'. - - * lisp/gnus-util.el (copy-list): New function defined by - `defun-maybe'. - - * lisp/gnus-sum.el (gnus-update-summary-mark-positions): Specify - the 3rd arg of `make-full-mail-header' to "nobody" instead of "". - - * lisp/gnus-start.el (gnus-site-init-file): Use `condition-case' - instead of `ignore-errors'. - - * lisp/gnus-picon.el: Require `cl'. - - * lisp/{smiley.el,rfc2104.el,nnvirtual.el,mailheader.el, - gnus-offline.el} (cl): Enclose the requiring procedure with - `eval-when-compile'. - - * lisp/{imap.el,gnus-mailcap.el} (cl): Enclose the requiring - procedure with `eval-when-compile' instead of `eval-and-compile'. - -1999-11-09 Yoshiki Hayashi - - * lisp/read-passwd.el (read-pw-set-mail-source-passwd-cache): - Use mail-sources instead of nnmail-spool-file. - From: Toshiaki -PCX- Tanaka. - -1999-11-09 Katsumi Yamaoka - - * lisp/gnus.el (gnus-group-startup-message): Insert space before - "based on". - * lisp/gnus-xmas.el (gnus-xmas-group-startup-message): Ditto. - -1999-11-09 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.13.3. - (gnus-revision-number): Clear to 00. - - * README.T-gnus: Update. - - * lisp/{rfc1843.el,qp.el,nntp.el,nnmail.el,nnfolder.el,nnagent.el, - mml.el,mm-view.el,mm-uu.el,mm-util.el,mm-decode.el,mm-bodies.el, - message.el,mail-source.el,lpath.el,gnus-util.el,gnus-topic.el, - gnus-sum.el,gnus-start.el,gnus-srvr.el,gnus-msg.el,gnus-mailcap.el, - gnus-group.el,gnus-art.el,gnus-agent.el,dgnushack.el,binhex.el, - ChangeLog}: Sync up with Pterodactyl Gnus v0.98. - - * lisp/{rfc2104.el,nnimap.el,imap.el}: New files. - - * texi/gnus-ja.texi: Sync up with Pterodactyl Gnus v0.98 without - translation. - - * texi/{gnus.texi,ChangeLog}: Sync up with Pterodactyl Gnus v0.98. - -1999-11-08 Kinji Itoh - - * lisp/gnus-draft.el (gnus-draft-edit-message): Use - `message-save-drafts' instead of `set-buffer-modified-p' and - `save-buffer'. - * lisp/message.el (message-save-drafts): Insert In-Reply-To header - because the reply data is lost in Drafts. - * lisp/gnus-art.el (gnus-signature-face): Don't check - window-system type. - -1999-11-08 Daiki Ueno - - * lisp/pop3.el (pop3-progress-message): New function. - (pop3-movemail): Use it. - -1999-10-28 Katsumi Yamaoka - - * lisp/gnus.el (TopLevel): Autolaod "gnus-msg" for the function - `gnus-following-method'. - - * lisp/gnus-msg.el (gnus-following-method): Move from gnus-msg.el; - wide reply as a mail if the message is not a news; use the macro - `gnus-setup-message'. - - * lisp/gnus-art.el (gnus-following-method): Move to gnus-msg.el. - -1999-10-26 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 14. - (TopLevel): Autoload "gnus-bitmap" instead of "smiley-mule" for the - function `gnus-smiley-display'. - - * lisp/gnus-art.el (gnus-treat-display-smileys): Default to nil if - `window-system' is nil. - (gnus-article-x-face-command): Default to external command if - `window-system' is nil. - -1999-10-26 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 13. - (TopLevel): Rearrange autoload settings. - - * lisp/gnus-art.el (gnus-treatment-function-alist): Don't use - `smiley-buffer'. - - * lisp/gnus-sum.el (gnus-summary-make-menu-bar): Add button - "Toggle smileys" in "Washing" menu. - (gnus-summary-wash-map): Add "s" key for `smiley-toggle-buffer'. - - * lisp/smiley.el (gnus-smiley-display): Use `smiley-toggle-buffer'. - (smiley-toggle-buffer): New function. - (smiley-buffer): Don't quote the function. - (smiley-toggle-extents): Ditto. - -1999-10-24 Tsukamoto Tetsuo - - * lisp/gnus.el (gnus-revision-number): Increment to 12. - (TopLevel): Add and delete autoloads for functions defined in - "gnus-cus", "gnus-offline", "miee", "pop3-fma" and "mw32misc". - - * lisp/gnus-offline.el (TopLevel): Do not consider the functions - defined in "miee". - - * lisp/gnus-ofsetup.el (TopLEvel): Do not autoload - `gnus-custom-mode' defined in "gnus-cus". - -1999-10-21 Tsukamoto Tetsuo - - * lisp/gnus.el (gnus-revision-number): Increment to 11. - - * lisp/gnus-offline.el (TopLevel): Call `mime-set-field-decoder' - when "eword-decode" is loaded. It is for X-Gnus-Offline-Backend - header. - -1999-10-19 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 10. - (TopLevel): Autoload "x-face-mule" and "smiley-mule" for the - functions `x-face-mule-gnus-article-display-x-face' and - `smiley-buffer'. - - * lisp/lpath.el (smiley-encode-buffer): Bind it for FSF Emacsen. - - * lisp/gnus-ems.el (gnus-group-startup-message): Don't replace with - `gnus-mule-group-startup-message'. - (gnus-mule-group-startup-message): Remove. - (gnus-mule-bitmap-image-file): Remove. - - * lisp/gnus-msg.el (gnus-copy-article-buffer): Encode smileys to - ordinary text if the feature `smiley-mule' is provided and FSF - Emacs is used. - (TopLevel): Require `static' at the compile time. - - * lisp/gnus-art.el (gnus-article-prepare-display): Bind - `mime-display-text/plain-hook' to nil. - (gnus-article-prepare-mime-display): Use `let' instead of `let*'; - treat the next entity position as a marker. - (gnus-treatment-function-alist): Use `smiley-buffer' instead of - `gnus-smiley-display' under FSF Emacsen. - (gnus-treat-display-smileys): Default to t if the module - `smiley-mule' is installed. - (gnus-treat-display-xface): Default to `head' if the value of - `gnus-article-x-face-command' is - `x-face-mule-gnus-article-display-x-face'. - (gnus-article-x-face-command): Default to - `x-face-mule-gnus-article-display-x-face' if the module - `x-face-mule' is installed. - (TopLevel): Require `static' first; require `path-util'. - -1999-10-18 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 09. - - * lisp/message.el (message-mode): Make - `message-font-lock-last-position' as buffer local. - (message-font-lock-keywords-2): Use - `message-font-lock-cited-text-matcher' instead of regexp. - (message-font-lock-cited-text-matcher): New function. - (font-lock-after-change-function): Advice to the keep last cursor - position in `message-font-lock-last-position' before fontifying. - (message-font-lock-last-position): New variable. - (message-font-lock-citation-name-max-column): New variable. - (message-font-lock-cited-text-regexp): New variable. - (message-font-lock-fence-close-position): New variable. - (message-font-lock-fence-open-position): New variable. - (message-font-lock-fence-close-regexp): New variable. - (message-font-lock-fence-open-regexp): New variables. - -1999-10-04 Masatoshi Tsuchiya - - * lisp/message.el (message-mode): Rearrange `font-lock-defaults' - using `message-font-lock-keywords', `message-font-lock-keywords-1' - and `message-font-lock-keywords-2'. - (message-font-lock-keywords): Restruct. - (message-font-lock-keywords-1): New variable split from - `message-font-lock-keywords'. - (message-font-lock-keywords-2): Ditto. - -1999-10-11 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 08. - - * lisp/gnus-art.el (gnus-treat-article): Buttonize the signature - before highlighting or hiding it. - (gnus-article-buttonize-signature): New function. - (gnus-article-highlight-signature): Don't buttonize. - (gnus-treatment-function-alist): Undo the last change. - (gnus-treat-emphasize): Default to nil. - -1999-10-08 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 07. - (TopLevel): Autoload "gnus-art" for the function - `gnus-article-show-all'. - - * lisp/gnus-sum.el (gnus-summary-select-article): Expose all - hidden text if the command `gnus-summary-toggle-mime' is used. - - * lisp/gnus-art.el (gnus-signature-toggle): Don't hide the - following parts. - (gnus-article-highlight-signature): Work for forwarded messages. - (gnus-article-show-all): New function based on `article-show-all'. - (gnus-article-show-all-headers): Based on - `article-show-all-headers'. - (article-show-all-headers): New function to show all *HEADERS*. - (article-show-all): Show *ALL* literally. - (article-hide-signature): Work for forwarded messages. - (gnus-treatment-function-alist): Put `gnus-treat-hide-signature' - off after `gnus-treat-highlight-signature'. - -1999-10-08 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 06. - - * lisp/gnus-art.el (gnus-article-prepare-mime-display): Protect - against forwarded messages without MIME structure. - (gnus-treatment-function-alist): Move - 'gnus-treat-decode-article-as-default-mime-charset' to the top; - put `gnus-treat-emphasize' off after - `gnus-treat-highlight-headers'. - -1999-10-07 Yoshiki Hayashi - - * lisp/gnus.el (gnus-revision-number): Increment to 05. - -1999-10-07 Katsumi Yamaoka - - * lisp/gnus-art.el (gnus-treat-predicate): Examine whether the - argument is list or not before condition. - -1999-10-07 Yoshiki Hayashi - - * lisp/gnus-art.el (gnus-treat-predicate): Work for - (typep "something"). - -1999-10-07 Yoshiki Hayashi - - * lisp/gnus-art.el (gnus-article-prepare-display): - Pass argument nil as a condition to gnus-treat-article. - * lisp/gnus-art.el (gnus-article-prepare-mime-display): - Ditto. Also, treat last part of multipart article correctly. - -1999-10-06 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 04. - - * lisp/message.el (message-generate-headers): Don't insert - excessive newline. - - * lisp/gnus-xmas.el (gnus-xmas-group-startup-message): Don't use - negative number for the 2nd arg of `insert-char'. - -1999-10-06 Tsukamoto Tetsuo - - * lisp/gnus-ofsetup.el (gnus-ofsetup-customize): Info link to - gnus-ja instead of gnus if Japanese environment is on. - -1999-10-06 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 03. - (semi-gnus-developers): Remove. - (gnus-maintainer): Change mail address. - (gnus-group-startup-message): Display version string. - - * lisp/gnus-msg.el (gnus-bug): Delete `Cc'; modify version string. - - * lisp/gnus-xmas.el (gnus-xmas-group-startup-message): Display - version string; fix glyph position. - -1999-10-06 Yoshiki Hayashi - - * lisp/gnus-sum.el (gnus-read-move-group-name): Revert - to previous version until problem of respooling from - nnimap to nnml is solved. - (gnus-summary-move-article): Ditto. - -1999-10-05 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 02. - - * lisp/gnus-art.el (gnus-treat-predicate): Check whether arg's - value is t before checking for `condition'. - (gnus-article-prepare-mime-display): Search for the entity children - if the primary type is `multipart'. - -1999-10-01 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 01. - - * lisp/gnus-sum.el (gnus-read-move-group-name): Returns nil - instead of signaling an error if the destination group is not - newly created. - (gnus-summary-move-article): Do nothing if the destination group - is not newly created. - - * lisp/gnus-msg.el (gnus-bug): Use text/plain for the snooped - environment part. - -1999-09-30 Daiki Ueno - - * nnfolder.el (nnfolder-possibly-change-group): Don't create an - active entry for the group even if it doesn't exist. - -1999-09-28 Daiki Ueno - - * gnus-art.el (gnus-article-mime-part-status): Use `mime-entity-children'. - -1999-09-28 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.13.2. - (gnus-revision-number): Clear to 00. - - * README.T-gnus: Update. - - * texi/{message.texi,message-ja.texi,gnus.texi,gnus-ja.texi, - emacs-mime.texi,ChangeLog}: Sync up with Pterodactyl Gnus v0.97. - - * lisp/{qp.el,nntp.el,nnmail.el,mml.el,mm-util.el,mm-encode.el, - mm-decode.el,message.el,mail-source.el,gnus.el,gnus-xmas.el, - gnus-util.el,gnus-sum.el,gnus-srvr.el,gnus-score.el,gnus-nocem.el, - gnus-msg.el,gnus-group.el,gnus-cache.el,gnus-art.el,gnus-agent.el, - ChangeLog}: Sync up with Pterodactyl Gnus v0.97. - -1999-09-24 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 07. - - * lisp/gnus-art.el (gnus-article-prev-page): Rewrite to realize - smooth scrolling under XEmacs. - (gnus-article-next-page):Ditto. - - * Mule23@1934.en, Mule23@1934.ja: Separate from Mule23@1934; add - descriptions about the problem of loaddefs.el and the patch for - CUSTOM 1.9962. - -1999-09-22 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 06. - - * lisp/nnmail.el (TopLevel): Bind keywords `:user', `:path' and - `:predicate' for old Emacsen; require `static'. - - * lisp/dgnushack.el (TopLevel): Don't bind keywords `:user', - `:path' and `:predicate'. - -1999-09-20 Daiki Ueno - - * gnus-agent.el (gnus-agent-toggle-plugged): Mark the current - modeline as modified. - -1999-09-17 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 05. - - * lisp/gnus-art.el (gnus-treat-article): Inherit the text property - `mime-view-entity' in the modified header under FSF Emacsen. - -1999-09-13 Tsukamoto Tetsuo - - * README-offline.en: Rewrite the usage description. - * README-offline.ja: Ditto. - -1999-09-12 Tsukamoto Tetsuo - - * lisp/gnus.el (gnus-revision-number): Increment to 04. - - * lisp/gnus-ofsetup.el (gnus-offline-lang): Declare before loading - `gnus-offline'. - -1999-09-12 Tsukamoto Tetsuo - - * README-offline.en: Do not refer to `gnus-agent-toggle-plugged'. - * README-offline.ja: Ditto. - -1999-09-11 Tsukamoto Tetsuo - - * lisp/gnus.el (gnus-revision-number): Increment to 03. - - * lisp/gnus-agent.el (gnus-agent-toggle-plugged): Do not mark - the current buffer as modified. - - * lisp/gnus-offline.el (gnus-offline-menu): New variable. - (gnus-offline-get-menu-items): New function. - (gnus-offline-define-menu-on-miee): Use it. - (gnus-offline-define-menu-on-agent): Ditto. - -1999-09-04 Daiki Ueno - - * lisp/gnus-msg.el (gnus-configure-posting-styles): Quote `:file'. - - * lisp/pop3.el (pop3-save-uidls): Don't use `dotimes' to check - backets of `pop3-uidl-obarray'; don't clear `pop3-uidl-obarray'. - (pop3-quit): Clear `pop3-uidl-obarray'. - -1999-09-03 Tsukamoto Tetsuo - - * lisp/gnus.el (gnus-revision-number): Increment to 02. - - * lisp/gnus-offline.el (gnus-offline-resource-en, - gnus-offline-resource-ja, - gnus-offline-resource-ja_complete): New variables. - (gnus-offline-get-message): News function. - (gnus-offline-error-check): Use it. - (gnus-offline-connect-server): Ditto. - (gnus-offline-get-new-news-function): Ditto. - (gnus-offline-set-mail-group-level): Ditto. - (gnus-offline-hangup-line): Ditto. - (gnus-offline-after-jobs-done): Ditto. - (gnus-offline-toggle-auto-hangup): Ditto. - (gnus-offline-toggle-on/off-send-mail): Ditto. - (gnus-offline-toggle-articles-to-fetch): Ditto. - (gnus-offline-empting-spool): Ditto. - (gnus-offline-set-interval-time): Ditto. - - * lisp/gnus-ofsetup.el (gnus-offline-lang, - gnus-ofsetup-resource-en, gnus-ofsetup-resource-ja): New - variables. - (gnus-ofsetup-get-message): New function. - (gnus-setup-for-offline): Use it. - (gnus-ofsetup-find-parameters): Ditto. - (gnus-ofsetup-prepapre-for-miee): Ditto. - (gnus-ofsetup-completing-read-symbol): Ditto. - (gnus-ofsetup-customize): Ditto. - (gnus-ofsetup-customize-done): Ditto. - -1999-09-01 Katsumi Yamaoka - - * lisp/gnus-sum.el (gnus-summary-isearch-article): Don't bind - `isearch-lazy-highlight'. - -1999-08-30 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 01. - - * lisp/lpath.el (babel-as-string): Bind it. - - * lisp/gnus-sum.el (gnus-summary-search-article): Keep the - original X-Face field while searching. It is done for only FSF - Emacsen. - (gnus-summary-search-article-highlight-matched-text): Ditto. - (gnus-summary-search-article-matched-data): Bind it explicitly. - -1999-08-29 Katsumi Yamaoka - - * lisp/gnus.el (gnus-version-number): Update to 6.13.1. - (gnus-revision-number): Clear to 00. - - * README.T-gnus: Update. - - * README: Sync up with Pterodactyl Gnus v0.96. - * lisp/{smiley.el,nntp.el,nnmail.el,nnfolder.el,mml.el,mm-view.el, - mm-uu.el,mm-util.el,mm-encode.el,mm-decode.el,mm-bodies.el, - gnus-uu.el,gnus-util.el,gnus-sum.el,gnus-start.el,gnus-score.el, - gnus-mlspl.el,gnus-group.el,gnus-bcklg.el,gnus-art.el, - gnus-agent.el,ChangeLog}: Ditto. - * texi/{gnus.texi,gnus-ja.texi,ChangeLog}: Ditto. - -1999-08-27 Daiki Ueno - - * lisp/pop3.el (pop3-movemail): If the argument `crashbox' is t, - don't retrieve any incoming mails.; Don't filter articles here. - Use `convert-standard-filename' to generate fresh UIDL file names. - (pop3-get-message-numbers): Rewrite. - (pop3-save-uidls): Clear UIDL hash.; Use `with-temp-file' instead - of `with-temp-buffer'. - -1999-08-27 Tsukamoto Tetsuo - - * README-offline.ja : Fix. - - * lisp/gnus-offline.el (gnus-offline-agent-automatic-expire): - Fix typo. - - * lisp/gnus-ofsetup.el : Remove gnus-cus from compile time - requirements; Enclose the autoload for `gnus-custom-mode' with - `eval-and-compile'. - -1999-08-27 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 15. - - * lisp/dgnushack.el (char-before, char-after): Optimize byte code - for them before lpath.el is loaded. Because lpath.el requires - `poe' via `path-util'. [cf. ] - - * lisp/gnus-sum.el (gnus-summary-search-article): Search for - X-Face image if the regexp "^X-Face:" is specified. - (gnus-summary-search-article-highlight-matched-text): Use - `gnus-summary-search-article-highlight-goto-x-face'; maybe display - X-Face image if it is requested. - (gnus-summary-search-article-highlight-goto-x-face): New macro. - -1999-08-26 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 14. - - * lisp/gnus-sum.el (gnus-summary-search-article): Treat and - recenter the article when touchdown; popup the article buffer if - it is disappeared. - (gnus-summary-search-article-highlight-matched-text): Treat the - article before highlighting; use old style backquote syntax. - (gnus-summary-search-article-position-point): Fix the beginning - position; use old style backquote syntax. - (gnus-summary-select-article): Undo the last change. - (gnus-summary-display-article): Bind - `gnus-summary-search-article-matched-data' in the article buffer - locally. It is moved from `gnus-summary-select-article'. - -1999-08-25 NAKAJI Hiroyuki - - * texi/Makefile.in (EMACS): Use @EMACS@, not emacs directly. - (clean): Remove formatted info files. - (distclean): Just remove Makefile. - -1999-08-25 Tsukamoto Tetsuo - - * lisp/gnus.el (gnus-revision-number): Increment to 13. - - * lisp/gnus-agent.el (gnus-agent-large-newsgroup): New variable. - (gnus-agent-fetch-headers): Limit downloadable articles if the - number of unread articles exceeds `gnus-agent-large-newsgroup'. - (gnus-agent-expire): Do not expire saved or replied articles when - `gnus-agent-expire-all' is nil. - - * lisp/gnus-offline.el (gnus-offline-agent-automatic-expire): New - variable. - (gnus-offline-agent-expire): Check it; Bind - `gnus-agent-expire-all' to nil if `gnus-agent-expire-days' is 0. - (gnus-offline-after-jobs-done): Don't check - `gnus-agent-expire-all'. - - * lisp/gnus-ofsetup.el (gnus-offline-setting-file): Check if - `user-login-name' and `user-real-login-name' returns the same - value or not. - (gnus-ofsetup-prepare-for-miee): Write forms as a variable. - (gnus-ofsetup-update-setting-file): Ditto. - (gnus-ofsetup-prepare): New macro. - (gnus-setup-for-offline): Use it. - (gnus-ofsetup-customize-done): Ditto. - -1999-08-25 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 12. - - * lisp/gnus-sum.el (gnus-summary-search-article): Rearrange. - (gnus-summary-search-article-highlight-matched-text): Rearrange. - (gnus-summary-search-article-position-point): New macro. - (gnus-summary-search-article-matched-data): Rename from - `gnus-summary-search-article-matched-text'. - (gnus-summary-isearch-article): Bind `gnus-inhibit-treatment' to t; - use `gnus-article-show-all-headers' for exposing the visited - article. - (gnus-summary-select-article): Bind - `gnus-summary-search-article-matched-data' in the article buffer - locally. - - * lisp/gnus-art.el (gnus-treat-article): Don't treat the article - if the value of `gnus-inhibit-treatment' is non-nil. - (article-toggle-headers): Don't redisplay X-Face if the value of - `gnus-inhibit-treatment' is non-nil. - (gnus-article-treat-custom): Add new treatment variable `mime'. - -1999-08-25 Daiki Ueno - - * lisp/gnus-group.el (gnus-group-line-format): Fix typo in - documentation. - - * lisp/gnus-sum.el (gnus-summary-mode): Don't set - `gnus-newsgroup-incorporated' explicitly. - -1999-08-24 Katsumi Yamaoka - - * README.semi: Update for the recent a-ftp sites and directories. - * README.semi.ja: Ditto. - * texi/gnus-faq.texi: Ditto. - * texi/gnus-faq-ja.texi: Ditto. - -1999-08-24 Daiki Ueno - - * lisp/gnus.el (gnus-revision-number): Increment to 11. - (gnus-summary-incorporated-face): New face spec. - - * lisp/gnus-group.el (gnus-group-line-format-alist): Add - entry about the format specifier `w'. - (gnus-group-line-format): Fix documentation. - - * lisp/gnus-sum.el (gnus-summary-highlight): Highlight lines on - newly incorporated mails with `gnus-summary-incorporated-face'. - (gnus-newsgroup-incorporated): New variable. - (gnus-summary-local-variables): Add `gnus-newsgroup-incorporated'. - (gnus-summary-mode): Set `gnus-newsgroup-incorporated'. - - * lisp/nnmail.el (nnmail-new-mail-numbers): New function. - - * lisp/gnus-srvr.el (gnus-browse-foreign-server): Don't prepend - `K' if the group has already been subscribed. - -1999-08-24 Katsumi Yamaoka - - * lisp/gnus-sum.el (gnus-summary-isearch-article): Set - `isearch-lazy-highlight' t in the buffer locally; goto the - beginning of the buffer before searching. - - * lisp/gnus-util.el (gnus-eval-in-buffer-window): Select the last - selected frame. - -1999-08-23 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 10. - - * lisp/gnus-sum.el (gnus-summary-search-article): Highlight - matched text after the searching is done; call - `gnus-summary-select-article' with the args nil and t; bind - `gnus-treat-*' to nil. - (gnus-summary-search-article-highlight-matched-text): New macro - for highlighting matched text. It is bound at the compile time - only. - (gnus-summary-isearch-article): Call `gnus-summary-select-article' - with the args nil and t; bind `gnus-treat-*' to nil. - - * lisp/gnus-ems.el (gnus-x-splash): Change the foreground color of - `gnus-splash' to "Brown"; use `with-temp-buffer' instead of - `with-temp-file'; use `insert-file-contents-as-binary' instead of - `insert-file-contents'. - -1999-08-20 Tsukamoto Tetsuo - - * lisp/gnus.el (gnus-revision-number): Increment to 09. - - * lisp/gnus-offline.el: Fix comments. - (TopLevel): Delete the code for emulating custom. Do not inhibit - byte-compile-warnings, but hide useless ones. - (gnus-offline-dialup-program-arguments): defvar instead of - defcustom. - (gnus-offline-hangup-program-arguments): Ditto. - (gnus-offline-interval-time): Ditto. - (gnus-offline-dialup-program, gnus-offline-hangup-program, - gnus-offline-drafts-queue-type, gnus-offline-MTA-type): defvar. - (gnus-offline-disable-fetch-mail): Remove pop3-fma dependent - codes. - Set `mail-sources' instead of `nnmail-spool-file'. - (gnus-offline-enable-fetch-mail): Ditto. - (gnus-offline-toggle-movemail-program): Abolish. - (gnus-offline-define-menu-and-key): Modify according to it. - (gnus-offline-define-menu-on-miee): Ditto. - (gnus-offline-define-menu-on-agent): Ditto. - (gnus-offline-message-add-header): Bind temporary variables. - (gnus-offline-add-custom-header): Ditto. - (gnus-offline-restore-mail-group-level): Ditto. - - * lisp/gnus-ofsetup.el (TopLevel): Require gnus-cus and - gnus-offline at the compile time. Do not inhibit - byte-compile-warnings. - (gnus-setup-for-offline): Really bind all temporary variables. - (gnus-ofsetup-write-settting-file): Check if interval is a - integer. - Use `mail-sources' instead of `nnmail-spool-file'. - (gnus-ofsetup-update-setting-file): Redefine as a macro. - (gnus-ofsetup-prepare-for-miee): Ditto. - - * README-offline.en : Update. - * README-offline.ja : Ditto. - -1999-08-20 Daiki Ueno - - * lisp/gnus-sum.el (gnus-wheel-summary-scroll): Bind - `inhibit-read-only' to t; bind `buffer-read-only' to nil. - -1999-08-20 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 08. - -1999-08-19 Keiichi Suzuki - - * lisp/nnmail.el (nnmail-split-it): Match whole word for getting - group name with `\N'. - -1999-08-19 Daiki Ueno - - * lisp/gnus.el (gnus-revision-number): Increment to 07. - - * lisp/pop3.el (pop3-except-header-regexp): New variable. - (pop3-movemail): Don't retrieve messages whose headers are - matching `pop3-except-header-regexp'. - (pop3-top): New function. - (pop3-retr): Don't use `save-restriction'. - -1999-08-18 Daiki Ueno - - * lisp/pop3.el (pop3-get-extended-response): Fix regexp. - -1999-08-18 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 06. - - * lisp/gnus-art.el (mime-preview-over-to-next-method-alist): Use - `gnus-article-next-page' when the last page is not displayed. - (mime-preview-over-to-previous-method-alist): Use - `gnus-article-prev-page' when the first page is not displayed. - (gnus-next-page-map): Use `make-sparse-keymap' instead of - `make-keymap'; don't use `suppress-keymap'. - (gnus-insert-next-page-button, gnus-insert-prev-page-button): - Succeed to the value of the text property `mime-view-situation' in - the Next/Prev buttons; make `gnus-{next|prev}-page-map' have the - current local map as a parent under FSF Emacsen. - -1999-08-18 Daiki Ueno - - * lisp/pop3.el (pop3-retr): Undo last change. - -1999-08-17 Daiki Ueno - - * lisp/gnus.el (gnus-revision-number): Increment to 05. - - * lisp/pop3.el (pop3-get-extended-response): Enable timeout of - `accept-process-output'; Move point to the end of the normal - response. - (pop3-movemail): Add suffix to `pop3-uidl-file-name'. - (pop3-get-list): Abolish. - (pop3-retr): Don't use `save-restriction'. - (pop3-uidl): Don't use `condition-case' when checking UIDL support. - (pop3-list): Likewise. - -1999-08-17 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 04. - - * lisp/gnus-sum.el (gnus-wheel-summary-scroll): Use - `event-basic-type' instead of `event-button' under FSF Emacsen. - -1999-08-16 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 03. - -1999-08-16 Daiki Ueno - - * lisp/gnus-sum.el: Add `gnus-wheel-install' to - `gnus-summary-mode-hook'. - (gnus-use-wheel): New variable. - (gnus-wheel-scroll-amount): New variable. - (gnus-wheel-edge-resistance): New variable. - (gnus-wheel-summary-scroll): New function. - (gnus-wheel-install): New function. - -1999-08-16 Katsumi Yamaoka - - * lisp/gnus.el (gnus-revision-number): Increment to 02. - - * lisp/nnheader.el (make-full-mail-header-from-decoded-header): Use - `defun' instead of `defsubst'. - (make-full-mail-header): Ditto. - - * lisp/dgnushack.el (dgnushack-texi-format): Fold up long lines. - (TopLevel): Autoload "texinfmt" for avoiding byte compile warning. - -1999-08-16 Tsukamoto Tetsuo - - * lisp/gnus.el (gnus-revision-number): Increment to 01. - - * lisp/gnus-draft.el (gnus-group-send-drafts): Say which message - is being sent. - - * lisp/gnus-ofsetup.el (gnus-ofsetup-completing-read-symbol): New - function from Nana-gnus. - (gnus-setup-for-offline): Rewrite. Bind all temporary variables. - (gnus-ofsetup-update-setting-file): Rename from - `gnus-ofsetup-write-setting-file'. - (gnus-ofsetup-find-parameters): Rename from - `gnus-ofsetup-parameters'. - (gnus-ofsetup-customize-done): Rewrite. - -1999-08-15 Daiki Ueno - - * pop3.el: Sync up with pop3.el version 2.04. - (pop3-leave-mail-on-server): New variable. - (pop3-maximum-message-size): New variable. - (pop3-uidl-file-name): New variable. - (pop3-uidl-support): New variable. - (pop3-uidl-obarray): New variable. - (pop3-movemail): Check message size on every retrieval. - (pop3-open-ssl-stream-1): Use new style macro. - (pop3-get-message-numbers): New function. - (pop3-get-list): New function. - (pop3-get-uidl): New function. - (pop3-get-unread-message-numbers): New function. - (pop3-save-uidls): New function. - (pop3-retr): Use `pop3-get-extended-response'. - (pop3-list): New implementation. - (pop3-uidl): New function. - (pop3-get-extended-response): New function. - -1999-08-04 Katsumi Yamaoka - - * lisp/gnus.el: T-gnus 6.13.0 is released. - -1999-08-04 Katsumi Yamaoka - - * ChangeLog.2: New file, rename from ChangeLog. - - * lisp/dgnushack.el (TopLevel): Rearrange. - - * README.branch.ja: Update for t-gnus-6_12 and t-gnus-6_13 branch. - * README.branch: Ditto. - - * texi/gnus-faq.texi: Replace ftp.jaist.ac.jp with ftp.etl.go.jp. - - * texi/gnus-faq-ja.texi: Modify for T-gnus 6.13. - * texi/message-ja.texi: Ditto. - * texi/message.texi: Ditto. - * texi/gnus-ja.texi: Ditto. - * texi/gnus.texi: Ditto. - * README-offline.ja: Ditto. - * README-offline.en: Ditto. - * README.semi.ja: Ditto. - * README.semi: Ditto. - * README.T-gnus: Ditto. - - * t-gnus-6_13: NEW PUBLIC BRANCH. - -See ChangeLog.2 for earlier changes. diff --git a/GNUS-NEWS b/GNUS-NEWS deleted file mode 100644 index 8f63ecb..0000000 --- a/GNUS-NEWS +++ /dev/null @@ -1,112 +0,0 @@ -GNUS NEWS -- history of user-visible changes. -Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc. -See the end for copying conditions. - -Please send Gnus bug reports to bugs@gnus.org. -For older news, see Gnus info node "New Features". - - -* Changes in Oort Gnus - -** The nnml and nnfolder backends store marks for each groups. - -This makes it possible to take backup of nnml/nnfolder servers/groups -separately of .newsrc.eld, while preserving marks. It also makes it -possible to share articles and marks between users (without sharing -.newsrc.eld) within e.g. a department. - -** The menu bar (in Group and Summary buffer) named "Misc" has been - renamed to "Gnus". - -** The menu bar (in Message mode) named "MML" has been renamed to - "Attachments". - -** gnus-group-charset-alist and gnus-group-ignored-charsets-alist - -The regexps in these variables are compared with full group names -instead of real group names in 5.8. Users who customize these -variables should change those regexps accordingly. For example: - - ("^han\\>" euc-kr) -> ("\\(^\\|:\\)han\\>" euc-kr) - -** Gnus now supports PGP-MIME (RFC2015) and SMIME. - -** Gnus inlines external parts (message/external). - -** MML (Mime compose) prefix changed from `M-m' to `C-c C-m'. - -This change was made to avoid conflict with the standard binding of -`back-to-indentation', which is also useful in message mode. - - -* Changes in Pterodactyl Gnus (5.8/5.9) - -The Gnus NEWS entries are short, but they reflect sweeping changes in -four areas: Article display treatment, MIME treatment, -internationalization and mail-fetching. - -** The mail-fetching functions have changed. See the manual for the -many details. In particular, all procmail fetching variables are gone. - -If you used procmail like in - -(setq nnmail-use-procmail t) -(setq nnmail-spool-file 'procmail) -(setq nnmail-procmail-directory "~/mail/incoming/") -(setq nnmail-procmail-suffix "\\.in") - -this now has changed to - -(setq mail-sources - '((directory :path "~/mail/incoming/" - :suffix ".in"))) - -More information is available in the info doc at Select Methods -> -Getting Mail -> Mail Sources - -** Gnus is now a MIME-capable reader. This affects many parts of -Gnus, and adds a slew of new commands. See the manual for details. - -** Gnus has also been multilingualized. This also affects too -many parts of Gnus to summarize here, and adds many new variables. - -** gnus-auto-select-first can now be a function to be -called to position point. - -** The user can now decide which extra headers should be included in -summary buffers and NOV files. - -** `gnus-article-display-hook' has been removed. Instead, a number -of variables starting with `gnus-treat-' have been added. - -** The Gnus posting styles have been redone again and now works in a -subtly different manner. - -** New web-based backends have been added: nnslashdot, nnwarchive -and nnultimate. nnweb has been revamped, again, to keep up with -ever-changing layouts. - -** Gnus can now read IMAP mail via nnimap. - - -* For older news, see Gnus info node "New Features". - ----------------------------------------------------------------------- -Copyright information: - -Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc. - - Permission is granted to anyone to make or distribute verbatim copies - of this document as received, in any medium, provided that the - copyright notice and this permission notice are preserved, - thus giving the recipient permission to redistribute in turn. - - Permission is granted to distribute modified versions - of this document, or of portions of it, - under the above conditions, provided also that they - carry prominent notices stating who last changed them. - -Local variables: -mode: outline -paragraph-separate: "[ ]*$" -end: diff --git a/Makefile.in b/Makefile.in deleted file mode 100644 index 9a70c03..0000000 --- a/Makefile.in +++ /dev/null @@ -1,188 +0,0 @@ -prefix = @prefix@ -datadir = @datadir@ -infodir = @infodir@ -lispdir = @lispdir@ -srcdir = @srcdir@ - -@SET_MAKE@ -EMACS = @EMACS@ -XEMACS = @XEMACS@ -PACKAGEDIR = @PACKAGEDIR@ -GNUS_PRODUCT_NAME = @GNUS_PRODUCT_NAME@ - -# It may be needed for Meadow/NTEmacs when sh.exe is used for SHELL. -# Because Meadow/NTEmacs will get the value of the current-directory from -# the environment variable PWD, but sh.exe will not take care of it even -# if the current-directory has changed. So we should invalidate it. -PWD= - -# It will be used to look for the XEmacs package path if this file is -# mis-configured (e.g. configured for FSFmacs). -EXAMINE_PACKAGEDIR = $(XEMACS) -batch -q -no-site-file -eval \ - "(let (package-dir) \ - (if (boundp (quote early-packages)) \ - (let ((dirs (delq nil (append (if early-package-load-path \ - early-packages) \ - (if late-package-load-path \ - late-packages) \ - (if last-package-load-path \ - last-packages))))) \ - (while (and dirs (not package-dir)) \ - (if (file-directory-p (car dirs)) \ - (setq package-dir (car dirs) \ - dirs (cdr dirs)))))) \ - (princ (or package-dir \"\")))" 2>/dev/null - -all: lick info - -all-ja: lick info info-ja - -lick: - cd lisp && $(MAKE) EMACS="$(EMACS)" lispdir="$(lispdir)" all - -#install: install-lisp install-info install-etc -install: install-lisp install-info - -install-ja: install install-info-ja - -install-lisp: - cd lisp && $(MAKE) EMACS="$(EMACS)" lispdir="$(lispdir)" install - -install-info: - cd texi && $(MAKE) EMACS="$(EMACS)" infodir="$(infodir)" install - -install-etc: - cd etc && $(MAKE) EMACS="$(EMACS)" install - -install-info-ja: - cd texi && $(MAKE) EMACS="$(EMACS)" infodir="$(infodir)" install-ja - -## Rule for XEmacs package. -install-package: xclever compose-package remove-extra-files-in-package \ - install-package-lisp \ - install-package-info install-package-manifest - -install-package-ja: xclever compose-package remove-extra-files-in-package \ - install-package-lisp \ - install-package-info install-package-info-ja \ - install-package-manifest - -package: xlick xinfo compose-package - -package-ja: xlick xinfo xinfo-ja compose-package - -# Sub-rule for XEmacs package. -install-package-lisp: - @if test x$(PACKAGEDIR) = x; then \ - package_dir=`$(EXAMINE_PACKAGEDIR)`; \ - else \ - package_dir="$(PACKAGEDIR)"; \ - fi; \ - echo "cd lisp && $(MAKE) EMACS=$(XEMACS)" \ - "lispdir=$$package_dir""/lisp/$(GNUS_PRODUCT_NAME)" \ - "install-without-compiling"; \ - cd lisp && $(MAKE) EMACS="$(XEMACS)" \ - lispdir="$$package_dir""/lisp/$(GNUS_PRODUCT_NAME)" \ - install-without-compiling - -install-package-info: - @if test x$(PACKAGEDIR) = x; then \ - package_dir=`$(EXAMINE_PACKAGEDIR)`; \ - else \ - package_dir="$(PACKAGEDIR)"; \ - fi; \ - echo "cd texi && $(MAKE) EMACS=$(XEMACS)" \ - "infodir=$$package_dir""/info install-info"; \ - cd texi && $(MAKE) EMACS="$(XEMACS)" \ - infodir="$$package_dir""/info" install-info - -install-package-info-ja: - @if test x$(PACKAGEDIR) = x; then \ - package_dir=`$(EXAMINE_PACKAGEDIR)`; \ - else \ - package_dir="$(PACKAGEDIR)"; \ - fi; \ - echo "cd texi && $(MAKE) EMACS=$(XEMACS)" \ - "infodir=$$package_dir""/info install-ja-info"; \ - cd texi && $(MAKE) EMACS="$(XEMACS)" \ - infodir="$$package_dir""/info" install-ja-info - -install-package-manifest: - @if test x$(PACKAGEDIR) = x; then \ - package_dir=`$(EXAMINE_PACKAGEDIR)`; \ - else \ - package_dir="$(PACKAGEDIR)"; \ - fi; \ - echo "cd lisp && $(MAKE) EMACS=$(XEMACS) PACKAGEDIR=$$package_dir" \ - "install-package-manifest"; \ - cd lisp && $(MAKE) EMACS="$(XEMACS)" PACKAGEDIR=$$package_dir \ - install-package-manifest - -remove-extra-files-in-package: - @if test x$(PACKAGEDIR) = x; then \ - package_dir=`$(EXAMINE_PACKAGEDIR)`; \ - else \ - package_dir="$(PACKAGEDIR)"; \ - fi; \ - echo "cd lisp && $(MAKE) EMACS=$(XEMACS) PACKAGEDIR=$$package_dir" \ - "remove-extra-files-in-package"; \ - cd lisp && $(MAKE) EMACS="$(XEMACS)" PACKAGEDIR=$$package_dir \ - remove-extra-files-in-package - -compose-package: - cd lisp && $(MAKE) EMACS="$(XEMACS)" compose-package -## - -xclever: - cd lisp && $(MAKE) EMACS="$(XEMACS)" lispdir="$(lispdir)" clever - -xlick: - cd lisp && $(MAKE) EMACS="$(XEMACS)" lispdir="$(lispdir)" all - -xinfo: - cd texi && $(MAKE) EMACS="$(XEMACS)" all-info - -xinfo-ja: - cd texi && $(MAKE) EMACS="$(XEMACS)" ja-info - -# Rule for Lars and nobody else. -some: - cd lisp && $(MAKE) EMACS="$(EMACS)" some -l: - cd lisp && $(MAKE) EMACS="$(EMACS)" clever - -info: - cd texi && $(MAKE) EMACS="$(EMACS)" all - -info-ja: - cd texi && $(MAKE) EMACS=$(EMACS) ja - -clean: - rm -f */*.orig */*.rej *.orig *.rej - rm -f MANIFEST.* - for i in lisp texi; do (cd $$i; $(MAKE) clean); done - -elclean: - cd lisp && rm -f *.elc auto-autoloads.el custom-load.el gnus-load.el - -x: - $(MAKE) EMACS="$(XEMACS)" - -xsome: - $(MAKE) EMACS="$(XEMACS)" some - -distclean: clean - rm -rf *~ - for i in lisp texi etc; do (cd $$i; $(MAKE) distclean); done - rm -f config.log config.status config.cache Makefile - -config.status: $(srcdir)/configure - $(SHELL) ./config.status --recheck -$(srcdir)/configure: $(srcdir)/configure.in - cd $(srcdir) && autoconf -Makefile: $(srcdir)/Makefile.in config.status - CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/Mule23@1934.en b/Mule23@1934.en deleted file mode 100644 index ae13f11..0000000 --- a/Mule23@1934.en +++ /dev/null @@ -1,155 +0,0 @@ -How to build T-gnus with Mule 2.3 based on Emacs 19.34. - -FIXING loaddefs.el -================== - -Unfortunately, some variables for `message' are predefined in lisp/ -loaddefs.el which is dumped in Mule executable file. It is uninvited, -moreover, it has a bad influence. So you should remove these -definitions from lisp/loaddefs.el and rebuild Mule. However, if you -don't want to rebuild Mule, you may put the following lines in the -beginning of .emacs file instead of rebuilding Mule. - -(let ((symbols '(citation-line-function - cite-function courtesy-message default-headers - default-mail-headers default-news-headers - deletable-headers fcc-handler-function - followup-to-function from-style - generate-headers-first generate-new-buffers - ignored-bounced-headers ignored-cited-headers - ignored-mail-headers ignored-news-headers - ignored-resent-headers ignored-supersedes-headers - included-forward-headers indent-citation-function - interactive kill-buffer-on-exit post-method - reply-to-function required-mail-headers - required-news-headers send-mail-function - send-news-function signature - signature-before-forwarded-message signature-file - signature-separator syntax-checks use-followup-to - user-organization-file wide-reply-to-function - yank-prefix)) - symbol) - (while symbols - (setq symbol (car symbols) - symbols (cdr symbol)) - (makunbound (intern (format "message-%s" symbol))))) - - -INSTALL CUSTOM, APEL, FLIM, SEMI/WEMI -===================================== - -T-gnus requires the latest version of CUSTOM, APEL, FLIM and SEMI or -WEMI; you should install these packages before installing T-gnus. - -As for CUSTOM, you should apply the following patch before building it. - ------- cut here ------ cut here ------ cut here ------ cut here ------ ---- custom-1.9962/cus-face.el~ Wed Mar 4 19:52:39 1998 -+++ custom-1.9962/cus-face.el Mon Mar 9 08:05:33 1998 -@@ -96,7 +96,7 @@ - "Define a new FACE on all frames, ignoring X resources." - (interactive "SMake face: ") - (or (internal-find-face name) -- (let ((face (make-vector 8 nil))) -+ (let ((face (make-vector face-vector-length nil))) - (aset face 0 'face) - (aset face 1 name) - (let* ((frames (frame-list)) ------- cut here ------ cut here ------ cut here ------ cut here ------ - -By the way, the latest CUSTOM package for Emacs v19 is available from: - -ftp://ftp.dina.kvl.dk/pub/Staff/Per.Abrahamsen/custom/custom-1.9962.tar.gz - - -INSTALL T-gnus -============== - -There are three ways of making T-gnus with Mule 2.3 based on Emacs 19.34. - -1. If you have installed EMU, APEL, FLIM and SEMI or WEMI packages - under the standard load-path, for instance: - - EMU: /usr/local/share/mule/19.34/site-lisp/ - APEL: /usr/local/share/mule/site-lisp/apel/ - FLIM: /usr/local/share/mule/site-lisp/flim/ - SEMI: /usr/local/share/mule/site-lisp/semi/ - - What is more, if you have been replaced old CUSTOM with new CUSTOM - or if you have installed new CUSTOM directly under the standard - load-path as such as /usr/local/share/mule/19.34/site-lisp/, you - may have nothing to be done; type the following commands right now. - - % ./configure --with-emacs=mule - % make install - - However, if you have installed new CUSTOM in the subdirectory under - the standard load-path, use the configure option `--with-addpath=' - as follows: - - % ./configure --with-emacs=mule\ - --with-addpath=/usr/local/share/mule/site-lisp/custom/ - % make install - - or you can use the file subdirs.el under the parent directory of - the subdirectory of CUSTOM to add it into load-path which contain - the following contents: - - (normal-top-level-add-to-load-path - '("custom/" "and the other subdirectories.../")) - - and then just type: - - % ./configure --with-emacs=mule - % make install - -2. If you have installed EMU, APEL, FLIM and SEMI or WEMI packages in - the non-standard load-path, use the configure option - `--with-addpath=' with the colon separated directory names where - EMU, APEL or CUSTOM packages are installed. For example: - - % ./configure --with-emacs=mule\ - --with-addpath=~/elisp/emu/:~/elisp/apel/:~/elisp/custom/ - % make install - - In this case, you have no need to add paths of FLIM, SEMI or WEMI - if they are installed under the directory which is same as the - parent directory of APEL. - -3. This is another way to install T-gnus when you have installed EMU, - APEL, FLIM and SEMI or WEMI packages in the non-standard load-path. - Copy the file `sample.lpath.el' which is included in the - distribution to `~/.lpath.el' and modify it suitably for your - environment. And then type the following command. - - % ./configure --with-emacs=mule - % make install - - -USING Emacs-W3M (and Emacs W3) -============================== -The web based backend `nnshimbun' uses the shimbun modules which are -included in Emacs-W3M package (and the other web based backends of T- -gnus requires Emacs W3). Emacs-W3M is an interface program to the -external command W3M, visit the following pages for more information. - - http://emacs-w3m.namazu.org/ - http://ei5nazha.yz.yamagata-u.ac.jp/~aito/w3m/ - -If you wish to build T-gnus to be able to use Emacs-W3M and nnshimbun, -you have to specify the path where Emacs-W3M is installed using the -configure option `--with-addpath=' (for Emacs W3, use the configure -option `--with-w3=' or editing the file `~/.lpath.el'). Here is an -example for that: - - % ./configure --with-emacs=mule\ - --with-addpath=~/elisp/emu/:~/elisp/apel/: ... :~/elisp/w3m/\ - --with-w3=/usr/local/share/mule/site-lisp/w3/ - % make install - -;; Don't mind if configure says "W3... not found". It is currently -;; malfunction when the configure option `--with-w3=' is not used even -;; if the path of Emacs W3 is specified in the file `~/.lpath.el'. - -;; By the way, does anyone know where do we find Emacs W3 package -;; which is suitable to Mule 2.3 based on Emacs 19.34? diff --git a/Mule23@1934.ja b/Mule23@1934.ja deleted file mode 100644 index ec2aecf..0000000 --- a/Mule23@1934.ja +++ /dev/null @@ -1,160 +0,0 @@ -Emacs 19.34 $B$r%Y!<%9$K$7$?(B Mule 2.3 $B$G(B T-gnus $B$r:n$kJ}K!!#(B - -FIXING loaddefs.el -================== - -$B;DG0$J$3$H$K$$$/$D$+$N(B `message' $B$G;H$&JQ?t$,(B lisp/loaddefs.el $B$GDj5A(B -$B$5$l$F$$$F(B Mule $B$N7W(B -$B$J$*@$OC$@$7!"$7$+$b0-1F6A$,$"$j$^$9!#$=$3$G$"$J$?$O$=$l$i$NDj5A$r(B -lisp/loaddefs.el $B$+$i:o=|$7$F!"(BMule $B$r:n$jD>$5$J$1$l$P$J$j$^$;$s!#(B -$B$7$+$7!"$b$7$"$J$?$,(B Mule $B$r:n$jD>$9$3$H$rK>$^$J$$$J$i$P!"(B.emacs $B%U%!(B -$B%$%k$N@hF,$K0J2<$N3F9T$r=q$-9~$`$3$H$G!"(BMule $B$r:n$jD>$9Be$o$j$K$9$k$3(B -$B$H$,$G$-$^$9!#(B - -(let ((symbols '(citation-line-function - cite-function courtesy-message default-headers - default-mail-headers default-news-headers - deletable-headers fcc-handler-function - followup-to-function from-style - generate-headers-first generate-new-buffers - ignored-bounced-headers ignored-cited-headers - ignored-mail-headers ignored-news-headers - ignored-resent-headers ignored-supersedes-headers - included-forward-headers indent-citation-function - interactive kill-buffer-on-exit post-method - reply-to-function required-mail-headers - required-news-headers send-mail-function - send-news-function signature - signature-before-forwarded-message signature-file - signature-separator syntax-checks use-followup-to - user-organization-file wide-reply-to-function - yank-prefix)) - symbol) - (while symbols - (setq symbol (car symbols) - symbols (cdr symbol)) - (makunbound (intern (format "message-%s" symbol))))) - - -INSTALL CUSTOM, APEL, FLIM, SEMI -================================ - -T-gnus $B$O:G?7HG$N(B CUSTOM, APEL, FLIM $B$*$h$S(B SEMI $B$+(B WEMI $B$rI,MW$H$7$^(B -$B$9!#$"$J$?$O$3$l$i$N%Q%C%1!<%8$r(B T-gnus $B$NA0$K%$%s%9%H!<%k$7$J$1$l$P$J(B -$B$j$^$;$s!#(BCUSTOM $B$K$D$$$F$O!":n$kA0$K$"$J$?$O0J2<$N%Q%C%A$rEv$F$kI,MW(B -$B$,$"$j$^$9!#(B - ------- cut here ------ cut here ------ cut here ------ cut here ------ ---- custom-1.9962/cus-face.el~ Wed Mar 4 19:52:39 1998 -+++ custom-1.9962/cus-face.el Mon Mar 9 08:05:33 1998 -@@ -96,7 +96,7 @@ - "Define a new FACE on all frames, ignoring X resources." - (interactive "SMake face: ") - (or (internal-find-face name) -- (let ((face (make-vector 8 nil))) -+ (let ((face (make-vector face-vector-length nil))) - (aset face 0 'face) - (aset face 1 name) - (let* ((frames (frame-list)) ------- cut here ------ cut here ------ cut here ------ cut here ------ - -$B$J$*(B Emacs v19 $BMQ$N:G?7$N(B CUSTOM $B$O0J2<$N$b$N$rF~2<$K%$%s%9%H!<%k$7$F$$$k$J$i$P!"$"$J$?$O2?$b$9(B - $B$kI,MW$,$"$j$^$;$s!#:#$9$0$K0J2<$N%3%^%s%I$r%?%$%W$7$F2<$5$$!#(B - - % ./configure --with-emacs=mule - % make install - - $B$7$+$7!"$b$7$"$J$?$,?7$7$$(B CUSTOM $B$rI8=`$N(B load-path $B$N2<$N%5%V%G%#(B - $B%l%/%H%j$K%$%s%9%H!<%k$7$F$"$k$J$i$P!"0J2<$N$h$&$K(B configure $B%*%W(B - $B%7%g%s$N(B `--with-addpath=' $B$r;H$&$+!"(B - - % ./configure --with-emacs=mule\ - --with-addpath=/usr/local/share/mule/site-lisp/custom/ - % make install - - $B$"$k$$$O$"$J$?$O0J2<$NFbMF$r4^$`!"(BCUSTOM $B%5%V%G%#%l%/%H%j$N?F%G%#(B - $B%l%/%H%j$N2<$N(B subdirs.el $B%U%!%$%k$r;H$&$3$H$,$G$-$^$9!#(B - - (normal-top-level-add-to-load-path - '("custom/" "and the other subdirectories.../")) - - $B$=$7$FC1$K(B - - % ./configure --with-emacs=mule - % make install - - $B$H%?%$%W$7$F2<$5$$!#(B - -2. $B$b$7$"$J$?$,(B EMU, APEL, FLIM $B$*$h$S(B SEMI $B$^$?$O(B WEMI $B$N3F%Q%C%1!<(B - $B%8$rI8=`$G$O$J$$(B load-path $B$K%$%s%9%H!<%k$7$F$$$k$J$i$P!"%3%m%s$G(B - $B6h@Z$i$l$?(B EMU, APEL $B$*$h$S(B CUSTOM $B$,%$%s%9%H!<%k$5$l$F$$$k%G%#%l(B - $B%/%H%jL>$H(B configure $B%*%W%7%g%s$N(B `--with-addpath=' $B$r;H$C$F2<$5$$!#(B - $BNc$($P(B - - % ./configure --with-emacs=mule\ - --with-addpath=~/elisp/emu/:~/elisp/apel/:~/elisp/custom/ - % make - - $B$3$N>l9g!"$b$7(B FLIM, SEMI $B$^$?$O(B WEMI $B$,(B APEL $B$N?F%G%#%l%/%H%j$HF1(B - $B$8%G%#%l%/%H%j$N2<$K%$%s%9%H!<%k$5$l$F$$$k$J$i$P!"$=$l$i$N(B path $B$r(B - $BDI2C$9$kI,MW$O$"$j$^$;$s!#(B - -3. $B$3$l$O!"(BEMU, APEL, FLIM $B$*$h$S(B SEMI $B$^$?$O(B WEMI $B$N3F%Q%C%1!<%8$rI8(B - $B=`$G$O$J$$(B load-path $B$K%$%s%9%H!<%k$7$F$$$k>l9g$N!"JL$NJ}K!$G$9!#(B - $BG[I[$K4^$^$l$F$$$k%U%!%$%k(B `sample.lpath.el' $B$r(B `~/.lpath.el' $B$K%3(B - $B%T!<$7$F!"$"$J$?$N4D6-$K9g$&$h$&$K=q$-49$($F2<$5$$!#$=$7$F$N(B T-gnus $B$N%&%'%V$K(B -$B4p$E$$$?%P%C%/%(%s%I$O(B Emacs W3 $B$rI,MW$H$7$^$9(B)$B!#(BEmacs-W3M $B$O30It%3%^(B -$B%s%I(B W3M $B$X$N%$%s%?!<%U%'!<%9$r9T$J$&%W%m%0%i%`$G!">\:Y>pJs$K$D$$$F$O(B -$B0J2<$N%Z!<%8$rK,$M$F$_$F2<$5$$!#(B - - http://emacs-w3m.namazu.org/ - http://ei5nazha.yz.yamagata-u.ac.jp/~aito/w3m/ - -Emacs-W3M $B$H(B nnshimbun $B$,;H$($k$h$&$K(B T-gnus $B$r:n$k$K$O!"(BEmacs-W3M $B$,(B -$B%$%s%9%H!<%k$5$l$F$$$k%Q%9$r(B configure $B%*%W%7%g%s$N(B `--with-addpath=' -$B$G;XDj$7$J$1$l$P$J$j$^$;$s(B (Emacs W3 $BMQ$K$O(B `--with-w3=' $B$r;H$&$+!"$^(B -$B$?$O(B `~/.lpath.el' $B%U%!%$%k$rJT=8$7$F2<$5$$(B)$B!#0J2<$ONc$G$9!#(B - - % ./configure --with-emacs=mule\ - --with-addpath=~/elisp/emu/:~/elisp/apel/: ... :~/elisp/w3m/\ - --with-w3=/usr/local/share/mule/site-lisp/w3/ - % make install - -;; $B$b$7(B configure $B$,!V(BW3... not found$B!W$H8@$C$F$b5$$K$7$J$$$G2<$5$$!#(B -;; $B$?$H$((B `~/.lpath.el' $B%U%!%$%k$G(B Emacs W3 $B$N(B path $B$,;XDj$5$l$F$$$F$b!"(B -;; configure $B%*%W%7%g%s$N(B `--with-w3=' $B$r;H$o$J$$$H!"8=:_$=$l$O@5>o$K(B -;; $BF/$-$^$;$s$N$G!#(B - -;; $B$H$3$m$G!"C/$+(B Emacs 19.34 $B$r%Y!<%9$K$7$?(B Mule 2.3 $B$KE,9g$9$k(B Emacs -;; W3 $B$,$I$3$K$"$k$+CN$j$^$;$s$+(B? diff --git a/README-gnus-bbdb.en b/README-gnus-bbdb.en deleted file mode 100644 index 109da56..0000000 --- a/README-gnus-bbdb.en +++ /dev/null @@ -1,127 +0,0 @@ --*- mode: text; fill-column: 70; -*- - ---- - If BBDB is used then, bbdb-gnus.elc can't be shared with them before -Semi-gnus 6.8.X. It is necessary to byte-compile it again. - -;; It is a simple way that only bbdb-gnus.el is byte-compiled after -;; gnus starts. - ---- -gnus-bbdb.el - - This is the BBDB API module for Semi-gnus. `mime-bbdb' should not be -necessary for Semi-gnus, if that module were used. - - You need FLIM 1.11.3 or later. - - If you are using bbdb-auto-notes-hook, the patch listed at the end -of this file should be applied. If not, it might not. - - EXAMPLE: - -;; You need to set nothing for `mime-bbdb'. -;(setq mime-bbdb/use-mail-extr nil) -;(eval-after-load "mail-extr" '(require 'mime-bbdb)) - -(require 'bbdb) -(require 'gnus-bbdb) -(bbdb-initialize 'sc) ;; 'Gnus or 'gnus should be deleted. -(add-hook 'gnus-startup-hook 'gnus-bbdb-insinuate) -(add-hook 'message-setup-hook 'gnus-bbdb-insinuate-message) - - If you would like to decode the quoted encoded words forcibly, even -though FLIM does not decode them, put the following lines in your -.gnus file. - -(setq gnus-bbdb/decode-field-body-function - (function - (lambda (field-body field-name) - (eword-decode-string field-body)))) - ---- - This is a patch for bbdb.el / bbdb-hooks.el. - ------- cut here ------ cut here ------ cut here ------ cut here ------ ---- bbdb-2.32/lisp/bbdb-com.el~ Sun Feb 18 08:00:39 2001 -+++ bbdb-2.32/lisp/bbdb-com.el Sun Feb 18 08:00:39 2001 -@@ -1620,7 +1620,7 @@ - ;; to be enclosed in quotes. Double-quotes and backslashes have - ;; already been escaped. This quotes a few extra characters as - ;; well (!,%, and $) just for common sense. -- ((string-match "[][\000-\037\177()<>@,;:.!$%]" name) -+ ((string-match "[][\000-\037\177<>@,;.!$%]" name) - (format "\"%s\" <%s>" name net)) - (t - (format "%s <%s>" name net))))) ---- bbdb-2.32/lisp/bbdb-hooks.el~ Tue Jan 30 08:00:56 2001 -+++ bbdb-2.32/lisp/bbdb-hooks.el Tue Jan 30 08:00:56 2001 -@@ -83,6 +83,8 @@ - ;; - ;; - -+(eval-when-compile (require 'cl)) -+ - (require 'bbdb) - - (defmacro the-v18-byte-compiler-sucks-wet-farts-from-dead-pigeons () -@@ -415,12 +417,23 @@ - (marker (bbdb-header-start)) - field pairs fieldval ; do all bindings here for speed - regexp string notes-field-name notes -- replace-p replace-or-add-msg) -+ replace-p replace-or-add-msg -+ extract-field-value-funtion) - (set-buffer (marker-buffer marker)) - (save-restriction -- (widen) -- (goto-char marker) -- (if (and (setq fieldval (bbdb-extract-field-value "From")) -+ (let ((function-list bbdb-extract-field-value-function-list) -+ function) -+ (or (progn -+ (while (and (not extract-field-value-funtion) -+ (setq function (car function-list))) -+ (setq extract-field-value-funtion (funcall function) -+ function-list (cdr function-list))) -+ extract-field-value-funtion) -+ (progn -+ (widen) -+ (goto-char marker) -+ (setq extract-field-value-funtion 'bbdb-extract-field-value)))) -+ (if (and (setq fieldval (funcall extract-field-value-funtion "From")) - (string-match (bbdb-user-mail-names) fieldval)) - ;; Don't do anything if this message is from us. Note that we have - ;; to look at the message instead of the record, because the record -@@ -431,7 +444,7 @@ - (goto-char marker) - (setq field (car (car ignore-all)) - regexp (cdr (car ignore-all)) -- fieldval (bbdb-extract-field-value field)) -+ fieldval (funcall extract-field-value-funtion field)) - (if (and fieldval - (string-match regexp fieldval)) - (setq ignore t) -@@ -444,7 +457,8 @@ - pairs (cdr (car rest)) ; (REGEXP . STRING) or - ; (REGEXP FIELD-NAME STRING) or - ; (REGEXP FIELD-NAME STRING REPLACE-P) -- fieldval (bbdb-extract-field-value field)) ; e.g., Subject line -+ fieldval (funcall extract-field-value-funtion field)) -+ ; e.g., Subject line - (when fieldval - (while pairs - (setq regexp (car (car pairs)) ---- bbdb-2.32/lisp/bbdb.el~ Sun Mar 4 20:30:09 2001 -+++ bbdb-2.32/lisp/bbdb.el Sun Mar 4 20:30:09 2001 -@@ -710,6 +710,7 @@ - (defvar bbdb-showing-changed-ones nil) - (defvar bbdb-modified-p nil) - (defvar bbdb-elided-display nil) -+(defvar bbdb-extract-field-value-function-list nil) - - (defvar bbdb-debug t) - (defmacro bbdb-debug (&rest body) ------- cut here ------ cut here ------ cut here ------ cut here ------ - ---- diff --git a/README-gnus-bbdb.ja b/README-gnus-bbdb.ja deleted file mode 100644 index 81299ab..0000000 --- a/README-gnus-bbdb.ja +++ /dev/null @@ -1,161 +0,0 @@ --*- mode: text; fill-column: 70; -*- - ---- -BBDB $B$r;HMQ$5$l$F$$$kJ}$O!"(B bbdb-gnus.elc $B$r(B Semi-gnus 6.8.X $B0JA0$N$b(B -$B$N$H6&M-$9$k$3$H$O$G$-$^$;$s!#I,$:!"(B byte-compile $B$7D>$7$F$/$@$5$$!#(B - -;; gnus $B$r5/F0$7$?$"$H$G!"(B bbdb-gnus.el $B$N$_$r(B byte-compile $B$9$k$H$$$&(B -;; $B$N$,$*l9g$K$O(B mime-bbdb $B$,ITMW$K$J$j$^$9!#(B - -1.11.3 $B0J9_$N(B FLIM $B$,I,MW$G$9!#(B - -bbdb-auto-notes-hook $B$r;HMQ$7$F$$$J$$J}$K$OITMW$G$9$,!";HMQ$7$F$$$kJ}(B -$B$O(B bbdb.el / bbdb-hooks.el $B$K$3$N%U%!%$%k$N:G8e$K$"$k(B patch $B$r$"$F$kI,(B -$BMW$,$"$j$^$9!#(B - -$B@_DjNc(B: - -;; mime-bbdb $B$K4X$9$k@_Dj$OITMW$G$9!#(B -;(setq mime-bbdb/use-mail-extr nil) -;(eval-after-load "mail-extr" '(require 'mime-bbdb)) - -(require 'bbdb) -(require 'gnus-bbdb) -(bbdb-initialize 'sc) ;; 'gnus / 'Gnus $B$O$O$:$7$F$/$@$5$$!#(B -(add-hook 'gnus-startup-hook 'gnus-bbdb-insinuate) -(add-hook 'message-setup-hook 'gnus-bbdb-insinuate-message) - -FLIM $B$G$O(B quote $B$5$l$?(B eword encoded word $B$O(B decode $B$5$l$^$;$s$,!"$=$l(B -$B$r6/@)E*$K(B decode $B$7$?$$>l9g$K$O!"@,;:.!$%]" name) -+ ((string-match "[][\000-\037\177<>@,;.!$%]" name) - (format "\"%s\" <%s>" name net)) - (t - (format "%s <%s>" name net))))) ---- bbdb-2.32/lisp/bbdb-hooks.el~ Tue Jan 30 08:00:56 2001 -+++ bbdb-2.32/lisp/bbdb-hooks.el Tue Jan 30 08:00:56 2001 -@@ -83,6 +83,8 @@ - ;; - ;; - -+(eval-when-compile (require 'cl)) -+ - (require 'bbdb) - - (defmacro the-v18-byte-compiler-sucks-wet-farts-from-dead-pigeons () -@@ -415,12 +417,23 @@ - (marker (bbdb-header-start)) - field pairs fieldval ; do all bindings here for speed - regexp string notes-field-name notes -- replace-p replace-or-add-msg) -+ replace-p replace-or-add-msg -+ extract-field-value-funtion) - (set-buffer (marker-buffer marker)) - (save-restriction -- (widen) -- (goto-char marker) -- (if (and (setq fieldval (bbdb-extract-field-value "From")) -+ (let ((function-list bbdb-extract-field-value-function-list) -+ function) -+ (or (progn -+ (while (and (not extract-field-value-funtion) -+ (setq function (car function-list))) -+ (setq extract-field-value-funtion (funcall function) -+ function-list (cdr function-list))) -+ extract-field-value-funtion) -+ (progn -+ (widen) -+ (goto-char marker) -+ (setq extract-field-value-funtion 'bbdb-extract-field-value)))) -+ (if (and (setq fieldval (funcall extract-field-value-funtion "From")) - (string-match (bbdb-user-mail-names) fieldval)) - ;; Don't do anything if this message is from us. Note that we have - ;; to look at the message instead of the record, because the record -@@ -431,7 +444,7 @@ - (goto-char marker) - (setq field (car (car ignore-all)) - regexp (cdr (car ignore-all)) -- fieldval (bbdb-extract-field-value field)) -+ fieldval (funcall extract-field-value-funtion field)) - (if (and fieldval - (string-match regexp fieldval)) - (setq ignore t) -@@ -444,7 +457,8 @@ - pairs (cdr (car rest)) ; (REGEXP . STRING) or - ; (REGEXP FIELD-NAME STRING) or - ; (REGEXP FIELD-NAME STRING REPLACE-P) -- fieldval (bbdb-extract-field-value field)) ; e.g., Subject line -+ fieldval (funcall extract-field-value-funtion field)) -+ ; e.g., Subject line - (when fieldval - (while pairs - (setq regexp (car (car pairs)) ---- bbdb-2.32/lisp/bbdb.el~ Sun Mar 4 20:30:09 2001 -+++ bbdb-2.32/lisp/bbdb.el Sun Mar 4 20:30:09 2001 -@@ -710,6 +710,7 @@ - (defvar bbdb-showing-changed-ones nil) - (defvar bbdb-modified-p nil) - (defvar bbdb-elided-display nil) -+(defvar bbdb-extract-field-value-function-list nil) - - (defvar bbdb-debug t) - (defmacro bbdb-debug (&rest body) ------- cut here ------ cut here ------ cut here ------ cut here ------ - ---- -gnus-bbdb/split-mail() - -nnmail-split-fancy $B$G;HMQ$9$k$?$a$N4X?t$G$9!#l9g!"(B - `foo-group' $B$K?6$jJ,$1$^$9!#(B - -*2 : `company' $B%U%#!<%k%I$,(B `bar' $B$G;O$^$C$F$$$k>l9g!"(B`company' $B%U%#!<(B - $B%k%I$NFbMF$r$=$N$^$^%0%k!<%WL>$H$7$F;HMQ$7!"?6$jJ,$1$^$9!#(B - -*3 : `group' $B%U%#!<%k%I$,$"$k>l9g!"(B`group' $B%U%#!<%k%I$NFbMF$r$=$N$^$^(B - $B%0%k!<%WL>$H$7$F;HMQ$7!"?6$jJ,$1$^$9!#(B - -*4 : `note' $B%U%#!<%k%I$K(B `my friend' $B$,4^$^$l$k>l9g!"$=$N8e$m$K;XDj$5(B - $B$l$?5,B'$G?6$jJ,$1$^$9!#$3$N5,B'$N5-=RJ}K!$O!"DL>o$N(B - `nnmail-split-fancy' $B$G$N5-=RJ}K!$HF1$8$b$N$G$9!#(B diff --git a/README-offline.en b/README-offline.en deleted file mode 100644 index 65af7ee..0000000 --- a/README-offline.en +++ /dev/null @@ -1,203 +0,0 @@ -1) What's "gnus-offline (Gnus Offline Backend Utility)" ? -========================================================= - -This program is a utility for T-gnus that handles messages -(i.e. mail and news) in the "offline" state in a more simple way. - -It is basically designed for "gnus-agent". (See info about gnus-agent.) - -You can also use it with a function "nnspool"(*1) (which needs an -external program such as "gnspool"(*2) ), or with "miee.el"(*3) for -posting and/or sending messages. - - (*1) See info about nnspool. - (*2) gnspool comes with a newsreader "gn". - (*3) The latest version of miee.el (or MIEE) is available at - http://www.shiojiri.ne.jp/%7Et-ichi/meadow.html - -You can handle messages in the offline state without "gnus-offline", -but "gnus-offline" provides a simple way for setup and operation. - -**Features** - -o Simple configuration -- An "INTERACTIVE" configuration to set - the variables. - -o Simple operation -- Type "g" in the *Group* buffer, and gnus-offline - will: - o Dial (*) - o Send mails & post news articles - o Fetch new mails & articles - o Hang up (*) - - (*) For dialing and hanging up, external softwares are needed. - But you can do without ones if you connect and disconnect - manually. - -This document is written mainly for the case using "gnus-agent" with -gnus-offline.el bundled in T-gnus 6.12.0 or later. - -2) Installation -=============== - -As you are reading this document, this version of T-gnus includes -gnus-offline. Installation is simple. "make install" will -automatically install "gnus-offline". - -3) How to use -============= - -o First, you must do a general setup for T-gnus (See info about the - setup). - -o Add the following code to ~/.emacs - - (autoload 'gnus-plugged "gnus-agent" nil t) - (autoload 'gnus-unplugged "gnus-agent" nil t) - -o Add the following code to ~/.emacs - - (load "gnus-ofsetup") - (gnus-setup-for-offline) - -o Add the following code to ~/.gnus - - (gnus-agentize) - -o Restart Emacs. gnus-ofsetup.el will ask you some questions and - create ~/.gnus-offline.el. (*) - - (*) If you don't know how to answer some questions, typing "TAB" - key may show you the possible answers. See the next section - which explains the user options. - You will also be asked whether to save the POP password in - ~/.newsrc.eld or not. Answer it carefully. See section 6) - for details. - -o At the first time, you must start Gnus in the online state - (by M-x gnus-plugged) and decide which groups to subscribe (See info - about subscribing). - - From now on you can start Gnus as an offline reader by M-x gnus-unplugged. - Try typing "g" in the *Group* buffer. - -o You may want M-x gnus to start Gnus as an offline reader as - M-x gnus-unplugged. Then write the following code to ~/.emacs - - (setq gnus-plugged nil) - - you can put it into ~/.gnus if there's no need to start Gnus as an online - reader (by M-x gnus-plugged). - -4) User customizable variables in gnus-offline -============================================== - -o gnus-offline-dialup-program - Program name to dialup. - -o gnus-offline-dialup-program-arguments - List of dialup program arguments. - -o gnus-offline-hangup-program - Program name to hangup. - -o gnus-offline-hangup-program-arguments - List of hangup program arguments. - -o gnus-offline-mail-spool-directory - Spool directory for sending mail. - This variable is available only using MIEE. - -o gnus-offline-news-spool-directory - Spool directory for sending news. - This variable is available only using MIEE. - -o gnus-offline-mail-treat-environ - If t , gnus-offline sends mail to spool first. - If nil , gnus-offline sends mail immediately. - -o gnus-offline-articles-to-fetch - Article type you want to fetch. - - 'both ... Fetch both Mail/News. - 'Mail ... Fetch only Mail. - 'News ... Fetch only News. - - Default value is both. - -o gnus-offline-load-hook - Hook before gnus-offline load. - -o gnus-offline-before-online-hook - Hook before all online jobs. - -o gnus-offline-after-online-hook - Hook after all online jobs. - -o gnus-offline-interval-time - Interval time to do all online jobs.(minutes) - -o gnus-offline-MTA-type - MTA type to sending mail. - - 'smtp ... Use smtp.el. - 'sendmail ... Use sendmail.el. - -o gnus-offline-drafts-queue-type - Message queue type when spooling message. - - 'miee ... Use miee.el. - 'agent ... Use gnus-agent.el. - -o gnus-offline-after-empting-spool-hook - Hook before empting spool. - -o gnus-offline-before-empting-spool-hook - Hook after emoting spool. - -o gnus-offline-dialup-function - Function to dialup. - -o gnus-offline-hangup-function - Function to hangup. - -5) Commands in gnus-offline -=========================== - -o M-x gnus-offline-toggle-plugged - Toggle offline/online state. - -o M-x gnus-offline-toggle-auto-hangup - Change current state to offline. - -o M-x gnus-offline-toggle-on/off-send-mail - Toggle method to sending mail. - -o M-x gnus-offline-toggle-articles-to-fetch - Toggle articles you want to fetch. - -o M-x gnus-offline-set-interval-time - Set interval time(minute) to fetch article. - -o M-x gnus-offline-agent-expire - Expire articles. - -6) [!!!IMPORTANT!!!] About the pop password -=========================================== - -If your machine is stand alone, and nobody else uses it, you can save -the password. (But, on your own responsibility!) - -At the first interactive configuration, it will ask you whether to -save the password in ~/.newsrc.eld or not. When you answer "y" to this -question, the password will be saved in ~/.newsrc.eld. (*) - - (*) Actually the following will be added to ~/.gnus-offline.el. - - (add-hook - 'gnus-setup-news-hook - (lambda () - (add-to-list 'gnus-variable-list 'mail-source-password-cache))) - -Answer this question carefully, because the password will NOT be -encoded! diff --git a/README-offline.ja b/README-offline.ja deleted file mode 100644 index 40e7245..0000000 --- a/README-offline.ja +++ /dev/null @@ -1,206 +0,0 @@ -1) gnus-offline (Gnus Offline Backend Utility)$B$C$F2?(B? - -$B$3$l$O(B T-gnus $B$G%a%C%;!<%8$r$h$jMF0W$K%*%U%i%$%s4D6-$G07$&$?$a$N%f!<%F%#(B -$B%j%F%#$G$9!#(B - -$BH$7$F$/$@$5$$!#(B - (*) gnspool $B$O(B gn $B$H$$$&%K%e!<%9%j!<%@!<$H6&$KG[I[$5$l$F$$$^$9!#(B - (*) miee.el $B$N:G?7HG$O0J2<$N>l=j$+$i$B%a%$%k(B - $B$*$h$S(B $B%M%C%H%K%e!<%9$NAw$B%@%$%"%k%"%C%W$N@ZCG(B $B$H$$$&F0:n$r0l5$(B - $B$K9T$&$3$H$,2DG=$K$J$j$^$9!#(B($B$?$@$7@\B3!&$*$h$S@ZCG$OJLES@lMQ$N%D!<(B - $B%k$,I,MW$G$9(B) - -$B$J$*!"$3$N%I%-%e%a%s%H$G$Ol9g!"(Bgnus-offline.el $B$OFC$K2?$b9M$($J$/$F$b(B T-gnus -$B$HF1;~$K%$%s%9%H!<%k$5$l$^$9!#(B - -3) $B;H$$J}(B - -$B!&(BT-gnus $B$N0lHLE*$J;HMQJ}K!$K$D$$$F(B info $B$J$I$GD4$Y$F@_Dj$7$F$/$@$5$$!#(B - -$B!&0J2<$N%3!<%I$r(B .emacs $B$K2C$($^$9!#(B - - (autoload 'gnus-plugged "gnus-agent" nil t) - (autoload 'gnus-unplugged "gnus-agent" nil t) - -$B!&0J2<$N%3!<%I$r(B .emacs $B$K2C$($^$9!#(B - - (load "gnus-ofsetup") - (gnus-setup-for-offline) - -$B!&0J2<$N%3!<%I$r(B .gnus $B$K2C$($^$9!#(B - - (gnus-agentize) - -$B!&(BEmacs $B$r:F5/F0$7$^$9!#$9$k$H!"(Bgnus-ofsetup.el $B$,5/F0$7$^$9$N$G!"BPOC(B - $BE*$KI,MW$JJQ?t$N@_Dj$r9T$$$^$9!#(B - ($B2?$rF~NO$7$?$i$$$$$+$o$+$i$J$$>l9g$O(B 4) $B$r;2>H$9$k$+!"(BTAB $B$GF~NO(B - $B2DG=$J8uJd$r0lMwI=<($5$;$k$+$7$F$/$@$5$$(B) - $B$9$Y$F@_Dj$9$k$H%[!<%`%G%#%l%/%H%j$K(B .gnus-offline.el $B$H$$$&%U%!%$%k(B - $B$,=PMh>e$,$j$^$9!#(B(*) - - (*) $B!V(BPOP $B%Q%9%o!<%I$r(B ~/.newsrc.eld $B$KJ]B8$9$k$+$I$&$+!We$GEz$($F$/$@$5$$!#>\$7$/$O(B 6) - $B$r;2>H$7$F2<$5$$!#(B - -$B!&$3$N$"$H0lC6(B M-x gnus-plugged $B$G(B Gnus $B$r5/F0$7$F!"9XFI$9$k%0%k!<%W$r(B - $B7h$a$F$/$@$5$$!#(B($B>\$7$$J}K!$O(B Gnus $B$N(B info $B$r8+$F$/$@$5$$(B) - - $B$=$7$F(B $Bl9g$O!"(B.emacs $B$K(B - - (setq gnus-plugged nil) - - $B$r=q$$$F2<$5$$!#$b$7(B M-x gnus-plugged $B$r;H$o$J$$$J$i$P!"$3$l$r(B .gnus $B$K(B - $B=q$/$H$$$&(B - -$B!&(Bgnus-offline-dialup-program-arguments - $B%@%$%"%k%"%C%W%W%m%0%i%`$N0z?t$N%j%9%H(B - $BNc$($P!"(Bgnus-offline-dialup-program $B$K(B "-s AAA" $B$rEO$9>l9g$O(B - (setq gnus-offline-dialup-program-arguments '("-s" "AAA")) - $B$H5-=R$7$F$/$@$5$$!#(B - -$B!&(Bgnus-offline-hangup-program - $B2s@~$r@ZCG$9$k%W%m%0%i%`L>(B - -$B!&(Bgnus-offline-hangup-program-arguments - $B@ZCG$9$k%W%m%0%i%`$N0z?t$N%j%9%H(B - $BNc$($P!"(Bgnus-offline-hangup-program $B$K(B "-s AAA" $B$rEO$9>l9g$O(B - (setq gnus-offline-hangup-program-arguments '("-s" "AAA")) - $B$H5-=R$7$F$/$@$5$$!#(B - -$B!&(Bgnus-offline-mail-spool-directory - $BAw?.%a!<%k$N%9%W!<%k%G%#%l%/%H%j(B - Offline $B>uBV$G(B Mail $B$rAw?.$9$k$H0lC6$3$3$G;XDj$7$?%G%#%l%/%H%j$KJ](B - $BB8$5$l$^$9!#(B - MIEE $B$r;HMQ$9$k>l9g0J30L58z$G$9!#(B - -$B!&(Bgnus-offline-news-spool-directory - $BAw?.%K%e!<%9$N%9%W!<%k%G%#%l%/%H%j(B - Offline $B>uBV$G(B News $B$rAw?.$9$k$H0lC6$3$3$G;XDj$7$?%G%#%l%/%H%j$KJ](B - $BB8$5$l$^$9!#(B - MIEE $B$r;HMQ$9$k>l9g0J30L58z$G$9!#(B - -$B!&(Bgnus-offline-mail-treat-environ - Mail $B$NAw?.$r(B Online/Offline $B$G9T$&;v$r@Z$jBX$($k(B - -$B!&(Bgnus-offline-articles-to-fetch - fetch $B$9$k5-;v$r@Z$jBX$($k(B both->mail->news->both... - 'both ... Mail/News $B$rN>J}2A$5$l$k(B hook - -$B!&(Bgnus-offline-before-online-hook - Online job $BD>A0$KI>2A$5$l$k(B hook - -$B!&(Bgnus-offline-after-online-hook - Online job $B=*N;D>A0$KI>2A$5$l$k(B hook - -$B!&(Bgnus-offline-interval-time - Online job $B$r9T$&4V3V(B($BJ,(B) - Emacs $B$,(B idle $B>uBV$K$J$C$F$+$i$3$3$G;XDj$7$?;~4VKh$K(B Online $B>uBV$K(B - $B$7(B Mail/News $B$r2A$5$l$k(B hook - -$B!&(Bgnus-offline-before-empting-spool-hook - $BAw?.%a%C%;!<%8$rAw?.8e$K!"6u$K$J$C$?8eI>2A$5$l$k(B hook - -$B!&(Bgnus-offline-dialup-function - $B@\B3$K;HMQ$9$k4X?tL>(B - -$B!&(Bgnus-offline-hangup-function - $B@ZCG$K;HMQ$9$k4X?tL>(B - -$B!&(Bgnus-offline-mail-source - $B%a!<%k%5!<%P!$N%j%9%H(B - -5) gnus-offline M-x $B$GuBV(B/Online $B>uBV$r@ZBX$($^$9!#(B - -$B!&(BM-x gnus-offline-toggle-auto-hangup - offline $B>uBV$K$7$^$9!#(B - -$B!&(BM-x gnus-offline-toggle-on/off-send-mail - Online $B>uBV(B/Offline $B>uBV$G$N(B Mail $BAw?.>uBV$r@ZBX$($^$9!#(B - Online $B>uBV$G$OD>@\Aw?.$7$^$9$,!"(BOffline $B>uBV$G$O0lC6(B spool $B$K=q$-9~(B - $B$_!"(B"g" $B$r2!$7$?;~$KA4ItAw?.$5$l$^$9!#(B - -$B!&(BM-x gnus-offline-toggle-articles-to-fetch - $B mail -> news -> both ... $B$N$h$&$K(B - $B@Z$jBX$o$j$^$9!#(B - -$B!&(BM-x gnus-offline-set-interval-time - $B5-;v(B/Mail $B$Nl9g$K$OF~NO$NJ$/J}K!$,$"$j$^$9!#(B -$B$?$@$7!"EvA3%Q%9%o!<%I$rEp$^$l$k4m81$OA}$7$^$9$N$Gl9g$OJ]B8$5$l$k%Q%9%o!<%I$OJ?J8$N$^$^$J$N$G$+$J$j4m81$G$"$k(B -$B$3$H$r$4>5CN$N$&$($*;H$$$/$@$5$$!#(B diff --git a/README.T-gnus b/README.T-gnus deleted file mode 100644 index 1966194..0000000 --- a/README.T-gnus +++ /dev/null @@ -1,38 +0,0 @@ -======================================================================== -Codename: T-gnus -Branch Tag: t-gnus-6_15-quimby -Branch Status: Develop, Synchronize with Oort Gnus -Branch Goal: Implement latest features of gnus and offline features - Use Gnus in Offline status. -Branch Policy: (not defined yet) -======================================================================== -NEWS: - -* New codename: "T-gnus" - - In order to distinguish this branch from the other branches, codename - was changed to "T-gnus" , gnu with T-Shirt. - -* New Features - - Use T-gnus in offline(Unplugged) status using gnus-offline. - T-gnus have also features that have the branches `shuhei-k', `chao-6_9' - `keiichi', ... and the MainTrunk. - - If you would like to make T-gnus with Mule 2.3 based on Emacs 19.34, - see Mule23@1934 file for more information. - - You can use some convenient configure options, e.g. `--with-addpath=', - to build T-gnus easier. Try `./configure --help'. - - And added many other features by "ELIPS" - -* TODO - - See TODO.ja - -* T-gnus 6.15 - this is based on Oort Gnus. - - The latest T-gnus is T-gnus 6.15.4 (based on Oort Gnus 0.04). It - requires SEMI/WEMI (1.13.5 or later), FLIM (1.13.1 or later), and - APEL (10.0 or later). diff --git a/README.branch b/README.branch deleted file mode 100644 index c97790c..0000000 --- a/README.branch +++ /dev/null @@ -1,162 +0,0 @@ -README.branch --- description of branches and tags. (DRAFT) -======================================================================== - -Semi-gnus revision tree (2001-04-16) - - vendor personal main trunk public - branch branches branches ------------------------------------------------------------------------- -qGnus 0.?? ------> Semi-gnus 6.0.0 - : : - : himi <-- 6.0.7 - : ichikawa <------ 6.0.8 - : | | - : 6.8.17 ---+ : - : : : : - : V : - : pgnus-ichikawa : - : | : - : 6.9.01 : - : : : (1999.07.02: turn into the public branch) - : +-------->---------------+ - : : : - : : V - : : 6.10.072 -----> t-gnus-6_12 - : : : \ (for FLIM 1.12, - : : : \ stable) - : : : \ - : : : --> t-gnus-6_13 - : : : (for FLIM 1.13, - : : : develop) - : : : : - : : t-gnus-6_10-last- t-gnus-6_13-last- - : : | feedback | - : : +<--------------+ - : : | | - : ------------<---------------+ t-gnus-6_14 - : Oort Gnus / : | (for FLIM 1.13, - : | | : : develop) - : V V : : | - : t-gnus-6_15-quimby<---<-----(t-gnus-6_14-quimby)<-----+ - : | : : | - : : : | feedback | - : : +<--------------+ - : : | | - : akr <-- 6.2.3 : t-gnus-6_15 - : shuhei-k <-- 6.3.1 (for FLIM 1.13, -Gnus 5.6.11 ------> 6.3.3 develop) - : 6.4.0 (for SEMI 1.5) | - : (6.4.?)------> for SEMI 1.5 : - : | \ - : | \ -(Synch with original Gnus | ---> for SEMI 1.6 - was done many times, but (6.4.?)------> 6.5 (for SEMI 1.7) - we don't include them.) | / 6.5.0 - : | (?)/ - : | <--- - : (6.5.?)------> 6.6 (for SEMI 1.8, FLIM 1.7) - : | \ 6.6.0 stable branch - : | \ - : | ---> 6.7 (for SEMI 1.8, FLIM 1.7) - : | 6.7.0 stable branch - : sync | : -Gnus 5.6.22 ------> | feedback 6.7.7 - : (6.7.8)<------ 6.7.8 - : | \ - : | \ - : | ---> 6.8 (for SEMI 1.8, FLIM 1.8) - : keiichi <-- 6.8.18 6.8.0 stable branch - : sync | : -Gnus 5.6.45 ------> | feedback 6.8.20 - : (6.8.20)<------ 6.8.20 - : | \ - : | \ - : | --> 6.9 (for SEMI 1.11, FLIM 1.12) - : | 6.9.1 stable branch - : | feedback 6.9.2 - : (6.9.2)<---------6.9.2 - : | \ - : | \ - : | --> 6.10 (for SEMI 1.12, FLIM 1.12) - : | 6.10.1 develop branch - : : : - : : : -======================================================================== - -The Vendor Branch - - Original version of Gnus. - Each version has a tag of the form "qgnus-0_XY" or "gnus-5_X_Y" or - "pgnus-0_XY". - - The branch tag for the vendor branch is "larsi". - -The Main Trunk - - Semi-gnus was developed on the main trunk until current branch- - management plan (See "Public Branches" below) was introduced. - Each version has a tag of the form "gnus-6_N2_N3". (0 < N2 < 5) - -Public Branches - - Current main stream of Semi-gnus development. - - [Goal and policy of public branches here ???] - - Each branch has a tag of the form "gnus-N1_N2" and each version - has a tag of the form "gnus-N1_N2_N3". - - N1, N2, and N3 are changed by the following rules. - - N1 will be incremented if any fundamental architecture change is - made. Of cource, in this case, N2 and N3 will be reset to zero. - - N2 will be incremented and new branch will be made if any "major - changes" are made. "major changes" include API changes, major - version up of original Gnus, or synchronization with original Gnus - which requires design decision. - - N3 will be incremented if some "minor changes" are made. "minor - changes" include small bug fix or synchronization with original Gnus - without design decision. - - The following branch tags are currently available. - - for-semi-1_5 Semi-gnus for SEMI 1.5 API - for-semi-1_6 Semi-gnus for SEMI 1.6 API - gnus-6_5 Semi-gnus for SEMI 1.7 API - gnus-6_6 Semi-gnus for SEMI 1.8, FLIM 1.7 API (stable) - gnus-6_7 Semi-gnus for SEMI 1.8, FLIM 1.7 API (stable) - gnus-6_8 Semi-gnus for SEMI 1.8, FLIM 1.8 API (stable) - gnus-6_9 Semi-gnus for SEMI 1.11, FLIM 1.12 API (stable) - gnus-6_10 Semi-gnus for SEMI 1.12, FLIM 1.12 API (develop) - pgnus-ichikawa (Main trunk of T-gnus) - t-gnus-6_12 T-gnus for SEMI 1.12/1.13, FLIM 1.12 API (stable) - t-gnus-6_13 T-gnus for SEMI 1.13, FLIM 1.13 API (develop) - t-gnus-6_14 T-gnus for SEMI 1.13, FLIM 1.13 API (develop) - t-gnus-6_15 T-gnus for SEMI 1.13, FLIM 1.13 API (develop) - t-gnus-6_15-quimby T-gnus for SEMI 1.13, FLIM 1.13 API (develop) - -Personal Branches - - Some Semi-gnus developers have their own "personal branches". - Each personal branch may have its own goal and/or policy. - See README.${tag} (if exists) for information of each branch. - - The following branch tags are curretly available. - - himi Owner: Miyashita Hisashi - ichikawa Owner: Tatsuya Ichikawa - akr Owner: Tanaka Akira - shuhei-k Owner: Shuhei KOBAYASHI - keiichi Owner: Keiichi Suzuki - -"semi-gnus" Tag - - Was assigned to the latest stable version. - Currently not maintained. (XXX: ???) - -"for-semi-N1_N2" Tags - - Were assigned to corresponding version of SEMI API N1.N2. - We will not use this convention any longer. (XXX: ???) diff --git a/README.branch.ja b/README.branch.ja deleted file mode 100644 index 3e54c4c..0000000 --- a/README.branch.ja +++ /dev/null @@ -1,163 +0,0 @@ -README.branch.ja --- branch $B$H(B tag $B$N@bL@(B ($BAp9F(B) -======================================================================== - -Semi-gnus revision tree (2001-04-16) - - vendor personal main trunk public - branch branches branches ------------------------------------------------------------------------- -qGnus 0.?? ------> Semi-gnus 6.0.0 - : : - : himi <-- 6.0.7 - : ichikawa <------ 6.0.8 - : | | - : 6.8.17 ---+ : - : : : : - : V : - : pgnus-ichikawa : - : | : - : 6.9.01 : - : : : (1999.07.02: $B8xE*;^$K0a99$((B) - : +-------->---------------+ - : : : - : : V - : : 6.10.072 -----> t-gnus-6_12 - : : : \ (for FLIM 1.12, - : : : \ stable) - : : : \ - : : : --> t-gnus-6_13 - : : : (for FLIM 1.13, - : : : develop) - : : : : - : : t-gnus-6_10-last- t-gnus-6_13-last- - : : | feedback | - : : +<--------------+ - : : | | - : ------------<---------------+ t-gnus-6_14 - : Oort Gnus / : | (for FLIM 1.13, - : | | : : develop) - : V V : : | - : t-gnus-6_15-quimby<---<-----(t-gnus-6_14-quimby)<-----+ - : | : : | - : : : | feedback | - : : +<--------------+ - : : | | - : akr <-- 6.2.3 : t-gnus-6_15 - : shuhei-k <-- 6.3.1 (for FLIM 1.13, -Gnus 5.6.11 ------> 6.3.3 develop) - : 6.4.0 (for SEMI 1.5) | - : (6.4.?)------> for SEMI 1.5 : - : | \ - : | \ -($B85$N(B Gnus $B$H$N(B Sync $B$O2?EY(B | ---> for SEMI 1.6 - $B$b$J$5$l$F$$$^$9$,!"$3$3$K(B (6.4.?)------> 6.5 (for SEMI 1.7) - $B$O=q$-$^$;$s!#(B) | / 6.5.0 - : | (?)/ - : | <--- - : (6.5.?)------> 6.6 (for SEMI 1.8, FLIM 1.7) - : | \ 6.6.0 stable branch - : | \ - : | ---> 6.7 (for SEMI 1.8, FLIM 1.7) - : | 6.7.0 stable branch - : sync | : -Gnus 5.6.22 ------> | feedback 6.7.7 - : (6.7.8)<------ 6.7.8 - : | \ - : | \ - : | ---> 6.8 (for SEMI 1.8, FLIM 1.8) - : keiichi <-- 6.8.18 6.8.0 stable branch - : sync | : -Gnus 5.6.45 ------> | feedback 6.8.20 - : (6.8.20)<------ 6.8.20 - : | \ - : | \ - : | --> 6.9 (for SEMI 1.11, FLIM 1.12) - : | 6.9.1 stable branch - : | feedback 6.9.2 - : (6.9.2)<---------6.9.2 - : | \ - : | \ - : | --> 6.10 (for SEMI 1.12, FLIM 1.12) - : | 6.10.1 develop branch - : : : - : : : -======================================================================== - -The Vendor Branch - - Gnus $B$N85$N%P!<%8%g%s$G$9!#(B - $B$=$l$>$l$N%P!<%8%g%s$O(B "qgnus-0_XY" $B$d(B "gnus-5_X_Y" $B$d(B - "pgnus-0_XY" $B$H$$$&7A<0$N(B tag $B$,IU$$$F$$$^$9!#(B - - vendor branch $B$N(B branch tag $B$O(B "larsi" $B$G$9!#(B - -The Main Trunk - - $B8=:_$N(B branch $B4IM}7W2h$,F3F~$5$l$k$^$G!"(BSemi-gnus $B$O(B main trunk $B$G(B - $B3+H/$5$l$F$$$^$7$?(B ($B2<$N(B "Public Branches" $B$rFI$s$G$/$@$5$$(B)$B!#$=$l(B - $B$>$l$N%P!<%8%g%s$O(B "gnus-6_N2_N3" $B$H$$$&7A<0$G$9!#(B(0 < N2 < 5) - -Public Branches - - $B8=:_$N(B Semi-gnus $B3+H/$N$l$N(B branch $B$O(B "gnus-N1_N2" $B$H$$$&7A<0$N(B tag $B$,IU$$$F$$$F!"(B - $B$=$l$>$l$N%P!<%8%g%s$O(B "gnus-N1_N2_N3" $B$H$$$&7A<0$N(B tag $B$,IU$$$F$$(B - $B$^$9!#(B - - N1, N2, N3 $B$O0J2<$N5,B'$K=>$C$FJQ99$5$l$^$9!#(B - - N1 $B$O4pACE*$J;EAH$_$NJQ99$,$J$5$l$?$H$-$KA}$d$5$l$^$9!#$b$A$m$s!"(B - $B$3$N>l9g$O(B N2 $B$H(B N3 $B$O(B 0 $B$K$J$j$^$9!#(B - - N2 $B$O?7$7$$(B branch $B$,(B "$B.$5$JJQ99(B" $B$,$J$5$l$?$H$-$KA}$d$5$l$^$9!#(B"$B>.$5$JJQ99(B" $B$O>.(B - $B$5$J%P%0=$@5$d!"@_7W$N7hDj$rH<$o$J$$85$N(B Gnus $B$H$NF14|$J$I$G$9!#(B - - $B8=:_$O0J2<$N(B branch tag $B$,;HMQ2DG=$G$9!#(B - The following branch tags are currently available. - - for-semi-1_5 Semi-gnus for SEMI 1.5 API - for-semi-1_6 Semi-gnus for SEMI 1.6 API - gnus-6_5 Semi-gnus for SEMI 1.7 API - gnus-6_6 Semi-gnus for SEMI 1.8, FLIM 1.7 API (stable) - gnus-6_7 Semi-gnus for SEMI 1.8, FLIM 1.7 API (stable) - gnus-6_8 Semi-gnus for SEMI 1.8, FLIM 1.8 API (stable) - gnus-6_9 Semi-gnus for SEMI 1.11, FLIM 1.12 API (stable) - gnus-6_10 Semi-gnus for SEMI 1.12, FLIM 1.12 API (develop) - pgnus-ichikawa (Main trunk of T-gnus) - t-gnus-6_12 T-gnus for SEMI 1.12/1.13, FLIM 1.12 API (stable) - t-gnus-6_13 T-gnus for SEMI 1.13, FLIM 1.13 API (develop) - t-gnus-6_14 T-gnus for SEMI 1.13, FLIM 1.13 API (develop) - t-gnus-6_15 T-gnus for SEMI 1.13, FLIM 1.13 API (develop) - t-gnus-6_15-quimby T-gnus for SEMI 1.13, FLIM 1.13 API (develop) - -Personal Branches - - Semi-gnus $B3+H/$l$N(B personal branch $B$OL\I8!"$l$N(B branch $B$N>pJs$O(B ($BB8:_$9$k$J$i$P!"(B) README.${tag} $B$r(B - $BFI$s$G$/$@$5$$!#(B - - $B0J2<$N(B branch tag $B$,8=:_;HMQ2DG=$G$9!#(B - - himi Owner: Miyashita Hisashi - ichikawa Owner: Tatsuya Ichikawa - akr Owner: Tanaka Akira - shuhei-k Owner: Shuhei KOBAYASHI - keiichi Owner: Keiichi Suzuki - -"semi-gnus" Tag - - $B$3$l$O:G?7$N0BDjHG$K3d$jEv$F$i$l$F$$$^$7$?!#8=:_$O0];}$5$l$F$$$^$;(B - $B$s!#(B(XXX: ???) - -"for-semi-N1_N2" Tags - - $B$3$l$O(B SEMI API N1.N2 $B$KBP1~$9$k%P!<%8%g%s$K3d$jEv$F$i$l$F$$$^$7$?!#(B - $B$3$N=,47$O$b$&;H$o$l$^$;$s!#(B(XXX: ???) diff --git a/README.semi b/README.semi deleted file mode 100644 index dfa5660..0000000 --- a/README.semi +++ /dev/null @@ -1,132 +0,0 @@ -This package contains T-gnus 6.15. - -What is T-gnus? -=============== - - T-gnus is a replacement of Gnus with gnus-mime for SEMI. It has all -features of Gnus and gnus-mime, so there are no need to install Gnus -to use it, and you must not use gnus-mime for SEMI. - - It requires APEL, FLIM and SEMI packages, so please get and install -them before to install it. T-gnus 6.15 requires APEL 10.0 or later, -FLIM (1.13.1 or later) and SEMI/WEMI (1.13.5 or later). You can get -these packages from: - -ftp://ftp.m17n.org/pub/mule/apel/ -ftp://ftp.m17n.org/pub/mule/flim/flim-1.13/ -ftp://ftp.m17n.org/pub/mule/semi/semi-1.13-for-flim-1.13/ - -Required environment for SEMI is written in README.en of SEMI package. - - In addition, if you wish to use the web based backend `nnshimbun', -you have to install the package Emacs-W3M and the external command W3M. -Visit the following pages for more information. - -http://emacs-w3m.namazu.org/ -http://ei5nazha.yz.yamagata-u.ac.jp/~aito/w3m/ - - -How to get? (via CVS) -===================== - -(0) cvs login (first time only) - - % cvs -d :pserver:anonymous@cvs.m17n.org:/cvs/root login - - CVS password: [CR] # NULL string - -(1) checkout - - % cvs -d :pserver:anonymous@cvs.m17n.org:/cvs/root \ - checkout -r t-gnus-6_15-quimby gnus - -(2) compile - - % cd gnus - % configure [options] - % make [options] - -(3) update - - % cvs update -r t-gnus-6_15-quimby gnus - -Major tags are following: - - t-gnus-6_15-quimby Assigned to the latest version of T-gnus for - developing and synchronizing with Oort Gnus. - - t-gnus-6_15 Assigned to the latest version of T-gnus for - developing and synchronizing with the released - version of Oort Gnus. - - pgnus-ichikawa The main trunk of T-gnus. - - semi-gnus Assigned to the latest stable version. It is - very conservative. Currently it is not used. - - for-semi-N1_N2 assigned to the latest stable version for SEMI - API N1.N2 (N1 and N2 are natural number). - (e.g. `for-semi-1_3' is for SEMI API 1.3) - - gnus-N1_N2_N3 assigned to gnus(Gnus) N1.N2.N3 - (e.g. `gnus-6_2_1' means gnus 6.2.1). - - larsi Original Gnus - - himi himi branch - - akr akr branch - - shuhei-k shuhei-k branch - Mail-Followup-To/Mail-Reply-To, gnus-cache fix. - - keiichi keiichi branch - nana-gnus-N1_N2 Stable version of `keiichi branch'. - -For more detailed information, please read README.branch. - - -How to get? (via ftp) -===================== - - T-gnus 6.15 is available from - - ftp://ftp.jpl.org/pub/elisp/t-gnus-6.15/snapshots/ - - NOTE: These snapshots are manually created when the urge takes the - administrator of the a-ftp site, and will usually not be tested. - - -How to join development -======================= - - If you have found a bug in Gnus proper, please do `M-x gnus-bug' and -send a bug report to the Gnus maintainers. - - If you have found a bug in T-gnus, or if you're not sure whether it -is a Gnus proper, please send a bug report to the Semi-gnus mailing -list: - - semi-gnus-en@meadowy.org (English) - semi-gnus-ja@meadowy.org (Japanese) - -Suggestions for T-gnus improvements are also welcome. - - Via the Semi-gnus ML, you can report T-gnus related bugs, obtain the -latest release of T-gnus, and discuss future enhancements to T-gnus. -To join the Semi-gnus ML, send an empty e-mail to - - semi-gnus-en-help@meadowy.org (English) - semi-gnus-ja-help@meadowy.org (Japanese) - - In addition, we need developers. If you would like to develop it, -please send mail to cvs@cvs.m17n.org with your account name and your -public key for ssh. cvsroot is :ext:cvs@cvs.m17n.org:/cvs/root. -If you cannot use ssh, please send UNIX /etc/passwd style crypted -password instead. cvsroot is -:pserver:@cvs.m17n.org:/cvs/root in this case. You can -get the notice of modifications in m17n open CVS server via the mail -which also contains informations on the other modules. To subscribe -it, send an empty e-mail to - - cvs-info-help@cvs.m17n.org diff --git a/README.semi.ja b/README.semi.ja deleted file mode 100644 index a266e80..0000000 --- a/README.semi.ja +++ /dev/null @@ -1,135 +0,0 @@ -$B$3$N%Q%C%1!<%8$K$O(B T-gnus 6.15 $B$,F~$C$F$$$^$9!#(B - -T-gnus $B$H$O!)(B -============= - - T-gnus $B$O(B SEMI $B$N$?$a$N(B gnus-mime $B$H(B Gnus $B$NAH9g$;$rCV$-49$($k$b$N$G(B -$B$9!#(BGnus $B$H(B gnus-mime $B$NA4$F$N5!G=$r;}$C$F$$$^$9$N$G!"$3$l$r;HMQ$9$k$?(B -$B$a$K(B Gnus $B$r%$%s%9%H!<%k$9$kI,MW$O$J$/!"(BSEMI $B$N$?$a$N(B gnus-mime $B$O;HMQ(B -$B$7$F$O$$$1$^$;$s!#(B - - APEL, FLIM $B$*$h$S(B SEMI $B%Q%C%1!<%8$,I,MW$G$9$N$G!"%$%s%9%H!<%k$9$kA0(B -$B$K$=$l$i$r%$%s%9%H!<%k$7$F$/$@$5$$!#(BT-gnus 6.15 $B$O(B APEL 10.0 $B0J>e!"(B -FLIM (1.13.1 $B0J>e(B) $B$*$h$S(B SEMI/WEMI (1.13.5 $B0J>e(B) $B$rI,MW$H$7$^$9!#$=$l(B -$B$i$N%Q%C%1!<%8$O(B - -ftp://ftp.m17n.org/pub/mule/apel/ -ftp://ftp.m17n.org/pub/mule/flim/flim-1.13/ -ftp://ftp.m17n.org/pub/mule/semi/semi-1.13-for-flim-1.13/ - -$B$+$iH$7$F(B -$B$/$@$5$$!#(B - - $B2C$($F!"(B`nnshimbun' $B$r;H$$$?$$>l9g$K$O!"(BEmacs-W3M $B%Q%C%1!<%8$H30It(B -$B%3%^%s%I$N(B W3M $B$,I,MW$G$9!#>\$7$$$3$H$O0J2<$N%Z!<%8$r$4Mw2<$5$$!#(B - -http://emacs-w3m.namazu.org/ -http://ei5nazha.yz.yamagata-u.ac.jp/~aito/w3m/ - - -$Bo$KJ]\$7$/$O!"(BREADME.branch.ja $B$r;2>H$7$F$/$@$5$$!#(B - - -$Bl=j$+$i-Mh$N3HD%$r5DO@$7$?$j$9$k$3$H$,$G$-$^(B - $B$9!#(BSemi-gnus ML $B$K;22C$9$k$?$a$K$O(B - - semi-gnus-en-help@meadowy.org ($B1Q8l(B) - semi-gnus-ja-help@meadowy.org ($BF|K\8l(B) - - $B$K6u$N%a!<%k$rAw$C$F$/$@$5$$!#(B - - $B2C$($F!"3+H/l9g$O!"(B - cvs@cvs.m17n.org $B$K%"%+%&%s%HL>$H(B ssh $B$N8x3+80$rAw$C$F$/$@$5$$!#(Bssh - $B7PM3$G$N(B cvsroot $B$O(B :ext:cvs@cvs.m17n.org:/cvs/root $B$H$J$j$^$9!#$I$&(B - $B$7$F$b(B ssh $B$,;H$($J$$>l9g!"(BUNIX $B$N(B /etc/passwd $B$NMM<0$G0E9f2=$5$l$?(B - $B%Q%9%o!<%I$r%a!<%k$rAw$C$F$/$@$5$$!#$3$N>l9g(B cvsroot $B$O(B - :pserver:<$B%"%+%&%s%HL>(B>@cvs.m17n.org:/cvs/root $B$H$J$j$^$9!#(Bm17n open - CVS server $B$G9T$J$o$l$?JQ99$r%a!<%k$GDLCN$7$F$b$i$&$3$H$b2DG=$G$9!#(B - $B$3$l$K$O(B gnus $B0J30$N(B module $B$K4X$9$k>pJs$b4^$^$l$^$9!#I,MW$JJ}$O(B - - cvs-info-help@cvs.m17n.org - - $B$K6u$N%a!<%k$rAw$C$F0FFb$K=>$C$F2<$5$$!#(B diff --git a/TODO.ja b/TODO.ja deleted file mode 100644 index 0223ce8..0000000 --- a/TODO.ja +++ /dev/null @@ -1,110 +0,0 @@ --*- mode: text; left-margin: 4; fill-column: 70; -*- - -To do list. - -;; $BBP:v:Q$N$b$N$O!"E,Ev$J%?%$%_%s%0(B($B%j%j!<%9;~(B?)$B$G:o=|$7$F$/$@$5$$!#(B -;; $B$^$?!"3F(B personal branch $B$GBP:vCf!"$^$?$OBP:v:Q$N$b$N$K4X$7$F$O$=$N(B -;; $B;]$r5-:\$7$F$/$@$5$$!#(B - ------------ $BL$BP:v(B ----------- - -*1998/09/25-1 message/partial $B$N7k9g5!G=$N2~NI(B - - Subject $B$G(B summary $B$r8!:w$9$kBe$o$j$K!"(Bgnus-newsgroup-headers $B$J(B - $B$I$N>pJs$r;H$C$F!"3N$l$K(B Message-Id $B$rIU2C$9$k!#(B - - 1998/09/28 - $B40N;(B - -*1998/10/02-5 Edit article $B;~$K%a%C%;!<%8$rGK2u$9$kLdBj(B - - 1998/10/29 - $B40N;(B - -*1998/10/02-6 smtpmail.el $B:o=|(B - - 1998/??/?? - $B40N;(B - -*1998/10/02-8 User-Agent $B%X%C%@!$C$?7A<0$KJQ99$9$k!#(B - - 1998/11/02 - $B40N;(B - -*1998/10/02-10 $B$O$8$a$F(B gnus-agent $B$r;HMQ$7$?$H$-$NLdBj(B - - 1998/10/16 - $B40N;(B (cf. semi-gnus-ja: 1482, 1536) - -*1998/10/02-11 message.el $B$NFHN)$7$?;HMQ;~$NLdBj(B - - gnus $B$K0MB8$9$k$b$N$r(B gnus-msg.el $B$K0\F0!#(B - - 1998/10/03 - $B40N;(B - -*1998/10/03-01 $BG$0U%a%C%;!<%8(B cite $B5!G=$Nl9g!"DL>o$N%F%-%9%H!&%G!<(B - $B%?$H$7$FJ]B8$7$F$$$k$,!"$3$l$r(B network $B7A<0$GJ]B8$9$k$h$&$KJQ99$7!"(B - $B:FJT=8$O(B decode $B$7$F$+$i9T$$!"Aw?.$O$=$N$^$^$N7A<0$G9T$&$h$&$K$9$k!#(B - - 1998/10/17 - $B40N;(B - -*1998/10/16-2 Offline $B;~$K:n@.$7$?%a%C%;!<%8$N(B Message-Id $BLdBj(B - - Offline $B;~$K%a%C%;!<%8$r:n@.$7$?>l9g!"(B Message-Id $B$N7A<0$,ITEv$J$b(B - $B$N$K$J$C$F$7$^$&$,!"8=>u$G$O(B Message-ID $B$rIU$1$J$$;v$GBP:v!#(B - - 1998/09/28 - $B40N;(B - -*1998/11/05-1 Cancel-Lock - - $B%K%e!<%9Aw?.;~(B Cancel-Lock $B%U%#!<%k%I$rIU2C$9$k!#(B - Cancel/Replaces/Supersedes $B$N$H$-$O(B Cancel-Key $B%U%#!<%k%I$rIU2C$9$k!#(B - - 1999/01/12 - $B40N;(B - -*1998/10/02-7 smtp.el $B0\F0(B - - smtp.el $B$O!"B>$N(B package $B$G$b;HMQ$9$k2DG=@-$,$"$k$N$G!"(B FLIM $B$K0\(B - $BF0$9$k!#(B - $B$=$NA0$K!"(B shuhei-k $B;^$N(B smtp.el $B$H$N;EMM$r6&DL2=$9$kI,MW$,$"$k!#(B - - 1998/12/02 - $B40N;(B diff --git a/aclocal.m4 b/aclocal.m4 deleted file mode 100644 index aec56f3..0000000 --- a/aclocal.m4 +++ /dev/null @@ -1,270 +0,0 @@ -AC_DEFUN(AC_DEFINE_GNUS_PRODUCT_NAME, - [echo $ac_n "defining gnus product name... $ac_c" - AC_CACHE_VAL(EMACS_cv_GNUS_PRODUCT_NAME,[EMACS_cv_GNUS_PRODUCT_NAME=$1]) - GNUS_PRODUCT_NAME=${EMACS_cv_GNUS_PRODUCT_NAME} - AC_MSG_RESULT(${GNUS_PRODUCT_NAME}) - AC_SUBST(GNUS_PRODUCT_NAME)]) - -AC_DEFUN(AC_CHECK_EMACS, - [dnl Check for Emacsen. - - dnl Apparently, if you run a shell window in Emacs, it sets the EMACS - dnl environment variable to 't'. Lets undo the damage. - test x$EMACS = xt && EMACS= - - dnl Ignore cache. - unset ac_cv_prog_EMACS; unset ac_cv_prog_XEMACS; - - AC_ARG_WITH(emacs, - [ --with-emacs=EMACS compile with EMACS [EMACS=emacs, mule...]], - [if test x$withval = xyes -o x$withval = x; then - AC_CHECK_PROGS(EMACS, emacs xemacs mule, emacs) - else - AC_CHECK_PROG(EMACS, $withval, $withval, emacs) - fi]) - AC_ARG_WITH(xemacs, - [ --with-xemacs=XEMACS compile with XEMACS [XEMACS=xemacs]], - [if test x$withval = xyes -o x$withval = x; then - AC_CHECK_PROG(XEMACS, xemacs, xemacs, xemacs) - else - AC_CHECK_PROG(XEMACS, $withval, $withval, xemacs) - fi - EMACS=$XEMACS], - [XEMACS=xemacs - test x$EMACS = x &&\ - AC_CHECK_PROGS(EMACS, emacs xemacs mule, emacs)]) - AC_SUBST(EMACS) - AC_SUBST(XEMACS)]) - -AC_DEFUN(AC_EMACS_LISP, [ -elisp="$2" -if test -z "$3"; then - AC_MSG_CHECKING(for $1) -fi -AC_CACHE_VAL(EMACS_cv_SYS_$1,[ - OUTPUT=./conftest-$$ - echo ${EMACS}' -batch -eval '\''(let ((x '${elisp}')) (write-region (if (stringp x) (princ x) (prin1-to-string x)) nil "'${OUTPUT}'" nil 5))'\' >& AC_FD_CC 2>&1 - eval ${EMACS}' -batch -eval '\''(let ((x '${elisp}')) (write-region (if (stringp x) (princ x) (prin1-to-string x)) nil "'${OUTPUT}'" nil 5))'\' >& AC_FD_CC 2>&1 - retval=`cat ${OUTPUT}` - echo "=> ${retval}" >& AC_FD_CC 2>&1 - rm -f ${OUTPUT} - EMACS_cv_SYS_$1=$retval -]) -$1=${EMACS_cv_SYS_$1} -if test -z "$3"; then - AC_MSG_RESULT($$1) -fi -]) - -AC_DEFUN(AC_CHECK_EMACS_FLAVOR, - [AC_MSG_CHECKING([what a flavor does $EMACS have]) - - dnl Ignore cache. - unset EMACS_cv_SYS_flavor; - - AC_EMACS_LISP(flavor, - (cond ((featurep (quote xemacs)) \"XEmacs\")\ - ((boundp (quote MULE)) \"MULE\")\ - (t \"FSF Emacs\")), - "noecho") - case $EMACS_cv_SYS_flavor in - XEmacs) - EMACS_FLAVOR=xemacs;; - MULE) - EMACS_FLAVOR=mule;; - *) - EMACS_FLAVOR=emacs;; - esac - AC_MSG_RESULT($EMACS_cv_SYS_flavor)]) - -AC_DEFUN(AC_PATH_LISPDIR, [ - AC_CHECK_EMACS_FLAVOR - if test "$prefix" = "NONE"; then - AC_MSG_CHECKING([prefix for your Emacs]) - AC_EMACS_LISP(prefix,(expand-file-name \"..\" invocation-directory),"noecho") - prefix=${EMACS_cv_SYS_prefix} - AC_MSG_RESULT($prefix) - fi - AC_ARG_WITH(lispdir, - [ --with-lispdir=DIR Where to install lisp files - (for XEmacs package, use --with-packagedir instead)], - lispdir=${withval}) - AC_MSG_CHECKING([where lisp files should go]) - if test -z "$lispdir"; then - dnl Set default value - theprefix=$prefix - if test "x$theprefix" = "xNONE"; then - theprefix=$ac_default_prefix - fi - lispdir="\$(datadir)/${EMACS_FLAVOR}/site-lisp/${GNUS_PRODUCT_NAME}" - for thedir in share lib; do - potential= - if test -d ${theprefix}/${thedir}/${EMACS_FLAVOR}/site-lisp; then - lispdir="\$(prefix)/${thedir}/${EMACS_FLAVOR}/site-lisp/${GNUS_PRODUCT_NAME}" - break - fi - done - fi - if test ${EMACS_FLAVOR} = xemacs; then - AC_MSG_RESULT([$lispdir - (it will be ignored when \"make install-package[[-ja]]\" is done)]) - else - AC_MSG_RESULT([$lispdir]) - fi - AC_SUBST(lispdir) -]) - -AC_DEFUN(AC_PATH_ETCDIR, [ - AC_ARG_WITH(etcdir,[ --with-etcdir=DIR Where to install etc files], etcdir=${withval}) - AC_MSG_CHECKING([where etc files should go]) - if test -z "$etcdir"; then - dnl Set default value - etcdir="\$(lispdir)/../etc" - fi - AC_MSG_RESULT($etcdir) - AC_SUBST(etcdir) -]) - -dnl -dnl Check whether a function exists in a library -dnl All '_' characters in the first argument are converted to '-' -dnl -AC_DEFUN(AC_EMACS_CHECK_LIB, [ -if test -z "$3"; then - AC_MSG_CHECKING(for $2 in $1) -fi -library=`echo $1 | tr _ -` -AC_EMACS_LISP($1,(progn (fmakunbound (quote $2)) (condition-case nil (progn (require (quote $library)) (fboundp (quote $2))) (error (prog1 nil (message \"$library not found\"))))),"noecho") -if test "${EMACS_cv_SYS_$1}" = "nil"; then - EMACS_cv_SYS_$1=no -fi -if test "${EMACS_cv_SYS_$1}" = "t"; then - EMACS_cv_SYS_$1=yes -fi -HAVE_$1=${EMACS_cv_SYS_$1} -AC_SUBST(HAVE_$1) -if test -z "$3"; then - AC_MSG_RESULT($HAVE_$1) -fi -]) - -dnl -dnl Perform sanity checking and try to locate the W3 package -dnl -AC_DEFUN(AC_CHECK_W3, [ -AC_MSG_CHECKING(for acceptable W3 version) - -dnl Ignore cache. -unset EMACS_cv_ACCEPTABLE_W3; -unset EMACS_cv_SYS_w3_dir; -unset EMACS_cv_SYS_w3_forms; - -AC_CACHE_VAL(EMACS_cv_ACCEPTABLE_W3,[ -AC_EMACS_CHECK_LIB(w3_forms, w3-form-encode-xwfu,"noecho") -if test "${HAVE_w3_forms}" = "yes"; then - EMACS_cv_ACCEPTABLE_W3=yes -else - EMACS_cv_ACCEPTABLE_W3= -fi - -if test "x${EMACS_cv_ACCEPTABLE_W3}" = "xyes"; then - AC_EMACS_LISP(w3_dir,(file-name-directory (locate-library \"w3-forms\")),"noecho") - EMACS_cv_ACCEPTABLE_W3=$EMACS_cv_SYS_w3_dir -fi -]) - AC_ARG_WITH(w3,[ --with-w3=DIR Specify where to find the w3 package], [ EMACS_cv_ACCEPTABLE_W3=`( cd $withval && pwd || echo "$withval" ) 2> /dev/null` ]) - W3=${EMACS_cv_ACCEPTABLE_W3} - AC_SUBST(W3) - if test "x${EMACS_cv_ACCEPTABLE_W3}" = "x"; then - AC_MSG_RESULT(not found) - else - AC_MSG_RESULT(${W3}) - fi -]) - -dnl -dnl Perform sanity checking and try to locate the W3 package -dnl -AC_DEFUN(AC_CHECK_URL, [ -AC_MSG_CHECKING(for acceptable URL version) - -dnl Ignore cache. -unset EMACS_cv_ACCEPTABLE_URL; -unset EMACS_cv_SYS_url_dir; -unset EMACS_cv_SYS_url; - -AC_CACHE_VAL(EMACS_cv_ACCEPTABLE_URL,[ -AC_EMACS_CHECK_LIB(url, url-retrieve, "noecho") -if test "${HAVE_url}" = "yes"; then - EMACS_cv_ACCEPTABLE_URL=yes -else - EMACS_cv_ACCEPTABLE_URL= -fi - -if test "x${EMACS_cv_ACCEPTABLE_URL}" = "xyes"; then - AC_EMACS_LISP(url_dir,(file-name-directory (locate-library \"url\")),"noecho") - EMACS_cv_ACCEPTABLE_URL=$EMACS_cv_SYS_url_dir -fi -]) - AC_ARG_WITH(url,[ --with-url=DIR Specify where to find the url package], [ EMACS_cv_ACCEPTABLE_URL=`( cd $withval && pwd || echo "$withval" ) 2> /dev/null` ]) - URL=${EMACS_cv_ACCEPTABLE_URL} - AC_SUBST(URL) - if test "x${EMACS_cv_ACCEPTABLE_URL}" = "x"; then - AC_MSG_RESULT(not found) - else - AC_MSG_RESULT("${URL}") - fi -]) - -AC_DEFUN(AC_EXAMINE_PACKAGEDIR, - [dnl Examine PACKAGEDIR. - AC_EMACS_LISP(PACKAGEDIR, - (let (package-dir)\ - (if (boundp (quote early-packages))\ - (let ((dirs (delq nil (append (if early-package-load-path\ - early-packages)\ - (if late-package-load-path\ - late-packages)\ - (if last-package-load-path\ - last-packages)))))\ - (while (and dirs (not package-dir))\ - (if (file-directory-p (car dirs))\ - (setq package-dir (car dirs)\ - dirs (cdr dirs))))))\ - (or package-dir \"\")), - "noecho")]) - -AC_DEFUN(AC_PATH_PACKAGEDIR, - [dnl Check for PACKAGEDIR. - if test ${EMACS_FLAVOR} = xemacs; then - AC_MSG_CHECKING([where the XEmacs package is]) - AC_ARG_WITH(packagedir, - [ --with-packagedir=DIR package DIR for XEmacs], - [if test x$withval != xyes -a x$withval != x; then - PACKAGEDIR=$withval - else - AC_EXAMINE_PACKAGEDIR - fi], - AC_EXAMINE_PACKAGEDIR) - if test x$PACKAGEDIR = x; then - AC_MSG_RESULT(not found) - else - AC_MSG_RESULT($PACKAGEDIR) - fi - else - PACKAGEDIR= - fi - AC_SUBST(PACKAGEDIR)]) - -AC_DEFUN(AC_ADD_LOAD_PATH, - [dnl Check for additional load path. - AC_ARG_WITH(addpath, - [ --with-addpath=PATH search Emacs-Lisp libraries with PATH - use colons to separate directory names], - [if test x$withval != xyes -a x$withval != x; then - AC_MSG_CHECKING([where to find the additional elisp libraries]) - ADDITIONAL_LOAD_PATH=$withval - AC_MSG_RESULT($ADDITIONAL_LOAD_PATH) - fi], - ADDITIONAL_LOAD_PATH=) - AC_SUBST(ADDITIONAL_LOAD_PATH)]) diff --git a/configure b/configure deleted file mode 100755 index d93cbb7..0000000 --- a/configure +++ /dev/null @@ -1,1595 +0,0 @@ -#! /bin/sh - -# Guess values for system-dependent variables and create Makefiles. -# Generated automatically using autoconf version 2.14.1 -# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. -# -# This configure script is free software; the Free Software Foundation -# gives unlimited permission to copy, distribute and modify it. - -# Defaults: -ac_help= -ac_default_prefix=/usr/local -# Any additions from configure.in: -ac_help="$ac_help - --with-emacs=EMACS compile with EMACS [EMACS=emacs, mule...]" -ac_help="$ac_help - --with-xemacs=XEMACS compile with XEMACS [XEMACS=xemacs]" -ac_help="$ac_help - --with-lispdir=DIR Where to install lisp files - (for XEmacs package, use --with-packagedir instead)" -ac_help="$ac_help - --with-etcdir=DIR Where to install etc files" -ac_help="$ac_help - --with-url=DIR Specify where to find the url package" -ac_help="$ac_help - --with-w3=DIR Specify where to find the w3 package" -ac_help="$ac_help - --with-packagedir=DIR package DIR for XEmacs" -ac_help="$ac_help - --with-addpath=PATH search Emacs-Lisp libraries with PATH - use colons to separate directory names" - -# Initialize some variables set by options. -# The variables have the same names as the options, with -# dashes changed to underlines. -build=NONE -cache_file=./config.cache -exec_prefix=NONE -host=NONE -no_create= -nonopt=NONE -no_recursion= -prefix=NONE -program_prefix=NONE -program_suffix=NONE -program_transform_name=s,x,x, -silent= -site= -srcdir= -target=NONE -verbose= -x_includes=NONE -x_libraries=NONE -bindir='${exec_prefix}/bin' -sbindir='${exec_prefix}/sbin' -libexecdir='${exec_prefix}/libexec' -datadir='${prefix}/share' -sysconfdir='${prefix}/etc' -sharedstatedir='${prefix}/com' -localstatedir='${prefix}/var' -libdir='${exec_prefix}/lib' -includedir='${prefix}/include' -oldincludedir='/usr/include' -infodir='${prefix}/info' -mandir='${prefix}/man' - -# Initialize some other variables. -subdirs= -MFLAGS= MAKEFLAGS= -SHELL=${CONFIG_SHELL-/bin/sh} -# Maximum number of lines to put in a shell here document. -ac_max_here_lines=12 - -ac_prev= -for ac_option -do - - # If the previous option needs an argument, assign it. - if test -n "$ac_prev"; then - eval "$ac_prev=\$ac_option" - ac_prev= - continue - fi - - case "$ac_option" in - -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; - *) ac_optarg= ;; - esac - - # Accept the important Cygnus configure options, so we can diagnose typos. - - case "$ac_option" in - - -bindir | --bindir | --bindi | --bind | --bin | --bi) - ac_prev=bindir ;; - -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) - bindir="$ac_optarg" ;; - - -build | --build | --buil | --bui | --bu) - ac_prev=build ;; - -build=* | --build=* | --buil=* | --bui=* | --bu=*) - build="$ac_optarg" ;; - - -cache-file | --cache-file | --cache-fil | --cache-fi \ - | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) - ac_prev=cache_file ;; - -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ - | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) - cache_file="$ac_optarg" ;; - - -datadir | --datadir | --datadi | --datad | --data | --dat | --da) - ac_prev=datadir ;; - -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ - | --da=*) - datadir="$ac_optarg" ;; - - -disable-* | --disable-*) - ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then - { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } - fi - ac_feature=`echo $ac_feature| sed 's/-/_/g'` - eval "enable_${ac_feature}=no" ;; - - -enable-* | --enable-*) - ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then - { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } - fi - ac_feature=`echo $ac_feature| sed 's/-/_/g'` - case "$ac_option" in - *=*) ;; - *) ac_optarg=yes ;; - esac - eval "enable_${ac_feature}='$ac_optarg'" ;; - - -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ - | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ - | --exec | --exe | --ex) - ac_prev=exec_prefix ;; - -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ - | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ - | --exec=* | --exe=* | --ex=*) - exec_prefix="$ac_optarg" ;; - - -gas | --gas | --ga | --g) - # Obsolete; use --with-gas. - with_gas=yes ;; - - -help | --help | --hel | --he) - # Omit some internal or obsolete options to make the list less imposing. - # This message is too long to be a string in the A/UX 3.1 sh. - cat << EOF -Usage: configure [options] [host] -Options: [defaults in brackets after descriptions] -Configuration: - --cache-file=FILE cache test results in FILE - --help print this message - --no-create do not create output files - --quiet, --silent do not print \`checking...' messages - --version print the version of autoconf that created configure -Directory and file names: - --prefix=PREFIX install architecture-independent files in PREFIX - [$ac_default_prefix] - --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX - [same as prefix] - --bindir=DIR user executables in DIR [EPREFIX/bin] - --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] - --libexecdir=DIR program executables in DIR [EPREFIX/libexec] - --datadir=DIR read-only architecture-independent data in DIR - [PREFIX/share] - --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] - --sharedstatedir=DIR modifiable architecture-independent data in DIR - [PREFIX/com] - --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] - --libdir=DIR object code libraries in DIR [EPREFIX/lib] - --includedir=DIR C header files in DIR [PREFIX/include] - --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] - --infodir=DIR info documentation in DIR [PREFIX/info] - --mandir=DIR man documentation in DIR [PREFIX/man] - --srcdir=DIR find the sources in DIR [configure dir or ..] - --program-prefix=PREFIX prepend PREFIX to installed program names - --program-suffix=SUFFIX append SUFFIX to installed program names - --program-transform-name=PROGRAM - run sed PROGRAM on installed program names -EOF - cat << EOF -Host type: - --build=BUILD configure for building on BUILD [BUILD=HOST] - --host=HOST configure for HOST [guessed] - --target=TARGET configure for TARGET [TARGET=HOST] -Features and packages: - --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) - --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] - --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --x-includes=DIR X include files are in DIR - --x-libraries=DIR X library files are in DIR -EOF - if test -n "$ac_help"; then - echo "--enable and --with options recognized:$ac_help" - fi - exit 0 ;; - - -host | --host | --hos | --ho) - ac_prev=host ;; - -host=* | --host=* | --hos=* | --ho=*) - host="$ac_optarg" ;; - - -includedir | --includedir | --includedi | --included | --include \ - | --includ | --inclu | --incl | --inc) - ac_prev=includedir ;; - -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ - | --includ=* | --inclu=* | --incl=* | --inc=*) - includedir="$ac_optarg" ;; - - -infodir | --infodir | --infodi | --infod | --info | --inf) - ac_prev=infodir ;; - -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) - infodir="$ac_optarg" ;; - - -libdir | --libdir | --libdi | --libd) - ac_prev=libdir ;; - -libdir=* | --libdir=* | --libdi=* | --libd=*) - libdir="$ac_optarg" ;; - - -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ - | --libexe | --libex | --libe) - ac_prev=libexecdir ;; - -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ - | --libexe=* | --libex=* | --libe=*) - libexecdir="$ac_optarg" ;; - - -localstatedir | --localstatedir | --localstatedi | --localstated \ - | --localstate | --localstat | --localsta | --localst \ - | --locals | --local | --loca | --loc | --lo) - ac_prev=localstatedir ;; - -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ - | --localstate=* | --localstat=* | --localsta=* | --localst=* \ - | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) - localstatedir="$ac_optarg" ;; - - -mandir | --mandir | --mandi | --mand | --man | --ma | --m) - ac_prev=mandir ;; - -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) - mandir="$ac_optarg" ;; - - -nfp | --nfp | --nf) - # Obsolete; use --without-fp. - with_fp=no ;; - - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c) - no_create=yes ;; - - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) - no_recursion=yes ;; - - -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ - | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ - | --oldin | --oldi | --old | --ol | --o) - ac_prev=oldincludedir ;; - -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ - | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ - | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) - oldincludedir="$ac_optarg" ;; - - -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) - ac_prev=prefix ;; - -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) - prefix="$ac_optarg" ;; - - -program-prefix | --program-prefix | --program-prefi | --program-pref \ - | --program-pre | --program-pr | --program-p) - ac_prev=program_prefix ;; - -program-prefix=* | --program-prefix=* | --program-prefi=* \ - | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) - program_prefix="$ac_optarg" ;; - - -program-suffix | --program-suffix | --program-suffi | --program-suff \ - | --program-suf | --program-su | --program-s) - ac_prev=program_suffix ;; - -program-suffix=* | --program-suffix=* | --program-suffi=* \ - | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) - program_suffix="$ac_optarg" ;; - - -program-transform-name | --program-transform-name \ - | --program-transform-nam | --program-transform-na \ - | --program-transform-n | --program-transform- \ - | --program-transform | --program-transfor \ - | --program-transfo | --program-transf \ - | --program-trans | --program-tran \ - | --progr-tra | --program-tr | --program-t) - ac_prev=program_transform_name ;; - -program-transform-name=* | --program-transform-name=* \ - | --program-transform-nam=* | --program-transform-na=* \ - | --program-transform-n=* | --program-transform-=* \ - | --program-transform=* | --program-transfor=* \ - | --program-transfo=* | --program-transf=* \ - | --program-trans=* | --program-tran=* \ - | --progr-tra=* | --program-tr=* | --program-t=*) - program_transform_name="$ac_optarg" ;; - - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - silent=yes ;; - - -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) - ac_prev=sbindir ;; - -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ - | --sbi=* | --sb=*) - sbindir="$ac_optarg" ;; - - -sharedstatedir | --sharedstatedir | --sharedstatedi \ - | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ - | --sharedst | --shareds | --shared | --share | --shar \ - | --sha | --sh) - ac_prev=sharedstatedir ;; - -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ - | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ - | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ - | --sha=* | --sh=*) - sharedstatedir="$ac_optarg" ;; - - -site | --site | --sit) - ac_prev=site ;; - -site=* | --site=* | --sit=*) - site="$ac_optarg" ;; - - -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) - ac_prev=srcdir ;; - -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) - srcdir="$ac_optarg" ;; - - -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ - | --syscon | --sysco | --sysc | --sys | --sy) - ac_prev=sysconfdir ;; - -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ - | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) - sysconfdir="$ac_optarg" ;; - - -target | --target | --targe | --targ | --tar | --ta | --t) - ac_prev=target ;; - -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) - target="$ac_optarg" ;; - - -v | -verbose | --verbose | --verbos | --verbo | --verb) - verbose=yes ;; - - -version | --version | --versio | --versi | --vers) - echo "configure generated by autoconf version 2.14.1" - exit 0 ;; - - -with-* | --with-*) - ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then - { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } - fi - ac_package=`echo $ac_package| sed 's/-/_/g'` - case "$ac_option" in - *=*) ;; - *) ac_optarg=yes ;; - esac - eval "with_${ac_package}='$ac_optarg'" ;; - - -without-* | --without-*) - ac_package=`echo $ac_option|sed -e 's/-*without-//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then - { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } - fi - ac_package=`echo $ac_package| sed 's/-/_/g'` - eval "with_${ac_package}=no" ;; - - --x) - # Obsolete; use --with-x. - with_x=yes ;; - - -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ - | --x-incl | --x-inc | --x-in | --x-i) - ac_prev=x_includes ;; - -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ - | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) - x_includes="$ac_optarg" ;; - - -x-libraries | --x-libraries | --x-librarie | --x-librari \ - | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) - ac_prev=x_libraries ;; - -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ - | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) - x_libraries="$ac_optarg" ;; - - -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } - ;; - - *) - if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then - echo "configure: warning: $ac_option: invalid host type" 1>&2 - fi - if test "x$nonopt" != xNONE; then - { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } - fi - nonopt="$ac_option" - ;; - - esac -done - -if test -n "$ac_prev"; then - { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } -fi - -trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 - -# File descriptor usage: -# 0 standard input -# 1 file creation -# 2 errors and warnings -# 3 some systems may open it to /dev/tty -# 4 used on the Kubota Titan -# 6 checking for... messages and results -# 5 compiler messages saved in config.log -if test "$silent" = yes; then - exec 6>/dev/null -else - exec 6>&1 -fi -exec 5>./config.log - -echo "\ -This file contains any messages produced by compilers while -running configure, to aid debugging if configure makes a mistake. -" 1>&5 - -# Strip out --no-create and --no-recursion so they do not pile up. -# Also quote any args containing shell metacharacters. -ac_configure_args= -for ac_arg -do - case "$ac_arg" in - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c) ;; - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; - *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) - ac_configure_args="$ac_configure_args '$ac_arg'" ;; - *) ac_configure_args="$ac_configure_args $ac_arg" ;; - esac -done - -# NLS nuisances. -# Only set these to C if already set. These must not be set unconditionally -# because not all systems understand e.g. LANG=C (notably SCO). -# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'! -# Non-C LC_CTYPE values break the ctype check. -if test "${LANG+set}" = set; then LANG=C; export LANG; fi -if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi -if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi -if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi - -# confdefs.h avoids OS command line length limits that DEFS can exceed. -rm -rf conftest* confdefs.h -# AIX cpp loses on an empty file, so make sure it contains at least a newline. -echo > confdefs.h - -# A filename unique to this package, relative to the directory that -# configure is in, which we can look for to find out if srcdir is correct. -ac_unique_file=lisp/gnus.el - -# Find the source files, if location was not specified. -if test -z "$srcdir"; then - ac_srcdir_defaulted=yes - # Try the directory containing this script, then its parent. - ac_prog=$0 - ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` - test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. - srcdir=$ac_confdir - if test ! -r $srcdir/$ac_unique_file; then - srcdir=.. - fi -else - ac_srcdir_defaulted=no -fi -if test ! -r $srcdir/$ac_unique_file; then - if test "$ac_srcdir_defaulted" = yes; then - { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } - else - { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } - fi -fi -srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` - -# Prefer explicitly selected file to automatically selected ones. -if test -z "$CONFIG_SITE"; then - if test "x$prefix" != xNONE; then - CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" - else - CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" - fi -fi -for ac_site_file in $CONFIG_SITE; do - if test -r "$ac_site_file"; then - echo "loading site script $ac_site_file" - . "$ac_site_file" - fi -done - -if test -r "$cache_file"; then - echo "loading cache $cache_file" - test -f "$cache_file" && . $cache_file -else - echo "creating cache $cache_file" - > $cache_file -fi - -ac_ext=c -# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CPP $CPPFLAGS' -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -cross_compiling=$ac_cv_prog_cc_cross - -ac_exeext= -ac_objext=o -if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then - # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. - if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then - ac_n= ac_c=' -' ac_t=' ' - else - ac_n=-n ac_c= ac_t= - fi -else - ac_n= ac_c='\c' ac_t= -fi - - -echo $ac_n "defining gnus product name... $ac_c" - if eval "test \"\${EMACS_cv_GNUS_PRODUCT_NAME+set}\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - EMACS_cv_GNUS_PRODUCT_NAME=t-gnus -fi - - GNUS_PRODUCT_NAME=${EMACS_cv_GNUS_PRODUCT_NAME} - echo "$ac_t""${GNUS_PRODUCT_NAME}" 1>&6 - -echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6 -echo "configure:554: checking whether ${MAKE-make} sets \${MAKE}" >&5 -set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` -if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftestmake <<\EOF -all: - @echo 'ac_maketemp="${MAKE}"' -EOF -# GNU make sometimes prints "make[1]: Entering...", which would confuse us. -eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=` -if test -n "$ac_maketemp"; then - eval ac_cv_prog_make_${ac_make}_set=yes -else - eval ac_cv_prog_make_${ac_make}_set=no -fi -rm -f conftestmake -fi -if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then - echo "$ac_t""yes" 1>&6 - SET_MAKE= -else - echo "$ac_t""no" 1>&6 - SET_MAKE="MAKE=${MAKE-make}" -fi - -ac_aux_dir= -for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do - if test -f $ac_dir/install-sh; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install-sh -c" - break - elif test -f $ac_dir/install.sh; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install.sh -c" - break - fi -done -if test -z "$ac_aux_dir"; then - { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; } -fi -ac_config_guess="$SHELL $ac_aux_dir/config.guess" -ac_config_sub="$SHELL $ac_aux_dir/config.sub" -ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. - -# Find a good install program. We prefer a C program (faster), -# so one script is as good as another. But avoid the broken or -# incompatible versions: -# SysV /etc/install, /usr/sbin/install -# SunOS /usr/etc/install -# IRIX /sbin/install -# AIX /bin/install -# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag -# AFS /usr/afsws/bin/install, which mishandles nonexistent args -# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" -# ./install, which can be erroneously created by make from ./install.sh. -echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 -echo "configure:611: checking for a BSD compatible install" >&5 -if test -z "$INSTALL"; then -if eval "test \"\${ac_cv_path_install+set}\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":" - for ac_dir in $PATH; do - # Account for people who put trailing slashes in PATH elements. - case "$ac_dir/" in - /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;; - *) - # OSF1 and SCO ODT 3.0 have their own names for install. - # Don't use installbsd from OSF since it installs stuff as root - # by default. - for ac_prog in ginstall scoinst install; do - if test -f $ac_dir/$ac_prog; then - if test $ac_prog = install && - grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then - # AIX install. It has an incompatible calling convention. - : - elif test $ac_prog = install && - grep pwplus $ac_dir/$ac_prog >/dev/null 2>&1; then - # program-specific install script used by HP pwplus--don't use. - : - else - ac_cv_path_install="$ac_dir/$ac_prog -c" - break 2 - fi - fi - done - ;; - esac - done - IFS="$ac_save_IFS" - -fi - if test "${ac_cv_path_install+set}" = set; then - INSTALL="$ac_cv_path_install" - else - # As a last resort, use the slow shell script. We don't cache a - # path for INSTALL within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the path is relative. - INSTALL="$ac_install_sh" - fi -fi -echo "$ac_t""$INSTALL" 1>&6 - -# Use test -z because SunOS4 sh mishandles braces in ${var-val}. -# It thinks the first close brace ends the variable substitution. -test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' - -test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' - -test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' - -# Extract the first word of "makeinfo", so it can be a program name with args. -set dummy makeinfo; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:670: checking for $ac_word" >&5 -if eval "test \"\${ac_cv_prog_MAKEINFO+set}\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$MAKEINFO"; then - ac_cv_prog_MAKEINFO="$MAKEINFO" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_MAKEINFO="makeinfo" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_prog_MAKEINFO" && ac_cv_prog_MAKEINFO="no" -fi -fi -MAKEINFO="$ac_cv_prog_MAKEINFO" -if test -n "$MAKEINFO"; then - echo "$ac_t""$MAKEINFO" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - - test x$EMACS = xt && EMACS= - - unset ac_cv_prog_EMACS; unset ac_cv_prog_XEMACS; - - # Check whether --with-emacs or --without-emacs was given. -if test "${with_emacs+set}" = set; then - withval="$with_emacs" - if test x$withval = xyes -o x$withval = x; then - for ac_prog in emacs xemacs mule -do -# Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:711: checking for $ac_word" >&5 -if eval "test \"\${ac_cv_prog_EMACS+set}\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$EMACS"; then - ac_cv_prog_EMACS="$EMACS" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_EMACS="$ac_prog" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -EMACS="$ac_cv_prog_EMACS" -if test -n "$EMACS"; then - echo "$ac_t""$EMACS" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -test -n "$EMACS" && break -done -test -n "$EMACS" || EMACS="emacs" - - else - # Extract the first word of "$withval", so it can be a program name with args. -set dummy $withval; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:745: checking for $ac_word" >&5 -if eval "test \"\${ac_cv_prog_EMACS+set}\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$EMACS"; then - ac_cv_prog_EMACS="$EMACS" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_EMACS="$withval" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_prog_EMACS" && ac_cv_prog_EMACS="emacs" -fi -fi -EMACS="$ac_cv_prog_EMACS" -if test -n "$EMACS"; then - echo "$ac_t""$EMACS" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - fi -fi - - # Check whether --with-xemacs or --without-xemacs was given. -if test "${with_xemacs+set}" = set; then - withval="$with_xemacs" - if test x$withval = xyes -o x$withval = x; then - # Extract the first word of "xemacs", so it can be a program name with args. -set dummy xemacs; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:782: checking for $ac_word" >&5 -if eval "test \"\${ac_cv_prog_XEMACS+set}\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$XEMACS"; then - ac_cv_prog_XEMACS="$XEMACS" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_XEMACS="xemacs" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_prog_XEMACS" && ac_cv_prog_XEMACS="xemacs" -fi -fi -XEMACS="$ac_cv_prog_XEMACS" -if test -n "$XEMACS"; then - echo "$ac_t""$XEMACS" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - else - # Extract the first word of "$withval", so it can be a program name with args. -set dummy $withval; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:813: checking for $ac_word" >&5 -if eval "test \"\${ac_cv_prog_XEMACS+set}\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$XEMACS"; then - ac_cv_prog_XEMACS="$XEMACS" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_XEMACS="$withval" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_prog_XEMACS" && ac_cv_prog_XEMACS="xemacs" -fi -fi -XEMACS="$ac_cv_prog_XEMACS" -if test -n "$XEMACS"; then - echo "$ac_t""$XEMACS" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - fi - EMACS=$XEMACS -else - XEMACS=xemacs - test x$EMACS = x &&\ - for ac_prog in emacs xemacs mule -do -# Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:850: checking for $ac_word" >&5 -if eval "test \"\${ac_cv_prog_EMACS+set}\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$EMACS"; then - ac_cv_prog_EMACS="$EMACS" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_EMACS="$ac_prog" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -EMACS="$ac_cv_prog_EMACS" -if test -n "$EMACS"; then - echo "$ac_t""$EMACS" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -test -n "$EMACS" && break -done -test -n "$EMACS" || EMACS="emacs" - -fi - - - - - echo $ac_n "checking what a flavor does $EMACS have""... $ac_c" 1>&6 -echo "configure:886: checking what a flavor does $EMACS have" >&5 - - unset EMACS_cv_SYS_flavor; - - -elisp="(cond ((featurep (quote xemacs)) \"XEmacs\")\ - ((boundp (quote MULE)) \"MULE\")\ - (t \"FSF Emacs\"))" -if test -z ""noecho""; then - echo $ac_n "checking for flavor""... $ac_c" 1>&6 -echo "configure:896: checking for flavor" >&5 -fi -if eval "test \"\${EMACS_cv_SYS_flavor+set}\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - - OUTPUT=./conftest-$$ - echo ${EMACS}' -batch -eval '\''(let ((x '${elisp}')) (write-region (if (stringp x) (princ x) (prin1-to-string x)) nil "'${OUTPUT}'" nil 5))'\' >& 5 2>&1 - eval ${EMACS}' -batch -eval '\''(let ((x '${elisp}')) (write-region (if (stringp x) (princ x) (prin1-to-string x)) nil "'${OUTPUT}'" nil 5))'\' >& 5 2>&1 - retval=`cat ${OUTPUT}` - echo "=> ${retval}" >& 5 2>&1 - rm -f ${OUTPUT} - EMACS_cv_SYS_flavor=$retval - -fi - -flavor=${EMACS_cv_SYS_flavor} -if test -z ""noecho""; then - echo "$ac_t""$flavor" 1>&6 -fi - - case $EMACS_cv_SYS_flavor in - XEmacs) - EMACS_FLAVOR=xemacs;; - MULE) - EMACS_FLAVOR=mule;; - *) - EMACS_FLAVOR=emacs;; - esac - echo "$ac_t""$EMACS_cv_SYS_flavor" 1>&6 - if test "$prefix" = "NONE"; then - echo $ac_n "checking prefix for your Emacs""... $ac_c" 1>&6 -echo "configure:928: checking prefix for your Emacs" >&5 - -elisp="(expand-file-name \"..\" invocation-directory)" -if test -z ""noecho""; then - echo $ac_n "checking for prefix""... $ac_c" 1>&6 -echo "configure:933: checking for prefix" >&5 -fi -if eval "test \"\${EMACS_cv_SYS_prefix+set}\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - - OUTPUT=./conftest-$$ - echo ${EMACS}' -batch -eval '\''(let ((x '${elisp}')) (write-region (if (stringp x) (princ x) (prin1-to-string x)) nil "'${OUTPUT}'" nil 5))'\' >& 5 2>&1 - eval ${EMACS}' -batch -eval '\''(let ((x '${elisp}')) (write-region (if (stringp x) (princ x) (prin1-to-string x)) nil "'${OUTPUT}'" nil 5))'\' >& 5 2>&1 - retval=`cat ${OUTPUT}` - echo "=> ${retval}" >& 5 2>&1 - rm -f ${OUTPUT} - EMACS_cv_SYS_prefix=$retval - -fi - -prefix=${EMACS_cv_SYS_prefix} -if test -z ""noecho""; then - echo "$ac_t""$prefix" 1>&6 -fi - - prefix=${EMACS_cv_SYS_prefix} - echo "$ac_t""$prefix" 1>&6 - fi - # Check whether --with-lispdir or --without-lispdir was given. -if test "${with_lispdir+set}" = set; then - withval="$with_lispdir" - lispdir=${withval} -fi - - echo $ac_n "checking where lisp files should go""... $ac_c" 1>&6 -echo "configure:964: checking where lisp files should go" >&5 - if test -z "$lispdir"; then - theprefix=$prefix - if test "x$theprefix" = "xNONE"; then - theprefix=$ac_default_prefix - fi - lispdir="\$(datadir)/${EMACS_FLAVOR}/site-lisp/${GNUS_PRODUCT_NAME}" - for thedir in share lib; do - potential= - if test -d ${theprefix}/${thedir}/${EMACS_FLAVOR}/site-lisp; then - lispdir="\$(prefix)/${thedir}/${EMACS_FLAVOR}/site-lisp/${GNUS_PRODUCT_NAME}" - break - fi - done - fi - if test ${EMACS_FLAVOR} = xemacs; then - echo "$ac_t""$lispdir - (it will be ignored when \"make install-package[-ja]\" is done)" 1>&6 - else - echo "$ac_t""$lispdir" 1>&6 - fi - - - - # Check whether --with-etcdir or --without-etcdir was given. -if test "${with_etcdir+set}" = set; then - withval="$with_etcdir" - etcdir=${withval} -fi - - echo $ac_n "checking where etc files should go""... $ac_c" 1>&6 -echo "configure:995: checking where etc files should go" >&5 - if test -z "$etcdir"; then - etcdir="\$(lispdir)/../etc" - fi - echo "$ac_t""$etcdir" 1>&6 - - - -echo $ac_n "checking for acceptable URL version""... $ac_c" 1>&6 -echo "configure:1004: checking for acceptable URL version" >&5 - -unset EMACS_cv_ACCEPTABLE_URL; -unset EMACS_cv_SYS_url_dir; -unset EMACS_cv_SYS_url; - -if eval "test \"\${EMACS_cv_ACCEPTABLE_URL+set}\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - - -if test -z ""noecho""; then - echo $ac_n "checking for url-retrieve in url""... $ac_c" 1>&6 -echo "configure:1017: checking for url-retrieve in url" >&5 -fi -library=`echo url | tr _ -` - -elisp="(progn (fmakunbound (quote url-retrieve)) (condition-case nil (progn (require (quote $library)) (fboundp (quote url-retrieve))) (error (prog1 nil (message \"$library not found\")))))" -if test -z ""noecho""; then - echo $ac_n "checking for url""... $ac_c" 1>&6 -echo "configure:1024: checking for url" >&5 -fi -if eval "test \"\${EMACS_cv_SYS_url+set}\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - - OUTPUT=./conftest-$$ - echo ${EMACS}' -batch -eval '\''(let ((x '${elisp}')) (write-region (if (stringp x) (princ x) (prin1-to-string x)) nil "'${OUTPUT}'" nil 5))'\' >& 5 2>&1 - eval ${EMACS}' -batch -eval '\''(let ((x '${elisp}')) (write-region (if (stringp x) (princ x) (prin1-to-string x)) nil "'${OUTPUT}'" nil 5))'\' >& 5 2>&1 - retval=`cat ${OUTPUT}` - echo "=> ${retval}" >& 5 2>&1 - rm -f ${OUTPUT} - EMACS_cv_SYS_url=$retval - -fi - -url=${EMACS_cv_SYS_url} -if test -z ""noecho""; then - echo "$ac_t""$url" 1>&6 -fi - -if test "${EMACS_cv_SYS_url}" = "nil"; then - EMACS_cv_SYS_url=no -fi -if test "${EMACS_cv_SYS_url}" = "t"; then - EMACS_cv_SYS_url=yes -fi -HAVE_url=${EMACS_cv_SYS_url} - -if test -z ""noecho""; then - echo "$ac_t""$HAVE_url" 1>&6 -fi - -if test "${HAVE_url}" = "yes"; then - EMACS_cv_ACCEPTABLE_URL=yes -else - EMACS_cv_ACCEPTABLE_URL= -fi - -if test "x${EMACS_cv_ACCEPTABLE_URL}" = "xyes"; then - -elisp="(file-name-directory (locate-library \"url\"))" -if test -z ""noecho""; then - echo $ac_n "checking for url_dir""... $ac_c" 1>&6 -echo "configure:1068: checking for url_dir" >&5 -fi -if eval "test \"\${EMACS_cv_SYS_url_dir+set}\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - - OUTPUT=./conftest-$$ - echo ${EMACS}' -batch -eval '\''(let ((x '${elisp}')) (write-region (if (stringp x) (princ x) (prin1-to-string x)) nil "'${OUTPUT}'" nil 5))'\' >& 5 2>&1 - eval ${EMACS}' -batch -eval '\''(let ((x '${elisp}')) (write-region (if (stringp x) (princ x) (prin1-to-string x)) nil "'${OUTPUT}'" nil 5))'\' >& 5 2>&1 - retval=`cat ${OUTPUT}` - echo "=> ${retval}" >& 5 2>&1 - rm -f ${OUTPUT} - EMACS_cv_SYS_url_dir=$retval - -fi - -url_dir=${EMACS_cv_SYS_url_dir} -if test -z ""noecho""; then - echo "$ac_t""$url_dir" 1>&6 -fi - - EMACS_cv_ACCEPTABLE_URL=$EMACS_cv_SYS_url_dir -fi - -fi - - # Check whether --with-url or --without-url was given. -if test "${with_url+set}" = set; then - withval="$with_url" - EMACS_cv_ACCEPTABLE_URL=`( cd $withval && pwd || echo "$withval" ) 2> /dev/null` -fi - - URL=${EMACS_cv_ACCEPTABLE_URL} - - if test "x${EMACS_cv_ACCEPTABLE_URL}" = "x"; then - echo "$ac_t""not found" 1>&6 - else - echo "$ac_t"""${URL}"" 1>&6 - fi - - -echo $ac_n "checking for acceptable W3 version""... $ac_c" 1>&6 -echo "configure:1110: checking for acceptable W3 version" >&5 - -unset EMACS_cv_ACCEPTABLE_W3; -unset EMACS_cv_SYS_w3_dir; -unset EMACS_cv_SYS_w3_forms; - -if eval "test \"\${EMACS_cv_ACCEPTABLE_W3+set}\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - - -if test -z ""noecho""; then - echo $ac_n "checking for w3-form-encode-xwfu in w3_forms""... $ac_c" 1>&6 -echo "configure:1123: checking for w3-form-encode-xwfu in w3_forms" >&5 -fi -library=`echo w3_forms | tr _ -` - -elisp="(progn (fmakunbound (quote w3-form-encode-xwfu)) (condition-case nil (progn (require (quote $library)) (fboundp (quote w3-form-encode-xwfu))) (error (prog1 nil (message \"$library not found\")))))" -if test -z ""noecho""; then - echo $ac_n "checking for w3_forms""... $ac_c" 1>&6 -echo "configure:1130: checking for w3_forms" >&5 -fi -if eval "test \"\${EMACS_cv_SYS_w3_forms+set}\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - - OUTPUT=./conftest-$$ - echo ${EMACS}' -batch -eval '\''(let ((x '${elisp}')) (write-region (if (stringp x) (princ x) (prin1-to-string x)) nil "'${OUTPUT}'" nil 5))'\' >& 5 2>&1 - eval ${EMACS}' -batch -eval '\''(let ((x '${elisp}')) (write-region (if (stringp x) (princ x) (prin1-to-string x)) nil "'${OUTPUT}'" nil 5))'\' >& 5 2>&1 - retval=`cat ${OUTPUT}` - echo "=> ${retval}" >& 5 2>&1 - rm -f ${OUTPUT} - EMACS_cv_SYS_w3_forms=$retval - -fi - -w3_forms=${EMACS_cv_SYS_w3_forms} -if test -z ""noecho""; then - echo "$ac_t""$w3_forms" 1>&6 -fi - -if test "${EMACS_cv_SYS_w3_forms}" = "nil"; then - EMACS_cv_SYS_w3_forms=no -fi -if test "${EMACS_cv_SYS_w3_forms}" = "t"; then - EMACS_cv_SYS_w3_forms=yes -fi -HAVE_w3_forms=${EMACS_cv_SYS_w3_forms} - -if test -z ""noecho""; then - echo "$ac_t""$HAVE_w3_forms" 1>&6 -fi - -if test "${HAVE_w3_forms}" = "yes"; then - EMACS_cv_ACCEPTABLE_W3=yes -else - EMACS_cv_ACCEPTABLE_W3= -fi - -if test "x${EMACS_cv_ACCEPTABLE_W3}" = "xyes"; then - -elisp="(file-name-directory (locate-library \"w3-forms\"))" -if test -z ""noecho""; then - echo $ac_n "checking for w3_dir""... $ac_c" 1>&6 -echo "configure:1174: checking for w3_dir" >&5 -fi -if eval "test \"\${EMACS_cv_SYS_w3_dir+set}\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - - OUTPUT=./conftest-$$ - echo ${EMACS}' -batch -eval '\''(let ((x '${elisp}')) (write-region (if (stringp x) (princ x) (prin1-to-string x)) nil "'${OUTPUT}'" nil 5))'\' >& 5 2>&1 - eval ${EMACS}' -batch -eval '\''(let ((x '${elisp}')) (write-region (if (stringp x) (princ x) (prin1-to-string x)) nil "'${OUTPUT}'" nil 5))'\' >& 5 2>&1 - retval=`cat ${OUTPUT}` - echo "=> ${retval}" >& 5 2>&1 - rm -f ${OUTPUT} - EMACS_cv_SYS_w3_dir=$retval - -fi - -w3_dir=${EMACS_cv_SYS_w3_dir} -if test -z ""noecho""; then - echo "$ac_t""$w3_dir" 1>&6 -fi - - EMACS_cv_ACCEPTABLE_W3=$EMACS_cv_SYS_w3_dir -fi - -fi - - # Check whether --with-w3 or --without-w3 was given. -if test "${with_w3+set}" = set; then - withval="$with_w3" - EMACS_cv_ACCEPTABLE_W3=`( cd $withval && pwd || echo "$withval" ) 2> /dev/null` -fi - - W3=${EMACS_cv_ACCEPTABLE_W3} - - if test "x${EMACS_cv_ACCEPTABLE_W3}" = "x"; then - echo "$ac_t""not found" 1>&6 - else - echo "$ac_t""${W3}" 1>&6 - fi - - if test ${EMACS_FLAVOR} = xemacs; then - echo $ac_n "checking where the XEmacs package is""... $ac_c" 1>&6 -echo "configure:1216: checking where the XEmacs package is" >&5 - # Check whether --with-packagedir or --without-packagedir was given. -if test "${with_packagedir+set}" = set; then - withval="$with_packagedir" - if test x$withval != xyes -a x$withval != x; then - PACKAGEDIR=$withval - else - -elisp="(let (package-dir)\ - (if (boundp (quote early-packages))\ - (let ((dirs (delq nil (append (if early-package-load-path\ - early-packages)\ - (if late-package-load-path\ - late-packages)\ - (if last-package-load-path\ - last-packages)))))\ - (while (and dirs (not package-dir))\ - (if (file-directory-p (car dirs))\ - (setq package-dir (car dirs)\ - dirs (cdr dirs))))))\ - (or package-dir \"\"))" -if test -z ""noecho""; then - echo $ac_n "checking for PACKAGEDIR""... $ac_c" 1>&6 -echo "configure:1239: checking for PACKAGEDIR" >&5 -fi -if eval "test \"\${EMACS_cv_SYS_PACKAGEDIR+set}\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - - OUTPUT=./conftest-$$ - echo ${EMACS}' -batch -eval '\''(let ((x '${elisp}')) (write-region (if (stringp x) (princ x) (prin1-to-string x)) nil "'${OUTPUT}'" nil 5))'\' >& 5 2>&1 - eval ${EMACS}' -batch -eval '\''(let ((x '${elisp}')) (write-region (if (stringp x) (princ x) (prin1-to-string x)) nil "'${OUTPUT}'" nil 5))'\' >& 5 2>&1 - retval=`cat ${OUTPUT}` - echo "=> ${retval}" >& 5 2>&1 - rm -f ${OUTPUT} - EMACS_cv_SYS_PACKAGEDIR=$retval - -fi - -PACKAGEDIR=${EMACS_cv_SYS_PACKAGEDIR} -if test -z ""noecho""; then - echo "$ac_t""$PACKAGEDIR" 1>&6 -fi - - fi -else - -elisp="(let (package-dir)\ - (if (boundp (quote early-packages))\ - (let ((dirs (delq nil (append (if early-package-load-path\ - early-packages)\ - (if late-package-load-path\ - late-packages)\ - (if last-package-load-path\ - last-packages)))))\ - (while (and dirs (not package-dir))\ - (if (file-directory-p (car dirs))\ - (setq package-dir (car dirs)\ - dirs (cdr dirs))))))\ - (or package-dir \"\"))" -if test -z ""noecho""; then - echo $ac_n "checking for PACKAGEDIR""... $ac_c" 1>&6 -echo "configure:1278: checking for PACKAGEDIR" >&5 -fi -if eval "test \"\${EMACS_cv_SYS_PACKAGEDIR+set}\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - - OUTPUT=./conftest-$$ - echo ${EMACS}' -batch -eval '\''(let ((x '${elisp}')) (write-region (if (stringp x) (princ x) (prin1-to-string x)) nil "'${OUTPUT}'" nil 5))'\' >& 5 2>&1 - eval ${EMACS}' -batch -eval '\''(let ((x '${elisp}')) (write-region (if (stringp x) (princ x) (prin1-to-string x)) nil "'${OUTPUT}'" nil 5))'\' >& 5 2>&1 - retval=`cat ${OUTPUT}` - echo "=> ${retval}" >& 5 2>&1 - rm -f ${OUTPUT} - EMACS_cv_SYS_PACKAGEDIR=$retval - -fi - -PACKAGEDIR=${EMACS_cv_SYS_PACKAGEDIR} -if test -z ""noecho""; then - echo "$ac_t""$PACKAGEDIR" 1>&6 -fi - -fi - - if test x$PACKAGEDIR = x; then - echo "$ac_t""not found" 1>&6 - else - echo "$ac_t""$PACKAGEDIR" 1>&6 - fi - else - PACKAGEDIR= - fi - - # Check whether --with-addpath or --without-addpath was given. -if test "${with_addpath+set}" = set; then - withval="$with_addpath" - if test x$withval != xyes -a x$withval != x; then - echo $ac_n "checking where to find the additional elisp libraries""... $ac_c" 1>&6 -echo "configure:1315: checking where to find the additional elisp libraries" >&5 - ADDITIONAL_LOAD_PATH=$withval - echo "$ac_t""$ADDITIONAL_LOAD_PATH" 1>&6 - fi -else - ADDITIONAL_LOAD_PATH= -fi - - -trap '' 1 2 15 -cat > confcache <<\EOF -# This file is a shell script that caches the results of configure -# tests run on this system so they can be shared between configure -# scripts and configure runs. It is not useful on other systems. -# If it contains results you don't want to keep, you may remove or edit it. -# -# By default, configure uses ./config.cache as the cache file, -# creating it if it does not exist already. You can give configure -# the --cache-file=FILE option to use a different cache file; that is -# what configure does when it calls configure scripts in -# subdirectories, so they share the cache. -# Giving --cache-file=/dev/null disables caching, for debugging configure. -# config.status only pays attention to the cache file if you give it the -# --recheck option to rerun configure. -# -EOF -# The following way of writing the cache mishandles newlines in values, -# but we know of no workaround that is simple, portable, and efficient. -# So, don't put newlines in cache variables' values. -# Ultrix sh set writes to stderr and can't be redirected directly, -# and sets the high bit in the cache file unless we assign to the vars. -(set) 2>&1 | - case `(ac_space=' '; set | grep ac_space) 2>&1` in - *ac_space=\ *) - # `set' does not quote correctly, so add quotes (double-quote substitution - # turns \\\\ into \\, and sed turns \\ into \). - sed -n \ - -e "s/'/'\\\\''/g" \ - -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" - ;; - *) - # `set' quotes correctly as required by POSIX, so do not add quotes. - sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' - ;; - esac >> confcache -if cmp -s $cache_file confcache; then - : -else - if test -w $cache_file; then - echo "updating cache $cache_file" - cat confcache > $cache_file - else - echo "not updating unwritable cache $cache_file" - fi -fi -rm -f confcache - -trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 - -test "x$prefix" = xNONE && prefix=$ac_default_prefix -# Let make expand exec_prefix. -test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' - -# Any assignment to VPATH causes Sun make to only execute -# the first set of double-colon rules, so remove it if not needed. -# If there is a colon in the path, we need to keep it. -if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' -fi - -trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 - -# Transform confdefs.h into DEFS. -# Protect against shell expansion while executing Makefile rules. -# Protect against Makefile macro expansion. -cat > conftest.defs <<\EOF -s%#define \([^ ][^ ]*\) *\(.*\)%-D\1=\2%g -s%[ `~#$^&*(){}\\|;'"<>?]%\\&%g -s%\[%\\&%g -s%\]%\\&%g -s%\$%$$%g -EOF -DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '` -rm -f conftest.defs - - -# Without the "./", some shells look in PATH for config.status. -: ${CONFIG_STATUS=./config.status} - -echo creating $CONFIG_STATUS -rm -f $CONFIG_STATUS -cat > $CONFIG_STATUS </dev/null | sed 1q`: -# -# $0 $ac_configure_args -# -# Compiler output produced by configure, useful for debugging -# configure, is in ./config.log if it exists. - -ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" -for ac_option -do - case "\$ac_option" in - -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) - echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" - exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; - -version | --version | --versio | --versi | --vers | --ver | --ve | --v) - echo "$CONFIG_STATUS generated by autoconf version 2.14.1" - exit 0 ;; - -help | --help | --hel | --he | --h) - echo "\$ac_cs_usage"; exit 0 ;; - *) echo "\$ac_cs_usage"; exit 1 ;; - esac -done - -ac_given_srcdir=$srcdir -ac_given_INSTALL="$INSTALL" - -trap 'rm -fr `echo "Makefile lisp/Makefile lisp/dgnuspath.el texi/Makefile etc/Makefile" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 -EOF -cat >> $CONFIG_STATUS < conftest.subs <<\\CEOF -$ac_vpsub -$extrasub -s%@SHELL@%$SHELL%g -s%@CFLAGS@%$CFLAGS%g -s%@CPPFLAGS@%$CPPFLAGS%g -s%@CXXFLAGS@%$CXXFLAGS%g -s%@FFLAGS@%$FFLAGS%g -s%@DEFS@%$DEFS%g -s%@LDFLAGS@%$LDFLAGS%g -s%@LIBS@%$LIBS%g -s%@exec_prefix@%$exec_prefix%g -s%@prefix@%$prefix%g -s%@program_transform_name@%$program_transform_name%g -s%@bindir@%$bindir%g -s%@sbindir@%$sbindir%g -s%@libexecdir@%$libexecdir%g -s%@datadir@%$datadir%g -s%@sysconfdir@%$sysconfdir%g -s%@sharedstatedir@%$sharedstatedir%g -s%@localstatedir@%$localstatedir%g -s%@libdir@%$libdir%g -s%@includedir@%$includedir%g -s%@oldincludedir@%$oldincludedir%g -s%@infodir@%$infodir%g -s%@mandir@%$mandir%g -s%@GNUS_PRODUCT_NAME@%$GNUS_PRODUCT_NAME%g -s%@SET_MAKE@%$SET_MAKE%g -s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g -s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g -s%@INSTALL_DATA@%$INSTALL_DATA%g -s%@MAKEINFO@%$MAKEINFO%g -s%@EMACS@%$EMACS%g -s%@XEMACS@%$XEMACS%g -s%@lispdir@%$lispdir%g -s%@etcdir@%$etcdir%g -s%@HAVE_url@%$HAVE_url%g -s%@URL@%$URL%g -s%@HAVE_w3_forms@%$HAVE_w3_forms%g -s%@W3@%$W3%g -s%@PACKAGEDIR@%$PACKAGEDIR%g -s%@ADDITIONAL_LOAD_PATH@%$ADDITIONAL_LOAD_PATH%g - -CEOF -EOF - -cat >> $CONFIG_STATUS <<\EOF - -# Split the substitutions into bite-sized pieces for seds with -# small command number limits, like on Digital OSF/1 and HP-UX. -ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script. -ac_file=1 # Number of current file. -ac_beg=1 # First line for current file. -ac_end=$ac_max_sed_cmds # Line after last line for current file. -ac_more_lines=: -ac_sed_cmds="" -while $ac_more_lines; do - if test $ac_beg -gt 1; then - sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file - else - sed "${ac_end}q" conftest.subs > conftest.s$ac_file - fi - if test ! -s conftest.s$ac_file; then - ac_more_lines=false - rm -f conftest.s$ac_file - else - if test -z "$ac_sed_cmds"; then - ac_sed_cmds="sed -f conftest.s$ac_file" - else - ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file" - fi - ac_file=`expr $ac_file + 1` - ac_beg=$ac_end - ac_end=`expr $ac_end + $ac_max_sed_cmds` - fi -done -if test -z "$ac_sed_cmds"; then - ac_sed_cmds=cat -fi -EOF - -cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF -for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then - # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". - case "$ac_file" in - *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` - ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; - *) ac_file_in="${ac_file}.in" ;; - esac - - # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories. - - # Remove last slash and all that follows it. Not all systems have dirname. - ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` - if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then - # The file is in a subdirectory. - test ! -d "$ac_dir" && mkdir "$ac_dir" - ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" - # A "../" for each directory in $ac_dir_suffix. - ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` - else - ac_dir_suffix= ac_dots= - fi - - case "$ac_given_srcdir" in - .) srcdir=. - if test -z "$ac_dots"; then top_srcdir=. - else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; - /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; - *) # Relative path. - srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" - top_srcdir="$ac_dots$ac_given_srcdir" ;; - esac - - case "$ac_given_INSTALL" in - [/$]*) INSTALL="$ac_given_INSTALL" ;; - *) INSTALL="$ac_dots$ac_given_INSTALL" ;; - esac - - echo creating "$ac_file" - rm -f "$ac_file" - configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." - case "$ac_file" in - *Makefile*) ac_comsub="1i\\ -# $configure_input" ;; - *) ac_comsub= ;; - esac - - ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` - sed -e "$ac_comsub -s%@configure_input@%$configure_input%g -s%@srcdir@%$srcdir%g -s%@top_srcdir@%$top_srcdir%g -s%@INSTALL@%$INSTALL%g -" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file -fi; done -rm -f conftest.s* - -EOF -cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF - -exit 0 -EOF -chmod +x $CONFIG_STATUS -rm -fr confdefs* $ac_clean_files -test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 - diff --git a/configure.in b/configure.in deleted file mode 100644 index 839c1cf..0000000 --- a/configure.in +++ /dev/null @@ -1,13 +0,0 @@ -AC_INIT(lisp/gnus.el) -AC_DEFINE_GNUS_PRODUCT_NAME(t-gnus) -AC_SET_MAKE -AC_PROG_INSTALL -AC_CHECK_PROG(MAKEINFO, makeinfo, makeinfo, no) -AC_CHECK_EMACS -AC_PATH_LISPDIR -AC_PATH_ETCDIR -AC_CHECK_URL -AC_CHECK_W3 -AC_PATH_PACKAGEDIR -AC_ADD_LOAD_PATH -AC_OUTPUT(Makefile lisp/Makefile lisp/dgnuspath.el texi/Makefile etc/Makefile) diff --git a/contrib/ChangeLog b/contrib/ChangeLog deleted file mode 100644 index be5b92b..0000000 --- a/contrib/ChangeLog +++ /dev/null @@ -1,73 +0,0 @@ -2001-08-24 16:09:14 Fabien Penso - - * gpg.el (gpg-command-sign-detached): Doc fix. - -2001-08-07 Andreas Jaeger - - * gpg.el (gpg-passphrase-forget): Don't cache - gpg-passphrase-timer. - (gpg-passphrase-store): Check if gpg-passphrase-timer is - initialized already. - -2001-07-30 16:00:00 ShengHuo ZHU - From Andreas Fuchs - - * gpg.el (gpg-command-verify): --status-fd 1 - (gpg-unabbrev-trust-alist): New. - -2001-01-18 Colin Marquardt - - * gpg.el (gpg-make-temp-file): Error info. - -2001-01-13 23:00:00 ShengHuo ZHU - - * gpg.el (gpg-build-arg-list): Use copy-sequence. - -2000-12-19 22:00:00 ShengHuo ZHU - - * gpg.el (defalias): Use eval-and-compile. - (gpg-command-all-arglist): Suggest by Jeff Senn . - -2000-12-15 00:00:00 ShengHuo ZHU - - * gpg.el (gpg-command-alist): Alist may not be defined. - -2000-12-14 23:00:00 ShengHuo ZHU - - * gpg.el (gpg-make-temp-file): Don't check file-modes of M$Windows. - -2000-12-14 10:00:00 ShengHuo ZHU - - * gpg.el (gpg-passphrase-store): Don't activate timer if it is live. - -2000-11-30 22:00:00 ShengHuo ZHU - - * gpg.el: (gpg-make-temp-file): Use expand-file-name. - (gpg-point-at-eol): New function. - (gpg-call-process): Use it. - (gpg-key-list-keys-parse-line): Ditto. - (gpg-with-passphrase-env): edebug-form-spec. - (gpg-with-temp-files): Ditto. - (gpg-show-result): Ditto. - -2000-11-08 Bj,Av(Brn Torkelsson - - * gpg.el: In Xemacs it is called point-at-eol, not - line-end-position - - * gpg.el (gpg-key-lessp): use string-lessp instead of - compare-strings (not available on XEmacs) - -2000-11-16 Simon Josefsson - - * gpg.el (gpg-command-verify-cleartext): New variable. - (gpg-verify-cleartext): New function. - -2000-10-31 17:32:02 ShengHuo ZHU - - * gpg.el (gpg-verify): The last argument of apply is a list. - (gpg-encrypt): Add passphrase as a parameter. - -;; Local Variables: -;; coding: iso-2022-7bit -;; End: diff --git a/contrib/README b/contrib/README deleted file mode 100644 index 76d0e5c..0000000 --- a/contrib/README +++ /dev/null @@ -1,3 +0,0 @@ -The files in this directory are not (yet) part of the -Gnus distribution proper. They may later become part -of the distribution, or they may disappear altogether. diff --git a/contrib/base64.el b/contrib/base64.el deleted file mode 100644 index 572a5d3..0000000 --- a/contrib/base64.el +++ /dev/null @@ -1,278 +0,0 @@ -;;; base64.el,v --- Base64 encoding functions -;; Author: Kyle E. Jones -;; Created: 1997/03/12 14:37:09 -;; Version: 1.6 -;; Keywords: extensions - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; Copyright (C) 1997 Kyle E. Jones -;;; -;;; This file is not part of GNU Emacs, but the same permissions apply. -;;; -;;; GNU Emacs 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. -;;; -;;; GNU Emacs 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. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -(eval-when-compile (require 'cl)) - -;; For non-MULE -(if (not (fboundp 'char-int)) - (defalias 'char-int 'identity)) - -(defvar base64-alphabet - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/") - -(defvar base64-decoder-program nil - "*Non-nil value should be a string that names a MIME base64 decoder. -The program should expect to read base64 data on its standard -input and write the converted data to its standard output.") - -(defvar base64-decoder-switches nil - "*List of command line flags passed to the command named by -base64-decoder-program.") - -(defvar base64-encoder-program nil - "*Non-nil value should be a string that names a MIME base64 encoder. -The program should expect arbitrary data on its standard -input and write base64 data to its standard output.") - -(defvar base64-encoder-switches nil - "*List of command line flags passed to the command named by -base64-encoder-program.") - -(defconst base64-alphabet-decoding-alist - '( - ( ?A . 00) ( ?B . 01) ( ?C . 02) ( ?D . 03) ( ?E . 04) ( ?F . 05) - ( ?G . 06) ( ?H . 07) ( ?I . 08) ( ?J . 09) ( ?K . 10) ( ?L . 11) - ( ?M . 12) ( ?N . 13) ( ?O . 14) ( ?P . 15) ( ?Q . 16) ( ?R . 17) - ( ?S . 18) ( ?T . 19) ( ?U . 20) ( ?V . 21) ( ?W . 22) ( ?X . 23) - ( ?Y . 24) ( ?Z . 25) ( ?a . 26) ( ?b . 27) ( ?c . 28) ( ?d . 29) - ( ?e . 30) ( ?f . 31) ( ?g . 32) ( ?h . 33) ( ?i . 34) ( ?j . 35) - ( ?k . 36) ( ?l . 37) ( ?m . 38) ( ?n . 39) ( ?o . 40) ( ?p . 41) - ( ?q . 42) ( ?r . 43) ( ?s . 44) ( ?t . 45) ( ?u . 46) ( ?v . 47) - ( ?w . 48) ( ?x . 49) ( ?y . 50) ( ?z . 51) ( ?0 . 52) ( ?1 . 53) - ( ?2 . 54) ( ?3 . 55) ( ?4 . 56) ( ?5 . 57) ( ?6 . 58) ( ?7 . 59) - ( ?8 . 60) ( ?9 . 61) ( ?+ . 62) ( ?/ . 63) - )) - -(defvar base64-alphabet-decoding-vector - (let ((v (make-vector 123 nil)) - (p base64-alphabet-decoding-alist)) - (while p - (aset v (car (car p)) (cdr (car p))) - (setq p (cdr p))) - v)) - -(defvar base64-binary-coding-system 'binary) - -(defun base64-run-command-on-region (start end output-buffer command - &rest arg-list) - (let ((tempfile nil) status errstring default-process-coding-system - (coding-system-for-write base64-binary-coding-system) - (coding-system-for-read base64-binary-coding-system)) - (unwind-protect - (progn - (setq tempfile (make-temp-name "base64")) - (setq status - (apply 'call-process-region - start end command nil - (list output-buffer tempfile) - nil arg-list)) - (cond ((equal status 0) t) - ((zerop (save-excursion - (set-buffer (find-file-noselect tempfile)) - (buffer-size))) - t) - (t (save-excursion - (set-buffer (find-file-noselect tempfile)) - (setq errstring (buffer-string)) - (kill-buffer nil) - (cons status errstring))))) - (ignore-errors - (delete-file tempfile))))) - -(if (featurep 'xemacs) - (defalias 'base64-insert-char 'insert-char) - (defun base64-insert-char (char &optional count ignored buffer) - (if (or (null buffer) (eq buffer (current-buffer))) - (insert-char char count) - (with-current-buffer buffer - (insert-char char count)))) - (setq base64-binary-coding-system 'no-conversion)) - -(defun base64-decode-region (start end) - (interactive "r") - ;;(message "Decoding base64...") - (let ((work-buffer nil) - (done nil) - (counter 0) - (bits 0) - (lim 0) inputpos - (non-data-chars (concat "^=" base64-alphabet))) - (unwind-protect - (save-excursion - (setq work-buffer (generate-new-buffer " *base64-work*")) - (buffer-disable-undo work-buffer) - (if base64-decoder-program - (let* ((binary-process-output t) ; any text already has CRLFs - (status (apply 'base64-run-command-on-region - start end work-buffer - base64-decoder-program - base64-decoder-switches))) - (if (not (eq status t)) - (error "%s" (cdr status)))) - (goto-char start) - (skip-chars-forward non-data-chars end) - (while (not done) - (setq inputpos (point)) - (cond - ((> (skip-chars-forward base64-alphabet end) 0) - (setq lim (point)) - (while (< inputpos lim) - (setq bits (+ bits - (aref base64-alphabet-decoding-vector - (char-int (char-after inputpos))))) - (setq counter (1+ counter) - inputpos (1+ inputpos)) - (cond ((= counter 4) - (base64-insert-char (lsh bits -16) 1 nil work-buffer) - (base64-insert-char (logand (lsh bits -8) 255) 1 nil - work-buffer) - (base64-insert-char (logand bits 255) 1 nil - work-buffer) - (setq bits 0 counter 0)) - (t (setq bits (lsh bits 6))))))) - (cond - ((or (= (point) end) - (eq (char-after (point)) ?=)) - (if (and (= (point) end) (> counter 1)) - (message - "at least %d bits missing at end of base64 encoding" - (* (- 4 counter) 6))) - (setq done t) - (cond ((= counter 1) - (error "at least 2 bits missing at end of base64 encoding")) - ((= counter 2) - (base64-insert-char (lsh bits -10) 1 nil work-buffer)) - ((= counter 3) - (base64-insert-char (lsh bits -16) 1 nil work-buffer) - (base64-insert-char (logand (lsh bits -8) 255) - 1 nil work-buffer)) - ((= counter 0) t))) - (t (skip-chars-forward non-data-chars end))))) - (or (markerp end) (setq end (set-marker (make-marker) end))) - (goto-char start) - (insert-buffer-substring work-buffer) - (delete-region (point) end)) - (and work-buffer (kill-buffer work-buffer)))) - ;;(message "Decoding base64... done") - ) - -(defun base64-encode-region (start end &optional no-line-break) - (interactive "r") - (message "Encoding base64...") - (let ((work-buffer nil) - (counter 0) - (cols 0) - (bits 0) - (alphabet base64-alphabet) - inputpos) - (unwind-protect - (save-excursion - (setq work-buffer (generate-new-buffer " *base64-work*")) - (buffer-disable-undo work-buffer) - (if base64-encoder-program - (let ((status (apply 'base64-run-command-on-region - start end work-buffer - base64-encoder-program - base64-encoder-switches))) - (if (not (eq status t)) - (error "%s" (cdr status)))) - (setq inputpos start) - (while (< inputpos end) - (setq bits (+ bits (char-int (char-after inputpos)))) - (setq counter (1+ counter)) - (cond ((= counter 3) - (base64-insert-char (aref alphabet (lsh bits -18)) 1 nil - work-buffer) - (base64-insert-char - (aref alphabet (logand (lsh bits -12) 63)) - 1 nil work-buffer) - (base64-insert-char - (aref alphabet (logand (lsh bits -6) 63)) - 1 nil work-buffer) - (base64-insert-char - (aref alphabet (logand bits 63)) - 1 nil work-buffer) - (setq cols (+ cols 4)) - (cond ((and (= cols 72) - (not no-line-break)) - (base64-insert-char ?\n 1 nil work-buffer) - (setq cols 0))) - (setq bits 0 counter 0)) - (t (setq bits (lsh bits 8)))) - (setq inputpos (1+ inputpos))) - ;; write out any remaining bits with appropriate padding - (if (= counter 0) - nil - (setq bits (lsh bits (- 16 (* 8 counter)))) - (base64-insert-char (aref alphabet (lsh bits -18)) 1 nil - work-buffer) - (base64-insert-char (aref alphabet (logand (lsh bits -12) 63)) - 1 nil work-buffer) - (if (= counter 1) - (base64-insert-char ?= 2 nil work-buffer) - (base64-insert-char (aref alphabet (logand (lsh bits -6) 63)) - 1 nil work-buffer) - (base64-insert-char ?= 1 nil work-buffer))) - (if (and (> cols 0) - (not no-line-break)) - (base64-insert-char ?\n 1 nil work-buffer))) - (or (markerp end) (setq end (set-marker (make-marker) end))) - (goto-char start) - (insert-buffer-substring work-buffer) - (delete-region (point) end)) - (and work-buffer (kill-buffer work-buffer)))) - (message "Encoding base64... done")) - -(defun base64-encode (string &optional no-line-break) - (save-excursion - (set-buffer (get-buffer-create " *base64-encode*")) - (erase-buffer) - (insert string) - (base64-encode-region (point-min) (point-max) no-line-break) - (skip-chars-backward " \t\r\n") - (delete-region (point-max) (point)) - (prog1 - (buffer-string) - (kill-buffer (current-buffer))))) - -(defun base64-decode (string) - (save-excursion - (set-buffer (get-buffer-create " *base64-decode*")) - (erase-buffer) - (insert string) - (base64-decode-region (point-min) (point-max)) - (goto-char (point-max)) - (skip-chars-backward " \t\r\n") - (delete-region (point-max) (point)) - (prog1 - (buffer-string) - (kill-buffer (current-buffer))))) - -(defalias 'base64-decode-string 'base64-decode) -(defalias 'base64-encode-string 'base64-encode) - -(provide 'base64) diff --git a/contrib/canlock.el b/contrib/canlock.el deleted file mode 100644 index 3cce006..0000000 --- a/contrib/canlock.el +++ /dev/null @@ -1,475 +0,0 @@ -;;; canlock.el --- Functions for Cancel-Lock feature. -;; Copyright (C) 1998,1999 Katsumi Yamaoka - -;; Author: Katsumi Yamaoka -;; Yuuichi Teranishi -;; Hideyuki SHIRAI -;; Hidekazu Nakamura -;; Ken'ichi Okada -;; Shuhei KOBAYASHI -;; Created: 1998-11-24 -;; Revised: 1999-06-14 -;; Keywords: news, cancel-lock, hmac, sha1, rfc2104 - -;; This program 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 program 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 this program; if not, write to the Free Software -;; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, -;; USA. - -;;; Commentary: - -;; This library is based on draft-ietf-usefor-cancel-lock-01.txt, -;; released on 1998-11-03. - -;;; Code: - -(defconst canlock-version "0.6") - -(eval-when-compile (require 'cl)) -(require 'custom) -(require 'mail-utils) - -(autoload 'sha1-encode-binary "sha1") -(autoload 'base64-encode "base64") - -(defgroup canlock nil - "Cancel-Lock feature." - :prefix "canlock-" - :group 'applications) - -(defcustom canlock-base64-encode-function 'base64-encode-string - "*Function called to encode string to base64." - :type '(radio (function-item base64-encode-string) - (function-item base64-encode) - (function-item canlock-base64-encode-string-with-mmencode) - (function :tag "Other")) - :group 'canlock) - -(defcustom canlock-mmencode-program "mmencode" - "*Name of mmencode program." - :type 'string - :group 'canlock) - -(defcustom canlock-mmencode-args-for-encoding nil - "*Arguments passed to mmencode program for encoding." - :type 'sexp - :group 'canlock) - -(defcustom canlock-sha1-function 'sha1-encode-binary - "*Function called to make a SHA1 digest from a message (string)." - :type '(radio (function-item sha1-encode-binary) - (function-item canlock-sha1-with-ssleay) - (function :tag "Other")) - :group 'canlock) - -(defcustom canlock-sha1-function-for-verify canlock-sha1-function - "*Function called to make a SHA1 digest for verifying." - :type '(radio (function-item sha1-encode-binary) - (function-item canlock-sha1-with-ssleay) - (function :tag "Other")) - :group 'canlock) - -(defcustom canlock-ssleay-program "ssleay" - "*Name of SSLeay program." - :type 'string - :group 'canlock) - -(defcustom canlock-ssleay-args '("sha1") - "*Arguments passed to SSLeay program." - :type 'sexp - :group 'canlock) - -(defcustom canlock-ignore-errors nil - "*If non-nil, ignore any error signals." - :type 'boolean - :group 'canlock) - -(defcustom canlock-load-hook nil - "*Hook to be run after the canlock package has been loaded." - :type 'hook - :group 'canlock) - -;;; Internal variables. - -(defvar canlock-password nil - "*Password to use when signing a Cancel-Lock or a Cancel-Key header.") - -(defvar canlock-password-for-verify canlock-password - "*Password to use when verifying a Cancel-Lock or a Cancel-Key header.") - -(defvar canlock-force-insert-header nil - "*If non-nil, insert a Cancel-Lock or a Cancel-Key header even though the -buffer does not contain a news message.") - -;;; Functions. - -(defun canlock-base64-encode-string-with-mmencode (string) - "Encode string to base64 with mmencode." - (with-temp-buffer - (let ((coding-system-for-read 'raw-text) - (coding-system-for-write 'binary) - ;; For Mule 2 with APEL 9.12 or later. - (default-process-coding-system '(raw-text . binary)) - mc-flag program-coding-system-alist) - (insert string) - (apply 'call-process-region (point-min) (point-max) - canlock-mmencode-program t t nil - canlock-mmencode-args-for-encoding) - (goto-char (point-max)) - (skip-chars-backward "\n") - (buffer-substring (point-min) (point))))) - -(defun canlock-hex-string-to-int (string) - "Convert hexadecimal string to integer." - (let ((integer 0)) - (mapcar - (lambda (hex) - (setq integer (+ (* 16 integer) - (logand hex 15) - (* (lsh hex -6) 9)))) - string) - integer)) - -(defun canlock-sha1-with-ssleay (message) - "Make a SHA1 digest from a specified message (string) with SSLeay." - (with-temp-buffer - (let ((coding-system-for-read 'binary) - (coding-system-for-write 'binary) - ;; For Mule 2 with APEL 9.12 or later. - (default-process-coding-system '(binary . binary)) - mc-flag program-coding-system-alist - (case-fold-search t)) - (insert message) - (apply 'call-process-region (point-min) (point-max) - canlock-ssleay-program t t nil canlock-ssleay-args) - (goto-char (point-min)) - (while (re-search-forward "[0-9A-F][0-9A-F]" nil t) - (goto-char (match-beginning 0)) - (insert-char (canlock-hex-string-to-int (match-string 0)) 1) - (delete-char 2)) - (buffer-substring (point-min) (point))))) - -(defvar canlock-read-passwd nil) -(defun canlock-read-passwd (prompt &rest args) - "Read a password using PROMPT. -If ARGS, PROMPT is used as an argument to `format'." - (let ((prompt - (if args - (apply 'format prompt args) - prompt))) - (unless canlock-read-passwd - (if (or (fboundp 'read-passwd) (load "passwd" t)) - (setq canlock-read-passwd 'read-passwd) - (unless (fboundp 'ange-ftp-read-passwd) - (autoload 'ange-ftp-read-passwd "ange-ftp")) - (setq canlock-read-passwd 'ange-ftp-read-passwd))) - (funcall canlock-read-passwd prompt))) - -(defun canlock-make-cancel-key (message-id password) - "Make a Cancel-Key header." - (cond ((> (length password) 20) - (setq password (funcall canlock-sha1-function password))) - ((< (length password) 20) - (setq password (concat - password - (make-string (- 20 (length password)) 0))))) - (setq password (concat password (make-string 44 0))) - (let ((ipad (mapconcat (lambda (char) - (char-to-string (logxor 54 char))) - password "")) - (opad (mapconcat (lambda (char) - (char-to-string (logxor 92 char))) - password ""))) - (funcall canlock-base64-encode-function - (funcall canlock-sha1-function - (concat - opad - (funcall canlock-sha1-function - (concat ipad message-id))))))) - -(defun canlock-narrow-to-header () - "Narrow to the message header." - (let (case-fold-search) - (narrow-to-region - (goto-char (point-min)) - (goto-char (if (re-search-forward - (format "^$\\|^%s$" - (regexp-quote mail-header-separator)) - nil t) - (match-beginning 0) - (point-max)))))) - -(defun canlock-delete-headers () - "Delete Canlock headers if they already exist. -The buffer is expected to be narrowed to just the headers of the message." - (let ((case-fold-search t)) - (goto-char (point-min)) - (while (re-search-forward "^Cancel-\\(Key\\|Lock\\):" nil t) - (delete-region (match-beginning 0) - (if (re-search-forward "^[^\t ]" nil t) - (goto-char (match-beginning 0)) - (point-max)))))) - -(defun canlock-fetch-fields (&optional key) - "Return the list of values of Cancel-Lock field. -If the optional arg KEY is non-nil, Cancel-Key field will be fetched. -The buffer is expected to be narrowed to just the headers of the message." - (let ((feild (mail-fetch-field (if key "Cancel-Key" "Cancel-Lock"))) - (case-fold-search t)) - (when feild - (mapcar (lambda (str) - (string-match "^sha1:" str) - (substring str (match-end 0))) - (split-string feild "[\t\n\r ,]+"))))) - -(defun canlock-fetch-id-for-key () - "Return the Message-ID for Cancel-Key. -The buffer is expected to be narrowed to just the headers of the message." - (let ((cancel (mail-fetch-field "Control"))) - (if cancel - (progn - (string-match "^cancel[\t ]+\\(<[^\t\n @<>]+@[^\t\n @<>]+>\\)" - cancel) - (match-string 1 cancel)) - (or (mail-fetch-field "Supersedes") - (mail-fetch-field "Replaces"))))) - -;;;###autoload -(defun canlock-insert-header (&optional id-for-key id-for-lock password) - "Insert a Cancel-Key and/or a Cancel-Lock header if possible." - (let (news control key-for-key key-for-lock) - (save-excursion - (save-restriction - (canlock-narrow-to-header) - (when (setq news (or canlock-force-insert-header - (mail-fetch-field "Newsgroups"))) - (unless id-for-key - (setq id-for-key (canlock-fetch-id-for-key))) - (if (and (setq control (mail-fetch-field "Control")) - (string-match - "^cancel[\t ]+\\(<[^\t\n @<>]+@[^\t\n @<>]+>\\)" - control)) - (setq id-for-lock nil) - (unless id-for-lock - (setq id-for-lock (mail-fetch-field "Message-ID")))) - (canlock-delete-headers) - (goto-char (point-max)))) - (when news - (if (not (or id-for-key id-for-lock)) - (message "There are no Message-ID(s).") - (unless password - (setq password (or canlock-password - (canlock-read-passwd - "Password for Canlock: ")))) - (if (or (not (stringp password)) (zerop (length password))) - (message "Password for Canlock is bad.") - (setq key-for-key (when id-for-key - (canlock-make-cancel-key - id-for-key password)) - key-for-lock (when id-for-lock - (canlock-make-cancel-key - id-for-lock password))) - (if (not (or key-for-key key-for-lock)) - (message "Couldn't insert Canlock header.") - (when key-for-key - (insert "Cancel-Key: sha1:" key-for-key "\n")) - (when key-for-lock - (insert "Cancel-Lock: sha1:" - (funcall canlock-base64-encode-function - (funcall canlock-sha1-function - key-for-lock)) - "\n"))))))))) - -;;;###autoload -(defun canlock-verify (&optional buffer) - "Verify Cancel-Lock or Cancel-Key. If failed, returns non-nil or signals -an error if `canlock-ignore-errors' is nil. If the optional arg BUFFER -is not specified, it runs in place." - (interactive) - (let ((canlock-sha1-function (or canlock-sha1-function-for-verify - canlock-sha1-function)) - keys locks errmsg id-for-key id-for-lock password - key-for-key key-for-lock match) - (save-excursion - (when buffer - (set-buffer buffer)) - (save-restriction - (widen) - (canlock-narrow-to-header) - (setq keys (canlock-fetch-fields 'key) - locks (canlock-fetch-fields)) - (if (not (or keys locks)) - (setq errmsg - "There are neither Cancel-Lock nor Cancel-Key fields.") - (setq id-for-key (canlock-fetch-id-for-key) - id-for-lock (mail-fetch-field "Message-ID")) - (or id-for-key id-for-lock - (setq errmsg "There are no Message-ID(s)."))))) - - (if errmsg - (if canlock-ignore-errors - errmsg - (error "%s" errmsg)) - - (setq password (or canlock-password-for-verify - (canlock-read-passwd "Password for Canlock: "))) - (if (or (not (stringp password)) (zerop (length password))) - (progn - (setq errmsg "Password for Canlock is bad.") - (if canlock-ignore-errors - errmsg - (error "%s" errmsg))) - - (when keys - (when id-for-key - (setq key-for-key (canlock-make-cancel-key id-for-key password)) - (while (and keys (not match)) - (setq match (string-equal key-for-key (pop keys))))) - (setq keys (if match "good" "bad"))) - (setq match nil) - - (when locks - (when id-for-lock - (setq key-for-lock - (funcall canlock-base64-encode-function - (funcall canlock-sha1-function - (canlock-make-cancel-key - id-for-lock password)))) - (when (and locks (not match)) - (setq match (string-equal key-for-lock (pop locks))))) - (setq locks (if match "good" "bad"))) - - (prog1 - (when (member "bad" (list keys locks)) - "bad") - (cond ((and keys locks) - (message "Cancel-Key is %s, Cancel-Lock is %s." keys locks)) - (locks - (message "Cancel-Lock is %s." locks)) - (keys - (message "Cancel-Key is %s." keys)))))))) - -;; Avoid byte compile warnings. -(defvar gnus-show-all-headers) -(defvar gnus-original-article-buffer) -(defvar mh-show-buffer) -(defvar vm-mail-buffer) -(defvar vm-message-pointer) -(defvar cmail-current-folder) -(defvar rmail-buffer) - -;;;###autoload -(defun gnus-summary-canlock-verify () - "Run `canlock-verify' from gnus summary buffer." - (interactive) - (gnus-summary-select-article gnus-show-all-headers) - (canlock-verify gnus-original-article-buffer)) - -;;;###autoload -(defun wl-summary-canlock-verify () - "Run `canlock-verify' from Wanderlust summary buffer." - (interactive) - (wl-summary-set-message-buffer-or-redisplay) - (canlock-verify (wl-message-get-original-buffer))) - -(eval-when-compile - (if (or (featurep 'use-mew-1.94b20-or-later) - (and (fboundp 'function-max-args) - (or (fboundp 'mew-summary-display) - (load "mew-summary" t)) - (eq 2 (function-max-args 'mew-summary-display)))) - (progn - (defmacro canlock-mew-summary-display () - '(mew-summary-display t)) - (message "Use mew-1.94b20 or later.")) - (defmacro canlock-mew-summary-display () - '(condition-case nil - (mew-summary-display) - (wrong-number-of-arguments - (mew-summary-display t)))) - )) - -;;;###autoload -(defun mew-summary-canlock-verify () - "Run `canlock-verify' from Mew summary buffer." - (interactive) - (canlock-mew-summary-display) - (canlock-verify (mew-buffer-message))) - -;;;###autoload -(defun mh-summary-canlock-verify () - "Run `canlock-verify' from MH folder buffer." - (interactive) - (mh-header-display) - (canlock-verify mh-show-buffer)) - -;;;###autoload -(defun vm-summary-canlock-verify () - "Run `canlock-verify' from VM summary buffer." - (interactive) - (vm-follow-summary-cursor) - (if (and vm-mail-buffer (buffer-name vm-mail-buffer)) - (save-excursion - (set-buffer vm-mail-buffer) - (let* ((mp (car vm-message-pointer)) - (header (save-restriction - (widen) - (buffer-substring - (aref (aref mp 0) 0) (vm-text-of mp))))) - (with-temp-buffer - (insert header) - (canlock-verify)))) - (or canlock-ignore-errors - (error "Folder buffer has been killed")))) - -;;;###autoload -(defun cmail-summary-canlock-verify () - "Run `canlock-verify' from cmail summary buffer." - (interactive) - (let* ((page (cmail-get-page-number-from-summary)) - (header (save-excursion - (set-buffer (cmail-folder-buffer cmail-current-folder)) - (cmail-n-page page) - (buffer-substring (point) - (if (search-forward "\n\n" nil t) - (1- (point)) - (point-max)))))) - (with-temp-buffer - (insert header) - (canlock-verify)))) - -;;;###autoload -(defun rmail-summary-canlock-verify () - "Run `canlock-verify' from RMAIL summary buffer." - (interactive) - (rmail-summary-rmail-update) - (let ((header (save-excursion - (set-buffer rmail-buffer) - (goto-char (point-min)) - (save-restriction - (widen) - (search-backward "\n\C-_\C-l\n") ;; ^_^L - (re-search-forward "^[^\t\n ]+:") - (buffer-substring - (goto-char (match-beginning 0)) - (progn (search-forward "\n\n") - (1- (point)))))))) - (with-temp-buffer - (insert header) - (canlock-verify)))) - -(provide 'canlock) - -(run-hooks 'canlock-load-hook) - -;;; canlock.el ends here diff --git a/contrib/gpg-ring.el b/contrib/gpg-ring.el deleted file mode 100644 index d402886..0000000 --- a/contrib/gpg-ring.el +++ /dev/null @@ -1,483 +0,0 @@ -;;; gpg-ring.el --- Major mode for editing GnuPG key rings. - -;; Copyright (C) 2000 RUS-CERT, University Of Stuttgart - -;; Author: Florian Weimer -;; Maintainer: Florian Weimer -;; Keywords: crypto -;; Created: 2000-04-28 - -;; $Id: gpg-ring.el,v 1.1.4.2 2001-07-15 23:22:50 yamaoka Exp $ - -;; This file is NOT (yet?) part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - - - -;;; Code: - -(require 'gpg) -(eval-when-compile (require 'cl)) - -;;;; Customization: - -;;; Customization: Groups: - -(defgroup gpg-ring nil - "GNU Privacy Guard user interface." - :tag "GnuPG user interface" - :group 'gpg) - -;;; Customization: Variables: - -(defface gpg-ring-key-invalid-face - '((((class color)) - (:foreground "yellow" :background "red")) - (t (:bold t :italic t :underline t))) - "Face for strings indicating key invalidity." - :group 'gpg-ring) - -(defface gpg-ring-uncertain-validity-face - '((((class color)) (:foreground "red")) - (t (:bold t))) - "Face for strings indicating uncertain validity." - :group 'gpg-ring) - -(defface gpg-ring-full-validity-face - '((((class color)) (:foreground "ForestGreen" :bold t)) - (t (:bold t))) - "Face for strings indicating key invalidity." - :group 'gpg-ring) - -(defvar gpg-ring-mode-hook nil - "Normal hook run when entering GnuPG ring mode.") - -;;; Constants - -(defconst gpg-ring-algo-alist - '((rsa . "RSA") - (rsa-encrypt-only . "RSA-E") - (rsa-sign-only . "RSA-S") - (elgamal-encrypt-only . "ELG-E") - (dsa . "DSA") - (elgamal . "ELG-E")) - "Alist mapping algorithm IDs to algorithm abbreviations.") - -(defconst gpg-ring-trust-alist - '((not-known "???" gpg-ring-uncertain-validity-face) - (disabled "DIS" gpg-ring-key-invalid-face) - (revoked "REV" gpg-ring-key-invalid-face) - (expired "EXP" gpg-ring-key-invalid-face) - (trust-undefined "QES" gpg-ring-uncertain-validity-face) - (trust-none "NON" gpg-ring-uncertain-validity-face) - (trust-marginal "MAR") - (trust-full "FUL" gpg-ring-full-validity-face) - (trust-ultimate "ULT" gpg-ring-full-validity-face)) - "Alist mapping trust IDs to trust abbrevs and faces.") - -(defvar gpg-ring-mode-map - (let ((map (make-keymap))) - (suppress-keymap map t) - map) - "Keymap for `gpg-ring-mode'.") - -(define-key gpg-ring-mode-map "0" 'delete-window) -(define-key gpg-ring-mode-map "1" 'delete-other-windows) -(define-key gpg-ring-mode-map "M" 'gpg-ring-mark-process-all) -(define-key gpg-ring-mode-map "U" 'gpg-ring-unmark-all) -(define-key gpg-ring-mode-map "a" 'gpg-ring-toggle-show-unusable) -(define-key gpg-ring-mode-map "d" 'gpg-ring-mark-delete) -(define-key gpg-ring-mode-map "f" 'gpg-ring-update-key) -(define-key gpg-ring-mode-map "g" 'gpg-ring-update) -(define-key gpg-ring-mode-map "i" 'gpg-ring-show-key) -(define-key gpg-ring-mode-map "l" 'gpg-ring-toggle-show-all-ids) -(define-key gpg-ring-mode-map "m" 'gpg-ring-mark-process) -(define-key gpg-ring-mode-map "n" 'gpg-ring-next-record) -(define-key gpg-ring-mode-map "p" 'gpg-ring-previous-record) -(define-key gpg-ring-mode-map "q" 'gpg-ring-quit) -(define-key gpg-ring-mode-map "u" 'gpg-ring-unmark) -(define-key gpg-ring-mode-map "x" 'gpg-ring-extract-keys) -(define-key gpg-ring-mode-map "X" 'gpg-ring-extract-keys-to-kill) - -(define-key gpg-ring-mode-map "\C-c\C-c" 'gpg-ring-action) - -;;; Internal functions: - -(defvar gpg-ring-key-list - nil - "List of keys in the key list buffer.") -(make-variable-buffer-local 'gpg-ring-key-list) - -(defvar gpg-ring-update-funcs - nil - "List of functions called to obtain the key list.") -(make-variable-buffer-local 'gpg-ring-update-funcs) - -(defvar gpg-ring-show-unusable - nil - "If t, show expired, revoked and disabled keys, too.") -(make-variable-buffer-local 'gpg-ring-show-unusable) - -(defvar gpg-ring-show-all-ids - nil - "If t, show all user IDs. If nil, show only the primary user ID.") -(make-variable-buffer-local 'gpg-ring-show-all-ids) - -(defvar gpg-ring-marks-alist - nil - "Alist of (UNIQUE-ID MARK KEY). -UNIQUE-ID is a unique key ID from GnuPG. MARK is either `?D' -(marked for deletion), or `?*' (marked for processing).") -(make-variable-buffer-local 'gpg-ring-marks-alist) - -(defvar gpg-ring-action - nil - "Function to call when `gpg-ring-action' is invoked. -A list of the keys which are marked for processing is passed as argument.") -(make-variable-buffer-local 'gpg-ring-action) - -(defun gpg-ring-mode () - "Mode for editing GnuPG key rings. -\\{gpg-ring-mode-map} -Turning on gpg-ring-mode runs `gpg-ring-mode-hook'." - (interactive) - (kill-all-local-variables) - (buffer-disable-undo) - (setq truncate-lines t) - (setq buffer-read-only t) - (use-local-map gpg-ring-mode-map) - (setq mode-name "Key Ring") - (setq major-mode 'gpg-ring-mode) - (run-hooks 'gpg-ring-mode-hook)) - - -(defmacro gpg-ring-record-start (&optional pos) - "Return buffer position of start of record containing POS." - `(get-text-property (or ,pos (point)) 'gpg-record-start)) - -(defun gpg-ring-current-key (&optional pos) - "Return GnuPG key at POS, or at point if ommitted." - (or (get-text-property (or pos (point)) 'gpg-key) - (error "No record on current line"))) - -(defun gpg-ring-goto-record (pos) - "Go to record starting at POS. -Position point after the marks at the beginning of a record." - (goto-char pos) - (forward-char 2)) - -(defun gpg-ring-next-record () - "Advances point to the start of the next record." - (interactive) - (let ((start (next-single-property-change - (point) 'gpg-record-start nil (point-max)))) - ;; Don't advance to the last line of the buffer. - (when (/= start (point-max)) - (gpg-ring-goto-record start)))) - -(defun gpg-ring-previous-record () - "Advances point to the start of the previous record." - (interactive) - ;; The last line of the buffer doesn't contain a record. - (let ((start (gpg-ring-record-start))) - (if start - (gpg-ring-goto-record (previous-single-property-change - start 'gpg-record-start nil (point-min))) - (gpg-ring-goto-record - (gpg-ring-record-start (1- (point-max))))))) - -(defun gpg-ring-set-mark (&optional pos mark) - "Set MARK on record at POS, or at point if POS is omitted. -If MARK is omitted, clear it." - (save-excursion - (let* ((start (gpg-ring-record-start pos)) - (key (gpg-ring-current-key start)) - (id (gpg-key-unique-id key)) - (entry (assoc id gpg-ring-marks-alist)) - buffer-read-only) - (goto-char start) - ;; Replace the mark character. - (subst-char-in-region (point) (1+ (point)) (char-after) - (or mark ? )) - ;; Store the mark in alist. - (if entry - (setcdr entry (if mark (list mark key))) - (when mark - (push (list id mark key) gpg-ring-marks-alist)))))) - -(defun gpg-ring-marked-keys (&optional only-marked mark) - "Return list of key specs which have MARK. -If no marks are present and ONLY-MARKED is not nil, return singleton -list with key of the current record. If MARK is omitted, `?*' is -used." - (let ((the-marker (or mark ?*)) - (marks gpg-ring-marks-alist) - key-list) - (while marks - (let ((mark (pop marks))) - ;; If this entry has got the right mark ... - (when (equal (nth 1 mark) the-marker) - ;; ... rember the key spec. - (push (nth 2 mark) key-list)))) - (or key-list (if (not only-marked) (list (gpg-ring-current-key)))))) - -(defun gpg-ring-mark-process () - "Mark record at point for processing." - (interactive) - (gpg-ring-set-mark nil ?*) - (gpg-ring-next-record)) - -(defun gpg-ring-mark-delete () - "Mark record at point for processing." - (interactive) - (gpg-ring-set-mark nil ?D) - (gpg-ring-next-record)) - -(defun gpg-ring-unmark () - "Mark record at point for processing." - (interactive) - (gpg-ring-set-mark) - (gpg-ring-next-record)) - -(defun gpg-ring-mark-process-all () - "Put process mark on all records." - (interactive) - (setq gpg-ring-marks-alist - (mapcar (lambda (key) - (list (gpg-key-unique-id key) ?* key)) - gpg-ring-key-list)) - (gpg-ring-regenerate)) - -(defun gpg-ring-unmark-all () - "Remove all record marks." - (interactive) - (setq gpg-ring-marks-alist nil) - (gpg-ring-regenerate)) - -(defun gpg-ring-toggle-show-unusable () - "Toggle value if `gpg-ring-show-unusable'." - (interactive) - (setq gpg-ring-show-unusable (not gpg-ring-show-unusable)) - (gpg-ring-regenerate)) - -(defun gpg-ring-toggle-show-all-ids () - "Toggle value of `gpg-ring-show-all-ids'." - (interactive) - (setq gpg-ring-show-all-ids (not gpg-ring-show-all-ids)) - (gpg-ring-regenerate)) - -(defvar gpg-ring-output-buffer-name "*GnuPG Output*" - "Name buffer to which output from GnuPG is sent.") - -(defmacro gpg-ring-with-output-buffer (&rest body) - "Erase GnuPG output buffer, evaluate BODY in it, and display it." - `(with-current-buffer (get-buffer-create gpg-ring-output-buffer-name) - (erase-buffer) - (setq truncate-lines t) - ,@body - (goto-char (point-min)) - (display-buffer gpg-ring-output-buffer-name))) - -(defun gpg-ring-quit () - "Bury key list buffer and kill GnuPG output buffer." - (interactive) - (let ((output (get-buffer gpg-ring-output-buffer-name))) - (when output - (kill-buffer output))) - (when (eq 'gpg-ring-mode major-mode) - (bury-buffer))) - -(defun gpg-ring-show-key () - "Show information for current key." - (interactive) - (let ((keys (gpg-ring-marked-keys))) - (gpg-ring-with-output-buffer - (gpg-key-insert-information (gpg-key-unique-id-list keys))))) - -(defun gpg-ring-extract-keys () - "Export currently selected public keys in ASCII armor." - (interactive) - (let ((keys (gpg-ring-marked-keys))) - (gpg-ring-with-output-buffer - (gpg-key-insert-public-key (gpg-key-unique-id-list keys))))) - -(defun gpg-ring-extract-keys-to-kill () - "Export currently selected public keys in ASCII armor to kill ring." - (interactive) - (let ((keys (gpg-ring-marked-keys))) - (with-temp-buffer - (gpg-key-insert-public-key (gpg-key-unique-id-list keys)) - (copy-region-as-kill (point-min) (point-max))))) - -(defun gpg-ring-update-key () - "Fetch key information from key server." - (interactive) - (let ((keys (gpg-ring-marked-keys))) - (gpg-ring-with-output-buffer - (gpg-key-retrieve (gpg-key-unique-id-list keys))))) - -(defun gpg-ring-insert-key-stat (key) - (let* ((validity (gpg-key-validity key)) - (validity-entry (assq validity gpg-ring-trust-alist)) - (trust (gpg-key-trust key)) - (trust-entry (assq trust gpg-ring-trust-alist))) - ;; Insert abbrev for key status. - (let ((start (point))) - (insert (nth 1 validity-entry)) - ;; Change face if necessary. - (when (nth 2 validity-entry) - (add-text-properties start (point) - (list 'face (nth 2 validity-entry))))) - ;; Trust, key ID, length, algorithm, creation date. - (insert (format "/%s %-8s/%4d/%-5s created %s" - (nth 1 trust-entry) - (gpg-short-key-id key) - (gpg-key-length key) - (cdr (assq (gpg-key-algorithm key) gpg-ring-algo-alist)) - (gpg-key-creation-date key))) - ;; Expire date. - (when (gpg-key-expire-date key) - (insert ", ") - (let ((start (point)) - (expired (eq 'expired validity)) - (notice (concat ))) - (insert (if expired "EXPIRED" "expires") - " " (gpg-key-expire-date key)) - (when expired - (add-text-properties start (point) - '(face gpg-ring-key-invalid-face))))))) - -(defun gpg-ring-insert-key (key &optional mark) - "Inserts description for KEY into current buffer before point." - (let ((start (point))) - (insert (if mark mark " ") - " " (gpg-key-primary-user-id key) "\n" - " ") - (gpg-ring-insert-key-stat key) - (insert "\n") - (when gpg-ring-show-all-ids - (let ((uids (gpg-key-user-ids key))) - (while uids - (insert " ID " (pop uids) "\n")))) - (add-text-properties start (point) - (list 'gpg-record-start start - 'gpg-key key)))) - -(defun gpg-ring-regenerate () - "Regenerate the key list buffer from stored data." - (interactive) - (let* ((key-list gpg-ring-key-list) - ;; Record position of point. - (old-record (if (eobp) ; No record on last line. - nil - (gpg-key-unique-id (gpg-ring-current-key)))) - (old-pos (if old-record (- (point) (gpg-ring-record-start)))) - found new-pos new-pos-offset buffer-read-only new-marks) - ;; Replace buffer contents with new data. - (erase-buffer) - (while key-list - (let* ((key (pop key-list)) - (id (gpg-key-unique-id key)) - (mark (assoc id gpg-ring-marks-alist))) - (when (or gpg-ring-show-unusable - (not (memq (gpg-key-validity key) - '(disabled revoked expired)))) - ;; Check if point was in this record. - (when (and old-record - (string-equal old-record id)) - (setq new-pos (point)) - (setq new-pos-offset (+ new-pos old-pos))) - ;; Check if this record was marked. - (if (nth 1 mark) - (progn - (push mark new-marks) - (gpg-ring-insert-key key (nth 1 mark))) - (gpg-ring-insert-key key))))) - ;; Replace mark alist with the new one (which does not contain - ;; marks for records which vanished during this update). - (setq gpg-ring-marks-alist new-marks) - ;; Restore point. - (if (not old-record) - ;; We were at the end of the buffer before. - (goto-char (point-max)) - (if new-pos - (if (and (< new-pos-offset (point-max)) - (equal old-record (gpg-key-unique-id - (gpg-ring-current-key new-pos-offset)))) - ;; Record is there, with offset. - (goto-char new-pos-offset) - ;; Record is there, but not offset. - (goto-char new-pos)) - ;; Record is not there. - (goto-char (point-min)))))) - -(defun gpg-ring-update () - "Update the key list buffer with new data." - (interactive) - (let ((funcs gpg-ring-update-funcs) - old) - ;; Merge the sorted lists obtained by calling elements of - ;; `gpg-ring-update-funcs'. - (while funcs - (let ((additional (funcall (pop funcs))) - new) - (while (and additional old) - (if (gpg-key-lessp (car additional) (car old)) - (push (pop additional) new) - (if (gpg-key-lessp (car old) (car additional)) - (push (pop old) new) - ;; Keys are perhaps equal. Always Add old key. - (push (pop old) new) - ;; If new key is equal, drop it, otherwise add it as well. - (if (string-equal (gpg-key-unique-id (car old)) - (gpg-key-unique-id (car additional))) - (pop additional) - (push (pop additional) new))))) - ;; Store new list as old one for next round. - (setq old (nconc (nreverse new) old additional)))) - ;; Store the list in the buffer. - (setq gpg-ring-key-list old)) - (gpg-ring-regenerate)) - -(defun gpg-ring-action () - "Perform the action associated with this buffer." - (interactive) - (if gpg-ring-action - (funcall gpg-ring-action (gpg-ring-marked-keys)) - (error "No action for this buffer specified"))) - -;;;###autoload -(defun gpg-ring-keys (&optional key-list-funcs action) - (interactive) - (let ((buffer (get-buffer-create "*GnuPG Key List*"))) - (with-current-buffer buffer - (gpg-ring-mode) - (setq gpg-ring-action action) - (setq gpg-ring-update-funcs key-list-funcs key-list-funcs) - (gpg-ring-update) - (goto-char (point-min))) - (switch-to-buffer buffer))) - -;;;###autoload -(defun gpg-ring-public (key-spec) - "List public keys matching keys KEY-SPEC." - (interactive "sList public keys containing: ") - (gpg-ring-keys `((lambda () (gpg-key-list-keys ,key-spec))))) - -(provide 'gpg-ring) - -;;; gpg-ring.el ends here diff --git a/contrib/gpg.el b/contrib/gpg.el deleted file mode 100644 index fa1c5f3..0000000 --- a/contrib/gpg.el +++ /dev/null @@ -1,1321 +0,0 @@ -;;; gpg.el --- Interface to GNU Privacy Guard - -;; Copyright (C) 2000 RUS-CERT, University Of Stuttgart - -;; Author: Florian Weimer -;; Maintainer: Florian Weimer -;; Keywords: crypto -;; Created: 2000-04-15 - -;; This file is NOT (yet?) part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;; ALPHA ALPHA ALPHA ALPHA ALPHA ALPHA ALPHA ALPHA ALPHA ALPHA ALPHA -;; ALPHA ALPHA ALPHA ALPHA ALPHA ALPHA ALPHA ALPHA ALPHA ALPHA ALPHA -;; -;; This code is not well-tested. BE CAREFUL! -;; -;; ALPHA ALPHA ALPHA ALPHA ALPHA ALPHA ALPHA ALPHA ALPHA ALPHA ALPHA -;; ALPHA ALPHA ALPHA ALPHA ALPHA ALPHA ALPHA ALPHA ALPHA ALPHA ALPHA - -;; Implemented features which can be tested: -;; -;; * Customization for all flavors of PGP is possible. -;; * The main operations (verify, decrypt, sign, encrypt, sign & -;; encrypt) are implemented. -;; * Gero Treuner's gpg-2comp script is supported, and data which is is -;; compatible with PGP 2.6.3 is generated. - -;; Customizing external programs -;; ============================= - -;; The customization are very similar to those of others programs, -;; only the C-ish "%" constructs have been replaced by more Lisp-like -;; syntax. -;; -;; First, you have to adjust the default executable paths -;; (`gpg-command-default-alist', customization group `gpg-options', -;; "Controlling GnuPG invocation."). After that, you should -;; change the configuration options which control how specific -;; command line flags are built (`gpg-command-flag-sign-with-key', -;; (`gpg-command-flag-recipient'). The elements of these lists are -;; concatenated without spaces, and a new argument is only started -;; where indicated. The `gpg-command-flag-recipient' list is special: -;; it consists of two parts, the first one remains at the beginning -;; of the argument, the second one is repeated for each recipient. -;; Finally, `gpg-command-passphrase-env' has to be changed if there's -;; no command line flag to force the external program to read the data -;; from standard input before the message. -;; -;; In customization group `gpg-commands', "Controlling GnuPG -;; invocation.", you have to supply the actual syntax for external -;; program calls. Each variable consists of a pair of a program -;; specification (if a Lisp symbol is given here, it is translated -;; via `gpg-command-default-alist') and a list of program arguments -;; with placeholders. Please read the documentation of each variable -;; before making your adjustments and try to match the given -;; requirements as closely as possible! -;; -;; The `gpg-commands-key' group, "GnuPG Key Management Commands.", -;; specifies key management commands. The syntax of these variables -;; is like those in the `gpg-commands' group. Note that the output -;; format of some of these external programs has to match very close -;; that of GnuPG. Additional tools (Thomas Roessler's "pgpring.c") -;; are available if your favorite implementation of OpenPGP cannot -;; output the this format. - -;; Security considerations -;; ======================= - -;; On a typical multiuser UNIX system, the memory image of the -;; Emacs process is not locked, therefore it can be swapped to disk -;; at any time. As a result, the passphrase might show up in the -;; swap space (even if you don't use the passphrase cache, i.e. if -;; `gpg-passphrase-timeout' is 0). If someone is able to run `gdb' or -;; another debugger on your Emacs process, he might be able to recover -;; the passphrase as well. Unfortunately, nothing can be done in -;; order to prevent this at the moment. -;; -;; BE CAREFUL: If you use the passphrase cache feature, the passphrase -;; is stored in the variable `gpg-passphrase' -- and it is NOT -;; encrypted in any way. (This is a conceptual problem because the -;; nature of the passphrase cache requires that Emacs is able to -;; decrypt automatically, so only a very weak protection could be -;; applied anyway.) -;; -;; In addition, if you use an unpatched Emacs 20 (and earlier -;; versions), passwords show up in the output of the `view-lossage' -;; function (bound to `C-h l' by default). - - -;;; Code: - -(require 'timer) -(eval-when-compile (require 'cl)) - -(eval-and-compile - (defalias 'gpg-point-at-eol - (if (fboundp 'point-at-eol) - 'point-at-eol - 'line-end-position))) - -;;;; Customization: - -;;; Customization: Groups: - -(defgroup gpg nil - "GNU Privacy Guard interface." - :tag "GnuPG" - :group 'processes) - -(defgroup gpg-options nil - "Controlling GnuPG invocation." - :tag "GnuPG Options" - :group 'gpg) - -(defgroup gpg-commands nil - "Primary GnuPG Operations." - :tag "GnuPG Commands" - :group 'gpg) - -(defgroup gpg-commands-key nil - "Commands for GnuPG key management." - :tag "GnuPG Key Commands" - :group 'gpg-commands) - -;;; Customization: Widgets: - -(if (get 'alist 'widget-type) - (define-widget 'gpg-command-alist 'alist - "An association list for GnuPG command names." - :key-type '(symbol :tag "Abbreviation") - :value-type '(string :tag "Program name") - :convert-widget 'widget-alist-convert-widget - :tag "Alist") - (define-widget 'gpg-command-alist 'repeat - "An association list for GnuPG command names." - :args '((cons :format "%v" - (symbol :tag "Abbreviation") - (string :tag "Program name"))) - :tag "Alist")) - -(define-widget 'gpg-command-program 'choice - "Widget for entering the name of a program (mostly the GnuPG binary)." - :tag "Program" - :args '((const :tag "Default GnuPG program." - :value gpg) - (const :tag "GnuPG compatibility wrapper." - :value gpg-2comp) - (const :tag "Disabled" - :value nil) - (string :tag "Custom program" :format "%v"))) - -(define-widget 'gpg-command-sign-options 'cons - "Widget for entering signing options." - :args '(gpg-command-program - (repeat - :tag "Arguments" - (choice - :format "%[Type%] %v" - (const :tag "Insert armor option here if necessary." - :value armor) - (const :tag "Insert text mode option here if necessary." - :value textmode) - (const :tag "Insert the sign with key option here if necessary." - :value sign-with-key) - (string :format "%v"))))) - -(define-widget 'gpg-command-key-options 'cons - "Widget for entering key command options." - :args '(gpg-command-program - (repeat - :tag "Arguments" - (choice - :format "%[Type%] %v" - (const :tag "Insert key ID here." - :value key-id) - (string :format "%v"))))) - -;;; Customization: Variables: - -;;; Customization: Variables: Paths and Flags: - -(defcustom gpg-passphrase-timeout - 0 - "Timeout (in seconds) for the passphrase cache. -The passphrase cache is cleared after is hasn't been used for this -many seconds. The values 0 means that the passphrase is not cached at -all." - :tag "Passphrase Timeout" - :type 'number - :group 'gpg-options) - -(defcustom gpg-default-key-id - nil - "Default key/user ID used for signatures." - :tag "Default Key ID" - :type '(choice - (const :tag "Use GnuPG default." :value nil) - (string)) - :group 'gpg-options) - -(defcustom gpg-temp-directory - (expand-file-name "~/tmp") - "Directory for temporary files. -If you are running Emacs 20, this directory must have mode 0700." - :tag "Temp directory" - :type 'string - :group 'gpg-options) - -(defcustom gpg-command-default-alist - '((gpg . "gpg") - (gpg-2comp . "gpg-2comp")) - "Default paths for some GnuPG-related programs. -Modify this variable if you have to change the paths to the -executables required by the GnuPG interface. You can enter \"gpg\" -for `gpg-2comp' if you don't have this script, but you'll lose PGP -2.6.x compatibility." - :tag "GnuPG programs" - :type 'gpg-command-alist - :group 'gpg-options) - -(defcustom gpg-command-all-arglist - nil - "List of arguments to add to all GPG commands." - :tag "All command args" - :group 'gpg-options) - -(defcustom gpg-command-flag-textmode "--textmode" - "The flag to indicate canonical text mode to GnuPG." - :tag "Text mode flag" - :type 'string - :group 'gpg-options) - -(defcustom gpg-command-flag-armor "--armor" - "The flag to request ASCII-armoring output from GnuPG." - :tag "Armor flag" - :type 'string - :group 'gpg-options) - -(defcustom gpg-command-flag-sign-with-key '("--local-user=" sign-with-key) - "String to include to specify the signing key ID. -The elements are concatenated (without spaces) to form a command line -option." - :tag "Sign with key flag" - :type '(repeat :tag "Argument parts" - (choice :format "%[Type%] %v" - (const :tag "Start next argument." :value next-argument) - (const :tag "Insert signing key ID here." :value sign-with-key) - (string))) - :group 'gpg-options) - -(defcustom gpg-command-flag-recipient - '(nil . ("-r" next-argument recipient next-argument)) - "Format of a recipient specification. -The elements are concatenated (without spaces) to form a command line -option. The second part is repeated for each recipient." - :tag "Recipients Flag" - :type '(cons - (repeat :tag "Common prefix" - (choice :format "%[Type%] %v" - (const :tag "Start next argument." :value next-argument) - (string))) - (repeat :tag "For each recipient" - (choice :format "%[Type%] %v" - (const :tag "Start next argument." :value next-argument) - (const :tag "Insert recipient key ID here." :value recipient) - (string)))) - :group 'gpg-options) - -(defcustom gpg-command-passphrase-env - nil - "Environment variable to set when a passphrase is required, or nil. -If an operation is invoked which requires a passphrase, this -environment variable is set before calling the external program to -indicate that it should read the passphrase from standard input." - :tag "Passphrase environment" - :type '(choice - (const :tag "Disabled" :value nil) - (cons - (string :tag "Variable") - (string :tag "Value"))) - :group 'gpg-options) - -;;; Customization: Variables: GnuPG Commands: - -(defcustom gpg-command-verify - '(gpg . ("--status-fd" "1" "--batch" "--verbose" "--verify" signature-file message-file)) - "Command to verify a detached signature. -The invoked program has to read the signed message and the signature -from the given files. It should write human-readable information to -standard output and/or standard error. The program shall not convert -charsets or line endings; the input data shall be treated as binary." - :tag "Verify Command" - :type '(cons - gpg-command-program - (repeat - :tag "Arguments" - (choice - :format "%[Type%] %v" - (const :tag "Insert name of file containing the message here." - :value message-file) - (const :tag "Insert name of file containing the signature here." - :value signature-file) - (string :format "%v")))) - :group 'gpg-commands) - -(defcustom gpg-command-verify-cleartext - '(gpg . ("--status-fd" "1" "--batch" "--verbose" "--verify" message-file)) - "Command to verify a message. -The invoked program has to read the signed message from the given -file. It should write human-readable information to standard output -and/or standard error. The program shall not convert charsets or line -endings; the input data shall be treated as binary." - :tag "Cleartext Verify Command" - :type '(cons - gpg-command-program - (repeat - :tag "Arguments" - (choice - :format "%[Type%] %v" - (const :tag "Insert name of file containing the message here." - :value message-file) - (string :format "%v")))) - :group 'gpg-commands) - -(defcustom gpg-command-decrypt - '(gpg . ("--decrypt" "--batch" "--passphrase-fd=0")) - "Command to decrypt a message. -The invoked program has to read the passphrase from standard -input, followed by the encrypted message. It writes the decrypted -message to standard output, and human-readable diagnostic messages to -standard error." - :tag "Decrypt Command" - :type '(cons - gpg-command-program - (repeat - :tag "Arguments" - (choice - :format "%[Type%] %v" - (const :tag "Insert name of file containing the message here." - :value message-file) - (string :format "%v")))) - :group 'gpg-commands) - -(defcustom gpg-command-sign-cleartext - '(gpg-2comp . ("--batch" "--passphrase-fd=0" "--output=-" - armor textmode "--clearsign" - sign-with-key)) - "Command to create a \"clearsign\" text file. -The invoked program has to read the passphrase from standard input, -followed by the message to sign. It should write the ASCII-amored -signed text message to standard output, and diagnostic messages to -standard error." - :tag "Clearsign Command" - :type 'gpg-command-sign-options - :group 'gpg-commands) - -(defcustom gpg-command-sign-detached - '(gpg-2comp . ("--batch" "--passphrase-fd=0" "--output=-" - armor textmode "--detach-sign" - sign-with-key)) - "Command to create a detached signature. -The invoked program has to read the passphrase from standard input, -followed by the message to sign. It should write the ASCII-amored -detached signature to standard output, and diagnostic messages to -standard error. The program shall not convert charsets or line -endings; the input data shall be treated as binary." - :tag "Sign Detached Command" - :type 'gpg-command-sign-options - :group 'gpg-commands) - -(defcustom gpg-command-sign-encrypt - '(gpg-2comp . ("--batch" "--passphrase-fd=0" "--output=-" - armor textmode "--always-trust" sign-with-key recipients - "--sign" "--encrypt" plaintext-file)) - "Command to sign and encrypt a file. -The invoked program has to read the passphrase from standard input, -followed by the message to sign and encrypt if there is no -`plaintext-file' placeholder. It should write the ASCII-amored -encrypted message to standard output, and diagnostic messages to -standard error." - :tag "Sign And Encrypt Command" - :type '(cons - gpg-command-program - (repeat - :tag "Arguments" - (choice - :format "%[Type%] %v" - (const :tag "Insert the `sign with key' option here if necessary." - :value sign-with-key) - (const :tag "Insert list of recipients here." - :value recipients) - (const :tag "Insert here name of file with plaintext." - :value plaintext-file) - (string :format "%v")))) - :group 'gpg-commands) - -(defcustom gpg-command-encrypt - '(gpg-2comp . ("--batch" "--output=-" armor textmode "--always-trust" - "--encrypt" recipients plaintext-file)) - "Command to encrypt a file. -The invoked program has to read the message to encrypt from standard -input or from the plaintext file (if the `plaintext-file' placeholder -is present). It should write the ASCII-amored encrypted message to -standard output, and diagnostic messages to standard error." - :type '(cons - gpg-command-program - (repeat - :tag "Arguments" - (choice - :format "%[Type%] %v" - (const :tag "Insert list of recipients here." - :value recipients) - (const :tag "Insert here name of file with plaintext." - :value plaintext-file) - (string :format "%v")))) - :group 'gpg-commands) - -;;; Customization: Variables: Key Management Commands: - -(defcustom gpg-command-key-import - '(gpg . ("--import" "--verbose" message-file)) - "Command to import a public key from a file." - :tag "Import Command" - :type '(cons - gpg-command-program - (repeat - :tag "Arguments" - (choice - :format "%[Type%] %v" - (const :tag "Insert name of file containing the key here." - :value message-file) - (string :format "%v")))) - :group 'gpg-commands-key) - -(defcustom gpg-command-key-export - '(gpg . ("--no-verbose" "--armor" "--export" key-id)) - "Command to export a public key from the key ring. -The key should be written to standard output using ASCII armor." - :tag "Export Command" - :type 'gpg-command-key-options - :group 'gpg-commands-key) - -(defcustom gpg-command-key-verify - '(gpg . ("--no-verbose" "--batch" "--fingerprint" "--check-sigs" key-id)) - "Command to verify a public key." - :tag "Verification Command" - :type 'gpg-command-key-options - :group 'gpg-commands-key) - -(defcustom gpg-command-key-public-ring - '(gpg . ("--no-verbose" "--batch" "--with-colons" "--list-keys" key-id)) - "Command to list the contents of the public key ring." - :tag "List Public Key Ring Command" - :type 'gpg-command-key-options - :group 'gpg-commands-key) - -(defcustom gpg-command-key-secret-ring - '(gpg . ("--no-verbose" "--batch" "--with-colons" - "--list-secret-keys" key-id)) - "Command to list the contents of the secret key ring." - :tag "List Secret Key Ring Command" - :type 'gpg-command-key-options - :group 'gpg-commands-key) - -(defcustom gpg-command-key-retrieve - '(gpg . ("--batch" "--recv-keys" key-id)) - "Command to retrieve public keys." - :tag "Retrieve Keys Command" - :type 'gpg-command-key-options - :group 'gpg-commands-key) - - -;;;; Helper functions for GnuPG invocation: - -;;; Build the GnuPG command line: - -(defun gpg-build-argument (template substitutions &optional pass-start) - "Build command line argument(s) by substituting placeholders. -TEMPLATE is a list of strings and symbols. The placeholder symbols in -it are replaced by SUBSTITUTIONS, the elements between -`next-argument' symbols are concatenated without spaces and are -returned in a list. - -SUBSTITIONS is a list of (SYMBOL . SEXP) pairs, where SEXP is either -a string (which is inserted literally), a list of strings (which are -inserted as well), or nil, which means to insert nothing. - -If PASS-START is t, `next-argument' is also inserted into the result, -and symbols without a proper substitution are retained in the output, -otherwise, an untranslated symbol results in an error. - -This function does not handle empty arguments reliably." - (let ((current-arg "") - (arglist nil)) - (while template - (let* ((templ (pop template)) - (repl (assoc templ substitutions)) - (new (if repl (cdr repl) templ))) - (cond - ((eq templ 'next-argument) - ;; If the current argument is not empty, start a new one. - (unless (equal current-arg "") - (setq arglist (nconc arglist - (if pass-start - (list current-arg 'next-argument) - (list current-arg)))) - (setq current-arg ""))) - ((null new) nil) ; Drop it. - ((and (not (stringp templ)) (null repl)) - ;; Retain an untranslated symbol in the output if - ;; `pass-start' is true. - (unless pass-start - (error "No replacement for `%s'" templ)) - (setq arglist (nconc arglist (list current-arg templ))) - (setq current-arg "")) - (t - (unless (listp new) - (setq new (list new))) - (setq current-arg (concat current-arg - (apply 'concat new))))))) - (unless (equal current-arg "") - (setq arglist (nconc arglist (list current-arg)))) - arglist)) - -(defun gpg-build-arg-list (template substitutions) - "Build command line by substituting placeholders. -TEMPLATE is a list of strings and symbols. The placeholder symbols in -it are replaced by SUBSTITUTIONS. - -SUBSTITIONS is a list of (SYMBOL . SEXP) pairs, where SEXP is either a -string (which is inserted literally), a list of strings (which are -inserted as well), or nil, which means to insert nothing." - (let ((arglist (copy-sequence gpg-command-all-arglist))) - (while template - (let* ((templ (pop template)) - (repl (assoc templ substitutions)) - (new (if repl (cdr repl) templ))) - (cond - ((and (symbolp templ) (null repl)) - (error "No replacement for `%s'" templ)) - ((null new) nil) ; Drop it. - (t - (unless (listp new) - (setq new (list new))) - (setq arglist (nconc arglist new)))))) - arglist)) - -(defun gpg-build-flag-recipients-one (recipient) - "Build argument for one RECIPIENT." - (gpg-build-argument (cdr gpg-command-flag-recipient) - `((recipient . ,recipient)) t)) - -(defun gpg-build-flag-recipients (recipients) - "Build list of RECIPIENTS using `gpg-command-flag-recipient'." - (gpg-build-argument - (apply 'append (car gpg-command-flag-recipient) - (mapcar 'gpg-build-flag-recipients-one - recipients)) - nil)) - -(defun gpg-read-recipients () - "Query the user for several recipients." - (let ((go t) - recipients r) - (while go - (setq r (read-string "Enter recipient ID [RET when no more]: ")) - (if (equal r "") - (setq go nil) - (setq recipients (nconc recipients (list r))))) - recipients)) - -(defun gpg-build-flag-sign-with-key (key) - "Build sign with key flag using `gpg-command-flag-sign-with-key'." - (let ((k (if key key - (if gpg-default-key-id gpg-default-key-id - nil)))) - (if k - (gpg-build-argument gpg-command-flag-sign-with-key - (list (cons 'sign-with-key k))) - nil))) - -(defmacro gpg-with-passphrase-env (&rest body) - "Adjust the process environment and evaluate BODY. -During the evaluation of the body forms, the process environment is -adjust according to `gpg-command-passphrase-env'." - (let ((env-value (make-symbol "env-value"))) - `(let ((,env-value)) - (unwind-protect - (progn - (when gpg-command-passphrase-env - (setq ,env-value (getenv (car gpg-command-passphrase-env))) - (setenv (car gpg-command-passphrase-env) - (cdr gpg-command-passphrase-env))) - ,@body) - (when gpg-command-passphrase-env - ;; This will clear the variable if it wasn't set before. - (setenv (car gpg-command-passphrase-env) ,env-value)))))) -(put 'gpg-with-passphrase-env 'lisp-indent-function 0) -(put 'gpg-with-passphrase-env 'edebug-form-spec '(body)) - -;;; Temporary files: - -(defun gpg-make-temp-file () - "Create a temporary file in a safe way" - (let ((name ;; User may use "~/" - (expand-file-name "gnupg" gpg-temp-directory))) - (if (fboundp 'make-temp-file) - ;; If we've got make-temp-file, we are on the save side. - (make-temp-file name) - ;; make-temp-name doesn't create the file, and an ordinary - ;; write-file operation is prone to nasty symlink attacks if the - ;; temporary file resides in a world-writable directory. - (unless (or (memq system-type '(windows-nt cygwin32 win32 w32 mswindows)) - (eq (file-modes gpg-temp-directory) 448)) ; mode 0700 - (error "Directory for temporary files (%s) must have mode 0700" gpg-temp-directory)) - (setq name (make-temp-name name)) - (let ((mode (default-file-modes))) - (unwind-protect - (progn - (set-default-file-modes 384) ; mode 0600 - (with-temp-file name)) - (set-default-file-modes mode))) - name))) - -(defvar gpg-temp-files nil - "List of temporary files used by the GnuPG interface. -Do not set this variable. Call `gpg-with-temp-files' if you need -temporary files.") - -(defun gpg-with-temp-files-create (count) - "Do not call this function. Used internally by `gpg-with-temp-files'." - (while (> count 0) - (setq gpg-temp-files (cons (gpg-make-temp-file) gpg-temp-files)) - (setq count (1- count)))) - -(defun gpg-with-temp-files-delete () - "Do not call this function. Used internally by `gpg-with-temp-files'." - (while gpg-temp-files - (let ((file (pop gpg-temp-files))) - (condition-case nil - (delete-file file) - (error nil))))) - -(defmacro gpg-with-temp-files (count &rest body) - "Create COUNT temporary files, USE them, and delete them. -The function USE is called with the names of all temporary files as -arguments." - `(let ((gpg-temp-files)) - (unwind-protect - (progn - ;; Create the temporary files. - (gpg-with-temp-files-create ,count) - ,@body) - (gpg-with-temp-files-delete)))) -(put 'gpg-with-temp-files 'lisp-indent-function 1) -(put 'gpg-with-temp-files 'edebug-form-spec '(body)) - -;;; Making subprocesses: - -(defun gpg-exec-path (option) - "Return the program name for OPTION. -OPTION is of the form (PROGRAM . ARGLIST). This functions returns -PROGRAM, but takes default values into account." - (let* ((prg (car option)) - (path (assq prg gpg-command-default-alist))) - (cond - (path (if (null (cdr path)) - (error "Command `%s' is not available" prg) - (cdr path))) - ((null prg) (error "Command is disabled")) - (t prg)))) - -(defun gpg-call-process (cmd args stdin stdout stderr &optional passphrase) - "Invoke external program CMD with ARGS on buffer STDIN. -Standard output is insert before point in STDOUT, standard error in -STDERR. If PASSPHRASE is given, send it before STDIN. PASSPHRASE -should not end with a line feed (\"\\n\"). - -If `stdin-file' is present in ARGS, it is replaced by the name of a -temporary file. Before invoking CMD, the contents of STDIN is written -to this file." - (gpg-with-temp-files 2 - (let* ((coding-system-for-read 'no-conversion) - (coding-system-for-write 'no-conversion) - (have-stdin-file (memq 'stdin-file args)) - (stdin-file (nth 0 gpg-temp-files)) - (stderr-file (nth 1 gpg-temp-files)) - (cpr-args `(,cmd - nil ; don't delete - (,stdout ,stderr-file) - nil ; don't display - ;; Replace `stdin-file'. - ,@(gpg-build-arg-list - args (list (cons 'stdin-file stdin-file))))) - res) - (when have-stdin-file - (with-temp-file stdin-file - (buffer-disable-undo) - (insert-buffer-substring stdin))) - (setq res - (if passphrase - (with-temp-buffer - (buffer-disable-undo) - (insert passphrase "\n") - (unless have-stdin-file - (apply 'insert-buffer-substring - (if (listp stdin) stdin (list stdin)))) - (apply 'call-process-region (point-min) (point-max) cpr-args) - ;; Wipe out passphrase. - (goto-char (point-min)) - (translate-region (point) (gpg-point-at-eol) - (make-string 256 ? ))) - (if (listp stdin) - (with-current-buffer (car stdin) - (apply 'call-process-region - (cadr stdin) - (if have-stdin-file (cadr stdin) (caddr stdin)) - cpr-args)) - (with-current-buffer stdin - (apply 'call-process-region - (point-min) - (if have-stdin-file (point-min) (point-max)) - cpr-args))))) - (with-current-buffer stderr - (insert-file-contents-literally stderr-file)) - (if (or (stringp res) (> res 0)) - ;; Signal or abnormal exit. - (with-current-buffer stderr - (goto-char (point-max)) - (insert (format "\nCommand exit status: %s\n" res)) - nil) - t)))) - -(defvar gpg-result-buffer nil - "The result of a GnuPG operation is stored in this buffer. -Never set this variable directly, use `gpg-show-result' instead.") - -(defun gpg-show-result-buffer (always-show result) - "Called by `gpg-show-results' to actually show the buffer." - (with-current-buffer gpg-result-buffer - ;; Only proceed if the buffer is non-empty. - (when (and (/= (point-min) (point-max)) - (or always-show (not result))) - (save-window-excursion - (display-buffer (current-buffer)) - (unless (y-or-n-p "Continue? ") - (error "GnuPG operation aborted")))))) - -(defmacro gpg-show-result (always-show &rest body) - "Show GnuPG result to user for confirmation. -This macro binds `gpg-result-buffer' to a temporary buffer and -evaluates BODY, like `progn'. If BODY evaluates to `nil' (or -`always-show' is not nil), the user is asked for confirmation." - `(let ((gpg-result-buffer (get-buffer-create - (generate-new-buffer-name "*GnuPG Output*")))) - (unwind-protect - (gpg-show-result-buffer ,always-show (progn ,@body)) - (kill-buffer gpg-result-buffer)))) -(put 'gpg-show-result 'lisp-indent-function 1) -(put 'gpg-show-result 'edebug-form-spec '(body)) - -;;; Passphrase handling: - -(defvar gpg-passphrase-timer - (timer-create) - "This timer will clear the passphrase cache periodically.") - -(defvar gpg-passphrase - nil - "The (unencrypted) passphrase cache.") - -(defun gpg-passphrase-clear-string (str) - "Erases STR by overwriting all characters." - (let ((pos 0) - (len (length str))) - (while (< pos len) - (aset str pos ? ) - (incf pos)))) - -;;;###autoload -(defun gpg-passphrase-forget () - "Forget stored passphrase." - (interactive) - (cancel-timer gpg-passphrase-timer) - (setq gpg-passphrase-timer nil) - (gpg-passphrase-clear-string gpg-passphrase) - (setq gpg-passphrase nil)) - -(defun gpg-passphrase-store (passphrase) - "Store PASSPHRASE in cache. -Updates the timeout for clearing the cache to `gpg-passphrase-timeout'." - (unless (equal gpg-passphrase-timeout 0) - (if (null gpg-passphrase-timer) - (setq gpg-passphrase-timer (timer-create))) - (timer-set-time gpg-passphrase-timer - (timer-relative-time (current-time) - gpg-passphrase-timeout)) - (timer-set-function gpg-passphrase-timer 'gpg-passphrase-forget) - (unless (and (fboundp 'itimer-live-p) - (itimer-live-p gpg-passphrase-timer)) - (timer-activate gpg-passphrase-timer)) - (setq gpg-passphrase passphrase)) - passphrase) - -(defun gpg-passphrase-read () - "Read a passphrase and remember it for some time." - (interactive) - (if gpg-passphrase - ;; This reinitializes the timer. - (gpg-passphrase-store gpg-passphrase) - (let ((pp (read-passwd "Enter passphrase: "))) - (gpg-passphrase-store pp)))) - - -;;;; Main operations: - -;;;###autoload -(defun gpg-verify (message signature result) - "Verify buffer MESSAGE against detached SIGNATURE buffer. -Returns t if everything worked out well, nil otherwise. Consult -buffer RESULT for details." - (interactive "bBuffer containing message: \nbBuffer containing signature: \nbBuffor for result: ") - (gpg-with-temp-files 2 - (let* ((sig-file (nth 0 gpg-temp-files)) - (msg-file (nth 1 gpg-temp-files)) - (cmd (gpg-exec-path gpg-command-verify)) - (args (gpg-build-arg-list (cdr gpg-command-verify) - `((signature-file . ,sig-file) - (message-file . ,msg-file)))) - res) - (with-temp-file sig-file - (buffer-disable-undo) - (apply 'insert-buffer-substring (if (listp signature) - signature - (list signature)))) - (with-temp-file msg-file - (buffer-disable-undo) - (apply 'insert-buffer-substring (if (listp message) - message - (list message)))) - (setq res (apply 'call-process-region - (point-min) (point-min) ; no data - cmd - nil ; don't delete - result - nil ; don't display - args)) - (if (or (stringp res) (> res 0)) - ;; Signal or abnormal exit. - (with-current-buffer result - (insert (format "\nCommand exit status: %s\n" res)) - nil) - t)))) - -;;;###autoload -(defun gpg-verify-cleartext (message result) - "Verify message in buffer MESSAGE. -Returns t if everything worked out well, nil otherwise. Consult -buffer RESULT for details. - -NOTE: Use of this function is deprecated." - (interactive "bBuffer containing message: \nbBuffor for result: ") - (gpg-with-temp-files 1 - (let* ((msg-file (nth 0 gpg-temp-files)) - (cmd (gpg-exec-path gpg-command-verify-cleartext)) - (args (gpg-build-arg-list (cdr gpg-command-verify-cleartext) - `((message-file . ,msg-file)))) - res) - (with-temp-file msg-file - (buffer-disable-undo) - (apply 'insert-buffer-substring (if (listp message) - message - (list message)))) - (setq res (apply 'call-process-region - (point-min) (point-min) ; no data - cmd - nil ; don't delete - result - nil ; don't display - args)) - (if (or (stringp res) (> res 0)) - ;; Signal or abnormal exit. - (with-current-buffer result - (insert (format "\nCommand exit status: %s\n" res)) - nil) - t)))) - -;;;###autoload -(defun gpg-decrypt (ciphertext plaintext result &optional passphrase) - "Decrypt buffer CIPHERTEXT to buffer PLAINTEXT. -Returns t if everything worked out well, nil otherwise. Consult -buffer RESULT for details. Reads a missing PASSPHRASE using -`gpg-passphrase-read'." - (interactive "bBuffer containing ciphertext: \nbBuffer for plaintext: \nbBuffor for decryption status: ") - (gpg-call-process (gpg-exec-path gpg-command-decrypt) - (gpg-build-arg-list (cdr gpg-command-decrypt) nil) - ciphertext plaintext result - (if passphrase passphrase (gpg-passphrase-read))) - (when passphrase - (gpg-passphrase-clear-string passphrase))) - -;;;###autoload -(defun gpg-sign-cleartext - (plaintext signed-text result &optional passphrase sign-with-key) - "Sign buffer PLAINTEXT, and store PLAINTEXT with signature in -SIGNED-TEXT. -Reads a missing PASSPHRASE using `gpg-passphrase-read'. Uses key ID -SIGN-WITH-KEY if given, otherwise the default key ID. Returns t if -everything worked out well, nil otherwise. Consult buffer RESULT for -details. - -NOTE: Use of this function is deprecated." - (interactive "bBuffer containing plaintext: \nbBuffer for text with signature: \nbBuffer for status information: ") - (let ((subst (list (cons 'sign-with-key - (gpg-build-flag-sign-with-key sign-with-key)) - (cons 'armor gpg-command-flag-armor) - (cons 'textmode gpg-command-flag-textmode)))) - (gpg-call-process (gpg-exec-path gpg-command-sign-cleartext) - (gpg-build-arg-list (cdr gpg-command-sign-cleartext) - subst) - plaintext signed-text result - (if passphrase passphrase (gpg-passphrase-read)))) - (when passphrase - (gpg-passphrase-clear-string passphrase))) - -;;;###autoload -(defun gpg-sign-detached - (plaintext signature result &optional passphrase sign-with-key - armor textmode) - "Sign buffer PLAINTEXT, and store SIGNATURE in that buffer. -Reads a missing PASSPHRASE using `gpg-passphrase-read'. Uses key ID -SIGN-WITH-KEY if given, otherwise the default key ID. Returns t if -everything worked out well, nil otherwise. Consult buffer RESULT for -details. ARMOR the result and activate canonical TEXTMODE if -requested." - (interactive "bBuffer containing plaintext: \nbBuffer for text with signature: \nbBuffer for status information: ") - (let ((subst (list (cons 'sign-with-key - (gpg-build-flag-sign-with-key sign-with-key)) - (cons 'armor (if armor gpg-command-flag-armor)) - (cons 'textmode (if armor gpg-command-flag-textmode))))) - (gpg-call-process (gpg-exec-path gpg-command-sign-detached) - (gpg-build-arg-list (cdr gpg-command-sign-detached) - subst) - plaintext signature result - (if passphrase passphrase (gpg-passphrase-read)))) - (when passphrase - (gpg-passphrase-clear-string passphrase))) - - -;;;###autoload -(defun gpg-sign-encrypt - (plaintext ciphertext result recipients &optional passphrase sign-with-key - armor textmode) - "Sign buffer PLAINTEXT, and store SIGNATURE in that buffer. -RECIPIENTS is a list of key IDs used for encryption. This function -reads a missing PASSPHRASE using `gpg-passphrase-read', and uses key -ID SIGN-WITH-KEY for the signature if given, otherwise the default key -ID. Returns t if everything worked out well, nil otherwise. Consult -buffer RESULT for details. ARMOR the result and activate canonical -TEXTMODE if requested." - (interactive (list - (read-buffer "Buffer containing plaintext: " nil t) - (read-buffer "Buffer for ciphertext: " nil t) - (read-buffer "Buffer for status informationt: " nil t) - (gpg-read-recipients))) - (let ((subst `((sign-with-key . ,(gpg-build-flag-sign-with-key - sign-with-key)) - (plaintext-file . stdin-file) - (recipients . ,(gpg-build-flag-recipients recipients)) - (armor ,(if armor gpg-command-flag-armor)) - (textmode ,(if armor gpg-command-flag-textmode))))) - (gpg-call-process (gpg-exec-path gpg-command-sign-encrypt) - (gpg-build-arg-list (cdr gpg-command-sign-encrypt) - subst) - plaintext ciphertext result - (if passphrase passphrase (gpg-passphrase-read)))) - (when passphrase - (gpg-passphrase-clear-string passphrase))) - - -;;;###autoload -(defun gpg-encrypt - (plaintext ciphertext result recipients &optional passphrase armor textmode) - "Encrypt buffer PLAINTEXT, and store CIPHERTEXT in that buffer. -RECIPIENTS is a list of key IDs used for encryption. Returns t if -everything worked out well, nil otherwise. Consult buffer RESULT for -details. ARMOR the result and activate canonical -TEXTMODE if requested." - (interactive (list - (read-buffer "Buffer containing plaintext: " nil t) - (read-buffer "Buffer for ciphertext: " nil t) - (read-buffer "Buffer for status informationt: " nil t) - (gpg-read-recipients))) - (let ((subst `((plaintext-file . stdin-file) - (recipients . ,(gpg-build-flag-recipients recipients)) - (armor ,(if armor gpg-command-flag-armor)) - (textmode ,(if armor gpg-command-flag-textmode))))) - (gpg-call-process (gpg-exec-path gpg-command-encrypt) - (gpg-build-arg-list (cdr gpg-command-encrypt) subst) - plaintext ciphertext result nil)) - (when passphrase - (gpg-passphrase-clear-string passphrase))) - - -;;;; Key management - -;;; ADT: OpenPGP Key - -(defun gpg-key-make (user-id key-id unique-id length algorithm - creation-date expire-date validity trust) - "Create a new key object (for internal use only)." - (vector - ;; 0 1 2 3 4 - user-id key-id unique-id length algorithm - ;; 5 6 7 8 - creation-date expire-date validity trust)) - - -(defun gpg-key-p (key) - "Return t if KEY is a key specification." - (and (arrayp key) (equal (length key) 9) key)) - -(defmacro gpg-key-primary-user-id (key) - "The primary user ID for KEY (human-readable). -DO NOT USE this ID for selecting recipients. It is probably not -unique." - (list 'car (list 'aref key 0))) - -(defmacro gpg-key-user-ids (key) - "A list of additional user IDs for KEY (human-readable). -DO NOT USE these IDs for selecting recipients. They are probably not -unique." - (list 'cdr (list 'aref key 0))) - -(defmacro gpg-key-id (key) - "The key ID of KEY. -DO NOT USE this ID for selecting recipients. It is not guaranteed to -be unique." - (list 'aref key 1)) - -(defun gpg-short-key-id (key) - "The short key ID of KEY." - (let* ((id (gpg-key-id key)) - (len (length id))) - (if (> len 8) - (substring id (- len 8)) - id))) - -(defmacro gpg-key-unique-id (key) - "A non-standard ID of KEY which is only valid locally. -This ID can be used to specify recipients in a safe manner. Note, -even this ID might not be unique unless GnuPG is used." - (list 'aref key 2)) - -(defmacro gpg-key-unique-id-list (key-list) - "Like `gpg-key-unique-id', but operate on a list." - `(mapcar (lambda (key) (gpg-key-unique-id key)) - ,key-list)) - -(defmacro gpg-key-length (key) - "Returns the key length." - (list 'aref key 3)) - -(defmacro gpg-key-algorithm (key) - "The encryption algorithm used by KEY. -One of the symbols `rsa', `rsa-encrypt', `rsa-sign', `elgamal', -`elgamal-encrypt', `dsa'." - (list 'aref key 4)) - -(defmacro gpg-key-creation-date (key) - "A string with the creation date of KEY in ISO format." - (list 'aref key 5)) - -(defmacro gpg-key-expire-date (key) - "A string with the expiration date of KEY in ISO format." - (list 'aref key 6)) - -(defmacro gpg-key-validity (key) - "The calculated validity of KEY. -One of the symbols `not-known', `disabled', `revoked', `expired', -`undefined', `trust-none', `trust-marginal', `trust-full', -`trust-ultimate' (see the GnuPG documentation for details)." - (list 'aref key 7)) - -(defmacro gpg-key-trust (key) - "The assigned trust for KEY. -One of the symbols `not-known', `undefined', `trust-none', -`trust-marginal', `trust-full' (see the GnuPG -documentation for details)." - (list 'aref key 8)) - -(defun gpg-key-lessp (a b) - "Returns t if primary user ID of A is less than B." - (string-lessp (gpg-key-primary-user-id a) (gpg-key-primary-user-id b) )) - -;;; Accessing the key database: - -;; Internal functions: - -(defmacro gpg-key-list-keys-skip-field () - '(search-forward ":" eol 'move)) - -(defmacro gpg-key-list-keys-get-field () - '(buffer-substring (point) (if (gpg-key-list-keys-skip-field) - (1- (point)) - eol))) -(defmacro gpg-key-list-keys-string-field () - '(gpg-key-list-keys-get-field)) - -(defmacro gpg-key-list-keys-read-field () - (let ((field (make-symbol "field"))) - `(let ((,field (gpg-key-list-keys-get-field))) - (if (equal (length ,field) 0) - nil - (read ,field))))) - -(defun gpg-key-list-keys-parse-line () - "Parse the line in the current buffer and return a vector of fields." - (let* ((eol (gpg-point-at-eol)) - (v (if (eolp) - nil - (vector - (gpg-key-list-keys-read-field) ; type - (gpg-key-list-keys-get-field) ; trust - (gpg-key-list-keys-read-field) ; key length - (gpg-key-list-keys-read-field) ; algorithm - (gpg-key-list-keys-get-field) ; key ID - (gpg-key-list-keys-get-field) ; creation data - (gpg-key-list-keys-get-field) ; expire - (gpg-key-list-keys-get-field) ; unique (local) ID - (gpg-key-list-keys-get-field) ; ownertrust - (gpg-key-list-keys-string-field) ; user ID - )))) - (if (eolp) - (when v - (forward-char 1)) - (error "Too many fields in GnuPG key database")) - v)) - -(defconst gpg-pubkey-algo-alist - '((1 . rsa) - (2 . rsa-encrypt-only) - (3 . rsa-sign-only) - (16 . elgamal-encrypt-only) - (17 . dsa) - (20 . elgamal)) - "Alist mapping OpenPGP public key algorithm numbers to symbols.") - -(defconst gpg-trust-alist - '((?- . not-known) - (?o . not-known) - (?d . disabled) - (?r . revoked) - (?e . expired) - (?q . trust-undefined) - (?n . trust-none) - (?m . trust-marginal) - (?f . trust-full) - (?u . trust-ultimate)) - "Alist mapping GnuPG trust value short forms to long symbols.") - -(defconst gpg-unabbrev-trust-alist - '(("TRUST_UNDEFINED" . trust-undefined) - ("TRUST_NEVER" . trust-none) - ("TRUST_MARGINAL" . trust-marginal) - ("TRUST_FULLY" . trust-full) - ("TRUST_ULTIMATE" . trust-ultimate)) - "Alist mapping capitalized GnuPG trust values to long symbols.") - -(defmacro gpg-key-list-keys-in-buffer-store () - '(when primary-user-id - (sort user-id 'string-lessp) - (push (gpg-key-make (cons primary-user-id user-id) - key-id unique-id key-length - algorithm creation-date - expire-date validity trust) - key-list))) - -(defun gpg-key-list-keys-in-buffer (&optional buffer) - "Return a list of keys for BUFFER. -If BUFFER is omitted, use current buffer." - (with-current-buffer (if buffer buffer (current-buffer)) - (goto-char (point-min)) - ;; Skip key ring filename written by GnuPG. - (search-forward "\n---------------------------\n" nil t) - ;; Loop over all lines in buffer and analyze them. - (let (primary-user-id user-id key-id unique-id ; current key components - key-length algorithm creation-date expire-date validity trust - line ; fields in current line - key-list) ; keys gather so far - - (while (setq line (gpg-key-list-keys-parse-line)) - (cond - ;; Public or secret key. - ((memq (aref line 0) '(pub sec)) - ;; Store previous key, if any. - (gpg-key-list-keys-in-buffer-store) - ;; Record field values. - (setq primary-user-id (aref line 9)) - (setq user-id nil) - (setq key-id (aref line 4)) - ;; We use the key ID if no unique ID is available. - (setq unique-id (if (> (length (aref line 7)) 0) - (concat "#" (aref line 7)) - (concat "0x" key-id))) - (setq key-length (aref line 2)) - (setq algorithm (assq (aref line 3) gpg-pubkey-algo-alist)) - (if algorithm - (setq algorithm (cdr algorithm)) - (error "Unknown algorithm %s" (aref line 3))) - (setq creation-date (if (> (length (aref line 5)) 0) - (aref line 5))) - (setq expire-date (if (> (length (aref line 6)) 0) - (aref line 6))) - (setq validity (assq (aref (aref line 1) 0) gpg-trust-alist)) - (if validity - (setq validity (cdr validity)) - (error "Unknown validity specification %S" (aref line 1))) - (setq trust (assq (aref (aref line 8) 0) gpg-trust-alist)) - (if trust - (setq trust (cdr trust)) - (error "Unknown trust specification %S" (aref line 8)))) - - ;; Additional user ID - ((eq 'uid (aref line 0)) - (setq user-id (cons (aref line 9) user-id))) - - ;; Subkeys are ignored for now. - ((memq (aref line 0) '(sub ssb)) - t) - (t (error "Unknown record type %S" (aref line 0))))) - - ;; Store the key retrieved last. - (gpg-key-list-keys-in-buffer-store) - ;; Sort the keys according to the primary user ID. - (sort key-list 'gpg-key-lessp)))) - -(defun gpg-key-list-keyspec (command &optional keyspec stderr ignore-error) - "Insert the output of COMMAND before point in current buffer." - (let* ((cmd (gpg-exec-path command)) - (key (if (equal keyspec "") nil keyspec)) - (args (gpg-build-arg-list (cdr command) `((key-id . ,key)))) - exit-status) - (setq exit-status - (apply 'call-process-region - (point-min) (point-min) ; no data - cmd - nil ; don't delete - (if stderr t '(t nil)) - nil ; don't display - args)) - (unless (or ignore-error (equal exit-status 0)) - (error "GnuPG command exited unsuccessfully")))) - - -(defun gpg-key-list-keyspec-parse (command &optional keyspec) - "Return a list of keys matching KEYSPEC. -COMMAND is used to obtain the key list. The usual substring search -for keys is performed." - (with-temp-buffer - (buffer-disable-undo) - (gpg-key-list-keyspec command keyspec) - (gpg-key-list-keys-in-buffer))) - -;;;###autoload -(defun gpg-key-list-keys (&optional keyspec) - "A list of public keys matching KEYSPEC. -The usual substring search for keys is performed." - (gpg-key-list-keyspec-parse gpg-command-key-public-ring keyspec)) - -;;;###autoload -(defun gpg-key-list-secret-keys (&optional keyspec) - "A list of secret keys matching KEYSPEC. -The usual substring search for keys is performed." - (gpg-key-list-keyspec-parse gpg-command-key-secret-ring keyspec)) - -;;;###autoload -(defun gpg-key-insert-public-key (key) - "Inserts the public key(s) matching KEYSPEC. -The ASCII-armored key is inserted before point into current buffer." - (gpg-key-list-keyspec gpg-command-key-export key)) - -;;;###autoload -(defun gpg-key-insert-information (key) - "Insert human-readable information (including fingerprint) on KEY. -Insertion takes place in current buffer before point." - (gpg-key-list-keyspec gpg-command-key-verify key)) - -;;;###autoload -(defun gpg-key-retrieve (key) - "Fetch KEY from default key server. -KEY is a key ID or a list of key IDs. Status information about this -operation is inserted into the current buffer before point." - (gpg-key-list-keyspec gpg-command-key-retrieve key t t)) - -;;;###autoload -(defun gpg-key-add-to-ring (key result) - "Adds key in buffer KEY to the GnuPG key ring. -Human-readable information on the RESULT is stored in buffer RESULT -before point.") - -(provide 'gpg) - -;;; gpg.el ends here diff --git a/contrib/md5.el b/contrib/md5.el deleted file mode 100644 index a036819..0000000 --- a/contrib/md5.el +++ /dev/null @@ -1,409 +0,0 @@ -;;; md5.el -- MD5 Message Digest Algorithm -;;; Gareth Rees - -;; LCD Archive Entry: -;; md5|Gareth Rees|gdr11@cl.cam.ac.uk| -;; MD5 cryptographic message digest algorithm| -;; 13-Nov-95|1.0|~/misc/md5.el.Z| - -;;; Details: ------------------------------------------------------------------ - -;; This is a direct translation into Emacs LISP of the reference C -;; implementation of the MD5 Message-Digest Algorithm written by RSA -;; Data Security, Inc. -;; -;; The algorithm takes a message (that is, a string of bytes) and -;; computes a 16-byte checksum or "digest" for the message. This digest -;; is supposed to be cryptographically strong in the sense that if you -;; are given a 16-byte digest D, then there is no easier way to -;; construct a message whose digest is D than to exhaustively search the -;; space of messages. However, the robustness of the algorithm has not -;; been proven, and a similar algorithm (MD4) was shown to be unsound, -;; so treat with caution! -;; -;; The C algorithm uses 32-bit integers; because GNU Emacs -;; implementations provide 28-bit integers (with 24-bit integers on -;; versions prior to 19.29), the code represents a 32-bit integer as the -;; cons of two 16-bit integers. The most significant word is stored in -;; the car and the least significant in the cdr. The algorithm requires -;; at least 17 bits of integer representation in order to represent the -;; carry from a 16-bit addition. - -;;; Usage: -------------------------------------------------------------------- - -;; To compute the MD5 Message Digest for a message M (represented as a -;; string or as a vector of bytes), call -;; -;; (md5-encode M) -;; -;; which returns the message digest as a vector of 16 bytes. If you -;; need to supply the message in pieces M1, M2, ... Mn, then call -;; -;; (md5-init) -;; (md5-update M1) -;; (md5-update M2) -;; ... -;; (md5-update Mn) -;; (md5-final) - -;;; Copyright and licence: ---------------------------------------------------- - -;; Copyright (C) 1995 by Gareth Rees -;; Derived from the RSA Data Security, Inc. MD5 Message-Digest Algorithm -;; -;; md5.el 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. -;; -;; md5.el 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. -;; -;; The original copyright notice is given below, as required by the -;; licence for the original code. This code is distributed under *both* -;; RSA's original licence and the GNU General Public Licence. (There -;; should be no problems, as the former is more liberal than the -;; latter). - -;;; Original copyright notice: ------------------------------------------------ - -;; Copyright (C) 1990, RSA Data Security, Inc. All rights reserved. -;; -;; License to copy and use this software is granted provided that it is -;; identified as the "RSA Data Security, Inc. MD5 Message- Digest -;; Algorithm" in all material mentioning or referencing this software or -;; this function. -;; -;; License is also granted to make and use derivative works provided -;; that such works are identified as "derived from the RSA Data -;; Security, Inc. MD5 Message-Digest Algorithm" in all material -;; mentioning or referencing the derived work. -;; -;; RSA Data Security, Inc. makes no representations concerning either -;; the merchantability of this software or the suitability of this -;; software for any particular purpose. It is provided "as is" without -;; express or implied warranty of any kind. -;; -;; These notices must be retained in any copies of any part of this -;; documentation and/or software. - -;;; Code: - -(defvar md5-program "md5sum" - "*Program that reads a message on its standard input and writes an -MD5 digest on its output.") - -(defvar md5-maximum-internal-length 4096 - "*The maximum size of a piece of data that should use the MD5 routines -written in lisp. If a message exceeds this, it will be run through an -external filter for processing. Also see the `md5-program' variable. -This variable has no effect if you call the md5-init|update|final -functions - only used by the `md5' function's simpler interface.") - -(defvar md5-bits (make-vector 4 0) - "Number of bits handled, modulo 2^64. -Represented as four 16-bit numbers, least significant first.") -(defvar md5-buffer (make-vector 4 '(0 . 0)) - "Scratch buffer (four 32-bit integers).") -(defvar md5-input (make-vector 64 0) - "Input buffer (64 bytes).") - -(defun md5-unhex (x) - (if (> x ?9) - (if (>= x ?a) - (+ 10 (- x ?a)) - (+ 10 (- x ?A))) - (- x ?0))) - -(defun md5-encode (message) - "Encodes MESSAGE using the MD5 message digest algorithm. -MESSAGE must be a string or an array of bytes. -Returns a vector of 16 bytes containing the message digest." - (if (<= (length message) md5-maximum-internal-length) - (progn - (md5-init) - (md5-update message) - (md5-final)) - (save-excursion - (set-buffer (get-buffer-create " *md5-work*")) - (erase-buffer) - (insert message) - (call-process-region (point-min) (point-max) - (or shell-file-name "/bin/sh") - t (current-buffer) nil - "-c" md5-program) - ;; MD5 digest is 32 chars long - ;; mddriver adds a newline to make neaten output for tty - ;; viewing, make sure we leave it behind. - (let ((data (buffer-substring (point-min) (+ (point-min) 32))) - (vec (make-vector 16 0)) - (ctr 0)) - (while (< ctr 16) - (aset vec ctr (+ (* 16 (md5-unhex (aref data (* ctr 2)))) - (md5-unhex (aref data (1+ (* ctr 2)))))) - (setq ctr (1+ ctr))))))) - -(defsubst md5-add (x y) - "Return 32-bit sum of 32-bit integers X and Y." - (let ((m (+ (car x) (car y))) - (l (+ (cdr x) (cdr y)))) - (cons (logand 65535 (+ m (lsh l -16))) (logand l 65535)))) - -;; FF, GG, HH and II are basic MD5 functions, providing transformations -;; for rounds 1, 2, 3 and 4 respectively. Each function follows this -;; pattern of computation (where ROTATE(x,y) means rotate 32-bit value x -;; by y bits to the left): -;; -;; FF(a,b,c,d,x,s,ac) = ROTATE(a + F(b,c,d) + x + ac,s) + b -;; -;; so we use the macro `md5-make-step' to construct each one. The -;; helper functions F, G, H and I operate on 16-bit numbers; the full -;; operation splits its inputs, operates on the halves separately and -;; then puts the results together. - -(defsubst md5-F (x y z) (logior (logand x y) (logand (lognot x) z))) -(defsubst md5-G (x y z) (logior (logand x z) (logand y (lognot z)))) -(defsubst md5-H (x y z) (logxor x y z)) -(defsubst md5-I (x y z) (logxor y (logior x (logand 65535 (lognot z))))) - -(defmacro md5-make-step (name func) - (` - (defun (, name) (a b c d x s ac) - (let* - ((m1 (+ (car a) ((, func) (car b) (car c) (car d)) (car x) (car ac))) - (l1 (+ (cdr a) ((, func) (cdr b) (cdr c) (cdr d)) (cdr x) (cdr ac))) - (m2 (logand 65535 (+ m1 (lsh l1 -16)))) - (l2 (logand 65535 l1)) - (m3 (logand 65535 (if (> s 15) - (+ (lsh m2 (- s 32)) (lsh l2 (- s 16))) - (+ (lsh m2 s) (lsh l2 (- s 16)))))) - (l3 (logand 65535 (if (> s 15) - (+ (lsh l2 (- s 32)) (lsh m2 (- s 16))) - (+ (lsh l2 s) (lsh m2 (- s 16))))))) - (md5-add (cons m3 l3) b))))) - -(md5-make-step md5-FF md5-F) -(md5-make-step md5-GG md5-G) -(md5-make-step md5-HH md5-H) -(md5-make-step md5-II md5-I) - -(defun md5-init () - "Initialise the state of the message-digest routines." - (aset md5-bits 0 0) - (aset md5-bits 1 0) - (aset md5-bits 2 0) - (aset md5-bits 3 0) - (aset md5-buffer 0 '(26437 . 8961)) - (aset md5-buffer 1 '(61389 . 43913)) - (aset md5-buffer 2 '(39098 . 56574)) - (aset md5-buffer 3 '( 4146 . 21622))) - -(defun md5-update (string) - "Update the current MD5 state with STRING (an array of bytes)." - (let ((len (length string)) - (i 0) - (j 0)) - (while (< i len) - ;; Compute number of bytes modulo 64 - (setq j (% (/ (aref md5-bits 0) 8) 64)) - - ;; Store this byte (truncating to 8 bits to be sure) - (aset md5-input j (logand 255 (aref string i))) - - ;; Update number of bits by 8 (modulo 2^64) - (let ((c 8) (k 0)) - (while (and (> c 0) (< k 4)) - (let ((b (aref md5-bits k))) - (aset md5-bits k (logand 65535 (+ b c))) - (setq c (if (> b (- 65535 c)) 1 0) - k (1+ k))))) - - ;; Increment number of bytes processed - (setq i (1+ i)) - - ;; When 64 bytes accumulated, pack them into sixteen 32-bit - ;; integers in the array `in' and then tranform them. - (if (= j 63) - (let ((in (make-vector 16 (cons 0 0))) - (k 0) - (kk 0)) - (while (< k 16) - (aset in k (md5-pack md5-input kk)) - (setq k (+ k 1) kk (+ kk 4))) - (md5-transform in)))))) - -(defun md5-pack (array i) - "Pack the four bytes at ARRAY reference I to I+3 into a 32-bit integer." - (cons (+ (lsh (aref array (+ i 3)) 8) (aref array (+ i 2))) - (+ (lsh (aref array (+ i 1)) 8) (aref array (+ i 0))))) - -(defun md5-byte (array n b) - "Unpack byte B (0 to 3) from Nth member of ARRAY of 32-bit integers." - (let ((e (aref array n))) - (cond ((eq b 0) (logand 255 (cdr e))) - ((eq b 1) (lsh (cdr e) -8)) - ((eq b 2) (logand 255 (car e))) - ((eq b 3) (lsh (car e) -8))))) - -(defun md5-final () - (let ((in (make-vector 16 (cons 0 0))) - (j 0) - (digest (make-vector 16 0)) - (padding)) - - ;; Save the number of bits in the message - (aset in 14 (cons (aref md5-bits 1) (aref md5-bits 0))) - (aset in 15 (cons (aref md5-bits 3) (aref md5-bits 2))) - - ;; Compute number of bytes modulo 64 - (setq j (% (/ (aref md5-bits 0) 8) 64)) - - ;; Pad out computation to 56 bytes modulo 64 - (setq padding (make-vector (if (< j 56) (- 56 j) (- 120 j)) 0)) - (aset padding 0 128) - (md5-update padding) - - ;; Append length in bits and transform - (let ((k 0) (kk 0)) - (while (< k 14) - (aset in k (md5-pack md5-input kk)) - (setq k (+ k 1) kk (+ kk 4)))) - (md5-transform in) - - ;; Store the results in the digest - (let ((k 0) (kk 0)) - (while (< k 4) - (aset digest (+ kk 0) (md5-byte md5-buffer k 0)) - (aset digest (+ kk 1) (md5-byte md5-buffer k 1)) - (aset digest (+ kk 2) (md5-byte md5-buffer k 2)) - (aset digest (+ kk 3) (md5-byte md5-buffer k 3)) - (setq k (+ k 1) kk (+ kk 4)))) - - ;; Return digest - digest)) - -;; It says in the RSA source, "Note that if the Mysterious Constants are -;; arranged backwards in little-endian order and decrypted with the DES -;; they produce OCCULT MESSAGES!" Security through obscurity? - -(defun md5-transform (in) - "Basic MD5 step. Transform md5-buffer based on array IN." - (let ((a (aref md5-buffer 0)) - (b (aref md5-buffer 1)) - (c (aref md5-buffer 2)) - (d (aref md5-buffer 3))) - (setq - a (md5-FF a b c d (aref in 0) 7 '(55146 . 42104)) - d (md5-FF d a b c (aref in 1) 12 '(59591 . 46934)) - c (md5-FF c d a b (aref in 2) 17 '( 9248 . 28891)) - b (md5-FF b c d a (aref in 3) 22 '(49597 . 52974)) - a (md5-FF a b c d (aref in 4) 7 '(62844 . 4015)) - d (md5-FF d a b c (aref in 5) 12 '(18311 . 50730)) - c (md5-FF c d a b (aref in 6) 17 '(43056 . 17939)) - b (md5-FF b c d a (aref in 7) 22 '(64838 . 38145)) - a (md5-FF a b c d (aref in 8) 7 '(27008 . 39128)) - d (md5-FF d a b c (aref in 9) 12 '(35652 . 63407)) - c (md5-FF c d a b (aref in 10) 17 '(65535 . 23473)) - b (md5-FF b c d a (aref in 11) 22 '(35164 . 55230)) - a (md5-FF a b c d (aref in 12) 7 '(27536 . 4386)) - d (md5-FF d a b c (aref in 13) 12 '(64920 . 29075)) - c (md5-FF c d a b (aref in 14) 17 '(42617 . 17294)) - b (md5-FF b c d a (aref in 15) 22 '(18868 . 2081)) - a (md5-GG a b c d (aref in 1) 5 '(63006 . 9570)) - d (md5-GG d a b c (aref in 6) 9 '(49216 . 45888)) - c (md5-GG c d a b (aref in 11) 14 '( 9822 . 23121)) - b (md5-GG b c d a (aref in 0) 20 '(59830 . 51114)) - a (md5-GG a b c d (aref in 5) 5 '(54831 . 4189)) - d (md5-GG d a b c (aref in 10) 9 '( 580 . 5203)) - c (md5-GG c d a b (aref in 15) 14 '(55457 . 59009)) - b (md5-GG b c d a (aref in 4) 20 '(59347 . 64456)) - a (md5-GG a b c d (aref in 9) 5 '( 8673 . 52710)) - d (md5-GG d a b c (aref in 14) 9 '(49975 . 2006)) - c (md5-GG c d a b (aref in 3) 14 '(62677 . 3463)) - b (md5-GG b c d a (aref in 8) 20 '(17754 . 5357)) - a (md5-GG a b c d (aref in 13) 5 '(43491 . 59653)) - d (md5-GG d a b c (aref in 2) 9 '(64751 . 41976)) - c (md5-GG c d a b (aref in 7) 14 '(26479 . 729)) - b (md5-GG b c d a (aref in 12) 20 '(36138 . 19594)) - a (md5-HH a b c d (aref in 5) 4 '(65530 . 14658)) - d (md5-HH d a b c (aref in 8) 11 '(34673 . 63105)) - c (md5-HH c d a b (aref in 11) 16 '(28061 . 24866)) - b (md5-HH b c d a (aref in 14) 23 '(64997 . 14348)) - a (md5-HH a b c d (aref in 1) 4 '(42174 . 59972)) - d (md5-HH d a b c (aref in 4) 11 '(19422 . 53161)) - c (md5-HH c d a b (aref in 7) 16 '(63163 . 19296)) - b (md5-HH b c d a (aref in 10) 23 '(48831 . 48240)) - a (md5-HH a b c d (aref in 13) 4 '(10395 . 32454)) - d (md5-HH d a b c (aref in 0) 11 '(60065 . 10234)) - c (md5-HH c d a b (aref in 3) 16 '(54511 . 12421)) - b (md5-HH b c d a (aref in 6) 23 '( 1160 . 7429)) - a (md5-HH a b c d (aref in 9) 4 '(55764 . 53305)) - d (md5-HH d a b c (aref in 12) 11 '(59099 . 39397)) - c (md5-HH c d a b (aref in 15) 16 '( 8098 . 31992)) - b (md5-HH b c d a (aref in 2) 23 '(50348 . 22117)) - a (md5-II a b c d (aref in 0) 6 '(62505 . 8772)) - d (md5-II d a b c (aref in 7) 10 '(17194 . 65431)) - c (md5-II c d a b (aref in 14) 15 '(43924 . 9127)) - b (md5-II b c d a (aref in 5) 21 '(64659 . 41017)) - a (md5-II a b c d (aref in 12) 6 '(25947 . 22979)) - d (md5-II d a b c (aref in 3) 10 '(36620 . 52370)) - c (md5-II c d a b (aref in 10) 15 '(65519 . 62589)) - b (md5-II b c d a (aref in 1) 21 '(34180 . 24017)) - a (md5-II a b c d (aref in 8) 6 '(28584 . 32335)) - d (md5-II d a b c (aref in 15) 10 '(65068 . 59104)) - c (md5-II c d a b (aref in 6) 15 '(41729 . 17172)) - b (md5-II b c d a (aref in 13) 21 '(19976 . 4513)) - a (md5-II a b c d (aref in 4) 6 '(63315 . 32386)) - d (md5-II d a b c (aref in 11) 10 '(48442 . 62005)) - c (md5-II c d a b (aref in 2) 15 '(10967 . 53947)) - b (md5-II b c d a (aref in 9) 21 '(60294 . 54161))) - - (aset md5-buffer 0 (md5-add (aref md5-buffer 0) a)) - (aset md5-buffer 1 (md5-add (aref md5-buffer 1) b)) - (aset md5-buffer 2 (md5-add (aref md5-buffer 2) c)) - (aset md5-buffer 3 (md5-add (aref md5-buffer 3) d)))) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; Here begins the merger with the XEmacs API and the md5.el from the URL -;;; package. Courtesy wmperry@spry.com -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(defun md5 (object &optional start end) - "Return the MD5 (a secure message digest algorithm) of an object. -OBJECT is either a string or a buffer. -Optional arguments START and END denote buffer positions for computing the -hash of a portion of OBJECT." - (let ((buffer nil)) - (unwind-protect - (save-excursion - (setq buffer (generate-new-buffer " *md5-work*")) - (set-buffer buffer) - (cond - ((bufferp object) - (insert-buffer-substring object start end)) - ((stringp object) - (insert (if (or start end) - (substring object start end) - object))) - (t nil)) - (prog1 - (if (<= (point-max) md5-maximum-internal-length) - (mapconcat - (function (lambda (node) (format "%02x" node))) - (md5-encode (buffer-string)) - "") - (call-process-region (point-min) (point-max) - (or shell-file-name "/bin/sh") - t buffer nil - "-c" md5-program) - ;; MD5 digest is 32 chars long - ;; mddriver adds a newline to make neaten output for tty - ;; viewing, make sure we leave it behind. - (buffer-substring (point-min) (+ (point-min) 32))) - (kill-buffer buffer))) - (and buffer (kill-buffer buffer) nil)))) - -(provide 'md5) - -;;; md5.el ends here diff --git a/contrib/one-line-cookie.diff b/contrib/one-line-cookie.diff deleted file mode 100644 index 1cab64a..0000000 --- a/contrib/one-line-cookie.diff +++ /dev/null @@ -1,28 +0,0 @@ -Index: url-cookie.el -=================================================================== -RCS file: /gd/gnu/anoncvsroot/url/lisp/url-cookie.el,v -retrieving revision 1.1.1.1 -diff -u -r1.1.1.1 url-cookie.el ---- url-cookie.el 1999/11/26 12:11:47 1.1.1.1 -+++ url-cookie.el 1999/12/10 06:53:05 -@@ -255,6 +255,10 @@ - (setq retval (cons cur retval)))))) - retval)) - -+(defvar url-cookie-multiple-line t -+ "If nil, use one line cookie. -+Some web servers, such as hotmail, only accept one line cookie.") -+ - ;;;###autolaod - (defun url-cookie-generate-header-lines (host path secure) - (let* ((cookies (url-cookie-retrieve host path secure)) -@@ -272,7 +276,8 @@ - (setq cur (car cookies) - cookies (cdr cookies) - chunk (format "%s=%s" (url-cookie-name cur) (url-cookie-value cur)) -- retval (if (< 80 (+ (length retval) (length chunk) 4)) -+ retval (if (and url-cookie-multiple-line -+ (< 80 (+ (length retval) (length chunk) 4))) - (concat retval "\r\nCookie: " chunk) - (if retval - (concat retval "; " chunk) diff --git a/contrib/sha1.el b/contrib/sha1.el deleted file mode 100644 index f4706b8..0000000 --- a/contrib/sha1.el +++ /dev/null @@ -1,397 +0,0 @@ -;;; sha1.el --- SHA1 Message Digest Algorithm. -;; Copyright (C) 1998,1999 Keiichi Suzuki. - -;; Author: Keiichi Suzuki -;; Author: Katsumi Yamaoka -;; Created: 1998-12-25 -;; Revised: 1999-01-13 -;; Keywords: sha1, news, cancel-lock, hmac, rfc2104 - -;; This program 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 program 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. - -;;; A copy of the GNU General Public License can be obtained from this -;;; program's author (send electronic mail to kyle@uunet.uu.net) or from -;;; the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA -;;; 02139, USA. - -;;; Commentary: - -;; This is a direct translation into Emacs LISP of the reference C -;; implementation of the SHA1 message digest algorithm. - -;;; Usage: - -;; To compute the SHA1 message digest for a message M (represented as -;; a string), call -;; -;; (sha1-encode M) -;; -;; which returns the message digest as a hexadecimal string of 20 bytes. -;; If you need to supply the message in pieces M1, M2, ... Mn, then call -;; -;; (sha1-init) -;; (sha1-update M1) -;; (sha1-update M2) -;; ... -;; (sha1-update Mn) -;; (sha1-final) - -;;; Notes: - -;; The C algorithm uses 32-bit integers; because GNU Emacs -;; implementations provide 28-bit integers (with 24-bit integers on -;; versions prior to 19.29), the code represents a 32-bit integer as the -;; cons of two 16-bit integers. The most significant word is stored in -;; the car and the least significant in the cdr. The algorithm requires -;; at least 19 bits of integer representation in order to represent the -;; carry from a 16-bit addition. (see sha1-add()) - -;;; Code: - -(defmacro sha1-f1 (x y z) - `(cons - (logior (logand (car ,x) (car ,y)) (logand (lognot (car ,x)) (car ,z))) - (logior (logand (cdr ,x) (cdr ,y)) (logand (lognot (cdr ,x)) (cdr ,z))) - )) - -(defmacro sha1-f2 (x y z) - `(cons - (logxor (car ,x) (car ,y) (car ,z)) - (logxor (cdr ,x) (cdr ,y) (cdr ,z)) - )) - -(defmacro sha1-f3 (x y z) - `(cons - (logior (logand (car ,x) (car ,y)) (logand (car ,x) (car ,z)) - (logand (car ,y) (car ,z))) - (logior (logand (cdr ,x) (cdr ,y)) (logand (cdr ,x) (cdr ,z)) - (logand (cdr ,y) (cdr ,z))) - )) - -(defmacro sha1-f4 (x y z) - `(cons - (logxor (car ,x) (car ,y) (car ,z)) - (logxor (cdr ,x) (cdr ,y) (cdr ,z)) - )) - -(defconst sha1-const1 '(23170 . 31129) - "SHA constants 1 \(0x5a827999\)") -(defconst sha1-const2 '(28377 . 60321) - "SHA constants 2 \(0x6ed9eba1\)") -(defconst sha1-const3 '(36635 . 48348) - "SHA constants 3 \(0x8f1bbcdc\)") -(defconst sha1-const4 '(51810 . 49622) - "SHA constants 4 \(0xca62c1d6\)") - -(defvar sha1-digest (make-vector 5 nil)) -(defvar sha1-count-lo nil) -(defvar sha1-count-hi nil) -(defvar sha1-data nil) -(defvar sha1-local nil) -(defconst SHA1-BLOCKSIZE 64) - -(defun sha1-init () - "Initialize the state of the SHA1 message digest routines." - (aset sha1-digest 0 (cons 26437 8961)) - (aset sha1-digest 1 (cons 61389 43913)) - (aset sha1-digest 2 (cons 39098 56574)) - (aset sha1-digest 3 (cons 4146 21622)) - (aset sha1-digest 4 (cons 50130 57840)) - (setq sha1-count-lo (cons 0 0) - sha1-count-hi (cons 0 0) - sha1-local 0 - sha1-data nil) - ) - -(defmacro sha1-32-make (v) - "Return 32bits internal value from normal integer." - `(cons (lsh ,v -16) (logand 65535 ,v))) - -(defun sha1-add (to &rest vals) - "Set sum of all the arguments to the first one." - (let (val) - (while (setq val (car vals)) - (setcar to (+ (car to) (car val))) - (setcdr to (+ (cdr to) (cdr val))) - (setq vals (cdr vals)) - ) - (setcar to (logand 65535 (+ (car to) (lsh (cdr to) -16)))) - (setcdr to (logand 65535 (cdr to))) - to - )) - -(defun sha1-xor (to &rest vals) - "Set bitwise-exclusive-or of all the arguments to the first one." - (let (val) - (while (setq val (car vals)) - (setcar to (logxor (car to) (car val))) - (setcdr to (logxor (cdr to) (cdr val))) - (setq vals (cdr vals))) - )) - -(defmacro sha1-rot (val c1 c2) - "Internal macro for sha1-rot-*." - `(cons - (logand 65535 (logior (lsh (car ,val) ,c1) (lsh (cdr ,val) ,c2))) - (logand 65535 (logior (lsh (cdr ,val) ,c1) (lsh (car ,val) ,c2))) - )) - -(defmacro sha1-rot-1 (val) - "Return VAL with its bits rotated left by 1." - `(sha1-rot ,val 1 -15) - ) - -(defmacro sha1-rot-5 (val) - "Return VAL with its bits rotated left by 5." - `(sha1-rot ,val 5 -11) - ) - -(defmacro sha1-rot-30 (val) - "Return VAL with its bits rotated left by 30." - `(sha1-rot ,val -2 14) - ) - -(defun sha1-inc (to) - "Set TO pulus one to TO." - (setcdr to (1+ (cdr to))) - (when (> (cdr to) 65535) - (setcdr to (logand 65535 (cdr to))) - (setcar to (logand 65535 (1+ (car to)))))) - -(defun sha1-lsh (to v count) - "Set TO with its bits shifted left by COUNT to TO." - (setcar to (logand 65535 - (logior (lsh (car v) count) (lsh (cdr v) (- count 16))))) - (setcdr to (logand 65535 (lsh (cdr v) count))) - to - ) - -(defun sha1-rsh (to v count) - "Set TO with its bits shifted right by COUNT to TO." - (setq count (- 0 count)) - (setcdr to (logand 65535 - (logior (lsh (cdr v) count) (lsh (car v) (- count 16))))) - (setcar to (logand 65535 (lsh (car v) count))) - to - ) - -(defun sha1-< (v1 v2) - "Return t if firast argment is less then second argument." - (or (< (car v1) (car v2)) - (and (eq (car v1) (car v2)) - (< (cdr v1) (cdr v2)))) - ) - -(unless (fboundp 'string-as-unibyte) - (defsubst string-as-unibyte (string) - string) - ) - -(defun sha1-update (bytes) - "Update the current SHA1 state with BYTES (an string of uni-bytes)." - (setq bytes (string-as-unibyte bytes)) - (let* ((len (length bytes)) - (len32 (sha1-32-make len)) - (tmp32 (cons 0 0)) - (top 0) - (clo (cons 0 0)) - i done) - (sha1-add clo sha1-count-lo (sha1-lsh tmp32 len32 3)) - (when (sha1-< clo sha1-count-lo) - (sha1-inc sha1-count-hi)) - (setq sha1-count-lo clo) - (sha1-add sha1-count-hi (sha1-rsh tmp32 len32 29)) - (when (> (length sha1-data) 0) - (setq i (- SHA1-BLOCKSIZE (length sha1-data))) - (when (> i len) - (setq i len)) - (setq sha1-data (concat sha1-data (substring bytes 0 i))) - (setq len (- len i) - top i) - (if (eq (length sha1-data) SHA1-BLOCKSIZE) - (sha1-transform) - (setq done t))) - (when (not done) - (while (and (not done) - (>= len SHA1-BLOCKSIZE)) - (setq sha1-data (substring bytes top (+ top SHA1-BLOCKSIZE)) - top (+ top SHA1-BLOCKSIZE) - len (- len SHA1-BLOCKSIZE)) - (sha1-transform)) - (setq sha1-data (substring bytes top (+ top len)))) - )) - -(defmacro sha1-FA (n) - (let ((func (intern (format "sha1-f%d" n))) - (const (intern (format "sha1-const%d" n)))) - `(setq T (sha1-add (cons 0 0) (sha1-rot-5 A) (,func B C D) E (aref W WIDX) - ,const) - WIDX (1+ WIDX) - B (sha1-rot-30 B)))) - -(defmacro sha1-FB (n) - (let ((func (intern (format "sha1-f%d" n))) - (const (intern (format "sha1-const%d" n)))) - `(setq E (sha1-add (cons 0 0) (sha1-rot-5 T) (,func A B C) D (aref W WIDX) - ,const) - WIDX (1+ WIDX) - A (sha1-rot-30 A)))) - -(defmacro sha1-FC (n) - (let ((func (intern (format "sha1-f%d" n))) - (const (intern (format "sha1-const%d" n)))) - `(setq D (sha1-add (cons 0 0) (sha1-rot-5 E) (,func T A B) C (aref W WIDX) - ,const) - WIDX (1+ WIDX) - T (sha1-rot-30 T)))) - -(defmacro sha1-FD (n) - (let ((func (intern (format "sha1-f%d" n))) - (const (intern (format "sha1-const%d" n)))) - `(setq C (sha1-add (cons 0 0) (sha1-rot-5 D) (,func E T A) B (aref W WIDX) - ,const) - WIDX (1+ WIDX) - E (sha1-rot-30 E)))) - -(defmacro sha1-FE (n) - (let ((func (intern (format "sha1-f%d" n))) - (const (intern (format "sha1-const%d" n)))) - `(setq B (sha1-add (cons 0 0) (sha1-rot-5 C) (,func D E T) A (aref W WIDX) - ,const) - WIDX (1+ WIDX) - D (sha1-rot-30 D)))) - -(defmacro sha1-FT (n) - (let ((func (intern (format "sha1-f%d" n))) - (const (intern (format "sha1-const%d" n)))) - `(setq A (sha1-add (cons 0 0) (sha1-rot-5 B) (,func C D E) T (aref W WIDX) - ,const) - WIDX (1+ WIDX) - C (sha1-rot-30 C)))) - -(defun sha1-transform () - "Basic SHA1 step. Transform sha1-digest based on sha1-data." - (let ((W (make-vector 80 nil)) - (WIDX 0) - (bidx 0) - T A B C D E) - (while (< WIDX 16) - (aset W WIDX - (cons (logior (lsh (aref sha1-data bidx) 8) - (aref sha1-data (setq bidx (1+ bidx)))) - (logior (lsh (aref sha1-data (setq bidx (1+ bidx))) 8) - (aref sha1-data (setq bidx (1+ bidx)))))) - (setq bidx (1+ bidx) - WIDX (1+ WIDX))) - (while (< WIDX 80) - (aset W WIDX (cons 0 0)) - (sha1-xor (aref W WIDX) - (aref W (- WIDX 3)) (aref W (- WIDX 8)) - (aref W (- WIDX 14)) (aref W (- WIDX 16))) - (aset W WIDX (sha1-rot-1 (aref W WIDX))) - (setq WIDX (1+ WIDX))) - (setq A (cons (car (aref sha1-digest 0)) (cdr (aref sha1-digest 0))) - B (cons (car (aref sha1-digest 1)) (cdr (aref sha1-digest 1))) - C (cons (car (aref sha1-digest 2)) (cdr (aref sha1-digest 2))) - D (cons (car (aref sha1-digest 3)) (cdr (aref sha1-digest 3))) - E (cons (car (aref sha1-digest 4)) (cdr (aref sha1-digest 4))) - WIDX 0) - - (sha1-FA 1) (sha1-FB 1) (sha1-FC 1) (sha1-FD 1) (sha1-FE 1) (sha1-FT 1) - (sha1-FA 1) (sha1-FB 1) (sha1-FC 1) (sha1-FD 1) (sha1-FE 1) (sha1-FT 1) - (sha1-FA 1) (sha1-FB 1) (sha1-FC 1) (sha1-FD 1) (sha1-FE 1) (sha1-FT 1) - (sha1-FA 1) (sha1-FB 1) (sha1-FC 2) (sha1-FD 2) (sha1-FE 2) (sha1-FT 2) - (sha1-FA 2) (sha1-FB 2) (sha1-FC 2) (sha1-FD 2) (sha1-FE 2) (sha1-FT 2) - (sha1-FA 2) (sha1-FB 2) (sha1-FC 2) (sha1-FD 2) (sha1-FE 2) (sha1-FT 2) - (sha1-FA 2) (sha1-FB 2) (sha1-FC 2) (sha1-FD 2) (sha1-FE 3) (sha1-FT 3) - (sha1-FA 3) (sha1-FB 3) (sha1-FC 3) (sha1-FD 3) (sha1-FE 3) (sha1-FT 3) - (sha1-FA 3) (sha1-FB 3) (sha1-FC 3) (sha1-FD 3) (sha1-FE 3) (sha1-FT 3) - (sha1-FA 3) (sha1-FB 3) (sha1-FC 3) (sha1-FD 3) (sha1-FE 3) (sha1-FT 3) - (sha1-FA 4) (sha1-FB 4) (sha1-FC 4) (sha1-FD 4) (sha1-FE 4) (sha1-FT 4) - (sha1-FA 4) (sha1-FB 4) (sha1-FC 4) (sha1-FD 4) (sha1-FE 4) (sha1-FT 4) - (sha1-FA 4) (sha1-FB 4) (sha1-FC 4) (sha1-FD 4) (sha1-FE 4) (sha1-FT 4) - (sha1-FA 4) (sha1-FB 4) - - (sha1-add (aref sha1-digest 0) E) - (sha1-add (aref sha1-digest 1) T) - (sha1-add (aref sha1-digest 2) A) - (sha1-add (aref sha1-digest 3) B) - (sha1-add (aref sha1-digest 4) C) - )) - -(defun sha1-final (&optional binary) - "Transform buffered sha1-data and return SHA1 message digest. -If optional argument BINARY is non-nil, then return binary formed -string of message digest." - (let ((count (logand (lsh (cdr sha1-count-lo) -3) 63))) - (when (< (length sha1-data) SHA1-BLOCKSIZE) - (setq sha1-data - (concat sha1-data - (make-string (- SHA1-BLOCKSIZE (length sha1-data)) 0)))) - (aset sha1-data count 128) - (setq count (1+ count)) - (if (> count (- SHA1-BLOCKSIZE 8)) - (progn - (setq sha1-data (concat (substring sha1-data 0 count) - (make-string (- SHA1-BLOCKSIZE count) 0))) - (sha1-transform) - (setq sha1-data (concat (make-string (- SHA1-BLOCKSIZE 8) 0) - (substring sha1-data -8)))) - (setq sha1-data (concat (substring sha1-data 0 count) - (make-string (- SHA1-BLOCKSIZE 8 count) 0) - (substring sha1-data -8)))) - (aset sha1-data 56 (lsh (car sha1-count-hi) -8)) - (aset sha1-data 57 (logand 255 (car sha1-count-hi))) - (aset sha1-data 58 (lsh (cdr sha1-count-hi) -8)) - (aset sha1-data 59 (logand 255 (cdr sha1-count-hi))) - (aset sha1-data 60 (lsh (car sha1-count-lo) -8)) - (aset sha1-data 61 (logand 255 (car sha1-count-lo))) - (aset sha1-data 62 (lsh (cdr sha1-count-lo) -8)) - (aset sha1-data 63 (logand 255 (cdr sha1-count-lo))) - (sha1-transform) - (if binary - (mapconcat - (lambda (elem) - (concat (char-to-string (/ (car elem) 256)) - (char-to-string (% (car elem) 256)) - (char-to-string (/ (cdr elem) 256)) - (char-to-string (% (cdr elem) 256)))) - (list (aref sha1-digest 0) (aref sha1-digest 1) (aref sha1-digest 2) - (aref sha1-digest 3) (aref sha1-digest 4)) - "") - (format "%04x%04x%04x%04x%04x%04x%04x%04x%04x%04x" - (car (aref sha1-digest 0)) (cdr (aref sha1-digest 0)) - (car (aref sha1-digest 1)) (cdr (aref sha1-digest 1)) - (car (aref sha1-digest 2)) (cdr (aref sha1-digest 2)) - (car (aref sha1-digest 3)) (cdr (aref sha1-digest 3)) - (car (aref sha1-digest 4)) (cdr (aref sha1-digest 4))) - ))) - -(defun sha1-encode (message &optional binary) - "Encodes MESSAGE using the SHA1 message digest algorithm. -MESSAGE must be a unibyte-string. -By default, return a string which formed hex-decimal charcters -from message digest. -If optional argument BINARY is non-nil, then return binary formed -string of message digest." - (sha1-init) - (sha1-update message) - (sha1-final binary)) - -(defun sha1-encode-binary (message) - "Encodes MESSAGE using the SHA1 message digest algorithm. -MESSAGE must be a unibyte-string. -Return binary formed string of message digest." - (sha1-encode message 'binary)) - -(provide 'sha1) - -;;; sha1.el ends here diff --git a/contrib/ssl.el b/contrib/ssl.el deleted file mode 100644 index fcb2509..0000000 --- a/contrib/ssl.el +++ /dev/null @@ -1,201 +0,0 @@ -;;; ssl.el,v --- ssl functions for emacsen without them builtin -;; Author: #Author: zsh # -;; Created: #Date: 2001/07/13 19:31:09 # -;; Version: #Revision: 1.2 # -;; Keywords: comm - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; Copyright (c) 1995, 1996 by William M. Perry -;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc. -;;; -;;; This file is part of GNU Emacs. -;;; -;;; GNU Emacs 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. -;;; -;;; GNU Emacs 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. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -(eval-when-compile (require 'cl)) -(require 'base64) - -(eval-and-compile - (condition-case () - (require 'custom) - (error nil)) - (if (and (featurep 'custom) (fboundp 'custom-declare-variable)) - nil ;; We've got what we needed - ;; We have the old custom-library, hack around it! - (defmacro defgroup (&rest args) - nil) - (defmacro defcustom (var value doc &rest args) - (` (defvar (, var) (, value) (, doc)))))) - -(defgroup ssl nil - "Support for `Secure Sockets Layer' encryption." - :group 'comm) - -(defcustom ssl-certificate-directory "~/.w3/certs/" - "*Directory to store CA certificates in" - :group 'ssl - :type 'directory) - -(defcustom ssl-rehash-program-name "c_rehash" - "*Program to run after adding a cert to a directory . -Run with one argument, the directory name." - :group 'ssl - :type 'string) - -(defcustom ssl-view-certificate-program-name "x509" - "*The program to run to provide a human-readable view of a certificate." - :group 'ssl - :type 'string) - -(defcustom ssl-view-certificate-program-arguments '("-text" "-inform" "DER") - "*Arguments that should be passed to the certificate viewing program. -The certificate is piped to it. -Maybe a way of passing a file should be implemented" - :group 'ssl - :type 'list) - -(defcustom ssl-certificate-directory-style 'ssleay - "*Style of cert database to use, the only valid value right now is `ssleay'. -This means a directory of pem encoded certificates with hash symlinks." - :group 'ssl - :type '(choice (const :tag "SSLeay" :value ssleay) - (const :tag "OpenSSL" :value openssl))) - -(defcustom ssl-certificate-verification-policy 0 - "*How far up the certificate chain we should verify." - :group 'ssl - :type '(choice (const :tag "No verification" :value 0) - (const :tag "Verification required" :value 1) - (const :tag "Reject connection if verification fails" :value 3) - (const :tag "SSL_VERIFY_CLIENT_ONCE" :value 5))) - -(defcustom ssl-program-name "openssl" - "*The program to run in a subprocess to open an SSL connection." - :group 'ssl - :type 'string) - -(defcustom ssl-program-arguments - '("s_client" - "-quiet" - "-host" host - "-port" service - "-verify" (int-to-string ssl-certificate-verification-policy) - "-CApath" ssl-certificate-directory - ) - "*Arguments that should be passed to the program `ssl-program-name'. -This should be used if your SSL program needs command line switches to -specify any behaviour (certificate file locations, etc). -The special symbols 'host and 'port may be used in the list of arguments -and will be replaced with the hostname and service/port that will be connected -to." - :group 'ssl - :type 'list) - -(defun ssl-certificate-information (der) - "Return an assoc list of information about a certificate in DER format." - (let ((certificate (concat "-----BEGIN CERTIFICATE-----\n" - (base64-encode-string der) - "\n-----END CERTIFICATE-----\n")) - (exit-code 0)) - (save-excursion - (set-buffer (get-buffer-create " *openssl*")) - (erase-buffer) - (insert certificate) - (setq exit-code (condition-case () - (call-process-region (point-min) (point-max) - ssl-program-name - t (list (current-buffer) nil) t - "x509" - "-subject" ; Print the subject DN - "-issuer" ; Print the issuer DN - "-dates" ; Both before and after dates - "-serial" ; print out serial number - "-noout" ; Don't spit out the certificate - ) - (error -1))) - (if (/= exit-code 0) - nil - (let ((vals nil)) - (goto-char (point-min)) - (while (re-search-forward "^\\([^=\n\r]+\\)\\s *=\\s *\\(.*\\)" nil t) - (push (cons (match-string 1) (match-string 2)) vals)) - vals))))) - -(defun ssl-accept-ca-certificate () - "Ask if the user is willing to accept a new CA certificate. The buffer-name -should be the intended name of the certificate, and the buffer should probably -be in DER encoding" - ;; TODO, check if it is really new or if we already know it - (let* ((process-connection-type nil) - (tmpbuf (generate-new-buffer "X509 CA Certificate Information")) - (response (save-excursion - (and (eq 0 - (apply 'call-process-region - (point-min) (point-max) - ssl-view-certificate-program-name - nil tmpbuf t - ssl-view-certificate-program-arguments)) - (switch-to-buffer tmpbuf) - (goto-char (point-min)) - (or (recenter) t) - (yes-or-no-p - "Accept this CA to vouch for secure server identities? ") - (kill-buffer tmpbuf))))) - (if (not response) - nil - (if (not (file-directory-p ssl-certificate-directory)) - (make-directory ssl-certificate-directory)) - (case ssl-certificate-directory-style - (ssleay - (base64-encode-region (point-min) (point-max)) - (goto-char (point-min)) - (insert "-----BEGIN CERTIFICATE-----\n") - (goto-char (point-max)) - (insert "-----END CERTIFICATE-----\n") - (let ((f (expand-file-name - (concat (file-name-sans-extension (buffer-name)) ".pem") - ssl-certificate-directory))) - (write-file f) - (call-process ssl-rehash-program-name - nil nil nil - (expand-file-name ssl-certificate-directory)))))))) - -(defun open-ssl-stream (name buffer host service) - "Open a SSL connection for a service to a host. -Returns a subprocess-object to represent the connection. -Input and output work as for subprocesses; `delete-process' closes it. -Args are NAME BUFFER HOST SERVICE. -NAME is name for process. It is modified if necessary to make it unique. -BUFFER is the buffer (or buffer-name) to associate with the process. - Process output goes at end of that buffer, unless you specify - an output stream or filter function to handle the output. - BUFFER may be also nil, meaning that this process is not associated - with any buffer -Third arg is name of the host to connect to, or its IP address. -Fourth arg SERVICE is name of the service desired, or an integer -specifying a port number to connect to." - (if (integerp service) (setq service (int-to-string service))) - (let* ((process-connection-type nil) - (port service) - (proc (eval - (` - (start-process name buffer ssl-program-name - (,@ ssl-program-arguments)))))) - (process-kill-without-query proc) - proc)) - -(provide 'ssl) diff --git a/contrib/timer.el b/contrib/timer.el deleted file mode 100644 index 70d9940..0000000 --- a/contrib/timer.el +++ /dev/null @@ -1,308 +0,0 @@ -;;; timer.el --- run a function with args at some time in future. - -;; Copyright (C) 1996 Free Software Foundation, Inc. - -;; Maintainer: FSF - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;; This package gives you the capability to run Emacs Lisp commands at -;; specified times in the future, either as one-shots or periodically. - -;;; Code: - -(require 'itimer) - -(fset 'timer-create 'make-itimer) - -(fset 'timerp 'itimerp) - -;(defvar timer-idle-list nil -; "List of active idle-time timers in order of increasing time") -(defvaralias 'timer-idle-list 'itimer-list) -(defvaralias 'timer-list 'itimer-list) - - -(defun timer-set-time (timer time &optional delta) - "Set the trigger time of TIMER to TIME. -TIME must be in the internal format returned by, e.g., `current-time'. -If optional third argument DELTA is a non-zero integer, make the timer -fire repeatedly that many seconds apart." - (set-itimer-value timer (itimer-time-difference time (current-time))) - (and delta (check-nonnegative-number delta)) - (and delta (set-itimer-restart timer delta)) - timer) - -(defun timer-set-idle-time (timer secs &optional repeat) - "Set the trigger idle time of TIMER to SECS. -If optional third argument REPEAT is non-nil, make the timer -fire each time Emacs is idle for that many seconds." - (set-itimer-is-idle timer t) - (set-itimer-value timer secs) - (when repeat - (set-itimer-restart timer secs)) - timer) - -(defun timer-relative-time (time secs &optional usecs) - "Advance TIME by SECS seconds and optionally USECS microseconds. -SECS may be a fraction." - (let ((high (car time)) - (low (if (consp (cdr time)) (nth 1 time) (cdr time))) - (micro (if (numberp (car-safe (cdr-safe (cdr time)))) - (nth 2 time) - 0))) - ;; Add - (if usecs (setq micro (+ micro usecs))) - (if (floatp secs) - (setq micro (+ micro (floor (* 1000000 (- secs (floor secs))))))) - (setq low (+ low (floor secs))) - - ;; Normalize - (setq low (+ low (/ micro 1000000))) - (setq micro (mod micro 1000000)) - (setq high (+ high (/ low 65536))) - (setq low (logand low 65535)) - - (list high low (and (/= micro 0) micro)))) - -(defun timer-inc-time (timer secs &optional usecs) - "Increment the time set in TIMER by SECS seconds and USECS microseconds. -SECS may be a fraction." - (let ((time (itimer-value timer))) - (setq time (+ time secs (if (and usecs (fboundp 'lisp-float-type)) - (/ usecs (float 1000000)) - 0))) - (set-itimer-value timer time))) - -(defun timer-set-time-with-usecs (timer time usecs &optional delta) - "Set the trigger time of TIMER to TIME. -TIME must be in the internal format returned by, e.g., `current-time'. -If optional third argument DELTA is a non-zero integer, make the timer -fire repeatedly that many seconds apart." - (let ((list (list nil nil nil))) - (setcar list (car time)) - (setcar (nthcdr 1 list) (if (consp (cdr time)) - (car (cdr time)) - (cdr time))) - (setcar (nthcdr 2 list) usecs) - (set-itimer-value timer (itimer-time-difference list (current-time))) - (set-itimer-restart timer delta) - timer)) - -(defun timer-set-function (timer function &optional args) - "Make TIMER call FUNCTION with optional ARGS when triggering." - (set-itimer-function timer function) - (set-itimer-function-arguments timer args) - (set-itimer-uses-arguments timer t) - timer) - -(defun timer-activate (timer) - "Put TIMER on the list of active timers." - (activate-itimer timer)) - -(defun timer-activate-when-idle (timer) - "Arrange to activate TIMER whenever Emacs is next idle." - (set-itimer-is-idle timer t) - ;(set-itimer-uses-arguments timer nil) - ;(unless (memq timer timer-idle-list) - ;(setq timer-idle-list (cons timer timer-idle-list))) - (activate-itimer timer)) - -;; can't do this, different kind of timer -;;(defalias 'disable-timeout 'cancel-timer) - -(defun cancel-timer (timer) - "Remove TIMER from the list of active timers." - ;(setq timer-idle-list (delq timer timer-idle-list)) - (delete-itimer timer)) - -(defun cancel-function-timers (function) - "Cancel all timers scheduled by `run-at-time' which would run FUNCTION." - (interactive "aCancel timers of function: ") - (let ((p itimer-list)) - (while p - (if (eq function (itimer-function p)) - (progn - (setq p (cdr p)) - (delete-itimer (car p))) - (setq p (cdr p)))))) - -;;;###autoload -(defun run-at-time (time repeat function &rest args) - "Perform an action after a delay of SECS seconds. -Repeat the action every REPEAT seconds, if REPEAT is non-nil. -TIME should be a string like \"11:23pm\", nil meaning now, a number of seconds -from now, or a value from `encode-time'. -REPEAT may be an integer or floating point number. -The action is to call FUNCTION with arguments ARGS. - -This function returns a timer object which you can use in `cancel-timer'." - (interactive "sRun at time: \nNRepeat interval: \naFunction: ") - - ;; Special case: nil means "now" and is useful when repeating. - (if (null time) - (setq time (current-time))) - - ;; Handle numbers as relative times in seconds. - (if (numberp time) - (setq time (timer-relative-time (current-time) time))) - - ;; Handle relative times like "2 hours and 35 minutes" - (if (stringp time) - (let ((secs (timer-duration time))) - (if secs - (setq time (timer-relative-time (current-time) secs))))) - - ;; Handle "11:23pm" and the like. Interpret it as meaning today - ;; which admittedly is rather stupid if we have passed that time - ;; already. (Though only Emacs hackers hack Emacs at that time.) - (if (stringp time) - (progn - (require 'diary-lib) - (let ((hhmm (diary-entry-time time)) - (now (decode-time))) - (if (>= hhmm 0) - (setq time - (encode-time 0 (% hhmm 100) (/ hhmm 100) (nth 3 now) - (nth 4 now) (nth 5 now) (nth 8 now))))))) - - (or (consp time) - (error "Invalid time format")) - - (or (null repeat) - (numberp repeat) - (error "Invalid repetition interval")) - - (let ((timer (timer-create))) - (timer-set-time timer time repeat) - (timer-set-function timer function args) - (timer-activate timer) - timer)) - -;;;###autoload -(defun run-with-timer (secs repeat function &rest args) - "Perform an action after a delay of SECS seconds. -Repeat the action every REPEAT seconds, if REPEAT is non-nil. -SECS and REPEAT may be integers or floating point numbers. -The action is to call FUNCTION with arguments ARGS. - -This function returns a timer object which you can use in `cancel-timer'." - (interactive "sRun after delay (seconds): \nNRepeat interval: \naFunction: ") - (apply 'run-at-time secs repeat function args)) - -;;;###autoload -(defun run-with-idle-timer (secs repeat function &rest args) - "Perform an action the next time Emacs is idle for SECS seconds. -If REPEAT is non-nil, do this each time Emacs is idle for SECS seconds. -SECS may be an integer or a floating point number. -The action is to call FUNCTION with arguments ARGS. - -This function returns a timer object which you can use in `cancel-timer'." - (interactive - (list (read-from-minibuffer "Run after idle (seconds): " nil nil t) - (y-or-n-p "Repeat each time Emacs is idle? ") - (intern (completing-read "Function: " obarray 'fboundp t)))) - (let ((timer (timer-create))) - (timer-set-function timer function args) - (timer-set-idle-time timer secs repeat) - (timer-activate-when-idle timer) - timer)) - -(defun with-timeout-handler (tag) - (throw tag 'timeout)) - -;;;###autoload (put 'with-timeout 'lisp-indent-function 1) - -;;;###autoload -(defmacro with-timeout (list &rest body) - "Run BODY, but if it doesn't finish in SECONDS seconds, give up. -If we give up, we run the TIMEOUT-FORMS and return the value of the last one. -The call should look like: - (with-timeout (SECONDS TIMEOUT-FORMS...) BODY...) -The timeout is checked whenever Emacs waits for some kind of external -event \(such as keyboard input, input from subprocesses, or a certain time); -if the program loops without waiting in any way, the timeout will not -be detected." - (let ((seconds (car list)) - (timeout-forms (cdr list))) - `(let ((with-timeout-tag (cons nil nil)) - with-timeout-value with-timeout-timer) - (if (catch with-timeout-tag - (progn - (setq with-timeout-timer - (run-with-timer ,seconds nil - 'with-timeout-handler - with-timeout-tag)) - (setq with-timeout-value (progn . ,body)) - nil)) - (progn . ,timeout-forms) - (cancel-timer with-timeout-timer) - with-timeout-value)))) - -(defun y-or-n-p-with-timeout (prompt seconds default-value) - "Like (y-or-n-p PROMPT), with a timeout. -If the user does not answer after SECONDS seconds, return DEFAULT-VALUE." - (with-timeout (seconds default-value) - (y-or-n-p prompt))) - -(defvar timer-duration-words - (list (cons "microsec" 0.000001) - (cons "microsecond" 0.000001) - (cons "millisec" 0.001) - (cons "millisecond" 0.001) - (cons "sec" 1) - (cons "second" 1) - (cons "min" 60) - (cons "minute" 60) - (cons "hour" (* 60 60)) - (cons "day" (* 24 60 60)) - (cons "week" (* 7 24 60 60)) - (cons "fortnight" (* 14 24 60 60)) - (cons "month" (* 30 24 60 60)) ; Approximation - (cons "year" (* 365.25 24 60 60)) ; Approximation - ) - "Alist mapping temporal words to durations in seconds") - -(defun timer-duration (string) - "Return number of seconds specified by STRING, or nil if parsing fails." - (let ((secs 0) - (start 0) - (case-fold-search t)) - (while (string-match - "[ \t]*\\([0-9.]+\\)?[ \t]*\\([a-z]+[a-rt-z]\\)s?[ \t]*" - string start) - (let ((count (if (match-beginning 1) - (string-to-number (match-string 1 string)) - 1)) - (itemsize (cdr (assoc (match-string 2 string) - timer-duration-words)))) - (if itemsize - (setq start (match-end 0) - secs (+ secs (* count itemsize))) - (setq secs nil - start (length string))))) - (if (= start (length string)) - secs - (if (string-match "\\`[0-9.]+\\'" string) - (string-to-number string))))) - -(provide 'timer) - -;;; timer.el ends here diff --git a/contrib/vcard.el b/contrib/vcard.el deleted file mode 100644 index 22f032c..0000000 --- a/contrib/vcard.el +++ /dev/null @@ -1,308 +0,0 @@ -;;; vcard.el --- vcard parsing and display routines - -;; Copyright (C) 1997 Noah S. Friedman - -;; Author: Noah Friedman -;; Maintainer: friedman@splode.com -;; Keywords: extensions -;; Created: 1997-09-27 - -;; This program 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 program 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 this program; if not, you can either send email to this -;; program's maintainer or write to: The Free Software Foundation, -;; Inc.; 59 Temple Place, Suite 330; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;; The display routines here are just an example. The primitives in the -;; first section can be used to construct other vcard formatters. - -;;; Code: - -(defvar vcard-standard-filters '(vcard-filter-html) - "*Standard list of filters to apply to parsed vcard data. -These filters are applied sequentially to vcard data records when -the function `vcard-standard-filter' is supplied as the second argument to -`vcard-parse-string'.") - -(defun vcard-parse-string (raw &optional filter) - "Parse RAW vcard data as a string, and return an alist representing data. - -If the optional function FILTER is specified, apply that filter to the -data record of each key before splitting fields. Filters should accept -two arguments: the key and the data. They are expected to operate on -\(and return\) a modified data value. - -Vcard data is normally in the form - - begin: vcard - key1: field - key2;subkey1: field - key2;subkey2: field1;field2;field3 - end: vcard - -\(Whitespace after the colon separating the key and field is optional.\) -If supplied to this function an alist of the form - - ((\"key1\" \"field\") - (\"key2\" - (\"subkey2\" \"field1\" \"field2\" \"field3\") - (\"subkey1\" \"field\"))) - -would be returned." - (save-match-data - (let ((raw-pos 0) - (vcard-data nil) - key data) - (string-match "^[ \t]*begin:[ \t]*vcard[ \t]*[\r\n]+" raw raw-pos) - (setq raw-pos (match-end 0)) - (while (and (< raw-pos (length raw)) - (string-match - "^[ \t]*\\([^:]+\\):[ \t]*\\(.*\\)[ \t]*[\n\r]+" - raw raw-pos)) - (setq key (vcard-matching-substring 1 raw)) - (setq data (vcard-matching-substring 2 raw)) - (setq raw-pos (match-end 0)) - (cond - ((string= key "end") - (setq raw-pos (length raw))) - (t - (and filter - (setq data (funcall filter key data))) - (setq vcard-data - (vcard-set-alist-slot vcard-data - (vcard-split-string key ";") - (vcard-split-string data ";")))))) - (nreverse vcard-data)))) - -(defun vcard-ref (key vcard-data) - "Return the vcard data associated with KEY in VCARD-DATA. -Key may be a list of nested keys or a single string of colon-separated -keys." - (cond ((listp key) - (vcard-alist-assoc key vcard-data)) - ((and (stringp key) - (save-match-data - (string-match ";" key))) - (vcard-alist-assoc (vcard-split-string key ";") vcard-data)) - ((stringp key) - (cdr (assoc key vcard-data))))) - - -;;; Vcard data filters. - -;; These receive both the key and data, but are expected to operate on (and -;; return) just the data. -;; -;; There is probably no overwhelming need for this, except that some lusers -;; put HTML in their vcards under the misguided notion that it's a standard -;; feature of vcards just because Netscape supports this feature. (Or -;; perhaps those lusers just don't care that their vcards look like shit in -;; every other MUA). -;; -;; On the other hand, perhaps someone will devise some other use for these -;; filters, such as noticing common phone number formats and re-formatting -;; them to fit personal preferences. - -(defun vcard-filter-apply-filter-list (filter-list key data) - (while filter-list - (setq data (funcall (car filter-list) key data)) - (setq filter-list (cdr filter-list))) - data) - -(defun vcard-standard-filter (key data) - (vcard-filter-apply-filter-list vcard-standard-filters key data)) - -(defun vcard-filter-html (key data) - (save-match-data - (while (string-match "<[^<>\n]+>" data) - (setq data (concat (substring data 0 (match-beginning 0)) - (substring data (match-end 0))))) - data)) - - -;;; Utility routines. - -;; This does most of the dirty work of key lookup for vcard-ref. -(defun vcard-alist-assoc (keys alist) - (while (and keys alist) - (setq alist (cdr (assoc (car keys) alist))) - (setq keys (cdr keys))) - alist) - -;; In ALIST, set KEY-LIST's value to VALUE, and return new value of ALIST. -;; KEY-LIST should be a list of nested keys, if ALIST is an alist of alists. -;; If any key is not present in an alist, the key and value pair will be -;; inserted into the parent alist. -(defun vcard-set-alist-slot (alist key-list value) - (let* ((key (car key-list)) - (elt (assoc key alist))) - (setq key-list (cdr key-list)) - (cond ((and (cdr elt) key-list) - (vcard-set-alist-slot (cdr elt) key-list value)) - ((and elt key-list) - (setcdr elt (vcard-set-alist-slot nil key-list value))) - (elt (setcdr elt value)) - (t - (let ((new)) - (setq key-list (nreverse (cons key key-list))) - (while key-list - (if new - (setq new (cons (car key-list) (cons new nil))) - (setq new (cons (car key-list) value))) - (setq key-list (cdr key-list))) - - (cond ((null alist) - (setq alist (cons new nil))) - (t - (setcdr alist (cons (car alist) (cdr alist))) - (setcar alist new)))))) - alist)) - -;; Return substring matched by last search. -;; N specifies which match data pair to use -;; Value is nil if there is no Nth match. -;; If STRING is not specified, the current buffer is used. -(defun vcard-matching-substring (n &optional string) - (if (match-beginning n) - (if string - (substring string (match-beginning n) (match-end n)) - (buffer-substring (match-beginning n) (match-end n))))) - -;; Split STRING at occurences of SEPARATOR. Return a list of substrings. -;; SEPARATOR can be any regexp, but anything matching the separator will -;; never appear in any of the returned substrings. -(defun vcard-split-string (string separator) - (let* ((list nil) - (pos 0)) - (save-match-data - (while (string-match separator string pos) - (setq list (cons (substring string pos (match-beginning 0)) list)) - (setq pos (match-end 0))) - (nreverse (cons (substring string pos) list))))) - -(defun vcard-flatten (l) - (if (consp l) - (apply 'nconc (mapcar 'vcard-flatten l)) - (list l))) - - -;;; Sample formatting routines. - -(defun vcard-format-box (vcard-data) - "Like `vcard-format-string', but put an ascii box around text." - (let* ((lines (vcard-format-lines vcard-data)) - (len (vcard-format-max-length lines)) - (edge (concat "\n+" (make-string (+ len 2) ?-) "+\n")) - (line-fmt (format "| %%-%ds |" len)) - (formatted-lines - (mapconcat (function (lambda (s) (format line-fmt s))) lines "\n"))) - (if (string= formatted-lines "") - formatted-lines - (concat edge formatted-lines edge)))) - -(defun vcard-format-string (vcard-data) - "Format VCARD-DATA into a string suitable for presentation. -VCARD-DATA should be a parsed vcard alist. The result is a string -with formatted vcard information which can be inserted into a mime -presentation buffer." - (mapconcat 'identity (vcard-format-lines vcard-data) "\n")) - -(defun vcard-format-lines (vcard-data) - (let* ((name (vcard-format-get-name vcard-data)) - (title (vcard-format-ref "title" vcard-data)) - (org (vcard-format-ref "org" vcard-data)) - (addr (vcard-format-get-address vcard-data)) - (tel (vcard-format-get-telephone vcard-data)) - (lines (delete nil (vcard-flatten (list name title org addr)))) - (col-template (format "%%-%ds%%s" - (vcard-format-offset lines tel))) - (l lines)) - (while tel - (setcar l (format col-template (car l) (car tel))) - ;; If we stripped away too many nil slots from l, add empty strings - ;; back in so setcar above will work on next iteration. - (and (cdr tel) - (null (cdr l)) - (setcdr l (cons "" nil))) - (setq l (cdr l)) - (setq tel (cdr tel))) - lines)) - - -(defun vcard-format-get-name (vcard-data) - (let ((name (vcard-format-ref "fn" vcard-data)) - (email (or (vcard-format-ref '("email" "internet") vcard-data) - (vcard-format-ref "email" vcard-data)))) - (if email - (format "%s <%s>" name email) - name))) - -(defun vcard-format-get-address (vcard-data) - (let* ((addr-raw (or (vcard-format-ref '("adr" "dom") vcard-data) - (vcard-format-ref "adr" vcard-data))) - (addr (if (consp addr-raw) - addr-raw - (list addr-raw))) - (street (delete "" (list (nth 0 addr) (nth 1 addr) (nth 2 addr)))) - (city-list (delete "" (nthcdr 3 addr))) - (city (cond ((null (car city-list)) nil) - ((cdr city-list) - (format "%s, %s" - (car city-list) - (mapconcat 'identity (cdr city-list) " "))) - (t (car city-list))))) - (delete nil - (if city - (append street (list city)) - street)))) - -(defun vcard-format-get-telephone (vcard-data) - (delete nil - (mapcar (function (lambda (x) - (let ((result (vcard-format-ref (car x) - vcard-data))) - (and result - (concat (cdr x) result))))) - '((("tel" "work") . "Work: ") - (("tel" "home") . "Home: ") - (("tel" "fax") . "Fax: "))))) - -(defun vcard-format-ref (key vcard-data) - (setq key (vcard-ref key vcard-data)) - (or (cdr key) - (setq key (car key))) - (and (stringp key) - (string= key "") - (setq key nil)) - key) - -(defun vcard-format-offset (row1 row2 &optional maxwidth) - (or maxwidth (setq maxwidth (frame-width))) - (let ((max1 (vcard-format-max-length row1)) - (max2 (vcard-format-max-length row2))) - (+ max1 (min 5 (max 1 (- maxwidth (+ max1 max2))))))) - -(defun vcard-format-max-length (strings) - (let ((maxlen 0) - (len 0)) - (while strings - (setq len (length (car strings))) - (setq strings (cdr strings)) - (and (> len maxlen) - (setq maxlen len))) - maxlen)) - -(provide 'vcard) - -;;; vcard.el ends here diff --git a/contrib/xml.el b/contrib/xml.el deleted file mode 100644 index d128b83..0000000 --- a/contrib/xml.el +++ /dev/null @@ -1,518 +0,0 @@ -;;; xml.el --- XML parser - -;; Copyright (C) 2000, 2001 Free Software Foundation, Inc. - -;; Author: Emmanuel Briot -;; Maintainer: Emmanuel Briot -;; Keywords: xml - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;; This file contains a full XML parser. It parses a file, and returns a list -;; that can be used internally by any other lisp file. -;; See some example in todo.el - -;;; FILE FORMAT - -;; It does not parse the DTD, if present in the XML file, but knows how to -;; ignore it. The XML file is assumed to be well-formed. In case of error, the -;; parsing stops and the XML file is shown where the parsing stopped. -;; -;; It also knows how to ignore comments, as well as the special ?xml? tag -;; in the XML file. -;; -;; The XML file should have the following format: -;; value -;; value2 -;; value3 -;; -;; Of course, the name of the nodes and attributes can be anything. There can -;; be any number of attributes (or none), as well as any number of children -;; below the nodes. -;; -;; There can be only top level node, but with any number of children below. - -;;; LIST FORMAT - -;; The functions `xml-parse-file' and `xml-parse-tag' return a list with -;; the following format: -;; -;; xml-list ::= (node node ...) -;; node ::= (tag_name attribute-list . child_node_list) -;; child_node_list ::= child_node child_node ... -;; child_node ::= node | string -;; tag_name ::= string -;; attribute_list ::= (("attribute" . "value") ("attribute" . "value") ...) -;; | nil -;; string ::= "..." -;; -;; Some macros are provided to ease the parsing of this list - -;;; Code: - -;;******************************************************************* -;;** -;;** Macros to parse the list -;;** -;;******************************************************************* - -(defmacro xml-node-name (node) - "Return the tag associated with NODE. -The tag is a lower-case symbol." - (list 'car node)) - -(defmacro xml-node-attributes (node) - "Return the list of attributes of NODE. -The list can be nil." - (list 'nth 1 node)) - -(defmacro xml-node-children (node) - "Return the list of children of NODE. -This is a list of nodes, and it can be nil." - (list 'cddr node)) - -(defun xml-get-children (node child-name) - "Return the children of NODE whose tag is CHILD-NAME. -CHILD-NAME should be a lower case symbol." - (let ((children (xml-node-children node)) - match) - (while children - (if (car children) - (if (equal (xml-node-name (car children)) child-name) - (set 'match (append match (list (car children)))))) - (set 'children (cdr children))) - match)) - -(defun xml-get-attribute (node attribute) - "Get from NODE the value of ATTRIBUTE. -An empty string is returned if the attribute was not found." - (if (xml-node-attributes node) - (let ((value (assoc attribute (xml-node-attributes node)))) - (if value - (cdr value) - "")) - "")) - -;;******************************************************************* -;;** -;;** Creating the list -;;** -;;******************************************************************* - -(defun xml-parse-file (file &optional parse-dtd) - "Parse the well-formed XML FILE. -If FILE is already edited, this will keep the buffer alive. -Returns the top node with all its children. -If PARSE-DTD is non-nil, the DTD is parsed rather than skipped." - (let ((keep)) - (if (get-file-buffer file) - (progn - (set-buffer (get-file-buffer file)) - (setq keep (point))) - (find-file file)) - - (let ((xml (xml-parse-region (point-min) - (point-max) - (current-buffer) - parse-dtd))) - (if keep - (goto-char keep) - (kill-buffer (current-buffer))) - xml))) - -(defun xml-parse-region (beg end &optional buffer parse-dtd) - "Parse the region from BEG to END in BUFFER. -If BUFFER is nil, it defaults to the current buffer. -Returns the XML list for the region, or raises an error if the region -is not a well-formed XML file. -If PARSE-DTD is non-nil, the DTD is parsed rather than skipped, -and returned as the first element of the list" - (let (xml result dtd) - (save-excursion - (if buffer - (set-buffer buffer)) - (goto-char beg) - (while (< (point) end) - (if (search-forward "<" end t) - (progn - (forward-char -1) - (if (null xml) - (progn - (set 'result (xml-parse-tag end parse-dtd)) - (cond - ((listp (car result)) - (set 'dtd (car result)) - (add-to-list 'xml (cdr result))) - (t - (add-to-list 'xml result)))) - - ;; translation of rule [1] of XML specifications - (error "XML files can have only one toplevel tag."))) - (goto-char end))) - (if parse-dtd - (cons dtd (reverse xml)) - (reverse xml))))) - - -(defun xml-parse-tag (end &optional parse-dtd) - "Parse the tag that is just in front of point. -The end tag must be found before the position END in the current buffer. -If PARSE-DTD is non-nil, the DTD of the document, if any, is parsed and -returned as the first element in the list. -Returns one of: - - a list : the matching node - - nil : the point is not looking at a tag. - - a cons cell: the first element is the DTD, the second is the node" - (cond - ;; Processing instructions (like the tag at the - ;; beginning of a document) - ((looking-at "<\\?") - (search-forward "?>" end) - (skip-chars-forward " \t\n") - (xml-parse-tag end)) - ;; Character data (CDATA) sections, in which no tag should be interpreted - ((looking-at "" end t) - (error "CDATA section does not end anywhere in the document")) - (buffer-substring-no-properties pos (match-beginning 0)))) - ;; DTD for the document - ((looking-at "" end) - (skip-chars-forward " \t\n") - (xml-parse-tag end)) - ;; end tag - ((looking-at " \t\n]+\\)") - (let* ((node-name (match-string 1)) - (children (list (intern node-name))) - (case-fold-search nil) ;; XML is case-sensitive - pos) - (goto-char (match-end 1)) - - ;; parses the attribute list - (set 'children (append children (list (xml-parse-attlist end)))) - - ;; is this an empty element ? - (if (looking-at "/>") - (progn - (forward-char 2) - (skip-chars-forward " \t\n") - (append children '(""))) - - ;; is this a valid start tag ? - (if (= (char-after) ?>) - (progn - (forward-char 1) - (skip-chars-forward " \t\n") - ;; Now check that we have the right end-tag. Note that this one might - ;; contain spaces after the tag name - (while (not (looking-at (concat ""))) - (cond - ((looking-at " (point) end) - (error "XML: End tag for %s not found before end of region." - node-name)) - children - ) - - ;; This was an invalid start tag - (error "XML: Invalid attribute list") - )))) - (t ;; This is not a tag. - (error "XML: Invalid character.")) - )) - -(defun xml-parse-attlist (end) - "Return the attribute-list that point is looking at. -The search for attributes end at the position END in the current buffer. -Leaves the point on the first non-blank character after the tag." - (let ((attlist '()) - name) - (skip-chars-forward " \t\n") - (while (looking-at "\\([a-zA-Z_:][-a-zA-Z0-9._:]*\\)[ \t\n]*=[ \t\n]*") - (set 'name (intern (match-string 1))) - (goto-char (match-end 0)) - - ;; Do we have a string between quotes (or double-quotes), - ;; or a simple word ? - (unless (looking-at "\"\\([^\"]+\\)\"") - (unless (looking-at "'\\([^\"]+\\)'") - (error "XML: Attribute values must be given between quotes."))) - - ;; Each attribute must be unique within a given element - (if (assoc name attlist) - (error "XML: each attribute must be unique within an element.")) - - (set 'attlist (append attlist - (list (cons name (match-string-no-properties 1))))) - (goto-char (match-end 0)) - (skip-chars-forward " \t\n") - (if (> (point) end) - (error "XML: end of attribute list not found before end of region.")) - ) - attlist - )) - -;;******************************************************************* -;;** -;;** The DTD (document type declaration) -;;** The following functions know how to skip or parse the DTD of -;;** a document -;;** -;;******************************************************************* - -(defun xml-skip-dtd (end) - "Skip the DTD that point is looking at. -The DTD must end before the position END in the current buffer. -The point must be just before the starting tag of the DTD. -This follows the rule [28] in the XML specifications." - (forward-char (length "") - (error "XML: invalid DTD (excepting name of the document)")) - (condition-case nil - (progn - (forward-word 1) ;; name of the document - (skip-chars-forward " \t\n") - (if (looking-at "\\[") - (re-search-forward "\\][ \t\n]*>" end) - (search-forward ">" end))) - (error (error "XML: No end to the DTD")))) - -(defun xml-parse-dtd (end) - "Parse the DTD that point is looking at. -The DTD must end before the position END in the current buffer." - (let (dtd type element end-pos) - (forward-char (length "") - (error "XML: invalid DTD (excepting name of the document)")) - - ;; Get the name of the document - (looking-at "\\sw+") - (set 'dtd (list 'dtd (match-string-no-properties 0))) - (goto-char (match-end 0)) - - (skip-chars-forward " \t\n") - - ;; External DTDs => don't know how to handle them yet - (if (looking-at "SYSTEM") - (error "XML: Don't know how to handle external DTDs.")) - - (if (not (= (char-after) ?\[)) - (error "XML: Unknown declaration in the DTD.")) - - ;; Parse the rest of the DTD - (forward-char 1) - (while (and (not (looking-at "[ \t\n]*\\]")) - (<= (point) end)) - (cond - - ;; Translation of rule [45] of XML specifications - ((looking-at - "[\t \n]*]+\\)>") - - (setq element (intern (match-string-no-properties 1)) - type (match-string-no-properties 2)) - (set 'end-pos (match-end 0)) - - ;; Translation of rule [46] of XML specifications - (cond - ((string-match "^EMPTY[ \t\n]*$" type) ;; empty declaration - (set 'type 'empty)) - ((string-match "^ANY[ \t\n]*$" type) ;; any type of contents - (set 'type 'any)) - ((string-match "^(\\(.*\\))[ \t\n]*$" type) ;; children ([47]) - (set 'type (xml-parse-elem-type (match-string-no-properties 1 type)))) - ((string-match "^%[^;]+;[ \t\n]*$" type) ;; substitution - nil) - (t - (error "XML: Invalid element type in the DTD"))) - - ;; rule [45]: the element declaration must be unique - (if (assoc element dtd) - (error "XML: elements declaration must be unique in a DTD (<%s>)." - (symbol-name element))) - - ;; Store the element in the DTD - (set 'dtd (append dtd (list (list element type)))) - (goto-char end-pos) - ) - - - (t - (error "XML: Invalid DTD item")) - ) - ) - - ;; Skip the end of the DTD - (search-forward ">" end) - dtd - )) - - -(defun xml-parse-elem-type (string) - "Convert a STRING for an element type into an elisp structure." - - (let (elem modifier) - (if (string-match "(\\([^)]+\\))\\([+*?]?\\)" string) - (progn - (setq elem (match-string 1 string) - modifier (match-string 2 string)) - (if (string-match "|" elem) - (set 'elem (append '(choice) - (mapcar 'xml-parse-elem-type - (split-string elem "|")))) - (if (string-match "," elem) - (set 'elem (append '(seq) - (mapcar 'xml-parse-elem-type - (split-string elem ",")))) - ))) - (if (string-match "[ \t\n]*\\([^+*?]+\\)\\([+*?]?\\)" string) - (setq elem (match-string 1 string) - modifier (match-string 2 string)))) - - (if (and (stringp elem) - (string= elem "#PCDATA")) - (set 'elem 'pcdata)) - - (cond - ((string= modifier "+") - (list '+ elem)) - ((string= modifier "*") - (list '* elem)) - ((string= modifier "?") - (list '? elem)) - (t - elem)))) - - -;;******************************************************************* -;;** -;;** Substituting special XML sequences -;;** -;;******************************************************************* - -(defun xml-substitute-special (string) - "Return STRING, after subsituting special XML sequences." - (while (string-match "&" string) - (set 'string (replace-match "&" t nil string))) - (while (string-match "<" string) - (set 'string (replace-match "<" t nil string))) - (while (string-match ">" string) - (set 'string (replace-match ">" t nil string))) - (while (string-match "'" string) - (set 'string (replace-match "'" t nil string))) - (while (string-match """ string) - (set 'string (replace-match "\"" t nil string))) - string) - -;;******************************************************************* -;;** -;;** Printing a tree. -;;** This function is intended mainly for debugging purposes. -;;** -;;******************************************************************* - -(defun xml-debug-print (xml) - (while xml - (xml-debug-print-internal (car xml) "") - (set 'xml (cdr xml))) - ) - -(defun xml-debug-print-internal (xml &optional indent-string) - "Outputs the XML tree in the current buffer. -The first line indented with INDENT-STRING." - (let ((tree xml) - attlist) - (unless indent-string - (set 'indent-string "")) - - (insert indent-string "<" (symbol-name (xml-node-name tree))) - - ;; output the attribute list - (set 'attlist (xml-node-attributes tree)) - (while attlist - (insert " ") - (insert (symbol-name (caar attlist)) "=\"" (cdar attlist) "\"") - (set 'attlist (cdr attlist))) - - (insert ">") - - (set 'tree (xml-node-children tree)) - - ;; output the children - (while tree - (cond - ((listp (car tree)) - (insert "\n") - (xml-debug-print-internal (car tree) (concat indent-string " ")) - ) - ((stringp (car tree)) - (insert (car tree)) - ) - (t - (error "Invalid XML tree"))) - (set 'tree (cdr tree)) - ) - - (insert "\n" indent-string - "") - )) - -(provide 'xml) - -;;; xml.el ends here diff --git a/etc/Makefile.in b/etc/Makefile.in deleted file mode 100644 index f81c462..0000000 --- a/etc/Makefile.in +++ /dev/null @@ -1,47 +0,0 @@ -datadir = @datadir@ -infodir = @infodir@ -prefix = @prefix@ -srcdir = @srcdir@ -subdir = etc -top_srcdir = @top_srcdir@ -lispdir = @lispdir@ -etcdir = @etcdir@ - -VPATH=$(srcdir) -EMACS=@EMACS@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -SHELL = /bin/sh - -all: - -install: - $(SHELL) $(top_srcdir)/mkinstalldirs $(etcdir) - cd $(srcdir) \ - && for p in gnus-tut.txt; do \ - echo " $(INSTALL_DATA) $$p $(etcdir)/$$p"; \ - $(INSTALL_DATA) $$p $(etcdir)/$$p; \ - done - $(SHELL) $(top_srcdir)/mkinstalldirs $(etcdir)/gnus - cd $(srcdir) \ - && for p in gnus/*.xpm gnus/*.pbm gnus/*.xbm gnus/x-splash; do \ - echo " $(INSTALL_DATA) $$p $(etcdir)/$$p"; \ - $(INSTALL_DATA) $$p $(etcdir)/$$p; \ - done - $(SHELL) $(top_srcdir)/mkinstalldirs $(etcdir)/smilies - cd $(srcdir) \ - && for p in smilies/*.pbm; do \ - echo " $(INSTALL_DATA) $$p $(etcdir)/$$p"; \ - $(INSTALL_DATA) $$p $(etcdir)/$$p; \ - done - -Makefile: $(srcdir)/Makefile.in ../config.status - cd .. \ - && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status - -distclean: - rm -f *~ Makefile - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/etc/gnus-tut.txt b/etc/gnus-tut.txt deleted file mode 100644 index 94e9500..0000000 --- a/etc/gnus-tut.txt +++ /dev/null @@ -1,294 +0,0 @@ -From lars Thu Feb 23 23:20:38 1995 -From: larsi@ifi.uio.no (ding) -Date: Fri Feb 24 13:40:45 1995 -Subject: So you want to use the new Gnus -Message-ID: - -Actually, since you are reading this, chances are you are already -using the new Gnus. Congratulations. - -This entire newsgroup you are reading is, in fact, no real newsgroup -at all, in the traditional sense. It is an example of one of the -"foreign" select methods that Gnus may use. - -The text you are now reading is stored in the "etc" directory with the -rest of the Emacs sources. You are using the "nndoc" backend for -accessing it. Scary, isn't it? - -This isn't the real documentation. `M-x info', `m gnus ' to read -that. This "newsgroup" is intended as a kinder, gentler way of getting -people started. - -Gnus is a rewrite of GNUS 4.1, written by Masanobu Umeda. The rewrite -was done by moi, yours truly, your humble servant, Lars Magne -Ingebrigtsen. If you have a WWW browser, you can investigate to your -heart's delight at . - -;; Copyright (C) 1995 Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -From lars Thu Feb 23 23:20:38 1995 -From: larsi@ifi.uio.no (ding) -Date: Fri Feb 24 13:40:45 1995 -Subject: Starting up -Message-ID: - -If you are having problems with Gnus not finding your server, you have -to set `gnus-select-method'. A "method" is a way of specifying *how* -the news is to be found, and from *where*. - -Say you want to read news from you local, friendly nntp server -"news.my.local.server". - -(setq gnus-select-method '(nntp "news.my.local.server")) - -Quite easy, huh? - -From the news spool: - -(setq gnus-select-method '(nnspool "")) - -From your mh-e spool: - -(setq gnus-select-method '(nnmh "")) - -There's a whole bunch of other methods for reading mail and news, see -the "Foreign groups" article for that. - - -From lars Thu Feb 23 23:20:38 1995 -From: larsi@ifi.uio.no (ding) -Date: Fri Feb 24 13:40:45 1995 -Subject: Where are all the groups, then? -Message-ID: - -If this is the first time you have used a newsreader, you won't have a -.newsrc file. This means that Gnus will think that all the newsgroups -on the server are "new", and kill them all. - -If you have a .newsrc file, the new groups will be processed with the -function in the `gnus-subscribe-newsgroup-method' variable, which is -`gnus-subscribe-zombies' by default. - -This means that all the groups have been made into "zombies" - not -quite dead, but not exactly alive, either. - -Jump back to the *Group* buffer, and type `A z' to list all the zombie -groups. Look though the list, and subscribe to the groups you want to -read by pressing `u' on the one you think look interesting. - -If all the groups have been killed, type `A k' to list all the killed -groups. Subscribe to them the same way. - -When you are satisfied, press `S z' to kill all the zombie groups. - -Now you should have a nice list of all groups you are interested in. - -(If you later want to subscribe to more groups, press `A k' to -list all the kill groups, and repeat. You can also type `U' and be -prompted for groups to subscribe to.) - - -From lars Thu Feb 23 23:20:38 1995 -From: larsi@ifi.uio.no (ding) -Date: Fri Feb 24 13:40:45 1995 -Subject: I want to read my mail! -Message-ID: - -Yes, Virginia, you can read mail with Gnus. - -First you have to decide which mail backend you want to use. You have -nnml, which is a one-file-one-mail backend, which is quite nice, but -apt to make your systems administrator go crazy and come after you -with a shotgun. - -nnmbox uses a Unix mail box to store mail. Nice, but slow. - -nnmh uses mh-e folders, which is also a one-file-one-mail thingie, but -slower than nnml. (It doesn't support NOV files.) - -So if you want to go with nnmbox, you can simply say: - -(setq gnus-secondary-select-methods '((nnmbox ""))) - -(The same for the other methods, kind of.) - -You should also set `nnmail-split-methods' to something sensible: - -(setq nnmail-split-methods - '(("mail.junk" "From:.*Lars") - ("mail.misc ""))) - -This will put all mail from me in you junk mail group, and the rest in -"mail.misc". - -These groups will be subscribe the same way as the normal groups, so -you will probably find them among the zombie groups after you set -these variables and re-start Gnus. - - -From lars Thu Feb 23 23:20:38 1995 -From: larsi@ifi.uio.no (ding) -Date: Fri Feb 24 13:40:45 1995 -Subject: Foreign newsgroups -Message-ID: - -These are groups that do not come from `gnus-select-method'. - -Say you want to read "alt.furniture.couches" from "news.funet.fi". You -can then either type `B news.funet.fi ' to browse that server and -subscribe to that group, or you can type -`G m alt.furniture.couchesnntpnews.funet.fi', if you -like to type a lot. - -If you want to read a directory as a newsgroup, you can create an -nndir group, much the same way. There's a shorthand for that, -though. If, for instance, you want to read the (ding) list archives, -you could type `G d /ftp '. - -There's lots more to know about foreign groups, but you have to read -the info pages to find out more. - - -From lars Thu Feb 23 23:20:38 1995 -From: larsi@ifi.uio.no (ding) -Date: Fri Feb 24 13:40:45 1995 -Subject: Low level changes in GNUS, or, Wrong type argument: stringp, nil -Message-ID: - -Gnus really isn't GNUS, even though it looks like it. If you scrape -the surface, you'll find that most things have changed. - -This means that old code that relies on GNUS internals will fail. - -In particular, `gnus-newsrc-hashtb', `gnus-newsrc-assoc', -`gnus-killed-list', the `nntp-header-' macros and the display formats -have all changed. If you have some code lying around that depend on -these, or change these, you'll have to re-write your code. - -Old hilit19 code does not work at all. In fact, you should probably -remove all hilit code from all the Gnus hooks -(`gnus-group-prepare-hook', `gnus-summary-prepare-hook' and -`gnus-summary-article-hook'). (Well, at the very least the first -two.) Gnus provides various integrated functions for highlighting, -which are both faster and more accurated. - -There is absolutely no chance, whatsoever, of getting Gnus to work -with Emacs 18. It won't even work on Emacsen older than Emacs -19.30/XEmacs 19.13. Upgrade your Emacs or die. - - -From lars Thu Feb 23 23:20:38 1995 -From: larsi@ifi.uio.no (ding) -Date: Fri Feb 24 13:40:45 1995 -Subject: How do I re-scan my mail groups? -Message-ID: - -Reading the active file from the nntp server is a drag. - -Just press `M-g' on the mail groups, and they will be re-scanned. - -You can also re-scan all the mail groups by putting them on level 1 -(`S l 1'), and saying `1 g' to re-scan all level 1 groups. - - -From lars Thu Feb 23 23:20:38 1995 -From: larsi@ifi.uio.no (ding) -Date: Fri Feb 24 13:40:45 1995 -Subject: How do I set up virtual newsgroups? -Message-ID: - -Virtual newsgroups are collections of other newsgroups. Why people -want this is beyond me, but here goes: - -Create the group by saying - -`M-a my.virtual.newsgroupnnvirtual^rec\.aquaria\.*' - -This will create the group "nnvirtual:my.virtual.newsgroup", which -will collect all articles from all the groups in the "rec.aquaria" -hierarchy. - -If you want to edit the regular expression, just type `M-e' on the -group line. - -Note that all the groups that are part of the virtual group have to be -alive. This means that the cannot, absolutely not, be zombie or -killed. They can be unsubscribed; that's no problem. - -You can combine groups from different servers in the same virtual -newsgroup, something that may actually be useful. Say you have the -group "comp.headers" on the server "news.server.no" and the same group -on "news.server.edu". If people have posted articles with Distribution -headers that stop propagation of their articles, combining these two -newsgroups into one virtual newsgroup should give you a better view of -what's going on. - -One caveat, though: The virtual group article numbers from the first -source group (group A) will always be lower than the article numbers -from the second (group B). This means that Gnus will believe that -articles from group A are older than articles from group B. Threading -will lessen these problems, but it might be a good idea to sort the -threads over the date of the articles to get a correct feel for the -flow of the groups: - -(setq gnus-thread-sort-functions '(gnus-thread-sort-by-date)) - -If you only want this in virtual groups, you could say something along -the lines of: - -(setq gnus-select-group-hook - (lambda () - (if (eq 'nnvirtual (car (gnus-find-method-for-group - gnus-newsgroup-name))) - (progn - (make-local-variable 'gnus-thread-sort-functions) - (setq gnus-thread-sort-functions '(gnus-thread-sort-by-date)))))) - - -From lars Thu Feb 23 23:20:38 1995 -From: larsi@ifi.uio.no (ding) -Date: Fri Feb 24 13:40:45 1995 -Subject: Bugs & stuff -Message-ID: - -If you want to report a bug, please type `M-x gnus-bug'. This will -give me a precise overview of your Gnus and Emacs version numbers, -along with a look at all Gnus variables you have changed. - -Du not expect a reply back, but your bug should be fixed in the next -version. If the bug persists, please re-submit your bug report. - -When a bug occurs, I need a recipe for how to trigger the bug. You -have to tell me exactly what you do to uncover the bug, and you should -(setq debug-on-error t) and send me the backtrace along with the bug -report. - -If I am not able to reproduce the bug, I won't be able to fix it. - -I would, of course, prefer that you locate the bug, fix it, and mail -me the patches, but one can't have everything. - -If you have any questions on usage, the "ding@ifi.uio.no" mailing list -is where to post the questions. - - diff --git a/etc/gnus/bar.xbm b/etc/gnus/bar.xbm deleted file mode 100644 index e61300a..0000000 --- a/etc/gnus/bar.xbm +++ /dev/null @@ -1,7 +0,0 @@ -#define noname_width 6 -#define noname_height 48 -static char noname_bits[] = { - 0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c, - 0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c, - 0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c, - 0x0c,0x0c,0x0c}; diff --git a/etc/gnus/bar.xpm b/etc/gnus/bar.xpm deleted file mode 100644 index 2985065..0000000 --- a/etc/gnus/bar.xpm +++ /dev/null @@ -1,54 +0,0 @@ -/* XPM */ -static char * picon-bar_xpm[] = { -"6 48 2 1", -" c white s background", -". c black", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. ", -" .. "}; diff --git a/etc/gnus/catchup.pbm b/etc/gnus/catchup.pbm deleted file mode 100644 index 3fc571bdf8059402f3059eb7f574678c3d0cbdaa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81 zcmWGA;W9E&Ff!p{fC0t>3=9sUObU#lj)4nStqKTrVff`F$l{{J&?Ukc%EYiafKhM; YQ-^D*Lx-XUYY7X}0vQGdd6;en0AX c Gray35", -", c #5b1a5b1a5b1a", -"< c #5fe95fe95fe9", -"1 c #626262626262", -"2 c Gray40", -"3 c #67e767e767e7", -"4 c Gray42", -"5 c #6fff6fff6fff", -"6 c Gray45", -"7 c Gray46", -"8 c #77e977e977e9", -"9 c #7bdb7bdb7bdb", -"0 c #7ccc7ccc7ccc", -"q c Gray50", -"w c #866586658665", -"e c Gray56", -"r c Gray60", -"t c #9bcb9bcb9bcb", -"y c #9fff9fff9fff", -"u c #a7c7a7c7a7c7", -"i c #af0eaf0eaf0e", -"p c Gray70", -"a c Gray75", -"s c Gray81", -"d c #dfffdfffdfff", -"f c #efffefffefff", -"g c Gray100", -/* pixels */ -"aaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaa7$$*uaaaaaaaaareep", -"aaaaaa$rr6", -"aaaaaa76;aaaareeeee#rw*", -"&aqqagga@<<<7e7qqqqqq=:u", -"33e4qgggsaa%1Oa&&&gggeae7ggyar=aa=r6 er=aa=r6 aggg=wr&g&rrr", -"rrrrr$a<:6 @$$$rri=d5qrr", -"rrrrr<===6$wrrrrrr6&qo6r", -"rrrrrrrrrewrrrrrrr6 oq", -"rrrrrrrrrrrrrrrrrrrrrrrr", -"rrrrrrrrrrrrrrrrrrrrrrrr", -"rrrrrrrrrrrrrrrrrrrrrrrr" -}; diff --git a/etc/gnus/cu-exit.pbm b/etc/gnus/cu-exit.pbm deleted file mode 100644 index 210869cce7836f3325e4fe48f70d16214dbbcbeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81 zcmWGA;W9E&Ff!p{Km+m&41o+xi4ClU0W3-iEa47pP7bUt4$KY>jG+z;K|m6u07U+0 PV7$)2@Q;BZ1Y`sNnq~{( diff --git a/etc/gnus/cu-exit.xpm b/etc/gnus/cu-exit.xpm deleted file mode 100644 index bc051f8..0000000 --- a/etc/gnus/cu-exit.xpm +++ /dev/null @@ -1,64 +0,0 @@ -/* XPM */ -static char *magick[] = { -/* columns rows colors chars-per-pixel */ -"24 24 34 1", -" c Gray0", -". c #0bfb0bfb0bfb", -"X c Gray6", -"o c Gray9", -"O c Gray11", -"+ c Gray12", -"@ c #23f323f323f3", -"# c Gray15", -"$ c #2ff52ff52ff5", -"% c #3fff3fff3fff", -"& c Gray25", -"* c Gray28", -"= c #4ccc4ccc4ccc", -"- c #53e853e853e8", -"; c #5b1a5b1a5b1a", -": c #5fef5fef5fef", -"> c #67e767e767e7", -", c Gray42", -"< c #6ff76ff76ff7", -"1 c #77dc77dc77dc", -"2 c Gray50", -"3 c #866586658665", -"4 c #88a888a888a8", -"5 c Gray56", -"6 c Gray60", -"7 c #9bcb9bcb9bcb", -"8 c #9fff9fff9fff", -"9 c #a7d7a7d7a7d7", -"0 c Gray70", -"q c #b635b635b635", -"w c Gray75", -"e c Gray78", -"r c #dfffdfffdfff", -"t c Gray100", -/* pixels */ -"wwwwwwwwwwwwwwwwwwwwwwww", -"wwwwwwwwwwwwwwwwwwwwwwww", -"wwwwwwwwwwwwwwwwwwwwwwww", -"wwwwwwwwwwwwwwwwwwwwwwww", -"wwwwwwwwwwwwwwwwwwwwwwww", -"wwwwwwwwwww-$$$-wwwwwwww", -"wwwwwww9-$w$ttt$wwwwwwww", -"wwwwww:wwwwww", -"wwwwww,::X%%%+$w:5wwwwww", -"qqqqqq4*5%t%t255;qqqqqqq", -"6666663#*+2+2%**=6666666", -"6666666=0$w$0*0&36666666", -"6666666=,$9@5*,#66666666", -"6666666= +% 2% #66666666", -"6666666= %e@<2 #66666666", -"6666666:# +666666666", -"666666666=====3666666666", -"666666666666666666666666" -}; diff --git a/etc/gnus/describe-group.pbm b/etc/gnus/describe-group.pbm deleted file mode 100644 index de7bf1104317ae6686562b822f04b5feb493f14c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81 zcmWGA;W9E&Ff!o^4Gq;;)D;ryy6=@js0hO(4u;S`7L5fAq5%xMek!;IFf=(pMM47@ f_PkIC4Pl&>$pF-q_oyp0F!cZL^`Rl5pFC6m%K{qn diff --git a/etc/gnus/describe-group.xpm b/etc/gnus/describe-group.xpm deleted file mode 100644 index e191277..0000000 --- a/etc/gnus/describe-group.xpm +++ /dev/null @@ -1,72 +0,0 @@ -/* XPM */ -static char *magick[] = { -/* columns rows colors chars-per-pixel */ -"24 24 42 1", -" c Gray0", -". c #099909990999", -"X c #0bfb0bfb0bfb", -"o c #133313331333", -"O c Gray9", -"+ c Gray11", -"@ c #23f323f323f3", -"# c Gray15", -"$ c #2d8d2d8d2d8d", -"% c #399939993999", -"& c #433243324332", -"* c #4ccc4ccc4ccc", -"= c #519151915191", -"- c #53e353e353e3", -"; c #565656565656", -": c Gray36", -"> c #5fdf5fdf5fdf", -", c Gray42", -"< c #6fff6fff6fff", -"1 c Gray45", -"2 c #77f777f777f7", -"3 c #7ccc7ccc7ccc", -"4 c Gray50", -"5 c #865a865a865a", -"6 c Gray58", -"7 c Gray60", -"8 c #9bfb9bfb9bfb", -"9 c Gray62", -"0 c #9fff9fff9fff", -"q c #a0c0a0c0a0c0", -"w c Gray64", -"e c Gray65", -"r c Gray70", -"t c #b635b635b635", -"y c Gray73", -"u c Gray75", -"i c #d332d332d332", -"p c Gray85", -"a c #e665e665e665", -"s c #eccbeccbeccb", -"d c #f998f998f998", -"f c Gray100", -/* pixels */ -"&77&77&77&77&77&77&77&77", -"777777777777777777777777", -"77777777777777777iaaa777", -"&77&77&77&77&77 c #5ff55ff55ff5", -", c #626262626262", -"< c Gray40", -"1 c #67e767e767e7", -"2 c Gray42", -"3 c #6ff96ff96ff9", -"4 c Gray45", -"5 c #77d777d777d7", -"6 c #7ccc7ccc7ccc", -"7 c Gray50", -"8 c Gray56", -"9 c #97f797f797f7", -"0 c Gray60", -"q c #9bd19bd19bd1", -"w c #9ff29ff29ff2", -"e c #a7cba7cba7cb", -"r c Gray67", -"t c #afd5afd5afd5", -"y c Gray70", -"u c Gray75", -"i c #c3c3c3c3c3c3", -"p c Gray78", -"a c #cbcbcbcbcbcb", -"s c Gray81", -"d c #d7d8d7d8d7d8", -"f c #dff2dff2dff2", -"g c Gray89", -"h c #e7e7e7e7e7e7", -"j c #eff8eff8eff8", -"k c Gray100", -/* pixels */ -"kkkkkkkkkufkkkku7skkkkkk", -"kkkkkkkkw>%fkkw 7kkkkkkk", -"kk3%wkkksu ukk%u7skkkkkk", -"kww>>@@uu3f@8 @@7.@Owskk", -"kkwf777%>77O> >>%7777wkk", -"kkkkkss7j8O.@ 8jujsfjkkk", -"kkkjuuwO @> @>@@ujkkkkkk", -"kkk>%O77O$ > %f >kkkkkk", -"kkk87sj7<=u>@7s8>@%wkkkk", -"kkkkkkq==u>>u ukk3u7kkkk", -"7uwfuw+=>u u> >fuw7uwwuf", -"8twut#>:8q q8* uprwswwtu", -"ipuge&,5uq5uau-@uuuuuadu", -"psuu>4@uuuuuduu5uuduuuuu", -"uugu>4@uuguuuuuuuuauuuuu", -"uuuy:>-uuuuuuugguaaugguu", -"psu8=+uuuuspuuuuudduuuuu", -"ipu8=+uuujfhguuuuuudauuu", -"ue82=+8euuuuishspujdgguu", -"e@$$+X=;>uu5ttp9sduuuuuu", -"&4$8$ 7=4@@5y>qejdjduuuu", -";$4O4444444O@eye5@uuusfd", -">>>>3<>@*<3>@wp9f7uuufsd", -"uuujfhgedhfjqpswsiuuuuuu" -}; diff --git a/etc/gnus/exit-summ.pbm b/etc/gnus/exit-summ.pbm deleted file mode 100644 index d0192310607c6f40033068a55cc5c4c7c244f866..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81 zcmWGA;W9E&Ff!p1aAaWsgNFYPm{|`nF+LD*Ji@^FfRXXQB*q7fKoQ;t!j4CP;tY%j W8W@3U9GHw6L_=L5x+ZZdKo|ff#}ZBe diff --git a/etc/gnus/exit-summ.xpm b/etc/gnus/exit-summ.xpm deleted file mode 100644 index 00caf53..0000000 --- a/etc/gnus/exit-summ.xpm +++ /dev/null @@ -1,45 +0,0 @@ -/* XPM */ -static char *magick[] = { -/* columns rows colors chars-per-pixel */ -"24 24 15 1", -" c Gray0", -". c #0bfb0bfb0bfb", -"X c Gray9", -"o c #23f323f323f3", -"O c #2fef2fef2fef", -"+ c Gray28", -"@ c #53e353e353e3", -"# c #5fdf5fdf5fdf", -"$ c Gray42", -"% c #77d777d777d7", -"& c Gray56", -"* c #9bcb9bcb9bcb", -"= c #a7c7a7c7a7c7", -"- c Gray70", -"; c Gray75", -/* pixels */ -"@;;@;;@;;@;;@;;@;;@;;@;;", -";;;;;;;;;;;;;;;;;;;;;;;;", -";;;;;;;;;;;;;;;;;;;;;;;;", -"@;;@;;&=@OOOo O;;@;;", -";;;;;;X&;;;;=## O;;;;;", -";;;;;;.%;;;;;;; O;;;;;", -"@;;@;;@;;@;;*;; O;;@;;", -";;;;;;;;;;;;%;; O;;;;;", -";;;;;;O%;;;;;;; O;;;;;", -"@;;@;;o=;@;;-&- O;;@;;", -";;;;;;X&;;;;+ & O;;;;;", -";;;;;;.%;;;;$ & O;;;;;", -"@;;@;;o=;@;;;;; O;;@;;", -";;;;;;X&;;;;;;; O;;;;;", -";;;;;;*;;;;;@;; O;;;;;", -"@;;@;;&=;@;;;;; O;;@;;", -";;;;;; #;;;;;&#XO+O;;;;;", -";;;;;;o=;*OO*#o%#+*;;;;;", -"@;;@;@;%OOOO@%*@%*@;;@;;", -";;;;;;;;;;;;;;;;;;;;;;;;", -";;;;;;;;;;;;;;;;;;;;;;;;", -"@;;@;;@;;@;;@;;@;;@;;@;;", -";;;;;;;;;;;;;;;;;;;;;;;;", -";;;;;;;;;;;;;;;;;;;;;;;;" -}; diff --git a/etc/gnus/followup.pbm b/etc/gnus/followup.pbm deleted file mode 100644 index 61be114096b3eb182aa962728a44e8bc45bfb176..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81 zcmWGA;W9E&Ff!p1WE5avU}69QK8C*v$E&(A-7Zex;1h_N| h1Y86h8aNzSBovqo0vH_x7#V c #9fff9fff9fff", -", c #a7c7a7c7a7c7", -"< c Gray70", -"1 c Gray75", -"2 c Gray81", -"3 c #dfffdfffdfff", -"4 c #efffefffefff", -"5 c Gray100", -/* pixels */ -"<,1<,1<,1<,1<,1<,1<,1<,1", -",;1,;1,;1,;1,;1,;1,;1,;1", -"111111111111111111111111", -"<,1<,1<,1<,:=+.<,1<,1<,1", -",;1,;1,;1;O*>5+$;1,;1,;1", -"11111111##142+>O11111111", -"<,1<,:=+2555 o2#,1<,1<,1", -",;1;O*>5555>-151$1,;1,;1", -"111<@15555525554*:111111", -"<,1<$:5555555555>=<,1<,1", -",;1,;*>553--55555+,;1,;1", -"111111=>&$1O555552#11111", -"<,111:=+241$+55555#,1<,1", -",;1,$*>55$ 1+555551$1,;1", -"11##14555 $4>>55554*:111", -"<@155555&5551-55555>=<,1", -",O15555555553-355551o,;1", -"1,#55555555553$555+%;111", -"<,#25555555555&1*O<,1<,1", -",;1+55555555555X;1,;1,;1", -"111=>5555555555:*1111111", -"<,1:*45555555552%<<,1<,1", -",;11$15555555555-;,;1,;1", -"1111,#55555555553#111111" -}; diff --git a/etc/gnus/fuwo.pbm b/etc/gnus/fuwo.pbm deleted file mode 100644 index b81af10c3997ce1eb584a907505fcac6282cd795..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81 zcmWGA;W9E&Ff!p1WE5afU}6A+Kvn?;76u0%0R|2R1_6+eW2y+l1qRkY0j?cP!X*qk dCJY6k0t#FV4y-H+tPBD`#MBVL7{bBm003Mb2}A$@ diff --git a/etc/gnus/fuwo.xpm b/etc/gnus/fuwo.xpm deleted file mode 100644 index e860d95..0000000 --- a/etc/gnus/fuwo.xpm +++ /dev/null @@ -1,53 +0,0 @@ -/* XPM */ -static char *magick[] = { -/* columns rows colors chars-per-pixel */ -"24 24 23 1", -" c Gray0", -". c Gray6", -"X c Gray9", -"o c Gray12", -"O c #2fef2fef2fef", -"+ c #3fff3fff3fff", -"@ c #53ee53ee53ee", -"# c #5fe85fe85fe8", -"$ c #67e767e767e7", -"% c #6fff6fff6fff", -"& c #77ea77ea77ea", -"* c #7bdb7bdb7bdb", -"= c Gray50", -"- c Gray56", -"; c #9bd69bd69bd6", -": c #9fff9fff9fff", -"> c #a7c7a7c7a7c7", -", c Gray70", -"< c Gray75", -"1 c Gray81", -"2 c #dfffdfffdfff", -"3 c #efffefffefff", -"4 c Gray100", -/* pixels */ -",><,><,><,><,><,><,><,><", -">-<>-<>-<>-<>-<>-<>-<>-<", -"<<<<<<<<<<<<<<<<<<<<<<<<", -",><,><,><,><,><,><,><,><", -">-<>-<>-<>-<>-<>-<>-<>-<", -"<<<<<<<<<<<<;O;<<<<<<<<<", -",><,><,><,>< X;,><,><,><", -">-<>-<>-<>-&#-<>-<>-<>-<", -"<<<<<<<<<<<;<<<<<<<<<<<<", -",><,><,><,><,><,><,><,><", -">-<>-<>-<-O>>-<>-<>-<>-<", -"<<<<<<<<@@<@<<<<<<<<<<<<", -",><<<;*+1<<#;<<,><,><,><", -">-<>#&:<==+#&-<>-<>-<>-<", -"<<@@<3+=<1o <#<<<<<<<<<<", -",>O<=+444:+.4=-,><,><,><", -">-O=<4444:4::<$>-<>-<>-<", -"<&;444444444+4+<<<<<<<<<", -",#;444444444<=4O<<,><,><", -">-O4444444442=2&-<>-<>-<", -"<<;%444444444=<<#<<<<<<<", -",><@2444444444+4=-,><,><", -">-<-=444444444::<$>-<>-<", -"<<<,$1444444444+4+<<<<<<" -}; diff --git a/etc/gnus/get-news.pbm b/etc/gnus/get-news.pbm deleted file mode 100644 index c0080716c4494d4ea6a56f29a9583152fdadb79a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81 zcmWGA;W9E&Ff!pP6%Aa)#K0)x*wB1}Q8cibQGqcuv~kf1#_+ c #519151915191", -", c #53e753e753e7", -"< c #565a565a565a", -"1 c Gray35", -"2 c #5b1a5b1a5b1a", -"3 c #5fe55fe55fe5", -"4 c Gray45", -"5 c Gray46", -"6 c #77d777d777d7", -"7 c #7ccc7ccc7ccc", -"8 c Gray50", -"9 c #866586658665", -"0 c Gray56", -"q c Gray60", -"w c #9bcb9bcb9bcb", -"e c #9fff9fff9fff", -"r c #a7c7a7c7a7c7", -"t c Gray70", -"y c Gray75", -"u c Gray81", -"i c #dfffdfffdfff", -"p c Gray100", -/* pixels */ -"0000000ryyyyyyyyyyyyyyyy", -"@8888833yyyyyyyyyyyyyyyy", -"*pppppy3yyyyyyyyyyyyyyyy", -"*pppppy3yyyyyr=$$6yyyyyy", -"*ppppp3%3yyyr<9qq36yyyyy", -"*ppppp ;0>yy0:qqqq%yyyyy", -"*pppppy @82tq>0qq8>yyyyy", -"*pppppy%>q42y0>q42yyyyyy", -"*pppppy3q=q8%%.=:#%6yyyy", -"%yyyyy03y0:qqqqqqqq:0yyy", -"33333330yr<9qqqqqqq42yyy", -"yyyyyyyyyyr=qqqqqqqq$yyy", -"yyyyyyyyyyyy$:%***$q$**X", -"yyyyyyyyyyyy$:yppe3q$pp*", -"yyyyyyyyyyyy$:ypp*q3qpp*", -"yyyyyyyyyyyy$:yp8402upp*", -"yyyyyyyyyyyyo$yi*&48ppp*", -"yyyyyyyyyyy>4&u>00:ippp*", -"yyyyyyyyyyy%q:00Oq%yyyy%", -"yyyyyyyyyyy%q4:o<3&%3333", -"yyyyyyyyyyy%qqq$9443yyyy", -"yyyyyyyyyyy%44@0&4<3yyyy", -"yyyyyyyyyyy6o$;r%&O0yyyy", -"yyyyyyyyyyyy$:0y34%yyyyy" -}; diff --git a/etc/gnus/gnntg.pbm b/etc/gnus/gnntg.pbm deleted file mode 100644 index 2f5e5261a97e722736c03805a8c2b6743901b626..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81 zcmWGA;W9E&Ff!pP6%EX8VsI33WN1F&7#_%|tl)S(lwsEj$NECXP2Hg(u?!q4p`xJ* kY;#;hLp9pY0ND(j9-* c #566656665666", -", c #5fed5fed5fed", -"< c #626262626262", -"1 c Gray42", -"2 c Gray45", -"3 c Gray46", -"4 c #77d777d777d7", -"5 c #7ccc7ccc7ccc", -"6 c Gray50", -"7 c #866586658665", -"8 c Gray56", -"9 c Gray60", -"0 c #9bcb9bcb9bcb", -"q c #a7c7a7c7a7c7", -"w c Gray70", -"e c Gray75", -"r c #dfffdfffdfff", -"t c Gray100", -/* pixels */ -"w8888888weeeeeeeeeeeeeee", -"8&66666&8eeeeeeeeeeeeeee", -"86ttttt68eeeeeeeeeeeeeee", -"86ttttt68eeeee0###0eeeee", -"86ttttr&-4eee8:000:8eeee", -"86tttte 144ee,20002,eeee", -"86ttttt6 =,4e4<000<4eeee", -"86ttttt6-,0,4e4,0,4eeeee", -"86ttttt684,0<$$.,#$$0eee", -"8,eeeee,8e,200000000#eee", -"q,,,,,,,qe8:00000000,4ee", -"eeeeeeeeeee0=000006,0$ee", -"eeeeeeeeeeee8;00002;0$ee", -"eeeeeeeeeeee8;00002;0$ee", -"eeeeeeeeeeee8;00002;0$ee", -"eeeeeeeeeeee8;00002;0$ee", -"eeeeeeeeeeee8#;;;;%#;$ee", -"eeeeeeeeeeee=2222+88@0ee", -"eeeeeeeeeeee#00000.4$eee", -"eeeeeeeeeeee#00720O,,eee", -"eeeeeeeeeeee#002;02%8eee", -"eeeeeeeeeeee+22$,>2%8eee", -"eeeeeeeeeeee-#o48O%$qeee", -"eeeeeeeeeeee8;#ee$2,eeee" -}; diff --git a/etc/gnus/gnus-group-catchup-current-up.xbm b/etc/gnus/gnus-group-catchup-current-up.xbm deleted file mode 100644 index f801fea..0000000 --- a/etc/gnus/gnus-group-catchup-current-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x20,0x40,0x10,0x20,0x0a,0x15,0x85,0x0a,0x20,0x20,0x28,0x50,0x8a,0x8a,0x02, - 0x05,0x10,0x5e,0x54,0xa8,0xa5,0x35,0x01,0x7a,0x00,0x33,0x54,0x95,0xaa,0xaa, - 0x02,0xcc,0xfe,0x17,0xa8,0xd8,0x01,0xac,0xfa,0x4f,0x3d,0xf8,0x05,0x30,0x22, - 0x80,0xf6,0x60,0x2b,0xfc,0x8f,0x20,0x11,0x82,0xca,0x60,0x1a,0x2a,0x6e,0x28, - 0x08,0x85,0x42,0x68,0xfa,0x11,0x28,0xc8,0x04,0x8b,0xe2,0xb7,0x06,0x21,0x14, - 0xd4,0x1a,0x11,0x31,0x04,0x31,0x56,0x6d,0xdc,0x58,0xea,0xc7,0x28,0x64,0x66, - 0x60,0xa9,0x57,0x72,0x90,0x49,0xc8,0xec,0x5f,0x99,0xa6,0x7f,0x95,0x52,0xaa, - 0x64,0x22,0xbf,0x49,0x2a,0xa9,0x7e,0x92,0x52,0x55,0x55,0x54,0x49,0x4a,0xa4, - 0x49,0xaa,0xa4,0x4a,0x2a,0x49,0x2a,0x25}; diff --git a/etc/gnus/gnus-group-catchup-current-up.xpm b/etc/gnus/gnus-group-catchup-current-up.xpm deleted file mode 100644 index 0504f9d..0000000 --- a/etc/gnus/gnus-group-catchup-current-up.xpm +++ /dev/null @@ -1,39 +0,0 @@ -/* XPM */ -static char * icon-catchup_xpm[] = { -"32 32 4 1", -" c #BFBFBFBFBFBF s backgroundToolBarColor", -". c #000000000000", -"X c #999999999999", -"o c #FFFFFFFFFFFF", -" ", -" ", -" ", -" ", -" .... ", -" .XXXX. .... ", -" .XXXX. .XXXX.", -" .XXX. .XXXX.", -" .........XX. .XXX.", -".ooooooooo.. .........XX. ", -".o....ooooo...... .ooooooooo.. ", -"X. .ooooooooo.X..o....ooooo. ", -"X. .oooo........X. .ooooo. ", -". .oooo. .X. .ooooo. ", -" .oooo. .. .oooo.o. ", -" .oooo. .oooo.o. ", -" ...... .ooooo.oo..", -" .ooooo. ...... ..X.", -" .ooooo. .ooooo. ..", -" .o..ooo. ..oooo. ", -".ooo..ooo.XXXXXXXXX.o..ooo.XXXXX", -"ooo.XX.oo.XXX......ooo..ooo.XXXX", -"oo.XXX.oo.XXX..oooooo.XX.oo.XXXX", -"..XXXX.oo.XXX..ooooo.XXX.oo.XXXX", -"XXXXXXX.oo.XX.......XXX .oo.XXXX", -"XXXXXXX.....X..XXXXXXXXXX.oo.XXX", -"XXXXXXXXXXXXX.XXXXXXXXXXX.....XX", -"XXXXXXXXXXXXXXXXXXXXXXXXX......X", -"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", -"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", -"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", -"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"}; diff --git a/etc/gnus/gnus-group-catchup-current.xbm b/etc/gnus/gnus-group-catchup-current.xbm deleted file mode 100644 index 2218640..0000000 --- a/etc/gnus/gnus-group-catchup-current.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x84,0x20,0x00,0x04,0x21,0x88,0x54,0x51,0x84,0x22,0x02,0x04,0x51,0x88,0xa0, - 0x42,0x04,0x1f,0x0a,0x28,0x51,0x75,0xa1,0x7a,0x04,0x23,0x04,0xcc,0xa1,0x76, - 0xa9,0xa6,0xfe,0x1b,0x00,0xd8,0x01,0x0c,0xfd,0x5f,0x3d,0xf8,0x05,0x30,0x26, - 0x80,0xf7,0x60,0x33,0xfc,0xdb,0x20,0x11,0x22,0x8e,0x20,0x14,0x8a,0x66,0x68, - 0x09,0x45,0x48,0x28,0xfc,0x11,0x21,0xc8,0x04,0x45,0xf4,0xf7,0x06,0x89,0x10, - 0xc4,0x1a,0x23,0x35,0x2c,0x31,0xaa,0x6c,0x54,0x58,0xea,0xc7,0x48,0x64,0x66, - 0xa0,0x99,0x57,0x72,0x50,0x59,0xc8,0xec,0x2f,0x49,0xa6,0x7f,0xaa,0x52,0xaa, - 0x64,0x49,0xbf,0x49,0x2a,0xa5,0x7e,0x92,0xa4,0x14,0x55,0xa9,0x52,0xaa,0x92, - 0x4a,0xa5,0x24,0x25,0xa5,0x94,0xaa,0xa8}; diff --git a/etc/gnus/gnus-group-catchup-current.xpm b/etc/gnus/gnus-group-catchup-current.xpm deleted file mode 100644 index bea4643..0000000 --- a/etc/gnus/gnus-group-catchup-current.xpm +++ /dev/null @@ -1,39 +0,0 @@ -/* XPM */ -static char * icon-catchup_xpm[] = { -"32 32 4 1", -" c #BFBFBFBFBFBF", -". c #000000000000", -"X c #999999999999", -"o c #FFFFFFFFFFFF", -" ", -" ", -" ", -" ", -" .... ", -" .XXXX. .... ", -" .XXXX. .XXXX.", -" .XXX. .XXXX.", -" .........XX. .XXX.", -".ooooooooo.. .........XX. ", -".o....ooooo...... .ooooooooo.. ", -"X. .ooooooooo.X..o....ooooo. ", -"X. .oooo........X. .ooooo. ", -". .oooo. .X. .ooooo. ", -" .oooo. .. .oooo.o. ", -" .oooo. .oooo.o. ", -" ...... .ooooo.oo..", -" .ooooo. ...... ..X.", -" .ooooo. .ooooo. ..", -" .o..ooo. ..oooo. ", -".ooo..ooo.XXXXXXXXX.o..ooo.XXXXX", -"ooo.XX.oo.XXX......ooo..ooo.XXXX", -"oo.XXX.oo.XXX..oooooo.XX.oo.XXXX", -"..XXXX.oo.XXX..ooooo.XXX.oo.XXXX", -"XXXXXXX.oo.XX.......XXX .oo.XXXX", -"XXXXXXX.....X..XXXXXXXXXX.oo.XXX", -"XXXXXXXXXXXXX.XXXXXXXXXXX.....XX", -"XXXXXXXXXXXXXXXXXXXXXXXXX......X", -"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", -"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", -"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", -"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"}; diff --git a/etc/gnus/gnus-group-describe-group-up.xbm b/etc/gnus/gnus-group-describe-group-up.xbm deleted file mode 100644 index 0054d63..0000000 --- a/etc/gnus/gnus-group-describe-group-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x55,0xb5,0x55,0xb5,0xaa,0x12,0xa9,0x12,0x12,0x55,0x12,0x65,0xa9,0xa4,0x4a, - 0x10,0x55,0x9b,0x15,0xc1,0x55,0x51,0x09,0x00,0x92,0x4a,0x02,0x00,0xa9,0x24, - 0x01,0x00,0x55,0x5b,0x11,0x11,0x92,0xa4,0x00,0x00,0x2a,0x49,0x00,0x00,0x49, - 0x55,0x00,0x00,0x35,0x55,0x11,0x11,0xaa,0xaa,0x00,0x00,0x92,0x44,0x00,0x00, - 0xa5,0x32,0x00,0x00,0x55,0x55,0x11,0x11,0x29,0x55,0x01,0x00,0xaa,0x24,0x01, - 0x00,0x92,0x97,0x00,0x00,0x75,0xba,0x13,0x11,0x2a,0x51,0x04,0x00,0xb2,0xaa, - 0x0a,0x40,0x59,0x75,0x25,0x40,0xb5,0x3d,0x59,0xb5,0xfa,0x77,0xa5,0x2a,0xae, - 0x9a,0x2a,0x49,0xd6,0x5f,0x49,0xa5,0xf7,0x57,0x35,0x55,0x7d,0x29,0x95,0x2a, - 0x7e,0x55,0xa9,0x54,0x5f,0x92,0x94,0x92}; diff --git a/etc/gnus/gnus-group-describe-group-up.xpm b/etc/gnus/gnus-group-describe-group-up.xpm deleted file mode 100644 index e0ffde7..0000000 --- a/etc/gnus/gnus-group-describe-group-up.xpm +++ /dev/null @@ -1,39 +0,0 @@ -/* XPM */ -static char * icon-describe-group_xpm[] = { -"32 32 4 1", -" c #000000000000", -". c #999999999999 s backgroundToolBarColor", -"X c #FFFFFFFFFFFF", -"o c #BFBFBFBFBFBF", -" ... ... ... ... ... ... ... ...", -"................................", -"................................", -".......................XXXXX....", -" ... ... ... ... ... XXX XXXXX..", -"....................XXXXXXXXXXX.", -"...................XXXXXXXXXXXXX", -"..................XXXXXXXXXXXXXX", -" ... ... ... ... XXX XXX XXX XXX", -"................XXXXXXXXXXXXXXXX", -"................XXXXXXXXXXXXXXXX", -"................XXXXXXXXXXXXXXXX", -" ... ... ... ... XXX XXX XXX XXX", -"................XXXXXXXXXXXXXXXX", -"................XXXXXXXXXXXXXXXX", -"................XXXXXXXXXXXXXXXX", -" ... ... ... ... XXX XXX XXX XXX", -".................XXXXXXXXXXXXXXX", -".................XXXXXXXXXXXXXXX", -"....... .......XXXXXXXXXXXXXX", -" ... . oooo ... ..X XXX XXX XXX", -"..... o...oo .......XXXXXXXXXXX.", -".... .o....o. .......XXXXXXXXX..", -".... o . ... .........XXXXX....", -" ... o .. . .. ... ... ... ...", -"... o . . ..................", -".. X . . . ...................", -". o . . ....................", -" o . ... ... ... ... ...", -" o .........................", -"o . ...o......................", -" ..........................."}; diff --git a/etc/gnus/gnus-group-exit-up.xbm b/etc/gnus/gnus-group-exit-up.xbm deleted file mode 100644 index c03e1fa..0000000 --- a/etc/gnus/gnus-group-exit-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x00,0x00,0x40,0x00,0x00,0x30,0x30,0x00,0x00,0x68,0x38,0x00,0x38,0x60,0x48, - 0x00,0xd4,0x91,0xde,0x07,0x68,0xcf,0xb7,0x1a,0x80,0xb4,0x6e,0x05,0x00,0xe2, - 0x07,0x00,0x00,0xde,0x1d,0x00,0xe0,0xfd,0x77,0x00,0xb0,0x6a,0xf3,0x00,0x20, - 0x9c,0xa5,0x03,0x00,0xaa,0x86,0x02,0x00,0x65,0x06,0x02,0xab,0x6f,0xaf,0x59, - 0x80,0x62,0x0c,0x00,0xaa,0xab,0xba,0x4a,0x40,0x21,0x10,0x10,0xea,0x45,0x4a, - 0x42,0x40,0x89,0x90,0x28,0xd2,0x21,0x02,0x82,0xa4,0x8a,0x44,0x20,0xf0,0x10, - 0x10,0x85,0xa4,0x04,0x4a,0x20,0xe2,0x22,0x80,0x80,0xbc,0x4b,0x09,0x2a,0xee, - 0x8e,0x32,0x80,0xeb,0x73,0x85,0x28,0x56,0xaa,0xb5,0x02,0xff,0xff,0x85,0x48, - 0x08,0x94,0x11,0x01,0x42,0x02,0x48,0x54}; diff --git a/etc/gnus/gnus-group-exit-up.xpm b/etc/gnus/gnus-group-exit-up.xpm deleted file mode 100644 index 1b8982f..0000000 --- a/etc/gnus/gnus-group-exit-up.xpm +++ /dev/null @@ -1,39 +0,0 @@ -/* XPM */ -static char * icon-exit-gnus_xpm[] = { -"32 32 4 1", -" c #FFFFFFFFFFFF s backgroundToolBarColor", -". c #000000000000", -"X c #999999999999", -"o c #BFBFBFBFBFBF", -" . ", -" .. .. ", -" . .. ... ", -" ... .. . . ", -" . . ... . . .... ..... ", -" . .. .... ..... .. . . .. ", -" . . .. . ... .. . . ", -" . ...... ", -" .... ... ... ", -" .... ......... ... ", -" .. . . .X.. .. .... ", -" . .X. .. . . ... ", -" .X. . . .. . . ", -" .X. .. .. . ", -".. . . ..X.. .. .... . .. .. . ", -"ooooooo.X.ooo..ooo..oo ooooooooo", -"oooo oo.X.ooo.ooooo..oooooooo oo", -"o oooo.X.ooooooo ooo.ooooooooooo", -"oooooo.X.ooooooooooooooo ooooooo", -"ooo oo.X.ooo ooooooooooooooooooo", -"oooooo.X.oooooooooo oooooo ooo", -"ooooo.X.ooooooooooooooo ooooooo", -"o ooo.X.oooooo ooooooooooooooooo", -"ooooo.X.oooo o ooooooooo ooooo", -"ooooo.X.ooooooooooo oooo o ooo", -"oo....X...ooooooo o oooooooooo", -"o..XX...XX..ooo.o.oo.oo oooooooo", -".XX.XX..X.XX...ooo.oo o oooooo", -"X.XX.XXXXXXXXXX..oooo.o.oooooo o", -".................o.o oo.oooo o ", -"oooooo ooo.oo oo.o . ooooooooo", -"oooo o oo o oooooooooooooooo"}; diff --git a/etc/gnus/gnus-group-get-new-news-this-group-up.xbm b/etc/gnus/gnus-group-get-new-news-this-group-up.xbm deleted file mode 100644 index 2f354f4..0000000 --- a/etc/gnus/gnus-group-get-new-news-this-group-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x20,0x00,0x40,0x88,0xff,0x57,0x15,0x22,0x02,0x0c,0xa0,0x88,0x02,0xa4,0x0a, - 0x22,0x02,0x04,0xf0,0x84,0x03,0x54,0xdd,0x21,0x02,0x1e,0x14,0x97,0x02,0x66, - 0xcd,0x02,0x02,0x7c,0x14,0x2b,0x03,0x9c,0xad,0x41,0x02,0x54,0xb1,0x0a,0x02, - 0x2c,0xff,0x47,0x02,0xe4,0x14,0x2d,0xff,0x4f,0xa5,0x0a,0x48,0xa0,0x4a,0xb4, - 0x12,0x0a,0x51,0x1b,0x40,0xa1,0x96,0x36,0x2a,0x10,0x4a,0x56,0x80,0x4a,0x57, - 0x1b,0x55,0x00,0x92,0x52,0x00,0x55,0x26,0x17,0xa9,0x00,0xab,0x5a,0x04,0x2a, - 0xfe,0x1f,0x41,0x41,0xcb,0x48,0x14,0x14,0x95,0x2f,0x82,0x42,0x53,0x09,0x28, - 0x08,0xa5,0xaf,0x84,0xa2,0x75,0x06,0x12,0x04,0xd3,0x54,0x40,0x51,0xdf,0x0f, - 0x0a,0x82,0xae,0x23,0xa0,0x28,0x8a,0x4a}; diff --git a/etc/gnus/gnus-group-get-new-news-this-group-up.xpm b/etc/gnus/gnus-group-get-new-news-this-group-up.xpm deleted file mode 100644 index 918fd2e..0000000 --- a/etc/gnus/gnus-group-get-new-news-this-group-up.xpm +++ /dev/null @@ -1,39 +0,0 @@ -/* XPM */ -static char * icon-get-new-news-this-group_xpm[] = { -"32 32 4 1", -" c #BFBFBFBFBFBF s backgroundToolBarColor", -". c #000000000000", -"X c #FFFFFFFFFFFF", -"o c #999999999999", -" ", -" .......... ", -" .XXXXXXXX. ", -" .XXXXXXXX. ", -" .XXXXXXXX. .... ", -" .XXXXXXXX. .oooo. ", -" .XXXXXXX.... .oooooo. ", -" .XXXXXXX.. . .oooooo. ", -" .XXXXXXXX...o. .oooooo. ", -" .XXXXXXXX..ooo. .oooo. ", -" .XXXXXXXX. .ooo. .oo. ", -" .XXXXXXXX. .ooo.....o.... ", -" .XXXXXXXX. .oooooooooooo. ", -" .......... .oooooooooooo. ", -" .oooooooooooo. ", -" .oooooooo.oo. ", -" .ooooooo.oo. ", -" .ooooooo.oo. ", -" .ooooooo.oo. ", -" .ooooooo.oo. ", -" .ooooooo.oo. ", -" .ooooooo.oo. ", -" ............ ", -" .oooooo. . ", -" .ooooooo.. . ", -" .ooooooo. . ", -" .oooo.oo... ", -" .oooo.oooo. ", -" .ooo. .ooo. ", -" ..... ..... ", -" .o. .o. ", -" .o. .o. "}; diff --git a/etc/gnus/gnus-group-get-new-news-up.xbm b/etc/gnus/gnus-group-get-new-news-up.xbm deleted file mode 100644 index bea7a56..0000000 --- a/etc/gnus/gnus-group-get-new-news-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x00,0x81,0x00,0x08,0xff,0x2b,0xa8,0x42,0x01,0x42,0x05,0x14,0x01,0x16,0x50, - 0x41,0x01,0xa2,0x7a,0x0a,0x01,0x0a,0xcc,0x40,0x01,0xaf,0x92,0x15,0x01,0x13, - 0x56,0x43,0x01,0xbe,0x2a,0x09,0x01,0x6e,0xcc,0x52,0x01,0xca,0x69,0x80,0x01, - 0x32,0xdf,0x2b,0x01,0x66,0x55,0x85,0xff,0x33,0xa9,0x2e,0x24,0xc9,0x92,0x88, - 0x09,0x82,0x4a,0x2e,0xa0,0x28,0xfd,0xf9,0x14,0x42,0x07,0x8d,0x42,0x08,0x85, - 0x8d,0x20,0x52,0x87,0x85,0x8a,0x80,0x45,0x86,0x20,0x2a,0xc7,0x82,0x8a,0x00, - 0xe7,0x82,0x41,0xd4,0x15,0x81,0x14,0x81,0xe6,0x81,0x81,0xa8,0x3d,0xff,0x14, - 0x82,0xfa,0x02,0x42,0xd1,0x52,0x57,0x08,0x8a,0xad,0x82,0xa2,0xa0,0xef,0x2b, - 0x04,0x05,0x55,0x81,0x51,0x50,0xc7,0x2b}; diff --git a/etc/gnus/gnus-group-get-new-news-up.xpm b/etc/gnus/gnus-group-get-new-news-up.xpm deleted file mode 100644 index d324784..0000000 --- a/etc/gnus/gnus-group-get-new-news-up.xpm +++ /dev/null @@ -1,39 +0,0 @@ -/* XPM */ -static char * icon-get-new-news_xpm[] = { -"32 32 4 1", -" c #BFBFBFBFBFBF s backgroundToolBarColor", -". c #000000000000", -"X c #FFFFFFFFFFFF", -"o c #999999999999", -" ", -".......... ", -".XXXXXXXX. ", -".XXXXXXXX. ", -".XXXXXXXX. .... ", -".XXXXXXXX. .oooo. ", -".XXXXXXX.... .oooooo. ", -".XXXXXXX.. . .oooooo. ", -".XXXXXXXX...o. .oooooo. ", -".XXXXXXXX..ooo. .oooo. ", -".XXXXXXXX. .ooo. .oo. ", -".XXXXXXXX. .ooo.....o.... ", -".XXXXXXXX. .oooooooooooo. ", -".......... .oooooooooooo. ", -" .oooooooooooo. ", -" .ooooooooooo. ", -" .o.......oo.....", -" .o.XXXXX.oo.XXX.", -" .o.XXXX.ooo.XXX.", -" .o.XXXX.oo.XXXX.", -" .o.XXX.ooo.XXXX.", -" .o.XXX.oo.XXXXX.", -" ...XX...o.XXXXX.", -" .oo.X. .XXXXXX.", -" .oo.XX.. .XXXXXX.", -" .oo.... ........", -" .oooo.o..o. ", -" .oooo.oooo. ", -" .ooo. .ooo. ", -" ..... ..... ", -" .o. .o. ", -" .o. .o. "}; diff --git a/etc/gnus/gnus-group-kill-group-up.xbm b/etc/gnus/gnus-group-kill-group-up.xbm deleted file mode 100644 index 8c3526d..0000000 --- a/etc/gnus/gnus-group-kill-group-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x00,0x04,0x20,0x20,0x54,0xa1,0x0a,0x4a,0x02,0x0a,0x50,0x01,0xa0,0x40,0x05, - 0x54,0xca,0xff,0x7f,0x00,0x50,0x00,0x60,0x55,0x42,0x00,0xa0,0x80,0x68,0xc0, - 0x21,0x2b,0x42,0xe0,0xe3,0x83,0x50,0xb0,0x06,0x2a,0x4a,0xf0,0x07,0x42,0x60, - 0x70,0x07,0x16,0x42,0xe0,0x03,0x42,0x68,0x40,0x01,0x2a,0x42,0x40,0x01,0x82, - 0x50,0xc8,0x05,0x2a,0x4a,0x0c,0x0c,0x82,0x60,0x30,0x03,0x2a,0x4a,0xc0,0x00, - 0x82,0x40,0xc0,0x00,0x2a,0x6a,0x30,0x03,0x42,0x41,0x0c,0x0c,0x16,0x54,0x08, - 0x04,0x22,0x41,0x00,0x00,0x4a,0x54,0x00,0x00,0x02,0x41,0x00,0x00,0x56,0x54, - 0x00,0x00,0x02,0x42,0x00,0x00,0x52,0xe8,0xff,0xff,0x0b,0x04,0x84,0x00,0x42, - 0x52,0x11,0xaa,0x28,0x00,0xa4,0x04,0x04}; diff --git a/etc/gnus/gnus-group-kill-group-up.xpm b/etc/gnus/gnus-group-kill-group-up.xpm deleted file mode 100644 index e728bf5..0000000 --- a/etc/gnus/gnus-group-kill-group-up.xpm +++ /dev/null @@ -1,38 +0,0 @@ -/* XPM */ -static char * icon-killfile_xpm[] = { -"32 32 3 1", -" c #BFBFBFBFBFBF s backgroundToolBarColor", -". c #000000000000", -"X c #FFFFFFFFFFFF", -" ", -" ", -" ", -" ", -" ................ ", -" .XXXXXXXXXXXXXX.. ", -" .XXXXXXXXXXXXXX.X. ", -" .XXXXXXX...XXXX.XX. ", -" .XXXXXX.....XXX..... ", -" .XXXXX..X.X..XXXXXX. ", -" .XXXXX.......XXXXXX. ", -" .XXXXX...X...XXXXXX. ", -" .XXXXXX.....XXXXXXX. ", -" .XXXXXXX.X.XXXXXXXX. ", -" .XXXXXXX.X.XXXXXXXX. ", -" .XXXX.XX...X.XXXXXX. ", -" .XXX..XXXXXX..XXXXX. ", -" .XXXXX..XX..XXXXXXX. ", -" .XXXXXXX..XXXXXXXXX. ", -" .XXXXXXX..XXXXXXXXX. ", -" .XXXXX..XX..XXXXXXX. ", -" .XXX..XXXXXX..XXXXX. ", -" .XXXX.XXXXXX.XXXXXX. ", -" .XXXXXXXXXXXXXXXXXX. ", -" .XXXXXXXXXXXXXXXXXX. ", -" .XXXXXXXXXXXXXXXXXX. ", -" .XXXXXXXXXXXXXXXXXX. ", -" .XXXXXXXXXXXXXXXXXX. ", -" .................... ", -" ", -" ", -" "}; diff --git a/etc/gnus/gnus-group-subscribe-up.xbm b/etc/gnus/gnus-group-subscribe-up.xbm deleted file mode 100644 index 98819e5..0000000 --- a/etc/gnus/gnus-group-subscribe-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x08,0x04,0x00,0x40,0x22,0x51,0x55,0x15,0x88,0x04,0x00,0x20,0x22,0xa0,0xaa, - 0x4a,0xc4,0xff,0x3f,0x00,0x61,0x80,0x60,0x55,0x54,0x8a,0xa0,0x80,0x42,0x84, - 0x20,0x2b,0x68,0x8a,0xe0,0x83,0x42,0x80,0x00,0x2a,0xd4,0xff,0x00,0x42,0x41, - 0x80,0x00,0x16,0x54,0x8a,0x00,0x42,0x41,0x84,0x00,0x2a,0x54,0x8a,0x00,0x82, - 0x41,0x80,0x00,0x2a,0xd4,0xff,0x00,0x82,0x42,0x80,0x00,0x2a,0x68,0x8a,0x00, - 0x82,0x44,0x84,0x00,0x2a,0x52,0x8a,0x00,0x42,0x40,0x80,0x00,0x16,0xea,0xff, - 0x00,0x22,0x40,0x80,0x00,0x4a,0x4a,0x80,0x00,0x02,0x61,0x80,0x00,0x56,0x44, - 0x80,0x00,0x02,0x51,0x80,0x00,0x52,0xc4,0xff,0xff,0x0b,0xa1,0x04,0x00,0x42, - 0x14,0xa8,0xaa,0x88,0x82,0x02,0x00,0x22}; diff --git a/etc/gnus/gnus-group-subscribe-up.xpm b/etc/gnus/gnus-group-subscribe-up.xpm deleted file mode 100644 index 15f7d43..0000000 --- a/etc/gnus/gnus-group-subscribe-up.xpm +++ /dev/null @@ -1,38 +0,0 @@ -/* XPM */ -static char * icon-unsubscribe_xpm[] = { -"32 32 3 1", -" c #BFBFBFBFBFBF s backgroundToolBarColor", -". c #000000000000", -"X c #FFFFFFFFFFFF", -" ", -" ", -" ", -" ", -" ................ ", -" .XXXXXXXX.XXXXX.. ", -" .XX.X.XXX.XXXXX.X. ", -" .XXX.XXXX.XXXXX.XX. ", -" .XX.X.XXX.XXXXX..... ", -" .XXXXXXXX.XXXXXXXXX. ", -" ..........XXXXXXXXX. ", -" .XXXXXXXX.XXXXXXXXX. ", -" .XX.X.XXX.XXXXXXXXX. ", -" .XXX.XXXX.XXXXXXXXX. ", -" .XX.X.XXX.XXXXXXXXX. ", -" .XXXXXXXX.XXXXXXXXX. ", -" ..........XXXXXXXXX. ", -" .XXXXXXXX.XXXXXXXXX. ", -" .XX.X.XXX.XXXXXXXXX. ", -" .XXX.XXXX.XXXXXXXXX. ", -" .XX.X.XXX.XXXXXXXXX. ", -" .XXXXXXXX.XXXXXXXXX. ", -" ..........XXXXXXXXX. ", -" .XXXXXXXX.XXXXXXXXX. ", -" .XXXXXXXX.XXXXXXXXX. ", -" .XXXXXXXX.XXXXXXXXX. ", -" .XXXXXXXX.XXXXXXXXX. ", -" .XXXXXXXX.XXXXXXXXX. ", -" .................... ", -" ", -" ", -" "}; diff --git a/etc/gnus/gnus-group-unsubscribe-up.xbm b/etc/gnus/gnus-group-unsubscribe-up.xbm deleted file mode 100644 index 9edc6b8..0000000 --- a/etc/gnus/gnus-group-unsubscribe-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x08,0x04,0x00,0x40,0x22,0x51,0x55,0x15,0x88,0x04,0x00,0x20,0x22,0xa0,0xaa, - 0x4a,0xc4,0xff,0x3f,0x00,0x61,0x80,0x60,0x55,0x54,0xa0,0xa0,0x80,0x42,0x90, - 0x20,0x2b,0x68,0x8a,0xe0,0x83,0x42,0x84,0x00,0x2a,0xd4,0xff,0x00,0x42,0x41, - 0x80,0x00,0x16,0x54,0xa0,0x00,0x42,0x41,0x90,0x00,0x2a,0x54,0x8a,0x00,0x82, - 0x41,0x84,0x00,0x2a,0xd4,0xff,0x00,0x82,0x42,0x80,0x00,0x2a,0x68,0xa0,0x00, - 0x82,0x44,0x90,0x00,0x2a,0x52,0x8a,0x00,0x42,0x40,0x84,0x00,0x16,0xea,0xff, - 0x00,0x22,0x40,0x80,0x00,0x4a,0x4a,0x80,0x00,0x02,0x61,0x80,0x00,0x56,0x44, - 0x80,0x00,0x02,0x51,0x80,0x00,0x52,0xc4,0xff,0xff,0x0b,0xa1,0x04,0x00,0x42, - 0x14,0xa8,0xaa,0x88,0x82,0x02,0x00,0x22}; diff --git a/etc/gnus/gnus-group-unsubscribe-up.xpm b/etc/gnus/gnus-group-unsubscribe-up.xpm deleted file mode 100644 index 7c7ce5b..0000000 --- a/etc/gnus/gnus-group-unsubscribe-up.xpm +++ /dev/null @@ -1,38 +0,0 @@ -/* XPM */ -static char * icon-subscribe_xpm[] = { -"32 32 3 1", -" c #BFBFBFBFBFBF s backgroundToolBarColor", -". c #000000000000", -"X c #FFFFFFFFFFFF", -" ", -" ", -" ", -" ", -" ................ ", -" .XXXXXXXX.XXXXX.. ", -" .XXXXXX.X.XXXXX.X. ", -" .XXXXX.XX.XXXXX.XX. ", -" .XX.X.XXX.XXXXX..... ", -" .XXX.XXXX.XXXXXXXXX. ", -" ..........XXXXXXXXX. ", -" .XXXXXXXX.XXXXXXXXX. ", -" .XXXXXX.X.XXXXXXXXX. ", -" .XXXXX.XX.XXXXXXXXX. ", -" .XX.X.XXX.XXXXXXXXX. ", -" .XXX.XXXX.XXXXXXXXX. ", -" ..........XXXXXXXXX. ", -" .XXXXXXXX.XXXXXXXXX. ", -" .XXXXXX.X.XXXXXXXXX. ", -" .XXXXX.XX.XXXXXXXXX. ", -" .XX.X.XXX.XXXXXXXXX. ", -" .XXX.XXXX.XXXXXXXXX. ", -" ..........XXXXXXXXX. ", -" .XXXXXXXX.XXXXXXXXX. ", -" .XXXXXXXX.XXXXXXXXX. ", -" .XXXXXXXX.XXXXXXXXX. ", -" .XXXXXXXX.XXXXXXXXX. ", -" .XXXXXXXX.XXXXXXXXX. ", -" .................... ", -" ", -" ", -" "}; diff --git a/etc/gnus/gnus-pointer.xbm b/etc/gnus/gnus-pointer.xbm deleted file mode 100644 index 94e9154..0000000 --- a/etc/gnus/gnus-pointer.xbm +++ /dev/null @@ -1,6 +0,0 @@ -#define noname_width 18 -#define noname_height 13 -static char noname_bits[] = { - 0x00,0x00,0x00,0xc0,0x0c,0x00,0xe0,0x1f,0x00,0x92,0x39,0x00,0x0e,0x71,0x02, - 0x46,0xe0,0x03,0x20,0xc0,0x01,0x00,0x08,0x00,0x10,0x0d,0x00,0xc4,0x08,0x00, - 0x78,0x08,0x00,0x18,0x89,0x00,0x00,0x08,0x00}; diff --git a/etc/gnus/gnus-pointer.xpm b/etc/gnus/gnus-pointer.xpm deleted file mode 100644 index c47443d..0000000 --- a/etc/gnus/gnus-pointer.xpm +++ /dev/null @@ -1,22 +0,0 @@ -/* XPM */ -static char *gnus-pointer[] = { -/* width height num_colors chars_per_pixel */ -" 18 13 2 1", -/* colors */ -". c #0000ff", -"# c None s None", -/* pixels */ -"##################", -"######..##..######", -"#####........#####", -"#.##.##..##...####", -"#...####.###...##.", -"#..###.######.....", -"#####.########...#", -"###########.######", -"####.###.#..######", -"######..###.######", -"###....####.######", -"###..######.######", -"###########.######" -}; \ No newline at end of file diff --git a/etc/gnus/gnus-summary-caesar-message-up.xbm b/etc/gnus/gnus-summary-caesar-message-up.xbm deleted file mode 100644 index 0de8759..0000000 --- a/etc/gnus/gnus-summary-caesar-message-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x40,0x40,0x10,0x01,0x15,0x15,0x45,0x50,0x40,0x40,0x08,0x05,0x14,0x14,0xa2, - 0x50,0xe2,0xff,0x3f,0x82,0x48,0x00,0xe0,0x28,0x62,0xe6,0xb8,0x82,0x48,0x29, - 0x25,0x29,0x62,0xa9,0xe4,0x83,0x48,0x2f,0x05,0x2a,0x42,0xe9,0x38,0x42,0x60, - 0x00,0x00,0x16,0x4a,0x82,0x10,0x22,0x50,0x00,0x00,0x4a,0x42,0xcb,0x1c,0x02, - 0x68,0x2b,0x25,0x56,0x42,0x2d,0x1d,0x02,0x50,0x2d,0x05,0x52,0x4a,0xc9,0x04, - 0x0a,0x40,0x00,0x00,0x42,0x6a,0x18,0x00,0x16,0x41,0x3c,0x00,0x42,0x54,0xe6, - 0x3f,0x0a,0x41,0xe6,0x3f,0x52,0x54,0x3c,0x2a,0x06,0x42,0x18,0x2a,0x42,0x68, - 0x00,0x08,0x2a,0x44,0x00,0x00,0x06,0xd2,0xff,0xff,0x53,0x20,0x84,0x20,0x04, - 0x8a,0x10,0x8a,0xa8,0x20,0x4a,0x21,0x02}; diff --git a/etc/gnus/gnus-summary-caesar-message-up.xpm b/etc/gnus/gnus-summary-caesar-message-up.xpm deleted file mode 100644 index 6f56aa9..0000000 --- a/etc/gnus/gnus-summary-caesar-message-up.xpm +++ /dev/null @@ -1,38 +0,0 @@ -/* XPM */ -static char * icon-rot13_xpm[] = { -"32 32 3 1", -" c #BFBFBFBFBFBF s backgroundToolBarColor", -". c #000000000000", -"X c #FFFFFFFFFFFF", -" ", -" ", -" ", -" ", -" ................ ", -" .XXXXXXXXXXXXXX.. ", -" .XX..XX...XXX...X. ", -" .X.XX.X.XX.X.XX.XX. ", -" .X.XX.X.X.XX.XX..... ", -" .X....X.XX.X.XXXXXX. ", -" .X.XX.X...XXX...XXX. ", -" .XXXXXXXXXXXXXXXXXX. ", -" .XX.XXXXX.XXXX.XXXX. ", -" .XXXXXXXXXXXXXXXXXX. ", -" .X..X.XX..XX...XXXX. ", -" .X..X.X.XX.X.XX.XXX. ", -" .X.X..X.XX.X...XXXX. ", -" .X.X..X.XX.X.XXXXXX. ", -" .X.XX.XX..XX.XXXXXX. ", -" .XXXXXXXXXXXXXXXXXX. ", -" .XXXX..XXXXXXXXXXXX. ", -" .XXX....XXXXXXXXXXX. ", -" .XX..XX.........XXX. ", -" .XX..XX.........XXX. ", -" .XXX....XXX.X.X.XXX. ", -" .XXXX..XXXX.X.X.XXX. ", -" .XXXXXXXXXXXX.XXXXX. ", -" .XXXXXXXXXXXXXXXXXX. ", -" .................... ", -" ", -" ", -" "}; diff --git a/etc/gnus/gnus-summary-cancel-article-up.xbm b/etc/gnus/gnus-summary-cancel-article-up.xbm deleted file mode 100644 index e8d8d68..0000000 --- a/etc/gnus/gnus-summary-cancel-article-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x11,0x11,0x01,0x11,0x54,0x4a,0xa9,0x52,0x82,0x10,0x04,0x08,0x28,0x24,0xa1, - 0x42,0x91,0x91,0x0f,0x19,0x25,0xaa,0xa9,0x44,0x88,0x60,0x18,0x11,0x42,0x1c, - 0x56,0x44,0x19,0x07,0x97,0x31,0x44,0x01,0x23,0x0a,0x12,0x81,0x60,0x50,0x80, - 0x02,0x42,0x05,0x3b,0x05,0x78,0x59,0x00,0x0a,0x56,0x12,0xaa,0xf4,0x05,0x41, - 0x00,0x54,0x51,0x10,0x5b,0x51,0x95,0x55,0x10,0x15,0x00,0x11,0x42,0x40,0x55, - 0x44,0x10,0x2a,0x00,0x21,0x5b,0x91,0x5b,0x95,0x80,0x24,0x00,0x21,0x12,0x92, - 0x2a,0x14,0x44,0x01,0x80,0x42,0x11,0xb5,0x35,0x19,0x54,0x11,0x08,0x42,0x02, - 0x44,0xa1,0x08,0xa8,0x22,0x14,0x52,0x11,0x99,0x51,0x11,0x4a,0x22,0x14,0x4a, - 0x20,0x89,0x42,0x10,0x15,0x40,0x20,0x45}; diff --git a/etc/gnus/gnus-summary-cancel-article-up.xpm b/etc/gnus/gnus-summary-cancel-article-up.xpm deleted file mode 100644 index fa7c639..0000000 --- a/etc/gnus/gnus-summary-cancel-article-up.xpm +++ /dev/null @@ -1,39 +0,0 @@ -/* XPM */ -static char * icon-cancel-post_xpm[] = { -"32 32 4 1", -" c #000000000000", -". c #BFBFBFBFBFBF s backgroundToolBarColor", -"X c #FFFFFFFFFFFF", -"o c #999999999999", -" ... ... ... ... ....... ... ...", -"................................", -"................................", -"................................", -" ... ... ... ... .... ... ...", -"............... XX ............", -"............. XXXX ...........", -"........... XXXX X ...........", -" ... .... XXXXX X ... ... ...", -"........ XXXXXXX XXX ..........", -"........ XXXXXX oXXXX ..........", -"........o XXXXXXXoXXXX .........", -" ... ...oo XXXXXXXX . ... ...", -".........oo XXXXX oooo.........", -"..........oo o..............", -"..........ooooooo...............", -" ... ... ... oo. ... ... ... ...", -"................................", -"................................", -"................................", -" ... ... ... ... ... ... ... ...", -"................................", -"................................", -"................................", -" ... ... ... ... ... ... ... ...", -"................................", -"................................", -"................................", -" ... ... ... ... ... ... ... ...", -"................................", -"................................", -"................................"}; diff --git a/etc/gnus/gnus-summary-catchup-and-exit-up.xbm b/etc/gnus/gnus-summary-catchup-and-exit-up.xbm deleted file mode 100644 index 4adec42..0000000 --- a/etc/gnus/gnus-summary-catchup-and-exit-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x08,0x81,0x00,0x04,0x42,0x28,0x52,0x51,0x14,0x85,0x08,0x04,0x81,0x20,0x42, - 0x49,0x14,0x8a,0x08,0x20,0x41,0x21,0x52,0x15,0x14,0x44,0x00,0x40,0x41,0x91, - 0xbf,0x2a,0x14,0xda,0x10,0x80,0x81,0x94,0x90,0x2a,0x14,0x73,0xf0,0x80,0xe1, - 0x60,0x90,0x2b,0xc4,0x60,0x08,0x43,0xa2,0xf0,0x0f,0x15,0x88,0x11,0xfc,0x21, - 0xd2,0x11,0x8c,0x4a,0x80,0x12,0x84,0x00,0xd5,0x13,0x84,0x55,0x00,0x17,0x74, - 0x80,0x54,0xfb,0xcf,0x2a,0x02,0x9a,0x24,0x40,0x54,0x9f,0xbc,0x36,0xa9,0xf4, - 0x77,0x49,0x94,0x96,0x94,0xa4,0x25,0x95,0x35,0x15,0xa9,0xfe,0xbf,0xa4,0x92, - 0xdc,0x5c,0x29,0x4a,0x9e,0x3d,0x95,0xaa,0xfe,0x4f,0x52,0x24,0xf9,0xaf,0x4a, - 0xa9,0x52,0x91,0x94,0x25,0x29,0x55,0x52}; diff --git a/etc/gnus/gnus-summary-catchup-and-exit-up.xpm b/etc/gnus/gnus-summary-catchup-and-exit-up.xpm deleted file mode 100644 index a5d8ba6..0000000 --- a/etc/gnus/gnus-summary-catchup-and-exit-up.xpm +++ /dev/null @@ -1,39 +0,0 @@ -/* XPM */ -static char * icon-catchup_xpm[] = { -"32 32 4 1", -" c #BFBFBFBFBFBF s backgroundToolBarColor", -". c #000000000000", -"X c #FFFFFFFFFFFF", -"o c #999999999999", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ...... ", -" .. .XXXX. ", -" .X. .XXXX. ", -" ..XX...XXXXX.... ", -" ..XXXXX..XXXXX.XX... ", -" ..XXXXX..XXXX.XXXX.. ", -" .XXXX........XXXX. ", -" ..XXX.XXXXX....... ", -" ..XXX.XXXXX..XXX. ", -" .X.XX.XXXXX.XXXX. ", -" ...XX.XXXXX.XXXX. ", -" ...X.XXXXX.X... ", -" .X.........XX. ", -" . .XX.XX.XX. ", -"ooooooooo....XX.XX....oooooooooo", -"oooooooooo. ....... .oooooooooo", -"oooooooooo.X.XX.X .X.ooooooooooo", -"oooooooooo. .X . . .ooooooooooo", -"oooooooooo...........ooooooooooo", -"oooooooooo...X..XX...ooooooooooo", -"oooooooooo...X ..X...ooooooooooo", -"oooooooooo..........oooooooooooo", -"oooooooooooo.......ooooooooooooo", -"oooooooooooooooooooooooooooooooo", -"oooooooooooooooooooooooooooooooo"}; diff --git a/etc/gnus/gnus-summary-catchup-up.xbm b/etc/gnus/gnus-summary-catchup-up.xbm deleted file mode 100644 index ca093e1..0000000 --- a/etc/gnus/gnus-summary-catchup-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x11,0x91,0x11,0x95,0x54,0x25,0x54,0x21,0x02,0x90,0x00,0x84,0xa0,0x0a,0x54, - 0x29,0x1b,0xb1,0x11,0x91,0x40,0x0a,0x4a,0x25,0x8a,0xa0,0x20,0x88,0x20,0x14, - 0x0e,0x22,0x9b,0x51,0xb7,0x99,0x20,0x14,0x0b,0x02,0x42,0xc1,0x22,0x28,0x14, - 0x92,0x48,0x45,0x51,0x19,0x11,0x11,0x14,0x42,0xaa,0x54,0x42,0x88,0x00,0x02, - 0x90,0x72,0xaa,0x56,0x15,0x71,0x11,0x17,0x42,0x3a,0x49,0x4b,0x28,0x49,0xa4, - 0x22,0x04,0x30,0x02,0x09,0xb1,0xdb,0x59,0xb5,0x15,0xa0,0xd3,0xff,0x40,0x05, - 0xbf,0x02,0x2a,0xd3,0x08,0x54,0x91,0x53,0x77,0x7f,0xc8,0xa9,0xd4,0x8a,0x62, - 0x22,0x86,0x35,0xc8,0x5b,0x4b,0x67,0x93,0xfd,0x91,0x39,0x24,0x18,0xff,0x7a, - 0x90,0x46,0xc5,0xcf,0x25,0x94,0x21,0xf1}; diff --git a/etc/gnus/gnus-summary-catchup-up.xpm b/etc/gnus/gnus-summary-catchup-up.xpm deleted file mode 100644 index 9de9baf..0000000 --- a/etc/gnus/gnus-summary-catchup-up.xpm +++ /dev/null @@ -1,37 +0,0 @@ -/* XPM */ -static char * icon-catchup2_xpm[] = { -"32 32 2 1", -" c #000000000000", -". c #BFBFBFBFBFBF s backgroundToolBarColor", -" ... ... ... ... ... ... ... ...", -"................................", -"................................", -"................................", -" ... ... ... ... ... ... ... ...", -"................................", -"................................", -"................. .............", -" ... ... ... ... . ... ... ...", -"................ ..............", -"............... ................", -"................................", -" ... ... ... ... ... ... ... ...", -"................................", -"................................", -"............. .......... .....", -" ... ... ... . ... ... . ...", -"............ .......... ......", -"........... ........... ........", -"............ .......... .......", -" ... ... ... . . ... ... ... ...", -"............... ..... ", -"................ ... ......", -"........ ..... ... ...... .....", -" ... .. .. . . . . .. . .", -"....... .... .... ... .. . ... ", -"...... ...... ... ..... ... ...", -"...... .. .... ...... .. ..", -" ... ... . ... .. .. ..", -"........... .... . .... .", -".......... ..... ..... .. .", -".......... ..... ....... ... "}; diff --git a/etc/gnus/gnus-summary-exit-up.xbm b/etc/gnus/gnus-summary-exit-up.xbm deleted file mode 100644 index 4d55755..0000000 --- a/etc/gnus/gnus-summary-exit-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x19,0x51,0x91,0x11,0x82,0x14,0x2a,0x48,0x28,0x42,0x40,0x25,0x82,0x10,0x15, - 0x00,0x59,0xfa,0xff,0x5b,0x12,0x4b,0xfe,0x21,0x40,0x21,0xf1,0x93,0x2a,0x0b, - 0xf8,0x05,0x91,0xb5,0xf2,0x31,0x24,0x01,0xf1,0x4b,0x12,0x54,0xfa,0x01,0x80, - 0x83,0xf0,0x55,0x5b,0x35,0xf2,0x11,0x00,0x8b,0xfe,0x4b,0x2a,0x21,0xf7,0x21, - 0x80,0x0b,0xf6,0x13,0x5b,0xb5,0xf4,0x59,0x10,0x03,0xf1,0x01,0x42,0x2b,0xf4, - 0x55,0x90,0x40,0xf3,0x03,0x13,0x1a,0xf8,0x59,0xa8,0x83,0xf2,0x11,0x02,0x2b, - 0x5c,0x43,0x50,0xe3,0xee,0x10,0x93,0xfc,0x55,0x5b,0x48,0x92,0x92,0x00,0x22, - 0x49,0x48,0xaa,0x08,0x00,0x84,0x00,0xb5,0xbb,0x31,0x5b,0x01,0x00,0x0a,0x00, - 0x54,0x25,0x51,0x55,0x01,0x48,0x04,0x00}; diff --git a/etc/gnus/gnus-summary-exit-up.xpm b/etc/gnus/gnus-summary-exit-up.xpm deleted file mode 100644 index d1ab26a..0000000 --- a/etc/gnus/gnus-summary-exit-up.xpm +++ /dev/null @@ -1,37 +0,0 @@ -/* XPM */ -static char * icon-exit-summary_xpm[] = { -"32 32 2 1", -" c #000000000000", -". c #BFBFBFBFBFBF s backgroundToolBarColor", -" ... ... ... ... ... ... ... ...", -"................................", -"................................", -"................................", -" ... ...... ... ...", -"........ ....... .......", -"........ ........... .......", -"........ .......... .......", -" ... ... ... ....... ... ...", -"................ ... .......", -".................... .......", -"........ .......... .......", -" ... ... ... ....... ... ...", -"........ ....... . .......", -"........ ....... . .......", -"........ ....... . .......", -" ... ... ... ....... ... ...", -"........ .......... .......", -"........ ........... .......", -"................ ... .......", -" ... ....... ....... ... ...", -"........ .......... .......", -"........ ........ . . .......", -"........ .... . . . . ........", -" ... .. .. . . . . ... ...", -"................................", -"................................", -"................................", -" ... ... ... ... ... ... ... ...", -"................................", -"................................", -"................................"}; diff --git a/etc/gnus/gnus-summary-followup-up.xbm b/etc/gnus/gnus-summary-followup-up.xbm deleted file mode 100644 index c6ba686..0000000 --- a/etc/gnus/gnus-summary-followup-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x00,0x00,0x40,0x08,0xb6,0x76,0x37,0x63,0x20,0x02,0x00,0x04,0x8a,0x48,0x55, - 0x51,0x10,0x22,0x0e,0x82,0xa6,0xaa,0xa9,0x36,0x12,0x62,0x38,0x20,0xa0,0x18, - 0x96,0x4a,0x0a,0x07,0x17,0x00,0xa2,0x01,0xa3,0x76,0x6a,0x80,0x60,0x00,0x60, - 0x00,0x40,0x55,0x52,0x00,0x40,0x00,0xa6,0x00,0x80,0x6b,0x90,0xe1,0x80,0x04, - 0x24,0x9a,0x00,0x51,0x82,0x86,0x01,0x85,0xaa,0x61,0x01,0x32,0x60,0x70,0x01, - 0x42,0x1d,0x30,0x02,0x14,0x04,0x08,0x02,0x4c,0x06,0x00,0x02,0x28,0x06,0x00, - 0x04,0xac,0x08,0x00,0x08,0x0b,0x0a,0x00,0xc8,0x22,0x12,0x00,0x70,0x6a,0x1a, - 0x00,0x10,0x01,0x20,0x00,0x60,0x52,0x32,0x00,0x20,0x08,0x46,0x00,0x40,0x63, - 0x50,0x00,0x40,0x04,0x85,0x00,0x80,0x52}; diff --git a/etc/gnus/gnus-summary-followup-up.xpm b/etc/gnus/gnus-summary-followup-up.xpm deleted file mode 100644 index 3cee12e..0000000 --- a/etc/gnus/gnus-summary-followup-up.xpm +++ /dev/null @@ -1,38 +0,0 @@ -/* XPM */ -static char * icon-followup_xpm[] = { -"32 32 3 1", -" c #BFBFBFBFBFBF s backgroundToolBarColor", -". c #000000000000", -"X c #FFFFFFFFFFFF", -" ", -" . . . . . . . . ", -" ", -" ", -" ... ", -" . . . . ..XX. . . . ", -" ..XXXX.. ", -" ..XXXX..X. ", -" ..XXXXX...X. ", -" . . ..XXXXXXX..XXX. . . ", -" ..XXXXXXXX.XXXXX. ", -" .XXXXXXXXXXXXXXX. ", -" .XXXXXXXXXXXXXXX. ", -" . . .XXXXXXXXXXXXXXX. . . ", -" .XXXX...XXXXXXX. ", -" .X..XX.XXXXXXXX. ", -" ..XXXX..XXXXXXX. ", -" . ..XXXX..X.XXXXXXXX. . ", -" ..XXXXX...X.XXXXXXXX. ", -" ..XXXXXXX..XXX.XXXXXXXX. ", -" .XXXXXXXX.XXXXX.XXXXXXXX. ", -" ..XXXXXXXXXXXXXX.XXXXXXXXX. . ", -" .XXXXXXXXXXXXXXX.XXXXXXX.. ", -" .XXXXXXXXXXXXXXX.XXXX.. ", -" .XXXXXXXXXXXXXXX.XX.. ", -" . .XXXXXXXXXXXXXXX.. . . ", -" .XXXXXXXXXXXXXXX. ", -" .XXXXXXXXXXXXXXX. ", -" .XXXXXXXXXXXXXXX. ", -" . .XXXXXXXXXXXXXXX. . . ", -" .XXXXXXXXXXXXXXX. ", -" .XXXXXXXXXXXXXXX. "}; diff --git a/etc/gnus/gnus-summary-followup-with-original-up.xbm b/etc/gnus/gnus-summary-followup-with-original-up.xbm deleted file mode 100644 index a0e6dfe..0000000 --- a/etc/gnus/gnus-summary-followup-with-original-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x04,0x40,0x10,0x00,0xa3,0x36,0xa6,0x76,0x54,0x40,0x11,0x02,0x01,0x2a,0x88, - 0x48,0x54,0x81,0x22,0x22,0x22,0x6a,0xaa,0x2a,0x4a,0x02,0x21,0xa0,0x90,0x50, - 0x8e,0x0a,0x02,0x0a,0x27,0x50,0xb2,0xa2,0xab,0x26,0x42,0xaa,0x00,0x92,0x94, - 0x00,0xaa,0x20,0x00,0xaa,0x00,0x85,0xb6,0x22,0x76,0x32,0x20,0xea,0x80,0x44, - 0x8a,0x98,0x2a,0x11,0x10,0x87,0x00,0x44,0xa6,0x71,0x6b,0x33,0x60,0xcc,0x22, - 0x44,0x1d,0xe3,0x0a,0x11,0xc8,0xe0,0x24,0x44,0x3e,0x90,0x6c,0x2b,0x08,0x00, - 0x09,0xa0,0x06,0x00,0x49,0x0a,0x04,0x00,0x92,0x50,0x0b,0x00,0x32,0x26,0x0c, - 0x00,0xa4,0x90,0x11,0x00,0x24,0x24,0x14,0x00,0xc8,0x82,0x22,0x00,0x48,0x32, - 0x2a,0x00,0x90,0x42,0x50,0x00,0x90,0x28}; diff --git a/etc/gnus/gnus-summary-followup-with-original-up.xpm b/etc/gnus/gnus-summary-followup-with-original-up.xpm deleted file mode 100644 index baffb6b..0000000 --- a/etc/gnus/gnus-summary-followup-with-original-up.xpm +++ /dev/null @@ -1,38 +0,0 @@ -/* XPM */ -static char * icon-followup-w-orig_xpm[] = { -"32 32 3 1", -" c #BFBFBFBFBFBF s backgroundToolBarColor", -". c #000000000000", -"X c #FFFFFFFFFFFF", -" ", -" . . . . . . . . ", -" ", -" ", -" ", -" . . . . . . . . ", -" ", -" .. ", -" ... ", -" . . . . .. . . . ", -" . ", -" ", -" ", -" . . . . . . . . ", -" .. ", -" ..XX. ", -" ..XXXX. ", -" . ..XXX...X. . . . ", -" ..XXX..XX..X. ", -" ..XXX..XXX...X. ", -" .XX..XXXXX...XX. ", -" . ...XXXXXX.XX.XX. . . . ", -" .XXXXXXXXXXXX.XX. ", -" .XXXXXXXXXXXXX.XX. ", -" .XXXXXXXXXXXXXX.XX. ", -" . .XXXXXXXXXXXXX.XX. . . ", -" .XXXXXXXXXXXXXX.XX. ", -" .XXXXXXXXXXXXX.XX. ", -" .XXXXXXXXXXXXXX.XX. ", -" . .XXXXXXXXXXXXX.XX. . . ", -" .XXXXXXXXXXXXXX.XX. ", -" .XXXXXXXXXXXXX.XX. "}; diff --git a/etc/gnus/gnus-summary-mail-copy-up.xbm b/etc/gnus/gnus-summary-mail-copy-up.xbm deleted file mode 100644 index a1eea6b..0000000 --- a/etc/gnus/gnus-summary-mail-copy-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x00,0x20,0x20,0x40,0xaa,0x8a,0x0a,0x15,0xfe,0xff,0xff,0x27,0x0e,0x00,0x80, - 0x4d,0x32,0x00,0x60,0x04,0xc2,0x00,0x18,0x54,0x02,0x03,0x06,0x04,0x03,0x8c, - 0x01,0x54,0x02,0x74,0x02,0x04,0x02,0x03,0x0c,0x54,0x82,0x00,0x10,0x84,0xf2, - 0xff,0xff,0x3f,0x52,0x00,0x00,0x6c,0x9b,0x01,0x00,0x23,0x16,0x06,0xc0,0x60, - 0x1e,0x18,0x30,0x20,0x14,0x60,0x0c,0xa0,0x11,0xa0,0x0b,0x20,0x14,0x10,0x30, - 0x60,0x11,0x0c,0x40,0x20,0x14,0x02,0x80,0xa0,0x12,0x01,0x00,0x23,0xd8,0x00, - 0x00,0x64,0x32,0x00,0x00,0x38,0xf8,0xff,0xff,0xbf,0x02,0x00,0x40,0x24,0x54, - 0x55,0x15,0x11,0x01,0x00,0x40,0x44,0x54,0x55,0x15,0x11,0x01,0x00,0x40,0x44, - 0x54,0x55,0x05,0x11,0x02,0x00,0x50,0x44}; diff --git a/etc/gnus/gnus-summary-mail-copy-up.xpm b/etc/gnus/gnus-summary-mail-copy-up.xpm deleted file mode 100644 index e73e6d5..0000000 --- a/etc/gnus/gnus-summary-mail-copy-up.xpm +++ /dev/null @@ -1,38 +0,0 @@ -/* XPM */ -static char * icon-mail-copy_xpm[] = { -"32 32 3 1", -" c #BFBFBFBFBFBF s backgroundToolBarColor", -". c #000000000000", -"X c #FFFFFFFFFFFF", -" ", -" ", -" .......................... ", -" ...XXXXXXXXXXXXXXXXXXX..X. ", -" .XX..XXXXXXXXXXXXXXX..XXX. ", -" .XXXX..XXXXXXXXXXX..XXXXX. ", -" .XXXXXX..XXXXXXX..XXXXXXX. ", -" .XXXXXXXX..XXX..XXXXXXXXX. ", -" .XXXXXXXX.X...XX.XXXXXXXX. ", -" .XXXXXX..XXXXXXXX..XXXXXX. ", -" .XXXXX.XXXXXXXXXXXX.XXXXX. ", -" .XX.......................... ", -" .XX.X.XXXXXXXXXXXXXXXXXXX..X. ", -" .X..XX..XXXXXXXXXXXXXXX..XXX. ", -" ..X.XXXX..XXXXXXXXXXX..XXXXX. ", -" ....XXXXXX..XXXXXXX..XXXXXXX. ", -" .XXXXXXXX..XXX..XXXXXXXXX. ", -" .XXXXXXXX.X...X.XXXXXXXXX. ", -" .XXXXXXX.XXXXXXX..XXXXXXX. ", -" .XXXXX..XXXXXXXXXX.XXXXXX. ", -" .XXXX.XXXXXXXXXXXXX.XXXXX. ", -" .XXX.XXXXXXXXXXXXXXX..XXX. ", -" .X..XXXXXXXXXXXXXXXXXX.XX. ", -" ..XXXXXXXXXXXXXXXXXXXXX... ", -" .......................... ", -" ", -" ", -" ", -" ", -" ", -" ", -" "}; diff --git a/etc/gnus/gnus-summary-mail-delete-up.xbm b/etc/gnus/gnus-summary-mail-delete-up.xbm deleted file mode 100644 index 9d1c637..0000000 --- a/etc/gnus/gnus-summary-mail-delete-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x08,0x00,0x80,0x00,0xa2,0xaa,0x2a,0x54,0x08,0x00,0x40,0x81,0xf2,0xab,0x2a, - 0x28,0x5c,0x03,0x80,0x82,0x2d,0x56,0xf5,0x28,0x84,0x06,0x98,0x8b,0x5d,0x5e, - 0xe7,0x2c,0x1c,0x1f,0x1f,0xba,0xf1,0xf3,0xa7,0xc9,0x44,0xa8,0x90,0x88,0xf1, - 0xf3,0x8b,0x08,0x1c,0x5f,0x7f,0x09,0xad,0x1e,0xff,0x08,0x04,0x46,0x08,0x04, - 0xae,0x26,0x06,0x04,0x18,0x8b,0x02,0x06,0xfa,0x23,0xc1,0x01,0x20,0x88,0x38, - 0x00,0x95,0x62,0x07,0x80,0x40,0xe4,0x00,0x40,0x14,0xd1,0x00,0x20,0x42,0x44, - 0x03,0x60,0x10,0x11,0x05,0x10,0x4a,0x44,0x1c,0xa8,0x00,0x11,0x61,0x0c,0x2a, - 0x42,0xa4,0x25,0x81,0x14,0x09,0x42,0x14,0x20,0x50,0x15,0xa1,0x4a,0x05,0x40, - 0x04,0x00,0xa8,0x0a,0x51,0x55,0x05,0x50}; diff --git a/etc/gnus/gnus-summary-mail-delete-up.xpm b/etc/gnus/gnus-summary-mail-delete-up.xpm deleted file mode 100644 index 932d8f2..0000000 --- a/etc/gnus/gnus-summary-mail-delete-up.xpm +++ /dev/null @@ -1,39 +0,0 @@ -/* XPM */ -static char * icon-mail-delete_xpm[] = { -"32 32 4 1", -" c #BEBEBEBEBEBE s backgroundToolBarColor", -"X c #000000000000", -"o c #E7E7E7E7E7E7", -"O c #FFFFFFFFFFFF", -" ", -" ", -" ", -" XXXXX ", -" XX XX ", -" XX XX XXX ", -" X X XXooXX X ", -" XX XXX XXooXX XX ", -" XX XXXXX XXXXX XOXXX ", -" XXXXX XXXXXX XOOXOOXX", -" XOX XOOOXOOOX", -" XXXXX XXXXXX XOOOXOOOO", -" XX XXXXX XXXXXX XOOXOOOO", -" XX XXX XXXXXXXOOOXOOOO", -" X X XOOOOOOXOOOOO", -" XX XX XOOOOOOOXOOOOO", -" XX XX XOOOOOOOXXOOOOO", -" XXXXX XOOOOOXXXOOOOOOO", -" XOOOXXXOOOOOOOOOO", -" XOXXXOOOOOOOOOOOOX", -" XXXOOOOOOOOOOOOOOX ", -" XXOOOOOOOOOOOOOX ", -" XXOOOOOOOOOOOX ", -" XOOOOOOOOOX ", -" XXOOOOOOX ", -" XXOOOX ", -" XXOX ", -" X ", -" ", -" ", -" ", -" "}; diff --git a/etc/gnus/gnus-summary-mail-forward-up.xbm b/etc/gnus/gnus-summary-mail-forward-up.xbm deleted file mode 100644 index 1b66f5b..0000000 --- a/etc/gnus/gnus-summary-mail-forward-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x10,0x42,0x80,0x20,0x84,0x10,0x2a,0x14,0x3a,0xa5,0x40,0x41,0x64,0x08,0x14, - 0x28,0xd6,0xa0,0x62,0x85,0x80,0x15,0xe8,0x20,0xca,0x41,0x39,0x8b,0xb0,0x2a, - 0x24,0x22,0xd2,0x86,0x12,0x86,0x58,0x24,0x11,0x2c,0xd2,0x8c,0x08,0x98,0x34, - 0x75,0x08,0x10,0x30,0x14,0x08,0x60,0x8a,0x0e,0x04,0x20,0x10,0x05,0xfc,0x7f, - 0x45,0x02,0x02,0x60,0x10,0x01,0x03,0x18,0xca,0xe0,0x01,0x44,0x20,0x3e,0x00, - 0x0a,0xf4,0x21,0x00,0x53,0x32,0x20,0x80,0x80,0x10,0x10,0x40,0x2a,0x2a,0x10, - 0xb0,0x80,0x60,0x10,0x28,0x2a,0xea,0x10,0x84,0x40,0x81,0x10,0x2a,0x14,0x94, - 0x11,0x41,0x21,0x21,0xca,0x2a,0x48,0x84,0xac,0x80,0x02,0x21,0x3d,0x54,0x50, - 0x14,0x84,0x00,0x05,0x42,0x21,0xaa,0x50}; diff --git a/etc/gnus/gnus-summary-mail-forward-up.xpm b/etc/gnus/gnus-summary-mail-forward-up.xpm deleted file mode 100644 index 19db803..0000000 --- a/etc/gnus/gnus-summary-mail-forward-up.xpm +++ /dev/null @@ -1,38 +0,0 @@ -/* XPM */ -static char * icon-mail-forward_xpm[] = { -"32 32 3 1", -" c #BFBFBFBFBFBF s backgroundToolBarColor", -". c #000000000000", -"X c #FFFFFFFFFFFF", -" ", -" ", -" ... ", -" . . ", -" . . . ", -" . ... ", -" ... ...XX. ", -" . . . .XX.XXX. ", -" . . . .XX.XXXX.. ", -" . . . .XXX.XXXXX.. ", -" . . . .XXX.XXXXXXX. ", -" .. . ..XXXX.XXXXXXXX. ", -" . . .XXXXXX.XXXXXXXXX. ", -" . .XXXXXX.XXXXXXXXXX. ", -" .XXXXXXX............. ", -" .XXXXXXX.XXXXXXXXXXX. ", -" .XXXXXXX..XXXXXXXXX.. ", -" ..XXXXX....XXXXXXXXX. ", -" .XXX.....XXXXXXXXXXX. ", -" ....XXXX.XXXXXXXXXX. ", -" ..XXXXXXX.XXXXXXXXX. ", -" .XXXXXXX.XXXXXXXXX. ", -" .XXXXXX.XXXXXXX.. ", -" ..XXXXX.XXXXXX. ", -" ..XXXX.XXXXX. ", -" .XXXX.XXXX. ", -" .XXX.XXX. ", -" .X.XX.. ", -" ..X. ", -" ... ", -" ", -" "}; diff --git a/etc/gnus/gnus-summary-mail-get-up.xbm b/etc/gnus/gnus-summary-mail-get-up.xbm deleted file mode 100644 index 0d0e212..0000000 --- a/etc/gnus/gnus-summary-mail-get-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x48,0x00,0x11,0x02,0x12,0x54,0x84,0x50,0x40,0x81,0x50,0x82,0x2a,0x28,0x0a, - 0x28,0x80,0x42,0xa0,0x82,0xaa,0x13,0x3d,0x28,0x40,0x46,0xd4,0x42,0xb5,0x28, - 0x86,0x10,0x50,0xda,0x51,0x47,0x99,0xb0,0x09,0x13,0x14,0x50,0x01,0x45,0x21, - 0x18,0x82,0x21,0x74,0x4c,0xc7,0x94,0x81,0x13,0x78,0x02,0x94,0x44,0x05,0x29, - 0xf1,0xff,0xff,0x7f,0x74,0x00,0x00,0x2c,0x91,0x01,0x00,0x23,0x14,0x06,0xc0, - 0xa0,0x11,0x18,0x30,0x20,0x14,0x60,0x0c,0x60,0x12,0x90,0x0b,0x20,0x18,0x0c, - 0x30,0xa0,0x12,0x02,0x40,0x20,0x18,0x01,0x80,0xa0,0xd2,0x00,0x00,0x23,0x38, - 0x00,0x00,0x64,0x12,0x00,0x00,0x38,0xf8,0xff,0xff,0xbf,0x02,0x00,0x00,0x20, - 0xa8,0xaa,0xaa,0x8a,0x05,0x00,0x40,0x20}; diff --git a/etc/gnus/gnus-summary-mail-get-up.xpm b/etc/gnus/gnus-summary-mail-get-up.xpm deleted file mode 100644 index ffdb84c..0000000 --- a/etc/gnus/gnus-summary-mail-get-up.xpm +++ /dev/null @@ -1,38 +0,0 @@ -/* XPM */ -static char * icon-mail-get_xpm[] = { -"32 32 3 1", -" c #BFBFBFBFBFBF s backgroundToolBarColor", -". c #000000000000", -"X c #FFFFFFFFFFFF", -" ", -" ", -" ", -" ", -" ", -" ... ... ", -" . . . . ", -" . . . . ", -" . . . . .. ", -" . .. .. .. ", -" .XXXXXXX. .XXXXXXX. ", -" .XXXXX. .XXXXX. ", -" ..XXX.. ..XXX.. ", -" ... ... ", -" ", -" .......................... ", -" ...XXXXXXXXXXXXXXXXXXX..X. ", -" .XX..XXXXXXXXXXXXXXX..XXX. ", -" .XXXX..XXXXXXXXXXX..XXXXX. ", -" .XXXXXX..XXXXXXX..XXXXXXX. ", -" .XXXXXXXX..XXX..XXXXXXXXX. ", -" .XXXXXXX.XX...X.XXXXXXXXX. ", -" .XXXXX..XXXXXXXX..XXXXXXX. ", -" .XXXX.XXXXXXXXXXXX.XXXXXX. ", -" .XXX.XXXXXXXXXXXXXX.XXXXX. ", -" .X..XXXXXXXXXXXXXXXX..XXX. ", -" ..XXXXXXXXXXXXXXXXXXXX.XX. ", -" .XXXXXXXXXXXXXXXXXXXXXX... ", -" .......................... ", -" ", -" ", -" "}; diff --git a/etc/gnus/gnus-summary-mail-originate-up.xbm b/etc/gnus/gnus-summary-mail-originate-up.xbm deleted file mode 100644 index 6d25e12..0000000 --- a/etc/gnus/gnus-summary-mail-originate-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x04,0x42,0x08,0x10,0xa1,0x10,0x42,0x05,0x14,0xa2,0xff,0xaf,0x01,0x89,0x00, - 0x14,0x54,0xa4,0x00,0x64,0x02,0xc1,0x00,0x3c,0xf8,0xff,0x1f,0xa0,0x6d,0x10, - 0x68,0x20,0xf8,0xff,0x1f,0x60,0x12,0x84,0x00,0x20,0x48,0xd1,0x00,0xa0,0x02, - 0x88,0xfc,0x21,0xfc,0xff,0x00,0x60,0x1e,0x80,0x6c,0x21,0x64,0x80,0x00,0xa0, - 0x86,0x81,0x00,0x20,0x04,0x86,0x00,0x60,0x05,0x98,0x00,0x20,0x04,0xe4,0x00, - 0xa0,0x06,0x83,0x80,0x25,0x84,0x80,0x00,0x60,0x46,0x80,0x00,0x20,0x34,0x80, - 0x00,0xa0,0x0d,0x80,0xff,0x3f,0x04,0x00,0x00,0x2e,0xfe,0xff,0xff,0x4f,0x48, - 0x92,0x44,0x12,0x92,0x08,0x11,0x44,0x00,0x21,0x44,0x11,0x55,0x48,0x21,0x44, - 0x80,0x02,0x8a,0x10,0x2a,0xa8,0x40,0x44}; diff --git a/etc/gnus/gnus-summary-mail-originate-up.xpm b/etc/gnus/gnus-summary-mail-originate-up.xpm deleted file mode 100644 index 8ba8bc2..0000000 --- a/etc/gnus/gnus-summary-mail-originate-up.xpm +++ /dev/null @@ -1,38 +0,0 @@ -/* XPM */ -static char * icon-mail-originate_xpm[] = { -"32 32 3 1", -" c #BFBFBFBFBFBF s backgroundToolBarColor", -". c #000000000000", -"X c #FFFFFFFFFFFF", -" ", -" ", -" ............. ", -" .XXXXXXXXXX.X. ", -" .XXXXXXXXXX.XX. ", -" .XXXXXXXXXX.... ", -" ..................XXXXXXXX. ", -" .X. X X X X X X .X..XXXXXX. ", -" ..................XXXXXXXX. ", -" .XXXXXXXXXXXXX. ", -" .XXXXXXXXXXXXX. ", -" .XX.......XXXX. ", -" ..............XXXXXXXXXXXXX. ", -" ...XXXXXXXXXX.XX..X..X.XXXX. ", -" .XX..XXXXXXXX.XXXXXXXXXXXXX. ", -" .XXXX..XXXXXX.XXXXXXXXXXXXX. ", -" .XXXXXX..XXXX.XXXXXXXXXXXXX. ", -" .XXXXXXXX..XX.XXXXXXXXXXXXX. ", -" .XXXXXXX.XX...XXXXXXXXXXXXX. ", -" .XXXXX..XXXXX.XXXXXXX..X.XX. ", -" .XXXX.XXXXXXX.XXXXXXXXXXXXX. ", -" .XXX.XXXXXXXX.XXXXXXXXXXXXX. ", -" .X..XXXXXXXXX.XXXXXXXXXXXXX. ", -" ..XXXXXXXXXXX............... ", -" .XXXXXXXXXXXXXXXXXXXXXX... ", -" .......................... ", -" ", -" ", -" ", -" ", -" ", -" "}; diff --git a/etc/gnus/gnus-summary-mail-reply-up.xbm b/etc/gnus/gnus-summary-mail-reply-up.xbm deleted file mode 100644 index e16ec66..0000000 --- a/etc/gnus/gnus-summary-mail-reply-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x00,0x40,0x40,0x20,0xaa,0x2a,0x7a,0x0a,0x00,0x80,0x88,0x51,0xaa,0x2a,0x06, - 0x06,0x00,0xc0,0x05,0x58,0xaa,0x3a,0x12,0x08,0x00,0x0c,0x11,0x2c,0xaa,0x03, - 0x09,0x42,0xc0,0x80,0x04,0x06,0x35,0x40,0x04,0x57,0x98,0x49,0x80,0x18,0x3a, - 0x20,0x41,0x56,0xc8,0x10,0xc1,0x11,0x0c,0x93,0x60,0x50,0x0a,0x1c,0x18,0x90, - 0x08,0x30,0x06,0x30,0x0a,0xc8,0x05,0x90,0x08,0x06,0x18,0x30,0x0a,0x01,0x20, - 0x10,0x88,0x00,0x40,0x50,0x6a,0x00,0x80,0x11,0x19,0x00,0x00,0x52,0x0c,0x00, - 0x00,0x1c,0xf9,0xff,0xff,0x5f,0x44,0x44,0x44,0x24,0x11,0x11,0x11,0x09,0x44, - 0x44,0x44,0xa0,0x11,0x11,0x11,0x15,0x44,0x44,0x44,0x40,0x11,0x11,0x91,0x14, - 0x44,0x44,0x04,0xa2,0x11,0x22,0xa2,0x08}; diff --git a/etc/gnus/gnus-summary-mail-reply-up.xpm b/etc/gnus/gnus-summary-mail-reply-up.xpm deleted file mode 100644 index 20fe672..0000000 --- a/etc/gnus/gnus-summary-mail-reply-up.xpm +++ /dev/null @@ -1,38 +0,0 @@ -/* XPM */ -static char * icon-mail-reply_xpm[] = { -"32 32 3 1", -" c #BFBFBFBFBFBF s backgroundToolBarColor", -". c #000000000000", -"X c #FFFFFFFFFFFF", -" ", -" ... ", -" .XXX.. ", -" .XXXXXX.. ", -" ... .XXXXXXXX. ", -" ..XXX.XX.XXXXXX. ", -" ..XXXX.XXX.XXXXX. ", -" ..XXXXXX.XX.XXXXX. ", -" ..XXXXXXX.XX.XXXXXX. ", -" .XXXXXXXX.XXX.XXXXX... ", -" ..XX..XX.XX.XXXXXXXX.XXX.. ", -" ...XXXXXXX.XX.XXXXX.XX..X. ", -" .XX..XXXX.XXX.XXXXX...XXX. ", -" .XXXX..XX.XX.XXXXX..XXXXX. ", -" .XXXXXX...XXXXXX..XXXXXXX. ", -" .XXXXXXXX..XXX..XXXXXXXXX. ", -" .XXXXXXX.XX...X.XXXXXXXXX. ", -" .XXXXX..XXXXXXXX..XXXXXXX. ", -" .XXXX.XXXXXXXXXXXX.XXXXXX. ", -" .XXX.XXXXXXXXXXXXXX.XXXXX. ", -" .X..XXXXXXXXXXXXXXXX..XXX. ", -" ..XXXXXXXXXXXXXXXXXXXX.XX. ", -" .XXXXXXXXXXXXXXXXXXXXXX... ", -" .......................... ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" "}; diff --git a/etc/gnus/gnus-summary-mail-save-up.xbm b/etc/gnus/gnus-summary-mail-save-up.xbm deleted file mode 100644 index 0601dfb..0000000 --- a/etc/gnus/gnus-summary-mail-save-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x00,0x10,0x10,0x00,0x55,0x45,0x45,0x55,0x00,0x10,0x08,0x00,0xd4,0xff,0xff, - 0x7f,0x82,0x03,0x00,0xf0,0xd0,0x0c,0x00,0x4c,0x82,0x30,0x00,0x43,0xd4,0xc0, - 0xc0,0x40,0x80,0x80,0x33,0xc0,0xaa,0x60,0xcc,0x40,0xc0,0x10,0x00,0x41,0x95, - 0x08,0x00,0x46,0xc0,0x06,0x00,0xd8,0xfe,0xff,0x0f,0x60,0x2c,0x00,0x0b,0x40, - 0x35,0x10,0xfd,0x7f,0x2c,0x02,0x2b,0x49,0x35,0x40,0x4d,0x12,0xac,0x00,0x0b, - 0xa0,0x35,0x00,0xad,0x0a,0x2c,0x24,0x09,0x90,0x2d,0x00,0x5d,0x25,0xf4,0xff, - 0x0b,0x80,0xa6,0x55,0xad,0x2a,0x4c,0xaa,0x08,0x40,0xf5,0xff,0x5d,0x15,0x6c, - 0x35,0x0b,0x20,0x66,0x37,0xab,0x4a,0x6c,0x2d,0x0d,0x00,0xb9,0x35,0x4b,0x55, - 0xf4,0xff,0x1f,0x80,0x01,0x40,0x80,0x2a}; diff --git a/etc/gnus/gnus-summary-mail-save-up.xpm b/etc/gnus/gnus-summary-mail-save-up.xpm deleted file mode 100644 index fd4824b..0000000 --- a/etc/gnus/gnus-summary-mail-save-up.xpm +++ /dev/null @@ -1,41 +0,0 @@ -/* XPM */ -static char * icon-save-mail_xpm[] = { -"32 32 6 1", -" c #BFBFBFBFBFBF s backgroundToolBarColor", -". c #000000000000", -"X c #FFFFFFFFFFFF", -"o c #999999999999", -"O c #E5E5E5E5E5E5", -"+ c #666666666666", -" ", -" ", -" ", -" ........................ ", -" ...XXXXXXXXXXXXXXXXXX... ", -" .XX..XXXXXXXXXXXXXX..XX. ", -" .XXXX..XXXXXXXXXX..XXXX. ", -" .XXXXXX..XXXXXX..XXXXXX. ", -" .XXXXXXX...XX..XXXXXXXX. ", -" .XXXXX..XXX..XX..XXXXXX. ", -" .XXXX.XXXXXXXXXXX.XXXXX. ", -" .XXX.XXXXXXXXXXXXX..XXX. ", -" .X..XXXXXXXXXXXXXXXX..X. ", -" ..................XXXXXXXXX.. ", -" .oo.OOOOOOOOOO.oo.XXXXXXXXXX. ", -" .oo.OOOOOOOOOO.oo............ ", -" .oo.OOOOOOOOOO.oo. ", -" .oo.OOOOOOOOOO.oo. ", -" .oo.OOOOOOOOOO.oo. ", -" .oo.OOOOOOOOOO.oo. ", -" .oo.OOOOOOOOOO.oo. ", -" .oo.OOOOOOOOOO.oo. ", -" .oo............oo. ", -" .oooooooooooooooo. ", -" .oooooooooooooooo. ", -" .oo............oo. ", -" .oo.+++++++.OO.oo. ", -" .oo.+++++++.OO.oo. ", -" .oo.+++++++.OO.oo. ", -" .o.+++++++.OO.oo. ", -" ................ ", -" "}; diff --git a/etc/gnus/gnus-summary-next-unread-up.xbm b/etc/gnus/gnus-summary-next-unread-up.xbm deleted file mode 100644 index a6c17a9..0000000 --- a/etc/gnus/gnus-summary-next-unread-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x08,0x10,0x20,0x00,0xa3,0x66,0xab,0x76,0x14,0x11,0x04,0x02,0x41,0x04,0xa1, - 0x48,0x14,0x51,0x1e,0x22,0x62,0xa6,0xa9,0x2a,0x0a,0x71,0x18,0xa0,0x40,0x18, - 0xb6,0x0a,0x8a,0x06,0x17,0x50,0xb2,0x01,0x63,0x27,0x62,0x80,0x20,0x90,0x50, - 0x00,0x40,0x25,0x4a,0x00,0x40,0x80,0xe2,0x00,0x80,0x36,0x12,0xe1,0x80,0x41, - 0x84,0x9a,0x00,0x29,0x10,0x87,0x01,0x85,0xa6,0x61,0x01,0x32,0x62,0x70,0x01, - 0x42,0x18,0x30,0x02,0x14,0x06,0x08,0x02,0x4c,0x06,0x00,0x02,0x28,0x04,0x00, - 0x04,0xac,0xca,0x07,0x7c,0x0b,0x68,0x0d,0xea,0x20,0x1b,0x12,0x93,0x6b,0xb4, - 0x54,0x29,0x03,0x91,0xba,0x95,0x51,0x74,0x19,0x53,0x0b,0x6a,0x0a,0xd6,0x62, - 0xe0,0x07,0x7c,0x09,0x8a,0x00,0x80,0x42}; diff --git a/etc/gnus/gnus-summary-next-unread-up.xpm b/etc/gnus/gnus-summary-next-unread-up.xpm deleted file mode 100644 index e525816..0000000 --- a/etc/gnus/gnus-summary-next-unread-up.xpm +++ /dev/null @@ -1,39 +0,0 @@ -/* XPM */ -static char * icon-next-unread_xpm[] = { -"32 32 4 1", -" c #BFBFBFBFBFBF s backgroundToolBarColor", -". c #000000000000", -"X c #FFFFFFFFFFFF", -"o c #999999999999", -" ", -" . . . . . . . . ", -" ", -" ", -" ... ", -" . . . . ..XX. . . . ", -" ..XXXX.. ", -" ..XXXX..X. ", -" ..XXXXX...X. ", -" . . ..XXXXXXX..XXX. . . ", -" ..XXXXXXXX.XXXXX. ", -" .XXXXXXXXXXXXXXX. ", -" .XXXXXXXXXXXXXXX. ", -" . . .XXXXXXXXXXXXXXX. . . ", -" .XXXX...XXXXXXX. ", -" .X..XX.XXXXXXXX. ", -" ..XXXX..XXXXXXX. ", -" . ..XXXX..X.XXXXXXXX. . ", -" ..XXXXX...X.XXXXXXXX. ", -" ..XXXXXXX..XXX.XXXXXXXX. ", -" .XXXXXXXX.XXXXX.XXXXXXXX. ", -" ..XXXXXXXXXXXXXX.XXXXXXXXX. . ", -" .XXXXXXXXXXXXXXX.XXXXXXX.. ", -" .XX.....XXXXXXX.....X.. ", -" .X.ooooo.XXXXX.oooo.. ", -" . .oXooooo.XXX.oXooooo.. . ", -" .ooooooo.X.X.ooooooo. ", -" .ooooooo..X..ooooooo. ", -" ..oooooo.XXX.ooooooo. ", -" . ..oooo.XXXXX.oooo.. . . ", -" .....XXXXXXX..... ", -" .XXXXXXXXXXXXXXX. "}; diff --git a/etc/gnus/gnus-summary-post-news-up.xbm b/etc/gnus/gnus-summary-post-news-up.xbm deleted file mode 100644 index 8eb4c33..0000000 --- a/etc/gnus/gnus-summary-post-news-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x00,0x10,0x10,0x01,0x6b,0xa7,0x66,0x72,0x04,0x10,0x02,0x05,0xa1,0x8a,0x50, - 0x48,0x04,0x20,0x8f,0x20,0x72,0xab,0x39,0x2b,0x02,0x64,0x58,0xa4,0x50,0x19, - 0x16,0x01,0x0a,0x06,0x57,0x54,0xe2,0x01,0x23,0x23,0x72,0x80,0x20,0x94,0x44, - 0x00,0x40,0x01,0x50,0x00,0xc0,0x54,0xa6,0x00,0x80,0x22,0x92,0x00,0x80,0x4a, - 0x40,0x01,0x00,0x11,0x8a,0x01,0x00,0x45,0x32,0x02,0x00,0x2a,0x42,0x02,0x00, - 0xa2,0x10,0x05,0x00,0x0c,0x4a,0x06,0x00,0x24,0x22,0x0a,0x00,0x68,0xaa,0x0c, - 0x00,0x0c,0x00,0x11,0x80,0x53,0x2a,0x14,0x40,0x05,0x22,0x23,0x70,0x62,0x92, - 0x34,0x0e,0x09,0x24,0xc0,0x4b,0x52,0x80,0x0a,0x21,0x80,0x6b,0x62,0xaa,0x36, - 0x04,0x15,0x01,0x42,0x51,0x80,0xa8,0x28}; diff --git a/etc/gnus/gnus-summary-post-news-up.xpm b/etc/gnus/gnus-summary-post-news-up.xpm deleted file mode 100644 index 46be7c1..0000000 --- a/etc/gnus/gnus-summary-post-news-up.xpm +++ /dev/null @@ -1,38 +0,0 @@ -/* XPM */ -static char * icon-post_xpm[] = { -"32 32 3 1", -" c #BFBFBFBFBFBF s backgroundToolBarColor", -". c #000000000000", -"X c #FFFFFFFFFFFF", -" ", -" . . . . . . . . ", -" ", -" ", -" ... ", -" . . . . ..XX. . . . ", -" ..XXXX.. ", -" ..XXXX..X. ", -" ..XXXXX...X. ", -" . . ..XXXXXXX..XXX. . . ", -" ..XXXXXXXX.XXXXX. ", -" .XXXXXXXXXXXXXXX. ", -" .XXXXXXXXXXXXXXX. ", -" . . .XXXXXXXXXXXXXXX. . . ", -" .XXXXXXXXXXXXXXX. ", -" .XXXXXXXXXXXXXXX. ", -" .XXXXXXXXXXXXXXX. ", -" . . .XXXXXXXXXXXXXXX. . ", -" .XXXXXXXXXXXXXXX. ", -" .XXXXXXXXXXXXXXX. ", -" .XXXXXXXXXXXXXXX. ", -" . . . .XXXXXXXXXXXXXXX. . ", -" .XXXXXXXXXXXXXX.. ", -" .XXXXXXXXXX... ", -" .XXXXXXXXX. ", -" . . . .XXXXXX.. . . ", -" .XXX... ", -" .... ", -" ", -" . . . . . . . . ", -" ", -" "}; diff --git a/etc/gnus/gnus-summary-prev-unread-up.xbm b/etc/gnus/gnus-summary-prev-unread-up.xbm deleted file mode 100644 index 6cf240e..0000000 --- a/etc/gnus/gnus-summary-prev-unread-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x08,0x08,0x40,0x20,0x23,0x63,0x2b,0x2b,0x54,0x14,0x24,0xa4,0x01,0x02,0x09, - 0x01,0x54,0xa9,0x2e,0x2a,0x22,0xa2,0xa9,0x62,0x4a,0x6a,0x18,0x12,0x90,0x18, - 0xb6,0x04,0x02,0x06,0x17,0x50,0xea,0x01,0x63,0x2b,0x64,0x80,0x20,0x44,0x51, - 0x00,0x40,0x21,0x44,0x00,0x40,0x8a,0xe2,0x00,0xc0,0x22,0x0a,0xe1,0xc0,0x2f, - 0xd0,0x9f,0x20,0x4d,0x42,0x87,0xb1,0x1a,0xea,0x61,0x15,0x72,0x60,0x70,0xbb, - 0x14,0x1d,0x30,0xb1,0x5a,0x04,0x08,0x22,0x0d,0x06,0x00,0xc2,0x6f,0x06,0x00, - 0x84,0x20,0x08,0x00,0x64,0x0a,0x0a,0x00,0x58,0x50,0x12,0x00,0x10,0x27,0x1a, - 0x00,0x50,0x90,0x20,0x00,0xa0,0x24,0x32,0x00,0x20,0x82,0x26,0x00,0xc0,0x32, - 0x40,0x00,0x40,0x44,0xaa,0x00,0x80,0x11}; diff --git a/etc/gnus/gnus-summary-prev-unread-up.xpm b/etc/gnus/gnus-summary-prev-unread-up.xpm deleted file mode 100644 index b2088fb..0000000 --- a/etc/gnus/gnus-summary-prev-unread-up.xpm +++ /dev/null @@ -1,39 +0,0 @@ -/* XPM */ -static char * icon-prev-unread_xpm[] = { -"32 32 4 1", -" c #BFBFBFBFBFBF s backgroundToolBarColor", -". c #000000000000", -"X c #FFFFFFFFFFFF", -"o c #999999999999", -" ", -" . . . . . . . . ", -" ", -" ", -" ... ", -" . . . . ..XX. . . . ", -" ..XXXX.. ", -" ..XXXX..X. ", -" ..XXXXX...X. ", -" . . ..XXXXXXX..XXX. . . ", -" ..XXXXXXXX.XXXXX. ", -" .XXXXXXXXXXXXXXX. ", -" .XXXXXXXXXXXXXXX. ", -" . . .XXXXXXXXXXXXXX. . . ", -" .XXXX...XXXXXX..... ", -" ...o..XX.XXXXX.oooo.. ", -" .oo..XXXX..XXX.oXooooo. ", -" . .o..XXXX..X.X.X.ooooooo.. ", -" ..XXXXX...X..X..ooooooo. ", -" ..XXXXXXX..XX.XXX.ooooooo. ", -" .XXXXXXXX.XXXXX.XXX.oooo.. ", -" ..XXXXXXXXXXXXXX.XXXX..... . ", -" .XXXXXXXXXXXXXXX.XXXX. ", -" .XXXXXXXXXXXXXX.XX.. ", -" .XXXXXXXXXXXXXXX.. ", -" . .XXXXXXXXXXXXXXX. . . ", -" .XXXXXXXXXXXXXXX. ", -" .XXXXXXXXXXXXXXX. ", -" .XXXXXXXXXXXXXXX. ", -" . .XXXXXXXXXXXXXXXX. . . ", -" .XXXXXXXXXXXXXXX. ", -" .XXXXXXXXXXXXXXX. "}; diff --git a/etc/gnus/gnus-summary-reply-up.xbm b/etc/gnus/gnus-summary-reply-up.xbm deleted file mode 100644 index 61dad9a..0000000 --- a/etc/gnus/gnus-summary-reply-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x10,0x00,0x11,0x88,0x45,0x55,0x84,0x22,0x08,0x80,0x10,0x88,0x42,0x55,0xa4, - 0x22,0x28,0x00,0x01,0x84,0x05,0x55,0x5a,0x21,0x50,0x00,0x35,0x8a,0x09,0xf5, - 0xc2,0x20,0x24,0x18,0x81,0x85,0x01,0x87,0x00,0x2a,0xd4,0x41,0x00,0x43,0x61, - 0x40,0x80,0x17,0x1c,0x20,0x80,0x58,0xb5,0x1a,0xc0,0x3f,0x0c,0x08,0x60,0xb0, - 0x75,0x08,0xb0,0x2e,0x84,0x04,0xb8,0xa1,0x06,0x03,0x4c,0x20,0x04,0x0c,0x36, - 0x60,0x06,0x10,0x0f,0x20,0x06,0x70,0x07,0x60,0x05,0xc8,0x09,0xa0,0x04,0x04, - 0x10,0xa0,0x06,0x02,0x20,0x60,0x85,0x01,0xc0,0xa0,0x44,0x00,0x00,0x61,0x25, - 0x00,0x00,0x22,0x1e,0x00,0x00,0xbc,0x0e,0x00,0x00,0x70,0xfd,0xff,0xff,0x3f, - 0x94,0x52,0x55,0x55,0x4a,0x29,0x22,0xa2}; diff --git a/etc/gnus/gnus-summary-reply-up.xpm b/etc/gnus/gnus-summary-reply-up.xpm deleted file mode 100644 index 255f7a1..0000000 --- a/etc/gnus/gnus-summary-reply-up.xpm +++ /dev/null @@ -1,39 +0,0 @@ -/* XPM */ -static char * icon-follow-up_xpm[] = { -"32 32 4 1", -" c #BFBFBFBFBFBF s backgroundToolBarColor", -". c #000000000000", -"X c #FFFFFFFFFFFF", -"o c #999999999999", -" ", -" ", -" ", -" ", -" ", -" . ", -" .X.. ", -" ... .XXXX. ", -" ..XXX.XXXXXX.. ", -" ..XXXX.XXXXXXXXX. ", -" ..XXXXX.XXXXXXXXX.. ", -" ..XXXXXXX.XXXXXXXX.... ", -" ..XXXXXXXX.XXXXXXXXX.oXX.. ", -" .X..X.X.X..XXXXXXXXX..o...o. ", -" ..XXXXXXX.XXXXXXXXX..ooXXX.. ", -" .X...XXXX.XXXXXXXX..ooX...X. ", -" .XXXX.XX.XXXXXXXX..oX..XXXX. ", -" .XXXXX..XXXXXXXX..oX.XXXXXX. ", -" .XXXXXXX..XXXXX..X..XXXXXXX. ", -"oo.XXXXXXXXX.XXX....XXXXXXXXX.oo", -"oo.XXXXXXXXX...X...XXXXXXXXXX.oo", -"oo.XXXXXXXX.XX...XX.XXXXXXXXX.oo", -"oo.XXXXXXX.XXXXXXXXX.XXXXXXXX.oo", -"oo.XXXXXX.XXXXXXXXXXX.XXXXXXX.oo", -"oo.XXXX..XXXXXXXXXXXXX..XXXXX.oo", -"oo.XXX.XXXXXXXXXXXXXXXXX.XXXX.oo", -"oo.XX.XXXXXXXXXXXXXXXXXXX.XXX.oo", -"oo...XXXXXXXXXXXXXXXXXXXXX....oo", -"oo..XXXXXXXXXXXXXXXXXXXXXXXX..oo", -"oo............................oo", -"oooooooooooooooooooooooooooooooo", -"oooooooooooooooooooooooooooooooo"}; diff --git a/etc/gnus/gnus-summary-reply-with-original-up.xbm b/etc/gnus/gnus-summary-reply-with-original-up.xbm deleted file mode 100644 index 37b0d73..0000000 --- a/etc/gnus/gnus-summary-reply-with-original-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x00,0x08,0x00,0x20,0xaa,0x82,0xaa,0x4a,0x00,0x54,0x00,0x00,0xaa,0x02,0x54, - 0x55,0x00,0xa8,0x07,0x00,0x54,0x85,0x5a,0x55,0x02,0x50,0x32,0x80,0x50,0x25, - 0xc2,0x2a,0x02,0x18,0x81,0x41,0x54,0x17,0x01,0x17,0x80,0x09,0xc1,0x23,0x75, - 0x04,0x3d,0x4f,0x18,0xc3,0x83,0x18,0x85,0x40,0xc0,0x61,0x4c,0x7c,0x60,0x30, - 0xf6,0x23,0xb0,0x6e,0x84,0x20,0x98,0x21,0x05,0x13,0x5c,0x20,0x04,0x1c,0x36, - 0x60,0x06,0x30,0x0f,0x60,0x06,0x70,0x07,0xa0,0x05,0xc8,0x09,0x20,0x06,0x04, - 0x10,0x60,0x04,0x02,0x20,0xa0,0x85,0x01,0xc0,0x20,0x46,0x00,0x00,0xa1,0x24, - 0x00,0x00,0x62,0x1e,0x00,0x00,0x7c,0x0d,0x00,0x00,0xb0,0xfc,0xff,0xff,0x3f, - 0x55,0x55,0x4a,0x55,0x24,0x89,0x52,0xa2}; diff --git a/etc/gnus/gnus-summary-reply-with-original-up.xpm b/etc/gnus/gnus-summary-reply-with-original-up.xpm deleted file mode 100644 index 1135bfa..0000000 --- a/etc/gnus/gnus-summary-reply-with-original-up.xpm +++ /dev/null @@ -1,39 +0,0 @@ -/* XPM */ -static char * icon-follow-up-incl_xpm[] = { -"32 32 4 1", -" c #BFBFBFBFBFBF s backgroundToolBarColor", -". c #000000000000", -"X c #FFFFFFFFFFFF", -"o c #999999999999", -" ", -" ", -" ", -" ", -" ... ", -" .X.X. ", -" .XX.XX.. ", -" .XXX.XXXX. ", -" ..XXX.XXXXXX.. ", -" ..X.XXX.XXXXXXX.. ", -" ..XX.XXXX.XXXXX.... ", -" ..XXX.XXXXX.X....XX... ", -" ..XXX..XXXX....XXXXX.oXX.. ", -" .XXXX.XXXXXX.XXXXXXX..oXXXo. ", -" ..XX.XXX.....XXXXXX..ooXXX.. ", -" .X......XXX.XXXXXX..ooX...X. ", -" .XXXX.XXXXX.XXXXX..oX..XXXX. ", -" .XXXXX..XX.XXXXX..oX.XXXXXX. ", -" .XXXXXXX...XXXX..X..XXXXXXX. ", -"oo.XXXXXXXXX..XX....XXXXXXXXX.oo", -"oo.XXXXXXXXX...X...XXXXXXXXXX.oo", -"oo.XXXXXXXX.XX...XX.XXXXXXXXX.oo", -"oo.XXXXXXX.XXXXXXXXX.XXXXXXXX.oo", -"oo.XXXXXX.XXXXXXXXXXX.XXXXXXX.oo", -"oo.XXXX..XXXXXXXXXXXXX..XXXXX.oo", -"oo.XXX.XXXXXXXXXXXXXXXXX.XXXX.oo", -"oo.XX.XXXXXXXXXXXXXXXXXXX.XXX.oo", -"oo...XXXXXXXXXXXXXXXXXXXXX....oo", -"oo..XXXXXXXXXXXXXXXXXXXXXXXX..oo", -"oo............................oo", -"oooooooooooooooooooooooooooooooo", -"oooooooooooooooooooooooooooooooo"}; diff --git a/etc/gnus/gnus-summary-save-article-file-up.xbm b/etc/gnus/gnus-summary-save-article-file-up.xbm deleted file mode 100644 index a14e003..0000000 --- a/etc/gnus/gnus-summary-save-article-file-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x20,0x08,0x08,0x82,0x8a,0x82,0xa2,0x20,0x20,0x14,0x04,0x15,0x14,0xfd,0xff, - 0x43,0x42,0x04,0x00,0x0d,0x10,0x05,0x00,0x49,0x22,0x06,0x00,0x31,0x88,0x04, - 0x00,0x1f,0x22,0x06,0x00,0x50,0x88,0x04,0x00,0x10,0x22,0x04,0x00,0xb0,0x88, - 0x06,0x00,0x10,0x22,0x04,0x00,0x50,0xfc,0xff,0x0f,0x10,0x36,0x00,0x0b,0xb0, - 0x2c,0x02,0x0d,0x10,0x34,0x10,0x0b,0x50,0x2d,0x00,0x0b,0x10,0x34,0x41,0x0d, - 0xb0,0x2d,0x08,0x09,0x10,0x34,0x00,0x0b,0x50,0x2d,0x01,0x0d,0x10,0xf4,0xff, - 0x0b,0xb0,0xad,0xda,0x0a,0x10,0x44,0x22,0x0d,0x50,0xf6,0xff,0xf9,0x1f,0x6c, - 0x3b,0x4b,0x52,0xb5,0x2d,0x1d,0x08,0x6c,0x35,0x4b,0xa1,0x6a,0x3b,0x29,0x14, - 0xf8,0xff,0x8f,0x40,0x02,0x40,0x2a,0x15}; diff --git a/etc/gnus/gnus-summary-save-article-file-up.xpm b/etc/gnus/gnus-summary-save-article-file-up.xpm deleted file mode 100644 index ea30122..0000000 --- a/etc/gnus/gnus-summary-save-article-file-up.xpm +++ /dev/null @@ -1,41 +0,0 @@ -/* XPM */ -static char * icon-save-text_xpm[] = { -"32 32 6 1", -" c #BFBFBFBFBFBF s backgroundToolBarColor", -". c #000000000000", -"X c #FFFFFFFFFFFF", -"o c #999999999999", -"O c #E5E5E5E5E5E5", -"+ c #666666666666", -" ", -" ", -" ", -" ................ ", -" .XXXXXXXXXXXXX.X. ", -" .XXXXXXXXXXXXX.XX. ", -" .XXXXXXXXXXXXX.XXX. ", -" .XXXXXXXXXXXXX..... ", -" .XXXXXXXXXXXXXXXXX. ", -" .XXXXXXXXXXXXXXXXX. ", -" .XXXXXXXXXXXXXXXXX. ", -" .XXXXXXXXXXXXXXXXX. ", -" .XXXXXXXXXXXXXXXXX. ", -" ..................XXXXXXXX. ", -" .oo.OOOOOOOOOO.oo.XXXXXXXX. ", -" .oo.OOOOOOOOOO.oo.XXXXXXXX. ", -" .oo.OOOOOOOOOO.oo.XXXXXXXX. ", -" .oo.OOOOOOOOOO.oo.XXXXXXXX. ", -" .oo.OOOOOOOOOO.oo.XXXXXXXX. ", -" .oo.OOOOOOOOOO.oo.XXXXXXXX. ", -" .oo.OOOOOOOOOO.oo.XXXXXXXX. ", -" .oo.OOOOOOOOOO.oo.XXXXXXXX. ", -" .oo............oo.XXXXXXXX. ", -" .oooooooooooooooo.XXXXXXXX. ", -" .oooooooooooooooo.XXXXXXXX. ", -" .oo............oo.......... ", -" .oo.+++++++.OO.oo. ", -" .oo.+++++++.OO.oo. ", -" .oo.+++++++.OO.oo. ", -" .o.+++++++.OO.oo. ", -" ................ ", -" "}; diff --git a/etc/gnus/gnus-summary-save-article-up.xbm b/etc/gnus/gnus-summary-save-article-up.xbm deleted file mode 100644 index 94e51d1..0000000 --- a/etc/gnus/gnus-summary-save-article-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x10,0x81,0x04,0x01,0x45,0x28,0x40,0x50,0x88,0x42,0x15,0x05,0xa2,0xff,0xff, - 0x7f,0x88,0x03,0x00,0xf0,0xa2,0x0c,0x00,0x4c,0x88,0x30,0x00,0x43,0xc5,0xc0, - 0xc0,0x40,0x90,0x80,0x33,0xc0,0xa4,0x60,0xcc,0x40,0x82,0x10,0x00,0x41,0xd0, - 0x08,0x00,0x46,0x82,0x06,0x00,0xd8,0xfc,0xff,0x0f,0x60,0x2e,0x00,0x0d,0x40, - 0x34,0x02,0xfb,0x7f,0x36,0x10,0x0d,0x91,0xac,0x00,0x4b,0x24,0x34,0x00,0x2d, - 0x81,0x2d,0x48,0x4b,0x28,0x34,0x02,0x0d,0x85,0x2d,0x00,0xab,0x20,0xf4,0xff, - 0x0d,0x8a,0xa6,0xaa,0xaa,0x20,0x4c,0x55,0x0a,0x85,0xf5,0xff,0x5b,0x20,0x6c, - 0x35,0x8d,0x8a,0xad,0x36,0x2b,0x20,0xf4,0x2a,0x89,0x8a,0x6a,0x3b,0x5d,0x20, - 0xf8,0xff,0x0f,0x85,0x02,0x40,0xa2,0x20}; diff --git a/etc/gnus/gnus-summary-save-article-up.xpm b/etc/gnus/gnus-summary-save-article-up.xpm deleted file mode 100644 index fd4824b..0000000 --- a/etc/gnus/gnus-summary-save-article-up.xpm +++ /dev/null @@ -1,41 +0,0 @@ -/* XPM */ -static char * icon-save-mail_xpm[] = { -"32 32 6 1", -" c #BFBFBFBFBFBF s backgroundToolBarColor", -". c #000000000000", -"X c #FFFFFFFFFFFF", -"o c #999999999999", -"O c #E5E5E5E5E5E5", -"+ c #666666666666", -" ", -" ", -" ", -" ........................ ", -" ...XXXXXXXXXXXXXXXXXX... ", -" .XX..XXXXXXXXXXXXXX..XX. ", -" .XXXX..XXXXXXXXXX..XXXX. ", -" .XXXXXX..XXXXXX..XXXXXX. ", -" .XXXXXXX...XX..XXXXXXXX. ", -" .XXXXX..XXX..XX..XXXXXX. ", -" .XXXX.XXXXXXXXXXX.XXXXX. ", -" .XXX.XXXXXXXXXXXXX..XXX. ", -" .X..XXXXXXXXXXXXXXXX..X. ", -" ..................XXXXXXXXX.. ", -" .oo.OOOOOOOOOO.oo.XXXXXXXXXX. ", -" .oo.OOOOOOOOOO.oo............ ", -" .oo.OOOOOOOOOO.oo. ", -" .oo.OOOOOOOOOO.oo. ", -" .oo.OOOOOOOOOO.oo. ", -" .oo.OOOOOOOOOO.oo. ", -" .oo.OOOOOOOOOO.oo. ", -" .oo.OOOOOOOOOO.oo. ", -" .oo............oo. ", -" .oooooooooooooooo. ", -" .oooooooooooooooo. ", -" .oo............oo. ", -" .oo.+++++++.OO.oo. ", -" .oo.+++++++.OO.oo. ", -" .oo.+++++++.OO.oo. ", -" .o.+++++++.OO.oo. ", -" ................ ", -" "}; diff --git a/etc/gnus/gnus-uu-decode-uu-up.xbm b/etc/gnus/gnus-uu-decode-uu-up.xbm deleted file mode 100644 index 705eb76..0000000 --- a/etc/gnus/gnus-uu-decode-uu-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x00,0x08,0x10,0x01,0xaa,0x42,0x45,0x54,0x00,0x14,0x10,0x01,0x55,0x41,0x45, - 0x50,0x00,0x0a,0x88,0x0a,0xaa,0xa0,0x22,0x40,0x80,0xff,0xff,0x17,0xaa,0x95, - 0x54,0x43,0x80,0x2a,0xa5,0x0a,0xaa,0xfd,0x7f,0x53,0xc0,0x06,0x40,0x06,0x94, - 0x04,0x40,0x43,0xc2,0x05,0xc0,0x2a,0x90,0x86,0xc0,0x06,0xa2,0x64,0x4b,0x53, - 0x88,0x96,0x44,0x06,0xd2,0x45,0xc0,0x52,0x84,0x25,0xc1,0x06,0x90,0xe6,0x41, - 0x53,0x8a,0x05,0x42,0x06,0xa0,0x06,0xc4,0x52,0x95,0x04,0xc0,0x06,0xc0,0x05, - 0x40,0x53,0x94,0x06,0x40,0x06,0xa2,0x05,0xc0,0x52,0x88,0xfc,0xff,0x06,0xa2, - 0x95,0x12,0x53,0x88,0x4a,0xa9,0x06,0xa2,0xff,0xff,0x53,0x90,0x10,0x00,0x04, - 0x42,0x42,0x55,0x50,0x14,0x28,0x80,0x0a}; diff --git a/etc/gnus/gnus-uu-decode-uu-up.xpm b/etc/gnus/gnus-uu-decode-uu-up.xpm deleted file mode 100644 index 568315c..0000000 --- a/etc/gnus/gnus-uu-decode-uu-up.xpm +++ /dev/null @@ -1,39 +0,0 @@ -/* XPM */ -static char * icon-decode-view_xpm[] = { -"32 32 4 1", -" c #BFBFBFBFBFBF s backgroundToolBarColor", -". c #000000000000", -"X c #999999999999", -"o c #FFFFFFFFFFFF", -" ", -" ", -" ", -" ", -" ", -" ", -" ................... ", -" .XXXXXXXXXXXXXXXXX. ", -" .XXXXXXXXXXXXXXXXX. ", -" .XX.............XX. ", -" .XX.ooooooooooo.XX. ", -" .XX.ooooooooooo.XX. ", -" .XX.ooooooooooo.XX. ", -" .XX.oooo.oooooo.XX. ", -" .XX.oo..o..o.oo.XX. ", -" .XX.o.oo.oo.ooo.XX. ", -" .XX.ooo.ooooooo.XX. ", -" .XX.oo.oo.ooooo.XX. ", -" .XX.oo....ooooo.XX. ", -" .XX.oooooo.oooo.XX. ", -" .XX.ooooooo.ooo.XX. ", -" .XX.ooooooooooo.XX. ", -" .XX.ooooooooooo.XX. ", -" .XX.ooooooooooo.XX. ", -" .XX.ooooooooooo.XX. ", -" .XX.............XX. ", -" .XXXXXXXXXXXXXXXXX. ", -" .XXXXXXXXXXXXXXXXX. ", -" ................... ", -" ", -" ", -" "}; diff --git a/etc/gnus/gnus-uu-post-news-up.xbm b/etc/gnus/gnus-uu-post-news-up.xbm deleted file mode 100644 index e0528e9..0000000 --- a/etc/gnus/gnus-uu-post-news-up.xbm +++ /dev/null @@ -1,12 +0,0 @@ -#define noname_width 32 -#define noname_height 32 -static char noname_bits[] = { - 0x11,0x11,0x19,0x51,0x4a,0x95,0x82,0x14,0x20,0x40,0x29,0x42,0x0a,0xd5,0x86, - 0x10,0x31,0x31,0x3b,0x53,0x08,0x9d,0xe8,0x10,0xa2,0x43,0x82,0x4b,0x88,0xff, - 0xff,0x03,0xb3,0xaa,0x54,0xbb,0x88,0x55,0xaa,0x02,0xa2,0xfc,0x7f,0x4b,0x88, - 0x06,0xc0,0x12,0xb1,0x05,0x40,0x56,0x8a,0x05,0x40,0x03,0xd0,0x86,0xc0,0xaa, - 0x85,0x64,0x4b,0x06,0xb1,0x95,0xc4,0x32,0x8a,0x46,0x40,0x4b,0xd0,0x24,0x41, - 0x03,0x84,0xe6,0xc1,0x56,0xd9,0x05,0x42,0x12,0x82,0x04,0x44,0x4b,0x94,0x07, - 0xc0,0x22,0xc1,0x04,0x40,0x16,0x95,0x05,0xc0,0x52,0xa0,0x06,0x40,0x13,0x8a, - 0xfd,0xff,0x46,0xd0,0x94,0x52,0x12,0x93,0x29,0xa5,0x5a,0xa4,0xff,0xff,0x03, - 0x10,0x02,0x08,0x55,0x85,0xa8,0xa2,0x00}; diff --git a/etc/gnus/gnus-uu-post-news-up.xpm b/etc/gnus/gnus-uu-post-news-up.xpm deleted file mode 100644 index f4a7e3a..0000000 --- a/etc/gnus/gnus-uu-post-news-up.xpm +++ /dev/null @@ -1,39 +0,0 @@ -/* XPM */ -static char * icon-post-pic_xpm[] = { -"32 32 4 1", -" c #000000000000", -". c #BFBFBFBFBFBF s backgroundToolBarColor", -"X c #999999999999", -"o c #FFFFFFFFFFFF", -" ... ... ... ... ... ... ... ...", -"................................", -"................ ...............", -".............. . .............", -" ... ... ... .. .. ... ... ...", -".......... ......... .........", -"........ ............. .......", -"....... ......", -" ... .. XXXXXXXXXXXXXXXXX .. ...", -"....... XXXXXXXXXXXXXXXXX ......", -"....... XX XX ......", -"....... XX ooooooooooo XX ......", -" ... .. XX ooooooooooo XX .. ...", -"....... XX ooooooooooo XX ......", -"....... XX oooo oooooo XX ......", -"....... XX oo o o oo XX ......", -" ... .. XX o oo oo ooo XX .. ...", -"....... XX ooo ooooooo XX ......", -"....... XX oo oo ooooo XX ......", -"....... XX oo ooooo XX ......", -" ... .. XX oooooo oooo XX .. ...", -"....... XX ooooooo ooo XX ......", -"....... XX ooooooooooo XX ......", -"....... XX ooooooooooo XX ......", -" ... .. XX ooooooooooo XX .. ...", -"....... XX ooooooooooo XX ......", -"....... XX XX ......", -"....... XXXXXXXXXXXXXXXXX ......", -" ... .. XXXXXXXXXXXXXXXXX .. ...", -"....... ......", -"................................", -"................................"}; diff --git a/etc/gnus/gnus.xbm b/etc/gnus/gnus.xbm deleted file mode 100644 index 58d1ac8..0000000 --- a/etc/gnus/gnus.xbm +++ /dev/null @@ -1,622 +0,0 @@ -#define noname_width 271 -#define noname_height 273 -static char noname_bits[] = { - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfa,0xff,0xff,0x7f,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x5f,0x49,0xe0,0xff, - 0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0x97,0xaa,0x8a,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0x57,0x2a,0x41,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xa9,0x52,0x16,0xfe,0x7f,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x4a,0x49,0x05, - 0xf9,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0x7f,0x95,0xaa,0x58,0xf4,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0x7f,0xa5,0x54,0x26,0xe1,0x7f,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0x54,0x49,0x49,0xe4,0x7f,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x5f,0x2a,0xa5, - 0x2a,0xd1,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x2f,0xd5,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xaf,0x52,0x95,0x54,0xc4,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xab, - 0x24,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0x57,0x29,0xa9,0x92,0x11,0x7f,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0x57,0xd5,0xfa,0xff,0xff,0xab,0xea,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x97,0x4a,0x55,0x2a,0x41,0x7f, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x25,0x29,0xe5,0xff,0xff,0x95,0xa4,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xa7,0xa4, - 0x24,0xa5,0x14,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x4a,0xa5,0xd4,0xff, - 0x3f,0x52,0xa9,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0x29,0x55,0x55,0x55,0x41,0x7e,0xff,0xff,0xff,0xff,0xff,0xff,0x7f, - 0xa9,0x54,0xea,0xff,0xdf,0x2a,0x55,0xf1,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0x55,0x55,0x4a,0x49,0x12,0x7e,0xff,0xff,0xff, - 0xff,0xff,0xff,0x7f,0x55,0xa5,0x92,0xff,0x23,0xa5,0x4a,0xd6,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xa5,0xa4,0x94,0xaa,0x42, - 0x7d,0xff,0xff,0xff,0xff,0xff,0xff,0x9f,0x4a,0x2a,0xa9,0xff,0xad,0x92,0x24, - 0xa9,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x2a, - 0x95,0x52,0x52,0x29,0x7c,0xff,0xff,0xff,0xff,0xff,0xff,0x5f,0x52,0x49,0x55, - 0xfe,0x91,0x54,0x55,0x55,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0x7f,0x49,0x29,0x55,0x25,0x85,0x7c,0xff,0xff,0xff,0xff,0xff,0xff, - 0x4f,0x95,0xaa,0x92,0x7e,0x55,0x55,0xa9,0x4a,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x2a,0x50,0x95,0xaa,0x24,0x7e,0xff,0xff, - 0xff,0xff,0xff,0xff,0x57,0x2a,0x95,0x54,0x79,0x95,0x92,0x92,0x94,0xfc,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0xb9,0x62,0x29,0x49, - 0x85,0x7c,0xff,0xff,0xff,0xff,0xff,0xff,0x4b,0x49,0x49,0x95,0xba,0xa4,0x54, - 0xaa,0x52,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf, - 0x1a,0xf8,0xa7,0xaa,0x22,0x7c,0xff,0xff,0xff,0xff,0xff,0xff,0x55,0x55,0x52, - 0x2a,0x75,0x55,0xa5,0x24,0xa5,0xf2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xbf,0x5a,0xfd,0x57,0x92,0x94,0x7e,0xff,0xff,0xff,0xff,0xff, - 0xff,0x4a,0x4a,0x55,0x49,0x89,0x92,0x94,0xaa,0x94,0xf4,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x5f,0x1a,0xfc,0x2f,0x55,0x05,0x7c,0xff, - 0xff,0xff,0xff,0xff,0xff,0x55,0xa9,0x4a,0x55,0x2a,0x55,0x55,0x55,0x55,0xe5, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xaf,0x4e,0xfd,0x5f, - 0x29,0xa5,0x7c,0xff,0xff,0xff,0xff,0xff,0xff,0xa4,0x54,0x52,0x4a,0x55,0xa9, - 0xa4,0x24,0xa5,0x94,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0x2f,0x1d,0xfe,0x3f,0x95,0x04,0x7c,0xff,0xfd,0xff,0xff,0xff,0x3f,0x49,0xa5, - 0x54,0xa9,0xa4,0x92,0x4a,0x49,0x4a,0x55,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xaf,0x44,0xfe,0x5f,0xa9,0x52,0x7d,0xff,0xe5,0xff,0xff, - 0xff,0x5f,0x55,0x92,0x2a,0x95,0x52,0x4a,0x52,0xaa,0x52,0x4a,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x97,0x16,0xff,0xbf,0x4a,0x05,0x7c, - 0xff,0xd9,0xff,0xff,0xff,0x5f,0x95,0x42,0xa5,0x52,0x95,0xaa,0xaa,0xaa,0x94, - 0x54,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x57,0x43,0xfe, - 0xbf,0x54,0x52,0x7d,0x7f,0x25,0xff,0xff,0xff,0xa7,0xa4,0x28,0x92,0x54,0x4a, - 0xa5,0x4a,0x92,0xaa,0x4a,0xf9,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xab,0x12,0xfe,0x7f,0xa5,0x02,0x7c,0x7f,0x55,0xfd,0xff,0xff,0x95,0x2a, - 0x82,0x54,0xa5,0x54,0x2a,0xa9,0x2a,0xa5,0x52,0xf5,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0x27,0x4b,0xff,0xff,0x4a,0x29,0x7d,0xff,0x92,0xfe, - 0xff,0xff,0x55,0x92,0x20,0xa8,0x94,0x2a,0xa5,0x94,0x52,0x29,0xa9,0xf4,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x97,0x01,0xff,0x7f,0x52,0x42, - 0x7c,0xff,0x25,0xf9,0xff,0x7f,0xaa,0x02,0x8a,0x40,0x29,0x49,0x09,0x41,0x4a, - 0x55,0x25,0xe5,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x57,0x57, - 0xff,0xff,0x95,0x12,0x7d,0xff,0xa9,0xfa,0xff,0x7f,0x25,0xa9,0x20,0x2a,0xa5, - 0xaa,0x42,0x92,0x54,0x92,0x54,0x95,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xaf,0x83,0xff,0xff,0xa9,0x42,0x7e,0xff,0xaa,0xf4,0xff,0xaf,0x54, - 0x01,0x82,0x80,0xaa,0x54,0x14,0x08,0xa2,0xaa,0x4a,0xd2,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xef,0xcf,0xd7,0xff,0xff,0x52,0x12,0x7f,0xff,0x4a, - 0xea,0xff,0x57,0x92,0xaa,0x28,0x24,0x29,0x25,0x81,0x82,0x08,0x49,0x52,0x55, - 0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0xdf,0xef,0xe7,0xff,0xff,0x2a, - 0x05,0x7e,0xff,0x55,0xd5,0xff,0xa5,0x2a,0x00,0x8e,0x10,0x4a,0x89,0x24,0x28, - 0xa0,0xaa,0x2a,0x49,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0xe7,0xff, - 0xef,0xff,0xff,0xa5,0x50,0x7e,0xff,0x25,0xe5,0xff,0x2a,0xa5,0x52,0x7f,0x85, - 0x54,0x35,0x08,0x82,0x0a,0x55,0x95,0xaa,0xfc,0xff,0xff,0xff,0xcf,0xff,0xff, - 0xff,0xff,0xd7,0xff,0xff,0xff,0x7f,0x52,0x85,0x7e,0xff,0xab,0x94,0x1e,0x55, - 0x2a,0xc8,0xff,0x10,0x90,0x92,0xa0,0x08,0x20,0x24,0x52,0x25,0xfd,0xff,0xff, - 0xff,0xef,0xff,0xff,0xff,0xff,0xe9,0xff,0xff,0xff,0xff,0x94,0x10,0x7e,0xff, - 0x93,0xaa,0x6a,0x49,0x49,0xf2,0xff,0x85,0x52,0x09,0x0a,0xa2,0x4a,0x92,0x29, - 0xa9,0xf2,0xff,0xff,0xff,0xd3,0xff,0xff,0xff,0xff,0xeb,0xff,0xff,0xff,0x7f, - 0x55,0x25,0x7f,0xff,0x55,0x49,0x49,0x95,0x0a,0xf9,0xff,0x17,0x48,0x26,0x50, - 0x08,0x00,0xa9,0x4a,0x95,0xfa,0xff,0xff,0xff,0xeb,0xff,0xff,0xff,0xff,0xf2, - 0xff,0xff,0xff,0xff,0x92,0x80,0x7e,0xff,0xa7,0x54,0xaa,0xa4,0x52,0xfc,0xff, - 0xaf,0x42,0x89,0xfa,0xbf,0x54,0x20,0xa9,0xa4,0xd4,0xff,0xff,0xff,0xcb,0xff, - 0xff,0xff,0xff,0xf5,0xff,0xff,0xff,0xff,0x54,0x29,0x7f,0xff,0x4b,0xa5,0x92, - 0x2a,0x01,0xff,0xff,0x1f,0xa8,0x22,0xff,0xff,0x01,0xa5,0x2a,0x55,0xa9,0xff, - 0xff,0xff,0xd4,0xff,0xff,0xff,0x7f,0xfa,0xff,0xff,0xff,0x7f,0xa5,0x04,0x7f, - 0xff,0x57,0x2a,0x55,0xa9,0x54,0xfe,0xff,0x3f,0x05,0x89,0xff,0xff,0x5f,0x48, - 0x92,0x2a,0x95,0xff,0xff,0xff,0xea,0xff,0xff,0xff,0xff,0xd2,0xff,0xff,0xff, - 0x7f,0x2a,0x91,0x7f,0xff,0xa9,0x54,0x4a,0x52,0x02,0xff,0xff,0xff,0x50,0xd1, - 0xff,0xff,0x1f,0x81,0xaa,0xa4,0x52,0xfe,0xff,0x3f,0xe9,0xff,0xff,0xff,0x7f, - 0x1d,0xff,0xff,0xff,0xff,0x54,0x41,0x7f,0xff,0x93,0x92,0x52,0x95,0xc8,0xff, - 0xff,0xff,0x8b,0xc4,0xff,0xff,0x7f,0x24,0xa5,0x2a,0x49,0xf9,0xff,0x7f,0xd5, - 0xff,0xff,0xff,0xbf,0x4a,0xff,0xff,0xff,0xff,0x4a,0x14,0x7f,0xff,0x28,0xa5, - 0x94,0x2a,0xa0,0xff,0xff,0x7f,0x22,0xf0,0xff,0xff,0x7f,0x12,0x94,0xa4,0xaa, - 0xea,0xff,0xaf,0xea,0xff,0xff,0xff,0x5f,0x8e,0xff,0xff,0xff,0x7f,0xa9,0x40, - 0x7f,0xff,0x48,0x55,0x55,0x12,0xca,0xff,0xff,0xff,0x0a,0xf5,0xff,0xff,0xff, - 0x80,0x52,0x95,0x54,0xaa,0xfe,0x55,0xc4,0xff,0xff,0xff,0x5f,0xa5,0xff,0xff, - 0xff,0xff,0x94,0x14,0x7f,0xff,0x52,0x2a,0xa9,0x4a,0xe1,0xff,0xff,0xbf,0x24, - 0xf0,0xff,0xff,0xff,0x0b,0x28,0xa9,0x92,0x24,0x55,0x49,0xe5,0xd7,0xff,0xff, - 0xa7,0x8a,0xff,0xff,0xff,0x7f,0xa5,0xc0,0x7f,0xff,0x50,0x49,0x95,0x04,0xf8, - 0xff,0xff,0x5f,0x1f,0xfd,0xff,0xff,0xff,0x47,0x45,0x55,0xaa,0xaa,0x4a,0xaa, - 0xea,0xaf,0xff,0xff,0x2b,0xc3,0xff,0xff,0xff,0x7f,0x55,0x94,0x7f,0x7f,0x4a, - 0x55,0x52,0x51,0xfe,0xff,0xff,0x5f,0x4e,0xf8,0xff,0xff,0xff,0x1f,0x50,0x92, - 0x52,0x49,0xa9,0x92,0xe4,0xd3,0xff,0xff,0x4b,0xd5,0xff,0xff,0xff,0xff,0x94, - 0xc0,0x7f,0x3f,0xa0,0xa4,0xaa,0x04,0xfe,0xff,0xff,0xa7,0x1d,0xfd,0xff,0xff, - 0xff,0x9f,0x84,0xaa,0x4a,0xaa,0x24,0x55,0xf2,0x2b,0xff,0x7f,0xa9,0xc1,0xff, - 0xff,0xff,0x7f,0x4a,0x95,0x7f,0xbf,0x2a,0x95,0x24,0x50,0xff,0xff,0xff,0x97, - 0x5e,0xfe,0xff,0xff,0xff,0x3f,0x92,0x24,0x95,0x92,0xaa,0xa4,0xf2,0xcb,0xff, - 0x5f,0xd5,0xe5,0xff,0xff,0xff,0xff,0x52,0x80,0x7f,0x3f,0xa0,0x52,0x15,0x85, - 0xff,0xff,0xff,0xd7,0x38,0xfe,0xff,0xff,0xff,0xff,0x20,0xaa,0x52,0x55,0x55, - 0x55,0xf9,0x29,0xfd,0xab,0xa4,0xf0,0xff,0xff,0xff,0x7f,0x29,0xa9,0x7f,0xff, - 0x42,0x25,0x49,0xe8,0xff,0xff,0xff,0x69,0x7a,0xff,0xff,0xff,0xff,0xff,0x82, - 0x52,0xaa,0x24,0x89,0x4a,0xf8,0x55,0x2a,0x49,0x95,0xf5,0xff,0xff,0xff,0xbf, - 0x2a,0xc4,0x7f,0x7f,0x90,0x54,0x15,0xe2,0xff,0xff,0xff,0x25,0xbc,0xff,0xff, - 0xff,0xff,0xff,0x29,0x48,0x49,0xaa,0xaa,0xa4,0xfa,0x95,0x92,0x54,0x52,0xf0, - 0xff,0xff,0xff,0xbf,0x4a,0xd1,0x7f,0xff,0x05,0xaa,0x40,0xf8,0xff,0xff,0x7f, - 0xaa,0xfc,0xff,0xff,0xff,0xff,0xff,0x43,0xa9,0xaa,0x4a,0x52,0xa9,0xf8,0xa4, - 0xaa,0x52,0x95,0xfc,0xff,0xff,0xff,0x7f,0x52,0xc0,0x7f,0xff,0xa1,0x00,0x24, - 0xfa,0xff,0xff,0xff,0x0a,0xfe,0xff,0xff,0xff,0xff,0xff,0x17,0x92,0x24,0xa5, - 0x2a,0x55,0xfe,0xaa,0xa4,0x2a,0x29,0xf9,0xff,0xff,0xff,0xbf,0x2a,0xea,0x7f, - 0xff,0x05,0x92,0x90,0xfc,0xff,0xff,0xbf,0xa4,0xff,0xff,0xff,0xff,0xff,0xff, - 0x4f,0xa0,0xaa,0x54,0x49,0x25,0x7c,0x49,0x95,0xa4,0x12,0xfc,0xff,0xff,0xff, - 0x7f,0x8a,0xe0,0x7f,0xff,0xa3,0x04,0x05,0xfe,0xff,0xff,0xbf,0x06,0xff,0xff, - 0xff,0xff,0xff,0xff,0x1f,0x49,0x95,0x52,0xaa,0x12,0x7f,0x55,0x52,0x55,0x0a, - 0xfd,0xff,0xff,0xff,0x3f,0x29,0xe8,0x7f,0xff,0x0f,0x50,0x50,0xff,0xff,0xff, - 0x5f,0xca,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x04,0xa9,0x4a,0x25,0x45,0x3e, - 0xa9,0x2a,0xa9,0xa2,0xfc,0xff,0xff,0xff,0x7f,0x55,0xe1,0x7f,0xff,0x27,0x05, - 0xc4,0xff,0xff,0xff,0x9f,0x91,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x41,0x4a, - 0x29,0xa9,0x12,0x5e,0x95,0x94,0x4a,0x0a,0xfe,0xff,0xff,0xff,0xbf,0x12,0xf4, - 0x7f,0xff,0x8f,0x50,0xf1,0xff,0xff,0xff,0xa7,0xc2,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0x14,0x92,0xaa,0x4a,0xa2,0xbf,0xa4,0x52,0x95,0x22,0xff,0xff,0xff, - 0xff,0x3f,0x45,0xf2,0x7f,0xff,0x3f,0x04,0xf4,0xff,0xff,0xff,0xd7,0xe8,0xff, - 0xff,0xff,0xff,0x5f,0xff,0xff,0x83,0xa8,0x94,0x54,0x09,0x2f,0x55,0x4a,0x52, - 0x49,0xff,0xff,0xff,0xff,0x5f,0x99,0xf0,0x7f,0xff,0x7f,0x51,0xfc,0xff,0xff, - 0xff,0x6b,0xf1,0xff,0xff,0xff,0xff,0x5f,0xfd,0xff,0x2b,0x2a,0xa9,0x12,0x20, - 0x5f,0xa9,0xaa,0x54,0x00,0xff,0xff,0xff,0xff,0x5f,0x15,0xf2,0x7f,0xff,0xff, - 0x8f,0xff,0xff,0xff,0xff,0x2b,0xfc,0xff,0xff,0xff,0xff,0x2f,0xfd,0xff,0x87, - 0xa0,0x4a,0xaa,0x8a,0x9f,0x4a,0x52,0x15,0xa9,0xff,0xff,0xff,0xff,0x5f,0x8a, - 0xfc,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x94,0xf8,0xff,0xff,0xff,0xff, - 0x57,0xf2,0xff,0x2f,0x82,0x52,0x05,0xd0,0x2f,0x95,0x4a,0x49,0x84,0xff,0xff, - 0xff,0xff,0xbf,0x24,0xf8,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x12,0xfd, - 0xff,0xff,0xff,0xff,0x4b,0xd5,0xff,0x9f,0x28,0x54,0x48,0xc5,0xbf,0x52,0x55, - 0x0a,0xe1,0xff,0xff,0xff,0xff,0x9f,0x4a,0xfa,0x7f,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0x1a,0xfe,0xff,0xff,0xff,0xff,0x57,0xa9,0xff,0x3f,0x82,0x00,0x21, - 0xf0,0x5f,0x2a,0x49,0x21,0xc4,0xff,0xff,0xff,0xff,0xaf,0x1a,0xfd,0x7f,0xff, - 0xff,0xff,0xff,0xff,0xff,0x3f,0x85,0xff,0xff,0xff,0xff,0xff,0x29,0xa5,0xff, - 0xff,0x24,0x52,0x88,0xfc,0xbf,0x92,0x2a,0x09,0xf1,0xff,0xff,0xff,0xff,0x9f, - 0x4c,0xfc,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x15,0xff,0xff,0xff,0x7f, - 0xff,0xa5,0x4a,0xff,0xff,0x90,0x08,0x01,0xfe,0x3f,0x55,0x52,0x24,0xf4,0xff, - 0xff,0xff,0xff,0xaf,0x02,0xfd,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xc6, - 0xff,0xff,0xff,0xbf,0xfe,0x95,0x54,0xff,0xff,0x05,0x42,0xa8,0xfe,0xbf,0xa4, - 0x2a,0x41,0xf9,0xff,0xff,0xff,0xff,0x5f,0x55,0xfc,0x7f,0xff,0xff,0xff,0xff, - 0xff,0xff,0x4f,0xd0,0xff,0xff,0xff,0xbf,0x7c,0xaa,0x92,0xfc,0xff,0x53,0x08, - 0x01,0xff,0x1f,0x4a,0x01,0x04,0xfc,0xff,0xff,0xff,0xff,0x27,0x05,0xff,0x7f, - 0xff,0xff,0xff,0xff,0xff,0xff,0xaf,0xc5,0xff,0xff,0xff,0x4f,0xbf,0x52,0xaa, - 0xfe,0xff,0x07,0x42,0xea,0xff,0xbf,0x50,0x54,0x51,0xff,0xff,0xff,0xff,0xff, - 0x97,0x56,0xfe,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xaf,0xf0,0xff,0xff,0xff, - 0x2f,0x7f,0xa5,0x54,0xfd,0xff,0x3f,0x09,0xe0,0xff,0x1f,0x02,0x01,0x04,0xff, - 0xff,0xff,0xff,0xff,0xaf,0x02,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0x4b, - 0xf5,0xff,0xff,0xff,0xab,0x9f,0x94,0x92,0xfc,0xff,0xff,0x40,0xfd,0xff,0x9f, - 0x48,0x48,0xa1,0xff,0xff,0xff,0xff,0xff,0xa7,0x56,0xff,0x7f,0xff,0xff,0xff, - 0xff,0xff,0xff,0x6b,0xf8,0xff,0xff,0xff,0xa4,0x5f,0xa9,0x2a,0xfd,0xff,0xff, - 0xff,0xff,0xff,0x3f,0x22,0x21,0xc4,0xff,0xff,0xff,0xff,0xff,0x2f,0x03,0xff, - 0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0x2b,0xfa,0xff,0xff,0x7f,0xd5,0x2f,0xa5, - 0xa4,0xfa,0xff,0xff,0xff,0xff,0xff,0xbf,0x08,0x08,0xf9,0xff,0xff,0xff,0xff, - 0xff,0x97,0x4a,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0x94,0xfc,0xff,0xff, - 0x7f,0x69,0xac,0x2a,0x55,0xf9,0xff,0xff,0xff,0xff,0xff,0x7f,0xa2,0x22,0xf8, - 0xff,0xff,0xff,0xff,0xff,0x53,0x21,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff, - 0x15,0xfe,0xff,0xff,0x9f,0x2a,0x95,0x94,0x92,0xf4,0xff,0xff,0xff,0xff,0xff, - 0xff,0x08,0x88,0xfe,0xff,0xff,0xff,0xff,0xff,0x57,0x8b,0xff,0x7f,0xff,0xff, - 0xff,0xff,0xff,0x7f,0xa9,0xfe,0xff,0xff,0x5f,0x52,0xbc,0x52,0x55,0xf5,0xff, - 0xff,0xff,0xff,0xff,0xff,0x21,0x21,0xff,0xff,0xff,0xff,0xff,0xff,0x4b,0xa1, - 0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0x7f,0x0d,0xff,0xff,0xff,0x57,0x15,0x3f, - 0x55,0x49,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0x4b,0xc8,0xff,0xff,0xff,0xff, - 0xff,0xff,0xd7,0x89,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xbf,0xd6,0xff,0xff, - 0xff,0x4b,0x45,0x3f,0x49,0xaa,0xf4,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf9, - 0xff,0xff,0xff,0xff,0xff,0xff,0xc9,0xe2,0xff,0x7f,0xff,0xff,0xff,0xff,0xff, - 0x3f,0x81,0xff,0xff,0xff,0x29,0x11,0x5f,0x28,0x55,0xf5,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xab,0xc8,0xff,0x7f,0xff, - 0xff,0xff,0xff,0xff,0x5f,0xd6,0xff,0xff,0x7f,0xaa,0xc2,0x0f,0x55,0x49,0xea, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xa5, - 0xe2,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0x9f,0xe1,0xff,0xff,0xbf,0x4a,0xd1, - 0x5f,0x48,0xa5,0xf2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xe9,0xe0,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0x27,0xf4,0xff, - 0xff,0xbf,0x94,0xc4,0x07,0x91,0x2a,0xf5,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xca,0xea,0xff,0x7f,0xff,0xff,0xff,0xff, - 0xff,0xaf,0xf1,0xff,0xff,0x9f,0x52,0xe0,0x4b,0x44,0x52,0xe9,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x6a,0xe0,0xff,0x7f, - 0xff,0xff,0xff,0xff,0xff,0x4b,0xfc,0xff,0xff,0xab,0x2a,0xf5,0x0f,0x51,0xa5, - 0xf2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f, - 0x69,0xe5,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0x55,0xf8,0xff,0xff,0x95,0x14, - 0xf0,0x5f,0x84,0x54,0xea,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0x7f,0x75,0xf0,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0x13,0xfd, - 0xff,0xff,0xa5,0x42,0xf9,0x7f,0x91,0x4a,0xf5,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xb2,0xfa,0xff,0x7f,0xff,0xff,0xff, - 0xff,0xff,0x54,0xfe,0xff,0x7f,0x52,0x12,0xfa,0xff,0x20,0xa5,0xe4,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0x34,0xf8,0xff, - 0x7f,0xff,0xff,0xff,0xff,0xff,0x25,0xff,0xff,0xaf,0xaa,0x48,0xfc,0xff,0x0b, - 0x29,0xf5,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0x7f,0xb5,0xf8,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0x52,0xff,0xff,0x2f,0x49, - 0x02,0xfe,0xff,0x43,0xaa,0xea,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0x3f,0x3a,0xfa,0xff,0x7f,0xff,0xff,0xff,0xff,0x7f,0x4a, - 0xff,0xff,0xa5,0x2a,0xa9,0xff,0xff,0x17,0x25,0xe9,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0x9a,0xfc,0xff,0x7f,0xff,0xff, - 0xff,0xff,0xff,0x2a,0xff,0x7f,0x95,0x54,0x80,0xff,0xff,0x07,0xa9,0xea,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x5f,0x1d,0xfc, - 0xff,0x7f,0xff,0xff,0xff,0xff,0x3f,0xa9,0xfe,0x7f,0xa9,0x12,0xe5,0xff,0xff, - 0x5f,0x4a,0xf2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0x5f,0xad,0xfe,0xff,0x7f,0xff,0xff,0xff,0xff,0x7f,0x95,0xea,0x97,0x54, - 0x4a,0xf0,0xff,0xff,0x1f,0xa8,0xea,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0x5f,0x0e,0xfe,0xff,0x7f,0xff,0xff,0xff,0xff,0x5f, - 0x52,0x55,0xa9,0x92,0x02,0xfd,0xff,0xff,0x5f,0x53,0xf5,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xaf,0x5e,0xfe,0xff,0x7f,0xff, - 0xff,0xff,0xff,0xbf,0x2a,0x49,0x4a,0x55,0x49,0xfc,0xff,0xff,0x3f,0x94,0xf8, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x2f,0x0f, - 0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0x4f,0xa5,0xaa,0x92,0xa4,0x20,0xff,0xff, - 0xff,0xbf,0xa4,0xf2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0x5f,0x57,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0x5f,0x52,0x52,0xaa, - 0x2a,0x0a,0xff,0xff,0xff,0x7f,0x54,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0x8f,0x07,0xff,0xff,0x7f,0xff,0xff,0xff,0xff, - 0xa7,0x94,0x4a,0x55,0x4a,0xa0,0xff,0xff,0xff,0xff,0xa8,0xfa,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x57,0x57,0xff,0xff,0x7f, - 0xff,0xff,0xff,0xff,0x2f,0x55,0xa9,0x92,0x12,0xe9,0xff,0xff,0xff,0x7f,0x24, - 0xf5,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xaf, - 0x87,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0x57,0xa5,0x4a,0xaa,0x44,0xf4,0xff, - 0xff,0xff,0xff,0x55,0xf2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xa7,0xab,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xab,0x94,0xa4, - 0x92,0x12,0xf9,0xff,0xff,0xff,0xff,0xa8,0xfa,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xab,0x83,0xff,0xff,0x7f,0xff,0xff,0xff, - 0xff,0x47,0xa9,0x2a,0x55,0x40,0xfc,0xff,0xff,0xff,0xff,0x25,0xf5,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xe7,0xff,0xff,0xff,0xff,0xff,0xd7,0x97,0xff,0xff, - 0x7f,0xff,0xff,0xff,0xff,0x33,0x55,0xa9,0x24,0x15,0xfe,0xff,0xff,0xff,0xff, - 0x95,0xf2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xeb,0xff,0xff,0xff,0xff,0xff, - 0x93,0xc3,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0x57,0x25,0xa5,0x2a,0x40,0xff, - 0xff,0xff,0xff,0xff,0xa9,0xf4,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe3,0xff, - 0xff,0xff,0xff,0xff,0xe7,0xd5,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0x4b,0x92, - 0x54,0x92,0xd4,0xff,0xff,0xff,0xff,0xff,0x55,0xf5,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xe9,0xff,0xff,0xff,0xff,0xff,0xd5,0xc1,0xff,0xff,0x7f,0xff,0xff, - 0xff,0xff,0x97,0xaa,0x4a,0x05,0xe2,0xff,0xff,0xff,0xff,0xff,0x25,0xf1,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xe3,0xfd,0xff,0xff,0xff,0xff,0xd5,0xea,0xff, - 0xff,0x7f,0xff,0xff,0xff,0xff,0x57,0x55,0x25,0xa1,0xf0,0xff,0xff,0xff,0xff, - 0xff,0x95,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe8,0xfa,0xff,0xff,0xff, - 0xff,0xea,0xe0,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xa7,0x24,0x59,0x04,0xfa, - 0xff,0xff,0xff,0xff,0xff,0xa9,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe2, - 0xfd,0xff,0xff,0xff,0xff,0xc9,0xe9,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0x4f, - 0x52,0x05,0xa1,0xfc,0xff,0xff,0xff,0xff,0xff,0xa5,0xfa,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0x70,0xf9,0xff,0xff,0xff,0xff,0x74,0xe2,0xff,0xff,0x7f,0xff, - 0xff,0xff,0xff,0x47,0x95,0x92,0x04,0xff,0xff,0xff,0xff,0xff,0xff,0x95,0xf8, - 0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xe2,0xfa,0xff,0xff,0xff,0xff,0x72,0xe8, - 0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0x97,0xaa,0x20,0xd0,0xff,0xff,0xff,0xff, - 0xff,0xff,0x55,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0xb8,0xfc,0xff,0xff, - 0xff,0xff,0xea,0xe2,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0x07,0x04,0x82,0xc2, - 0xff,0xff,0xff,0xff,0xff,0xff,0x29,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0x7f, - 0x71,0xfd,0xff,0xff,0xff,0x7f,0x2a,0xf8,0xff,0xff,0x7f,0xff,0xff,0xff,0xff, - 0x4f,0x91,0x28,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0x4b,0xfc,0xff,0xff,0xff, - 0xff,0xff,0xff,0x1f,0x54,0xfe,0xff,0xff,0xff,0x7f,0x75,0xf2,0xff,0xff,0x7f, - 0xff,0xff,0xff,0xff,0x27,0x44,0x82,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0x29, - 0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0x5f,0xb8,0xfc,0xff,0xff,0xff,0xbf,0x14, - 0xf1,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0x0f,0x11,0x20,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0x55,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x9a,0xfe,0xff, - 0xff,0xff,0x7f,0x5a,0xf8,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0x5f,0x40,0x85, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x09,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0x4f,0x2d,0xfd,0xff,0xff,0xff,0x9f,0x12,0xf9,0xff,0xff,0x7f,0xff,0xff,0xff, - 0xff,0x3f,0x14,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x55,0xfe,0xff,0xff, - 0xff,0xff,0xff,0xff,0x07,0xa6,0xfe,0xff,0xff,0xff,0x5f,0x4d,0xfa,0xff,0xff, - 0x7f,0xff,0xff,0xff,0xff,0xff,0x40,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0x09,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x2b,0x4b,0xfe,0xff,0xff,0xff,0xbf, - 0x2c,0xf8,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xf5,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0x43,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x57,0xff, - 0xff,0xff,0xff,0x5f,0x0a,0xfe,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x89,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xd5,0xa9,0xff,0xff,0xff,0xff,0xaf,0x5a,0xfc,0xff,0xff,0x7f,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xa3,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0x81,0x95,0xff,0xff,0xff,0xff,0x9f,0x06,0xfd,0xff, - 0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xc9,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xca,0xa5,0xff,0xff,0xff,0xff, - 0x2f,0x95,0xfc,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xc1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0xea, - 0xff,0xff,0xff,0xff,0xaf,0x26,0xfe,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xd5,0xff,0xff,0xff,0xff,0xff, - 0xff,0x7f,0xf5,0xf4,0xff,0xff,0xff,0xff,0xaf,0x86,0xfe,0xff,0xff,0x7f,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc1,0xff, - 0xff,0xff,0xff,0xff,0xff,0x7f,0x70,0xe5,0xff,0xff,0xff,0xff,0x4f,0x2e,0xfe, - 0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xeb,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xb2,0xfa,0xff,0xff,0xff, - 0xff,0x57,0x83,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xf3,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x78, - 0xf2,0xff,0xff,0xff,0xff,0xa7,0x22,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0x5f,0x5d,0xfd,0xff,0xff,0xff,0xff,0x97,0x87,0xff,0xff,0xff,0x7f, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x3c,0xfd,0xff,0xff,0xff,0xff,0x53,0xa3, - 0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xaf,0xac,0xfe,0xff,0xff, - 0xff,0xff,0x57,0x95,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f, - 0x9e,0xfe,0xff,0xff,0xff,0xff,0x97,0x81,0xff,0xff,0xff,0x7f,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xa7,0x57,0xfe,0xff,0xff,0xff,0xff,0xa9,0xa5,0xff,0xff,0xff, - 0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0xaf,0xff,0xff,0xff,0xff,0xff,0x4b, - 0x89,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xab,0x93,0xff,0xff, - 0xff,0xff,0xff,0x95,0xa2,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0x83,0xab,0xff,0xff,0xff,0xff,0xff,0xd3,0xc8,0xff,0xff,0xff,0x7f,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xff, - 0xff,0xff,0xff,0xff,0xe9,0xa5,0xff,0xff,0xff,0xff,0xff,0xa5,0xe1,0xff,0xff, - 0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0xd5,0xff,0xff,0xff,0xff,0xff, - 0xd5,0xc8,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xea,0xea,0xff, - 0xff,0xff,0xff,0xff,0x14,0xc1,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff, - 0xff,0xe0,0xe4,0xff,0xff,0xff,0xff,0xff,0x65,0xe8,0xff,0xff,0xff,0x7f,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xcf, - 0xff,0xff,0xff,0xff,0x3f,0x72,0xe9,0xff,0xff,0xff,0xff,0xff,0x6a,0xe1,0xff, - 0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xbf,0xb8,0xfa,0xff,0xff,0xff,0xff, - 0xff,0x52,0xea,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xd3,0xff,0xff,0xff,0xff,0x1f,0x7a,0xf5, - 0xff,0xff,0xff,0xff,0x7f,0x2a,0xe0,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xeb,0xff,0xff,0xff, - 0xff,0x8f,0x58,0xfa,0xff,0xff,0xff,0xff,0x7f,0x25,0xf5,0xff,0xff,0xff,0x7f, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xb5,0xff,0xff,0xdf,0xff,0x57,0x5e,0xfd,0xff,0xff,0xff,0xff,0xff,0x34,0xe0, - 0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xca,0xff,0xff,0x8f,0xff,0x07,0xac,0xfc,0xff,0xff,0xff, - 0xff,0x7f,0x2a,0xf5,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xd4,0xff,0xff,0x57,0xff,0x2b,0x2d, - 0xfd,0xff,0xff,0xff,0xff,0xff,0xb2,0xf0,0xff,0xff,0xff,0x7f,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xd2,0xff,0xff, - 0x07,0xff,0x43,0x4a,0xff,0xff,0xff,0xff,0xff,0xbf,0x2a,0xf8,0xff,0xff,0xff, - 0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0x3f,0xc5,0xff,0xff,0x2b,0xfe,0x08,0xab,0xfe,0xff,0xff,0xff,0xff,0x7f,0xaa, - 0xf2,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xbf,0xea,0xff,0xff,0x83,0x36,0x20,0x55,0xff,0xff,0xff, - 0xff,0xff,0x3f,0x15,0xf0,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x4f,0xc2,0xff,0xff,0x48,0x4a,0x85, - 0x49,0xff,0xff,0xff,0xff,0xff,0x7f,0x59,0xfa,0xff,0xff,0xff,0x7f,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x5f,0xf5,0xff, - 0x7f,0x10,0x29,0x50,0xa5,0xff,0xff,0xff,0xff,0xff,0x3f,0x15,0xf9,0xff,0xff, - 0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0x97,0xe4,0xff,0x7f,0x05,0x95,0x42,0xd5,0xff,0xff,0xff,0xff,0xff,0x7f, - 0x35,0xfc,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xab,0xea,0xff,0xbf,0xa0,0x24,0xa8,0xd4,0xff,0xff, - 0xff,0xff,0xff,0x7f,0x19,0xf9,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x27,0xe5,0xff,0x3f,0x92,0xaa, - 0x50,0xe9,0xff,0xff,0xff,0xff,0xff,0x9f,0x4a,0xfc,0xff,0xff,0xff,0x7f,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xa9,0xe2, - 0xff,0x9f,0xa0,0xaa,0x2a,0xf5,0xff,0xff,0xff,0xff,0xff,0x5f,0x1a,0xf9,0xff, - 0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0x95,0xf8,0xff,0x5f,0x4a,0x92,0x4a,0xf5,0xff,0xff,0xff,0xff,0xff, - 0xbf,0x4a,0xfc,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0x7f,0x52,0xf2,0xff,0x1f,0x20,0x49,0xa5,0xfa,0xff, - 0xff,0xff,0xff,0xff,0x5f,0x1a,0xfd,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xaa,0xf8,0xff,0x47,0xa9, - 0x2a,0x29,0xf9,0xff,0xff,0xff,0xff,0xff,0xbf,0x0a,0xfc,0xff,0xff,0xff,0x7f, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x49, - 0xf2,0xff,0x17,0x92,0xaa,0xaa,0xfe,0xff,0xff,0xff,0xff,0xff,0x9f,0xac,0xfe, - 0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0x9f,0x2a,0xf8,0xff,0x43,0xa8,0x24,0x25,0xff,0xff,0xff,0xff,0xff, - 0xff,0xaf,0x0a,0xfc,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0x94,0xfa,0xff,0x91,0x54,0xaa,0x52,0xff, - 0xff,0xff,0xff,0xff,0xff,0x2f,0x4d,0xfd,0xff,0xff,0xff,0x7f,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x2f,0x45,0xfc,0xff,0x03, - 0x92,0x52,0xaa,0xff,0xff,0xff,0xff,0xff,0xff,0x5f,0x06,0xfc,0xff,0xff,0xff, - 0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xaf, - 0x12,0xfe,0xff,0x50,0xaa,0x2a,0x95,0xff,0xff,0xff,0xff,0xff,0xff,0x4f,0xa5, - 0xfe,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xa7,0x44,0xff,0xff,0x0a,0x25,0xa5,0xa4,0xff,0xff,0xff,0xff, - 0xff,0xff,0x97,0x06,0xfc,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x2b,0x15,0xff,0xff,0x40,0xa9,0x92,0xea, - 0xff,0xff,0xff,0xff,0xff,0xff,0x57,0x55,0xfd,0xff,0xff,0xff,0x7f,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x55,0xa1,0xff,0x7f, - 0x92,0x4a,0xaa,0xd4,0xff,0xff,0xff,0xff,0xff,0xff,0x57,0x06,0xfc,0xff,0xff, - 0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0x95,0x8a,0xff,0x3f,0x84,0x54,0xa9,0xea,0xff,0xff,0xff,0xff,0xff,0xff,0x2f, - 0x25,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0x52,0xe0,0xff,0xbf,0x50,0xa9,0x4a,0xf2,0xff,0xff,0xff, - 0xff,0xff,0xff,0xa7,0x8e,0xfe,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xa9,0xea,0xff,0x3f,0x24,0x95,0x54, - 0xf5,0xff,0xff,0xff,0xff,0xff,0xff,0x57,0x23,0xfe,0xff,0xff,0xff,0x7f,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0x4a,0xf0,0xff, - 0x9f,0x50,0x69,0x49,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0x4f,0x8b,0xff,0xff, - 0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0x7f,0xa5,0xf4,0xff,0x0f,0x2d,0x75,0xaa,0xfa,0xff,0xff,0xff,0xff,0xff,0xff, - 0xaf,0x03,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0x9f,0x14,0xfa,0xff,0x2f,0xa8,0xfa,0x25,0xfd,0xff,0xff, - 0xff,0xff,0xff,0xff,0x97,0xd7,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xaf,0xaa,0xfc,0xff,0x0f,0x4d,0xfd, - 0xa9,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xcf,0x83,0xff,0xff,0xff,0xff,0x7f, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x5f,0x12,0xfc, - 0xff,0x27,0x92,0xfe,0xcb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xd7,0xd7,0xff, - 0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0x97,0x0a,0xff,0xff,0x83,0x56,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xef,0xc7,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xab,0x24,0xff,0xff,0x2b,0xaa,0xfe,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xe7,0xef,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x4b,0x45,0xff,0xff,0x05,0x95, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe7,0xff,0xff,0xff,0xff, - 0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x95,0x82, - 0xff,0xff,0x51,0xa9,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7, - 0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xa9,0xe8,0xff,0xff,0x85,0xca,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0x7f,0x52,0xc1,0xff,0xff,0x90,0xd5,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x4d,0xe8,0xff,0xff,0xa5, - 0xe4,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x51, - 0xf2,0xff,0x7f,0x40,0xd5,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0x3f,0x95,0xf8,0xff,0x7f,0xa9,0xea,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0x4f,0x15,0xfa,0xff,0x3f,0xa4,0xf4,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xaf,0xa4,0xfc,0xff,0x7f, - 0x71,0xe5,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x2f, - 0x15,0xfe,0xff,0x3f,0x94,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xa7,0x0a,0xff,0xff,0x1f,0x79,0xf2,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xab,0xa4,0xff,0xff,0x5f,0x8c,0xfa,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x53,0x82,0xff,0xff, - 0x1f,0x5c,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xa4,0x92,0xff,0xff,0xbf,0x56,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0x9a,0xc4,0xff,0xff,0x0f,0x2e,0xfd,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xa2,0xf0,0xff,0xff,0xaf,0xa7,0xfe, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x55,0xe4,0xff, - 0xff,0x0f,0x57,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xbf,0x54,0xf2,0xff,0xff,0x9f,0x4b,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0x9f,0x92,0xf8,0xff,0xff,0xc7,0xab,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x5f,0x15,0xfe,0xff,0xff,0x97,0xd7, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xa7,0x94,0xfc, - 0xff,0xff,0xc7,0xe3,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0x2f,0x05,0xfe,0xff,0xff,0xcf,0xf5,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0x53,0xa9,0xff,0xff,0xff,0xd3,0xeb,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x4b,0x05,0xff,0xff,0xff,0xe3, - 0xe5,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x54,0xc2, - 0xff,0xff,0xff,0xeb,0xf9,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0x95,0xc8,0xff,0xff,0xff,0xf3,0xfa,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0x7f,0xa5,0xd2,0xff,0xff,0xff,0xff,0xf5,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xaa,0xe0,0xff,0xff,0xff, - 0xff,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x49, - 0xf8,0xff,0xff,0xff,0xff,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0x9f,0x2a,0xf5,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0x5f,0x4a,0xf8,0xff,0xff,0xff,0xff,0xfc,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xaf,0x14,0xfd,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x97, - 0x4a,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xab,0x04,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x95,0x52,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x53,0x85,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0x54,0xa2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0x4a,0xc9,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xa5,0xe0,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0x94,0xe4,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0x5f,0x55,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xbf,0x12,0xf9,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x4f,0x54,0xfa,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xaf,0x0a,0xfc, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0x53,0x45,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0x97,0x14,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x4b,0x45,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x54,0x82, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0x4a,0xe9,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0x52,0xc1,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x55,0xe8,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0x24, - 0xf1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0x7f,0x55,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0x24,0xf9,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x15,0xfe,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x5f, - 0x49,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0x2f,0x95,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x5f,0x01,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x2f,0xd5,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0x57,0x81,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0x97,0xd4,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xaf,0xe0,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x93,0xf4,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0x57,0xf2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0x2b,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x89,0xfc,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x55,0xfc, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0x05,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0x49,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x22,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x89, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff, - 0xff,0xff,0x7f,0xe5,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f, - 0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xc1,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xe9,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0x7f, - 0xf2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff, - 0xff,0xff,0xff,0x9f,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xf9,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xfc,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff, - 0x6f,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff, - 0xff,0xff,0xff,0xff,0xbf,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff, - 0xff,0x9f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff, - 0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f}; diff --git a/etc/gnus/gnus.xpm b/etc/gnus/gnus.xpm deleted file mode 100644 index 0c9338f..0000000 --- a/etc/gnus/gnus.xpm +++ /dev/null @@ -1,284 +0,0 @@ -/* XPM */ -static char *gnus[] = { -/* width height num_colors chars_per_pixel */ -" 271 273 3 1", -/* colors */ -". s thing c #bf9900", -"# s shadow c #ffcc00", -"a s None c None", -/* pixels */ -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...aaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........######aaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.............#######aaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa................######aaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..................######aaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....................#######aaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......................#######aaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa........................#######aaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........................######aaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...........................######aaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...........aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa............................#######aaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...............aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..............................#######aaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..................aaaaaaaaaaaaaaaaaaaaaa...........aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...............................#######aaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....................aaaaaaaaaaaaaaaaaaa...............aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...............................#######aaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......................aaaaaaaaaaaaaaaa....................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa................................########aaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......................aaaaaaaaaaaaaa........................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.................................#######aaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........................aaaaaaaaaaa............................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..................................########aaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...........................aaaaaaaaa..............................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...................................#######aaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.............................aaaaaaa................................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....................................#######aaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...............................aaaaa..................................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......######.......................#######aaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa................................aaaa...................................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......aa#######aa....................#######aaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..................................aa.....................................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....aa######aaaaaaa.................#######aaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....................................a......................................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......aa#####aaaaaaaaa................#######aaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.............................................................................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a######aaaaaaaaaa...............#######aaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..............................................................................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......aa######aaaaaaaaaa...............#######aaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa................................................................................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......aa#####aaaaaaaaaaaa..............#######aaaaa", -"aaaaaaaaa..aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..................................................................................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......a######aaaaaaaaaaaa..............#######aaaaa", -"aaaaaaaaa....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....................................................................................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......a######aaaaaaaaaaaaa.............#######aaaaa", -"aaaaaaaa.......aaaaaaaaaaaaaaaaaaaaaaaaaaaaa..............####....................................................................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a#######aaaaaaaaaaaaa............########aaaaa", -"aaaaaaa.........aaaaaaaaaaaaaaaaaaaaaaaaaaa.............########...................................................................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......a#######aaaaaaaaaaaaaa...........########aaaaa", -"aaaaaaa...........aaaaaaaaaaaaaaaaaaaaaaa.............############..................................................................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......a######aaaaaaaaaaaaaaa...........########aaaaa", -"aaaaaaaa..........aaaaaaaaaaaaaaaaaaaaaa.............##############..................................................................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a#######aaaaaaaaaaaaaaa...........########aaaaa", -"aaaaaaaa...........aaaaaaaaaaaaaaaaaaaa............##################.......................##########................................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....aa######aaaaaaaaaaaaaaaa..........########aaaaa", -"aaaaaaaa............aaaaaaaaaaaaaaaaaa............####################....................###############..............................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....aaa#####aaaaaaaaaaaaaaaaa..........#######aaaaaa", -"aaaaaaaa............aaaaaaaaaaaaaaaa..............#####################.................#####################..........................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..aaaaaa..aaaaa###aaaaaaaaaaaaaaaaaa..........#######aaaaaa", -"aaaaaaaa.............aaaaaaaaaaaaaa..............#######################...............#######################..........................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..aaaaaa..aaaaa##aaaaaaaaaaaaaaaaaaa..........#######aaaaaa", -"aaaaaaaaa.............aaaaaaaaaaa...............##########aa#############.............#########################..........................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...aaaaaaaaaaaaa##aaaaaaaaaaaaaaaaaaa..........#######aaaaaa", -"aaaaaaaaa.............aaaaaaaaa................#########aaaaaaa###########............##########################..........................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........########aaaaaa", -"aaaaaaaaa................aaaa..................#######aaaaaaaaaa###########..........############################..........................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........########aaaaaa", -"aaaaaaaaa.....................................######aaaaaaaaaaaaa###########.........#############################..........................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........########aaaaaa", -"aaaaaaaaa....................................######aaaaaaaaaaaaaaaa#########........###############################.........................aaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........########aaaaaa", -"aaaaaaaaaa.................................#######aaaaaaaaaaaaaaaaaa#########.......#######aaaaaaaaaaa##############..........................aaaaaaaaaaaaaaaaaaaaaaaaaaa.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#######aaaaaaa", -"aaaaaaaaaa................................#######aaaaaaaaaaaaaaaaaaaa########......#####aaaaaaaaaaaaaaaaa############..........................aaaaaaaaaaaaaaaaaaaaaaaaa......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#######aaaaaaa", -"aaaaaaaaaa...............................########aaaaaaaaaaaaaaaaaaaaa########....#####aaaaaaaaaaaaaaaaaaaaa##########..........................aaaaaaaaaaaaaaaaaaaaaaa......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....a#aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#######aaaaaaa", -"aaaaaaaaa#..............................########aaaaaaaaaaaaaaaaaaaaaaaa#.####...#####aaaaaaaaaaaaaaaaaaaaaaa##########...........................aaaaaaaaaaaaaaaaaaaa.......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....aa###aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#######aaaaaaa", -"aaaaaaaaa#.............................########aaaaaaaaaaaaaaaaaaaaaaaaa...###..######aaaaaaaaaaaaaaaaaaaaaaaa##########...........................aaaaaaaaaaaaaaaaaaa......a#aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....a####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........########aaaaaaa", -"aaaaaaaa###...........................#########aaaaaaaaaaaaaaaaaaaaaaaa....##########aaaaaaaaaaaaaaaaaaaaaaaaaa##########............................aaaaaaaaaaaaaaa........##aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....aa###aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........########aaaaaaa", -"aaaaaaaa###..........................#########aaaaaaaaaaaaaaaaaaaaaaaaa....#########aaaaaaaaaaaaaaaaaaaaaaaaaaaa##########...............................aaaaaaaa...........##aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........########aaaaaaa", -"aaaaaaaa###.........................#########aaaaaaaaaaaaaaaaaaaaaaaaa....a#########aaaaaaaaaaaaaaaaaaaaaaaaaaaaa##########................................................##aaaaaa...aaaaaaaaaaaaaaaaaaaaa......a#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#######aaaaaaaa", -"aaaaaaa####........................#########aaaaaaaaaaaaaaaaaaaaaaaaa....aaa#######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#########...............................................##aaaaaa....aaaaaaaaaaaaaaaaaaa.......a#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#######aaaaaaaa", -"aaaaaaa####.......................########aaaaaaaaaaaaaaaaaaaaaaaaaa.....aaa#######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#########..............................................##aaaaa.....aaaaaaaaaaaaaaaaaa.......a#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#######aaaaaaaa", -"aaaaaa######....................#########aaaaaaaaaaaaaaaaaaaaaaaaaa.....a#aaa#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#########............................................##aaaaaa......aaaaaaaaaaaaaaa.........a#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#######aaaaaaaa", -"aaaaaa######...................#########aaaaaaaaaaaaaaaaaaaaaaaaaa......##aaa####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#########...........................................##aaaaa.......aaaaaaaaaaaaa..........aa####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#######aaaaaaaa", -"aaaaaa#######.................#########aaaaaaaaaaaaaaaaaaaaaaaaaaa.....a###aaa###aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#########.........................................###aaaaa.........aaaaaaa..............a#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa........########aaaaaaaa", -"aaaaaaa#######...............#########aaaaaaaaaaaaaaaaaaaaaaaaaaa.....a####aaa##aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#########........................................##aaaaa...............................a####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#######aaaaaaaaa", -"aaaaaaa########............##########aaaaaaaaaaaaaaaaaaaaaaaaaaa.....a####aaaa#aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#########.......................................##aaaaa...............................#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#######aaaaaaaaa", -"aaaaaaaa##########.......###########aaaaaaaaaaaaaaaaaaaaaaaaaaa......#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#########.....................................###aaaaa..............................#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#######aaaaaaaaa", -"aaaaaaaaa##########################aaaaaaaaaaaaaaaaaaaaaaaaaaaa.....#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#########....................................##aaaaa...............................#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa........########aaaaaaaaa", -"aaaaaaaaa#########################aaaaaaaaaaaaaaaaaaaaaaaaaaaa.....#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#########..................................###aaaaa..............................#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa........#######aaaaaaaaaa", -"aaaaaaaaaa#######################aaaaaaaaaaaaaaaaaaaaaaaaaaaa.....a#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#########...............................####aaaaa..............................######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa........#######aaaaaaaaaa", -"aaaaaaaaaaa#####################aaaaaaaaaaaaaaaaaaaaaaaaaaaaa....a#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#########.............................#####aaaaa.............................#######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa........#######aaaaaaaaaa", -"aaaaaaaaaaa###################aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....a######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#########...........................######aaaa..............................######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......########aaaaaaaaaa", -"aaaaaaaaaaaa#################aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....a######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#########.........................######aaaaa.............................#######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa........#######aaaaaaaaaaa", -"aaaaaaaaaaaaa###############aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....a#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...aaaaaaaaaaaaaaaaa#########.......................#######aaaa.............................#######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa........#######aaaaaaaaaaa", -"aaaaaaaaaaaaaaa###########aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....a#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......aaaaaaaaaaaaaaaa#########....................#########aaaa............................########aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......a#######aaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaa###aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....a#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......aaaaaaaaaaaaaaaa#########..................#########aaaaa..........................#########aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......#######aaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........aaaaaaaaaaaaaaa###########.............###########aaaaa.........................##########aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......#######aaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....a#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa............aaaaaaaaaaaaaaa##############....###############aaaaaaa.......................##########aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......a#######aaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....a#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.............aaaaaaaaaaaaaaa##############################aaaaaaaaa.....................############aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......a######aaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...............aaaaaaaaaaaaaaa############################aaaaaaaaaaa...................############aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......a######aaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....a#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaa................aaaaaaaaaaaaaaaa##########################aaaaaaaaaaaa#................#############aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......#######aaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....a#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....aaaaaa.................aaaaaaaaaaaaaaaa########################aaaaaaaaaaaaa##..............#############aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a#######aaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....aaaaa...................aaaaaaaaaaaaaaaa######################aaaaaaaaaaaaa#####.........###############aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......a######aaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....a#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....aaaaa....................aaaaaaaaaaaaaaaaa###################aaaaaaaaaaaaaaa########..##################aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......a######aaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....a#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....aaaaaa....................aaaaaaaaaaaaaaaaaaa################aaaaaaaaaaaaaaaa###########################aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a#######aaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......aaaaa......................aaaaaaaaaaaaaaaaaaaaa###########aaaaaaaaaaaaaaaaaa##########################aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a######aaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....a####aaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......aaaaa.......................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa########################aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a######aaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....a#####aaaaaaaaaaaaaaaaaaaaaaaaaaaa.......aaaaaa.......................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa######################aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......a######aaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....#####aaaaaaaaaaaaaaaaaaaaaaaaaaaa........a###a.........................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####################aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a#######aaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....a####aaaaaaaaaaaaaaaaaaaaaaaaaaaa........a####a.........................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa##################aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a######aaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....a#####aaaaaaaaaaaaaaaaaaaaaaaaaaa........a#####aaa.......................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa###############aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a######aaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....a####aaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaa#.....................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa############aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....aa######aaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....a####aaaaaaaaaaaaaaaaaaaaaaaaaa..........#####aaaaaa##....................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a######aaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....#####aaaaaaaaaaaaaaaaaaaaaaaaa..........######aaaaa#####..................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a######aaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....a####aaaaaaaaaaaaaaaaaaaaaaaaa...........#####aaaaa#######..................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a######aaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....####aaaaaaaaaaaaaaaaaaaaaaaaa...........#####aaaaaa#######..................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......aa#####aaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....####aaaaaaaaaaaaaaaaaaaaaaaaa...........######aaaaa#########.................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a######aaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....####aaaaaaaaaaaaaaaaaaaaaaaa...........######aaaaa###########................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a######aaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....####aaaaaaaaaaaaaaaaaaaaaaa............#######aaaaaaa##########...............aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......aa######aaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......####aaaaaaaaaaaaaaaaaaaaaa............#######aaaaaaaaa#########...............aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......aa#####aaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....####aaaaaaaaaaaaaaaaaaaaaa............#######aaaaaaaaaaaa########..............aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a######aaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......###aaaaaaaaaaaaaaaaaaaaa............#########aaaaaaaaaaaaa#######..............aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......aa#####aaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......###aaaaaaaaaaaaaaaaaaa.............#########aaaaaaaaaaaaaaa#######.............aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......aa#####aaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa........#aaaaaaaaaaaaaaaaaaa.............#########aaaaaaaaaaaaaaaaa######.............aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....aa######aaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa........#aaaaaaaaaaaaaaaaa..............#########aaaaaaaaaaaaaaaaaaa#####.............aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......aa#####aaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa........#aaaaaaaaaaaaaaa...............#########aaaaaaaaaaaaaaaaaaaa#####.............aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....aaa#####aaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...........aaaaaaaaaaaaa...............#########aaaaaaaaaaaaaaaaaaaaaa#####............aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....aa######aaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...............aaaaa..................########aaaaaaaaaaaaaaaaaaaaaaaaa####............aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......aa#####aaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......................................########aaaaaaaaaaaaaaaaaaaaaaaaaa####...........aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....aaa#####aaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....................................########aaaaaaaaaaaaaaaaaaaaaaaaaaaa###...........aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....aaa####aaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....................................#########aaaaaaaaaaaaaaaaaaaaaaaaaaaaa####..........aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....aaa#####aaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...................................#########aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa###..........aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....aaa#####aaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...................................#########aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa###..........aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....aaa#####aaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.................................#########aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa###..........aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....aaa####aaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa................................#########aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa##..........aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....aaa#####aaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa................................#########aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa##..........aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....aaa#####aaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..............................##########aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#..........aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa###aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....aaa#####aaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.............................##########aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#.........#aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa###aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....aaa####aaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa............................##########aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#.........#aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa###aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....aaa#####aaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...........................#########aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#.........#aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....aaa#####aaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........................##########aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#........##aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####aaaa..aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....aa######aaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......................###########aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#........##aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#####aaa...aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......aa#####aaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#...................############aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#........#aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#####aaa...aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......aa#####aaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa##................#############aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#.......##aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa######aa....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....aa######aaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa###............##############aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#......###aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa######aa....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......aa######aaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####.........###############aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#......###aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa######aa.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......aa######aaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa######..###################aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#.....###aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa######aa....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a######aaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#########################aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#.....###aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#######a.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......aa######aaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa########################aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#.....###aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa######aa.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a#######aaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#####################aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#....####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#######a......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a#######aaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa##################aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#....###aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa######a.......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......a######aaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa##############aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#...####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa######aa.......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a#######aaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa###########aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa##..####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#######a.......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a#######aaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa######aa.......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a######aaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa######aa.......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......a######aaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa######aa......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a#######aaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa######aa.......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a#######aaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#####aaa......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa######aa......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......aa######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#####aaa......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......aa######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa######aa......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa##aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#####aaa......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa######aa......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......aa######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#####aaa.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......aa#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa######aa......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa######aaa.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#####aaa......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......a######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa######aaa.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......a######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#####aaa......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a#######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa######aa......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#####aaa......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa######aa......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......a######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#####aaa......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......#######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa######aa......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a#######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa######aaa......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa######aa......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......a######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa######aaa......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......#######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#######aa......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......#######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....a#aaaaaaaaaaaaaaaaaaaaaa#aaaaaaaaaaaaa#######aaa......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a#######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....#aaaaaaaaaaaaaaaaaaaaaa###aaaaaaaaaaaa#######aa......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......#aaaaaaaaaaaaaaaaaaaaa#####aaaaaaaaaa########a.......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......#aaaaaaaaaaaaaaaaaaaaa#####aaaaaaaaa########a.......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......a######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......#aaaaaaaaaaaaaaaaaaaa#######aaaaaaa#########a.......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......#######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......##aaaaaaaaaaaaaaaaaaa########a..aa##########a.......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a#######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa........##aaaaaaaaaaaaaaaaaa#########....##########a........aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa........#aaaaaaaaaaaaaaaaaa#########......#########........aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#aaaaaaaaaaaaaaaaaa#########......########a........aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........##aaaaaaaaaaaaaaaaa#########.......#######.........aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........##aaaaaaaaaaaaaaaaa########.........#####.........aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a#######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........###aaaaaaaaaaaaaaaa########........................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a#######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........###aaaaaaaaaaaaaaaaa########.......................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........###aaaaaaaaaaaaaaaa########.......................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........####aaaaaaaaaaaaaaa#########.......................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaa########.......................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......a######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........####aaaaaaaaaaaaaaa#########......................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......a######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaa#########......................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a#######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaa########.......................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a#######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaa#########......................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......a#######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaa########.......................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......a#######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaa########.......................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......a#######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaaa########.......................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......a#######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#####aaaaaaaaaaaaaaa########.......................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......a######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaaa#######........................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......aa######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaaa########.......................aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......a#######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........####aaaaaaaaaaaaaaaaa#######.........a..............aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....aa######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaaa#######a........aaa............aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....aa######aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaaaa#######........aaaaa..........aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....aaa#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........####aaaaaaaaaaaaaaaaa#######a.......aaaaaaa.......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....aaa#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaaaa######a........aaaaaaa.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...aaaaa###aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaaaa#######a.......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...aaaaa###aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaaaaa#######........aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..aaaaaa##aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#####aaaaaaaaaaaaaaaaa#######a.......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaa##aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaaaaa#######.......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaaaaaa######a.......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#####aaaaaaaaaaaaaaaaaa#######a......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaaaaaa#######.......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaaaaaa#######a.......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........####aaaaaaaaaaaaaaaaaaaa#######.......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#####aaaaaaaaaaaaaaaaaaa#######a.......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaaaaaaa######aa.......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........####aaaaaaaaaaaaaaaaaaaaa######a.......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#####aaaaaaaaaaaaaaaaaaaa######aa.......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaaaaaaaa######a.......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaaaaaaaaa#####aa.......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#####aaaaaaaaaaaaaaaaaaaaaa####aa.......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaaaaaaaaa#####aa.......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaaaaaaaaaa####aaa......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#####aaaaaaaaaaaaaaaaaaaaaaa####aa.......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#####aaaaaaaaaaaaaaaaaaaaaaaa###aaa......aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaaaaaaaaaaa####aaa.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........####aaaaaaaaaaaaaaaaaaaaaaaaa####aaa....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#####aaaaaaaaaaaaaaaaaaaaaaaaa###aaa.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaaaaaaaaaaaaa###aaa....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........####aaaaaaaaaaaaaaaaaaaaaaaaaa####aaa....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#####aaaaaaaaaaaaaaaaaaaaaaaaaa###aaaa....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#####aaaaaaaaaaaaaaaaaaaaaaaaaaa###aaa....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaaaaaaaaaaaaaaa##aaaa....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#####aaaaaaaaaaaaaaaaaaaaaaaaaaaa#aaaaa....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..........#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.........#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa........#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa........#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa........#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa........#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.......#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa......#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...#####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..a####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..a####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.a####aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa###aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.aa###aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa###aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa##aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa##aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa##aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa#aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" -}; -SIMPLE = T BITPIX = 8 NAXIS = 2 NAXIS1 = 271 NAXIS2 = 273 HISTORY Written by XV 3.10a END ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëŽëë½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëŽë½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎뽽½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎뽽½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎Ž½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎Ž½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎Ž½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎Ž½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽ½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽ½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎Žëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎Žëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎Žëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëë½ëëëë뎎ŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½ëëë뎎ŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½ëë뎎ŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëë½½½ëëë뎎ŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½ëë뎎ŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëë½½½ëë뎎ŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëë½½½ëë뎎ŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½ëëëëëëëëëëëëëëëëëëëëëëëëë½½½½ëë뎎ŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëë½½½½ëë뎎ŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëë½½½ëë뎎ŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëë½½½½ë뎎ŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëë½½½½ëë뎎ŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëë½½½½½ë뎎ŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëë½½½½ë뎎ŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëë½½½½½ë뎎ŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëë½½½½½½ëŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëë½½½½½½ë뎎ŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½ëëëëëëëëëëëëëëëëëëëëë½½½½½½ëŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëë½½½½½½ë뎎ŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëë½½½½½½½ëŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½ëëëëëëëëëëëëëëëëëëëë½½½½½½½ŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëë½½½½½½½ëŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëë½½½½½½½ŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëë½½½½½½½ëŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëë½½½½½½ëŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëë½½½½½½½ŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëë½½½½½½½ëŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëŽëëëëëë½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëë½½½½½½½ŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ëëëëëë½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëë½½½½½½½ëŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎Žëëëëë½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëë½½½½½½ëŽŽŽŽŽŽŽŽëëëëëë뎎ŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎Žëëëëë½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½ëëëëëëëëëëëëëëëëë½½½½½½½ëŽŽŽŽŽŽŽëëëëëë뎎ŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽëëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëë½½½½½½½ŽŽŽŽŽŽŽŽëëëë뎎ŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽëëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëë½½½½½½½ëŽŽŽŽŽŽŽŽëë뎎ŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽëë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½ëëëëëëëëëëëëëëëëë½½½½½½½ŽŽŽŽŽŽŽŽŽëŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽëë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëë½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëë½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽëë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëë½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëë½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëë½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëë½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëë½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëë½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëë½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½ëëëëëëëëëëëëëëë½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëë½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½ëëëëëëëëëëëëëëë½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½ëëëëëëëëëëëëëëëë½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½ëëëëëëëëëëëëëëëëë½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½ëëëëëëëëëëëëëëëë½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½ëëëëëëëëëëëëëëëëë½½½½½½½½ŽŽŽŽŽŽŽŽŽ½½½½½ŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½ëëëëëëëëëëëëëëëëë½½½½½½½½½ŽŽŽŽŽŽŽ½½½½½½½ŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½ëëëëëëëëëëëëëëëëëë½½½½½½½½½ŽŽŽŽŽŽ½½½½½½½½ëŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽ½ëëëëëëëëëëëëëëëëëë½½½½½½½½½ŽŽŽŽŽŽ½½½½½½½½½ŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽ½½ëëëëëëëëëëëëëëëëëë½½½½½½½½½ŽŽŽŽ½½½½½½½½½½ëŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽ½½ëëëëëëëëëëëëëëëëëëë½½½½½½½½ëŽŽëë½½½½½½½½½½ëŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽ½ëëëëëëëëëëëëëëëëëëëë½½½½½½½ëëëëëëë½½½½½½½½½ëŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽ½ëëëëëëëëëëëëëëëëëëëëë½½½½½ëëëëëëëëë½½½½½½½½ëŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽ½ëëëëëëëëëëëëëëëëëëëëë½½½½½ëëëëëëëëëë½½½½½½½½ëŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽ½ëëëëëëëëëëëëëëëëëëëëëë½½½ëëëëëëëëëëëë½½½½½½½ë뎎ŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽë½ëëëëëëëëëëëëëëëëëëëëëë½ëëëëëëëëëëëëë½½½½½½½ëë뎎ŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½ë뎎ŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ëë뎎ŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎Žëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ë뎎ŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎Žëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ëë뎎ŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ë뎎ŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½ëë뎎ŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ë뎎ŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½ëë뎎ŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ë뎎ŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½ëë뎎ŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ëë뎎ŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½ëë뎎ŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ëë뎎ŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ë뎎ŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½ëë뎎ŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ë뎎ŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽëë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½ëë뎎ŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ë뎎ŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½ëë뎎ŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽëë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ë뎎ŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽëë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½ëë뎎ŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ë뎎ŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ë뎎ŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ë뎎ŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ë뎎ŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½ŽŽ½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½ëŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뽎ŽŽ½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ë뎎ŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뽎ŽŽŽ½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ëŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뽎ŽŽŽ½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½ëŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뽎ŽŽŽŽ½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ë뎎ŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뽎ŽŽŽŽ½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½ëŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽëë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ŽŽ½½½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뽎ŽŽŽŽ½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ë뎎ŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½ŽŽŽŽŽŽŽŽŽ½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뽎ŽŽŽŽŽ½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ë뎎ŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽëë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½ŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뽎ŽŽŽŽŽ½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ë뎎ŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽëë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뽎ŽŽŽŽŽŽ½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½ë뎎ŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽëë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뽎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뽎ŽŽŽŽŽŽŽ½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½ëë뎎Žëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뽎ŽŽŽŽŽŽŽ½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½ëë뎎Žëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뽎ŽŽŽŽŽŽŽ½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½ëëë뎎ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽëë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뽎ŽŽŽŽŽŽŽŽ½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽëëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뽎ŽŽŽŽŽŽŽŽ½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽëëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뽎ŽŽŽŽŽŽŽŽ½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽëëë½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뽎ŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽëëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½ŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽëëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½ŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽëëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½ŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽëëë½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½ŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽëëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½ŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽëëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½ŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽëëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½ŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽëëë½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½ŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽëëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëë½½½½ŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëë½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽëë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽ½ëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½ëëëëëëëëëëëëëëëëëëëë½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽëëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽ½ëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½ëëëëëëëëëëëëëëëëëëë½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽ½ëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½ëëëëëëëëëëëëëëëëë½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽëë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽ½½½ëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½ëëëëëëëëëëëëëëë½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽ½½½ëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½ëëëëëëëëëëëëë½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽ½½½½ëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëë½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽ½½½½ëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëë½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽ½½½½ëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëë½½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽëë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽ½½½½ëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽ½½½½½½ëëëëë½½½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽ½½½½ëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽ½½½½½½ëëëëë½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽ½½½½ëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽ½½½½½ëëëëëë½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽë½½½½ëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽ½½½½½ëëëëë½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½½ëëëëë½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽë½½½½ëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½ëëëëëë½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽë½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½ëëëë뽎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽëë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽë½½½½½ëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽë½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽë½½½½ëŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽë½½½ëŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽë½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½ëëëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëë½½½½½½½½ŽŽ½½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëë½½½½½ŽŽŽŽŽŽŽŽŽ½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëë½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëŽëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½½½½½½½½½ëëëëëëëëëëë뽎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½½½½½½½½½½½ëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½ëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëë½½½½½½½½½½½½½½ŽŽŽŽ½½½½½½½½½½½½½½½ëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽ½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëë½½½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½½½ëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽëëëëëëëëëëëëëëëë½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½ëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽëëëëëëëëëëëëëëëë½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½ëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎Žëëëëëëëëëëëëëëëëë½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½ëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½ëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽë½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½ëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽ½½½½½½½½ëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½ëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½ëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½ëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëë½½½½½½½½½½½½½½½½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½ëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽ½½½½½½½½ëëëëëëëëëëëëëëëëë½½½½½½½½½½ŽŽŽŽŽŽŽ½½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½ëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëë½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽë½½½½ëëëë½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½ëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëë½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽë½½½½ëëë½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½ëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽë½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëë½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽë½½½ëëë½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½ëëëë뎎ŽŽŽŽŽŽŽëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽ½½½½½½½½ëëëëëëëëëëëëëë½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽ½½ëëë½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½ëëëë뎎ŽŽŽŽŽëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽëë½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëë½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽë½ëëë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½ëëëëë뎎ŽŽŽŽëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëë½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽëëë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½ëëëë뎎ŽŽŽëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëë½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽëëë½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½ëëëëë뎎ŽŽëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëë½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽë½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½ëëëëë뎎Žëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëë½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽ½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëë뎎ŽŽŽŽŽŽŽŽŽ½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½½½½ëëëëëëëëëëëëëëë½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽ½½½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽ½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽëë½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½½½½ëëëëëëëëëëëëëëë뽎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëë뎎Ž½½½ŽŽ½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽë½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽ½½½½½½½½ëëëëëëëëëëëëëëë뽎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëë뽎½½½½ŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽëë½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½ëëëëëëëëëëëëëëëëëëëëë½½½½½½½½ŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëëëëëë½½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽë½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëë½½½½½½½½ŽŽŽŽŽŽ½½½½½ëëëëëëëëëëëëëëëëë½½½½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëë½½½½½½½½½ŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëë½½½½½½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½ëëëëëëëëëëëëëëëë½½½½½½½½½ŽŽŽŽŽŽŽŽ½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½½½½ëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½ëëëëëëëëëëëëë½½½½½½½½½½½ŽŽŽŽŽŽŽŽŽ½½½½½½½½½½½½½½½½½½½½½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½½½½ëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëë½½½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½½½½½½½½½½½½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎Žëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½½½½ëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½ëëëëëëë½½½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½½½½½½½½½½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎Žëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½½½½ëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½½ëë½½½½½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½½½½½½½½½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎Žëëëëëëëëëëëëë½½ëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½½½½½½½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½½½½½½½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ëëëëë뎎ëëëëë½½ëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½½½½½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½½½½½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ëëëëë뎎ëëëëë½½½ëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½½½½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽëëë½½½½½ëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽëë½½½½½½ëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½½½½ëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½½ëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽ½½½½½½½½ëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽë½½½½½½ëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽ½½½½½½½½ëëëëëëëëëëë뎎ŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽë½½½½½½½ëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽ½½½½½½½½ëëëëëëëëëëëë뎎ŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽ½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½½ëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽ½½½½½½½½ëëëëëëëëëëëëë뎎ŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽë½½½½½½ëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëë뎎ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽë½½½½½½ëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽëë½½½½½ëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽëë½½½½½½ëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽë½½½½½½ëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽëë½½½½½ëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽëë½½½½½½ëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽëë½½½½½½½ë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽ½½½½½½ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽŽŽŽ½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽŽŽŽ½½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎ŽŽŽŽŽŽŽŽ½½½½½½ëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë뎎Žëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëëë diff --git a/etc/gnus/kill-group.pbm b/etc/gnus/kill-group.pbm deleted file mode 100644 index 50831447f5041925080300538cf32a5470704f5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81 zcmWGA;W9E&Ff!o^6%ABiVsH_0)c=1XgfWoAVnIx3C`S#4NR6O|1-FZUD8~+lP!~ZB k4F(qhK@AU%P!>TB28I|0Q4R(U5e7m1|F2y`LKzqs0K2vjGynhq diff --git a/etc/gnus/kill-group.xpm b/etc/gnus/kill-group.xpm deleted file mode 100644 index de83fd9..0000000 --- a/etc/gnus/kill-group.xpm +++ /dev/null @@ -1,50 +0,0 @@ -/* XPM */ -static char *magick[] = { -/* columns rows colors chars-per-pixel */ -"24 24 20 1", -" c Gray0", -". c Gray6", -"X c Gray12", -"o c #2ff42ff42ff4", -"O c #3fff3fff3fff", -"+ c Gray28", -"@ c #53e353e353e3", -"# c #5fe25fe25fe2", -"$ c #67e767e767e7", -"% c #6fff6fff6fff", -"& c #77d777d777d7", -"* c Gray50", -"= c Gray56", -"- c #9fff9fff9fff", -"; c Gray70", -": c Gray75", -"> c Gray81", -", c #dfffdfffdfff", -"< c #efffefffefff", -"1 c Gray100", -/* pixels */ -"::::::::::::::::::::::::", -"::::::::::::::::::::::::", -"::::::::::::::::::::::::", -"::::#oOOOOOOOOOo+;::::::", -"::::#:111111111:O$::::::", -"::::#:1111-O%11:*>@:::::", -"::::#:111=X.o#<>OOo#::::", -"::::#:111 OX# :111:#::::", -"::::#:111 = :111:#::::", -"::::#:111>Xo.-1111:#::::", -"::::#:1111*:O11111:#::::", -"::::#:11%1*oO->111:#::::", -"::::#:1-O:,1:*O111:#::::", -"::::#:111****:1111:#::::", -"::::#:1111* 111111:#::::", -"::::#:1,:O-1O*:111:#::::", -"::::#:1:X1111*#111:#::::", -"::::#:11>1111,<111:#::::", -"::::#:111111111111:#::::", -"::::#:111111111111:#::::", -"::::#:111111111111:#::::", -"::::&oooooooooooooo&::::", -"::::::::::::::::::::::::", -"::::::::::::::::::::::::" -}; diff --git a/etc/gnus/mail-reply.pbm b/etc/gnus/mail-reply.pbm deleted file mode 100644 index 9ca76596fb1dc23f14ce7fe6ee4085636e77bff3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81 zcmWGA;W9E&Ff!p{U}RumUckT-z+l6{=qkX>CBPygV6?!(Bp^i3 c Gray75", -", c Gray81", -"< c #dfffdfffdfff", -"1 c #efffefffefff", -"2 c Gray100", -/* pixels */ -">>>>>>>>>>>>>>>==:>>>>>>", -">>>>>>>>>>>>>>&**$&>>>>>", -">>>>>>>>>>>>>&-22,-o->>>", -">>>>>>>>>=$O@$,,2222O>>>", -">>>>>>>=#*>2*>2O222>$>>>", -">>>>>>o&>222O2%,22,$:>>>", -">>>:$O2222<#2*>222=+:>>>", -">>&$>;;2;2*>2><22;**$&>>", -">>o.;,,2,,*1%222;;,O;o>>", -">>o2;O><2O2,%221#o%22o>>", -">>o222***O2;22;**<222o>>", -">>o2222<>.;2,O;,22222o>>", -">>o2221>#2;O%;;,22222o>>", -">>o222**<22222;*>2222o>>", -">>o22%,222222221*,222o>>", -">>o;O,22222222222%#<2o>>", -">>o;22222222222222<**o>>", -">>oOOOOOOOOOOOOOOOOX o>>", -">>>>>>>>>>>>>>>>>>>>>>>>", -">>>>>>>>>>>>>>>>>>>>>>>>", -">>>>>>>>>>>>>>>>>>>>>>>>", -">>>>>>>>>>>>>>>>>>>>>>>>", -">>>>>>>>>>>>>>>>>>>>>>>>", -">>>>>>>>>>>>>>>>>>>>>>>>" -}; diff --git a/etc/gnus/next-ur.pbm b/etc/gnus/next-ur.pbm deleted file mode 100644 index 678bbb09f8bb27ac63913086163e3b41e264bc5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81 zcmWGA;W9E&Ff!p1WE5avU}69QK8C*v$E&(A-7Zex;1h_N| j1Y86h8aNzSB-EKV1h_Z|cqj-2C`fQ9xUybhVQ>Hd!Ws;4 diff --git a/etc/gnus/next-ur.xpm b/etc/gnus/next-ur.xpm deleted file mode 100644 index 8c823f2..0000000 --- a/etc/gnus/next-ur.xpm +++ /dev/null @@ -1,66 +0,0 @@ -/* XPM */ -static char *magick[] = { -/* columns rows colors chars-per-pixel */ -"24 24 36 1", -" c Gray0", -". c Gray6", -"X c Gray9", -"o c Gray12", -"O c #23f323f323f3", -"+ c Gray15", -"@ c #2ff32ff32ff3", -"# c #399939993999", -"$ c #3fff3fff3fff", -"% c #433243324332", -"& c Gray28", -"* c #4ccc4ccc4ccc", -"= c #53ed53ed53ed", -"- c #5ff05ff05ff0", -"; c Gray40", -": c #67e767e767e7", -"> c #6ccc6ccc6ccc", -", c #6fff6fff6fff", -"< c Gray45", -"1 c #77f277f277f2", -"2 c #7bdb7bdb7bdb", -"3 c #7ccc7ccc7ccc", -"4 c Gray50", -"5 c #866586658665", -"6 c Gray56", -"7 c Gray60", -"8 c #9bd39bd39bd3", -"9 c #9fff9fff9fff", -"0 c Gray65", -"q c #a7c7a7c7a7c7", -"w c Gray70", -"e c Gray75", -"r c Gray81", -"t c #dfffdfffdfff", -"y c #efffefffefff", -"u c Gray100", -/* pixels */ -"wqewqewqewqewqewqewqewqe", -"q6eq6eq6eq6eq6eq6eq6eq6e", -"eeeeeeeeeeeeeeeeeeeeeeee", -"wqewqewqewq82$.wqewqewqe", -"q6eq6eq6e6@19u$-6eq6eq6e", -"eeeeeeee==eyr$9@eeeeeeee", -"wqewq82$ruuu or=qewqewqe", -"q6e6@19uuuu94eue-eq6eq6e", -"eeew&euuuuuruuuy18eeeeee", -"wqew-8uuuuuuuuuu92wqewqe", -"q6eq619uut44uuuuu$q6eq6e", -"eeeeee29,-e@uuuuur=eeeee", -"wqeee82$rye-$uuuuu=qewqe", -"q6eq-19uu- e$uuuuue-eq6e", -"ee==eyuuu -y99uuuuy18eee", -"w&euuuuu,uuue4uuuuu92wqe", -"q@euuuuuuuuut4tuuuueoq6e", -"eq=u9$$$ruuuu4@$$r$;6eee", -"wq=8,988%ruu8,98-+6qewqe", -"q6e+wq888$et+wq888X6eq6e", -"eee+88888.4-+88888@eeeee", -"wqeO#6884,uu*5885<&qewqe", -"q6eq@#**(E({?|3<|;w2Fwgb fj0^${4IF_D5)2Lnj*c!I>I@7rAbo)@B0v%Vy;usB diff --git a/etc/gnus/post.xpm b/etc/gnus/post.xpm deleted file mode 100644 index 008cdc7..0000000 --- a/etc/gnus/post.xpm +++ /dev/null @@ -1,53 +0,0 @@ -/* XPM */ -static char *magick[] = { -/* columns rows colors chars-per-pixel */ -"24 24 23 1", -" c Gray0", -". c Gray6", -"X c Gray12", -"o c #2ff22ff22ff2", -"O c #3fff3fff3fff", -"+ c Gray28", -"@ c #53ee53ee53ee", -"# c #5fdf5fdf5fdf", -"$ c #67e767e767e7", -"% c #6fff6fff6fff", -"& c #77f777f777f7", -"* c #7bdb7bdb7bdb", -"= c Gray50", -"- c Gray56", -"; c #9bd69bd69bd6", -": c #9fff9fff9fff", -"> c #a7c7a7c7a7c7", -", c Gray70", -"< c Gray75", -"1 c Gray81", -"2 c #dfffdfffdfff", -"3 c #efffefffefff", -"4 c Gray100", -/* pixels */ -",><,><,><,><,><,><,><,><", -">-<>-<>-<>-<>-<>-<>-<>-<", -"<<<<<<<<<<<<<<<<<<<<<<<<", -",><,><,><,>;*O.,><,><,><", -">-<>-<>-<-o&:4O#-<>-<>-<", -"<<<<<<<<@@<31O:o<<<<<<<<", -",><,>;*O1444 X1@><,><,><", -">-<-o&:4444:=<4<#<>-<>-<", -"<<<,+<4444414443&;<<<<<<", -",><,#;4444444444:*,><,><", -">-<>-o44444444444O>-<>-<", -"<<<<<;%44444444441@<<<<<", -",><,><@24444444444@><,><", -">-<>-<-=4444444444<#<>-<", -"<<<<<<,$14444444443&;<<<", -",><,><,#;4444444444:*,><", -">-<>-<>-o4444444444-<", -"<<<<<<<<;%4444444%O$-<<<", -",><,><,><@24444<&;,><,><", -">-<>-<>-<-=42==#-<>-<>-<", -"<<<<<<<<<,$Oo+-<<<<<<<<<", -",><,><,><,><,><,><,><,><", -">-<>-<>-<>-<>-<>-<>-<>-<", -"<<<<<<<<<<<<<<<<<<<<<<<<" -}; diff --git a/etc/gnus/prev-ur.pbm b/etc/gnus/prev-ur.pbm deleted file mode 100644 index 49389198bdfe19f91dada91a4525e35083e4c3df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81 zcmWGA;W9E&Ff!p1WE5avU}69QK8C*v%E&(BI7iNeGvT$j$ d2>7x%G|X^d2~c2a2w-Fo03(nZh7cA82LRz}3_<_^ diff --git a/etc/gnus/prev-ur.xpm b/etc/gnus/prev-ur.xpm deleted file mode 100644 index 7c3db24..0000000 --- a/etc/gnus/prev-ur.xpm +++ /dev/null @@ -1,65 +0,0 @@ -/* XPM */ -static char *magick[] = { -/* columns rows colors chars-per-pixel */ -"24 24 35 1", -" c Gray0", -". c Gray6", -"X c Gray9", -"o c Gray12", -"O c #23f323f323f3", -"+ c Gray15", -"@ c #2ff22ff22ff2", -"# c #399939993999", -"$ c #3fff3fff3fff", -"% c Gray28", -"& c #53ed53ed53ed", -"* c Gray35", -"= c #5b1a5b1a5b1a", -"- c Gray36", -"; c #5fef5fef5fef", -": c Gray40", -"> c #67e767e767e7", -", c #6ffa6ffa6ffa", -"< c Gray45", -"1 c #77ea77ea77ea", -"2 c #799979997999", -"3 c #7bdb7bdb7bdb", -"4 c Gray50", -"5 c Gray56", -"6 c Gray60", -"7 c #9bde9bde9bde", -"8 c #9fff9fff9fff", -"9 c #a7c7a7c7a7c7", -"0 c #acccacccaccc", -"q c Gray70", -"w c Gray75", -"e c Gray81", -"r c #dfffdfffdfff", -"t c #efffefffefff", -"y c Gray100", -/* pixels */ -"q9wq9wq9wq9wq9wq9wq9wq9w", -"95w95w95w95w95w95w95w95w", -"wwwwwwwwwwwwwwwwwwwwwwww", -"q9wq9wq9wq973$.q9wq9wq9w", -"95w95w95w5@18y$;5w95w95w", -"wwwwwwww&&wte$8@wwwwwwww", -"q9wq973$eyyy oe&9wq9wq9w", -"95w5@18yyyy84wyw;w95w95w", -"wwwq%wyyyyyeyyyt17wwwwww", -"q9wq;7yyyyyyyyyy45q9wq9w", -"95w9518yyr44yyyy4%%@995w", -"wwwww&.3;;w@yyye=<<#Owww", -"q9wq=;:$etw;$rt+w0777O9w", -"95w5+<8yy; wo44+77777X5w", -"ww&&wtyyy ;t@re+77777@ww", -"q%wyyyyy,yyyw4ye=<<#Oq9w", -"9@wyyyyyyyyyr4rywo;;995w", -"w9&yyyyyyyyyy4we$3wwwwww", -"q9&eyyyyyyyyyy,@wwq9wq9w", -"95w$yyyyyyyyyyy@ww95w95w", -"www38yyyyyyyyyy71wwwwwww", -"q9w54yyyyyyyyyye:qq9wq9w", -"95w9,ryyyyyyyyyy4595w95w", -"wwww9&yyyyyyyyyyr&wwwwww" -}; diff --git a/etc/gnus/reply-wo.pbm b/etc/gnus/reply-wo.pbm deleted file mode 100644 index def54da8ede20b0f152e8ff1fd0b7b9b40450b53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81 zcmWGA;W9E&Ff!p{fCD}T22lnEg$70k2c`}MQT75O3lG--7dypSuFft@$C?~`Sr~Gd c90gez8JJucTsRn%3K&Eb7}!EXLx5%g0Na@iO8@`> diff --git a/etc/gnus/reply-wo.xpm b/etc/gnus/reply-wo.xpm deleted file mode 100644 index fb45d4c..0000000 --- a/etc/gnus/reply-wo.xpm +++ /dev/null @@ -1,65 +0,0 @@ -/* XPM */ -static char *magick[] = { -/* columns rows colors chars-per-pixel */ -"24 24 35 1", -" c Gray0", -". c Gray6", -"X c Gray9", -"o c Gray12", -"O c #23f323f323f3", -"+ c #2ffe2ffe2ffe", -"@ c #399939993999", -"# c #3fff3fff3fff", -"$ c Gray25", -"% c #499949994999", -"& c #4ccc4ccc4ccc", -"* c #519151915191", -"= c #53f353f353f3", -"- c Gray35", -"; c #5feb5feb5feb", -": c #67e767e767e7", -"> c #6fff6fff6fff", -", c Gray45", -"< c #77ef77ef77ef", -"1 c #7bdb7bdb7bdb", -"2 c Gray50", -"3 c Gray56", -"4 c Gray60", -"5 c #9bd39bd39bd3", -"6 c #9fff9fff9fff", -"7 c Gray64", -"8 c #a7c7a7c7a7c7", -"9 c Gray70", -"0 c #b998b998b998", -"q c #bcccbcccbccc", -"w c Gray75", -"e c Gray81", -"r c #dfffdfffdfff", -"t c #efffefffefff", -"y c Gray100", -/* pixels */ -"wwwwwwwwwwwwwwwwwwwwwwww", -"wwwwwwwwwwwwwwwwwwwwwwww", -"wwwwwwwwwwwwwwwwwwwwwwww", -"wwwwwwwwwww5+o1wwwwwwwww", -"wwwwwwwwww3O8wwww", -"wwwww<:226yy#yyyw2 ;wwww", -"www5+5e66yyy#6##2w X5www", -"w8=>ye#6yy2+#6yyr+9y>$8w", -"w;;yw2yw22#wyyyr#@9yy@;w", -"w;3#o+#2w3;tyyy+@3w##3;w", -"w;wyy>wry66yyr+%0;>yyw;w", -"w;wyyy222#yyr#;-2ryyyw;w", -"7=wyyyyrw.6y+ +wryyyyw=7", -"5&wyyyyye#o3.#6yyyyyyw&5", -"5&wyyyyw2yw26y66yyyyyw&5", -"5&wyyye2tyyyyyy66yyyyw&5", -"5&wyr;>yyyyyyyyy6#eyyw&5", -"5&wr2ryyyyyyyyyyyy2wyw&5", -"5&+;ryyyyyyyyyyyyyt2#+&5", -"5& wwwwwwwwwwwwwwwwww &5", -"5,&&&&&&&&&&&&&&&&&&&&,5", -"555555555555555555555555" -}; diff --git a/etc/gnus/reply.pbm b/etc/gnus/reply.pbm deleted file mode 100644 index ee181e663be77954bc10f855f980a40f8ebd3749..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81 zcmWGA;W9E&Ff!p{KnAP~3dOJ Z7#Wyc7+g3QlnNL`6cp4#LqmXO006{n3 c Gray45", -", c #77ef77ef77ef", -"< c Gray50", -"1 c Gray56", -"2 c #933293329332", -"3 c Gray60", -"4 c #9bd29bd29bd2", -"5 c #9fff9fff9fff", -"6 c Gray64", -"7 c #a7c7a7c7a7c7", -"8 c Gray70", -"9 c #b998b998b998", -"0 c #bcccbcccbccc", -"q c Gray75", -"w c Gray81", -"e c #dfffdfffdfff", -"r c #efffefffefff", -"t c Gray100", -/* pixels */ -"qqqqqqqqqqqqqqqqqqqqqqqq", -"qqqqqqqqqqqqqqqqqqqqqqqq", -"qqqqqqqqqqqqqqqqqqqqqqqq", -"qqqqqqqqqqqqqq4qqqqqqqqq", -"qqqqqqqqqqqqq1,-1qqqqqqq", -"qqqqqqqqq4OO4,rq,4qqqqqq", -"qqqqqq81*:tw:tttt:*7qqqq", -"qqqqq,;%%%%%%%%%%%%%%%%%%%%>4", -"444444444444444444444444" -}; diff --git a/etc/gnus/rot13.pbm b/etc/gnus/rot13.pbm deleted file mode 100644 index 104246cdb8f8a010032025a5292b94a873e899f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81 zcmWGA;W9E&Ff!p{fC2vh4XlC=T&otah6Zr0Vqg&z;1FbB6&2uG)xdgOfNKE*i--Wn b0S4Ak0Z#h{)}sO(O$;my0_^`EKnwr?LSqiS diff --git a/etc/gnus/rot13.xpm b/etc/gnus/rot13.xpm deleted file mode 100644 index ad20c8a..0000000 --- a/etc/gnus/rot13.xpm +++ /dev/null @@ -1,50 +0,0 @@ -/* XPM */ -static char *magick[] = { -/* columns rows colors chars-per-pixel */ -"24 24 20 1", -" c Gray0", -". c Gray6", -"X c Gray12", -"o c #2ff52ff52ff5", -"O c #3fff3fff3fff", -"+ c Gray28", -"@ c #53e353e353e3", -"# c #5fe45fe45fe4", -"$ c #67e767e767e7", -"% c #6fff6fff6fff", -"& c #77d777d777d7", -"* c Gray50", -"= c Gray56", -"- c #9fff9fff9fff", -"; c Gray70", -": c Gray75", -"> c Gray81", -", c #dfffdfffdfff", -"< c #efffefffefff", -"1 c Gray100", -/* pixels */ -"::::::::::::::::::::::::", -"::::::::::::::::::::::::", -"::::::::::::::::::::::::", -"::::#oOOOOOOOOOo+;::::::", -"::::#:,*,,**11-#O$::::::", -"::::#:#:#:#:%--=*>@:::::", -"::::#:o:o:*%>*:>OOo#::::", -"::::#:X*X:O*-:**:1:#::::", -"::::#:>1><::11>:,1:#::::", -"::::#:>-111%111%11:#::::", -"::::#:*:-1:*1:*-11:#::::", -"::::#: *O>*:%*=--1:#::::", -"::::#:O* :*1O*o%11:#::::", -"::::#:O:X,**-*:111:#::::", -"::::#:>1>1,:1,<111:#::::", -"::::#:1,oo,1111111:#::::", -"::::#:,O##O*****:1:#::::", -"::::#:: :: *1:#::::", -"::::#:1-..-1:*O:*1:#::::", -"::::#:11--11,:O,:1:#::::", -"::::#:11111111>111:#::::", -"::::&oooooooooooooo&::::", -"::::::::::::::::::::::::", -"::::::::::::::::::::::::" -}; diff --git a/etc/gnus/save-aif.pbm b/etc/gnus/save-aif.pbm deleted file mode 100644 index 15829c289e79e517beacd54520e343298cd260ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81 zcmWGA;W9E&Ff!p{00YL*00ssPMg|rJ1{*NR0wjSbG=_zPizR>oL52pfFfg&W28Qsz QS`mMMLH`wl{2h=H07hpDvj6}9 diff --git a/etc/gnus/save-aif.xpm b/etc/gnus/save-aif.xpm deleted file mode 100644 index c8bceb6..0000000 --- a/etc/gnus/save-aif.xpm +++ /dev/null @@ -1,55 +0,0 @@ -/* XPM */ -static char *magick[] = { -/* columns rows colors chars-per-pixel */ -"24 24 25 1", -" c Gray6", -". c #133313331333", -"X c #199919991999", -"o c Gray15", -"O c #2fef2fef2fef", -"+ c Gray20", -"@ c #398739873987", -"# c #3fff3fff3fff", -"$ c Gray28", -"% c #4ccc4ccc4ccc", -"& c #5fdf5fdf5fdf", -"* c #626262626262", -"= c Gray40", -"- c #72f272f272f2", -"; c Gray45", -": c #77d777d777d7", -"> c #7bdb7bdb7bdb", -", c #7ccc7ccc7ccc", -"< c Gray56", -"1 c Gray60", -"2 c #9fff9fff9fff", -"3 c #a7c7a7c7a7c7", -"4 c Gray75", -"5 c Gray90", -"6 c Gray100", -/* pixels */ -"444444444444444444444444", -"444444444444444444444444", -"4444444:OOOOOOOOOOO:4444", -"4444444&4666666666#2>444", -"4444444&4666666666#62:44", -"4444444&4666666666 ##O44", -"4444444&4666666666666O44", -"4444444&4666666666666O44", -"4444444&4666666666666O44", -"43<<<<<$<444444666666O44", -"4&@@@-------.%.666666O44", -"4&---5555555o1o666666O44", -"4&---5555555o1o666666O44", -"4&---5555555o1o666666O44", -"4&---5555555o1o666666O44", -"4&---5555555o1o666666O44", -"4&--@-------o1o666666O44", -"4&-<--------,1o666666O44", -"4&-<--------,1o444444O44", -"4&--X++++o@-o1o&&&&&&:44", -"4&--+====%-5o1o444444444", -"4:*-+====%-5o1o444444444", -"44:@X++++o@-.%.444444444", -"444<<<<<<<<<<<<444444444" -}; diff --git a/etc/gnus/save-art.pbm b/etc/gnus/save-art.pbm deleted file mode 100644 index 68fe0cb309873313e4960a10b3acd43a730879ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81 zcmWGA;W9E&Ff!p{00Y+0P&NiORtG^A11A c #72f272f272f2", -", c Gray45", -"< c #77d777d777d7", -"1 c #7ccc7ccc7ccc", -"2 c Gray50", -"3 c Gray56", -"4 c Gray60", -"5 c #9bcb9bcb9bcb", -"6 c #9fff9fff9fff", -"7 c #a7c7a7c7a7c7", -"8 c Gray75", -"9 c Gray81", -"0 c #dfffdfffdfff", -"q c Gray90", -"w c #efffefffefff", -"e c Gray100", -/* pixels */ -"888888888888888888888888", -"888888888888888888888888", -"88888*@@@@@@@@@@@@@@@@@4", -"88888@%28eeeeeeeeee08%o3", -"88888@e8228eeeeeee222e23", -"88888@eee82%eeee6%80ee23", -"88888@eeew8=%28%28eeee23", -"88888@eee220e82e826eee23", -"88888@ee:9eeeeeeee6%9e23", -"87333O3 3888888eeeee:==3", -"8=$$$>>>>>>>.&.eeeeee0%3", -"8=>>>qqqqqqq+4+%%%%%%%o3", -"8=>>>qqqqqqq+4+888888888", -"8=>>>qqqqqqq+4+888888888", -"8=>>>qqqqqqq+4+888888888", -"8=>>>qqqqqqq+4+888888888", -"8=>>$>>>>>>>+4+888888888", -"8=>3>>>>>>>>24+888888888", -"8=>3>>>>>>>>24+888888888", -"8=>>X####+$>+4+888888888", -"8=>>#;;;;&>q+4+888888888", -"8<->#;;;;&>q+4+888888888", -"88<$X####+$>.&.888888888", -"888333333333333888888888" -}; diff --git a/etc/gnus/subscribe.pbm b/etc/gnus/subscribe.pbm deleted file mode 100644 index fe6b3920d36d01ddc4967f741443ed1930a5181a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81 zcmWGA;W9E&Ff!o^6%AEjVsaI6)c=1vR4|ZJU_q?lSG^4!q5*=M6Qq3wL^%W);tK>d j1PojS1T`jbg$4+62?)f1#5qI+1oi*Fb`1$-U|;|M?wb*{ diff --git a/etc/gnus/subscribe.xpm b/etc/gnus/subscribe.xpm deleted file mode 100644 index 62db2da..0000000 --- a/etc/gnus/subscribe.xpm +++ /dev/null @@ -1,49 +0,0 @@ -/* XPM */ -static char *magick[] = { -/* columns rows colors chars-per-pixel */ -"24 24 19 1", -" c Gray6", -". c Gray12", -"X c #2ff42ff42ff4", -"o c #3fff3fff3fff", -"O c Gray28", -"+ c #53e353e353e3", -"@ c #5fe25fe25fe2", -"# c #67e767e767e7", -"$ c #6fff6fff6fff", -"% c #77d777d777d7", -"& c Gray50", -"* c Gray56", -"= c #9fff9fff9fff", -"- c Gray70", -"; c Gray75", -": c Gray81", -"> c #dfffdfffdfff", -", c #efffefffefff", -"< c Gray100", -/* pixels */ -";;;;;;;;;;;;;;;;;;;;;;;;", -";;;;;;;;;;;;;;;;;;;;;;;;", -";;;;;;;;;;;;;;;;;;;;;;;;", -";;;;@Xooooo oooXO-;;;;;;", -";;;;@;>;=<&&<:<;=< c #efffefffefff", -", c Gray100", -/* pixels */ -"------------------------", -"------------------------", -"------------------------", -"----@Xooooo oooXO=------", -"----@-,,,:-o,,,-o#------", -"----@-,,,@:o,,,-%;+-----", -"----@-;%@,,o,,,;ooX@----", -"----@@%o@%%.,,,,,,-@----", -"----@&-----X,,,,,,-@----", -"----@-,,,**o,,,,,,-@----", -"----@-:-**,o,,,,,,-@----", -"----@->%*,,o,,,,,,-@----", -"----@Xooooo ,,,,,,-@----", -"----@-,,,:-o,,,,,,-@----", -"----@-,,,@:o,,,,,,-@----", -"----@-;%@,,o,,,,,,-@----", -"----@@%o@%%.,,,,,,-@----", -"----@&-----X,,,,,,-@----", -"----@-,,,,,o,,,,,,-@----", -"----@-,,,,,o,,,,,,-@----", -"----@-,,,,,o,,,,,,-@----", -"----$XXXXXXXXXXXXXX$----", -"------------------------", -"------------------------" -}; diff --git a/etc/gnus/uu-decode.pbm b/etc/gnus/uu-decode.pbm deleted file mode 100644 index 2b7fada14736baa464fd5f67ca6242a459005101..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81 zcmWGA;W9E&Ff!p{Kmx3x0c=VJETIA{|0b|91h6t}U=0aijcZ^P2w=6?z$y~J!T=Kw R4PbfSz``KF{{I2Q000EB4u}8% diff --git a/etc/gnus/uu-decode.xpm b/etc/gnus/uu-decode.xpm deleted file mode 100644 index cdadff6..0000000 --- a/etc/gnus/uu-decode.xpm +++ /dev/null @@ -1,48 +0,0 @@ -/* XPM */ -static char *magick[] = { -/* columns rows colors chars-per-pixel */ -"24 24 18 1", -" c #2fef2fef2fef", -". c #3fff3fff3fff", -"X c #4ccc4ccc4ccc", -"o c #53e353e353e3", -"O c #566656665666", -"+ c #5fe35fe35fe3", -"@ c Gray45", -"# c #77d777d777d7", -"$ c Gray50", -"% c #866586658665", -"& c Gray56", -"* c Gray60", -"= c #9fff9fff9fff", -"- c Gray75", -"; c Gray81", -": c #dfffdfffdfff", -"> c #efffefffefff", -", c Gray100", -/* pixels */ -"------------------------", -"------------------------", -"------------------------", -"------------------------", -"-----#+++++++++++++&----", -"----- @@@@@@@@@@@@O+----", -"----- *%@@@@@@@@@&@+----", -"----- *X+$$$$$$$.@@+----", -"----- *X-,,,,,,,$@@+----", -"----- *X-,,;,,,,$@@+----", -"----- *X-:$$$-=,$@@+----", -"----- *X-+-+-$=,$@@+----", -"----- *X->$;;,,,$@@+----", -"----- *X--.$.,,,$@@+----", -"----- *X->--==,,$@@+----", -"----- *X-,,,,=;,$@@+----", -"----- *X-,,,,,,,$@@+----", -"----- *X-,,,,,,,$@@+----", -"----- *X&-------+@@+----", -"----- *@XXXXXXXXX%@+----", -"----- ************@+----", -"-----o #----", -"------------------------", -"------------------------" -}; diff --git a/etc/gnus/uu-post.pbm b/etc/gnus/uu-post.pbm deleted file mode 100644 index a5face709807268d83cab63a19540e5d09676333..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81 zcmWGA;W9E&Ff!p1aAaZNU| c Gray56", -", c Gray60", -"< c #9bcb9bcb9bcb", -"1 c #9fff9fff9fff", -"2 c #a7c7a7c7a7c7", -"3 c Gray70", -"4 c Gray75", -"5 c Gray81", -"6 c #dfffdfffdfff", -"7 c #efffefffefff", -"8 c Gray100", -/* pixels */ -"$44$44$44$44$44$44$44$44", -"444444444444-44444444444", -"4444444444-O-O,444444444", -"$44$44$2>O-4$4$@>3$44$44", -"444444&&&4444442&&-44444", -"44444$ XOOOOOOOOO..-4444", -"$44$4O,,,,,,,,,,,,=&4$44", -"44444O,=#########:=&4444", -"44444O,#>4444444&==&4444", -"$44$4O,#48888888;==&4$44", -"44444O,#48818888;==&4444", -"44444O,#45+1+1*8;==&4444", -"$44$4O,#4*6&8158;==&4$44", -"44444O,#46;61888;==&4444", -"44444O,#44o++888;==&4444", -"$44$4O,#48885;78;==&4$44", -"44444O,#48888468;==&4444", -"44444O,#48888888;==&4444", -"$44$4O,#48888888;==&4$44", -"44444O,#&;;;;;;;+==&4444", -"44444O,:=========>=&4444", -"$44$4O============%&4$44", -"44444-&&&&&&&&&&&&&>4444", -"444444444444444444444444" -}; diff --git a/etc/gnus/x-splash b/etc/gnus/x-splash deleted file mode 100644 index cbd1c2c5bd3db5fdb2bb24d5c0e08211a39c1f86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4621 zcmeH}v2NQi5Qa}tQ3FL$XUtHcO_`yA;v!DD!a)aaEN*1Zgt8_!JlJn zQy{krIX;|WWA(00d@FKNK33yeum0fNwe04b#2=+Y_ONlciTjNsKc;=XB>!H*8bXu; zf;f%eH~mWD3QLmz|v? z#E&8#9~9skaUz{oexlra5r+aWJ>!^u2QS1!I7}t~fkIvgREq7B$m7J3AGJTl^>HhQ z%zLDRBt(!f_&t6h08&Rfoem)Bqda8pcbWtXh`YdAlfOecd-{7EP5-BGA|$~As5ZQk zKan;q3Rr8>9kWxr(r>hca##3AK6Z2JZ_D`v7K7i zN?6$({eSKc*-mJ~5+|LWo&&_etuz`>kLDY{+Z)e zhh`?nDm^NuA$ei1kBq`mezHNk!{Y3MiRS~-CZ0IENi7{=KmMB9bI?{WIMhLW_216g zEmd?-j#lzIC|`+Rp7A^NxYBMd&KMM4+Az(+6NWRac$x*r*5`(^O#!PZw4}*#Ru-rB zDS?-9sAX=?`3(InzU1$*IJf6K4tZ|RIj07%;jF3l=YIFN*fev)GhK7fZJXyHnOx(t zIAhnG?aJ5{r!*ZHueo)Q(ixnRIj&*6nfXR;y~XiB3RqM72i&SX*4O+1&W3kYeDKqe z9I@sG$@KoKIbKjEzs4JKW5n6ug+zH!$K3c{NPJFJn)DBvH#k$TIHU>BE(Ye>x_Qt@AQ - - * nnmbox.el (nnmbox-find-article): Fix infinite loop when - searching for an article that isn't in the mbox. - -2001-09-02 23:12:48 Lars Magne Ingebrigtsen - - * nnslashdot.el (nnslashdot-retrieve-headers-1): Get references - right, and get all the comments. - -2001-09-02 Simon Josefsson - Suggested by Dan Christensen - - * nnfolder.el (nnfolder-request-update-info): Fix message. - - * nnml.el (nnml-request-update-info): Ditto. - -2001-09-01 Simon Josefsson - - * nnml.el (nnml-request-expire-articles): Also bind - `nnml-current-group' and `nnml-article-file-alist' when using - expiry-target. (Otherwise nnml will be in a inconsistent internal - state causing all kind of problems.) - (nnml-request-expire-articles): If `nnml-article-to-file' or - `file-attributes' failes, return article as un-expirable instead - of treating it as expired. - -2001-08-31 Sam Steingold - - * imap.el (imap-mailbox-examine, imap-mailbox-examine-1): Fix a - typo: `exmine' --> `examine'. - -2001-08-30 13:00:00 ShengHuo ZHU - - * nndoc.el (nndoc-forward-type-p): It is not a digest. - -2001-08-30 11:00:00 ShengHuo ZHU - - * nnml.el (nnml-check-directory-twice): Remove. - (nnml-retrieve-headers): Ditto. - (nnml-article-to-file): Use nnheader-directory-files-is-safe. - -2001-08-30 Andrew Innes - - * nnheader.el (nnheader-directory-files-is-safe): No need to read - directory twice on Windows, or on GNU Emacs-21. - -2001-08-30 Andrew Innes - - * nnml.el (nnml-request-article): Use nnml-article-to-file-alist. - (nnml-request-rename-group): Ditto. - (nnml-active-number): Ditto. - (nnml-request-create-group): Use nnml-directory-articles. - (nnml-request-expire-articles): Use nnml-directory-articles, which - gets list from nov database if available. - (nnml-get-nov-buffer): New function. - (nnml-open-nov): Use it. - (nnml-update-file-alist): Use nnml-article-to-file-alist, which - gets alist from nov database if available. - (nnml-directory-articles): New function. - (nnml-article-to-file-alist): New function. - -2001-08-30 Andrew Innes - - * mm-decode.el (mm-display-external): Use `name' as filename, if - `filename' attribute is not present. - -2001-08-30 Andrew Innes - - * mail-source.el (mail-source-flash): New defcustom. - (mail-source-new-mail-p): Ring visible bell if appropriate. - (mail-source-start-idle-timer): Use unwind-protect to ensure idle - timer is cleared even if mail check signals an error. - -2001-08-29 10:00:00 ShengHuo ZHU - - * gnus-sum.el (gnus-summary-move-article): Only update marks of - type 'list. - -2001-08-29 00:00:00 ShengHuo ZHU - - * flow-fill.el (fill-flowed): eol might be point-max. - -2001-08-27 Simon Josefsson - - * nnml.el (nnml-request-update-info): Fix message. - (nnml-open-marks): Ditto. - - * nnfolder.el (nnfolder-request-update-info): - (nnfolder-open-marks): Fix message. - -2001-08-25 Simon Josefsson - - * nnfolder.el (nnfolder-save-marks): Don't create directory named - after group in ~/. - -2001-08-25 Simon Josefsson - From Andreas Jaeger - - * nnfolder.el (nnfolder-open-marks): Fix typo. - * nnml.el (nnml-open-marks): Likewise. - -2001-08-25 Simon Josefsson - - Make nnfolder groups self-contained as far as marks are concerned. - - * nnfolder.el (nnfolder-marks-directory, nnfolder-marks-is-evil) - (nnfolder-marks, nnfolder-marks-file-suffix): New variables. - (nnfolder-open-server): Make marks directory. - (nnfolder-request-delete-group): Delete marks file. - (nnfolder-request-delete-group): Check of nov/marks file exist - before deleting. - (nnfolder-request-rename-group): Rename marks file. - (nnfolder-request-rename-group): Only rename nov/mark if they exists. - (nnfolder-request-set-mark, nnfolder-request-update-info) - (nnfolder-group-marks-pathname, nnfolder-save-marks) - (nnfolder-open-marks): New functions. - (top-level): Require gnus. - -2001-08-25 09:00:00 ShengHuo ZHU - - * nnweb.el (nnweb-type-definition): Use google raw file. - (nnweb-google-parse-1): Ditto. - (nnweb-google-identity): Ditto. - (nnweb-reference-wash-article): Move nnweb-decode-entities here. - (nnweb-altavista-wash-article): Ditto. - (nnweb-request-article): Remove nnweb-decode-entities. - - * nnml.el: Require 'gnus. - -2001-08-25 Simon Josefsson - - * nnml.el (nnml-marks-is-evil): Add doc. - -2001-08-25 Simon Josefsson - - * nnml.el (nnml-save-marks): Wrap saving marks in a - condition-case, to allow user to start Gnus if saving marks failed - for some reason. - -2001-08-24 16:05:38 Lars Magne Ingebrigtsen - - * gnus-spec.el (gnus-compile): Don't compile gnus-version. - - * gnus-group.el (gnus-update-group-mark-positions): Bind - gnus-group-update-hook to nil. - -2001-08-24 13:00:00 ShengHuo ZHU - - * mml.el (mml-generate-mime-1): Force as multibyte string. - -2001-08-24 12:00:00 ShengHuo ZHU - - * gnus-sum.el (gnus-summary-insert-line) - (gnus-summary-prepare-threads): gnus-tmp-lines should be a string. - From Martin Kretzschmar - - * gnus-spec.el (gnus-correct-substring): Take optional END. - - * nnrss.el (nnrss-request-article): Remove \n. - (nnrss-retrieve-headers): Lines number is -1. - -2001-08-24 Simon Josefsson - - * gnus-group.el (gnus-info-clear-data): Call - nnfoo-request-set-mark to propagate marks. Fix bug: - `gnus-group-update-line' doesn't update read range unless we call - `gnus-get-unread-articles-in-group' first. - - * nnimap.el (nnimap-request-set-mark): Don't propagate seen flags - to server. - -2001-08-23 21:00:00 ShengHuo ZHU - - * gnus-util.el (gnus-create-info-command): Return an interactive - function. - -2001-08-23 19:00:00 ShengHuo ZHU - From Katsumi Yamaoka - - * gnus-spec.el (gnus-parse-complex-format): Use equal. - -2001-08-23 18:43:05 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-select-newsgroup): Use it. - - * gnus-util.el (gnus-not-ignore): New function. - - * lpath.el (featurep): Don't fbind char-int. - - * gnus-util.el (gnus-create-info-command): New function. - - * gnus-group.el (gnus-group-edit-group): Make C-c C-i go to the - right node. - - * gnus-sum.el (gnus-select-newsgroup): Clean up. - (gnus-summary-limit-children): Use 'identity instead of `all'. - (gnus-summary-limit-to-display-predicate): New command and - keystroke. - -2001-08-23 10:00:00 ShengHuo ZHU - - * nnrss.el (nnrss-group-alist): Use fm-releases.rdf. - - * gnus-spec.el (gnus-format-specs): Miss a right parenthesis. - -2001-08-23 18:43:05 Lars Magne Ingebrigtsen - - * gnus-spec.el: Add the Gnus version. - (gnus-update-format-specifications): If the Gnus version changes, - nix out the format spec cache. - - * gnus.el (gnus-continuum-version): Made into a command and - optionalize the VERSION. - - * gnus-spec.el (gnus-parse-complex-format): Remove %C specs from - the start of the lines. - -2001-08-22 00:06:52 Lars Magne Ingebrigtsen - - * gnus.el (gnus-visual-p): Define function before use of - function. - -2001-08-21 23:28:02 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-adjust-marked-articles): Use new variable. - (gnus-article-mark-to-type): New function. - (gnus-update-missing-marks): Only update marks of type 'list. - - * gnus.el (gnus-article-special-mark-lists): New variable. - -2001-08-21 12:00:00 ShengHuo ZHU - - * gnus-sum.el (gnus-summary-limit-children): Check 'all. - (gnus-select-newsgroup): Still use 'all. - (gnus-summary-initial-limit): Comparing with 'all. - -2001-08-20 16:00:00 ShengHuo ZHU - - * gnus-start.el (gnus-activate-group): If dont-check, don't update - active. - -2001-08-20 15:00:00 ShengHuo ZHU - - * nnslashdot.el (nnslashdot-retrieve-headers-1): Replace - nnslashdot-*-retrieve-headers. - (nnslashdot-request-article): Fix for slashcode 2.2. - (nnslashdot-make-tuple): New. - (nnslashdot-read-groups): Use it. - -2001-08-20 01:34:03 Lars Magne Ingebrigtsen - - * gnus.el (gnus-expand-group-parameters): Don't alter the variable - list. - - * gnus-sum.el (gnus-summary-move-article): Don't select article. - -2001-08-20 Simon Josefsson - - * gnus-msg.el (gnus-inews-do-gcc): If archive server can't be - opened, error instead of continuing (and exploding later). - -2001-08-20 01:34:03 Lars Magne Ingebrigtsen - - * gnus.el (gnus-expand-group-parameters): Return the parameter - list. - - * gnus-sum.el (gnus-summary-show-article): Doc fix. - (gnus-summary-show-article): Guess at charset if required. - - * gnus-spec.el (gnus-correct-substring): Stopped one character - before we wanted. - -2001-08-19 Pavel Jan,Bm(Bk - - * earcon.el (earcon-auto-play): Remove unused option. - -2001-08-19 16:14:41 Lars Magne Ingebrigtsen - - * gnus-score.el (gnus-score-headers): Move the "Scoring..." - message down in levels, since it happens very fast. - - * smiley-ems.el (smiley-update-cache): Respect the symbol version - of smiley-regexp-alist. - - * mm-view.el (mm-inline-text): Ignore vcard errors. - - * gnus-art.el (gnus-ignored-headers): Added more junk headers. - - * gnus-score.el (gnus-all-score-files): Use append instead of - nconc. - - * gnus.el (gnus-splash-face): Doc fix. - - * mm-decode.el (mm-mailcap-command): Use - mm-path-name-rewrite-functions. - (mm-path-name-rewrite-functions): New variable. - - * gnus-spec.el (gnus-parse-complex-format): React to ?=. - (gnus-complex-form-to-spec): Insert tab. - (gnus-spec-tab): New function. - - * gnus-sum.el (gnus-select-newsgroup): Set the marks before - entering the group. - - * gnus-spec.el (gnus-complex-form-to-spec): Insert Lisp to match - the positional spec. - (gnus-parse-complex-format): React to %C. - - * gnus-ems.el (gnus-char-width): Moved here. - - * gnus-sum.el (gnus-select-newsgroup): Set - gnus-newsgroup-articles. - (gnus-unseen-mark): New variable. - (gnus-newsgroup-unseen): Ditto. - (gnus-newsgroup-seen): Ditto. - (gnus-adjust-marked-articles): Use them. - (gnus-update-marks): Use them. - (gnus-summary-update-secondary-mark): Display. - (gnus-summary-prepare-threads): Display. - - * gnus-msg.el (gnus-inews-group-method): Use and return the - method, not the server. - -2001-08-19 Simon Josefsson - - * gnus-srvr.el (gnus-server-agent-face): New. - (gnus-server-agent-face): New. - (gnus-server-mode): Turn on font-lock-mode. - - * gnus.el (gnus-server-visual): Add defgroup. - -2001-08-19 Simon Josefsson - From Joe Casadonte - - * gnus-srvr.el (gnus-server-opened-face, gnus-server-closed-face, - gnus-server-denied-face): New. - (gnus-server-opened-face, gnus-server-closed-face, - gnus-server-denied-face): New. - (gnus-server-font-lock-keywords): Add. - -2001-08-19 Simon Josefsson - - * nnml.el (nnml-request-set-mark): Return nil. - (nnml-save-marks): Use nnml-possibly-create-directory. - (nnml-open-marks): Only work in temp buffer when inserting/reading - .marks file. - -2001-08-18 19:00:00 ShengHuo ZHU - - * gnus.el (gnus-expand-group-parameters): Fix. - - * gnus-spec.el (gnus-char-width): New. - (gnus-correct-substring, gnus-correct-length): Use it. - - * message.el (message-required-mail-headers): Fix doc. - -2001-08-18 18:00:00 ShengHuo ZHU - - * gnus-sum.el (gnus-group-make-articles-read): gnus-request-set-mark. - - * mm-decode.el (mm-save-part-to-file): Insert the handle. - -2001-08-18 13:00:00 ShengHuo ZHU - - * nnslashdot.el (nnslashdot-threaded-retrieve-headers): - slashdot 2.2 (not fully fixed yet). - (nnslashdot-request-article): Ditto. - -2001-08-18 Simon Josefsson - - * gnus-util.el (gnus-remassoc, gnus-update-alist-soft): Moved from - nnimap. - - * nnimap.el (nnimap-remassoc, nnimap-update-alist-soft): Moved to - gnus-util. - (nnimap-request-update-info-internal): Use new functions. - - * nnml.el (nnml-request-set-mark, nnml-request-update-info): Use - new functions. - -2001-08-18 Simon Josefsson - - Make nnml groups self-contained as far as marks are concerned. - - * nnml.el (nnml-request-delete-group): Delete marks file. - (nnml-request-rename-group): Move marks file. - (nnml-marks-file-name, nnml-marks-is-evil, nnml-marks): New server - variables. - (nnml-request-set-mark, nnml-request-update-info): New server - functions. - (nnml-save-marks, nnml-open-marks): New functions. - -2001-08-18 Simon Josefsson - - * gnus-sum.el (gnus-summary-move-article): Use `add' instead of - `set' when setting marks. - -2001-08-17 22:00:00 ShengHuo ZHU - - * gnus.el (gnus-info-find-node): Take an argument. - - * gnus-art.el (gnus-button-handle-info): New. - (gnus-url-unhex-string): Replace "+" with " ". - -2001-08-17 21:00:00 ShengHuo ZHU - - * message.el (message-check-news-header-syntax): Check bad From. - -2001-08-18 00:14:45 Lars Magne Ingebrigtsen - - * gnus-spec.el (gnus-correct-length): New function. - (gnus-correct-substring): New function. - (gnus-tilde-max-form): Use it. - -2001-08-17 Nevin Kapur - - * nnmh.el: Docstring changes as below. - - * nnml.el: Docstring changes as below. - - * nnbabyl.el: Docstring changes as below. - - * nnmbox.el: Docstring changes as below. - - * nnfolder.el: Added docstrings identifying each virtual server - parameter. - -2001-08-18 Simon Josefsson - - * mml.el (mml-menu): Collapse Attach, Insert and Security submenu. - -2001-08-17 Bj,Av(Brn Torkelsson - - * message.el: rename "Abort Message" to "Postpone Message". - Remove "Attach file as MIME" from Message menu, it's already in - the MIME menu. - -2001-08-17 14:00:00 ShengHuo ZHU - - * smime.el (smime-point-at-eol): eval-and-compile. - (smime-make-temp-file): New. - (smime-sign-region, smime-encrypt-region, smime-decrypt-region): - Use it. - -2001-08-17 10:41:14 Lars Magne Ingebrigtsen - - * gnus-agent.el (gnus-agent-fetch-group): Go online if offline. - (gnus-agent-summary-fetch-group): New command and keystroke. - - * gnus-art.el (gnus-insert-mime-button): Tiny clean-up. - (gnus-mime-display-security): Make it respect - gnus-unbuttonized-mime-type-p. - - * gnus-sum.el (gnus-articles-to-read): Comments. - (gnus-article-marked-p): New function. - (gnus-summary-display-make-predicate): New function. - (gnus-select-newsgroup): Use them. - - * mm-decode.el (mm-save-part-to-file): Made it not error. - -2001-08-17 Simon Josefsson - - * imap.el (imap-wait-for-tag): If process-status isn't open or - run, return nil instead of sit-for looping. - -2001-08-17 10:41:14 Lars Magne Ingebrigtsen - - * lpath.el (featurep): fbind xml-parse-region. - - * gnus.el (gnus-message-archive-method): Default to "archive". - (gnus-message-archive-method): Doc fix. - (gnus-parameters-get-parameter): Cleaned up. - (gnus-expand-group-parameter): New function. - - * gnus-start.el (gnus-setup-news): Push the archive server only - the server list. - - * mml.el (mml-menu): Changed name to "Attachments". - - * mm-decode.el (mm-destroy-postponed-undisplay-list): Only message - when there is something to detroy. - -2001-05-21 17:11:46 Lars Magne Ingebrigtsen - - * gnus-srvr.el (gnus-server-browse-in-group-buffer): Default to - nil. - -2001-08-15 Kai Gro,A_(Bjohann - - * gnus-delay.el (gnus-delay-article): Allow "01:23" time spec, - which specifies a time today or tomorrow. - -2001-08-15 Simon Josefsson - From Pavel@Janik.cz (Pavel Jan,Bm(Bk) - - * gnus-agent.el (gnus-agent-make-mode-line-string) - (gnus-agent-toggle-plugged): Use new API. - -2001-08-14 Kai Gro,A_(Bjohann - - * gnus-delay.el (gnus-delay-send-drafts): Fix check whether - deadline has expired. - -2001-08-12 Simon Josefsson - Suggested by Kai.Grossjohann@CS.Uni-Dortmund.DE - - Support `recent' mark indicating newly arrived messages (to - separate from old but unread messages). - - * nnimap.el (nnimap-retrieve-groups): Push dummy article into - `nnmail-split-history' if recent is > 0. - (nnimap-request-update-info-internal): Update `recent' marks. - (nnimap-request-set-mark): Never set `recent' marks. - (nnimap-mark-to-predicate-alist, nnimap-mark-to-flag-alist): Add - recent. - - * gnus-sum.el (gnus-recent-mark): New mark. - (gnus-newsgroup-recent): New variable. - (gnus-summary-local-variables): Add gnus-newsgroup-recent. - (gnus-summary-prepare-threads): Mark recent articles. - (gnus-summary-add-mark): Support recent. - (gnus-summary-update-secondary-mark): Support recent. - - * gnus.el (gnus-article-mark-lists): Add recent. - -2001-08-12 Simon Josefsson - - * mm-bodies.el (mm-decode-content-transfer-encoding): Returns - whether successful decoding took place. Add doc. - -2001-08-12 Simon Josefsson - Suggested by Per Abrahamsen - - * gnus.el (gnus-summary-line-format, gnus-parameters): - * gnus-gl.el (gnus-summary-grouplens-line-format): - * gnus-salt.el (gnus-summary-pick-line-format): - * gnus-spec.el (gnus-format-specs): %n is 23 chars. - -2001-08-11 09:40:00 Karl Kleinpaste - Committed by Kai Gro,A_(Bjohann. - - * gnus-score.el (gnus-score-string): Fix `match' regexp - for `extra' header case. - -2001-08-10 23:00:00 ShengHuo ZHU - - * nnmbox.el (nnmbox-read-mbox): No warning. - -2001-08-10 21:00:00 ShengHuo ZHU - - * nndoc.el (nndoc-article-type): Fix doc. - (nndoc-generate-article-function): New. - (nndoc-dissection-function): New. - (nndoc-type-alist): Add oe-dbx. - (nndoc-oe-dbx-type-p): New. - (nndoc-oe-dbx-dissection): New. - (nndoc-oe-dbx-generate-article): New. - -2001-08-11 Kai Gro,A_(Bjohann - - * gnus-delay.el (gnus-delay-send-drafts): Cleaner way to check - whether deadline has been reached. Patch from Dan Nicolaescu - . - -2001-08-10 02:00:00 ShengHuo ZHU - - * gnus-ml.el (turn-on-gnus-mailing-list-mode): Use - gnus-group-find-parameter. Suggested by Janne Rinta-Manty - . - - * mail-source.el (mail-source-movemail): The error buffer is - modified, but nothing in it. - -2001-08-10 01:00:00 ShengHuo ZHU - - * message.el (message-bogus-system-names): New. - (message-make-fqdn): Use it. - -2001-08-09 15:00:00 ShengHuo ZHU - - * nndraft.el (nndraft-request-group): Use - nndraft-auto-save-file-name. - -2001-08-09 Simon Josefsson - - * mm-view.el (mm-view-pkcs7-decrypt): Operate in current buffer. - Don't ask whether to decrypt. Just leave result in buffer (don't - call mm). - - * mm-decode.el (mm-dissect-buffer): Possibly verify/decrypt single - parts as well. - (mm-inline-media-tests): Ignore application/{x-,}pkcs7-mime. - (mm-possibly-verify-or-decrypt): Support application/{x-,}pkcs7-mime. - -2001-08-09 Simon Josefsson - - * mm-decode.el (mm-insert-part): Return decoding success status. - (mm-save-part-to-file): Error if decoding failed. - -2001-08-09 10:00:00 ShengHuo ZHU - - * message.el (message-tab): Use indent-relative. - (message-mode): Don't bind indent-line-function to indent-relative. - -2001-08-09 Simon Josefsson - - * message.el (message-get-reply-headers): Fix string. Suggested by - Christoph Conrad . - -2001-08-08 15:00:00 ShengHuo ZHU - - * message.el (message-tab): Use the current value of - indent-line-function. - (message-mode): Bind indent-line-function to indent-relative. - -2001-08-08 Simon Josefsson - - * imap.el (imap-gssapi-auth-p, imap-kerberos4-auth-p): Also check - whether `imtest' is installed. - -2001-08-04 Nuutti Kotivuori - Committed by ShengHuo ZHU - - * gnus-sum.el (gnus-summary-show-article): Call - gnus-summary-update-secondary-secondary-mark. - * gnus-sum.el (gnus-summary-edit-article-done): Ditto. - * gnus-sum.el (gnus-summary-reparent-thread): Ditto. - -2001-08-07 16:00:00 ShengHuo ZHU - - * gnus-sum.el (gnus-summary-make-menu-bar): Misc -> Gnus. - - * gnus-group.el (gnus-group-make-menu-bar): Ditto. - - * mm-uu.el (mm-uu-dissect): Autoload. From Gerd M,Av(Bllmann - . - - * gnus-art.el (gnus-output-to-file): Bind file-name-coding-system. - - * gnus-util.el (gnus-output-to-rmail): Ditto. - (gnus-output-to-mail): Ditto. - - * nnmail.el (nnmail-pathname-coding-system): Set default to nil. - -2001-08-06 Florian Weimer - - * message.el (message-indent-citation): Use - `message-yank-cited-prefix' for empty lines. - -2001-08-05 Florian Weimer - - * message.el (message-indent-citation): Quote only lines starting - with ">" using `message-yank-cited-prefix'. - -2001-08-05 Nuutti Kotivuori - - * gnus-cache.el (gnus-cache-possibly-enter-article): Use - gnus-cache-fully-p. - -2001-08-04 Simon Josefsson - - * gnus-cache.el (gnus-cache-possibly-update-active): Create active - file if it doesn't exist (by calling gnus-cache-read-active). - -2001-08-04 Simon Josefsson - - * gnus-cache.el (gnus-cache-possibly-enter-article): Revert. - (gnus-cache-passively-or-fully-p): Removed. - (gnus-cache-fully-p): Fix it. - - * mm-view.el (mm-pkcs7-signed-magic): Support more ASN.1 lengths. - -2001-08-04 Simon Josefsson - - * gnus-cache.el (gnus-cache-fully-p) - (gnus-cache-passively-or-fully-p): New functions. - (gnus-cache-possibly-enter-article): Cosmetic change, use - `g-c-p-o-f-p'. - (gnus-cache-possibly-enter-article): Use `g-c-p-u-a'; last change - was bogus (`g-c-p-a-a' does not change active info, just change - the functions parameters). - (gnus-cache-possibly-remove-articles-1): Make sure articles are - not removed in groups that match `gnus-uncacheable-groups'. - - Reported and modifications based on discussions with Nuutti - Kotivuori . - -2001-08-04 Nuutti Kotivuori - Committed by Simon Josefsson - - * gnus-cache.el (gnus-cache-possibly-update-active): New function; - calls `gnus-cache-update-active' if bounds has been extended. - -2001-08-04 10:00:00 ShengHuo ZHU - - * gnus-art.el (gnus-mime-security-verify-or-decrypt): Insert - before remove. - (gnus-mime-security-show-details): Ditto. - -2001-08-04 Kai Gro,A_(Bjohann - - * nnmail.el (nnmail-split-fancy-with-parent): Correct `mapconcat' - syntax. Protect string-match against nil string and regexp. - -2001-08-03 19:00:00 ShengHuo ZHU - - * mm-util.el (mm-find-charset-region): Remove control-1. - -2001-08-03 17:00:00 ShengHuo ZHU - - * mm-decode.el (mm-readable-p): Emacs 20 takes one argument. - -2001-08-04 Simon Josefsson - - * smime.el (smime-sign-region, smime-encrypt-region): Fix details - buffer. Delete MIME-Version header. - -2001-08-03 Simon Josefsson - - * gnus-cache.el (gnus-cache-possibly-enter-article): The article - that is entered does not necessarily have the highest article - number in the group, so use `gnus-cache-possibly-alter-active' - instead of `gnus-cache-update-active'. - -2001-08-03 10:00:00 ShengHuo ZHU - - * mml2015.el (mml2015-gpg-extract-signature-details): Don't barf. - -2001-08-03 Simon Josefsson - - * mml.el (mml-menu): Rename from MML to Mime. Collapse Security - menu. - -2001-08-02 Katsumi Yamaoka - - * gnus.el (post-method): New group parameter. It also provides - the user option `gnus-post-method-alist' and the internal function - `gnus-parameter-post-method'. - - * gnus-msg.el (gnus-post-method): Bind the value of - `gnus-post-method' to the group parameter if it is defined. - -2001-08-02 Simon Josefsson - - * smime.el (smime-extra-arguments): Removed. - (smime-call-openssl-region): Don't use it. - -2001-08-02 Simon Josefsson - - * smime.el (smime-sign-region): Handle stderr. - (smime-encrypt-region): Ditto. - - * mm-view.el (mm-pkcs7-signed-magic): Make it a regexp. Don't - match the ASN.1 length bytes. - (mm-pkcs7-enveloped-magic): Ditto. - (mm-view-pkcs7-get-type): Don't regexp quote. - -2001-08-01 14:00:00 ShengHuo ZHU - From Andreas Fuchs - - * mml2015.el (mml2015-trust-boundaries-alist): Typo. - -2001-08-01 10:00:00 ShengHuo ZHU - - * gnus-art.el (gnus-header-button-alist): References regexp. - -2001-08-01 Gerd Moellmann - - * mm-view.el (autoload): Don't autoload `diff-mode' if it's - already fboundp. Add INTERACTIVE arg to autoload form. - -2001-08-01 09:00:00 ShengHuo ZHU - - * nnslashdot.el (nnslashdot-init): Add as gnus buffer. - - * nnmail.el (nnmail-cache-open): Ditto. - -2001-07-31 21:00:00 ShengHuo ZHU - - * gnus-art.el (gnus-button-fetch-group): Fix the regexp. - -2001-07-31 Katsumi Yamaoka - - * gnus-msg.el (gnus-post-method): Refer to `gnus-parameters'. - -2001-07-31 17:00:00 ShengHuo ZHU - Originally from Pavel Jan,Bm(Bk - - * gnus-agent.el (gnus-agent-make-mode-line-string): New. - (gnus-agent-toggle-plugged): Use it. - -2001-07-31 ShengHuo ZHU - - * gnus-start.el (gnus-startup-file-coding-system): Revert to binary. - (gnus-ding-file-coding-system): New variable. - (gnus-read-newsrc-el-file, gnus-save-newsrc-file) - (gnus-slave-save-newsrc): Use it. - -2001-07-31 Kai Gro,A_(Bjohann - - * gnus-delay.el (gnus-delay-initialize): Use standard define-key - syntax. - -2001-07-30 15:00:00 ShengHuo ZHU - Originally from Andreas Fuchs - - * mml2015.el (mml2015-trust-boundaries-alist) - (mml2015-gpg-pretty-print-fpr): New. - (mml2015-gpg-extract-signature-details): More details, rename from - `m-g-e-from'. - (mml2015-gpg-verify): Use them. - (mml2015-gpg-clear-verify): Use them. - -2001-07-31 Simon Josefsson - - * mml-smime.el (mml-smime-sign, mml-smime-encrypt): Goto end of - buffer when done. - -2001-07-30 Simon Josefsson - - * smime.el (smime-call-openssl-region): Revert previous change, - just pass on buf to `call-process-region'. - (smime-verify-region): Doc fix. Don't message stuff. Use - `smime-new-details-buffer'. Inserts error messages into buffer. - (smime-noverify-region): Ditto. - (smime-decrypt-region): Ditto. Handles stderr separately. - (smime-verify-buffer, smime-noverify-buffer) - (smime-decrypt-buffer): Doc fix. - (smime-new-details-buffer): New function. - (smime-pkcs7-region, smime-pkcs7-certificates-region) - (smime-pkcs7-email-region): Use `smime-new-details-buffer'. - (smime-sign-region, smime-encrypt-region): Don't use - `insert-buffer'. - - * mml-smime.el (mml-smime-verify): Fix security button strings. - -2001-07-30 12:00:00 ShengHuo ZHU - - * gnus-art.el (gnus-mime-save-part-and-strip): Save - gnus-article-mime-handles. - -2001-07-29 Simon Josefsson - - * mail-source.el (top-level): Require message for message-directory. - (mail-source-directory): Change default to message-directory. - - * smime.el (smime-keys, smime-CA-directory, smime-CA-file) - (smime-certificate-directory, smime-openssl-program) - (smime-encrypt-cipher, smime-dns-server): Fix doc (leading "*"). - (smime-extra-arguments): New variable. - (smime-dns-server): Fix customize group. - (smime-call-openssl-region): Use `smime-extra-arguments'. - -2001-07-29 Simon Josefsson - From Vladimir Volovich - - * smime.el (smime-call-openssl-region): Ignore stderr. - -2001-07-29 Simon Josefsson - From Christoph Conrad - - * gnus-agent.el (gnus-agent-save-group-info): Don't destroy active - file. - -2001-07-29 Simon Josefsson - - * mm-view.el (mm-view-pkcs7-decrypt): Adhere to `mm-decrypt-option'. - - Support S/MIME decryption. - - * mm-decode.el (mm-inline-media-tests): - (mm-inlined-types): - (mm-automatic-display): - (mm-attachment-override-types): Add application/{x-,}pkcs7-mime. - - * mm-view.el (mm-pkcs7-signed-magic): - (mm-pkcs7-enveloped-magic): New variables. - (mm-view-pkcs7-get-type): New function; identify PKCS#7 type. - (mm-view-pkcs7): New function; mm viewer for PKCS#7 blobs. - (mm-view-pkcs7-decrypt): New function; mm viewer for encrypted - PKCS#7 blobs. - - * smime.el (smime-decrypt-region): Expand keyfile. - -2001-07-29 Simon Josefsson - - * nntp.el (nntp-open-ssl-stream): Don't mess with internal - `ssl.el' variables. - - * gnus-agent.el (gnus-agent-save-group-info): Delete everything - but line instead of narrowing to it, because `nnmail-parse-active' - calls widen. Thanks to Christoph Conrad - . - -2001-07-29 Kai Gro,A_(Bjohann - - * gnus.el (gnus-summary-line-format): Mention `gnus-sum-thread-*' - for %B spec. - - * gnus-sum.el (gnus-summary-prepare-threads): If - gnus-sum-thread-tree-root is nil, use subject instead. - (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): Documentation. - (gnus-sum-thread-tree-single-indent): Allow nil. - -2001-07-28 09:00:00 ShengHuo ZHU - - * message.el (message-fill-paragraph): Do nothing if the user - wants filladapt-mode. - -2001-07-27 23:00:00 ShengHuo ZHU - - * mm-decode.el (mm-image-type-from-buffer): New. - (mm-get-image): Use it. - -2001-07-27 18:00:00 ShengHuo ZHU - - * gnus.el (gnus-large-newsgroup): If it is nil, ... - - * gnus-art.el (gnus-mime-view-all-parts): buffer-read-only covers - mm-display-parts too. - -2001-07-27 12:00:00 ShengHuo ZHU - - * nnfolder.el (nnfolder-request-accept-article): Bind - nntp-server-buffer. - - * nnmail.el (nnmail-parse-active): Read from buffer instead of - nntp-server-buffer. - -2001-07-27 11:00:00 ShengHuo ZHU - - * message.el (message-check-news-header-syntax): Use - message-post-method. - (message-send-news): Bind message-post-method. - -2001-07-27 07:00:00 ShengHuo ZHU - - * mml.el (mml-tweak-type-alist): New. - (mml-tweak-function-alist): New. - (mml-tweak-part): New. - (mml-generate-mime-1): Use it. - -2001-07-26 22:00:00 ShengHuo ZHU - - * nnfolder.el (nnfolder-request-accept-article): Replace - nnfolder-request-list. - -2001-07-27 Simon Josefsson - - * nnimap.el (nnimap-open-server): Set nnimap-server-buffer if - nnoo-change-server failed to do it. - -2001-07-26 16:00:00 ShengHuo ZHU - - * gnus.el (gnus-parameters): Make it customizable. - -2001-07-26 15:00:00 ShengHuo ZHU - - * gnus-art.el (gnus-mm-display-part): Narrow to point if eobp. - - * message.el (message-set-auto-save-file-name): More - poor-system-types. - - * mailcap.el (mailcap-parse-mimetypes): poor-system-types. - - * gnus-ems.el (nnheader-file-name-translation-alist): M$Windows-NT - supports +. - -2001-07-26 14:00:00 ShengHuo ZHU - - * mm-decode.el (mm-readable-p): New. - (mm-inline-media-tests): Fix the default testers. - -2001-07-26 Simon Josefsson - - * nnimap.el (nnimap-version): Bump version number. - -2001-07-26 10:00:00 ShengHuo ZHU - From Steven E. Harris - - * nnheader.el (nnheader-translate-file-chars): cygwin32 is running - in M$Windows too. - -2001-07-26 Kai Gro,A_(Bjohann - - * gnus-delay.el (gnus-delay-send-drafts): Don't `error'. - -2001-07-25 21:00:00 ShengHuo ZHU - - * gnus-bcklg.el (gnus-backlog-shutdown): Make interactive. - - * mm-decode.el (mm-get-image): Guess then use the type. - - * gnus-art.el (gnus-mime-view-part-as-type): Don't copy cache. - -2001-07-25 12:54:00 Danny Siu - - * gnus-sum.el (gnus-summary-prepare-threads): Shouldn't do tree - display (%B) for threads if threading is off. - -2001-07-25 14:00:00 ShengHuo ZHU - From Henrik Enberg - - * gnus-msg.el: Customization patch. - -2001-07-25 22:22:22 Raymond Scholz - - * nnmail.el (nnmail-split-fancy-with-parent-ignore-groups): New - variable. - (nnmail-split-fancy-with-parent): Ignore certain groups. - -2001-07-25 11:00:00 ShengHuo ZHU - - * gnus-util.el (gnus-byte-compile): New. - (gnus-use-byte-compile): New. - (gnus-make-sort-function): Use it. - - * nnmail.el (nnmail-get-new-mail): Use it. - - * gnus-agent.el (gnus-category-make-function): Simple function or - compiled function. - (gnus-agent-fetch-group-1): Don't use (caaddr predicate). - - * gnus-gl.el (bbb-build-rate-command): Remove quote before lambda. - * gnus-topic.el (gnus-topic-sort-topics-1): Ditto. - (gnus-topic-sort-topics-1): Use gnus-byte-compile. - - * message.el (message-check-news-header-syntax): Remove quote. - -2001-07-24 19:00:00 ShengHuo ZHU - - * message.el (message-use-mail-followup-to): `t' is not a - documented value. - -2001-07-24 13:00:00 ShengHuo ZHU - - * gnus-sum.el (gnus-summary-display-arrow): Test fboundp. - -2001-07-24 12:00:00 ShengHuo ZHU - - * mm-encode.el (mm-encode-buffer): Don't use 7bit encoding if - there are long lines. - -2001-07-24 Katsumi Yamaoka - - * dgnushack.el (copy-list): New compiler macro. - -2001-07-24 09:00:00 ShengHuo ZHU - - * message.el (message-bounce): If no Return-Path, the whole - content is considered as the original message. - - * nnml.el (nnml-check-directory-twice): New. - (nnml-article-to-file): Use it. - (nnml-retrieve-headers): Hack it. - -2001-07-24 02:00:00 ShengHuo ZHU - - * gnus-win.el (gnus-buffer-configuration): New configure. - - * gnus-art.el (gnus-mm-display-part): Don't select-window if it is - not alive. - - * mm-decode.el (mm-remove-part): Don't murder the current window (nil). - (mm-display-external): Use display-term configure. - -2001-07-24 Kai Gro,A_(Bjohann - - * gnus-delay.el (gnus-delay-default-hour): New variable. - (gnus-delay-article): Allow specific date in YYYY-MM-DD format. - -2001-07-23 22:00:00 ShengHuo ZHU - From Karl Kleinpaste - - * gnus-sum.el (gnus-summary-line-format-alist): Add %B. - (gnus-summary-prepare-threads): Ditto. - - * gnus.el (gnus-summary-line-format): Add %B. - -2001-07-23 19:00:00 ShengHuo ZHU - - * gnus-sum.el (gnus-articles-to-read): Use gnus-group-decoded-name. - - * mm-util.el (mm-string-as-multibyte): New. - - * nnmh.el (nnmh-request-list-1): Encode, not decode! - -2001-07-23 18:00:00 ShengHuo ZHU - - * mm-util.el (mm-universal-coding-system): New. - - * gnus-start.el (gnus-startup-file-coding-system): Use it. - - * score-mode.el (score-mode-coding-system): Use it. - -2001-07-23 Katsumi Yamaoka - - * gnus-start.el (gnus-setup-news): Call - `gnus-check-bogus-newsgroups' just after the native server is - opened. - -2001-07-23 Kai Gro,A_(Bjohann - - * nnmail.el (nnmail-do-request-post): Util function to be used by - `nnchoke-request-post' for all nnmail-derived backends. - - * nnml.el (nnml-request-post): Use it. - - * gnus.el (gnus-valid-select-methods): nnml is a post-mail - backend, for it groks nnml-request-post. - - * gnus-group.el (gnus-group-highlight, gnus-group-highlight-line): - Treat `mail-post' backends like `mail' backends, not like `news' - backends. - -2001-07-22 09:00:00 ShengHuo ZHU - - * gnus-msg.el (gnus-setup-message): make-local-hook. - -2001-07-22 Kai Gro,A_(Bjohann - - * gnus-delay.el (gnus-delay-article): Fix `read-string' for - XEmacs. Allow more units. Submitted by Karl Kleinpaste - , slightly changed by Kai. - - * message.el (message-check-news-header-syntax): When checking - whether the groups exist, check the right server based on - `gnus-post-method'. - -2001-07-21 Kai Gro,A_(Bjohann - - * gnus-delay.el: New file. - -2001-07-21 13:00:00 ShengHuo ZHU - - * mm-util.el (mm-read-coding-system): Take two arguments. - - * gnus-sum.el (gnus-summary-show-article): Use - mm-read-coding-system. - - * gnus-art.el (article-de-quoted-unreadable): - (article-de-base64-unreadable, article-wash-html): - (gnus-mime-inline-part, gnus-mime-view-part-as-charset): Ditto. - -2001-07-21 Kai Gro,A_(Bjohann - - * nnml.el (nnml-request-post): New function. Can be used for - annotations in nnml groups. - -2001-07-19 Katsumi Yamaoka - - * nntp.el (nntp-request-newgroups): Use UTC date for NEWGROUPS - command. - - * gnus-start.el (gnus-find-new-newsgroups): Use - `message-make-date' instead of `current-time-string'. - (gnus-ask-server-for-new-groups): Ditto. - (gnus-check-first-time-used): Ditto. - -2001-07-20 11:00:00 ShengHuo ZHU - - * gnus-score.el (gnus-home-score-file): nnheader-translate-file-chars. - -2001-07-18 Per Abrahamsen - - * message.el (message-shorten-references): Change `maxcount' and - `cut' to obey USEFOR draft 5. - -2001-07-12 Colin Walters - - * gnus-sum.el (gnus-summary-display-arrow): New variable. - (gnus-summary-set-article-display-arrow): New function. - (gnus-summary-goto-subject): Use it. - -2001-07-18 12:00:00 ShengHuo ZHU - - * gnus-sum.el (gnus-summary-import-article): Insert date if - doesn't exist. - -2001-07-18 11:00:00 ShengHuo ZHU - - * mml.el (mml-content-type-parameters): New. - (mml-content-disposition-parameters): New. - (mml-insert-mime-headers): Use them. - (mml-parse-1): Accept charset. - -2001-07-17 22:00:00 ShengHuo ZHU - - * gnus-group.el (gnus-group-select-group): Doc fix. - - * gnus-eform.el (gnus-edit-form-done): Return nil if end-of-file. - -2001-07-17 Katsumi Yamaoka - - * dgnushack.el (dgnushack-make-auto-load): Advise `make-autoload' - to handle `define-derived-mode'. - -2001-07-16 12:00:00 ShengHuo ZHU - From: Stefan Monnier - - * message.el (message-mode): Use define-derived-mode. - (message-tab): message-completion-alist. - - * imap.el (imap-interactive-login): Use make-local-variable. - (imap-open): Ditto. - (imap-authenticate): Ditto. - - * gnus-msg.el (gnus-setup-message): Change-major-mode-hook. - - * gnus-art.el (gnus-article-edit-mode): Use define-derived-mode. - -2001-07-16 Kai Gro,A_(Bjohann - - * message.el (message-citation-line-function): Refer to - gnus-cite-attribution-suffix. - -2001-07-15 Pavel Jan,Bm(Bk - - * gnus-art.el,...: Error convention changes. - -2001-07-13 20:00:00 ShengHuo ZHU - - * gnus-sum.el (gnus-rebuild-thread): Count hidden lines too. - -2001-07-13 20:00:00 ShengHuo ZHU - - * nnrss.el (nnrss-read-group-data): Nuke emacs-lisp-mode-hook. - (nnrss-read-server-data): Ditto. - -2001-07-13 12:00:00 ShengHuo ZHU - - * gnus-setup.el (gnus-use-installed-gnus): Typo. - * Cleanup files. - From Pavel@Janik.cz (Pavel Jan,Bm(Bk). - -2001-07-13 08:00:00 ShengHuo ZHU - - * gnus.el (gnus-summary-line-format): Add %o. - - * gnus-sum.el (gnus-summary-pipe-output): Don't configure as pipe - unless shell outputs something. - -2001-07-13 07:00:00 ShengHuo ZHU - - * gnus-art.el (gnus-boring-article-headers): Better doc. - (article-hide-headers): Better regexp. - Suggested by Matt Swift . - - * nnheader.el (nnheader-max-head-length): Better doc. - (nnheader-header-value): Skip spaces. - (nnheader-parse-head): Remove space. - Suggested by Matt Swift . - - * gnus-sum.el (gnus-summary-show-raw-article): New function. - (gnus-get-newsgroup-headers): Remove space. - -2001-07-12 23:00:00 ShengHuo ZHU - - * gnus-msg.el (gnus-msg-treat-broken-reply-to): Add force. - (gnus-summary-reply): Use it. - (gnus-summary-reply-broken-reply-to): New. - (gnus-msg-force-broken-reply-to): New. - - * mm-view.el (mm-inline-text): Showing as text/plain when error. - -2001-07-12 21:00:00 ShengHuo ZHU - - * gnus-draft.el (gnus-draft-setup): Restore gnus-newsgroup-name. - -2001-07-12 15:00:00 ShengHuo ZHU - - * mm-decode.el (mm-external-terminal-program): New variable. - (mm-display-external): Use it. Use term to display when no - window-system. - -2001-07-12 Bj,Av(Brn Torkelsson - - * gnus-srvr.el (gnus-browse-make-menu-bar): Changed one of the - Browse->Next entries to Browse->Prev - -2001-07-11 22:00:00 ShengHuo ZHU - - * gnus-msg.el (gnus-inews-do-gcc): Don't test gnus-alive-p. - -2001-07-11 18:00:00 ShengHuo ZHU - - * mm-encode.el (mm-content-transfer-encoding-defaults): Use base64 - for the default encoding. - - * nnrss.el (nnrss-url-field): New field. - (nnrss-request-article): Add newsgroups. - - * nnfolder.el (nnfolder-read-folder): Force to use a multibyte buffer. - -2001-07-11 04:00:00 ShengHuo ZHU - - * nndraft.el (nndraft-request-restore-buffer): Don't remove Date. - - * gnus-draft.el (gnus-draft-edit-message): Remove Date here. - (gnus-draft-setup): Remove backlog. - -2001-07-10 Pavel Jan,Bm(Bk - - * gnus-logic.el, gnus-srvr.el, gnus-vm.el, nnheaderxm.el, nnoo.el: - Cleanup. - -2001-07-09 23:00:00 ShengHuo ZHU - - * gnus-msg.el (gnus-bug): Erase buffer. - - * nnfolder.el (nnfolder-possibly-change-group): Don't create group. - -2001-07-09 19:00:00 ShengHuo ZHU - - * mm-decode.el (mm-attachment-override-p): Fix typo. - -2001-03-19 05:28:00 Katsumi Yamaoka - - * gnus-kill.el (gnus-execute): Work with the extra headers. - * gnus-sum.el (gnus-summary-execute-command): Ditto. - -2001-07-09 17:00:00 ShengHuo ZHU - - * mm-view.el (mm-inline-text): w3-coding-system-for-mime-charset - may not defined. From: Raja R Harinath . - - * message.el (message-send-mail-real-function): New variable. - (message-send-mail-partially, message-send-mail): - - * nngateway.el (nngateway-request-post): Use it. - - * gnus-agent.el (gnus-agentize): Use it. - - * nnsoup.el (nnsoup-old-functions, nnsoup-set-variables) - (nnsoup-revert-variables): Use it. - -2001-07-09 Colin Walters - - * mm-decode.el (mm-inline-media-tests): Default to displaying as - text/plain if the type doesn't match any other media types. - (mm-inlined-types): Doc fix. - (mm-display-inline): Revert previous change (now handled by a - default type in `mm-inline-media-tests'. - (mm-inlinable-p): Revive. - (mm-display-part): Call `mm-inlinable-p'. - (mm-attachment-override-p): Ditto. - (mm-inlined-p): Doc fix. - - * gnus-art.el (gnus-mime-display-single): Call `mm-inlinable-p' as - well as `mm-inlined-p'. - -2001-07-09 13:00:00 ShengHuo ZHU - - * nntp.el (nntp-send-command, nntp-send-command-nodelete): - (nntp-send-command-and-decode): Use gnus-point-at-bol. - -2001-07-09 13:00:00 ShengHuo ZHU - From Paul Jarc - - * message.el (message-use-mail-followup-to): New variable. - (message-get-reply-headers): Use it. - -2001-07-04 Gerd Moellmann - - * nnheader.el (nnheader-init-server-buffer): Make sure the - *nntpd* buffer is made multibyte instead of a random buffer. - -2001-07-09 12:00:00 ShengHuo ZHU - - * gnus-sum.el (gnus-get-newsgroup-headers-xover): Get headers only - when it returns headers. - -2001-07-07 Simon Josefsson - - * rfc2047.el (rfc2047-encode-message-header): Skip header when - trying to fold. Thanks to Colin Walters - - -2001-07-06 Simon Josefsson - - * imap.el (imap-parse-address-list, imap-parse-flag-list) - (imap-parse-body-extension, imap-parse-body-ext, imap-parse-body): - Add information in `assert's. - - * nnimap.el (nnimap-possibly-change-group): Ignore uidvalidity - changes. (From nnimaps' point of view, `nnimap-verify-uidvalidity' - and `nnimap-group-overview-filename', should handle all - change-of-uidvalidity related issues. But there may be other - problems.) - -2001-07-05 Colin Walters - - * rfc2047.el (rfc2047-encode-message-header): Don't include the - header name when folding. - -2001-07-05 Colin Walters - - * mm-decode.el (mm-inlined-types): Document relationship with - `mm-inline-media-tests'. - (mm-display-inline): Default to displaying as plain text if no - inlining handler is available. - (mm-inlinable-p): Remove. - (mm-inlined-p): Don't call `mm-inlinable-p'. - (mm-automatic-display-p): Ditto. - (mm-attachment-override-p): Ditto. - -2001-07-04 Simon Josefsson - - * nnimap.el (nnimap-importantize-dormant): New variable. - (nnimap-request-update-info-internal): Use it. - (nnimap-request-set-mark): Ditto. - -2001-07-04 Didier Verna - - * nntp.el (nntp-send-command): don't pass a buffer argument to - `point'. Only XEmacs accepts this. - * nntp.el (nntp-send-command-nodelete): ditto. - * nntp.el (nntp-send-command-and-decode): ditto. - -2001-07-04 Didier Verna - - * nntp.el (nntp-open-connection-function): doc update. - * nntp.el (nntp-pre-command): New. - * nntp.el (nntp-via-rlogin-command): New. - * nntp.el (nntp-via-telnet-command): New. - * nntp.el (nntp-via-telnet-switches): New. - * nntp.el (nntp-via-user-name): New. - * nntp.el (nntp-via-user-password): New. - * nntp.el (nntp-via-address): New. - * nntp.el (nntp-via-envuser): New. - * nntp.el (nntp-via-shell-prompt): New. - * nntp.el (nntp-open-telnet-stream): New. - * nntp.el (nntp-open-via-rlogin-and-telnet): New. - * nntp.el (nntp-open-via-telnet-and-telnet): New. - * nntp.el (nntp-wait-for): check for possibly echo'ed commands. - * nntp.el (nntp-send-command): ditto. - * nntp.el (nntp-send-command-nodelete): ditto. - * nntp.el (nntp-send-command-and-decode): ditto. - -2001-06-30 YAGI Tatsuya - - * gnus-start.el (gnus-check-first-time-used): Use `if' instead of - `when'. - -2001-07-03 Simon Josefsson - From Nuutti Kotivuori - - * flow-fill.el (fill-flowed): Use (1+ (point-at-eol)) instead. - -2001-07-03 Simon Josefsson - - * flow-fill.el (fill-flowed): If `fill-region' inserts empty line, - remove it (workaround XEmacs `fill-region' bug). - -2001-07-01 Simon Josefsson - - * nnimap.el (nnimap-date-days-ago): Defeat locale. - -2001-06-28 11:00:00 ShengHuo ZHU - - * mml2015.el (mml2015-format-error): New function. - (mml2015-mailcrypt-decrypt, mml2015-mailcrypt-clear-decrypt) - (mml2015-mailcrypt-verify, mml2015-gpg-clear-verify) - (mml2015-mailcrypt-clear-verify, mml2015-gpg-verify): Use it. - -2001-06-26 22:00:00 ShengHuo ZHU - - * nnrss.el (nnrss-retrieve-headers): The description may not exist. - Suggested by Christoph Conrad . - - * gnus-sum.el (gnus-summary-set-local-parameters): Don't override - group variables. - -2001-06-25 10:00:00 ShengHuo ZHU - - * nnslashdot.el (nnslashdot-write-groups): Use gnus-prin1. - - * nnrss.el (nnrss-save-server-data): Bind print-level and print-length. - (nnrss-save-group-data): Ditto. - - * gnus-agent.el (gnus-agent-save-alist): Ditto. - -2001-06-25 Katsumi Yamaoka - - * message.el (message-do-send-housekeeping): Narrow to headers. - -2001-06-24 Simon Josefsson - - * rfc2047.el (rfc2047-fold-region): The check to skip WSP - insertion when breaking lines looked for " \t" instead of "[ \t]". - (rfc2047-encode-message-header): Fold lines even if - no QP encoding is done. - -2001-06-23 Simon Josefsson - From Samuel Tardieu - - * smime.el (smime-keys): Support additional certificates. - (smime-make-certfiles): New function. - (smime-sign-region): Use previous variables. - (smime-get-certfiles): New function. - (smime-sign-buffer): Use it. - (smime-verify-region): Support both CAfile and CApath. - -2001-06-23 Simon Josefsson - - * smime.el (smime-decrypt-region): Perhaps work. - -2001-06-22 10:00:00 ShengHuo ZHU - - * gnus-msg.el (gnus-copy-article-buffer): Typo. - -2001-04-06 Ralph Schleicher - - * mm-decode.el (mm-save-part): Rewrite file name. - (mm-file-name-rewrite-functions): New variable. - (mm-file-name-delete-whitespace): New function. - (mm-file-name-trim-whitespace): New function. - (mm-file-name-collapse-whitespace): New function. - (mm-file-name-replace-whitespace): New variable and function. - -2001-06-22 Simon Josefsson - - * message.el (message-make-date): Workaround locale for weekdays. - -2001-06-21 17:00:00 ShengHuo ZHU - - * message.el (message-goto-body): Return nil if not found. (revert!) - -2001-06-21 10:00:00 ShengHuo ZHU - From Fremlin - - * message.el (message-goto-body): Some messages have no header. - - * gnus-msg.el (gnus-copy-article-buffer): Use it. - -2001-06-21 Ralph Schleicher - - * nnultimate.el (nnultimate-retrieve-headers): Date fix. - -2001-06-21 10:00:00 ShengHuo ZHU - - * message.el (message-make-date): Add week day. - Suggested by Jason R. Mastaler . - -2001-06-19 Simon Josefsson - - * message.el (message-yank-prefix): Doc fix. - (message-yank-cited-prefix): Ditto. - (message-delete-not-region): Keep citation prefix on first line, - if possible and appropriate. - -2001-06-19 Simon Josefsson - - * imap.el (imap-process-connection-type): New variable. - (imap-kerberos4-open, imap-gssapi-open): Use it. This makes - recent `imtest's work completely (no line length issues), while - making making old `imtest's unusable. Thanks to NAGY Andras - for his work. - -2000-12-30 NAGY Andras - - * imap.el (imap-ssl-program): Add -quiet to shut up - OpenSSL/SSLeay's internal debug talk. - -2001-06-19 Matt Armstrong - - * imap.el (imap-parse-flag-list): Workaround bug in Courier IMAP - server. - -2001-06-19 10:00:00 ShengHuo ZHU - - * nnmail.el (nnmail-article-buffer): New variable. - (nnmail-split-incoming): Use it. - -2001-06-15 Eli Zaretskii - - * qp.el (quoted-printable-decode-region): If called interactively, - use coding-system-for-read. - -2001-06-16 09:00:00 ShengHuo ZHU - - * message.el (message-check-news-header-syntax): Check Reply-To. - -2001-06-16 08:00:00 ShengHuo ZHU - - * mml.el (mml-parse-1): Use message options. - - * message.el (message-do-fcc): Don't do anything if there is no - FCC. - -2001-06-16 Simon Josefsson - - * nnimap.el (nnimap-split-articles): Support 'junk to-groups. - (nnimap-expunge-search-string): New variable. - (nnimap-request-expire-articles): Use it. - -2001-06-15 19:00:00 ShengHuo ZHU - - * message.el (message-send-mail-with-qmail): wrong exit status is - 100 not 1. Reported by Paul Jarc . - -2001-06-15 09:00:00 ShengHuo ZHU - - * gnus-art.el (article-strip-multiple-blank-lines): Use - delete-region instead of replace-match. - -2001-06-14 16:00:00 ShengHuo ZHU - - * nnweb.el (nnweb-google-parse-1): Fix Google content regexp. - (nnweb-google-wash-article): Ditto. - -2001-06-14 Ferenc Wagner - - * nnweb.el (nnweb-google-parse-1): Fix Google url regexp. - -2001-06-13 Katsumi Yamaoka - - * gnus.el (gnus-define-group-parameter): Don't quote the defcustom - specs. - -2001-06-13 15:00:00 ShengHuo ZHU - - * gnus.el (gnus-email-address): Move it here. - - * gnus-art.el (article-de-quoted-unreadable): Read charset if - requested. - (article-de-base64-unreadable): Ditto. - (article-wash-html): Ditto. - -2001-06-12 14:00:00 ShengHuo ZHU - - * message.el (message-options-set-recipient): Don't add ", " - unless necessary. Suggested by Josh Huber . - -2001-06-12 12:00:00 ShengHuo ZHU - - * nnrss.el (nnrss-group-alist): Use |fr| instead of [fr]. - -2001-06-12 11:00:00 ShengHuo ZHU - - * gnus-art.el (gnus-plain-save-name): Use file-relative-name. - From Marc Lefranc . - - * nnrss.el (nnrss-node-text): Node might be nil. - -2001-06-11 10:00:00 ShengHuo ZHU - - * gnus-uu.el (gnus-uu-save-article): Use mml tag instead of - part. From Katsumi Yamaoka . - - * nnrss.el (nnrss-group-alist): More items. - -2001-06-09 23:00:00 ShengHuo ZHU - - * nnrss.el (nnrss-node-text): Use cddr instead xml-node-children. - -2001-06-03 Dale Hagglund - - * gnus-mlspl.el (gnus-group-split-fancy): Fix generation of split - restrict clauses. - -2001-06-07 16:00:00 ShengHuo ZHU - - From Benjamin Rutt - - * message.el (message-wide-reply-confirm-recipients): New variable. - -2001-06-06 Mark Thomas - - * nnmail.el (nnmail-fix-eudora-headers): Change the In-Reply-To - fix so it works with XEmacs. - -2001-06-07 16:00:00 ShengHuo ZHU - - * nnrss.el (nnrss-retrieve-headers): Support description as extra - headers. - -2001-06-07 15:00:00 ShengHuo ZHU - - * nnrss.el: Fix a few bugs. - -2001-06-05 Simon Josefsson - - * mm-decode.el (mm-handle-set-external-undisplayer): Don't - generate compiler warnings. From Alex Schroeder . - -2001-06-04 Hrvoje Niksic - - * mm-decode.el (mm-pipe-part): Bind coding-system-for-write to - binary so that we don't transmit ISO 2022 garbage to the process. - This is needed under XEmacs. - -2001-06-03 Simon Josefsson - - * imap.el (imap-ssl-open): Require ssl. (Otherwise ssl.el is - autoloaded incorrectly below because ssl-program-* is bound.) - Thanks to Amos Gouaux for report. - -2001-06-02 Simon Josefsson - - * imap.el (imap-kerberos4-open): - (imap-gssapi-open): - (imap-ssl-open): - (imap-network-open): - (imap-shell-open): - (imap-starttls-open): Set buffer to workaround spurious - `accept-process-output' buffer changes. Thanks to Mats Lidell - for report and partial patch and Jake - Colman for report. - -2001-05-31 13:00:00 ShengHuo ZHU - - * gnus-sum.el (gnus-summary-catchup): New argument. - (gnus-summary-catchup-from-here): New function. - -2001-05-30 Kai Gro,A_(Bjohann - - * mm-view.el (mm-inline-image-xemacs): Insert newline, then move - back, then insert glyph. (Before, the glyph was inserted first, - then the newline.) This works around a behavior in XEmacs where - it is not possible to insert a character after a glyph which is at - the end of a buffer. Patch by Lloyd Zusman . - -2001-05-28 Kai Gro,A_(Bjohann - - From Jaap-Henk Hoepman (jhh@xs4all.nl). - - * mm-decode.el (mm-keep-viewer-alive-types): New variable. - (mm-keep-viewer-alive-p, mm-handle-set-external-undisplayer, - mm-destroy-postponed-undisplay-list): New functions. - (mm-display-external): Use them. - -2001-05-27 Kai Gro,A_(Bjohann - - * gnus-salt.el (gnus-tree-highlight-node): Bind `default-high' and - `default-low' when evaluating `gnus-summary-highlight'. - From Raja R Harinath . - -2001-05-27 Simon Josefsson - - * message.el (message-yank-cited-prefix): New variable. - (message-indent-citation): Use it. - - * mml2015.el (mml2015-mailcrypt-verify): Store gpg stderr output - as details. - (mml2015-mailcrypt-clear-verify): Ditto. - -2001-05-24 Kai Gro,A_(Bjohann - From Nevin Kapur . - - * gnus-sum.el (gnus-summary-default-high-score, - gnus-summary-default-low-score): New variables. - (gnus-summary-highlight): Use them. - -2001-05-16 Didier Verna - - * message.el (message-mail): pass the 'send-actions argument to - `message-setup'. - -2001-05-16 Simon Josefsson - From Raymond Scholz - - * gnus-art.el (gnus-mime-view-part-as-charset): - (gnus-mime-internalize-part): Doc fixes. - -2001-05-11 Simon Josefsson - - * gnus-start.el (gnus-ignored-newsgroups): Also ignore NNTP type - status lines without any text ("^215$"). - -2001-05-06 21:00:00 ShengHuo ZHU - - * nnrss.el (nnrss-check-group): Reverse. - -2001-05-07 Simon Josefsson - - * message.el (message-get-reply-headers): - (message-followup): Fix typo, suggested by David Green - - -2001-05-05 15:00:00 ShengHuo ZHU - - * nnslashdot.el (nnslashdot-request-expire-articles): Fix. - - * nnrss.el (nnrss-open-server): Read server data when it is called. - (nnrss-request-expire-articles): Fix. - -2001-05-05 09:00:00 ShengHuo ZHU - - * message.el (message-do-send-housekeeping): mail-abbrevs may - rename buffer behind Gnus. - -2001-05-04 14:00:00 ShengHuo ZHU - - * nnrss.el (nnrss-check-group): Use nnheader-translate-file-chars. - (nnrss-group-alist): Add more resources. - (nnrss-check-group): Ignore errors. - -2001-05-04 00:00:00 ShengHuo ZHU - - * nnrss.el (nnrss-request-expire-articles): Correct the return value. - - * nnslashdot.el (nnslashdot-request-list): Add time. - (nnslashdot-request-expire-articles): New. - - * gnus-start.el (gnus-check-bogus-newsgroups): Remove bogus - secondary methods too. - -2001-05-03 23:00:00 ShengHuo ZHU - - * message.el (message-use-followup-to): Set default value to t. - -2001-05-03 Florian Weimer - - * message.el (message-dont-reply-to-names): Fix documentation. - (message-get-reply-headers): Use Mail-Followup-To only for wide - replies. - -2001-05-03 12:00:00 ShengHuo ZHU - - * nnrss.el (nnrss-request-expire-articles): Calculate # of days - correctly. - (nnrss-check-group): Use time. - -2001-05-01 19:21:19 Lars Magne Ingebrigtsen - - * gnus.el: Oort Gnus v0.03 is released. - -2001-05-01 19:06:21 Lars Magne Ingebrigtsen - - * nnultimate.el (nnultimate-topic-article-to-article): Use the - group. - -2001-04-24 19:50:14 Lars Magne Ingebrigtsen - - * gnus-srvr.el (gnus-server-insert-server-line): Add a space. - -2001-04-15 14:55:03 Lars Magne Ingebrigtsen - - * nnultimate.el (nnultimate-retrieve-headers): Return all - available headers. - - * gnus-sum.el (gnus-read-all-available-headers): New variable. - (gnus-get-newsgroup-headers-xover): Use it. - -2001-04-14 15:47:26 Lars Magne Ingebrigtsen - - * nnultimate.el (nnultimate-retrieve-headers): Clean up. - -2001-04-30 17:00:00 ShengHuo ZHU - - * nntp.el (nntp-retrieve-groups): Use throw instead of error. - -2001-04-29 09:00:00 ShengHuo ZHU - - * nnrss.el (nnrss-insert-w3): Use cache before I figure out how to - disable it. - - * gnus.el (gnus-info-nodes): Remove a few The's. - -2001-04-29 08:00:00 ShengHuo ZHU - - * mail-source.el (mail-source-movemail): Call-process may return a - signal description string. - - * gnus-start.el (gnus-read-newsrc-el-file): - gnus-newsrc-file-version may be nil. - - * nnmail.el (nnmail-get-new-mail): Use the exact file only. - Suggested by Michael Sperber [Mr. Preprocessor] - . - -2001-04-25 Per Abrahamsen - - * mm-uu.el (mm-uu-configure-list): Fixed customize type. - -2001-04-24 Hrvoje Niksic - - * mm-view.el (mm-display-inline-fontify): Allow XEmacs to fully - fontify HANDLE. - -2001-04-18 Simon Josefsson - - * smime.el (smime-ask-passphrase): Rework to return value. - (smime-sign-region): Rework to bind value and use it. - (smime-decrypt-region): Ditto. - -2001-04-18 Mathias Herberts - Committed by Simon Josefsson - - * smime.el (smime-ask-passphrase): New function. - (smime-sign-region): Use it. - (smime-encrypt-cipher): New variable. - (smime-decrypt-region): Ditto. - -2001-04-12 Jason Merrill - Committed by Simon Josefsson - - * imap.el (imap-shell-open): Erase the buffer *after* copying it into - the log. - -2001-04-14 01:14:42 Lars Magne Ingebrigtsen - - *gnus.el: Oort Gnus v0.02 is released. - -2001-04-14 00:48:42 Lars Magne Ingebrigtsen - - * gnus.el: Oort Gnus v0.01 is released. - -2001-04-13 22:01:46 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-summary-highlight): Highlight read - undownloaded articles as read articles. - - * gnus-agent.el (gnus-agent-get-undownloaded-list): Clean up. - (gnus-agent-get-undownloaded-list): Mark all undownloaded - articles, even read ones, as such. - - * gnus-sum.el (gnus-summary-find-matching): Clean up. - (gnus-find-matching-articles): New function. - (gnus-summary-limit-include-matching-articles): New command. - (gnus-summary-limit-include-thread): Include articles that have - matching subjects. - (gnus-offer-save-summaries): Clean up. - -2001-04-13 Kai Gro,A_(Bjohann - - * nnmail.el (nnmail-split-fancy-with-parent): Add docstring. - -2001-04-12 19:00:00 ShengHuo ZHU - From Jason Merrill - - * gnus-sum.el (gnus-summary-insert-new-articles): Reverse the articles. - -2001-04-10 08:01:15 Katsumi Yamaoka - Committed by ShengHuo ZHU - - * gnus-msg.el (gnus-post-news): Fill the Newsgroups header by the - newsgroup names when the original article is a news message. - -2001-04-12 19:00:00 ShengHuo ZHU - - * message.el (message-cite-prefix-regexp): Use POSIX regexp if - supported. Suggest by Jim Meyering . - -2001-04-02 Nevin Kapur - Committed by Kai Gro,A_(Bjohann . - - * nnmail.el (nnmail-split-it): Added check for .* at the end of - regexp in nnmail-split-fancy. - -2001-04-10 Simon Josefsson - - * message.el (message-options-set-recipient): Look at Cc and Bcc too. - -2001-04-10 Colin Marquardt - - * message.el (message-send-mail): Improve the interaction with the - user. - -2001-04-10 Simon Josefsson - - * imap.el (imap-message-copy): Work around buggy servers that - doesn't send TRYCREATE tags. - -2001-04-09 01:15:54 Katsumi Yamaoka - - * gnus-start.el (gnus-read-newsrc-el-file): Work with Semi-gnusae. - -2001-04-05 21:43:25 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-update-summary-mark-positions): Use a valid - date. - -2001-04-04 16:13:17 Lars Magne Ingebrigtsen - - * gnus-group.el (gnus-group-quit): Check that the dribble buffer - lives. - -2001-04-02 00:40:12 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-parse-news-url): New function. - (gnus-button-handle-news): New function. - (gnus-button-alist): Point to new functions. - - * gnus-group.el (gnus-group-quit): Only mark buffer in non-empty. - - * gnus-start.el (gnus-read-newsrc-el-file): Nix out - gnus-format-specs. - - * message.el (message-check-news-header-syntax): Question even - when Gnus doesn't know the group names. - (message-send-news): Clean up. - - * gnus-start.el (gnus-dribble-read-file): Say whether Gnus was - exited on purpose without saving. - - * gnus-group.el (gnus-group-quit): Mark the dribble file as `Q'. - -2001-04-01 00:37:14 Lars Magne Ingebrigtsen - - * gnus-score.el (gnus-score-orphans): Clean up. - - * gnus-win.el (gnus-remove-some-windows): Leave one Gnus window. - - * gnus-sum.el (gnus-summary-exit): Kill the summary buffer a bit - later. - - * gnus-start.el (gnus-close-all-servers): Find the right items to - close. - - * qp.el (quoted-printable-decode-region): Just message - malformation; don't quit. - -2001-03-31 21:00:00 ShengHuo ZHU - From Gerd Moellmann . - - * gnus.el (gnus-interactive): A typo. - -2001-03-26 Juanma Barranquero - Committed by ShengHuo ZHU - - * gnus-util.el (gnus-delete-alist): Declare it as an alias of - `assq-delete-all', if that function exists; otherwise use the old - definition. Documentation changed to match the one in - `assq-delete-all'. - -2001-04-01 00:37:14 Lars Magne Ingebrigtsen - - * gnus-start.el (gnus-close-all-servers): New function. - - * gnus-srvr.el (gnus-server-close-all-servers): Clean up. - (gnus-server-remove-denials): Clean up. - - * gnus-sum.el (gnus-summary-sort-by-original): New command and - keystroke. - -2001-03-31 02:56:55 Lars Magne Ingebrigtsen - - * message.el (message-send-news): Message where we are sending. - (message-send-mail): Ditto. - - * gnus.el (gnus-server-string): New function. - - * gnus-sum.el (gnus-summary-up-thread): Doc fix. - - * mm-decode.el (mm-default-directory): Customized. - (mm-tmp-directory): Ditto. - - * gnus-sum.el (gnus-summary-catchup-and-exit): Doc fix. - (gnus-get-newsgroup-headers): Return -1 for articles without Lines - or Chars. - (gnus-summary-line-format-alist): ?l is now a string. - (gnus-summary-prepare-threads): Output ? for unknown lines. - (gnus-summary-insert-line): Ditto. - (gnus-summary-print-article): Unbalanced parentheses. - - * gnus-msg.el (gnus-inews-do-gcc): Check group to allow it to find - out whether new stuff has arrived. - -2001-03-31 02:14:38 Alan Shutko - - * gnus-sum.el: Let printing work on ttys on Emacs. - -2001-03-31 01:11:14 Lars Magne Ingebrigtsen - - * gnus-msg.el (gnus-post-news): Add an empty Newsgroups header - when forcing news. - - * gnus-sum.el (gnus-summary-mark-article-as-replied): Make into a - command. - -2001-03-31 01:04:54 Francis Litterio - - * message.el (message-set-auto-save-file-name): Don't use - asterisks under nt. - -2001-03-31 00:03:42 Lars Magne Ingebrigtsen - - * gnus-msg.el (gnus-inews-insert-draft-meta-information): Allow - lists of articles. - - * gnus-uu.el (gnus-uu-digest-mail-forward): Mark as forwarded. - - * gnus-msg.el (gnus-put-message): Clean up. - (gnus-summary-reply): Mark all replied-to articles as replied to. - (gnus-inews-add-send-actions): Also mark as forwarded. - (gnus-summary-mail-forward): Mark as forwarded. - - * gnus-sum.el (gnus-summary-mark-article-as-replied): Take a list - of articles. - (gnus-summary-mark-article-as-forwarded): Ditto. - - * gnus-msg.el (gnus-summary-resend-message): Mark article as - forwarded. - (gnus-summary-mail-forward): Clean up. - - * gnus.el (gnus-article-mark-lists): Added forward. - - * gnus-sum.el (gnus-forwarded-mark): New variable. - (gnus-summary-prepare-threads): Use it. - (gnus-summary-update-secondary-mark): Ditto. - (gnus-newsgroup-forwarded): New variable. - -2001-03-30 23:13:37 Lars Magne Ingebrigtsen - - * gnus-msg.el (gnus-summary-reply): Allow very wide replies. - (gnus-summary-very-wide-reply): New command and keystroke. - (gnus-summary-very-wide-reply-with-original): Ditto. - - * gnus-score.el (gnus-adaptive-word-length-limit): New variable. - (gnus-score-adaptive): Use it. - - * gnus-start.el (gnus-get-unread-articles): Clean up. - -2001-03-21 20:00:43 Lars Magne Ingebrigtsen - - * nnultimate.el (nnultimate-retrieve-headers): Work for other - boards. - -2001-03-21 Didier Verna - - * gnus-start.el: - * gnus-start.el (gnus-subscribe-newsgroup-hooks): New. - * gnus-start.el (gnus-subscribe-newsgroup): use it. - - -2001-03-15 09:47:23 Lars Magne Ingebrigtsen - - * nnultimate.el (nnultimate-retrieve-headers): Understand - long-form month names. - -2001-03-18 23:00:00 ShengHuo ZHU - - * gnus-sum.el (gnus-summary-show-all-headers): - gnus-article-show-all-headers is broken. Use - gnus-summary-toggle-header instead. - - * mml2015.el (mml2015-gpg-extract-from): No error. - -2001-03-18 23:00:00 ShengHuo ZHU - From Bj,Ax(Brn Mork . - - * mml2015.el (mml2015-gpg-extract-from): New function. - (mml2015-gpg-verify): Use it. - (mml2015-gpg-clear-verify): Use it. - -2001-03-17 10:00:00 ShengHuo ZHU - - * message.el (message-setup-fill-variables): Use - fill-paragraph-function. - (message-fill-paragraph): Take an argument. - (message-newline-and-reformat): Take another argument. - -2001-03-16 20:00:00 ShengHuo ZHU - - * message.el (rmail-output): It is in rmailout.el not rmail.el. - -2001-03-16 16:00:00 ShengHuo ZHU - - * message.el (message-forward): local-variable-p takes an extra - argument in XEmacs. - -2001-03-16 Simon Josefsson - - * nnimap.el (nnimap-dont-use-nov-p): Renamed from - `nnimap-use-nov-p' (it really tested the negative). - (nnimap-retrieve-headers): Use it. - -2001-03-11 Kai Gro,A_(Bjohann - - * message.el (message-generate-headers-first): Update doc. - -2001-03-10 Matthias Wiehl - - * gnus.el (gnus-summary-line-format): Typo. - -2001-03-11 Simon Josefsson - - * mailcap.el (mailcap-mime-data): Add application/sieve. - (mailcap-mime-extensions): Add .siv, .xls. - -2001-03-14 20:00:00 ShengHuo ZHU - From Christoph Conrad - - * gnus-score.el (gnus-summary-lower-thread): Typo. - -2001-03-14 19:00:00 ShengHuo ZHU - - * message.el (message-forward-decoded-p): New variable. - (message-forward-subject-author-subject): Use it. - (message-make-forward-subject): Use it. - (message-forward): Use it. - - * gnus-uu.el (gnus-uu-digest-mail-forward): Use it. - - * mm-util.el, message.el, rfc2047.el, gnus-sum.el, gnus-score.el: - Sync with Emacs 21 (tag EMACS_PRETEST_21_0_100). - -;;Has been fixed -- zsh. -;;2001-03-05 Dave Love -;; -;; * mm-util.el (mm-mime-mule-charset-alist): Fix utf-8 case. -;; Move it after definition of mm-coding-system-p. -;; -2001-03-01 Dave Love - - * mm-util.el (mm-inhibit-file-name-handlers): Add - image-file-handler. - -2001-02-11 Dave Love - - * message.el (message-signature-file): Fix doc, :type. - -2001-02-08 Dave Love - - * rfc2047.el (rfc2047-fold-region): Don't forward-char at EOB. - (message-posting-charset): Defvar when compiling again. - (rfc2047-encodable-p): Require message. - - * gnus-sum.el (gnus-alter-articles-to-read-function): - * gnus-score.el (gnus-score-after-write-file-function): Fix :type. - -2001-03-08 20:00:00 ShengHuo ZHU - - * nnrss.el: New file. - -2001-03-08 02:41:36 Katsumi Yamaoka - Committed by ShengHuo ZHU - - * rfc2047.el (rfc2047-unfold-region): Fix arg of - `skip-chars-forward'. - -2001-03-07 13:00:00 ShengHuo ZHU - - * nndraft.el (nndraft-request-group): Restore auto save files if - the original files do not exist. - -2001-03-07 11:00:00 ShengHuo ZHU - - * gnus-score.el (gnus-score-find-bnews): Print messages on illegal - SCORE paths. - - * mm-decode.el (mm-dissect-buffer): Call - mail-extract-address-components only if necessary. - -2001-03-06 13:00:00 ShengHuo ZHU - - * gnus-score.el (gnus-score-find-bnews): Maybe there is no - directory part. - (gnus-score-search-global-directories): Use file-directory-p. - - * gnus-score.el (gnus-score-score-files-1): Use - gnus-kill-files-directory. - From Adrian Aichner . - -2001-03-05 08:00:00 ShengHuo ZHU - - * gnus.el (charset): Move here from gnus-sum.el. - -2001-03-04 11:00:00 ShengHuo ZHU - - * mml.el (mml-preview): Disable local map. - - * gnus-sum.el (gnus-summary-make-menu-bar): Make - gnus-article-post-menu here. - - * gnus-art.el (gnus-article-make-menu-bar): Make summary-menu bar - if it has not been made. - -2001-03-02 02:00:00 ShengHuo ZHU - - * gnus-art.el (gnus-article-describe-key): Map key to event. - (gnus-article-describe-key-briefly): Ditto - -2001-03-01 23:00:00 ShengHuo ZHU - - * gnus-sum.el (gnus-summary-limit-include-expunged): Fix. - -2001-03-01 22:00:00 ShengHuo ZHU - From Katsumi Yamaoka . - - * dgnushack.el (coerce, merge, subseq): defmacro. - -2001-03-01 22:00:00 ShengHuo ZHU - - * lpath.el (nndraft-request-group): Move it here from nndraft.el. - A fake defalias in nndraft.el results a not-activated bug in - uncompiled versions. - -2001-02-26 11:27:27 Paul Jarc - Committed by ShengHuo ZHU - - * gnus-util.el (gnus-split-references): Handle malformed References:. - -2001-02-26 08:00:00 ShengHuo ZHU - - * gnus-art.el (gnus-article-mime-part-status): 1 part. - -2001-02-25 10:00:00 ShengHuo ZHU - From NAGY Andras . - - * gnus.el (gnus-parameters): Typo. - -2001-02-24 00:00:00 ShengHuo ZHU - - * gnus.el (gnus-read-method): Remove redundancy. - -2001-02-23 23:00:00 ShengHuo ZHU - - * nnslashdot.el (nnslashdot-backslash-url): New. - (nnslashdot-request-list): Use it. - -2001-02-23 22:00:00 ShengHuo ZHU - - * nnml.el (nnml-generate-active-info): Fix the case when there is - no file. - - * gnus-sum.el (gnus-summary-import-article): Display it. Enable edit. - (gnus-summary-create-article): New. - - * gnus-group.el (gnus-group-mark-article-read): New. - - * gnus-msg.el (gnus-inews-do-gcc): Use it. - - * gnus-art.el (gnus-article-edit-article): Set modified-p nil. - -2001-02-23 17:00:00 ShengHuo ZHU - - * gnus-art.el (gnus-article-edit-done): Don't use - gnus-article-edit-exit. - (gnus-article-edit-exit): Confirm and insert original-article-buffer. - - * gnus.el (gnus-parameters): New. - Suggested by NAGY Andras . - (gnus-parameters-get-parameter): New. - (gnus-group-find-parameter): Use it. - -2001-02-23 Simon Josefsson - - * gnus-msg.el (gnus-post-method): Fix documentation to reflect - change of default value to `current'. - -2001-02-23 08:00:00 ShengHuo ZHU - - * nneething.el (nneething-get-head): Insert unreadable file too. - -2001-02-22 23:00:00 ShengHuo ZHU - - * gnus-sum.el (gnus-summary-insert-articles): Remove fetched headers. - - * webmail.el (webmail-type-definition): Deja is bought by google. - -2001-02-22 22:00:00 ShengHuo ZHU - - * gnus-sum.el (gnus-fetch-headers): New. - (gnus-select-newsgroup): Use it. - (gnus-summary-insert-articles): New. - (gnus-summary-insert-old-articles): New. - (gnus-summary-insert-new-articles): New. - - * gnus-group.el (gnus-group-prepare-flat-list-dead): Use decoded-name. - (gnus-group-list-active): Ditto. - * gnus-sum.el (gnus-set-mode-line): Ditto. - (gnus-summary-read-group-1): Ditto. - -2001-02-21 15:00:00 ShengHuo ZHU - - * gnus-topic.el (gnus-topic-get-new-news-this-topic): Redraw the - current topic. - -2001-02-21 01:00:00 ShengHuo ZHU - - * smiley.el (gnus-smiley-display): Don't do widening. - - * smiley-ems.el (gnus-smiley-display): Don't do widening. Smiley - within body. - - * gnus-msg.el (gnus-inews-do-gcc): Activate group anyway. - - * gnus-art.el (gnus-mime-display-multipart-alternative-as-mixed): - New. - (gnus-mime-display-multipart-related-as-mixed): New. - (gnus-mime-display-part): Use them. - -2001-02-20 16:00:00 ShengHuo ZHU - - * gnus-start.el (gnus-setup-news): Allow gnus-group-line-format to be - something special. - -2001-02-20 00:00:00 ShengHuo ZHU - - * nnweb.el (nnweb-request-group): Set nnweb-group anyway. - (nnweb-request-article): Call reference if exists. - (nnweb-type-definition): Dejanews is bought by google.com. - Beta! - -2001-02-19 19:00:00 ShengHuo ZHU - - * gnus-draft.el (gnus-draft-reminder): "Confirm to exit?" - -2001-02-19 Kai Gro,A_(Bjohann - - * gnus-sum.el (gnus-thread-sort-functions): Doc fix. Refer to - gnus-article-sort-functions. - (gnus-article-sort-functions): Doc fix. Refer to - gnus-thread-sort-functions. - -2001-02-18 20:00:00 ShengHuo ZHU - From Paul Jarc . - - * message.el (message-get-reply-headers): More fixes. - -2001-02-17 Paul Jarc - Committed by ShengHuo ZHU - - * message.el (message-get-reply-headers): Fix bug with - Mail-Followup-To/to-address interaction. - -2001-02-17 13:00:00 ShengHuo ZHU - - * gnus-msg.el (gnus-configure-posting-styles): Match header in - gnus-article-copy. - -2001-02-16 22:00:00 ShengHuo ZHU - - * message.el (message-do-send-housekeeping): Rename to a better - name. - -2001-02-16 18:00:00 ShengHuo ZHU - - * message.el (message-cancel-news): Check article first, then ask - yes or no. - -2001-02-16 14:00:00 ShengHuo ZHU - - * mm-uu.el (mm-uu-type-alist): Add emacs-sources. - -2001-02-16 11:00:00 ShengHuo ZHU - - * gnus-range.el (gnus-range-normalize): New function. - -2001-02-15 NAGY Andras - - * imap.el (imap-gssapi-open): Set imap-c-l-s-first. - -2001-02-14 21:00:00 ShengHuo ZHU - - * gnus-srvr.el (gnus-server-regenerate-server): Use gnus-get-function. - - * nnagent.el (nnagent-request-regenerate): New. - - * nnfolder.el (nnfolder-request-regenerate): Deffoo. - - * nnml.el (nnml-generate-nov-databases): Accept argument - server. Don't open server if it is opened. - (nnml-request-regenerate): Use it. Change to deffoo. - -2001-02-14 Katsumi Yamaoka - Committed by ShengHuo ZHU - - * gnus.el (gnus-define-group-parameter): Fix. - -2001-02-14 15:00:00 ShengHuo ZHU - - * gnus.el (gnus-define-group-parameter): Improved. - - * gnus-sum.el (charset): Define parameter. - (ignored-charsets): Ditto. - (gnus-summary-setup-default-charset): Use them. - - * gnus-start.el (gnus-read-descriptions-file): Use them. - - * gnus-cus.el (gnus-group-parameters): Remove them. - -2001-02-14 00:00:00 ShengHuo ZHU - - * gnus-sum.el (gnus-summary-print-article): Redo highlight. - -2001-02-13 21:00:00 ShengHuo ZHU - - * gnus-sum.el (gnus-summary-read-group-1): Remove - gnus-summary-set-local-parameters. - (gnus-summary-setup-buffer): Put it here. - -2001-02-13 20:00:00 ShengHuo ZHU - - * gnus.el (to-address): Define parameter. - (to-list): Ditto. - * gnus-art.el (article-hide-boring-headers): Use them. - * gnus-msg.el (gnus-post-news): Ditto. - * gnus-cus.el (gnus-group-parameters): Remove them. - -2001-02-13 19:00:00 ShengHuo ZHU - - * gnus-draft.el (gnus-draft-reminder): New. - - * gnus-art.el (gnus-sender-save-name): New. - -2001-02-13 18:00:00 ShengHuo ZHU - - * mm-util.el (mm-mime-charset): Error message. - -2001-02-13 11:00:00 ShengHuo ZHU - - * message.el (message-check-news-body-syntax): Don't check mml lines. - -2001-02-12 11:00:00 ShengHuo ZHU - - * gnus-topic.el (gnus-subscribe-topics): Return nil if not - subscribe. - - * gnus-start.el (gnus-call-subscribe-functions): New. - (gnus-find-new-newsgroups): Use it. - (gnus-ask-server-for-new-groups): Use it. - (gnus-check-first-time-used): Use it. - (gnus-subscribe-newsgroup-method): Grok a list of functions. - (gnus-subscribe-options-newsgroup-method): Ditto. - (gnus-subscribe-hierarchically): Return gnus-subscribe-newsgroup's - return . - -2001-02-12 Kai Gro,A_(Bjohann - - * gnus-cus.el (gnus-score-customize): Doc fix. - -2001-02-11 Jesper Harder - - * dgnushack.el (my-getenv): Typo. - -2001-02-11 11:00:00 ShengHuo ZHU - - * dgnushack.el (dgnushack-make-load): Don't autoload smiley functions. - -2001-02-11 09:00:00 ShengHuo ZHU - - * gnus-group.el (gnus-group-suspend): Offer save summaries. - - * gnus-art.el (gnus-treat-leading-whitespace): New. - (gnus-treatment-function-alist): Use it. - (article-remove-leading-whitespace): New. - (gnus-article-make-menu-bar): Use it. - - * gnus-sum.el (gnus-summary-wash-empty-map): Add - remove-leading-whitespace. - (gnus-summary-wash-map): Bind strip-headers-in-body to `W a', - because of conflict. - -2001-02-09 23:00:00 ShengHuo ZHU - - * Makefile.in: Hack generating gnus-load.el. - * dgnushack.el: Ditto. - * gnus-load.el: Remove it. - -2001-02-09 20:00:00 ShengHuo ZHU - - * dgnushack.el : Add URLDIR. - - * Makefile.in (EMACS_COMP): Ditto. - -2001-02-09 19:00:00 ShengHuo ZHU - - * gnus-cus.el (gnus-score-customize): Error on no score file. - -2001-02-09 08:00:00 ShengHuo ZHU - - * mm-decode.el (mm-merge-handles): New function. - - * mm-view.el (mm-inline-message): Use it. - (mm-view-message): Ditto. - - * mm-partial.el (mm-inline-partial): Ditto. - - * mm-extern.el (mm-inline-external-body): Ditto. - - * gnus-art.el (gnus-mime-view-part): Ditto. - (gnus-mime-view-part-as-type): Ditto. - (gnus-mime-save-part-and-strip): Prevent users to strip in some - cases. - -2001-02-08 20:00:00 ShengHuo ZHU - - * message.el (message-cancel-news): Allow to shoot foot. - (message-supersede): Ditto. - -2001-02-08 Tommi Vainikainen - - * gnus-sum.el (gnus-simplify-subject-re): Use - message-subject-re-regexp. - -2001-02-08 18:00:00 ShengHuo ZHU - - * nnmail.el (nnmail-expiry-target-group): Bind - nnmail-cache-accepted-message-ids to nil. - - * gnus-xmas.el (gnus-xmas-article-display-xface): Use binary - coding system. - -2001-02-07 23:00:00 ShengHuo ZHU - - * qp.el (quoted-printable-encode-region): Make sure characters are - between 00 and FF. Don't check charset. - - * mm-encode.el (mm-encode-content-transfer-encoding): Use unibyte - in Emacs 20. - * rfc2047.el (rfc2047-q-encode-region): Ditto. - -2001-02-07 11:00:00 ShengHuo ZHU - - * message.el (message-make-forward-subject): Argument decoded. - (message-forward): Use it when digest. - - * gnus-uu.el (gnus-uu-grab-articles): Shoot down original article - buffer. - -2001-02-07 Kai Gro,A_(Bjohann - - * message.el (message-generate-headers-first): Doc fix. - -2001-02-07 10:00:00 ShengHuo ZHU - - * gnus-art.el (article-make-date-line): Error proof. - -2001-02-06 21:00:00 ShengHuo ZHU - - * gnus-group.el (gnus-group-listing-limit): New. - (gnus-group-prepare-flat-list-dead): Use old trick to speed up. - - * gnus-topic.el (gnus-group-prepare-topics): Use gnus-killed-hashtb. - -2001-02-06 18:00:00 ShengHuo ZHU - - * message.el (message-newline-and-reformat): Special case for - breaking at BOL. - -2001-02-06 Per Abrahamsen - - * gnus-uu.el (gnus-uu-save-article): Make the topics summary a - message/rfc822. - -2001-02-06 09:00:00 ShengHuo ZHU - - * message.el (message-encode-message-body): Don't insert - Content-Type if it is inside a mail. - -2001-02-06 02:00:00 ShengHuo ZHU - - * gnus-xmas.el (gnus-xmas-article-menu-add): Add - gnus-article-commands-menu. - - * gnus-sum.el (gnus-summary-make-menu-bar): Don't share menu bar - in Emacs. - - * gnus-start.el (gnus-read-descriptions-file): Use - gnus-group-name-charset and gnus-group-charset-alist. - -2001-02-04 23:00:00 ShengHuo ZHU - - * gnus-sum.el (gnus-summary-mark-as-processable): Understand - active region. - - * gnus-start.el (gnus-group-change-level): Remove from both - gnus-zombie-list and gnus-killed-list. - -2001-02-04 11:00:00 ShengHuo ZHU - - * gnus-start.el (gnus-subscribe-options-newsgroup-method): Add - gnus-subscribe-topics. - - * gnus-cus.el (gnus-extra-topic-parameters): Fix doc. - -2001-02-04 11:00:00 ShengHuo ZHU - - * gnus-art.el (gnus-article-make-menu-bar): Make - gnus-article-post-menu. - - * gnus-xmas.el (gnus-xmas-article-menu-add): Add post menu. - - * gnus-sum.el (gnus-summary-make-menu-bar): Use t if XEmacs. - - * gnus-group.el (gnus-group-make-menu-bar): Ditto. - - * message.el (message-mode-menu): Ditto. - - * gnus-art.el (defvar): eval-when-compile. - -2001-02-02 17:00:00 ShengHuo ZHU - - * gnus-agent.el (gnus-agentize): Fix doc. - -2001-02-02 Karl Kleinpaste - - * mml.el (mml-preview): Bind `q'. - -2001-02-02 12:00:00 ShengHuo ZHU - - * mm-util.el (mm-mime-mule-charset-alist): non-Mule case. - -2001-01-31 Dave Love - - * mm-util.el (mm-mime-mule-charset-alist) - (mm-find-mime-charset-region): Consider mule-utf-8. - -2001-01-31 Dave Love - - * gnus-art.el (gnus-article-x-face-command) - (gnus-treat-display-xface, gnus-treat-display-smileys): Add - :version. - -2001-01-26 Dave Love - - * mm-util.el (mm-multibyte-string-p): New. - -;; * qp.el: Remove un-logged bogus changes from 2000-12-20. -;; (quoted-printable-encode-region): Doc fix. Don't call -;; string-as-multibyte on class. Clarify line-folding. - (quoted-printable-encode-string): Make temp buffer inherit - string's multibyteness. - -2001-01-23 Gerd Moellmann - - * nnheader.el (toplevel): Don't require `gnus-util' at - compile-time; this creates a circular dependency, and prevents - a bootstrap. - -2001-01-22 Andreas Schwab - - * nnheader.el (gnus-delete-line): Autoload it as a macro. - -2001-01-31 18:00:00 ShengHuo ZHU - - * nnmail.el (nnmail-remove-list-identifiers): Use consp. - - * gnus-art.el (article-hide-list-identifiers): Ditto. - - * gnus-sum.el (gnus-summary-remove-list-identifiers): Ditto. - -2001-01-31 15:00:00 ShengHuo ZHU - - * gnus-sum.el (gnus-summary-remove-list-identifiers): Similar. - - * gnus-art.el (article-hide-list-identifiers): Similar. - -2001-01-31 Karl Kleinpaste - - * nnmail.el (nnmail-remove-list-identifiers): Improved. - -2001-01-31 09:00:00 ShengHuo ZHU - - * gnus-score.el (gnus-summary-score-entry): match may be an integer. - -2001-01-30 10:00:00 ShengHuo ZHU - - * gnus-util.el (gnus-string-equal): New function. - - * gnus-art.el (article-hide-boring-headers): Use it. - -2001-01-27 Karl Kleinpaste - - * gnus-art.el (gnus-article-banner-alist): eGroups new banner. - -2001-01-27 00:00:00 ShengHuo ZHU - - * gnus-msg.el (gnus-msg-mail): Support switch-action. - -2001-01-26 08:00:00 ShengHuo ZHU - - * gnus-art.el (gnus-summary-save-in-pipe): Prompt for saving - command if there is not last-saver. - -2001-01-24 19:00:00 ShengHuo ZHU - - * nntp.el (nntp-open-connection): 201 is possible. - -2001-01-24 18:00:00 ShengHuo ZHU - - * rfc2047.el (rfc2047-encode): MIME charset is not coding system. - (rfc2047-charset-encoding-alist): Add big5. - -2001-01-24 17:00:00 ShengHuo ZHU - - * gnus-agent.el (gnus-agent-add-server): Redraw the line. - (gnus-agent-remove-server): Ditto. - (autoload): gnus-server-update-server. - - * gnus-srvr.el (gnus-server-line-format): Add %a. - (gnus-server-line-format-alist): Add gnus-tmp-agent. - (gnus-server-insert-server-line): Use it. - -2001-01-24 09:00:00 ShengHuo ZHU - - * mm-util.el (mm-mime-mule-charset-alist): Preferred MIME names - GB2312 and Big5. - -2001-01-24 Simon Josefsson - - * mail-source.el (mail-sources): Add :program specifier to IMAP - mail source. - (mail-source-fetch-imap): Map :program to `imap-shell-program'. - -2001-01-24 08:00:00 ShengHuo ZHU - - * gnus-score.el (gnus-score-lower-thread): Fix a doc typo. - -2001-01-24 12:22:47 Lars Magne Ingebrigtsen - - * nntp.el (nntp-wait-for): Return the success code. - (nntp-open-connection): Use it. - -2001-01-11 11:49:02 Lars Magne Ingebrigtsen - - * gnus-int.el (gnus-check-server): Allow breaking the opening. - -2001-01-23 11:00:00 ShengHuo ZHU - - * gnus-sum.el (gnus-summary-print-article): Remove process mark. - -2001-01-22 17:00:00 ShengHuo ZHU - - * gnus-sum.el (gnus-summary-print-article): Take one prefix - argument. Allow to print several articles in one file. - -2001-01-21 12:00:00 ShengHuo ZHU - - * webmail.el (webmail-type-definition): netaddress changes. - -2001-01-21 00:00:00 ShengHuo ZHU - - * gnus.el: Fix copyright. Remove trailing spaces. - - * message.el (message-forward): Use mule4. - -2001-01-20 09:00:00 ShengHuo ZHU - - * mm-util.el (mm-string-as-unibyte): New. - - * message.el (message-forward): Use it. - -2001-01-19 23:00:00 ShengHuo ZHU - - * message.el (message-cite-original-without-signature): Don't peel - off the blank line. - (message-get-reply-headers): Add Cc if it is not in follow-to. - -2001-01-20 Simon Josefsson - - * mm-decode.el (mm-handle-multipart-from): Add. - (mm-dissect-buffer): Save From: header value. - (mm-security-from): Remove. - (mm-possibly-verify-or-decrypt): Don't set mm-security-from. - - * mml-smime.el (mml-smime-verify): Use `mm-handle-multipart-from' - instead of `mml-security-from'. Protect null from value. - -2001-01-20 Simon Josefsson - - * mailcap.el (mailcap-mime-data): Run `gnumeric' on - application/vnd.ms-excel attachments. - -2001-01-19 Simon Josefsson - - * gnus-art.el (gnus-button-alist): Add `?=' to mailto URL regexp. - -2001-01-19 13:00:00 ShengHuo ZHU - - * message.el (message-ignored-mail-headers): Ditto. - -2001-01-19 Simon Josefsson - - * message.el (message-ignored-news-headers): Only search beginning - of line. - -2001-01-19 Alberto Lusiani - - * message.el (message-send-mail): Content-Type may not be there. - -2001-01-18 23:00:00 ShengHuo ZHU - - * gnus-ems.el (gnus-article-display-xface): Add BUFFER. - * gnus-xmas.el (gnus-xmas-article-display-xface): Ditto. - - * gnus-art.el (article-display-x-face): Insert X-Face if there is - not. - -2001-01-18 19:00:00 ShengHuo ZHU - - * gnus-sum.el (gnus-summary-read-group-1): Don't test dead - non-native groups. - -2001-01-18 18:00:00 ShengHuo ZHU - - * message.el (message-yank-original): Understand - universal-argument. - -2001-01-18 16:00:00 ShengHuo ZHU - - * gnus-art.el (gnus-boring-article-headers): Add to-address. - (article-hide-boring-headers): Ditto. - - * mm-view.el (mm-inline-message): Insert a newline unless bolp. - -2001-01-18 08:00:00 ShengHuo ZHU - - * rfc2047.el (rfc2047-fold-region): Don't insert LWSP if there is - one. - -2001-01-16 Simon Josefsson - - * message.el (message-make-in-reply-to): Add comment to message-id - (old syntax, see 2000-08-02 change). - -2001-01-16 13:00:00 ShengHuo ZHU - - * gnus-art.el (gnus-url-mailto): Use gnus-msg-mail. - (gnus-button-mailto): Setup message. Moved to gnus-msg.el. - (gnus-button-reply): Ditto. - -2001-01-16 Katsumi Yamaoka - - * gnus-art.el (article-display-x-face): Fix. - -2001-01-15 16:00:00 ShengHuo ZHU - - * gnus-art.el (article-display-x-face): Use - gnus-original-article-buffer. - -2001-01-15 Jack Twilley - - * message.el (message-add-header): Move to point-max. - -2001-01-15 Simon Josefsson - - * smime.el (smime-CA-directory, smime-CA-file): Change default to - nil, improve documentation. - (smime-certificate-directory): Comment out false hints (until it - is implemented). - - * mml-smime.el (mml-smime-sign): Place user in customize buffer if - there aren't any keys. - (mml-smime-verify): If smime-CA-{file,directory} set, also try to - verify certificate. Default is changed to only check integrity. - Improved security status texts. If a certificate doesn't contain - a email address, don't fail. - - * smime.el (smime-noverify-region): - (smime-noverify-buffer): New functions. Verifies integrity only. - -2001-01-12 22:00:00 ShengHuo ZHU - - * gnus-group.el (gnus-group-sort-by-score): Reverse order. - -2001-01-12 17:00:00 ShengHuo ZHU - - * gnus-win.el (gnus-configure-windows): switch-to-buffer in XEmacs. - (gnus-remove-some-windows): Ditto. - -2001-01-12 14:00:00 ShengHuo ZHU - - * gnus-art.el (article-make-date-line): 11th. - -2001-01-11 23:00:00 ShengHuo ZHU - - * mml2015.el (mml2015-gpg-encrypt): Remove CR. - (mml2015-gpg-sign): Ditto. - -2001-01-10 14:00:00 ShengHuo ZHU - - * gnus.el: Sync with EMACS_PRETEST_21_0_95. - * gnus.el (gnus-default-posting-charset): Bogus. Removed. - -2001-01-08 Dave Love - - * mm-encode.el (mm-qp-or-base64): Don't base64 for the sake of a - single character. - - * mm-util.el (mm-mime-mule-charset-alist): Add Latin-{8,9}. - - * message.el: Doc and message fixes. - (message-send-rename-function) - (message-make-forward-subject-function) - (message-send-mail-function, message-reply-to-function) - (message-wide-reply-to-function, message-followup-to-function) - (message-distribution-function, message-auto-save-directory): Fix - :type. - - * gnus/mml.el (mml-parse-1): Frob mml-confirmation-set when - proceeding after warnings. Amend multipart warning message. - -2001-01-04 Dave Love - - * gnus-util.el (nnmail-pathname-coding-system): Defvar when - compiling. - (gnus-make-directory): Require nnmail. - - * mm-decode.el (mm-inline-media-tests): Add - image/x-portable-bitmap. - (mm-get-image): Grok pbm. - -2001-01-10 Paul Stevenson - - * nnvirtual.el (nnvirtual-request-expire-articles): delq nil. - -2001-01-09 Didier Verna - - * dgnushack.el (dgnushack-compile): give a dummy value to - `gnus-xmas-glyph-directory' for the time of compilation. - * gnus-agent.el: moved some XEmacs specific hook add-ons from - `gnus-xmas-[re]define' to avoid loosing user custom settings. - * gnus-art.el: ditto. - * gnus-group.el: ditto. - * gnus-salt.el: ditto. - * gnus-sum.el: ditto. - * gnus-topic.el: ditto. - * gnus-xmas.el (gnus-xmas-define): see above. - * gnus-xmas.el (gnus-xmas-redefine): see above. - * gnus-xmas.el (gnus-xmas-glyph-directory): generate a - non-continuable error when the directory can't be found. - -2001-01-09 01:00:00 ShengHuo ZHU - - * mm-decode.el (mm-interactively-view-part): Don't copy-sequence - handle. - * gnus-art.el (gnus-mime-view-part): Copy it. - (gnus-mime-view-part-as-type): Add into gnus-article-mime-handles. - -2001-01-09 Michael Downes - - * gnus-sum.el (gnus-summary-read-group-1): More useful message. - -2001-01-08 23:00:00 ShengHuo ZHU - - * nnmail.el (nnmail-get-new-mail): Find group only if file is not - orig-file. Use ',source. - -2001-01-08 22:00:00 ShengHuo ZHU - - * gnus-xmas.el (gnus-xmas-modeline-glyph): - (gnus-xmas-group-startup-message): - Detect gnus-xmas-glyph-directory when it is nil. - -2001-01-08 09:00:00 ShengHuo ZHU - - * pop3.el (pop3-get-message-count): Andrew Innes - 's patch of 1999-12-01 was not fully committed. - -2001-01-05 06:49:37 Lars Magne Ingebrigtsen - - * gnus-agent.el (gnus-agent-fetch-session): Say what we quit. - - * time-date.el (time-to-number-of-days): New function. - -2001-01-04 11:06:14 Gregory Chernov - - * nnslashdot.el (nnslashdot-request-list): Always get the right - sid. - -2001-01-05 00:00:00 ShengHuo ZHU - - * message.el (message-minibuffer-local-map): New keymap. - (message-read-from-minibuffer): Use it. - * gnus-msg.el (gnus-summary-resend-message): Use it - -2001-01-04 22:00:00 ShengHuo ZHU - - * gnus-start.el (gnus-display-time-event-handler): New function. - (gnus-after-getting-new-news-hook): Use it. - -2001-01-03 07:26:58 Lars Magne Ingebrigtsen - - * message.el (message-ignored-mail-headers): Add draft header. - -2001-01-02 06:28:28 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-summary-expire-articles): Don't save - excursion. - - * nnslashdot.el (nnslashdot-request-list): Get the right year. - -2001-01-01 00:52:44 Ed L. Cashin - - * gnus-sum.el (gnus-summary-expire-articles): Save excursion. - -2000-12-31 11:00:00 ShengHuo ZHU - - * qp.el (quoted-printable-decode-region): Don't backward-char. - -2000-12-31 03:57:31 Lars Magne Ingebrigtsen - - * gnus-draft.el: Mark articles as replied. - - * gnus-sum.el (gnus-summary-add-mark): New function. - - * gnus-group.el (gnus-add-mark): New function. - - * gnus-sum.el (gnus-summary-buffer-name): New function. - (gnus-summary-setup-buffer): Use it. - - * gnus-draft.el: Set things up with the right post method and - stuff. - - * message.el (message-ignored-news-headers): Remove X-Draft-From. - - * gnus-msg.el (gnus-inews-insert-draft-meta-information): New function. - - * gnus.el (gnus-draft-meta-information-header): New variable. - -2000-12-30 00:17:38 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-treatment-function-alist): Move the date - functions before the header sorting functions. - - * mm-uu.el (mm-uu-pgp-signed-extract-1): Unquote "- " quotes. - - * dgnushack.el (dgnushack-compile): Message whether there is w3. - Don't (push "/usr/share/emacs/site-lisp" load-path). - - * gnus-cite.el (gnus-article-fill-cited-article): Don't add space - to empty fill prefixes. - -2000-12-30 10:00:00 ShengHuo ZHU - - * nntp.el (nntp-open-connection): Kill pbuffer if process is nil. - Suggested by Christoph Conrad . - -2000-12-30 09:00:00 ShengHuo ZHU - - * nnheader.el (autoload): Autoload gnus-sorted-intersection. - - * nnml.el (autoload): Move to nnheader.el. - - * nnfolder.el (nnfolder-existing-articles): Reversed, i.e. sorted. - (nnfolder-request-expire-articles): Use gnus-sorted-intersection. - (nnfolder-retrieve-headers): Use intersection. Suggested by Jonas - Kvarnstr,Av(Bm . - -2000-12-30 00:17:38 Lars Magne Ingebrigtsen - - * gnus-art.el (article-make-date-line): Get the hours right. - (gnus-ignored-headers): More hiding. - - * nnmail.el (nnmail-expiry-wait): Not an integer. - - * message.el (message-goto-body): Only expand abbrev when called - interactively. - (message-make-lines): Use it. - -2000-12-29 20:00:00 ShengHuo ZHU - - * gnus-msg.el (gnus-inews-yank-articles): Reparse headers. - -2000-12-30 00:17:38 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-summary-limit-include-expunged): Really - include the expunged articles. - - * gnus-group.el (gnus-group-sort-by-server): New function. - - * gnus.el (gnus-method-to-server-name): New function. - (gnus-group-prefixed-name): Use it. - - * gnus-group.el (gnus-group-sort-function): Doc fix. - (gnus-group-sort-groups-by-server): New command. - -2000-12-29 13:25:10 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-treat-date-english): New variable. - (article-date-english): New command. - (gnus-english-month-names): New variable. - (article-make-date-line): Do 'english. - - * gnus-cite.el (gnus-article-fill-cited-article): Add a space - after the fill prefix. - - * gnus-sum.el (gnus-summary-make-menu-bar): Removed "Enter - score...". - - * gnus-art.el (gnus-ignored-headers): Hide more headers. - - * message.el (message-mode-map): Bind comment-region. - - * gnus-art.el (gnus-mime-display-part): Let w3 display - multipart/related. - - * mm-bodies.el (mm-long-lines-p): New function. - (mm-body-encoding): Use it. - (mm-body-encoding): Encode articles with lines longer than 1000 - characters. - -2000-12-29 01:00:00 ShengHuo ZHU - - * mm-util.el (mm-enable-multibyte): Use - default-enable-multibyte-characters. - (mm-enable-multibyte-mule4): Ditto. - (mm-disable-multibyte): Test XEmacs. - (mm-disable-multibyte-mule4): Ditto. - (mm-with-unibyte-current-buffer): Simplified. - (mm-with-unibyte-current-buffer-mule4): Ditto. - -2000-12-28 19:44:56 Lars Magne Ingebrigtsen - - * nnheaderxm.el (nnheader-string-as-multibyte): New alias. - - * nnheader.el (nnheader-string-as-multibyte): New alias. - - * mm-view.el (mm-inline-text): Warn when bugging out in w3. - - * gnus-uu.el (gnus-message-process-mark): New function. - (gnus-uu-mark-by-regexp): Use it. - (gnus-new-processable): New function. - -2000-12-28 19:21:57 Inge Frick - - * gnus-sum.el (gnus-no-mark): New variable. - -2000-11-01 01:12:29 Lars Magne Ingebrigtsen - - * nnwfm.el (nnwfm-create-mapping): Remove quote marks and - backslashes. - -2000-12-26 Katsumi Yamaoka - - * gnus-art.el (gnus-article-banner-alist): Remove duplicate - definition. - -2000-12-25 00:00:00 ShengHuo ZHU - - * dgnushack.el (dgnushack-compile): elc is in the current directory. - - * qp.el (quoted-printable-encode-region): Don't check multibyte in - XEmacs. - -2000-12-25 Lloyd Zusman - - * mml.el (mml-read-tag): Save tag location. - -2000-12-25 Simon Josefsson - - * starttls.el: Sync with Emacs 21. - -2000-12-24 11:00:00 ShengHuo ZHU - - * message.el (message-mail): Support yank-action. - - * message.el (message-setup): Revoke the last change. - -2000-12-24 01:00:00 ShengHuo ZHU - - * message.el (message-setup): Use cons. Suggested by Johan Vromans - . - -2000-12-24 Simon Josefsson - - * mm-bodies.el (mm-decode-content-transfer-encoding): Preserve - mailing list junk at end of part. - -2000-12-23 Simon Josefsson - - * nnimap.el (nnimap-expiry-target): New function. - (nnimap-request-expire-articles): Use it. - -2000-12-22 21:00:00 ShengHuo ZHU - - * gnus.el (gnus-group-parameters-more): New variable. - * gnus-cus.el (gnus-group-customize): Use it. - - * gnus.el (gnus-define-group-parameter): New macro. - (auto-expire): Use it - (total-expire): Use it. - * gnus-art.el (banner): Use it. - - * mml.el (mml-parse): save-excursion. Suggested by Lloyd Zusman - . - -2000-12-22 12:00:00 ShengHuo ZHU - - * gnus-topic.el (gnus-topic-create-topic): Use list. - - * gnus-vm.el (gnus-summary-save-article-vm): Require gnus-art - before binding gnus-default-article-saver. - - * gnus-sum.el (gnus-summary-save-article): - (gnus-summary-pipe-output): - (gnus-summary-save-article-mail): - (gnus-summary-save-article-rmail): - (gnus-summary-save-article-file): - (gnus-summary-write-article-file): - (gnus-summary-save-article-body-file): Ditto. - - * gnus-mh.el (gnus-summary-save-article-folder): Ditto. - -2000-12-22 10:00:00 ShengHuo ZHU - - * gnus-art.el (gnus-mime-security-button-map): - (gnus-mime-button-map): Add parent. - -2000-12-22 09:00:00 ShengHuo ZHU - - * messagexmas.el (message-xmas-redefine): New function. - - * message.el: Use it. - - * gnus-art.el (gnus-article-check-hidden-text): Return t. - - * gnus-util.el (gnus-remove-text-properties-when): Return t. - -2000-12-22 03:00:00 ShengHuo ZHU - - * mm-decode.el (mm-dissect-multipart): Avoid errors owing to - malformatted messages. - -2000-12-22 02:00:00 ShengHuo ZHU - - * mm-util.el (mm-image-load-path): New function. - - * gnus-group.el (gnus-group-make-tool-bar): Use it. - - * gnus-sum.el (gnus-summary-make-tool-bar): Use it. - - * message.el (message-tool-bar-map): Use it. - - * Makefile.in (install-el): New. - -2000-12-21 Katsumi Yamaoka - - * gnus-art.el (article-treat-dumbquotes): Quote \. - -2000-12-21 22:00:00 ShengHuo ZHU - - * gnus-art.el (gnus-treat-emphasize): Don't treat emphasis if - Emacs 20 runs on a terminal. - -2000-12-21 14:00:00 ShengHuo ZHU - - * gnus-msg.el (gnus-bug): Revert to save-excursion. - - * mml.el (gnus-add-minor-mode): Autoload. - - * message.el (message-forward): Save-restriction. - -2000-12-21 Kai Gro,A_(Bjohann - - * gnus-art.el (article-treat-dumbquotes): More doc, provided by - Paul Stevenson - -2000-12-21 10:00:00 ShengHuo ZHU - - * gnus-ml.el (gnus-mailing-list-mode-map): Use C-c C-n prefix. - - * mml.el (gnus-ems): Don't require. - - * gnus.el (gnus-decode-rfc1522): Removed. - (gnus-set-text-properties): Define. - -2000-12-21 09:00:00 ShengHuo ZHU - - * gnus-art.el (gnus-mime-*): handle may be nil. - - * gnus-sum.el (gnus-summary-mode): Turn on gnus-mailing-list-mode. - - * gnus.el (gnus-group-remove-excess-properties): Not defined - in gnus-xmas. - -2000-12-20 21:00:00 ShengHuo ZHU - - * message.el (message-mail-user-agent): Add :version. - -2000-12-21 Miles Bader - - * message.el (message-mode): Set `comment-start' to the yank prefix. - -2000-12-20 17:00:00 ShengHuo ZHU - - * message.el (message-mail-user-agent): New variable. - (message-setup): Renamed to message-setup-1. Support - mail-user-agent. - (message-mail-user-agent): New function. - (message-mail): Use it. - (message-reply): Use it. - (message-resend): Use it. - (message-mail-other-window): Use it. - (message-mail-other-frame): Use it. - - * gnus-msg.el (gnus-bug): Support mail-user-agent. - -2000-12-20 15:00:00 ShengHuo ZHU - - * message.el (message-tool-bar-map): Simplify. - (message-narrow-to-head-1): New function. - (message-narrow-to-head): Use it. - (message-reply): Ditto. - (message-cancel-news): Ditto. - (message-supersede): Ditto. - (message-make-forward-subject): Ditto. - (message-bounce): Ditto. - -2000-12-20 11:00:00 ShengHuo ZHU - - * uudecode.el (uudecode-decode-region-external): make-temp-file - may not be defined. - - * binhex.el (defalias): eval-and-compile. - - * message.el (message-tool-bar-map): New function. - (message-mode): Use it. - -2000-12-20 09:00:00 ShengHuo ZHU - - * nntp.el (nntp-find-connection): Remove the entry. - (nntp-retrieve-groups): (gnus-buffer-live-p buf). - -2000-12-20 05:00:00 ShengHuo ZHU - - * gnus-msg.el (gnus-summary-mail-forward): Use original buffer. - - * message.el (message-forward): Copy buffer in unibyte mode. - -2000-12-20 04:00:00 ShengHuo ZHU - - * message.el (message-make-forward-subject): Don't widen. Decode. - (message-forward): Don't decode subject. - -2000-12-20 Christoph Conrad - - * qp.el (quoted-printable-encode-region): Upcase QP. - -2000-12-20 03:00:00 ShengHuo ZHU - - * mm-decode.el (mm-possibly-verify-or-decrypt): Use - mail-extract-a-c instead. Don't depend on Gnus. - - * mml.el (gnus-ems): Require it. - - * gnus-msg.el (gnus-summary-mail-forward): - - * message.el (message-forward): Move mime-to-mml here. - -2000-12-20 02:00:00 ShengHuo ZHU - - * gnus-group.el, gnus-sum.el, message.el: Add :help unless Emacs. - * gnus-art.el (gnus-insert-mime-button): Simplify. - (gnus-mime-display-alternative): Ditto. - (gnus-insert-mime-security-button): Ditto. - -2000-12-20 01:00:00 ShengHuo ZHU - - * gnus-util.el (gnus-add-text-properties-when): In XEmacs, - text-property-not-all doesn't return nil when start=mark(end). - (gnus-remove-text-properties-when): Ditto. - -2000-12-20 00:00:00 ShengHuo ZHU - - * gnus-start.el (gnus-group-change-level): Remove group from - gnus-active-hashtb if real killed. - -2000-12-19 22:00:00 ShengHuo ZHU - - * gnus-art.el (gnus-insert-mime-button): Emacs20 needs local-map. - (gnus-mime-display-alternative): Ditto. - (gnus-insert-mime-security-button): Ditto. - -2000-12-19 21:00:00 ShengHuo ZHU - - * gnus-start.el (gnus-group-change-level): Don't add it into - killed-list if it was killed. - -2000-12-19 19:00:00 ShengHuo ZHU - - * nnmbox.el (nnmbox-file-coding-system): Use binary. - (nnmbox-active-file-coding-system): Ditto. - - * gnus-cus.el (gnus-group-parameters): Add posting-style. - -2000-12-19 18:00:00 ShengHuo ZHU - - * gnus.el (gnus-version): - (gnus-version-number): Set to Oort Gnus 0.01. - - * gnus-art.el (gnus-mime-security-button-map): - (gnus-insert-mime-security-button): Fix for Emacs21. - -2000-12-19 17:00:00 ShengHuo ZHU - - * gnus-group.el, gnus-sum.el, message.el: Comment out :help in - easymenu, because XEmacs doesn't understand :help. - - * mm-uu.el: Require binhex. - -2000-12-19 16:00:00 ShengHuo ZHU - - * gnus.el: Merged. Emacs21 CVS tag is zsh-merge-ognus-1. - -2000-12-19 ShengHuo ZHU - - * mm-util.el (mm-charset-synonym-alist): Fix a typo. - -2000-12-18 Gerd Moellmann - - * *.xpm, *.pbm: Convert icons icons to size 24x24. - -2000-12-18 Dave Love - - * gnus-msg.el (news-setup, news-reply-mode): Don't autoload - (unused). - -2000-12-13 Miles Bader - - * smiley-ems.el (smiley-region): Bind `inhibit-point-motion-hooks' - to t, so that we don't get stuck while trying to smilefy - intangible text. - -2000-12-12 Gerd Moellmann - - * smiley-ems.el (smiley-regexp-alist): Make regexps match - at the end of the buffer. - (smiley-region): In the loop, move to the end of the submatch - matching the smiley instead of using the end of the match - of the whole regexp. - -2000-12-12 Eli Zaretskii - - * message.el (message-mode): Doc fix. - -2000-12-12 Gerd Moellmann - - * smiley-ems.el (smiley-region): Doc fix. - -2000-12-11 Miles Bader - - * gnus-sum.el (gnus-summary-recenter): When trying to keep the - bottom line visible, check to see if it's partially obscured, and - if so, either scroll one more line to make it fully visible, or - revert to showing the second line from the top. - -2000-12-07 Dave Love - - * mailcap.el (mailcap-download-directory) - * gnus-audio.el (gnus-audio-directory) - * smiley-ems.el (smiley-data-directory): Fix :type. - -2000-11-30 Dave Love - - * message.el (message-auto-save-directory): Use - file-name-as-directory. - (message-set-auto-save-file-name): Create - message-auto-save-directory if necessary. - (message-replace-chars-in-string): Removed -- unused. - (message-mail-alias-type): Customize. - (message-headers): Remove duplicate defgroup. - -2000-11-29 Dave Love - - * qp.el (quoted-printable-decode-region): Use error, not message - to report malformed text (like base64). Amend message. - -2000-11-29 Miles Bader - - * message.el (message-header-lines): Fontify tag. - -2000-11-27 Dave Love - - * nnlistserv.el: Ignore errors when requiring nnweb and avoid a - compiler warning. - -;2000-11-26 Dave Love -; -; * mm-uu.el (mm-uu-configure-list): Fix typo in :type. -; -2000-11-23 Dave Love - - * uu-post.pbm, uu-decode.pbm: new files from XPMs. - - * mm-uu.el (uudecode): Require. - (uudecode-decode-region, uudecode-decode-region-external): Don't - autoload. - (mm-uu-copy-to-buffer): Doc fix. - (mm-uu-decode-function, mm-uu-binhex-decode-function): Doc, custom - type fix. - - * mailcap.el: Doc fixes. - (mailcap-mime-data): Various adjustments. - (mailcap): New group. - (mailcap-download-directory): Customize. - (mailcap-generate-unique-filename, mailcap-binary-suffixes) - (mailcap-temporary-directory): Deleted (unused). - (mailcap-unescape-mime-test): Simplify slightly. - (mailcap-viewer-passes-test): Use functionp. - (mailcap-command-p): Aliased to executable-find. - - * rfc2047.el (rfc2047-encode-message-header): Don't encode if - default-enable-multibyte-characters is nil. - -2000-11-22 Gerd Moellmann - - * gnus-group.el (gnus-group-make-tool-bar): Fix a paren typo. - -2000-11-21 Dave Love - - * gnus-art.el (gnus-mime-button-map): Don't inherit from - gnus-article-mode-map. -; (gnus-mime-button-menu): Use mouse-set-point. - (gnus-insert-mime-button, gnus-mime-display-alternative) - (gnus-mime-display-alternative): Don't use local-map property. - -2000-11-17 Dave Love - - * uudecode.el (uudecode-insert-char): Fix bogus feature test. - (uudecode-decode-region-external): Doc fix. Use with-temp-buffer - and make-temp-file. - (uudecode-decode-region): Doc fix. - -2000-11-14 Dave Love - - * cu-exit.pbm, exit-summ.pbm, followup.pbm, fuwo.pbm: - * mail-reply.pbm, next-ur.pbm, post.pbm, prev-ur.pbm: - * reply-wo.pbm, reply.pbm, rot13.pbm, save-aif.pbm, save-art.pbm: - New files, derived from the XPMs. - -2000-11-10 Dave Love - - * gnus-agent.el (gnus-agent-confirmation-function): Add :version. - (gnus-agent-lib-file, gnus-agent-load-alist) - (gnus-agent-save-alist, gnus-agent-article-name): Use - expand-file-name. - - * gnus-group.el (gnus-group-name-charset-method-alist): Add - :version. - (nnkiboze-score-file): Defvar when compiling. - - * gnus-start.el (gnus-read-newsrc-file): Add :version. - - * gnus-art.el (gnus-article-banner-alist) - (gnus-emphasize-whitespace-regexp, gnus-ignored-mime-types) - (gnus-article-date-lapsed-new-header) - (gnus-article-mime-match-handle-function, gnus-mime-action-alist) - (gnus-treat-strip-list-identifiers, gnus-treat-date-iso8601) - (gnus-treat-strip-headers-in-body) - (gnus-treat-capitalize-sentences, gnus-treat-play-sounds) - (gnus-treat-translate): Add :version. - (gnus-article-mime-part-function): Fix defcustom. - - * nnmail.el (nnmail-expiry-target) - (nnmail-scan-directory-mail-source-once, nnmail-extra-headers) - (nnmail-split-header-length-limit): Add :version. - - * gnus-sum.el (gnus-auto-expirable-marks) - (gnus-inhibit-user-auto-expire, gnus-list-identifiers) - (gnus-extra-headers, gnus-ignored-from-addresses) - (gnus-newsgroup-ignored-charsets) - (gnus-group-highlight-words-alist) - (gnus-summary-show-article-charset-alist): Add :version. - - * catchup.pbm, describe-group.pbm, exit-gnus.pbm, get-news.pbm: - gnntg.pbm, kill-group.pbm, subscribe.pbm, unsubscribe.pbm: New - files, converted from the XPMs. - - * gnus-cache.el (gnus-cache-active-file): Don't use - file-name-as-directory on directory. - (gnus-cache-file-name): Use expand-file-name, not concat. Don't - use file-name-as-directory on directory. - - * time-date.el (timezone-make-date-arpa-standard): Autoload. - (date-to-time): Use it. - -; * message.el (message-mode) : -; : Use [:alnum:] in regexp range. -; (message-newline-and-reformat): Likewise. - (message-forward-as-mime, message-forward-ignored-headers) - (message-buffer-naming-style, message-default-charset) - (message-dont-reply-to-names, message-send-mail-partially-limit): - Add :version. - - * mm-util.el: Doc fixes. - (mm-mime-charset): Don't use the raw result of - mm-preferred-coding-system. - (mm-with-unibyte-buffer, mm-with-unibyte-current-buffer) - (mm-with-unibyte): Simplify. - - * gnus-int.el (gnus-start-news-server): Use expand-file-name, not - concat. - - * pop3.el (pop3-version): Deleted. - (pop3-make-date): New function, avoiding message-make-date. - (pop3-munge-message-separator): Use it. - -2000-11-09 Dave Love - - * gnus-group.el (gnus-group-make-directory-group) - (gnus-group-fetch-faq): Use expand-file-name. - (gnus-group-fetch-faq): Simplify completing-read form. - - * mm-bodies.el (mm-encode-body): Use mm-multibyte-p, don't just - test for Mule. - - * message.el (tool-bar-map): Defvar when compiling. - - * gnus-setup.el (running-xemacs, gnus-use-installed-tm) - (gnus-tm-lisp-directory): Deleted. - (gnus-use-installed-mailcrypt, gnus-emacs-lisp-directory): Use - (featurep 'xemacs). - (gnus-gnus-lisp-directory, gnus-mailcrypt-lisp-directory) - (gnus-mailcrypt-lisp-directory, gnus-bbdb-lisp-directory): Remove - version numbers from file names. - -2000-11-08 Dave Love - - * mm-view.el: Use featurep for XEmacs test. - (mm-inline-message): Test for `remove-specifier'; don't use - condition-case. - - * mm-bodies.el (mm-encode-body): Use mm-multibyte-p. - - * gnus-score.el (gnus-score-load-file): Use expand-file-name. - (gnus-score-find-bnews): Don't concat "". - - * cu-exit.xpm, prev-ur.xpm, next-ur.xpm, post.xpm, fuwo.xpm: - * followup.xpm, uu-post.xpm, uu-decode.xpm, mail-reply.xpm: - * reply.xpm, reply-wo.xpm, rot13.xpm, save-aif.xpm, save-art.xpm: - * exit-summ.xpm: New files, renamed from icons by Luis Fernandes. - - * gnus-sum.el: Put some defvars in eval-when-compile. - (gnus-summary-mode-hook): Add :options. - (gnus-summary-make-menu-bar): Add some :help, used by tool bar. - (gnus-summary-tool-bar-map): New variable. - (gnus-summary-make-tool-bar): New function. - (gnus-summary-mode): Put kill-all-local-variables first. - - * gnus-group.el (gnus-group-toolbar-map): New variable. - (gnus-group-make-tool-bar): Rewritten. - (gnus-group-mode): Put kill-all-local-variables first. - - * rfc2047.el: Require gnus-util. - - * nnml.el (gnus-sorted-intersection): Autoload. - - * nnheader.el: Wrap subst-char-in-string def in eval-and-compile. - Put some defvars in eval-when-compile. - (gnus-intersection, gnus-sorted-complement): Autoload. - - * imap.el (imap-point-at-eol): New, replacing gnus-point-at-eol. - - * mm-encode.el (mm-body-7-or-8): Autoload. - - * mm-decode.el (mm-insert-inline): Autoload. - - * mml.el: - * message.el: Put some defvars in eval-when-compile. - - * gnus-msg.el: Put some defvars in eval-when-compile. - (gnus-msg-mail): Move after gnus-setup-message. - - * smiley-ems.el (smiley-data-directory, smiley-regexp-alist): Doc fix. - -2000-11-07 Dave Love - - * gnus-util.el (nnheader): Don't require message (recursive - autoload). - - * uudecode.el: Avoid compiler warnings. - - * rfc2047.el: (rfc2047-fold-region): Use gnus-point-at-bol. - (rfc2047-charset-encoding-alist): Add iso-8859-1[45]. - -2000-11-06 Dave Love - - * gnus-salt.el (gnus-binary-mode): Fix call to gnus-add-minor-mode. - - * uudecode.el: Use (featurep 'xemacs). Require cl when compiling. - (uudecode-char-int): New alias, replacing char-int. - (uudecode-decode-region): Don't call buffer-disable-undo. - -; * mm-uu.el (mm-uu-configure): Unquote lambda. -; (mm-uu-configure-list): Doc fix. -; -; * earcon.el (running-xemacs): Don't define. -; -;2000-11-03 Stefan Monnier -; -; * message.el (message-font-lock-keywords): Match a final newline -; to help font-lock's multiline support. -; -2000-11-03 Dave Love - - * gnus-nocem.el (gnus-nocem-check-article-limit): Default to 500. - - * mm-partial.el (mm-inline-partial): Space-prefix temp buffer - name. - - * gnus-cus.el (gnus-group-parameters) : Fix custom type. - : Fix custom type, doc. - - * mm-decode.el (mm-display-external): Space-prefix temp buffer - name. Don't disable undo explicitly. - -;2000-11-02 Dave Love -; -; * message.el (message-font-lock-keywords): Use [:alpha:] for -; cite-prefix. - -2000-11-01 Dave Love - - * rfc2047.el (base64): Require unconditionally. - (message-posting-charset): Defvar when compiling. - (rfc2047-encode-message-header, rfc2047-encodable-p): Require - message. - - * gnus-sum.el (nnoo): Require. - (mm-uu-dissect): Autoload. - - * mml.el (mml-parse-1): Clarify message. - (mml-minibuffer-read-type): Use mailcap-mime-types. - -2000-11-01 Stefan Monnier - - * mml.el: Fix a typo in the requiring of CL. - -2000-11-01 Dave Love - - * utf7.el: Require cl when compiling. - - * binhex.el: Use (featurep 'xemacs). - (binhex-char-int): New alias, replacing char-int. Change callers. - (binhex-decode-region): Simplify work buffer code. - (binhex-decode-region-external): Use expand-file-name, not concat. - -2000-10-30 Dave Love - - * gnus-art.el: Fix 2000-10-27 change properly. - -2000-10-28 Miles Bader - - * gnus-art.el (gnus-read-save-file-name): Remove extraneous paren. - -2000-10-27 Dave Love - - * gnus-group.el (gnus-group-make-menu-bar): Add some :help - strings. - (gnus-group-make-tool-bar): New function. - (gnus-group-mode): Use it. - - * message.el (message-mode-menu): Add some :help strings. - (message-mode) [message-tool-bar-map]: Define tool-bar-map. - (featurep): Use (featurep 'xemacs). Install tool bar for Emacs. - - * catchup.xpm, exit-gnus.xpm, gnntg.xpm, subscribe.xpm: - * describe-group.xpm, get-news.xpm, kill-group.xpm: - * unsubscribe.xpm: New files. Renamed icons from Luis Fernandes. - - * mm-decode.el (mm-valid-and-fit-image-p): Don't test - display-graphic-p here. - -2000-10-27 Miles Bader - - * gnus-ems.el (gnus-ems-redefine): Use (featurep 'xemacs) instead - of the `gnus-xemacs' variable, as the latter has been removed. - * gnus-start.el (gnus-1, gnus-read-descriptions-file): Likewise. - * gnus-art.el (gnus-treat-display-xface) - (gnus-treat-display-smileys, gnus-treat-display-picons) - (gnus-article-read-summary-keys): Likewise. - -2000-10-26 Dave Love - - (defvar): Use rmail-spool-directory unconditionally. - -2000-10-18 Dave Love - - * mm-bodies.el (mm-uu-decode-function) - (mm-uu-binhex-decode-function): Defvar when compiling. - - * gnus-nocem.el (gnus-nocem-issuers): Update. - (gnus-nocem-check-from): New option. - (gnus-nocem-scan-groups): Use it. - (gnus-nocem-check-article): Bind gnus-newsgroup-name. - (gnus-nocem-check-article-limit): Add :version. - -2000-10-16 Stefan Monnier - - * ietf-drums.el (mm-util): Require CL when compiling. - -2000-10-15 Dave Love - - * qp.el: Require mm-util. - -2000-10-13 Dave Love - - * qp.el (quoted-printable-decode-region): Avoid invalid - coding-systems. - -2000-10-12 Gerd Moellmann - - * mm-bodies.el: Don't require `mm-uu' at compile-time; it leads - to a recursive load. - -2000-10-12 Dave Love - - * mm-util.el (mm-charset-synonym-alist): Add windows-1252. - - * gnus.el (gnus-group-startup-message): Check for PBM image. - -2000-10-09 Dave Love - - * mail-source.el (mail-source-fetch-imap): Bind - default-enable-multibyte-characters rather than using - mm-disable-multibyte. - -2000-10-05 Dave Love - - * qp.el (mm-decode-coding-region, mm-encode-coding-region): - Autoload. - (quoted-printable-decode-region): Rename arg which confused - charset with coding-system. Don't use nonascii-insert-offset. - Coding-system encode the region initially. Don't recognize `==' - as valid QP. Coding-system decode the region finally. - (quoted-printable-decode-string): Rename arg which confused - charset with coding-system. - - * mm-bodies.el: Require mm-uu, Don't require qp, uudecode. - (mm-encode-body): Apply mm-charset-to-coding-system to arg of - mm-encode-coding-region. - (mm-decode-body, mm-decode-string): Rename variables which - confused charset with coding-system. - (binhex-decode-region): Don't autoload. - (mm-body-encoding): Require message. - (mm-decode-content-transfer-encoding): Require mm-uu in relevant - cond branches. - - * gnus-art.el (article-de-quoted-unreadable) - (article-de-base64-unreadable): Fold search case - rather than downcasing string. Apply mm-charset-to-coding-system - to arg of quoted-printable-decode-region. - -2000-10-04 Dave Love - - * gnus-ems.el: Don't turn off compiler warnings in local vars. - Require ring when compiling. - (gnus-article-compface-xbm): New variable. - -2000-10-04 Dave Love - - * smiley-ems.el (smiley-regexp-alist, smiley-update-cache): Use - pbm images. - - * frown.pbm, smile.pbm, wry.pbm: New files. - - * frown.xbm, smile.xbm, wry.xbm: Deleted. - -2000-10-03 Dave Love - - * mail-source.el (mail-sources): Revert to nil. - - * nnmail (nnmail-spool-file): Revert to `((file))'. - - * qp.el: Don't require mm-util. - (quoted-printable-decode-region): Rewritten. - (quoted-printable-decode-string, quoted-printable-encode-region): - Doc fix. - (quoted-printable-encode-region): Barf on multibyte characters. - Maybe make the class multibyte. Upcase chars, not formatted - strings. Allow mm-use-ultra-safe-encoding to be unbound. - (quoted-printable-encode-string): Don't use - mm-with-unibyte-buffer. - -2000-09-29 Gerd Moellmann - - * smiley-ems.el (smiley-update-cache): Use `:ascent center'. - -2000-09-21 Dave Love - - * smiley-ems.el (smiley-region): Test if display-graphic-p bound - (for Emacs 20). Tidy somewhat. - -2000-09-21 Dave Love - - * gnus-ems.el (gnus-article-display-xface): Use unibyte for the - image processing. Rationalize logic somewhat. - -2000-09-20 Dave Love - - * gnus-start.el (gnus-1) : Don't test for X - specifically. - - * gnus.el (gnus-version-number): Avoid some redundant - autoloads. - -2000-09-20 Gerd Moellmann - - * gnus-ems.el (gnus-article-display-xface): Don't convert PBM - to XBM; we always have PBM support. - -2000-09-14 Dave Love - - * gnus.el (gnus-charset): - * mm-decode.el (mime-display): - * imap.el (imap) : Add :version. - -2000-09-13 Gerd Moellmann - - * parse-time.el: Fix author's mail address. - - * earcon.el, flow-fill.el, gnus-cite.el, gnus-gl.el, gnus-ml.el: - * gnus-mlspl.el, gnus-nocem.el, gnus-range.el, gnus-salt.el: - * gnus-setup.el, gnus-soup.el, gnus-undo.el, gnus-vm.el: - * messcompat.el, nnbabyl.el, nndir.el, nneething.el: - * nngateway.el, nnheaderxm.el, nnkiboze.el, nnlistserv.el: - * nnmbox.el, nnmh.el, nnoo.el, nnsoup.el, nnspool.el, rfc2045.el: - * rfc2231.el, uudecode.el: Fix copyright notice. - - * nnweb.el (toplevel): To make the file bootstrap in Emacs, - require `w3' at load-time only if not running in batch mode. - -2000-12-19 16:00:00 ShengHuo ZHU - - * gnus.el: Before merge with Emacs21. - -2000-12-19 Raymond Scholz - - * gnus-art.el (gnus-article-dumbquotes-map): Add EUR symbol. - -2000-12-19 Per Abrahamsen - - * mml.el (mml-mode-map): Change mml prefix from `M-m' to `C-c C-m' - to avoid conflict with the standard `back-to-indentation' - binding. - -2000-12-17 10:00:00 ShengHuo ZHU - - * mm-extern.el (mm-inline-external-body): g-a-m-h may be a handle. - - * mm-util.el (mm-enable-multibyte-mule4): Test charsetp. - (mm-disable-multibyte-mule4): Ditto. - (mm-with-unibyte-current-buffer-mule4): Ditto. - -2000-12-15 10:00:00 ShengHuo ZHU - - * pop3.el (pop3-movemail): Use binary. - (pop3-movemail-file-coding-system): Removed. - -2000-12-14 13:00:00 ShengHuo ZHU - - * mm-util.el (mm-charset-synonym-alist): Add cn-gb. - -2000-12-13 21:00:00 ShengHuo ZHU - - * nnspool.el (nnspool-lib-dir): Check whether /usr/lib/news/active - exists. - -2000-12-13 13:00:00 ShengHuo ZHU - - * gnus-msg.el (gnus-post-method): Use backend name when the - address is "". - -2000-12-08 10:00:00 ShengHuo ZHU - - * gnus-art.el (article-verify-x-pgp-sig): Don't test - mm-verify-option. - (gnus-treat-x-pgp-sig): Default value. - (gnus-ignored-headers): Redundant. - -2000-12-04 22:00:00 ShengHuo ZHU - - * gnus-win.el (gnus-configure-frame): Save selected window. - -2000-02-15 Andrew Innes - - * nnmbox.el: Require gnus-range. - (nnmbox-group-building-active-articles): New variable. - (nnmbox-group-active-articles): New variable; this is a cache of - all active articles by group and number. - (nnmbox-in-header-p): New function. - (nnmbox-find-article): New function. - (nnmbox-record-active-article): New function. - (nnmbox-record-deleted-article): New function. - (nnmbox-is-article-active-p): New function. - (nnmbox-retrieve-headers): Use nnmbox-find-article. - (nnmbox-request-article): Ditto. Also supply extra arg to - nnmbox-article-group-number. - (nnmbox-request-expire-articles): Ditto. - (nnmbox-request-move-article): Ditto. - (nnmbox-request-replace-article): Ditto. - (nnmbox-request-rename-group): Rename group entry in active - article cache. - (nnmbox-delete-mail): Update active article cache, unless article - is being replaced. - (nnmbox-possibly-change-newsgroup): Call nnmbox-read-mbox, rather - than partially duplicating it. - (nnmbox-article-group-number): Add extra `this-line' arg, to - handle articles belonging to multiple groups. - (nnmbox-save-mail): Update active article cache. - (nnmbox-read-mbox): Build active article cache when loading mbox. - Also do some repair work, if we find articles that are missing the - appropriate X-Gnus-Newsgroup lines in the header. We can usually - reconstruct these from Xref info. - -2000-12-04 18:00:00 ShengHuo ZHU - - * mail-source.el (mail-source-report-new-mail): Use - nnheader-run-at-time. - -2000-02-15 Andrew Innes - - * mail-source.el (mail-source-fetch-pop): Clear pop password when - an error is thrown, and then rethrow the error. - (mail-source-check-pop): Ditto. - (mail-source-start-idle-timer): Prevent multiple pop checks - running if the check takes a long time. - -2000-12-04 14:00:00 ShengHuo ZHU - - * gnus-msg.el (gnus-msg-mail): COMPOSEFUNC should return t if - succeed. - -2000-12-04 13:00:00 ShengHuo ZHU - - * gnus-win.el (gnus-configure-windows): Make sure - nntp-server-buffer is live. - (gnus-remove-some-windows): switch-to-buffer -> set-buffer. - -2000-11-21 Stefan Monnier - - * gnus-win.el (gnus-configure-windows): switch-to-buffer -> set-buffer. - -2000-12-04 Andreas Jaeger - - * gnus-msg.el (gnus-summary-mail-forward): Fix typos in description. - -2000-12-03 12:00:00 ShengHuo ZHU - - * mml2015.el (mml2015-fix-micalg): Alg might be nil. - -2000-12-01 Christopher Splinter - - * gnus-sum.el (gnus-summary-limit-to-age): Fix typo. - -2000-12-01 Simon Josefsson - - * mml-smime.el (mml-smime-verify): Fix address parsing. - -2000-12-01 Simon Josefsson - - * mml-smime.el (mml-smime-verify): Don't modify MM buffer. Handle - more than one certificate inside PKCS#7 blob. Better security - information (clamed / actual sender, openssl output, certificates - inside message). - - * smime.el (smime-verify-region): Output to /dev/null. - (smime-buffer-as-string-region): Don't parse empty lines. - -2000-11-30 23:00:00 ShengHuo ZHU - - * gnus-art.el (gnus-mime-security-button-line-format-alist): Add - ?d and ?D. - (gnus-mime-security-show-details-inline): New variable. - (gnus-mime-security-show-details): Use them. - (gnus-insert-mime-security-button): Ditto. - - * mml2015.el (mml2015-gpg-verify): Set details when succeed. - Suggest by Michael Duggan (md5i@cs.cmu.edu). - (mml2015-gpg-clear-verify): Ditto. - (mml2015-gpg-decrypt-1): Ditto. - (mml2015-use): Prefer 'gpg. - -2000-11-30 19:00:00 ShengHuo ZHU - - * gnus-util.el (gnus-add-text-properties-when): New function. - (gnus-remove-text-properties-when): Ditto. - - * gnus-cite.el (gnus-article-hide-citation): Use them. - (gnus-article-toggle-cited-text): Use them. - - * gnus-art.el (gnus-signature-toggle): Use them. - (gnus-article-show-hidden-text): Ditto. - (gnus-article-hide-text): Ditto. - -2000-11-30 14:00:00 ShengHuo ZHU - - * mm-util.el (mm-find-charset-region): Remove eight-bit-*. - -2000-11-30 Simon Josefsson - - * smime.el (smime-point-at-eol): New alias. - (smime-buffer-as-string-region): Use it. - -2000-11-29 21:00:00 ShengHuo ZHU - - * nndraft.el (nndraft-request-restore-buffer): Remove Date field. - -2000-11-29 20:00:00 ShengHuo ZHU - - * nnfolder.el (nnfolder-request-expire-articles): expiry-target. - - * nnbabyl.el (nnbabyl-request-expire-articles): Ditto. - - * nnmbox.el (nnmbox-request-expire-articles): Ditto. - -2000-11-22 Jan Nieuwenhuizen - - * nnmh.el (nnmh-request-expire-articles): Implemented - expiry-target for nnmh backend. - -2000-11-30 Simon Josefsson - - * mm-decode.el (mm-security-from): New variable. - (mm-possibly-verify-or-decrypt): Use it rather than `from'. - - * mml-smime.el (mml-smime-verify): Use `mm-security-from' rather - than `from'. - -2000-11-30 Simon Josefsson - - * mml-smime.el (mml-smime-verify): Verify that certificate mail - address match sender address. - - * mm-decode.el (mm-possibly-verify-or-decrypt): Bind sender address. - - * smime.el (smime-verify-region): Don't copy buffer. - (smime-decrypt-buffer): Use expand-file-name on keyfile. - (smime-pkcs7-region): New function. - (smime-pkcs7-certificates-region): Ditto. - (smime-pkcs7-email-region): Ditto. - (smime-buffer-as-string-region): Ditto. - - * gnus-art.el (gnus-mime-security-show-details): Goto beginning of - buffer. - -2000-11-23 Jens Krinke - - * smime.el (smime-decrypt-region): Fix keyfile argument. - -2000-11-29 00:00:00 ShengHuo ZHU - - * nnmail.el (nnmail-cache-accepted-message-ids): Add doc. - -2000-11-28 17:00:00 ShengHuo ZHU - - * message.el (message-shoot-gnksa-feet): New variable. - (message-gnksa-enable-p): New function. - (message-send): Use it. - (message-check-news-body-syntax): Ditto. - -2000-11-28 Katsumi Yamaoka - - * message.el (message-make-message-id): Remove the redundancy. - -2000-11-22 17:00:00 ShengHuo ZHU - - * message.el (message-setup): Discourage using mc-install-*-mode. - - * gnus-setup.el (gnus-use-mailcrypt): Don't hook mail-crypt. - -2000-11-22 16:00:00 ShengHuo ZHU - - * gnus-cite.el (gnus-cite-parse): Guess citation length. - -2000-11-22 14:00:00 ShengHuo ZHU - - * gnus-ml.el (gnus-mailing-list-insinuate): New function. - -2000-11-22 13:00:00 ShengHuo ZHU - - * gnus-ml.el (gnus-mailing-list-archive): Find the real url. - -2000-11-22 11:00:00 ShengHuo ZHU - - * gnus-xmas.el (gnus-xmas-article-display-xface): Use - insert-buffer-substring. - - * message.el (message-send-mail): Use buffer-substring-no-properties. - (message-send-news): Ditto. - -2000-11-22 David Edmondson - - * imap.el (imap-wait-for-tag): Message read info. - -2000-11-21 20:00:00 ShengHuo ZHU - - * mml2015.el (mml2015-mailcrypt-encrypt): Ensure the part is encrypted. - (mml2015-mailcrypt-encrypt): Use unibyte-buffer. - (mml2015-gpg-encrypt): Ditto. - -2000-11-21 09:00:00 ShengHuo ZHU - - * mm-decode.el (mm-verify-option): Default value. - - * mml-sec.el (mml-secure-part): Error message. - -2000-11-20 18:00:00 ShengHuo ZHU - - * gnus-ml.el (gnus-mailing-list-archive): Use browse-url. - -2000-11-20 17:00:00 ShengHuo ZHU - - * gnus-art.el (gnus-article-make-menu-bar): Use easy-menu-add. - -2000-11-20 16:00:00 ShengHuo ZHU - - * gnus-art.el (gnus-article-describe-key): Use prompt. - (gnus-article-describe-key-briefly): Ditto. - -2000-11-20 15:00:00 ShengHuo ZHU - - * gnus-agent.el (gnus-agent-expire): Ignore corrupted history. - -2000-11-20 10:00:00 ShengHuo ZHU - - * gnus-art.el (gnus-article-describe-key): New function. - (gnus-article-describe-key-briefly): New function. - -2000-11-19 23:00:00 ShengHuo ZHU - - * mm-decode.el (mm-decrypt-option): Doc typo. - - * gnus-art.el (gnus-article-read-summary-keys): lookup-key may - return a number. - -2000-11-19 21:00:00 ShengHuo ZHU - - * message.el (message-newline-and-reformat): Typo. - -2000-11-19 12:00:00 ShengHuo ZHU - - * gnus-art.el (article-verify-x-pgp-sig): Check whether - original-article-buffer exists. - - * rfc2047.el (rfc2047-q-encoding-alist): Match Resent-. - (rfc2047-header-encoding-alist): Addresses are different from text. - (rfc2047-encode-message-header): Ditto. - (rfc2047-dissect-region): Extra parameter. - (rfc2047-encode-region): Ditto. - (rfc2047-encode-string): Ditto. - -2000-11-19 00:00:00 ShengHuo ZHU - - * mm-uu.el (mm-uu-pgp-encrypted-extract-1): New function. - (mm-uu-pgp-encrypted-extract): Use it. - (mm-uu-pgp-signed-extract-1): New function. - (mm-uu-pgp-signed-extract): Use it. - - * gnus-art.el (gnus-mime-display-security): New function. - (gnus-mime-display-part): Use it. - (gnus-mime-security-verify-or-decrypt): New function. - (gnus-mime-security-press-button): New function. - (gnus-insert-mime-security-button): Use it. - - * mm-decode.el (mm-possibly-verify-or-decrypt): Use mm-h-m-c-p. - (mm-find-raw-part-by-type): Ditto. - (mm-verify-function-alist): Add x-gnus-pgp-signature handle. - (mm-decrypt-function-alist): Add x-gnus-pgp-encrypted handle. - (mm-destroy-parts): Kill nested multibyte buffer. - - * mml2015.el (mml2015-mailcrypt-verify): Use mm-h-m-c-p. - (mml2015-gpg-verify): Ditto. - -2000-11-18 Simon Josefsson - - * mml2015.el (mml2015-mailcrypt-clear-verify): New function. - (mml2015-function-alist): Use it. - - * mml-sec.el (mml-sign-alist): Update names. - (mml-encrypt-alist): Ditto. - (mml-secure-part-smime-sign): Moved to mml-smime.el - as `mml-smime-sign-query'. - (mml-secure-part-smime-encrypt-by-file): Moved to mml-smime.el as - `mml-smime-get-file-cert'. - (mml-secure-part-smime-encrypt-by-dns): Moved to mml-smime.el as - `mml-smime-get-dns-cert'. - (mml-secure-part-smime-encrypt): Moved to mml-smime.el as - `mml-smime-encrypt-query'. - (mml-smime-sign-buffer): Use mml-smime-sign. - (mml-smime-encrypt-buffer): Use mml-smime-encrypt. - - * mml-smime.el (mml-smime-sign): New function. - (mml-smime-encrypt): - (mml-smime-sign-query): - (mml-smime-get-file-cert): - (mml-smime-get-dns-cert): - (mml-smime-encrypt-query): Moved from mml-sec.el. - -2000-11-16 Simon Josefsson - - * mml2015.el (mml2015-gpg-clear-verify): New function. - (mml2015-function-alist): Add it. - -2000-11-17 14:21 ShengHuo ZHU - - * message.el (message-setup-fill-variables): Use - message-cite-prefix-regexp. - (message-newline-and-reformat): Check the end of citation, leading - WSP, break in the cite prefix. - (message-fill-paragraph): New function. - -2000-11-17 13:44 ShengHuo ZHU - - * lpath.el: Shut up. - -2000-11-17 Per Abrahamsen - - * gnus-msg.el (gnus-group-posting-charset-alist): No longer allow - raw 8-bit in headers in dk.* newsgroups. - -2000-11-17 08:02 ShengHuo ZHU - - * message.el (message-newline-and-reformat): Match extra WSPs. - -2000-11-16 23:31 ShengHuo ZHU - - * mml.el (mml-generate-mime-1): Ignore ascii. - -2000-11-16 Justin Sheehy - - * gnus-sum.el (gnus-summary-make-menu-bar): Fix menu items. - -2000-11-16 17:00 ShengHuo ZHU - - * message.el (message-cite-prefix-regexp): Prefix should not end - at space. - -2000-11-15 18:09 ShengHuo ZHU - - * message.el (message-mode-syntax-table): Add - as a word - constituent as in articles. - (message-setup-fill-variables): Add -_. as supercite-style prefix. - * gnus-art.el (gnus-article-mode-syntax-table): Remove ?-. - * gnus-cite.el (gnus-cite-parse): Match from the beginning of line. - -2000-11-15 13:21 ShengHuo ZHU - - * gnus-msg.el (gnus-inews-do-gcc): Expire the article. - -2000-11-12 David Edmondson - - * message.el (message-font-lock-keywords): use - message-cite-prefix-regexp. - -2000-11-15 Kai Gro,A_(Bjohann - - * gnus-group.el (gnus-group-jump-to-group-prompt): New variable by - Stein Arild Str,Ax(Bmme. - (gnus-group-jump-to-group): Use it. - (gnus-group-jump-to-group-prompt): Customize. - -2000-11-14 10:32:42 ShengHuo ZHU - - * mailcap.el (mailcap-possible-viewers): Match the entire string. - -2000-11-14 10:20:56 ShengHuo ZHU - - * mml2015.el (mml2015-mailcrypt-verify): replace-match is - incompatible. - (mml2015-mailcrypt-sign): Ditto. - -2000-11-14 10:12:05 ShengHuo ZHU - - * gnus-msg.el (gnus-inews-do-gcc): Update summary data when the - group is open. - -2000-11-14 00:48:52 ShengHuo ZHU - - * gnus-bcklg.el (gnus-backlog-enter-article): Don't enter - nnvirtual articles. - (gnus-backlog-request-article): Don't request nnvirtual articles. - -2000-11-13 22:08:09 ShengHuo ZHU - - * mml2015.el (mml2015-mailcrypt-sign): Remove "-" escape. - * mml.el (mml-generate-mime-1): Save cont. skip multipart attributes. - -2000-11-13 20:43:37 ShengHuo ZHU - - * mm-decode.el (mm-get-part): Don't call mm-insert-part. - * mml.el (mml-generate-mime-1): Use charset attribute. - * mm-bodies.el (mm-encode-body): Add parameter charset. - * mm-util.el (mm-mime-charset): Show error when find 8-bit characters. - -2000-11-13 16:09:09 ShengHuo ZHU - - * mml2015.el (mml2015-mailcrypt-decrypt): Handle quit. - (mml2015-mailcrypt-clear-decrypt): Ditto. - (mml2015-mailcrypt-verify): Ditto. - (mml2015-mailcrypt-clear-verify): Ditto. - (mml2015-gpg-verify): Ditto. - -2000-11-13 15:29:58 ShengHuo ZHU - - * smime.el (smime-openssl-program): Test the existence of openssl. - * mml-smime.el: Require mm-decode. - (mml-smime-verify-test): New function. - * mm-decode.el (mm-verify-function-alist): Use it. - -2000-11-13 09:50:29 ShengHuo ZHU - - * gnus-sum.el (gnus-summary-repair-multipart): Fix Mime-Version - anyway. - -2000-11-13 Simon Josefsson - - * mm-uu.el (mm-uu-pgp-signed-extract): Explain why clear - verification doesn't work. - -2000-11-12 23:36:45 ShengHuo ZHU - - * gnus-msg.el (gnus-inews-mark-gcc-as-read): New variable. - (gnus-inews-do-gcc): Use it. - -2000-11-12 21:35:04 ShengHuo ZHU - - * rfc2231.el (rfc2231-encode-string): Insert semi-colon and - leading space. - * mm-extern.el (mm-inline-external-body): Report error when no - access-type. - -2000-11-12 19:48:30 ShengHuo ZHU - - * gnus-sum.el (gnus-select-newsgroup): Change the error message. - -2000-11-12 11:53:18 ShengHuo ZHU - - * gnus-art.el (gnus-mime-button-menu): Use select-window. - -2000-11-12 09:47:54 ShengHuo ZHU - - * gnus-art.el (gnus-mime-display-part): Display multipart/related - as multipart/mixed. - -2000-11-12 David Edmondson - - * message.el (message-cite-prefix-regexp): moved from gnus-cite.el - and replace `.' with `\w' to allow for different syntax tables - (from Vladimir Volovich). - * message.el (message-newline-and-reformat): use - `message-cite-prefix-regexp'. - * gnus-cite.el (gnus-supercite-regexp): use - `message-cite-prefix-regexp'. - * gnus-cite.el (gnus-cite-parse): use - `message-cite-prefix-regexp'. - -2000-11-12 08:52:46 ShengHuo ZHU - - * mml2015.el (mml2015-mailcrypt-verify): Replace armors with - PGP SIGNATURE. Escape leading "-"'s. - (mml2015-mailcrypt-sign): Replace armors with PGP MESSAGE. - -2000-11-11 15:55:35 ShengHuo ZHU - - * mm-uu.el (mm-uu-type-alist): Stricter shar regexp. - -2000-11-11 Simon Josefsson - - * mml2015.el (mml2015-gpg-verify): Set "OK" security status. - - * smime.el (smime-details-buffer): New variable. - (smime-sign-region): - (smime-encrypt-region): - (smime-verify-region): - (smime-decrypt-region): Copy OpenSSL output to the buffer. - - * mml-smime.el (mml-smime-verify): Support security info. - -2000-11-10 17:11:22 ShengHuo ZHU - - * mm-decode.el (mm-verify-option): Set default to nil. - (mm-decrypt-option): Ditto. - * gnus-art.el (article-verify-x-pgp-sig): New function. - -2000-11-10 09:01:25 ShengHuo ZHU - - * gnus-art.el (gnus-mime-display-alternative): Show button if no - preferred part. - -2000-11-07 Kai Gro,A_(Bjohann - - * gnus-sum.el (gnus-move-split-methods): Say that - `gnus-split-methods' uses file names, whereas this uses group - names. (Report from Nevin Kapur) - -2000-11-10 01:23:20 ShengHuo ZHU - - * mm-partial.el (mm-inline-partial): Insert MIME-Version. - -2000-11-09 17:02:50 ShengHuo ZHU - - * nnheader.el (nnheader-directory-files-is-safe): New variable. - (nnheader-directory-articles): Use it. - (nnheader-article-to-file-alist): Ditto. - -2000-11-09 16:20:37 ShengHuo ZHU - - * rfc2047.el (rfc2047-pad-base64): New function. - (rfc2047-decode): Use it. - -2000-11-09 08:53:04 ShengHuo ZHU - - * gnus-srvr.el (gnus-browse-foreign-server): Bind the original - select method. - -2000-11-08 19:58:58 ShengHuo ZHU - - * mml2015.el (mml2015-gpg-decrypt-1): - (mml2015-gpg-verify): buffer-string has no argument in Emacs. - -2000-11-08 16:37:02 ShengHuo ZHU - - * gnus-cache.el (gnus-cache-generate-nov-databases): Reopen cache. - -2000-11-08 08:38:30 ShengHuo ZHU - - * pop3.el (pop3-munge-message-separator): A message may have an - empty body. - -2000-11-07 18:02:26 ShengHuo ZHU - - * mm-uu.el (mm-uu-type-alist): Don't test pgp stuff. - (mm-uu-pgp-encrypted-extract): Clean mml2015 buffer. - (mm-uu-pgp-signed-extract): Use coding-system. - -2000-11-07 14:33:19 ShengHuo ZHU - - * gnus-art.el (gnus-mime-display-part): Show MIME security button. - (gnus-insert-mime-security-button): New function. - * mm-decode.el (mm-possibly-verify-or-decrypt): Add security info. - * mml2015.el: Add security info when verify or decrypt. - * mm-uu.el (mm-uu-pgp-signed-extract): Use multipart. - (mm-uu-pgp-encrypted-extract): Ditto. - -2000-11-07 08:49:36 ShengHuo ZHU - - * mm-decode.el (mm-display-parts): New function. - * gnus-art.el (gnus-mime-view-all-parts): Use it. Remove parts first. - -2000-02-02 Alexandre Oliva - - * gnus-mlspl.el: Documentation tweaks. - -2000-11-06 22:06:44 ShengHuo ZHU - - * mm-decode.el (mm-possibly-verify-or-decrypt): Fix. - * gnus-art.el (gnus-article-encrypt-body): Rename and support prefix - argument. - -2000-11-06 19:10:14 ShengHuo ZHU - - * rfc2231.el (rfc2231-encode-string): Use us-ascii if charset is nil. - -2000-11-06 18:17:53 ShengHuo ZHU - - * gnus-art.el (gnus-article-encrypt): New function. - (gnus-article-encrypt-protocol-alist): New variable. - (gnus-article-encrypt-protocol): New variable. - * mml2015.el (mml2015-self-encrypt): New function. - (mml2015-mailcrypt-encrypt): Set mc-pgp-always-sign. - -2000-11-06 16:02:52 ShengHuo ZHU - - * mm-uu.el (mm-uu-gpg-key-skip-to-last): New function. - (mm-uu-pgp-key-extract): Use application/pgp-keys, don't snarf, - let mailcap do it. - * mml2015.el: Remove snarf code. - * mm-decode.el: Remove snarf code. - -2000-11-06 14:03:10 ShengHuo ZHU - - * mml.el (mml-insert-mml-markup): Ignore internal stuff. - (mml-insert-mime): Understand gnus-decoded. - (mime-to-mml): New parameter handles. - * gnus-art.el (gnus-mime-save-part-and-strip): Use it. - * gnus-sum.el (gnus-summary-edit-article): Add argument `3'. - -2000-11-06 13:51:37 ShengHuo ZHU - - * mm-decode.el (mime-security): New group. - (mm-verify-function-alist): Add test function. - (mm-decrypt-function-alist): Ditto. - (mm-snarf-option): Set default value as nil. - (mm-find-part-by-type): Recursive parameter. - (mm-possibly-verify-or-decrypt): Support draft-ietf-openpgp-multsig. - * mml2015.el: Support draft-ietf-openpgp-multsig. - -2000-11-06 13:01:27 ShengHuo ZHU - - * gnus-art.el (gnus-mime-view-part-as-charset): New function. - (gnus-article-view-part-as-charset): New function. - -2000-11-05 22:34:07 ShengHuo ZHU - - * mm-decode.el (mm-verify-option): Default value. - (mm-possibly-verify-or-decrypt): Dealing with broken messages. - -2000-11-05 15:06:05 ShengHuo ZHU - - * nnvirtual.el (nnvirtual-request-expire-articles): Uncompress range. - -2000-11-05 Simon Josefsson - - * mml-smime.el (mml-smime-verify): Work in original multipart - buffert. - - * mm-decode.el (mm-handle-multipart-original-buffer): New macro. - (mm-handle-multipart-ctl-parameter): Ditto. - (mm-alist-to-plist): New function. - (mm-dissect-buffer): Store CTL parameters and copy original buffer - for multiparts. - (mm-destroy-parts): Destroy multipart buffert. - (mm-remove-part): Ditto. - - * mml-smime.el (mml-smime-sign): Not used. - (mml-smime-encrypt): Ditto. - - * mm-decode.el (mml-smime-verify): Autoload mml-smime. - - Verify S/MIME signature support. - - * mm-decode.el (mm-inline-media-tests): Add - application/{x-,}pkcs7-signature. - (mm-inlined-types): Ditto. - (mm-automatic-display): Ditto. - (mm-verify-function-alist): Ditto. Add name of method. - (mm-decrypt-function-alist): Add name of method. - (mm-find-part-by-type): Add documentation. - (mm-possibly-verify-or-decrypt): Use new format of - mm-{verify,decrypt}-function-alist. Use method names. - - * mml-smime.el (mml-smime-verify): New function. - -2000-11-04 20:38:50 ShengHuo ZHU - - * mm-view.el (mm-inline-text): Move point to the end of inserted text. - -2000-11-04 19:07:08 ShengHuo ZHU - - * mml2015.el (mml2015-function-alist): Clear verify and decrypt. - * mm-uu.el: Reorganized. Add gnatsweb, pgp-signed, pgp-encrypted. - * mm-decode.el (mm-snarf-option): New. - -2000-11-04 13:08:02 ShengHuo ZHU - - * mm-util.el (mm-subst-char-in-string): New function. - (mm-replace-chars-in-string): Use it. - * message.el (message-replace-chars-in-string): Use it. - * nnheader.el (nnheader-replace-chars-in-string): Use it. - * gnus-mh.el (mh-lib-progs): Shut up. - -2000-11-04 ShengHuo Zhu - - * base64.el, md5.el: Moved to contrib directory. - -2000-11-04 11:13:56 ShengHuo ZHU - - * gnus-sum.el (gnus-summary-search-article-forward): Don't move - the last article when search. - -2000-11-04 10:34:29 ShengHuo ZHU - - * nnheader.el (nnheader-pathname-coding-system): Default iso-8859-1. - * nnmail.el (nnmail-pathname-coding-system): Ditto. - -2000-09-29 David Edmondson - - * message.el (message-newline-and-reformat): Typo. - -2000-11-04 10:11:05 ShengHuo ZHU - - * rfc2231.el (rfc2231-decode-encoded-string): Test mm-multibyte-p. - -2000-11-04 09:53:42 ShengHuo ZHU - - * nntp.el (nntp-decode-text): Delete bogus status lines. - -2000-11-03 Stefan Monnier - - * message.el (message-font-lock-keywords): Match a final newline - to help font-lock's multiline support. - -2000-11-04 09:11:44 ShengHuo ZHU - - * nnoo.el (nnoo-set): New function. - -2000-11-04 ShengHuo Zhu - - * gpg.el, gpg-ring.el: Moved to contrib directory. - -2000-11-04 Simon Josefsson - - * nnimap.el (nnimap-split-inbox): Typo. - -2000-11-03 10:46:44 ShengHuo ZHU - - * gnus-msg.el (gnus-msg-mail): Move it backwards. - -2000-11-03 Simon Josefsson - - * rfc2231.el (rfc2231-parse-qp-string): New function. - (require): rfc2047. - - * mail-parse.el (mail-header-parse-content-type): - (mail-header-parse-content-disposition): Support invalid QP - encoded strings, by using `rfc2231-parse-qp-string'. - -2000-11-03 08:58:08 ShengHuo ZHU - - * rfc2231.el (rfc2231-parse-string): Decode when there is no number. - (rfc2231-decode-encoded-string): Typo "> X 1". - (rfc2231-encode-string): Insert the name of charset. - * mail-parse.el (mail-header-encode-parameter): Use RFC2231. - -2000-11-02 23:35:50 ShengHuo ZHU - - * mm-decode.el (mm-save-part): Return the filename. - * gnus-sum.el (gnus-summary-edit-article): Remove a hack. - * gnus-art.el (gnus-mime-save-part-and-strip): New function. - (gnus-mime-action-alist): Use it. - (gnus-mime-button-commands): USe it. - * mm-extern.el (mm-extern-local-file): Error when the file is gone. - (mm-inline-external-body): unwind-protect. - -2000-11-02 21:08:49 ShengHuo ZHU - - * gnus-art.el (gnus-insert-mime-button): Show url. - -2000-11-02 19:51:19 ShengHuo ZHU - - * mml.el (mml-generate-mime-1): Support external url. - * nnwarchive.el (nnwarchive-mail-archive-article): Use external url. - -2000-11-02 16:53:32 ShengHuo ZHU - - * mm-partial.el (mm-inline-partial): Buffer name with a leading space. - * mm-decode.el (mm-display-external): Ditto. - * mm-extern.el: New file. - * mm-decode.el (mm-inline-media-tests): Hook it up. - (mm-inlined-types): Inline message/external-body. - -2000-11-02 Simon Josefsson - - * gnus-art.el (gnus-visible-headers): Add Mail-Followup-To. - - * message.el (message-get-reply-headers): Better handling when - Mail-Followup-To is very large. - -2000-11-02 13:27:56 ShengHuo ZHU - - * gnus-uu.el (gnus-uu-post-news): Comment out the redundancy. - * gnus-art.el (gnus-article-edit-done): - * gnus-sum.el (gnus-summary-edit-article-done): Move line - counting code here. - * gnus-msg.el (gnus-setup-message): Remove a hack. - -2000-11-02 09:33:01 ShengHuo ZHU - - * gnus-sum.el (gnus-newsgroup-variables): New variable. - (gnus-summary-mode): Make them local variables. - (gnus-set-global-variables): Globalize them. - (gnus-summary-exit): Kill them. - -2000-11-02 Hrvoje Niksic - - * rfc2047.el (rfc2047-encoded-word-regexp): Allow empty encoded - word. - -2000-11-01 10:07:13 ShengHuo ZHU - - * gnus-art.el (gnus-mime-display-part): Add to signed or encrypted. - gnus-article-wash-types. - * gnus-art.el (gnus-article-wash-status): Use them. - -2000-11-01 08:54:11 ShengHuo ZHU - - * mml.el (mml-read-tag): Remove spaces and LF. - -2000-11-01 08:01:03 ShengHuo ZHU - - * mml2015.el (mml2015-mailcrypt-encrypt): Use from and sign parameters. - * mml.el (mml-generate-mime-1): Add sender and recipients attributes. - -2000-11-01 07:39:24 ShengHuo ZHU - - * gnus-sum.el (gnus-summary-force-verify-and-decrypt): New function. - -2000-10-31 22:06:13 ShengHuo ZHU - - * gnus-sum.el (gnus-article-charset): New variable. - (gnus-summary-display-article): Set it. - * gnus-msg.el (gnus-copy-article-buffer): Use it. - * gnus-art.el (gnus-article-mode): Make it local variable. - -2000-11-01 01:12:29 Lars Magne Ingebrigtsen - - * nnultimate.el (nnultimate-create-mapping): Use nreverse. - -2000-10-31 23:45:31 Lars Magne Ingebrigtsen - - * nnwfm.el: New file. - - * nnweb.el (nnweb-replace-in-string): New function. - -2000-10-31 17:32:02 ShengHuo ZHU - - * mml2015.el: Wrap gpg.el. - * gpg.el (gpg-verify): The last argument of apply is a list. - (gpg-encrypt): Add passphrase as a parameter. - -2000-10-31 17:28:45 ShengHuo ZHU - - * gpg.el: New file. - * gpg-ring.el: New file. - -2000-10-31 11:44:29 ShengHuo ZHU - - * gnus-sum.el (gnus-summary-show-article): Fix the summary line. - -2000-10-31 Katsumi Yamaoka - - * gnus-sum.el (gnus-summary-insert-line): Work with quoted - double-quote characters. - (gnus-summary-prepare-threads): Ditto. - -2000-10-31 08:36:03 ShengHuo ZHU - - * gnus-art.el (gnus-mime-display-single): Forward line -1. - * mml.el (mml-read-tag): Don't skip the leading space. - * lpath.el (font-lock-set-defaults): Shut up. - -2000-10-31 00:04:35 ShengHuo ZHU - - * mml2015.el: Fix doc. Remove bogus mml2015-setup. - -2000-10-30 23:37:07 ShengHuo ZHU - - * qp.el (quoted-printable-encode-region): Replace leading - when - ultra safe. - * mml.el (mml-generate-mime-postprocess-function): Removed. - (mml-postprocess-alist): Removed. - (mml-generate-mime-1): Use ultra-safe when sign. - * mml2015.el (mml2015-fix-micalg): Uppercase. - (mml2015-verify): Insert LF. - (mml2015-mailcrypt-sign): Downcase; search backward. - -2000-10-16 11:36:52 Lars Magne Ingebrigtsen - - * nnultimate.el (nnultimate-forum-table-p): Be a bit more - restrictive. - (nnultimate-table-regexp): New variable. - (nnultimate-forum-table-p): Use it. - -2000-10-30 Ed L Cashin - - * gnus-sum.el (gnus-summary-expire-articles): Save point. - -2000-10-30 08:52:50 ShengHuo ZHU - - * mml-sec.el (mml-pgpmime-sign-buffer): Use mml2015-sign. - (mml-pgpmime-encrypt-buffer): Use mml2015-encrypt. - -2000-10-30 08:38:12 ShengHuo ZHU - - * mml2015.el: Shut up. - -2000-10-30 08:17:46 ShengHuo ZHU - - * gnus.el (gnus-server-browse-hashtb): Removed. - * gnus-group.el (gnus-group-prepare-flat-list-dead): Use gnus-active. - (gnus-group-insert-group-line-info): Use simplified method. - * gnus-srvr.el (gnus-browse-foreign-server): Use gnus-set-active. - -2000-10-30 01:52:40 ShengHuo ZHU - - * gnus-util.el (gnus-union): Renamed from gnus-agent-union, and - moved here. - * gnus-agent.el (gnus-agent-fetch-headers): Use it. - * gnus-group.el (gnus-group-prepare-flat): Use it. - * gnus-topic.el (gnus-group-prepare-topics): Use it. - -2000-10-30 01:23:49 ShengHuo ZHU - - * mml.el (mml-mode): Show menu in XEmacs. - -2000-10-30 00:49:33 ShengHuo ZHU - - * gnus-srvr.el (gnus-server-browse-in-group-buffer): New variable. - (gnus-server-read-server-in-server-buffer): New function. - (gnus-browse-foreign-server): Browse in group buffer. - * gnus-group.el (gnus-group-prepare-flat): List group not in list. - (gnus-group-prepare-flat-list-dead): Use gnus-group-insert-group-line. - * gnus-topic.el (gnus-group-prepare-topics): Ditto. - * gnus.el (gnus-server-browse-hashtb): New variable. - -2000-10-29 22:31:40 ShengHuo ZHU - - * nnfolder.el (nnfolder-open-nov): Use group. - -2000-10-29 17:23:15 ShengHuo ZHU - - * nnfolder.el: Add NOV. Set version to 2.0. - (nnfolder-nov-is-evil): If non-nil, nnfolder acts like 1.0. - -2000-10-29 10:35:08 ShengHuo ZHU - - * mml2015.el (mml2015-mailcrypt-sign): Use mc-sign-generic. - -2000-10-29 09:42:05 ShengHuo ZHU - - * gnus-srvr.el (gnus-browse-foreign-server): Show level mark. - (gnus-browse-unsubscribe-group): Unsubscribed is not killed. - -2000-10-29 08:28:58 ShengHuo ZHU - - * nnfolder.el (nnfolder-read-folder): Don't goto point-min. - -2000-10-28 19:11:01 ShengHuo ZHU - - * mm-decode.el (mm-verify-function-alist): New variable. - (mm-verify-option): New variable. - (mm-decrypt-function-alist): Ditto. - (mm-decrypt-option): Ditto. - (mm-find-raw-part-by-type): New function. - (mm-possibly-verify-or-decrypt): New function. - (mm-dissect-multipart): Use it. - * mml2015.el (mml2015-fix-micalg): New function. - (mml2015-decrypt): Use new interface. - (mml2015-verify): Use new interface. - (mml2015-setup): Make it bogus. - -2000-10-28 16:54:45 ShengHuo ZHU - - * mml.el (mml-generate-mime-postprocess-function): Set to - mml-postprocess. - (autoload): Autoload mml2015 and mml-smime. - (mml-postprocess-alist): Use mml2015-sign and mml2015-encrypt. - * mml2015.el (mml2015-encrypt): New function. - (mml2015-sign): New function. - (mml2015-encrypt-function): New variable. - (mml2015-sign-function): New variable. - (mml2015-mailcrypt-encrypt): Use message-recipients. - (mml2015-setup): Don't set mml-generate-mime-postprocess-function. - * mml-smime.el (mml-smime-setup): Ditto. - -2000-10-28 Simon Josefsson - - * imap.el (imap-parse-resp-text-code): Workaround bug in Stalker - Communigate Pro 3.3.1 server. - - * mml-sec.el (mml-smime-encrypt-buffer): Support certfiles stored - in buffers. - (mml-secure-dns-server): Removed. - (mml-secure-part-smime-encrypt-by-dns): Use DIG interface. Don't - write certificates to files. - - * smime.el (smime-dns-server): New variable. - (smime-mail-to-domain): - (smime-cert-by-dns): New functions. - - * dig.el: New file. - -2000-10-28 10:09:41 ShengHuo ZHU - - * message.el (message-options): New variable. - (message-options-set-recipient): New function. - (message-send): Use them. - * gnus-int.el (gnus-request-replace-article): Use them. - (gnus-request-accept-article): Ditto. - * mml.el (mml-preview): Use them. - * gnus-sum.el (gnus-summary-edit-article): Use them. - - * message.el (message-options-get): New function. - (message-options-get): New function. - * rfc2047.el (rfc2047-encode-message-header): Use them. - * mm-bodies.el (mm-encode-body): Use them. - -2000-10-28 Simon Josefsson - - * nnimap.el (nnimap-retrieve-which-headers): - (nnimap-request-article-part): Quote message-id. - - * smime.el (smime-CA-directory): Rename from `smime-CAs'. - (smime-CA-file): New variable. - (smime-call-openssl-region): Don't error. - (smime-sign-region): Return result value. - (smime-encrypt-region): Ditto. - (smime-verify-region): New function. - (smime-decrypt-region): Ditto. - (smime-verify-buffer): Ditto. - (smime-decrypt-buffer): Ditto. - - * mml.el: Require mml-sec. - (mml-generate-mime-1): Support "sign" and "encrypt" MML tags. - (mml-mode-map): Add "sign" and "encrypt" maps. - (mml-menu): Add security menu. - (mml-preview): Use generate-new-buffer. - - * mml-sec.el: New file. - -2000-10-28 03:43:03 ShengHuo ZHU - - * mm-decode.el (mm-find-part-by-type): Move it here. - * mml.el (mml-postprocess): Move it here. - (mml-postprocess-alist): Move it here. Merge them. - -2000-10-28 03:38:39 ShengHuo ZHU - - * rfc2047.el (rfc2047-encode-message-header): Make sure no - unencoded stuff in the header. - -2000-10-28 02:40:46 ShengHuo ZHU - - * gnus-group.el (gnus-group-listed-groups): New variable. - (gnus-group-list-option): New variable. - (gnus-group-list-limit-map): New keymap. - (gnus-group-list-flush-map): New keymap. - (gnus-group-list-plus-map): New keymap. - (gnus-group-prepare-logic): New function. - (gnus-group-prepare-flat): Merge with - gnus-group-prepare-flat-predicate. Use gnus-group-listed-groups. - (gnus-group-prepare-flat-list-dead): Ditto. - (gnus-group-list-matching): Use gnus-group-prepare-function. - (gnus-group-list-dormant): Ditto. - (gnus-group-list-cached): Ditto. - (gnus-group-listed-groups): New function. - (gnus-group-list-limit): New function. - (gnus-group-list-flush): New function. - (gnus-group-list-plus): New function. - * gnus-topic.el (gnus-group-prepare-topics): Accept predicate. - (gnus-topic-prepare-topic): Ditto. - -2000-10-27 Paul Jarc - - * message.el (message-insert-to, message-get-reply-headers): - (message-reply, message-followup): Mail-{Followup,Reply}-To. - -2000-10-27 19:45:58 ShengHuo ZHU - - * mml2015.el: New file. - * smime.el: New file. - * mml-smime.el: New file. - -2000-10-27 19:42:12 ShengHuo ZHU - - * ChangeLog: Moved to ChangeLog.1. - -;; Local Variables: -;; coding: iso-2022-7bit -;; End: diff --git a/lisp/ChangeLog.1 b/lisp/ChangeLog.1 deleted file mode 100644 index 3cfb883..0000000 --- a/lisp/ChangeLog.1 +++ /dev/null @@ -1,10100 +0,0 @@ -2000-10-27 Jason Rumney - - * gnus-art.el (gnus-signature-face): Use italic on any frame that - supports it. - -2000-10-27 14:19:53 ShengHuo ZHU - - * gnus-mlspl.el: Require cl when compiling. - * messagexmas.el: Ditto. - * mm-util.el: Ditto. - * rfc2047.el: Ditto. - * rfc2231.el: Ditto. - * smiley-ems.el: Ditto. - * uudecode.el: Ditto. - - * smiley-ems.el (smiley-region): Use mapcar. - -2000-10-27 Stefan Monnier - - * ietf-drums.el: Require cl when compiling. - -2000-10-27 Dave Love - - * mm-decode.el (mm-valid-and-fit-image-p): Don't test - window-system here. - - * gnus-art.el (gnus-article-x-face-command): Check - gnus-article-compface-xbm. - (gnus-treat-display-xface): Check for uncompface. - - * nnheader.el (nnheader-translate-file-chars): Only kludge things - under Doze with XEmacs. - -2000-10-26 Simon Josefsson - - * mail-source.el (mail-sources): IMAP predicate is a string. - (mail-sources): Add default values for IMAP mailbox, predicate and - fetchflag. - -2000-10-26 Dave Love - - * flow-fill.el: Require cl when compiling. - - * mail-source.el: Require imap when compiling and defvar - display-time-mail-function. Require mm-util. - (nnheader-cancel-timer): Autoload. - (mail-source-imap-authenticators, mail-source-imap-streams): New - variables. - (mail-sources): Use them. - -2000-10-25 20:13:02 ShengHuo ZHU - - * mm-decode.el (mm-viewer-completion-map): New. - (mm-interactively-view-part): Use it. - -2000-10-25 18:51:12 ShengHuo ZHU - - * rfc2047.el (rfc2047-q-encode-region): Don't break if a QP-word - could be fitted in one line. - -2000-10-25 Dirk Meyer - - * gnus-demon.el (gnus-demon-time-to-step): theHour was set to - seconds instead of hour. - -2000-10-25 Per Abrahamsen - - * mail-source.el (mail-sources): Better `:type'. - -2000-10-24 18:31:29 ShengHuo ZHU - - * gnus-art.el (gnus-request-article-this-buffer): - gnus-refer-article-method might be a single method. - * gnus-sum.el (gnus-refer-article-methods): The second could be - a named method. - -2000-10-23 Simon Josefsson - - * flow-fill.el (fill-flowed): Don't flow "-- " lines. - (fill-flowed): Make "quote-depth wins" rule work when first line - is at level 0. - -2000-10-21 11:23:21 ShengHuo ZHU - - * mm-util.el (mm-multibyte-p): Test (featurep 'xemacs). - -2000-10-21 10:54:57 ShengHuo ZHU - - * gnus-art.el (gnus-article-mime-total-parts): New function. - (gnus-mm-display-part): Use it. - (gnus-mime-display-single): Ditto. - (gnus-mime-display-alternative): Ditto. - -2000-10-21 09:38:27 ShengHuo ZHU - - * mailcap.el (mailcap-parse-mailcaps): Don't use parse-colon-path, - because they are files, not directories. - (mailcap-parse-mimetypes): Ditto. - -2000-10-20 19:55:59 ShengHuo ZHU - - * gnus-art.el (gnus-mime-inline-part): Check validity of charset. - -2000-10-18 Dave Love - - * mail-source.el (mm-util): Require. - (defvar): Use rmail-spool-directory unconditionally. - - * gnus-nocem.el (gnus-nocem-issuers): Update. - (gnus-nocem-check-from): New option. - (gnus-nocem-scan-groups): Use it. - (gnus-nocem-check-article): Bind gnus-newsgroup-name. - -2000-10-18 Miles Bader - - * gnus-nocem.el (gnus-nocem-check-article-limit): New variable. - (gnus-nocem-scan-groups): Obey `gnus-nocem-check-article-limit'. - -2000-10-18 Simon Josefsson - - * nnheader.el (nnheader-parse-head): Try both "from:" and "from: ". - - * gnus-sum.el (gnus-get-newsgroup-headers): Ditto. - -2000-10-17 Simon Josefsson - - * gnus-sum.el (gnus-get-newsgroup-headers): Search for "from:" - instead of "from: " for rfc822 compliance. - - * gnus-uu.el (gnus-uu-digest-mail-forward): Ditto. Insert SPC. - - * nnheader.el (nnheader-parse-head): Ditto. - -2000-10-13 Kai Gro,A_(Bjohann - - * mail-source.el (mail-source-keyword-map): Use - `rmail-spool-directory' as a default directory for the `file' - source, if the variable is defined. Fall back to hardcoded - "/usr/spool/mail/", as before. Suggestion by Steven E. Harris - . - -2000-10-13 12:01:15 ShengHuo ZHU - - * message.el (message-send-mail-partially): Replace the header - delimiter with a blank line. - -2000-10-13 Kai Gro,A_(Bjohann - - * gnus-sum.el (gnus-get-split-value): Use first match only (Ed L - Cashin ). - -2000-10-13 10:52:00 ShengHuo ZHU - - * gnus-ems.el (gnus-article-compface-xbm): Ignore errors. - -2000-10-11 John Wiegley - - * gnus-topic.el (gnus-topic-mode): Use `setq' to clear - `gnus-group-change-level-function', instead of `remove-hook', - because it's not a hook! - - * gnus-mlspl.el (gnus-group-split-update): Check the value of - `nnmail-crosspost', and use it to set the `no-crosspost' - argument when calling `gnus-group-split-fancy'. Otherwise, it - assumes that cross-posting is always OK, no matter what - `nmail-crosspost' is set to. - (gnus-group-split-fancy): The argument order in the - second-to-last `push' call was wrong, but since `no-crosspost' - was always nil, it was never being triggered. - - * gnus-art.el (gnus-treat-hide-citation-maybe): Added this - variable to correspond with `gnus-article-hide-citation-maybe'. - (gnus-treatment-function-alist): Added entry for the above - correlation. - -2000-10-12 08:26:30 ShengHuo ZHU - - * mm-util.el (mm-with-unibyte-current-buffer): Revert to old. - (mm-with-unibyte-current-buffer-mule4): New function. - * qp.el (quoted-printable-encode-region): Use it. - * rfc2047.el (rfc2047-decode): Ditto. - * webmail.el (webmail-init): Revert to use mm-disable-multibyte. - -2000-10-10 08:44:13 ShengHuo ZHU - - * rfc2047.el (rfc2047-fold-region): "=?=" is not a break point. - -2000-10-10 00:00:28 ShengHuo ZHU - - * webmail.el (webmail-init): Use mm-disable-multibyte-mule4. - -2000-10-09 22:50:05 ShengHuo ZHU - - * base64.el (base64-decode-region): Just give a message if the end - is not sane. - -2000-10-09 20:09:11 ShengHuo ZHU - - * rfc2047.el (rfc2047-encode-message-header): Move fold into - encode-region. - (rfc2047-dissect-region): Rewrite. - (rfc2047-encode-region): Rewrite. - (rfc2047-fold-region): Fold any line longer than 76. - (rfc2047-unfold-region): New function. - (rfc2047-decode-region): Use it. - (rfc2047-q-encode-region): Don't break at bob. - -2000-10-09 17:12:00 ShengHuo ZHU - - * nntp.el (nntp-open-connection): Kill process buffer when quit. - (nntp-connection-timeout): Add a note. SIGALRM is ignored in both - FSF Emacs 20 and XEmacs 21. - * gnus-agent.el (gnus-agent-fetch-session): Catch quit. - -2000-10-09 Dave Love - - * gnus-audio.el: Don't require cl. - (gnus-audio): New custom group. - (gnus-audio-inline-sound): Change to work with Emacs. - (gnus-audio-directory, gnus-audio-directory) - (gnus-audio-au-player): Customize. - (gnus-audio-play): Try external player if play-sound-file fails. - Use file-name-extension, not string-match. - - * gnus-art.el (article-de-quoted-unreadable) - (article-de-base64-unreadable): Fold search case rather than - downcasing string. Apply mm-charset-to-coding-system to arg of - quoted-printable-decode-region. - (gnus-article-dumbquotes-map): Fix dashes. - (gnus-button-mailto, gnus-button-embedded-url): Doc fix. - (gnus-button-reply): Just alias it. - -2000-10-09 Stefan Monnier - - * mm-encode.el: Require CL. At least, for `incf'. - - * nnfolder.el (nnfolder-ignore-active-file): Typos. - - * gnus-mh.el (gnus-summary-save-in-folder): Obey mh-lib-progs. - - * gnus-kill.el (gnus-kill): Typo. - -2000-10-09 Gerd Moellmann - - * smiley-ems.el (smiley-update-cache): Use `:ascent center'. - -2000-10-09 Simon Josefsson - - * nnimap.el (nnimap-group-overview-filename): Create directory for - newfile (when use long filenames is nil). Copy+delete file if - rename didn't work. - (nnimap-group-overview-filename): `rename-file' and `copy-file' - doesn't return anything useful, use ignore-errors instead. - -2000-10-08 13:05:11 ShengHuo ZHU - - * dgnushack.el (dgnushack-compile): Delete old elc files first. - -2000-10-08 10:59:13 ShengHuo ZHU - - * gnus-ems.el (gnus-kill-all-overlays): Move here. - * gnus-util.el (gnus-kill-all-overlays): Move out. - * gnus-sum.el (gnus-cache-write-active): Auto load. - * lpath.el: Shut up. - * nnweb.el (nnweb-url-retrieve-asynch): url-retrieve is - asynchronous in Exp version. - -2000-10-08 08:57:13 ShengHuo ZHU - - * gnus-art.el, gnus-ems.el, gnus-start.el: Remove gnus-xemacs. - * gnus-ems.el: Autoload smiley. - * gnus-art.el (gnus-treat-display-smileys): Default value in Emacs 21. - -2000-10-08 08:45:48 ShengHuo ZHU - - * gnus-sum.el (gnus-summary-display-article): Enable multibyte. - (gnus-summary-select-article): Don't enable multibyte here. - (gnus-summary-goto-article): Ditto. - -2000-10-08 Christoph Conrad - - * gnus-draft.el (gnus-draft-send-message): Typo. - -2000-10-08 Simon Josefsson - - * nnimap.el (nnimap-verify-uidvalidity): Delete overview file when - uid validity changes. - (nnimap-group-overview-filename): Store uidvalidity in filenames. - Rename old files into new format. - -2000-10-07 15:49:39 ShengHuo ZHU - - * mm-util.el (mm-enable-multibyte-mule4): New. - (mm-disable-multibyte-mule4): New. - * gnus-sum.el (gnus-summary-mode): Use it. - (gnus-summary-select-article): Ditto. - (gnus-summary-goto-article): Use enable multibyte. - * rfc2047.el (rfc2047-decode): Use unibyte. - -2000-10-07 15:42:59 ShengHuo ZHU - - * gnus-logic.el (gnus-advanced-string): Use "" if nil. - -2000-10-07 10:31:05 ShengHuo ZHU - - * rfc2047.el (rfc2047-q-encode-region): Better calculation of - break point. - (rfc2047-fold-region): Don't break the first non-LWSP characters. - -2000-10-07 09:18:53 ShengHuo ZHU - - * gnus.el (gnus-agent-fetching): New variable. - * gnus-agent.el (gnus-agent-with-fetch): Bind it. - * gnus-score.el (gnus-score-body): Don't score body when - agent-fetching. - (gnus-score-followup): Don't score followup either. - -2000-10-07 08:19:17 ShengHuo ZHU - - * gnus-art.el: Define dynamic variables in eval-when-compile. - * message.el (message-sending-message): New variable. - (message-send): Use it. - * gnus-draft.el (gnus-draft-send-message): Ditto. - (gnus-group-send-drafts): Ditto. - -2000-10-06 Dave Love - - * gnus-audio.el: Don't require cl. - (gnus-audio): New custom group. - (gnus-audio-inline-sound): Change to work with Emacs. - (gnus-audio-directory, gnus-audio-directory) - (gnus-audio-au-player): Customize. - (gnus-audio-play): Try external player if play-sound-file fails. - Use file-name-extension, not string-match. - -2000-10-06 17:38:03 ShengHuo ZHU - - * gnus-art.el (gnus-article-prepare): Configure it again. - -2000-10-06 15:11:07 ShengHuo ZHU - - * message.el (message-default-charset): Default value for non-Mule - Emacsen. - -2000-10-06 14:28:50 ShengHuo ZHU - - * message.el (message-alternative-emails): New. - (message-use-alternative-email-as-from): New. - (message-setup): Use them. - -2000-10-06 13:46:47 ShengHuo ZHU - - * base64.el, dgnushack.el, gnus-spec.el, messagexmas.el - * gnus-xmas.el, nnheaderxm.el, nndraft.el: Use defalias. - - * gnus-xmas.el (gnus-xmas-define): Defalias gnus-overlay-buffer, - gnus-overlay-start. - * gnus.el: Ditto. - * gnus-art.el (gnus-insert-mime-button): Use them. - -2000-10-06 10:01:08 ShengHuo ZHU - - * mm-util.el (mm-with-unibyte-current-buffer): Don't set unibyte - if eight-bit-control is a charset, e.g. Mule 5.0 in Emacs 21. - -2000-10-06 09:38:54 ShengHuo ZHU - - * qp.el (quoted-printable-encode-region): Use - mm-with-unibyte-current-buffer within narrowed region. - -2000-10-06 08:56:33 ShengHuo ZHU - - * webmail.el (webmail-type-definition): Fix my-deja open url. - -2000-10-06 Emerick Rogul - - * message.el (message-setup-fill-variables): New variable. - (message-mode): Use it. - -2000-10-05 Dave Love - - * rfc2047.el (rfc2047-fold-region): Use gnus-point-at-bol. - (rfc2047-charset-encoding-alist): Add iso-8859-1[45]. - - * binhex.el: Use defalias, not fset. - - * rfc1843.el: Require cl when compiling. - -2000-10-05 12:25:08 ShengHuo ZHU - - * gnus-agent.el (gnus-agent-fetch-group-1): Score-param could be nil. - -2000-10-05 11:43:25 ShengHuo ZHU - - * rfc2047.el (rfc2047-encode-region): Merge only if regions are - adjacent. - -2000-10-05 09:41:33 ShengHuo ZHU - - * mm-util.el (mm-multibyte-p): In XEmacs, it is (feature 'mule). - (mm-find-charset-region): Merge conditions, delete ascii. - (mm-charset-after): Rewrite. - * mm-bodies.el (mm-encode-body): Use it. - -2000-10-05 09:04:32 ShengHuo ZHU - - * webmail.el (webmail-hotmail-list): Fix. - -2000-10-05 Stefan Monnier - - * nnimap.el (require): cl. - -2000-10-04 15:24:46 ShengHuo ZHU - - * gnus-art.el (gnus-article-prepare): Configure windows before - gnus-article-prepare-display is called. Otherwise, BBDB's popup - window might be overrided. - -2000-10-04 Dave Love - - * gnus-ems.el (gnus-article-display-xface) - [gnus-article-compface-xbm]: Fix. - (gnus-x-splash): Bind width, height. - -2000-10-04 11:45:04 ShengHuo ZHU - - * gnus-art.el (gnus-mime-inline-part): Use prefix argument only - when it is called interactively. - -2000-10-03 21:20:31 ShengHuo ZHU - - * gnus-art.el (gnus-mime-action-alist): New variable. - (gnus-mime-action-on-part): Use it. - (gnus-mime-button-commands): Add command ".". - -2000-10-03 20:37:42 ShengHuo ZHU - - * gnus-art.el (gnus-mime-inline-part): Support prefix argument. - -2000-10-03 Katsumi Yamaoka - - * lpath.el: "." is in the load-path because dgnushack.el. - -2000-10-03 Bjorn Torkelsson - - * uudecode.el: xemacs cleanup (use featurep ' xemacs) - - * nnheader.el: ditto - - * mm-util.el: ditto - - * message.el: ditto - - * binhex.el: ditto - - * gnus-audio.el: removed unnecessary xemacs test - - * earcon.el: ditto - -2000-10-03 19:55:55 Lars Magne Ingebrigtsen - - * nnweb.el (nnweb-decode-entities): Work for non-character - entities. - -2000-09-26 09:20:08 Lars Magne Ingebrigtsen - - * gnus.el: Message the quit parts. - -2000-10-03 08:08:29 ShengHuo ZHU - - * mail-source.el (mail-source-fetch-maildir): Don't insert - newlines. - -2000-10-02 20:14:27 ShengHuo ZHU - - * dgnushack.el (dgnushack-compile): Don't compile dgnushack.el, - lpath.el. Don't compile base64.el if there is builtin base64. - -2000-10-02 Bj,Av(Brn Torkelsson - - * base64.el (Repository): Use featurep for XEmacs test. - -2000-10-02 17:38:12 ShengHuo ZHU - - * nntp.el (nntp-retrieve-data): Don't ignore quit. - -2000-10-02 14:43:13 ShengHuo ZHU - - * gnus-art.el (gnus-article-banner-alist): New variable. - (article-strip-banner): Use it. - * gnus-cus.el (gnus-group-parameters): Allow symbol. - -2000-10-02 Dave Love - - * smiley-ems.el: New file. - - * gnus-ems.el (gnus-smiley-display): Autoload. - (mouse-set-point, set-face-foreground, set-face-background) - (x-popup-menu): Don't clobber these. - (gnus-article-compface-xbm): New variable. - (gnus-article-display-xface): Move graphic test. Use unibyte. - Obey gnus-article-compface-xbm. Use pbm, not xbm. - - * mml.el (require): Fix typo. - (mml-parse-1): Modify unknown encoding prompt. - - * mail-source.el (mail-sources): Revert to nil. - - * nnmail.el (nnmail-spool-file): Revert previous change. - - * gnus.el: Don't require custom, message. - (gnus-message-archive-method): Wrap initializer in progn and - require message here. - -2000-10-02 Gerd Moellmann - - * gnus.el (gnus-mode-line-buffer-identification) [Emacs]: Change - image's :ascent to 80. That gives a mode-line which is approx. - as tall as the normal one. - -2000-10-02 08:04:48 ShengHuo ZHU - - * webmail.el (webmail-hotmail-list): Fix. - -2000-10-01 20:55:53 ShengHuo ZHU - - Don't postpone GCC if none of GCC methods is agent-covered. This - fix presumes that the post-method must be agent-covered if any Gcc - method is agent-covered. - - * gnus-msg.el (gnus-inews-group-method): New function. - (gnus-inews-do-gcc): Use it. - * gnus-agent.el (gnus-agent-any-covered-gcc): New function. - (gnus-agent-possibly-save-gcc): Use it. - (gnus-agent-possibly-do-gcc): Ditto. - -2000-10-01 17:08:50 ShengHuo ZHU - - * mailcap.el (mailcap-mime-types): Use mailcap-mime-data. - * mml.el (mml-minibuffer-read-type): Use mailcap-mime-types. - -2000-10-01 13:07:21 ShengHuo ZHU - - * webmail.el (webmail-netscape-open, webmail-hotmail-article, - webmail-hotmail-list): Update. - -2000-10-01 08:36:09 ShengHuo ZHU - - * mail-source.el (mail-source-report-new-mail): Use - nnheader-cancel-timer. - -2000-10-01 08:35:38 ShengHuo ZHU - - * lpath.el (overlay-*): Shut up. - * dgnushack.el: Two implementations of smiley. - -2000-10-01 08:32:42 ShengHuo ZHU - - * gnus-ml.el: Usage. - (gnus-mailing-list-archive, gnus-mailing-list-owner, - gnus-mailing-list-post, gnus-mailing-list-unsubscribe, - gnus-mailing-list-subscribe, gnus-mailing-list-help): Bind list-*. - (gnus-mailing-list-menu): Define it. - (turn-on-gnus-mailing-list-mode, gnus-mailing-list-mode): Autoload. - - * gnus-xmas.el (gnus-xmas-mailing-list-menu-add): Move here. - -2000-09-30 18:52:51 ShengHuo ZHU - - * webmail.el (webmail-my-deja-*): Rewrite. - -2000-09-30 Simon Josefsson - - * nnimap.el (nnimap-request-accept-article): Remove \n's from - From_ lines. - -2000-08-05 Simon Josefsson - - Make GCC to remote groups work when unplugged - (postpone GCC until message is actually sent). - - * gnus-draft.el (gnus-draft-send): Call `gnus-agent-restore-gcc'. - - * gnus-agent.el (gnus-agent-possibly-do-gcc): - (gnus-agent-restore-gcc): - (gnus-agent-possibly-save-gcc): New functions. - - * gnus-msg.el (gnus-inews-add-send-actions): Use - `gnus-agent-possibly-do-gcc' if Agentized. - (gnus-inews-add-send-actions): Add `gnus-agent-possibly-save-gcc' - to `message-header-hook'. - - * gnus.el (gnus-agent-gcc-header): New variable. - -2000-07-13 Simon Josefsson - - Asks the user to synch flags with server when you plug in. - - * gnus-agent.el (gnus-agent-synchronize-flags): New variable. - (gnus-agent-possibly-synchronize-flags-server): New function, use it. - (gnus-agent-toggle-plugged): Call it. - (gnus-agent-synchronize-flags): Renamed from `gnus-agent-synchronize'. - (gnus-agent-group-mode-map): `g-a-s' -> `g-a-s-flags'. - (gnus-agent-possibly-synchronize-flags): New function. - (gnus-agent-possibly-synchronize-flags-server): New function. - -2000-09-30 Simon Josefsson - - * starttls.el: New file, by Daiki Ueno. - -2000-08-02 Stanislav Shalunov - - * message.el (message-make-in-reply-to): In-Reply-To is message-id - (see DRUMS). - -2000-09-29 Simon Josefsson - - * nntp.el (nntp-async-trigger): Fix authinfo in asynchronous - prefetch. - -2000-08-09 10:21:20 Katsumi Yamaoka - - * nntp.el (nntp-open-telnet): Wait for the telnet prompt before - sending a command; allow the rtelnet prompt as well. - -2000-09-29 Simon Josefsson - - * message.el (message-send): Make sure error is signalled if no - send method is specified. - -2000-09-29 Florian Weimer - - * qp.el (quoted-printable-encode-region): Wrap with - `mm-with-unibyte-current-buffer'. - -2000-09-29 12:12:49 ShengHuo ZHU - - * gnus-agent.el (gnus-agent-fetch-group-1): Reimplement Mike - McEwan's proposal. - -2000-09-29 12:06:40 ShengHuo ZHU - - * gnus-agent.el: Revoke Mike McEwan's 1998-09-05 patch due to - the GNU assignment issue. - -2000-09-29 09:56:34 ShengHuo ZHU - - * nndoc.el (nndoc-dissect-mime-parts-sub): Correctly mark body-begin. - -2000-09-29 09:14:08 ShengHuo ZHU - - * gnus-sum.el (gnus-summary-enter-digest-group): Decode to-address. - -2000-09-28 Kai Gro,A_(Bjohann - - * gnus-art.el (article-strip-banner): Use - gnus-group-find-parameter rather than gnus-group-get-parameter, to - allow inheritance on the banner. - From elkin@tverd.astro.spbu.ru. - -2000-09-26 Richard M. Alderson III - - * gnus-art.el (gnus-read-save-file-name): expand-file-name. - -2000-09-26 Dave Love - - * gnus-draft.el: Don't require gnus-agent. - - * mm-view.el: Use featurep for XEmacs test. - (mm-inline-message): Test for `remove-specifier'; don't use - condition-case. - -2000-09-24 Simon Josefsson - - * nnimap.el (nnimap-request-accept-article): Remove From[^:] lines. - - * gnus-group.el (gnus-group-nnimap-edit-acl): Check if server - support ACL's. - - * nnimap.el (nnimap-acl-get): Check capability. - - * mail-source.el (mail-source-imap-file-coding-system): New variable. - (mail-source-fetch-imap): Use it. - - * rfc2104.el (rfc2104-hexstring-to-bitstring): New function. - (rfc2104-hash): Use it. - - * imap.el (imap-starttls-p): Check for starttls binary. - (imap-starttls-open): More verbose. - (imap-gssapi-auth): Ditto. - (imap-kerberos4-auth): Ditto. - (imap-cram-md5-auth): Ditto. - (imap-login-auth): Ditto. - (imap-anonymous-auth): Ditto. - (imap-digest-md5-auth): Ditto. - (imap-open): Ditto. - (imap-digest-md5-p): Check capability first. - -2000-09-24 Simon Josefsson - - * imap.el (imap-parse-flag-list): Correctly parse empty lists. - (imap-login-p): Support LOGINDISABLED. - -2000-09-23 Simon Josefsson - - * rfc2104.el: Add SHA-1 example. - -2000-09-22 Simon Josefsson - - * imap.el (imap-parse-body): Work around bug in Sun SIMS. - -2000-09-21 21:54:48 ShengHuo ZHU - - * lpath.el: Bind nnkiboze-score-file. - -2000-09-21 16:15:25 ShengHuo ZHU - - * gnus-score.el (gnus-score-use-all-scores): New variable. - (gnus-all-score-files): Use it. - * nnkiboze.el (nnkiboze-generate-group): Use it. Inhibit list groups. - (nnkiboze-enter-nov): Fix it when there is no xref. - (nnkiboze-generate-groups): List groups. - * gnus-group.el (gnus-group-make-kiboze-group): Use - nnkiboze-score-file. - - * nnkiboze.el (nnkiboze-request-article): Use - gnus-cache-request-article. - * gnus-group.el (gnus-group-make-kiboze-group): Fix prompt. - -2000-07-16 Dmitry Bely - - * nnheader.el (nnheader-translate-file-chars): Path splitting on NT. - -2000-09-20 18:33:00 ShengHuo ZHU - - * gnus-score.el (gnus-score-find-bnews): Use directory-sep-char. - -2000-09-20 17:37:46 ShengHuo ZHU - - * message.el (message-default-charset): Set default value in - non-MULE XEmacsen as iso-8859-1. - -2000-09-20 12:02:24 ShengHuo ZHU - - * gnus-demon.el: Use (featurep 'xemacs). - * gnus-agent.el: timer vs. itimer. - * mail-source.el: Ditto. - -2000-09-19 10:24:57 ShengHuo ZHU - - * gnus-group.el (gnus-group-make-kiboze-group): Makedir. - * nnheader.el (nnheader-parse-nov): Remove Xref in mail-header-xref. - * gnus-sum.el (gnus-nov-parse-line): Ditto. - * nnkiboze.el (nnkiboze-file-coding-system): New. - (nnkiboze-retrieve-headers): Use it. - (nnkiboze-request-group): Ditto. - (nnkiboze-close-group): Ditto. - (nnkiboze-generate-group): Ditto. - (nnkiboze-enter-nov): Insert first Xref properly. - -2000-09-19 Dave Love - - * nnmail.el (nnmail-cache-accepted-message-ids): Default to nil. - (nnmail-get-new-mail): Test `sources' in top-level conditional. - - * mail-source.el (mail-sources): Change default to '((file)). - Add useful custom type. - -2000-09-18 Kai Gro,A_(Bjohann - - * gnus-util.el (gnus-time-iso8601): Correct doc string (four digit - year). - (gnus-date-iso8601): Ditto. - -2000-09-18 09:05:46 ShengHuo ZHU - - * mail-source.el (mail-source-fetch-imap): Disable multibyte. - -2000-09-17 01:13:46 ShengHuo ZHU - - * rfc2047.el (rfc2047-q-encoding-alist): Remove = and _ from the - pattern. Avoid using 8 bit chars. - * qp.el (quoted-printable-encode-region): Avoid using 8 bit chars. - -2000-09-16 15:57:42 ShengHuo ZHU - - * smiley.el (smiley-buffer-ems, smiley-create-glyph-ems, - smiley-toggle-extent-ems, smiley-toggle-extents-ems, - smiley-toggle-buffer-ems): New functions for Emacs 21. Toggle - functions are not implemented yet. - - * dgnushack.el (dgnushack-compile): Remove smiley.el and - x-overlay.el from the FSF Emacs black list. - -2000-09-15 21:10:20 ShengHuo ZHU - - * mm-decode.el (mm-inlined-types): Add application/emacs-lisp. - (mm-inline-media-tests): Ditto. - (mm-automatic-display): Ditto. - * mm-view.el (mm-display-inline-fontify): Generalize from - mm-display-patch-inline. - (mm-display-patch-inline): Use it. - (mm-display-elisp-inline): Ditto. - -2000-09-15 14:03:00 ShengHuo ZHU - - * gnus-topic.el (gnus-topic-find-groups): Add recursive parameter. - (gnus-topic-unmark-topic): Ditto. - (gnus-topic-mark-topic): Ditto. - (gnus-topic-get-new-news-this-topic): Use it. - -2000-09-15 09:01:40 ShengHuo ZHU - - * gnus-art.el (gnus-treat-display-xface): By default, Emacs 21 - display xface. - -2000-08-23 02:54:46 Katsumi Yamaoka - - * gnus-group.el (gnus-group-rename-group): Inhibit renaming of - zombie or killed groups. - -2000-09-15 00:09:56 ShengHuo ZHU - - * mml.el (mml-preview): Reinsert unibyte content. - (mml-parse-1): Remove with-unibyte-current-buffer. - (mml-generate-mime-1): Ditto. - * gnus-msg.el (gnus-summary-mail-forward): Ditto. - * message.el (message-forward): Ditto. - -2000-09-14 23:13:50 ShengHuo ZHU - - * gnus-art.el (article-de-quoted-unreadable): Guess charset from - original article buffer. - (article-de-base64-unreadable): Ditto. - (article-wash-html): Ditto. - -2000-09-14 18:55:30 ShengHuo ZHU - - * gnus-msg.el (gnus-summary-mail-forward): Disable multibyte - unless forward-show-mml. - -2000-09-14 14:48:57 ShengHuo ZHU - - * gnus-sum.el (gnus-summary-save-parts-type-history): New. - (gnus-summary-save-parts-last-directory): New. - (gnus-summary-save-parts): Save history. - -2000-09-14 Ben Gertzfield - - * gnus-sum.el (gnus-summary-save-parts-default-mime): New - variable. - (gnus-summary-save-parts): Use it. - -2000-09-14 11:31:28 ShengHuo ZHU - - * gnus-art.el (gnus-article-setup-buffer): Clean handle-alist. - * gnus-sum.el (gnus-summary-exit): Ditto. - (gnus-summary-exit-no-update): Ditto. - (gnus-summary-show-article): Ditto. - -2000-09-14 08:42:48 ShengHuo ZHU - - * nndoc.el (nndoc-dissect-mime-parts-sub): Remove - Content-Disposition. - -2000-09-13 23:58:40 ShengHuo ZHU - - * webmail.el: Hotmail updated. Add X-Gnus-Webmail. - -2000-09-13 21:41:25 ShengHuo ZHU - - * gnus-art.el (gnus-article-setup-buffer): Set - gnus-article-mime-handles to nil. - * gnus-sum.el (gnus-summary-exit): Ditto. - (gnus-summary-exit-no-update): Ditto. - (gnus-summary-show-article): Ditto. - (gnus-summary-save-parts): Use gnus-article-mime-handles if - dissected. - * mm-partial.el (mm-partial-find-parts): Remove redundancy. - -2000-09-13 16:59:33 ShengHuo ZHU - - * gnus-sum.el (gnus-summary-sort): Sort loose threads too. - (gnus-sort-threads-1): New function. Sort threads recursively. - (gnus-sort-threads): Use it. - (gnus-sort-gathered-threads): Doc fix. - -2000-09-13 Dave Love - - * gnus-salt.el (gnus-binary-mode): Fix call to gnus-add-minor-mode. - - * gnus-ems.el (gnus-ems-redefine): Don't alias - gnus-summary-set-display-table. - - * message.el (message-user-agent): Don't wrap ignore-errors around - it. - - * mm-encode.el (mm-insert-multipart-headers): Avoid redundant - `format'. - (mm-content-transfer-encoding): Don't use cadar. - - * uudecode.el (uudecode-decoder-program) - (uudecode-decoder-switches): Customize. - - * gnus-score.el (gnus-home-score-file): Improve custom type. - - * gnus-cus.el (gnus-custom-mode): Conditionally set local - variables for Emacs 21. - (gnus-group-customize): Disable undo while laying out the buffer. - -2000-09-13 09:38:26 ShengHuo ZHU - - * gnus-util.el (gnus-write-active-file): Bind - coding-system-for-write. - -2000-09-13 09:14:57 ShengHuo ZHU - - * nnmail.el (nnmail-get-new-mail): Don't test nnmail-spool-file. - - * gnus-cache.el (gnus-jog-cache): Temporarily disable mail-sources. - * gnus-kill.el (gnus-batch-score): Ditto. - * gnus-move.el (gnus-change-server): Ditto. - * nnkiboze.el (nnkiboze-generate-groups): Ditto. - -2000-09-12 Simon Josefsson - - * gnus-sum.el (gnus-update-read-articles): Undo - `gnus-request-set-mark' operation. - -2000-09-11 Dave Love - - * Changelog: Use iso-2022 coding. - - * gnus-msg.el (gnus-msg-mail): New function. - (gnus-user-agent): New mail agent. - -2000-09-10 Dave Love - - * message.el: Require mail-abbrevs for XEmacs for a problem with - keybinding despite the autoloads for it. - -2000-09-08 Simon Josefsson - - * imap.el (imap-kerberos4-open): Erase more (fixes race condition?). - - * nnimap.el (nnimap-request-update-info-internal): Remove tick - marks from dormant articles. (See nnimap-request-set-mark.) - (nnimap-retrieve-headers-progress): Demule. - (nnimap-open-server): Call nnoo-change-server twice, once for - getting the nnimap-server-buffer and once for letting n-c-s set - the variables in that buffer. - -2000-09-08 David Edmondson - - * gnus.el (gnus-short-group-name): Guess separator. - -2000-09-07 Tadashi Watanabe - - * smiley.el (smiley-buffer, smiley-create-glyph): Work with GTK - XEmacs as well. - -2000-09-06 Francis Litterio - - * gnus-group.el (gnus-group-insert-group-line): Fix. - -2000-09-04 Dave Love - - * mm-decode.el (mime-display) : Add `multimedia' group. - (mm-get-image): Avoid the losing `make-glyph' from W3. - -2000-09-03 Simon Josefsson - - * gnus-sum.el (gnus-summary-delete-article): Check server. - -2000-09-01 Simon Josefsson - - * imap.el (imap-parse-flag-list): Rewrite. - - * nnimap.el (nnimap-retrieve-headers-from-file): Ignore errors. - - * imap.el (imap-parse-flag-list): Hack. - -2000-08-29 Dave Love - - * gnus-mlspl.el (gnus-group-split-fancy): Eschew mapcon. - - * dgnushack.el (mapcon, union): Remove compiler macros. - - * gnus-agent.el (gnus-agent-union): new function. - (gnus-agent-fetch-headers): Use it. - - * gnus.el (gnus-group-startup-message): Specify foreground and - background for xpm image. Centre image vertically. - From Katsumi Yamaoka with mods. - -2000-08-24 23:49:23 ShengHuo ZHU - - * message.el (message-send-mail): Narrow-to-headers. - -2000-08-24 Dave Love - - * gnus-art.el (gnus-insert-mime-button): Fix help-echo for Emacs - 21. - -2000-08-23 Dave Love - - * dgnushack.el: Remove `member-if' compiler macro. - -2000-08-21 Dave Love - - * nnimap.el (nnimap-request-newgroups): Eschew member-if. - -2000-08-21 10:09:47 ShengHuo ZHU - - * gnus-topic.el (gnus-topic-hide-topic): Use find-topology if - permanent is used. - (gnus-topic-show-topic): Read topic when to show permanent hidden - topic. - (gnus-topic-remove-topic): Revert to the old behavior, not using - hide. - -2000-08-21 Dave Love - - * gnus-ems.el (gnus-add-minor-mode): Add &rest arg. - (gnus-xemacs): Use featurep. - - * mm-util.el (mm-read-charset): Maybe use builtin. - (mm-replace-chars-in-string): Maybe use subst-char-in-string. - (mm-multibyte-p, mm-with-unibyte-current-buffer) - (mm-with-unibyte): Use featurep, not string-match. - (mm-with-unibyte-buffer): Simplify. - (mm-quote-arg): Maybe use shell-quote-argument. - - * mml.el (mml-make-string): Deleted (unused). - - * gnus.el (gnus-mode-line-buffer-identification): Supply - definition for Emacs 21. - - * gnus-salt.el: Small doc fixes. - (gnus-pick-mode, gnus-binary-mode): Supply a toggle-func arg to - gnus-add-minor-mode. - - * gnus-topic.el (gnus-topic-mode): Supply a toggle-func arg to - gnus-add-minor-mode. - -2000-08-20 Simon Josefsson - - * nnimap.el (nnimap-before-find-minmax-bugworkaround): New - function, thanks to Lloyd Zusman for debugging. - (nnimap-request-group): - (nnimap-request-list): - (nnimap-retrieve-groups): - (nnimap-request-newgroups): Use it. - - * nnimap.el (nnimap-request-article-part): Less verbose. - -2000-08-19 Andreas Jaeger - - * lpath.el ((string-match "XEmacs" emacs-version)): Remove - subst-char-in-string since we test elsewhere whether it's bound. - -2000-08-18 Dave Love - - * gnus-score.el (gnus-score-find-score-files-function): Fix doc, - custom type. - - * gnus-xmas.el (gnus-group-icon-create-glyph): Don't test - gnus-group-running-xemacs. - - * nnheader.el (nnheader-replace-chars-in-string): Use - subst-char-in-string if available. - - * gnus-art.el (gnus-read-save-file-name, gnus-plain-save-name) - (gnus-request-article-this-buffer): Use expand-file-name. - (gnus-mime-view-part-as-type): Simplify interactive spec. - (gnus-mime-button-map): Define it all in defvar. - -2000-08-17 Dave Love - - * gnus-group.el (gnus-group-running-xemacs): Deleted. - - * gnus-demon.el (gnus-demon): Bind use-dialog-box and - last-nonmenu-event. - - * uudecode.el (char-int): Use defalias, not fset. - - * score-mode.el: Don't require easymenu. Require mm-util. - (score-mode-coding-system): Use mm-auto-save-coding-system. - - * nneething.el (nneething-create-mapping): Don't use cadar & al. - (nneething-file-name): Use expand-file-name, not concat. - -2000-08-16 13:05:46 ShengHuo ZHU - - * nnslashdot.el (nnslashdot-threaded-retrieve-headers): - Failure proof for email addresses. - (nnslashdot-sane-retrieve-headers): Ditto. - -2000-08-14 20:08:40 Lars Magne Ingebrigtsen - - * message.el (message-send-mail): Only insert courtesy message - when text/plain. - -2000-08-14 19:55:04 Jesper Harder - - * message.el (message-cancel-news): Copy the From header from the - original article. - -2000-08-14 19:52:01 Lars Magne Ingebrigtsen - - * gnus-async.el (gnus-asynchronous): Removed. - -2000-08-14 16:12:11 ShengHuo ZHU - - * mail-source.el (mail-source-fetch-maildir): Use MMDF mail - format. - -2000-08-14 19:12:22 Rod Whitby - - * nnmail.el (nnmail-expiry-target-group): Fixed. - -2000-08-14 Rod Whitby - - * nnmail.el (nnmail-expiry-target-group): Fix the call to - gnus-request-accept-article so that body encoding is *not* done. - Encoding is not done on incoming mail, so why should it be done on - expired mail? - - -2000-08-14 Rod Whitby - - * nnml.el (nnml-request-expire-articles): Fix the calls to - nnml-request-article (the filename was being passed instead of the - article number) and nnmail-expiry-target-group - (nnml-current-directory is changed by nnml-request-accept-article, - causing it to be incorrect for the next article to be expired). - -2000-08-14 Rod Whitby - - * gnus-sum.el (gnus-summary-expire-articles): Fix the handling of - expiry-target group parameters. - -2000-08-13 18:53:08 Lars Magne Ingebrigtsen - - * gnus-topic.el (gnus-topic-select-group): Touch the dribble - buffer. - (gnus-topic-hide-topic): Take a PERMANENT parameter. - (gnus-topic-show-topic): Ditto. - - * gnus-dup.el (gnus-dup-suppress-articles): Do auto-expiry. - -2000-08-12 21:48:00 John H. Palmieri - - * mail-source.el (mail-source-incoming-file-prefix): New - variable. - -2000-08-12 20:29:53 Lars Magne Ingebrigtsen - - * gnus-start.el (gnus-check-first-time-used): Clean up a bit. - - * mailcap.el (mailcap-maybe-eval): Be even more warning. - -2000-08-11 Florian Weimer - - * message.el (message-syntax-checks): New check quotin-style: - Text must be written below quoted text. - (message-check-news-body-syntax): Check it. - -2000-08-11 Simon Josefsson - - * imap.el (imap-authenticator-alist): Fix typo. - (imap-gssapi-open): Copy krb4 fixes for modern imtest's, thanks to - Jonas Oberg for debugging. - -2000-08-11 Simon Josefsson - - * gnus-async.el (gnus-asynchronous): Disable by default. - -2000-08-10 20:22:09 Lars Magne Ingebrigtsen - - * mm-view.el (mm-inline-text): Bind fill-column. - - * nnvirtual.el (nnvirtual-request-expire-articles): Return the - list of unexpired articles. - - * gnus-group.el (gnus-group-expire-articles-1): Return the list of - un-expired articles. - - * gnus-sum.el (gnus-summary-reparent-thread): Narrow to the - headers. - - * gnus-topic.el (gnus-topic-kill-group): Move up one line so that - we update the right topic.. - - * mm-decode.el (mm-display-external): Put point at start. - -2000-08-10 Kai Gro,A_(Bjohann - - * nnmail.el (nnmail-expiry-target): More explicit documentation. - - * gnus-cus.el (gnus-group-parameters): Add parameter `expiry-wait'. - -2000-08-09 Simon Josefsson - - * imap.el (imap-parse-body): - (imap-parse-string-list): Add bug workarounds for Stalker - Communigate Pro 3.0 server. - (imap-body-lines): Remove bogus comment. - - * imap.el (imap-range-to-message-set): Move from nnimap.el. - - * nnimap.el (nnimap-retrieve-which-headers): - (nnimap-retrieve-headers-from-server): - (nnimap-request-set-mark): - (nnimap-request-expire-articles): Use `i-r-t-m-set' instead. - -2000-08-08 00:53:41 ShengHuo ZHU - - * message.el (message-dont-reply-to-names): - rmail-dont-reply-to-names may not be defined. - -2000-08-07 09:37:01 ShengHuo ZHU - - * gnus-group.el (gnus-group-iterate): Uncompiled function should - not use pop. - -2000-07-19 Dave Love - - * gnus-ems.el: Defalias some dummy funcs to `ignore'. - (gnus-x-splash): Use expand-file-name. Remove redundant facep - check. - (gnus-article-display-xface): Special-case for dark backgrounds. - -2000-07-19 Kim-Minh Kaplan - - * imap.el (imap-calculate-literal-size-first): New variable. - (imap-local-variables): Add it. - (imap-kerberos4-open): Set it. - (imap-send-command): Use it. - -2000-07-17 14:18:16 ShengHuo ZHU - - * mailcap.el (mailcap-mimetypes-parsed-p): New variable. - (mailcap-parse-mimetypes): Use it. - (mailcap-extension-to-mime): Parse mimetype. - (mailcap-mime-types): Ditto. - * mml.el (mml-minibuffer-read-type): Ditto. - -2000-07-16 18:25:07 ShengHuo ZHU - - * nndoc.el (nndoc-type-alist): Add outlook. - (nndoc-outlook-type-p): New function. - (nndoc-outlook-article-begin): Ditto. - -2000-07-16 Daiki Ueno - - * gnus-sum.el (gnus-restore-hidden-threads-configuration): Save - excursion. - -2000-07-15 Simon Josefsson - - * gnus-cus.el (gnus-group-parameters, banner): Type is regexp. - - * imap.el (imap): - (imap-kerberos4-program): - (imap-gssapi-program): - (imap-ssl-program): Customization. - (imap-shell-program): - (imap-shell-host): New variables. - (imap-streams): - (imap-stream-alist): Add shell. - (imap-shell-p): - (imap-shell-open): New functions. - (imap-open): Don't call authenticator if preauth. - (imap-authenticate): Return t if already authenticated. - -2000-07-14 Simon Josefsson - - * gnus.el (gnus-invalid-group-regexp): New variable. - (gnus-read-group): Use it. - -2000-07-14 12:40:51 ShengHuo ZHU - - * gnus-agent.el (gnus-agent-fetch-group-1): mark-below, - expunge-below and orphan-score are "group variables". - -2000-07-13 Simon Josefsson - - * gnus-srvr.el (gnus-browse-read-group): Don't pass fully - qualified group names to `gnus-group-read-ephemeral-group'. - -2000-07-13 07:40:39 Katsumi Yamaoka - - * dgnushack.el (srcdir): Define it before use it. - -2000-07-12 19:37:50 ShengHuo ZHU - - * gnus-sum.el: `W t' is toggle-header in info. - -2000-07-12 16:50:06 ShengHuo ZHU - - * lpath.el: Fbind subst-char-in-string. - -2000-07-12 15:48:29 ShengHuo ZHU - - * Makefile.in: Use W3DIR and lispdir. - * dgnushack.el: Ditto. - -2000-07-12 10:12:31 ShengHuo ZHU - - * gnus-art.el (article-de-base64-unreadable): Typo. - -2000-07-12 Simon Josefsson - - * gnus-agent.el (require): Require timer. - -2000-07-11 18:29:50 ShengHuo ZHU - - * message.el (message-bounce): Call mime-to-mml. - -2000-07-11 18:00:49 Lars Magne Ingebrigtsen - - * nnslashdot.el (nnslashdot-request-close): New function. - -2000-07-04 23:23:23 Lars Magne Ingebrigtsen - - * nnslashdot.el (nnslashdot-threaded-retrieve-headers): Get the - right line number for the article. - -2000-07-10 22:41:58 ShengHuo ZHU - - * nnslashdot.el (nnslashdot-threaded-retrieve-headers): Save point. - * webmail.el (webmail-fetch): Bind - url-http-silence-on-insecure-redirection. - -2000-07-10 11:43:22 ShengHuo ZHU - - * nnslashdot.el (nnslashdot-threaded-retrieve-headers): Use - unibyte. - (nnslashdot-sane-retrieve-headers): Ditto. - (nnslashdot-request-article): Ditto. - -2000-07-10 11:12:32 William M. Perry - - * mailcap.el (mailcap-parse-mimetype-file): - -2000-07-07 23:46:22 ShengHuo ZHU - - * nnweb.el (nnweb-insert): Stricter test. - * webmail.el (webmail-refresh-redirect): Ditto. - -2000-07-06 14:17:48 ShengHuo ZHU - - * mm-decode.el (mm-dissect-multipart): Match the EOL of boundary. - -2000-07-05 21:19:22 ShengHuo ZHU - - * nnheader.el (nnheader-insert-nov): Remove EOLs of all fields. - -2000-07-05 Dave Love - - * utf7.el: Doc and header fixes. - - * gnus-sum.el: Doc fixes. - - * gnus-util.el (gnus-point-at-eol, gnus-point-at-bol): Use - defalias, not fset. - - * flow-fill.el (fill-flowed-point-at-eol) - (fill-flowed-point-at-bol): Use defalias, not fset. - - * gnus-art.el: Don't alias article-mime-decode-quoted-printable. - (gnus-Plain-save-name): Delete -- apparently bogus. - -2000-07-03 00:12:26 Lars Magne Ingebrigtsen - - * nnsoup.el: Use expand-file-name throughout. - -2000-07-03 00:07:51 Kjetil Torgrim Homme - - * nnmail.el (nnmail-read-incoming-hook): New example. - -2000-07-02 23:17:23 Lars Magne Ingebrigtsen - - * mm-view.el (mm-inline-text): Check whether the text has already - been decoded. - -2000-07-04 15:17:05 ShengHuo ZHU - - * nnslashdot.el (nnslashdot-sid-strip): To strip or not to strip? - -2000-07-03 Stainless Steel Rat - - * gnus-sum.el (gnus-recenter): Fix horizontal recenter. - -2000-07-03 Simon Josefsson - - * gnus-sum.el (gnus-update-marks): Don't propagate download and - unsend flags. - -2000-07-03 Simon Josefsson - - * nnimap.el (nnimap-open-connection): Don't look up virtual server - name in authinfo (.authinfo now support ports, no need for the - hack). - (nnimap-split-find-rule): Fix. - (nnimap-open-connection): Look for nnimap-server-address in authinfo. - -2000-07-03 Paul Stodghill - - * message.el (message-unquote-tokens): Remove all quotes. - -2000-07-03 00:29:08 Julien Gilles - - * gnus-ml.el: New file. - -2000-07-02 16:11:25 Lars Magne Ingebrigtsen - - * nnultimate.el (nnultimate-request-close): New function. - - * gnus-start.el (gnus-clear-system): Clear nnmail-split-history. - -2000-06-18 Norbert Koch - - * Makefile.in: Better support for xemacs builds - -Sun Jul 2 15:11:35 2000 Lars Magne Ingebrigtsen - - * gnus.el: Gnus v5.8.7 is released. - -2000-05-19 06:32:52 Lars Magne Ingebrigtsen - - * mm-decode.el (mm-insert-part): Characters doubly decoded. - -2000-07-01 10:23:08 Shenghuo ZHU - - * message.el (message-do-fcc): Encode MIME. - -2000-06-28 13:52:57 Shenghuo ZHU - - * lpath.el: Fbind image-size. - -2000-06-28 Simon Josefsson - - * nnimap.el (nnimap-split-rule): Update doc with extended syntax. - (nnimap-assoc-match): New function. - (nnimap-split-find-rule): Support extended syntax. - -2000-06-28 Simon Josefsson - - * nnimap.el (nnimap-open-connection): Use port stuff. - - * gnus-util.el (gnus-netrc-machine): Add defaultport parameter, - document port and defaultport. - -2000-06-27 Paul Stodghill - - * gnus-agent.el (gnus-agent-synchronize): Kill flags buffer. - -2000-06-26 Dave Love - - * mm-decode.el (mm-image-fit-p): Use `image-size' in Emacs. - - * message.el: Remove unnecessary `require'ments. Defvar - gnus-list-identifiers when compiling. Don't try to autoload - variable `gnus-list-identifiers'. Autoload - gnus-group-name-charset. - (message-fetch-field): Don't assume `format' removes text - properties. - (message-strip-list-identifiers, message-reply, message-followup): - Require gnus-sum. - (message-mode): Tidy XEmacs conditionals. - (message-replace-chars-in-string): Use subst-char-in-string when - available. - - * gnus-xmas.el (gnus-xmas-define) : - Define if necessary. - - * gnus-art.el (gnus-article-edit-exit): Don't assume `format' - removes text properties. - - * gnus-srvr.el (gnus-browse-group-name): Likewise. - - * gnus-msg.el (gnus-copy-article-buffer): Likewise. - - * gnus-score.el (gnus-summary-score-entry): Likewise. - -2000-06-26 11:18:57 Katsumi Yamaoka - - * nnimap.el (nnimap-request-post): Fix parenthesis. - -2000-06-26 Paul Stodghill - - * message.el (message-unquote-tokens): New function. - - * gnus-msg.el (gnus-inews-do-gcc): Unquote gcc tokens. - - * nnimap.el (nnimap-request-post): Ditto. - -2000-06-21 Simon Josefsson - - * gnus.el (gnus-asynchronous): Removed (defined in gnus-async.el). - - * nnimap.el (nnimap-callback): Update for IMAP4rev1 servers (see - patch commited 2000-04-02). - -2000-06-20 Simon Josefsson - - * imap.el (imap-mailbox-examine-1): New function. - (imap-message-copyuid-1): - (imap-message-appenduid-1): Use it, instead of - `imap-mailbox-examine' which would utf-7 encode mailbox name - twice. - -2000-06-19 Dave Love - - * mm-uu.el Don't require message. Require cl when compiling. - -2000-06-17 18:58:46 Shenghuo ZHU - - * gnus-sum.el (gnus-summary-local-variables): gnus-orphan-score is - a local variable. - * gnus-sum.el (gnus-orphan-score): Move here. - -2000-06-10 09:33:36 Shenghuo ZHU - - * message.el (message-forward): Remove show-mml condition. - (message-forward-ignored-headers): Remove X-Gnus headers. - -2000-06-08 Simon Josefsson - - * gnus-cus.el (gnus-extra-group-parameters): Add uidvalidity. - -2000-06-08 12:34:26 Urban Engberg - - * gnus-demon.el (gnus-demon-scan-mail): Bind nnmail-fetched-sources. - -2000-06-08 12:27:55 Shenghuo ZHU - - * message.el (message-syntax-checks): Add type. - -2000-06-07 Dave Love - - * mm-view.el (mm-inline-image-emacs): Don't specify string for - put-image. - (mm-inline-image): Defalias, not fset. - - * gnus.el (gnus-group-startup-message): Don't specify string for - insert-image. - - * gnus-ems.el (gnus-add-minor-mode): Make it an alias if - add-minor-mode is available. - (gnus-article-display-xface): Don't specify string for - insert-image. - -2000-06-06 13:28:53 Shenghuo ZHU - - * gnus-topic.el (gnus-topic-remove-topic): Set hidden. - (gnus-topic-insert-topic-line): Use shownp. - (gnus-topic-hide-topic): Don't use hidden. - (gnus-topic-show-topic): Don't use hidden. - -2000-06-05 22:25:12 Shenghuo ZHU - - * gnus-cache.el (gnus-cache-possibly-enter-article): Bind coding - system. - * gnus-soup.el (gnus-soup-write-prefixes): Ditto. - * gnus-start.el (gnus-slave-save-newsrc): Ditto. - * gnus-util.el (gnus-output-to-rmail): Ditto. - (gnus-output-to-mail): Ditto. - (gnus-write-buffer): Ditto. - * gnus-uu.el (gnus-uu-save-article): Ditto. - -2000-06-04 15:05:16 Shenghuo ZHU - - * message.el (message-read-from-minibuffer): Typo. - -2000-06-03 13:36:46 Shenghuo ZHU - - * gnus-art.el (article-decode-charset): Override non-MIME forward - charset. - -2000-06-02 12:04:26 Shenghuo ZHU - - * mml.el (mml-quote-region): Correct the regexp. - * gnus-msg.el (gnus-summary-reply): mml-quote it. - -2000-06-02 11:57:15 Shenghuo ZHU - - * message.el (message-forward): Insert raw text. - * mml.el (mml-parse-1): Get raw text in unibyte mode. - (mml-generate-mime-1): Insert raw text in unibyte mode. - -2000-06-01 Florian Weimer - - * mm-bodies.el (mm-body-encoding): Always encoded if - `mm-use-ultra-safe-encoding' is set. - -2000-05-31 14:50:52 Shenghuo ZHU - - * mml.el (ange-ftp-name-format): Typo. - -2000-05-30 Simon Josefsson - - * gnus-start.el (gnus-get-unread-articles): If - `gnus-activate-group' and/or `gnus-check-server' return nil, don't - try to do anything on that server. - -2000-05-25 Simon Josefsson - - * gnus-group.el (gnus-group-nnimap-edit-acl): Help text updated - from latest draft. - -2000-05-08 Simon Josefsson - - * gnus-group.el (gnus-group-expire-articles-1): Make sure server - is open. - -2000-05-24 Dave Love - - * mml.el (mml-parse-file-name): Fix ange-ftp part. - -2000-05-22 Didier Verna - - * gnus.el (gnus-redefine-select-method-widget): new function, call - it once. Add an "other" entry for unknown but editable backend - name symbols. - * gnus-start.el (gnus-declare-backend): use it. - -2000-05-19 Dave Love - - * gnus-art.el (gnus-article-next-page): Revert last change. - -2000-05-19 09:56:07 Shenghuo ZHU - - * gnus-agent.el (gnus-agent-open-history): Open history in binary mode. - -2000-05-19 Dave Love - - * gnus-art.el (gnus-mime-externalize-part): Bind mm-inlined-types, - not mm-inline-large-images. - -2000-05-19 01:45:40 Shenghuo ZHU - - * mml.el (mml-parse-1): Don't test multiple-charsets within mml tag. - -2000-05-18 Dave Love - - * gnus-art.el: Use defalias, not fset. - (gnus-article-x-face-command): Don't test for xbm. - (gnus-article-next-page): Redisplay before testing point in window. - -2000-05-17 21:16:54 Shenghuo ZHU - - * gnus-group.el (gnus-group-mode-map): Add M-SPACE. - * mml.el (mml-mode-map): Comment out mml-narrow-to-part. - -2000-05-17 21:13:38 Jim Davidson - - * gnus-sum.el (gnus-summary-save-article-rmail): Use - gnus-summary-save-in-rmail. - * message.el (message-output): Ditto. - -2000-05-17 22:37:25 Katsumi Yamaoka - - * gnus-art.el (gnus-emphasize-whitespace-regexp): Doc fix. - -2000-05-17 14:03:49 Shenghuo ZHU - - * rfc2047.el (rfc2047-encode-message-header): Encode if the method - is a charset. - * message.el (message-send-news): Check group name charset. - * gnus-msg.el (gnus-post-news): Decode group name. - (gnus-inews-do-gcc): Encode group name. - -2000-05-17 10:16:32 Karl Kleinpaste - - * gnus-art.el (gnus-emphasize-whitespace-regexp): New variable. - * gnus-util.el (gnus-put-text-property-excluding-newlines): Use it. - -2000-05-17 02:25:11 Shenghuo ZHU - - * gnus-group.el (gnus-group-mark-line-p): New function. - (gnus-group-goto-group): New parameter. - (gnus-group-remove-mark): Use it. - * gnus-topic.el (gnus-topic-move-group): Ditto. - (gnus-topic-remove-group): Ditto. - -2000-05-17 00:49:09 Shenghuo ZHU - - * gnus-group.el (gnus-group-list-dormant): New function. - -2000-05-16 23:20:42 Shenghuo ZHU - - * gnus-agent.el (gnus-agent-synchronize): Use - nnheader-insert-file-contents. - (gnus-agent-save-active-1): Ditto. - (gnus-agent-write-active): Ditto. - (gnus-agent-expire): Ditto. - * gnus-cache.el (gnus-cache-read-active): Ditto. - * gnus-start.el (gnus-master-read-slave-newsrc): Ditto. - * gnus-sum.el (gnus-summary-import-article): Ditto. - - * gnus-agent.el (gnus-agent-write-servers): Bind coding-system. - (gnus-agent-save-group-info): Ditto. - (gnus-agent-save-alist): Ditto. - * gnus-util.el (gnus-make-directory): Ditto. - - * gnus-agent.el (gnus-agent-save-group-info): Disable multibyte. - -2000-05-16 21:13:24 Shenghuo ZHU - - * mml.el (mml-generate-mime-preprocess-function): New variable. - (mml-generate-mime-postprocess-function): New variable. - (mml-generate-mime-1): Use them. - -2000-05-16 18:15:24 Shenghuo ZHU - - * gnus-group.el (gnus-group-apropos): Group name charset. - * gnus-sum.el (gnus-set-mode-line): Ditto. - * gnus-group.el (gnus-group-decoded-name): New function. - (gnus-group-edit-group): Use it. - * gnus-cus.el (gnus-group-customize): Use it. - -2000-05-16 17:55:57 Karl Kleinpaste - - * gnus-util.el (gnus-put-text-property-excluding-newlines): Improve. - -2000-05-16 16:22:17 Shenghuo ZHU - - * gnus-group.el (gnus-group-name-charset-method-alist): New variable. - (gnus-group-name-charset-group-alist): Ditto. - (gnus-group-name-charset): New function. - (gnus-group-name-decode): New function. - (gnus-group-insert-group-line): Use them. - (gnus-group-prepare-flat-list-dead): Ditto. - (gnus-group-list-active): Ditto. - (gnus-group-describe-all-groups): Ditto. - (gnus-group-prepare-flat-list-dead-predicate): Ditto. - * gnus-srvr.el: (gnus-browse-foreign-server): Decode group name and - add gnus-group property. - (gnus-browse-group-name): Read gnus-group property. - -2000-05-16 15:27:08 Shenghuo ZHU - - * nnfolder.el (nnfolder-possibly-change-group): Use - file-name-coding-system instead of pathname-coding-system. - * nnmail.el (nnmail-find-file): Ditto. - (nnmail-write-region): Ditto. - * nnmh.el (nnmh-retrieve-headers): Ditto. - (nnmh-request-article): Ditto. - (nnmh-request-group): Ditto. - (nnmh-request-list): Ditto. - (nnmh-possibly-change-directory): Ditto. - (nnmh-active-number): Ditto. - * nnml.el (nnml-possibly-change-directory): Ditto. - (nnml-request-list): Ditto. - (nnml-request-article): Ditto. - (nnml-retrieve-headers): Ditto. - -2000-05-16 Simon Josefsson - - * nnimap.el (nnimap-request-accept-article): Don't unselect - mailbox if no mailbox is selected. - -2000-05-15 Per Abrahamsen - - * gnus-art.el (gnus-button-url-regexp): Revert earlier change. - Recognize domain names starting with `www.' as starting an URL. - -2000-05-15 09:46:47 Shenghuo ZHU - - * mail-source.el (mail-source-fetch-maildir): Insert "From ". - (mail-source-keyword-map): Add "subdirs" for maildir. - -2000-05-14 16:19:28 Shenghuo ZHU - - * nnmail.el (nnmail-scan-directory-mail-source-once): New variable. - (nnmail-get-new-mail): Use it. - * gnus-start.el (gnus-get-unread-articles): Ditto. - -2000-05-14 14:02:12 Shenghuo ZHU - - * gnus-sum.el (gnus-summary-edit-article): Better support for - nndraft:drafts. - * nndraft.el (nndraft-request-replace-article): New function, - bind nnmail-file-coding-system. - -2000-05-14 Dave Love - - * nnheader.el: Replace uses of `fset' with `defalias'. - (jka-compr-compression-info-list): Only defvar when compiling. - -2000-05-14 12:30:28 Shenghuo ZHU - - * webmail.el (webmail-netaddress-article): Refresh redirect. - -2000-05-13 20:41:10 Shenghuo ZHU - - * mm-view.el (mm-inline-text): w3 might not recognize utf-8. - -2000-05-13 16:49:41 Shenghuo ZHU - - * webmail.el: Translate   to SP. - -2000-05-13 13:00:17 Robin S. Socha - - * message.el (message-bounce): Doc typo. - -2000-05-13 12:25:21 Shenghuo ZHU - - * gnus-soup.el (gnus-soup-encoding-type): u is USENET news format. - (gnus-soup-store): Ditto. - (gnus-soup-send-packet): Ditto. - * nnsoup.el (nnsoup-replies-format-type): Ditto. - (nnsoup-dissect-buffer): Ditto. - (nnsoup-narrow-to-article): Ditto. - (nnsoup-make-active): Ditto - -2000-05-13 12:03:29 Shenghuo ZHU - - * message.el (message-mode): Two parameters for local-variable-p. - -2000-05-13 00:54:46 Shenghuo ZHU - - * message.el (message-strip-list-identifiers): New function. - (message-reply): Use it and use message-strip-subject-re. - (message-followup): Ditto. - * gnus-art.el (article-hide-list-identifiers): Remove more. - * gnus-sum.el (gnus-summary-remove-list-identifiers): Ditto. - -2000-05-12 22:28:54 Shenghuo ZHU - - * gnus-uu.el (gnus-uu-digest-mail-forward): Bind - mail-parset-charset and use non-numeric argument. - -2000-05-12 20:54:11 Shenghuo ZHU - - * mml.el (mml-buffer-list): New variable. - (mml-generate-new-buffer): New function. - (mml-destroy-buffers): Ditto. - (mml-insert-mime): Use them. - * gnus-msg.el (gnus-setup-message): mml-buffer leaks. - * gnus-sum.el (gnus-summary-edit-article): Ditto. - * message.el (message-mode): Ditto. - * gnus-uu.el (gnus-uu-digest-headers): Keep MIME headers. - (gnus-uu-save-article): Support show-as-mml. - * message.el (message-forward): Ditto. - -2000-05-12 15:15:55 Shenghuo ZHU - - * nndoc.el (nndoc-type-alist): mime-digest head-begin. - (nndoc-mime-digest-type-p): Locate article head precisely. - * mml.el (mml-generate-default-type): New variable. - (mml-generate-mime-1): Use it. - (mml-insert-mime-headers): Use it. - * gnus-uu.el (gnus-uu-digest-buffer): New variable. - (gnus-uu-digest-mail-forward): Use it and call message-forward - with argument digest. - (gnus-uu-save-article): Support message-forward-as-mime. - * message.el (message-forward): Add parameter digest. - * mm-decode.el (mm-dissect-default-type): New variable. - (mm-dissect-buffer): Use it. - -2000-05-11 11:08:03 Shenghuo ZHU - - * mml.el (mml-parse-singlepart-with-multiple-charsets): Set space, - newline and paragraph to nil when got a non-ascii character. Test - paragraph before newline. - -2000-05-10 12:17:58 Shenghuo ZHU - - * qp.el (quoted-printable-encode-region): Bind tab-width to 1. Set - limit to 76. - -2000-05-10 09:11:48 Lars Magne Ingebrigtsen - - * nnslashdot.el (nnslashdot-sid-strip): New function. - (nnslashdot-threaded-retrieve-headers): New format. - (nnslashdot-sane-retrieve-headers): Ditto. - (nnslashdot-request-article): Ditto. - (nnslashdot-threaded-retrieve-headers): Thread properly. - (nnslashdot-request-article): Be more lenient. - (nnslashdot-threaded-retrieve-headers): Regexp search. - -2000-05-09 13:23:50 Shenghuo ZHU - - * gnus-sum.el (gnus-with-article): Define it before use it. - -2000-05-08 22:34:19 Shenghuo ZHU - - * message.el (message-supersede): Use mime-to-mml. - * mm-decode.el (mm-insert-part): Test the buffer if no encoding. - -2000-05-08 22:34:24 Katsumi Yamaoka - - * gnus-group.el (gnus-group-list-cached): Don't use - `subst-char-in-string'. - -2000-05-08 Dave Love - - * pop3.el (pop3-open-server): Fix creating name of trace buffer. - -2000-05-08 01:07:47 Shenghuo ZHU - - * mm-decode.el (mm-interactively-view-part): Append %s if the - method is a single word. - * nnwarchive.el (nnwarchive-type-definition): Typo. - -2000-05-07 17:24:01 Shenghuo ZHU - - * gnus-group.el (gnus-group-prepare-flat-list-dead-predicate): New - function. - (gnus-group-prepare-flat-predicate): Use it. - (gnus-group-list-cached): List dead groups. - -2000-05-07 10:50:02 Shenghuo ZHU - - * gnus-art.el (article-decode-charset): Don't decode message with - format. - -2000-05-07 Florian Weimer - - * mailcap.el (mailcap-maybe-eval): Honor user request not to - evaluate the Lisp code. - -2000-05-06 17:40:20 Shenghuo ZHU - - * gnus-art.el (article-wash-html): New function. - (gnus-article-wash-html): Bind. - (gnus-article-make-menu-bar): Menu item. - * gnus-sum.el (gnus-summary-wash-map): Bind 'h'. - (gnus-summary-make-menu-bar): Menu item. - * gnus.el: Autoload. - -2000-05-06 Florian Weimer - - * gnus-uu.el (gnus-uu-unshar-warning): New variable. - (gnus-uu-unshar-article): Use it. - - * mailcap.el (mailcap-maybe-eval-warning): New variable. - (mailcap-maybe-eval): Use it. - - * gnus-msg.el (gnus-group-posting-charset-alist): Speling mistake - in docstring. - - * mml.el (mml-generate-mime-1): Small comment. - -2000-05-05 12:27:53 Shenghuo ZHU - - * gnus-art.el (article-de-base64-unreadable): New function. - (gnus-article-de-base64-unreadable): Bind. - (gnus-article-make-menu-bar): Menu item. - * gnus-sum.el (gnus-summary-wash-map): Bind '6' and 'Z'. - (gnus-summary-make-menu-bar): Menu item. - * gnus.el: Autoload. - -2000-05-05 10:32:27 Shenghuo ZHU - - * gnus-sum.el (gnus-summary-show-article): Remove en/disable multibyte. - (gnus-summary-select-article): Add en/disable multibyte. - -2000-05-05 02:47:23 Shenghuo ZHU - - * gnus-sum.el (gnus-summary-edit-article): Enable multibyte. - (gnus-summary-edit-article): New feature: editing raw articles. - -2000-05-05 00:30:12 Shenghuo ZHU - - * rfc2047.el (rfc2047-encode-region): Insert a space before encoding. - Emacs MULE can not encode adjacent iso-2022-jp and cn-gb-2312. - * gnus-msg.el (gnus-summary-mail-forward): Use unibyte buffer. - Emacs MULE can not copy some 8bit characters in multibyte buffers. - * mm-decode.el (mm-insert-part): Ditto. - -2000-05-04 17:49:04 Shenghuo ZHU - - * nndoc.el (nndoc-type-alist): Extend forward regexp. - (nndoc-forward-type-p): Ditto. - -2000-05-04 17:13:04 Shenghuo ZHU - - * mm-util.el (mm-with-unibyte-current-buffer): Set the default - value of enable-multibyte-characters. - -2000-05-04 10:31:24 Shenghuo ZHU - - * gnus-sum.el (gnus-summary-show-article): En/disable multibyte. - -2000-05-03 Dave Love - - * gnus-ems.el (gnus-article-xface-ring-internal) - (gnus-article-xface-ring-size): New variable. - (gnus-article-display-xface): Use them to cache data. Don't try - to use XPM. Set up binary coding for PBM's sake. - -2000-05-03 14:23:38 Shenghuo ZHU - - * gnus-msg.el (gnus-inews-do-gcc): Set mail-parse-charset. - * gnus-int.el (gnus-request-accept-article): Ditto. - (gnus-request-replace-article): Ditto. - * mm-util.el (mm-mime-mule-charset-alist): Add a fake mule-charset. - -2000-05-03 14:11:23 Shenghuo ZHU - - * rfc2047.el (rfc2047-encode): Test the validity of coding-system. - -2000-05-03 11:35:15 Shenghuo ZHU - - * rfc2047.el (rfc2047-encode-message-header): Encode field by - field. - * mml.el (mml-to-mime): Use message-default-charset. - (mml-preview): Narrow to headers. - * message.el (message-send-mail): Use message-default-charset. - (message-send-news): Narrow to headers; - use message-default-charset. - -2000-05-03 08:09:14 Shenghuo ZHU - - * mm-bodies.el (mm-decode-content-transfer-encoding): A better junk - detect. - * mml.el (mml-parse-singlepart-with-multiple-charsets): Save - restriction. - (mml-parse-1): Warning message. - (mml-preview): Disable multibyte. - -2000-05-03 Dave Love - - * gnus.el (gnus-group-startup-message): Add newline before image. - -2000-05-02 21:34:10 Shenghuo ZHU - - * rfc2047.el (rfc2047-encode-message-header): Check the coding-system. - * message.el (message-send-mail): Use unibyte-buffer. - (message-send-mail): Ditto. - -Mon May 1 15:09:46 2000 Lars Magne Ingebrigtsen - - * gnus.el: Gnus v5.8.6 is released. - -2000-05-01 07:45:43 Shenghuo ZHU - - * mml.el (mml-parse-1): Set no-markup-p and warn to nil. - -2000-04-28 21:14:21 Shenghuo ZHU - - * rfc2047.el (rfc2047-q-encoding-alist): Encode HTAB. - -2000-04-28 16:37:09 Shenghuo ZHU - - * message.el (message-send-mail-partially): Use forward-line. - -2000-04-28 16:01:09 Shenghuo ZHU - - * gnus-art.el (gnus-mime-button-menu): Use call-interactively. - -2000-04-28 15:30:17 Shenghuo ZHU - - * mml.el (mml-generate-mime-1): Ignore 0x1b. - (mml-insert-mime): No markup only for text/plain. - (mime-to-mml): Remove MIME headers. - -2000-04-28 14:23:14 Shenghuo ZHU - - * mml.el (mml-preview): Set gnus-newsgroup-charset. - * rfc2047.el (rfc2047-encode-message-header): Encode non-ascii - as 8-bit. - * lpath.el: Fbind image functions. - -2000-04-28 Dave Love - - * gnus.el (gnus-group-startup-message): Maybe use image in Emacs - 21. - - * mailcap.el (mailcap-parse-mailcaps): Revert last change to - search order. Use parse-colon-path and remove some redundancy. - Doc fix. - (mailcap-parse-mimetypes): Code consistently with - mailcap-parse-mailcaps. Doc fix. - - * gnus-start.el (gnus-unload): Iterate over `features', not - `load-history'. - -2000-04-28 09:52:21 Shenghuo ZHU - - * mml.el (mml-parse-1): Don't create blank parts. - (mml-read-part): Fix mml tag. - (mml-insert-mime): Convert message/rfc822. - (mml-insert-mml-markup): Add mmlp parameter. - -2000-04-28 01:16:10 Shenghuo ZHU - - * message.el (message-send-mail-partially): Remove CTE. - -2000-04-28 00:31:53 Shenghuo ZHU - - * lpath.el: Fbind put-image for XEmacs. - * mm-view.el (mm-inline-image): Fset it. - -2000-04-27 23:23:37 Shenghuo ZHU - - * nndoc.el (nndoc-type-alist): Change forward regexp. - -2000-04-27 21:57:10 Shenghuo ZHU - - * message.el (message-send-mail-partially-limit): Change the - default value. - -2000-04-27 21:53:32 Erik Toubro Nielsen - - * gnus-util.el (gnus-extract-address-components): Name might be - "". - -2000-04-27 20:32:06 Shenghuo ZHU - - * gnus-msg.el (gnus-summary-mail-forward): Use ARG. - (gnus-summary-post-forward): Ditto. - * message.el (message-forward-show-mml): New variable. - (message-forward): Use it. - * mml.el (mml-parse-1): Add tag mml. - (mml-read-part): Ditto. - (mml-generate-mime): Support reentance. - (mml-generate-mime-1): Support mml tag. - -2000-04-27 Dave Love - - * gnus-art.el: Don't bother to require custom, browse-url. - (gnus-article-x-face-command): Include gnus-article-display-xface. - - * gnus-ems.el: Assume only (X)Emacs 20+. Simplify XEmacs checks. - Use defalias, not fset. - (gnus-article-display-xface): New function. - - * mm-view.el (mm-inline-image-emacs): Use put-image, remove-images. - - * mm-decode.el: Small doc fixes. Require cl when compiling. - (mm-xemacs-p): Deleted. - (mm-get-image-emacs, mm-get-image-xemacs): Deleted. - (mm-get-image): Amalgamate Emacs and XEmacs code here; for Emacs, - use create-image and don't special-case xbm. - (mm-valid-image-format-p): Use display-graphic-p. - -2000-04-27 15:27:54 Shenghuo ZHU - - * message.el (message-send-mail-partially-limit): New variable. - (message-send-mail-partially): New function. - (message-send-mail): Use it. - * mm-bodies.el (mm-decode-content-transfer-encoding): Remove - all blank lines inside of base64. - * mm-partial.el (mm-inline-partial): Add an option. Remove tail - blank lines. - -2000-04-27 10:03:36 Shenghuo ZHU - - * mml.el (mml-insert-tag): Match more special characters. - -2000-04-27 09:06:29 Shenghuo ZHU - - * gnus-msg.el (gnus-bug): Avoid attaching the external buffer. - -2000-04-27 00:58:43 Shenghuo ZHU - - * mm-decode.el (mm-inline-media-tests): Add message/partial. - (mm-inlined-types): Ditto. - * mm-partial.el: New file. - -2000-04-27 Dave Love - - * mailcap.el (mailcap-mime-data): Fix octet-stream syntax -- might - matter in Emacs 21. - -2000-04-26 Florian Weimer - - * mm-bodies.el (mm-encode-body): Remove reference to - mm-default-charset in comment. - -2000-04-24 00:56:00 Bj,Av(Brn Torkelsson - - * rfc2047.el (rfc2047-encode-message-header): Fixing typo. - -2000-04-26 12:27:41 Shenghuo ZHU - - * gnus-draft.el (gnus-draft-send): Move gnus-draft-setup inside of - let. - -2000-04-26 12:26:10 Pavel Janik ml. - - * gnus-draft.el (gnus-draft-setup): Fix comments. - -2000-04-26 10:06:12 Shenghuo ZHU - - * nnmbox.el (nnmbox-create-mbox): Use nnmbox-file-coding-system, - if nnmbox-file-coding-system-for-write is nil. - -2000-04-26 02:17:44 Shenghuo ZHU - - * gnus-msg.el (gnus-configure-posting-styles): Just remove the - header if nil. - -2000-04-26 00:23:46 Shenghuo ZHU - - * mm-view.el (mm-inline-text): Insert directly if decoded. - * mml.el (autoload): Typo. - -2000-04-25 22:46:36 Shenghuo ZHU - - * mml.el (mml-preview): Set up posting-charset. - * gnus-msg.el (gnus-group-posting-charset-alist): Add koi8-r. - -2000-04-25 21:23:54 Shenghuo ZHU - - * webmail.el: Fix yahoo mail. - -2000-04-25 20:12:17 Shenghuo ZHU - - * rfc2047.el (rfc2047-dissect-region): Don't include LWS ahead of - word if not necessary. - (rfc2047-encode-region): Put space between encoded words. - -2000-04-24 21:11:48 Shenghuo ZHU - - * gnus-util.el (gnus-netrc-machine): Another default to nntp. - -2000-04-24 18:14:12 Shenghuo ZHU - - * gnus-draft.el (gnus-draft-setup): Restore mml only when - required. - (gnus-draft-edit-message): Require restoration. - -2000-04-24 16:51:04 Shenghuo ZHU - - * gnus-score.el (gnus-score-headers): Copy gnus-newsgrou-scored - back. - -2000-04-24 16:01:15 Shenghuo ZHU - - * gnus-art.el (gnus-treat-article): Make sure that the summary - buffer is live. - -2000-04-24 15:42:53 Shenghuo ZHU - - * mailcap.el (mailcap-parse-mailcaps): Reorder. - (mailcap-parse-mailcap): Backwards parsing. - (mailcap-possible-viewers): Remove nreverse. - (mailcap-mime-info): Ditto. - (mailcap-add-mailcap-entry): Keep alternative viewer. - -Mon Apr 24 21:12:06 2000 Lars Magne Ingebrigtsen - - * gnus.el: Gnus v5.8.5 is released. - -2000-04-24 16:29:07 Lars Magne Ingebrigtsen - - * rfc2047.el (rfc2047-header-encoding-alist): Doc fix. - - * gnus-util.el (gnus-netrc-machine): Default to nntp. - - * mml.el (mml-generate-mime-1): Force 8bit on message/rfc822. - -2000-04-23 23:27:25 Shenghuo ZHU - - * mm-view.el (mm-inline-message): Disable prepare-hook. - -2000-04-23 00:32:32 Lars Magne Ingebrigtsen - - * gnus.el: Fix copyright statements. - - * gnus-sum.el (gnus-alter-articles-to-read-function): New - variable. - (gnus-articles-to-read): Use it. - - * message.el (message-get-reply-headers): Bind free variable. - -2000-04-23 01:14:28 Shenghuo ZHU - - * message.el (message-get-reply-headers): Fix to-address. - -2000-04-22 22:51:46 Shenghuo ZHU - - * webmail.el: Hotmail fix. Add a debug function. - -2000-04-23 00:32:32 Lars Magne Ingebrigtsen - - * gnus-sum.el (t): M-down and M-up. - -2000-04-22 20:22:03 Kai Gro,A_(Bjohann - - * gnus-sum.el: Doc fix. - -2000-04-22 10:25:56 Shenghuo ZHU - - * nnwarchive.el (nnwarchive-egroups-article): Remove < and >. - -2000-04-22 14:25:05 Lars Magne Ingebrigtsen - - * nnweb.el (nnweb-dejanews-create-mapping): Remove the context - string. - (nnweb-request-group): Don't scan twice. - (nnweb-request-scan): Don't nix out the hashtb. - - * message.el (message-get-reply-headers): Return a value. - -2000-04-22 14:12:41 David Aspinwall - - * gnus-art.el (gnus-button-url-regexp): New value to match naked - urls. - -2000-04-22 01:23:59 Lars Magne Ingebrigtsen - - * gnus-cache.el (gnus-summary-insert-cached-articles): Reverse the - order messages are inserted. - - * mml.el (mml-generate-mime-1): rfc2047-encode the heads of - message/rfc822 parts. - - * gnus-art.el (gnus-article-read-summary-keys): Check for - numerical values. - - * message.el (message-get-headers): Made into own function. - (message-reply): Use it. - (message-get-reply-headers): Renamed. - (message-widen-reply): New command. - -2000-04-21 20:52:09 Shenghuo ZHU - - * nntp.el (nntp-retrieve-data): Report the error and return nil. - -2000-04-21 19:38:43 Shenghuo ZHU - - * mm-bodies.el (mm-decode-content-transfer-encoding): Don't remove - non-base64 text at the end if not found. - -2000-03-01 Simon Josefsson - - * gnus-sum.el (gnus-read-move-group-name): - (gnus-summary-move-article): Use `gnus-group-method' to find out - what method the manually entered group belong to. - `gnus-group-name-to-method' doesn't return any method parameters - and `gnus-find-method-for-group' uses `gnus-group-name-to-method' - for new groups so they wouldn't work. - -2000-04-21 22:27:15 Lars Magne Ingebrigtsen - - * gnus-msg.el (gnus-configure-posting-styles): Allow nil values to - override. - -2000-04-21 21:58:20 Kai Gro,A_(Bjohann - - * nnmail.el (nnmail-cache-insert): Does some stuff that is - probably good to do, or something. I dunno. I just write these - ChangeLog entries, and my name is Lars. - -1999-12-06 Hrvoje Niksic - - * message.el (message-caesar-region): Use translate-region. - -2000-04-21 21:20:32 Mike Fabian - - * gnus-group.el (gnus-group-catchup-current): Doc fix. - -2000-04-21 20:36:21 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-article-setup-buffer): Don't kill local - variables, because that makes Emacs flash. - - * gnus-group.el (gnus-group-insert-group-line): Don't call - gnus-group-add-icon unconditionally. - - * gnus-xmas.el (gnus-group-add-icon): Moved here. - - * gnus-group.el (gnus-group-glyph-directory): Don't depend on - xmas. - (gnus-group-glyph-directory): Removed. - -2000-04-21 20:26:23 Jaap-Henk Hoepman - - * gnus-msg.el (gnus-inews-insert-archive-gcc): Don't do stuff if - gnus-newsgroup-name is "". - -2000-04-21 Florian Weimer - - * mm-util.el (mm-mime-mule-charset-alist): Add support for UTF-8 - in conjunction with MULE-UCS. - -1999-12-13 Per Abrahamsen - - * rfc2047.el (rfc2047-fold-region): Don't use the same break twice. - -1999-12-14 04:14:44 Katsumi Yamaoka - - * dgnushack.el (last, mapcon, member-if, union): New compiler - macros for emulating cl functions. - -1999-12-21 Jan Vroonhof - - * message.el (message-shorten-references): Only cater to broken - INN for news. This caters for broken smtpd. - -2000-04-21 18:20:10 Lars Magne Ingebrigtsen - - * mailcap.el (mailcap-mime-info): Use the first match; not the - last. - - * gnus-agent.el (gnus-category-kill): Save the category list. - -2000-04-21 16:41:50 Chris Brierley - - * gnus-sum.el (gnus-summary-move-article): Do something or other. - -2000-04-21 16:07:07 Lars Magne Ingebrigtsen - - * gnus-group.el (gnus-group-add-icon): Fixed indentation. - -2000-04-21 16:07:07 Lars Magne Ingebrigtsen - - * gnus-group.el (gnus-group-add-icon): Fixed indentation. - -2000-04-21 10:43:16 Shenghuo ZHU - - * gnus-group.el (gnus-group-prepare-flat-predicate): New function. - (gnus-group-list-cached): Use it. - -2000-04-21 16:07:07 Lars Magne Ingebrigtsen - - * gnus.el: Update all the copyright notices. - -2000-04-21 15:38:06 Vladimir Volovich - - * mm-bodies.el (mm-decode-content-transfer-encoding): Remove - non-base64 text at the end. - -2000-04-21 15:21:30 Katsumi Yamaoka - - * mm-bodies.el (mm-body-charset-encoding-alist): defcustomized. - -2000-04-21 15:15:41 Lars Magne Ingebrigtsen - - * nnheader.el: Don't autoload cancel-function-timers. - - * message.el (message-fetch-field): Fold case. - -2000-04-21 15:11:09 - - * message.el (message-forward-before-signature): New variable. - -2000-04-21 15:10:31 Alexandre Oliva - - * gnus-mlspl.el: Fix stuff. - -2000-04-21 14:41:09 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-summary-update-article-line): Don't hide - subjects when unthreaded. - -2000-04-21 14:11:39 David S. Goldberg - - * gnus-art.el (gnus-boring-article-headers): Work on long CCs as - well. - -2000-04-21 14:06:43 Rui Zhu - - * gnus-art.el (gnus-article-mode): Fix variable name. - -2000-04-21 13:54:51 Lars Magne Ingebrigtsen - - * mm-view.el: Fix autoload. - - * flow-fill.el (flow-fill): Fix provide. - - * gnus-draft.el (gnus-draft-send): Bind message-setup-hook to - nil. - -2000-04-20 22:24:04 Shenghuo ZHU - - * gnus-win.el (gnus-configure-windows): Revert to switch-to-buffer. - -2000-04-21 05:22:18 Katsumi Yamaoka - - * gnus-util.el (gnus-netrc-machine): Didn't work. - -2000-04-20 21:22:10 Shenghuo ZHU - - * gnus-draft.el (gnus-draft-setup): Restore to mml. - -2000-04-21 01:24:41 Lars Magne Ingebrigtsen - - * flow-fill.el: Renamed from fill-flowed. - - * message.el (message-forward-ignored-headers): Default to - removing CTE. - -2000-04-21 00:48:48 - - * message.el (message-mode): Don't fill headers. - -2000-04-20 23:12:43 Lars Magne Ingebrigtsen - - * message.el (message-pipe-buffer-body): Use shell - -2000-02-21 Yoshiki Hayashi - - * nnvirtual.el (nnvirtual-request-article): - Bind gnus-override-method to nil. - (nnvirtual-request-update-mark): Don't update mark when - article is not there. - -2000-04-20 16:35:41 Shenghuo ZHU - - * mm-uu.el (mm-uu-dissect): Check forwarded message. - -2000-04-20 21:17:48 Lars Magne Ingebrigtsen - - * gnus-util.el (gnus-parse-netrc): Allow "port". - (gnus-netrc-machine): Take a port param. - (gnus-netrc-machine): - - * gnus-art.el (gnus-request-article-this-buffer): Allow - re-selecting referenced articles. - - * message.el (message-cancel-news): Allow editing. - (message-cancel-message): Add newline. - -2000-04-20 21:03:54 William M. Perry - - * mm-view.el (mm-inline-image-emacs): New function. - -2000-04-20 20:44:55 Lars Magne Ingebrigtsen - - * mail-source.el (mail-source-delete-incoming): Change default in - cvs. - -2000-04-20 20:43:34 Kim-Minh Kaplan - - * gnus-art.el (gnus-mime-view-part-as-type-internal): New - function. - -2000-04-20 14:45:20 Lars Magne Ingebrigtsen - - * nnml.el (nnml-request-expire-articles): Use it. - - * nnmail.el (nnmail-expiry-target): New variable. - (nnmail-expiry-target-group): New function. - -2000-04-20 02:36:31 Emerick Rogul - - * message.el (message-forward): Add non-MIME separators. - -2000-04-20 02:25:39 Lars Magne Ingebrigtsen - - * message.el (message-generate-headers): Respect the syntax check - spec. - - * gnus-sum.el (gnus-remove-thread-1): Show thread. - (gnus-remove-thread): Don't show all threads. - -Thu Apr 20 01:39:25 2000 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v5.8.4 is released. - -2000-04-19 Dave Love - - * mailcap.el (mailcap-parse-mimetypes): Add ...mime.types. - -2000-04-18 12:28:24 Shenghuo ZHU - - * nnwarchive.el (nnwarchive-type-definition): New egroups html. - (nnwarchive-egroups-*): Ditto. - (nnwarchive-url): Unibyte buffer and single line cookie. - -2000-04-14 18:50:04 Shenghuo ZHU - - * mm-util.el (mm-char-or-char-int-p): New alias. - * nnweb.el (nnweb-decode-entities): Check the validity of numeric - entities. - -2000-04-10 Daiki Ueno - - * lisp/imap.el (imap-body-lines): Check Content-Type: of the - article case insensitively. - -2000-04-10 20:35:46 Shenghuo ZHU - - * mail-source.el (mail-source-fetch-webmail): Use the default - password provided in mail-sources; use webmail:subtype:user as - the key. - -2000-04-10 20:35:46 John Wiegley - - * mail-source.el (mail-source-fetch-webmail): Use - mail-source-password-cache. - -2000-04-09 18:13:47 Shenghuo ZHU - - * webmail.el: Add netscape mail and fix HotMail mail. - -2000-04-08 Simon Josefsson - - * imap.el (imap-kerberos4-open): Work with recent `imtest's. - -2000-04-02 Simon Josefsson - - * nnimap.el (nnimap-request-article): Use BODY.PEEK[] instead of - RFC822.PEEK if server support IMAP4rev1. - (nnimap-request-body): Use BODY.PEEK[TEXT] instead of - RFC822.TEXT.PEEK if server support IMAP4rev1. - (nnimap-request-head): Use BODY.PEEK[HEADER] instead of - RFC822.HEADER if server support IMAP4rev1. - (nnimap-request-article-part): Support bodydetail in response - data. - -2000-03-11 Simon Josefsson - - * fill-flowed.el: New file. - - * mm-decode.el (mm-dissect-singlepart): Create a MIME handle for - text/plain parts with `format' parameters. - - * mm-view.el (autoload): Autoload fill-flowed. - (mm-inline-text): For "plain" parts with a format=flowed - parameter, call `fill-flowed'. - -2000-03-21 10:32:44 Lars Magne Ingebrigtsen - - * nnslashdot.el (nnslashdot-request-list): Fudge new-style - slashdot ids. - -2000-03-20 00:12:42 Lars Magne Ingebrigtsen - - * nnslashdot.el (nnslashdot-request-list): Use the new slashdot - format. - -2000-03-16 Simon Josefsson - - * imap.el: GSSAPI support, support kerberos 4 with Cyrus v1.6.x - `imtest' too. - (imap-kerberos4-program): Renamed from `imap-imtest-program'. - (imap-gssapi-program): New variable. - (imap-streams): Add gssapi. - (imap-stream-alist): Ditto. - (imap-authenticators): Ditto. - (imap-authenticator-alist): Ditto. - (imap-kerberos4-stream-p): Rename from `imap-kerberos4s-p'. - (imap-kerberos4-open): Loop over imtest programs, support Cyrus - 1.6.x `imtest' syntax. - (imap-gssapi-stream-p): New function. - (imap-gssapi-open): Ditto. - (imap-gssapi-auth-p): Ditto. - (imap-gssapi-auth): Ditto. - (imap-kerberos4-auth-p): Renamed from `imap-kerberos4a-p'. - (imap-send-command): Use buffer-local `imap-client-eol' value. - - * nnimap.el (nnimap-retrieve-headers-progress): Fold continuation - lines and turn TAB into SPC before parsing. - -2000-03-15 Simon Josefsson - - * nnheader.el (nnheader-group-pathname): Make sure to return a - directory. - * nnmail.el (nnmail-group-pathname): Ditto. - -2000-02-08 Per Abrahamsen - - * nnmail.el (nnmail-fix-eudora-headers): Fix `In-Reply-To' too, it - might split in the middle of a message-id. - -2000-03-13 13:51:38 Lars Magne Ingebrigtsen - - * gnus-srvr.el (gnus-server-kill-server): Offer to kill all the - groups from the server. - - * gnus-sum.el (gnus-summary-save-parts): Fix interactive spec. - (gnus-summary-toggle-header): Update the wash status. - - * gnus-uu.el ((gnus-uu-extract-map "X" gnus-summary-mode-map)): - Moved here. - - * gnus-agent.el (gnus-agent-save-group-info): Respect old - setting. - - * nnmail.el (nnmail-get-active): Use it. - (nnmail-parse-active): New function. - - * mm-view.el (mm-inline-text): Support the new version of - vcard.el. - - * gnus-sum.el (gnus-summary-move-article): Only delete article - when moving junk. - (gnus-deaden-summary): Bury the buffer. - - * nnmail.el (nnmail-group-pathname): Ditto. - - * nnheader.el (nnheader-group-pathname): Use expand-file-name. - -2000-03-13 20:23:06 Christoph Rohland - - * rfc2047.el (rfc2047-encode-message-header): Encode no matter - whether Mule. - -2000-03-10 14:57:58 Lars Magne Ingebrigtsen - - * message.el (message-send-mail): Protect against unloaded Gnus. - - * gnus-topic.el (gnus-topic-update-topic-line): Don't update the - parent. - (gnus-topic-update-topic-line): Yes, do. - (gnus-topic-goto-missing-group): Tally the correct number of - unread articles before inserting the topic line. - -2000-03-01 09:55:26 Lars Magne Ingebrigtsen - - * nnultimate.el (nnultimate-retrieve-headers): Ignore errors. - -2000-02-13 13:53:08 Lars Magne Ingebrigtsen - - * mm-decode.el (mm-dissect-buffer): Ditto. - - * gnus-art.el (article-decode-charset): Strip CTE. - - * ietf-drums.el (ietf-drums-strip): New function. - - * gnus-sum.el (gnus-summary-move-article): Don't use the prefix - when prompting in read-only groups. - -2000-02-23 Simon Josefsson - - * imap.el (imap-send-command): Change EOL-chars when - `imap-client-eol' differs from default, not only for kerberos4. - (imap-mailbox-status): Get encoded mailbox's status. - -2000-02-19 Simon Josefsson - - * mail-source.el (mail-source-fetch-imap): Copy `imap-password' - into `mail-source-password-cache'. - -2000-02-17 Florian Weimer - - * mm-util.el (mm-mime-charset): Check for presence of - `coding-system-get' and `get-charset-property' (recent XEmacs has - the former, but not the latter). - -2000-01-28 Dave Love - - * message.el (message-check-news-header-syntax): Fix typo - `newsgroyps'. - (message-talkative-question): Put temp buffer in fundamental-mode. - (message-recover): Use fundamental-mode in the right buffer. - - * nnmail.el (nnmail-split-history): Use fundamental-mode in the - right buffer. - -2000-01-26 12:01:18 Shenghuo ZHU - - * qp.el (quoted-printable-decode-region): Add charset parameter. - (quoted-printable-decode-string): Ditto. - - * gnus-art.el (article-de-quoted-unreadable): Use it. - -2000-01-21 Simon Josefsson - - * nnimap.el (nnimap-split-predicate): New variable. - (nnimap-split-articles): Use it. - -2000-01-20 Simon Josefsson - - * utf7.el: Change email address. - -2000-01-18 22:03:51 Lars Magne Ingebrigtsen - - * gnus-group.el (gnus-group-catchup): Purge split history. - -2000-01-14 02:43:55 Shenghuo ZHU - - * nnmail.el (nnmail-generate-active): Support extended group name. - (nnmail-get-active): Ditto. - -2000-01-13 15:16:10 Shenghuo ZHU - - * gnus-agent.el (gnus-agent-write-active): Since no prefix in - group names, don't remove anything. - -2000-01-13 15:10:53 Shenghuo ZHU - - * webmail.el (webmail-my-deja-open): My-deja changes. - -2000-01-13 Simon Josefsson - - * nnimap.el (nnimap-retrieve-headers-progress): Create xref field. - -2000-01-10 23:35:33 Shenghuo ZHU - - * gnus-agent.el (gnus-agent-fetch-headers): Translate full path. - -2000-01-09 22:52:35 Shenghuo ZHU - - * gnus.el (gnus-other-frame): Fix typo. - -1999-06-25 Andreas Jaeger - - * gnus-cus.el (gnus-group-customize): Fix typo. - -2000-01-08 08:36:13 Lars Magne Ingebrigtsen - - * nnweb.el (nnweb-insert): Simplified. - -2000-01-06 18:32:53 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-article-mode-map): "e" is - gnus-summary-edit-article. - -2000-01-06 18:25:37 Jari Aalto - - * mailcap.el (mailcap-mime-extensions): Add .diff. - -2000-01-06 00:06:40 Kim-Minh Kaplan - - * mm-decode.el (mm-mailcap-command): handle "%%" and the case where - there is no "%s" in the method. - -2000-01-08 21:01:04 Kim-Minh Kaplan - - * gnus-sum.el (gnus-summary-select-article): Return 'old. - -2000-01-06 13:41:11 Lars Magne Ingebrigtsen - - * nnfolder.el (nnfolder-read-folder): Use nnfolder-save-buffer. - - * gnus.el: Really always pop up a new frame. - - * parse-time.el (parse-time-rules): Allow 100-110 to be - 2000-2010. - - * time-date.el (date-to-time): Don't use timezone. - -2000-01-06 Dave Love - - * time-date.el: Add keywords. - (date-to-time): Add autoload cookie. Canonicalize with - timezone-make-date-arpa-standard. - (time-to-seconds): Avoid caddr. - (safe-date-to-time): Add autoload cookie. - - * base64.el: Require cl when compiling. - -2000-01-05 BrYan P. Johnson - - * gnus-group.el (gnus-group-line-format-alist): Added %E for - eyecandy. - (gnus-group-insert-group-line): Now groks %E and inserts icon in - group line using gnus-group-add-icon. - (gnus-group-icons): Added customize group. - (gnus-group-icon-list): Added variable. - (gnus-group-glyph-directory): Added variable. - (gnus-group-icon-cache): Added variable. - (gnus-group-running-xemacs): Added variable. - (gnus-group-add-icon): Added function. Add an icon to the current - line according to gnus-group-icon-list. - (gnus-group-icon-create-glyph): Added function. - -2000-01-05 17:31:52 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-summary-select-article): Return whether we - selected something new. - (gnus-summary-search-article): Start searching at the window - point. - - * gnus-group.el (gnus-fetch-group): Complete over - gnus-active-hashtb. - -Wed Jan 5 17:06:41 2000 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v5.8.3 is released. - -2000-01-05 15:56:02 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-preserve-marks): New variable. - (gnus-summary-move-article): Use it. - (gnus-group-charset-alist): Added more entries. - -2000-01-03 01:18:36 Lars Magne Ingebrigtsen - - * mm-decode.el (mm-inline-override-types): Removed duplicate. - - * gnus-uu.el (gnus-uu-mark-over): Use gnus-summary-default-score - as the default score. - - * gnus-score.el (gnus-score-delta-default): Changed name. - -2000-01-04 Simon Josefsson - - * imap.el (imap-parse-literal): - (imap-parse-flag-list): Don't care about props. - (imap-parse-string): Handle quoted characters. - -2000-01-02 08:37:03 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-summary-goto-unread): Doc fix. - (gnus-summary-mark-article): Doc fix. - (gnus-summary-mark-forward): Doc fix. - (t): Changed keystroke for gnus-summary-customize-parameters. - - * gnus-art.el (gnus-article-mode-map): Use gnus-article-edit for - "e". - (gnus-article-mode-map): No, don't. - - * gnus-sum.el (gnus-summary-next-subject): Don't show the thread - of the final article. - - * mm-decode.el (mm-interactively-view-part): Error on no method. - -2000-01-02 06:10:32 Stefan Monnier - - * gnus-score.el (gnus-score-insert-help): Something. - - * gnus-art.el (gnus-button-alist): Exclude < from - - * nnwarchive.el: Changed file perms. - -1999-12-19 21:42:15 Lars Magne Ingebrigtsen - - * gnus-group.el (gnus-group-delete-groups): New command. - (gnus-group-delete-group): Extra no-prompt parameters. - -1999-12-14 10:18:30 Lars Magne Ingebrigtsen - - * nnslashdot.el (nnslashdot-request-article): Translate
into -

. - -1999-12-28 12:20:18 Shenghuo ZHU - - * webmail.el (webmail-hotmail-article): Don't insert message id. - -1999-12-28 Kai.Grossjohann@CS.Uni-Dortmund.DE (Kai Gro,A_(Bjohann) - - * nnimap.el (nnimap-split-fancy): New variable. - (nnimap-split-fancy): New function. - -1999-12-28 Simon Josefsson - - (nnimap-split-rule): Document symbol value. - -1999-12-28 Simon Josefsson - - * nnimap.el (nnimap-retrieve-headers-progress): Let - `nnheader-parse-head' parse article. - (nnimap-retrieve-headers-from-server): Don't request ENVELOPE, - request headers needed by `nnheader-parse-head'. - -1999-12-23 Florian Weimer - - * gnus-msg.el (gnus-group-posting-charset-alist): Correct default - value (crosspostings are handled), improve documentation. - - * smiley.el: Declare file coding system as iso-8859-1. - - * nnultimate.el: Dito. - - * message.el: Dito. - - * gnus-cite.el: Dito. - - * gnus-spec.el: Dito. - -1999-12-21 Florian Weimer - - * gnus-msg.el (gnus-group-posting-charset-alist): New layout. - (gnus-setup-message): No longer make `message-posting-charset' - buffer-local. - (gnus-setup-posting-charset): Reflect the new layout of - `gnus-group-posting-charset-alist' and `message-posting-charset'. - - * message.el (message-send-mail): Bind `message-this-is-mail' and - `message-posting-charset'. - (message-send-news): Dito, and honour new layout of - `message-posting-charset'. - (message-encode-message-body): Ignore `message-posting-charset'. - - * mm-bodies.el (mm-body-encoding): Consider - `message-posting-charset' when deciding whether to use 8bit. - - * rfc2047.el (rfc2047-encode-message-header): Back out change. - (rfc2047-encodable-p): Now solely for headers; use - `message-posting-charset'. - -1999-12-20 14:10:39 Shenghuo ZHU - - * nnwarchive.el (nnwarchive-type-definition): Set default value. - -1999-12-19 22:49:13 Shenghuo ZHU - - * nnagent.el (nnagent-server-opened): Optional. - (nnagent-status-message): Optional. - -1999-12-19 Simon Josefsson - - * gnus-cite.el (gnus-article-toggle-cited-text): Restore beg and - end (referenced by instructions in - `gnus-cited-opened-text-button-line-format-alist'). - -1999-12-18 Simon Josefsson - - * imap.el (imap-starttls-open): Typo. - -1999-12-18 16:43:37 Shenghuo ZHU - - * mm-util.el (mm-charset-after): Non-MULE case. - * mail-prsvr.el (mail-parse-mule-charset): New variable. - * rfc2047.el (rfc2047-dissect-region): Bind it. - -1999-12-18 Florian Weimer - - * mml.el (mml-generate-multipart-alist): Correct default value. - - * mm-encode.el (mm-use-ultra-safe-encoding): New variable. - (mm-safer-encoding): New function. - (mm-content-transfer-encoding): Use both. - - * mm-bodies.el (mm-body-encoding): Use mm-use-ultra-safe-encoding. - * qp.el (quoted-printable-encode-region): Dito. - -1999-12-18 14:08:48 Shenghuo ZHU - - * webmail.el (webmail-hotmail-article): Snarf the raw file. - -1999-12-18 14:08:12 Victor S. Miller - - * webmail.el (webmail-hotmail-list): raw=0. - -1999-12-18 11:14:51 Shenghuo ZHU - - * gnus-agent.el (gnus-agent-enter-history): Back-compatible in - group name. - -1999-12-18 11:02:00 Shenghuo ZHU - - * gnus-agent.el (gnus-agent-expire): Convert to symbol if stringp. - -1999-12-18 Simon Josefsson - - * imap.el: Don't autoload digest-md5. - (imap-starttls-open): Bind coding-system-for-{read,write}. - (imap-starttls-p): Check if we can find starttls.el. - (imap-digest-md5-p): Check if we can find digest-md5.el. - -1999-12-17 Daiki Ueno - - * base64.el (base64-encode-string): Accept 2nd argument - `no-line-break'. - - * imap.el: Require `digest-md5' when compiling; add autoload - settings for `digest-md5-parse-digest-challenge', - `digest-md5-digest-response', `starttls-open-stream' and - `starttls-negotiate'. - (imap-authenticators): Add `digest-md5'. - (imap-authenticator-alist): Setup for `digest-md5'. - (imap-digest-md5-p): New function. - (imap-digest-md5-auth): New function. - (imap-stream-alist): Add STARTTLS entry. - (imap-starttls-p): New function. - (imap-starttls-open): New function. - -1999-12-18 01:08:10 Shenghuo ZHU - - * gnus-agent.el (gnus-agent-enter-history): Bad group name. - -1999-12-17 19:36:47 Shenghuo ZHU - - * rfc2047.el (rfc2047-dissect-region): Use mapcar instead of - string-to-x function. - -1999-12-17 13:08:54 Shenghuo ZHU - - * rfc2047.el (rfc2047-fold-region): Fold a line more than once. - -1999-12-17 11:54:41 Shenghuo ZHU - - * webmail.el: Enhance hotmail-snarf. - -1999-12-17 10:38:10 Shenghuo ZHU - - * rfc2047.el (rfc2047-dissect-region): Rewrite. - -1999-12-16 22:59:22 Shenghuo ZHU - - * webmail.el (webmail-hotmail-list): Search no-error. - -1999-12-15 22:07:15 Shenghuo ZHU - - * nnwarchive.el: Support nov-is-evil. - * gnus-bcklg.el (gnus-backlog-request-article): Buffer is optional. - Set it if non-nil. - * gnus-agent.el (gnus-agent-fetch-articles): Use it. - -1999-12-15 08:55:19 Shenghuo ZHU - - * nnagent.el (nnagent-server-opened): Redefine. - (nnagent-status-message): Ditto. - -1999-12-14 23:37:44 Shenghuo ZHU - - * rfc1843.el (rfc1843-decode-region): Use - buffer-substring-no-properties. - * gnus-art.el (article-decode-HZ): New function. - -1999-12-14 22:07:26 Shenghuo ZHU - - * nnheader.el (nnheader-translate-file-chars): Only in full path. - -1999-12-14 16:21:45 Shenghuo ZHU - - * mm-util.el (mm-find-charset-region): mail-parse-charset is a - MIME charset not a MULE charset. - -1999-12-14 15:08:03 Shenghuo ZHU - - * gnus-ems.el: Translate more ugly characters. - * nnheader.el (nnheader-translate-file-chars): Don't translate - the second ':'. - -1999-12-14 10:40:33 Shenghuo ZHU - - * gnus-art.el (gnus-request-article-this-buffer): Use all refer - method if cannot find the article. - -1999-12-14 01:13:50 Shenghuo ZHU - - * gnus-art.el (gnus-request-article-this-buffer): Don't use refer - method if overrided. - -1999-12-13 23:38:53 Shenghuo ZHU - - * mail-source.el (mail-source-fetch-webmail): Parameter - dontexpunge. - -1999-12-13 23:31:17 Shenghuo ZHU - - * webmail.el: Support my-deja. Better error report. - -1999-12-13 18:59:33 Shenghuo ZHU - - * nnslashdot.el (nnslashdot-date-to-date): Error proof when input - is bad. - * gnus-sum.el (gnus-list-of-unread-articles): When (car read) - is not 1. - -1999-12-13 18:22:08 Shenghuo ZHU - - * nnslashdot.el (nnslashdot-request-article): A space. - -1999-12-13 17:20:25 Shenghuo ZHU - - * nnagent.el: Support different backend with same name. - -1999-12-13 13:14:42 Shenghuo ZHU - - * nnslashdot.el (nnslashdot-threaded-retrieve-headers): Support - archived group. - (nnslashdot-sane-retrieve-headers): Ditto. - (nnslashdot-request-article): Ditto. - -1999-12-13 11:41:32 Shenghuo ZHU - - * nnweb.el (nnweb-insert): Narrow to point. - -1999-12-13 10:59:42 Shenghuo ZHU - - * nnweb.el (nnweb-insert): Follow refresh url. - * nnslashdot.el: Use it. - -1999-12-13 10:39:53 Shenghuo ZHU - - * nnweb.el (nnweb-decode-entities): Decode numerical entities. - (nnweb-decode-entities-string): New function. - - * nnwarchive.el (nnwarchive-decode-entities-string): Rename to - nnweb-* and move to nnweb.el. - * nnwarchive.el: Use nnweb-decode-entities, etc. - * webmail.el: Ditto. - - * nnslashdot.el: Use nnweb-decode-entities-string. - (nnslashdot-decode-entities): Remove. - -1999-12-13 10:40:56 Eric Marsden - - * nnslashdot.el: Decode entities. - -1999-12-12 Dave Love - - * gnus-agent.el (gnus-category-edit-groups) - (gnus-category-edit-score, gnus-category-edit-predicate): Replace - expansion of setf, fixed. - -1999-12-12 12:50:30 Shenghuo ZHU - - * gnus-agent.el: Revoke last Dave Love's patch, because of - incompatibility of XEmacs. - -1999-12-12 12:27:03 Shenghuo ZHU - - * mm-uu.el: Change headers. - * rfc1843.el: Ditto. - * uudecode.el: Ditto. - -1999-12-07 Dave Love - - * gnus-agent.el (gnus-category-edit-predicate) - (gnus-category-edit-score, gnus-category-edit-score): Expand setf - inside backquote to avoid it at runtime. - -1999-12-07 Dave Love - - * binhex.el: Require cl when compiling. - -1999-12-04 Dave Love - - * gnus-cus.el (gnus-group-parameters): Allow nil for banner. - -1999-12-04 Dave Love - - * mm-util.el (mm-delete-duplicates): New function. - (mm-write-region): Use it. - - * mml.el (mml-minibuffer-read-type): Use mm-delete-duplicates. - - * mailcap.el (mailcap-mime-types): Require mm-util. Use - mm-delete-duplicates. - - * imap.el (imap-open, imap-debug): Avoid mapc. - - * nnvirtual.el (nnvirtual-create-mapping): Likewise. - - * gnus-sum.el (gnus-summary-exit-no-update): Avoid copy-list. - (gnus-multi-decode-encoded-word-string): Avoid mapc. - - * gnus-start.el (gnus-site-init-file): Avoid ignore-errors at - runtime. - - * gnus.el (gnus-select-method): Likewise. - - * nnheader.el (nnheader-nov-read-integer): Likewise. - - * mm-view.el (mm-inline-message): Require cl when compiling. - Avoid ignore-errors at runtime. - (mm-inline-text): Avoid mapc. - -1999-12-12 10:36:51 Shenghuo ZHU - - * gnus-art.el (article-decode-charset): Widen is bad. - -1999-12-12 10:17:42 Shenghuo ZHU - - * mm-util.el (mm-charset-after): `charset-after' may not be defined. - -1999-12-12 Florian Weimer - - * rfc2047.el (rfc2047-encodable-p): New parameter header used to - indicate that only US-ASCII is permitted. - (rfc2047-encode-message-header): Use it. Now, Gnus should never - use unencoded 8-bit characters in message headers. - -1999-12-12 03:08:15 Shenghuo ZHU - - * ietf-drums.el (ietf-drums-narrow-to-header): Make it work with - CRLF. - -1999-12-11 14:42:26 Shenghuo ZHU - - * webmail.el: Require url-cookie. - -1999-12-11 14:21:23 Shenghuo ZHU - - * nnwarchive.el (nnwarchive-make-caesar-translation-table): A - new function to make modified caesar table. - (nnwarchive-from-r13): Use it. - (nnwarchive-mail-archive-article): Improved. - -1999-12-11 12:30:20 Shenghuo ZHU - - * webmail.el (webmail-url): Use mm-with-unibyte-current-buffer. - -1999-12-10 16:22:24 Shenghuo ZHU - - * nnweb.el (nnweb-request-article): Return cons. - -1999-12-10 16:06:04 Shenghuo ZHU - - * gnus-sum.el (gnus-summary-setup-default-charset): Typo. - -1999-12-10 12:14:04 Shenghuo ZHU - - * mm-util.el (mm-with-unibyte): New macro. - * nnweb.el (nnweb-init): Use it. - -1999-12-09 20:39:49 Shenghuo ZHU - - * mm-util.el (mm-charset-after): New function. - (mm-find-mime-charset-region): Set charsets after - delete-duplicates and use find-coding-systems-region. - (mm-find-charset-region): Remove composition. - - * mm-bodies.el (mm-encode-body): Use mm-charset-after. - - * mml.el (mml-parse-singlepart-with-multiple-charsets): Ditto. - -1999-12-09 17:47:56 Shenghuo ZHU - - * mm-util.el (mm-find-mime-charset-region): Revoke last change. - * mml.el (mml-confirmation-set): New variable. - (mml-parse-1): Ask user to confirm. - -1999-12-09 Simon Josefsson - - * gnus-start.el (gnus-get-unread-articles): Make sure all methods - are scanned when we have directory mail-sources (the mail source - is modified in that case, so we must scan it for all - groups/methods). - -1999-12-09 12:05:28 Shenghuo ZHU - - * nnml.el (nnml-request-move-article): Save nnml-current-directory - and nnml-article-file-alist. - -1999-12-09 10:20:07 Shenghuo ZHU - - * gnus-group.el (gnus-group-get-new-news-this-group): Binding - nnmail-fetched-sources. - -1999-12-09 10:19:01 Shenghuo ZHU - - * mm-util.el (mm-find-charset-region): Use the last charset. - -1999-12-08 Per Abrahamsen - - * gnus.el (gnus-select-method): Made the option list prettier. - -1999-12-08 Florian Weimer - - * gnus-msg.el (gnus-group-posting-charset-alist): Use iso-8859-1 - for the `de' newsgroups hierarchy, as it is common practice there. - - -1999-12-07 16:17:12 Shenghuo ZHU - - * nnwarchive.el (nnwarchive-mail-archive-article): Fix - buffer-string arguments. Fix references. - -1999-12-07 15:04:18 Shenghuo ZHU - - * gnus-agent.el (gnus-agent-confirmation-function): New variable. - (gnus-agent-batch-fetch): Use it. - (gnus-agent-fetch-session): Use it. - -1999-12-07 12:32:43 Shenghuo ZHU - - * mm-util.el (mm-find-mime-charset-region): Delete nil. - -1999-12-07 11:45:10 Shenghuo ZHU - - * mm-util.el (mm-find-charset-region): Don't capitalize. Delete - nil. - -1999-12-07 Per Abrahamsen - - * nnslashdot.el (nnslashdot-request-list): There were two - top-level body-forms. Put a `progn' around them. - - * gnus.el (gnus-select-method): Use `condition-case' - instead of `ignore-errors', since cl may not be loaded when the - form is evaluated. - -1999-12-06 23:57:47 Shenghuo ZHU - - * nnwarchive.el: Support www.mail-archive.com. - -1999-12-06 23:55:55 Shenghuo ZHU - - * nnmail.el (nnmail-get-new-mail): Remove fetched sources before - do anything. - -1999-12-06 Simon Josefsson - - * utf7.el: New file, written by Jon K Hellan. - - * imap.el (imap-use-utf7): Renamed from `imap-utf7-p', change - default to t. - -1999-12-06 04:40:24 Lars Magne Ingebrigtsen - - * nnslashdot.el (nnslashdot-request-delete-group): New function. - - * gnus-sum.el (gnus-summary-refer-article): Work for lists with - current. - (gnus-refer-article-methods): New function. - (gnus-summary-refer-article): Use it. - -1999-11-13 Simon Josefsson - - * nnimap.el (nnimap-retrieve-groups): Return active format. - - * nnimap.el (nnimap-replace-in-string): Removed. - (nnimap-request-list): - (nnimap-retrieve-groups): - (nnimap-request-newgroups): Quote group instead of escaping SPC. - -1999-12-05 Simon Josefsson - - * imap.el: Use format-spec for ssl program. - * imap.el (imap-ssl-arguments): Removed. - (imap-ssl-open-{1,2}): Removed. - -1999-12-04 Per Abrahamsen - - * gnus-start.el (gnus-site-init-file): Use `condition-case' - instead of `ignore-errors', since cl may not be loaded when the - form is evaluated. - -1999-12-04 11:34:22 Shenghuo ZHU - - * mm-bodies.el (mm-8bit-char-regexps): Removed. - (mm-7bit-chars): New variable. - (mm-body-7-or-8): Use it in both cases. - -1999-12-04 Michael Welsh Duggan - - * gnus-start.el (gnus-site-init-file): Don't use cl macros in - defcustom definitions. - -1999-12-04 Simon Josefsson - - * mm-decode.el (mm-display-part): Let mm-display-external return - inline or external. - (mm-display-external): For copiousoutput methods, insert output in - buffer. - -1999-12-04 03:29:13 Shenghuo ZHU - - * nntp.el (nntp-retrieve-headers-with-xover): Goto the end of - buffer. - -1999-12-04 08:31:10 Lars Magne Ingebrigtsen - - * gnus-audio.el: An M too far. - - * gnus-msg.el (gnus-setup-message): One backtick too many. - - * gnus-art.el (gnus-mime-view-part-as-type): mailcap-mime-types is - a function, not a variable. - -1999-12-04 08:14:08 Max Froumentin - - * gnus-score.el (gnus-score-body): Widen before requesting. - -1999-12-04 08:06:13 Lars Magne Ingebrigtsen - - * gnus-group.el (gnus-group-prepare-flat): Comment fix. - -1999-12-04 03:01:55 Shenghuo ZHU - - * mail-source.el (mail-source-fetch-webmail): Bind - mail-source-string. - -1999-12-04 07:18:23 Matt Swift - - * gnus-uu.el (gnus-uu-mark-by-regexp): Doc fix. - (gnus-uu-unmark-by-regexp): Ditto. - - * gnus-group.el (gnus-group-catchup-current): Would bug out on - dead groups. - -1999-12-04 01:34:31 Lars Magne Ingebrigtsen - - * gnus-msg.el (gnus-setup-message): Allow the charset setting to - do their real thing. - - * nnmh.el (nnmh-be-safe): Doc fix. - - * gnus-sum.el (gnus-summary-exit): Write cache active file. - - * nntp.el (nntp-retrieve-headers-with-xover): Make sure the entire - status line has arrived before we count it. - - * mailcap.el (mailcap-mime-data): Removed save-file from audio/*. - - * gnus-sum.el (gnus-thread-header): Fixed after indent. - Whitespace problems. - - * gnus-win.el (gnus-configure-windows): Error fix. - - * gnus-demon.el (gnus-demon-add-nntp-close-connection): Add the - right function. - - * gnus.el: Fixed all the doc strings to match the FSF convetions. - Indent all functions. Fix all comments to match the comment - conventions. Double-space after full stop. - -1999-12-04 01:14:55 YAMAMOTO Kouji - - * nnmail.el (nnmail-split-it): I redefined nnmail-split-fancy's - value to divide received mails into my favorite groups and I met - an error. It takes place if the length of a element "VALUE" in - nnmail-split-fancy is less than two. - -1999-10-10 Robert Bihlmeyer - - * mml.el (mml-insert-part): New function. - -1999-09-29 04:48:14 Katsumi Yamaoka - - * lpath.el: Add `sc-cite-regexp'. - -1999-12-02 Dave Love - - * mm-decode.el: Customize. - -1999-12-03 Dave Love - - * nnslashdot.el, nnultimate.el: Don't lose at compile time when - the W3 stuff isn't available. - -1999-12-03 Dave Love - - * imap.el, mailcap.el, nnvirtual.el, rfc2104.el: Don't require cl - at runtime. - -1999-12-04 00:47:35 Dan Christensen - - * gnus-score.el (gnus-score-headers): Fix orphan scoring. - -1999-12-01 Andrew Innes - - * nnmbox.el (nnmbox-read-mbox): Count messages correctly, and - don't be fooled by "From nobody" lines added by respooling. - - * pop3.el (pop3-movemail): Write crashbox in binary. - (pop3-get-message-count): New function. - - * mail-source.el (mail-source-primary-source): New variable. - (mail-source-report-new-mail-interval): New variable. - (mail-source-idle-time-delay): New variable. - (mail-source-new-mail-available): New internal variable. - (mail-source-fetch-pop): Clear new mail flag, when mail from - primary source has been fetched. - (mail-source-check-pop): New function. - (mail-source-new-mail-p): New function. - (mail-source-start-idle-timer): New function. - (mail-source-report-new-mail): New function. - (mail-source-report-new-mail): New internal variable. - (mail-source-report-new-mail-timer): New internal variable. - (mail-source-report-new-mail-idle-timer): New internal variables. - -1999-12-04 00:39:34 Andreas Schwab - - * gnus-cus.el (gnus-group-customize): Customize fix. - -1999-12-04 00:38:24 Andrea Arcangeli - - * message.el (message-send-mail-with-sendmail): Use - message-make-address. - -Fri Dec 3 20:34:11 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v5.8.2 is released. - -Fri Dec 3 20:09:41 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v5.8.1 is released. - -1999-11-11 Hrvoje Niksic - - * mml.el (mml-insert-tag): Don't close the tag. - (mml-insert-empty-tag): New function. - (mml-attach-file): Use mml-insert-empty-tag instead of - mml-insert-tag. - (mml-attach-buffer): Ditto. - (mml-attach-external): Ditto. - (mml-insert-multipart): Ditto. - -1999-12-03 08:49:53 Shenghuo ZHU - - * nnfolder.el (nnfolder-request-article): Return -1 if not find - the article number. - -1999-12-03 01:12:41 Shenghuo ZHU - - * gnus.el (gnus-find-method-for-group): The method of a new group - is not the native one. - -1999-12-03 01:26:55 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-button-embedded-url): Always call browse-url. - -1999-12-02 18:00:15 Lars Magne Ingebrigtsen - - * nnultimate.el (nnultimate-retrieve-headers): Use - mm-with-unibyte-current-buffer. - (nnultimate-request-article): Ditto. - -1999-12-02 14:57:46 Shenghuo ZHU - - * nntp.el (nntp-retrieve-groups): Set to process buffer. - -1999-12-02 11:14:50 Shenghuo ZHU - - * mm-util.el (mm-with-unibyte-current-buffer): New macro. - * nnweb.el (nnweb-retrieve-headers): Use it. - (nnweb-request-article): Use it. - - * nnweb.el (nnweb-dejanews-create-mapping): Set a default date in - case matching failed. - -1999-12-02 John Wiegley - - * mail-source.el (mail-source-keyword-map): Add backslash to - Delete-flag. - -1999-12-02 07:24:35 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-group-charset-alist): Default nnweb groups to - Latin-1. - (gnus-group-charset-alist): No, don't. - - * nnweb.el (nnweb-init): Make the buffer unibyte. - -1999-12-01 23:02:48 Shenghuo ZHU - - * mail-source.el (mail-source-set-common-1): Fix to get the - default value. - -1999-12-02 00:27:46 Lars Magne Ingebrigtsen - - * nnslashdot.el (nnslashdot-read-groups): Unibyte. - - * nnultimate.el (nnultimate-request-list): Use unibyte. - - * gnus-uu.el (gnus-uu-grab-articles): Bind - gnus-display-mime-function to nil. - - * message.el (message-send-mail-with-sendmail): Use the - user-mail-address variable. - - * gnus-art.el (gnus-ignored-headers): More headers. - - * message.el (message-shorten-1): Use list. - -1999-12-01 21:59:36 Lars Magne Ingebrigtsen - - * gnus-msg.el (gnus-configure-posting-styles): Ignore nil - signatures. - - * nnweb.el (nnweb-dejanews-create-mapping): Get the data. - (nnweb-dejanews-create-mapping): Do the properish date. - -1999-12-01 17:41:21 Shenghuo ZHU - - * mail-source.el (mail-source-common-keyword-map): New variable. - (mail-source-bind-common): New macro. - (mail-source-fetch): Support plugged mail source. - * gnus-int.el (gnus-request-scan): Use them. - -1999-12-01 21:59:36 Lars Magne Ingebrigtsen - - * mm-view.el (mm-inline-message): Check whether charset is a - string. - - * nnslashdot.el (nnslashdot-request-post): Insert

's. - - * message.el (message-mode-map): Changed keystroke for - message-yank-buffer. - -1999-11-26 Hrvoje Niksic - - * message.el (message-shorten-references): Cut references to 31 - elements, then either fold them or shorten them to 988 characters. - (message-shorten-1): New function. - (message-cater-to-broken-inn): New variable. - -1999-12-01 21:47:10 Eric Marsden - - * nnslashdot.el (nnslashdot-lose): New function. - -1999-12-01 21:08:48 Lars Magne Ingebrigtsen - - * mm-view.el (mm-inline-message): Not the right type of charset is - being fetched here. Let the group charset rule. - (mm-inline-message): Ignore us-ascii. - -1999-11-24 Carsten Leonhardt - - * mail-source.el (mail-source-fetch-maildir): work around the - ommitted "file-regular-p" in efs/ange-ftp - -1999-12-01 19:59:25 Lars Magne Ingebrigtsen - - * mml.el (mml-generate-mime-1): Don't insert extra empty line. - (mml-generate-mime-1): Use the encoding param. - - * gnus-sum.el (gnus-summary-show-article): Don't bind gnus-visual. - - * gnus-cache.el (gnus-cache-possibly-enter-article): Require - gnus-art before binding its variables. - - * gnus-art.el (gnus-article-prepare-display): Run the prepare - after the MIME. - -1999-12-01 19:48:14 Rupa Schomaker - - * message.el (message-clone-locals): Use it. - - * gnus-msg.el (gnus-configure-posting-styles): Make - user-mail-address local. - -1999-11-20 Simon Josefsson - - * gnus-start.el (gnus-get-unread-articles): Scan each method only - once. - -1999-12-01 17:37:18 Lars Magne Ingebrigtsen - - * message.el (message-generate-new-buffer-clone-locals): Use varstr. - (message-clone-locals): Ditto. - - * gnus-sum.el (gnus-summary-enter-digest-group): Have the digest - group inherit reply-to or from. - -1999-12-01 13:04:09 Shenghuo ZHU - - * gnus-sum.el (gnus-summary-show-article): Support numbered ARG - for charset. - (gnus-summary-show-article-charset-alist): New variable. - - * mm-bodies.el (mm-decode-string): Support gnus-all and - gnus-unknown. - (mm-decode-body): Ditto. - * rfc2047.el (rfc2047-decode): Ditto. - -1999-12-01 17:37:18 Lars Magne Ingebrigtsen - - * mail-source.el (mail-source-delete-incoming): Change default to - t. - -Wed Dec 1 16:31:31 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.99 is released. - -1999-12-01 14:28:49 Lars Magne Ingebrigtsen - - * dgnushack.el (dgnushack-compile): No webmail under Emacs. - - * gnus-sum.el (gnus-summary-refer-article): Wrong interactive - spec. - - * gnus-msg.el (gnus-configure-posting-styles): Eval `eval'. - (gnus-configure-posting-styles): No, don't. - (gnus-configure-posting-styles): Allow overriding files. - - * gnus-art.el (gnus-header-button-alist): Use browse-url - directly. - - * mm-decode.el (mm-inline-media-tests): Check feature vcard. - - * gnus-msg.el (gnus-summary-yank-message): New command and - keystroke. - - * message.el (message-yank-buffer): New command. - (message-buffers): New function. - - * gnus-sum.el (gnus-summary-catchup-and-goto-next-group): Select - next group in a more normal fasion. - - * mml.el (mml-boundary-function): New variable. - (mml-compute-boundary): Use it. - - * nnmh.el (nnmh-active-number): Skip past files that have buffers - that exist for them. - - * gnus-async.el (gnus-async-prefetch-next): Cancel timers. - (gnus-async-timer): New variable. - -1999-11-30 02:07:18 Lars Magne Ingebrigtsen - - * nnultimate.el (nnultimate-request-list): Be more lenient with - root addresses. - -1999-11-28 20:22:37 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-treatment-function-alist): Do - gnus-treat-capitalize-sentences. - -1999-11-30 09:07:53 Shenghuo ZHU - - * webmail.el (webmail-hotmail-article): Hotmail changes the - format. - -1999-11-29 Simon Josefsson - - * mm-decode.el (mm-display-external): For `copiousoutput' methods, - switch to buffer after calling program. - (mm-display-external): Use `shell-command-switch' instead of "-c". - -1999-11-27 15:21:25 Lars Magne Ingebrigtsen - - * nnultimate.el (nnultimate-possibly-change-server): Don't always - read groups file. - - * nnslashdot.el (nnslashdot-request-article): Convert

to -

. - -1999-11-24 20:18:24 Lars Magne Ingebrigtsen - - * message.el (message-mode): Doc fix. - -1999-11-24 09:25:00 Shenghuo ZHU - - * gnus-art.el (article-emphasize): Check group variable. - * rfc1843.el (rfc1843-decode-article-body): Ditto. - -1999-11-24 00:11:27 Shenghuo ZHU - - * mm-decode.el (mm-save-part-to-file): Inhibit jka-compr for any - type. - -1999-11-23 17:21:05 Shenghuo ZHU - - * webmail.el: Support www.netaddress.com, i.e. usa.net. - -1999-11-23 Hrvoje Niksic - - * mml.el (mml-quote-region): Insert ! after the hash. - -1999-11-23 05:08:23 Shenghuo ZHU - - * gnus-group.el (gnus-group-warchive-address-history): Change to - nil. - -1999-11-23 02:33:13 Shenghuo ZHU - - * webmail.el: Support mail.yahoo.com. - - * mail-source.el (mail-source-fetch-webmail): Add password check. - (mail-source-keyword-map): Use `subtype'. - -1999-11-22 04:35:43 Shenghuo ZHU - - * mail-source.el (mail-source-keyword-map): Add webmail. - (mail-source-fetcher-alist): Ditto. - (mail-source-fetch-webmail): New function. - * webmail.el: New file. - -1999-11-21 12:20:02 Shenghuo ZHU - - * nnwarchive.el (nnwarchive-request-group): Print 0 if it is nil. - -1999-11-21 12:19:11 Shenghuo ZHU - - * mailcap.el (mailcap-parse-mailcap): Don't skip double semicolon. - -1999-11-20 12:54:25 Lars Magne Ingebrigtsen - - * nnultimate.el (nnultimate-request-list): Add fetch-time slot. - (nnultimate-prune-days): New function. - (nnultimate-create-mapping): Use it. - (nnultimate-request-group): Only fetch the groups list if it has - not been done before. - (nnultimate-retrieve-headers): Don't write groups. - (nnultimate-create-mapping): Off-by-one error. - -1999-11-19 12:17:25 Lars Magne Ingebrigtsen - - * nnslashdot.el (nnslashdot-sane-retrieve-headers): Fix to match - threaded subjects. - -1999-11-20 02:22:52 Shenghuo ZHU - - * nnwarchive.el: Lots of changes make agent happy. - -1999-11-19 21:37:41 Shenghuo ZHU - - * gnus-start.el (gnus-get-unread-articles): Assert group is in - hashtb. - -1999-11-19 19:53:08 Shenghuo ZHU - - * mm-decode.el (mm-display-external): Write region with binary - mode. - -1999-11-18 14:52:05 Shenghuo ZHU - - * nnweb.el (nnweb-dejanews-create-mapping): Bind `text'. - -1999-11-18 14:35:01 Shenghuo ZHU - - * mm-uu.el (mm-uu-dissect): Use fake charset `gnus-decoded'. - (mm-uu-test): Now it is in restricted region. - - * gnus-art.el (article-decode-charset): Don't mm-uu-test. - - * mm-view.el (mm-view-message): Fix buffer leak. - (mm-inline-message): Support 'gnus-decoded. - - * mm-bodies.el (mm-decode-body): Ditto. - - * rfc2047.el (rfc2047-decode-region): Ditto. - -1999-11-18 Matthias Andree - - * imap.el (require): Added autoload for base64-encode-string. - -1999-11-17 Per Abrahamsen - - * gnus.el (gnus-refer-article-method): Made list value - customizable. - -1999-11-17 13:09:37 Shenghuo ZHU - - * gnus-sum.el (gnus-summary-recenter): set-window-start with - NOFORCE in Emacs case. - -1999-11-17 13:04:01 Shenghuo ZHU - - * gnus-art.el (gnus-request-article-this-buffer): Set - gnus-newsgroup-name. - -1999-11-16 23:53:22 Shenghuo ZHU - - * gnus-xmas.el (gnus-xmas-summary-recenter): set-window-start with - NOFORCE. - -1999-11-17 Simon Josefsson - - * gnus-start.el (gnus-get-unread-articles): Check server before - scanning. - -1999-11-16 10:01:03 Lars Magne Ingebrigtsen - - * gnus.el (gnus-valid-select-methods): nnslashdot is news. - - * nnslashdot.el (nnslashdot-login-name): New variable. - (nnslashdot-password): Ditto. - (nnslashdot-request-post): New function. - - * gnus-art.el (gnus-treat-buttonize): More testing. - - * mm-encode.el: Another CVS test. - - * gnus-art.el (gnus-treat-emphasize): Change default. - (gnus-treat-buttonize): Ditto. - (gnus-treat-buttonize): This is a test. - - * gnus-sum.el (gnus-build-old-threads): Bind mail-parse-charset. - (gnus-build-sparse-threads): Ditto. - (gnus-build-all-threads): Ditto. - - * nnheader.el (make-full-mail-header): Make into a subst. - - * dgnushack.el (dgnushack-compile): Skip all w3-dependent files - unless w3 is supplied. - - * gnus.el (gnus-refer-article-method): Doc fix. - - * gnus-sum.el: Do not accept a prefix. - (gnus-summary-refer-article): Accept a list of select methods. - -1999-11-15 21:28:40 Shenghuo ZHU - - * Makefile.in: Change `^ *' to `\t'. - -1999-11-11 Matt Pharr - - * message.el (message-forward): Pay attention to prefix argument - again and forward all headers when it is set, regardless of the - value of message-forward-ignored-headers. - -1999-11-15 20:44:50 William M. Perry - - * dgnushack.el (dgnushack-compile): Vpath file. - - * Makefile.in (SHELL): VPATH support. - -1999-11-15 20:37:17 Lars Magne Ingebrigtsen - - * gnus-ems.el: Check for cygwin32. - -1999-11-14 18:15:28 Shenghuo ZHU - - * mm-decode.el (mm-display-external): Use 'non-viewer. - -1999-11-14 15:21:06 Shenghuo ZHU - - * base64.el (base64-encode-string): An alias for base64-encode for - compatibility. - -1999-11-14 01:58:18 Shenghuo ZHU - - * nntp.el (nntp-retrieve-groups): Erase nntp-sever-buffer before - nntp-inhibit-erase. - -1999-11-13 Simon Josefsson - - * gnus-start.el (gnus-get-unread-articles): Use - nnfoo-retrieve-groups to find new news, if available. - (gnus-read-active-file-2): New function. - (gnus-get-unread-articles): Use it. - (gnus-read-active-file-1): Ditto. - -1999-11-13 17:59:18 Lars Magne Ingebrigtsen - - * mm-util.el (mm-find-mime-charset-region): Make sure - find-coding-systems-for-charsets is fbound. - - * gnus-ems.el: Typo fix. - -1999-11-13 Florian Weimer - - * mm-util.el (mm-find-mime-charset-region): Use UTF-8 if - it's available and makes sense. - -1999-11-12 19:56:23 Fabrice POPINEAU - - * gnus-score.el (gnus-score-save): Translate score file. - -1999-11-13 Simon Josefsson - - * mail-source.el (mail-source-keyword-map): For IMAP mail source, - added fetchflag and dontexpunge keywords. - (mail-source-fetch-imap): Use them. - -1999-11-12 Per Abrahamsen - - * gnus-start.el (gnus-level-subscribed, gnus-level-unsubscribed, - gnus-level-zombie, gnus-level-killed): Changed from `defcustom' to - `defconst'. - - * gnus-cus.el (gnus-group-parameters): Changed from `defcustom' to - `defconst'. - Mention that it is both for group and topic parameters. - (gnus-extra-topic-parameters): New constant, including `subscribe' - parameter. - (gnus-extra-group-parameters): New constant. - (gnus-group-customize): Use them. - - * gnus.el (gnus-select-method): Added default value and tag. - (gnus-refer-article-method): Added `DejaNews' customization option. - -1999-11-12 05:04:43 Lars Magne Ingebrigtsen - - * gnus-int.el (gnus-server-opened): Ignore denied servers. - - * gnus-ems.el (gnus-mule-max-width-function): New backquote - syntax. - - * nndoc.el (nndoc-mime-digest-type-p): Reinstated. - - * nnslashdot.el (nnslashdot-group-number): Changed default. - - * nnweb.el (nnweb-dejanews-create-mapping): Work with new deja. - (nnweb-dejanews-wash-article): Removed. - (nnweb-type-definition): Fetch by id. - - * gnus-msg.el (gnus-configure-posting-styles): Don't insert unless - we mean it. - - * nnslashdot.el (nnslashdot-group-number): Doc fix. - (nnslashdot-request-list): Use Ultramode as well. - (nnslashdot-date-to-date): Be more lenient. - (nnslashdot-threaded): New function. - -1999-11-11 17:40:54 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-mime-internalize-part): Doc fix. - -1999-11-11 14:32:48 Steinar Bang - - * nnweb.el (nnweb-type-definition): /=dnc - -1999-11-11 10:58:38 Lars Magne Ingebrigtsen - - * nnultimate.el (nnultimate-retrieve-headers): Work with american - dates. - (nnultimate-retrieve-headers): Wrong ordering. - -1999-11-11 07:31:51 Matt Pharr - - * message.el (message-forward-as-mime): New variable. - -1999-11-11 05:24:13 Lars Magne Ingebrigtsen - - * gnus-util.el (gnus-dd-mmm): Beware buggy dates. - -1999-11-10 16:50:01 Shenghuo ZHU - - * mail-source.el (mail-source-movemail-and-remove): New function. - (mail-source-keyword-map): Add `function' for `maildir'. - (mail-source-fetch-maildir): Use it. - -1999-11-10 13:48:10 Shenghuo ZHU - - * nnwarchive.el: New file. - * gnus-group.el (gnus-group-make-warchive-group): New function. - * gnus.el (gnus-valid-select-methods): Add `nnwarchive'. - -1999-11-10 12:13:30 Lars Magne Ingebrigtsen - - * nnultimate.el (nnultimate-retrieve-headers): Work for multi-page - subjects. - -1999-11-10 11:33:23 Rajappa Iyer - - * gnus-salt.el (gnus-pick-article-or-thread): Don't move point. - -1999-11-10 05:22:56 Lars Magne Ingebrigtsen - - * nnultimate.el (nnultimate-open-server): Do address. - (nnultimate-forum-table-p): New function. - - * nnweb.el (nnweb-insert-html): Renamed. - (nnweb-insert): New function. - - * nnultimate.el (nnultimate-insert-html): New function. - - * nnslashdot.el (nnslashdot-retrieve-headers): Don't do anything - if nov is evil. - (nnslashdot-retrieve-headers): use the sane version instead. - -1999-11-09 00:13:25 Lars Magne Ingebrigtsen - - * nnslashdot.el (nnslashdot-request-article): Fold case. - - * nnultimate.el: New file. - - * nnslashdot.el (nnslashdot-retrieve-headers): Skip the article - unless wanted. - - * gnus-start.el (gnus-active-to-gnus-format): Catch errors. - (gnus-read-active-file-1): Separated into own function. - (gnus-read-active-file): Catch quits. - - * nnslashdot.el (nnslashdot-request-article): Search better on - first article. - (nnslashdot-request-list): Fold case. - (nnslashdot-retrieve-headers): Ditto. - -1999-11-08 05:33:15 Lars Magne Ingebrigtsen - - * gnus.el: Autoload gnus-subscribe-topics. - -1999-11-07 22:56:46 Shenghuo ZHU - - * gnus-agent.el (gnus-agent-save-group-info): Remove backslash - before dot. - * gnus-util.el (gnus-write-active-file): Ditto. - -1999-11-07 22:31:10 Shenghuo ZHU - - * nnheader.el (nnheader-replace-duplicate-chars-in-string): New - function. - * gnus-cache.el (gnus-cache-file-name): Use it. - * gnus-agent.el (gnus-agent-group-path): Use it. - * nnmail.el (nnmail-group-pathname): Use it. - -1999-11-07 21:07:55 Shenghuo ZHU - - * gnus-start.el (gnus-active-to-gnus-format): Don't insert backslash - if cooked. - * gnus-util.el (gnus-write-active-file): Write cooked active file. - * gnus-agent.el (gnus-agent-save-group-info): Ditto. - * gnus.el (gnus-short-group-name): "..." proof. - -1999-11-07 20:03:16 Shenghuo ZHU - - * gnus-srvr.el (gnus-browse-foreign-server): Keep using `read' to - support nnslashdot. - -1999-11-08 00:06:02 Lars Magne Ingebrigtsen - - * nnslashdot.el (nnslashdot-retrieve-headers): Don't fetch too - many articles. - (nnslashdot-generate-active): New function. - (nnslashdot-request-newgroups): Use it. - - * gnus-start.el (gnus-active-to-gnus-format): Intern strings group - names. - - * nnslashdot.el (nnslashdot-request-newgroups): New function. - (nnslashdot-request-list): Not moderated. - -1999-11-07 Simon Josefsson - - * nnimap.el (nnimap-open-server): Remove error signal if - nnimap-server-buffer is nil (the check should've been `boundp'). - - * imap.el (imap-log): - * nnimap.el (nnimap-debug): Disable debugging by default. - -1999-11-07 01:17:53 Lars Magne Ingebrigtsen - - * gnus-start.el (gnus-subscribe-newsgroup-method): Doc fix. - - * gnus-topic.el (gnus-subscribe-topic): New function. - - * nnslashdot.el (nnslashdot-request-list): Give out extended group - names. - - * gnus-start.el (gnus-ignored-newsgroups): Disregard bogus chars - if starting with a quote. - -1999-11-07 13:06:11 Shenghuo ZHU - - * gnus-srvr.el (gnus-browse-foreign-server): Support backslash in - group name. - -1999-11-07 01:17:53 Lars Magne Ingebrigtsen - - * nnslashdot.el: New file. - - * nnheader.el (nnheader-insert-header): New function. - - * gnus-art.el (gnus-mime-internalize-part): Bind - mm-inlined-types. - - * nndraft.el (nndraft-request-expire-articles): Do all the backup - files. - -1999-10-29 David S. Goldberg - - * emacs-mime.texi (Customization): Document mm-inline-override-types - -1999-10-29 David S. Goldberg - - * emacs-mime.texi (Customization): Document mm-inline-override-types - -1999-10-29 David S. Goldberg - - * emacs-mime.texi (Customization): Document mm-inline-override-types - -1999-10-26 Katsumi Yamaoka - - * smiley.el (gnus-smiley-display): Use `smiley-toggle-buffer'. - (smiley-toggle-buffer): New function. - (smiley-buffer): Don't quote the function. - (smiley-toggle-extents): Ditto. - -1999-11-07 01:00:32 Lars Magne Ingebrigtsen - - * gnus-topic.el (gnus-topic-goto-missing-topic): Work even in - empty buffers. - -1999-11-06 23:16:24 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-article-mode-map): Use the summary article - edit. - -1999-11-06 22:56:49 Jens-Ulrik Petersen - - * gnus-group.el (gnus-group-read-ephemeral-group): Doc fix. - -1999-11-06 21:40:30 Lars Magne Ingebrigtsen - - * gnus-uu.el (gnus-uu-mark-thread): Don't move point around. - -1999-10-07 Katsumi Yamaoka - - * gnus-art.el (gnus-treat-predicate): Examine whether the argument - is list or not before condition. - -1999-10-07 Yoshiki Hayashi - - * gnus-art.el (gnus-treat-predicate): Work for (typep "something"). - -1999-11-06 19:18:14 Kevin the Bandicoot - - * gnus-art.el (gnus-emphasis-alist): New value. - -1999-11-06 13:57:13 Shenghuo ZHU - - * gnus-srvr.el (gnus-browse-foreign-server): Use both `read' and - `buffer-substring'. - -1999-11-06 04:24:30 Lars Magne Ingebrigtsen - - * gnus-art.el (article-date-ut): Keep the updated timer. - (gnus-emphasis-underline-italic): Doc fix. - - * gnus-msg.el (gnus-post-method): Doc fix. - (gnus-post-method): Change default. - -1999-11-06 04:12:13 Francisco Solsona - - * message.el (message-newline-and-reformat): Improvements. - -1999-11-06 03:51:24 Lars Magne Ingebrigtsen - - * message.el (message-newline-and-reformat): Don't insert too many - newlines. - (message-newline-and-reformat): Work even if not sc. - - * mm-view.el (mm-inline-message): Insert a delimiter at the end. - - * mm-decode.el (mm-inline-media-tests): Only if diff mode. - -1999-11-06 03:48:02 Toby Speight - - * mm-view.el (mm-display-patch-inline): New function. - -1999-11-06 03:47:54 Robert Bihlmeyer - - * mm-view.el (mm-display-patch-inline): New function. - -1999-11-06 02:17:54 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-read-move-group-name): Subscribe to the - group. - - * message.el (message-forward): Narrow to the right header. - - * gnus-sum.el (gnus-summary-limit-to-age): Protect against bogus - dates. - - * gnus-msg.el (gnus-configure-posting-styles): Use the - user-full-name function. - - * mm-bodies.el (mm-body-encoding): Use the choosing function. - (mm-body-charset-encoding-alist): Default to nil. - - * message.el (message-elide-ellipsis): Fix typo. - (message-elide-region): Ditto. - (message-elide-region): Don't insert a newline first. - -1999-11-05 20:28:27 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-cut-thread): Also cut for numberp - gnus-fetch-old-headers. - (gnus-cut-threads): Ditto. - (gnus-summary-initial-limit): Ditto. - (gnus-summary-limit-children): Ditto. - - * gnus-msg.el (gnus-configure-posting-styles): Allow `header' - matches. - -1999-11-06 Simon Josefsson - - * gnus-art.el (article-decode-encoded-words): - (gnus-mime-display-single): Don't assume gnus-summary-buffer is - live. - - * gnus.el (gnus-read-method): Add methods from - `gnus-opened-servers' to completion. Map entered method/address - into existing methods if possible. - - * gnus-group.el (gnus-group-make-group): Simplify method. - - * gnus-srvr.el (gnus-browse-unsubscribe-group): Simplify method. - - * mml.el (mml-preview): Remove mail-header-separator before - encoding. - -1999-11-05 20:28:27 Lars Magne Ingebrigtsen - - * message.el (message-read-from-minibuffer): New function. - -Fri Nov 5 19:10:02 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.98 is released. - -1999-11-05 01:27:49 Shenghuo ZHU - - * gnus-agent.el (gnus-agent-expire): Remove bad line in NOV. - -1999-11-04 22:20:35 Shenghuo ZHU - - * mml.el (mml-generate-mime-1): Read attached binary file in - binary mode. - -1999-11-03 16:08:56 Shenghuo ZHU - - * gnus-sum.el (gnus-summary-toggle-header): Fix arg bug. - -1999-11-03 15:27:38 Shenghuo ZHU - - * mailcap.el (mailcap-viewer-lessp): Fix bug. - -1999-11-02 17:28:33 Shenghuo ZHU - - * gnus-sum.el (gnus-summary-search-article): Fix loop search bug. - -1999-10-31 21:24:59 Shenghuo ZHU - - * gnus-art.el (gnus-article-mime-match-handle-first): New function. - (gnus-article-mime-match-handle-function): New variable. - (gnus-article-view-part): Make `b' customizable. - -1999-10-29 14:30:07 Shenghuo ZHU - - * gnus-sum.el (gnus-article-get-xrefs): Test eobp. - -1999-09-27 Hrvoje Niksic - - * mm-decode.el (mm-attachment-override-types): Exclude text/plain. - -1999-10-26 23:27:44 Shenghuo ZHU - - * mm-decode.el (mm-dissect-buffer): CTE may come without CTL. - -1999-10-26 21:44:05 Shenghuo ZHU - - * gnus-srvr.el (gnus-browse-foreign-server): Use - `buffer-substring' instead of `read'. - -1999-10-23 Simon Josefsson - - * nnimap.el, imap.el, rfc2104.el: New files. - - * gnus.el (gnus-valid-select-methods): Add nnimap. - - * gnus-group.el (gnus-group-group-map): Add - gnus-group-nnimap-edit-acl, gnus-group-nnimap-expunge. - (gnus-group-nnimap-expunge): New function. - (gnus-group-nnimap-edit-acl): New function. - - * gnus-agent.el (gnus-agent-group-mode-map): Add - gnus-agent-synchronize. - (gnus-agent-synchronize): New function. - (gnus-agent-fetch-group-1): Check if server is open. - - * nnagent.el (nnagent-request-set-mark): Save marks. - - * mail-source.el (mail-source-keyword-map): New imap mail-source. - (mail-source-fetcher-alist): Map to imap fetcher function. - (mail-source-fetch-imap): New function. - - * gnus-art.el (article-hide-pgp): Hide all headers, not just - Hash:. - -1999-10-22 11:03:00 Shenghuo ZHU - - * gnus-topic.el (gnus-topic-sort-topics-1): New function. - (gnus-topic-sort-topics): New function. - (gnus-topic-make-menu-bar): Add sort-topics. - (gnus-topic-move): New function. - (gnus-topic-move-group): Move the topic if no group selected. - -1999-10-13 21:31:50 Shenghuo ZHU - - * gnus-art.el (gnus-article-setup-buffer): Fix buffer leak. - -1999-10-13 12:52:18 Shenghuo ZHU - - * mm-view.el (mm-inline-message): Fix leaving group bug. - -1999-10-07 17:59:49 Shenghuo ZHU - - * gnus-msg.el (gnus-post-method): Use normal method if current is - not available. - -1999-10-07 17:09:34 Shenghuo ZHU - - * nnmail.el (nnmail-insert-xref): Dealing with empty articles. - (nnmail-insert-lines): Ditto. - -1999-10-07 Shenghuo ZHU - - * nnfolder.el (nnfolder-insert-newsgroup-line): Insert a blank - line. - - * message.el (message-unsent-separator): One more separator. - -1999-10-06 Shenghuo ZHU - - * nnfolder.el (nnfolder-request-move-article): For empty article, - search till (point-max). - (nnfolder-retrieve-headers): Ditto. - (nnfolder-request-accept-article): Ditto. - (nnfolder-save-mail): Ditto. - (nnfolder-insert-newsgroup-line): Ditto. - -1999-10-05 Shenghuo ZHU - - * qp.el (quoted-printable-encode-region): Check eobp. - -1999-10-03 Shenghuo ZHU - - * nntp.el (nntp-retrieve-headers-with-xover): Fix hanging problem. - -1999-10-02 Shenghuo ZHU - - * nntp.el (nntp-send-xover-command): Wait for nothing if not - wait-for-reply. - -1999-09-29 Shenghuo ZHU - - * mm-uu.el (mm-uu-forward-begin-line): Change the regexp. - (mm-uu-forward-end-line): Ditto. - -1999-09-29 Didier Verna - - * binhex.el (binhex-decode-region): don't consider the value of - `enable-multibyte-characters' in XEmacs. - - * gnus-start.el (gnus-read-descriptions-file): ditto. - - * mm-util.el (mm-multibyte-p): ditto. - (mm-with-unibyte-buffer): ditto. - (mm-find-charset-region): use `mm-multibyte-p'. - - * mm-bodies.el (mm-decode-body): ditto. - (mm-decode-string): ditto. - - * lpath.el ((string-match "XEmacs" emacs-version)): Don't define - `enable-multibyte-characters' in XEmacs. - -1999-09-29 Shenghuo ZHU - - * mm-util.el (mm-binary-coding-system): Try binary first. - -1999-09-14 Shenghuo ZHU - - * rfc1843.el (rfc1843-decode-article-body): Don't decode twice. - -1999-09-10 Shenghuo ZHU - - * gnus-art.el (article-make-date-line): Add time-zone in iso8601 - format. - (article-date-ut): Find correct insert position. - -1999-09-03 Shenghuo ZHU - - * mm-uu.el (mm-uu-dissect): Do not dissect quoted-printable - forwarded message. - -1999-09-27 20:33:41 Lars Magne Ingebrigtsen - - * gnus-topic.el (gnus-topic-find-groups): Work for unactivated - groups. - - * message.el (message-resend): Use message mode when prompting. - - * gnus-art.el (article-hide-headers): Mark wash. - (article-emphasize): Ditto. - -1999-09-27 19:52:14 Vladimir Volovich - - * message.el (message-newline-and-reformat): Work for SC. - -1999-09-27 19:38:33 Lars Magne Ingebrigtsen - - * gnus-msg.el (gnus-group-posting-charset-alist): 2047 in de.*. - - * gnus-sum.el (gnus-newsgroup-ignored-charsets): Add x-unknown. - -1999-10-20 David S. Goldberg - - * mm-decode.el mm-inline-override-types: New variable - - * mm-decode.el (mm-inline-override-p): New function - - * mm-decode.el (mm-inlined-p): Use it - -1999-10-20 David S. Goldberg - - * mm-decode.el mm-inline-override-types: New variable - - * mm-decode.el (mm-inline-override-p): New function - - * mm-decode.el (mm-inlined-p): Use it - -Mon Sep 27 15:18:05 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.97 is released. - -1999-09-01 Brendan Kehoe - - * gnus-sum.el (gnus-summary-catchup-and-goto-next-group): Use - gnus-summary-next-group, not gnus-summary-next-article. Only give - 3 args. - -1999-09-25 08:07:57 Lars Magne Ingebrigtsen - - * gnus-agent.el (gnus-agent-fetch-group-1): Look in the group - buffer for params. - - * gnus-xmas.el (gnus-xmas-summary-recenter): Display one more - line. - - * message.el (message-forward-ignored-headers): New variable. - - * gnus-art.el (gnus-article-prepare-display): Nix out - gnus-article-wash-types. - - * gnus-agent.el (gnus-agent-create-buffer): New function. - (gnus-agent-fetch-group-1): Use it. - (gnus-agent-start-fetch): Ditto. - - * gnus-sum.el (gnus-summary-exit): Don't use - `gnus-use-adaptive-scoring'. - - * mail-source.el (mail-source-fetch-pop): Only store password when - successful. - - * gnus-nocem.el (gnus-nocem-scan-groups): Message better. - -1999-09-24 18:43:23 Lars Magne Ingebrigtsen - - * message.el (message-reply): Use it. - (message-dont-reply-to-names): New variable. - - * nntp.el (nntp-open-telnet): Don't erase-buffer. - - * mm-util.el (mm-preferred-coding-system): Typo fix. - - * message.el (message-bounce): Work for non-MIME. - - * gnus.el (gnus-short-group-name): Short the right parts of the - name. - -1999-09-24 18:17:48 Johan Kullstam - - * mm-encode.el (mm-qp-or-base64): New version. - -1999-09-10 Shenghuo ZHU - - * gnus-art.el (article-make-date-line): Fix time-zone bug. - -1999-09-09 Shenghuo ZHU - - * gnus-art.el (gnus-article-add-buttons): Don't delete markers out - of restricted region. - (gnus-mime-display-single): Set beg at correct point. - -1999-09-09 Shenghuo ZHU - - * nnmail.el (nnmail-process-maildir-mail-format): Typo. - -1999-09-09 Jens-Ulrik Petersen - - * gnus-msg.el (gnus-configure-posting-styles): Let - `gnus-posting-styles' have its say in posting-style: local - variable `styles' is already bound to `gnus-posting-styles' so - don't rebind it to nil. - -1999-09-24 18:10:56 Robert Bihlmeyer - - * gnus-score.el (gnus-summary-increase-score): Allow editing of - Message-ID. - -1999-09-08 Shenghuo ZHU - - * mm-encode.el (mm-encode-content-transfer-encoding): Fold - quoted-printable-encode-region. - - * qp.el (quoted-printable-encode-region): Assume charset - encoded. Fold every line in the region. - -1999-09-02 Shenghuo ZHU - - * gnus-srvr.el (gnus-browse-foreign-server): Read the first line - of active file. - -1999-09-01 Didier Verna - - * message.el (message-mode): allows whitespaces between multiple - instances of the fill character ">". - -1999-09-24 18:02:50 Kim-Minh Kaplan - - * mm-encode.el (mm-qp-or-base64): Fix. - -1999-09-01 12:18:01 Katsumi Yamaoka - - * message.el (message-send): Too much and. - -1999-09-24 17:58:07 Andreas Schwab - - * gnus-art.el (gnus-mime-view-part-as-type): Renamed. - -1999-08-28 12:44:20 Lars Magne Ingebrigtsen - - * gnus-score.el (gnus-score-headers): Work for nil scores. - -1999-08-27 20:46:11 Lars Magne Ingebrigtsen - - * gnus-cache.el (gnus-cache-write-active): Write full names. - - * gnus-util.el (gnus-write-active-file): Accept full name. - - * mm-decode.el (mm-inlinable-p): Use string-match on the types. - (mm-assoc-string-match): New function. - (mm-display-inline): Use it. - - * gnus-group.el (gnus-group-set-info): Work for nil group params. - - * gnus-msg.el (gnus-configure-posting-styles): Allow eval. - -1999-08-27 19:08:10 Florian Weimer - - * mml.el (mml-generate-multipart-alist): New variable. - -1999-08-27 15:30:02 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-treat-predicate): Work for (not 5). - -1999-08-27 Peter von der Ahe - - * message.el (message-send): More helpful error message if sending - fails - -1999-09-06 Robert Bihlmeyer - - * gnus-score.el (gnus-summary-increase-score): "Lars" was broken - in newer emacsen, where ?r isn't equal 114. - -Fri Aug 27 13:17:48 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.96 is released. - -1999-08-17 Simon Josefsson - - * gnus-start.el (gnus-groups-to-gnus-format): Only use agent - to get active info if method is covered by agent, otherwise - active info is lost. - -1999-08-17 Simon Josefsson - - * gnus-sum.el (gnus-summary-move-article): Report backend errors. - -1999-08-09 Dave Love - - * mm-util.el: Use `defalias', not `fset' for dummy functions. - -1999-08-09 Simon Josefsson - - * gnus-art.el (gnus-ignored-headers): Remove "X-Pgp-*" - (already matched by "^X-Pgp"), removed duplicate - X-Mailing-List, added several new junk headers. - -1999-08-01 Simon Josefsson - - * gnus-art.el (article-decode-charset): Don't assume - gnus-summary-buffer is live. - -1999-08-27 15:07:43 Paul Flinders - - * smiley.el (smiley-deformed-regexp-alist): Fix % smileys. - -1999-08-27 15:02:58 Florian Weimer - - * gnus-score.el (gnus-home-score-file): Work with absolute path - names. - -1999-07-17 Shenghuo ZHU - - * gnus-sum.el (gnus-articles-to-read): Return cached articles if - nothing else in the group. - -1999-07-16 Shenghuo ZHU - - * gnus-bcklg.el (gnus-backlog-enter-article): Check the size of - the article. - -1999-07-15 Shenghuo ZHU - - * mm-uu.el (mm-uu-dissect): Fix for base64 message. - -1999-07-15 Shenghuo ZHU - - * mm-uu.el (mm-uu-forward-end-line): Support forwarded message - from mutt. - -1999-07-14 Shenghuo ZHU - - * mm-bodies.el (mm-decode-content-transfer-encoding): Delete - whitespace. - -1999-07-14 Shenghuo ZHU - - * mm-util.el (mm-text-coding-system-for-write): New variable. - (mm-append-to-file): New function. - (mm-write-region): New function. - - * gnus-art.el (gnus-output-to-file): Use it. - * gnus-util.el (gnus-output-to-rmail): Ditto. - (gnus-output-to-mail): Ditto. - * gnus-uu.el (gnus-uu-binhex-article): Ditto. - -1999-07-14 Shenghuo ZHU - - * nnmail.el (nnmail-find-file): Use mm-auto-mode-alist. - - * nnheader.el (nnheader-insert-file-contents): Revert and use - mm-insert-file-contents. - (nnheader-find-file-noselect): Use mm-auto-mode-alist. - (nnheader-auto-mode-alist): Removed. - - * mm-util.el (mm-inhibit-file-name-handlers): New variable. - (mm-insert-file-contents): Add a new parameter for inserting - compressed file literally. - - * mml.el (mml-generate-mime-1): Insert non-text literally. - - * gnus.el: Change most mm-insert-file-contents back to nnheader. - -1999-07-13 Hrvoje Niksic - - * gnus-art.el (gnus-unbuttonized-mime-types): Fix docstring. - -1999-08-27 14:53:42 Oleg S. Tihonov - - * gnus-sum.el (gnus-group-charset-alist): Default fido7 to - koi8-r. - -1999-07-11 Shenghuo ZHU - - * mml.el (mml-insert-mime): Decode text. - (mml-to-mime): Narrow to headers-or-head. - -1999-07-11 Shenghuo ZHU - - * mm-view.el (mm-inline-text): Check - w3-meta-content-type-charset-regexp. - -1999-07-10 Simon Josefsson - - * gnus-agent.el (gnus-agent-fetch-group-1): Search topics for - predicate. - -1999-07-10 Alexandre Oliva - - * gnus-mlspl.el: Documentation fixes. - -1999-08-27 14:42:14 Rui Zhu - - * gnus-sum.el (gnus-summary-limit-to-age): Prompt better. - -1999-08-27 14:40:52 Michael Cook - - * gnus-art.el (gnus-article-setup-buffer): Kill all local - variables. - -1999-08-27 14:39:34 Hrvoje Niksic - - * nnmail.el (nnmail-get-new-mail): "Done". - -1999-08-27 14:38:14 Lars Magne Ingebrigtsen - - * gnus-group.el (gnus-group-kill-all-zombies): Only prompt when - interactive. - -1999-07-12 Shenghuo ZHU - - * gnus-art.el (article-decode-charset): Fix broken CT. - -1999-07-12 Shenghuo ZHU - - * gnus-agent.el (gnus-agent-fetch-group-1): Recreate agent - overview buffer if it is killed. - -1999-08-27 14:26:03 Eric Marsden - - * gnus-art.el (article-babel): New version. - -1999-08-27 14:22:39 Jon Kv - - * nnfolder.el (nnfolder-request-list-newsgroups): Faster expiry. - -1999-07-10 Mike McEwan - - * gnus.texi (More Threading): Document new variable - `gnus-sort-gathered-threads-function'. - -1999-07-10 Mike McEwan - - * gnus.texi (More Threading): Document new variable - `gnus-sort-gathered-threads-function'. - -1999-07-11 Andreas Jaeger - - * gnus-uu.el (gnus-uu-digest-mail-forward): Delete file after - usage. - -1999-07-10 Shenghuo ZHU - - * mm-util.el (mm-running-xemacs): Removed. - (mm-coding-system-p): New function. - (mm-binary-coding-system): Safe guess. - (mm-text-coding-system): Ditto. - (mm-auto-save-coding-system): Ditto. - -1999-07-11 11:02:03 Lars Magne Ingebrigtsen - - * mm-encode.el (mm-qp-or-base64): Also consider control chars. - (mm-qp-or-base64): Reversed logic. - - * mm-decode.el (mm-save-part-to-file): Let coding system be - binary. - -1999-07-15 Mike McEwan - - * gnus-agent.el (gnus-agent-fetch-group-1): Allow 'agent-score' to - be set in topic parameters. - -1999-07-10 Mike McEwan - - * gnus-sum.el (gnus-sort-gathered-threads-function): New variable. - (gnus-sort-gathered-threads): Allow the user to specify the - function to use when sorting gathered threads. - - * gnus-agent.el (gnus-agent-get-undownloaded-list): Don't - mark cached articles as `undownloaded'. - -Tue Jul 20 02:39:56 1999 Peter von der Ahe - - * gnus-sum.el (gnus-summary-exit): Allow gnus-use-adaptive-scoring - to have buffer local values. - -1999-07-25 Matt Pharr - - * gnus-group.el (gnus-group-make-doc-group): Notice when user - types 'g' for 'guess group type. - -1999-07-30 Simon Josefsson - - * nnmail.el (nnmail-remove-list-identifiers): Remove whitespace - after each regexp in nnmail-list-identifiers, not just after last - one. - - * gnus-sum.el (gnus-list-identifiers): New variable. - (gnus-summary-remove-list-identifiers): New function. - (gnus-select-newsgroup): Use it. - (gnus-summary-wash-hide-map): Bind - `gnus-article-hide-list-identifiers' to W W l. - (gnus-summary-make-menu-bar): Add list-identifiers command. - - * gnus-art.el (gnus-treat-strip-list-identifiers): New variable. - (gnus-treatment-function-alist): Add variable. - (article-hide-list-identifiers): New function. - (mapcar): Add function. - (gnus-article-hide): Use it. - -Fri Jul 9 22:21:16 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.95 is released. - -1999-07-09 21:46:05 Lars Magne Ingebrigtsen - - * mm-decode.el (mm-mailcap-command): New function. - (mm-display-external): Use it. - - * gnus-art.el (article-make-date-line): Work for India. - - * mm-encode.el (mm-qp-or-base64): Typo. - - * gnus-topic.el (gnus-topic-goto-topic): Made into command. - -Fri Jul 9 19:28:29 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.94 is released. - -1999-07-09 21:19:23 Stainless Steel Rat - - * pop3.el: New version. - -1999-07-09 20:01:44 Lars Magne Ingebrigtsen - - * mm-encode.el (mm-qp-or-base64): New function. - (mm-content-transfer-encoding): Use it. - - * gnus-util.el (gnus-parse-netrc): Allow quoted names. - -1999-07-08 Shenghuo ZHU - - * mm-decode.el (mm-display-external): Fix typo and use 'non-viewer. - - * mailcap.el (mailcap-mailcap-entry-passes-test): Add needsterminal. - -1999-07-09 18:52:22 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-mime-view-part-as-media): New command and - keystroke. - - * mailcap.el (mailcap-mime-types): New function. - - * nnmh.el (nnmh-request-group): Update nnmh-group-alist. - - * message.el (message-goto-eoh): Really go to the end. - -1999-07-09 18:40:23 Puneet Goel - - * message.el (message-make-date): Do the right thing in with - sub-hour time zones. - -1999-07-09 18:36:21 Lars Magne Ingebrigtsen - - * gnus-group.el (gnus-group-make-menu-bar): Removed double bug - report. - -1999-07-08 Shenghuo ZHU - - * nnfolder.el (nnfolder-request-rename-group): Create directory. - -1999-07-08 Shenghuo ZHU - - * mailcap.el (mailcap-parse-mailcap): Skip \;. - (mailcap-parse-mailcap-extras): Fix "nonterminal;" and empty name, - and use t as default value. - -Wed Jul 7 18:40:30 1999 Shenghuo ZHU - - * gnus-sum.el (gnus-get-newsgroup-headers): Don't assume - gnus-summary-buffer is live. - -1999-07-09 17:44:03 Robert Pluim - - * mm-util.el (mm-enable-multibyte): Check whether var bound. - -1999-07-09 17:31:39 Lars Magne Ingebrigtsen - - * message.el (message-bounce): Do MIME bounces MIMEy. - - * gnus-sum.el (gnus-summary-read-group-1): Update mark positions. - -1999-07-08 08:41:10 Lars Magne Ingebrigtsen - - * mailcap.el (mailcap-mime-extensions): Changed patch to - text/x-patch. - - * mm-decode.el (mm-display-external): Wrong placement of paren. - -Wed Jul 7 13:09:51 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.93 is released. - -1999-07-08 Alexandre Oliva - - * gnus-cus.el (gnus-group-parameters): New entries for - gnus-group-split. - - * gnus-mlspl.el: Renamed functions and variables so as to - start with gnus-group-split. - * gnus.el: Adjust autoload entries. - -1999-07-07 ??:??:?? Alexandre Oliva - - * gnus-mlspl.el: Removed trailing t from comment and provide. - Renamed functions and variables to start with gnus-mlsplit. - Added autoload comments. - * gnus.el: Added autoload entries. - -1999-07-06 05:37:46 Alexandre Oliva - - * nnmail.el (nnmail-split-it): Search the regexp multiple times, - so that matches excluded by RESTRICTs do not cause the whole split - to be ignored. This also fixes a long-standing bug in which a - split with \N substitutions wouldn't cause cross-posting as - expected. - - * nnmail.el (nnmail-split-fancy): Document RESTRICT clauses. - (nnmail-split-it): Implement them. - - * nnmail.el (nnmail-split-fancy): Document ! splits. - -1999-07-07 10:41:11 Stainless Steel Rat - - * pop3.el: New version. - -1999-07-05 Simon Josefsson - - * gnus-srvr.el (gnus-browse-foreign-server): Use read. - -1999-07-07 10:37:26 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-mime-display-alternative): Do treatment. - -1999-07-06 Shenghuo ZHU - - * gnus-util.el (gnus-write-active-file): Use real name. - - * gnus-agent.el (gnus-agent-expire): Update active file - method by method. - -1999-07-06 Shenghuo ZHU - - * nndraft.el (nndraft-request-article): Use difference - coding-systems for queue and drafts. - - * gnus-sum.el (gnus-summary-setup-default-charset): Special-case - nndraft:drafts. - - * mm-util.el (mm-auto-save-coding-system): New coding system. - - * message.el (message-draft-coding-system): Use it. - -1999-07-06 Shenghuo ZHU - - * mm-uu.el: More customizable and less aggressive. - -1999-07-07 07:53:23 Lars Magne Ingebrigtsen - - * gnus-start.el (gnus-groups-to-gnus-format): Only gnus-active - when plugged. - - * mml.el (mml-generate-mime-1): Don't insert nofile files. - (mml-insert-mml-markup): Accept a nofile. - (mml-insert-mime): Insert nofile. - - * gnus-art.el (gnus-treat-strip-blank-lines): Removed. - - * mm-decode.el (mm-handle-media-type): New function. - (mm-handle-media-supertype): New function. - (mm-handle-media-subtype): New function. - Use new functions throughout. "/")) - -1999-05-18 03:03:50 Katsumi Yamaoka - - * gnus-art.el (gnus-treat-predicate): Typo. - -1999-07-07 06:21:36 Lars Magne Ingebrigtsen - - * gnus-score.el (gnus-summary-score-entry): Made un-interactive. - -1999-07-06 17:57:16 Lars Magne Ingebrigtsen - - * gnus-art.el (article-date-ut): UT! Default it! - -Tue Jul 6 10:59:24 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.92 is released. - -1999-07-06 12:30:59 Johannes Weinert - - * gnus-sum.el (gnus-summary-catchup-and-exit): Doc fix. - -1999-07-06 07:41:07 Lars Magne Ingebrigtsen - - * nntp.el (nntp-retrieve-groups): Don't do anything when not - connected. - - * gnus-start.el (gnus-active-to-gnus-format): Only save active - when plugged. - - * mm-view.el (mm-inline-message): Ignore remove-spec. - - * gnus-agent.el (gnus-agent-write-active): Check whether orig sym - is bound. - - * gnus-msg.el (gnus-summary-mail-forward): Rename From_ lines. - - * nndoc.el (nndoc-guess-type): Remove blank lines at the start. - - * nnfolder.el (nnfolder-read-folder): Remove blank lines at the - start. - - * message.el (message-fill-yanked-message): Remove `t' arg. - - * gnus-group.el (gnus-group-kill-group): Message killing of - groups. - - * mm-util.el (mm-preferred-coding-system): New function. - (mm-mime-charset): Use it. - - * mml.el (mml-generate-mime-1): Charset-encode message parts. - -1999-07-06 07:03:31 Alexandre Oliva - - * gnus-mlsplt.el: New file. - -1999-07-06 05:47:57 Lars Magne Ingebrigtsen - - * mm-decode.el (mm-inline-Media-tests): Changed from forms to - functions. - (mm-attachment-override-p): Take a handle instead of a type. - (mm-inlined-p): Ditto. - (mm-automatic-display-p): Ditto, - (mm-inlinable-p): Ditto. - - * nndraft.el (nndraft-request-expire-articles): Delete backup - files. - - * mailcap.el (mailcap-parse-mailcap): Regexp-quote stuff. - - * gnus-sum.el (gnus-summary-limit-to-extra): Typo. - -1999-07-06 05:37:46 Alexandre Oliva - - * nnmail.el (nnmail-split-it): Allow .*. - -1999-07-05 05:04:57 Lars Magne Ingebrigtsen - - * mm-decode.el (mm-inline-large-images-p): Renamed. - - * gnus-art.el (article-date-ut): Always look in the current buffer - for the Date header. - - * mml.el (mml-validate): New command. - - * mailcap.el (mailcap-possible-viewers): Revert to string-match - since we are dealing with regexps. - -Sun Jul 4 06:31:01 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.91 is released. - -1999-07-04 04:35:28 Lars Magne Ingebrigtsen - - * gnus-agent.el (gnus-agent-save-active-1): New function. - (gnus-agent-save-active): use it. - (gnus-agent-save-groups): Ditto. - - * gnus-cache.el (gnus-cache-write-active): Use it. - - * gnus-agent.el (gnus-agent-write-active): Use it. - - * gnus-util.el (gnus-write-active-file): New function. - - * gnus-agent.el (gnus-agent-write-active): New function to keep - lower boundaries and canceled groups. - (gnus-agent-save-groups): Use it. - (gnus-agent-save-active): Use it. - (gnus-agent-save-group-info): Only write active files. - (gnus-agent-expire): Update active file. - - * mm-decode.el (mm-inlinable-part-p): Removed. - (mm-user-display-methods): Default to nil. - (mm-user-display-methods): Removed. - (add-mime-display-method): Removed. - (mm-automatic-display): Renamed. - (mm-automatic-display-p): Use it. - (mm-inlined-types): New variable. - (mm-inlined-p): New function. - - * message.el (message-reply): Bind message-this-is-mail. - -1999-07-03 13:16:31 Michael Klingbeil - - * smiley.el (smiley-buffer): Fix for NT. - -1999-07-03 11:26:47 Lars Magne Ingebrigtsen - - * mm-encode.el (mm-encode-buffer): Check whether we have 7bit. - - * message.el (message-check-news-header-syntax): Protect against - nil froms. - - * mm-util.el (mm-auto-mode-alist): New. - - * mml.el (mml-generate-mime-1): Ditto. - - * gnus.el: Use mm-insert-file-contents throughout instead of - nnheader. - - * mm-util.el (mm-insert-file-contents): New function. - -Sat Jul 3 07:35:35 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.90 is released. - -1999-07-03 09:31:10 Sven Fischer - - * mailcap.el (mailcap-possible-viewers): Use string=. - -1999-07-01 Shenghuo ZHU - - * mm-uu.el (mm-uu-forward-begin-line): New variable. - (mm-uu-forward-end-line): New variable. - (mm-uu-begin-line): Handle forwarded message. - (mm-uu-identifier-alist): Ditto. - (mm-uu-dissect): Ditto. - -1999-06-29 Shenghuo ZHU - - * lpath.el: Two free variables. - -1999-07-02 Shenghuo ZHU - - * nnheader.el (nnheader-file-coding-system): Use raw-text. - * gnus-agent.el (gnus-agent-file-coding-system): Ditto. - * gnus-cache.el (gnus-cache-coding-system): Ditto. - - * nnfolder.el (nnfolder-file-coding-system): Use mm-text-coding-system. - (nnfolder-file-coding-system-for-write): New variable. - (nnfolder-active-file-coding-system): New variable. - (nnfolder-active-file-coding-system-for-write): New variable. - (nnfolder-save-active): New function. - (nnfolder-save-buffer): Use them. - (nnfolder-possibly-change-group): Ditto. - (nnfolder-request-list-newsgroups): Ditto. - (nnfolder-request-create-group): Ditto. - (nnfolder-request-expire-articles): Ditto. - (nnfolder-request-move-article): Ditto. - (nnfolder-request-accept-article): Ditto. - (nnfolder-request-delete-group): Ditto. - (nnfolder-request-rename-group): Ditto. - (nnfolder-possibly-change-folder): Ditto. - (nnfolder-read-folder): Ditto. - (nnfolder-request-list): Remove pathname-coding-system. - (nnfolder-possibly-change-group): Use nnmail-pathname-coding-system. - - * nnmail.el (nnmail-file-coding-system): Use raw-text. - (nnmail-file-coding-system-1): Removed. - (nnmail-find-file): Use nnmail-pathname-coding-system. - (nnmail-write-region): Ditto. - - * nnmbox.el (nnmbox-file-coding-system): New variable. - (nnmbox-file-coding-system-for-write): New variable. - (nnmbox-active-file-coding-system): New variable. - (nnmbox-active-file-coding-system-for-write): New variable. - (nnmbox-save-buffer): New function. - (nnmbox-save-active): New function. - (nnmbox-request-scan): Use them. - (nnmbox-request-expire-articles): Ditto. - (nnmbox-request-move-article): Ditto. - (nnmbox-request-accept-article): Ditto. - (nnmbox-request-replace-article): Ditto. - (nnmbox-request-delete-group): Ditto. - (nnmbox-request-rename-group): Ditto. - (nnmbox-request-create-group): Ditto. - - * mm-util.el (mm-text-coding-system): raw-text or -dos. - (mm-running-ntemacs): Removed. - - * nnml.el (nnml-file-coding-system): Use nnmail-file-coding-system. - -1999-07-02 Shenghuo ZHU - - * nnfolder.el (nnfolder-read-folder): Use nnheader-file-coding-system. - -1999-07-01 Shenghuo ZHU - - * qp.el (quoted-printable-encoding-characters): Support lower case. - -1999-07-01 Shenghuo ZHU - - * rfc2047.el (rfc2047-encode): Fold before B-encoding. - (rfc2047-b-encode-region): Encode line by line. - -1999-07-03 09:20:16 Lars Magne Ingebrigtsen - - * mm-util.el (mm-find-mime-charset-region): Fix. - -1999-06-30 KOSEKI Yoshinori - - * mm-util.el (mm-mime-mule-charset-alist): Fix iso-2022-jp(-2) bug. - (mm-find-mime-charset-region): Ditto. - -1999-07-03 09:15:35 Simon Josefsson - - * gnus-sum.el (gnus-summary-move-article): Fix something or - other. - -1999-06-29 Shenghuo ZHU - - * gnus-sum.el (gnus-newsgroup-ephemeral-charset): New variable. - (gnus-newsgroup-ephemeral-ignored-charsets): New variable. - (gnus-summary-enter-digest-group): Use them. - (gnus-summary-setup-default-charset): Ditto. - -1999-06-15 Shenghuo ZHU - - * base64.el (base64-run-command-on-region): Use unibyte buffer. - -1999-06-15 Shenghuo ZHU - - * gnus-msg.el (gnus-configure-posting-styles): Fix bug when - gnus-newsgroup-name is nil. - -1999-06-15 Shenghuo ZHU - - * rfc2047.el (rfc2047-encode): Chop the tail newline. - -1999-06-15 Shenghuo ZHU - - * gnus-art.el (article-emphasize): Use correct - gnus-article-emphasis-alist. - -1999-06-15 Shenghuo ZHU - - * mm-view.el (mm-inline-text): Fix text/html bug. - -Mon Jun 28 17:54:01 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.89 is released. - -1999-06-24 Shenghuo ZHU - - * nnmail.el (nnmail-file-coding-system-1): For NTEmacs in Windows. - * message.el (message-draft-coding-system): Ditto. - * mm-util.el (mm-running-ntemacs): Ditto. - -1999-06-23 Shenghuo ZHU - - * gnus-xmas.el (gnus-xmas-summary-recenter): A blank line may - cause problem. - -1999-06-23 Shenghuo ZHU - - * mm-view.el (mm-inline-text): Ignore error in w3-region. - -1999-06-23 Shenghuo ZHU - - * mml.el: require mm-decode. - -1999-06-23 Shenghuo ZHU - - * gnus-art.el (gnus-display-mime): Treat as head only if necessary. - -1999-06-23 Shenghuo ZHU - - * mm-view.el (mm-inline-image): Fix image undisplayer. - -1999-06-22 Shenghuo ZHU - - * mml.el (mml-insert-multipart): Error in compeling-read. - (mml-insert-tag): Match tags. - -1999-06-19 Shenghuo ZHU - - * gnus-cache.el (gnus-cache-braid-nov): Fix coding-system bug. - (gnus-cache-braid-heads): Ditto. - (gnus-cache-retrieve-headers): Ditto. - -1999-06-16 Shenghuo ZHU - - * gnus-draft.el (gnus-draft-send): Fix encoding bug. - -1999-06-16 10:17:29 Katsumi Yamaoka - - * gnus-art.el (gnus-article-read-summary-keys): Convert key events - to string under XEmacs. - -1999-06-28 19:34:03 Petersen Jens-Ulrik - - * gnus-start.el (gnus-find-new-newsgroups): Doc fix. - -1999-06-22 Shenghuo ZHU - - * mm-view.el (mm-inline-message): Fix message view bug. - * gnus-art.el (gnus-article-prepare): Ditto. - -1999-06-16 Shenghuo ZHU - - * gnus-cache.el (gnus-cache-possibly-enter-article): Fetch headers. - -Tue Jun 15 04:13:01 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.88 is released. - -1999-06-15 04:13:45 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-summary-save-parts): Destroy handles after - usage. - - * nnmail.el (nnmail-get-new-mail): Save info. - -Mon Jun 14 01:15:59 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.87 is released. - -1999-06-14 02:46:05 Lars Magne Ingebrigtsen - - * mail-source.el (mail-source-fetch-file): Use prescript-delay. - (mail-source-run-script): New function. - (mail-source-fetch-pop): Use it. - -1999-06-13 09:52:11 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-article-setup-highlight-words): Moved here. - -Sun Jun 13 07:30:40 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.86 is released. - -1999-06-13 08:51:25 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-treat-translate): New variable. - (gnus-treat-predicate): Accept a list of regexps. - (gnus-article-treat-custom): Allow a list of regexps. - -1999-06-09 Markus Rost - - * gnus/gnus-group.el (gnus-permanently-visible-groups): Fix custom - type. - -1999-06-13 05:15:52 Lars Magne Ingebrigtsen - - * gnus-art.el (article-babel): Narrow a bit. - - * gnus-agent.el (gnus-agent-get-undownloaded-list): Was too slow. - -1999-06-12 Simon Josefsson - - (gnus-agent-get-undownloaded-list): Operate on all articles, not - only unread ones. - (gnus-agent-fetch-headers): Fetch headers from unread and marked - articles, not only unread ones. - -1999-06-13 03:01:35 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-summary-limit-to-extra): New command and - keystroke. - - * gnus-art.el (gnus-article-x-face-command): Ditto. - - * gnus-uu.el (gnus-uu-default-view-rules): Default to "display". - - * gnus.el (gnus-method-simplify): Accept server names. - -1999-06-13 02:36:15 Per Abrahamsen - - * gnus-art.el (article-babel-prompt): New function. - (article-babel): New command. - -1999-06-13 01:01:52 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-article-part-wrapper): Go to part. - - * mml.el (mml-generate-mime-1): Don't insert literally. - - * gnus-util.el (gnus-parse-netrc): Skip lines with #'s. - (gnus-netrc-syntax-table): Removed. - (gnus-parse-netrc): Don't use syntax table; just use whitespace. - -Wed May 5 13:51:13 1999 Shenghuo ZHU - - * mm-view.el (mm-inline-text): Fix charset for text/html. - -Wed May 5 01:15:08 1999 Shenghuo ZHU - - * message.el (message-draft-coding-system): Use emacs-mule-dos. - -1999-06-12 07:29:39 Lars Magne Ingebrigtsen - - * nnmail.el (nnmail-split-incoming): Return the number of split - mails. - (nnmail-process-babyl-mail-format): Ditto. - (nnmail-process-unix-mail-format): Ditto. - (nnmail-process-mmdf-mail-format): Ditto. - (nnmail-process-maildir-mail-format): Ditto. - - * mail-source.el (mail-source-callback): Return the number from - the callback. - - * message.el (message-send-mail): Generate Lines. - - * mail-source.el (mail-source-call-script): New function. - (mail-source-call-script): New function. - -Sun May 2 02:00:27 1999 Shenghuo ZHU - - * gnus-sum.el (gnus-summary-setup-highlight-words): New function. - (gnus-select-newsgroup): Use it. - (gnus-group-highlight-words-alist): New variable. - (gnus-newsgroup-emphasis-alist): New variable. - (gnus-summary-local-variables): Use it. - * lpath.el: Use it. - * gnus-art.el (article-emphasize): Use it. - (gnus-emphasis-highlight-words): New face. - * gnus-cus.el (gnus-group-parameters): New parameter. - -Sun May 2 01:00:02 1999 Shenghuo ZHU - - * gnus-cache.el (gnus-cache-possibly-enter-article): Remove - parameter `headers'. - (gnus-cache-enter-article): Ditto. - (gnus-cache-update-article): Ditto. - * gnus-sum.el (gnus-summary-move-article): Ditto. - (gnus-summary-mark-article-as-unread): Ditto. - (gnus-summary-mark-article): Ditto. - -1999-06-12 03:59:56 Lars Magne Ingebrigtsen - - * gnus-msg.el (gnus-message-insert-stylings): Removed. - (gnus-posting-style-alist): Removed. - (gnus-message-style-insertions): Ditto. - (gnus-configure-posting-styles): Reimplementation. - - * mail-source.el (mail-source-fetch): Error the message. - - * gnus-msg.el (gnus-inews-do-gcc): Do mml and encoding. - -Sat Jun 12 00:19:57 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.85 is released. - -1999-04-20 Michael Cook - - * gnus-cite.el (gnus-cite-attribution-prefix): Tweak for MS - Outlook citation regex. - -1999-06-12 02:09:49 Lars Magne Ingebrigtsen - - * nndoc.el (nndoc-mime-parts-type-p): Accept space before - semicolon. - -1999-05-24 Simon Josefsson - - * gnus-range.el (gnus-remove-from-range): Document range1 - modification, protect range2. - -1999-05-24 Simon Josefsson - - * gnus-sum.el (gnus-update-marks): Protect lists from - gnus-remove-from-range, don't sort twice. - -1999-05-21 Simon Josefsson - - * gnus-start.el (gnus-read-descriptions-file): Protect if no - function in backend. - -1999-05-15 Simon Josefsson - - * gnus-sum.el (gnus-valid-move-group-p): Check for a - request-accept-article function in the backend instead of using - the 'respool capability. - -1999-04-18 Hrvoje Niksic - - * mm-bodies.el (mm-decode-content-transfer-encoding): Handle - spurious whitespace at eob. - -1999-06-12 02:02:06 Adrian Aichner - - * nnmail.el (nnmail-get-new-mail): Check right variable. - -1999-06-12 01:57:39 Karl Kleinpaste - - * mailcap.el (mailcap-mime-data): Fix rfc822. - -1999-06-11 23:48:50 TOZAWA Akihiko - - * nndoc.el (nndoc-nsmail-type-p): New function. - (nndoc-type-alist): Recognize nsmail. - -1999-05-12 Mike McEwan - - * gnus-art.el (gnus-treatment-function-alist): Display `x-face' - *before* `article-hide-headers' deletes the information. - -1999-05-22 00:26:46 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-summary-save-parts): New command and - keystroke. - (gnus-summary-save-parts-1): New function. - (gnus-summary-iterate): Buggy. - - * mm-decode.el (mm-save-part-to-file): Made into own function. - -1999-05-11 05:53:16 Lars Magne Ingebrigtsen - - * gnus-group.el (gnus-group-set-info): Resist nils. - -1999-05-04 19:26:08 Lars Magne Ingebrigtsen - - * mailcap.el (mailcap-mime-data): Ditto. - - * gnus-uu.el (gnus-uu-default-view-rules): Ditto. - - * gnus-art.el (gnus-article-x-face-command): Default to ee. - -1999-05-02 Gareth Jones - - * gnus-art.el (article-make-date-line): Put X-Sent below Date if - gnus-article-date-lapsed-new-header is t. - -Sat May 1 20:27:43 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.84 is released. - -1999-05-01 22:23:21 Lars Magne Ingebrigtsen - - * gnus-msg.el (gnus-bug-message): Mime change. - -1999-04-22 Simon Josefsson - - * gnus-sum.el (gnus-update-marks): Process null mark lists. - -1999-04-21 Hrvoje Niksic - - * mm-bodies.el (mm-decode-content-transfer-encoding): Recognize - `x-uue'. - -1999-03-04 Aaron M. Ucko - - * mail-source.el (mail-source-fetch-pop): Only prompt for password - when authentication is 'password. - -1999-05-01 22:17:55 - - * gnus-win.el (gnus-configure-windows): Accept a setting. - -1999-04-21 20:51:13 Lars Magne Ingebrigtsen - - * mm-util.el (mm-quote-arg): Moved here. - - * mm-decode.el (mm-quote-arg): Quote more chars. - -1999-04-18 20:12:49 Lars Magne Ingebrigtsen - - * nnheader.el (nnheader-parse-head): Message-ID in In-Reply-To - with newlines would create buggy .nov files. - - * gnus-art.el (gnus-article-date-lapsed-new-header): Default to nil. - - * qp.el (quoted-printable-encode-region): Encode whitespace at the - end of lines. - - * message.el (message-mode): Doc fix. - - * gnus-art.el (article-hide-headers): Delete the hidden headers. - - * gnus-msg.el (gnus-setup-posting-charset): Default group to "". - - * gnus-art.el (article-date-ut): Rewrite. - - * mm-decode.el (mm-preferred-alternative-precedence): Reverse the - order. - - * gnus-msg.el (gnus-message-insert-stylings): Remove duplicate - headers. - - * gnus-art.el (gnus-article-date-lapsed-new-header): Doc fix. - -1999-04-18 Didier Verna - - * gnus-art.el (gnus-article-date-lapsed-new-header): new variable. - (article-date-ut): use it. - -1999-04-18 20:06:20 Lars Magne Ingebrigtsen - - * mail-source.el (mail-source-fetch-pop): Call script - asynchronously. - -Sun Apr 18 12:40:04 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.83 is released. - -1999-04-18 10:55:57 Lars Magne Ingebrigtsen - - * gnus-draft.el (gnus-draft-mode): Use mml minor mode. - - * gnus-cite.el (gnus-dissect-cited-text): Off-by-one error. - - * gnus-uu.el (gnus-uu-mark-thread): Save hidden threads. - - * gnus-art.el (gnus-mime-inline-part): Don't do a charset param. - - * gnus-msg.el (gnus-bug): Use application/x-emacs-lisp. - - * message.el (message-generate-headers): Accept continuation - headers. - -1999-04-18 10:48:57 Renaud Rioboo - - * gnus-demon.el (gnus-demon-time-to-step): Not strings. - -1999-04-18 08:21:52 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-treatment-function-alist): use - maybe-hide-headers. - - * message.el (message-inhibit-body-encoding): Typo. - (message-resend): Inhibit encoding. - - * gnus-sum.el (gnus-summary-toggle-header): Decode rfc2047. - - * gnus-art.el (article-remove-cr): Use re-search. - - * rfc2231.el (rfc2231-parse-string): Allow broken elm MIME - headers. - - * mm-decode.el (mm-quote-arg): Quote '. - - * gnus-ems.el (gnus-x-splash): Would place splash wrongly. - - * mm-decode.el (mm-insert-part): Use multibyte for text. - - * gnus-start.el (gnus-read-newsrc-file): New variable. - (gnus-read-newsrc-file): Use it. - -1999-04-17 18:51:54 Lars Magne Ingebrigtsen - - * nnvirtual.el (nnvirtual-request-expire-articles): New function. - - * gnus-group.el (gnus-group-expire-articles-1): Made into own - function. - -Sat Apr 17 16:41:30 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.82 is released. - -1999-04-15 Hrvoje Niksic - - * gnus-sum.el (gnus-group-charset-alist): Include Croatian groups - for iso8859-2. - -1999-04-17 18:23:50 Lars Magne Ingebrigtsen - - * mm-util.el (mm-charset-synonym-alist): Remove iso-2022-jp-2 from - synonym alist. - -1999-04-17 18:03:38 Adam P. Jenkins - - * gnus-sum.el (gnus-summary-local-variables): Mark as global. - -1999-04-17 18:02:05 Ettore Perazzoli - - * mail-source.el (mail-source-fetch): Ask before bugging out. - -1999-03-19 Hrvoje Niksic - - * uudecode.el (uudecode-decode-region-external): Don't assume - uudecode-temporary-file-directory ends with a slash. - -1999-03-18 Simon Josefsson - - * gnus-sum.el (gnus-update-marks): - (gnus-update-read-articles): - (gnus-summary-expire-articles): Check server. - -1999-03-16 Simon Josefsson - - * mml.el (mml-preview): New function. - -1999-04-17 17:10:21 William M. Perry - - * mail-source.el (mail-source-fetch-file): Return the right - value. - -1999-04-17 07:52:17 Lars Magne Ingebrigtsen - - * mml.el (mml-insert-parameter): New function. - (mml-insert-parameter-string): New function. - - * nnmail.el (nnmail-get-new-mail): Say how many new articles. - - * gnus-art.el (gnus-mime-multipart-functions): New variable. - (gnus-mime-display-part): Use it. - - * mm-decode.el (mm-alternative-precedence): Removed. - (mm-discouraged-alternatives): New variable. - (mm-preferred-alternative-precedence): New function. - - * nnmail.el (nnmail-get-new-mail): Use mail-sources. - - * mail-source.el (mail-sources): New variable. - - * gnus-art.el (article-remove-cr): Remove several trailing CRs. - - * mm-decode.el (mm-valid-image-format-p): New function. - (mm-inline-media-tests): Use it. - (mm-valid-and-fit-image-p): New function. - - * gnus-agent.el (gnus-agent-fetch-groups): Error when unplugged. - (gnus-agent-fetch-group): Ditto. - -1999-04-12 Didier Verna - - * nnmail.el (nnmail-article-group): in case of a group name - containing "\\n" constructs, be sure to pass the expanded value to - nn*-save-mail. - -Sat Apr 17 05:40:45 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.81 is released. - -1999-04-16 15:54:02 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-get-split-value): Reverse result. - -1999-04-03 00:17:24 Lars Magne Ingebrigtsen - - * gnus-start.el (gnus-always-read-dribble-file): Doc fix. - -1999-04-02 15:33:43 Lars Magne Ingebrigtsen - - * mml.el (mml-insert-tag): Insert concluding part. - - * message.el (message-send-mail): Encode later. - (message-send-news): Ditto. - - * nnfolder.el: Don't use mail delim. - -1999-03-28 19:14:27 Lars Magne Ingebrigtsen - - * gnus-cus.el (gnus-group-customize): Put point at min. - - * mm-view.el (mm-inline-text): Allow toggling html. - -1999-03-28 17:11:15 William M. Perry - - * mail-source.el: Added prescript and postscript to file. - -1999-03-28 13:46:00 Lars Magne Ingebrigtsen - - * nnmail.el: Reverted. - - * gnus-msg.el (gnus-setup-posting-charset): Didn't work. - (gnus-setup-posting-charset): Did work. - -1999-03-28 13:19:50 Jae-you Chung - - * gnus.el (gnus-short-group-name): Use - gnus-group-uncollapsed-levels. - -1999-03-28 13:11:43 Lars Magne Ingebrigtsen - - * gnus-cite.el (gnus-dissect-cited-text): Don't remove overlays. - -1999-03-26 13:18:45 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-treat-strip-headers-in-body): New variable. - (article-strip-headers-from-body): New command and keystroke. - -1999-03-14 16:09:10 Lars Magne Ingebrigtsen - - * mail-source.el (mail-source-fetch-pop): Check for symbol first. - - * nnheader.el (nnheader-insert-file-contents): Bind - enable-local-eval to nil. - (nnheader-find-file-noselect): Ditto. - - * nnmail.el (nnmail-article-group): Don't remove long lines. - (nnmail-remove-long-lines): New function. - (nnmail-split-header-length-limit): Removed. - - * mml.el (mml-generate-mime-1): Use unibyte buffers. - - * gnus-group.el (gnus-group-kill-all-zombies): Query user. - -1999-03-06 07:20:05 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-summary-generic-mark): New function. - - * nnmail.el (nnmail-split-header-length-limit): Increased. - (nnmail-article-group): Allow nil. - - * gnus-cite.el (gnus-cite-parse-wrapper): Inhibit point-motion. - - * nndoc.el (nndoc-generate-mime-parts-head): Insert real headers - first. - - * mml.el (mml-minibuffer-read-type): Include types from - mailcap-mime-data. - - * nndraft.el (nndraft-request-article): Would clobber Japanese. - -1999-03-05 Hrvoje Niksic - - * mml.el (mml-insert-tag): New function. - (mml-read-file): Renamed to mml-minibuffer-read-file to avoid - confusion with functions like `mml-read-tag'. - (mml-read-type): Ditto with `mml-minibuffer-read-type'. - (mml-minibuffer-read-description): Ditto with - `mml-minibuffer-read-description'. - (mml-attach-buffer): New function. - (mml-mode-map): New entry for /. - (mml-minibuffer-read-type): Accept DEFAULT. - - * mml.el (mml-quote-region): Narrow the region. - - * message.el (message-mode-menu): message-mime-attach-file is now - mml-attach-file. - -1999-03-05 21:24:23 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-treatment-function-alist): Do emphasis earlier. - -1999-03-05 21:08:10 Robert Bihlmeyer - - * mml.el (mml-attach-buffer): New command. - -1999-02-27 Simon Josefsson - - * gnus-sum.el (gnus-update-marks): Call gnus-remove-from-range - with a proper range. Compress range. - - * gnus-range.el (gnus-remove-from-range): Protect arguments. - -1999-03-05 20:59:54 Lars Magne Ingebrigtsen - - * mm-decode.el (mm-get-image): Create a temporary file for xbms. - -1999-03-04 04:20:25 Lars Magne Ingebrigtsen - - * gnus-picon.el (gnus-picons-x-face-file-name): Removed. - (gnus-picons-convert-x-face): Removed. - (gnus-picons-article-display-x-face): Removed. - (gnus-picons-x-face-sentinel): Ditto. - (gnus-picons-display-x-face): Ditto. - -Thu Mar 4 01:38:00 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.80 is released. - -1999-03-02 16:04:30 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-mm-display-part): Narrow to the part itself. - - * gnus-sum.el (gnus-with-article): Moved here. - - * mail-source.el (mail-source-fetch-pop): Ask for password even - when program. - -1999-02-28 13:16:12 Lars Magne Ingebrigtsen - - * gnus-msg.el (gnus-bug): Add description. - - * mml.el (mml-insert-mml-markup): Insert disposition. - - * message.el (message-send-mail): Always encode mail headers. - - * smiley.el (gnus-smiley-display): Goto body. - -1999-02-28 13:15:47 Petr Konecny - - * smiley.el (gnus-smiley-display): Don't search to blank line. - -1999-02-28 00:38:40 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-treat-article): Only run the highlight stuff - when requested. - - * nnmail.el (nnmail-current-spool): Removed. - - * gnus-salt.el (gnus-tree-inhibit): New varible. - - * gnus.el (mm-util): Required. - -1999-02-27 23:44:52 paul stevenson - - * gnus-sum.el (gnus-summary-toggle-header): Narrow to head first. - -1999-02-27 17:17:47 Lars Magne Ingebrigtsen - - * mail-source.el (mail-source-bind): Doc fix. - -1999-02-26 20:35:57 Lars Magne Ingebrigtsen - - * message.el (message-mode): Doc fix. - - * mm-encode.el (mm-content-transfer-encoding-defaults): Use 8bit - encoding. - - * gnus.el (gnus-methods-equal-p): Moved here. - - * mail-source.el: pop at 110. - - * pop3.el (pop3-movemail): Use write-region instead of - append-to-file to avoid excessive messaging. - -1999-02-27 lantz moore - - * nnmail.el (nnmail-get-new-mail): honor suffix for spool-files of - type directory. - -1999-03-04 Robert Bihlmeyer - - * gnus-art.el (article-hide-boring-headers): Field names must not - contain whitespace. - -Fri Feb 26 18:54:16 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.79 is released. - -1999-02-26 18:11:04 Lars Magne Ingebrigtsen - - * gnus-cite.el (gnus-cite-toggle): Don't remove highlighting. - - * mml.el (mml-mode): Don't use add-minor-mode. - - * message.el (messgage-inhibit-body-encoding): New variable. - (message-encode-message-body): Use it. - -Fri Feb 26 17:00:25 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.78 is released. - -1999-02-26 07:45:30 Lars Magne Ingebrigtsen - - * message.el (message-mode): Switch on MML mode. - - * mml.el: Included commands and functions. - (mml-mode-map): New keymap. - - * message.el: Removed the insertion commands and functions. - - * gnus-ems.el (gnus-mule-cite-add-face): Removed. - - * gnus-sum.el (gnus-summary-sort-by-chars): New command and - keystroke. - - * gnus-art.el (gnus-narrow-to-page): Revert. - - * gnus-cite.el (gnus-cite-delete-overlays): New function. - (gnus-cite-parse-maybe): Always reparse. - - * message.el (message-encode-message-body): Don't insert - "multipart warning". - - * gnus-art.el (gnus-article-treat-head-custom): New variable. - -1999-02-25 Miles Bader - - * mail-source.el (mail-source-fetch-pop): Return 1 for success. - - * nnmail.el: Require mm-util. - -1999-02-26 07:39:33 Justin Sheehy - - * nnmail.el (nnmail-get-new-mail): Only get mail for the one - group. - -1999-02-26 07:38:08 SeokChan LEE - - * mm-bodies.el (mm-body-charset-encoding-alist): Add euc-kr. - -1999-02-21 Simon Josefsson - - * gnus-msg.el (gnus-extended-version): Better regexp. - -1999-02-25 Didier Verna - - * nnmail.el (nnmail-split-it): new syntax: `(! FUNC SPLIT)'. FUNC - is called with the result of SPLIT and should return a new split. - - * gnus.texi: update the doc. - -1999-02-23 Didier Verna - - * gnus-picon.el (gnus-picons-display-bar-p): when picons are - displayed in the article buffer, output bars if - `gnus-picons-display-article-move-p'. - -1999-02-20 Aaron M. Ucko - - * mail-source.el (mail-source-fetch-pop): Typo. - -1999-02-26 07:15:12 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-summary-toggle-header): Save restriction. - -1999-02-23 03:07:58 Lars Magne Ingebrigtsen - - * gnus-cite.el (gnus-cite-parse-wrapper): Always parse. - -1999-02-21 11:11:39 Lars Magne Ingebrigtsen - - * mml.el (mml-insert-buffer): New function. - - * message.el (message-forward): Insert the buffer in the buffer. - -Sun Feb 21 01:20:50 1999 Shenghuo ZHU - - * mm-view.el (mm-inline-message): Insert part in narrowed region. - -Sat Feb 20 23:09:40 1999 Shenghuo ZHU - - * gnus-sum.el (gnus-summary-toggle-header): Save restriction. - -Sat Feb 20 21:34:28 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.77 is released. - -1999-02-20 17:32:17 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-displaying-mime): New variable. - (article-narrow-to-head): New function. - - * mail-source.el (mail-source-fetch-pop): Include pre/postscript. - Default to pop instead of pop3. - -1999-02-19 16:16:04 Lars Magne Ingebrigtsen - - * gnus-art.el (article-hide-pgp): Goto body. - - * gnus-uu.el (gnus-uu-digest-mail-forward): Don't kill buffer. - - * gnus-cite.el: Don't use goto-line. - - * gnus-art.el (gnus-article-treat-html): Removed. - (gnus-treat-article): Save restriction. - -1999-02-17 Per Abrahamsen - - * message.el (message-send-mail): Don't untabify. - (message-mode): Don't use tabs for indentation. - -1999-02-19 14:54:13 Lars Magne Ingebrigtsen - - * message.el (message-send-mail): Don't untabify. - - * nnml.el (nnml-save-mail): Typo fix. - -1999-02-19 Per Abrahamsen - - * message.el (message-cite-function): Add - `message-cite-original-without-signature' customization option. - -1999-02-18 Per Abrahamsen - - * nnmail.el (nnmail-fix-eudora-headers): Mark as option to - `nnmail-prepare-incoming-header-hook'. - -1999-02-19 14:41:43 Justin Sheehy - - * gnus-util.el (gnus-make-sort-function-1): Typo fix. - -1999-02-19 14:40:37 Lars Magne Ingebrigtsen - - * gnus-group.el (gnus-group-get-new-news): Require nnmail. - -1999-02-18 Michael Cook - - * Recognize Microsoft Outlook's cite attribution conventions. - -1999-02-19 14:33:11 James H. Cloos, Jr. - - * gnus-sum.el: Bind M. - -1999-02-19 14:31:29 Neil Crellin - - * mail-source.el (mail-source-fetch-pop): Bind pop3-port. - -1999-02-15 Didier Verna - - * gnus-picon.el (gnus-group-display-picons): ensures that - `article-goto-body' really goes to the article body. - -1999-02-19 12:57:19 Lars Magne Ingebrigtsen - - * mm-view.el (mm-inline-text): Bind url-standalone-mode. - - * gnus-msg.el (gnus-summary-mail-forward): Create unique names. - - * mm-view.el (mm-view-message): Enable multibyte. - -1999-02-11 18:37:15 Lars Magne Ingebrigtsen - - * nnmail.el (nnmail-get-new-mail): Message later. - - * mm-util.el (mm-find-charset-region): Revert to checking - multibyte. - -1999-02-11 Matt Pharr - - * gnus-msg.el (gnus-bug): Encode environment info as a MIME - attachment. - -Thu Feb 11 04:58:51 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.76 is released. - -1999-02-06 Felix Lee - - * gnus.el (gnus-group-change-level-function): Typo. - -1999-02-11 05:47:51 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-nov-skip-field): Removed. - (gnus-nov-field): Ditto. - (gnus-nov-parse-extra): Ditto. - (gnus-nov-read-integer): Ditto. - -1999-02-05 09:44:20 Katsumi Yamaoka - - * nnheader.el (nnheader-nov-read-message-id): New macro. - (nnheader-parse-nov): Use it. - - * gnus-sum.el (gnus-nov-read-message-id): New macro. - (gnus-nov-parse-line): Use it; use `(eobp)' instead of - `(eq (char-after) ?\n)'. - -1999-02-11 05:16:26 Lars Magne Ingebrigtsen - - * gnus.el (gnus-other-frame): Always pop up a new frame. - -Wed Feb 10 01:03:43 1999 Shenghuo ZHU - - * gnus-range.el (gnus-range-add): Rewrite. - -1999-02-02 18:12:00 Carsten Leonhardt - - * nnmail.el (nnmail-split-incoming): Added detection of maildir - format. - (nnmail-process-maildir-mail-format): New function. - - * mail-source.el (mail-source-fetch-maildir): New function. - (mail-source-keyword-map): Add default for maildir method. - (mail-source-fetcher-alist): Changed "qmail" to "maildir". - -1999-02-10 02:29:28 Lars Magne Ingebrigtsen - - * mail-source.el (mail-source-fetcher-alist): Remove apop. - - * nndoc.el (nndoc-type-alist): Remove MIME-digest. - (nndoc-mime-digest-type-p): Removed. - -1999-02-09 15:25:52 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-article-read-summary-keys): Set the point - where it is supposed to be. - (gnus-treat-play-sounds): New variable. - - * gnus-sum.el (gnus-newsgroup-ignored-charsets): New variable. - - * gnus-art.el (article-display-x-face): Narrow to head. - (gnus-article-washed-types): New variable. - (article-hide-pgp): Is not a toggle. - (gnus-article-hide-text-type): Save types. - (article-decode-charset): Use it. - - * nnmail.el (nnmail-get-new-mail): Ignore procmail. - - * message.el (message-forward-start-separator): Removed. - (message-forward-end-separator): Removed. - (message-signature-before-forwarded-message): Removed. - (message-included-forward-headers): Removed. - (message-check-news-body-syntax): Don't check forward. - (message-forward): Use MIME. - - * nnvirtual.el (nnvirtual-request-article): Bind - gnus-article-decode-hook to nil. - -1999-02-06 16:55:25 Lars Magne Ingebrigtsen - - * mml.el (mml-parse-singlepart-with-multiple-charsets): Check for - us-ascii. - -1999-02-04 00:00:35 Lars Magne Ingebrigtsen - - * format-spec.el (format-spec): Be more robust. - - * message.el (message-encode-message-body): Default - mail-parse-charset to mail-parse-charset. - - * gnus-sum.el (gnus-summary-edit-article-done): Don't encode. - (gnus-summary-edit-article): Bind mail-parse-charset. - - * mml.el (mml-read-tag): Ignore white space after end of tag. - - * message.el (message-goto-body): Also work in separatorless - articles. - - * mml.el (mml-translate-from-mime): New function. - (mml-insert-mime): Ditto. - (mml-to-mime): New function. - (mime-to-mml): New name. - - * gnus-sum.el (gnus-summary-edit-article): Always select raw - article. - - * gnus-group.el (gnus-group-catchup-current): Unmark groups. - - * gnus-sum.el (gnus-summary-setup-default-charset): Don't - special-case nndraft groups. - -1999-02-03 16:44:19 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-get-newsgroup-headers): Bind charset. - (gnus-get-newsgroup-headers): Already bound. - - * message.el (message-encode-message-body): Use posting charset. - - * mm-bodies.el (mm-encode-body): Use MIME charsets. - (mm-body-encoding): Do CTE. - (mm-body-7-or-8): New function. - - * mm-util.el (mm-mime-charset): Always fall back on alist. - (mm-mime-mule-charset-alist): Include katakana-jisx0201. - (mm-mime-mule-charset-alist): Add arabic-*-column. - (mm-find-mime-charset-region): New function. - - * format-spec.el (format-spec-make): New function. - - * mail-source.el (format-spec): Required. - (mail-source-fetch-with-program): Removed. - (mail-source-fetch-with-program): New function. - - * format-spec.el: New file. - -1999-02-03 16:00:41 Tatsuya Ichikawa - - * mail-source.el (mail-source-fetch-with-program): Take optional - parameter. - -1999-02-03 00:31:21 Lars Magne Ingebrigtsen - - * gnus-start.el: Ignore some groups. - (gnus-setup-news): Bind nnmail-fetched-sources. - - * message.el (message-send-mail): Remove all tabs. - - * mm-util.el (mm-find-charset-region): Just check whether - find-charset-region is defined. - -1999-02-02 23:35:20 Lars Magne Ingebrigtsen - - * gnus-group.el (gnus-group-get-new-news): Use - nnmail-fetched-sources. - - * nnmail.el (nnmail-fetched-sources): New variable. - (nnmail-get-new-mail): Use it. - - * mail-source.el (mail-source-fetched-sources): New variable. - (mail-source-fetch): Use it. - -1999-02-02 23:20:20 Mark W. Eichin - - * gnus.el (gnus-getenv-nntpserver): if the file that - gnus-nntpserver-file names has a trailing newline, the - string-match will always match, and thus the file will never be - read. (^ matches start of "line", \\` matches start of "buffer", - which is what was intended...) - -1999-02-02 23:17:40 Kim-Minh Kaplan - - * gnus-picon.el (gnus-picons-parse-filenames): Quote group names. - -1999-01-28 04:15:46 Katsumi Yamaoka - - * gnus-start.el (gnus-read-active-file): Eliminate duplicated - select methods. - -1999-01-27 Simon Josefsson - - * gnus-range.el (gnus-remove-from-range): Sort second argument. - -1999-02-02 10:55:23 Scott Hofmann - - * nntp.el: Use mail-source-read-passwd instead of nnmail-read-passwd. - -Mon Feb 1 23:23:03 1999 Shenghuo ZHU - - * gnus-cus.el (gnus-group-parameters): Charset as symbol, and fix - a typo. - * gnus-sum.el (gnus-summary-setup-default-charset): Set nndraft's - charset to nil. - * gnus-agent.el (gnus-agent-queue-setup): Remove charset setting. - * gnus-start.el (gnus-start-draft-setup): Ditto. - -1999-02-02 22:13:14 Lars Magne Ingebrigtsen - - * mail-source.el (mail-source-fetch-directory): Use the predicate. - (mail-source-value): Don't do variables. - - * nnmail.el (nnmail-get-new-mail): Set the predicate. - - * gnus-sum.el (gnus-summary-toggle-header): Fix, and bound to t. - -1999-02-01 Michael Cook - - * Defenestrate spurious ?a. - -1999-02-02 21:59:51 Lars Magne Ingebrigtsen - - * mail-source.el (mail-source-fetch-pop): Instead use - :authentication. - -1999-02-01 Tatsuya Ichikawa - - * lisp/mail-source.el : Support APOP authentication scheme. - -1999-02-02 21:56:14 Tatsuya Ichikawa - - * pop3.el (pop3-movemail): Return t. - -1999-02-02 21:48:46 Lars Magne Ingebrigtsen - - * rfc2047.el (rfc2047-fold-region): New function. - (rfc2047-encode-message-header): Use it. - -1999-02-02 21:07:27 Hallvard B. Furuseth - - * gnus-sum.el (gnus-group-charset-alist): Add more. - -Mon Feb 1 21:18:00 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.75 is released. - -1999-02-01 21:54:26 Lars Magne Ingebrigtsen - - * gnus-art.el (article-display-x-face): Don't narrow to head. - -1999-02-01 21:48:39 Michael Cook - - * gnus-cite.el (gnus-cited-lines-visible): Accept a cons. - -1999-02-01 20:59:38 Lars Magne Ingebrigtsen - - * mail-source.el (mail-source-fetch-directory): Ignore - directories. - - * gnus-cus.el (gnus-group-parameters): Addition. - - * gnus-art.el (article-strip-banner): Do symbolic banners. - (article-strip-banner): New keystroke. - -1999-02-01 20:54:32 Michael Cook - - * gnus-art.el (article-strip-banner): New command. - -1999-02-01 20:53:45 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-treat-strip-banners): New variable. - -1999-01-28 05:34:56 Katsumi Yamaoka - - * mail-source.el (mail-source-read-passwd): Use `read-passwd' if it - has been exist. - -Thu Jan 28 01:38:34 1999 Shenghuo ZHU - - * message.el (message-draft-coding-system): Check coding-system. - * mm-util.el (mm-text-coding-system): Ditto. - -1999-01-28 12:11:31 Katsumi Yamaoka - - * mail-source.el (mail-source-fetch-pop): Save excursion. - -1999-01-28 08:14:21 Lars Magne Ingebrigtsen - - * mail-source.el (mail-source-movemail-args): Not constant. - (mail-source-movemail-args): Removed. - (mail-source-fetch-with-program): New function. - (mail-source-fetch-pop): Use program and function. - (mail-source-movemail-program): Removed. - - * gnus-art.el (gnus-treat-date-iso8601): New variable. - (gnus-treat-date-user-defined): New variable. - -1999-01-28 08:07:12 Per Abrahamsen - - * nnmail.el (nnmail-fix-eudora-headers): New function. - -1999-01-28 08:05:19 Lars Magne Ingebrigtsen - - * mm-bodies.el (mm-encode-body): Use mail-parse-charset. - -1999-01-27 08:06:38 Lars Magne Ingebrigtsen - - * smiley.el (smiley-deformed-regexp-alist): Removed =>. - (smiley-nosey-regexp-alist): Ditto. - - * gnus-art.el (gnus-treatment-function-alist): Do - gnus-article-add-buttons-to-head later. - (gnus-treat-capitalize-sentences): New variable. - (article-capitalize-sentences): New command and keystroke. - - * gnus-group.el (gnus-group-catchup-current): Do group. - - * message.el (message-default-charset): Add group. - -Wed Jan 27 05:24:53 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.74 is released. - -1999-01-27 05:56:29 Lars Magne Ingebrigtsen - - * gnus-art.el (article-fill-long-lines): Renamed. - (article-fill-long-lines): New keystroke. - -1999-01-26 06:35:07 Lars Magne Ingebrigtsen - - * gnus-msg.el (gnus-setup-posting-charset): Check for group. - - * gnus-group.el (gnus-group-catchup-current): Skip groups now - displayed. - (gnus-group-catchup-current): Be more robus. - - * gnus-sum.el (gnus-summary-select-article): Reselect for showing - headers. - -1999-01-25 Dave Love - - * message.el (message-mode-menu): Add message-mime-attach-file. - (message-mode): Doc fix. - -1999-01-26 05:24:19 Lars Magne Ingebrigtsen - - * nnmail.el (nnmail-check-duplication): Insert the mail source - string. - - * mail-source.el (mail-source-fetch-pop): Bind mail-source-string. - (mail-source-fetch-directory): Ditto. - (mail-source-fetch-file): Ditto. - (mail-source-string): New variable. - - * gnus-start.el (gnus-get-unread-articles): Nix out groups over - the level. - - * rfc2047.el (rfc2047-encodable-p): Convert to MIME charsets - before handling. - - * mm-util.el (mm-mime-charset): Use the parameters. - (mm-mime-charset): Removed region paremeters. - - * nnmail.el (nnmail-get-new-mail): Don't message the entire - source. - -1999-01-25 12:05:16 Lloyd Zusman - - * nnmail.el (nnmail-get-split-group): Quote right. - -1999-01-25 05:55:41 Lars Magne Ingebrigtsen - - * mail-source.el (mail-source-movemail): Would kill an arbitrary - buffer. - -1999-01-24 03:02:31 Lars Magne Ingebrigtsen - - * gnus-group.el (gnus-clear-inboxes-moved): Removed. - (gnus-group-mode): Don't hook. - - * mail-source.el (mail-source-bind): Doc fix. - (mail-source-bind): Take only one param. - - * gnus-art.el (gnus-treat-highlight-signature): typep. - - * mail-source.el (mail-source-movemail): Ignore empty file. - (mail-source-callback): Check before deleting. - - * message.el (message-mime-attach-file): Include name. - -1999-01-23 17:01:12 Lars Magne Ingebrigtsen - - * mm-util.el (mm-read-charset): Return a symbol. - - * mm-view.el (mm-inline-text): Insert signature separator. - - * gnus-art.el (gnus-treat-predicate): New function. - (gnus-treat-article): Allow all types to be checked. - - * gnus-util.el (gnus-or): New function. - (gnus-and): Ditto. - - * gnus-art.el (gnus-mime-display-single): Use override. - - * mm-decode.el (mm-attachment-override-types): New variable. - (mm-attachment-override-p): New function. - - * gnus-picon.el (gnus-group-display-picons): Don't go backward. - -1999-01-23 16:45:06 Andrew J. Cosgriff - - * mm-view.el (mm-inline-text): Do vcards. - -Sat Jan 23 14:23:27 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.73 is released. - -1999-01-23 11:38:36 Lars Magne Ingebrigtsen - - * nnmail.el (nnmail-spool-file): Changed to use mail-source. - (nnmail-crash-box, nnmail-use-procmail, nnmail-procmail-directory, - nnmail-procmail-suffix, nnmail-resplit-incoming): Removed. - (nnmail-movemail-program): Removed. - (nnmail-movemail-args): Removed. - (nnmail-pop-password-required): Ditto. - (nnmail-tmp-directory): Ditto. - (nnmail-delete-incoming): Removed. - (nnmail-pop-password, nnmail-moved-inboxes, - nnmail-internal-password, nnmail-move-inbox): Removed. - (nnmail-read-passwd): Ditto. - (nnmail-get-spool-files): Removed. - (nnmail-resplit-incoming): Reinstated. - - * mail-source.el: New file. - -1999-01-23 09:08:31 James H. Cloos, Jr. - - * gnus-art.el (gnus-article-mode-map): Bind backspace. - -1999-01-23 09:05:04 Lars Magne Ingebrigtsen - - * gnus-art.el (article-make-date-line): Fix iso8601 display. - -1999-01-20 02:53:52 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-treat-display-smileys): Check xpm. - - * gnus-picon.el (gnus-group-display-picons): Goto body. - - * gnus.el: Indented all functions; broke long lines; changed all - instances of illegal/legal to invalid/valid. Yes, I'm bored. - -Wed Jan 20 00:50:53 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.72 is released. - -1999-01-20 01:39:48 Lars Magne Ingebrigtsen - - * gnus.el: Cleaned up trailing whitespace. - - * mm-util.el (mm-read-charset): Work. - -1999-01-17 Matt Armstrong - - * gnus-score.el (gnus-score-find-bnews): Match regexp on the - nnheader-translate-file-chars'd group name. - -1999-01-20 01:30:30 Lars Magne Ingebrigtsen - - * message.el (message-encode-message-body): Fold case. - -1999-01-20 01:28:16 Alexei V. Barantsev - - * gnus-xmas.el (gnus-xmas-modeline-glyph): Backquote. - -1999-01-20 00:46:15 Lars Magne Ingebrigtsen - - * mailcap.el (mailcap-add): New function. - -1999-01-18 09:40:37 Lars Magne Ingebrigtsen - - * gnus-art.el (article-goto-body-goes-to-point-min-p): New variable. - (article-goto-body): Use it. - (gnus-treat-article): Ditto. - - * gnus-agent.el (gnus-agent-get-undownloaded-list): Remove the - downloaded articles from the downloadeble list. - -1999-01-16 17:31:08 Lars Magne Ingebrigtsen - - * message.el (message-encode-message-body): Bind - mail-parse-charset. - - * mm-util.el (mm-charset-synonym-alist): New variable. - (mm-charset-to-coding-system): Use it. - (mm-charset-coding-system-alist): Removed. - (mm-charset-to-coding-system): Don't use it. - (mm-find-charset-region): Use mail-parse-charset. - - * gnus-art.el (gnus-treatment-function-alist): Use - gnus-article-display-picons. - (gnus-treat-display-xface): Only do if we have xface feature. - (gnus-part-display-hook): New function. - (gnus-treat-article): Use it. - (gnus-treat-article): Use gnus-visual. - - * gnus-msg.el (gnus-setup-posting-charset): Check elem. - - * gnus-art.el (gnus-mm-display-part): Fix the MIME button after - displaying. - - * mm-decode.el (mm-insert-part): Use insert-buffer-substring. - - * gnus-score.el (gnus-score-find-bnews): Protect against invalid - regexp file names. - -Sat Jan 16 03:15:57 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.71 is released. - -1999-01-16 00:13:31 Lars Magne Ingebrigtsen - - * mm-view.el (mm-inline-image): Don't add a dot. - - * gnus-art.el (gnus-treat-article): New function. - - * gnus.el (gnus-article-display-hook): Removed. - - * gnus-art.el (gnus-article-treat-custom): New variable. - - * gnus-start.el (gnus-ignored-newsgroups-has-to-p): Removed. - - * gnus-msg.el (gnus-setup-posting-charset): Allow variables and - functions. - - * message.el (message-posting-charset): New variable. - (message-send-mail): Use it. - - * gnus-msg.el (gnus-group-posting-charset-alist): Moved here. - (gnus-setup-posting-charset): New function. - (gnus-setup-message): Use it. - - * message.el (message-encode-message-body): Just look for - Content-Type before inserting a new one. - -1999-01-15 23:08:47 Lars Magne Ingebrigtsen - - * rfc2047.el (rfc2047-default-charset): Removed. - - * mail-prsvr.el: New file. - (mail-parse-charset): New variable. - - * gnus-sum.el (gnus-newsgroup-charset): Changed name. - Changed name. - - * gnus.el (gnus-charset): New group. - - * nnmail.el (nnmail-pathname-coding-system): Default to binary. - - * gnus-sum.el (gnus-default-charset): Default to nil. - (gnus-newsgroup-iso-8859-1-forced-regexp): Removed. - (gnus-newsgroup-iso-8859-1-forced): Removed. - - * mm-util.el (mm-known-charsets): Removed. - (mm-default-coding-system): Removed. - (mm-default-charset): Removed. - (mm-read-charset): New function. - - * message.el (message-default-charset): Removed. - - * rfc2047.el (rfc2047-default-charset): Default to nil. - - * mm-util.el (mm-charset-iso-8859-1-forced): Removed. - -Fri Jan 15 20:50:38 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.70 is released. - -1999-01-15 00:06:04 Lars Magne Ingebrigtsen - - * mm-decode.el (mm-save-part): Use mm-get-part. - (mm-insert-part): New function. - (mm-get-part): Use it. - (mm-get-image): Ditto. - (mm-display-external): Ditto. - - * mm-view.el (mm-inline-text): Ditto. - - * gnus-move.el (gnus-move-group-to-server): Protect against nil - ranges. - - * mm-decode.el (mm-display-external): Save the buffer. - (mm-remove-part): Kill it. - - * qp.el (quoted-printable-decode-region): Do the right thing at eobp. - - * nnagent.el (nnagent-request-set-mark): Defined stub. - -1999-01-14 23:05:31 Lars Magne Ingebrigtsen - - * gnus-score.el (gnus-score-load-score-alist): Bind - coding-system-for-read. - - * gnus-sum.el (gnus-summary-exit): Do adaptive scoring before - prepare-exit-hook. - - * mm-view.el (mm-setup-w3): Require w3. - -1999-01-13 Kiyokazu SUTO - - * lisp/nnspool.el (nnspool-retrieve-headers): Protect against empty - body. - -1999-01-14 21:17:35 Lars Magne Ingebrigtsen - - * mm-encode.el: Ditto. - - * mm-bodies.el (mm-decode-content-transfer-encoding): Message the - error. - - * mailcap.el (mailcap-mime-data): SAFER ps. - - * message.el (message-encode-message-body): Always insert a - Content-Type header. - - * mm-decode.el (mm-inline-media-tests): Default all text/* to be - shown inline. - - * mm-view.el (mm-inline-text): Handle all sorts of text. - - * mailcap.el (mailcap-mime-data): non-viewer for viewers that - don't view. - - * mm-decode.el (mm-display-external): Use it. - - * gnus-art.el (gnus-visible-headers): Added bcc, gcc, fcc. - - * mm-decode.el (mm-save-part): Removed double code. - -1999-01-12 Dave Love - - * mm-decode.el (mm-save-part): Avoid doubly-compressed - application/octet-stream .gz & al files with jka-compr. - -1999-01-12 Dave Love - - * gnus-ems.el (gnus-down-mouse-3): New variable. - * gnus-art.el (gnus-mime-button-map): Use it. - (gnus-mime-button-menu): Set the clicked-on buffer initially. - -1999-01-13 19:41:57 Lars Magne Ingebrigtsen - - * mailcap.el (mailcap-mime-data): Added ImageMagic and ee. - -1999-01-12 17:34:43 Lars Magne Ingebrigtsen - - * gnus-picon.el (gnus-picons-kill-buffer): Don't kill article - buffers. - - * gnus-sum.el (gnus-summary-exit): Destroy all MIME. - - * gnus-cache.el (gnus-cache-read-active): Reversed check. - -1999-01-12 17:18:25 Matt Armstrong - - * mml.el (mml-parameter-string): Strip directory component. - -1999-01-12 17:02:58 Lars Magne Ingebrigtsen - - * gnus.el (gnus-use-demon): Removed. - -1999-01-12 05:53:23 Katsumi Yamaoka - - * nnmail.el (nnmail-article-group): Don't infloop. - -1999-01-11 Colin Rafferty - - * gnus-art.el (article-update-date-lapsed): Made it work with - picons, and make it update on all visible frames. - (article-date-ut): Get summary-buffer's current-headers. - -1999-01-12 07:20:31 Lars Magne Ingebrigtsen - - * gnus-picon.el (gnus-picons-setup-buffer): Don't set major mode. - (gnus-picons-setup-p): New variable. - -1999-01-11 02:13:12 Lars Magne Ingebrigtsen - - * nnmail.el (nnmail-split-header-length-limit): Lowered to 512. - -1999-01-04 12:58:13 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-summary-exit-no-update): Don't use run-hooks. - (gnus-summary-exit-no-update): Use mapcar. - -1999-01-02 14:36:32 Simon Josefsson - - * gnus-agent.el (gnus-category-write): Make directory. - -1998-09-26 19:39:31 Simon Josefsson - - * gnus-sum.el (gnus-update-read-articles): - (gnus-update-marks): Request backend update of mark. - -1999-01-03 15:29:52 Lars Magne Ingebrigtsen - - * mm-bodies.el (mm-body-encoding): Use mm-find. - -1999-01-03 15:28:27 Kim-Minh Kaplan - - * gnus-picon.el (gnus-article-display-picons): Fix. - -Sun Jan 3 13:32:02 1999 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.69 is released. - -1999-01-03 06:45:10 Lars Magne Ingebrigtsen - - * gnus-picon.el (gnus-picons-setup-buffer): Run the hook. - - * gnus-agent.el (gnus-agent-remove-group): New command and - keystroke. - - * rfc2047.el (rfc2047-decode-region): Check for us-ascii. - -1999-01-02 14:12:41 Simon Josefsson - - * gnus-agent.el (gnus-agent-write-servers): Make directory. - -1998-12-26 02:38:01 Lars Magne Ingebrigtsen - - * mm-view.el (mm-inline-text): Bind current id. - - * mm-decode.el (mm-handle-id): New macro. - (mm-make-handle): Accept id. - (mm-dissect-singlepart): Use it. - -1998-12-23 Matt Pharr - - * message.el (message-cite-original-without-signature): Use - message-signature-separator when searching for signature in - message-cite-original-without-signature. - -1998-12-24 16:25:38 Simon Josefsson - - * gnus.el (gnus-server-to-method): Check named methods. - -1998-12-24 03:27:02 Lars Magne Ingebrigtsen - - * mm-view.el (mm-view-message): Goto point-min. - - * nnmail.el (nnmail-article-group): Don't delete lines, only - shorten them. - - * gnus-msg.el (gnus-configure-posting-styles): Also do nil - values. - - * nnheader.el (nnheader-temp-directory): New variable. - (nnheader-temp-directory): Removed. - -1998-12-22 Jack Vinson - - * mailcap.el (mailcap-parse-mailcaps): Add "~/.mailcaps" to the - list of files to check for mailcap entries under windows-nt. - -1998-12-24 03:02:15 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-article-maybe-hide-headers): Check whether the - summary buffer exists. - -1998-12-22 Aaron M. Ucko - - * nnsoup.el (nnsoup-store-reply): Remove code to deal with - irrelevant Sun sendmail bug. - (nnsoup-store-reply): Stop mucking with mail-header-separator. - - * message.el (message-send-news): Bind mail-header-separator to - "" when asking backend to post. - -1998-12-22 Karl Kleinpaste - - * mm-uu.el (mm-dissect-disposition): New variable. - (mm-uu-dissect): Use it. - -1998-12-21 21:34:22 Lars Magne Ingebrigtsen - - * mm-view.el (mm-inline-text): Bind url-current-object. - -1998-12-06 03:05:41 Simon Josefsson - - * gnus-range.el (gnus-remove-from-range): Rewrite. - -1998-12-09 SL Baur - - * gnus-picon.el (annotations): Remove bogus require 'xpm. - -1998-12-18 Hrvoje Niksic - - * message.el (message-encode-message-body): Insert `MIME-Version' - instead of `Mime-Version'. - -1998-12-04 Hrvoje Niksic - - * message.el (message-insert-mime-part): Add the attachment - disposition. - (message-insert-mime-part): Make TYPE and DESCRIPTION optional. - (message-mime-query-type): New function. - (message-mime-query-description): Ditto. - (message-mime-query-file): Ditto. - (message-insert-mime-part): Use them. - (message-mime-insert-external): Use the new stuff. - -1998-12-19 23:02:26 Lars Magne Ingebrigtsen - - * nnmail.el (nnmail-split-header-length-limit): New variable. - - * mm-decode.el (mm-dissect-buffer): Check syntax. - - * rfc2231.el (rfc2231-parse-string): Remove check for syntax. - - * rfc2047.el (rfc2047-encodable-p): Use mm-find-charset-region. - (rfc2047-dissect-region): Ditto. - -1998-12-17 18:36:43 Lars Magne Ingebrigtsen - - * mm-view.el (mm-view-message): Decode charset. - -1998-12-16 16:01:22 Lars Magne Ingebrigtsen - - * rfc2231.el (rfc2231-parse-string): Ignore syntactically invalid - CT headers. - -Wed Dec 16 01:44:40 1998 Shenghuo ZHU - - * mm-bodies.el (mm-decode-content-transfer-encoding): Use - mm-uu-*-function. - * mm-uu.el (mm-uu-dissect): Use x-uuencode. - -1998-12-16 10:20:52 Lars Magne Ingebrigtsen - - * message.el (message-send-mail): Do MML first. - (message-send-news): Ditto. - -1998-12-15 20:57:18 Lars Magne Ingebrigtsen - - * gnus-picon.el (gnus-picons-face): New face. - (gnus-picons-try-face): Use it. - -Tue Dec 15 19:17:43 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.68 is released. - -Tue Dec 15 18:28:24 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.67 is released. - -Tue Dec 15 17:31:44 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.66 is released. - -1998-12-13 11:00:43 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-insert-mime-button): Decode description. - -Sat Dec 5 16:50:49 1998 Shenghuo ZHU - - * gnus-art.el (article-decode-encoded-words): Rollback to 0.55. - (gnus-decode-header-methods): Ditto. - (gnus-decode-with-mail-decode-encoded-word-region): Ditto. - -1998-12-13 10:04:39 Lloyd Zusman - - * gnus-xmas.el (gnus-xmas-summary-recenter): Allow numbers. - -1998-12-13 09:32:38 Lars Magne Ingebrigtsen - - * mml.el (mml-insert-mime-headers): Encode description. - - * nnfolder.el (nnfolder-request-expire-articles): Go to the date - line. - - * gnus-sum.el (gnus-default-charset): Doc fix. - -Wed Dec 9 15:18:39 1998 Shenghuo ZHU - - * mm-decode.el (mm-display-part): Forward a line. - -Wed Dec 9 13:30:29 1998 Shenghuo ZHU - - * mm-util.el (mm-running-ntemacs): New variable. - (mm-text-coding-system): Ditto. - * nnmail.el (nnmail-incoming-coding-system): Ditto. - (nnmail-split-incoming): Use nnmail-incoming-coding-system. - -1998-12-13 08:52:45 Lars Magne Ingebrigtsen - - * gnus-picon.el (gnus-picons-network-display-internal): Don't set - buffer. - - * message.el (message-insert-headers): New command and keystroke. - -1998-12-07 23:42:14 Lars Magne Ingebrigtsen - - * mm-decode.el (mm-inline-media-tests): Recognize x-xbitmap. - (mm-get-image): Ditto. - - * mm-bodies.el (mm-decode-content-transfer-encoding): Only for - base64, uudecode and binhex. - -Sun Dec 6 21:58:31 1998 Shenghuo ZHU - - * mm-bodies.el (mm-decode-content-transfer-encoding): Replace CRLF - in text/plain. - * mm-uu.el (mm-uu-dissect): Use inline. - -1998-12-07 23:19:14 Lars Magne Ingebrigtsen - - * mm-view.el (mm-view-message): New function. - - * mm-encode.el (mm-content-transfer-encoding-defaults): Changed to - qp. - -1998-12-07 Karl Kleinpaste - - * mm-encode.el (mm-content-transfer-encoding-defaults): Add an - entry for message/rfc822 as 8bit. - -1998-12-07 23:16:54 Lars Magne Ingebrigtsen - - * mailcap.el (mailcap-mime-extensions): Add patch. - -1998-12-05 Dale Hagglund - - * gnus-sum.el (gnus-summary-display-buttonized): Use prefix - argument to force all multipart/* to look like multipart/mixed. - - * gnus-art.el (gnus-mime-display-multipart-as-mixed): New - variable. - (gnus-mime-display-part): Use it. - -1998-12-07 22:46:37 Lars Magne Ingebrigtsen - - * gnus-draft.el (gnus-draft-send): Only disable checks for - non-interactive use. - (gnus-draft-send-message): Use it. - -Sun Dec 6 19:36:53 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.65 is released. - -1998-12-06 20:11:02 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-article-prepare-display): Don't init w3. - - * mm-view.el (mm-inline-text): Bind url-standalone-mode here. - -Sat Dec 5 18:35:42 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.64 is released. - -1998-12-05 18:51:13 Lars Magne Ingebrigtsen - - * mm-view.el (mm-setup-w3): Don't load. - - * gnus-msg.el (gnus-setup-message): Set group name. - (gnus-group-mail): Avoid leaking local vars. - - * message.el (message-attach-file): Renamed. - (message-mime-attach-file): Renamed again. - -1998-12-05 Hrvoje Niksic - - * gnus-art.el (article-decode-encoded-words): Bind - rfc2047-default-charset here. - - * gnus-art.el (gnus-insert-mime-button): Nix slashes in file name. - -1998-12-05 18:33:27 Lars Magne Ingebrigtsen - - * gnus-picon.el (gnus-picons-setup-buffer): Run picons hook. - (gnus-picons-setup-hook): New hook. - -1998-12-05 Per Abrahamsen - - * mailcap.el (mailcap-mime-data): Remove "*" from documentation - string. - (mailcap-mime-extensions): Ditto. Made first sentense fit a - line. - -1998-12-05 17:11:04 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-article-prepare-display): Setup w3. - (gnus-mime-view-part): Ditto. - (gnus-mime-inline-part): Dotii. - (gnus-mime-externalize-part): Daddo. - (gnus-mime-internalize-part): Tutti frutti. - (gnus-widget-press-button): Da da do. - - * mm-view.el (mm-setup-w3): Require url-vars. - -Fri Dec 4 12:13:12 1998 Shenghuo ZHU - - * message.el (message-draft-coding-system): Fix for XEmacs-NT. - * mm-util.el (mm-find-charset-region): Ditto. - -1998-12-05 16:30:01 Lars Magne Ingebrigtsen - - * message.el (message-send): Don't encode here. - (message-send-mail): But here. - (message-send-news): And here. - -1998-12-04 15:29:02 Lars Magne Ingebrigtsen - - * gnus-msg.el (gnus-message-insert-stylings): Don't insert twice. - -Fri Dec 4 04:09:15 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.63 is released. - -1998-12-04 04:59:20 Lars Magne Ingebrigtsen - - * mml.el (mml-base-boundary): Shorten. - - * message.el (message-insert-mime-part): Use default. - - * gnus-art.el (gnus-insert-mime-button): Bind gnus-tmp-type-long. - -1998-12-03 Per Abrahamsen - - * gnus-art.el (gnus-mime-display-alternative): Use (*) for radio - buttons, not [*]. - -1998-12-04 Hrvoje Niksic - - * gnus-art.el (gnus-insert-mime-button): Do proper help-echo. - -1998-12-04 04:48:37 Hrvoje Niksic - - * gnus-art.el (gnus-insert-mime-button): Fix. - -1998-12-03 Hrvoje Niksic - - * message.el (message-insert-mime-part): Nicify prompts. - (message-insert-mime-part): Really delete duplicates. - (message-insert-mime-part): Check against common errors. - (message-insert-mime-part): Fix docstring. - -1998-12-04 04:41:58 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-mime-internalize-part): Bugged out. - -1998-12-03 Hrvoje Niksic - - * gnus-art.el (gnus-mime-button-line-format): Nicify. - (gnus-insert-mime-button): Modify accordingly. - -1998-12-04 01:50:53 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-display-mime): Set window point. - - * mm-decode.el (mm-display-external): Only decode when not - saving. - (mm-alternative-precedence): Prefer multiparts. - (mm-inline-media-tests): Inline multiparts. - - * gnus-picon.el (gnus-picons-next-job-internal): Do bar if asked. - Ignore errors when requiring url. - - * mml.el (mml-quote-region): New command. - - * message.el (message-cite-original): Use it. - (message-cite-original-without-signature): Ditto. - -Thu Dec 3 12:53:58 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.62 is released. - -1998-12-03 13:38:36 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-mime-view-all-parts): Work with multiparts. - -1998-12-03 Hrvoje Niksic - - * mm-view.el (mm-inline-text): Use `point-min-marker' and - `point-max-marker'. - -1998-12-03 13:22:57 Lars Magne Ingebrigtsen - - * mailcap.el (mailcap-mime-extensions): Use image/xpm for xpms. - - * gnus-art.el (gnus-mime-display-single): Check for attachment - before other tests. - -1998-12-03 Didier Verna - - * gnus-msg.el (gnus-configure-posting-styles): find a - posting-style entry in the group parameters, if any, and honor it - at the end. - -1998-12-03 13:03:37 Felix Lee - - * nntp.el (nntp-after-change-function): Fix. - -1998-12-03 12:44:30 Mike McEwan - - * mml.el (mml-generate-mime-1): Insert literally. - -1998-12-03 00:23:17 Lars Magne Ingebrigtsen - - * mml.el (mml-insert-mime-headers): Removed debug. - -1998-12-02 22:22:03 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-summary-show-article): Destroy parts when - prefixed. - - * mm-encode.el (mm-content-transfer-encoding-defaults): Default - application/emacs-lisp to 8bit. - -1998-12-03 Dale Hagglund - - * mm-decode.el (mm-quote-arg): Add quoting of '()', '<>', and '|'. - -Wed Dec 2 20:24:27 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.61 is released. - -1998-12-02 21:12:56 Lars Magne Ingebrigtsen - - * mml.el (mml-parse-1): Skipped parts. - (mml-insert-mime-headers): Nil is a list. - (mml-generate-mime-1): Don't insert literally. - (mml-read-tag): Drop text props. - (mml-read-part): Ditto. - (mml-parse-singlepart-with-multiple-charsets): Ditto. - -Wed Dec 2 20:07:16 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.60 is released. - -1998-12-02 20:11:28 Lars Magne Ingebrigtsen - - * mml.el (mml-parse-1): Don't throw contents away. - -1998-12-02 Hrvoje Niksic - - * mml.el (mml-compute-boundary-1): Regexp-quote the boundary. - -1998-12-02 18:42:24 Lars Magne Ingebrigtsen - - * mml.el (mml-parse-singlepart-with-multiple-charsets): New - function. - (mml-parse-1): Use it. - -Tue Dec 1 23:04:25 1998 Shenghuo ZHU - - * gnus-art.el (gnus-decode-with-mail-decode-encoded-word-region): - Use gnus-newsgroup-default-charset. - (article-decode-encoded-words): Remove charset codes. - * gnus-sum.el (gnus-newsgroup-default-charset): Use - gnus-default-charset. - -1998-12-02 03:14:20 Lars Magne Ingebrigtsen - - * message.el (message-send-mail): Don't encode here. - (message-send-news): Nor here. - (message-send): ... but here instead. - - * gnus-picon.el (gnus-picons-display-article-move-p): Changed - default to nil. - (gnus-article-display-picons): Replace From line. - (gnus-group-display-picons): Replace Newsgroups line. - (gnus-picons-display-glyph): Set baseline. - (gnus-group-display-picons): Piconize the entire Newsgroups line. - (gnus-picons-xbm-face): Revert to old, standard colors. - - * message.el (message-fetch-field): Remove text props. - - * gnus-art.el (gnus-article-normalized-header-length): New - variable. - (article-normalize-headers): New command and keystroke. - - * gnus-picon.el (gnus-picons-xbm-face): Changed colors. - -Wed Dec 2 01:43:48 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.59 is released. - -1998-12-02 01:38:31 Lars Magne Ingebrigtsen - - * mml.el (mml-insert-mime-headers): Beep at multiple charsets. - - * gnus-art.el (gnus-mime-copy-part): Set buffer-file-name. - -1998-11-30 Hrvoje Niksic - - * mml.el (mml-generate-mime-1): Handle unquoting end-tags. - -1998-12-02 00:15:30 Lars Magne Ingebrigtsen - - * mm-decode.el (mm-all-images-fit): New variable. - (mm-image-fit-p): Use it. - - * gnus-art.el (gnus-mime-display-single): Use it. - (gnus-mime-internalize-part): New command and keystroke. - - * mm-decode.el (mm-user-automatic-external-display): New - variable. - (mm-automatic-external-display-p): New function. - - * gnus-picon.el (gnus-picons-xbm-face): Default to sensible - colors. - -1998-12-01 23:52:05 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-summary-repair-multipart): Reselect article. - - * gnus-art.el (gnus-with-article): Work in the original article - buffer. - (gnus-with-article): Work in read-only groups. - -Tue Dec 1 00:15:36 1998 Shenghuo ZHU - - * mm-bodies.el (mm-decode-string): Return original string if not - decode. - -Mon Nov 30 23:38:02 1998 Shenghuo ZHU - - * mm-uu.el (mm-uu-dissect): Use mm-make-handle. - -1998-12-01 01:53:49 Francois Pinard - - * nndoc.el (nndoc-mime-parts-type-p): Do related. - -Tue Dec 1 00:46:20 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.58 is released. - -1998-11-30 Hrvoje Niksic - - * mm-decode.el (mm-get-image): Return a glyph, not an image - specifier. - -1998-11-29 Hrvoje Niksic - - * rfc2047.el (rfc2047-decode): Bind mm-default-charset. - -1998-12-01 01:23:35 Lars Magne Ingebrigtsen - - * mail-parse.el (rfc2045): Required. - -1998-12-01 00:59:53 William M. Perry - - * mm-view.el (mm-inline-text): Remove props. - -1998-12-01 00:18:47 Lars Magne Ingebrigtsen - - * mm-view.el (mm-setup-w3): Protect url-misc. - - * message.el (message-ignored-resent-headers): Remove - Gnus-Warning. - - * mml.el (mml-insert-mime-headers): Use encoding. - (mml-parameter-string): Ditto. - - * rfc2045.el: New file. - (rfc2045-encode-string): New function. - -1998-11-30 23:11:22 Lars Magne Ingebrigtsen - - * mail-parse.el (mail-header-encode-parameter): New function. - - * rfc2231.el (rfc2231-encode-string): New function. - -Mon Nov 30 13:52:50 1998 Shenghuo ZHU - - * mm-bodies.el (mm-decode-string): New function. - * mm-view.el (mm-inline-text): Use mm-decode-string. - -Mon Nov 30 21:57:00 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.57 is released. - -1998-11-23 Felix Lee - - * nntp.el (nntp-async-needs-kluge): new setting. - (nntp-async-timer): new var. - (nntp-async-process-list): new var. - (nntp-async-kluge): new function. - (nntp-async-timer-handler): new function. - (nntp-async-wait): new function. - (nntp-async-stop): new function. - (nntp-after-change-function): renamed, and split apart. - (nntp-async-trigger): new function. - (nntp-do-callback): new function. - (nntp-accept-process-output): add optional timeout arg. - - * gnus-async.el (gnus-async-request-fetched-article): fixed. - (gnus-async-wait-for-article): new function. - (gnus-async-with-semaphore): s/asynch/async/. - -1998-11-30 16:54:56 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-with-article): Don't encode. - (gnus-insert-mime-button): Fall back on filename from C-D. - (gnus-mime-display-single): Have dots right on text/plain - attachments. - - * mm-decode.el (mm-dissect-buffer): Respect Content-Disposition in - broken parts. - - * gnus-art.el (gnus-with-article): Flush cache and backlog. - - * mm-bodies.el (mm-decode-content-transfer-encoding): Also do - binhex. - - * gnus-sum.el (gnus-summary-reparent-thread): Use new macro. - (gnus-summary-repair-multipart): New command and keystroke. - - * gnus-art.el (gnus-with-article-buffer): New macro. - -Sun Nov 29 23:51:57 1998 Shenghuo ZHU - - * gnus-art.el (gnus-mime-inline-part): Do not get part when - undisplay the part. - -1998-11-30 03:38:35 Lars Magne Ingebrigtsen - - * gnus-util.el (gnus-make-sort-function-1): Allow lambdas. - - * mml.el (mml-read-part): Partition right. - - * mm-decode.el (mm-handle-set-cache): New macro. - (mm-handle-cache): Ditto. - (mm-make-handle): Ditto. - (mm-dissect-singlepart): Use it. - (mm-get-image): Use the cache. - -1998-11-29 23:44:44 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-mime-display-mixed): Rewrite. - (gnus-mime-display-single): Don't insert lines between parts. - -Sun Nov 29 04:55:40 1998 Shenghuo ZHU - - * nnmail.el (nnmail-file-coding-system-1): New variable. - * nnfolder.el (nnfolder-file-coding-system): Ditto. - (nnfolder-read-folder): Use nnfolder-file-coding-system. - * nnml.el (nnml-file-coding-system): New variable. - (nnml-request-article): Use nnml-file-coding-system. - -Sun Nov 29 15:12:52 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.56 is released. - -1998-11-29 00:52:53 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-mime-display-part): New function. - (gnus-mime-display-mixed): Use it. - - * mm-view.el (mm-setup-w3): Don't register. - - * message.el (message-cite-original): Cite parts. - -1998-11-28 23:51:25 Lars Magne Ingebrigtsen - - * mml.el (mml-parameter-string): New function. - (mml-insert-mime-headers): Separated into new function. - -1998-11-28 Hrvoje Niksic - - * mml.el (mml-make-boundary): Use `make-string'. - -1998-11-27 Hrvoje Niksic - - * binhex.el (binhex-insert-char): Ditto. - - * base64.el (base64-insert-char): Ditto. - - * uudecode.el (uudecode-insert-char): Code correctly. - -1998-11-28 01:08:19 Lars Magne Ingebrigtsen - - * mml.el (mml-generate-mime): Don't generate multiparts for - empties. - - * gnus-art.el (gnus-display-mime): Save excursion. - - * message.el (message-remove-first-header): New function. - (message-encode-message-body): Use it. - -Fri Nov 27 12:26:10 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.55 is released. - -1998-11-27 12:38:52 Lars Magne Ingebrigtsen - - * mm-view.el (mm-setup-w3): New function. - - * mm-decode.el (mm-content-id-get-contents): New function. - (mm-content-id-get-type): Ditto. - (mm-content-id-get-encoding): Ditto. - (mm-get-handle-by-content-id): Removed. - -1998-11-25 Colin Rafferty - - * message.el (message-generate-new-buffers): Fix tag. - -1998-11-25 10:43:28 Lars Magne Ingebrigtsen - - * message.el (message-buffer-name): Check for unique first. - - * gnus-art.el (gnus-unbuttonized-mime-type-p): use - gnus-inhibit-mime-unbuttonizing. - - * gnus-sum.el (t): Bind M-t. - (gnus-inhibit-unbuttonizing): New variable. - (gnus-summary-toggle-display-buttonized): New command. - - * gnus-art.el (gnus-display-mime): Select article window. - (article-strip-trailing-space): New command and keystroke. - - * nneething.el (nneething-include-files): New variable. - (nneething-create-mapping): Use it. - - * nntp.el (nntp-possibly-change-group): Use nntp-send-command. - - * nnvirtual.el (nnvirtual-request-update-mark): Only yodate - ayto-expirable marks. - -1998-11-24 21:00:02 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-mime-view-all-parts): Set buffer. - - * gnus-sum.el (gnus-summary-display-buttonized): Don't pass on - ARG. - - * gnus-art.el (gnus-article-mode-line-format): Doc fix. - -Tue Nov 24 14:57:41 1998 Shenghuo ZHU - - * mm-util.el (mm-binary-coding-system): New variable. - (mm-with-unibyte-buffer): Use mm-binary-coding-system. - * mm-decode.el (mm-display-external): Ditto. - -Tue Nov 24 10:43:06 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.54 is released. - -1998-11-24 11:21:32 Katsumi Yamaoka - - * gnus-sum.el (gnus-newsgroup-default-charset-alist): Note fj. - -1998-11-24 11:14:54 Lars Magne Ingebrigtsen - - * mm-decode.el (mm-save-part): Unquote. - -1998-11-24 11:14:39 Matt Armstrong - - * mm-decode.el (mm-save-part): Bind coding system for write. - -1998-11-24 10:42:30 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-article-mode-line-format): New default. - (gnus-article-mime-part-status): New function. - - * message.el (message-send-news): Check the body syntax before - encoding. - - * gnus-art.el (gnus-unbuttonized-mime-type): New function. - (gnus-mime-display-single): Use it. - (gnus-mime-display-alternative): Ditto. - - * mm-decode.el: Check for whether we are running under a term. - -1998-11-22 08:12:25 Lars Magne Ingebrigtsen - - * mm-decode.el (mm-preferred-alternative): Default to first - alternative. - (mm-preferred-alternative): No, we dont. - -Tue Nov 24 03:01:48 1998 Shenghuo ZHU - - * mm-decode.el (mm-display-external): Use binary instead of - no-conversion. - * gnus-agent.el (gnus-agent-file-coding-system): Ditto. - * nnheader.el (nnheader-file-coding-system): Ditto. - * mm-util.el (mm-with-unibyte-buffer): Use binary instead of nil. - -Mon Nov 23 01:51:57 1998 Shenghuo ZHU - - * gnus-sum.el (gnus-newsgroup-setup-default-charset): Use group - name without method. - -Mon Nov 23 01:26:40 1998 Shenghuo ZHU - - * gnus-sum.el (gnus-newsgroup-default-charset): Rename - coding-system -> default-charset. - (gnus-newsgroup-default-charset-alist): Ditto. - (gnus-summary-local-variables): Ditto. - (gnus-set-global-variables): Ditto. - (gnus-get-newsgroup-headers): Ditto. - (gnus-summary-from-or-to-or-newsgroups): Ditto. - (gnus-get-newsgroup-headers-xover): Ditto. - (gnus-newsgroup-setup-default-charset): Ditto. - (article-decode-mime-words): Ditto. - (article-decode-charset): Ditto. - (article-decode-encoded-words): Ditto. - (article-de-quoted-unreadable): Ditto. - (gnus-mime-view-all-parts): Ditto. - (gnus-mime-externalize-part): Ditto. - (gnus-mm-display-part): Ditto. - (gnus-mime-display-single): Ditto. - (gnus-mime-display-alternative): Ditto. - * lpath.el : Ditto. - -Mon Nov 23 00:54:33 1998 Shenghuo ZHU - - * rfc2047.el (rfc2047-decode-region): Do not decode nil charset. - * gnus-art.el (article-decode-charset): Overlay - rfc2047-default-charset. - * message.el (message-draft-coding-system): New variable. - (message-set-auto-save-file-name): Use message-draft-coding-system. - * nndraft.el (nndraft-request-article): Ditto. - * gnus-start.el (gnus-start-draft-setup): Set charset nil. - * gnus-agent.el (gnus-agent-queue-setup): Ditto. - -Sun Nov 22 04:42:22 1998 Shenghuo ZHU - - * mm-uu.el (mm-uu-test): New function. - (mm-uu-dissect): Inherit charset and cte from head. - * gnus-art.el (article-decode-charset): Use mm-uu-test. - -Sat Nov 21 09:57:01 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.53 is released. - -1998-11-21 05:54:19 Lars Magne Ingebrigtsen - - * mm-decode.el (mm-get-image): New function. - (mm-image-fit-p): New function. - - * gnus-xmas.el (gnus-xmas-annotation-in-region-p): Ditto. - - * gnus-util.el (gnus-annotation-in-region-p): New definition. - - * gnus-art.el (gnus-article-insert-newline): New function. - (article-goto-body): New function. - -1998-11-20 10:34:04 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-mime-display-single): Insert blank line before - buttons. - - * gnus-sum.el (gnus-summary-display-buttonized): New command and - keystroke. - - * gnus-art.el (gnus-mime-display-single): Don't insert a blank - line between parts. - - * message.el (message-remove-header): Go to end if wanted. - -1998-11-20 Karl Kleinpaste - - * gnus-art.el (gnus-mime-display-alternative): Avoid window - movement with save-window-excursion. - -Fri Nov 20 03:50:30 1998 Shenghuo ZHU - - * gnus-art.el (gnus-mime-inline-part): Use argument as charset. - -Fri Nov 20 03:37:53 1998 Shenghuo ZHU - - * mm-bodies.el (mm-decode-body): Remove buffer-file-coding-system. - -Fri Nov 20 01:20:38 1998 Shenghuo ZHU - - * gnus-sum.el (gnus-summary-from-or-to-or-newsgroups): Use - gnus-newsgroup-coding-system. - (gnus-get-newsgroup-headers): Ditto. - (gnus-get-newsgroup-headers-xover): Ditto. - (gnus-set-global-variables): Ditto. - * gnus-art.el (article-decode-mime-words): Ditto. - (article-decode-charset): Ditto. - (article-decode-encoded-words): Ditto. - (article-de-quoted-unreadable): Ditto. - (gnus-mime-view-all-parts): Ditto. - (gnus-mime-externalize-part): Ditto. - (gnus-mm-display-part): Ditto. - (gnus-mime-display-alternative): Ditto. - (gnus-mime-display-single): Ditto. - * mm-view.el (mm-inline-text): Use default coding system. - -Fri Nov 20 00:54:37 1998 Shenghuo ZHU - - * gnus-sum.el (gnus-newsgroup-coding-system-alist): New variable. - (gnus-newsgroup-iso-8859-1-forced-regexp): New variable. - (gnus-newsgroup-coding-system): New local variable. - (gnus-newsgroup-iso-8859-1-forced): New local variable. - (gnus-summary-local-variables): Add two new local variables. - (gnus-newsgroup-setup-coding-system): New function. - (gnus-select-newsgroup): Setup coding system. - * lpath.el: Add two new variables. - * mm-util.el (mm-charset-iso-8859-1-forced): New variable. - (mm-charset-to-coding-system): Use mm-charset-iso-8859-1-forced. - * gnus-cus.el (gnus-group-parameters): Customizable - iso-8859-1-forced. - -Fri Nov 20 05:30:26 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.52 is released. - -1998-11-20 04:32:23 Lars Magne Ingebrigtsen - - * rfc2047.el (rfc2047-encode-message-header): Encode the default - encoding. - - * gnus-art.el (gnus-mime-display-single): Insert buttons for - undisplayed text types. - - * mm-decode.el (mm-automatic-display-p): Only prefer inlinable - types. - -1998-11-19 Felix Lee - - * nntp.el (nntp-after-change-function-callback): recover from C-g. - -1998-11-19 Felix Lee - - * gnus-async.el (gnus-asynch-obarray): rename to - gnus-async-hashtb, and don't buffer-local it. - - (gnus-async-article-callback): new function. - (gnus-make-async-article-function): use it. - - (gnus-async-current-prefetch-group): new var. - (gnus-async-current-prefetch-article): new var. - (gnus-async-request-fetched-article): are we fetching it already? - - (gnus-async-delete-prefected-entry): s/prefected/prefetched/ - -1998-11-20 02:49:21 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-summary-show-article): Require. - - * message.el: Provide before hooks. - (message-send-news): Do MIME before headers. - - * gnus-art.el (gnus-article-check-buffer): New function. - (gnus-article-read-summary-keys): Use it. - - * mm-decode.el (mm-user-automatic-display): Display all inline - images. - - * gnus-art.el (gnus-mime-display-single): Don't buttonize so - much. - (gnus-unbuttonized-mime-types): New variable. - -1998-11-19 06:29:03 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-inhibit-user-auto-expire): Changed to t. - - * mm-decode.el (mm-quote-arg): Quote semicolons. - - * gnus-art.el (gnus-mime-display-single): Don't display - attachments. - (gnus-mime-externalize-part): New command and keystroke. - - * mm-decode.el (mm-dissect-buffer): Pass on the description info. - (mm-alternative-precedence): Changed order. - -1998-11-07 17:41:47 Simon Josefsson - - * gnus.el (gnus-method-simplify): New function. - (gnus-native-method-p): New function. - (gnus-secondary-method-p): Use gnus-method-equal. - - * gnus-start.el (gnus-group-change-level): Shorten select method. - -Thu Nov 19 04:48:42 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.51 is released. - -1998-11-19 04:02:34 Lars Magne Ingebrigtsen - - * gnus.el: Applied patches from 5.6.45. - - * gnus-score.el (gnus-score-find-trace): Print complete file - paths. - (gnus-score-find-trace): Truncate lines. - - * gnus.el (gnus-message-archive-group): Allow function. - - * message.el (message-encode-message-body): Remove Mime-Version - before inserting. - - * gnus-cus.el (gnus-group-customize): Optional topic. - - * gnus-sum.el (gnus-summary-customize-parameters): New command and - keystroke. - -Wed Nov 18 13:46:08 1998 Shenghuo ZHU - - * message.el (message-encode-message-body): Rewrite. - -1998-11-18 07:37:47 Lars Magne Ingebrigtsen - - * mml.el (mml-base-boundary): New variable. - (mml-make-boundary): New function. - - * gnus-cache.el (gnus-cache-coding-system): New variable. - (gnus-cache-request-article): Use it. - - * message.el (message-insert-mime-part): Delete duplicates. - -Wed Nov 18 11:52:19 1998 Shenghuo ZHU - - * gnus-art.el (gnus-mime-display-alternative): Set end of - multipart and display even when nothing is preferred. - -Wed Nov 18 05:06:44 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.50 is released. - -1998-11-18 04:42:01 Lars Magne Ingebrigtsen - - * mm-decode.el (mm-inline-media-tests): Check that device-type is - fbound. - - * gnus-sum.el (gnus-summary-sort): Didn't do reverse. - -1998-11-07 23:39:48 Simon Josefsson - - * gnus.el (gnus-similar-server-opened): Compare backend. - -1998-11-08 03:37:42 Simon Josefsson - - * gnus-topic.el (gnus-topic-expire-articles): New function. - (gnus-topic-mode-map): Bind it. - - * gnus.texi (Topic Commands): New expiry command. Reordered. - -1998-11-10 Miles Bader - - * gnus-sum.el - (gnus-auto-expirable-marks): New variable. - (gnus-inhibit-user-auto-expire): New variable. - (gnus-summary-mark-article-as-read, gnus-summary-mark-article): - When looking to see if we should expire instead, check - gnus-auto-expirable-marks instead of using a hard-wired list. - (gnus-summary-mark-as-read-forward, - gnus-summary-mark-as-read-backward): - Pass gnus-inhibit-user-auto-expire for the no-expire argument to - gnus-summary-mark-forward, instead of `t'. - -1998-11-18 03:30:26 Lars Magne Ingebrigtsen - - * mml.el (mml-compute-boundary): New function. - (mml-compute-boundary-1): New function. - (mml-generate-mime-1): Use it. - -1998-11-18 Hrvoje Niksic - - * mml.el (mml-generate-mime-1): Always precede closing boundary - with newline. - -1998-11-18 02:36:37 Lars Magne Ingebrigtsen - - * mml.el (mml-generate-mime-1): Do right boundaries when several - multiparts. - - * mm-decode.el (mm-user-automatic-display): Default to inline - jpeg. - - * mml.el (mml-generate-mime-1): Encode non-text parts. - -Wed Nov 18 02:22:23 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.49 is released. - -1998-11-18 00:37:43 Lars Magne Ingebrigtsen - - * mm-view.el (mm-inline-text): Require w3-vars. - - * gnus-setup.el (gnus-use-tm): Removed. - - * gnus-art.el (gnus-article-goto-part): Don't beep. - (gnus-article-view-part): Check return value. - (gnus-mime-display-alternative): Don't display when there is - nothing to display. - - * mml.el (mml-generate-mime-1): Don't use a unibyte buffer. - (mml-generate-mime-1): Use unibyte for binaries. - - * gnus-art.el (gnus-display-mime): Call - gnus-article-mime-part-function. - (gnus-mime-part-function): New function. - (gnus-article-mime-part-function): New function. - - * mml.el (mml-generate-mime-1): Don't insert so many newlines. - -1998-11-16 06:44:19 Lars Magne Ingebrigtsen - - * mml.el (mml-generate-mime-1): Do it in unibyte buffers. - - * message.el (message-font-lock-keywords): Highlight MML. - (message-mml-face): New font. - -Mon Nov 16 23:34:12 1998 Shenghuo ZHU - - * gnus-art.el (gnus-display-mime): Clean up even when no handles. - (gnus-mm-display-part): Do not select-window if the article window - is not found. - -Mon Nov 16 02:26:40 1998 Shenghuo ZHU - - * gnus-sum.el (gnus-summary-move-article): Use no-encode for B m. - -Mon Nov 16 02:00:05 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.48 is released. - -1998-11-15 23:18:56 Lars Magne Ingebrigtsen - - * mm-bodies.el (mm-encode-body): Disbabled for nonmule. - - * mm-util.el (mm-find-charset-region): Bogus change for non-Mule. - - * message.el (message-cite-original-without-signature): Ditto. - (message-cite-original): Quote parts. - -Sun Nov 15 22:01:55 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.47 is released. - -1998-11-15 20:11:33 Lars Magne Ingebrigtsen - - * message.el (message-encode-message-body): Insert MIME warning. - - * mml.el (mml-read-tag): Look for #tag. - - * mm-util.el (mm-find-charset-region): Check whether - enable-multibyte-characters is bound. - -Sun Nov 15 02:01:31 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.46 is released. - -1998-11-15 01:54:40 Lars Magne Ingebrigtsen - - * message.el (message-encode-message-body): Insert headers at the - right spot. - -Sun Nov 15 01:13:41 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.45 is released. - -1998-11-15 00:28:49 Lars Magne Ingebrigtsen - - * nndraft.el (nndraft-save-mime-part): Removed. - (nndraft-get-mime-part): Ditto. - - * message.el (message-format-mime-old): Removed. - (message-encode-message-body): Removed. - (message-encode-message-body): Renamed. - -1998-11-14 18:27:19 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-get-newsgroup-headers): Translate \r's. - - * message.el (message-format-mime): Check message-mime-part. - - * mm-encode.el (mm-mime-file-types): Removed. - (mm-default-file-encoding): New definition. - -Sat Nov 14 01:29:39 1998 Shenghuo ZHU - - * mm-view.el (mm-inline-image): Use mm-insert-inline. - * gnus-art.el (gnus-mm-display-part): Go to correct position. - -Sat Nov 14 05:47:57 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.44 is released. - -1998-11-14 03:59:14 Lars Magne Ingebrigtsen - - * message.el (message-format-mime): New function. - - * nndraft.el (nndraft-save-mime-part): New function. - (nndraft-get-mime-part): New function. - - * mm-encode.el (mm-default-file-encoding): New function. - (mm-content-transfer-encoding): New function. - (mm-encode-buffer): New function. - - * message.el: New command. - (message-mime-part): New variable. - (message-insert-mime-part): New command. - - * mm-encode.el (mm-encode-content-transfer-encoding): New - function. - - * mm-util.el (mm-content-transfer-encoding-defaults): New - variable. - (mm-mime-file-types): Taken from TM. - -Sat Nov 14 01:51:06 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.43 is released. - -1998-11-07 Karl Kleinpaste - - * gnus-cus.el (gnus-score-customize): Add "Extra" element. - * gnus-score.el (gnus-score-default-header): Ditto. - (gnus-header-index): Ditto. - (gnus-summary-increase-score): Ditto, & process "extra" requests. - (gnus-summary-header): Handle extra headers. - (gnus-summary-score-entry): Ditto, & provide new score element. - (gnus-summary-score-effect): Ditto. - (gnus-score-string): Avoid "extra" string sort, & modify match in - "extra" case. - * gnus-sum.el (gnus-make-score-map): Add "extra" element. - -1998-11-13 20:30:40 Lars Magne Ingebrigtsen - - * message.el (message-resend): Bind message-required-mail-headers - to nil. - - * mm-view.el (mm-inline-text): Bind w3-strict-width. - - * nngateway.el (require): Require cl. - - * gnus-art.el (gnus-button-alist): Exclude more chars from news: - things. - -Wed Nov 11 02:15:06 1998 Shenghuo ZHU - - * gnus-agent.el (gnus-agent-fetch-headers): Create directory even - when no articles. - -1998-11-13 19:25:10 Lars Magne Ingebrigtsen - - * message.el (message-ignored-resent-headers): Remove X-Gnus. - -1998-11-10 Colin Rafferty - - * gnus-sum.el (gnus-ignored-from-addresses): Only quote - user-mail-address if non-nil. - -1998-11-13 18:50:18 Lars Magne Ingebrigtsen - - * gnus-util.el (gnus-make-sort-function): Do `reverse'. - (gnus-make-sort-function-1): Ditto. - - * gnus-art.el (gnus-mm-display-part): Switch to mm in right - window. - -1998-11-12 22:31:58 Lars Magne Ingebrigtsen - - * mm-util.el (mm-with-unibyte-buffer): Ditto. - - * binhex.el (binhex-decode-region): Quote. - -1998-11-10 05:32:28 Lars Magne Ingebrigtsen - - * gnus-art.el (article-decode-charset): Don't downcase charset. - - * gnus-sum.el (gnus-get-newsgroup-headers-xover): Translate CR's. - -Sun Nov 8 23:17:24 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.42 is released. - -Sun Nov 8 02:36:33 1998 Shenghuo ZHU - - * gnus-art.el (gnus-display-mime): Add id for alternative part. - -1998-11-08 02:24:47 Simon Josefsson - - * nntp.el (nntp-send-mode-reader): Revert. - -Sun Nov 8 00:45:13 1998 Shenghuo ZHU - - * gnus-agent.el (gnus-agent-fetch-articles): Use with-temp-buffer. - -Sat Nov 7 23:07:24 1998 Shenghuo ZHU - - * message.el (message-make-date): Fix for negative time zones. - -Sun Nov 8 01:00:16 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.41 is released. - -1998-11-08 00:52:38 Hrvoje Niksic - - * mm-decode.el (mm-dissect-multipart): Quote regexp. - -1998-10-29 Sudish Joseph - - * gnus.el (gnus-short-group-name): When shortening foreign select - methods, do not scan for plusses beyond the first colon. - -1998-11-07 Mike McEwan - - * gnus-agent.el (gnus-agent-save-group-info): Cater for group info - lines where `group' is the last thing on the line. - -1998-11-08 00:35:09 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-article-view-part): Do alternative. - (gnus-mime-display-alternative): Insert marker. - -1998-11-07 14:33:46 Lars Magne Ingebrigtsen - - * mm-decode.el (mm-dissect-multipart): Quote regexp. - - * nnmail.el (nnmail-expired-article-p): Protect against bogus - dates. - - * gnus-cus.el (gnus-topic): Required. - - * nnheader.el (nnheader-parse-nov): Parse extra. - (nnheader-nov-parse-extra): New macro. - -1998-10-31 12:33:22 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-article-view-part): Internal move. - -1998-10-28 Per Abrahamsen - - * gnus-cus-new.el (gnus-custom-topic): New free variable. - (gnus-group-customize): Support editing topic parameters. - -1998-10-29 12:09:20 Karl Kleinpaste - - * gnus-sum.el (gnus-summary-from-or-to-or-newsgroups): Add - indicators. - -1998-10-29 11:31:11 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-mm-display-part): Return. - (gnus-article-view-part): Only go if external. - (gnus-article-dumbquotes-map): Do 205. - - * mm-decode.el (mm-display-part): Return what was done. - - * message.el (message-buffer-naming-style): New variable. - (message-generate-new-buffers): Extended. - (message-buffer-naming-style): Removed. - (message-buffer-name): Use it. - (message-do-send-housekeeping): Rename new styling. - - * gnus-sum.el (gnus-summary-recenter): Allow - gnus-auto-center-summary to be a number. - -Wed Nov 4 02:24:39 1998 Shenghuo ZHU - - * pop3.el (pop3-open-server): Use "binary" instead of - "no-conversion". - -Sun Nov 1 01:26:42 1998 Shenghuo ZHU - - * gnus-srvr.el (gnus-browse-foreign-server): Set - gnus-browse-current-method to the result of gnus-server-to-method. - -Thu Oct 29 01:47:44 1998 Shenghuo ZHU - - * gnus-util.el (gnus-pull): Another optional argument. - * nnweb.el (nnweb-request-delete-group): Delete from - nnweb-group-alist and update active file. - -Thu Oct 29 01:05:08 1998 Shenghuo ZHU - - * gnus-group.el (gnus-group-make-group): Accept group of new - method. - -Wed Oct 28 02:19:16 1998 Shenghuo ZHU - - * gnus-agent.el (gnus-agent-fetch-group-1): Update dribble. - -Tue Oct 27 11:59:31 1998 Shenghuo ZHU - - * mm-view.el (mm-inline-text): Postion of html portion. - -1998-10-29 10:26:54 Lars Magne Ingebrigtsen - - * nntp.el (nntp-list-active-group): Waited for short strings. - (nntp-send-mode-reader): Ditto. - (nntp-open-connection): Ditto. - - * gnus-int.el (gnus-request-group-articles): New function. - - * nntp.el (nntp-request-listgroup): New function. - (nntp-request-group-articles): Renamed. - -1998-10-27 10:37:52 Karl Kleinpaste - - * nnheader.el (nnheader-parse-nov): Supply extra. - -1998-10-26 23:03:48 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-button-push): Don't go to - gnus-article-buffer. - - * mm-view.el (mm-inline-image): Add a newline. - - * gnus-start.el (gnus-check-first-time-used): Check more. - -1998-10-26 23:03:29 Francois Felix Ingrand - - * gnus-start.el (gnus-check-first-time-used): Check current. - -1998-10-26 22:07:52 Lars Magne Ingebrigtsen - - * mm-util.el (mm-find-charset-region): New function. - - * ietf-drums.el (ietf-drums-narrow-to-header): Work when no header. - - * gnus-art.el (gnus-mime-button-menu): Fix. - -1998-10-26 22:07:43 Michael Welsh Duggan - - * gnus-art.el (gnus-mime-button-menu): New definition. - -1998-10-26 01:46:11 Lars Magne Ingebrigtsen - - * gnus-art.el (article-decode-charset): Downcase charset. - (article-decode-charset): Pass on type. - (article-decode-charset): Check nil charsets. - (article-remove-cr): Translate CR to LF. - (gnus-ignored-mime-types): Default to nil. - - * nnheader.el (nnheader-insert-nov): Work when not Xref. - - * gnus-sum.el (gnus-ignored-from-addresses): Default to - user-mail-address. - (gnus-nov-parse-extra): Didn't return right thing. - -1998-10-25 23:25:27 Lars Magne Ingebrigtsen - - * gnus-xmas.el: Use compiled-function-p. - -Mon Oct 26 14:37:19 1998 Shenghuo ZHU - - * mm-decode.el (mm-copy-Yo-buffer): Make it works when no header. - -Sun Oct 25 23:11:44 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.40 is released. - -1998-10-25 21:41:05 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-summary-mark-forward): Show thread. - - * gnus-start.el (gnus-check-first-time-used): Ignore dribble. - - * gnus-agent.el (gnus-agent-fetch-group-1): Bind name. - - * nnml.el (nnml-possibly-create-directory): Check before making. - -1998-10-25 19:43:08 Kai Grossjohann - - * nnheader.el (nnheader-insert-nov): Don't infloop. - -1998-10-25 19:26:11 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-set-mode-line): Check that the spec has been - set up. - -1998-10-25 19:22:03 Joerg Lenneis - - * nneething.el (nneething-file-name): New definition. - -1998-10-25 17:56:23 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-treatment-function-alist): Fix. - (gnus-summary-save-in-rmail): Use gnus-output-to-rmail. - - * nndoc.el (nndoc-dissect-mime-parts-sub): Recognize first part. - -Sun Oct 25 06:23:13 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.39 is released. - -1998-10-25 00:34:39 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-ignored-mime-types): New variable. - (gnus-mime-display-single): Use it. - (gnus-treatment-function-alist): New variable. - - * gnus.el (gnus-mime): New group. - - * gnus-art.el (gnus-mime-display-alternative): Don't destroy - things for other parts. - (gnus-mime-display-alternative): Place point. - - * gnus.el: autoload gnus-uu-post-news. - - * mailcap.el (mailcap-mailcap-entry-passes-test): Also check - needsterm/DISPLAY. - - * mm-decode.el (mm-display-part): Default to inline text/.* - parts. - - * mm-bodies.el (mm-decode-content-transfer-encoding): Default to - 8bit. - - * gnus-art.el (gnus-mime-copy-part): Use normal-mode. - (gnus-mime-display-single): Inline all text parts. - (gnus-article-narrow-to-signature): Removed mime:: stubs. - -1998-10-24 21:38:37 Lars Magne Ingebrigtsen - - * nnml.el (nnml-possibly-create-directory): Rewrite. - (nnml-request-create-group): Change to right server. - - * gnus-xmas.el (gnus-xmas-define): Use byte-code-function-p. - - * gnus-sum.el (gnus-set-mode-line): Use truncate-string-to-width. - - * gnus.el: rmail-output-to-rmail-file autoload. - - * gnus-util.el (gnus-output-to-rmail): Didn't work if not in - Gnus. - - * nnheader.el (nnheader-parse-head): Checked wrong variable. - - * gnus-sum.el (gnus-summary-update-mark): Ignore nil'd marks. - -Tue Oct 20 23:37:43 1998 Shenghuo ZHU - - * gnus-art.el (gnus-mime-display-mixed): Multipart in - mixed part. - -Tue Oct 20 23:36:43 1998 Shenghuo ZHU - - * gnus-sum.el (gnus-summary-exit): Use mm-destroy-parts. - - * gnus-sum.el (gnus-summary-exit-no-update): Ditto. - -Tue Oct 20 16:22:51 1998 Shenghuo ZHU - - * mm-uu.el (mm-uu-dissect): Create pseudo multipart head. - -1998-10-24 20:51:53 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-valid-move-group-p): Make sure group has a - value. - - * gnus-art.el (gnus-article-hidden-text-p): Return nil when not - hidden. - - * gnus-spec.el (gnus-update-format-specifications): Use the - article mode line spec. - - * gnus-art.el (gnus-insert-mime-button): Put right type. - (gnus-insert-prev-page-button): Ditto. - (gnus-insert-next-page-button): Dutti. - - * pop3.el: New version installed. - -Sat Oct 24 16:48:51 1998 Shenghuo ZHU - - * mm-uu.el (mm-uu-dissect): Delete the begining spurious newline - and display last part. - -Sat Oct 24 20:31:55 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.38 is released. - -1998-10-24 07:54:58 Lars Magne Ingebrigtsen - - * gnus-art.el (article-mime-decode-quoted-printable-buffer): - Removed. - (article-de-quoted-unreadable): Narrow to default. - - * qp.el (quoted-printable-encode-region): Encode before QP-ing. - - * gnus-art.el (article-decode-charset): Decode even when broken - MIME. - - * gnus-sum.el (gnus-summary-from-or-to-or-newsgroups): Return - name. - - * gnus-msg.el (gnus-copy-article-buffer): Delete headers. - - * gnus-cache.el (gnus-cache-possibly-enter-article): Use - nnheader. - - * nnmail.el (nnmail-extra-headers): New variable. - - * nnheader.el (nnheader-insert-nov): Insert extra. - - * gnus.el (gnus-summary-line-format): Doc fix. - - * gnus-sum.el (gnus-get-newsgroup-headers): Parse extra. - (gnus-nov-parse-line): Ditto. - (gnus-nov-parse-extra): New macro. - (gnus-header): New function. - (gnus-update-summary-mark-positions): Change. - (gnus-ignored-from-addresses): New variable. - (gnus-summary-insert-from-or-to): New function. - - * gnus.el (gnus-extra-headers): New variable. - - * nnheader.el (make-mail-header): Expand. - (mail-header-extra): New macro. - (mail-header-set-extra): Ditto. - (make-full-mail-header): Expand. - -Sat Oct 24 07:41:42 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.37 is released. - -1998-10-24 07:29:11 Lars Magne Ingebrigtsen - - * mm-bodies.el (mm-decode-body): Check for multibyticity. - - * mm-util.el (mm-enable-multibyte): Don't always switch multibyte - on. - -1998-10-22 Didier Verna - - * gnus-spec.el (gnus-balloon-face-function): new function - (gnus-parse-format): understand the %< %> specifiers - (gnus-parse-complex-format): ditto. - -1998-10-24 06:31:33 Lars Magne Ingebrigtsen - - * gnus.el: Changed following-char to char-after throughout. - -1998-10-22 04:05:55 Lars Magne Ingebrigtsen - - * mm-decode.el (mm-display-external): Protect more and message. - -Wed Oct 21 03:26:30 1998 Shenghuo ZHU - - * gnus-xmas.el (gnus-xmas-article-push-button): Go to the - position. - -Tue Oct 20 23:37:43 1998 Shenghuo ZHU - - * gnus-art.el (gnus-mime-display-mixed): Multipart in - mixed part. - -Tue Oct 20 23:36:43 1998 Shenghuo ZHU - - * gnus-sum.el (gnus-summary-exit): Use mm-destroy-parts. - - * gnus-sum.el (gnus-summary-exit-no-update): Ditto. - -Tue Oct 20 16:22:51 1998 Shenghuo ZHU - - * mm-uu.el (mm-uu-dissect): Create pseudo multipart head. - -1998-10-21 Hrvoje Niksic - - * mailcap.el (mailcap-save-binary-file): Use unwind-protect. - - * mm-decode.el (mm-display-external): Set undisplayer to mm - buffer, not the current buffer; use unwind-protect. - -1998-10-21 00:07:59 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-summary-exit): Destroy parts. - (gnus-summary-exit-no-update): Ditto. - -1998-10-20 22:02:05 Lars Magne Ingebrigtsen - - * mm-decode.el (mm-inline-media-tests): Look for w3. - - * mailcap.el (mailcap-mime-data): Inline html. - -Tue Oct 20 20:25:03 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.36 is released. - -1998-10-20 18:13:08 Lars Magne Ingebrigtsen - - * gnus-art.el (article-translate-strings): - (gnus-article-dumbquotes-map): Don't dot. - - * pop3.el (pop3-open-server): Set point right. - - * mm-decode.el (mm-dissect-multipart): Dissect hierarchically. - (mm-dissect-buffer): Ditto. - (mm-destroy-part): Ignore non-handles. - (mm-remove-part): Ditto. - (mm-destroy-parts): New function. - (mm-remove-parts): Ditto. - - * gnus-art.el (gnus-mm-display-part): Don't move point. - -Tue Oct 20 02:16:36 1998 Shenghuo ZHU - - * mm-uu.el : New file. - - * gnus-art.el (gnus-display-mime): Dissect uu stuffs. - - * mm-bodies.el (mm-decode-content-transfer-encoding): Encoding as - a function. - -1998-10-20 00:35:05 Lars Magne Ingebrigtsen - - * mm-decode.el (mm-display-external): Check before selecting. - -Sat Sep 26 02:03:00 1998 Shenghuo ZHU - - * gnus-sum.el (gnus-multi-decode-encoded-word-string): Rewrite. - - * gnus-sum.el (gnus-decode-encoded-word-methods): New variable. - - * gnus-sum.el (gnus-decode-encoded-word-methods-cache): New - variable. - - * gnus-sum.el (gnus-encoded-word-method-alist): Deleted. - - * gnus-art.el (gnus-decode-header-methods): New variable. - - * gnus-art.el (gnus-decode-header-methods-cache): New variable. - - * gnus-art.el (gnus-multi-decode-header): New function. - -Tue Oct 20 00:24:16 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.35 is released. - -1998-10-20 00:00:36 Lars Magne Ingebrigtsen - - * uudecode.el (uudecode-decode-region-external): Insert - literally. - - * gnus-xmas.el (gnus-xmas-mime-button-menu): Moved here. - - * mm-bodies.el (mm-decode-body): Optional encoding. - -1998-10-19 23:57:57 Lars Magne Ingebrigtsen - - * gnus-ems.el (gnus-mouse-3): New variable. - - * binhex.el (binhex-decode-region-external): Don't use -internally. - -1998-10-16 14:54:02 Simon Josefsson - - * mailcap.el (mailcap-parse-mailcaps): Only open regular - files. - -1998-09-26 22:28:01 Simon Josefsson - - * gnus-group.el (gnus-add-marked-articles): Request backend update - of flags. - -1998-09-26 19:39:31 Simon Josefsson - - * gnus-sum.el (gnus-update-read-articles): - (gnus-update-marks): Request backend update of mark. - -1998-09-26 19:33:58 Simon Josefsson - - * gnus.texi (Optional Backend Functions): New item, - nnchoke-request-set-mark. - -1998-09-26 16:27:27 Simon Josefsson - - * gnus-range.el (gnus-remove-from-range): Don't add stuff in - list to range. - -1998-10-19 23:45:13 Simon Josefsson - - * gnus-sum.el (gnus-summary-exit-no-update): Don't expire. - -1998-10-14 SL Baur - - * gnus-sum.el: Move gnus-save-hidden-threads above where it is - first used. - -1998-10-10 SL Baur - - * mm-view.el: Require mm-decode for macros. - - * mm-decode.el (mm-handle-type): Move macro declarations above the - place where they are used. - -Sun Oct 18 13:59:07 1998 Kurt Swanson - - * gnus-msg.el (gnus-summary-mail-forward): Erase old forward - buffer. - -1998-10-19 23:38:11 Katsumi Yamaoka - - * nnagent.el (nnagent-open-server): Error message. - -1998-10-19 23:35:08 Joerg Lenneis - - * nnheader.el (nnheader-article-p): Recognize lower-case headers. - -1998-10-19 Hrvoje Niksic - - * score-mode.el (gnus-score-mode-map): Ditto. - - * message.el (message-mode-map): Ditto. - - * gnus-uu.el (gnus-uu-post-news): Ditto. - - * gnus-kill.el (gnus-kill-file-mode-map): Ditto. - - * gnus-eform.el (gnus-edit-form-mode-map): Ditto. - - * gnus-art.el (gnus-article-edit-mode-map): Use - `set-keymap-parent' rather than `copy-keymap'. - -1998-10-18 Hrvoje Niksic - - * gnus-art.el (gnus-mime-button-commands): New variable. - (gnus-mime-button-map): Initialize it from - `gnus-mime-button-commands'. - (gnus-mime-button-menu): New function. - (gnus-insert-mime-button): Use `gnus-mime-button-map'. - -1998-10-11 Hrvoje Niksic - - * message.el (message-insert-to): Make `nobody' and `poster' - synonymous to `never' and `always' in Mail-Copies-To. - (message-reply): Ditto. - (message-followup): Ditto. - -1998-10-19 23:17:41 Lars Magne Ingebrigtsen - - * mailcap.el (mailcap-mime-data): Save sound. - -1998-09-24 Hrvoje Niksic - - * message.el (message-ignored-supersedes-headers): Include - `NNTP-Posting-Date'. - -1998-10-19 01:25:27 Jonas Steverud - - * gnus-art.el (gnus-article-dumbquotes-table): New variable. - -1998-10-19 00:50:22 Lars Magne Ingebrigtsen - - * mm-bodies.el (mm-decode-content-transfer-encoding): Use - uudecode. - -1998-10-18 18:20:34 Lars Magne Ingebrigtsen - - * mm-decode.el (mm-display-external): Don't switch on save. - -1998-10-18 18:14:06 Andy Piper - - * nnmail.el (nnmail-movemail-args): New variable. - -1998-10-18 00:17:02 Lars Magne Ingebrigtsen - - * gnus-art.el (article-translate-strings): - -1998-10-17 22:51:31 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-article-view-part): Use it. - (gnus-mm-display-part): New function. - (article-de-quoted-unreadable): Yse mm-default-coding-system. - - * mm-decode.el (mm-handle-displayed-p): New function. - - * gnus-art.el (gnus-mime-copy-part): Create better names. - (gnus-mime-button-line-format): Include dots spec. - -1998-10-15 Matt Pharr - - * gnus-msg.el (gnus-summary-mail-forward): Erase contents of old - forward buffer first. - -1998-10-17 21:16:46 Lars Magne Ingebrigtsen - - * gnus-util.el (gnus-set-window-start): New function. - - * message.el (message-send): Don't check changed. - -1998-10-12 15:26:41 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-article-setup-buffer): Set params. - - * mm-decode.el (mm-user-display-methods): Inline - "message/delivery-status". - -1998-10-11 07:06:38 Lars Magne Ingebrigtsen - - * message.el (message-auto-save-directory): Rename. - (message-mode): Dof fix. - - * gnus-art.el (gnus-summary-save-in-pipe): Default to "cat". - (gnus-summary-save-in-pipe): No, check gnus-last-shell-command. - - * nndoc.el (nndoc-mime-parts-type-p): Be a bit more forgiving. - - * message.el (message-make-date): Avoid locale. - - * gnus-art.el (gnus-article-edit-done): Allow update before doing - cache. - - * mm-decode.el (mm-display-inline): Goto point-min. - - * gnus-art.el (gnus-article-prepare-display): Not read-only. - - * mm-decode.el (mm-display-external): Reverse before sorting. - - * gnus-draft.el (gnus-draft-send): Allow mail. - -1998-10-10 -SL Baur - - * message.el (message-check): Move message-check macro above where - it is first used. - - * gnus-art.el (article-hide-pgp): Hide the PGP 5/GNUPG Hash: line. - -1998-10-11 06:45:37 Lloyd Zusman - - * gnus-sum.el (gnus-summary-make-menu-bar): Fix. - -Sun Oct 11 02:28:40 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.34 is released. - -1998-10-11 02:15:41 Lars Magne Ingebrigtsen - - * mm-decode.el (mm-inline-media-tests): delivery-status. - - * mm-view.el (mm-inline-text): Provide default. - -1998-10-11 01:01:37 Lloyd Zusman - - * mailcap.el (mailcap-possible-viewers): Fix nils. - -1998-10-11 00:03:37 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-article-edit-exit): Don't do updates. - (article-update-date-lapsed): Record the buffer. - (article-update-date-lapsed): Do all windows that display article - buffers. - - * nnml.el (nnml-generate-nov-databases-1): Ditto. - - * gnus-score.el (gnus-score-score-files-1): Ignore dotted files. - - * gnus-art.el (gnus-insert-mime-button): Mark buttons as - annoations. - - * gnus-msg.el (gnus-summary-mail-forward): Decode properly. - -1998-10-10 22:07:03 Lars Magne Ingebrigtsen - - * gnus-agent.el (gnus-category-add): Change default category to - 'false. - - * nnvirtual.el (nnvirtual-update-read-and-marked): Don't nix out - scores. - - * gnus-draft.el (gnus-draft-send): Check server more. - - * gnus-art.el (gnus-article-view-part): New command and keystroke. - (gnus-article-goto-part): New function. - - * mm-view.el (mm-inline-text): Insert richtext properly. - - * gnus-art.el (gnus-insert-mime-button): Store handle in alist. - -1998-10-03 15:04:27 Lars Magne Ingebrigtsen - - * parse-time.el (parse-time-rules): Accept dates far into the past - and the future, and parse single-digit numbers as years. - -1998-10-02 04:46:46 Lars Magne Ingebrigtsen - - * mm-decode.el (mm-display-external): Chop off directories. - -1998-10-01 07:33:35 Lars Magne Ingebrigtsen - - * uudecode.el (uu-decode-region-external): Use - insert-file-contents-literally. - - * gnus-cache.el (gnus-cache-generate-active): Translate _ to :. - -1998-10-01 07:02:11 Shenghuo ZHU - - * uudecode.el: New file. - - * mm-bodies.el (mm-decode-content-transfer-encoding): Do - x-uuencode. - -1998-10-01 05:19:35 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-mime-display-alternative): Set faces. - - * message.el (message-fetch-field): Unfold properly. - - * mm-bodies.el (mm-decode-content-transfer-encoding): Replace CRLF - in text/plain. - -1998-09-30 05:47:49 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-summary-first-unread-subject): New command. - (gnus-auto-select-first): Removed. - (gnus-auto-select-first): Extended. - (gnus-summary-read-group-1): Use new value. - -1998-09-29 13:21:06 Lars Magne Ingebrigtsen - - * message.el (message-fix-before-sending): Space. - - * nnmail.el (nnmail-find-file): Don't erase. - -Wed Sep 30 23:49:03 1998 Shenghuo ZHU - - * gnus-agent.el (gnus-agent-fetch-headers): Do not decode headers. - -Wed Sep 30 23:46:29 1998 Shenghuo ZHU - - * gnus-soup.el (gnus-soup-add-article): Do not decode headers. - -Wed Sep 30 23:44:08 1998 Shenghuo ZHU - - * gnus-soup.el (gnus-soup-pack-packet): Pack only if necesary. - -Sat Sep 26 03:04:18 1998 Shenghuo ZHU - - * mm-util.el (mm-with-unibyte-buffer): Make it work in XEmacs - 20.4. - -1998-09-29 11:35:09 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-mime-view-all-parts): New command and - keystroke. - - * mm-decode.el (mm-display-external): Translate slashes. - - * nnmail.el (nnmail-find-file): Restrict auto-mode-alist. - - * nndraft.el (nndraft-retrieve-headers): Don't copy so much. - - * mm-decode.el (mm-quote-arg): Quote spaces. - (mm-display-external): Quote args. - -1998-09-24 22:27:55 Lars Magne Ingebrigtsen - - * mm-decode.el (mm-inlinable-part-p): New function. - -1998-09-25 22:28:01 Simon Josefsson - - * mm-util.el (mm-disable-multibyte): New function. - -Thu Sep 24 20:28:31 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.33 is released. - -1998-09-24 18:47:31 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-insert-mime-button): Get buffer size. - - * mm-decode.el (mm-display-external): Don't switch for externals. - (mm-dissect-multipart): Don't include end-sep. - - * mm-util.el (mm-get-coding-system-list): New function. - (mm-coding-system-list): New variable. - -Thu Sep 24 02:08:10 1998 ZHU Shenghuo - - * gnus-cus.el (gnus-group-parameters): Add charset as a parameter - -Thu Sep 24 02:05:48 1998 ZHU Shenghuo - - * gnus-cus.el (gnus-group-customize): Use variable as cons not as - group - -Thu Sep 24 01:41:03 1998 ZHU Shenghuo - - * base64.el (base64-run-command-on-region): External base64 - decoder do not use coding system - -Thu Sep 24 01:39:44 1998 ZHU Shenghuo - - * mm-decode.el (mm-interactively-view-part): Typo. - -Thu Sep 24 01:37:30 1998 ZHU Shenghuo - - * mm-decode.el (mm-dissect-multipart): Display last part when the - article has no close-delimiter - -Thu Sep 24 01:28:54 1998 ZHU Shenghuo - - * mm-decode.el (mm-dissect-buffer): Display parts which have no - content-type. - -Thu Sep 24 01:23:57 1998 ZHU Shenghuo - - * gnus-art.el (gnus-display-mime): Typo. - -Thu Sep 24 02:29:57 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.32 is released. - -1998-09-24 00:27:11 Lars Magne Ingebrigtsen - - * gnus-kill.el (gnus-batch-score): Protect against errors. - - * gnus-art.el: Protect against broken headers. - - * mm-decode.el (mm-display-external): Respect needsterm. - (mm-display-external): Create buffer for external commands. - -1998-09-23 22:04:05 Lars Magne Ingebrigtsen - - * mailcap.el (mailcap-mime-info): Return the proper viewer. - - * mm-decode.el (mm-display-external): Use file name. - -1998-09-22 Markus Rost - - * gnus-util.el (gnus-output-to-rmail): adjust to - `rmail-output-to-rmail-file' - -1998-09-23 20:07:00 Lars Magne Ingebrigtsen - - * gnus-util.el (gnus-output-to-rmail): Reinstated function. - - * gnus-sum.el (gnus-select-newsgroup): Set global variables before - headers. - - * gnus-art.el (article-decode-charset): Fold case. - -1998-09-17 15:49:10 Simon Josefsson - - * mailcap.el (mailcap-save-binary-file): Goto point-min. - -1998-09-23 19:48:52 Aaron M. Ucko - - * nnmail.el (nnmail-check-duplication): Enter into duplicate list - after being stored. - -Tue Sep 15 16:15:16 1998 Kurt Swanson - - * gnus-salt.el (gnus-pick-setup-message): Return from whence ye - come. - -1998-09-23 19:42:03 Lars Magne Ingebrigtsen - - * gnus-xmas.el (wid-edit): Required. - - * gnus-ems.el (gnus-widget-button-keymap): New variable. - -Sun Sep 20 00:27:55 1998 ZHU Shenghuo - - * gnus-art.el (gnus-mime-inline-part): remove part if necessary - -1998-09-23 19:30:52 Matt Armstrong - - * gnus-art.el (article-decode-charset): Narrow to the correct - region. - - * mm-bodies.el: Fix autoload. - -1998-09-22 18:35:12 Lee Willis - - * gnus-art.el (gnus-mime-button-line-format): Doc fix. - -1998-09-22 14:53:35 Lars Magne Ingebrigtsen - - * rfc2047.el (rfc2047-decode): Use rfc2047-default-charset. - -1998-09-19 13:58:35 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-insert-mime-button): Specify keymap. - (gnus-article-add-button): Ditto. - - * gnus-sum.el (gnus-summary-insert-pseudos): Use mm. - - * gnus-art.el (gnus-article-prepare-display): Make article mode. - (gnus-article-prepare-display): Bind url-standalone-mode. - - * mm-decode.el (mm-remove-part): Also delete directory. - (mm-display-external): Create a private sub-dir. - - * mailcap.el (mailcap-binary-suffixes): New variable. - (mailcap-command-p): Use it. - -1998-09-16 10:38:21 Lars Magne Ingebrigtsen - - * nnmbox.el (nnmbox-request-group): Change server. - (nnmbox-possibly-change-newsgroup): Enable multibyte. - - * message.el (message-encode-message-body): Don't stomp MIME - headers. - - * gnus-sum.el (gnus-summary-edit-article-done): Don't encode - unless useful. - (gnus-summary-exit): Check for a live article buffer. - (gnus-summary-exit-no-update): Ditto. - - * gnus-int.el (gnus-request-replace-article): Accept no-encode - param. - - * gnus-sum.el (gnus-article-decoded-p): New variable. - - * mm-decode.el (mm-display-external): Use no-conv. - - * rfc2047.el (rfc2047-q-encode-region): Bound properly. - (rfc2047-charset-encoding-alist): Use B encoding for koi8-r. - - * gnus-art.el (gnus-article-mode-map): Bind button2 to - mouse-click. - -1998-09-15 14:38:02 Lars Magne Ingebrigtsen - - * gnus-agent.el (gnus-agent-expire): Protect against nil infos. - -Mon Sep 14 18:55:38 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.31 is released. - -1998-09-14 15:12:59 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-summary-exit): Destroy MIME. - - * mm-decode.el (mm-display-part): Accept no-default. - - * gnus-art.el (gnus-insert-mime-button): buffer-size doesn't take - a parameter. - - * gnus-sum.el (gnus-summary-insert-line): Don't exclude faces. - (gnus-summary-prepare-threads): Ditto. - - * gnus.el (gnus-article-mode-map): Make sparse keymap. - - * gnus-art.el (gnus-mime-button-line-format-alist): Allow a %d spec. - (gnus-mime-button-line-format): Doc fix. - (gnus-insert-mime-button): Use it. - (gnus-article-add-button): Use widget-convert-button. - - * gnus.el ((featurep 'gnus-xmas)): Defalias gnus-decode-rfc1522 to - ignore. - - * mm-decode.el (mm-alternative-precedence): Ditto. - -1998-09-14 15:12:49 Conrad Sauerwald - - * mm-decode.el (mm-user-automatic-display): Use enriched. - -1998-09-14 15:09:12 Paul Fisher - - * mm-decode.el (mm-dissect-multipart): Have the part start on the - right place. - -1998-09-14 14:33:34 Lars Magne Ingebrigtsen - - * gnus-msg.el (gnus-inews-add-send-actions): Mark silently. - - * gnus-art.el (article-update-date-lapsed): Only update header if - buffer is dispalyed in frame. - (gnus-article-prepare-display): New function. - (gnus-article-prepare): Use it. - -1998-09-14 08:16:43 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-mime-inline-part): New command and keystroke. - - * mm-view.el (mm-insert-inline): New function. - - * mm-decode.el (mm-pipe-part): Bugged. - - * gnus-agent.el (gnus-agent-send-mail): Don't encode. - - * mm-bodies.el (mm-encode-body): Move over the body. - - * nnmbox.el (nnmbox-read-mbox): Enable multibyte. - - * rfc2047.el (rfc2047-q-encode-region): Would bug out. - -1998-09-13 Francois Pinard - - * nndoc.el: Make nndoc-dissection-alist simpler for MIME, adjust all - related functions. Handle message/rfc822 parts. Display subject on - multipart summary lines. Display name on sub-parts when available. - -1998-09-14 07:36:38 Hallvard B. Furuseth - - * mailcap.el (mailcap-command-p): New version. - -1998-09-13 Mike McEwan - - * gnus-agent.el (gnus-agent-expire): Stop expiry barfing on killed - groups. - -1998-09-13 18:34:06 Lars Magne Ingebrigtsen - - * message.el (message-make-date): Remove weekday name. - - * mm-decode.el (mm-dissect-buffer): Protect against broken - headers. - - * mailcap.el (mailcap-command-in-path-p): New function. - (mailcap-command-p): Renamed. - -1998-09-13 17:58:47 Hallvard B. Furuseth - - * rfc2047.el (eval): Autoload. - -1998-09-13 12:22:40 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-decode-encoded-word-functions): New variable. - (gnus-multi-decode-encoded-word-string): New function. - (gnus-encoded-word-method-alist): New variable. - (gnus-decode-encoded-word-functions): Removed. - -1998-09-13 Shenghuo ZHU - - * gnus-int.el (gnus-request-replace-article): Replace - message-narrow-to-headers with message-narrow-to-head - -1998-09-13 12:05:41 Lars Magne Ingebrigtsen - - * drums.el (drums-quote-string): Reversed match. - - * message.el (message-make-date): Use weekday name. - -Sun Sep 11 10:27:15 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.30 is released. - -1998-09-13 08:00:41 Lars Magne Ingebrigtsen - - * gnus-art.el (article-decode-encoded-words): Use it. - (gnus-decode-header-function): New variable. - - * gnus-sum.el (gnus-nov-parse-line): Use it. - (gnus-decode-encoded-word-function): New variable. - - * gnus-msg.el (gnus-copy-article-buffer): Decode the right - buffer. - - * gnus-art.el (gnus-insert-mime-button): Use widget. - (gnus-widget-press-button): New function. - (gnus-article-prev-button): Removed. - (gnus-article-next-button): Ditto. - (gnus-article-add-button): Ditto. - - * gnus.el (gnus-article-mode-map): Inherit from widget. - (gnus-article-mode-map): No, don't. - - * mm-decode.el (mm-dissect-buffer): Store Content-ID things. - (mm-content-id-alist): New variable. - (mm-get-content-id): New function. - - * gnus-art.el (gnus-request-article-this-buffer): Only decode - articles if we are fetching to the article buffer. - -1998-09-13 07:58:59 Shenghuo ZHU - - * gnus-sum.el (gnus-summary-move-article): Don't decode accepting - articles. - -1998-09-13 07:23:28 Lars Magne Ingebrigtsen - - * mm-util.el (mm-mime-charset): Try to use safe-charsets. - (mm-default-mime-charset): New variable. - - * rfc2047.el (rfc2047-dissect-region): Dissect using tspecials. - - * drums.el (drums-quote-string): Reversed test. - -1998-09-12 14:29:21 Lars Magne Ingebrigtsen - - * mm-util.el (mm-insert-rfc822-headers): Possibly not quote - string. - - * drums.el (drums-quote-string): New function. - - * rfc2047.el (rfc2047-encode-message-header): Goto point-min. - (rfc2047-b-encode-region): Chop lines. - (rfc2047-q-encode-region): Ditto. - -Sat Sep 12 13:27:15 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.29 is released. - -1998-09-12 12:46:30 Istvan Marko - - * mm-decode.el (mm-save-part): Message right. - -1998-09-12 11:30:01 Lars Magne Ingebrigtsen - - * drums.el (drums-parse-address): Returned a list instead of a - string. - (drums-remove-whitespace): Skip comments. - (drums-parse-addresses): Didn't work. - -Sat Sep 12 09:17:30 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.28 is released. - -1998-09-12 04:57:25 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-mime-button-map): Use the article keymap as a - starting point. - (article-decode-encoded-words): Rename. - - * message.el (message-narrow-to-headers-or-head): New function. - - * gnus-int.el (gnus-request-accept-article): Narrow to the right - region. - - * message.el (message-send-news): Encode body after checking - syntax. - - * gnus-art.el (gnus-mime-button-line-format): Allow descriptions. - - * mm-decode.el (mm-save-part): Use Content-Disposition filename. - - * gnus-art.el (gnus-display-mime): Respect disposition. - - * mm-decode.el (mm-preferred-alternative): Respect disposition. - - * gnus-art.el (article-strip-multiple-blank-lines): Don't delete - text with annotations. - - * message.el (message-make-date): Fix sign for negative time - zones. - - * mm-view.el (mm-inline-image): Insert a space at the end of the - image. - - * mail-parse.el: New file. - - * rfc2231.el: New file. - - * drums.el (drums-content-type-get): Removed. - (drums-parse-content-type): Ditto. - - * mailcap.el (mailcap-mime-data): Use symbols instead of strings. - -Fri Sep 11 18:23:34 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.27 is released. - -1998-09-11 12:42:07 Lars Magne Ingebrigtsen- - - * mm-decode.el (mm-alternative-precedence): New variable. - (mm-preferred-alternative): New function. - - * gnus-art.el (gnus-mime-copy-part): New command. - - * mm-decode.el (mm-get-part): New function. - - * mm-view.el: New file. - - * mm-decode.el (mm-dissect-buffer): Downcase cte. - (mm-display-part): Default to mailcap-save-binary-file. - -Fri Sep 11 12:32:50 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.26 is released. - -1998-09-11 08:25:33 Lars Magne Ingebrigtsen - - * mm-decode.el (mm-interactively-view-part): New function. - - * gnus-art.el (gnus-mime-view-part): New command. - - * mm-decode.el (mm-last-shell-command): New variable. - - * mailcap.el (mailcap-mime-info): Allow returning all matches. - - * mm-decode.el (mm-save-part): New function. - - * gnus-art.el (article-decode-charset): Protect against buggy - content-types. - (gnus-mime-pipe-part): New command. - (gnus-mime-save-part): New command. - (gnus-mime-button-map): New keymap. - (gnus-mime-button-line-format): New variable. - (gnus-insert-mime-button): New function. - (gnus-display-mime): Use it. - - * gnus-util.el (gnus-dd-mmm): Removed length spec. - - * mm-decode.el (mm-inline-text): Decode charsets. - - * gnus-art.el (gnus-article-save): Comment fix. - - * gnus-int.el (gnus-start-news-server): When in batch, don't - prompt. - - * gnus-cache.el (gnus-cache-possibly-enter-article): Don't - decode. - - * mm-decode.el (mm-inline-media-tests): Add audio. - (mm-inline-audio): New function. - -1998-09-11 08:19:22 Katsumi Yamaoka - - * gnus-art.el (article-make-date-line): Didn't work. - - * parse-time.el (parse-time-string): One too many nils. - -Fri Sep 11 08:09:40 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.25 is released. - -1998-09-11 07:38:14 Lars Magne Ingebrigtsen - - * gnus-art.el (article-remove-trailing-blank-lines): Don't remove - annotations. - - * gnus.el ((featurep 'gnus-xmas)): New - 'gnus-annotation-in-region-p alias. - -1998-09-10 06:20:52 Lars Magne Ingebrigtsen - - * mm-util.el (mm-with-unibyte-buffer): New function. - - * gnus-uu.el (gnus-quote-arg-for-sh-or-csh): Renamed. - - * mm-decode.el (mm-inline-media-tests): New variable. - - * gnus-sum.el (gnus-summary-exit): Destroy handles. - - * gnus-art.el (gnus-article-mime-handles): New variable. - - * drums.el (drums-narrow-to-header): New function. - - * gnus-art.el (article-decode-charset): Use it. - - * drums.el (drums-content-type-get): New function. - - * mm-util.el (mm-content-type-charset): Removed. - - * drums.el (drums-syntax-table): @ is word. - (drums-parse-content-type): New function. - - * parse-time.el (parse-time-rules): Parse "Wed, 29 Apr 98 0:26:01 - EDT" times. - - * gnus-util.el (gnus-date-get-time): Use safe date. - - * gnus-sum.el (gnus-show-mime): Removed. - (gnus-summary-toggle-mime): Removed. - - * gnus-art.el (gnus-strict-mime): Removed. - (gnus-article-prepare): Don't do MIME. - (gnus-decode-encoded-word-method): Removed. - (gnus-show-mime-method): Removed. - -Thu Sep 10 04:03:29 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.24 is released. - -1998-09-10 01:58:24 Lars Magne Ingebrigtsen - - * gnus-sum.el (gnus-summary-show-article): Don't decode chars if - PREFIX. - - * parse-time.el (parse-time-rules): Accept times that look like - "h:mm". - - * message.el (message-make-date): Use zone properly. - - * gnus.el: Autoload gnus-batch. - - * gnus-art.el (article-de-quoted-unreadable): Do not do - gnus-article-decode-rfc1522. - - * gnus-msg.el (gnus-inews-do-gcc): Use it. - - * gnus-int.el (gnus-request-accept-article): Accept a no-encode - param. - - * message.el (message-encode-message-body): Check for us-ascii. - - * gnus-msg.el (gnus-extended-version): Move Gnus version comments - to the left. - -1998-09-09 13:18:13 Lars Magne Ingebrigtsen - - * gnus-art.el (article-decode-charset): Rename. - -Wed Sep 9 12:25:48 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.23 is released. - -1998-09-09 12:14:47 Lars Magne Ingebrigtsen - - * gnus-util.el (gnus-parent-id): Ditto. - (gnus-put-text-property-excluding-newlines): Ditto. - - * gnus-sum.el (gnus-dependencies-add-header): Make into subst. - -1998-09-08 Karl Kleinpaste - - * message.el (message-generate-headers): Generate User-Agent - instead of X-Mailer & X-Newsreader. - - * gnus-msg.el (gnus-extended-version): Reformat for USEFOR - User-Agent header format. - -Tue Sep 8 22:38:27 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.22 is released. - -1998-09-08 22:36:54 Lars Magne Ingebrigtsen - - * mm-util.el (mm-multibyte-p): Typo. - -Tue Sep 8 22:25:53 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.21 is released. - -1998-09-08 Hrvoje Niksic - - * gnus-art.el (article-treat-dumbquotes): Handle \224 correctly. - -1998-09-08 22:18:03 Lars Magne Ingebrigtsen - - * mm-util.el (mm-multibyte-p): New function. - -Tue Sep 8 21:43:03 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.20 is released. - -1998-09-08 11:40:45 Lars Magne Ingebrigtsen - - * rfc2047.el (rfc2047-decode-region): Only decode when in - multibyte. - - * nnheader.el (nnheader-pathname-coding-system): Changed to binary. - - * gnus-int.el (gnus-request-replace-article): Encode. - (gnus-request-accept-article): Encode. - - * gnus-art.el (gnus-request-article-this-buffer): Decode charsets - here. - - * gnus.el (gnus-article-display-hook): Take the charset functions - out. - - * time-date.el (safe-date-to-time): New function. - - * gnus-util.el (gnus-dd-mmm): Protect against bogus dates. - -Tue Sep 8 07:09:28 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.19 is released. - -1998-09-08 04:51:39 Lars Magne Ingebrigtsen - - * base64.el (base64-encode-region): Accept no-line-break. - - * mm-util.el (mm-mime-charset): New function. - - * gnus-draft.el (gnus-draft-edit-message): Delete article. - -Tue Sep 8 04:29:23 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.18 is released. - -1998-09-08 02:21:36 Lars Magne Ingebrigtsen - - * message.el (message-send-and-exit): Return t on success. - (message-make-date): Make a proper time zone. - - * gnus-draft.el (gnus-draft-send): Only remove article if the - sending is successful. - - * drums.el (drums-get-comment): Return the last comment. - (drums-parse-address): Parse old-style From headers. - -1998-09-07 SL Baur - - * gnus-sum.el (gnus-data-compute-positions): Move below - `gnus-save-hidden-threads' so the former is correctly detected as - a macro. - -1998-09-06 Dave Love - - * gnus/nnweb.el (require): Wrap requirement of w3 and url in - ignore-errors too, eval'd when compile. Require w3 stuff at load - time for nicer failure if it's not available. - -1998-09-08 00:38:39 Lars Magne Ingebrigtsen - - * time-date.el (time-to-seconds): Renamed. - - * parse-time.el (parse-time-string): Downcase before handling. - (parse-time-rules): Times without seconds have 0 seconds. - - * rfc2047.el (rfc2047-encode-region): New version. - (rfc2047-dissect-region): New function. - -1998-09-07 01:08:35 Lars Magne Ingebrigtsen - - * message.el (message-make-date): Use symbolic zone. - -1998-09-06 23:23:06 Lars Magne Ingebrigtsen - - * time-date.el (parse-time): Always use parse-time. - - * parse-time.el (parse-time-syntax): Use vectors. - -Sun Sep 6 21:19:26 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.17 is released. - -1998-09-06 05:45:17 Lars Magne Ingebrigtsen - - * time-date.el: Renamed from "date". - - * gnus.el: Removed all timezone dependencies. - - * score-mode.el: Removed. - (gnus-score-edit-insert-date): Use date. - - * date.el (float-to-time): New function. - - * nnspool.el (nnspool-seconds-since-epoch): Removed. - - * date.el (time-to-float): New function. - - * message.el (message-make-date): Use format-time-string. - (message-make-expires): Use make-date. - - * gnus-xmas.el (gnus-xmas-seconds-since-epoch): Removed. - - * gnus-util.el (gnus-dd-mmm): Use date. - (gnus-sortable-date): Ditto. - - * message.el (message-make-date): Take an optional time. - - * gnus: Applied patches from 5.6.43. - - * date.el (if): Use parse-time. - - * gnus-score.el (gnus-summary-score-entry): Make into a command - again. - - * gnus-group.el (gnus-group-get-new-news-this-group): Only call if - gnus-agent. - - * gnus.el (gnus-agent-meta-information-header): Moved here. - -1998-09-05 Mike McEwan - - * gnus-agent.el (gnus-agent-scoreable-headers): New variable. - (gnus-agent-fetch-group-1): Score article headers using normal - group score files if the download score rule of a category/group - is `file'. - (gnus-agent-fetch-group-1): Don't parse the entire .overview when - deciding what articles to download. - (gnus-agent-fetch-group-1): Don't push headers through scoring and - predicate processing if predicate is `true' or `false'. - -1998-09-06 01:56:02 Lars Magne Ingebrigtsen - - * gnus-score.el (gnus-score-load-score-alist): Bind coding system. - - * gnus-art.el (gnus-article-setup-buffer): Enable multibyte. - - * score-mode.el (score-mode-coding-system): New variable. - (gnus-score-edit-exit): Use it. - -1998-09-04 Jason R Mastaler - - * drums.el: Corrected typo. - -1998-09-05 23:24:43 Hallvard B. Furuseth - - * mm-bodies.el (mm-body-encoding): Faster version. - -1998-09-05 22:23:03 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-article-decode-charset): Only decode text - things. - - * message.el (message-output): Use rmail. - - * rfc2047.el (rfc2047-encoded-word-regexp): Allow spaces in the - word part. - - * mm-util.el (mm-charset-to-coding-system): Use - rfc2047-default-charset. - (mm-known-charsets): New variable. - - * message.el (message-caesar-region): Bugged out. - -1998-09-06 Mike McEwan - - * gnus-agent.el (gnus-agent-fetch-group-1): Allow lists when - specifying `agent-predicate' in a group's parameters. - -Sat Sep 5 21:55:01 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.16 is released. - -1998-09-05 17:30:11 Lars Magne Ingebrigtsen - - * nnmail.el (nnmail-expired-article-p): Use predicate. - - * date.el (time-less-p): Renamed. - - * gnus-art.el (gnus-article-decode-charset): Really fetch headers - from the headers. - - * rfc2047.el (rfc2047-decode-region): Use the mm decoding - functions. - - * gnus-group.el (gnus-group-sort-selected-flat): Didn't work at - all. - (gnus-group-sort-selected-groups-by-alphabet): Changed interface - to all functions. - -Sat Sep 5 01:45:52 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.15 is released. - -1998-09-05 00:21:22 Lars Magne Ingebrigtsen - - * date.el: New file. - - * gnus-util.el (gnus-encode-date): Removed. - (gnus-time-less): Ditto. - - * nnmail.el (nnmail-date-to-time): Removed. - (nnmail-time-less): Ditto. - (nnmail-days-to-time): Ditto. - (nnmail-time-since): Ditto. - - * drums.el: New file. - -1998-09-04 00:25:52 Lars Magne Ingebrigtsen - - * message.el (message-encode-message-body): Encode headers with - body encoding. - - * rfc2047.el (rfc2047-default-charset): Renamed. - (rfc2047-encodable-p): Use it. - - * base64.el (mm-util): Required. - -1998-09-03 16:28:30 Lars Magne Ingebrigtsen - - * gnus-msg.el (gnus-post-method): Peel off real info from opened - servers. - - * gnus-util.el (gnus-output-to-rmail): Removed. - - * gnus-art.el (gnus-summary-save-in-rmail): Use - gnus-output-to-rmailrmail-output-to-rmail-file. - - * rfc2047.el (rfc2047-decode-region): Fold case. - (rfc2047-decode): Use decode-string. - - * mm-util.el: Provide mm-char-int. - -Thu Sep 3 15:23:22 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.14 is released. - -1998-09-03 15:08:30 Lars Magne Ingebrigtsen - - * mm-bodies.el (mm-body-encoding): Go through the buffer to make - sure we have 7bit. - -1998-09-02 14:38:18 Lars Magne Ingebrigtsen - - * gnus-msg.el (gnus-post-method): Use opened servers, and remove - ducplicates. - (gnus-inews-insert-mime-headers): Removed. - - * message.el (message-caesar-region): Protect against MULE chars. - -1998-09-02 00:36:23 Hallvard B. Furuseth - - * mm-util.el (if): fset the right function. - -1998-09-02 00:31:53 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-article-decode-charset): Use real - read-coding-system. - -1998-09-01 17:58:40 Lars Magne Ingebrigtsen - - * mm-bodies.el (mm-decode-body): Protect against malformed - base64. - (mm-decode-body): Check that buffer-file-coding-system is - non-nil. - -Tue Sep 1 10:29:33 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.13 is released. - -1998-09-01 09:14:33 Lars Magne Ingebrigtsen - - * gnus-util.el (gnus-strip-whitespace): Already defined. - Removed. - - * gnus-art.el (gnus-article-decode-charset): Strip whitespace. - - * gnus-util.el (gnus-strip-whitespace): New function. - - * mm-util.el (mm-content-type-charset): Downcase. - -1998-08-31 23:04:29 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-article-decode-charset): Accept a prefix. - (gnus-article-decode-charset): Don't fetch all headers. - - * mm-util.el (mm-read-coding-system): New function. - - * mm-bodies.el (mm-decode-body): Check the right charset. - - * gnus-sum.el (gnus-summary-mode-line-format): Ditto. - - * gnus-art.el (gnus-article-mode-line-format): Use short group - format. - -Mon Aug 31 23:03:13 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.12 is released. - -1998-08-31 22:39:36 Lars Magne Ingebrigtsen - - * mm-bodies.el (mm-decode-body): Don't do charset unless MULE. - - * gnus-art.el (gnus-article-decode-charset): Supply cte. - (gnus-article-decode-charset): Always run. - - * mm-bodies.el (mm-decode-body): Decode cte. - -Mon Aug 31 22:14:50 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.11 is released. - -1998-08-31 14:27:25 Lars Magne Ingebrigtsen - - * message.el (message-encode-message-body): Ditto. - - * gnus-art.el (gnus-article-decode-mime-words): New command and - keystroke. - (gnus-article-decode-charset): Ditto. - (gnus-article-decode-charset): Only work under MULE. - - * mm-util.el (mm-content-type-charset): New function. - - * nnmail.el (nnmail-delete-incoming): Changed to nil. - - * message.el (message-send-mail): Insert MIME headers. - (message-check-news-body-syntax): Don't warn for escape sequences. - (message-check-news-body-syntax): Insert MIME headers. - - * mm-bodies.el (mm-body-encoding): New function. - - * message.el (message-encode-message-body): New function. - - * mm-bodies.el: New file. - - * mm-util.el (mm-narrow-to-head): New function. - - * rfc2047.el (rfc2047-encode): Use it. - - * mm-util.el: Provide mm-encode-coding-region. - - * gnus-sum.el (gnus-summary-mode): Enable multibyte. - - * gnus-util.el (gnus-set-work-buffer): Enable multibyte. - - * mm-util.el (mm-enable-multibyte): New function. - - * message.el (message-set-work-buffer): Set multibyte. - - * gnus.el (gnus-continuum-version): Be valid forever and ever. - - * gnus-util.el (gnus-point-at-eol): Removed. - (gnus-point-at-bol): Ditto. - - * base64.el (base64-decode-region): Commented out messaging. - -1998-08-31 Didier Verna - - * gnus-msg.el (gnus-group-mail): make it behave like - gnus-group-post-news with regards to the prefix (this enables the - use of posting styles). - -1998-08-31 12:53:32 Lars Magne Ingebrigtsen - - * gnus.el (gnus-article-display-hook): Added - gnus-article-decode-rfc1522 to hook. - -Mon Aug 31 12:43:46 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.10 is released. - -1998-08-31 11:45:13 Lars Magne Ingebrigtsen - - * nnfolder.el (nnfolder-delete-mail): Narrow to mail and allow - hook to be run. - -1998-08-30 17:59:07 Lars Magne Ingebrigtsen - - * rfc2047.el (rfc2047-encodable-p): Use find-charset-region. - - * mm-util.el (mm-charsets-in-region): Removed. - - * rfc2047.el: Renamed file. - - * gnus-msg.el (gnus-copy-article-buffer): Multibyte. - - * message.el (message-mode): Set multibyte. - - * mm-util.el (mm-charsets-in-region): Copied here. - - * gnus-util.el: Removed gnus-truncate-string. - - * gnus-art.el (gnus-article-decode-mime-words): Use 1522. - - * rfc1522.el (rfc1522-unencoded-charsets): New variable. - (rfc1522-encodable-p): New function. - (rfc1522-encode-message-header): Use it. - -Sun Aug 30 17:46:01 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.9 is released. - -1998-08-30 16:13:08 Lars Magne Ingebrigtsen - - * mm-util.el: Shadow encode-coding-string. - - * base64.el (base64-encode-region): Don't add newline. - - * rfc1522.el (rfc1522-narrow-to-field): Copied here. - - * mm-util.el: New file. - - * mm-decode.el: Somewhat depleted. - * mm-encode.el: Ditto. - - * rfc1522.el: New file. - - * mm-util.el (mm-replace-chars-in-string): Copied here. - - * mm-encode.el (mm-q-encode-region): New function. - - * qp.el (quoted-printable-encode-region): Take an optional CLASS - param. - - * mm-encode.el (mm-encode-word-region): Downcase. - -Sun Aug 30 15:28:01 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.8 is released. - -1998-08-30 12:23:03 Lars Magne Ingebrigtsen - - * message.el (message-send-mail): Encode headers. - - * qp.el (quoted-printable-encode-region): Encode 8-bit words. - (quoted-printable-encode-region): Upcase. - - * message.el (message-default-charset): New variable. - - * qp.el (quoted-printable-encode-region): Optional param FOLD. - - * message.el (message-narrow-to-field): Changed name. - - * mm-encode.el: New file. - - * message.el (message-narrow-to-header): New function. - - * gnus-art.el (gnus-article-decode-mime-words): Place point in the - right buffer. - -Sun Aug 30 12:15:54 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.7 is released. - -1998-08-30 01:26:12 Lars Magne Ingebrigtsen - - * gnus.el: Remove autoload for - gnus-article-mime-decode-quoted-printable. - - * mm-decode.el (mm-charset-to-coding-system): Allow iso-8859-1 to - be decoded in non-MULE Emacsen. - - * gnus-xmas.el (gnus-xmas-logo-color-alist): More brown. - -1998-08-29 SL Baur - - * gnus-xmas.el (gnus-xmas-logo-color-alist): Try shades of brown. - -1998-08-30 01:04:57 Lars Magne Ingebrigtsen - - * mm-decode.el: Check for coding-system-list. - -Sun Aug 30 00:59:15 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.6 is released. - -1998-08-30 00:36:28 Lars Magne Ingebrigtsen - - * nnheader.el (fboundp): Protect code-coding-string. - - * gnus-art.el (gnus-article-mode): Check that set-buffer-multibyte - is available. - -Sat Aug 29 23:24:31 1998 Lars Magne Ingebrigtsen - - * gnus.el: Pterodactyl Gnus v0.5 is released. - -1998-08-29 22:38:35 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-article-mode): Make article buffer multibyte. - (gnus-hack-decode-rfc1522): Removed. - - * mm-decode.el (mm-charset-coding-system-alist): Check better. - -Sat Aug 29 22:20:39 1998 Lars Magne Ingebrigtsen - - * gnus.el: Gnus v0.4 is released. - -1998-08-29 20:53:29 Lars Magne Ingebrigtsen - - * gnus-art.el (gnus-article-decode-mime-words): New command and - keystroke. - - * qp.el (quoted-printable-decode-region): Don't use hexl. - - * gnus-xmas.el (gnus-xmas-logo-color-style): Changed to dino. - - * gnus-sum.el (gnus-parse-headers-hook): Default to nil. - (gnus-structured-field-decoder): Removed. - (gnus-unstructured-field-decoder): Ditto. - - * mm-decode.el: New file. - - * qp.el: New file. - - * gnus-art.el (article-mime-decode-quoted-printable): Removed. - - * gnus-ems.el (fboundp): Removed gnus-split-string. - - * gnus.el (gnus-splash-face): Doc fix. - - * gnus-ems.el (fboundp): Don't bind mail-file-babyl-p. - - * gnus-art.el (article-mime-decode-quoted-printable): Don't use - hexl. - - * nnheader.el (nnheader-temp-write): Removed. - -Sat Aug 29 20:34:17 1998 Lars Magne Ingebrigtsen - - * gnus.el: Gnus v0.3 is released. - -Sat Aug 29 19:32:06 1998 Lars Magne Ingebrigtsen - - * gnus.el: Gnus v0.2 is released. - -;; Local Variables: -;; coding: iso-2022-7bit -;; End: diff --git a/lisp/Makefile.in b/lisp/Makefile.in deleted file mode 100644 index 0bac6c5..0000000 --- a/lisp/Makefile.in +++ /dev/null @@ -1,119 +0,0 @@ -datadir = @datadir@ -lispdir = @lispdir@ -prefix = @prefix@ -srcdir = @srcdir@ -subdir = lisp -top_srcdir = @top_srcdir@ - -EMACS = @EMACS@ -FLAGS = -batch -q -no-site-file -l $(srcdir)/dgnushack.el -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -SHELL = /bin/sh -VPATH = @srcdir@ -PACKAGEDIR = @PACKAGEDIR@ -W3DIR = @W3@ -URLDIR = @URL@ -EMACS_COMP = URLDIR=$(URLDIR) W3DIR=$(W3DIR) lispdir=$(lispdir) srcdir=$(srcdir) $(EMACS) $(FLAGS) -GNUS_PRODUCT_NAME = @GNUS_PRODUCT_NAME@ -EXPORTING_FILES = $(EMACS_COMP) -f dgnushack-exporting-files 2>/dev/null - -# We should never use `COMMAND && ...' form, use `if COMMAND then ...' -# form instead. Because, as far as we know, FreeBSD's native make will -# be discontinued if COMMAND returns a non-zero exit status. - -all total: clean-some gnus-load.elc - $(EMACS_COMP) -f dgnushack-compile - -clean-some: - rm -f *.elc gnus-load.el - -warn: clean-some gnus-load.elc - $(EMACS_COMP) --eval '(dgnushack-compile t)' 2>&1 | egrep -v "variable G|inhibit-point-motion-hooks|coding-system|temp-results|variable gnus|variable nn|scroll-in-place|deactivate-mark|filladapt-mode|byte-code-function-p|print-quoted|ps-right-header|ps-left-header|article-inhibit|print-escape|ssl-program-arguments|message-log-max" - -# The "clever" rule is unsafe, since redefined macros are loaded from -# .elc files, and not the .el file. -clever some: gnus-load.elc - @if test -f $(srcdir)/gnus.elc; then \ - echo \ - "checking whether the all elc files should be recompiled..."; \ - RM_ELC=nil; \ - if test `$(EMACS) -batch -q -no-site-file \ - -eval '(prin1 (featurep (quote xemacs)))' \ - 2>/dev/null` = t; then \ - if test ! -f $(srcdir)/gnus-xmas.elc; then RM_ELC=t; fi; \ - else \ - if test -f $(srcdir)/gnus-xmas.elc; then RM_ELC=t; fi; \ - fi; \ - if test $$RM_ELC = t; then \ - echo " => maybe yes;" \ - "rm -f *.elc auto-autoloads.el custom-load.el"; \ - rm -f *.elc auto-autoloads.el custom-load.el; \ - else \ - echo " => maybe unnecessary"; \ - fi; \ - fi - $(EMACS_COMP) -f dgnushack-compile - -install: clever install-without-compiling - -install-without-compiling: - $(SHELL) $(top_srcdir)/mkinstalldirs $(lispdir) - @for p in `$(EXPORTING_FILES)`; do \ - echo " $(INSTALL_DATA) $$p $(lispdir)/$$p"; \ - $(INSTALL_DATA) $$p $(lispdir)/$$p; \ - if test -f $$p"c"; then \ - echo " $(INSTALL_DATA) $$p""c"" $(lispdir)/$$p""c"; \ - $(INSTALL_DATA) $$p"c" $(lispdir)/$$p"c"; \ - fi; \ - done - -# Rule for XEmacs package. -install-package-manifest: - $(EMACS_COMP) -f dgnushack-install-package-manifest \ - $(PACKAGEDIR) $(GNUS_PRODUCT_NAME) - -compose-package: gnus-load.elc - $(EMACS_COMP) -f dgnushack-compose-package - -remove-extra-files-in-package: - $(EMACS_COMP) -f dgnushack-remove-extra-files-in-package \ - $(PACKAGEDIR) $(GNUS_PRODUCT_NAME) -# - -install-el: - $(SHELL) $(top_srcdir)/mkinstalldirs $(lispdir) - cd $(srcdir) \ - && for p in *.el; do \ - echo " $(INSTALL_DATA) $$p $(lispdir)/$$p"; \ - $(INSTALL_DATA) $$p $(lispdir)/$$p; \ - done - -tags: - etags *.el - -separately: - rm -f *.elc ; for i in *.el; do $(EMACS) $(FLAGS) -f batch-byte-compile $$i; done - -pot: - xpot -drgnus -r`cat ./version` *.el > rgnus.pot - -gnus-load.elc: - $(EMACS_COMP) -f dgnushack-make-cus-load $(srcdir) - $(EMACS_COMP) -f dgnushack-make-auto-load $(srcdir) - $(EMACS_COMP) -f dgnushack-make-load - -clean: - rm -f *.orig *.rej *.elc *~ \ - auto-autoloads.el custom-load.el gnus-load.el dgnuskwds.el - -distclean: clean - rm -f Makefile dgnuspath.el - -Makefile: $(srcdir)/Makefile.in ../config.status - cd .. \ - && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/lisp/base64.el b/lisp/base64.el deleted file mode 100644 index 26415a2..0000000 --- a/lisp/base64.el +++ /dev/null @@ -1,54 +0,0 @@ -;;; base64.el --- Base64 encoding functions using MEL -;; Copyright (C) 2000, 2001 Free Software Foundation, Inc. - -;; Author: T-gnus development team -;; Keywords: extensions - -;; This file is part of T-gnus. - -;; This program 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 program 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 this program; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(eval-and-compile - (defun base64-autoload-functionp (object) - (if (functionp object) - (let ((def object)) - (while (and (symbolp def) (fboundp def)) - (setq def (symbol-function def))) - (eq (car-safe def) 'autoload)))) - - (if (base64-autoload-functionp 'base64-decode-string) - (fmakunbound 'base64-decode-string)) - (if (base64-autoload-functionp 'base64-decode-region) - (fmakunbound 'base64-decode-region)) - (if (base64-autoload-functionp 'base64-encode-string) - (fmakunbound 'base64-encode-string)) - (if (base64-autoload-functionp 'base64-encode-region) - (fmakunbound 'base64-encode-region)) - - (require 'mel) - - (mel-find-function 'mime-decode-string "base64") - (mel-find-function 'mime-decode-region "base64") - (mel-find-function 'mime-encode-string "base64") - (mel-find-function 'mime-encode-region "base64")) - -(provide 'base64) - -;;; base64.el ends here diff --git a/lisp/binhex.el b/lisp/binhex.el deleted file mode 100644 index 6d8d434..0000000 --- a/lisp/binhex.el +++ /dev/null @@ -1,301 +0,0 @@ -;;; binhex.el --- elisp native binhex decode -;; Copyright (c) 1998, 1999, 2000 Free Software Foundation, Inc. - -;; Author: Shenghuo Zhu -;; Keywords: binhex news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) - -(eval-and-compile - (defalias 'binhex-char-int - (if (fboundp 'char-int) - 'char-int - 'identity))) - -(defvar binhex-decoder-program "hexbin" - "*Non-nil value should be a string that names a uu decoder. -The program should expect to read binhex data on its standard -input and write the converted data to its standard output.") - -(defvar binhex-decoder-switches '("-d") - "*List of command line flags passed to the command named by binhex-decoder-program.") - -(defconst binhex-alphabet-decoding-alist - '(( ?\! . 0) ( ?\" . 1) ( ?\# . 2) ( ?\$ . 3) ( ?\% . 4) ( ?\& . 5) - ( ?\' . 6) ( ?\( . 7) ( ?\) . 8) ( ?\* . 9) ( ?\+ . 10) ( ?\, . 11) - ( ?\- . 12) ( ?0 . 13) ( ?1 . 14) ( ?2 . 15) ( ?3 . 16) ( ?4 . 17) - ( ?5 . 18) ( ?6 . 19) ( ?8 . 20) ( ?9 . 21) ( ?@ . 22) ( ?A . 23) - ( ?B . 24) ( ?C . 25) ( ?D . 26) ( ?E . 27) ( ?F . 28) ( ?G . 29) - ( ?H . 30) ( ?I . 31) ( ?J . 32) ( ?K . 33) ( ?L . 34) ( ?M . 35) - ( ?N . 36) ( ?P . 37) ( ?Q . 38) ( ?R . 39) ( ?S . 40) ( ?T . 41) - ( ?U . 42) ( ?V . 43) ( ?X . 44) ( ?Y . 45) ( ?Z . 46) ( ?\[ . 47) - ( ?\` . 48) ( ?a . 49) ( ?b . 50) ( ?c . 51) ( ?d . 52) ( ?e . 53) - ( ?f . 54) ( ?h . 55) ( ?i . 56) ( ?j . 57) ( ?k . 58) ( ?l . 59) - ( ?m . 60) ( ?p . 61) ( ?q . 62) ( ?r . 63))) - -(defun binhex-char-map (char) - (cdr (assq char binhex-alphabet-decoding-alist))) - -;;;###autoload -(defconst binhex-begin-line - "^:...............................................................$") -(defconst binhex-body-line - "^[^:]...............................................................$") -(defconst binhex-end-line ":$") - -(defvar binhex-temporary-file-directory - (cond ((fboundp 'temp-directory) (temp-directory)) - ((boundp 'temporary-file-directory) temporary-file-directory) - ("/tmp/"))) - -(if (featurep 'xemacs) - (defalias 'binhex-insert-char 'insert-char) - (defun binhex-insert-char (char &optional count ignored buffer) - (if (or (null buffer) (eq buffer (current-buffer))) - (insert-char char count) - (with-current-buffer buffer - (insert-char char count))))) - -(defvar binhex-crc-table - [0 4129 8258 12387 16516 20645 24774 28903 - 33032 37161 41290 45419 49548 53677 57806 61935 - 4657 528 12915 8786 21173 17044 29431 25302 - 37689 33560 45947 41818 54205 50076 62463 58334 - 9314 13379 1056 5121 25830 29895 17572 21637 - 42346 46411 34088 38153 58862 62927 50604 54669 - 13907 9842 5649 1584 30423 26358 22165 18100 - 46939 42874 38681 34616 63455 59390 55197 51132 - 18628 22757 26758 30887 2112 6241 10242 14371 - 51660 55789 59790 63919 35144 39273 43274 47403 - 23285 19156 31415 27286 6769 2640 14899 10770 - 56317 52188 64447 60318 39801 35672 47931 43802 - 27814 31879 19684 23749 11298 15363 3168 7233 - 60846 64911 52716 56781 44330 48395 36200 40265 - 32407 28342 24277 20212 15891 11826 7761 3696 - 65439 61374 57309 53244 48923 44858 40793 36728 - 37256 33193 45514 41451 53516 49453 61774 57711 - 4224 161 12482 8419 20484 16421 28742 24679 - 33721 37784 41979 46042 49981 54044 58239 62302 - 689 4752 8947 13010 16949 21012 25207 29270 - 46570 42443 38312 34185 62830 58703 54572 50445 - 13538 9411 5280 1153 29798 25671 21540 17413 - 42971 47098 34713 38840 59231 63358 50973 55100 - 9939 14066 1681 5808 26199 30326 17941 22068 - 55628 51565 63758 59695 39368 35305 47498 43435 - 22596 18533 30726 26663 6336 2273 14466 10403 - 52093 56156 60223 64286 35833 39896 43963 48026 - 19061 23124 27191 31254 2801 6864 10931 14994 - 64814 60687 56684 52557 48554 44427 40424 36297 - 31782 27655 23652 19525 15522 11395 7392 3265 - 61215 65342 53085 57212 44955 49082 36825 40952 - 28183 32310 20053 24180 11923 16050 3793 7920]) - -(defun binhex-update-crc (crc char &optional count) - (if (null count) (setq count 1)) - (while (> count 0) - (setq crc (logxor (logand (lsh crc 8) 65280) - (aref binhex-crc-table - (logxor (logand (lsh crc -8) 255) - char))) - count (1- count))) - crc) - -(defun binhex-verify-crc (buffer start end) - (with-current-buffer buffer - (let ((pos start) (crc 0) (last (- end 2))) - (while (< pos last) - (setq crc (binhex-update-crc crc (char-after pos)) - pos (1+ pos))) - (if (= crc (binhex-string-big-endian (buffer-substring last end))) - nil - (error "CRC error"))))) - -(defun binhex-string-big-endian (string) - (let ((ret 0) (i 0) (len (length string))) - (while (< i len) - (setq ret (+ (lsh ret 8) (binhex-char-int (aref string i))) - i (1+ i))) - ret)) - -(defun binhex-string-little-endian (string) - (let ((ret 0) (i 0) (shift 0) (len (length string))) - (while (< i len) - (setq ret (+ ret (lsh (binhex-char-int (aref string i)) shift)) - i (1+ i) - shift (+ shift 8))) - ret)) - -(defun binhex-header (buffer) - (with-current-buffer buffer - (let ((pos (point-min)) len) - (vector - (prog1 - (setq len (binhex-char-int (char-after pos))) - (setq pos (1+ pos))) - (buffer-substring pos (setq pos (+ pos len))) - (prog1 - (setq len (binhex-char-int (char-after pos))) - (setq pos (1+ pos))) - (buffer-substring pos (setq pos (+ pos 4))) - (buffer-substring pos (setq pos (+ pos 4))) - (binhex-string-big-endian - (buffer-substring pos (setq pos (+ pos 2)))) - (binhex-string-big-endian - (buffer-substring pos (setq pos (+ pos 4)))) - (binhex-string-big-endian - (buffer-substring pos (setq pos (+ pos 4)))))))) - -(defvar binhex-last-char) -(defvar binhex-repeat) - -(defun binhex-push-char (char &optional count ignored buffer) - (cond - (binhex-repeat - (if (eq char 0) - (binhex-insert-char (setq binhex-last-char 144) 1 - ignored buffer) - (binhex-insert-char binhex-last-char (- char 1) - ignored buffer) - (setq binhex-last-char nil)) - (setq binhex-repeat nil)) - ((= char 144) - (setq binhex-repeat t)) - (t - (binhex-insert-char (setq binhex-last-char char) 1 ignored buffer)))) - -(defun binhex-decode-region (start end &optional header-only) - "Binhex decode region between START and END. -If HEADER-ONLY is non-nil only decode header and return filename." - (interactive "r") - (let ((work-buffer nil) - (counter 0) - (bits 0) (tmp t) - (lim 0) inputpos - (non-data-chars " \t\n\r:") - file-name-length data-fork-start - header - binhex-last-char binhex-repeat) - (unwind-protect - (save-excursion - (goto-char start) - (when (re-search-forward binhex-begin-line end t) - (let (default-enable-multibyte-characters) - (setq work-buffer (generate-new-buffer " *binhex-work*"))) - (beginning-of-line) - (setq bits 0 counter 0) - (while tmp - (skip-chars-forward non-data-chars end) - (setq inputpos (point)) - (end-of-line) - (setq lim (point)) - (while (and (< inputpos lim) - (setq tmp (binhex-char-map (char-after inputpos)))) - (setq bits (+ bits tmp) - counter (1+ counter) - inputpos (1+ inputpos)) - (cond ((= counter 4) - (binhex-push-char (lsh bits -16) 1 nil work-buffer) - (binhex-push-char (logand (lsh bits -8) 255) 1 nil - work-buffer) - (binhex-push-char (logand bits 255) 1 nil - work-buffer) - (setq bits 0 counter 0)) - (t (setq bits (lsh bits 6))))) - (if (null file-name-length) - (with-current-buffer work-buffer - (setq file-name-length (char-after (point-min)) - data-fork-start (+ (point-min) - file-name-length 22)))) - (if (and (null header) - (with-current-buffer work-buffer - (>= (buffer-size) data-fork-start))) - (progn - (binhex-verify-crc work-buffer - 1 data-fork-start) - (setq header (binhex-header work-buffer)) - (if header-only (setq tmp nil counter 0)))) - (setq tmp (and tmp (not (eq inputpos end))))) - (cond - ((= counter 3) - (binhex-push-char (logand (lsh bits -16) 255) 1 nil - work-buffer) - (binhex-push-char (logand (lsh bits -8) 255) 1 nil - work-buffer)) - ((= counter 2) - (binhex-push-char (logand (lsh bits -10) 255) 1 nil - work-buffer)))) - (if header-only nil - (binhex-verify-crc work-buffer - data-fork-start - (+ data-fork-start (aref header 6) 2)) - (or (markerp end) (setq end (set-marker (make-marker) end))) - (goto-char start) - (insert-buffer-substring work-buffer - data-fork-start (+ data-fork-start - (aref header 6))) - (delete-region (point) end))) - (and work-buffer (kill-buffer work-buffer))) - (if header (aref header 1)))) - -(defun binhex-decode-region-external (start end) - "Binhex decode region between START and END using external decoder." - (interactive "r") - (let ((cbuf (current-buffer)) firstline work-buffer status - (file-name (expand-file-name - (concat (binhex-decode-region start end t) ".data") - binhex-temporary-file-directory))) - (save-excursion - (goto-char start) - (when (re-search-forward binhex-begin-line nil t) - (let ((cdir default-directory) default-process-coding-system) - (unwind-protect - (progn - (set-buffer (setq work-buffer - (generate-new-buffer " *binhex-work*"))) - (buffer-disable-undo work-buffer) - (insert-buffer-substring cbuf firstline end) - (cd binhex-temporary-file-directory) - (apply 'call-process-region - (point-min) - (point-max) - binhex-decoder-program - nil - nil - nil - binhex-decoder-switches)) - (cd cdir) (set-buffer cbuf))) - (if (and file-name (file-exists-p file-name)) - (progn - (goto-char start) - (delete-region start end) - (let (format-alist) - (insert-file-contents-literally file-name))) - (error "Can not binhex"))) - (and work-buffer (kill-buffer work-buffer)) - (ignore-errors - (if file-name (delete-file file-name)))))) - -(provide 'binhex) - -;;; binhex.el ends here diff --git a/lisp/dgnushack.el b/lisp/dgnushack.el deleted file mode 100644 index 3496035..0000000 --- a/lisp/dgnushack.el +++ /dev/null @@ -1,782 +0,0 @@ -;;; dgnushack.el --- a hack to set the load path for byte-compiling -;; Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Katsumi Yamaoka -;; Version: 4.19 -;; Keywords: news, path - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; Code: - -;; Set coding priority of Shift-JIS to the bottom. -(if (featurep 'xemacs) - (defalias 'set-coding-priority 'ignore) - (defalias 'coding-priority-list 'ignore) - (defalias 'set-coding-priority-list 'ignore)) -(cond ((and (featurep 'xemacs) (featurep 'mule)) - (if (memq 'shift-jis (coding-priority-list)) - (set-coding-priority-list - (append (delq 'shift-jis (coding-priority-list)) '(shift-jis))))) - ((boundp 'MULE) - (put '*coding-category-sjis* 'priority (length *predefined-category*))) - ((featurep 'mule) - (if (memq 'coding-category-sjis coding-category-list) - (set-coding-priority - (append (delq 'coding-category-sjis - (copy-sequence coding-category-list)) - '(coding-category-sjis)))))) - -(defalias 'facep 'ignore) - -(require 'cl) -(unless (dolist (var nil t)) - ;; Override the macro `dolist' which may have been defined in egg.el. - (load "cl-macs" nil t)) - -(defvar srcdir (or (getenv "srcdir") ".")) - -(let ((urldir (getenv "URLDIR"))) - (unless (zerop (length urldir)) - (push (file-name-as-directory urldir) load-path))) - -(defvar dgnushack-w3-directory (let ((w3dir (getenv "W3DIR"))) - (unless (zerop (length w3dir)) - (file-name-as-directory w3dir)))) -(when dgnushack-w3-directory - (push dgnushack-w3-directory load-path)) - -;; If we are building w3 in a different directory than the source -;; directory, we must read *.el from source directory and write *.elc -;; into the building directory. For that, we define this function -;; before loading bytecomp. Bytecomp doesn't overwrite this function. -(defun byte-compile-dest-file (filename) - "Convert an Emacs Lisp source file name to a compiled file name. - In addition, remove directory name part from FILENAME." - (setq filename (byte-compiler-base-file-name filename)) - (setq filename (file-name-sans-versions filename)) - (setq filename (file-name-nondirectory filename)) - (if (memq system-type '(win32 w32 mswindows windows-nt)) - (setq filename (downcase filename))) - (cond ((eq system-type 'vax-vms) - (concat (substring filename 0 (string-match ";" filename)) "c")) - ((string-match emacs-lisp-file-regexp filename) - (concat (substring filename 0 (match-beginning 0)) ".elc")) - (t (concat filename ".elc")))) - -(require 'bytecomp) - -(when (boundp 'MULE) - (let (current-load-list) - ;; Make the function to be silent at compile-time. - (defun locate-library (library &optional nosuffix) - "Show the full path name of Emacs library LIBRARY. -This command searches the directories in `load-path' like `M-x load-library' -to find the file that `M-x load-library RET LIBRARY RET' would load. -Optional second arg NOSUFFIX non-nil means don't add suffixes `.elc' or `.el' -to the specified name LIBRARY (a la calling `load' instead of `load-library')." - (interactive "sLocate library: ") - (catch 'answer - (mapcar - '(lambda (dir) - (mapcar - '(lambda (suf) - (let ((try (expand-file-name (concat library suf) dir))) - (and (file-readable-p try) - (null (file-directory-p try)) - (progn - (or noninteractive - (message "Library is file %s" try)) - (throw 'answer try))))) - (if nosuffix '("") '(".elc" ".el" "")))) - load-path) - (or noninteractive - (message "No library %s in search path" library)) - nil)) - (byte-compile 'locate-library))) - -(unless (fboundp 'si:byte-optimize-form-code-walker) - (byte-optimize-form nil);; Load `byte-opt' or `byte-optimize'. - (setq max-specpdl-size 3000) - (defalias 'si:byte-optimize-form-code-walker - (symbol-function 'byte-optimize-form-code-walker)) - (defun byte-optimize-form-code-walker (form for-effect) - (if (and for-effect (memq (car-safe form) '(and or))) - ;; Fix bug in and/or forms. - (let ((fn (car form)) - (backwards (reverse (cdr form)))) - (while (and backwards - (null (setcar backwards - (byte-optimize-form (car backwards) t)))) - (setq backwards (cdr backwards))) - (if (and (cdr form) (null backwards)) - (byte-compile-log - " all subforms of %s called for effect; deleted" form)) - (if backwards - (let ((head backwards)) - (while (setq backwards (cdr backwards)) - (setcar backwards (byte-optimize-form (car backwards) - nil))) - (cons fn (nreverse head))))) - (si:byte-optimize-form-code-walker form for-effect))) - (byte-compile 'byte-optimize-form-code-walker)) - -(condition-case nil - (char-after) - (wrong-number-of-arguments - ;; Optimize byte code for `char-after'. - (put 'char-after 'byte-optimizer 'byte-optimize-char-after) - (defun byte-optimize-char-after (form) - (if (null (cdr form)) - '(char-after (point)) - form)))) - -(condition-case nil - (char-before) - (wrong-number-of-arguments - ;; Optimize byte code for `char-before'. - (put 'char-before 'byte-optimizer 'byte-optimize-char-before) - (defun byte-optimize-char-before (form) - (if (null (cdr form)) - '(char-before (point)) - form)))) - -(load (expand-file-name "dgnuspath.el" srcdir) nil nil t) - -(condition-case err - (load "~/.lpath.el" t nil t) - (error (message "Error in \"~/.lpath.el\" file: %s" err))) - -;; Don't load path-util until `char-after' and `char-before' have been -;; optimized because it requires `poe' and then modify the functions. - -;; If the APEL modules are installed under the non-standard directory, -;; for example "/var/home/john/lisp/apel-VERSION/", you should add that -;; name using the configure option "--with-addpath=". -;; And also the directory where the EMU modules are installed, for -;; example "/usr/local/share/mule/19.34/site-lisp/", it should be -;; included in the standard `load-path' or added by the configure -;; option "--with-addpath=". -(let ((path (or (locate-library "path-util") - (locate-library "apel/path-util")));; backward compat. - parent lpath) - (if path - (progn - (when (string-match "/$" (setq path (file-name-directory path))) - (setq path (substring path 0 (match-beginning 0)))) - ;; path == "/var/home/john/lisp/apel-VERSION" - (when (string-match "/$" (setq parent (file-name-directory path))) - (setq parent (substring path 0 (match-beginning 0)))) - ;; parent == "/var/home/john/lisp" - (if (setq lpath (or (member path load-path) - (member (file-name-as-directory path) load-path))) - (unless (or (member parent load-path) - (member (file-name-as-directory parent) load-path)) - (push parent (cdr lpath))) - (push path load-path) - (unless (or (member parent load-path) - (member (file-name-as-directory parent) load-path)) - (push parent (cdr load-path)))) - (require 'path-util)) - (error " -APEL modules are not found in %s. -Try to re-configure with --with-addpath=APEL_PATH and run make again. -" - load-path))) - -(unless (locate-library "mel") - (add-path "flim")) -(unless (module-installed-p 'mel) - ;; FLIM 1.14 may have installed in two "flim" subdirectories. - (push (expand-file-name "flim" - (file-name-directory (get-latest-path "^apel$" t))) - load-path) - (unless (module-installed-p 'mel) - (error " -FLIM modules does not found in %s. -Try to re-configure with --with-addpath=FLIM_PATH and run make again. -" - load-path))) -(add-path "semi") - -(push srcdir load-path) -(load (expand-file-name "lpath.el" srcdir) nil t t) - -(load (expand-file-name "gnus-clfns.el" srcdir) nil t t) - -(require 'custom) - -;; Bind functions defined by `defun-maybe'. -(put 'defun-maybe 'byte-hunk-handler 'byte-compile-file-form-defun-maybe) -(defun byte-compile-file-form-defun-maybe (form) - (if (and (not (fboundp (nth 1 form))) - (memq 'unresolved byte-compile-warnings)) - (setq byte-compile-function-environment - (cons (cons (nth 1 form) - (cons 'lambda (cdr (cdr form)))) - byte-compile-function-environment))) - form) - -(condition-case nil - :symbol-for-testing-whether-colon-keyword-is-available-or-not - (void-variable - (defun dgnushack-bind-colon-keywords () - "Bind all the colon keywords for old Emacsen." - (let ((cache (expand-file-name "dgnuskwds.el" srcdir)) - (makefile (expand-file-name "Makefile" srcdir)) - (buffer (get-buffer-create " *colon keywords*")) - keywords ignores files file dirs dir form elem make-backup-files) - (save-excursion - (set-buffer buffer) - (let (buffer-file-format - format-alist - insert-file-contents-post-hook - insert-file-contents-pre-hook - jam-zcat-filename-list - jka-compr-compression-info-list) - (if (and (file-exists-p cache) - (file-exists-p makefile) - (file-newer-than-file-p cache makefile)) - (progn - (insert-file-contents cache nil nil nil t) - (setq keywords (read buffer))) - (setq - ignores - '(:symbol-for-testing-whether-colon-keyword-is-available-or-not - ;; The following keywords will be bound by CUSTOM. - :get :group :initialize :link :load :options :prefix - :require :set :tag :type) - files (list (locate-library "semi-def") - (locate-library "mailcap") - (locate-library "mime-def") - (locate-library "path-util") - (locate-library "poem")) - dirs (list (file-name-as-directory (expand-file-name srcdir)))) - (while files - (when (setq file (pop files)) - (setq dir (file-name-directory file)) - (unless (member dir dirs) - (push dir dirs)))) - (message "Searching for all the colon keywords in:") - (while dirs - (setq dir (pop dirs)) - (message " %s..." dir) - (setq files (directory-files dir t - "\\.el\\(\\.gz\\|\\.bz2\\)?$")) - (while files - (setq file (pop files)) - (if (string-match "\\(\\.gz$\\)\\|\\.bz2$" file) - (let ((temp (expand-file-name "dgnustemp.el" srcdir))) - (when - (let* ((binary (if (boundp 'MULE) - '*noconv* - 'binary)) - (coding-system-for-read binary) - (coding-system-for-write binary) - (input-coding-system binary) - (output-coding-system binary) - (default-process-coding-system - (cons binary binary)) - call-process-hook) - (insert-file-contents file nil nil nil t) - (when - (condition-case code - (progn - (if (match-beginning 1) - (call-process-region - (point-min) (point-max) - "gzip" t buffer nil "-cd") - (call-process-region - (point-min) (point-max) - "bzip2" t buffer nil "-d")) - t) - (error - (erase-buffer) - (message "In file %s: %s" file code) - nil)) - (write-region (point-min) (point-max) temp - nil 'silent) - t)) - (unwind-protect - (insert-file-contents temp nil nil nil t) - (delete-file temp)))) - (insert-file-contents file nil nil nil t)) - (while (setq form (condition-case nil - (read buffer) - (error nil))) - (while form - (setq elem (pop form)) - (unless (memq (car-safe elem) - '(\` backquote - defcustom defface defgroup - define-widget quote)) - (while (consp elem) - (push (car elem) form) - (setq elem (cdr elem))) - (when (and elem - (symbolp elem) - (not (eq ': elem)) - (eq ?: (aref (symbol-name elem) 0)) - (not (memq elem ignores)) - (not (memq elem keywords))) - (push elem keywords))))))) - (setq keywords (sort keywords - (lambda (a b) - (string-lessp (symbol-name a) - (symbol-name b))))) - (erase-buffer) - (insert (format "%s" keywords)) - (write-region (point-min) (point) cache nil 'silent) - (message - "The following colon keywords will be bound at run-time:\n %s" - keywords)))) - (kill-buffer buffer) - (defconst dgnushack-colon-keywords keywords) - (while keywords - (set (car keywords) (car keywords)) - (setq keywords (cdr keywords))))) - (byte-compile 'dgnushack-bind-colon-keywords) - (dgnushack-bind-colon-keywords))) - -(if (boundp 'MULE) - (progn - (setq :version ':version - :set-after ':set-after) - (require 'custom) - (defadvice custom-handle-keyword - (around dont-signal-an-error-even-if-unsupported-keyword-is-given - activate) - "Don't signal an error even if unsupported keyword is given." - (if (not (memq (ad-get-arg 1) '(:version :set-after))) - ad-do-it)))) - -(when (boundp 'MULE) - (put 'custom-declare-face 'byte-optimizer - 'byte-optimize-ignore-unsupported-custom-keywords) - (put 'custom-declare-group 'byte-optimizer - 'byte-optimize-ignore-unsupported-custom-keywords) - (defun byte-optimize-ignore-unsupported-custom-keywords (form) - (if (or (memq ':version (nthcdr 4 form)) - (memq ':set-after (nthcdr 4 form))) - (let ((newform (list (car form) (nth 1 form) - (nth 2 form) (nth 3 form))) - (args (nthcdr 4 form))) - (while args - (or (memq (car args) '(:version :set-after)) - (setq newform (nconc newform (list (car args) - (car (cdr args)))))) - (setq args (cdr (cdr args)))) - newform) - form)) - - (put 'custom-declare-variable 'byte-hunk-handler - 'byte-compile-file-form-custom-declare-variable) - (defun byte-compile-file-form-custom-declare-variable (form) - ;; Bind defcustom'ed variables. - (if (memq 'free-vars byte-compile-warnings) - (setq byte-compile-bound-variables - (cons (nth 1 (nth 1 form)) byte-compile-bound-variables))) - (if (memq ':version (nthcdr 4 form)) - ;; Make the variable uncustomizable. - `(defvar ,(nth 1 (nth 1 form)) ,(nth 1 (nth 2 form)) - ,(substring (nth 3 form) (if (string-match "^[\t *]+" (nth 3 form)) - (match-end 0) - 0))) - ;; Ignore unsupported keyword(s). - (if (memq ':set-after (nthcdr 4 form)) - (let ((newform (list (car form) (nth 1 form) - (nth 2 form) (nth 3 form))) - (args (nthcdr 4 form))) - (while args - (or (eq (car args) ':set-after) - (setq newform (nconc newform (list (car args) - (car (cdr args)))))) - (setq args (cdr (cdr args)))) - newform) - form)))) - -;; Unknown variables and functions. -(unless (boundp 'buffer-file-coding-system) - (defvar buffer-file-coding-system (symbol-value 'file-coding-system))) -(unless (featurep 'xemacs) - (defalias 'Custom-make-dependencies 'ignore) - (defalias 'update-autoloads-from-directory 'ignore)) - -(defalias 'device-sound-enabled-p 'ignore) -(defalias 'play-sound-file 'ignore) -(defalias 'nndb-request-article 'ignore) -(defalias 'efs-re-read-dir 'ignore) -(defalias 'ange-ftp-re-read-dir 'ignore) -(defalias 'define-mail-user-agent 'ignore) - -(defconst dgnushack-unexporting-files - (append '("dgnushack.el" "dgnuspath.el" "dgnuskwds.el" "lpath.el") - (condition-case nil - (progn (require 'shimbun) nil) - (error '("nnshimbun.el"))) - (unless (or (condition-case code - (require 'w3-forms) - (error - (message "No w3: %s %s retrying..." code - (locate-library "w3-forms")) - nil)) - ;; Maybe mis-configured Makefile is used (e.g. - ;; configured for FSFmacs but XEmacs is running). - (let ((lp (delete dgnushack-w3-directory - (copy-sequence load-path)))) - (if (let ((load-path lp)) - (condition-case nil - (require 'w3-forms) - (error nil))) - ;; If success, fix `load-path' for compiling. - (progn - (setq load-path lp) - (message " => fixed; W3DIR=%s" - (file-name-directory - (locate-library "w3-forms"))) - t) - (message " => ignored") - nil))) - '("nnweb.el" "nnlistserv.el" "nnultimate.el" - "nnslashdot.el" "nnwarchive.el" "webmail.el" - "nnwfm.el" "nnrss.el")) - (condition-case nil - (progn (require 'bbdb) nil) - (error '("gnus-bbdb.el"))) - (unless (featurep 'xemacs) - '("gnus-xmas.el" "gnus-picon.el" "messagexmas.el" - "nnheaderxm.el" "smiley.el")) - (when (or (featurep 'xemacs) (<= emacs-major-version 20)) - '("smiley-ems.el")) - (when (and (fboundp 'base64-decode-string) - (subrp (symbol-function 'base64-decode-string))) - '("base64.el")) - (when (and (fboundp 'md5) (subrp (symbol-function 'md5))) - '("md5.el"))) - "Files which will not be installed.") - -(defconst dgnushack-exporting-files - (let ((files (directory-files srcdir nil "^[^=].*\\.el$" t))) - (dolist (file dgnushack-unexporting-files) - (setq files (delete file files))) - (sort files 'string-lessp)) - "Files which will be compiled and installed.") - -(defun dgnushack-exporting-files () - "Print name of files which will be installed." - (princ (mapconcat 'identity dgnushack-exporting-files " "))) - -(defun dgnushack-compile (&optional warn) - ;;(setq byte-compile-dynamic t) - (unless warn - (setq byte-compile-warnings - '(free-vars unresolved callargs redefine))) - (unless (locate-library "cus-edit") - (error "You do not seem to have Custom installed. -Fetch it from . -You also then need to add the following to the lisp/dgnushack.el file: - - (push \"~/lisp/custom\" load-path) - -Modify to suit your needs.")) - - ;; Show `load-path'. - (message "load-path=(\"%s\")" - (mapconcat 'identity load-path "\"\n \"")) - - (dolist (file dgnushack-exporting-files) - (setq file (expand-file-name file srcdir)) - (when (and (file-exists-p - (setq elc (concat (file-name-nondirectory file) "c"))) - (file-newer-than-file-p file elc)) - (delete-file elc))) - - (let ((files dgnushack-exporting-files) - ;;(byte-compile-generate-call-tree t) - file elc) - ;; Avoid barfing (from gnus-xmas) because the etc directory is not yet - ;; installed. - (when (featurep 'xemacs) - (setq gnus-xmas-glyph-directory "dummy")) - (while (setq file (pop files)) - (setq file (expand-file-name file srcdir)) - (when (or (not (file-exists-p - (setq elc (concat (file-name-nondirectory file) "c")))) - (file-newer-than-file-p file elc)) - (ignore-errors - (byte-compile-file file)))))) - -(defun dgnushack-recompile () - (require 'gnus) - (byte-recompile-directory "." 0)) - -(defvar dgnushack-gnus-load-file (expand-file-name "gnus-load.el" srcdir)) -(defvar dgnushack-cus-load-file (expand-file-name "cus-load.el" srcdir)) -(defvar dgnushack-auto-load-file (expand-file-name "auto-autoloads.el" srcdir)) - -(defun dgnushack-make-cus-load () - (when (condition-case nil - (load "cus-dep") - (error nil)) - (let ((cusload-base-file dgnushack-cus-load-file)) - (if (fboundp 'custom-make-dependencies) - (custom-make-dependencies) - (Custom-make-dependencies))))) - -(defun dgnushack-make-auto-load () - (require 'autoload) - (unless (make-autoload '(define-derived-mode child parent name - "docstring" body) - "file") - (defadvice make-autoload (around handle-define-derived-mode activate) - "Handle `define-derived-mode'." - (if (eq (car-safe (ad-get-arg 0)) 'define-derived-mode) - (setq ad-return-value - (list 'autoload - (list 'quote (nth 1 (ad-get-arg 0))) - (ad-get-arg 1) - (nth 4 (ad-get-arg 0)) - t nil)) - ad-do-it)) - (put 'define-derived-mode 'doc-string-elt 3)) - (let ((generated-autoload-file dgnushack-gnus-load-file) - (make-backup-files nil) - (autoload-package-name "gnus")) - (if (featurep 'xemacs) - (progn - (if (file-exists-p generated-autoload-file) - (delete-file generated-autoload-file)) - (if (file-exists-p dgnushack-auto-load-file) - (delete-file dgnushack-auto-load-file))) - (with-temp-file generated-autoload-file - (insert ?\014))) - (if (featurep 'xemacs) - (let ((si:message (symbol-function 'message))) - (defun message (fmt &rest args) - (cond ((and (string-equal "Generating autoloads for %s..." fmt) - (file-exists-p (file-name-nondirectory (car args)))) - (funcall si:message - fmt (file-name-nondirectory (car args)))) - ((string-equal "No autoloads found in %s" fmt)) - ((string-equal "Generating autoloads for %s...done" fmt)) - (t (apply si:message fmt args)))) - (unwind-protect - (batch-update-autoloads) - (fset 'message si:message))) - (batch-update-autoloads)))) - -(defun dgnushack-make-load () - (message (format "Generating %s..." dgnushack-gnus-load-file)) - (with-temp-file dgnushack-gnus-load-file - (if (file-exists-p dgnushack-cus-load-file) - (progn - (insert-file-contents dgnushack-cus-load-file) - (delete-file dgnushack-cus-load-file) - (goto-char (point-min)) - (search-forward ";;; Code:") - (forward-line) - (delete-region (point-min) (point)) - (unless (re-search-forward "\ -^[\t ]*(autoload[\t\n ]+\\('\\|(quote[\t\n ]+\\)custom-add-loads[\t\n ]" - nil t) - (insert "\n(autoload 'custom-add-loads \"cus-load\")\n")) - (goto-char (point-min)) - (insert "\ -;;; gnus-load.el --- automatically extracted custom dependencies and autoload -;; -;;; Code: -") - (goto-char (point-max)) - (if (search-backward "custom-versions-load-alist" nil t) - (forward-line -1) - (forward-line -1) - (while (eq (char-after) ?\;) - (forward-line -1)) - (forward-line)) - (delete-region (point) (point-max)) - (insert "\n")) - (insert "\ -;;; gnus-load.el --- automatically extracted autoload -;; -;;; Code: -")) - ;; smiley-* are duplicated. Remove them all. - (let ((point (point))) - (insert-file-contents dgnushack-gnus-load-file) - (goto-char point) - (while (search-forward "smiley-" nil t) - (beginning-of-line) - (if (looking-at "(autoload ") - (delete-region (point) (progn (forward-sexp) (point))) - (forward-line)))) - ;; - (goto-char (point-max)) - (when (search-backward "\n(provide " nil t) - (forward-line -1) - (delete-region (point) (point-max))) - (insert "\ - -\(provide 'gnus-load) - -;;; Local Variables: -;;; version-control: never -;;; no-byte-compile: t -;;; no-update-autoloads: t -;;; End: -;;; gnus-load.el ends here\n")) - (message (format "Compiling %s..." dgnushack-gnus-load-file)) - (byte-compile-file dgnushack-gnus-load-file)) - - -(defun dgnushack-compose-package () - "Re-split the file gnus-load.el into custom-load.el and -auto-autoloads.el. It is silly, should be improved!" - (message " -Re-splitting gnus-load.el into custom-load.el and auto-autoloads.el...") - (let ((customload (expand-file-name "custom-load.el" srcdir)) - (autoloads (expand-file-name "auto-autoloads.el" srcdir)) - start) - (with-temp-buffer - (insert-file-contents dgnushack-gnus-load-file) - (delete-file dgnushack-gnus-load-file) - (when (file-exists-p (concat dgnushack-gnus-load-file "c")) - (delete-file (concat dgnushack-gnus-load-file "c"))) - (while (prog1 - (looking-at "[\t ;]") - (forward-line 1))) - (setq start (point)) - (insert "\ -;;; custom-load.el --- automatically extracted custom dependencies\n -;;; Code:\n\n") - (goto-char (point-max)) - (while (progn - (forward-line -1) - (not (looking-at "[\t ]*(custom-add-loads[\t\n ]")))) - (forward-list 1) - (forward-line 1) - (insert "\n;;; custom-load.el ends here\n") - (write-region start (point) customload) - (while (looking-at "[\t ]*$") - (forward-line 1)) - (setq start (point)) - (if (re-search-forward "^[\t\n ]*(if[\t\n ]+(featurep[\t\n ]" nil t) - (let ((from (goto-char (match-beginning 0)))) - (delete-region from (progn - (forward-list 1) - (forward-line 1) - (point)))) - (while (looking-at "[\t ;]") - (forward-line 1))) - (insert "(if (featurep 'gnus-autoloads) (error \"Already loaded\"))\n") - (goto-char (point-max)) - (while (progn - (forward-line -1) - (not (looking-at "[\t ]*(provide[\t\n ]")))) - (insert "(provide 'gnus-autoloads)\n") - (write-region start (point) autoloads)) - (byte-compile-file customload) - (byte-compile-file autoloads)) - (message "\ -Re-splitting gnus-load.el into custom-load.el and auto-autoloads.el...done -\n")) - - -(defconst dgnushack-info-file-regexp-en - (let ((names '("gnus" "message" "emacs-mime")) - regexp name) - (while (setq name (pop names)) - (setq regexp (concat regexp "^" name "\\.info\\(-[0-9]+\\)?$" - (when names "\\|")))) - regexp) - "Regexp matching English info files.") - -(defconst dgnushack-info-file-regexp-ja - (let ((names '("gnus-ja" "message-ja")) - regexp name) - (while (setq name (pop names)) - (setq regexp (concat regexp "^" name "\\.info\\(-[0-9]+\\)?$" - (when names "\\|")))) - regexp) - "Regexp matching Japanese info files.") - -(defun dgnushack-remove-extra-files-in-package () - "Remove extra files in the lisp directory of the XEmacs package." - (let ((lisp-dir (expand-file-name (concat "lisp/" - ;; GNUS_PRODUCT_NAME - (cadr command-line-args-left) - "/") - ;; PACKAGEDIR - (car command-line-args-left)))) - (when (file-directory-p lisp-dir) - (let (files) - (dolist (file dgnushack-exporting-files) - (setq files (nconc files (list file (concat file "c"))))) - (dolist (file (directory-files lisp-dir nil nil t t)) - (unless (member file files) - (setq file (expand-file-name file lisp-dir)) - (message "Removing %s..." file) - (condition-case nil - (delete-file file) - (error nil)))))))) - -(defun dgnushack-install-package-manifest () - "Install MANIFEST file as an XEmacs package." - (let* ((package-dir (car command-line-args-left)) - (product-name (cadr command-line-args-left)) - (name (expand-file-name (concat "pkginfo/MANIFEST." product-name) - package-dir)) - make-backup-files) - (message "Generating %s..." name) - (with-temp-file name - (insert "pkginfo/MANIFEST." product-name "\n") - (let ((lisp-dir (concat "lisp/" product-name "/")) - (files (sort (directory-files "." nil "\\.elc?$" t) 'string-lessp)) - file) - (while (setq file (pop files)) - (unless (member file dgnushack-unexporting-files) - (insert lisp-dir file "\n"))) - (setq files - (sort (directory-files "../texi/" nil - (concat dgnushack-info-file-regexp-en - "\\|" - dgnushack-info-file-regexp-ja) - t) - 'string-lessp)) - (while (setq file (pop files)) - (insert "info/" file "\n")))))) - - -(define-compiler-macro describe-key-briefly (&whole form key &optional insert) - (if (condition-case nil - (progn - (describe-key-briefly '((())) nil) - t) - (wrong-number-of-arguments nil);; Old Emacsen. - (error t)) - form - (if insert - `(if ,insert - (insert (funcall 'describe-key-briefly ,key)) - (funcall 'describe-key-briefly ,key)) - `(funcall 'describe-key-briefly ,key)))) - -;;; dgnushack.el ends here diff --git a/lisp/dgnuspath.el.in b/lisp/dgnuspath.el.in deleted file mode 100644 index 3ee338f..0000000 --- a/lisp/dgnuspath.el.in +++ /dev/null @@ -1,18 +0,0 @@ -;; -*- Emacs-Lisp -*- -(let ((addpath - "@ADDITIONAL_LOAD_PATH@" - ) - path paths) - (while (string-match "[^\0-\37:]+" addpath) - (setq path (file-name-as-directory - (expand-file-name (match-string 0 addpath))) - addpath (substring addpath (match-end 0))) - (if (string-match "apel/$" path) - (progn - (if (file-directory-p path) - (setq paths (nconc paths (list path)))) - (setq path (substring path 0 (match-beginning 0))))) - (if (file-directory-p path) - (setq paths (nconc paths (list path))))) - (or (null paths) - (setq load-path (nconc paths load-path)))) diff --git a/lisp/dig.el b/lisp/dig.el deleted file mode 100644 index de6a769..0000000 --- a/lisp/dig.el +++ /dev/null @@ -1,169 +0,0 @@ -;;; dig.el --- Domain Name System dig interface -;; Copyright (c) 2000 Free Software Foundation, Inc. - -;; Author: Simon Josefsson -;; Keywords: DNS BIND dig - -;; This file is not a part of GNU Emacs, but the same permissions apply. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;; This provide an interface for "dig". -;; -;; For interactive use, try M-x dig and type a hostname. Use `q' to quit -;; dig buffer. -;; -;; For use in elisp programs, call `dig-invoke' and use -;; `dig-extract-rr' to extract resource records. - -;;; Code: - -(eval-when-compile (require 'cl)) - -(defgroup dig nil - "Dig configuration.") - -(defcustom dig-program "dig" - "Name of dig (domain information groper) binary." - :type 'file - :group 'dig) - -(defcustom dig-dns-server nil - "DNS server to query. -If nil, use system defaults." - :type '(choice (const :tag "System defaults") - string) - :group 'dig) - -(defcustom dig-font-lock-keywords - '(("^;; [A-Z]+ SECTION:" 0 font-lock-keyword-face) - ("^;;.*" 0 font-lock-comment-face) - ("^; <<>>.*" 0 font-lock-type-face) - ("^;.*" 0 font-lock-function-name-face)) - "Default expressions to highlight in dig mode." - :type 'sexp - :group 'dig) - -(defun dig-invoke (domain &optional - query-type query-class query-option - dig-option server) - "Call dig with given arguments and return buffer containing output. -DOMAIN is a string with a DNS domain. QUERY-TYPE is an optional string -with a DNS type. QUERY-CLASS is an optional string with a DNS class. -QUERY-OPTION is an optional string with dig \"query options\". -DIG-OPTIONS is an optional string with parameters for the dig program. -SERVER is an optional string with a domain name server to query. - -Dig is an external program found in the BIND name server distribution, -and is a commonly available debugging tool." - (let (buf cmdline) - (setq buf (generate-new-buffer "*dig output*")) - (if dig-option (push dig-option cmdline)) - (if query-option (push query-option cmdline)) - (if query-class (push query-class cmdline)) - (if query-type (push query-type cmdline)) - (push domain cmdline) - (if server (push (concat "@" server) cmdline) - (if dig-dns-server (push (concat "@" dig-dns-server) cmdline))) - (apply 'call-process dig-program nil buf nil cmdline) - buf)) - -(defun dig-extract-rr (domain &optional type class) - "Extract resource records for DOMAIN, TYPE and CLASS from buffer. -Buffer should contain output generated by `dig-invoke'." - (save-excursion - (goto-char (point-min)) - (if (re-search-forward - (concat domain "\\.?[\t ]+[0-9wWdDhHmMsS]+[\t ]+" - (upcase (or class "IN")) "[\t ]+" (upcase (or type "A"))) - nil t) - (let (b e) - (end-of-line) - (setq e (point)) - (beginning-of-line) - (setq b (point)) - (when (search-forward " (" e t) - (search-forward " )")) - (end-of-line) - (setq e (point)) - (buffer-substring b e)) - (and (re-search-forward (concat domain "\\.?[\t ]+[0-9wWdDhHmMsS]+[\t ]+" - (upcase (or class "IN")) - "[\t ]+CNAME[\t ]+\\(.*\\)$") nil t) - (dig-extract-rr (match-string 1) type class))))) - -(defun dig-rr-get-pkix-cert (rr) - (let (b e str) - (string-match "[^\t ]+[\t ]+[0-9wWdDhHmMsS]+[\t ]+IN[\t ]+CERT[\t ]+\\(1\\|PKIX\\)[\t ]+[0-9]+[\t ]+[0-9]+[\t ]+(?" rr) - (setq b (match-end 0)) - (string-match ")" rr) - (setq e (match-beginning 0)) - (setq str (substring rr b e)) - (while (string-match "[\t \n\r]" str) - (setq str (replace-match "" nil nil str))) - str)) - -;; XEmacs does it like this. For Emacs, we have to set the -;; `font-lock-defaults' buffer-local variable. -(put 'dig-mode 'font-lock-defaults '(dig-font-lock-keywords t)) - -(put 'dig-mode 'mode-class 'special) - -(defvar dig-mode-map nil) -(unless dig-mode-map - (setq dig-mode-map (make-sparse-keymap)) - (suppress-keymap dig-mode-map) - - (define-key dig-mode-map "q" 'dig-exit)) - -(defun dig-mode () - "Major mode for displaying dig output." - (interactive) - (kill-all-local-variables) - (setq mode-name "dig") - (setq major-mode 'dig-mode) - (use-local-map dig-mode-map) - (buffer-disable-undo) - (unless (featurep 'xemacs) - (set (make-local-variable 'font-lock-defaults) - '(dig-font-lock-keywords t))) - (when (featurep 'font-lock) - (font-lock-set-defaults))) - -(defun dig-exit () - "Quit dig output buffer." - (interactive) - (kill-buffer (current-buffer))) - -(defun dig (domain &optional - query-type query-class query-option dig-option server) - "Query addresses of a DOMAIN using dig, by calling `dig-invoke'. -Optional arguments are passed to `dig-invoke'." - (interactive "sHost: ") - (switch-to-buffer - (dig-invoke domain query-type query-class query-option dig-option server)) - (goto-char (point-min)) - (and (search-forward ";; ANSWER SECTION:" nil t) - (forward-line)) - (dig-mode) - (setq buffer-read-only t) - (set-buffer-modified-p nil)) - -(provide 'dig) - -;;; dig.el ends here diff --git a/lisp/earcon.el b/lisp/earcon.el deleted file mode 100644 index ecd118f..0000000 --- a/lisp/earcon.el +++ /dev/null @@ -1,233 +0,0 @@ -;;; earcon.el --- Sound effects for messages - -;; Copyright (C) 1996, 2000 Free Software Foundation - -;; Author: Steven L. Baur - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: -;; This file provides access to sound effects in Gnus. - -;;; Code: - -(eval-when-compile (require 'cl)) -(require 'gnus) -(require 'gnus-audio) -(require 'gnus-art) - -(defgroup earcon nil - "Turn ** sounds ** into noise." - :group 'gnus-visual) - -(defcustom earcon-prefix "**" - "*String denoting the start of an earcon." - :type 'string - :group 'earcon) - -(defcustom earcon-suffix "**" - "String denoting the end of an earcon." - :type 'string - :group 'earcon) - -(defcustom earcon-regexp-alist - '(("boring" 1 "Boring.au") - ("evil[ \t]+laugh" 1 "Evil_Laugh.au") - ("gag\\|puke" 1 "Puke.au") - ("snicker" 1 "Snicker.au") - ("meow" 1 "catmeow.au") - ("sob\\|boohoo" 1 "cry.wav") - ("drum[ \t]*roll" 1 "drumroll.au") - ("blast" 1 "explosion.au") - ("flush\\|plonk!*" 1 "flush.au") - ("kiss" 1 "kiss.wav") - ("tee[ \t]*hee" 1 "laugh.au") - ("shoot" 1 "shotgun.wav") - ("yawn" 1 "snore.wav") - ("cackle" 1 "witch.au") - ("yell\\|roar" 1 "yell2.au") - ("whoop-de-doo" 1 "whistle.au")) - "*A list of regexps to map earcons to real sounds." - :type '(repeat (list regexp - (integer :tag "Match") - (string :tag "Sound"))) - :group 'earcon) -(defvar earcon-button-marker-list nil) -(make-variable-buffer-local 'earcon-button-marker-list) - -;;; FIXME!! clone of code from gnus-vis.el FIXME!! -(defun earcon-article-push-button (event) - "Check text under the mouse pointer for a callback function. -If the text under the mouse pointer has a `earcon-callback' property, -call it with the value of the `earcon-data' text property." - (interactive "e") - (set-buffer (window-buffer (posn-window (event-start event)))) - (let* ((pos (posn-point (event-start event))) - (data (get-text-property pos 'earcon-data)) - (fun (get-text-property pos 'earcon-callback))) - (if fun (funcall fun data)))) - -(defun earcon-article-press-button () - "Check text at point for a callback function. -If the text at point has a `earcon-callback' property, -call it with the value of the `earcon-data' text property." - (interactive) - (let* ((data (get-text-property (point) 'earcon-data)) - (fun (get-text-property (point) 'earcon-callback))) - (if fun (funcall fun data)))) - -(defun earcon-article-prev-button (n) - "Move point to N buttons backward. -If N is negative, move forward instead." - (interactive "p") - (earcon-article-next-button (- n))) - -(defun earcon-article-next-button (n) - "Move point to N buttons forward. -If N is negative, move backward instead." - (interactive "p") - (let ((function (if (< n 0) 'previous-single-property-change - 'next-single-property-change)) - (inhibit-point-motion-hooks t) - (backward (< n 0)) - (limit (if (< n 0) (point-min) (point-max)))) - (setq n (abs n)) - (while (and (not (= limit (point))) - (> n 0)) - ;; Skip past the current button. - (when (get-text-property (point) 'earcon-callback) - (goto-char (funcall function (point) 'earcon-callback nil limit))) - ;; Go to the next (or previous) button. - (gnus-goto-char (funcall function (point) 'earcon-callback nil limit)) - ;; Put point at the start of the button. - (when (and backward (not (get-text-property (point) 'earcon-callback))) - (goto-char (funcall function (point) 'earcon-callback nil limit))) - ;; Skip past intangible buttons. - (when (get-text-property (point) 'intangible) - (incf n)) - (decf n)) - (unless (zerop n) - (gnus-message 5 "No more buttons")) - n)) - -(defun earcon-article-add-button (from to fun &optional data) - "Create a button between FROM and TO with callback FUN and data DATA." - (and (boundp gnus-article-button-face) - gnus-article-button-face - (gnus-overlay-put (gnus-make-overlay from to) - 'face gnus-article-button-face)) - (gnus-add-text-properties - from to - (nconc (and gnus-article-mouse-face - (list gnus-mouse-face-prop gnus-article-mouse-face)) - (list 'gnus-callback fun) - (and data (list 'gnus-data data))))) - -(defun earcon-button-entry () - ;; Return the first entry in `gnus-button-alist' matching this place. - (let ((alist earcon-regexp-alist) - (case-fold-search t) - (entry nil)) - (while alist - (setq entry (pop alist)) - (if (looking-at (car entry)) - (setq alist nil) - (setq entry nil))) - entry)) - -(defun earcon-button-push (marker) - ;; Push button starting at MARKER. - (save-excursion - (set-buffer gnus-article-buffer) - (goto-char marker) - (let* ((entry (earcon-button-entry)) - (inhibit-point-motion-hooks t) - (fun 'gnus-audio-play) - (args (list (nth 2 entry)))) - (cond - ((fboundp fun) - (apply fun args)) - ((and (boundp fun) - (fboundp (symbol-value fun))) - (apply (symbol-value fun) args)) - (t - (gnus-message 1 "You must define `%S' to use this button" - (cons fun args))))))) - -;;; FIXME!! clone of code from gnus-vis.el FIXME!! - -;;;###interactive -(defun earcon-region (beg end) - "Play Sounds in the region between point and mark." - (interactive "r") - (earcon-buffer (current-buffer) beg end)) - -;;;###interactive -(defun earcon-buffer (&optional buffer st nd) - (interactive) - (save-excursion - ;; clear old markers. - (if (boundp 'earcon-button-marker-list) - (while earcon-button-marker-list - (set-marker (pop earcon-button-marker-list) nil)) - (setq earcon-button-marker-list nil)) - (and buffer (set-buffer buffer)) - (let ((buffer-read-only nil) - (inhibit-point-motion-hooks t) - (case-fold-search t) - (alist earcon-regexp-alist) - beg entry regexp) - (goto-char (point-min)) - (setq beg (point)) - (while (setq entry (pop alist)) - (setq regexp (concat (regexp-quote earcon-prefix) - ".*\\(" - (car entry) - "\\).*" - (regexp-quote earcon-suffix))) - (goto-char beg) - (while (re-search-forward regexp nil t) - (let* ((start (and entry (match-beginning 1))) - (end (and entry (match-end 1))) - (from (match-beginning 1))) - (earcon-article-add-button - start end 'earcon-button-push - (car (push (set-marker (make-marker) from) - earcon-button-marker-list))) - (gnus-audio-play (caddr entry)))))))) - -;;;###autoload -(defun gnus-earcon-display () - "Play sounds in message buffers." - (interactive) - (save-excursion - (set-buffer gnus-article-buffer) - (goto-char (point-min)) - ;; Skip headers - (unless (search-forward "\n\n" nil t) - (goto-char (point-max))) - (sit-for 0) - (earcon-buffer (current-buffer) (point)))) - -;;;*** - -(provide 'earcon) - -(run-hooks 'earcon-load-hook) - -;;; earcon.el ends here diff --git a/lisp/flow-fill.el b/lisp/flow-fill.el deleted file mode 100644 index 8a9bea0..0000000 --- a/lisp/flow-fill.el +++ /dev/null @@ -1,104 +0,0 @@ -;;; flow-fill.el --- interprete RFC2646 "flowed" text - -;; Copyright (C) 2000 Free Software Foundation, Inc. - -;; Author: Simon Josefsson -;; Keywords: mail - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;; This implement decoding of RFC2646 formatted text, including the -;; quoted-depth wins rules. - -;; Theory of operation: search for lines ending with SPC, save quote -;; length of line, remove SPC and concatenate line with the following -;; line if quote length of following line matches current line. - -;; When no further concatenations are possible, we've found a -;; paragraph and we let `fill-region' fill the long line into several -;; lines with the quote prefix as `fill-prefix'. - -;; Todo: encoding, implement basic `fill-region' (Emacs and XEmacs -;; implementations differ..) - -;;; History: - -;; 2000-02-17 posted on ding mailing list -;; 2000-02-19 use `point-at-{b,e}ol' in XEmacs -;; 2000-03-11 no compile warnings for point-at-bol stuff -;; 2000-03-26 commited to gnus cvs -;; 2000-10-23 don't flow "-- " lines, make "quote-depth wins" rule -;; work when first line is at level 0. - -;;; Code: - -(eval-when-compile (require 'cl)) - -(eval-and-compile - (defalias 'fill-flowed-point-at-bol - (if (fboundp 'point-at-bol) - 'point-at-bol - 'line-beginning-position)) - - (defalias 'fill-flowed-point-at-eol - (if (fboundp 'point-at-eol) - 'point-at-eol - 'line-end-position))) - -(defun fill-flowed (&optional buffer) - (save-excursion - (set-buffer (or (current-buffer) buffer)) - (goto-char (point-min)) - (while (re-search-forward " $" nil t) - (when (save-excursion - (beginning-of-line) - (looking-at "^\\(>*\\)\\( ?\\)")) - (let ((quote (match-string 1)) sig) - (if (string= quote "") - (setq quote nil)) - (when (and quote (string= (match-string 2) "")) - (save-excursion - ;; insert SP after quote for pleasant reading of quoted lines - (beginning-of-line) - (when (> (skip-chars-forward ">") 0) - (insert " ")))) - (while (and (save-excursion - (ignore-errors (backward-char 3)) - (setq sig (looking-at "-- ")) - (looking-at "[^-][^-] ")) - (save-excursion - (unless (eobp) - (forward-char 1) - (looking-at (format "^\\(%s\\)\\([^>]\\)" - (or quote " ?")))))) - (save-excursion - (replace-match (if (string= (match-string 2) " ") - "" "\\2"))) - (backward-delete-char -1) - (end-of-line)) - (unless sig - (let ((fill-prefix (when quote (concat quote " ")))) - (fill-region (fill-flowed-point-at-bol) - (min (1+ (fill-flowed-point-at-eol)) (point-max)) - 'left 'nosqueeze)))))))) - -(provide 'flow-fill) - -;;; flow-fill.el ends here diff --git a/lisp/format-spec.el b/lisp/format-spec.el deleted file mode 100644 index 6cd39ed..0000000 --- a/lisp/format-spec.el +++ /dev/null @@ -1,71 +0,0 @@ -;;; format-spec.el --- functions for formatting arbitrary formatting strings -;; Copyright (C) 1999, 2000 Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Keywords: tools - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) - -(defun format-spec (format specification) - "Return a string based on FORMAT and SPECIFICATION. -FORMAT is a string containing `format'-like specs like \"bash %u %k\", -while SPECIFICATION is an alist mapping from format spec characters -to values." - (with-temp-buffer - (insert format) - (goto-char (point-min)) - (while (search-forward "%" nil t) - (cond - ;; Quoted percent sign. - ((eq (char-after) ?%) - (delete-char 1)) - ;; Valid format spec. - ((looking-at "\\([-0-9.]*\\)\\([a-zA-Z]\\)") - (let* ((num (match-string 1)) - (spec (string-to-char (match-string 2))) - (val (cdr (assq spec specification)))) - (delete-region (1- (match-beginning 0)) (match-end 0)) - (unless val - (error "Invalid format character: %s" spec)) - (insert (format (concat "%" num "s") val)))) - ;; Signal an error on bogus format strings. - (t - (error "Invalid format string")))) - (buffer-string))) - -(defun format-spec-make (&rest pairs) - "Return an alist suitable for use in `format-spec' based on PAIRS. -PAIRS is a list where every other element is a character and a value, -starting with a character." - (let (alist) - (while pairs - (unless (cdr pairs) - (error "Invalid list of pairs")) - (push (cons (car pairs) (cadr pairs)) alist) - (setq pairs (cddr pairs))) - (nreverse alist))) - -(provide 'format-spec) - -;;; format-spec.el ends here diff --git a/lisp/gnus-agent.el b/lisp/gnus-agent.el deleted file mode 100644 index 1e6340a..0000000 --- a/lisp/gnus-agent.el +++ /dev/null @@ -1,1774 +0,0 @@ -;;; gnus-agent.el --- unplugged support for Semi-gnus -;; Copyright (C) 1997, 1998, 1999, 2000, 2001 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Tatsuya Ichikawa -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) -(eval-when-compile (require 'gnus-clfns)) - -(require 'gnus) -(require 'gnus-cache) -(require 'nnvirtual) -(require 'gnus-sum) -(require 'gnus-score) -(eval-when-compile - (if (featurep 'xemacs) - (require 'itimer) - (require 'timer)) - (require 'gnus-group)) - -(eval-and-compile - (autoload 'gnus-server-update-server "gnus-srvr")) - -(defcustom gnus-agent-directory (nnheader-concat gnus-directory "agent/") - "Where the Gnus agent will store its files." - :group 'gnus-agent - :type 'directory) - -(defcustom gnus-agent-plugged-hook nil - "Hook run when plugging into the network." - :group 'gnus-agent - :type 'hook) - -(defcustom gnus-agent-unplugged-hook nil - "Hook run when unplugging from the network." - :group 'gnus-agent - :type 'hook) - -(defcustom gnus-agent-handle-level gnus-level-subscribed - "Groups on levels higher than this variable will be ignored by the Agent." - :group 'gnus-agent - :type 'integer) - -(defcustom gnus-agent-expire-days 7 - "Read articles older than this will be expired." - :group 'gnus-agent - :type 'integer) - -(defcustom gnus-agent-expire-all nil - "If non-nil, also expire unread, ticked and dormant articles. -If nil, only read articles will be expired." - :group 'gnus-agent - :type 'boolean) - -(defcustom gnus-agent-group-mode-hook nil - "Hook run in Agent group minor modes." - :group 'gnus-agent - :type 'hook) - -;; Extracted from gnus-xmas-redefine in order to preserve user settings -(when (featurep 'xemacs) - (add-hook 'gnus-agent-group-mode-hook 'gnus-xmas-agent-group-menu-add)) - -(defcustom gnus-agent-summary-mode-hook nil - "Hook run in Agent summary minor modes." - :group 'gnus-agent - :type 'hook) - -;; Extracted from gnus-xmas-redefine in order to preserve user settings -(when (featurep 'xemacs) - (add-hook 'gnus-agent-summary-mode-hook 'gnus-xmas-agent-summary-menu-add)) - -(defcustom gnus-agent-server-mode-hook nil - "Hook run in Agent summary minor modes." - :group 'gnus-agent - :type 'hook) - -;; Extracted from gnus-xmas-redefine in order to preserve user settings -(when (featurep 'xemacs) - (add-hook 'gnus-agent-server-mode-hook 'gnus-xmas-agent-server-menu-add)) - -(defcustom gnus-agent-confirmation-function 'y-or-n-p - "Function to confirm when error happens." - :version "21.1" - :group 'gnus-agent - :type 'function) - -(defcustom gnus-agent-large-newsgroup nil - "*The number of articles which indicates a large newsgroup. -If the number of unread articles exceeds it, The number of articles to be -fetched will be limited to it. If not a positive integer, never consider it." - :group 'gnus-agent - :type '(choice (const nil) - (integer :tag "Number"))) - -(defcustom gnus-agent-synchronize-flags 'ask - "Indicate if flags are synchronized when you plug in. -If this is `ask' the hook will query the user." - :version "21.1" - :type '(choice (const :tag "Always" t) - (const :tag "Never" nil) - (const :tag "Ask" ask)) - :group 'gnus-agent) - -;;; Internal variables - -(defvar gnus-agent-history-buffers nil) -(defvar gnus-agent-buffer-alist nil) -(defvar gnus-agent-article-alist nil) -(defvar gnus-agent-group-alist nil) -(defvar gnus-agent-covered-methods nil) -(defvar gnus-category-alist nil) -(defvar gnus-agent-current-history nil) -(defvar gnus-agent-overview-buffer nil) -(defvar gnus-category-predicate-cache nil) -(defvar gnus-category-group-cache nil) -(defvar gnus-agent-spam-hashtb nil) -(defvar gnus-agent-file-name nil) -(defvar gnus-agent-send-mail-function nil) -(defvar gnus-agent-file-coding-system 'raw-text) - -;; Dynamic variables -(defvar gnus-headers) -(defvar gnus-score) - -;;; -;;; Setup -;;; - -(defun gnus-open-agent () - (setq gnus-agent t) - (gnus-agent-read-servers) - (gnus-category-read) - (gnus-agent-create-buffer) - (add-hook 'gnus-group-mode-hook 'gnus-agent-mode) - (add-hook 'gnus-summary-mode-hook 'gnus-agent-mode) - (add-hook 'gnus-server-mode-hook 'gnus-agent-mode)) - -(defun gnus-agent-create-buffer () - (if (gnus-buffer-live-p gnus-agent-overview-buffer) - t - (setq gnus-agent-overview-buffer - (gnus-get-buffer-create " *Gnus agent overview*")) - (with-current-buffer gnus-agent-overview-buffer - (set-buffer-multibyte t)) - nil)) - -(gnus-add-shutdown 'gnus-close-agent 'gnus) - -(defun gnus-close-agent () - (setq gnus-agent-covered-methods nil - gnus-category-predicate-cache nil - gnus-category-group-cache nil - gnus-agent-spam-hashtb nil) - (gnus-kill-buffer gnus-agent-overview-buffer)) - -;;; -;;; Utility functions -;;; - -(defun gnus-agent-read-file (file) - "Load FILE and do a `read' there." - (with-temp-buffer - (ignore-errors - (nnheader-insert-file-contents file) - (goto-char (point-min)) - (read (current-buffer))))) - -(defsubst gnus-agent-method () - (concat (symbol-name (car gnus-command-method)) "/" - (if (equal (cadr gnus-command-method) "") - "unnamed" - (cadr gnus-command-method)))) - -(defsubst gnus-agent-directory () - "Path of the Gnus agent directory." - (nnheader-concat gnus-agent-directory - (nnheader-translate-file-chars (gnus-agent-method)) "/")) - -(defun gnus-agent-lib-file (file) - "The full path of the Gnus agent library FILE." - (expand-file-name file - (file-name-as-directory - (expand-file-name "agent.lib" (gnus-agent-directory))))) - -;;; Fetching setup functions. - -(defun gnus-agent-start-fetch () - "Initialize data structures for efficient fetching." - (gnus-agent-open-history) - (setq gnus-agent-current-history (gnus-agent-history-buffer)) - (gnus-agent-create-buffer)) - -(defun gnus-agent-stop-fetch () - "Save all data structures and clean up." - (gnus-agent-save-history) - (gnus-agent-close-history) - (setq gnus-agent-spam-hashtb nil) - (save-excursion - (set-buffer nntp-server-buffer) - (widen))) - -(defmacro gnus-agent-with-fetch (&rest forms) - "Do FORMS safely." - `(unwind-protect - (let ((gnus-agent-fetching t)) - (gnus-agent-start-fetch) - ,@forms) - (gnus-agent-stop-fetch))) - -(put 'gnus-agent-with-fetch 'lisp-indent-function 0) -(put 'gnus-agent-with-fetch 'edebug-form-spec '(body)) - -;;; -;;; Mode infestation -;;; - -(defvar gnus-agent-mode-hook nil - "Hook run when installing agent mode.") - -(defvar gnus-agent-mode nil) -(defvar gnus-agent-mode-status '(gnus-agent-mode " Plugged")) - -(defun gnus-agent-mode () - "Minor mode for providing a agent support in Gnus buffers." - (let* ((buffer (progn (string-match "^gnus-\\(.*\\)-mode$" - (symbol-name major-mode)) - (match-string 1 (symbol-name major-mode)))) - (mode (intern (format "gnus-agent-%s-mode" buffer)))) - (set (make-local-variable 'gnus-agent-mode) t) - (set mode nil) - (set (make-local-variable mode) t) - ;; Set up the menu. - (when (gnus-visual-p 'agent-menu 'menu) - (funcall (intern (format "gnus-agent-%s-make-menu-bar" buffer)))) - (unless (assq 'gnus-agent-mode minor-mode-alist) - (push gnus-agent-mode-status minor-mode-alist)) - (unless (assq mode minor-mode-map-alist) - (push (cons mode (symbol-value (intern (format "gnus-agent-%s-mode-map" - buffer)))) - minor-mode-map-alist)) - (when (eq major-mode 'gnus-group-mode) - (gnus-agent-toggle-plugged gnus-plugged)) - (gnus-run-hooks 'gnus-agent-mode-hook - (intern (format "gnus-agent-%s-mode-hook" buffer))))) - -(defvar gnus-agent-group-mode-map (make-sparse-keymap)) -(gnus-define-keys gnus-agent-group-mode-map - "Ju" gnus-agent-fetch-groups - "Jc" gnus-enter-category-buffer - "Jj" gnus-agent-toggle-plugged - "Js" gnus-agent-fetch-session - "JY" gnus-agent-synchronize-flags - "JS" gnus-group-send-drafts - "Ja" gnus-agent-add-group - "Jr" gnus-agent-remove-group) - -(defun gnus-agent-group-make-menu-bar () - (unless (boundp 'gnus-agent-group-menu) - (easy-menu-define - gnus-agent-group-menu gnus-agent-group-mode-map "" - '("Agent" - ["Toggle plugged" gnus-agent-toggle-plugged t] - ["List categories" gnus-enter-category-buffer t] - ["Send drafts" gnus-group-send-drafts gnus-plugged] - ("Fetch" - ["All" gnus-agent-fetch-session gnus-plugged] - ["Group" gnus-agent-fetch-group gnus-plugged]))))) - -(defvar gnus-agent-summary-mode-map (make-sparse-keymap)) -(gnus-define-keys gnus-agent-summary-mode-map - "Jj" gnus-agent-toggle-plugged - "Ju" gnus-agent-summary-fetch-group - "J#" gnus-agent-mark-article - "J\M-#" gnus-agent-unmark-article - "@" gnus-agent-toggle-mark - "Jc" gnus-agent-catchup) - -(defun gnus-agent-summary-make-menu-bar () - (unless (boundp 'gnus-agent-summary-menu) - (easy-menu-define - gnus-agent-summary-menu gnus-agent-summary-mode-map "" - '("Agent" - ["Toggle plugged" gnus-agent-toggle-plugged t] - ["Mark as downloadable" gnus-agent-mark-article t] - ["Unmark as downloadable" gnus-agent-unmark-article t] - ["Toggle mark" gnus-agent-toggle-mark t] - ["Fetch downloadable" gnus-agent-summary-fetch-group t] - ["Catchup undownloaded" gnus-agent-catchup t])))) - -(defvar gnus-agent-server-mode-map (make-sparse-keymap)) -(gnus-define-keys gnus-agent-server-mode-map - "Jj" gnus-agent-toggle-plugged - "Ja" gnus-agent-add-server - "Jr" gnus-agent-remove-server) - -(defun gnus-agent-server-make-menu-bar () - (unless (boundp 'gnus-agent-server-menu) - (easy-menu-define - gnus-agent-server-menu gnus-agent-server-mode-map "" - '("Agent" - ["Toggle plugged" gnus-agent-toggle-plugged t] - ["Add" gnus-agent-add-server t] - ["Remove" gnus-agent-remove-server t])))) - -(defun gnus-agent-make-mode-line-string (string mouse-button mouse-func) - (if (and (fboundp 'propertize) - (fboundp 'make-mode-line-mouse-map)) - (propertize string 'local-map - (make-mode-line-mouse-map mouse-button mouse-func)) - string)) - -(defun gnus-agent-toggle-plugged (plugged) - "Toggle whether Gnus is unplugged or not." - (interactive (list (not gnus-plugged))) - (if plugged - (progn - (setq gnus-plugged plugged) - (gnus-agent-possibly-synchronize-flags) - (gnus-run-hooks 'gnus-agent-plugged-hook) - (setcar (cdr gnus-agent-mode-status) - (gnus-agent-make-mode-line-string " Plugged" - 'mouse-2 - 'gnus-agent-toggle-plugged))) - (gnus-agent-close-connections) - (setq gnus-plugged plugged) - (gnus-run-hooks 'gnus-agent-unplugged-hook) - (setcar (cdr gnus-agent-mode-status) - (gnus-agent-make-mode-line-string " Unplugged" - 'mouse-2 - 'gnus-agent-toggle-plugged))) - (force-mode-line-update)) - -(defun gnus-agent-close-connections () - "Close all methods covered by the Gnus agent." - (let ((methods gnus-agent-covered-methods)) - (while methods - (gnus-close-server (pop methods))))) - -;;;###autoload -(defun gnus-unplugged () - "Start Gnus unplugged." - (interactive) - (setq gnus-plugged nil) - (gnus)) - -;;;###autoload -(defun gnus-plugged () - "Start Gnus plugged." - (interactive) - (setq gnus-plugged t) - (gnus)) - -;;;###autoload -(defun gnus-agentize () - "Allow Gnus to be an offline newsreader. -The normal usage of this command is to put the following as the -last form in your `.gnus.el' file: - -\(gnus-agentize) - -This will modify the `gnus-setup-news-hook', and -`message-send-mail-real-function' variables, and install the Gnus agent -minor mode in all Gnus buffers." - (interactive) - (gnus-open-agent) - (add-hook 'gnus-setup-news-hook 'gnus-agent-queue-setup) - (unless gnus-agent-send-mail-function - (setq gnus-agent-send-mail-function (or - message-send-mail-real-function - message-send-mail-function) - message-send-mail-real-function 'gnus-agent-send-mail)) - (unless gnus-agent-covered-methods - (setq gnus-agent-covered-methods (list gnus-select-method)))) - -(defun gnus-agent-queue-setup () - "Make sure the queue group exists." - (unless (gnus-gethash "nndraft:queue" gnus-newsrc-hashtb) - (gnus-request-create-group "queue" '(nndraft "")) - (let ((gnus-level-default-subscribed 1)) - (gnus-subscribe-group "nndraft:queue" nil '(nndraft ""))) - (gnus-group-set-parameter - "nndraft:queue" 'gnus-dummy '((gnus-draft-mode))))) - -(defun gnus-agent-send-mail () - (if gnus-plugged - (funcall gnus-agent-send-mail-function) - (goto-char (point-min)) - (re-search-forward - (concat "^" (regexp-quote mail-header-separator) "\n")) - (replace-match "\n") - (gnus-agent-insert-meta-information 'mail) - (gnus-request-accept-article "nndraft:queue" nil t t))) - -(defun gnus-agent-insert-meta-information (type &optional method) - "Insert meta-information into the message that says how it's to be posted. -TYPE can be either `mail' or `news'. If the latter, then METHOD can -be a select method." - (save-excursion - (message-remove-header gnus-agent-meta-information-header) - (goto-char (point-min)) - (insert gnus-agent-meta-information-header ": " - (symbol-name type) " " (format "%S" method) - "\n") - (forward-char -1) - (while (search-backward "\n" nil t) - (replace-match "\\n" t t)))) - -(defun gnus-agent-restore-gcc () - "Restore GCC field from saved header." - (save-excursion - (goto-char (point-min)) - (while (re-search-forward (concat gnus-agent-gcc-header ":") nil t) - (replace-match "Gcc:" 'fixedcase)))) - -(defun gnus-agent-any-covered-gcc () - (save-restriction - (message-narrow-to-headers) - (let* ((gcc (mail-fetch-field "gcc" nil t)) - (methods (and gcc - (mapcar 'gnus-inews-group-method - (message-unquote-tokens - (message-tokenize-header - gcc " ,"))))) - covered) - (while (and (not covered) methods) - (setq covered - (member (car methods) gnus-agent-covered-methods) - methods (cdr methods))) - covered))) - -(defun gnus-agent-possibly-save-gcc () - "Save GCC if Gnus is unplugged." - (when (and (not gnus-plugged) (gnus-agent-any-covered-gcc)) - (save-excursion - (goto-char (point-min)) - (let ((case-fold-search t)) - (while (re-search-forward "^gcc:" nil t) - (replace-match (concat gnus-agent-gcc-header ":") 'fixedcase)))))) - -(defun gnus-agent-possibly-do-gcc () - "Do GCC if Gnus is plugged." - (when (or gnus-plugged (not (gnus-agent-any-covered-gcc))) - (gnus-inews-do-gcc))) - -;;; -;;; Group mode commands -;;; - -(defun gnus-agent-fetch-groups (n) - "Put all new articles in the current groups into the Agent." - (interactive "P") - (unless gnus-plugged - (error "Groups can't be fetched when Gnus is unplugged")) - (gnus-group-iterate n 'gnus-agent-fetch-group)) - -(defun gnus-agent-fetch-group (group) - "Put all new articles in GROUP into the Agent." - (interactive (list (gnus-group-group-name))) - (let ((state gnus-plugged)) - (unwind-protect - (progn - (unless state - (gnus-agent-toggle-plugged gnus-plugged) - (unless group - (error "No group on the current line")) - (let ((gnus-command-method (gnus-find-method-for-group group))) - (gnus-agent-with-fetch - (gnus-agent-fetch-group-1 group gnus-command-method) - (gnus-message 5 "Fetching %s...done" group))))) - (when (and (not state) - gnus-plugged) - (gnus-agent-toggle-plugged gnus-plugged))))) - -(defun gnus-agent-add-group (category arg) - "Add the current group to an agent category." - (interactive - (list - (intern - (completing-read - "Add to category: " - (mapcar (lambda (cat) (list (symbol-name (car cat)))) - gnus-category-alist) - nil t)) - current-prefix-arg)) - (let ((cat (assq category gnus-category-alist)) - c groups) - (gnus-group-iterate arg - (lambda (group) - (when (cadddr (setq c (gnus-group-category group))) - (setf (cadddr c) (delete group (cadddr c)))) - (push group groups))) - (setf (cadddr cat) (nconc (cadddr cat) groups)) - (gnus-category-write))) - -(defun gnus-agent-remove-group (arg) - "Remove the current group from its agent category, if any." - (interactive "P") - (let (c) - (gnus-group-iterate arg - (lambda (group) - (when (cadddr (setq c (gnus-group-category group))) - (setf (cadddr c) (delete group (cadddr c)))))) - (gnus-category-write))) - -(defun gnus-agent-synchronize-flags () - "Synchronize unplugged flags with servers." - (interactive) - (save-excursion - (dolist (gnus-command-method gnus-agent-covered-methods) - (when (file-exists-p (gnus-agent-lib-file "flags")) - (gnus-agent-synchronize-flags-server gnus-command-method))))) - -(defun gnus-agent-possibly-synchronize-flags () - "Synchronize flags according to `gnus-agent-synchronize-flags'." - (interactive) - (save-excursion - (dolist (gnus-command-method gnus-agent-covered-methods) - (when (file-exists-p (gnus-agent-lib-file "flags")) - (gnus-agent-possibly-synchronize-flags-server gnus-command-method))))) - -(defun gnus-agent-synchronize-flags-server (method) - "Synchronize flags set when unplugged for server." - (let ((gnus-command-method method)) - (when (file-exists-p (gnus-agent-lib-file "flags")) - (set-buffer (get-buffer-create " *Gnus Agent flag synchronize*")) - (erase-buffer) - (nnheader-insert-file-contents (gnus-agent-lib-file "flags")) - (if (null (gnus-check-server gnus-command-method)) - (message "Couldn't open server %s" (nth 1 gnus-command-method)) - (while (not (eobp)) - (if (null (eval (read (current-buffer)))) - (progn (forward-line) - (kill-line -1)) - (write-file (gnus-agent-lib-file "flags")) - (error "Couldn't set flags from file %s" - (gnus-agent-lib-file "flags")))) - (delete-file (gnus-agent-lib-file "flags"))) - (kill-buffer nil)))) - -(defun gnus-agent-possibly-synchronize-flags-server (method) - "Synchronize flags for server according to `gnus-agent-synchronize-flags'." - (when (or (and gnus-agent-synchronize-flags - (not (eq gnus-agent-synchronize-flags 'ask))) - (and (eq gnus-agent-synchronize-flags 'ask) - (gnus-y-or-n-p (format "Synchronize flags on server `%s'? " - (cadr method))))) - (gnus-agent-synchronize-flags-server method))) - -;;; -;;; Server mode commands -;;; - -(defun gnus-agent-add-server (server) - "Enroll SERVER in the agent program." - (interactive (list (gnus-server-server-name))) - (unless server - (error "No server on the current line")) - (let ((method (gnus-server-get-method nil (gnus-server-server-name)))) - (when (member method gnus-agent-covered-methods) - (error "Server already in the agent program")) - (push method gnus-agent-covered-methods) - (gnus-server-update-server server) - (gnus-agent-write-servers) - (message "Entered %s into the Agent" server))) - -(defun gnus-agent-remove-server (server) - "Remove SERVER from the agent program." - (interactive (list (gnus-server-server-name))) - (unless server - (error "No server on the current line")) - (let ((method (gnus-server-get-method nil (gnus-server-server-name)))) - (unless (member method gnus-agent-covered-methods) - (error "Server not in the agent program")) - (setq gnus-agent-covered-methods - (delete method gnus-agent-covered-methods)) - (gnus-server-update-server server) - (gnus-agent-write-servers) - (message "Removed %s from the agent" server))) - -(defun gnus-agent-read-servers () - "Read the alist of covered servers." - (setq gnus-agent-covered-methods - (gnus-agent-read-file - (nnheader-concat gnus-agent-directory "lib/servers")))) - -(defun gnus-agent-write-servers () - "Write the alist of covered servers." - (gnus-make-directory (nnheader-concat gnus-agent-directory "lib")) - (let ((coding-system-for-write nnheader-file-coding-system) - (output-coding-system nnheader-file-coding-system) - (file-name-coding-system nnmail-pathname-coding-system) - (pathname-coding-system nnmail-pathname-coding-system)) - (with-temp-file (nnheader-concat gnus-agent-directory "lib/servers") - (prin1 gnus-agent-covered-methods (current-buffer))))) - -;;; -;;; Summary commands -;;; - -(defun gnus-agent-mark-article (n &optional unmark) - "Mark the next N articles as downloadable. -If N is negative, mark backward instead. If UNMARK is non-nil, remove -the mark instead. The difference between N and the actual number of -articles marked is returned." - (interactive "p") - (let ((backward (< n 0)) - (n (abs n))) - (while (and - (> n 0) - (progn - (gnus-summary-set-agent-mark - (gnus-summary-article-number) unmark) - (zerop (gnus-summary-next-subject (if backward -1 1) nil t)))) - (setq n (1- n))) - (when (/= 0 n) - (gnus-message 7 "No more articles")) - (gnus-summary-recenter) - (gnus-summary-position-point) - n)) - -(defun gnus-agent-unmark-article (n) - "Remove the downloadable mark from the next N articles. -If N is negative, unmark backward instead. The difference between N and -the actual number of articles unmarked is returned." - (interactive "p") - (gnus-agent-mark-article n t)) - -(defun gnus-agent-toggle-mark (n) - "Toggle the downloadable mark from the next N articles. -If N is negative, toggle backward instead. The difference between N and -the actual number of articles toggled is returned." - (interactive "p") - (gnus-agent-mark-article n 'toggle)) - -(defun gnus-summary-set-agent-mark (article &optional unmark) - "Mark ARTICLE as downloadable." - (let ((unmark (if (and (not (null unmark)) (not (eq t unmark))) - (memq article gnus-newsgroup-downloadable) - unmark))) - (if unmark - (progn - (setq gnus-newsgroup-downloadable - (delq article gnus-newsgroup-downloadable)) - (push article gnus-newsgroup-undownloaded)) - (setq gnus-newsgroup-undownloaded - (delq article gnus-newsgroup-undownloaded)) - (push article gnus-newsgroup-downloadable)) - (gnus-summary-update-mark - (if unmark gnus-undownloaded-mark gnus-downloadable-mark) - 'unread))) - -(defun gnus-agent-get-undownloaded-list () - "Mark all unfetched articles as read." - (let ((gnus-command-method (gnus-find-method-for-group gnus-newsgroup-name))) - (when (and (not gnus-plugged) - (gnus-agent-method-p gnus-command-method)) - (gnus-agent-load-alist gnus-newsgroup-name) - ;; First mark all undownloaded articles as undownloaded. - (dolist (article (mapcar (lambda (header) (mail-header-number header)) - gnus-newsgroup-headers)) - (unless (or (cdr (assq article gnus-agent-article-alist)) - (memq article gnus-newsgroup-downloadable) - (memq article gnus-newsgroup-cached)) - (push article gnus-newsgroup-undownloaded))) - ;; Then mark downloaded downloadable as not-downloadable, - ;; if you get my drift. - (dolist (article gnus-newsgroup-downloadable) - (when (cdr (assq article gnus-agent-article-alist)) - (setq gnus-newsgroup-downloadable - (delq article gnus-newsgroup-downloadable))))))) - -(defun gnus-agent-catchup () - "Mark all undownloaded articles as read." - (interactive) - (save-excursion - (while gnus-newsgroup-undownloaded - (gnus-summary-mark-article - (pop gnus-newsgroup-undownloaded) gnus-catchup-mark))) - (gnus-summary-position-point)) - -(defun gnus-agent-summary-fetch-group () - "Fetch the downloadable articles in the group." - (interactive) - (let ((articles gnus-newsgroup-downloadable) - (gnus-command-method (gnus-find-method-for-group gnus-newsgroup-name)) - (state gnus-plugged)) - (unwind-protect - (progn - (unless state - (gnus-agent-toggle-plugged t)) - (unless articles - (error "No articles to download")) - (gnus-agent-with-fetch - (gnus-agent-fetch-articles gnus-newsgroup-name articles)) - (save-excursion - (dolist (article articles) - (setq gnus-newsgroup-downloadable - (delq article gnus-newsgroup-downloadable)) - (gnus-summary-mark-article article gnus-unread-mark)))) - (when (and (not state) - gnus-plugged) - (gnus-agent-toggle-plugged nil))))) - -;;; -;;; Internal functions -;;; - -(defun gnus-agent-save-active (method) - (gnus-agent-save-active-1 method 'gnus-active-to-gnus-format)) - -(defun gnus-agent-save-active-1 (method function) - (when (gnus-agent-method-p method) - (let* ((gnus-command-method method) - (new (gnus-make-hashtable (count-lines (point-min) (point-max)))) - (file (gnus-agent-lib-file "active"))) - (funcall function nil new) - (gnus-agent-write-active file new) - (erase-buffer) - (insert-file-contents-as-coding-system gnus-agent-file-coding-system - file)))) - -(defun gnus-agent-write-active (file new) - (let ((orig (gnus-make-hashtable (count-lines (point-min) (point-max)))) - (file (gnus-agent-lib-file "active")) - elem osym) - (when (file-exists-p file) - (with-temp-buffer - (insert-file-contents-as-coding-system gnus-agent-file-coding-system - file) - (gnus-active-to-gnus-format nil orig)) - (mapatoms - (lambda (sym) - (when (and sym (boundp sym)) - (if (and (boundp (setq osym (intern (symbol-name sym) orig))) - (setq elem (symbol-value osym))) - (setcdr elem (cdr (symbol-value sym))) - (set (intern (symbol-name sym) orig) (symbol-value sym))))) - new)) - (gnus-make-directory (file-name-directory file)) - ;; The hashtable contains real names of groups, no more prefix - ;; removing, so set `full' to `t'. - (gnus-write-active-file file orig t))) - -(defun gnus-agent-save-groups (method) - (gnus-agent-save-active-1 method 'gnus-groups-to-gnus-format)) - -(defun gnus-agent-save-group-info (method group active) - (when (gnus-agent-method-p method) - (let* ((gnus-command-method method) - (coding-system-for-write nnheader-file-coding-system) - (output-coding-system nnheader-file-coding-system) - (file-name-coding-system nnmail-pathname-coding-system) - (pathname-coding-system nnmail-pathname-coding-system) - (file (gnus-agent-lib-file "active")) - oactive-min) - (gnus-make-directory (file-name-directory file)) - (with-temp-file file - (when (file-exists-p file) - (nnheader-insert-file-contents file)) - (goto-char (point-min)) - (when (re-search-forward - (concat "^" (regexp-quote group) " ") nil t) - (save-excursion - (read (current-buffer)) ;; max - (setq oactive-min (read (current-buffer)))) ;; min - (gnus-delete-line)) - (insert (format "%S %d %d y\n" (intern group) - (cdr active) - (or oactive-min (car active)))) - (goto-char (point-max)) - (while (search-backward "\\." nil t) - (delete-char 1)))))) - -(defun gnus-agent-group-path (group) - "Translate GROUP into a path." - (if nnmail-use-long-file-names - (gnus-group-real-name group) - (nnheader-translate-file-chars - (nnheader-replace-chars-in-string - (nnheader-replace-duplicate-chars-in-string - (nnheader-replace-chars-in-string - (gnus-group-real-name group) - ?/ ?_) - ?. ?_) - ?. ?/)))) - - - -(defun gnus-agent-method-p (method) - "Say whether METHOD is covered by the agent." - (member method gnus-agent-covered-methods)) - -(defun gnus-agent-get-function (method) - (if (and (not gnus-plugged) - (gnus-agent-method-p method)) - (progn - (require 'nnagent) - 'nnagent) - (car method))) - -;;; History functions - -(defun gnus-agent-history-buffer () - (cdr (assoc (gnus-agent-method) gnus-agent-history-buffers))) - -(defun gnus-agent-open-history () - (save-excursion - (push (cons (gnus-agent-method) - (set-buffer (gnus-get-buffer-create - (format " *Gnus agent %s history*" - (gnus-agent-method))))) - gnus-agent-history-buffers) - (erase-buffer) - (insert "\n") - (let ((file (gnus-agent-lib-file "history"))) - (when (file-exists-p file) - (nnheader-insert-file-contents file)) - (set (make-local-variable 'gnus-agent-file-name) file)))) - -(defun gnus-agent-save-history () - (save-excursion - (set-buffer gnus-agent-current-history) - (gnus-make-directory (file-name-directory gnus-agent-file-name)) - (write-region-as-coding-system - gnus-agent-file-coding-system - (1+ (point-min)) (point-max) gnus-agent-file-name nil 'silent))) - -(defun gnus-agent-close-history () - (when (gnus-buffer-live-p gnus-agent-current-history) - (kill-buffer gnus-agent-current-history) - (setq gnus-agent-history-buffers - (delq (assoc (gnus-agent-method) gnus-agent-history-buffers) - gnus-agent-history-buffers)))) - -(defun gnus-agent-enter-history (id group-arts date) - (save-excursion - (set-buffer gnus-agent-current-history) - (goto-char (point-max)) - (let ((p (point))) - (insert id "\t" (number-to-string date) "\t") - (while group-arts - (insert (format "%S" (intern (caar group-arts))) - " " (number-to-string (cdr (pop group-arts))) - " ")) - (insert "\n") - (while (search-backward "\\." p t) - (delete-char 1))))) - -(defun gnus-agent-article-in-history-p (id) - (save-excursion - (set-buffer (gnus-agent-history-buffer)) - (goto-char (point-min)) - (search-forward (concat "\n" id "\t") nil t))) - -(defun gnus-agent-history-path (id) - (save-excursion - (set-buffer (gnus-agent-history-buffer)) - (goto-char (point-min)) - (when (search-forward (concat "\n" id "\t") nil t) - (let ((method (gnus-agent-method))) - (let (paths group) - (while (not (numberp (setq group (read (current-buffer))))) - (push (concat method "/" group) paths)) - (nreverse paths)))))) - -;;; -;;; Fetching -;;; - -(defun gnus-agent-fetch-articles (group articles) - "Fetch ARTICLES from GROUP and put them into the Agent." - (when articles - ;; Prune off articles that we have already fetched. - (while (and articles - (cdr (assq (car articles) gnus-agent-article-alist))) - (pop articles)) - (let ((arts articles)) - (while (cdr arts) - (if (cdr (assq (cadr arts) gnus-agent-article-alist)) - (setcdr arts (cddr arts)) - (setq arts (cdr arts))))) - (when articles - (let ((dir (concat - (gnus-agent-directory) - (gnus-agent-group-path group) "/")) - (date (time-to-days (current-time))) - (case-fold-search t) - pos crosses id elem) - (gnus-make-directory dir) - (gnus-message 7 "Fetching articles for %s..." group) - ;; Fetch the articles from the backend. - (if (gnus-check-backend-function 'retrieve-articles group) - (setq pos (gnus-retrieve-articles articles group)) - (with-temp-buffer - (let (article) - (while (setq article (pop articles)) - (when (or - (gnus-backlog-request-article group article - nntp-server-buffer) - (gnus-request-article article group)) - (goto-char (point-max)) - (push (cons article (point)) pos) - (insert-buffer-substring nntp-server-buffer))) - (copy-to-buffer nntp-server-buffer (point-min) (point-max)) - (setq pos (nreverse pos))))) - ;; Then save these articles into the Agent. - (save-excursion - (set-buffer nntp-server-buffer) - (while pos - (narrow-to-region (cdar pos) (or (cdadr pos) (point-max))) - (goto-char (point-min)) - (when (search-forward "\n\n" nil t) - (when (search-backward "\nXrefs: " nil t) - ;; Handle crossposting. - (skip-chars-forward "^ ") - (skip-chars-forward " ") - (setq crosses nil) - (while (looking-at "\\([^: \n]+\\):\\([0-9]+\\) +") - (push (cons (buffer-substring (match-beginning 1) - (match-end 1)) - (buffer-substring (match-beginning 2) - (match-end 2))) - crosses) - (goto-char (match-end 0))) - (gnus-agent-crosspost crosses (caar pos)))) - (goto-char (point-min)) - (if (not (re-search-forward "^Message-ID: *<\\([^>\n]+\\)>" nil t)) - (setq id "No-Message-ID-in-article") - (setq id (buffer-substring (match-beginning 1) (match-end 1)))) - (write-region-as-coding-system - gnus-agent-file-coding-system - (point-min) (point-max) - (concat dir (number-to-string (caar pos))) nil 'silent) - (when (setq elem (assq (caar pos) gnus-agent-article-alist)) - (setcdr elem t)) - (gnus-agent-enter-history - id (or crosses (list (cons group (caar pos)))) date) - (widen) - (pop pos))) - (gnus-agent-save-alist group))))) - -(defun gnus-agent-crosspost (crosses article) - (let (gnus-agent-article-alist group alist beg end) - (save-excursion - (set-buffer gnus-agent-overview-buffer) - (when (nnheader-find-nov-line article) - (forward-word 1) - (setq beg (point)) - (setq end (progn (forward-line 1) (point))))) - (while crosses - (setq group (caar crosses)) - (unless (setq alist (assoc group gnus-agent-group-alist)) - (push (setq alist (list group (gnus-agent-load-alist (caar crosses)))) - gnus-agent-group-alist)) - (setcdr alist (cons (cons (cdar crosses) t) (cdr alist))) - (save-excursion - (set-buffer (gnus-get-buffer-create (format " *Gnus agent overview %s*" - group))) - (when (= (point-max) (point-min)) - (push (cons group (current-buffer)) gnus-agent-buffer-alist) - (ignore-errors - (nnheader-insert-file-contents - (gnus-agent-article-name ".overview" group)))) - (nnheader-find-nov-line (string-to-number (cdar crosses))) - (insert (string-to-number (cdar crosses))) - (insert-buffer-substring gnus-agent-overview-buffer beg end)) - (pop crosses)))) - -(defun gnus-agent-flush-cache () - (save-excursion - (while gnus-agent-buffer-alist - (set-buffer (cdar gnus-agent-buffer-alist)) - (write-region-as-coding-system - gnus-agent-file-coding-system - (point-min) (point-max) - (gnus-agent-article-name ".overview" - (caar gnus-agent-buffer-alist)) - nil 'silent) - (pop gnus-agent-buffer-alist)) - (while gnus-agent-group-alist - (with-temp-file (caar gnus-agent-group-alist) - (princ (cdar gnus-agent-group-alist)) - (insert "\n")) - (pop gnus-agent-group-alist)))) - -(defun gnus-agent-fetch-headers (group &optional force) - (let* ((articles (gnus-list-of-unread-articles group)) - (len (length articles)) - (gnus-decode-encoded-word-function 'identity) - (file (gnus-agent-article-name ".overview" group)) - i) - ;; Check the number of articles is not too large. - (when (and (integerp gnus-agent-large-newsgroup) - (< 0 gnus-agent-large-newsgroup)) - (and (< 0 (setq i (- len gnus-agent-large-newsgroup))) - (setq articles (nthcdr i articles)))) - ;; add article with marks to list of article headers we want to fetch. - (dolist (arts (gnus-info-marks (gnus-get-info group))) - (setq articles (gnus-union (gnus-uncompress-sequence (cdr arts)) - articles))) - (setq articles (sort articles '<)) - ;; Remove known articles. - (when (gnus-agent-load-alist group) - (setq articles (gnus-sorted-intersection - articles - (gnus-uncompress-range - (cons (1+ (caar (last gnus-agent-article-alist))) - (cdr (gnus-active group))))))) - ;; Fetch them. - (gnus-make-directory (nnheader-translate-file-chars - (file-name-directory file) t)) - (when articles - (gnus-message 7 "Fetching headers for %s..." group) - (save-excursion - (set-buffer nntp-server-buffer) - (unless (eq 'nov (gnus-retrieve-headers articles group)) - (nnvirtual-convert-headers)) - ;; Save these headers for later processing. - (copy-to-buffer gnus-agent-overview-buffer (point-min) (point-max)) - (when (file-exists-p file) - (gnus-agent-braid-nov group articles file)) - (write-region-as-coding-system - gnus-agent-file-coding-system - (point-min) (point-max) file nil 'silent) - (gnus-agent-save-alist group articles nil) - (gnus-agent-enter-history - "last-header-fetched-for-session" - (list (cons group (nth (- (length articles) 1) articles))) - (time-to-days (current-time))) - articles)))) - -(defsubst gnus-agent-copy-nov-line (article) - (let (b e) - (set-buffer gnus-agent-overview-buffer) - (setq b (point)) - (if (eq article (read (current-buffer))) - (setq e (progn (forward-line 1) (point))) - (progn - (beginning-of-line) - (setq e b))) - (set-buffer nntp-server-buffer) - (insert-buffer-substring gnus-agent-overview-buffer b e))) - -(defun gnus-agent-braid-nov (group articles file) - (set-buffer gnus-agent-overview-buffer) - (goto-char (point-min)) - (set-buffer nntp-server-buffer) - (erase-buffer) - (nnheader-insert-file-contents file) - (goto-char (point-max)) - (if (or (= (point-min) (point-max)) - (progn - (forward-line -1) - (< (read (current-buffer)) (car articles)))) - ;; We have only headers that are after the older headers, - ;; so we just append them. - (progn - (goto-char (point-max)) - (insert-buffer-substring gnus-agent-overview-buffer)) - ;; We do it the hard way. - (nnheader-find-nov-line (car articles)) - (gnus-agent-copy-nov-line (car articles)) - (pop articles) - (while (and articles - (not (eobp))) - (while (and (not (eobp)) - (< (read (current-buffer)) (car articles))) - (forward-line 1)) - (beginning-of-line) - (unless (eobp) - (gnus-agent-copy-nov-line (car articles)) - (setq articles (cdr articles)))) - (when articles - (let (b e) - (set-buffer gnus-agent-overview-buffer) - (setq b (point) - e (point-max)) - (set-buffer nntp-server-buffer) - (insert-buffer-substring gnus-agent-overview-buffer b e))))) - -(defun gnus-agent-load-alist (group &optional dir) - "Load the article-state alist for GROUP." - (setq gnus-agent-article-alist - (gnus-agent-read-file - (if dir - (expand-file-name ".agentview" dir) - (gnus-agent-article-name ".agentview" group))))) - -(defun gnus-agent-save-alist (group &optional articles state dir) - "Save the article-state alist for GROUP." - (let ((file-name-coding-system nnmail-pathname-coding-system) - (pathname-coding-system nnmail-pathname-coding-system) - print-level print-length) - (with-temp-file (if dir - (expand-file-name ".agentview" dir) - (gnus-agent-article-name ".agentview" group)) - (princ (setq gnus-agent-article-alist - (nconc gnus-agent-article-alist - (mapcar (lambda (article) (cons article state)) - articles))) - (current-buffer)) - (insert "\n")))) - -(defun gnus-agent-article-name (article group) - (expand-file-name (if (stringp article) article (string-to-number article)) - (file-name-as-directory - (expand-file-name (gnus-agent-group-path group) - (gnus-agent-directory))))) - -;;;###autoload -(defun gnus-agent-batch-fetch () - "Start Gnus and fetch session." - (interactive) - (gnus) - (let ((gnus-agent-confirmation-function 'gnus-agent-batch-confirmation)) - (gnus-agent-fetch-session)) - (gnus-group-exit)) - -(defun gnus-agent-fetch-session () - "Fetch all articles and headers that are eligible for fetching." - (interactive) - (unless gnus-agent-covered-methods - (error "No servers are covered by the Gnus agent")) - (unless gnus-plugged - (error "Can't fetch articles while Gnus is unplugged")) - (let ((methods gnus-agent-covered-methods) - groups group gnus-command-method) - (save-excursion - (while methods - (condition-case err - (progn - (setq gnus-command-method (car methods)) - (when (or (gnus-server-opened gnus-command-method) - (gnus-open-server gnus-command-method)) - (setq groups (gnus-groups-from-server (car methods))) - (gnus-agent-with-fetch - (while (setq group (pop groups)) - (when (<= (gnus-group-level group) gnus-agent-handle-level) - (gnus-agent-fetch-group-1 group gnus-command-method)))))) - (error - (unless (funcall gnus-agent-confirmation-function - (format "Error (%s). Continue? " err)) - (error "Cannot fetch articles into the Gnus agent"))) - (quit - (unless (funcall gnus-agent-confirmation-function - (format "Quit fetching session (%s). Continue? " - err)) - (signal 'quit "Cannot fetch articles into the Gnus agent")))) - (pop methods)) - (gnus-message 6 "Finished fetching articles into the Gnus agent")))) - -(defun gnus-agent-fetch-group-1 (group method) - "Fetch GROUP." - (let ((gnus-command-method method) - (gnus-newsgroup-name group) - gnus-newsgroup-dependencies gnus-newsgroup-headers - gnus-newsgroup-scored gnus-headers gnus-score - gnus-use-cache articles arts - category predicate info marks score-param - (gnus-summary-expunge-below gnus-summary-expunge-below) - (gnus-summary-mark-below gnus-summary-mark-below) - (gnus-orphan-score gnus-orphan-score) - ;; Maybe some other gnus-summary local variables should also - ;; be put here. - ) - (unless (gnus-check-group group) - (error "Can't open server for %s" group)) - ;; Fetch headers. - (when (and (or (gnus-active group) - (gnus-activate-group group)) - (setq articles (gnus-agent-fetch-headers group)) - (let ((nntp-server-buffer gnus-agent-overview-buffer)) - ;; Parse them and see which articles we want to fetch. - (setq gnus-newsgroup-dependencies - (make-vector (length articles) 0)) - (setq gnus-newsgroup-headers - (gnus-get-newsgroup-headers-xover articles nil nil - group)) - ;; `gnus-agent-overview-buffer' may be killed for - ;; timeout reason. If so, recreate it. - (gnus-agent-create-buffer))) - (setq category (gnus-group-category group)) - (setq predicate - (gnus-get-predicate - (or (gnus-group-find-parameter group 'agent-predicate t) - (cadr category)))) - (if (memq predicate '(gnus-agent-true gnus-agent-false)) - ;; Simple implementation - (setq arts (and (eq predicate 'gnus-agent-true) articles)) - (setq arts nil) - (setq score-param - (or (gnus-group-get-parameter group 'agent-score t) - (caddr category))) - ;; Translate score-param into real one - (cond - ((not score-param)) - ((eq score-param 'file) - (setq score-param (gnus-all-score-files group))) - ((stringp (car score-param))) - (t - (setq score-param (list (list score-param))))) - (when score-param - (gnus-score-headers score-param)) - (while (setq gnus-headers (pop gnus-newsgroup-headers)) - (setq gnus-score - (or (cdr (assq (mail-header-number gnus-headers) - gnus-newsgroup-scored)) - gnus-summary-default-score)) - (when (funcall predicate) - (push (mail-header-number gnus-headers) - arts)))) - ;; Fetch the articles. - (when arts - (gnus-agent-fetch-articles group arts))) - ;; Perhaps we have some additional articles to fetch. - (setq arts (assq 'download (gnus-info-marks - (setq info (gnus-get-info group))))) - (when (cdr arts) - (gnus-agent-fetch-articles - group (gnus-uncompress-range (cdr arts))) - (setq marks (delq arts (gnus-info-marks info))) - (gnus-info-set-marks info marks) - (gnus-dribble-enter - (concat "(gnus-group-set-info '" - (gnus-prin1-to-string info) - ")"))))) - -;;; -;;; Agent Category Mode -;;; - -(defvar gnus-category-mode-hook nil - "Hook run in `gnus-category-mode' buffers.") - -(defvar gnus-category-line-format " %(%20c%): %g\n" - "Format of category lines.") - -(defvar gnus-category-mode-line-format "Gnus: %%b" - "The format specification for the category mode line.") - -(defvar gnus-agent-short-article 100 - "Articles that have fewer lines than this are short.") - -(defvar gnus-agent-long-article 200 - "Articles that have more lines than this are long.") - -(defvar gnus-agent-low-score 0 - "Articles that have a score lower than this have a low score.") - -(defvar gnus-agent-high-score 0 - "Articles that have a score higher than this have a high score.") - - -;;; Internal variables. - -(defvar gnus-category-buffer "*Agent Category*") - -(defvar gnus-category-line-format-alist - `((?c gnus-tmp-name ?s) - (?g gnus-tmp-groups ?d))) - -(defvar gnus-category-mode-line-format-alist - `((?u user-defined ?s))) - -(defvar gnus-category-line-format-spec nil) -(defvar gnus-category-mode-line-format-spec nil) - -(defvar gnus-category-mode-map nil) -(put 'gnus-category-mode 'mode-class 'special) - -(unless gnus-category-mode-map - (setq gnus-category-mode-map (make-sparse-keymap)) - (suppress-keymap gnus-category-mode-map) - - (gnus-define-keys gnus-category-mode-map - "q" gnus-category-exit - "k" gnus-category-kill - "c" gnus-category-copy - "a" gnus-category-add - "p" gnus-category-edit-predicate - "g" gnus-category-edit-groups - "s" gnus-category-edit-score - "l" gnus-category-list - - "\C-c\C-i" gnus-info-find-node - "\C-c\C-b" gnus-bug)) - -(defvar gnus-category-menu-hook nil - "*Hook run after the creation of the menu.") - -(defun gnus-category-make-menu-bar () - (gnus-turn-off-edit-menu 'category) - (unless (boundp 'gnus-category-menu) - (easy-menu-define - gnus-category-menu gnus-category-mode-map "" - '("Categories" - ["Add" gnus-category-add t] - ["Kill" gnus-category-kill t] - ["Copy" gnus-category-copy t] - ["Edit predicate" gnus-category-edit-predicate t] - ["Edit score" gnus-category-edit-score t] - ["Edit groups" gnus-category-edit-groups t] - ["Exit" gnus-category-exit t])) - - (gnus-run-hooks 'gnus-category-menu-hook))) - -(defun gnus-category-mode () - "Major mode for listing and editing agent categories. - -All normal editing commands are switched off. -\\ -For more in-depth information on this mode, read the manual -(`\\[gnus-info-find-node]'). - -The following commands are available: - -\\{gnus-category-mode-map}" - (interactive) - (when (gnus-visual-p 'category-menu 'menu) - (gnus-category-make-menu-bar)) - (kill-all-local-variables) - (gnus-simplify-mode-line) - (setq major-mode 'gnus-category-mode) - (setq mode-name "Category") - (gnus-set-default-directory) - (setq mode-line-process nil) - (use-local-map gnus-category-mode-map) - (buffer-disable-undo) - (setq truncate-lines t) - (setq buffer-read-only t) - (gnus-run-hooks 'gnus-category-mode-hook)) - -(defalias 'gnus-category-position-point 'gnus-goto-colon) - -(defun gnus-category-insert-line (category) - (let* ((gnus-tmp-name (car category)) - (gnus-tmp-groups (length (cadddr category)))) - (beginning-of-line) - (gnus-add-text-properties - (point) - (prog1 (1+ (point)) - ;; Insert the text. - (eval gnus-category-line-format-spec)) - (list 'gnus-category gnus-tmp-name)))) - -(defun gnus-enter-category-buffer () - "Go to the Category buffer." - (interactive) - (gnus-category-setup-buffer) - (gnus-configure-windows 'category) - (gnus-category-prepare)) - -(defun gnus-category-setup-buffer () - (unless (get-buffer gnus-category-buffer) - (save-excursion - (set-buffer (gnus-get-buffer-create gnus-category-buffer)) - (gnus-category-mode)))) - -(defun gnus-category-prepare () - (gnus-set-format 'category-mode) - (gnus-set-format 'category t) - (let ((alist gnus-category-alist) - (buffer-read-only nil)) - (erase-buffer) - (while alist - (gnus-category-insert-line (pop alist))) - (goto-char (point-min)) - (gnus-category-position-point))) - -(defun gnus-category-name () - (or (get-text-property (gnus-point-at-bol) 'gnus-category) - (error "No category on the current line"))) - -(defun gnus-category-read () - "Read the category alist." - (setq gnus-category-alist - (or (gnus-agent-read-file - (nnheader-concat gnus-agent-directory "lib/categories")) - (list (list 'default 'short nil nil))))) - -(defun gnus-category-write () - "Write the category alist." - (setq gnus-category-predicate-cache nil - gnus-category-group-cache nil) - (gnus-make-directory (nnheader-concat gnus-agent-directory "lib")) - (with-temp-file (nnheader-concat gnus-agent-directory "lib/categories") - (prin1 gnus-category-alist (current-buffer)))) - -(defun gnus-category-edit-predicate (category) - "Edit the predicate for CATEGORY." - (interactive (list (gnus-category-name))) - (let ((info (assq category gnus-category-alist))) - (gnus-edit-form - (cadr info) (format "Editing the predicate for category %s" category) - `(lambda (predicate) - (setcar (cdr (assq ',category gnus-category-alist)) predicate) - (gnus-category-write) - (gnus-category-list))))) - -(defun gnus-category-edit-score (category) - "Edit the score expression for CATEGORY." - (interactive (list (gnus-category-name))) - (let ((info (assq category gnus-category-alist))) - (gnus-edit-form - (caddr info) - (format "Editing the score expression for category %s" category) - `(lambda (groups) - (setcar (nthcdr 2 (assq ',category gnus-category-alist)) groups) - (gnus-category-write) - (gnus-category-list))))) - -(defun gnus-category-edit-groups (category) - "Edit the group list for CATEGORY." - (interactive (list (gnus-category-name))) - (let ((info (assq category gnus-category-alist))) - (gnus-edit-form - (cadddr info) (format "Editing the group list for category %s" category) - `(lambda (groups) - (setcar (nthcdr 3 (assq ',category gnus-category-alist)) groups) - (gnus-category-write) - (gnus-category-list))))) - -(defun gnus-category-kill (category) - "Kill the current category." - (interactive (list (gnus-category-name))) - (let ((info (assq category gnus-category-alist)) - (buffer-read-only nil)) - (gnus-delete-line) - (setq gnus-category-alist (delq info gnus-category-alist)) - (gnus-category-write))) - -(defun gnus-category-copy (category to) - "Copy the current category." - (interactive (list (gnus-category-name) (intern (read-string "New name: ")))) - (let ((info (assq category gnus-category-alist))) - (push (list to (gnus-copy-sequence (cadr info)) - (gnus-copy-sequence (caddr info)) nil) - gnus-category-alist) - (gnus-category-write) - (gnus-category-list))) - -(defun gnus-category-add (category) - "Create a new category." - (interactive "SCategory name: ") - (when (assq category gnus-category-alist) - (error "Category %s already exists" category)) - (push (list category 'false nil nil) - gnus-category-alist) - (gnus-category-write) - (gnus-category-list)) - -(defun gnus-category-list () - "List all categories." - (interactive) - (gnus-category-prepare)) - -(defun gnus-category-exit () - "Return to the group buffer." - (interactive) - (kill-buffer (current-buffer)) - (gnus-configure-windows 'group t)) - -;; To avoid having 8-bit characters in the source file. -(defvar gnus-category-not (list '! 'not (intern (format "%c" 172)))) - -(defvar gnus-category-predicate-alist - '((spam . gnus-agent-spam-p) - (short . gnus-agent-short-p) - (long . gnus-agent-long-p) - (low . gnus-agent-low-scored-p) - (high . gnus-agent-high-scored-p) - (true . gnus-agent-true) - (false . gnus-agent-false)) - "Mapping from short score predicate symbols to predicate functions.") - -(defun gnus-agent-spam-p () - "Say whether an article is spam or not." - (unless gnus-agent-spam-hashtb - (setq gnus-agent-spam-hashtb (gnus-make-hashtable 1000))) - (if (not (equal (mail-header-references gnus-headers) "")) - nil - (let ((string (gnus-simplify-subject (mail-header-subject gnus-headers)))) - (prog1 - (gnus-gethash string gnus-agent-spam-hashtb) - (gnus-sethash string t gnus-agent-spam-hashtb))))) - -(defun gnus-agent-short-p () - "Say whether an article is short or not." - (< (mail-header-lines gnus-headers) gnus-agent-short-article)) - -(defun gnus-agent-long-p () - "Say whether an article is long or not." - (> (mail-header-lines gnus-headers) gnus-agent-long-article)) - -(defun gnus-agent-low-scored-p () - "Say whether an article has a low score or not." - (< gnus-score gnus-agent-low-score)) - -(defun gnus-agent-high-scored-p () - "Say whether an article has a high score or not." - (> gnus-score gnus-agent-high-score)) - -(defun gnus-category-make-function (cat) - "Make a function from category CAT." - (let ((func (gnus-category-make-function-1 cat))) - (if (and (= (length func) 1) - (symbolp (car func))) - (car func) - (gnus-byte-compile `(lambda () ,func))))) - -(defun gnus-agent-true () - "Return t." - t) - -(defun gnus-agent-false () - "Return nil." - nil) - -(defun gnus-category-make-function-1 (cat) - "Make a function from category CAT." - (cond - ;; Functions are just returned as is. - ((or (symbolp cat) - (gnus-functionp cat)) - `(,(or (cdr (assq cat gnus-category-predicate-alist)) - cat))) - ;; More complex category. - ((consp cat) - `(,(cond - ((memq (car cat) '(& and)) - 'and) - ((memq (car cat) '(| or)) - 'or) - ((memq (car cat) gnus-category-not) - 'not)) - ,@(mapcar 'gnus-category-make-function-1 (cdr cat)))) - (t - (error "Unknown category type: %s" cat)))) - -(defun gnus-get-predicate (predicate) - "Return the predicate for CATEGORY." - (or (cdr (assoc predicate gnus-category-predicate-cache)) - (cdar (push (cons predicate - (gnus-category-make-function predicate)) - gnus-category-predicate-cache)))) - -(defun gnus-group-category (group) - "Return the category GROUP belongs to." - (unless gnus-category-group-cache - (setq gnus-category-group-cache (gnus-make-hashtable 1000)) - (let ((cs gnus-category-alist) - groups cat) - (while (setq cat (pop cs)) - (setq groups (cadddr cat)) - (while groups - (gnus-sethash (pop groups) cat gnus-category-group-cache))))) - (or (gnus-gethash group gnus-category-group-cache) - (assq 'default gnus-category-alist))) - -(defun gnus-agent-expire () - "Expire all old articles." - (interactive) - (let ((methods gnus-agent-covered-methods) - (day (- (time-to-days (current-time)) gnus-agent-expire-days)) - gnus-command-method sym group articles - history overview file histories elem art nov-file low info - unreads marked article orig lowest highest) - (save-excursion - (setq overview (gnus-get-buffer-create " *expire overview*")) - (while (setq gnus-command-method (pop methods)) - (when (file-exists-p (gnus-agent-lib-file "active")) - (with-temp-buffer - (insert-file-contents-as-coding-system - gnus-agent-file-coding-system (gnus-agent-lib-file "active")) - (gnus-active-to-gnus-format - gnus-command-method - (setq orig (gnus-make-hashtable - (count-lines (point-min) (point-max)))))) - (let ((expiry-hashtb (gnus-make-hashtable 1023))) - (gnus-agent-open-history) - (set-buffer - (setq gnus-agent-current-history - (setq history (gnus-agent-history-buffer)))) - (goto-char (point-min)) - (when (> (buffer-size) 1) - (goto-char (point-min)) - (while (not (eobp)) - (skip-chars-forward "^\t") - (if (let ((fetch-date (read (current-buffer)))) - (if (numberp fetch-date) - (> fetch-date day) - ;; History file is corrupted. - (gnus-message - 5 - (format "File %s is corrupted!" - (gnus-agent-lib-file "history"))) - (sit-for 1) - ;; Ignore it - t)) - ;; New article; we don't expire it. - (forward-line 1) - ;; Old article. Schedule it for possible nuking. - (while (not (eolp)) - (setq sym (let ((obarray expiry-hashtb) s) - (setq s (read (current-buffer))) - (if (stringp s) (intern s) s))) - (if (boundp sym) - (set sym (cons (cons (read (current-buffer)) (point)) - (symbol-value sym))) - (set sym (list (cons (read (current-buffer)) (point))))) - (skip-chars-forward " ")) - (forward-line 1))) - ;; We now have all articles that can possibly be expired. - (mapatoms - (lambda (sym) - (setq group (symbol-name sym) - articles (sort (symbol-value sym) 'car-less-than-car) - low (car (gnus-active group)) - info (gnus-get-info group) - unreads (ignore-errors - (gnus-list-of-unread-articles group)) - marked (nconc - (gnus-uncompress-range - (cdr (assq 'tick (gnus-info-marks info)))) - (gnus-uncompress-range - (cdr (assq 'dormant (gnus-info-marks info)))) - (gnus-uncompress-range - (cdr (assq 'save (gnus-info-marks info)))) - (gnus-uncompress-range - (cdr (assq 'reply (gnus-info-marks info))))) - nov-file (gnus-agent-article-name ".overview" group) - lowest nil - highest nil) - (gnus-agent-load-alist group) - (gnus-message 5 "Expiring articles in %s" group) - (set-buffer overview) - (erase-buffer) - (when (file-exists-p nov-file) - (nnheader-insert-file-contents nov-file)) - (goto-char (point-min)) - (setq article 0) - (while (setq elem (pop articles)) - (setq article (car elem)) - (when (or (null low) - (< article low) - gnus-agent-expire-all - (and (not (memq article unreads)) - (not (memq article marked)))) - ;; Find and nuke the NOV line. - (while (and (not (eobp)) - (or (not (numberp - (setq art (read (current-buffer))))) - (< art article))) - (if (and (numberp art) - (file-exists-p - (gnus-agent-article-name - (number-to-string art) group))) - (progn - (unless lowest - (setq lowest art)) - (setq highest art) - (forward-line 1)) - ;; Remove old NOV lines that have no articles. - (gnus-delete-line))) - (if (or (eobp) - (/= art article)) - (beginning-of-line) - (gnus-delete-line)) - ;; Nuke the article. - (when (file-exists-p - (setq file (gnus-agent-article-name - (number-to-string article) - group))) - (delete-file file)) - ;; Schedule the history line for nuking. - (push (cdr elem) histories))) - (gnus-make-directory (file-name-directory nov-file)) - (write-region-as-coding-system - gnus-agent-file-coding-system - (point-min) (point-max) nov-file nil 'silent) - ;; Delete the unwanted entries in the alist. - (setq gnus-agent-article-alist - (sort gnus-agent-article-alist 'car-less-than-car)) - (let* ((alist gnus-agent-article-alist) - (prev (cons nil alist)) - (first prev) - expired) - (while (and alist - (<= (caar alist) article)) - (if (or (not (cdar alist)) - (not (file-exists-p - (gnus-agent-article-name - (number-to-string - (caar alist)) - group)))) - (progn - (push (caar alist) expired) - (setcdr prev (setq alist (cdr alist)))) - (setq prev alist - alist (cdr alist)))) - (setq gnus-agent-article-alist (cdr first)) - (gnus-agent-save-alist group) - ;; Mark all articles up to the first article - ;; in `gnus-article-alist' as read. - (when (and info (caar gnus-agent-article-alist)) - (setcar (nthcdr 2 info) - (gnus-range-add - (nth 2 info) - (cons 1 (- (caar gnus-agent-article-alist) 1))))) - ;; Maybe everything has been expired from `gnus-article-alist' - ;; and so the above marking as read could not be conducted, - ;; or there are expired article within the range of the alist. - (when (and info - expired - (or (not (caar gnus-agent-article-alist)) - (> (car expired) - (caar gnus-agent-article-alist)))) - (setcar (nthcdr 2 info) - (gnus-add-to-range - (nth 2 info) - (nreverse expired)))) - (gnus-dribble-enter - (concat "(gnus-group-set-info '" - (gnus-prin1-to-string info) - ")"))) - (when lowest - (if (gnus-gethash group orig) - (setcar (gnus-gethash group orig) lowest) - (gnus-sethash group (cons lowest highest) orig)))) - expiry-hashtb) - (set-buffer history) - (setq histories (nreverse (sort histories '<))) - (while histories - (goto-char (pop histories)) - (gnus-delete-line)) - (gnus-agent-save-history) - (gnus-agent-close-history) - (gnus-write-active-file (gnus-agent-lib-file "active") orig)) - (gnus-message 4 "Expiry...done"))))))) - -;;;###autoload -(defun gnus-agent-batch () - (interactive) - (let ((init-file-user "") - (gnus-always-read-dribble-file t)) - (gnus)) - (gnus-group-send-drafts) - (gnus-agent-fetch-session)) - -(provide 'gnus-agent) - -;;; gnus-agent.el ends here diff --git a/lisp/gnus-art.el b/lisp/gnus-art.el deleted file mode 100644 index 79aaaae..0000000 --- a/lisp/gnus-art.el +++ /dev/null @@ -1,6257 +0,0 @@ -;;; gnus-art.el --- article mode commands for Semi-gnus -;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; MORIOKA Tomohiko -;; Katsumi Yamaoka -;; Keywords: mail, news, MIME - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) -(eval-when-compile (require 'static)) - -(require 'path-util) -(require 'gnus) -(require 'gnus-sum) -(require 'gnus-spec) -(require 'gnus-int) -(require 'alist) -(require 'mime-view) -(require 'wid-edit) - -;; Avoid byte-compile warnings. -(eval-when-compile - (require 'mm-bodies) - (require 'mail-parse) - (require 'mm-decode) - (require 'mm-view) - (require 'mm-uu) - ) - -(autoload 'gnus-msg-mail "gnus-msg" nil t) -(autoload 'gnus-button-mailto "gnus-msg") -(autoload 'gnus-button-reply "gnus-msg" nil t) - -(defgroup gnus-article nil - "Article display." - :link '(custom-manual "(gnus)The Article Buffer") - :group 'gnus) - -(defgroup gnus-article-treat nil - "Treating article parts." - :link '(custom-manual "(gnus)Article Hiding") - :group 'gnus-article) - -(defgroup gnus-article-hiding nil - "Hiding article parts." - :link '(custom-manual "(gnus)Article Hiding") - :group 'gnus-article) - -(defgroup gnus-article-highlight nil - "Article highlighting." - :link '(custom-manual "(gnus)Article Highlighting") - :group 'gnus-article - :group 'gnus-visual) - -(defgroup gnus-article-signature nil - "Article signatures." - :link '(custom-manual "(gnus)Article Signature") - :group 'gnus-article) - -(defgroup gnus-article-headers nil - "Article headers." - :link '(custom-manual "(gnus)Hiding Headers") - :group 'gnus-article) - -(defgroup gnus-article-washing nil - "Special commands on articles." - :link '(custom-manual "(gnus)Article Washing") - :group 'gnus-article) - -(defgroup gnus-article-emphasis nil - "Fontisizing articles." - :link '(custom-manual "(gnus)Article Fontisizing") - :group 'gnus-article) - -(defgroup gnus-article-saving nil - "Saving articles." - :link '(custom-manual "(gnus)Saving Articles") - :group 'gnus-article) - -(defgroup gnus-article-mime nil - "Worshiping the MIME wonder." - :link '(custom-manual "(gnus)Using MIME") - :group 'gnus-article) - -(defgroup gnus-article-buttons nil - "Pushable buttons in the article buffer." - :link '(custom-manual "(gnus)Article Buttons") - :group 'gnus-article) - -(defgroup gnus-article-various nil - "Other article options." - :link '(custom-manual "(gnus)Misc Article") - :group 'gnus-article) - -(defcustom gnus-ignored-headers - '("^Path:" "^Expires:" "^Date-Received:" "^References:" "^Xref:" "^Lines:" - "^Relay-Version:" "^Message-ID:" "^Approved:" "^Sender:" "^Received:" - "^X-UIDL:" "^MIME-Version:" "^Return-Path:" "^In-Reply-To:" - "^Content-Type:" "^Content-Transfer-Encoding:" "^X-WebTV-Signature:" - "^X-MimeOLE:" "^X-MSMail-Priority:" "^X-Priority:" "^X-Loop:" - "^X-Authentication-Warning:" "^X-MIME-Autoconverted:" "^X-Face:" - "^X-Attribution:" "^X-Originating-IP:" "^Delivered-To:" - "^NNTP-[-A-Za-z]+:" "^Distribution:" "^X-no-archive:" "^X-Trace:" - "^X-Complaints-To:" "^X-NNTP-Posting-Host:" "^X-Orig.*:" - "^Abuse-Reports-To:" "^Cache-Post-Path:" "^X-Article-Creation-Date:" - "^X-Poster:" "^X-Mail2News-Path:" "^X-Server-Date:" "^X-Cache:" - "^Originator:" "^X-Problems-To:" "^X-Auth-User:" "^X-Post-Time:" - "^X-Admin:" "^X-UID:" "^Resent-[-A-Za-z]+:" "^X-Mailing-List:" - "^Precedence:" "^Original-[-A-Za-z]+:" "^X-filename:" "^X-Orcpt:" - "^Old-Received:" "^X-Pgp" "^X-Auth:" "^X-From-Line:" - "^X-Gnus-Article-Number:" "^X-Majordomo:" "^X-Url:" "^X-Sender:" - "^MBOX-Line" "^Priority:" "^X400-[-A-Za-z]+:" - "^Status:" "^X-Gnus-Mail-Source:" "^Cancel-Lock:" - "^X-FTN" "^X-EXP32-SerialNo:" "^Encoding:" "^Importance:" - "^Autoforwarded:" "^Original-Encoded-Information-Types:" "^X-Ya-Pop3:" - "^X-Face-Version:" "^X-Vms-To:" "^X-ML-NAME:" "^X-ML-COUNT:" - "^Mailing-List:" "^X-finfo:" "^X-md5sum:" "^X-md5sum-Origin:" - "^X-Sun-Charset:" "^X-Accept-Language:" "^X-Envelope-Sender:" - "^List-[A-Za-z]+:" "^X-Listprocessor-Version:" - "^X-Received:" "^X-Distribute:" "^X-Sequence:" "^X-Juno-Line-Breaks:" - "^X-Notes-Item:" "^X-MS-TNEF-Correlator:" "^x-uunet-gateway:" - "^X-Received:" "^Content-length:" "X-precedence:" - "^X-Authenticated-User:" "^X-Comment" "^X-Report:" "^X-Abuse-Info:" - "^X-HTTP-Proxy:" "^X-Mydeja-Info:" "^X-Copyright" "^X-No-Markup:" - "^X-Abuse-Info:" "^X-From_:" "^X-Accept-Language:" "^Errors-To:" - "^X-BeenThere:" "^X-Mailman-Version:" "^List-Help:" "^List-Post:" - "^List-Subscribe:" "^List-Id:" "^List-Unsubscribe:" "^List-Archive:" - "^X-Content-length:" "^X-Posting-Agent:" "^Original-Received:") - "*All headers that start with this regexp will be hidden. -This variable can also be a list of regexps of headers to be ignored. -If `gnus-visible-headers' is non-nil, this variable will be ignored." - :type '(choice :custom-show nil - regexp - (repeat regexp)) - :group 'gnus-article-hiding) - -(defcustom gnus-visible-headers - "^From:\\|^Newsgroups:\\|^Subject:\\|^Date:\\|^Followup-To:\\|^Reply-To:\\|^Organization:\\|^Summary:\\|^Keywords:\\|^To:\\|^[BGF]?Cc:\\|^Posted-To:\\|^Mail-Copies-To:\\|^Mail-Followup-To:\\|^Apparently-To:\\|^Gnus-Warning:\\|^Resent-From:\\|^X-Sent:" - "*All headers that do not match this regexp will be hidden. -This variable can also be a list of regexp of headers to remain visible. -If this variable is non-nil, `gnus-ignored-headers' will be ignored." - :type '(repeat :value-to-internal (lambda (widget value) - (custom-split-regexp-maybe value)) - :match (lambda (widget value) - (or (stringp value) - (widget-editable-list-match widget value))) - regexp) - :group 'gnus-article-hiding) - -(defcustom gnus-sorted-header-list - '("^From:" "^Subject:" "^Summary:" "^Keywords:" "^Newsgroups:" - "^Followup-To:" "^To:" "^Cc:" "^Date:" "^Organization:") - "*This variable is a list of regular expressions. -If it is non-nil, headers that match the regular expressions will -be placed first in the article buffer in the sequence specified by -this list." - :type '(repeat regexp) - :group 'gnus-article-hiding) - -(defcustom gnus-boring-article-headers '(empty followup-to reply-to) - "Headers that are only to be displayed if they have interesting data. -Possible values in this list are: - - 'empty Headers with no content. - 'newsgroups Newsgroup identical to Gnus group. - 'to-address To identical to To-address. - 'followup-to Followup-to identical to Newsgroups. - 'reply-to Reply-to identical to From. - 'date Date less than four days old. - 'long-to To and/or Cc longer than 1024 characters. - 'many-to Multiple To and/or Cc." - :type '(set (const :tag "Headers with no content." empty) - (const :tag "Newsgroups identical to Gnus group." newsgroups) - (const :tag "To identical to To-address." to-address) - (const :tag "Followup-to identical to Newsgroups." followup-to) - (const :tag "Reply-to identical to From." reply-to) - (const :tag "Date less than four days old." date) - (const :tag "To and/or Cc longer than 1024 characters." long-to) - (const :tag "Multiple To and/or Cc headers." many-to)) - :group 'gnus-article-hiding) - -(defcustom gnus-signature-separator '("^-- $" "^-- *$") - "Regexp matching signature separator. -This can also be a list of regexps. In that case, it will be checked -from head to tail looking for a separator. Searches will be done from -the end of the buffer." - :type '(repeat string) - :group 'gnus-article-signature) - -(defcustom gnus-signature-limit nil - "Provide a limit to what is considered a signature. -If it is a number, no signature may not be longer (in characters) than -that number. If it is a floating point number, no signature may be -longer (in lines) than that number. If it is a function, the function -will be called without any parameters, and if it returns nil, there is -no signature in the buffer. If it is a string, it will be used as a -regexp. If it matches, the text in question is not a signature." - :type '(choice (integer :value 200) - (number :value 4.0) - (function :value fun) - (regexp :value ".*")) - :group 'gnus-article-signature) - -(defcustom gnus-hidden-properties '(invisible t intangible t) - "Property list to use for hiding text." - :type 'sexp - :group 'gnus-article-hiding) - -;; Fixme: This isn't the right thing for mixed graphical and and -;; non-graphical frames in a session. -;; gnus-xmas.el overrides this for XEmacs. -(defcustom gnus-article-x-face-command - (cond - ((and (fboundp 'image-type-available-p) - (module-installed-p 'x-face-e21)) - 'x-face-decode-message-header) - ((and (fboundp 'image-type-available-p) - (image-type-available-p 'xbm)) - 'gnus-article-display-xface) - ((and (not (featurep 'xemacs)) - window-system - (module-installed-p 'x-face-mule)) - 'x-face-mule-gnus-article-display-x-face) - (gnus-article-compface-xbm - "{ echo '/* Width=48, Height=48 */'; uncompface; } | display -") - (t - "{ echo '/* Width=48, Height=48 */'; uncompface; } | icontopbm | \ -display -")) - "*String or function to be executed to display an X-Face header. -If it is a string, the command will be executed in a sub-shell -asynchronously. The compressed face will be piped to this command." - :type '(choice string - (function-item - :tag "x-face-decode-message-header (x-face-e21)" - x-face-decode-message-header) - (function-item gnus-article-display-xface) - (function-item x-face-mule-gnus-article-display-x-face) - function) - ;;:version "21.1" - :group 'gnus-article-washing) - -(defcustom gnus-article-x-face-too-ugly nil - "Regexp matching posters whose face shouldn't be shown automatically." - :type '(choice regexp (const nil)) - :group 'gnus-article-washing) - -(defcustom gnus-article-banner-alist nil - "Banner alist for stripping. -For example, - ((egroups . \"^[ \\t\\n]*-------------------+\\\\( \\\\(e\\\\|Yahoo! \\\\)Groups Sponsor -+\\\\)?....\\n\\\\(.+\\n\\\\)+\"))" - :version "21.1" - :type '(repeat (cons symbol regexp)) - :group 'gnus-article-washing) - -(gnus-define-group-parameter - banner - :variable-document - "Alist of regexps (to match group names) and banner." - :variable-group gnus-article-washing - :parameter-type - '(choice :tag "Banner" - :value nil - (const :tag "Remove signature" signature) - (symbol :tag "Item in `gnus-article-banner-alist'" none) - regexp - (const :tag "None" nil)) - :parameter-document - "If non-nil, specify how to remove `banners' from articles. - -Symbol `signature' means to remove signatures delimited by -`gnus-signature-separator'. Any other symbol is used to look up a -regular expression to match the banner in `gnus-article-banner-alist'. -A string is used as a regular expression to match the banner -directly.") - -(defcustom gnus-emphasis-alist - (let ((format - "\\(\\s-\\|^\\|[-\"]\\|\\s(\\)\\(%s\\(\\w+\\(\\s-+\\w+\\)*[.,]?\\)%s\\)\\(\\s-\\|[-,;:\"]\\s-\\|[?!.]+\\s-\\|\\s)\\)") - (types - '(("_" "_" underline) - ("/" "/" italic) - ("\\*" "\\*" bold) - ("_/" "/_" underline-italic) - ("_\\*" "\\*_" underline-bold) - ("\\*/" "/\\*" bold-italic) - ("_\\*/" "/\\*_" underline-bold-italic)))) - `(("\\(\\s-\\|^\\)\\(_\\(\\(\\w\\|_[^_]\\)+\\)_\\)\\(\\s-\\|[?!.,;]\\)" - 2 3 gnus-emphasis-underline) - ,@(mapcar - (lambda (spec) - (list - (format format (car spec) (car (cdr spec))) - 2 3 (intern (format "gnus-emphasis-%s" (nth 2 spec))))) - types))) - "*Alist that says how to fontify certain phrases. -Each item looks like this: - - (\"_\\\\(\\\\w+\\\\)_\" 0 1 'underline) - -The first element is a regular expression to be matched. The second -is a number that says what regular expression grouping used to find -the entire emphasized word. The third is a number that says what -regexp grouping should be displayed and highlighted. The fourth -is the face used for highlighting." - :type '(repeat (list :value ("" 0 0 default) - regexp - (integer :tag "Match group") - (integer :tag "Emphasize group") - face)) - :group 'gnus-article-emphasis) - -(defcustom gnus-emphasize-whitespace-regexp "^[ \t]+\\|[ \t]*\n" - "A regexp to describe whitespace which should not be emphasized. -Typical values are \"^[ \\t]+\\\\|[ \\t]*\\n\" and \"[ \\t]+\\\\|[ \\t]*\\n\". -The former avoids underlining of leading and trailing whitespace, -and the latter avoids underlining any whitespace at all." - :version "21.1" - :group 'gnus-article-emphasis - :type 'regexp) - -(defface gnus-emphasis-bold '((t (:bold t))) - "Face used for displaying strong emphasized text (*word*)." - :group 'gnus-article-emphasis) - -(defface gnus-emphasis-italic '((t (:italic t))) - "Face used for displaying italic emphasized text (/word/)." - :group 'gnus-article-emphasis) - -(defface gnus-emphasis-underline '((t (:underline t))) - "Face used for displaying underlined emphasized text (_word_)." - :group 'gnus-article-emphasis) - -(defface gnus-emphasis-underline-bold '((t (:bold t :underline t))) - "Face used for displaying underlined bold emphasized text (_*word*_)." - :group 'gnus-article-emphasis) - -(defface gnus-emphasis-underline-italic '((t (:italic t :underline t))) - "Face used for displaying underlined italic emphasized text (_/word/_)." - :group 'gnus-article-emphasis) - -(defface gnus-emphasis-bold-italic '((t (:bold t :italic t))) - "Face used for displaying bold italic emphasized text (/*word*/)." - :group 'gnus-article-emphasis) - -(defface gnus-emphasis-underline-bold-italic - '((t (:bold t :italic t :underline t))) - "Face used for displaying underlined bold italic emphasized text. -Esample: (_/*word*/_)." - :group 'gnus-article-emphasis) - -(defface gnus-emphasis-highlight-words - '((t (:background "black" :foreground "yellow"))) - "Face used for displaying highlighted words." - :group 'gnus-article-emphasis) - -(defcustom gnus-article-time-format "%a, %b %d %Y %T %Z" - "Format for display of Date headers in article bodies. -See `format-time-string' for the possible values. - -The variable can also be function, which should return a complete Date -header. The function is called with one argument, the time, which can -be fed to `format-time-string'." - :type '(choice string symbol) - :link '(custom-manual "(gnus)Article Date") - :group 'gnus-article-washing) - -(eval-and-compile - (autoload 'mail-extract-address-components "mail-extr")) - -(defcustom gnus-save-all-headers t - "*If non-nil, don't remove any headers before saving." - :group 'gnus-article-saving - :type 'boolean) - -(defcustom gnus-prompt-before-saving 'always - "*This variable says how much prompting is to be done when saving articles. -If it is nil, no prompting will be done, and the articles will be -saved to the default files. If this variable is `always', each and -every article that is saved will be preceded by a prompt, even when -saving large batches of articles. If this variable is neither nil not -`always', there the user will be prompted once for a file name for -each invocation of the saving commands." - :group 'gnus-article-saving - :type '(choice (item always) - (item :tag "never" nil) - (sexp :tag "once" :format "%t\n" :value t))) - -(defcustom gnus-saved-headers gnus-visible-headers - "Headers to keep if `gnus-save-all-headers' is nil. -If `gnus-save-all-headers' is non-nil, this variable will be ignored. -If that variable is nil, however, all headers that match this regexp -will be kept while the rest will be deleted before saving." - :group 'gnus-article-saving - :type 'regexp) - -(defcustom gnus-default-article-saver 'gnus-summary-save-in-rmail - "A function to save articles in your favourite format. -The function must be interactively callable (in other words, it must -be an Emacs command). - -Gnus provides the following functions: - -* gnus-summary-save-in-rmail (Rmail format) -* gnus-summary-save-in-mail (Unix mail format) -* gnus-summary-save-in-folder (MH folder) -* gnus-summary-save-in-file (article format) -* gnus-summary-save-in-vm (use VM's folder format) -* gnus-summary-write-to-file (article format -- overwrite)." - :group 'gnus-article-saving - :type '(radio (function-item gnus-summary-save-in-rmail) - (function-item gnus-summary-save-in-mail) - (function-item gnus-summary-save-in-folder) - (function-item gnus-summary-save-in-file) - (function-item gnus-summary-save-in-vm) - (function-item gnus-summary-write-to-file))) - -(defcustom gnus-rmail-save-name 'gnus-plain-save-name - "A function generating a file name to save articles in Rmail format. -The function is called with NEWSGROUP, HEADERS, and optional LAST-FILE." - :group 'gnus-article-saving - :type 'function) - -(defcustom gnus-mail-save-name 'gnus-plain-save-name - "A function generating a file name to save articles in Unix mail format. -The function is called with NEWSGROUP, HEADERS, and optional LAST-FILE." - :group 'gnus-article-saving - :type 'function) - -(defcustom gnus-folder-save-name 'gnus-folder-save-name - "A function generating a file name to save articles in MH folder. -The function is called with NEWSGROUP, HEADERS, and optional LAST-FOLDER." - :group 'gnus-article-saving - :type 'function) - -(defcustom gnus-file-save-name 'gnus-numeric-save-name - "A function generating a file name to save articles in article format. -The function is called with NEWSGROUP, HEADERS, and optional -LAST-FILE." - :group 'gnus-article-saving - :type 'function) - -(defcustom gnus-split-methods - '((gnus-article-archive-name) - (gnus-article-nndoc-name)) - "*Variable used to suggest where articles are to be saved. -For instance, if you would like to save articles related to Gnus in -the file \"gnus-stuff\", and articles related to VM in \"vm-stuff\", -you could set this variable to something like: - - '((\"^Subject:.*gnus\\|^Newsgroups:.*gnus\" \"gnus-stuff\") - (\"^Subject:.*vm\\|^Xref:.*vm\" \"vm-stuff\")) - -This variable is an alist where the where the key is the match and the -value is a list of possible files to save in if the match is non-nil. - -If the match is a string, it is used as a regexp match on the -article. If the match is a symbol, that symbol will be funcalled -from the buffer of the article to be saved with the newsgroup as the -parameter. If it is a list, it will be evaled in the same buffer. - -If this form or function returns a string, this string will be used as -a possible file name; and if it returns a non-nil list, that list will -be used as possible file names." - :group 'gnus-article-saving - :type '(repeat (choice (list :value (fun) function) - (cons :value ("" "") regexp (repeat string)) - (sexp :value nil)))) - -(defcustom gnus-article-display-method-for-mime - 'gnus-article-display-mime-message - "Function to display a MIME message. -The function is called from the article buffer." - :group 'gnus-article-mime - :type 'function) - -(defcustom gnus-article-display-method-for-traditional - 'gnus-article-display-traditional-message - "*Function to display a traditional message. -The function is called from the article buffer." - :group 'gnus-article-mime - :type 'function) - -(defcustom gnus-page-delimiter "^\^L" - "*Regexp describing what to use as article page delimiters. -The default value is \"^\^L\", which is a form linefeed at the -beginning of a line." - :type 'regexp - :group 'gnus-article-various) - -(defcustom gnus-article-mode-line-format "Gnus: %g [%w] %S%m" - "*The format specification for the article mode line. -See `gnus-summary-mode-line-format' for a closer description. - -The following additional specs are available: - -%w The article washing status. -%m The number of MIME parts in the article." - :type 'string - :group 'gnus-article-various) - -(defcustom gnus-article-mode-hook nil - "*A hook for Gnus article mode." - :type 'hook - :group 'gnus-article-various) - -(when (featurep 'xemacs) - ;; Extracted from gnus-xmas-define in order to preserve user settings - (when (fboundp 'turn-off-scroll-in-place) - (add-hook 'gnus-article-mode-hook 'turn-off-scroll-in-place)) - ;; Extracted from gnus-xmas-redefine in order to preserve user settings - (add-hook 'gnus-article-mode-hook 'gnus-xmas-article-menu-add)) - -(defcustom gnus-article-menu-hook nil - "*Hook run after the creation of the article mode menu." - :type 'hook - :group 'gnus-article-various) - -(defcustom gnus-article-prepare-hook nil - "*A hook called after an article has been prepared in the article buffer." - :type 'hook - :group 'gnus-article-various) - -(defcustom gnus-article-hide-pgp-hook nil - "*A hook called after successfully hiding a PGP signature." - :type 'hook - :group 'gnus-article-various) - -(defcustom gnus-article-button-face 'bold - "Face used for highlighting buttons in the article buffer. - -An article button is a piece of text that you can activate by pressing -`RET' or `mouse-2' above it." - :type 'face - :group 'gnus-article-buttons) - -(defcustom gnus-article-mouse-face 'highlight - "Face used for mouse highlighting in the article buffer. - -Article buttons will be displayed in this face when the cursor is -above them." - :type 'face - :group 'gnus-article-buttons) - -(defcustom gnus-signature-face 'gnus-signature-face - "Face used for highlighting a signature in the article buffer. -Obsolete; use the face `gnus-signature-face' for customizations instead." - :type 'face - :group 'gnus-article-highlight - :group 'gnus-article-signature) - -(defface gnus-signature-face - '((t - (:italic t))) - "Face used for highlighting a signature in the article buffer." - :group 'gnus-article-highlight - :group 'gnus-article-signature) - -(defface gnus-header-from-face - '((((class color) - (background dark)) - (:foreground "spring green")) - (((class color) - (background light)) - (:foreground "red3")) - (t - (:italic t))) - "Face used for displaying from headers." - :group 'gnus-article-headers - :group 'gnus-article-highlight) - -(defface gnus-header-subject-face - '((((class color) - (background dark)) - (:foreground "SeaGreen3")) - (((class color) - (background light)) - (:foreground "red4")) - (t - (:bold t :italic t))) - "Face used for displaying subject headers." - :group 'gnus-article-headers - :group 'gnus-article-highlight) - -(defface gnus-header-newsgroups-face - '((((class color) - (background dark)) - (:foreground "yellow" :italic t)) - (((class color) - (background light)) - (:foreground "MidnightBlue" :italic t)) - (t - (:italic t))) - "Face used for displaying newsgroups headers." - :group 'gnus-article-headers - :group 'gnus-article-highlight) - -(defface gnus-header-name-face - '((((class color) - (background dark)) - (:foreground "SeaGreen")) - (((class color) - (background light)) - (:foreground "maroon")) - (t - (:bold t))) - "Face used for displaying header names." - :group 'gnus-article-headers - :group 'gnus-article-highlight) - -(defface gnus-header-content-face - '((((class color) - (background dark)) - (:foreground "forest green" :italic t)) - (((class color) - (background light)) - (:foreground "indianred4" :italic t)) - (t - (:italic t))) - "Face used for displaying header content." - :group 'gnus-article-headers - :group 'gnus-article-highlight) - -(defcustom gnus-header-face-alist - '(("From" nil gnus-header-from-face) - ("Subject" nil gnus-header-subject-face) - ("Newsgroups:.*," nil gnus-header-newsgroups-face) - ("" gnus-header-name-face gnus-header-content-face)) - "*Controls highlighting of article header. - -An alist of the form (HEADER NAME CONTENT). - -HEADER is a regular expression which should match the name of an -header header and NAME and CONTENT are either face names or nil. - -The name of each header field will be displayed using the face -specified by the first element in the list where HEADER match the -header name and NAME is non-nil. Similarly, the content will be -displayed by the first non-nil matching CONTENT face." - :group 'gnus-article-headers - :group 'gnus-article-highlight - :type '(repeat (list (regexp :tag "Header") - (choice :tag "Name" - (item :tag "skip" nil) - (face :value default)) - (choice :tag "Content" - (item :tag "skip" nil) - (face :value default))))) - -(defcustom gnus-article-decode-hook nil - "*Hook run to decode charsets in articles." - :group 'gnus-article-headers - :type 'hook) - -(defcustom gnus-display-mime-function 'gnus-display-mime - "Function to display MIME articles." - :group 'gnus-article-mime - :type 'function) - -(defvar gnus-decode-header-function 'mail-decode-encoded-word-region - "Function used to decode headers.") - -(defvar gnus-article-dumbquotes-map - '(("\200" "EUR") - ("\202" ",") - ("\203" "f") - ("\204" ",,") - ("\205" "...") - ("\213" "<") - ("\214" "OE") - ("\221" "`") - ("\222" "'") - ("\223" "``") - ("\224" "\"") - ("\225" "*") - ("\226" "-") - ("\227" "--") - ("\231" "(TM)") - ("\233" ">") - ("\234" "oe") - ("\264" "'")) - "Table for MS-to-Latin1 translation.") - -(defcustom gnus-ignored-mime-types nil - "List of MIME types that should be ignored by Gnus." - :version "21.1" - :group 'gnus-article-mime - :type '(repeat regexp)) - -(defcustom gnus-unbuttonized-mime-types '(".*/.*") - "List of MIME types that should not be given buttons when rendered inline." - :version "21.1" - :group 'gnus-article-mime - :type '(repeat regexp)) - -(defcustom gnus-article-mime-part-function nil - "Function called with a MIME handle as the argument. -This is meant for people who want to do something automatic based -on parts -- for instance, adding Vcard info to a database." - :group 'gnus-article-mime - :type 'function) - -(defcustom gnus-mime-multipart-functions nil - "An alist of MIME types to functions to display them." - :version "21.1" - :group 'gnus-article-mime - :type 'alist) - -(defcustom gnus-article-date-lapsed-new-header nil - "Whether the X-Sent and Date headers can coexist. -When using `gnus-treat-date-lapsed', the \"X-Sent:\" header will -either replace the old \"Date:\" header (if this variable is nil), or -be added below it (otherwise)." - :version "21.1" - :group 'gnus-article-headers - :type 'boolean) - -(defcustom gnus-article-mime-match-handle-function 'undisplayed-alternative - "Function called with a MIME handle as the argument. -This is meant for people who want to view first matched part. -For `undisplayed-alternative' (default), the first undisplayed -part or alternative part is used. For `undisplayed', the first -undisplayed part is used. For a function, the first part which -the function return `t' is used. For `nil', the first part is -used." - :version "21.1" - :group 'gnus-article-mime - :type '(choice - (item :tag "first" :value nil) - (item :tag "undisplayed" :value undisplayed) - (item :tag "undisplayed or alternative" - :value undisplayed-alternative) - (function))) - -(defcustom gnus-mime-action-alist - '(("save to file" . gnus-mime-save-part) - ("save and strip" . gnus-mime-save-part-and-strip) - ("display as text" . gnus-mime-inline-part) - ("view the part" . gnus-mime-view-part) - ("pipe to command" . gnus-mime-pipe-part) - ("toggle display" . gnus-article-press-button) - ("toggle display" . gnus-article-view-part-as-charset) - ("view as type" . gnus-mime-view-part-as-type) - ("internalize type" . gnus-mime-internalize-part) - ("externalize type" . gnus-mime-externalize-part)) - "An alist of actions that run on the MIME attachment." - :group 'gnus-article-mime - :type '(repeat (cons (string :tag "name") - (function)))) - -(defcustom gnus-mime-action-alist - '(("save to file" . gnus-mime-save-part) - ("display as text" . gnus-mime-inline-part) - ("view the part" . gnus-mime-view-part) - ("pipe to command" . gnus-mime-pipe-part) - ("toggle display" . gnus-article-press-button) - ("view as type" . gnus-mime-view-part-as-type) - ("internalize type" . gnus-mime-internalize-part) - ("externalize type" . gnus-mime-externalize-part)) - "An alist of actions that run on the MIME attachment." - :version "21.1" - :group 'gnus-article-mime - :type '(repeat (cons (string :tag "name") - (function)))) - -;;; -;;; The treatment variables -;;; - -(defvar gnus-part-display-hook nil - "Hook called on parts that are to receive treatment.") - -(defvar gnus-article-treat-custom - '(choice (const :tag "Off" nil) - (const :tag "On" t) - (const :tag "Header" head) - (const :tag "Last" last) - (const :tag "Mime" mime) - (integer :tag "Less") - (repeat :tag "Groups" regexp) - (sexp :tag "Predicate"))) - -(defvar gnus-article-treat-head-custom - '(choice (const :tag "Off" nil) - (const :tag "Header" head))) - -(defvar gnus-article-treat-types '("text/plain") - "Parts to treat.") - -(defvar gnus-inhibit-treatment nil - "Whether to inhibit treatment.") - -(defcustom gnus-treat-highlight-signature '(or last (typep "text/x-vcard")) - "Highlight the signature. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :type gnus-article-treat-custom) -(put 'gnus-treat-highlight-signature 'highlight t) - -(defcustom gnus-treat-buttonize 100000 - "Add buttons. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :type gnus-article-treat-custom) -(put 'gnus-treat-buttonize 'highlight t) - -(defcustom gnus-treat-buttonize-head 'head - "Add buttons to the head. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :type gnus-article-treat-head-custom) -(put 'gnus-treat-buttonize-head 'highlight t) - -(defcustom gnus-treat-emphasize - (and (or window-system - (featurep 'xemacs) - (>= (string-to-number emacs-version) 21)) - 50000) - "Emphasize text. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :type gnus-article-treat-custom) -(put 'gnus-treat-emphasize 'highlight t) - -(defcustom gnus-treat-strip-cr nil - "Remove carriage returns. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :type gnus-article-treat-custom) - -(defcustom gnus-treat-leading-whitespace nil - "Remove leading whitespace in headers. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :type gnus-article-treat-custom) - -(defcustom gnus-treat-hide-headers 'head - "Hide headers. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :type gnus-article-treat-head-custom) - -(defcustom gnus-treat-hide-boring-headers nil - "Hide boring headers. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :type gnus-article-treat-head-custom) - -(defcustom gnus-treat-hide-signature nil - "Hide the signature. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :type gnus-article-treat-custom) - -(defcustom gnus-treat-fill-article nil - "Fill the article. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :type gnus-article-treat-custom) - -(defcustom gnus-treat-hide-citation nil - "Hide cited text. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :type gnus-article-treat-custom) - -(defcustom gnus-treat-hide-citation-maybe nil - "Hide cited text. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :type gnus-article-treat-custom) - -(defcustom gnus-treat-hide-citation-maybe nil - "Hide cited text. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :type gnus-article-treat-custom) - -(defcustom gnus-treat-strip-list-identifiers 'head - "Strip list identifiers from `gnus-list-identifiers`. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :version "21.1" - :group 'gnus-article-treat - :type gnus-article-treat-custom) - -(defcustom gnus-treat-strip-pgp t - "Strip PGP signatures. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :type gnus-article-treat-custom) - -(defcustom gnus-treat-strip-pem nil - "Strip PEM signatures. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :type gnus-article-treat-custom) - -(defcustom gnus-treat-strip-banner t - "Strip banners from articles. -The banner to be stripped is specified in the `banner' group parameter. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :type gnus-article-treat-custom) - -(defcustom gnus-treat-highlight-headers 'head - "Highlight the headers. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :type gnus-article-treat-head-custom) -(put 'gnus-treat-highlight-headers 'highlight t) - -(defcustom gnus-treat-highlight-citation t - "Highlight cited text. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :type gnus-article-treat-custom) -(put 'gnus-treat-highlight-citation 'highlight t) - -(defcustom gnus-treat-date-ut nil - "Display the Date in UT (GMT). -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :type gnus-article-treat-head-custom) - -(defcustom gnus-treat-date-local nil - "Display the Date in the local timezone. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :type gnus-article-treat-head-custom) - -(defcustom gnus-treat-date-english nil - "Display the Date in a format that can be read aloud in English. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :type gnus-article-treat-head-custom) - -(defcustom gnus-treat-date-lapsed nil - "Display the Date header in a way that says how much time has elapsed. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :type gnus-article-treat-head-custom) - -(defcustom gnus-treat-date-original nil - "Display the date in the original timezone. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :type gnus-article-treat-head-custom) - -(defcustom gnus-treat-date-iso8601 nil - "Display the date in the ISO8601 format. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :version "21.1" - :group 'gnus-article-treat - :type gnus-article-treat-head-custom) - -(defcustom gnus-treat-date-user-defined nil - "Display the date in a user-defined format. -The format is defined by the `gnus-article-time-format' variable. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :type gnus-article-treat-head-custom) - -(defcustom gnus-treat-strip-headers-in-body t - "Strip the X-No-Archive header line from the beginning of the body. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :version "21.1" - :group 'gnus-article-treat - :type gnus-article-treat-custom) - -(defcustom gnus-treat-strip-trailing-blank-lines nil - "Strip trailing blank lines. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :type gnus-article-treat-custom) - -(defcustom gnus-treat-strip-leading-blank-lines nil - "Strip leading blank lines. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :type gnus-article-treat-custom) - -(defcustom gnus-treat-strip-multiple-blank-lines nil - "Strip multiple blank lines. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :type gnus-article-treat-custom) - -(defcustom gnus-treat-overstrike t - "Treat overstrike highlighting. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :type gnus-article-treat-custom) -(put 'gnus-treat-overstrike 'highlight t) - -(defcustom gnus-treat-display-xface - (and (or (and (fboundp 'image-type-available-p) - (image-type-available-p 'xbm) - (string-match "^0x" (shell-command-to-string "uncompface"))) - (and (featurep 'xemacs) (featurep 'xface)) - (eq 'x-face-mule-gnus-article-display-x-face - gnus-article-x-face-command)) - 'head) - "Display X-Face headers. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - ;;:version "21.1" - :type gnus-article-treat-head-custom) -(put 'gnus-treat-display-xface 'highlight t) - -(defcustom gnus-treat-display-smileys - (if (or (and (featurep 'xemacs) - (featurep 'xpm)) - (and (fboundp 'image-type-available-p) - (image-type-available-p 'pbm)) - (and (not (featurep 'xemacs)) - window-system - (module-installed-p 'smiley-mule))) - t - nil) - "Display smileys. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - ;;:version "21.1" - :type gnus-article-treat-custom) -(put 'gnus-treat-display-smileys 'highlight t) - -(defcustom gnus-treat-display-picons (if (featurep 'xemacs) 'head nil) - "Display picons. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :type gnus-article-treat-head-custom) -(put 'gnus-treat-display-picons 'highlight t) - -(defcustom gnus-treat-capitalize-sentences nil - "Capitalize sentence-starting words. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :version "21.1" - :group 'gnus-article-treat - :type gnus-article-treat-custom) - -(defcustom gnus-treat-fill-long-lines nil - "Fill long lines. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :type gnus-article-treat-custom) - -(defcustom gnus-treat-play-sounds nil - "Play sounds. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :version "21.1" - :group 'gnus-article-treat - :type gnus-article-treat-custom) - -(defcustom gnus-treat-decode-article-as-default-mime-charset nil - "Decode an article as `default-mime-charset'. For instance, if you want to -attempt to decode an article even if the value of `gnus-show-mime' is nil, -you could set this variable to something like: nil for don't decode, t for -decode the body, '(or header t) for the whole article, etc." - :group 'gnus-article-treat - :type '(radio (const :tag "Off" nil) - (const :tag "Decode body" t) - (const :tag "Decode all" (or head t)))) - -(defcustom gnus-treat-translate nil - "Translate articles from one language to another. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :version "21.1" - :group 'gnus-article-treat - :type gnus-article-treat-custom) - -(defcustom gnus-treat-x-pgp-sig nil - "Verify X-PGP-Sig. -To automatically treat X-PGP-Sig, set it to head. -Valid values are nil, t, `head', `last', an integer or a predicate. -See the manual for details." - :group 'gnus-article-treat - :group 'mime-security - :type gnus-article-treat-custom) - -(defvar gnus-article-encrypt-protocol-alist - '(("PGP" . mml2015-self-encrypt))) - -;; Set to nil if more than one protocol added to -;; gnus-article-encrypt-protocol-alist. -(defcustom gnus-article-encrypt-protocol "PGP" - "The protocol used for encrypt articles. -It is a string, such as \"PGP\". If nil, ask user." - :type 'string - :group 'mime-security) - -;;; Internal variables - -(defvar gnus-english-month-names - '("January" "February" "March" "April" "May" "June" "July" "August" - "September" "October" "November" "December")) - -(defvar article-goto-body-goes-to-point-min-p nil) -(defvar gnus-article-wash-types nil) -(defvar gnus-article-emphasis-alist nil) - -(defvar gnus-article-mime-handle-alist-1 nil) -(defvar gnus-treatment-function-alist - `((gnus-treat-decode-article-as-default-mime-charset - gnus-article-decode-article-as-default-mime-charset) - (gnus-treat-x-pgp-sig gnus-article-verify-x-pgp-sig) - (gnus-treat-strip-banner gnus-article-strip-banner) - (gnus-treat-strip-headers-in-body gnus-article-strip-headers-in-body) - (gnus-treat-buttonize gnus-article-add-buttons) - (gnus-treat-fill-article gnus-article-fill-cited-article) - (gnus-treat-fill-long-lines gnus-article-fill-long-lines) - (gnus-treat-strip-cr gnus-article-remove-cr) - (gnus-treat-display-xface gnus-article-display-x-face) - (gnus-treat-date-ut gnus-article-date-ut) - (gnus-treat-date-local gnus-article-date-local) - (gnus-treat-date-english gnus-article-date-english) - (gnus-treat-date-lapsed gnus-article-date-lapsed) - (gnus-treat-date-original gnus-article-date-original) - (gnus-treat-date-user-defined gnus-article-date-user) - (gnus-treat-date-iso8601 gnus-article-date-iso8601) - (gnus-treat-hide-headers gnus-article-maybe-hide-headers) - (gnus-treat-hide-boring-headers gnus-article-hide-boring-headers) - (gnus-treat-hide-signature gnus-article-hide-signature) - (gnus-treat-hide-citation gnus-article-hide-citation) - (gnus-treat-hide-citation-maybe gnus-article-hide-citation-maybe) - (gnus-treat-strip-list-identifiers gnus-article-hide-list-identifiers) - (gnus-treat-leading-whitespace gnus-article-remove-leading-whitespace) - (gnus-treat-strip-pgp gnus-article-hide-pgp) - (gnus-treat-strip-pem gnus-article-hide-pem) - (gnus-treat-highlight-headers gnus-article-highlight-headers) - (gnus-treat-emphasize gnus-article-emphasize) - (gnus-treat-highlight-citation gnus-article-highlight-citation) - (gnus-treat-highlight-signature gnus-article-highlight-signature) - (gnus-treat-strip-trailing-blank-lines - gnus-article-remove-trailing-blank-lines) - (gnus-treat-strip-leading-blank-lines - gnus-article-strip-leading-blank-lines) - (gnus-treat-strip-multiple-blank-lines - gnus-article-strip-multiple-blank-lines) - (gnus-treat-overstrike gnus-article-treat-overstrike) - (gnus-treat-buttonize-head gnus-article-add-buttons-to-head) - (gnus-treat-display-smileys ,(if (or (featurep 'xemacs) - (>= emacs-major-version 21)) - 'gnus-smiley-display - 'gnus-article-smiley-display)) - (gnus-treat-capitalize-sentences gnus-article-capitalize-sentences) - (gnus-treat-display-picons gnus-article-display-picons) - (gnus-treat-play-sounds gnus-earcon-display))) - -(defvar gnus-article-mime-handle-alist nil) -(defvar article-lapsed-timer nil) -(defvar gnus-article-current-summary nil) - -(defvar gnus-article-mode-syntax-table - (let ((table (copy-syntax-table text-mode-syntax-table))) - ;; This causes the citation match run O(2^n). - ;; (modify-syntax-entry ?- "w" table) - (modify-syntax-entry ?> ")" table) - (modify-syntax-entry ?< "(" table) - table) - "Syntax table used in article mode buffers. -Initialized from `text-mode-syntax-table.") - -(defvar gnus-save-article-buffer nil) - -(defvar gnus-article-mode-line-format-alist - (nconc '((?w (gnus-article-wash-status) ?s) - (?m (gnus-article-mime-part-status) ?s)) - gnus-summary-mode-line-format-alist)) - -(defvar gnus-number-of-articles-to-be-saved nil) - -(defvar gnus-inhibit-hiding nil) - -(defsubst gnus-article-hide-text (b e props) - "Set text PROPS on the B to E region, extending `intangible' 1 past B." - (gnus-add-text-properties-when 'article-type nil b e props) - (when (memq 'intangible props) - (put-text-property - (max (1- b) (point-min)) - b 'intangible (cddr (memq 'intangible props))))) - -(defsubst gnus-article-unhide-text (b e) - "Remove hidden text properties from region between B and E." - (remove-text-properties b e gnus-hidden-properties) - (when (memq 'intangible gnus-hidden-properties) - (put-text-property (max (1- b) (point-min)) - b 'intangible nil))) - -(defun gnus-article-hide-text-type (b e type) - "Hide text of TYPE between B and E." - (push type gnus-article-wash-types) - (gnus-article-hide-text - b e (cons 'article-type (cons type gnus-hidden-properties)))) - -(defun gnus-article-unhide-text-type (b e type) - "Unhide text of TYPE between B and E." - (setq gnus-article-wash-types - (delq type gnus-article-wash-types)) - (remove-text-properties - b e (cons 'article-type (cons type gnus-hidden-properties))) - (when (memq 'intangible gnus-hidden-properties) - (put-text-property (max (1- b) (point-min)) - b 'intangible nil))) - -(defun gnus-article-hide-text-of-type (type) - "Hide text of TYPE in the current buffer." - (save-excursion - (let ((b (point-min)) - (e (point-max))) - (while (setq b (text-property-any b e 'article-type type)) - (add-text-properties b (incf b) gnus-hidden-properties))))) - -(defun gnus-article-delete-text-of-type (type) - "Delete text of TYPE in the current buffer." - (save-excursion - (let ((b (point-min))) - (while (setq b (text-property-any b (point-max) 'article-type type)) - (delete-region - b (or (text-property-not-all b (point-max) 'article-type type) - (point-max))))))) - -(defun gnus-article-delete-invisible-text () - "Delete all invisible text in the current buffer." - (save-excursion - (let ((b (point-min))) - (while (setq b (text-property-any b (point-max) 'invisible t)) - (delete-region - b (or (text-property-not-all b (point-max) 'invisible t) - (point-max))))))) - -(defun gnus-article-text-type-exists-p (type) - "Say whether any text of type TYPE exists in the buffer." - (text-property-any (point-min) (point-max) 'article-type type)) - -(defsubst gnus-article-header-rank () - "Give the rank of the string HEADER as given by `gnus-sorted-header-list'." - (let ((list gnus-sorted-header-list) - (i 0)) - (while list - (when (looking-at (car list)) - (setq list nil)) - (setq list (cdr list)) - (incf i)) - i)) - -(defun article-hide-headers (&optional arg delete) - "Hide unwanted headers and possibly sort them as well." - (interactive (gnus-article-hidden-arg)) - ;; Lars said that this function might be inhibited. - (if (gnus-article-check-hidden-text 'headers arg) - (progn - ;; Show boring headers as well. - (gnus-article-show-hidden-text 'boring-headers) - (when (eq 1 (point-min)) - (set-window-start (get-buffer-window (current-buffer)) 1))) - (unless gnus-inhibit-hiding - (save-excursion - (save-restriction - (let ((inhibit-read-only t) - (case-fold-search t) - (max (1+ (length gnus-sorted-header-list))) - (ignored (when (not gnus-visible-headers) - (cond ((stringp gnus-ignored-headers) - gnus-ignored-headers) - ((listp gnus-ignored-headers) - (mapconcat 'identity gnus-ignored-headers - "\\|"))))) - (visible - (cond ((stringp gnus-visible-headers) - gnus-visible-headers) - ((and gnus-visible-headers - (listp gnus-visible-headers)) - (mapconcat 'identity gnus-visible-headers "\\|")))) - (inhibit-point-motion-hooks t) - beg) - ;; First we narrow to just the headers. - (article-narrow-to-head) - ;; Hide any "From " lines at the beginning of (mail) articles. - (while (looking-at "From ") - (forward-line 1)) - (unless (bobp) - (if delete - (delete-region (point-min) (point)) - (gnus-article-hide-text (point-min) (point) - (nconc (list 'article-type 'headers) - gnus-hidden-properties)))) - ;; Then treat the rest of the header lines. - ;; Then we use the two regular expressions - ;; `gnus-ignored-headers' and `gnus-visible-headers' to - ;; select which header lines is to remain visible in the - ;; article buffer. - (while (re-search-forward "^[^ \t:]*:" nil t) - (beginning-of-line) - ;; Mark the rank of the header. - (put-text-property - (point) (1+ (point)) 'message-rank - (if (or (and visible (looking-at visible)) - (and ignored - (not (looking-at ignored)))) - (gnus-article-header-rank) - (+ 2 max))) - (forward-line 1)) - (message-sort-headers-1) - (when (setq beg (text-property-any - (point-min) (point-max) 'message-rank (+ 2 max))) - ;; We delete or make invisible the unwanted headers. - (push 'headers gnus-article-wash-types) - (if delete - (progn - (add-text-properties - (point-min) (+ 5 (point-min)) - '(article-type headers dummy-invisible t)) - (delete-region beg (point-max))) - (gnus-article-hide-text-type beg (point-max) 'headers)))))))) - ) - -(defun article-hide-boring-headers (&optional arg) - "Toggle hiding of headers that aren't very interesting. -If given a negative prefix, always show; if given a positive prefix, -always hide." - (interactive (gnus-article-hidden-arg)) - (when (and (not (gnus-article-check-hidden-text 'boring-headers arg)) - (not gnus-show-all-headers)) - (save-excursion - (save-restriction - (let ((buffer-read-only nil) - (list gnus-boring-article-headers) - (inhibit-point-motion-hooks t) - elem) - (article-narrow-to-head) - (while list - (setq elem (pop list)) - (goto-char (point-min)) - (cond - ;; Hide empty headers. - ((eq elem 'empty) - (while (re-search-forward "^[^: \t]+:[ \t]*\n[^ \t]" nil t) - (forward-line -1) - (gnus-article-hide-text-type - (progn (beginning-of-line) (point)) - (progn - (end-of-line) - (if (re-search-forward "^[^ \t]" nil t) - (match-beginning 0) - (point-max))) - 'boring-headers))) - ;; Hide boring Newsgroups header. - ((eq elem 'newsgroups) - (when (gnus-string-equal - (gnus-fetch-field "newsgroups") - (gnus-group-real-name - (if (boundp 'gnus-newsgroup-name) - gnus-newsgroup-name - ""))) - (gnus-article-hide-header "newsgroups"))) - ((eq elem 'to-address) - (let ((to (message-fetch-field "to")) - (to-address - (gnus-parameter-to-address - (if (boundp 'gnus-newsgroup-name) - gnus-newsgroup-name "")))) - (when (and to to-address - (ignore-errors - (gnus-string-equal - ;; only one address in To - (nth 1 (mail-extract-address-components to)) - to-address))) - (gnus-article-hide-header "to")))) - ((eq elem 'followup-to) - (when (gnus-string-equal - (message-fetch-field "followup-to") - (message-fetch-field "newsgroups")) - (gnus-article-hide-header "followup-to"))) - ((eq elem 'reply-to) - (let ((from (message-fetch-field "from")) - (reply-to (message-fetch-field "reply-to"))) - (when (and - from reply-to - (ignore-errors - (gnus-string-equal - (nth 1 (mail-extract-address-components from)) - (nth 1 (mail-extract-address-components reply-to))))) - (gnus-article-hide-header "reply-to")))) - ((eq elem 'date) - (let ((date (message-fetch-field "date"))) - (when (and date - (< (days-between (current-time-string) date) - 4)) - (gnus-article-hide-header "date")))) - ((eq elem 'long-to) - (let ((to (message-fetch-field "to")) - (cc (message-fetch-field "cc"))) - (when (> (length to) 1024) - (gnus-article-hide-header "to")) - (when (> (length cc) 1024) - (gnus-article-hide-header "cc")))) - ((eq elem 'many-to) - (let ((to-count 0) - (cc-count 0)) - (goto-char (point-min)) - (while (re-search-forward "^to:" nil t) - (setq to-count (1+ to-count))) - (when (> to-count 1) - (while (> to-count 0) - (goto-char (point-min)) - (save-restriction - (re-search-forward "^to:" nil nil to-count) - (forward-line -1) - (narrow-to-region (point) (point-max)) - (gnus-article-hide-header "to")) - (setq to-count (1- to-count)))) - (goto-char (point-min)) - (while (re-search-forward "^cc:" nil t) - (setq cc-count (1+ cc-count))) - (when (> cc-count 1) - (while (> cc-count 0) - (goto-char (point-min)) - (save-restriction - (re-search-forward "^cc:" nil nil cc-count) - (forward-line -1) - (narrow-to-region (point) (point-max)) - (gnus-article-hide-header "cc")) - (setq cc-count (1- cc-count))))))))))))) - -(defun gnus-article-hide-header (header) - (save-excursion - (goto-char (point-min)) - (when (re-search-forward (concat "^" header ":") nil t) - (gnus-article-hide-text-type - (progn (beginning-of-line) (point)) - (progn - (end-of-line) - (if (re-search-forward "^[^ \t]" nil t) - (match-beginning 0) - (point-max))) - 'boring-headers)))) - -(defun article-toggle-headers (&optional arg) - "Toggle hiding of headers. If given a negative prefix, always show; -if given a positive prefix, always hide." - (interactive (gnus-article-hidden-arg)) - (let ((force (when (numberp arg) - (cond ((> arg 0) 'always-hide) - ((< arg 0) 'always-show)))) - (window (get-buffer-window gnus-article-buffer)) - (header-end (point-min)) - header-start field-end field-start - (inhibit-point-motion-hooks t) - (inhibit-read-only t)) - (save-restriction - (widen) - (while (and (setq header-start - (text-property-any header-end (point-max) - 'article-treated-header t)) - (setq header-end - (text-property-not-all header-start (point-max) - 'article-treated-header t))) - (setq field-end header-start) - (cond - (;; Hide exposed invisible fields. - (and (not (eq 'always-show force)) - (setq field-start - (text-property-any field-end header-end - 'exposed-invisible-field t))) - (while (and field-start - (setq field-end (text-property-not-all - field-start header-end - 'exposed-invisible-field t))) - (add-text-properties field-start field-end gnus-hidden-properties) - (setq field-start (text-property-any field-end header-end - 'exposed-invisible-field t))) - (put-text-property header-start header-end - 'exposed-invisible-field nil)) - (;; Expose invisible fields. - (and (not (eq 'always-hide force)) - (setq field-start - (text-property-any field-end header-end 'invisible t))) - (while (and field-start - (setq field-end (text-property-not-all - field-start header-end - 'invisible t))) - ;; If the invisible text is not terminated with newline, we - ;; won't expose it. Because it may be created by x-face-mule. - ;; BTW, XEmacs sometimes fail in putting a invisible text - ;; property with `gnus-article-hide-text' (really?). In that - ;; case, the invisible text might be started from the middle of - ;; a line so we will expose the sort of thing. - (when (or (not (or (eq header-start field-start) - (eq ?\n (char-before field-start)))) - (eq ?\n (char-before field-end))) - (remove-text-properties field-start field-end - gnus-hidden-properties) - (put-text-property field-start field-end - 'exposed-invisible-field t)) - (setq field-start (text-property-any field-end header-end - 'invisible t)))) - (;; Hide fields. - (not (eq 'always-show force)) - (narrow-to-region header-start header-end) - (article-hide-headers) - ;; Re-display X-Face image under XEmacs. - (when (and (featurep 'xemacs) - (gnus-functionp gnus-article-x-face-command)) - (let ((func (cadr (assq 'gnus-treat-display-xface - gnus-treatment-function-alist))) - (condition 'head)) - (when (and (not gnus-inhibit-treatment) - func - (gnus-treat-predicate gnus-treat-display-xface)) - (funcall func) - (put-text-property header-start header-end 'read-only nil)))) - (widen)) - )) - (goto-char (point-min)) - (when window - (set-window-start window (point-min)))))) - -(defvar gnus-article-normalized-header-length 40 - "Length of normalized headers.") - -(defun article-normalize-headers () - "Make all header lines 40 characters long." - (interactive) - (let ((buffer-read-only nil) - column) - (save-excursion - (save-restriction - (article-narrow-to-head) - (while (not (eobp)) - (cond - ((< (setq column (- (gnus-point-at-eol) (point))) - gnus-article-normalized-header-length) - (end-of-line) - (insert (make-string - (- gnus-article-normalized-header-length column) - ? ))) - ((> column gnus-article-normalized-header-length) - (gnus-put-text-property - (progn - (forward-char gnus-article-normalized-header-length) - (point)) - (gnus-point-at-eol) - 'invisible t)) - (t - ;; Do nothing. - )) - (forward-line 1)))))) - -(defun article-treat-dumbquotes () - "Translate M****s*** sm*rtq**t*s into proper text. -Note that this function guesses whether a character is a sm*rtq**t* or -not, so it should only be used interactively. - -Sm*rtq**t*s are M****s***'s unilateral extension to the character map -in an attempt to provide more quoting characters. If you see -something like \\222 or \\264 where you're expecting some kind of -apostrophe or quotation mark, then try this wash." - (interactive) - (article-translate-strings gnus-article-dumbquotes-map)) - -(defun article-translate-characters (from to) - "Translate all characters in the body of the article according to FROM and TO. -FROM is a string of characters to translate from; to is a string of -characters to translate to." - (save-excursion - (when (article-goto-body) - (let ((buffer-read-only nil) - (x (make-string 225 ?x)) - (i -1)) - (while (< (incf i) (length x)) - (aset x i i)) - (setq i 0) - (while (< i (length from)) - (aset x (aref from i) (aref to i)) - (incf i)) - (translate-region (point) (point-max) x))))) - -(defun article-translate-strings (map) - "Translate all string in the body of the article according to MAP. -MAP is an alist where the elements are on the form (\"from\" \"to\")." - (save-excursion - (when (article-goto-body) - (let ((buffer-read-only nil) - elem) - (while (setq elem (pop map)) - (save-excursion - (while (search-forward (car elem) nil t) - (replace-match (cadr elem))))))))) - -(defun article-treat-overstrike () - "Translate overstrikes into bold text." - (interactive) - (save-excursion - (when (article-goto-body) - (let ((buffer-read-only nil)) - (while (search-forward "\b" nil t) - (let ((next (char-after)) - start end previous) - (backward-char 2) - (setq start (point) - previous (char-after)) - (forward-char 3) - (setq end (point)) - (backward-char) - ;; We do the boldification/underlining by hiding the - ;; overstrikes and putting the proper text property - ;; on the letters. - (cond - ((eq next previous) - (gnus-article-hide-text-type start (point) 'overstrike) - (put-text-property (point) end 'face 'bold)) - ((eq next ?_) - (gnus-article-hide-text-type - (1- (point)) (1+ (point)) 'overstrike) - (put-text-property - start (1- (point)) 'face 'underline)) - ((eq previous ?_) - (gnus-article-hide-text-type start (point) 'overstrike) - (put-text-property - (point) end 'face 'underline))))))))) - -(defun article-fill-long-lines () - "Fill lines that are wider than the window width." - (interactive) - (save-excursion - (let ((buffer-read-only nil) - (width (window-width (get-buffer-window (current-buffer))))) - (save-restriction - (article-goto-body) - (let ((adaptive-fill-mode nil)) ;Why? -sm - (while (not (eobp)) - (end-of-line) - (when (>= (current-column) (min fill-column width)) - (narrow-to-region (point) (gnus-point-at-bol)) - (fill-paragraph nil) - (goto-char (point-max)) - (widen)) - (forward-line 1))))))) - -(defun article-capitalize-sentences () - "Capitalize the first word in each sentence." - (interactive) - (save-excursion - (let ((buffer-read-only nil) - (paragraph-start "^[\n\^L]")) - (article-goto-body) - (while (not (eobp)) - (capitalize-word 1) - (forward-sentence))))) - -(defun article-remove-cr () - "Remove trailing CRs and then translate remaining CRs into LFs." - (interactive) - (save-excursion - (let ((buffer-read-only nil)) - (goto-char (point-min)) - (while (re-search-forward "\r+$" nil t) - (replace-match "" t t)) - (goto-char (point-min)) - (while (search-forward "\r" nil t) - (replace-match "\n" t t))))) - -(defun article-remove-trailing-blank-lines () - "Remove all trailing blank lines from the article." - (interactive) - (save-excursion - (let ((buffer-read-only nil)) - (goto-char (point-max)) - (delete-region - (point) - (progn - (while (and (not (bobp)) - (looking-at "^[ \t]*$") - (not (gnus-annotation-in-region-p - (point) (gnus-point-at-eol)))) - (forward-line -1)) - (forward-line 1) - (point)))))) - -(defun article-display-x-face (&optional force) - "Look for an X-Face header and display it if present." - (interactive (list 'force)) - (save-excursion - ;; Delete the old process, if any. - (when (process-status "article-x-face") - (delete-process "article-x-face")) - (let ((inhibit-point-motion-hooks t) - x-faces - (case-fold-search t) - from last) - (save-restriction - (article-narrow-to-head) -;; (when (and buffer-read-only ;; When type `W f' -;; (progn -;; (goto-char (point-min)) -;; (not (re-search-forward "^X-Face:[\t ]*" nil t))) -;; (gnus-buffer-live-p gnus-original-article-buffer)) -;; (with-current-buffer gnus-original-article-buffer -;; (save-restriction -;; (article-narrow-to-head) -;; (while (re-search-forward "^X-Face:" nil t) -;; (setq x-faces -;; (concat -;; (or x-faces "") -;; (buffer-substring -;; (match-beginning 0) -;; (1- (re-search-forward -;; "^\\($\\|[^ \t]\\)" nil t)))))))) -;; (if x-faces -;; (let (point start bface eface buffer-read-only) -;; (goto-char (point-max)) -;; (forward-line -1) -;; (setq bface (get-text-property (gnus-point-at-bol) 'face) -;; eface (get-text-property (1- (gnus-point-at-eol)) 'face)) -;; (goto-char (point-max)) -;; (setq point (point)) -;; (insert x-faces) -;; (goto-char point) -;; (while (looking-at "\\([^:]+\\): *") -;; (put-text-property (match-beginning 1) (1+ (match-end 1)) -;; 'face bface) -;; (setq start (match-end 0)) -;; (forward-line 1) -;; (while (looking-at "[\t ]") -;; (forward-line 1)) -;; (put-text-property start (point) -;; 'face eface))))) - (goto-char (point-min)) - (setq from (message-fetch-field "from")) - (goto-char (point-min)) - (while (and gnus-article-x-face-command - (not last) - (or force - ;; Check whether this face is censored. - (not gnus-article-x-face-too-ugly) - (and gnus-article-x-face-too-ugly from - (not (string-match gnus-article-x-face-too-ugly - from)))) - ;; Has to be present. - (re-search-forward "^X-Face:[\t ]*" nil t)) - ;; This used to try to do multiple faces (`while' instead of - ;; `when' above), but (a) sending multiple EOFs to xv doesn't - ;; work (b) it can crash some versions of Emacs (c) are - ;; multiple faces really something to encourage? - (when (stringp gnus-article-x-face-command) - (setq last t)) - ;; We now have the area of the buffer where the X-Face is stored. - (save-excursion - (let ((beg (point)) - (end (1- (re-search-forward "^\\($\\|[^ \t]\\)" nil t)))) - ;; We display the face. - (if (symbolp gnus-article-x-face-command) - ;; The command is a lisp function, so we call it. - (if (gnus-functionp gnus-article-x-face-command) - (funcall gnus-article-x-face-command beg end) - (error "%s is not a function" gnus-article-x-face-command)) - ;; The command is a string, so we interpret the command - ;; as a, well, command, and fork it off. - (let ((process-connection-type nil)) - (process-kill-without-query - (start-process - "article-x-face" nil shell-file-name shell-command-switch - gnus-article-x-face-command)) - (process-send-region "article-x-face" beg end) - (process-send-eof "article-x-face")))))))))) - -(defun article-decode-mime-words () - "Decode all MIME-encoded words in the article." - (interactive) - (save-excursion - (set-buffer gnus-article-buffer) - (let ((inhibit-point-motion-hooks t) - buffer-read-only - (mail-parse-charset gnus-newsgroup-charset) - (mail-parse-ignored-charsets - (save-excursion (set-buffer gnus-summary-buffer) - gnus-newsgroup-ignored-charsets))) - (mail-decode-encoded-word-region (point-min) (point-max))))) - -(defun article-decode-charset (&optional prompt) - "Decode charset-encoded text in the article. -If PROMPT (the prefix), prompt for a coding system to use." - (interactive "P") - (let ((inhibit-point-motion-hooks t) (case-fold-search t) - buffer-read-only - (mail-parse-charset gnus-newsgroup-charset) - (mail-parse-ignored-charsets - (save-excursion (condition-case nil - (set-buffer gnus-summary-buffer) - (error)) - gnus-newsgroup-ignored-charsets)) - ct cte ctl charset format) - (save-excursion - (save-restriction - (article-narrow-to-head) - (setq ct (message-fetch-field "Content-Type" t) - cte (message-fetch-field "Content-Transfer-Encoding" t) - ctl (and ct (ignore-errors - (mail-header-parse-content-type ct))) - charset (cond - (prompt - (mm-read-coding-system "Charset to decode: ")) - (ctl - (mail-content-type-get ctl 'charset))) - format (and ctl (mail-content-type-get ctl 'format))) - (when cte - (setq cte (mail-header-strip cte))) - (if (and ctl (not (string-match "/" (car ctl)))) - (setq ctl nil)) - (goto-char (point-max))) - (forward-line 1) - (save-restriction - (narrow-to-region (point) (point-max)) - (when (and (eq mail-parse-charset 'gnus-decoded) - (eq (mm-body-7-or-8) '8bit)) - ;; The text code could have been decoded. - (setq charset mail-parse-charset)) - (when (and (or (not ctl) - (equal (car ctl) "text/plain")) - (not format)) ;; article with format will decode later. - (mm-decode-body - charset (and cte (intern (downcase - (gnus-strip-whitespace cte)))) - (car ctl))))))) - -(defun article-decode-encoded-words () - "Remove encoded-word encoding from headers." - (let (buffer-read-only) - (let ((charset (save-excursion - (set-buffer gnus-summary-buffer) - default-mime-charset))) - (mime-decode-header-in-buffer charset) - ))) - -(defun article-de-quoted-unreadable (&optional force read-charset) - "Translate a quoted-printable-encoded article. -If FORCE, decode the article whether it is marked as quoted-printable -or not. -If READ-CHARSET, ask for a coding system." - (interactive (list 'force current-prefix-arg)) - (save-excursion - (let ((buffer-read-only nil) type charset) - (if (gnus-buffer-live-p gnus-original-article-buffer) - (with-current-buffer gnus-original-article-buffer - (setq type - (gnus-fetch-field "content-transfer-encoding")) - (let* ((ct (gnus-fetch-field "content-type")) - (ctl (and ct - (ignore-errors - (mail-header-parse-content-type ct))))) - (setq charset (and ctl - (mail-content-type-get ctl 'charset))) - (if (stringp charset) - (setq charset (intern (downcase charset))))))) - (if read-charset - (setq charset (mm-read-coding-system "Charset: " charset))) - (unless charset - (setq charset gnus-newsgroup-charset)) - (when (or force - (and type (let ((case-fold-search t)) - (string-match "quoted-printable" type)))) - (article-goto-body) - (quoted-printable-decode-region - (point) (point-max) (mm-charset-to-coding-system charset)))))) - -(defun article-de-base64-unreadable (&optional force read-charset) - "Translate a base64 article. -If FORCE, decode the article whether it is marked as base64 not. -If READ-CHARSET, ask for a coding system." - (interactive (list 'force current-prefix-arg)) - (save-excursion - (let ((buffer-read-only nil) type charset) - (if (gnus-buffer-live-p gnus-original-article-buffer) - (with-current-buffer gnus-original-article-buffer - (setq type - (gnus-fetch-field "content-transfer-encoding")) - (let* ((ct (gnus-fetch-field "content-type")) - (ctl (and ct - (ignore-errors - (mail-header-parse-content-type ct))))) - (setq charset (and ctl - (mail-content-type-get ctl 'charset))) - (if (stringp charset) - (setq charset (intern (downcase charset))))))) - (if read-charset - (setq charset (mm-read-coding-system "Charset: " charset))) - (unless charset - (setq charset gnus-newsgroup-charset)) - (when (or force - (and type (let ((case-fold-search t)) - (string-match "base64" type)))) - (article-goto-body) - (save-restriction - (narrow-to-region (point) (point-max)) - (base64-decode-region (point-min) (point-max)) - (mm-decode-coding-region - (point-min) (point-max) (mm-charset-to-coding-system charset))))))) - -(eval-when-compile - (require 'rfc1843)) - -(defun article-decode-HZ () - "Translate a HZ-encoded article." - (interactive) - (require 'rfc1843) - (save-excursion - (let ((buffer-read-only nil)) - (rfc1843-decode-region (point-min) (point-max))))) - -(defun article-wash-html (&optional read-charset) - "Format an html article. -If READ-CHARSET, ask for a coding system." - (interactive "P") - (save-excursion - (let ((buffer-read-only nil) - charset) - (if (gnus-buffer-live-p gnus-original-article-buffer) - (with-current-buffer gnus-original-article-buffer - (let* ((ct (gnus-fetch-field "content-type")) - (ctl (and ct - (ignore-errors - (mail-header-parse-content-type ct))))) - (setq charset (and ctl - (mail-content-type-get ctl 'charset))) - (if (stringp charset) - (setq charset (intern (downcase charset))))))) - (if read-charset - (setq charset (mm-read-coding-system "Charset: " charset))) - (unless charset - (setq charset gnus-newsgroup-charset)) - (article-goto-body) - (save-window-excursion - (save-restriction - (narrow-to-region (point) (point-max)) - (mm-setup-w3) - (let ((w3-strict-width (window-width)) - (url-standalone-mode t)) - (condition-case var - (w3-region (point-min) (point-max)) - (error)))))))) - -(defun article-hide-list-identifiers () - "Remove list identifies from the Subject header. -The `gnus-list-identifiers' variable specifies what to do." - (interactive) - (let ((inhibit-point-motion-hooks t) - (regexp (if (consp gnus-list-identifiers) - (mapconcat 'identity gnus-list-identifiers " *\\|") - gnus-list-identifiers)) - buffer-read-only) - (when regexp - (save-excursion - (save-restriction - (article-narrow-to-head) - (goto-char (point-min)) - (while (re-search-forward - (concat "^Subject: +\\(R[Ee]: +\\)*\\(" regexp " *\\)") - nil t) - (delete-region (match-beginning 2) (match-end 0)) - (beginning-of-line)) - (when (re-search-forward - "^Subject: +\\(\\(R[Ee]: +\\)+\\)R[Ee]: +" nil t) - (delete-region (match-beginning 1) (match-end 1)))))))) - -(defun article-hide-pgp () - "Remove any PGP headers and signatures in the current article." - (interactive) - (save-excursion - (save-restriction - (let ((inhibit-point-motion-hooks t) - buffer-read-only beg end) - (article-goto-body) - ;; Hide the "header". - (when (re-search-forward "^-----BEGIN PGP SIGNED MESSAGE-----\n" nil t) - (push 'pgp gnus-article-wash-types) - (delete-region (match-beginning 0) (match-end 0)) - ;; Remove armor headers (rfc2440 6.2) - (delete-region (point) (or (re-search-forward "^[ \t]*\n" nil t) - (point))) - (setq beg (point)) - ;; Hide the actual signature. - (and (search-forward "\n-----BEGIN PGP SIGNATURE-----\n" nil t) - (setq end (1+ (match-beginning 0))) - (delete-region - end - (if (search-forward "\n-----END PGP SIGNATURE-----\n" nil t) - (match-end 0) - ;; Perhaps we shouldn't hide to the end of the buffer - ;; if there is no end to the signature? - (point-max)))) - ;; Hide "- " PGP quotation markers. - (when (and beg end) - (narrow-to-region beg end) - (goto-char (point-min)) - (while (re-search-forward "^- " nil t) - (delete-region - (match-beginning 0) (match-end 0))) - (widen)) - (gnus-run-hooks 'gnus-article-hide-pgp-hook)))))) - -(defun article-hide-pem (&optional arg) - "Toggle hiding of any PEM headers and signatures in the current article. -If given a negative prefix, always show; if given a positive prefix, -always hide." - (interactive (gnus-article-hidden-arg)) - (unless (gnus-article-check-hidden-text 'pem arg) - (save-excursion - (let (buffer-read-only end) - (goto-char (point-min)) - ;; Hide the horrendously ugly "header". - (when (and (search-forward - "\n-----BEGIN PRIVACY-ENHANCED MESSAGE-----\n" - nil t) - (setq end (1+ (match-beginning 0)))) - (push 'pem gnus-article-wash-types) - (gnus-article-hide-text-type - end - (if (search-forward "\n\n" nil t) - (match-end 0) - (point-max)) - 'pem) - ;; Hide the trailer as well - (when (search-forward "\n-----END PRIVACY-ENHANCED MESSAGE-----\n" - nil t) - (gnus-article-hide-text-type - (match-beginning 0) (match-end 0) 'pem))))))) - -(defun article-strip-banner () - "Strip the banner specified by the `banner' group parameter." - (interactive) - (save-excursion - (save-restriction - (let ((inhibit-point-motion-hooks t) - (banner (gnus-parameter-banner gnus-newsgroup-name)) - (gnus-signature-limit nil) - buffer-read-only beg end) - (when banner - (article-goto-body) - (cond - ((eq banner 'signature) - (when (gnus-article-narrow-to-signature) - (widen) - (forward-line -1) - (delete-region (point) (point-max)))) - ((symbolp banner) - (if (setq banner (cdr (assq banner gnus-article-banner-alist))) - (while (re-search-forward banner nil t) - (delete-region (match-beginning 0) (match-end 0))))) - ((stringp banner) - (while (re-search-forward banner nil t) - (delete-region (match-beginning 0) (match-end 0)))))))))) - -(defun article-babel () - "Translate article using an online translation service." - (interactive) - (require 'babel) - (save-excursion - (set-buffer gnus-article-buffer) - (when (article-goto-body) - (let* ((buffer-read-only nil) - (start (point)) - (end (point-max)) - (orig (buffer-substring start end)) - (trans (babel-as-string orig))) - (save-restriction - (narrow-to-region start end) - (delete-region start end) - (insert trans)))))) - -(defun article-hide-signature (&optional arg) - "Hide the signature in the current article. -If given a negative prefix, always show; if given a positive prefix, -always hide." - (interactive (gnus-article-hidden-arg)) - (save-excursion - (save-restriction - (if (interactive-p) - (progn - (widen) - (article-goto-body)) - (goto-char (point-min))) - (unless (gnus-article-check-hidden-text 'signature arg) - (let ((buffer-read-only nil) - (button (point))) - (while (setq button (text-property-any button (point-max) - 'gnus-callback - 'gnus-signature-toggle)) - (setq button (text-property-not-all button (point-max) - 'gnus-callback - 'gnus-signature-toggle)) - (when (and button (not (eobp))) - (gnus-article-hide-text-type - (1+ button) - (next-single-property-change (1+ button) 'mime-view-entity - nil (point-max)) - 'signature)))))))) - -(defun article-strip-headers-in-body () - "Strip offensive headers from bodies." - (interactive) - (save-excursion - (article-goto-body) - (let ((case-fold-search t)) - (when (looking-at "x-no-archive:") - (gnus-delete-line))))) - -(defun article-strip-leading-blank-lines () - "Remove all blank lines from the beginning of the article." - (interactive) - (save-excursion - (let ((inhibit-point-motion-hooks t) - buffer-read-only) - (when (article-goto-body) - (while (and (not (eobp)) - (looking-at "[ \t]*$")) - (gnus-delete-line)))))) - -(defun article-narrow-to-head () - "Narrow the buffer to the head of the message. -Point is left at the beginning of the narrowed-to region." - (narrow-to-region - (goto-char (point-min)) - (if (search-forward "\n\n" nil 1) - (1- (point)) - (point-max))) - (goto-char (point-min))) - -(defun article-goto-body () - "Place point at the start of the body." - (goto-char (point-min)) - (cond - ;; This variable is only bound when dealing with separate - ;; MIME body parts. - (article-goto-body-goes-to-point-min-p - t) - ((search-forward "\n\n" nil t) - t) - (t - (goto-char (point-max)) - nil))) - -(defun article-strip-multiple-blank-lines () - "Replace consecutive blank lines with one empty line." - (interactive) - (save-excursion - (let ((inhibit-point-motion-hooks t) - buffer-read-only) - ;; First make all blank lines empty. - (article-goto-body) - (while (re-search-forward "^[ \t]+$" nil t) - (unless (gnus-annotation-in-region-p - (match-beginning 0) (match-end 0)) - (replace-match "" nil t))) - ;; Then replace multiple empty lines with a single empty line. - (article-goto-body) - (while (re-search-forward "\n\n\\(\n+\\)" nil t) - (unless (gnus-annotation-in-region-p - (match-beginning 0) (match-end 0)) - (delete-region (match-beginning 1) (match-end 1))))))) - -(defun article-strip-leading-space () - "Remove all white space from the beginning of the lines in the article." - (interactive) - (save-excursion - (let ((inhibit-point-motion-hooks t) - buffer-read-only) - (article-goto-body) - (while (re-search-forward "^[ \t]+" nil t) - (replace-match "" t t))))) - -(defun article-strip-trailing-space () - "Remove all white space from the end of the lines in the article." - (interactive) - (save-excursion - (let ((inhibit-point-motion-hooks t) - buffer-read-only) - (article-goto-body) - (while (re-search-forward "[ \t]+$" nil t) - (replace-match "" t t))))) - -(defun article-strip-blank-lines () - "Strip leading, trailing and multiple blank lines." - (interactive) - (article-strip-leading-blank-lines) - (article-remove-trailing-blank-lines) - (article-strip-multiple-blank-lines)) - -(defun article-strip-all-blank-lines () - "Strip all blank lines." - (interactive) - (save-excursion - (let ((inhibit-point-motion-hooks t) - buffer-read-only) - (article-goto-body) - (while (re-search-forward "^[ \t]*\n" nil t) - (replace-match "" t t))))) - -(defun gnus-article-narrow-to-signature () - "Narrow to the signature; return t if a signature is found, else nil." - (let ((inhibit-point-motion-hooks t)) - (when (gnus-article-search-signature) - (forward-line 1) - ;; Check whether we have some limits to what we consider - ;; to be a signature. - (let ((limits (if (listp gnus-signature-limit) gnus-signature-limit - (list gnus-signature-limit))) - limit limited) - (while (setq limit (pop limits)) - (if (or (and (integerp limit) - (< (- (point-max) (point)) limit)) - (and (floatp limit) - (< (count-lines (point) (point-max)) limit)) - (and (gnus-functionp limit) - (funcall limit)) - (and (stringp limit) - (not (re-search-forward limit nil t)))) - () ; This limit did not succeed. - (setq limited t - limits nil))) - (unless limited - (narrow-to-region (point) (point-max)) - t))))) - -(defun gnus-article-search-signature () - "Search the current buffer for the signature separator. -Put point at the beginning of the signature separator." - (let ((cur (point))) - (goto-char (point-max)) - (if (if (stringp gnus-signature-separator) - (re-search-backward gnus-signature-separator nil t) - (let ((seps gnus-signature-separator)) - (while (and seps - (not (re-search-backward (car seps) nil t))) - (pop seps)) - seps)) - t - (goto-char cur) - nil))) - -(defun gnus-article-hidden-arg () - "Return the current prefix arg as a number, or 0 if no prefix." - (list (if current-prefix-arg - (prefix-numeric-value current-prefix-arg) - 0))) - -(defun gnus-article-check-hidden-text (type arg) - "Return nil if hiding is necessary. -Arg can be nil or a number. Nil and positive means hide, negative -means show, 0 means toggle." - (save-excursion - (save-restriction - (let ((hide (gnus-article-hidden-text-p type))) - (cond - ((or (null arg) - (> arg 0)) - nil) - ((< arg 0) - (gnus-article-show-hidden-text type) - t) - (t - (if (eq hide 'hidden) - (progn - (gnus-article-show-hidden-text type) - t) - nil))))))) - -(defun gnus-article-hidden-text-p (type) - "Say whether the current buffer contains hidden text of type TYPE." - (let ((pos (text-property-any (point-min) (point-max) 'article-type type))) - (while (and pos - (not (get-text-property pos 'invisible)) - (not (get-text-property pos 'dummy-invisible))) - (setq pos - (text-property-any (1+ pos) (point-max) 'article-type type))) - (if pos - 'hidden - nil))) - -(defun gnus-article-show-hidden-text (type &optional dummy) - "Show all hidden text of type TYPE. -Originally it is hide instead of DUMMY." - (let ((buffer-read-only nil) - (inhibit-point-motion-hooks t)) - (gnus-remove-text-properties-when - 'article-type type - (point-min) (point-max) - (cons 'article-type (cons type - gnus-hidden-properties))))) - -(defconst article-time-units - `((year . ,(* 365.25 24 60 60)) - (week . ,(* 7 24 60 60)) - (day . ,(* 24 60 60)) - (hour . ,(* 60 60)) - (minute . 60) - (second . 1)) - "Mapping from time units to seconds.") - -(defun article-date-ut (&optional type highlight header) - "Convert DATE date to universal time in the current article. -If TYPE is `local', convert to local time; if it is `lapsed', output -how much time has lapsed since DATE. For `lapsed', the value of -`gnus-article-date-lapsed-new-header' says whether the \"X-Sent:\" header -should replace the \"Date:\" one, or should be added below it." - (interactive (list 'ut t)) - (let* ((header (or header - (and (eq 1 (point-min)) - (mail-header-date (save-excursion - (set-buffer gnus-summary-buffer) - gnus-current-headers))) - (message-fetch-field "date") - "")) - (date (if (vectorp header) (mail-header-date header) - header)) - (inhibit-point-motion-hooks t) - bface eface date-pos) - (when (and date (not (string= date ""))) - (save-excursion - (save-restriction - (article-narrow-to-head) - (when (or (and (eq type 'lapsed) - gnus-article-date-lapsed-new-header - ;; Attempt to get the face of X-Sent first. - (re-search-forward "^X-Sent:[ \t]" nil t)) - (re-search-forward "^Date:[ \t]" nil t) - ;; If Date is missing, try again for X-Sent. - (re-search-forward "^X-Sent:[ \t]" nil t)) - (setq bface (get-text-property (gnus-point-at-bol) 'face) - date (or (get-text-property (gnus-point-at-bol) - 'original-date) - date) - eface (get-text-property (1- (gnus-point-at-eol)) - 'face))) - (let ((buffer-read-only nil)) - ;; Delete any old X-Sent headers. - (when (setq date-pos - (text-property-any (point-min) (point-max) - 'article-date-lapsed t)) - (goto-char (setq date-pos (set-marker (make-marker) date-pos))) - (delete-region (match-beginning 0) - (progn (forward-line 1) (point)))) - (goto-char (point-min)) - ;; Delete any old Date headers. - (while (re-search-forward "^Date:[ \t]" nil t) - (unless date-pos - (setq date-pos (match-beginning 0))) - (unless (and (eq type 'lapsed) - gnus-article-date-lapsed-new-header) - (delete-region (match-beginning 0) - (progn (message-next-header) (point))))) - (if date-pos - (progn - (goto-char date-pos) - (unless (bolp) - ;; Possibly, Date has been deleted. - (insert "\n")) - (when (and (eq type 'lapsed) - gnus-article-date-lapsed-new-header - (looking-at "Date:")) - (forward-line 1))) - (goto-char (point-min))) - (insert (article-make-date-line date type)) - (when (eq type 'lapsed) - (put-text-property (gnus-point-at-bol) (point) - 'article-date-lapsed t)) - (insert "\n") - (forward-line -1) - ;; Do highlighting. - (when (looking-at "\\([^:]+\\): *\\(.*\\)$") - (put-text-property (match-beginning 1) (1+ (match-end 1)) - 'original-date date) - (put-text-property (match-beginning 1) (1+ (match-end 1)) - 'face bface) - (put-text-property (match-beginning 2) (match-end 2) - 'face eface)))))))) - -(defun article-make-date-line (date type) - "Return a DATE line of TYPE." - (unless (memq type '(local ut original user iso8601 lapsed english)) - (error "Unknown conversion type: %s" type)) - (condition-case () - (let ((time (date-to-time date))) - (cond - ;; Convert to the local timezone. - ((eq type 'local) - (let ((tz (car (current-time-zone time)))) - (format "Date: %s %s%02d%02d" (current-time-string time) - (if (> tz 0) "+" "-") (/ (abs tz) 3600) - (/ (% (abs tz) 3600) 60)))) - ;; Convert to Universal Time. - ((eq type 'ut) - (concat "Date: " - (current-time-string - (let* ((e (parse-time-string date)) - (tm (apply 'encode-time e)) - (ms (car tm)) - (ls (- (cadr tm) (car (current-time-zone time))))) - (cond ((< ls 0) (list (1- ms) (+ ls 65536))) - ((> ls 65535) (list (1+ ms) (- ls 65536))) - (t (list ms ls))))) - " UT")) - ;; Get the original date from the article. - ((eq type 'original) - (concat "Date: " (if (string-match "\n+$" date) - (substring date 0 (match-beginning 0)) - date))) - ;; Let the user define the format. - ((eq type 'user) - (if (gnus-functionp gnus-article-time-format) - (funcall gnus-article-time-format time) - (concat - "Date: " - (format-time-string gnus-article-time-format time)))) - ;; ISO 8601. - ((eq type 'iso8601) - (let ((tz (car (current-time-zone time)))) - (concat - "Date: " - (format-time-string "%Y%m%dT%H%M%S" time) - (format "%s%02d%02d" - (if (> tz 0) "+" "-") (/ (abs tz) 3600) - (/ (% (abs tz) 3600) 60))))) - ;; Do an X-Sent lapsed format. - ((eq type 'lapsed) - ;; If the date is seriously mangled, the timezone functions are - ;; liable to bug out, so we ignore all errors. - (let* ((now (current-time)) - (real-time (subtract-time now time)) - (real-sec (and real-time - (+ (* (float (car real-time)) 65536) - (cadr real-time)))) - (sec (and real-time (abs real-sec))) - num prev) - (cond - ((null real-time) - "X-Sent: Unknown") - ((zerop sec) - "X-Sent: Now") - (t - (concat - "X-Sent: " - ;; This is a bit convoluted, but basically we go - ;; through the time units for years, weeks, etc, - ;; and divide things to see whether that results - ;; in positive answers. - (mapconcat - (lambda (unit) - (if (zerop (setq num (ffloor (/ sec (cdr unit))))) - ;; The (remaining) seconds are too few to - ;; be divided into this time unit. - "" - ;; It's big enough, so we output it. - (setq sec (- sec (* num (cdr unit)))) - (prog1 - (concat (if prev ", " "") (int-to-string - (floor num)) - " " (symbol-name (car unit)) - (if (> num 1) "s" "")) - (setq prev t)))) - article-time-units "") - ;; If dates are odd, then it might appear like the - ;; article was sent in the future. - (if (> real-sec 0) - " ago" - " in the future")))))) - ;; Display the date in proper English - ((eq type 'english) - (let ((dtime (decode-time time))) - (concat - "Date: the " - (number-to-string (nth 3 dtime)) - (let ((digit (% (nth 3 dtime) 10))) - (cond - ((memq (nth 3 dtime) '(11 12 13)) "th") - ((= digit 1) "st") - ((= digit 2) "nd") - ((= digit 3) "rd") - (t "th"))) - " of " - (nth (1- (nth 4 dtime)) gnus-english-month-names) - " " - (number-to-string (nth 5 dtime)) - " at " - (format "%02d" (nth 2 dtime)) - ":" - (format "%02d" (nth 1 dtime))))))) - (error - (format "Date: %s (from Oort)" date)))) - -(defun article-date-local (&optional highlight) - "Convert the current article date to the local timezone." - (interactive (list t)) - (article-date-ut 'local highlight)) - -(defun article-date-english (&optional highlight) - "Convert the current article date to something that is proper English." - (interactive (list t)) - (article-date-ut 'english highlight)) - -(defun article-date-original (&optional highlight) - "Convert the current article date to what it was originally. -This is only useful if you have used some other date conversion -function and want to see what the date was before converting." - (interactive (list t)) - (article-date-ut 'original highlight)) - -(defun article-date-lapsed (&optional highlight) - "Convert the current article date to time lapsed since it was sent." - (interactive (list t)) - (article-date-ut 'lapsed highlight)) - -(defun article-update-date-lapsed () - "Function to be run from a timer to update the lapsed time line." - (let (deactivate-mark) - (save-excursion - (ignore-errors - (walk-windows - (lambda (w) - (set-buffer (window-buffer w)) - (when (eq major-mode 'gnus-article-mode) - (goto-char (point-min)) - (when (re-search-forward "^X-Sent:" nil t) - (article-date-lapsed t)))) - nil 'visible))))) - -(defun gnus-start-date-timer (&optional n) - "Start a timer to update the X-Sent header in the article buffers. -The numerical prefix says how frequently (in seconds) the function -is to run." - (interactive "p") - (unless n - (setq n 1)) - (gnus-stop-date-timer) - (setq article-lapsed-timer - (nnheader-run-at-time 1 n 'article-update-date-lapsed))) - -(defun gnus-stop-date-timer () - "Stop the X-Sent timer." - (interactive) - (when article-lapsed-timer - (nnheader-cancel-timer article-lapsed-timer) - (setq article-lapsed-timer nil))) - -(defun article-date-user (&optional highlight) - "Convert the current article date to the user-defined format. -This format is defined by the `gnus-article-time-format' variable." - (interactive (list t)) - (article-date-ut 'user highlight)) - -(defun article-date-iso8601 (&optional highlight) - "Convert the current article date to ISO8601." - (interactive (list t)) - (article-date-ut 'iso8601 highlight)) - -(defun article-show-all () - "Show all hidden text in the article buffer." - (interactive) - (save-excursion - (widen) - (let ((buffer-read-only nil)) - (gnus-article-unhide-text (point-min) (point-max)) - (gnus-remove-text-with-property 'gnus-prev) - (gnus-remove-text-with-property 'gnus-next)))) - -(defun article-show-all-headers () - "Show all hidden headers in the article buffer." - (interactive) - (save-excursion - (save-restriction - (widen) - (article-narrow-to-head) - (let ((buffer-read-only nil)) - (gnus-article-unhide-text (point-min) (point-max)))))) - -(defun article-remove-leading-whitespace () - "Remove excessive whitespace from all headers." - (interactive) - (save-excursion - (save-restriction - (let ((buffer-read-only nil)) - (article-narrow-to-head) - (goto-char (point-min)) - (while (re-search-forward "^[^ :]+: \\([ \t]+\\)" nil t) - (delete-region (match-beginning 1) (match-end 1))))))) - -(defun article-emphasize (&optional arg) - "Emphasize text according to `gnus-emphasis-alist'." - (interactive (gnus-article-hidden-arg)) - (unless (gnus-article-check-hidden-text 'emphasis arg) - (save-excursion - (let ((alist (or - (condition-case nil - (with-current-buffer gnus-summary-buffer - gnus-article-emphasis-alist) - (error)) - gnus-emphasis-alist)) - (buffer-read-only nil) - (props (append '(article-type emphasis) - gnus-hidden-properties)) - regexp elem beg invisible visible face) - (article-goto-body) - (setq beg (point)) - (while (setq elem (pop alist)) - (goto-char beg) - (setq regexp (car elem) - invisible (nth 1 elem) - visible (nth 2 elem) - face (nth 3 elem)) - (while (re-search-forward regexp nil t) - (when (and (match-beginning visible) (match-beginning invisible)) - (push 'emphasis gnus-article-wash-types) - (gnus-article-hide-text - (match-beginning invisible) (match-end invisible) props) - (gnus-article-unhide-text-type - (match-beginning visible) (match-end visible) 'emphasis) - (gnus-put-text-property-excluding-newlines - (match-beginning visible) (match-end visible) 'face face) - (goto-char (match-end invisible))))))))) - -(defun gnus-article-setup-highlight-words (&optional highlight-words) - "Setup newsgroup emphasis alist." - (unless gnus-article-emphasis-alist - (let ((name (and gnus-newsgroup-name - (gnus-group-real-name gnus-newsgroup-name)))) - (make-local-variable 'gnus-article-emphasis-alist) - (setq gnus-article-emphasis-alist - (nconc - (let ((alist gnus-group-highlight-words-alist) elem highlight) - (while (setq elem (pop alist)) - (when (and name (string-match (car elem) name)) - (setq alist nil - highlight (copy-sequence (cdr elem))))) - highlight) - (copy-sequence highlight-words) - (if gnus-newsgroup-name - (copy-sequence (gnus-group-find-parameter - gnus-newsgroup-name 'highlight-words t))) - gnus-emphasis-alist))))) - -(eval-when-compile - (defvar gnus-summary-article-menu) - (defvar gnus-summary-post-menu)) - -;;; Saving functions. - -(defun gnus-article-save (save-buffer file &optional num) - "Save the currently selected article." - (unless gnus-save-all-headers - ;; Remove headers according to `gnus-saved-headers'. - (let ((gnus-visible-headers - (or gnus-saved-headers gnus-visible-headers)) - (gnus-article-buffer save-buffer)) - (save-excursion - (set-buffer save-buffer) - (article-hide-headers 1 t)))) - (save-window-excursion - (if (not gnus-default-article-saver) - (error "No default saver is defined") - ;; !!! Magic! The saving functions all save - ;; `gnus-save-article-buffer' (or so they think), but we - ;; bind that variable to our save-buffer. - (set-buffer gnus-article-buffer) - (let* ((gnus-save-article-buffer save-buffer) - (filename - (cond - ((not gnus-prompt-before-saving) 'default) - ((eq gnus-prompt-before-saving 'always) nil) - (t file))) - (gnus-number-of-articles-to-be-saved - (when (eq gnus-prompt-before-saving t) - num))) ; Magic - (set-buffer gnus-article-current-summary) - (funcall gnus-default-article-saver filename))))) - -(defun gnus-read-save-file-name (prompt &optional filename - function group headers variable) - (let ((default-name - (funcall function group headers (symbol-value variable))) - result) - (setq result - (expand-file-name - (cond - ((eq filename 'default) - default-name) - ((eq filename t) - default-name) - (filename filename) - (t - (let* ((split-name (gnus-get-split-value gnus-split-methods)) - (prompt - (format prompt - (if (and gnus-number-of-articles-to-be-saved - (> gnus-number-of-articles-to-be-saved 1)) - (format "these %d articles" - gnus-number-of-articles-to-be-saved) - "this article"))) - (file - ;; Let the split methods have their say. - (cond - ;; No split name was found. - ((null split-name) - (read-file-name - (concat prompt " (default " - (file-name-nondirectory default-name) ") ") - (file-name-directory default-name) - default-name)) - ;; A single group name is returned. - ((stringp split-name) - (setq default-name - (funcall function split-name headers - (symbol-value variable))) - (read-file-name - (concat prompt " (default " - (file-name-nondirectory default-name) ") ") - (file-name-directory default-name) - default-name)) - ;; A single split name was found - ((= 1 (length split-name)) - (let* ((name (expand-file-name - (car split-name) - gnus-article-save-directory)) - (dir (cond ((file-directory-p name) - (file-name-as-directory name)) - ((file-exists-p name) name) - (t gnus-article-save-directory)))) - (read-file-name - (concat prompt " (default " name ") ") - dir name))) - ;; A list of splits was found. - (t - (setq split-name (nreverse split-name)) - (let (result) - (let ((file-name-history - (nconc split-name file-name-history))) - (setq result - (expand-file-name - (read-file-name - (concat prompt " (`M-p' for defaults) ") - gnus-article-save-directory - (car split-name)) - gnus-article-save-directory))) - (car (push result file-name-history))))))) - ;; Create the directory. - (gnus-make-directory (file-name-directory file)) - ;; If we have read a directory, we append the default file name. - (when (file-directory-p file) - (setq file (expand-file-name (file-name-nondirectory - default-name) - (file-name-as-directory file)))) - ;; Possibly translate some characters. - (nnheader-translate-file-chars file)))))) - (gnus-make-directory (file-name-directory result)) - (set variable result))) - -(defun gnus-article-archive-name (group) - "Return the first instance of an \"Archive-name\" in the current buffer." - (let ((case-fold-search t)) - (when (re-search-forward "archive-name: *\\([^ \n\t]+\\)[ \t]*$" nil t) - (nnheader-concat gnus-article-save-directory - (match-string 1))))) - -(defun gnus-article-nndoc-name (group) - "If GROUP is an nndoc group, return the name of the parent group." - (when (eq (car (gnus-find-method-for-group group)) 'nndoc) - (gnus-group-get-parameter group 'save-article-group))) - -(defun gnus-summary-save-in-rmail (&optional filename) - "Append this article to Rmail file. -Optional argument FILENAME specifies file name. -Directory to save to is default to `gnus-article-save-directory'." - (setq filename (gnus-read-save-file-name - "Save %s in rmail file:" filename - gnus-rmail-save-name gnus-newsgroup-name - gnus-current-headers 'gnus-newsgroup-last-rmail)) - (gnus-eval-in-buffer-window gnus-save-article-buffer - (save-excursion - (save-restriction - (widen) - (gnus-output-to-rmail filename)))) - filename) - -(defun gnus-summary-save-in-mail (&optional filename) - "Append this article to Unix mail file. -Optional argument FILENAME specifies file name. -Directory to save to is default to `gnus-article-save-directory'." - (setq filename (gnus-read-save-file-name - "Save %s in Unix mail file:" filename - gnus-mail-save-name gnus-newsgroup-name - gnus-current-headers 'gnus-newsgroup-last-mail)) - (gnus-eval-in-buffer-window gnus-save-article-buffer - (save-excursion - (save-restriction - (widen) - (if (and (file-readable-p filename) - (mail-file-babyl-p filename)) - (rmail-output-to-rmail-file filename t) - (gnus-output-to-mail filename))))) - filename) - -(defun gnus-summary-save-in-file (&optional filename overwrite) - "Append this article to file. -Optional argument FILENAME specifies file name. -Directory to save to is default to `gnus-article-save-directory'." - (setq filename (gnus-read-save-file-name - "Save %s in file:" filename - gnus-file-save-name gnus-newsgroup-name - gnus-current-headers 'gnus-newsgroup-last-file)) - (gnus-eval-in-buffer-window gnus-save-article-buffer - (save-excursion - (save-restriction - (widen) - (when (and overwrite - (file-exists-p filename)) - (delete-file filename)) - (gnus-output-to-file filename)))) - filename) - -(defun gnus-summary-write-to-file (&optional filename) - "Write this article to a file. -Optional argument FILENAME specifies file name. -The directory to save in defaults to `gnus-article-save-directory'." - (gnus-summary-save-in-file nil t)) - -(defun gnus-summary-save-body-in-file (&optional filename) - "Append this article body to a file. -Optional argument FILENAME specifies file name. -The directory to save in defaults to `gnus-article-save-directory'." - (setq filename (gnus-read-save-file-name - "Save %s body in file:" filename - gnus-file-save-name gnus-newsgroup-name - gnus-current-headers 'gnus-newsgroup-last-file)) - (gnus-eval-in-buffer-window gnus-save-article-buffer - (save-excursion - (save-restriction - (widen) - (when (article-goto-body) - (narrow-to-region (point) (point-max))) - (gnus-output-to-file filename)))) - filename) - -(defun gnus-summary-save-in-pipe (&optional command) - "Pipe this article to subprocess." - (setq command - (cond ((and (eq command 'default) - gnus-last-shell-command) - gnus-last-shell-command) - ((stringp command) - command) - (t (read-string - (format - "Shell command on %s: " - (if (and gnus-number-of-articles-to-be-saved - (> gnus-number-of-articles-to-be-saved 1)) - (format "these %d articles" - gnus-number-of-articles-to-be-saved) - "this article")) - gnus-last-shell-command)))) - (when (string-equal command "") - (if gnus-last-shell-command - (setq command gnus-last-shell-command) - (error "A command is required"))) - (gnus-eval-in-buffer-window gnus-article-buffer - (save-restriction - (widen) - (shell-command-on-region (point-min) (point-max) command nil))) - (setq gnus-last-shell-command command)) - -;;; Article file names when saving. - -(defun gnus-capitalize-newsgroup (newsgroup) - "Capitalize NEWSGROUP name." - (when (not (zerop (length newsgroup))) - (concat (char-to-string (upcase (aref newsgroup 0))) - (substring newsgroup 1)))) - -(defun gnus-Numeric-save-name (newsgroup headers &optional last-file) - "Generate file name from NEWSGROUP, HEADERS, and optional LAST-FILE. -If variable `gnus-use-long-file-name' is non-nil, it is ~/News/News.group/num. -Otherwise, it is like ~/News/news/group/num." - (let ((default - (expand-file-name - (concat (if (gnus-use-long-file-name 'not-save) - (gnus-capitalize-newsgroup newsgroup) - (gnus-newsgroup-directory-form newsgroup)) - "/" (int-to-string (mail-header-number headers))) - gnus-article-save-directory))) - (if (and last-file - (string-equal (file-name-directory default) - (file-name-directory last-file)) - (string-match "^[0-9]+$" (file-name-nondirectory last-file))) - default - (or last-file default)))) - -(defun gnus-numeric-save-name (newsgroup headers &optional last-file) - "Generate file name from NEWSGROUP, HEADERS, and optional LAST-FILE. -If variable `gnus-use-long-file-name' is non-nil, it is -~/News/news.group/num. Otherwise, it is like ~/News/news/group/num." - (let ((default - (expand-file-name - (concat (if (gnus-use-long-file-name 'not-save) - newsgroup - (gnus-newsgroup-directory-form newsgroup)) - "/" (int-to-string (mail-header-number headers))) - gnus-article-save-directory))) - (if (and last-file - (string-equal (file-name-directory default) - (file-name-directory last-file)) - (string-match "^[0-9]+$" (file-name-nondirectory last-file))) - default - (or last-file default)))) - -(defun gnus-plain-save-name (newsgroup headers &optional last-file) - "Generate file name from NEWSGROUP, HEADERS, and optional LAST-FILE. -If variable `gnus-use-long-file-name' is non-nil, it is -~/News/news.group. Otherwise, it is like ~/News/news/group/news." - (or last-file - (expand-file-name - (if (gnus-use-long-file-name 'not-save) - newsgroup - (file-relative-name - (expand-file-name "news" (gnus-newsgroup-directory-form newsgroup)) - default-directory)) - gnus-article-save-directory))) - -(defun gnus-sender-save-name (newsgroup headers &optional last-file) - "Generate file name from sender." - (let ((from (mail-header-from headers))) - (expand-file-name - (if (and from (string-match "\\([^ <]+\\)@" from)) - (match-string 1 from) - "nobody") - gnus-article-save-directory))) - -(defun article-verify-x-pgp-sig () - "Verify X-PGP-Sig." - (interactive) - (if (gnus-buffer-live-p gnus-original-article-buffer) - (let ((sig (with-current-buffer gnus-original-article-buffer - (gnus-fetch-field "X-PGP-Sig"))) - items info headers) - (when (and sig - mml2015-use - (mml2015-clear-verify-function)) - (with-temp-buffer - (insert-buffer gnus-original-article-buffer) - (setq items (split-string sig)) - (message-narrow-to-head) - (let ((inhibit-point-motion-hooks t) - (case-fold-search t)) - ;; Don't verify multiple headers. - (setq headers (mapconcat (lambda (header) - (concat header ": " - (mail-fetch-field header) "\n")) - (split-string (nth 1 items) ",") ""))) - (delete-region (point-min) (point-max)) - (insert "-----BEGIN PGP SIGNED MESSAGE-----\n\n") - (insert "X-Signed-Headers: " (nth 1 items) "\n") - (insert headers) - (widen) - (forward-line) - (while (not (eobp)) - (if (looking-at "^-") - (insert "- ")) - (forward-line)) - (insert "\n-----BEGIN PGP SIGNATURE-----\n") - (insert "Version: " (car items) "\n\n") - (insert (mapconcat 'identity (cddr items) "\n")) - (insert "\n-----END PGP SIGNATURE-----\n") - (let ((mm-security-handle (list (format "multipart/signed")))) - (mml2015-clean-buffer) - (let ((coding-system-for-write (or gnus-newsgroup-charset - 'iso-8859-1))) - (funcall (mml2015-clear-verify-function))) - (setq info - (or (mm-handle-multipart-ctl-parameter - mm-security-handle 'gnus-details) - (mm-handle-multipart-ctl-parameter - mm-security-handle 'gnus-info))))) - (when info - (let (buffer-read-only bface eface) - (save-restriction - (message-narrow-to-head) - (goto-char (point-max)) - (forward-line -1) - (setq bface (get-text-property (gnus-point-at-bol) 'face) - eface (get-text-property (1- (gnus-point-at-eol)) 'face)) - (message-remove-header "X-Gnus-PGP-Verify") - (if (re-search-forward "^X-PGP-Sig:" nil t) - (forward-line) - (goto-char (point-max))) - (narrow-to-region (point) (point)) - (insert "X-Gnus-PGP-Verify: " info "\n") - (goto-char (point-min)) - (forward-line) - (while (not (eobp)) - (if (not (looking-at "^[ \t]")) - (insert " ")) - (forward-line)) - ;; Do highlighting. - (goto-char (point-min)) - (when (looking-at "\\([^:]+\\): *") - (put-text-property (match-beginning 1) (1+ (match-end 1)) - 'face bface) - (put-text-property (match-end 0) (point-max) - 'face eface))))))))) - -(eval-and-compile - (mapcar - (lambda (func) - (let (afunc gfunc) - (if (consp func) - (setq afunc (car func) - gfunc (cdr func)) - (setq afunc func - gfunc (intern (format "gnus-%s" func)))) - (defalias gfunc - (if (fboundp afunc) - `(lambda (&optional interactive &rest args) - ,(documentation afunc t) - (interactive (list t)) - (save-excursion - (set-buffer gnus-article-buffer) - (if interactive - (call-interactively ',afunc) - (apply ',afunc args)))))))) - '(article-hide-headers - article-verify-x-pgp-sig - article-hide-boring-headers - article-toggle-headers - article-treat-overstrike - article-fill-long-lines - article-capitalize-sentences - article-remove-cr - article-remove-leading-whitespace - article-display-x-face - article-de-quoted-unreadable - article-de-base64-unreadable - article-decode-HZ - article-wash-html - article-hide-list-identifiers - article-hide-pgp - article-strip-banner - article-babel - article-hide-pem - article-hide-signature - article-strip-headers-in-body - article-remove-trailing-blank-lines - article-strip-leading-blank-lines - article-strip-multiple-blank-lines - article-strip-leading-space - article-strip-trailing-space - article-strip-blank-lines - article-strip-all-blank-lines - article-date-local - article-date-english - article-date-iso8601 - article-date-original - article-date-ut - article-decode-mime-words - article-decode-charset - article-decode-encoded-words - article-date-user - article-date-lapsed - article-emphasize - article-treat-dumbquotes - article-normalize-headers - (article-show-all-headers . gnus-article-show-all-headers) - (article-show-all . gnus-article-show-all)))) - -;;; -;;; Gnus article mode -;;; - -(put 'gnus-article-mode 'mode-class 'special) - -(gnus-define-keys gnus-article-mode-map - " " gnus-article-goto-next-page - "\177" gnus-article-goto-prev-page - [delete] gnus-article-goto-prev-page - [backspace] gnus-article-goto-prev-page - "\C-c^" gnus-article-refer-article - "h" gnus-article-show-summary - "s" gnus-article-show-summary - "\C-c\C-m" gnus-article-mail - "?" gnus-article-describe-briefly - "e" gnus-summary-edit-article - "<" beginning-of-buffer - ">" end-of-buffer - "\C-c\C-i" gnus-info-find-node - "\C-c\C-b" gnus-bug - "\C-hk" gnus-article-describe-key - "\C-hc" gnus-article-describe-key-briefly - - "\C-d" gnus-article-read-summary-keys - "\M-*" gnus-article-read-summary-keys - "\M-#" gnus-article-read-summary-keys - "\M-^" gnus-article-read-summary-keys - "\M-g" gnus-article-read-summary-keys) - -;; Define almost undefined keys to `gnus-article-read-summary-keys'. -(let (keys) - (let ((key 32)) - (while (<= key 127) - (push (char-to-string key) keys) - (incf key)) - (dolist (elem (accessible-keymaps gnus-summary-mode-map)) - (setq key (car elem)) - (when (and (> (length key) 0) - (not (eq 'menu-bar (aref key 0))) - (symbolp (lookup-key gnus-summary-mode-map key))) - (push key keys)))) - (dolist (key keys) - (unless (lookup-key gnus-article-mode-map key) - (define-key gnus-article-mode-map key 'gnus-article-read-summary-keys)))) - -(defun gnus-article-make-menu-bar () - (unless (boundp 'gnus-article-commands-menu) - (gnus-summary-make-menu-bar)) - (gnus-turn-off-edit-menu 'article) - (unless (boundp 'gnus-article-article-menu) - (easy-menu-define - gnus-article-article-menu gnus-article-mode-map "" - '("Article" - ["Scroll forwards" gnus-article-goto-next-page t] - ["Scroll backwards" gnus-article-goto-prev-page t] - ["Show summary" gnus-article-show-summary t] - ["Fetch Message-ID at point" gnus-article-refer-article t] - ["Mail to address at point" gnus-article-mail t] - ["Send a bug report" gnus-bug t])) - - (easy-menu-define - gnus-article-treatment-menu gnus-article-mode-map "" - ;; Fixme: this should use :active (and maybe :visible). - '("Treatment" - ["Hide headers" gnus-article-toggle-headers t] - ["Hide signature" gnus-article-hide-signature t] - ["Hide citation" gnus-article-hide-citation t] - ["Treat overstrike" gnus-article-treat-overstrike t] - ["Remove carriage return" gnus-article-remove-cr t] - ["Remove leading whitespace" gnus-article-remove-leading-whitespace t] - ["Decode HZ" gnus-article-decode-HZ t])) - - ;; Note "Commands" menu is defined in gnus-sum.el for consistency - - ;; Note "Post" menu is defined in gnus-sum.el for consistency - - (gnus-run-hooks 'gnus-article-menu-hook))) - -;; Fixme: do something for the Emacs tool bar in Article mode a la -;; Summary. - -(defun gnus-article-mode () - "Major mode for displaying an article. - -All normal editing commands are switched off. - -The following commands are available in addition to all summary mode -commands: -\\ -\\[gnus-article-next-page]\t Scroll the article one page forwards -\\[gnus-article-prev-page]\t Scroll the article one page backwards -\\[gnus-article-refer-article]\t Go to the article referred to by an article id near point -\\[gnus-article-show-summary]\t Display the summary buffer -\\[gnus-article-mail]\t Send a reply to the address near point -\\[gnus-article-describe-briefly]\t Describe the current mode briefly -\\[gnus-info-find-node]\t Go to the Gnus info node" - (interactive) - (gnus-simplify-mode-line) - (setq mode-name "Article") - (setq major-mode 'gnus-article-mode) - (make-local-variable 'minor-mode-alist) - (unless (assq 'gnus-show-mime minor-mode-alist) - (push (list 'gnus-show-mime " MIME") minor-mode-alist)) - (use-local-map gnus-article-mode-map) - (when (gnus-visual-p 'article-menu 'menu) - (gnus-article-make-menu-bar)) - (gnus-update-format-specifications nil 'article-mode) - (set (make-local-variable 'page-delimiter) gnus-page-delimiter) - (make-local-variable 'gnus-page-broken) - (make-local-variable 'gnus-button-marker-list) - (make-local-variable 'gnus-article-current-summary) - (make-local-variable 'gnus-article-mime-handles) - (make-local-variable 'gnus-article-decoded-p) - (make-local-variable 'gnus-article-mime-handle-alist) - (make-local-variable 'gnus-article-wash-types) - (make-local-variable 'gnus-article-charset) - (make-local-variable 'gnus-article-ignored-charsets) - (gnus-set-default-directory) - (buffer-disable-undo) - (setq buffer-read-only t) - (set-syntax-table gnus-article-mode-syntax-table) - (gnus-run-hooks 'gnus-article-mode-hook)) - -(defun gnus-article-setup-buffer () - "Initialize the article buffer." - (let* ((name (if gnus-single-article-buffer "*Article*" - (concat "*Article " gnus-newsgroup-name "*"))) - (original - (progn (string-match "\\*Article" name) - (concat " *Original Article" - (substring name (match-end 0)))))) - (setq gnus-article-buffer name) - (setq gnus-original-article-buffer original) - (setq gnus-article-mime-handle-alist nil) - ;; This might be a variable local to the summary buffer. - (unless gnus-single-article-buffer - (save-excursion - (set-buffer gnus-summary-buffer) - (setq gnus-article-buffer name) - (setq gnus-original-article-buffer original) - (gnus-set-global-variables))) - (gnus-article-setup-highlight-words) - ;; Init original article buffer. - (save-excursion - (set-buffer (gnus-get-buffer-create gnus-original-article-buffer)) - (set-buffer-multibyte nil) - (setq major-mode 'gnus-original-article-mode) - (make-local-variable 'gnus-original-article)) - (if (get-buffer name) - (save-excursion - (set-buffer name) - (buffer-disable-undo) - (setq buffer-read-only t) - (unless (eq major-mode 'gnus-article-mode) - (gnus-article-mode)) - (current-buffer)) - (save-excursion - (set-buffer (gnus-get-buffer-create name)) - (gnus-article-mode) - (make-local-variable 'gnus-summary-buffer) - (gnus-summary-set-local-parameters gnus-newsgroup-name) - (current-buffer))))) - -;; Set article window start at LINE, where LINE is the number of lines -;; from the head of the article. -(defun gnus-article-set-window-start (&optional line) - (set-window-start - (get-buffer-window gnus-article-buffer t) - (save-excursion - (set-buffer gnus-article-buffer) - (goto-char (point-min)) - (if (not line) - (point-min) - (gnus-message 6 "Moved to bookmark") - (search-forward "\n\n" nil t) - (forward-line line) - (point))))) - -;;; @@ article filters -;;; - -(defun gnus-article-display-mime-message () - "Article display method for MIME message." - ;; called from `gnus-original-article-buffer'. - (let (charset all-headers) - (with-current-buffer gnus-summary-buffer - (setq charset default-mime-charset - all-headers gnus-have-all-headers)) - (make-local-variable 'default-mime-charset) - (setq default-mime-charset charset) - (with-current-buffer (get-buffer-create gnus-article-buffer) - (make-local-variable 'default-mime-charset) - (setq default-mime-charset charset)) - (mime-display-message mime-message-structure - gnus-article-buffer nil gnus-article-mode-map) - (when all-headers - (gnus-article-hide-headers nil -1))) - (run-hooks 'gnus-mime-article-prepare-hook)) - -(defun gnus-article-display-traditional-message () - "Article display method for traditional message." - (set-buffer gnus-article-buffer) - (let (buffer-read-only) - (erase-buffer) - (insert-buffer-substring gnus-original-article-buffer))) - -(defun gnus-article-make-full-mail-header (&optional number charset) - "Create a new mail header structure in a raw article buffer." - (unless (and number charset) - (save-current-buffer - (set-buffer gnus-summary-buffer) - (unless number - (setq number (or (cdr gnus-article-current) 0))) - (unless charset - (setq charset (or default-mime-charset 'x-ctext))))) - (goto-char (point-min)) - (let ((header-end (if (search-forward "\n\n" nil t) - (1- (point)) - (goto-char (point-max)))) - (chars (- (point-max) (point))) - (lines (count-lines (point) (point-max))) - (default-mime-charset charset) - xref) - (narrow-to-region (point-min) header-end) - (setq xref (std11-fetch-field "xref")) - (prog1 - (make-full-mail-header - number - (std11-fetch-field "subject") - (std11-fetch-field "from") - (std11-fetch-field "date") - (std11-fetch-field "message-id") - (std11-fetch-field "references") - chars - lines - (when xref (concat "Xref: " xref))) - (widen)))) - -(defun gnus-article-prepare (article &optional all-headers header) - "Prepare ARTICLE in article mode buffer. -ARTICLE should either be an article number or a Message-ID. -If ARTICLE is an id, HEADER should be the article headers. -If ALL-HEADERS is non-nil, no headers are hidden." - (save-excursion - ;; Make sure we start in a summary buffer. - (unless (eq major-mode 'gnus-summary-mode) - (set-buffer gnus-summary-buffer)) - (setq gnus-summary-buffer (current-buffer)) - (let* ((gnus-article (if header (mail-header-number header) article)) - (summary-buffer (current-buffer)) - (gnus-tmp-internal-hook gnus-article-internal-prepare-hook) - (group gnus-newsgroup-name) - result) - (save-excursion - (gnus-article-setup-buffer) - (set-buffer gnus-article-buffer) - ;; Deactivate active regions. - (when (and (boundp 'transient-mark-mode) - transient-mark-mode) - (setq mark-active nil)) - (if (not (setq result (let ((buffer-read-only nil)) - (gnus-request-article-this-buffer - article group)))) - ;; There is no such article. - (save-excursion - (when (and (numberp article) - (not (memq article gnus-newsgroup-sparse))) - (setq gnus-article-current - (cons gnus-newsgroup-name article)) - (set-buffer gnus-summary-buffer) - (setq gnus-current-article article) - (if (eq (gnus-article-mark article) gnus-undownloaded-mark) - (progn - (gnus-summary-set-agent-mark article) - (message "Message marked for downloading")) - (gnus-summary-mark-article article gnus-canceled-mark) - (unless (memq article gnus-newsgroup-sparse) - (gnus-error 1 "No such article (may have expired or been canceled)"))))) - (if (or (eq result 'pseudo) - (eq result 'nneething)) - (progn - (save-excursion - (set-buffer summary-buffer) - (push article gnus-newsgroup-history) - (setq gnus-last-article gnus-current-article - gnus-current-article 0 - gnus-current-headers nil - gnus-article-current nil) - (if (eq result 'nneething) - (gnus-configure-windows 'summary) - (gnus-configure-windows 'article)) - (gnus-set-global-variables)) - (let ((gnus-article-mime-handle-alist-1 - gnus-article-mime-handle-alist)) - (gnus-set-mode-line 'article))) - ;; The result from the `request' was an actual article - - ;; or at least some text that is now displayed in the - ;; article buffer. - (when (and (numberp article) - (not (eq article gnus-current-article))) - ;; Seems like a new article has been selected. - ;; `gnus-current-article' must be an article number. - (save-excursion - (set-buffer summary-buffer) - (push article gnus-newsgroup-history) - (setq gnus-last-article gnus-current-article - gnus-current-article article - gnus-current-headers - (gnus-summary-article-header gnus-current-article) - gnus-article-current - (cons gnus-newsgroup-name gnus-current-article)) - (unless (vectorp gnus-current-headers) - (setq gnus-current-headers nil)) - (gnus-summary-goto-subject gnus-current-article) - (when (gnus-summary-show-thread) - ;; If the summary buffer really was folded, the - ;; previous goto may not actually have gone to - ;; the right article, but the thread root instead. - ;; So we go again. - (gnus-summary-goto-subject gnus-current-article)) - (gnus-run-hooks 'gnus-mark-article-hook) - (gnus-set-mode-line 'summary) - (when (gnus-visual-p 'article-highlight 'highlight) - (gnus-run-hooks 'gnus-visual-mark-article-hook)) - ;; Set the global newsgroup variables here. - (gnus-set-global-variables) - (setq gnus-have-all-headers - (or all-headers gnus-show-all-headers)))) - (save-excursion - (gnus-configure-windows 'article)) - (when (or (numberp article) - (stringp article)) - (gnus-article-prepare-display) - ;; Do page break. - (goto-char (point-min)) - (setq gnus-page-broken - (when gnus-break-pages - (gnus-narrow-to-page) - t))) - (let ((gnus-article-mime-handle-alist-1 - gnus-article-mime-handle-alist)) - (gnus-set-mode-line 'article)) - (article-goto-body) - (set-window-point (get-buffer-window (current-buffer)) (point)) - (gnus-configure-windows 'article) - t)))))) - -(defun gnus-article-prepare-mime-display (&optional number) - (goto-char (point-min)) - (when (re-search-forward "^[^\t ]+:" nil t) - (goto-char (match-beginning 0))) - (let ((entity (if (eq 1 (point-min)) - (get-text-property 1 'mime-view-entity) - (get-text-property (point) 'mime-view-entity))) - last-entity child-entity next type) - (setq child-entity (mime-entity-children entity)) - (if child-entity - (setq last-entity (nth (1- (length child-entity)) - child-entity)) - (setq last-entity entity)) - (save-restriction - (narrow-to-region (point) - (if (search-forward "\n\n" nil t) - (point) - (point-max))) - (gnus-treat-article 'head) - (put-text-property (point-min) (point-max) 'article-treated-header t) - (goto-char (point-max))) - (while (and (not (eobp)) entity) - (setq next (set-marker - (make-marker) - (next-single-property-change (point) 'mime-view-entity - nil (point-max)))) - (let ((types (mime-entity-content-type entity))) - (while (eq 'multipart (mime-content-type-primary-type types)) - (setq entity (car (mime-entity-children entity)) - types (mime-entity-content-type entity))) - (when types - (setq type (format "%s/%s" - (mime-content-type-primary-type types) - (mime-content-type-subtype types))))) - (if (string-equal type "message/rfc822") - (progn - (setq next (point)) - (let ((children (mime-entity-children entity)) - last-children) - (when children - (setq last-children (nth (1- (length children)) children)) - (while - (and - (not (eq last-children - (get-text-property next 'mime-view-entity))) - (setq next - (next-single-property-change next - 'mime-view-entity - nil (point-max))))))) - (setq next (next-single-property-change next 'mime-view-entity - nil (point-max))) - (save-restriction - (narrow-to-region (point) next) - (gnus-article-prepare-mime-display) - (goto-char (point-max))) - (setq entity (get-text-property (point) 'mime-view-entity))) - (save-restriction - (narrow-to-region (point) next) - ;; Kludge. We have to count true number, but for now, - ;; part number is here only to achieve `last'. - (gnus-treat-article nil 1 - (if (eq entity last-entity) - 1 2) - type) - (goto-char (point-max))) - (setq entity (get-text-property next 'mime-view-entity)))))) - -;;;###autoload -(defun gnus-article-prepare-display () - "Make the current buffer look like a nice article." - (let ((gnus-article-buffer (current-buffer)) - buffer-read-only) - (unless (eq major-mode 'gnus-article-mode) - (gnus-article-mode)) - (setq buffer-read-only nil - gnus-button-marker-list nil - gnus-article-wash-types nil) - (save-restriction - (widen) - (static-if (featurep 'xemacs) - (map-extents (lambda (extent maparg) (delete-extent extent))) - (let ((lists (overlay-lists))) - (dolist (overlay (nconc (car lists) (cdr lists))) - (delete-overlay overlay))))) - (gnus-run-hooks 'gnus-tmp-internal-hook)) - (set-buffer gnus-original-article-buffer) - ;; Display message. - (setq mime-message-structure gnus-current-headers) - (mime-buffer-entity-set-buffer-internal mime-message-structure - gnus-original-article-buffer) - (mime-entity-set-representation-type-internal mime-message-structure - 'mime-buffer-entity) - (luna-send mime-message-structure 'initialize-instance - mime-message-structure) - (if gnus-show-mime - (let (mime-display-header-hook mime-display-text/plain-hook) - (funcall gnus-article-display-method-for-mime)) - (funcall gnus-article-display-method-for-traditional)) - ;; Call the treatment functions. - (let ((inhibit-read-only t)) - (save-restriction - (widen) - (if gnus-show-mime - (gnus-article-prepare-mime-display) - (narrow-to-region (goto-char (point-min)) - (if (search-forward "\n\n" nil t) - (point) - (point-max))) - (gnus-treat-article 'head) - (put-text-property (point-min) (point-max) 'article-treated-header t) - (goto-char (point-max)) - (widen) - (narrow-to-region (point) (point-max)) - (gnus-treat-article nil)) - (put-text-property (point-min) (point-max) 'read-only nil))) - (gnus-run-hooks 'gnus-article-prepare-hook)) - -(defun gnus-article-decode-article-as-default-mime-charset () - "Decode an article as `default-mime-charset'. It won't work if the -value of the variable `gnus-show-mime' is non-nil." - (unless gnus-show-mime - (set (make-local-variable 'default-mime-charset) - (with-current-buffer gnus-summary-buffer - default-mime-charset)) - (decode-mime-charset-region (point-min) (point-max) - default-mime-charset))) - -;;; -;;; Gnus MIME viewing functions -;;; - -(defvar gnus-mime-button-line-format "%{%([%p. %d%T]%)%}%e\n" - "The following specs can be used: -%t The MIME type -%T MIME type, along with additional info -%n The `name' parameter -%d The description, if any -%l The length of the encoded part -%p The part identifier number -%e Dots if the part isn't displayed") - -(defvar gnus-mime-button-line-format-alist - '((?t gnus-tmp-type ?s) - (?T gnus-tmp-type-long ?s) - (?n gnus-tmp-name ?s) - (?d gnus-tmp-description ?s) - (?p gnus-tmp-id ?s) - (?l gnus-tmp-length ?d) - (?e gnus-tmp-dots ?s))) - -(defvar gnus-mime-button-commands - '((gnus-article-press-button "\r" "Toggle Display") - (gnus-mime-view-part "v" "View Interactively...") - (gnus-mime-view-part-as-type "t" "View As Type...") - (gnus-mime-view-part-as-charset "C" "View As charset...") - (gnus-mime-save-part "o" "Save...") - (gnus-mime-save-part-and-strip "\C-o" "Save and Strip") - (gnus-mime-copy-part "c" "View As Text, In Other Buffer") - (gnus-mime-inline-part "i" "View As Text, In This Buffer") - (gnus-mime-internalize-part "E" "View Internally") - (gnus-mime-externalize-part "e" "View Externally") - (gnus-mime-pipe-part "|" "Pipe To Command...") - (gnus-mime-action-on-part "." "Take action on the part"))) - -(defun gnus-article-mime-part-status () - (with-current-buffer gnus-article-buffer - (let ((entity (get-text-property (point-min) 'mime-view-entity)) - children) - (if (and entity - (setq children (mime-entity-children entity)) - (setq children (length children))) - (if (eq 1 children) - " (1 part)" - (format " (%d parts)" children)) - "")))) - -(defvar gnus-mime-button-map - (let ((map (make-sparse-keymap))) - (unless (>= (string-to-number emacs-version) 21) - ;; XEmacs doesn't care. - (set-keymap-parent map gnus-article-mode-map)) - (define-key map gnus-mouse-2 'gnus-article-push-button) - (define-key map gnus-down-mouse-3 'gnus-mime-button-menu) - (dolist (c gnus-mime-button-commands) - (define-key map (cadr c) (car c))) - map)) - -(defun gnus-mime-button-menu (event) - "Construct a context-sensitive menu of MIME commands." - (interactive "e") - (save-window-excursion - (let ((pos (event-start event))) - (select-window (posn-window pos)) - (goto-char (posn-point pos)) - (gnus-article-check-buffer) - (let ((response (x-popup-menu - t `("MIME Part" - ("" ,@(mapcar (lambda (c) - (cons (caddr c) (car c))) - gnus-mime-button-commands)))))) - (if response - (call-interactively response)))))) - -(defun gnus-mime-view-all-parts (&optional handles) - "View all the MIME parts." - (interactive) - (save-current-buffer - (set-buffer gnus-article-buffer) - (let ((handles (or handles gnus-article-mime-handles)) - (mail-parse-charset gnus-newsgroup-charset) - (mail-parse-ignored-charsets - (with-current-buffer gnus-summary-buffer - gnus-newsgroup-ignored-charsets))) - (when handles - (mm-remove-parts handles) - (goto-char (point-min)) - (or (search-forward "\n\n") (goto-char (point-max))) - (let (buffer-read-only) - (delete-region (point) (point-max)) - (mm-display-parts handles)))))) - -(defun gnus-mime-save-part-and-strip () - "Save the MIME part under point then replace it with an external body." - (interactive) - (gnus-article-check-buffer) - (let* ((data (get-text-property (point) 'gnus-data)) - file param - (handles gnus-article-mime-handles)) - (if (mm-multiple-handles gnus-article-mime-handles) - (error "This function is not implemented")) - (setq file (and data (mm-save-part data))) - (when file - (with-current-buffer (mm-handle-buffer data) - (erase-buffer) - (insert "Content-Type: " (mm-handle-media-type data)) - (mml-insert-parameter-string (cdr (mm-handle-type data)) - '(charset)) - (insert "\n") - (insert "Content-ID: " (message-make-message-id) "\n") - (insert "Content-Transfer-Encoding: binary\n") - (insert "\n")) - (setcdr data - (cdr (mm-make-handle nil - `("message/external-body" - (access-type . "LOCAL-FILE") - (name . ,file))))) - (set-buffer gnus-summary-buffer) - (gnus-article-edit-article - `(lambda () - (erase-buffer) - (let ((mail-parse-charset (or gnus-article-charset - ',gnus-newsgroup-charset)) - (mail-parse-ignored-charsets - (or gnus-article-ignored-charsets - ',gnus-newsgroup-ignored-charsets)) - (mbl mml-buffer-list)) - (setq mml-buffer-list nil) - (insert-buffer gnus-original-article-buffer) - (mime-to-mml ',handles) - (setq gnus-article-mime-handles nil) - (let ((mbl1 mml-buffer-list)) - (setq mml-buffer-list mbl) - (set (make-local-variable 'mml-buffer-list) mbl1)) - ;; LOCAL argument of add-hook differs between GNU Emacs - ;; and XEmacs. make-local-hook makes sure they are local. - (make-local-hook 'kill-buffer-hook) - (add-hook 'kill-buffer-hook 'mml-destroy-buffers t t))) - `(lambda (no-highlight) - (let ((mail-parse-charset (or gnus-article-charset - ',gnus-newsgroup-charset)) - (message-options message-options) - (message-options-set-recipient) - (mail-parse-ignored-charsets - (or gnus-article-ignored-charsets - ',gnus-newsgroup-ignored-charsets))) - (mml-to-mime) - (mml-destroy-buffers) - (remove-hook 'kill-buffer-hook - 'mml-destroy-buffers t) - (kill-local-variable 'mml-buffer-list)) - (gnus-summary-edit-article-done - ,(or (mail-header-references gnus-current-headers) "") - ,(gnus-group-read-only-p) - ,gnus-summary-buffer no-highlight)))))) - -(defun gnus-mime-save-part () - "Save the MIME part under point." - (interactive) - (gnus-article-check-buffer) - (let ((data (get-text-property (point) 'gnus-data))) - (when data - (mm-save-part data)))) - -(defun gnus-mime-pipe-part () - "Pipe the MIME part under point to a process." - (interactive) - (gnus-article-check-buffer) - (let ((data (get-text-property (point) 'gnus-data))) - (when data - (mm-pipe-part data)))) - -(defun gnus-mime-view-part () - "Interactively choose a viewing method for the MIME part under point." - (interactive) - (gnus-article-check-buffer) - (let ((data (get-text-property (point) 'gnus-data))) - (when data - (setq gnus-article-mime-handles - (mm-merge-handles - gnus-article-mime-handles (setq data (copy-sequence data)))) - (mm-interactively-view-part data)))) - -(defun gnus-mime-view-part-as-type-internal () - (gnus-article-check-buffer) - (let* ((name (mail-content-type-get - (mm-handle-type (get-text-property (point) 'gnus-data)) - 'name)) - (def-type (and name (mm-default-file-encoding name)))) - (and def-type (cons def-type 0)))) - -(defun gnus-mime-view-part-as-type (&optional mime-type) - "Choose a MIME media type, and view the part as such." - (interactive) - (unless mime-type - (setq mime-type (completing-read - "View as MIME type: " - (mapcar #'list (mailcap-mime-types)) - nil nil - (gnus-mime-view-part-as-type-internal)))) - (gnus-article-check-buffer) - (let ((handle (get-text-property (point) 'gnus-data))) - (when handle - (setq handle - (mm-make-handle (mm-handle-buffer handle) - (cons mime-type (cdr (mm-handle-type handle))) - (mm-handle-encoding handle) - (mm-handle-undisplayer handle) - (mm-handle-disposition handle) - (mm-handle-description handle) - nil - (mm-handle-id handle))) - (setq gnus-article-mime-handles - (mm-merge-handles gnus-article-mime-handles handle)) - (gnus-mm-display-part handle)))) - -(defun gnus-mime-copy-part (&optional handle) - "Put the the MIME part under point into a new buffer." - (interactive) - (gnus-article-check-buffer) - (let* ((handle (or handle (get-text-property (point) 'gnus-data))) - (contents (and handle (mm-get-part handle))) - (base (and handle - (file-name-nondirectory - (or - (mail-content-type-get (mm-handle-type handle) 'name) - (mail-content-type-get (mm-handle-type handle) - 'filename) - "*decoded*")))) - (buffer (and base (generate-new-buffer base)))) - (when contents - (switch-to-buffer buffer) - (insert contents) - ;; We do it this way to make `normal-mode' set the appropriate mode. - (unwind-protect - (progn - (setq buffer-file-name (expand-file-name base)) - (normal-mode)) - (setq buffer-file-name nil)) - (goto-char (point-min))))) - -(defun gnus-mime-inline-part (&optional handle arg) - "Insert the MIME part under point into the current buffer." - (interactive (list nil current-prefix-arg)) - (gnus-article-check-buffer) - (let* ((handle (or handle (get-text-property (point) 'gnus-data))) - contents charset - (b (point)) - buffer-read-only) - (when handle - (if (and (not arg) (mm-handle-undisplayer handle)) - (mm-remove-part handle) - (setq contents (mm-get-part handle)) - (cond - ((not arg) - (setq charset (or (mail-content-type-get - (mm-handle-type handle) 'charset) - gnus-newsgroup-charset))) - ((numberp arg) - (if (mm-handle-undisplayer handle) - (mm-remove-part handle)) - (setq charset - (or (cdr (assq arg - gnus-summary-show-article-charset-alist)) - (mm-read-coding-system "Charset: "))))) - (forward-line 2) - (mm-insert-inline handle - (if (and charset - (setq charset (mm-charset-to-coding-system - charset)) - (not (eq charset 'ascii))) - (mm-decode-coding-string contents charset) - contents)) - (goto-char b))))) - -(defun gnus-mime-view-part-as-charset (&optional handle arg) - "Insert the MIME part under point into the current buffer using the -specified charset." - (interactive (list nil current-prefix-arg)) - (gnus-article-check-buffer) - (let* ((handle (or handle (get-text-property (point) 'gnus-data))) - contents charset - (b (point)) - buffer-read-only) - (when handle - (if (mm-handle-undisplayer handle) - (mm-remove-part handle)) - (let ((gnus-newsgroup-charset - (or (cdr (assq arg - gnus-summary-show-article-charset-alist)) - (mm-read-coding-system "Charset: "))) - (gnus-newsgroup-ignored-charsets 'gnus-all)) - (gnus-article-press-button))))) - -(defun gnus-mime-externalize-part (&optional handle) - "View the MIME part under point with an external viewer." - (interactive) - (gnus-article-check-buffer) - (let* ((handle (or handle (get-text-property (point) 'gnus-data))) - (mm-user-display-methods nil) - (mm-inlined-types nil) - (mail-parse-charset gnus-newsgroup-charset) - (mail-parse-ignored-charsets - (save-excursion (set-buffer gnus-summary-buffer) - gnus-newsgroup-ignored-charsets))) - (when handle - (if (mm-handle-undisplayer handle) - (mm-remove-part handle) - (mm-display-part handle))))) - -(defun gnus-mime-internalize-part (&optional handle) - "View the MIME part under point with an internal viewer. -If no internal viewer is available, use an external viewer." - (interactive) - (gnus-article-check-buffer) - (let* ((handle (or handle (get-text-property (point) 'gnus-data))) - (mm-inlined-types '(".*")) - (mm-inline-large-images t) - (mail-parse-charset gnus-newsgroup-charset) - (mail-parse-ignored-charsets - (save-excursion (set-buffer gnus-summary-buffer) - gnus-newsgroup-ignored-charsets))) - (when handle - (if (mm-handle-undisplayer handle) - (mm-remove-part handle) - (mm-display-part handle))))) - -(defun gnus-mime-action-on-part (&optional action) - "Do something with the MIME attachment at \(point\)." - (interactive - (list (completing-read "Action: " gnus-mime-action-alist))) - (gnus-article-check-buffer) - (let ((action-pair (assoc action gnus-mime-action-alist))) - (if action-pair - (funcall (cdr action-pair))))) - -(defun gnus-article-part-wrapper (n function) - (save-current-buffer - (set-buffer gnus-article-buffer) - (when (> n (length gnus-article-mime-handle-alist)) - (error "No such part")) - (gnus-article-goto-part n) - (let ((handle (cdr (assq n gnus-article-mime-handle-alist)))) - (funcall function handle)))) - -(defun gnus-article-pipe-part (n) - "Pipe MIME part N, which is the numerical prefix." - (interactive "p") - (gnus-article-part-wrapper n 'mm-pipe-part)) - -(defun gnus-article-save-part (n) - "Save MIME part N, which is the numerical prefix." - (interactive "p") - (gnus-article-part-wrapper n 'mm-save-part)) - -(defun gnus-article-interactively-view-part (n) - "View MIME part N interactively, which is the numerical prefix." - (interactive "p") - (gnus-article-part-wrapper n 'mm-interactively-view-part)) - -(defun gnus-article-copy-part (n) - "Copy MIME part N, which is the numerical prefix." - (interactive "p") - (gnus-article-part-wrapper n 'gnus-mime-copy-part)) - -(defun gnus-article-view-part-as-charset (n) - "Copy MIME part N, which is the numerical prefix." - (interactive "p") - (gnus-article-part-wrapper n 'gnus-mime-view-part-as-charset)) - -(defun gnus-article-externalize-part (n) - "View MIME part N externally, which is the numerical prefix." - (interactive "p") - (gnus-article-part-wrapper n 'gnus-mime-externalize-part)) - -(defun gnus-article-inline-part (n) - "Inline MIME part N, which is the numerical prefix." - (interactive "p") - (gnus-article-part-wrapper n 'gnus-mime-inline-part)) - -(defun gnus-article-mime-match-handle-first (condition) - (if condition - (let ((alist gnus-article-mime-handle-alist) ihandle n) - (while (setq ihandle (pop alist)) - (if (and (cond - ((functionp condition) - (funcall condition (cdr ihandle))) - ((eq condition 'undisplayed) - (not (or (mm-handle-undisplayer (cdr ihandle)) - (equal (mm-handle-media-type (cdr ihandle)) - "multipart/alternative")))) - ((eq condition 'undisplayed-alternative) - (not (mm-handle-undisplayer (cdr ihandle)))) - (t t)) - (gnus-article-goto-part (car ihandle)) - (or (not n) (< (car ihandle) n))) - (setq n (car ihandle)))) - (or n 1)) - 1)) - -(defun gnus-article-view-part (&optional n) - "View MIME part N, which is the numerical prefix." - (interactive "P") - (save-current-buffer - (set-buffer gnus-article-buffer) - (or (numberp n) (setq n (gnus-article-mime-match-handle-first - gnus-article-mime-match-handle-function))) - (when (> n (length gnus-article-mime-handle-alist)) - (error "No such part")) - (let ((handle (cdr (assq n gnus-article-mime-handle-alist)))) - (when (gnus-article-goto-part n) - (if (equal (car handle) "multipart/alternative") - (gnus-article-press-button) - (when (eq (gnus-mm-display-part handle) 'internal) - (gnus-set-window-start))))))) - -(defsubst gnus-article-mime-total-parts () - (if (bufferp (car gnus-article-mime-handles)) - 1 ;; single part - (1- (length gnus-article-mime-handles)))) - -(defun gnus-mm-display-part (handle) - "Display HANDLE and fix MIME button." - (let ((id (get-text-property (point) 'gnus-part)) - (point (point)) - buffer-read-only) - (forward-line 1) - (prog1 - (let ((window (selected-window)) - (mail-parse-charset gnus-newsgroup-charset) - (mail-parse-ignored-charsets - (save-excursion (set-buffer gnus-summary-buffer) - gnus-newsgroup-ignored-charsets))) - (save-excursion - (unwind-protect - (let ((win (get-buffer-window (current-buffer) t)) - (beg (point))) - (when win - (select-window win)) - (goto-char point) - (forward-line) - (if (mm-handle-displayed-p handle) - ;; This will remove the part. - (mm-display-part handle) - (save-restriction - (narrow-to-region (point) - (if (eobp) (point) (1+ (point)))) - (mm-display-part handle) - ;; We narrow to the part itself and - ;; then call the treatment functions. - (goto-char (point-min)) - (forward-line 1) - (narrow-to-region (point) (point-max)) - (gnus-treat-article - nil id - (gnus-article-mime-total-parts) - (mm-handle-media-type handle))))) - (if (window-live-p window) - (select-window window))))) - (goto-char point) - (delete-region (gnus-point-at-bol) (progn (forward-line 1) (point))) - (gnus-insert-mime-button - handle id (list (mm-handle-displayed-p handle))) - (goto-char point)))) - -(defun gnus-article-goto-part (n) - "Go to MIME part N." - (let ((point (text-property-any (point-min) (point-max) 'gnus-part n))) - (when point - (goto-char point)))) - -(defun gnus-insert-mime-button (handle gnus-tmp-id &optional displayed) - (let ((gnus-tmp-name - (or (mail-content-type-get (mm-handle-type handle) 'name) - (mail-content-type-get (mm-handle-disposition handle) 'filename) - (mail-content-type-get (mm-handle-type handle) 'url) - "")) - (gnus-tmp-type (mm-handle-media-type handle)) - (gnus-tmp-description - (mail-decode-encoded-word-string (or (mm-handle-description handle) - ""))) - (gnus-tmp-dots - (if (if displayed (car displayed) - (mm-handle-displayed-p handle)) - "" "...")) - (gnus-tmp-length (with-current-buffer (mm-handle-buffer handle) - (buffer-size))) - gnus-tmp-type-long b e) - (when (string-match ".*/" gnus-tmp-name) - (setq gnus-tmp-name (replace-match "" t t gnus-tmp-name))) - (setq gnus-tmp-type-long (concat gnus-tmp-type - (and (not (equal gnus-tmp-name "")) - (concat "; " gnus-tmp-name)))) - (unless (equal gnus-tmp-description "") - (setq gnus-tmp-type-long (concat " --- " gnus-tmp-type-long))) - (unless (bolp) - (insert "\n")) - (setq b (point)) - (gnus-eval-format - gnus-mime-button-line-format gnus-mime-button-line-format-alist - `(keymap ,gnus-mime-button-map - ,@(if (>= (string-to-number emacs-version) 21) - nil - (list 'local-map gnus-mime-button-map)) - gnus-callback gnus-mm-display-part - gnus-part ,gnus-tmp-id - article-type annotation - gnus-data ,handle)) - (setq e (point)) - (widget-convert-button - 'link b e - :mime-handle handle - :action 'gnus-widget-press-button - :button-keymap gnus-mime-button-map - :help-echo - (lambda (widget/window &optional overlay pos) - ;; Needed to properly clear the message due to a bug in - ;; wid-edit (XEmacs only). - (if (boundp 'help-echo-owns-message) - (setq help-echo-owns-message t)) - (format - "%S: %s the MIME part; %S: more options" - (aref gnus-mouse-2 0) - ;; XEmacs will get a single widget arg; Emacs 21 will get - ;; window, overlay, position. - (if (mm-handle-displayed-p - (if overlay - (with-current-buffer (gnus-overlay-buffer overlay) - (widget-get (widget-at (gnus-overlay-start overlay)) - :mime-handle)) - (widget-get widget/window :mime-handle))) - "hide" "show") - (aref gnus-down-mouse-3 0)))))) - -(defun gnus-widget-press-button (elems el) - (goto-char (widget-get elems :from)) - (gnus-article-press-button)) - -(defvar gnus-displaying-mime nil) - -(defun gnus-display-mime (&optional ihandles) - "Display the MIME parts." - (save-excursion - (save-selected-window - (let ((window (get-buffer-window gnus-article-buffer)) - (point (point))) - (when window - (select-window window) - ;; We have to do this since selecting the window - ;; may change the point. So we set the window point. - (set-window-point window point))) - (let* ((handles (or ihandles (mm-dissect-buffer) (mm-uu-dissect))) - buffer-read-only handle name type b e display) - (when (and (not ihandles) - (not gnus-displaying-mime)) - ;; Top-level call; we clean up. - (when gnus-article-mime-handles - (mm-destroy-parts gnus-article-mime-handles) - (setq gnus-article-mime-handle-alist nil));; A trick. - (setq gnus-article-mime-handles handles) - ;; We allow users to glean info from the handles. - (when gnus-article-mime-part-function - (gnus-mime-part-function handles))) - (if (and handles - (or (not (stringp (car handles))) - (cdr handles))) - (progn - (when (and (not ihandles) - (not gnus-displaying-mime)) - ;; Clean up for mime parts. - (article-goto-body) - (delete-region (point) (point-max))) - (let ((gnus-displaying-mime t)) - (gnus-mime-display-part handles))) - (save-restriction - (article-goto-body) - (narrow-to-region (point) (point-max)) - (gnus-treat-article nil 1 1) - (widen))) - (unless ihandles - ;; Highlight the headers. - (save-excursion - (save-restriction - (article-goto-body) - (narrow-to-region (point-min) (point)) - (gnus-treat-article 'head)))))))) - -(defvar gnus-mime-display-multipart-as-mixed nil) -(defvar gnus-mime-display-multipart-alternative-as-mixed nil) -(defvar gnus-mime-display-multipart-related-as-mixed nil) - -(defun gnus-mime-display-part (handle) - (cond - ;; Single part. - ((not (stringp (car handle))) - (gnus-mime-display-single handle)) - ;; User-defined multipart - ((cdr (assoc (car handle) gnus-mime-multipart-functions)) - (funcall (cdr (assoc (car handle) gnus-mime-multipart-functions)) - handle)) - ;; multipart/alternative - ((and (equal (car handle) "multipart/alternative") - (not (or gnus-mime-display-multipart-as-mixed - gnus-mime-display-multipart-alternative-as-mixed))) - (let ((id (1+ (length gnus-article-mime-handle-alist)))) - (push (cons id handle) gnus-article-mime-handle-alist) - (gnus-mime-display-alternative (cdr handle) nil nil id))) - ;; multipart/related - ((and (equal (car handle) "multipart/related") - (not (or gnus-mime-display-multipart-as-mixed - gnus-mime-display-multipart-related-as-mixed))) - ;;;!!!We should find the start part, but we just default - ;;;!!!to the first part. - ;;(gnus-mime-display-part (cadr handle)) - ;;;!!! Most multipart/related is an HTML message plus images. - ;;;!!! Unfortunately we are unable to let W3 display those - ;;;!!! included images, so we just display it as a mixed multipart. - ;;(gnus-mime-display-mixed (cdr handle)) - ;;;!!! No, w3 can display everything just fine. - (gnus-mime-display-part (cadr handle))) - ((equal (car handle) "multipart/signed") - (or (memq 'signed gnus-article-wash-types) - (push 'signed gnus-article-wash-types)) - (gnus-mime-display-security handle)) - ((equal (car handle) "multipart/encrypted") - (or (memq 'encrypted gnus-article-wash-types) - (push 'encrypted gnus-article-wash-types)) - (gnus-mime-display-security handle)) - ;; Other multiparts are handled like multipart/mixed. - (t - (gnus-mime-display-mixed (cdr handle))))) - -(defun gnus-mime-part-function (handles) - (if (stringp (car handles)) - (mapcar 'gnus-mime-part-function (cdr handles)) - (funcall gnus-article-mime-part-function handles))) - -(defun gnus-mime-display-mixed (handles) - (mapcar 'gnus-mime-display-part handles)) - -(defun gnus-mime-display-single (handle) - (let ((type (mm-handle-media-type handle)) - (ignored gnus-ignored-mime-types) - (not-attachment t) - (move nil) - display text) - (catch 'ignored - (progn - (while ignored - (when (string-match (pop ignored) type) - (throw 'ignored nil))) - (if (and (setq not-attachment - (and (not (mm-inline-override-p handle)) - (or (not (mm-handle-disposition handle)) - (equal (car (mm-handle-disposition handle)) - "inline") - (mm-attachment-override-p handle)))) - (mm-automatic-display-p handle) - (or (and - (mm-inlinable-p handle) - (mm-inlined-p handle)) - (mm-automatic-external-display-p type))) - (setq display t) - (when (equal (mm-handle-media-supertype handle) "text") - (setq text t))) - (let ((id (1+ (length gnus-article-mime-handle-alist))) - beg) - (push (cons id handle) gnus-article-mime-handle-alist) - (when (or (not display) - (not (gnus-unbuttonized-mime-type-p type))) - ;(gnus-article-insert-newline) - (gnus-insert-mime-button - handle id (list (or display (and not-attachment text)))) - (gnus-article-insert-newline) - ;(gnus-article-insert-newline) - ;; Remember modify the number of forward lines. - (setq move t)) - (setq beg (point)) - (cond - (display - (when move - (forward-line -1) - (setq beg (point))) - (let ((mail-parse-charset gnus-newsgroup-charset) - (mail-parse-ignored-charsets - (save-excursion (condition-case () - (set-buffer gnus-summary-buffer) - (error)) - gnus-newsgroup-ignored-charsets))) - (mm-display-part handle t)) - (goto-char (point-max))) - ((and text not-attachment) - (when move - (forward-line -1) - (setq beg (point))) - (gnus-article-insert-newline) - (mm-insert-inline handle (mm-get-part handle)) - (goto-char (point-max)))) - ;; Do highlighting. - (save-excursion - (save-restriction - (narrow-to-region beg (point)) - (gnus-treat-article - nil id - (gnus-article-mime-total-parts) - (mm-handle-media-type handle))))))))) - -(defun gnus-unbuttonized-mime-type-p (type) - "Say whether TYPE is to be unbuttonized." - (unless gnus-inhibit-mime-unbuttonizing - (catch 'found - (let ((types gnus-unbuttonized-mime-types)) - (while types - (when (string-match (pop types) type) - (throw 'found t))))))) - -(defun gnus-article-insert-newline () - "Insert a newline, but mark it as undeletable." - (gnus-put-text-property - (point) (progn (insert "\n") (point)) 'gnus-undeletable t)) - -(defun gnus-mime-display-alternative (handles &optional preferred ibegend id) - (let* ((preferred (or preferred (mm-preferred-alternative handles))) - (ihandles handles) - (point (point)) - handle buffer-read-only from props begend not-pref) - (save-window-excursion - (save-restriction - (when ibegend - (narrow-to-region (car ibegend) - (or (cdr ibegend) - (progn - (goto-char (car ibegend)) - (forward-line 2) - (point)))) - (delete-region (point-min) (point-max)) - (mm-remove-parts handles)) - (setq begend (list (point-marker))) - ;; Do the toggle. - (unless (setq not-pref (cadr (member preferred ihandles))) - (setq not-pref (car ihandles))) - (when (or ibegend - (not preferred) - (not (gnus-unbuttonized-mime-type-p - "multipart/alternative"))) - (gnus-add-text-properties - (setq from (point)) - (progn - (insert (format "%d. " id)) - (point)) - `(gnus-callback - (lambda (handles) - (unless ,(not ibegend) - (setq gnus-article-mime-handle-alist - ',gnus-article-mime-handle-alist)) - (gnus-mime-display-alternative - ',ihandles ',not-pref ',begend ,id)) - ,@(if (>= (string-to-number emacs-version) 21) - nil ;; XEmacs doesn't care - (list 'local-map gnus-mime-button-map)) - ,gnus-mouse-face-prop ,gnus-article-mouse-face - face ,gnus-article-button-face - keymap ,gnus-mime-button-map - gnus-part ,id - gnus-data ,handle)) - (widget-convert-button 'link from (point) - :action 'gnus-widget-press-button - :button-keymap gnus-widget-button-keymap) - ;; Do the handles - (while (setq handle (pop handles)) - (gnus-add-text-properties - (setq from (point)) - (progn - (insert (format "(%c) %-18s" - (if (equal handle preferred) ?* ? ) - (mm-handle-media-type handle))) - (point)) - `(gnus-callback - (lambda (handles) - (unless ,(not ibegend) - (setq gnus-article-mime-handle-alist - ',gnus-article-mime-handle-alist)) - (gnus-mime-display-alternative - ',ihandles ',handle ',begend ,id)) - ,@(if (>= (string-to-number emacs-version) 21) - nil ;; XEmacs doesn't care - (list 'local-map gnus-mime-button-map)) - ,gnus-mouse-face-prop ,gnus-article-mouse-face - face ,gnus-article-button-face - keymap ,gnus-mime-button-map - gnus-part ,id - gnus-data ,handle)) - (widget-convert-button 'link from (point) - :action 'gnus-widget-press-button - :button-keymap gnus-widget-button-keymap) - (insert " ")) - (insert "\n\n")) - (when preferred - (if (stringp (car preferred)) - (gnus-display-mime preferred) - (let ((mail-parse-charset gnus-newsgroup-charset) - (mail-parse-ignored-charsets - (save-excursion (set-buffer gnus-summary-buffer) - gnus-newsgroup-ignored-charsets))) - (mm-display-part preferred) - ;; Do highlighting. - (save-excursion - (save-restriction - (narrow-to-region (car begend) (point-max)) - (gnus-treat-article - nil (length gnus-article-mime-handle-alist) - (gnus-article-mime-total-parts) - (mm-handle-media-type handle)))))) - (goto-char (point-max)) - (setcdr begend (point-marker))))) - (when ibegend - (goto-char point)))) - -(defun gnus-article-wash-status () - "Return a string which display status of article washing." - (save-excursion - (set-buffer gnus-article-buffer) - (let ((cite (memq 'cite gnus-article-wash-types)) - (headers (memq 'headers gnus-article-wash-types)) - (boring (memq 'boring-headers gnus-article-wash-types)) - (pgp (memq 'pgp gnus-article-wash-types)) - (pem (memq 'pem gnus-article-wash-types)) - (signed (memq 'signed gnus-article-wash-types)) - (encrypted (memq 'encrypted gnus-article-wash-types)) - (signature (memq 'signature gnus-article-wash-types)) - (overstrike (memq 'overstrike gnus-article-wash-types)) - (emphasis (memq 'emphasis gnus-article-wash-types))) - (format "%c%c%c%c%c%c%c" - (if cite ?c ? ) - (if (or headers boring) ?h ? ) - (if (or pgp pem signed encrypted) ?p ? ) - (if signature ?s ? ) - (if overstrike ?o ? ) - (if gnus-show-mime ?m ? ) - (if emphasis ?e ? ))))) - -(defalias 'gnus-article-hide-headers-if-wanted 'gnus-article-maybe-hide-headers) - -(defun gnus-article-maybe-hide-headers () - "Hide unwanted headers if `gnus-have-all-headers' is nil. -Provided for backwards compatibility." - (when (and (or (not (gnus-buffer-live-p gnus-summary-buffer)) - (not (save-excursion (set-buffer gnus-summary-buffer) - gnus-have-all-headers))) - (not gnus-inhibit-hiding)) - (gnus-article-hide-headers))) - -;;; Article savers. - -(defun gnus-output-to-file (file-name) - "Append the current article to a file named FILE-NAME." - (let ((artbuf (current-buffer))) - (with-temp-buffer - (insert-buffer-substring artbuf) - ;; Append newline at end of the buffer as separator, and then - ;; save it to file. - (goto-char (point-max)) - (insert "\n") - (let ((file-name-coding-system nnmail-pathname-coding-system) - (pathname-coding-system nnmail-pathname-coding-system)) - (write-region-as-binary (point-min) (point-max) file-name 'append)) - t))) - -(defun gnus-narrow-to-page (&optional arg) - "Narrow the article buffer to a page. -If given a numerical ARG, move forward ARG pages." - (interactive "P") - (setq arg (if arg (prefix-numeric-value arg) 0)) - (save-excursion - (set-buffer gnus-article-buffer) - (goto-char (point-min)) - (widen) - ;; Remove any old next/prev buttons. - (when (gnus-visual-p 'page-marker) - (let ((buffer-read-only nil)) - (gnus-remove-text-with-property 'gnus-prev) - (gnus-remove-text-with-property 'gnus-next))) - (when - (cond ((< arg 0) - (re-search-backward page-delimiter nil 'move (1+ (abs arg)))) - ((> arg 0) - (re-search-forward page-delimiter nil 'move arg))) - (goto-char (match-end 0))) - (narrow-to-region - (point) - (if (re-search-forward page-delimiter nil 'move) - (match-beginning 0) - (point))) - (when (and (gnus-visual-p 'page-marker) - (not (= (point-min) 1))) - (save-excursion - (goto-char (point-min)) - (gnus-insert-prev-page-button))) - (when (and (gnus-visual-p 'page-marker) - (< (+ (point-max) 2) (buffer-size))) - (save-excursion - (goto-char (point-max)) - (gnus-insert-next-page-button))))) - -;; Article mode commands - -(defun gnus-article-goto-next-page () - "Show the next page of the article." - (interactive) - (when (gnus-article-next-page) - (goto-char (point-min)) - (gnus-article-read-summary-keys nil (gnus-character-to-event ?n)))) - -(defun gnus-article-goto-prev-page () - "Show the next page of the article." - (interactive) - (if (bobp) (gnus-article-read-summary-keys nil (gnus-character-to-event ?p)) - (gnus-article-prev-page nil))) - -(defun gnus-article-next-page (&optional lines) - "Show the next page of the current article. -If end of article, return non-nil. Otherwise return nil. -Argument LINES specifies lines to be scrolled up." - (interactive "p") - (let ((start (window-start)) - end-of-buffer end-of-page) - (save-excursion - (move-to-window-line -1) - (if (<= (point) start) - (progn - (forward-line 2) - (setq start (point))) - (forward-line 1) - (setq start nil)) - (unless (or (cond ((eq (1+ (buffer-size)) (point)) - (and (pos-visible-in-window-p) - (setq end-of-buffer t))) - ((eobp) - (setq end-of-page t))) - (not lines)) - (move-to-window-line lines) - (unless (search-backward "\n\n" nil t) - (setq start (point))))) - (cond (end-of-buffer t) - (end-of-page - (gnus-narrow-to-page 1) - nil) - (t - (if start - (set-window-start (selected-window) start) - (let (window-pixel-scroll-increment) - (scroll-up lines))) - nil)))) - -(defun gnus-article-prev-page (&optional lines) - "Show previous page of current article. -Argument LINES specifies lines to be scrolled down." - (interactive "p") - (let (beginning-of-buffer beginning-of-page) - (save-excursion - (move-to-window-line 0) - (cond ((eq 1 (point)) - (setq beginning-of-buffer t)) - ((bobp) - (setq beginning-of-page t)))) - (cond (beginning-of-buffer) - (beginning-of-page - (gnus-narrow-to-page -1)) - (t - (condition-case nil - (let (window-pixel-scroll-increment) - (scroll-down lines)) - (beginning-of-buffer - (goto-char (point-min)))))))) - -(defun gnus-article-refer-article () - "Read article specified by message-id around point." - (interactive) - (let ((point (point))) - (search-forward ">" nil t) ;Move point to end of "<....>". - (if (re-search-backward "\\(<[^<> \t\n]+>\\)" nil t) - (let ((message-id (match-string 1))) - (goto-char point) - (set-buffer gnus-summary-buffer) - (gnus-summary-refer-article message-id)) - (goto-char (point)) - (error "No references around point")))) - -(defun gnus-article-show-summary () - "Reconfigure windows to show summary buffer." - (interactive) - (if (not (gnus-buffer-live-p gnus-summary-buffer)) - (error "There is no summary buffer for this article buffer") - (gnus-article-set-globals) - (gnus-configure-windows 'article) - (gnus-summary-goto-subject gnus-current-article) - (gnus-summary-position-point))) - -(defun gnus-article-describe-briefly () - "Describe article mode commands briefly." - (interactive) - (gnus-message 6 (substitute-command-keys "\\\\[gnus-article-goto-next-page]:Next page \\[gnus-article-goto-prev-page]:Prev page \\[gnus-article-show-summary]:Show summary \\[gnus-info-find-node]:Run Info \\[gnus-article-describe-briefly]:This help"))) - -(defun gnus-article-summary-command () - "Execute the last keystroke in the summary buffer." - (interactive) - (let ((obuf (current-buffer)) - (owin (current-window-configuration)) - func) - (switch-to-buffer gnus-article-current-summary 'norecord) - (setq func (lookup-key (current-local-map) (this-command-keys))) - (call-interactively func) - (set-buffer obuf) - (set-window-configuration owin) - (set-window-point (get-buffer-window (current-buffer)) (point)))) - -(defun gnus-article-summary-command-nosave () - "Execute the last keystroke in the summary buffer." - (interactive) - (let (func) - (pop-to-buffer gnus-article-current-summary 'norecord) - (setq func (lookup-key (current-local-map) (this-command-keys))) - (call-interactively func))) - -(defun gnus-article-check-buffer () - "Beep if not in an article buffer." - (unless (eq (get-buffer gnus-article-buffer) (current-buffer)) - (error "Command invoked outside of a Gnus article buffer"))) - -(defun gnus-article-read-summary-keys (&optional arg key not-restore-window) - "Read a summary buffer key sequence and execute it from the article buffer." - (interactive "P") - (gnus-article-check-buffer) - (let ((nosaves - '("q" "Q" "c" "r" "R" "\C-c\C-f" "m" "a" "f" "F" - "Zc" "ZC" "ZE" "ZJ" "ZQ" "ZZ" "Zn" "ZR" "ZG" "ZN" "ZP" - "=" "^" "\M-^" "|")) - (nosave-but-article - '("A\r")) - (nosave-in-article - '("\C-d")) - (up-to-top - '("n" "Gn" "p" "Gp")) - keys new-sum-point) - (save-excursion - (set-buffer gnus-article-current-summary) - (let (gnus-pick-mode) - (push (or key last-command-event) unread-command-events) - (setq keys (static-if (featurep 'xemacs) - (events-to-keys (read-key-sequence nil)) - (read-key-sequence nil))))) - (message "") - - (if (or (member keys nosaves) - (member keys nosave-but-article) - (member keys nosave-in-article)) - (let (func) - (save-window-excursion - (pop-to-buffer gnus-article-current-summary 'norecord) - ;; We disable the pick minor mode commands. - (let (gnus-pick-mode) - (setq func (lookup-key (current-local-map) keys)))) - (if (or (not func) - (numberp func)) - (ding) - (unless (member keys nosave-in-article) - (set-buffer gnus-article-current-summary)) - (call-interactively func) - (setq new-sum-point (point))) - (when (member keys nosave-but-article) - (pop-to-buffer gnus-article-buffer 'norecord))) - ;; These commands should restore window configuration. - (let ((obuf (current-buffer)) - (owin (current-window-configuration)) - (opoint (point)) - (summary gnus-article-current-summary) - func in-buffer selected) - (if not-restore-window - (pop-to-buffer summary 'norecord) - (switch-to-buffer summary 'norecord)) - (setq in-buffer (current-buffer)) - ;; We disable the pick minor mode commands. - (if (and (setq func (let (gnus-pick-mode) - (lookup-key (current-local-map) keys))) - (functionp func)) - (progn - (call-interactively func) - (setq new-sum-point (point)) - (when (eq in-buffer (current-buffer)) - (setq selected (gnus-summary-select-article)) - (set-buffer obuf) - (unless not-restore-window - (set-window-configuration owin)) - (when (eq selected 'old) - (article-goto-body) - (set-window-start (get-buffer-window (current-buffer)) - 1) - (set-window-point (get-buffer-window (current-buffer)) - (point))) - (let ((win (get-buffer-window gnus-article-current-summary))) - (when win - (set-window-point win new-sum-point)))) ) - (switch-to-buffer gnus-article-buffer) - (ding)))))) - -(defun gnus-article-describe-key (key) - "Display documentation of the function invoked by KEY. KEY is a string." - (interactive "kDescribe key: ") - (gnus-article-check-buffer) - (if (eq (key-binding key) 'gnus-article-read-summary-keys) - (save-excursion - (set-buffer gnus-article-current-summary) - (let (gnus-pick-mode) - (if (featurep 'xemacs) - (progn - (push (elt key 0) unread-command-events) - (setq key (events-to-keys - (read-key-sequence "Describe key: ")))) - (setq unread-command-events - (mapcar - (lambda (x) (if (>= x 128) (list 'meta (- x 128)) x)) - key)) - (setq key (read-key-sequence "Describe key: ")))) - (describe-key key)) - (describe-key key))) - -(defun gnus-article-describe-key-briefly (key &optional insert) - "Display documentation of the function invoked by KEY. KEY is a string." - (interactive "kDescribe key: \nP") - (gnus-article-check-buffer) - (if (eq (key-binding key) 'gnus-article-read-summary-keys) - (save-excursion - (set-buffer gnus-article-current-summary) - (let (gnus-pick-mode) - (if (featurep 'xemacs) - (progn - (push (elt key 0) unread-command-events) - (setq key (events-to-keys - (read-key-sequence "Describe key: ")))) - (setq unread-command-events - (mapcar - (lambda (x) (if (>= x 128) (list 'meta (- x 128)) x)) - key)) - (setq key (read-key-sequence "Describe key: ")))) - (describe-key-briefly key insert)) - (describe-key-briefly key insert))) - -(defun gnus-article-hide (&optional arg force) - "Hide all the gruft in the current article. -This means that PGP stuff, signatures, cited text and (some) -headers will be hidden. -If given a prefix, show the hidden text instead." - (interactive (append (gnus-article-hidden-arg) (list 'force))) - (gnus-article-hide-headers arg) - (gnus-article-hide-list-identifiers arg) - (gnus-article-hide-pgp arg) - (gnus-article-hide-citation-maybe arg force) - (gnus-article-hide-signature arg)) - -(defun gnus-article-maybe-highlight () - "Do some article highlighting if article highlighting is requested." - (when (gnus-visual-p 'article-highlight 'highlight) - (gnus-article-highlight-some))) - -(defun gnus-check-group-server () - ;; Make sure the connection to the server is alive. - (unless (gnus-server-opened - (gnus-find-method-for-group gnus-newsgroup-name)) - (gnus-check-server (gnus-find-method-for-group gnus-newsgroup-name)) - (gnus-request-group gnus-newsgroup-name t))) - -(defun gnus-request-article-this-buffer (article group) - "Get an article and insert it into this buffer. -T-gnus change: Insert an article into `gnus-original-article-buffer'." - (let (do-update-line sparse-header) - ;; The current buffer is `gnus-article-buffer'. - (prog1 - (save-excursion - (erase-buffer) - (gnus-kill-all-overlays) - (setq group (or group gnus-newsgroup-name)) - - ;; Using `gnus-request-article' directly will insert the article into - ;; `nntp-server-buffer' - so we'll save some time by not having to - ;; copy it from the server buffer into the article buffer. - - ;; We only request an article by message-id when we do not have the - ;; headers for it, so we'll have to get those. - (when (stringp article) - (gnus-read-header article)) - - ;; If the article number is negative, that means that this article - ;; doesn't belong in this newsgroup (possibly), so we find its - ;; message-id and request it by id instead of number. - (when (and (numberp article) - gnus-summary-buffer - (get-buffer gnus-summary-buffer) - (gnus-buffer-exists-p gnus-summary-buffer)) - (save-excursion - (set-buffer gnus-summary-buffer) - (let ((header (gnus-summary-article-header article))) - (when (< article 0) - (cond - ((memq article gnus-newsgroup-sparse) - ;; This is a sparse gap article. - (setq do-update-line article) - (setq article (mail-header-id header)) - (setq sparse-header (gnus-read-header article)) - (setq gnus-newsgroup-sparse - (delq article gnus-newsgroup-sparse))) - ((vectorp header) - ;; It's a real article. - (setq article (mail-header-id header))) - (t - ;; It is an extracted pseudo-article. - (setq article 'pseudo) - (gnus-request-pseudo-article header)))) - - (let ((method (gnus-find-method-for-group - gnus-newsgroup-name))) - (when (and (eq (car method) 'nneething) - (vectorp header)) - (let ((dir (expand-file-name - (mail-header-subject header) - (file-name-as-directory - (or (cadr (assq 'nneething-address method)) - (nth 1 method)))))) - (when (file-directory-p dir) - (setq article 'nneething) - (gnus-group-enter-directory dir)))))))) - (setq gnus-original-article (cons group article)) - - (set-buffer gnus-original-article-buffer) - (cond - ;; Refuse to select canceled articles. - ((and (numberp article) - gnus-summary-buffer - (get-buffer gnus-summary-buffer) - (gnus-buffer-exists-p gnus-summary-buffer) - (eq (cdr (save-excursion - (set-buffer gnus-summary-buffer) - (assq article gnus-newsgroup-reads))) - gnus-canceled-mark)) - nil) - ;; Check the backlog. - ((and gnus-keep-backlog - (gnus-backlog-request-article group article (current-buffer))) - 'article) - ;; Check asynchronous pre-fetch. - ((gnus-async-request-fetched-article group article (current-buffer)) - (gnus-async-prefetch-next group article gnus-summary-buffer) - (when (and (numberp article) gnus-keep-backlog) - (gnus-backlog-enter-article group article (current-buffer))) - 'article) - ;; Check the cache. - ((and gnus-use-cache - (numberp article) - (gnus-cache-request-article article group)) - 'article) - ;; Get the article and put into the article buffer. - ((or (stringp article) - (numberp article)) - (let ((gnus-override-method gnus-override-method) - (methods (and (stringp article) - gnus-refer-article-method)) - result - (buffer-read-only nil)) - (if (or (not (listp methods)) - (and (symbolp (car methods)) - (assq (car methods) nnoo-definition-alist))) - (setq methods (list methods))) - (when (and (null gnus-override-method) - methods) - (setq gnus-override-method (pop methods))) - (while (not result) - (when (eq gnus-override-method 'current) - (setq gnus-override-method gnus-current-select-method)) - (erase-buffer) - (gnus-kill-all-overlays) - (let ((gnus-newsgroup-name group)) - (gnus-check-group-server)) - (when (gnus-request-article article group (current-buffer)) - (when (numberp article) - (gnus-async-prefetch-next group article - gnus-summary-buffer) - (when gnus-keep-backlog - (gnus-backlog-enter-article - group article (current-buffer)))) - (setq result 'article)) - (if (not result) - (if methods - (setq gnus-override-method (pop methods)) - (setq result 'done)))) - (and (eq result 'article) 'article))) - ;; It was a pseudo. - (t article))) - - ;; Associate this article with the current summary buffer. - (setq gnus-article-current-summary gnus-summary-buffer) - - ;; Decode charsets. - (run-hooks 'gnus-article-decode-hook) - ;; Mark article as decoded or not. - (setq gnus-article-decoded-p gnus-article-decode-hook) - - ;; Update sparse articles. - (when (and do-update-line - (or (numberp article) - (stringp article))) - (let ((buf (current-buffer))) - (set-buffer gnus-summary-buffer) - (gnus-summary-update-article do-update-line sparse-header) - (gnus-summary-goto-subject do-update-line nil t) - (set-window-point (get-buffer-window (current-buffer) t) - (point)) - (set-buffer buf)))))) - -;;; -;;; Article editing -;;; - -(defcustom gnus-article-edit-mode-hook nil - "Hook run in article edit mode buffers." - :group 'gnus-article-various - :type 'hook) - -(defcustom gnus-article-edit-article-setup-function - 'gnus-article-mime-edit-article-setup - "Function called to setup an editing article buffer." - :group 'gnus-article-various - :type 'function) - -(defvar gnus-article-edit-done-function nil) - -(defvar gnus-article-edit-mode-map nil) - -;; Should we be using derived.el for this? -(unless gnus-article-edit-mode-map - (setq gnus-article-edit-mode-map (make-sparse-keymap)) - (set-keymap-parent gnus-article-edit-mode-map text-mode-map) - - (gnus-define-keys gnus-article-edit-mode-map - "\C-c\C-c" gnus-article-edit-done - "\C-c\C-k" gnus-article-edit-exit) - - (gnus-define-keys (gnus-article-edit-wash-map - "\C-c\C-w" gnus-article-edit-mode-map) - "f" gnus-article-edit-full-stops)) - -(define-derived-mode gnus-article-edit-mode text-mode "Article Edit" - "Major mode for editing articles. -This is an extended text-mode. - -\\{gnus-article-edit-mode-map}" - (make-local-variable 'gnus-article-edit-done-function) - (make-local-variable 'gnus-prev-winconf) - (set (make-local-variable 'font-lock-defaults) - '(message-font-lock-keywords t)) - (setq buffer-read-only nil) - (buffer-enable-undo) - (widen)) - -(defun gnus-article-edit (&optional force) - "Edit the current article. -This will have permanent effect only in mail groups. -If FORCE is non-nil, allow editing of articles even in read-only -groups." - (interactive "P") - (when (and (not force) - (gnus-group-read-only-p)) - (error "The current newsgroup does not support article editing")) - (gnus-article-date-original) - (gnus-article-edit-article - 'ignore - `(lambda (no-highlight) - 'ignore - (gnus-summary-edit-article-done - ,(or (mail-header-references gnus-current-headers) "") - ,(gnus-group-read-only-p) ,gnus-summary-buffer no-highlight)))) - -(defun gnus-article-edit-article (start-func exit-func) - "Start editing the contents of the current article buffer." - (let ((winconf (current-window-configuration))) - (set-buffer gnus-article-buffer) - (gnus-article-edit-mode) - (funcall start-func) - (set-buffer-modified-p nil) - (gnus-configure-windows 'edit-article) - (setq gnus-article-edit-done-function exit-func) - (setq gnus-prev-winconf winconf) - (when gnus-article-edit-article-setup-function - (funcall gnus-article-edit-article-setup-function)) - (gnus-message 6 "C-c C-c to end edits; C-c C-k to exit"))) - -(defun gnus-article-edit-done (&optional arg) - "Update the article edits and exit." - (interactive "P") - (let ((func gnus-article-edit-done-function) - (buf (current-buffer)) - (start (window-start))) - (remove-hook 'gnus-article-mode-hook - 'gnus-article-mime-edit-article-unwind) - ;; We remove all text props from the article buffer. - (let ((content - (buffer-substring-no-properties (point-min) (point-max))) - (p (point))) - (erase-buffer) - (insert content) - (let ((winconf gnus-prev-winconf)) - (gnus-article-mode) - (set-window-configuration winconf) - ;; Tippy-toe some to make sure that point remains where it was. - (save-current-buffer - (set-buffer buf) - (set-window-start (get-buffer-window (current-buffer)) start) - (goto-char p)))) - (save-excursion - (set-buffer buf) - (let ((buffer-read-only nil)) - (funcall func arg)) - ;; The cache and backlog have to be flushed somewhat. - (when gnus-keep-backlog - (gnus-backlog-remove-article - (car gnus-article-current) (cdr gnus-article-current))) - ;; Flush original article as well. - (save-excursion - (when (get-buffer gnus-original-article-buffer) - (set-buffer gnus-original-article-buffer) - (setq gnus-original-article nil))) - (when gnus-use-cache - (gnus-cache-update-article - (car gnus-article-current) (cdr gnus-article-current)))) - (set-buffer buf) - (set-window-start (get-buffer-window buf) start) - (set-window-point (get-buffer-window buf) (point)))) - -(defun gnus-article-edit-exit () - "Exit the article editing without updating." - (interactive) - (when (or (not (buffer-modified-p)) - (yes-or-no-p "Article modified; kill anyway? ")) - (let ((curbuf (current-buffer)) - (p (point)) - (window-start (window-start))) - (erase-buffer) - (if (gnus-buffer-live-p gnus-original-article-buffer) - (insert-buffer gnus-original-article-buffer)) - (let ((winconf gnus-prev-winconf)) - (gnus-article-mode) - (set-window-configuration winconf) - ;; Tippy-toe some to make sure that point remains where it was. - (save-current-buffer - (set-buffer curbuf) - (set-window-start (get-buffer-window (current-buffer)) window-start) - (goto-char p)))))) - -(defun gnus-article-edit-full-stops () - "Interactively repair spacing at end of sentences." - (interactive) - (save-excursion - (goto-char (point-min)) - (search-forward-regexp "^$" nil t) - (let ((case-fold-search nil)) - (query-replace-regexp "\\([.!?][])}]* \\)\\([[({A-Z]\\)" "\\1 \\2")))) - -;;; -;;; Article editing with MIME-Edit -;;; - -(defcustom gnus-article-mime-edit-article-setup-hook nil - "Hook run after setting up a MIME editing article buffer." - :group 'gnus-article-various - :type 'hook) - -(defun gnus-article-mime-edit-article-unwind () - "Unwind `gnus-article-buffer' if article editing was given up." - (remove-hook 'gnus-article-mode-hook 'gnus-article-mime-edit-article-unwind) - (when (featurep 'font-lock) - (setq font-lock-defaults nil) - (font-lock-mode -1)) - (when mime-edit-mode-flag - (mime-edit-exit 'nomime 'no-error) - (message ""))) - -(defun gnus-article-mime-edit-article-setup () - "Convert current buffer to MIME-Edit buffer and turn on MIME-Edit mode -after replacing with the original article." - (setq gnus-show-mime t) - (setq gnus-article-edit-done-function - `(lambda (&rest args) - (when mime-edit-mode-flag - (let (mime-edit-insert-user-agent-field) - (mime-edit-exit)) - (message "")) - (goto-char (point-min)) - (let (case-fold-search) - (when (re-search-forward - (format "^%s$" (regexp-quote mail-header-separator)) - nil t) - (replace-match ""))) - (apply ,gnus-article-edit-done-function args) - (insert - (prog1 - (buffer-substring-no-properties (point-min) (point-max)) - (set-buffer (get-buffer-create gnus-original-article-buffer)) - (erase-buffer))) - (setq gnus-current-headers (gnus-article-make-full-mail-header)) - (set-buffer gnus-article-buffer) - (gnus-article-prepare-display))) - (substitute-key-definition 'gnus-article-edit-done - 'gnus-article-mime-edit-done - gnus-article-edit-mode-map) - (substitute-key-definition 'gnus-article-edit-exit - 'gnus-article-mime-edit-exit - gnus-article-edit-mode-map) - (erase-buffer) - (insert-buffer gnus-original-article-buffer) - (let ((ofn (symbol-function 'mime-edit-decode-single-part-in-buffer))) - (fset 'mime-edit-decode-single-part-in-buffer - (lambda (&rest args) - (if (let ((content-type (car args))) - (and (eq 'message (mime-content-type-primary-type - content-type)) - (eq 'rfc822 (mime-content-type-subtype content-type)))) - (setcar (cdr args) 'not-decode-text)) - (apply ofn args))) - (unwind-protect - (mime-edit-again) - (fset 'mime-edit-decode-single-part-in-buffer ofn))) - (when (featurep 'font-lock) - (set (make-local-variable 'font-lock-defaults) - '(message-font-lock-keywords t)) - (font-lock-set-defaults) - (turn-on-font-lock)) - (set-buffer-modified-p nil) - (delete-other-windows) - (add-hook 'gnus-article-mode-hook 'gnus-article-mime-edit-article-unwind) - (gnus-run-hooks 'gnus-article-mime-edit-article-setup-hook)) - -(defun gnus-article-mime-edit-done (&optional arg) - "Update the article MIME edits and exit." - (interactive "P") - (when (featurep 'font-lock) - (setq font-lock-defaults nil) - (font-lock-mode -1)) - (gnus-article-edit-done arg)) - -(defun gnus-article-mime-edit-exit () - "Exit the article MIME editing without updating." - (interactive) - (when (or (not (buffer-modified-p)) - (yes-or-no-p "Article modified; kill anyway? ")) - (when (featurep 'font-lock) - (setq font-lock-defaults nil) - (font-lock-mode -1)) - (when mime-edit-mode-flag - (let (mime-edit-insert-user-agent-field) - (mime-edit-exit)) - (message "")) - (goto-char (point-min)) - (let (case-fold-search) - (when (re-search-forward - (format "^%s$" (regexp-quote mail-header-separator)) nil t) - (replace-match ""))) - (let ((winconf gnus-prev-winconf)) - (insert (prog1 - (buffer-substring-no-properties (point-min) (point-max)) - (set-buffer (get-buffer-create gnus-original-article-buffer)) - (erase-buffer))) - (setq gnus-current-headers (gnus-article-make-full-mail-header)) - (set-buffer gnus-article-buffer) - (gnus-article-prepare-display) - (set-window-configuration winconf)))) - -;;; -;;; Article highlights -;;; - -;; Written by Per Abrahamsen . - -;;; Internal Variables: - -(defcustom gnus-button-url-regexp "\\b\\(\\(www\\.\\|\\(s?https?\\|ftp\\|file\\|gopher\\|news\\|telnet\\|wais\\|mailto\\|info\\):\\)\\(//[-a-zA-Z0-9_.]+:[0-9]*\\)?\\([-a-zA-Z0-9_=!?#$@~`%&*+|\\/:;.,]\\|\\w\\)+\\([-a-zA-Z0-9_=#$@~`%&*+|\\/]\\|\\w\\)\\)" - "Regular expression that matches URLs." - :group 'gnus-article-buttons - :type 'regexp) - -(defcustom gnus-button-alist - `(("<\\(url:[>\n\t ]*?\\)?\\(nntp\\|news\\):[>\n\t ]*\\([^>\n\t ]*@[^>\n\t ]*\\)>" - 0 t gnus-button-handle-news 3) - ("\\b\\(nntp\\|news\\):\\([^>\n\t ]*@[^>)!;:,\n\t ]*\\)" 0 t - gnus-button-handle-news 2) - ("\\(\\b<\\(url:[>\n\t ]*\\)?news:[>\n\t ]*\\(//\\)?\\([^>\n\t ]*\\)>\\)" - 1 t - gnus-button-fetch-group 4) - ("\\bnews:\\(//\\)?\\([^'\">\n\t ]+\\)" 0 t gnus-button-fetch-group 2) - ("\\bin\\( +article\\| +message\\)? +\\(<\\([^\n @<>]+@[^\n @<>]+\\)>\\)" 2 - t gnus-button-message-id 3) - ("\\( \n\t]+\\)>" 0 t gnus-url-mailto 2) - ("mailto:\\([-a-zA-Z.@_+0-9%=?]+\\)" 0 t gnus-url-mailto 1) - ("\\bmailto:\\([^ \n\t]+\\)" 0 t gnus-url-mailto 1) - ;; This is info - ("\\binfo:\\(//\\)?\\([^'\">\n\t ]+\\)" 0 t - gnus-button-handle-info 2) - ;; This is how URLs _should_ be embedded in text... - ("]*\\)>" 0 t gnus-button-embedded-url 1) - ;; Raw URLs. - (,gnus-button-url-regexp 0 t browse-url 0)) - "*Alist of regexps matching buttons in article bodies. - -Each entry has the form (REGEXP BUTTON FORM CALLBACK PAR...), where -REGEXP: is the string matching text around the button, -BUTTON: is the number of the regexp grouping actually matching the button, -FORM: is a lisp expression which must eval to true for the button to -be added, -CALLBACK: is the function to call when the user push this button, and each -PAR: is a number of a regexp grouping whose text will be passed to CALLBACK. - -CALLBACK can also be a variable, in that case the value of that -variable it the real callback function." - :group 'gnus-article-buttons - :type '(repeat (list regexp - (integer :tag "Button") - (sexp :tag "Form") - (function :tag "Callback") - (repeat :tag "Par" - :inline t - (integer :tag "Regexp group"))))) - -(defcustom gnus-header-button-alist - `(("^\\(References\\|Message-I[Dd]\\):" "<[^<>]+>" - 0 t gnus-button-message-id 0) - ("^\\(From\\|Reply-To\\):" ": *\\(.+\\)$" 1 t gnus-button-reply 1) - ("^\\(Cc\\|To\\):" "[^ \t\n<>,()\"]+@[^ \t\n<>,()\"]+" - 0 t gnus-button-mailto 0) - ("^X-[Uu][Rr][Ll]:" ,gnus-button-url-regexp 0 t browse-url 0) - ("^Subject:" ,gnus-button-url-regexp 0 t browse-url 0) - ("^[^:]+:" ,gnus-button-url-regexp 0 t browse-url 0) - ("^[^:]+:" "\\(<\\(url: \\)?news:\\([^>\n ]*\\)>\\)" 1 t - gnus-button-message-id 3)) - "*Alist of headers and regexps to match buttons in article heads. - -This alist is very similar to `gnus-button-alist', except that each -alist has an additional HEADER element first in each entry: - -\(HEADER REGEXP BUTTON FORM CALLBACK PAR) - -HEADER is a regexp to match a header. For a fuller explanation, see -`gnus-button-alist'." - :group 'gnus-article-buttons - :group 'gnus-article-headers - :type '(repeat (list (regexp :tag "Header") - regexp - (integer :tag "Button") - (sexp :tag "Form") - (function :tag "Callback") - (repeat :tag "Par" - :inline t - (integer :tag "Regexp group"))))) - -(defvar gnus-button-regexp nil) -(defvar gnus-button-marker-list nil) -;; Regexp matching any of the regexps from `gnus-button-alist'. - -(defvar gnus-button-last nil) -;; The value of `gnus-button-alist' when `gnus-button-regexp' was build. - -;;; Commands: - -(defun gnus-article-push-button (event) - "Check text under the mouse pointer for a callback function. -If the text under the mouse pointer has a `gnus-callback' property, -call it with the value of the `gnus-data' text property." - (interactive "e") - (set-buffer (window-buffer (posn-window (event-start event)))) - (let* ((pos (posn-point (event-start event))) - (data (get-text-property pos 'gnus-data)) - (fun (get-text-property pos 'gnus-callback))) - (goto-char pos) - (when fun - (funcall fun data)))) - -(defun gnus-article-press-button () - "Check text at point for a callback function. -If the text at point has a `gnus-callback' property, -call it with the value of the `gnus-data' text property." - (interactive) - (let* ((data (get-text-property (point) 'gnus-data)) - (fun (get-text-property (point) 'gnus-callback))) - (when fun - (funcall fun data)))) - -(defun gnus-article-prev-button (n) - "Move point to N buttons backward. -If N is negative, move forward instead." - (interactive "p") - (gnus-article-next-button (- n))) - -(defun gnus-article-next-button (n) - "Move point to N buttons forward. -If N is negative, move backward instead." - (interactive "p") - (let ((function (if (< n 0) 'previous-single-property-change - 'next-single-property-change)) - (inhibit-point-motion-hooks t) - (backward (< n 0)) - (limit (if (< n 0) (point-min) (point-max)))) - (setq n (abs n)) - (while (and (not (= limit (point))) - (> n 0)) - ;; Skip past the current button. - (when (get-text-property (point) 'gnus-callback) - (goto-char (funcall function (point) 'gnus-callback nil limit))) - ;; Go to the next (or previous) button. - (gnus-goto-char (funcall function (point) 'gnus-callback nil limit)) - ;; Put point at the start of the button. - (when (and backward (not (get-text-property (point) 'gnus-callback))) - (goto-char (funcall function (point) 'gnus-callback nil limit))) - ;; Skip past intangible buttons. - (when (get-text-property (point) 'intangible) - (incf n)) - (decf n)) - (unless (zerop n) - (gnus-message 5 "No more buttons")) - n)) - -(defun gnus-article-highlight (&optional force) - "Highlight current article. -This function calls `gnus-article-highlight-headers', -`gnus-article-highlight-citation', -`gnus-article-highlight-signature', and `gnus-article-add-buttons' to -do the highlighting. See the documentation for those functions." - (interactive (list 'force)) - (gnus-article-highlight-headers) - (gnus-article-highlight-citation force) - (gnus-article-highlight-signature) - (gnus-article-add-buttons force) - (gnus-article-add-buttons-to-head)) - -(defun gnus-article-highlight-some (&optional force) - "Highlight current article. -This function calls `gnus-article-highlight-headers', -`gnus-article-highlight-signature', and `gnus-article-add-buttons' to -do the highlighting. See the documentation for those functions." - (interactive (list 'force)) - (gnus-article-highlight-headers) - (gnus-article-highlight-signature) - (gnus-article-add-buttons)) - -(defun gnus-article-highlight-headers () - "Highlight article headers as specified by `gnus-header-face-alist'." - (interactive) - (save-excursion - (set-buffer gnus-article-buffer) - (save-restriction - (let ((alist gnus-header-face-alist) - (buffer-read-only nil) - (case-fold-search t) - (inhibit-point-motion-hooks t) - entry regexp header-face field-face from hpoints fpoints) - (article-narrow-to-head) - (while (setq entry (pop alist)) - (goto-char (point-min)) - (setq regexp (concat "^\\(" - (if (string-equal "" (nth 0 entry)) - "[^\t ]" - (nth 0 entry)) - "\\)") - header-face (nth 1 entry) - field-face (nth 2 entry)) - (while (and (re-search-forward regexp nil t) - (not (eobp))) - (beginning-of-line) - (setq from (point)) - (unless (search-forward ":" nil t) - (forward-char 1)) - (when (and header-face - (not (memq (point) hpoints))) - (push (point) hpoints) - (gnus-put-text-property from (point) 'face header-face)) - (when (and field-face - (not (memq (setq from (point)) fpoints))) - (push from fpoints) - (if (re-search-forward "^[^ \t]" nil t) - (forward-char -2) - (goto-char (point-max))) - (gnus-put-text-property from (point) 'face field-face)))))))) - -(defun gnus-article-highlight-signature () - "Highlight the signature in an article. -It does this by highlighting everything after -`gnus-signature-separator' using `gnus-signature-face'." - (interactive) - (when gnus-signature-face - (save-excursion - (set-buffer gnus-article-buffer) - (let ((buffer-read-only nil) - (inhibit-point-motion-hooks t)) - (save-restriction - (when (gnus-article-narrow-to-signature) - (gnus-overlay-put (gnus-make-overlay (point-min) (point-max)) - 'face gnus-signature-face))))))) - -(defun gnus-article-buttonize-signature () - "Add button to the signature." - (interactive) - (save-excursion - (set-buffer gnus-article-buffer) - (let ((buffer-read-only nil) - (inhibit-point-motion-hooks t)) - (when (gnus-article-search-signature) - (gnus-article-add-button (match-beginning 0) (match-end 0) - 'gnus-signature-toggle - (set-marker (make-marker) - (1+ (match-end 0)))))))) - -(defun gnus-button-in-region-p (b e prop) - "Say whether PROP exists in the region." - (text-property-not-all b e prop nil)) - -(defun gnus-article-add-buttons (&optional force) - "Find external references in the article and make buttons of them. -\"External references\" are things like Message-IDs and URLs, as -specified by `gnus-button-alist'." - (interactive (list 'force)) - (save-excursion - (set-buffer gnus-article-buffer) - (let ((buffer-read-only nil) - (inhibit-point-motion-hooks t) - (case-fold-search t) - (alist gnus-button-alist) - beg entry regexp) - ;; Remove all old markers. - (let (marker entry new-list) - (while (setq marker (pop gnus-button-marker-list)) - (if (or (< marker (point-min)) (>= marker (point-max))) - (push marker new-list) - (goto-char marker) - (when (setq entry (gnus-button-entry)) - (put-text-property (match-beginning (nth 1 entry)) - (match-end (nth 1 entry)) - 'gnus-callback nil)) - (set-marker marker nil))) - (setq gnus-button-marker-list new-list)) - ;; We skip the headers. - (article-goto-body) - (setq beg (point)) - (while (setq entry (pop alist)) - (setq regexp (car entry)) - (goto-char beg) - (while (re-search-forward regexp nil t) - (let* ((start (and entry (match-beginning (nth 1 entry)))) - (end (and entry (match-end (nth 1 entry)))) - (from (match-beginning 0))) - (when (and (or (eq t (nth 2 entry)) - (eval (nth 2 entry))) - (not (gnus-button-in-region-p - start end 'gnus-callback))) - ;; That optional form returned non-nil, so we add the - ;; button. - (gnus-article-add-button - start end 'gnus-button-push - (car (push (set-marker (make-marker) from) - gnus-button-marker-list)))))))))) - -;; Add buttons to the head of an article. -(defun gnus-article-add-buttons-to-head () - "Add buttons to the head of the article." - (interactive) - (save-excursion - (set-buffer gnus-article-buffer) - (save-restriction - (let ((buffer-read-only nil) - (inhibit-point-motion-hooks t) - (case-fold-search t) - (alist gnus-header-button-alist) - entry beg end) - (article-narrow-to-head) - (while alist - ;; Each alist entry. - (setq entry (car alist) - alist (cdr alist)) - (goto-char (point-min)) - (while (re-search-forward (car entry) nil t) - ;; Each header matching the entry. - (setq beg (match-beginning 0)) - (setq end (or (and (re-search-forward "^[^ \t]" nil t) - (match-beginning 0)) - (point-max))) - (goto-char beg) - (while (re-search-forward (nth 1 entry) end t) - ;; Each match within a header. - (let* ((entry (cdr entry)) - (start (match-beginning (nth 1 entry))) - (end (match-end (nth 1 entry))) - (form (nth 2 entry))) - (goto-char (match-end 0)) - (when (eval form) - (gnus-article-add-button - start end (nth 3 entry) - (buffer-substring (match-beginning (nth 4 entry)) - (match-end (nth 4 entry))))))) - (goto-char end))))))) - -;;; External functions: - -(defun gnus-article-add-button (from to fun &optional data) - "Create a button between FROM and TO with callback FUN and data DATA." - (when gnus-article-button-face - (gnus-overlay-put (gnus-make-overlay from to) - 'face gnus-article-button-face)) - (gnus-add-text-properties - from to - (nconc (and gnus-article-mouse-face - (list gnus-mouse-face-prop gnus-article-mouse-face)) - (list 'gnus-callback fun) - (and data (list 'gnus-data data)))) - (widget-convert-button 'link from to :action 'gnus-widget-press-button - ;; Quote `:button-keymap' for Mule 2.3 - ;; but it won't work. - ':button-keymap gnus-widget-button-keymap)) - -;;; Internal functions: - -(defun gnus-article-set-globals () - (save-excursion - (set-buffer gnus-summary-buffer) - (gnus-set-global-variables))) - -(defun gnus-signature-toggle (end) - (save-excursion - (set-buffer gnus-article-buffer) - (let ((buffer-read-only nil) - (inhibit-point-motion-hooks t) - (limit (next-single-property-change end 'mime-view-entity - nil (point-max)))) - (if (text-property-any end limit 'article-type 'signature) - (gnus-remove-text-properties-when - 'article-type 'signature end limit - (cons 'article-type (cons 'signature - gnus-hidden-properties))) - (gnus-add-text-properties-when - 'article-type nil end limit - (cons 'article-type (cons 'signature - gnus-hidden-properties))))))) - -(defun gnus-button-entry () - ;; Return the first entry in `gnus-button-alist' matching this place. - (let ((alist gnus-button-alist) - (entry nil)) - (while alist - (setq entry (pop alist)) - (if (looking-at (car entry)) - (setq alist nil) - (setq entry nil))) - entry)) - -(defun gnus-button-push (marker) - ;; Push button starting at MARKER. - (save-excursion - (goto-char marker) - (let* ((entry (gnus-button-entry)) - (inhibit-point-motion-hooks t) - (fun (nth 3 entry)) - (args (mapcar (lambda (group) - (let ((string (match-string group))) - (gnus-set-text-properties - 0 (length string) nil string) - string)) - (nthcdr 4 entry)))) - (cond - ((fboundp fun) - (apply fun args)) - ((and (boundp fun) - (fboundp (symbol-value fun))) - (apply (symbol-value fun) args)) - (t - (gnus-message 1 "You must define `%S' to use this button" - (cons fun args))))))) - -(defun gnus-parse-news-url (url) - (let (scheme server group message-id articles) - (with-temp-buffer - (insert url) - (goto-char (point-min)) - (when (looking-at "\\([A-Za-z]+\\):") - (setq scheme (match-string 1)) - (goto-char (match-end 0))) - (when (looking-at "//\\([^/]+\\)/") - (setq server (match-string 1)) - (goto-char (match-end 0))) - - (cond - ((looking-at "\\(.*@.*\\)") - (setq message-id (match-string 1))) - ((looking-at "\\([^/]+\\)/\\([-0-9]+\\)") - (setq group (match-string 1) - articles (split-string (match-string 2) "-"))) - ((looking-at "\\([^/]+\\)/?") - (setq group (match-string 1))) - (t - (error "Unknown news URL syntax")))) - (list scheme server group message-id articles))) - -(defun gnus-button-handle-news (url) - "Fetch a news URL." - (destructuring-bind (scheme server group message-id articles) - (gnus-parse-news-url url) - (cond - (message-id - (save-excursion - (set-buffer gnus-summary-buffer) - (if server - (let ((gnus-refer-article-method (list (list 'nntp server)))) - (gnus-summary-refer-article message-id)) - (gnus-summary-refer-article message-id)))) - (group - (gnus-button-fetch-group url))))) - -(defun gnus-button-handle-info (url) - "Fetch an info URL." - (if (string-match - "^\\([^:/]+\\)?/\\(.*\\)" - url) - (gnus-info-find-node - (concat "(" (or (gnus-url-unhex-string (match-string 1 url)) - "Gnus") - ")" - (gnus-url-unhex-string (match-string 2 url)))) - (error "Can't parse %s" url))) - -(defun gnus-button-message-id (message-id) - "Fetch MESSAGE-ID." - (save-excursion - (set-buffer gnus-summary-buffer) - (gnus-summary-refer-article message-id))) - -(defun gnus-button-fetch-group (address) - "Fetch GROUP specified by ADDRESS." - (if (not (string-match "[:/]" address)) - ;; This is just a simple group url. - (gnus-group-read-ephemeral-group address gnus-select-method) - (if (not - (string-match - "^\\([^:/]+\\)\\(:\\([^/]+\\)\\)?/\\([^/]+\\)\\(/\\([0-9]+\\)\\)?" - address)) - (error "Can't parse %s" address) - (gnus-group-read-ephemeral-group - (match-string 4 address) - `(nntp ,(match-string 1 address) - (nntp-address ,(match-string 1 address)) - (nntp-port-number ,(if (match-end 3) - (match-string 3 address) - "nntp"))) - nil nil nil - (and (match-end 6) (list (string-to-int (match-string 6 address)))))))) - -(defun gnus-url-parse-query-string (query &optional downcase) - (let (retval pairs cur key val) - (setq pairs (split-string query "&")) - (while pairs - (setq cur (car pairs) - pairs (cdr pairs)) - (if (not (string-match "=" cur)) - nil ; Grace - (setq key (gnus-url-unhex-string (substring cur 0 (match-beginning 0))) - val (gnus-url-unhex-string (substring cur (match-end 0) nil))) - (if downcase - (setq key (downcase key))) - (setq cur (assoc key retval)) - (if cur - (setcdr cur (cons val (cdr cur))) - (setq retval (cons (list key val) retval))))) - retval)) - -(defun gnus-url-unhex (x) - (if (> x ?9) - (if (>= x ?a) - (+ 10 (- x ?a)) - (+ 10 (- x ?A))) - (- x ?0))) - -(defun gnus-url-unhex-string (str &optional allow-newlines) - "Remove %XXX embedded spaces, etc in a url. -If optional second argument ALLOW-NEWLINES is non-nil, then allow the -decoding of carriage returns and line feeds in the string, which is normally -forbidden in URL encoding." - (setq str (or (nnheader-replace-chars-in-string str ?+ ? ) "")) - (let ((tmp "") - (case-fold-search t)) - (while (string-match "%[0-9a-f][0-9a-f]" str) - (let* ((start (match-beginning 0)) - (ch1 (gnus-url-unhex (elt str (+ start 1)))) - (code (+ (* 16 ch1) - (gnus-url-unhex (elt str (+ start 2)))))) - (setq tmp (concat - tmp (substring str 0 start) - (cond - (allow-newlines - (char-to-string code)) - ((or (= code ?\n) (= code ?\r)) - " ") - (t (char-to-string code)))) - str (substring str (match-end 0))))) - (setq tmp (concat tmp str)) - tmp)) - -(defun gnus-url-mailto (url) - ;; Send mail to someone - (when (string-match "mailto:/*\\(.*\\)" url) - (setq url (substring url (match-beginning 1) nil))) - (let (to args subject func) - (if (string-match (regexp-quote "?") url) - (setq to (gnus-url-unhex-string (substring url 0 (match-beginning 0))) - args (gnus-url-parse-query-string - (substring url (match-end 0) nil) t)) - (setq to (gnus-url-unhex-string url))) - (setq args (cons (list "to" to) args) - subject (cdr-safe (assoc "subject" args))) - (gnus-msg-mail) - (while args - (setq func (intern-soft (concat "message-goto-" (downcase (caar args))))) - (if (fboundp func) - (funcall func) - (message-position-on-field (caar args))) - (insert (mapconcat 'identity (cdar args) ", ")) - (setq args (cdr args))) - (if subject - (message-goto-body) - (message-goto-subject)))) - -(defun gnus-button-embedded-url (address) - "Activate ADDRESS with `browse-url'." - (browse-url (gnus-strip-whitespace address))) - -(eval-when-compile - ;; Silence the byte-compiler. - (autoload 'smiley-toggle-buffer "gnus-bitmap")) -(defun gnus-article-smiley-display () - "Display \"smileys\" as small graphical icons." - (smiley-toggle-buffer 1 (current-buffer) (point-min) (point-max))) - -;;; Next/prev buttons in the article buffer. - -(defvar gnus-next-page-line-format "%{%(Next page...%)%}\n") -(defvar gnus-prev-page-line-format "%{%(Previous page...%)%}\n") - -(defvar gnus-prev-page-map nil) -(unless gnus-prev-page-map - (setq gnus-prev-page-map (make-sparse-keymap)) - (define-key gnus-prev-page-map gnus-mouse-2 'gnus-button-prev-page) - (define-key gnus-prev-page-map "\r" 'gnus-button-prev-page)) - -(static-if (featurep 'xemacs) - (defun gnus-insert-prev-page-button () - (let ((buffer-read-only nil)) - (gnus-eval-format - gnus-prev-page-line-format nil - `(gnus-prev t local-map ,gnus-prev-page-map - gnus-callback gnus-article-button-prev-page - article-type annotation)))) - (defun gnus-insert-prev-page-button () - (let ((buffer-read-only nil) - (situation (get-text-property (point-min) 'mime-view-situation))) - (set-keymap-parent gnus-prev-page-map (current-local-map)) - (gnus-eval-format - gnus-prev-page-line-format nil - `(gnus-prev t local-map ,gnus-prev-page-map - gnus-callback gnus-article-button-prev-page - article-type annotation - mime-view-situation ,situation)))) - ) - -(defvar gnus-next-page-map nil) -(unless gnus-next-page-map - (setq gnus-next-page-map (make-sparse-keymap)) - (define-key gnus-next-page-map gnus-mouse-2 'gnus-button-next-page) - (define-key gnus-next-page-map "\r" 'gnus-button-next-page)) - -(defun gnus-button-next-page () - "Go to the next page." - (interactive) - (let ((win (selected-window))) - (select-window (get-buffer-window gnus-article-buffer t)) - (gnus-article-next-page) - (select-window win))) - -(defun gnus-button-prev-page () - "Go to the prev page." - (interactive) - (let ((win (selected-window))) - (select-window (get-buffer-window gnus-article-buffer t)) - (gnus-article-prev-page) - (select-window win))) - -(static-if (featurep 'xemacs) - (defun gnus-insert-next-page-button () - (let ((buffer-read-only nil)) - (gnus-eval-format gnus-next-page-line-format nil - `(gnus-next - t local-map ,gnus-next-page-map - gnus-callback gnus-article-button-next-page - article-type annotation)))) - (defun gnus-insert-next-page-button () - (let ((buffer-read-only nil) - (situation (get-text-property (point-min) 'mime-view-situation))) - (set-keymap-parent gnus-next-page-map (current-local-map)) - (gnus-eval-format gnus-next-page-line-format nil - `(gnus-next - t local-map ,gnus-next-page-map - gnus-callback gnus-article-button-next-page - article-type annotation - mime-view-situation ,situation)))) - ) - -(defun gnus-article-button-next-page (arg) - "Go to the next page." - (interactive "P") - (let ((win (selected-window))) - (select-window (get-buffer-window gnus-article-buffer t)) - (gnus-article-next-page) - (select-window win))) - -(defun gnus-article-button-prev-page (arg) - "Go to the prev page." - (interactive "P") - (let ((win (selected-window))) - (select-window (get-buffer-window gnus-article-buffer t)) - (gnus-article-prev-page) - (select-window win))) - -(defvar gnus-decode-header-methods - '(mail-decode-encoded-word-region) - "List of methods used to decode headers. - -This variable is a list of FUNCTION or (REGEXP . FUNCTION). If item -is FUNCTION, FUNCTION will be apply to all newsgroups. If item is a -(REGEXP . FUNCTION), FUNCTION will be only apply to thes newsgroups -whose names match REGEXP. - -For example: -((\"chinese\" . gnus-decode-encoded-word-region-by-guess) - mail-decode-encoded-word-region - (\"chinese\" . rfc1843-decode-region)) -") - -(defvar gnus-decode-header-methods-cache nil) - -(defun gnus-multi-decode-header (start end) - "Apply the functions from `gnus-encoded-word-methods' that match." - (unless (and gnus-decode-header-methods-cache - (eq gnus-newsgroup-name - (car gnus-decode-header-methods-cache))) - (setq gnus-decode-header-methods-cache (list gnus-newsgroup-name)) - (mapcar (lambda (x) - (if (symbolp x) - (nconc gnus-decode-header-methods-cache (list x)) - (if (and gnus-newsgroup-name - (string-match (car x) gnus-newsgroup-name)) - (nconc gnus-decode-header-methods-cache - (list (cdr x)))))) - gnus-decode-header-methods)) - (let ((xlist gnus-decode-header-methods-cache)) - (pop xlist) - (save-restriction - (narrow-to-region start end) - (while xlist - (funcall (pop xlist) (point-min) (point-max)))))) - -;;; -;;; Treatment top-level handling. -;;; - -(defun gnus-treat-article (condition &optional part-number total-parts type) - (let ((length (- (point-max) (point-min))) - (alist gnus-treatment-function-alist) - (article-goto-body-goes-to-point-min-p t) - (treated-type - (or (not type) - (catch 'found - (let ((list gnus-article-treat-types)) - (while list - (when (string-match (pop list) type) - (throw 'found t))))))) - (highlightp (gnus-visual-p 'article-highlight 'highlight)) - (entity (static-unless (featurep 'xemacs) - (when (eq 'head condition) - (get-text-property (point-min) 'mime-view-entity)))) - val elem buttonized) - (gnus-run-hooks 'gnus-part-display-hook) - (unless gnus-inhibit-treatment - (while (setq elem (pop alist)) - (setq val - (save-excursion - (if (gnus-buffer-live-p gnus-summary-buffer) - (set-buffer gnus-summary-buffer)) - (symbol-value (car elem)))) - (when (and (or (consp val) - treated-type) - (gnus-treat-predicate val) - (or (not (get (car elem) 'highlight)) - highlightp)) - (when (and (not buttonized) - (memq (car elem) - '(gnus-treat-hide-signature - gnus-treat-highlight-signature))) - (gnus-article-buttonize-signature) - (setq buttonized t)) - (save-restriction - (funcall (cadr elem))))) - ;; FSF Emacsen does not inherit the existing text properties - ;; in the new text, so we should do it for `mime-view-entity'. - (static-unless (featurep 'xemacs) - (when entity - (put-text-property (point-min) (point-max) - 'mime-view-entity entity)))))) - -;; Dynamic variables. -(eval-when-compile - (defvar part-number) - (defvar total-parts) - (defvar type) - (defvar condition) - (defvar length)) - -(defun gnus-treat-predicate (val) - (cond - ((null val) - nil) - ((and (listp val) - (stringp (car val))) - (apply 'gnus-or (mapcar `(lambda (s) - (string-match s ,(or gnus-newsgroup-name ""))) - val))) - ((listp val) - (let ((pred (pop val))) - (cond - ((eq pred 'or) - (apply 'gnus-or (mapcar 'gnus-treat-predicate val))) - ((eq pred 'and) - (apply 'gnus-and (mapcar 'gnus-treat-predicate val))) - ((eq pred 'not) - (not (gnus-treat-predicate (car val)))) - ((eq pred 'typep) - (equal (car val) type)) - (t - (error "%S is not a valid predicate" pred))))) - ((eq val 'mime) - gnus-show-mime) - (condition - (eq condition val)) - ((eq val t) - t) - ((eq val 'head) - nil) - ((eq val 'last) - (eq part-number total-parts)) - ((numberp val) - (< length val)) - (t - (error "%S is not a valid value" val)))) - -(defun gnus-article-encrypt-body (protocol &optional n) - "Encrypt the article body." - (interactive - (list - (or gnus-article-encrypt-protocol - (completing-read "Encrypt protocol: " - gnus-article-encrypt-protocol-alist - nil t)) - current-prefix-arg)) - (let ((func (cdr (assoc protocol gnus-article-encrypt-protocol-alist)))) - (unless func - (error (format "Can't find the encrypt protocol %s" protocol))) - (if (equal gnus-newsgroup-name "nndraft:drafts") - (error "Can't encrypt the article in group nndraft:drafts")) - (if (equal gnus-newsgroup-name "nndraft:queue") - (error "Don't encrypt the article in group nndraft:queue")) - (gnus-summary-iterate n - (save-excursion - (set-buffer gnus-summary-buffer) - (let ((mail-parse-charset gnus-newsgroup-charset) - (mail-parse-ignored-charsets gnus-newsgroup-ignored-charsets) - (summary-buffer gnus-summary-buffer) - references point) - (gnus-set-global-variables) - (when (gnus-group-read-only-p) - (error "The current newsgroup does not support article encrypt")) - (gnus-summary-show-article t) - (setq references - (or (mail-header-references gnus-current-headers) "")) - (set-buffer gnus-article-buffer) - (let* ((buffer-read-only nil) - (headers - (mapcar (lambda (field) - (and (save-restriction - (message-narrow-to-head) - (goto-char (point-min)) - (search-forward field nil t)) - (prog2 - (message-narrow-to-field) - (buffer-substring (point-min) (point-max)) - (delete-region (point-min) (point-max)) - (widen)))) - '("Content-Type:" "Content-Transfer-Encoding:" - "Content-Disposition:")))) - (message-narrow-to-head) - (message-remove-header "MIME-Version") - (goto-char (point-max)) - (setq point (point)) - (insert (apply 'concat headers)) - (widen) - (narrow-to-region point (point-max)) - (let ((message-options message-options)) - (message-options-set 'message-sender user-mail-address) - (message-options-set 'message-recipients user-mail-address) - (message-options-set 'message-sign-encrypt 'not) - (funcall func)) - (goto-char (point-min)) - (insert "MIME-Version: 1.0\n") - (widen) - (gnus-summary-edit-article-done - references nil summary-buffer t)) - (when gnus-keep-backlog - (gnus-backlog-remove-article - (car gnus-article-current) (cdr gnus-article-current))) - (save-excursion - (when (get-buffer gnus-original-article-buffer) - (set-buffer gnus-original-article-buffer) - (setq gnus-original-article nil))) - (when gnus-use-cache - (gnus-cache-update-article - (car gnus-article-current) (cdr gnus-article-current)))))))) - -(defvar gnus-mime-security-button-line-format "%{%([[%t:%i]%D]%)%}\n" - "The following specs can be used: -%t The security MIME type -%i Additional info -%d Details -%D Details if button is pressed") - -(defvar gnus-mime-security-button-end-line-format "%{%([[End of %t]%D]%)%}\n" - "The following specs can be used: -%t The security MIME type -%i Additional info -%d Details -%D Details if button is pressed") - -(defvar gnus-mime-security-button-line-format-alist - '((?t gnus-tmp-type ?s) - (?i gnus-tmp-info ?s) - (?d gnus-tmp-details ?s) - (?D gnus-tmp-pressed-details ?s))) - -(defvar gnus-mime-security-button-map - (let ((map (make-sparse-keymap))) - (unless (>= (string-to-number emacs-version) 21) - (set-keymap-parent map gnus-article-mode-map)) - (define-key map gnus-mouse-2 'gnus-article-push-button) - (define-key map "\r" 'gnus-article-press-button) - map)) - -(defvar gnus-mime-security-details-buffer nil) - -(defvar gnus-mime-security-button-pressed nil) - -(defvar gnus-mime-security-show-details-inline t - "If non-nil, show details in the article buffer.") - -(defun gnus-mime-security-verify-or-decrypt (handle) - (mm-remove-parts (cdr handle)) - (let ((region (mm-handle-multipart-ctl-parameter handle 'gnus-region)) - point buffer-read-only) - (if region - (goto-char (car region))) - (save-restriction - (narrow-to-region (point) (point)) - (with-current-buffer (mm-handle-multipart-original-buffer handle) - (let* ((mm-verify-option 'known) - (mm-decrypt-option 'known) - (nparts (mm-possibly-verify-or-decrypt (cdr handle) handle))) - (unless (eq nparts (cdr handle)) - (mm-destroy-parts (cdr handle)) - (setcdr handle nparts)))) - (setq point (point)) - (gnus-mime-display-security handle) - (goto-char (point-max))) - (when region - (delete-region (point) (cdr region)) - (set-marker (car region) nil) - (set-marker (cdr region) nil)) - (goto-char point))) - -(defun gnus-mime-security-show-details (handle) - (let ((details (mm-handle-multipart-ctl-parameter handle 'gnus-details))) - (if details - (if gnus-mime-security-show-details-inline - (let ((gnus-mime-security-button-pressed t) - (gnus-mime-security-button-line-format - (get-text-property (point) 'gnus-line-format)) - buffer-read-only) - (forward-char -1) - (while (eq (get-text-property (point) 'gnus-line-format) - gnus-mime-security-button-line-format) - (forward-char -1)) - (forward-char) - (save-restriction - (narrow-to-region (point) (point)) - (gnus-insert-mime-security-button handle)) - (delete-region (point) - (or (text-property-not-all - (point) (point-max) - 'gnus-line-format - gnus-mime-security-button-line-format) - (point-max)))) - (if (gnus-buffer-live-p gnus-mime-security-details-buffer) - (with-current-buffer gnus-mime-security-details-buffer - (erase-buffer) - t) - (setq gnus-mime-security-details-buffer - (gnus-get-buffer-create "*MIME Security Details*"))) - (with-current-buffer gnus-mime-security-details-buffer - (insert details) - (goto-char (point-min))) - (pop-to-buffer gnus-mime-security-details-buffer)) - (gnus-message 5 "No details.")))) - -(defun gnus-mime-security-press-button (handle) - (if (mm-handle-multipart-ctl-parameter handle 'gnus-info) - (gnus-mime-security-show-details handle) - (gnus-mime-security-verify-or-decrypt handle))) - -(defun gnus-insert-mime-security-button (handle &optional displayed) - (let* ((protocol (mm-handle-multipart-ctl-parameter handle 'protocol)) - (gnus-tmp-type - (concat - (or (nth 2 (assoc protocol mm-verify-function-alist)) - (nth 2 (assoc protocol mm-decrypt-function-alist)) - "Unknown") - (if (equal (car handle) "multipart/signed") - " Signed" " Encrypted") - " Part")) - (gnus-tmp-info - (or (mm-handle-multipart-ctl-parameter handle 'gnus-info) - "Undecided")) - (gnus-tmp-details - (mm-handle-multipart-ctl-parameter handle 'gnus-details)) - gnus-tmp-pressed-details - b e) - (setq gnus-tmp-details - (if gnus-tmp-details - (concat "\n" gnus-tmp-details) "")) - (setq gnus-tmp-pressed-details - (if gnus-mime-security-button-pressed gnus-tmp-details "")) - (unless (bolp) - (insert "\n")) - (setq b (point)) - (gnus-eval-format - gnus-mime-security-button-line-format - gnus-mime-security-button-line-format-alist - `(keymap ,gnus-mime-security-button-map - ,@(if (>= (string-to-number emacs-version) 21) - nil ;; XEmacs doesn't care - (list 'local-map gnus-mime-security-button-map)) - gnus-callback gnus-mime-security-press-button - gnus-line-format ,gnus-mime-security-button-line-format - article-type annotation - gnus-data ,handle)) - (setq e (point)) - (widget-convert-button - 'link b e - :mime-handle handle - :action 'gnus-widget-press-button - :button-keymap gnus-mime-security-button-map - :help-echo - (lambda (widget/window &optional overlay pos) - ;; Needed to properly clear the message due to a bug in - ;; wid-edit (XEmacs only). - (if (boundp 'help-echo-owns-message) - (setq help-echo-owns-message t)) - (format - "%S: show detail" - (aref gnus-mouse-2 0)))))) - -(defun gnus-mime-display-security (handle) - (save-restriction - (narrow-to-region (point) (point)) - (unless (gnus-unbuttonized-mime-type-p (car handle)) - (gnus-insert-mime-security-button handle)) - (gnus-mime-display-mixed (cdr handle)) - (unless (bolp) - (insert "\n")) - (unless (gnus-unbuttonized-mime-type-p (car handle)) - (let ((gnus-mime-security-button-line-format - gnus-mime-security-button-end-line-format)) - (gnus-insert-mime-security-button handle))) - (mm-set-handle-multipart-parameter - handle 'gnus-region - (cons (set-marker (make-marker) (point-min)) - (set-marker (make-marker) (point-max)))))) - - -;;; @ for mime-view -;;; - -(defun gnus-article-header-presentation-method (entity situation) - (mime-insert-header entity) - ) - -(set-alist 'mime-header-presentation-method-alist - 'gnus-original-article-mode - #'gnus-article-header-presentation-method) - -(defun gnus-mime-preview-quitting-method () - (mime-preview-kill-buffer) - (delete-other-windows) - (gnus-article-show-summary) - (gnus-summary-select-article gnus-show-all-headers t)) - -(set-alist 'mime-preview-quitting-method-alist - 'gnus-original-article-mode #'gnus-mime-preview-quitting-method) - -(set-alist 'mime-preview-following-method-alist - 'gnus-original-article-mode #'gnus-following-method) - -(set-alist 'mime-preview-over-to-previous-method-alist - 'gnus-original-article-mode - (lambda () - (if (> (point-min) 1) - (gnus-article-prev-page) - (gnus-article-read-summary-keys - nil (gnus-character-to-event ?P))))) - -(set-alist 'mime-preview-over-to-next-method-alist - 'gnus-original-article-mode' - (lambda () - (if (< (point-max) (buffer-size)) - (gnus-article-next-page) - (gnus-article-read-summary-keys - nil (gnus-character-to-event ?N))))) - - -;;; @ end -;;; - -(gnus-ems-redefine) - -(provide 'gnus-art) - -(run-hooks 'gnus-art-load-hook) - -;;; gnus-art.el ends here diff --git a/lisp/gnus-async.el b/lisp/gnus-async.el deleted file mode 100644 index e661658..0000000 --- a/lisp/gnus-async.el +++ /dev/null @@ -1,375 +0,0 @@ -;;; gnus-async.el --- asynchronous support for Gnus -;; Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) - -(require 'gnus) -(require 'gnus-sum) -(require 'nntp) - -(defgroup gnus-asynchronous nil - "Support for asynchronous operations." - :group 'gnus) - -(defcustom gnus-asynchronous nil - "*If nil, inhibit all Gnus asynchronicity. -If non-nil, let the other asynch variables be heeded." - :group 'gnus-asynchronous - :type 'boolean) - -(defcustom gnus-use-article-prefetch 30 - "*If non-nil, prefetch articles in groups that allow this. -If a number, prefetch only that many articles forward; -if t, prefetch as many articles as possible." - :group 'gnus-asynchronous - :type '(choice (const :tag "off" nil) - (const :tag "all" t) - (integer :tag "some" 0))) - -(defcustom gnus-prefetched-article-deletion-strategy '(read exit) - "List of symbols that say when to remove articles from the prefetch buffer. -Possible values in this list are `read', which means that -articles are removed as they are read, and `exit', which means -that all articles belonging to a group are removed on exit -from that group." - :group 'gnus-asynchronous - :type '(set (const read) (const exit))) - -(defcustom gnus-use-header-prefetch nil - "*If non-nil, prefetch the headers to the next group." - :group 'gnus-asynchronous - :type 'boolean) - -(defcustom gnus-async-prefetch-article-p 'gnus-async-unread-p - "Function called to say whether an article should be prefetched or not. -The function is called with one parameter -- the article data. -It should return non-nil if the article is to be prefetched." - :group 'gnus-asynchronous - :type 'function) - -;;; Internal variables. - -(defvar gnus-async-prefetch-article-buffer " *Async Prefetch Article*") -(defvar gnus-async-article-alist nil) -(defvar gnus-async-article-semaphore '(nil)) -(defvar gnus-async-fetch-list nil) -(defvar gnus-async-hashtb nil) -(defvar gnus-async-current-prefetch-group nil) -(defvar gnus-async-current-prefetch-article nil) -(defvar gnus-async-timer nil) - -(defvar gnus-async-prefetch-headers-buffer " *Async Prefetch Headers*") -(defvar gnus-async-header-prefetched nil) - -;;; Utility functions. - -(defun gnus-group-asynchronous-p (group) - "Say whether GROUP is fetched from a server that supports asynchronicity." - (gnus-asynchronous-p (gnus-find-method-for-group group))) - -;;; Somewhat bogus semaphores. - -(defun gnus-async-get-semaphore (semaphore) - "Wait until SEMAPHORE is released." - (while (/= (length (nconc (symbol-value semaphore) (list nil))) 2) - (sleep-for 1))) - -(defun gnus-async-release-semaphore (semaphore) - "Release SEMAPHORE." - (setcdr (symbol-value semaphore) nil)) - -(defmacro gnus-async-with-semaphore (&rest forms) - `(unwind-protect - (progn - (gnus-async-get-semaphore 'gnus-async-article-semaphore) - ,@forms) - (gnus-async-release-semaphore 'gnus-async-article-semaphore))) - -(put 'gnus-async-with-semaphore 'lisp-indent-function 0) -(put 'gnus-async-with-semaphore 'edebug-form-spec '(body)) - -;;; -;;; Article prefetch -;;; - -(gnus-add-shutdown 'gnus-async-close 'gnus) -(defun gnus-async-close () - (gnus-kill-buffer gnus-async-prefetch-article-buffer) - (gnus-kill-buffer gnus-async-prefetch-headers-buffer) - (setq gnus-async-hashtb nil - gnus-async-article-alist nil - gnus-async-header-prefetched nil)) - -(defun gnus-async-set-buffer () - (nnheader-set-temp-buffer gnus-async-prefetch-article-buffer t) - (unless gnus-async-hashtb - (setq gnus-async-hashtb (gnus-make-hashtable 1023)))) - -(defun gnus-async-halt-prefetch () - "Stop prefetching." - (setq gnus-async-fetch-list nil)) - -(defun gnus-async-prefetch-next (group article summary) - "Possibly prefetch several articles starting with the article after ARTICLE." - (when (and (gnus-buffer-live-p summary) - gnus-asynchronous - (gnus-group-asynchronous-p group)) - (save-excursion - (set-buffer gnus-summary-buffer) - (let ((next (caadr (gnus-data-find-list article)))) - (when next - (if (not (fboundp 'run-with-idle-timer)) - ;; This is either an older Emacs or XEmacs, so we - ;; do this, which leads to slightly slower article - ;; buffer display. - (gnus-async-prefetch-article group next summary) - (when gnus-async-timer - (ignore-errors - (nnheader-cancel-timer 'gnus-async-timer))) - (setq gnus-async-timer - (run-with-idle-timer - 0.1 nil 'gnus-async-prefetch-article - group next summary)))))))) - -(defun gnus-async-prefetch-article (group article summary &optional next) - "Possibly prefetch several articles starting with ARTICLE." - (if (not (gnus-buffer-live-p summary)) - (gnus-async-with-semaphore - (setq gnus-async-fetch-list nil)) - (when (and gnus-asynchronous - (gnus-alive-p)) - (when next - (gnus-async-with-semaphore - (pop gnus-async-fetch-list))) - (let ((do-fetch next) - (do-message t)) ;(eq major-mode 'gnus-summary-mode))) - (when (and (gnus-group-asynchronous-p group) - (gnus-buffer-live-p summary) - (or (not next) - gnus-async-fetch-list)) - (gnus-async-with-semaphore - (unless next - (setq do-fetch (not gnus-async-fetch-list)) - ;; Nix out any outstanding requests. - (setq gnus-async-fetch-list nil) - ;; Fill in the new list. - (let ((n gnus-use-article-prefetch) - (data (gnus-data-find-list article)) - d) - (while (and (setq d (pop data)) - (if (numberp n) - (natnump (decf n)) - n)) - (unless (or (gnus-async-prefetched-article-entry - group (setq article (gnus-data-number d))) - (not (natnump article)) - (not (funcall gnus-async-prefetch-article-p d))) - ;; Not already fetched -- so we add it to the list. - (push article gnus-async-fetch-list))) - (setq gnus-async-fetch-list - (nreverse gnus-async-fetch-list)))) - - (when do-fetch - (setq article (car gnus-async-fetch-list)))) - - (when (and do-fetch article) - ;; We want to fetch some more articles. - (save-excursion - (set-buffer summary) - (let (mark) - (gnus-async-set-buffer) - (goto-char (point-max)) - (setq mark (point-marker)) - (let ((nnheader-callback-function - (gnus-make-async-article-function - group article mark summary next)) - (nntp-server-buffer - (get-buffer gnus-async-prefetch-article-buffer))) - (when do-message - (gnus-message 9 "Prefetching article %d in group %s" - article group)) - (setq gnus-async-current-prefetch-group group) - (setq gnus-async-current-prefetch-article article) - (gnus-request-article article group)))))))))) - -(defun gnus-make-async-article-function (group article mark summary next) - "Return a callback function." - `(lambda (arg) - (gnus-async-article-callback arg ,group ,article ,mark ,summary ,next))) - -(defun gnus-async-article-callback (arg group article mark summary next) - "Function called when an async article is done being fetched." - (save-excursion - (setq gnus-async-current-prefetch-article nil) - (when arg - (gnus-async-set-buffer) - (gnus-async-with-semaphore - (setq - gnus-async-article-alist - (cons (list (intern (format "%s-%d" group article) - gnus-async-hashtb) - mark (set-marker (make-marker) (point-max)) - group article) - gnus-async-article-alist)))) - (if (not (gnus-buffer-live-p summary)) - (gnus-async-with-semaphore - (setq gnus-async-fetch-list nil)) - (gnus-async-prefetch-article group next summary t)))) - -(defun gnus-async-unread-p (data) - "Return non-nil if DATA represents an unread article." - (gnus-data-unread-p data)) - -(defun gnus-async-request-fetched-article (group article buffer) - "See whether we have ARTICLE from GROUP and put it in BUFFER." - (when (numberp article) - (when (and (equal group gnus-async-current-prefetch-group) - (eq article gnus-async-current-prefetch-article)) - (gnus-async-wait-for-article article)) - (let ((entry (gnus-async-prefetched-article-entry group article))) - (when entry - (save-excursion - (gnus-async-set-buffer) - (copy-to-buffer buffer (cadr entry) (caddr entry)) - ;; Remove the read article from the prefetch buffer. - (when (memq 'read gnus-prefetched-article-deletion-strategy) - (gnus-async-delete-prefetched-entry entry)) - t))))) - -(defun gnus-async-wait-for-article (article) - "Wait until ARTICLE is no longer the currently-being-fetched article." - (save-excursion - (gnus-async-set-buffer) - (let ((proc (nntp-find-connection (current-buffer))) - (nntp-server-buffer (current-buffer)) - (nntp-have-messaged nil) - (tries 0)) - (condition-case nil - ;; FIXME: we could stop waiting after some - ;; timeout, but this is the wrong place to do it. - ;; rather than checking time-spent-waiting, we - ;; should check time-since-last-output, which - ;; needs to be done in nntp.el. - (while (eq article gnus-async-current-prefetch-article) - (incf tries) - (when (nntp-accept-process-output proc 1) - (setq tries 0)) - (when (and (not nntp-have-messaged) (eq 3 tries)) - (gnus-message 5 "Waiting for async article...") - (setq nntp-have-messaged t))) - (quit - ;; if the user interrupted on a slow/hung connection, - ;; do something friendly. - (when (< 3 tries) - (setq gnus-async-current-prefetch-article nil)) - (signal 'quit nil))) - (when nntp-have-messaged - (gnus-message 5 ""))))) - -(defun gnus-async-delete-prefetched-entry (entry) - "Delete ENTRY from buffer and alist." - (ignore-errors - (delete-region (cadr entry) (caddr entry)) - (set-marker (cadr entry) nil) - (set-marker (caddr entry) nil)) - (gnus-async-with-semaphore - (setq gnus-async-article-alist - (delq entry gnus-async-article-alist)))) - -(defun gnus-async-prefetch-remove-group (group) - "Remove all articles belonging to GROUP from the prefetch buffer." - (when (and (gnus-group-asynchronous-p group) - (memq 'exit gnus-prefetched-article-deletion-strategy)) - (let ((alist gnus-async-article-alist)) - (save-excursion - (gnus-async-set-buffer) - (while alist - (when (equal group (nth 3 (car alist))) - (gnus-async-delete-prefetched-entry (car alist))) - (pop alist)))))) - -(defun gnus-async-prefetched-article-entry (group article) - "Return the entry for ARTICLE in GROUP iff it has been prefetched." - (let ((entry (save-excursion - (gnus-async-set-buffer) - (assq (intern (format "%s-%d" group article) - gnus-async-hashtb) - gnus-async-article-alist)))) - ;; Perhaps something has emptied the buffer? - (if (and entry - (= (cadr entry) (caddr entry))) - (progn - (ignore-errors - (set-marker (cadr entry) nil) - (set-marker (caddr entry) nil)) - (setq gnus-async-article-alist - (delq entry gnus-async-article-alist)) - nil) - entry))) - -;;; -;;; Header prefetch -;;; - -(defun gnus-async-prefetch-headers (group) - "Prefetch the headers for group GROUP." - (save-excursion - (let (unread) - (when (and gnus-use-header-prefetch - gnus-asynchronous - (gnus-group-asynchronous-p group) - (listp gnus-async-header-prefetched) - (setq unread (gnus-list-of-unread-articles group))) - ;; Mark that a fetch is in progress. - (setq gnus-async-header-prefetched t) - (nnheader-set-temp-buffer gnus-async-prefetch-headers-buffer t) - (erase-buffer) - (let ((nntp-server-buffer (current-buffer)) - (nnheader-callback-function - `(lambda (arg) - (setq gnus-async-header-prefetched - ,(cons group unread))))) - (gnus-retrieve-headers unread group gnus-fetch-old-headers)))))) - -(defun gnus-async-retrieve-fetched-headers (articles group) - "See whether we have prefetched headers." - (when (and gnus-use-header-prefetch - (gnus-group-asynchronous-p group) - (listp gnus-async-header-prefetched) - (equal group (car gnus-async-header-prefetched)) - (equal articles (cdr gnus-async-header-prefetched))) - (save-excursion - (nnheader-set-temp-buffer gnus-async-prefetch-headers-buffer t) - (nntp-decode-text) - (copy-to-buffer nntp-server-buffer (point-min) (point-max)) - (erase-buffer) - (setq gnus-async-header-prefetched nil) - t))) - -(provide 'gnus-async) - -;;; gnus-async.el ends here diff --git a/lisp/gnus-audio.el b/lisp/gnus-audio.el deleted file mode 100644 index daa5cf4..0000000 --- a/lisp/gnus-audio.el +++ /dev/null @@ -1,149 +0,0 @@ -;;; gnus-audio.el --- Sound effects for Gnus -;; Copyright (C) 1996, 2000 Free Software Foundation - -;; Author: Steven L. Baur -;; Keywords: news, mail, multimedia - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;; This file provides access to sound effects in Gnus. -;; This file is partially stripped to support earcons.el. - -;;; Code: - -(require 'nnheader) - -(defgroup gnus-audio nil - "Playing sound in Gnus." - :version "21.1" - :group 'gnus-visual - :group 'multimedia) - -(defvar gnus-audio-inline-sound - (or (if (fboundp 'device-sound-enabled-p) - (device-sound-enabled-p)) ; XEmacs - (fboundp 'play-sound)) ; Emacs 21 - "Non-nil means try to play sounds without using an external program.") - -(defcustom gnus-audio-directory (nnheader-find-etc-directory "sounds") - "The directory containing the Sound Files." - :type '(choice directory (const nil)) - :group 'gnus-audio) - -(defcustom gnus-audio-au-player "/usr/bin/showaudio" - "Executable program for playing sun AU format sound files." - :group 'gnus-audio - :type 'string) - -(defcustom gnus-audio-wav-player "/usr/local/bin/play" - "Executable program for playing WAV files." - :group 'gnus-audio - :type 'string) - -;;; The following isn't implemented yet. Wait for Millennium Gnus. -;;(defvar gnus-audio-effects-enabled t -;; "When t, Gnus will use sound effects.") -;;(defvar gnus-audio-enable-hooks nil -;; "Functions run when enabling sound effects.") -;;(defvar gnus-audio-disable-hooks nil -;; "Functions run when disabling sound effects.") -;;(defvar gnus-audio-theme-song nil -;; "Theme song for Gnus.") -;;(defvar gnus-audio-enter-group nil -;; "Sound effect played when selecting a group.") -;;(defvar gnus-audio-exit-group nil -;; "Sound effect played when exiting a group.") -;;(defvar gnus-audio-score-group nil -;; "Sound effect played when scoring a group.") -;;(defvar gnus-audio-busy-sound nil -;; "Sound effect played when going into a ... sequence.") - - -;;;###autoload -;;(defun gnus-audio-enable-sound () -;; "Enable Sound Effects for Gnus." -;; (interactive) -;; (setq gnus-audio-effects-enabled t) -;; (gnus-run-hooks gnus-audio-enable-hooks)) - -;;;###autoload - ;(defun gnus-audio-disable-sound () -;; "Disable Sound Effects for Gnus." -;; (interactive) -;; (setq gnus-audio-effects-enabled nil) -;; (gnus-run-hooks gnus-audio-disable-hooks)) - -;;;###autoload -(defun gnus-audio-play (file) - "Play a sound FILE through the speaker." - (interactive) - (let ((sound-file (if (file-exists-p file) - file - (expand-file-name file gnus-audio-directory)))) - (when (file-exists-p sound-file) - (cond ((and gnus-audio-inline-sound - (condition-case nil - ;; Even if we have audio, we may fail with the - ;; wrong sort of sound file. - (progn (play-sound-file sound-file) - t) - (error nil)))) - ;; If we don't have built-in sound, or playing it failed, - ;; try with external program. - ((equal "wav" (file-name-extension sound-file)) - (call-process gnus-audio-wav-player - sound-file - 0 - nil - sound-file)) - ((equal "au" (file-name-extension sound-file)) - (call-process gnus-audio-au-player - sound-file - 0 - nil - sound-file)))))) - - -;;; The following isn't implemented yet, wait for Red Gnus -;;(defun gnus-audio-startrek-sounds () -;; "Enable sounds from Star Trek the original series." -;; (interactive) -;; (setq gnus-audio-busy-sound "working.au") -;; (setq gnus-audio-enter-group "bulkhead_door.au") -;; (setq gnus-audio-exit-group "bulkhead_door.au") -;; (setq gnus-audio-score-group "ST_laser.au") -;; (setq gnus-audio-theme-song "startrek.au") -;; (add-hook 'gnus-select-group-hook 'gnus-audio-startrek-select-group) -;; (add-hook 'gnus-exit-group-hook 'gnus-audio-startrek-exit-group)) -;;;*** - -(defvar gnus-startup-jingle "Tuxedomoon.Jingle4.au" - "Name of the Gnus startup jingle file.") - -(defun gnus-play-jingle () - "Play the Gnus startup jingle, unless that's inhibited." - (interactive) - (gnus-audio-play gnus-startup-jingle)) - -(provide 'gnus-audio) - -(run-hooks 'gnus-audio-load-hook) - -;;; gnus-audio.el ends here diff --git a/lisp/gnus-bbdb.el b/lisp/gnus-bbdb.el deleted file mode 100644 index 1bd2cdc..0000000 --- a/lisp/gnus-bbdb.el +++ /dev/null @@ -1,651 +0,0 @@ -;; gnus-bbdb.el --- Interface to T-gnus - -;; Copyright (c) 1991,1992,1993 Jamie Zawinski . -;; Copyright (C) 1995,1996,1997 Shuhei KOBAYASHI -;; Copyright (C) 1997,1998 MORIOKA Tomohiko -;; Copyright (C) 1998,1999 Keiichi Suzuki - -;; Author: Keiichi Suzuki -;; Author: Shuhei KOBAYASHI -;; Keywords: BBDB, MIME, multimedia, multilingual, mail, news - -;; This file is part of T-gnus. - -;; This program 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 program 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. - -;;; Code: - -(require 'bbdb) -(require 'bbdb-com) -(require 'gnus) -(require 'std11) -(eval-when-compile - (defvar bbdb-pop-up-elided-display) ; default unbound. - (require 'gnus-win) - (require 'cl)) - -(defvar gnus-bbdb/decode-field-body-function 'nnheader-decode-field-body - "*Field body decoder.") - -(defmacro gnus-bbdb/decode-field-body (field-body field-name) - `(or (and (functionp gnus-bbdb/decode-field-body-function) - (funcall gnus-bbdb/decode-field-body-function - ,field-body ,field-name)) - ,field-body)) - -;;;###autoload -(defun gnus-bbdb/update-record (&optional offer-to-create) - "returns the record corresponding to the current GNUS message, creating -or modifying it as necessary. A record will be created if -bbdb/news-auto-create-p is non-nil, or if OFFER-TO-CREATE is true and -the user confirms the creation." - (if bbdb-use-pop-up - (gnus-bbdb/pop-up-bbdb-buffer offer-to-create) - (let ((from (mime-entity-fetch-field gnus-current-headers "from"))) - (when from - (setq from (gnus-bbdb/extract-address-components - (gnus-bbdb/decode-field-body from 'From)))) - (when (and (car (cdr from)) - (string-match (bbdb-user-mail-names) - (car (cdr from)))) - ;; if logged-in user sent this, use recipients. - (let ((to (mime-entity-fetch-field gnus-current-headers "to"))) - (when to - (setq from - (gnus-bbdb/extract-address-components - (gnus-bbdb/decode-field-body to 'To)))))) - (when from - (save-excursion - (bbdb-annotate-message-sender from t - (or (bbdb-invoke-hook-for-value - bbdb/news-auto-create-p) - offer-to-create) - offer-to-create)))))) - -;;;###autoload -(defun gnus-bbdb/annotate-sender (string &optional replace) - "Add a line to the end of the Notes field of the BBDB record -corresponding to the sender of this message. If REPLACE is non-nil, -replace the existing notes entry (if any)." - (interactive (list (if bbdb-readonly-p - (error "The Insidious Big Brother Database is read-only.") - (read-string "Comments: ")))) - (bbdb-annotate-notes (gnus-bbdb/update-record t) string 'notes replace)) - -(defun gnus-bbdb/edit-notes (&optional arg) - "Edit the notes field or (with a prefix arg) a user-defined field -of the BBDB record corresponding to the sender of this message." - (interactive "P") - (let ((record (or (gnus-bbdb/update-record t) (error "")))) - (bbdb-display-records (list record)) - (if arg - (bbdb-record-edit-property record nil t) - (bbdb-record-edit-notes record t)))) - -;;;###autoload -(defun gnus-bbdb/show-sender () - "Display the contents of the BBDB for the sender of this message. -This buffer will be in bbdb-mode, with associated keybindings." - (interactive) - (let ((record (gnus-bbdb/update-record t))) - (if record - (bbdb-display-records (list record)) - (error "unperson")))) - - -(defun gnus-bbdb/pop-up-bbdb-buffer (&optional offer-to-create) - "Make the *BBDB* buffer be displayed along with the GNUS windows, -displaying the record corresponding to the sender of the current message." - (let* ((bbdb-gag-messages t) - (bbdb-electric-p nil) - (record - (let (bbdb-use-pop-up) - (gnus-bbdb/update-record offer-to-create))) - (bbdb-elided-display (bbdb-pop-up-elided-display))) - (save-current-buffer - ;; display the bbdb buffer iff there is a record for this article. - (cond - (record - (bbdb-pop-up-bbdb-buffer - (lambda (w) - (with-current-buffer (window-buffer w) - (memq major-mode - '(mime-view-mode gnus-article-mode))))) - (bbdb-display-records (list record))) - ((and (not bbdb-inside-electric-display) - (get-buffer-window bbdb-buffer-name)) - (delete-other-windows) - (if (assq 'article gnus-buffer-configuration) - (gnus-configure-windows 'article) - (gnus-configure-windows 'SelectArticle)) - (let ((w (get-buffer-window gnus-summary-buffer))) - (if w (select-window w)))))) - record)) - -;;;###autoload -(defun gnus-bbdb/split-mail (header-field bbdb-field - &optional regexp group) - "Mail split method for `nnmail-split-fancy'. -HEADER-FIELD is a regexp or list of regexps as mail header field name -for gathering mail addresses. If HEADER-FIELD is a string, then it's -used for just matching pattern. If HEADER-FIELD is a list of strings, -then these strings have priorities in the order. - -BBDB-FIELD is field name of BBDB. -Optional argument REGEXP is regexp string for matching BBDB-FIELD value. -If REGEXP is nil or not specified, then all BBDB-FIELD value is matched. - -If GROUP is nil or not specified, then BBDB-FIELD value is returned as -group name. If GROUP is a symbol `&', then list of all matching group's -BBDB-FIELD values is returned. Otherwise, GROUP is returned." - (if (listp header-field) - (if (eq group '&) - (gnus-bbdb/split-mail (mapconcat 'identity header-field "\\|") - bbdb-field regexp group) - (let (rest) - (while (and header-field - (null (setq rest (gnus-bbdb/split-mail - (car header-field) bbdb-field - regexp group)))) - (setq header-field (cdr header-field))) - rest)) - (let ((pat (concat "^\\(" header-field "\\):[ \t]")) - header-values) - (goto-char (point-min)) - (while (re-search-forward pat nil t) - (setq header-values (cons (buffer-substring (point) - (std11-field-end)) - header-values))) - (let ((address-regexp - (with-temp-buffer - (let (lal) - (while header-values - (setq lal (std11-parse-addresses-string - (pop header-values))) - (while lal - (gnus-bbdb/insert-address-regexp (pop lal))))) - (buffer-string)))) - (unless (zerop (length address-regexp)) - (gnus-bbdb/split-mail-1 address-regexp bbdb-field regexp group)))))) - -(defun gnus-bbdb/insert-address-regexp (address) - "Insert string of address part from parsed ADDRESS of RFC 822." - (cond ((eq (car address) 'group) - (setq address (cdr address)) - (while address - (gnus-bbdb/insert-address-regexp (pop address)))) - ((eq (car address) 'mailbox) - (unless (eq (point) (point-min)) - (insert "\\|")) - (let ((addr (nth 1 address))) - (insert (std11-addr-to-string - (if (eq (car addr) 'phrase-route-addr) - (nth 2 addr) - (cdr addr)))))))) - -(defun gnus-bbdb/split-mail-1 (address-regexp bbdb-field regexp group) - (let ((records (bbdb-search (bbdb-records) nil nil address-regexp)) - prop rest) - (or regexp (setq regexp "")) - (catch 'done - (cond - ((eq group '&) - (while records - (when (and (setq prop (bbdb-record-getprop (car records) bbdb-field)) - (string-match regexp prop) - (not (member prop rest))) - (setq rest (cons prop rest))) - (setq records (cdr records))) - (throw 'done (when rest (cons '& rest)))) - (t - (while records - (when (or (null bbdb-field) - (and (setq prop (bbdb-record-getprop (car records) - bbdb-field)) - (string-match regexp prop))) - (throw 'done (or group prop))) - (setq records (cdr records)))))))) - -;; -;; Announcing BBDB entries in the summary buffer -;; - -(defcustom gnus-bbdb/lines-and-from-length 18 - "*The number of characters used to display From: info in Gnus, if you have -set gnus-optional-headers to 'gnus-bbdb/lines-and-from." - :group 'bbdb-mua-specific-gnus - :type 'integer) - -(defcustom gnus-bbdb/summary-mark-known-posters t - "*If t, mark messages created by people with records in the BBDB. -In GNUS, this marking will take place in the subject list (assuming -`gnus-optional-headers' contains `gnus-bbdb/lines-and-from'). In Gnus, the -marking will take place in the Summary buffer if the format code defined by -`gnus-bbdb/summary-user-format-letter' is used in `gnus-summary-line-format'. -This variable has no effect on the marking controlled by -`gnus-bbdb/summary-in-bbdb-format-letter'." - :group 'bbdb-mua-specific-gnus - :type '(choice (const :tag "Mark known posters" t) - (const :tag "Do not mark known posters" nil))) -(static-when (and (fboundp 'defvaralias) - (subrp (symbol-function 'defvaralias))) - (defvaralias 'gnus-bbdb/mark-known-posters - 'gnus-bbdb/summary-mark-known-posters)) - -(defcustom gnus-bbdb/summary-known-poster-mark "+" - "This is the default character to prefix author names with if -gnus-bbdb/summary-mark-known-posters is t. If the poster's record has -an entry in the field named by bbdb-message-marker-field, then that will -be used instead." - :group 'bbdb-mua-specific-gnus - :type 'character) - -(defcustom gnus-bbdb/summary-show-bbdb-names t - "*If both this variable and `gnus-bbdb/summary-prefer-real-names' are true, -then for messages from authors who are in your database, the name -displayed will be the primary name in the database, rather than the -one in the From line of the message. This doesn't affect the names of -people who aren't in the database, of course. (`gnus-optional-headers' -must be `gnus-bbdb/lines-and-from' for GNUS users.)" - :group 'bbdb-mua-specific-gnus - :type 'boolean) -(static-when (and (fboundp 'defvaralias) - (subrp (symbol-function 'defvaralias))) - (defvaralias 'gnus-bbdb/header-show-bbdb-names - 'gnus-bbdb/summary-show-bbdb-names)) - -(defcustom gnus-bbdb/summary-prefer-bbdb-data t - "If t, then for posters who are in our BBDB, replace the information -provided in the From header with data from the BBDB." - :group 'bbdb-mua-specific-gnus - :type 'boolean) - -(defcustom gnus-bbdb/summary-prefer-real-names t - "If t, then display the poster's name from the BBDB if we have one, -otherwise display his/her primary net address if we have one. If it -is set to the symbol bbdb, then real names will be used from the BBDB -if present, otherwise the net address in the post will be used. If -gnus-bbdb/summary-prefer-bbdb-data is nil, then this has no effect. -See `gnus-bbdb/lines-and-from' for GNUS users, or -`gnus-bbdb/summary-user-format-letter' for Gnus users." - :group 'bbdb-mua-specific-gnus - :type '(choice (const :tag "Prefer real names" t) - (const :tag "Prefer network addresses" nil))) -(static-when (and (fboundp 'defvaralias) - (subrp (symbol-function 'defvaralias))) - (defvaralias 'gnus-bbdb/header-prefer-real-names - 'gnus-bbdb/summary-prefer-real-names)) - -(defcustom gnus-bbdb/summary-user-format-letter "B" - "This is the gnus-user-format-function- that will be used to insert -the information from the BBDB in the summary buffer (using -`gnus-bbdb/summary-get-author'). This format code is meant to replace -codes that insert sender names or addresses (like %A or %n). Unless -you've alread got other code using user format B, you might as well -stick with the default. Additionally, if the value of this variable -is nil, no format function will be installed for -`gnus-bbdb/summary-get-author'. See also -`gnus-bbdb/summary-in-bbdb-format-letter', which installs a format -code for `gnus-bbdb/summary-author-in-bbdb'" - :group 'bbdb-mua-specific-gnus - :type 'character) - -(defcustom gnus-bbdb/summary-in-bbdb-format-letter "b" - "This is the gnus-user-format-function- that will be used to insert -`gnus-bbdb/summary-known-poster-mark' (using -`gnus-bbdb/summary-author-in-bbdb') if the poster is in the BBDB, and -\" \" if not. If the value of this variable is nil, no format code -will be installed for `gnus-bbdb/summary-author-in-bbdb'. See also -`gnus-bbdb/summary-user-format-letter', which installs a format code -for `gnus-bbdb/summary-get-author'." - :group 'bbdb-mua-specific-gnus - :type 'character) - -(defcustom bbdb-message-marker-field 'mark-char - "*The field whose value will be used to mark messages by this user in Gnus." - :group 'bbdb-mua-specific-gnus - :type 'symbol) - -;;;###autoload -(defun gnus-bbdb/lines-and-from (header) - "Useful as the value of gnus-optional-headers in *GNUS* (not Gnus). -NOTE: This variable no longer seems to be present in Gnus. It seems -to have been replaced by `message-default-headers', which only takes -strings. In the future this should change." - (let* ((length gnus-bbdb/lines-and-from-length) - (lines (mail-header-lines header)) - (from (mail-header-from header)) - (data (and (or gnus-bbdb/summary-mark-known-posters - gnus-bbdb/summary-show-bbdb-names) - (condition-case () - (gnus-bbdb/extract-address-components from) - (error nil)))) - (name (car data)) - (net (car (cdr data))) - (record (and data - (bbdb-search-simple - name - (if (and net bbdb-canonicalize-net-hook) - (bbdb-canonicalize-address net) - net)))) - string L) - - (if (and record name (member (downcase name) (bbdb-record-net record))) - ;; bogon! - (setq record nil)) - - (setq name - (or (and gnus-bbdb/summary-prefer-bbdb-data - (or (and gnus-bbdb/summary-prefer-real-names - (and record (bbdb-record-name record))) - (and record (bbdb-record-net record) - (nth 0 (bbdb-record-net record))))) - (and gnus-bbdb/summary-prefer-real-names - (or (and (equal gnus-bbdb/summary-prefer-real-names 'bbdb) - net) - name)) - net from "**UNKNOWN**")) - ;; GNUS can't cope with extra square-brackets appearing in the summary. - (if (and name (string-match "[][]" name)) - (progn (setq name (copy-sequence name)) - (while (string-match "[][]" name) - (aset name (match-beginning 0) ? )))) - (setq string (format "%s%3d:%s" - (if (and record gnus-bbdb/summary-mark-known-posters) - (or (bbdb-record-getprop - record bbdb-message-marker-field) - "*") - " ") - lines (or name from)) - L (length string)) - (cond ((> L length) (substring string 0 length)) - ((< L length) (concat string (make-string (- length L) ? ))) - (t string)))) - -(defun gnus-bbdb/summary-get-author (header) - "Given a Gnus message header, returns the appropriate piece of -information to identify the author in a Gnus summary line, depending on -the settings of the various configuration variables. See the -documentation for the following variables for more details: - `gnus-bbdb/summary-mark-known-posters' - `gnus-bbdb/summary-known-poster-mark' - `gnus-bbdb/summary-prefer-bbdb-data' - `gnus-bbdb/summary-prefer-real-names' -This function is meant to be used with the user function defined in - `gnus-bbdb/summary-user-format-letter'" - (let* ((from (mail-header-from header)) - (data (and gnus-bbdb/summary-show-bbdb-names - (condition-case () - (gnus-bbdb/extract-address-components from) - (error nil)))) - (name (car data)) - (net (car (cdr data))) - (record (and data - (bbdb-search-simple - name - (if (and net bbdb-canonicalize-net-hook) - (bbdb-canonicalize-address net) - net))))) - (if (and record name (member (downcase name) (bbdb-record-net record))) - ;; bogon! - (setq record nil)) - (setq name - (or (and gnus-bbdb/summary-prefer-bbdb-data - (or (and gnus-bbdb/summary-prefer-real-names - (and record (bbdb-record-name record))) - (and record (bbdb-record-net record) - (nth 0 (bbdb-record-net record))))) - (and gnus-bbdb/summary-prefer-real-names - (or (and (equal gnus-bbdb/summary-prefer-real-names 'bbdb) - net) - name)) - net from "**UNKNOWN**")) - (format "%s%s" - (or (and record gnus-bbdb/summary-mark-known-posters - (or (bbdb-record-getprop - record bbdb-message-marker-field) - gnus-bbdb/summary-known-poster-mark)) - " ") - name))) - -;; DEBUG: (gnus-bbdb/summary-author-in-bbdb "From: simmonmt@acm.org") -(defun gnus-bbdb/summary-author-in-bbdb (header) - "Given a Gnus message header, returns a mark if the poster is in the BBDB, \" \" otherwise. The mark itself is the value of the field indicated by `bbdb-message-marker-field' (`mark-char' by default) if the indicated field is in the poster's record, and `gnus-bbdb/summary-known-poster-mark' otherwise." - (let* ((from (mail-header-from header)) - (data (condition-case () - (gnus-bbdb/extract-address-components from) - (error nil))) - (name (car data)) - (net (cadr data)) - record) - (if (and data - (setq record - (bbdb-search-simple - name (if (and net bbdb-canonicalize-net-hook) - (bbdb-canonicalize-address net) - net)))) - (or (bbdb-record-getprop - record bbdb-message-marker-field) - gnus-bbdb/summary-known-poster-mark) " "))) - -;; -;; Scoring -;; - -(defcustom gnus-bbdb/score-field 'gnus-score - "This variable contains the name of the BBDB field which should be -checked for a score to add to the net addresses in the same record." - :group 'bbdb-mua-specific-gnus-scoring - :type 'symbol) - -(defcustom gnus-bbdb/score-default nil - "If this is set, then every net address in the BBDB that does not have -an associated score field will be assigned this score. A value of nil -implies a default score of zero." - :group 'bbdb-mua-specific-gnus-scoring - :type '(choice (const :tag "Do not assign default score") - (integer :tag "Assign this default score" 0))) - -(defvar gnus-bbdb/score-default-internal nil - "Internal variable for detecting changes to -`gnus-bbdb/score-default'. You should not set this variable directly - -set `gnus-bbdb/score-default' instead.") - -(defvar gnus-bbdb/score-alist nil - "The text version of the scoring structure returned by -gnus-bbdb/score. This is built automatically from the BBDB.") - -(defvar gnus-bbdb/score-rebuild-alist t - "Set to t to rebuild gnus-bbdb/score-alist on the next call to -gnus-bbdb/score. This will be set automatically if you change a BBDB -record which contains a gnus-score field.") - -(defun gnus-bbdb/score-invalidate-alist (rec) - "This function is called through bbdb-after-change-hook, and sets -gnus-bbdb/score-rebuild-alist to t if the changed record contains a -gnus-score field." - (if (bbdb-record-getprop rec gnus-bbdb/score-field) - (setq gnus-bbdb/score-rebuild-alist t))) - -;;;###autoload -(defun gnus-bbdb/score (group) - "This returns a score alist for GNUS. A score pair will be made for -every member of the net field in records which also have a gnus-score -field. This allows the BBDB to serve as a supplemental global score -file, with the advantage that it can keep up with multiple and changing -addresses better than the traditionally static global scorefile." - (list (list - (condition-case nil - (read (gnus-bbdb/score-as-text group)) - (error (setq gnus-bbdb/score-rebuild-alist t) - (message "Problem building BBDB score table.") - (ding) (sit-for 2) - nil))))) - -(defun gnus-bbdb/score-as-text (group) - "Returns a SCORE file format string built from the BBDB." - (cond ((or (cond ((/= (or gnus-bbdb/score-default 0) - (or gnus-bbdb/score-default-internal 0)) - (setq gnus-bbdb/score-default-internal - gnus-bbdb/score-default) - t)) - (not gnus-bbdb/score-alist) - gnus-bbdb/score-rebuild-alist) - (setq gnus-bbdb/score-rebuild-alist nil) - (setq gnus-bbdb/score-alist - (concat "((touched nil) (\"from\"\n" - (mapconcat - (lambda (rec) - (let ((score (or (bbdb-record-getprop - rec - gnus-bbdb/score-field) - gnus-bbdb/score-default)) - (net (bbdb-record-net rec))) - (if (not (and score net)) nil - (mapconcat - (lambda (addr) - (concat "(\"" addr "\" " score ")\n")) - net "")))) - (bbdb-records) "") - "))")))) - gnus-bbdb/score-alist) - -(defun gnus-bbdb/extract-field-value-init () - (function gnus-bbdb/extract-field-value)) - -(defun gnus-bbdb/extract-field-value (field-name) - "Given the name of a field (like \"Subject\") this returns the value of -that field in the current message, or nil. This works whether you're in -Semi-gnus, Rmail, or VM. This works on multi-line fields, but if more than -one field of the same name is present, only the last is returned. It is -expected that the current buffer has a message in it, and (point) is at the -beginning of the message headers." - ;; we can't special-case VM here to use its cache, because the cache has - ;; divided real-names from addresses; the actual From: and Subject: fields - ;; exist only in the message. - (let (value) - (when (setq value (mime-entity-fetch-field - gnus-current-headers field-name)) - (gnus-bbdb/decode-field-body value field-name)))) - -;;; @ mail-extr -;;; - -(defvar gnus-bbdb/canonicalize-full-name-methods - '(gnus-bbdb/canonicalize-dots - gnus-bbdb/canonicalize-spaces)) - -(defun gnus-bbdb/extract-address-components (str) - (let* ((ret (std11-extract-address-components str)) - (phrase (car ret)) - (address (car (cdr ret))) - (methods gnus-bbdb/canonicalize-full-name-methods)) - (while (and phrase methods) - (setq phrase (funcall (car methods) phrase) - methods (cdr methods))) - (if (string= address "") (setq address nil)) - (if (string= phrase "") (setq phrase nil)) - (when (or phrase address) - (list phrase address)))) - -;;; @ full-name canonicalization methods -;;; - -(defun gnus-bbdb/canonicalize-spaces (str) - (let (dest) - (while (string-match "\\s +" str) - (setq dest (cons (substring str 0 (match-beginning 0)) dest)) - (setq str (substring str (match-end 0)))) - (or (string= str "") - (setq dest (cons str dest))) - (setq dest (nreverse dest)) - (mapconcat 'identity dest " "))) - -(defun gnus-bbdb/canonicalize-dots (str) - (let (dest) - (while (string-match "\\." str) - (setq dest (cons (substring str 0 (match-end 0)) dest)) - (setq str (substring str (match-end 0)))) - (or (string= str "") - (setq dest (cons str dest))) - (setq dest (nreverse dest)) - (mapconcat 'identity dest " "))) - -;; -;; Insinuation -;; - -;;;###autoload -(defun gnus-bbdb-insinuate () - "Call this function to hook BBDB into Semi-gnus." -;; (setq gnus-optional-headers 'gnus-bbdb/lines-and-from) - (when (boundp 'bbdb-extract-field-value-function-list) - (add-to-list 'bbdb-extract-field-value-function-list - 'gnus-bbdb/extract-field-value-init)) - (add-hook 'gnus-article-prepare-hook 'gnus-bbdb/update-record) - (add-hook 'gnus-save-newsrc-hook 'bbdb-offer-save) - (define-key gnus-summary-mode-map ":" 'gnus-bbdb/show-sender) - (define-key gnus-summary-mode-map ";" 'gnus-bbdb/edit-notes) - - ;; Set up user field for use in gnus-summary-line-format - (let ((get-author-user-fun (intern - (concat "gnus-user-format-function-" - gnus-bbdb/summary-user-format-letter))) - (in-bbdb-user-fun (intern - (concat "gnus-user-format-function-" - gnus-bbdb/summary-in-bbdb-format-letter)))) - ; The big one - whole name - (cond (gnus-bbdb/summary-user-format-letter - (if (and (fboundp get-author-user-fun) - (not (eq (symbol-function get-author-user-fun) - 'gnus-bbdb/summary-get-author))) - (bbdb-warn - (format "`gnus-user-format-function-%s' already seems to be in use. -Please redefine `gnus-bbdb/summary-user-format-letter' to a different letter." - gnus-bbdb/summary-user-format-letter)) - (fset get-author-user-fun 'gnus-bbdb/summary-get-author)))) - - ; One tick. One tick only, please - (cond (gnus-bbdb/summary-in-bbdb-format-letter - (if (and (fboundp in-bbdb-user-fun) - (not (eq (symbol-function in-bbdb-user-fun) - 'gnus-bbdb/summary-author-in-bbdb))) - (bbdb-warn - (format "`gnus-user-format-function-%s' already seems to be in use. -Redefine `gnus-bbdb/summary-in-bbdb-format-letter' to a different letter." - gnus-bbdb/summary-in-bbdb-format-letter)) - (fset in-bbdb-user-fun 'gnus-bbdb/summary-author-in-bbdb))))) - - ;; Scoring - (add-hook 'bbdb-after-change-hook 'gnus-bbdb/score-invalidate-alist) -; (setq gnus-score-find-score-files-function -; (if (boundp 'gnus-score-find-score-files-function) -; (cond ((functionp gnus-score-find-score-files-function) -; (list gnus-score-find-score-files-function -; 'gnus-bbdb/score)) -; ((listp gnus-score-find-score-files-function) -; (append gnus-score-find-score-files-function -; 'gnus-bbdb/score)) -; (t 'gnus-bbdb/score)) -; 'gnus-bbdb/score)) - ) - -;;;###autoload -(defun gnus-bbdb-insinuate-message () - "Call this function to hook BBDB into message-mode." - (define-key message-mode-map "\M-\t" 'bbdb-complete-name)) - -(provide 'gnus-bbdb) diff --git a/lisp/gnus-bcklg.el b/lisp/gnus-bcklg.el deleted file mode 100644 index 86ef4e5..0000000 --- a/lisp/gnus-bcklg.el +++ /dev/null @@ -1,162 +0,0 @@ -;;; gnus-bcklg.el --- backlog functions for Gnus -;; Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) - -(require 'gnus) - -;;; -;;; Buffering of read articles. -;;; - -(defvar gnus-backlog-buffer " *Gnus Backlog*") -(defvar gnus-backlog-articles nil) -(defvar gnus-backlog-hashtb nil) - -(defun gnus-backlog-buffer () - "Return the backlog buffer." - (or (get-buffer gnus-backlog-buffer) - (save-excursion - (set-buffer (gnus-get-buffer-create gnus-backlog-buffer)) - (buffer-disable-undo) - (setq buffer-read-only t) - (get-buffer gnus-backlog-buffer)))) - -(defun gnus-backlog-setup () - "Initialize backlog variables." - (unless gnus-backlog-hashtb - (setq gnus-backlog-hashtb (gnus-make-hashtable 1024)))) - -(gnus-add-shutdown 'gnus-backlog-shutdown 'gnus) - -(defun gnus-backlog-shutdown () - "Clear all backlog variables and buffers." - (interactive) - (when (get-buffer gnus-backlog-buffer) - (kill-buffer gnus-backlog-buffer)) - (setq gnus-backlog-hashtb nil - gnus-backlog-articles nil)) - -(defun gnus-backlog-enter-article (group number buffer) - (when (and (numberp number) - (not (string-match "^nnvirtual" group))) - (gnus-backlog-setup) - (let ((ident (intern (concat group ":" (int-to-string number)) - gnus-backlog-hashtb)) - b) - (if (memq ident gnus-backlog-articles) - () ; It's already kept. - ;; Remove the oldest article, if necessary. - (and (numberp gnus-keep-backlog) - (>= (length gnus-backlog-articles) gnus-keep-backlog) - (gnus-backlog-remove-oldest-article)) - (push ident gnus-backlog-articles) - ;; Insert the new article. - (save-excursion - (set-buffer (gnus-backlog-buffer)) - (let (buffer-read-only) - (goto-char (point-max)) - (unless (bolp) - (insert "\n")) - (setq b (point)) - (insert-buffer-substring buffer) - ;; Tag the beginning of the article with the ident. - (if (> (point-max) b) - (gnus-put-text-property b (1+ b) 'gnus-backlog ident) - (gnus-error 3 "Article %d is blank" number)))))))) - -(defun gnus-backlog-remove-oldest-article () - (save-excursion - (set-buffer (gnus-backlog-buffer)) - (goto-char (point-min)) - (if (zerop (buffer-size)) - () ; The buffer is empty. - (let ((ident (get-text-property (point) 'gnus-backlog)) - buffer-read-only) - ;; Remove the ident from the list of articles. - (when ident - (setq gnus-backlog-articles (delq ident gnus-backlog-articles))) - ;; Delete the article itself. - (delete-region - (point) (next-single-property-change - (1+ (point)) 'gnus-backlog nil (point-max))))))) - -(defun gnus-backlog-remove-article (group number) - "Remove article NUMBER in GROUP from the backlog." - (when (numberp number) - (gnus-backlog-setup) - (let ((ident (intern (concat group ":" (int-to-string number)) - gnus-backlog-hashtb)) - beg end) - (when (memq ident gnus-backlog-articles) - ;; It was in the backlog. - (save-excursion - (set-buffer (gnus-backlog-buffer)) - (let (buffer-read-only) - (when (setq beg (text-property-any - (point-min) (point-max) 'gnus-backlog - ident)) - ;; Find the end (i. e., the beginning of the next article). - (setq end - (next-single-property-change - (1+ beg) 'gnus-backlog (current-buffer) (point-max))) - (delete-region beg end) - ;; Return success. - t)) - (setq gnus-backlog-articles (delq ident gnus-backlog-articles))))))) - -(defun gnus-backlog-request-article (group number &optional buffer) - (when (and (numberp number) - (not (string-match "^nnvirtual" group))) - (gnus-backlog-setup) - (let ((ident (intern (concat group ":" (int-to-string number)) - gnus-backlog-hashtb)) - beg end) - (when (memq ident gnus-backlog-articles) - ;; It was in the backlog. - (save-excursion - (set-buffer (gnus-backlog-buffer)) - (if (not (setq beg (text-property-any - (point-min) (point-max) 'gnus-backlog - ident))) - ;; It wasn't in the backlog after all. - (ignore - (setq gnus-backlog-articles (delq ident gnus-backlog-articles))) - ;; Find the end (i. e., the beginning of the next article). - (setq end - (next-single-property-change - (1+ beg) 'gnus-backlog (current-buffer) (point-max))))) - (save-excursion - (and buffer (set-buffer buffer)) - (let ((buffer-read-only nil)) - (erase-buffer) - (insert-buffer-substring gnus-backlog-buffer beg end))) - t)))) - -(provide 'gnus-bcklg) - -;;; gnus-bcklg.el ends here diff --git a/lisp/gnus-cache.el b/lisp/gnus-cache.el deleted file mode 100644 index e02b157..0000000 --- a/lisp/gnus-cache.el +++ /dev/null @@ -1,715 +0,0 @@ -;;; gnus-cache.el --- cache interface for Gnus -;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Tatsuya Ichikawa -;; MORIOKA Tomohiko -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) -(eval-when-compile (require 'gnus-clfns)) - -(require 'gnus) -(require 'gnus-int) -(require 'gnus-range) -(require 'gnus-start) -(eval-when-compile - (require 'gnus-sum)) - -(defcustom gnus-cache-active-file - (expand-file-name "active" gnus-cache-directory) - "*The cache active file." - :group 'gnus-cache - :type 'file) - -(defcustom gnus-cache-enter-articles '(ticked dormant) - "Classes of articles to enter into the cache." - :group 'gnus-cache - :type '(set (const ticked) (const dormant) (const unread) (const read))) - -(defcustom gnus-cache-remove-articles '(read) - "Classes of articles to remove from the cache." - :group 'gnus-cache - :type '(set (const ticked) (const dormant) (const unread) (const read))) - -(defcustom gnus-cacheable-groups nil - "*Groups that match this regexp will be cached. - -If you only want to cache your nntp groups, you could set this -variable to \"^nntp\". - -If a group matches both gnus-cacheable-groups and gnus-uncacheable-groups -it's not cached." - :group 'gnus-cache - :type '(choice (const :tag "off" nil) - regexp)) - -(defcustom gnus-uncacheable-groups nil - "*Groups that match this regexp will not be cached. - -If you want to avoid caching your nnml groups, you could set this -variable to \"^nnml\". - -If a group matches both gnus-cacheable-groups and gnus-uncacheable-groups -it's not cached." - :group 'gnus-cache - :type '(choice (const :tag "off" nil) - regexp)) - -(defvar gnus-cache-overview-coding-system 'raw-text - "Coding system used on Gnus cache files.") - -(defvar gnus-cache-coding-system 'raw-text - "Coding system used on Gnus cache files.") - - - -;;; Internal variables. - -(defvar gnus-cache-removable-articles nil) -(defvar gnus-cache-buffer nil) -(defvar gnus-cache-active-hashtb nil) -(defvar gnus-cache-active-altered nil) -(defvar gnus-cache-write-file-coding-system 'raw-text) - -(eval-and-compile - (autoload 'nnml-generate-nov-databases-1 "nnml") - (autoload 'nnvirtual-find-group-art "nnvirtual")) - - - -;;; Functions called from Gnus. - -(defun gnus-cache-open () - "Initialize the cache." - (when (or (file-exists-p gnus-cache-directory) - (and gnus-use-cache - (not (eq gnus-use-cache 'passive)))) - (gnus-cache-read-active))) - -;; Complexities of byte-compiling make this kludge necessary. Eeek. -(ignore-errors - (gnus-add-shutdown 'gnus-cache-close 'gnus)) - -(defun gnus-cache-close () - "Shut down the cache." - (gnus-cache-write-active) - (gnus-cache-save-buffers) - (setq gnus-cache-active-hashtb nil)) - -(defun gnus-cache-save-buffers () - ;; save the overview buffer if it exists and has been modified - ;; delete empty cache subdirectories - (when gnus-cache-buffer - (let ((buffer (cdr gnus-cache-buffer)) - (overview-file (gnus-cache-file-name - (car gnus-cache-buffer) ".overview"))) - ;; write the overview only if it was modified - (when (buffer-modified-p buffer) - (save-excursion - (set-buffer buffer) - (if (> (buffer-size) 0) - ;; Non-empty overview, write it to a file. - (gnus-write-buffer-as-coding-system - gnus-cache-overview-coding-system overview-file) - ;; Empty overview file, remove it - (when (file-exists-p overview-file) - (delete-file overview-file)) - ;; If possible, remove group's cache subdirectory. - (condition-case nil - ;; FIXME: we can detect the error type and warn the user - ;; of any inconsistencies (articles w/o nov entries?). - ;; for now, just be conservative...delete only if safe -- sj - (delete-directory (file-name-directory overview-file)) - (error nil))))) - ;; Kill the buffer -- it's either unmodified or saved. - (gnus-kill-buffer buffer) - (setq gnus-cache-buffer nil)))) - -(defun gnus-cache-possibly-enter-article - (group article headers ticked dormant unread &optional force) - (when (and (or force (not (eq gnus-use-cache 'passive))) - (numberp article) - (> article 0) ; This might be a dummy article. - (vectorp headers)) - (let ((number article) file) - ;; If this is a virtual group, we find the real group. - (when (gnus-virtual-group-p group) - (let ((result (nnvirtual-find-group-art - (gnus-group-real-name group) article))) - (setq group (car result) - number (cdr result)))) - (when (and number - (> number 0) ; Reffed article. - (or force - (and (gnus-cache-fully-p group) - (gnus-cache-member-of-class - gnus-cache-enter-articles ticked dormant unread))) - (not (file-exists-p (setq file (gnus-cache-file-name - group number))))) - ;; Possibly create the cache directory. - (gnus-make-directory (file-name-directory file)) - ;; Save the article in the cache. - (if (file-exists-p file) - t ; The article already is saved. - (save-excursion - (set-buffer nntp-server-buffer) - (require 'gnus-art) - (let ((gnus-use-cache nil) - (gnus-article-decode-hook nil)) - (gnus-request-article-this-buffer number group)) - (when (> (buffer-size) 0) - (gnus-write-buffer-as-coding-system - gnus-cache-write-file-coding-system file) - (setq headers (nnheader-parse-head t)) - (mail-header-set-number headers number) - (gnus-cache-change-buffer group) - (set-buffer (cdr gnus-cache-buffer)) - (goto-char (point-max)) - (forward-line -1) - (while (condition-case () - (when (not (bobp)) - (> (read (current-buffer)) number)) - (error - ;; The line was malformed, so we just remove it!! - (gnus-delete-line) - t)) - (forward-line -1)) - (if (bobp) - (if (not (eobp)) - (progn - (beginning-of-line) - (when (< (read (current-buffer)) number) - (forward-line 1))) - (beginning-of-line)) - (forward-line 1)) - (beginning-of-line) - (nnheader-insert-nov headers) - ;; Update the active info. - (set-buffer gnus-summary-buffer) - (gnus-cache-possibly-update-active group (cons number number)) - (push article gnus-newsgroup-cached) - (gnus-summary-update-secondary-mark article)) - t)))))) - -(defun gnus-cache-enter-remove-article (article) - "Mark ARTICLE for later possible removal." - (when article - (push article gnus-cache-removable-articles))) - -(defun gnus-cache-possibly-remove-articles () - "Possibly remove some of the removable articles." - (if (not (gnus-virtual-group-p gnus-newsgroup-name)) - (gnus-cache-possibly-remove-articles-1) - (let ((arts gnus-cache-removable-articles) - ga) - (while arts - (when (setq ga (nnvirtual-find-group-art - (gnus-group-real-name gnus-newsgroup-name) (pop arts))) - (let ((gnus-cache-removable-articles (list (cdr ga))) - (gnus-newsgroup-name (car ga))) - (gnus-cache-possibly-remove-articles-1))))) - (setq gnus-cache-removable-articles nil))) - -(defun gnus-cache-possibly-remove-articles-1 () - "Possibly remove some of the removable articles." - (when (gnus-cache-fully-p gnus-newsgroup-name) - (let ((articles gnus-cache-removable-articles) - (cache-articles gnus-newsgroup-cached) - article) - (gnus-cache-change-buffer gnus-newsgroup-name) - (while articles - (when (memq (setq article (pop articles)) cache-articles) - ;; The article was in the cache, so we see whether we are - ;; supposed to remove it from the cache. - (gnus-cache-possibly-remove-article - article (memq article gnus-newsgroup-marked) - (memq article gnus-newsgroup-dormant) - (or (memq article gnus-newsgroup-unreads) - (memq article gnus-newsgroup-unselected)))))) - ;; The overview file might have been modified, save it - ;; safe because we're only called at group exit anyway. - (gnus-cache-save-buffers))) - -(defun gnus-cache-request-article (article group) - "Retrieve ARTICLE in GROUP from the cache." - (let ((file (gnus-cache-file-name group article)) - (buffer-read-only nil)) - (when (file-exists-p file) - (erase-buffer) - (gnus-kill-all-overlays) - (let ((nnheader-file-coding-system gnus-cache-coding-system)) - (nnheader-insert-file-contents file)) - t))) - -(defun gnus-cache-possibly-alter-active (group active) - "Alter the ACTIVE info for GROUP to reflect the articles in the cache." - (when gnus-cache-active-hashtb - (let ((cache-active (gnus-gethash group gnus-cache-active-hashtb))) - (when cache-active - (when (< (car cache-active) (car active)) - (setcar active (car cache-active))) - (when (> (cdr cache-active) (cdr active)) - (setcdr active (cdr cache-active))))))) - -(defun gnus-cache-retrieve-headers (articles group &optional fetch-old) - "Retrieve the headers for ARTICLES in GROUP." - (let ((cached - (setq gnus-newsgroup-cached (gnus-cache-articles-in-group group)))) - (if (not cached) - ;; No cached articles here, so we just retrieve them - ;; the normal way. - (let ((gnus-use-cache nil)) - (gnus-retrieve-headers articles group fetch-old)) - (let ((uncached-articles (gnus-sorted-intersection - (gnus-sorted-complement articles cached) - articles)) - (cache-file (gnus-cache-file-name group ".overview")) - type) - ;; We first retrieve all the headers that we don't have in - ;; the cache. - (let ((gnus-use-cache nil)) - (when uncached-articles - (setq type (and articles - (gnus-retrieve-headers - uncached-articles group fetch-old))))) - (gnus-cache-save-buffers) - ;; Then we insert the cached headers. - (save-excursion - (cond - ((not (file-exists-p cache-file)) - ;; There are no cached headers. - type) - ((null type) - ;; There were no uncached headers (or retrieval was - ;; unsuccessful), so we use the cached headers exclusively. - (set-buffer nntp-server-buffer) - (erase-buffer) - (let ((nnheader-file-coding-system - gnus-cache-overview-coding-system)) - (nnheader-insert-file-contents cache-file)) - 'nov) - ((eq type 'nov) - ;; We have both cached and uncached NOV headers, so we - ;; braid them. - (gnus-cache-braid-nov group cached) - type) - (t - ;; We braid HEADs. - (gnus-cache-braid-heads group (gnus-sorted-intersection - cached articles)) - type))))))) - -(defun gnus-cache-enter-article (&optional n) - "Enter the next N articles into the cache. -If not given a prefix, use the process marked articles instead. -Returns the list of articles entered." - (interactive "P") - (let ((articles (gnus-summary-work-articles n)) - article out) - (while (setq article (pop articles)) - (gnus-summary-remove-process-mark article) - (if (natnump article) - (when (gnus-cache-possibly-enter-article - gnus-newsgroup-name article - (gnus-summary-article-header article) - nil nil nil t) - (push article out)) - (gnus-message 2 "Can't cache article %d" article)) - (gnus-summary-update-secondary-mark article)) - (gnus-summary-next-subject 1) - (gnus-summary-position-point) - (nreverse out))) - -(defun gnus-cache-remove-article (n) - "Remove the next N articles from the cache. -If not given a prefix, use the process marked articles instead. -Returns the list of articles removed." - (interactive "P") - (gnus-cache-change-buffer gnus-newsgroup-name) - (let ((articles (gnus-summary-work-articles n)) - article out) - (while articles - (setq article (pop articles)) - (gnus-summary-remove-process-mark article) - (when (gnus-cache-possibly-remove-article article nil nil nil t) - (push article out)) - (gnus-summary-update-secondary-mark article)) - (gnus-summary-next-subject 1) - (gnus-summary-position-point) - (nreverse out))) - -(defun gnus-cached-article-p (article) - "Say whether ARTICLE is cached in the current group." - (memq article gnus-newsgroup-cached)) - -(defun gnus-summary-insert-cached-articles () - "Insert all the articles cached for this group into the current buffer." - (interactive) - (let ((cached (sort (copy-sequence gnus-newsgroup-cached) '>)) - (gnus-verbose (max 6 gnus-verbose))) - (unless cached - (gnus-message 3 "No cached articles for this group")) - (while cached - (gnus-summary-goto-subject (pop cached) t)))) - -(defalias 'gnus-summary-limit-include-cached - 'gnus-summary-insert-cached-articles) - -;;; Internal functions. - -(defun gnus-cache-change-buffer (group) - (and gnus-cache-buffer - ;; See if the current group's overview cache has been loaded. - (or (string= group (car gnus-cache-buffer)) - ;; Another overview cache is current, save it. - (gnus-cache-save-buffers))) - ;; if gnus-cache buffer is nil, create it - (unless gnus-cache-buffer - ;; Create cache buffer - (save-excursion - (setq gnus-cache-buffer - (cons group - (set-buffer (gnus-get-buffer-create - " *gnus-cache-overview*")))) - ;; Insert the contents of this group's cache overview. - (erase-buffer) - (let ((file (gnus-cache-file-name group ".overview"))) - (when (file-exists-p file) - (nnheader-insert-file-contents file))) - ;; We have a fresh (empty/just loaded) buffer, - ;; mark it as unmodified to save a redundant write later. - (set-buffer-modified-p nil)))) - -;; Return whether an article is a member of a class. -(defun gnus-cache-member-of-class (class ticked dormant unread) - (or (and ticked (memq 'ticked class)) - (and dormant (memq 'dormant class)) - (and unread (memq 'unread class)) - (and (not unread) (not ticked) (not dormant) (memq 'read class)))) - -(defun gnus-cache-file-name (group article) - (expand-file-name - (if (stringp article) article (int-to-string article)) - (file-name-as-directory - (expand-file-name - (nnheader-translate-file-chars - (if (gnus-use-long-file-name 'not-cache) - group - (let ((group (nnheader-replace-duplicate-chars-in-string - (nnheader-replace-chars-in-string group ?/ ?_) - ?. ?_))) - ;; Translate the first colon into a slash. - (when (string-match ":" group) - (setq group (concat (substring group 0 (match-beginning 0)) - "/" (substring group (match-end 0))))) - (nnheader-replace-chars-in-string group ?. ?/))) - t) - gnus-cache-directory)))) - -(defun gnus-cache-update-article (group article) - "If ARTICLE is in the cache, remove it and re-enter it." - (gnus-cache-change-buffer group) - (when (gnus-cache-possibly-remove-article article nil nil nil t) - (let ((gnus-use-cache nil)) - (gnus-cache-possibly-enter-article - gnus-newsgroup-name article (gnus-summary-article-header article) - nil nil nil t)))) - -(defun gnus-cache-possibly-remove-article (article ticked dormant unread - &optional force) - "Possibly remove ARTICLE from the cache." - (let ((group gnus-newsgroup-name) - (number article) - file) - ;; If this is a virtual group, we find the real group. - (when (gnus-virtual-group-p group) - (let ((result (nnvirtual-find-group-art - (gnus-group-real-name group) article))) - (setq group (car result) - number (cdr result)))) - (setq file (gnus-cache-file-name group number)) - (when (and (file-exists-p file) - (or force - (gnus-cache-member-of-class - gnus-cache-remove-articles ticked dormant unread))) - (save-excursion - (delete-file file) - (set-buffer (cdr gnus-cache-buffer)) - (goto-char (point-min)) - (when (or (looking-at (concat (int-to-string number) "\t")) - (search-forward (concat "\n" (int-to-string number) "\t") - (point-max) t)) - (delete-region (progn (beginning-of-line) (point)) - (progn (forward-line 1) (point))))) - (setq gnus-newsgroup-cached - (delq article gnus-newsgroup-cached)) - (gnus-summary-update-secondary-mark article) - t))) - -(defun gnus-cache-articles-in-group (group) - "Return a sorted list of cached articles in GROUP." - (let ((dir (file-name-directory (gnus-cache-file-name group 1))) - articles) - (when (file-exists-p dir) - (setq articles - (sort (mapcar (lambda (name) (string-to-int name)) - (directory-files dir nil "^[0-9]+$" t)) - '<)) - ;; Update the cache active file, just to synch more. - (when articles - (gnus-cache-update-active group (car articles) t) - (gnus-cache-update-active group (car (last articles)))) - articles))) - -(defun gnus-cache-braid-nov (group cached &optional file) - (let ((cache-buf (gnus-get-buffer-create " *gnus-cache*")) - beg end) - (gnus-cache-save-buffers) - (save-excursion - (set-buffer cache-buf) - (erase-buffer) - (let ((nnheader-file-coding-system gnus-cache-overview-coding-system)) - (nnheader-insert-file-contents - (or file (gnus-cache-file-name group ".overview")))) - (goto-char (point-min)) - (insert "\n") - (goto-char (point-min))) - (set-buffer nntp-server-buffer) - (goto-char (point-min)) - (while cached - (while (and (not (eobp)) - (< (read (current-buffer)) (car cached))) - (forward-line 1)) - (beginning-of-line) - (save-excursion - (set-buffer cache-buf) - (if (search-forward (concat "\n" (int-to-string (car cached)) "\t") - nil t) - (setq beg (progn (beginning-of-line) (point)) - end (progn (end-of-line) (point))) - (setq beg nil))) - (when beg - (insert-buffer-substring cache-buf beg end) - (insert "\n")) - (setq cached (cdr cached))) - (kill-buffer cache-buf))) - -(defun gnus-cache-braid-heads (group cached) - (let ((cache-buf (gnus-get-buffer-create " *gnus-cache*"))) - (save-excursion - (set-buffer cache-buf) - (erase-buffer)) - (set-buffer nntp-server-buffer) - (goto-char (point-min)) - (while cached - (while (and (not (eobp)) - (looking-at "2.. +\\([0-9]+\\) ") - (< (progn (goto-char (match-beginning 1)) - (read (current-buffer))) - (car cached))) - (search-forward "\n.\n" nil 'move)) - (beginning-of-line) - (save-excursion - (set-buffer cache-buf) - (erase-buffer) - (let ((nnheader-file-coding-system gnus-cache-coding-system)) - (nnheader-insert-file-contents - (gnus-cache-file-name group (car cached)))) - (goto-char (point-min)) - (insert "220 ") - (princ (car cached) (current-buffer)) - (insert " Article retrieved.\n") - (search-forward "\n\n" nil 'move) - (delete-region (point) (point-max)) - (forward-char -1) - (insert ".")) - (insert-buffer-substring cache-buf) - (setq cached (cdr cached))) - (kill-buffer cache-buf))) - -;;;###autoload -(defun gnus-jog-cache () - "Go through all groups and put the articles into the cache. - -Usage: -$ emacs -batch -l ~/.emacs -l gnus -f gnus-jog-cache" - (interactive) - (let ((gnus-mark-article-hook nil) - (gnus-expert-user t) - (nnmail-spool-file nil) - (mail-sources nil) - (gnus-use-dribble-file nil) - (gnus-novice-user nil) - (gnus-large-newsgroup nil)) - ;; Start Gnus. - (gnus) - ;; Go through all groups... - (gnus-group-mark-buffer) - (gnus-group-iterate nil - (lambda (group) - (let (gnus-auto-select-next) - (gnus-summary-read-group group nil t) - ;; ... and enter the articles into the cache. - (when (eq major-mode 'gnus-summary-mode) - (gnus-uu-mark-buffer) - (gnus-cache-enter-article) - (kill-buffer (current-buffer)))))))) - -(defun gnus-cache-read-active (&optional force) - "Read the cache active file." - (gnus-make-directory gnus-cache-directory) - (if (or (not (file-exists-p gnus-cache-active-file)) - (zerop (nth 7 (file-attributes gnus-cache-active-file))) - force) - ;; There is no active file, so we generate one. - (gnus-cache-generate-active) - ;; We simply read the active file. - (save-excursion - (gnus-set-work-buffer) - (nnheader-insert-file-contents gnus-cache-active-file) - (gnus-active-to-gnus-format - nil (setq gnus-cache-active-hashtb - (gnus-make-hashtable - (count-lines (point-min) (point-max))))) - (setq gnus-cache-active-altered nil)))) - -(defun gnus-cache-write-active (&optional force) - "Write the active hashtb to the active file." - (when (or force - (and gnus-cache-active-hashtb - gnus-cache-active-altered)) - (gnus-write-active-file gnus-cache-active-file gnus-cache-active-hashtb t) - ;; Mark the active hashtb as unaltered. - (setq gnus-cache-active-altered nil))) - -(defun gnus-cache-possibly-update-active (group active) - "Update active info bounds of GROUP with ACTIVE if necessary. -The update is performed if ACTIVE contains a higher or lower bound -than the current." - (let ((lower t) (higher t)) - (if gnus-cache-active-hashtb - (let ((cache-active (gnus-gethash group gnus-cache-active-hashtb))) - (when cache-active - (unless (< (car active) (car cache-active)) - (setq lower nil)) - (unless (> (cdr active) (cdr cache-active)) - (setq higher nil)))) - (gnus-cache-read-active)) - (when lower - (gnus-cache-update-active group (car active) t)) - (when higher - (gnus-cache-update-active group (cdr active))))) - -(defun gnus-cache-update-active (group number &optional low) - "Update the upper bound of the active info of GROUP to NUMBER. -If LOW, update the lower bound instead." - (let ((active (gnus-gethash group gnus-cache-active-hashtb))) - (if (null active) - ;; We just create a new active entry for this group. - (gnus-sethash group (cons number number) gnus-cache-active-hashtb) - ;; Update the lower or upper bound. - (if low - (setcar active number) - (setcdr active number))) - ;; Mark the active hashtb as altered. - (setq gnus-cache-active-altered t))) - -;;;###autoload -(defun gnus-cache-generate-active (&optional directory) - "Generate the cache active file." - (interactive) - (let* ((top (null directory)) - (directory (expand-file-name (or directory gnus-cache-directory))) - (files (directory-files directory 'full)) - (group - (if top - "" - (string-match - (concat "^" (regexp-quote - (file-name-as-directory - (expand-file-name gnus-cache-directory)))) - (directory-file-name directory)) - (nnheader-replace-chars-in-string - (substring (directory-file-name directory) (match-end 0)) - ?/ ?.))) - nums alphs) - (when top - (gnus-message 5 "Generating the cache active file...") - (setq gnus-cache-active-hashtb (gnus-make-hashtable 123))) - (when (string-match "^\\(nn[^_]+\\)_" group) - (setq group (replace-match "\\1:" t t group))) - ;; Separate articles from all other files and directories. - (while files - (if (string-match "^[0-9]+$" (file-name-nondirectory (car files))) - (push (string-to-int (file-name-nondirectory (pop files))) nums) - (push (pop files) alphs))) - ;; If we have nums, then this is probably a valid group. - (when (setq nums (sort nums '<)) - (gnus-sethash group (cons (car nums) (gnus-last-element nums)) - gnus-cache-active-hashtb)) - ;; Go through all the other files. - (while alphs - (when (and (file-directory-p (car alphs)) - (not (string-match "^\\." - (file-name-nondirectory (car alphs))))) - ;; We descend directories. - (gnus-cache-generate-active (car alphs))) - (setq alphs (cdr alphs))) - ;; Write the new active file. - (when top - (gnus-cache-write-active t) - (gnus-message 5 "Generating the cache active file...done")))) - -;;;###autoload -(defun gnus-cache-generate-nov-databases (dir) - "Generate NOV files recursively starting in DIR." - (interactive (list gnus-cache-directory)) - (gnus-cache-close) - (let ((nnml-generate-active-function 'identity)) - (nnml-generate-nov-databases-1 dir)) - (gnus-cache-open)) - -(defun gnus-cache-move-cache (dir) - "Move the cache tree to somewhere else." - (interactive "FMove the cache tree to: ") - (rename-file gnus-cache-directory dir)) - -(defun gnus-cache-fully-p (&optional group) - "Returns non-nil if the cache should be fully used. -If GROUP is non-nil, also cater to `gnus-cacheable-groups' and -`gnus-uncacheable-groups'." - (and gnus-use-cache - (not (eq gnus-use-cache 'passive)) - (if (null group) - t - (and (or (not gnus-cacheable-groups) - (string-match gnus-cacheable-groups group)) - (or (not gnus-uncacheable-groups) - (not (string-match gnus-uncacheable-groups group))))))) - -(provide 'gnus-cache) - -;;; gnus-cache.el ends here diff --git a/lisp/gnus-cite.el b/lisp/gnus-cite.el deleted file mode 100644 index 657313b..0000000 --- a/lisp/gnus-cite.el +++ /dev/null @@ -1,1000 +0,0 @@ -;;; gnus-cite.el --- parse citations in articles for Gnus -*- coding: iso-latin-1 -*- - -;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000 -;; Free Software Foundation, Inc. - -;; Author: Per Abhiddenware - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) -(eval-when-compile (require 'static)) - -(require 'gnus) -(require 'gnus-art) -(require 'gnus-range) -(require 'message) ; for message-cite-prefix-regexp - -;;; Customization: - -(defgroup gnus-cite nil - "Citation." - :prefix "gnus-cite-" - :link '(custom-manual "(gnus)Article Highlighting") - :group 'gnus-article) - -(defcustom gnus-cite-reply-regexp - "^\\(Subject: Re\\|In-Reply-To\\|References\\):" - "*If headers match this regexp it is reasonable to believe that -article has citations." - :group 'gnus-cite - :type 'string) - -(defcustom gnus-cite-always-check nil - "Check article always for citations. Set it t to check all articles." - :group 'gnus-cite - :type '(choice (const :tag "no" nil) - (const :tag "yes" t))) - -(defcustom gnus-cited-opened-text-button-line-format "%(%{[-]%}%)\n" - "Format of opened cited text buttons." - :group 'gnus-cite - :type 'string) - -(defcustom gnus-cited-closed-text-button-line-format "%(%{[+]%}%)\n" - "Format of closed cited text buttons." - :group 'gnus-cite - :type 'string) - -(defcustom gnus-cited-lines-visible nil - "The number of lines of hidden cited text to remain visible. -Or a pair (cons) of numbers which are the number of lines at the top -and bottom of the text, respectively, to remain visible." - :group 'gnus-cite - :type '(choice (const :tag "none" nil) - integer - (cons :tag "Top and Bottom" integer integer))) - -(defcustom gnus-cite-parse-max-size 25000 - "Maximum article size (in bytes) where parsing citations is allowed. -Set it to nil to parse all articles." - :group 'gnus-cite - :type '(choice (const :tag "all" nil) - integer)) - -(defcustom gnus-cite-max-prefix 20 - "Maximum possible length for a citation prefix." - :group 'gnus-cite - :type 'integer) - -(defcustom gnus-supercite-regexp - (concat "^\\(" message-cite-prefix-regexp "\\)? *" - ">>>>> +\"\\([^\"\n]+\\)\" +==") - "*Regexp matching normal Supercite attribution lines. -The first grouping must match prefixes added by other packages." - :group 'gnus-cite - :type 'regexp) - -(defcustom gnus-supercite-secondary-regexp "^.*\"\\([^\"\n]+\\)\" +==" - "Regexp matching mangled Supercite attribution lines. -The first regexp group should match the Supercite attribution." - :group 'gnus-cite - :type 'regexp) - -(defcustom gnus-cite-minimum-match-count 2 - "Minimum number of identical prefixes before we believe it's a citation." - :group 'gnus-cite - :type 'integer) - -(defcustom gnus-cite-attribution-prefix - "In article\\|in <\\|On \\(Mon\\|Tue\\|Wed\\|Thu\\|Fri\\|Sat\\|Sun\\),\\|-----Original Message-----" - "*Regexp matching the beginning of an attribution line." - :group 'gnus-cite - :type 'regexp) - -(defcustom gnus-cite-attribution-suffix - "\\(\\(wrote\\|writes\\|said\\|says\\|>\\)\\(:\\|\\.\\.\\.\\)\\|-----Original Message-----\\)[ \t]*$" - "*Regexp matching the end of an attribution line. -The text matching the first grouping will be used as a button." - :group 'gnus-cite - :type 'regexp) - -(defface gnus-cite-attribution-face '((t - (:italic t))) - "Face used for attribution lines.") - -(defcustom gnus-cite-attribution-face 'gnus-cite-attribution-face - "Face used for attribution lines. -It is merged with the face for the cited text belonging to the attribution." - :group 'gnus-cite - :type 'face) - -(defface gnus-cite-face-1 '((((class color) - (background dark)) - (:foreground "light blue")) - (((class color) - (background light)) - (:foreground "MidnightBlue")) - (t - (:italic t))) - "Citation face.") - -(defface gnus-cite-face-2 '((((class color) - (background dark)) - (:foreground "light cyan")) - (((class color) - (background light)) - (:foreground "firebrick")) - (t - (:italic t))) - "Citation face.") - -(defface gnus-cite-face-3 '((((class color) - (background dark)) - (:foreground "light yellow")) - (((class color) - (background light)) - (:foreground "dark green")) - (t - (:italic t))) - "Citation face.") - -(defface gnus-cite-face-4 '((((class color) - (background dark)) - (:foreground "light pink")) - (((class color) - (background light)) - (:foreground "OrangeRed")) - (t - (:italic t))) - "Citation face.") - -(defface gnus-cite-face-5 '((((class color) - (background dark)) - (:foreground "pale green")) - (((class color) - (background light)) - (:foreground "dark khaki")) - (t - (:italic t))) - "Citation face.") - -(defface gnus-cite-face-6 '((((class color) - (background dark)) - (:foreground "beige")) - (((class color) - (background light)) - (:foreground "dark violet")) - (t - (:italic t))) - "Citation face.") - -(defface gnus-cite-face-7 '((((class color) - (background dark)) - (:foreground "orange")) - (((class color) - (background light)) - (:foreground "SteelBlue4")) - (t - (:italic t))) - "Citation face.") - -(defface gnus-cite-face-8 '((((class color) - (background dark)) - (:foreground "magenta")) - (((class color) - (background light)) - (:foreground "magenta")) - (t - (:italic t))) - "Citation face.") - -(defface gnus-cite-face-9 '((((class color) - (background dark)) - (:foreground "violet")) - (((class color) - (background light)) - (:foreground "violet")) - (t - (:italic t))) - "Citation face.") - -(defface gnus-cite-face-10 '((((class color) - (background dark)) - (:foreground "medium purple")) - (((class color) - (background light)) - (:foreground "medium purple")) - (t - (:italic t))) - "Citation face.") - -(defface gnus-cite-face-11 '((((class color) - (background dark)) - (:foreground "turquoise")) - (((class color) - (background light)) - (:foreground "turquoise")) - (t - (:italic t))) - "Citation face.") - -(defcustom gnus-cite-face-list - '(gnus-cite-face-1 gnus-cite-face-2 gnus-cite-face-3 gnus-cite-face-4 - gnus-cite-face-5 gnus-cite-face-6 gnus-cite-face-7 gnus-cite-face-8 - gnus-cite-face-9 gnus-cite-face-10 gnus-cite-face-11) - "*List of faces used for highlighting citations. - -When there are citations from multiple articles in the same message, -Gnus will try to give each citation from each article its own face. -This should make it easier to see who wrote what." - :group 'gnus-cite - :type '(repeat face)) - -(defcustom gnus-cite-hide-percentage 50 - "Only hide excess citation if above this percentage of the body." - :group 'gnus-cite - :type 'number) - -(defcustom gnus-cite-hide-absolute 10 - "Only hide excess citation if above this number of lines in the body." - :group 'gnus-cite - :type 'integer) - -;;; Internal Variables: - -(defvar gnus-cite-article nil) -(defvar gnus-cite-overlay-list nil) - -(defvar gnus-cite-prefix-alist nil) -;; Alist of citation prefixes. -;; The cdr is a list of lines with that prefix. - -(defvar gnus-cite-attribution-alist nil) -;; Alist of attribution lines. -;; The car is a line number. -;; The cdr is the prefix for the citation started by that line. - -(defvar gnus-cite-loose-prefix-alist nil) -;; Alist of citation prefixes that have no matching attribution. -;; The cdr is a list of lines with that prefix. - -(defvar gnus-cite-loose-attribution-alist nil) -;; Alist of attribution lines that have no matching citation. -;; Each member has the form (WROTE IN PREFIX TAG), where -;; WROTE: is the attribution line number -;; IN: is the line number of the previous line if part of the same attribution, -;; PREFIX: Is the citation prefix of the attribution line(s), and -;; TAG: Is a Supercite tag, if any. - -(defvar gnus-cited-opened-text-button-line-format-alist - `((?b (marker-position beg) ?d) - (?e (marker-position end) ?d) - (?n (count-lines beg end) ?d) - (?l (- end beg) ?d))) -(defvar gnus-cited-opened-text-button-line-format-spec nil) -(defvar gnus-cited-closed-text-button-line-format-alist - gnus-cited-opened-text-button-line-format-alist) -(defvar gnus-cited-closed-text-button-line-format-spec nil) - - -;;; Commands: - -(defun gnus-article-highlight-citation (&optional force) - "Highlight cited text. -Each citation in the article will be highlighted with a different face. -The faces are taken from `gnus-cite-face-list'. -Attribution lines are highlighted with the same face as the -corresponding citation merged with `gnus-cite-attribution-face'. - -Text is considered cited if at least `gnus-cite-minimum-match-count' -lines matches `message-cite-prefix-regexp' with the same prefix. - -Lines matching `gnus-cite-attribution-suffix' and perhaps -`gnus-cite-attribution-prefix' are considered attribution lines." - (interactive (list 'force)) - (save-excursion - (set-buffer gnus-article-buffer) - (gnus-cite-parse-maybe force) - (let ((buffer-read-only nil) - (alist gnus-cite-prefix-alist) - (faces gnus-cite-face-list) - (inhibit-point-motion-hooks t) - face entry prefix skip numbers number face-alist) - ;; Loop through citation prefixes. - (while alist - (setq entry (car alist) - alist (cdr alist) - prefix (car entry) - numbers (cdr entry) - face (car faces) - faces (or (cdr faces) gnus-cite-face-list) - face-alist (cons (cons prefix face) face-alist)) - (while numbers - (setq number (car numbers) - numbers (cdr numbers)) - (and (not (assq number gnus-cite-attribution-alist)) - (not (assq number gnus-cite-loose-attribution-alist)) - (gnus-cite-add-face number prefix face)))) - ;; Loop through attribution lines. - (setq alist gnus-cite-attribution-alist) - (while alist - (setq entry (car alist) - alist (cdr alist) - number (car entry) - prefix (cdr entry) - skip (gnus-cite-find-prefix number) - face (cdr (assoc prefix face-alist))) - ;; Add attribution button. - (goto-char (point-min)) - (forward-line (1- number)) - (when (re-search-forward gnus-cite-attribution-suffix - (save-excursion (end-of-line 1) (point)) - t) - (gnus-article-add-button (match-beginning 1) (match-end 1) - 'gnus-cite-toggle prefix)) - ;; Highlight attribution line. - (gnus-cite-add-face number skip face) - (gnus-cite-add-face number skip gnus-cite-attribution-face)) - ;; Loop through attribution lines. - (setq alist gnus-cite-loose-attribution-alist) - (while alist - (setq entry (car alist) - alist (cdr alist) - number (car entry) - skip (gnus-cite-find-prefix number)) - (gnus-cite-add-face number skip gnus-cite-attribution-face))))) - -(defun gnus-dissect-cited-text () - "Dissect the article buffer looking for cited text." - (save-excursion - (set-buffer gnus-article-buffer) - (gnus-cite-parse-maybe nil t) - (let ((alist gnus-cite-prefix-alist) - prefix numbers number marks m) - ;; Loop through citation prefixes. - (while alist - (setq numbers (pop alist) - prefix (pop numbers)) - (while numbers - (setq number (pop numbers)) - (goto-char (point-min)) - (forward-line number) - (push (cons (point-marker) "") marks) - (while (and numbers - (= (1- number) (car numbers))) - (setq number (pop numbers))) - (goto-char (point-min)) - (forward-line (1- number)) - (push (cons (point-marker) prefix) marks))) - ;; Skip to the beginning of the body. - (article-goto-body) - (push (cons (point-marker) "") marks) - ;; Find the end of the body. - (goto-char (point-max)) - (gnus-article-search-signature) - (push (cons (point-marker) "") marks) - ;; Sort the marks. - (setq marks (sort marks 'car-less-than-car)) - (let ((omarks marks)) - (setq marks nil) - (while (cdr omarks) - (if (= (caar omarks) (caadr omarks)) - (progn - (unless (equal (cdar omarks) "") - (push (car omarks) marks)) - (unless (equal (cdadr omarks) "") - (push (cadr omarks) marks)) - (unless (and (equal (cdar omarks) "") - (equal (cdadr omarks) "") - (not (cddr omarks))) - (setq omarks (cdr omarks)))) - (push (car omarks) marks)) - (setq omarks (cdr omarks))) - (when (car omarks) - (push (car omarks) marks)) - (setq marks (setq m (nreverse marks))) - (while (cddr m) - (if (and (equal (cdadr m) "") - (equal (cdar m) (cdaddr m)) - (goto-char (caadr m)) - (forward-line 1) - (= (point) (caaddr m))) - (setcdr m (cdddr m)) - (setq m (cdr m)))) - marks)))) - -(defun gnus-article-fill-cited-article (&optional force width) - "Do word wrapping in the current article. -If WIDTH (the numerical prefix), use that text width when filling." - (interactive (list t current-prefix-arg)) - (save-excursion - (set-buffer gnus-article-buffer) - (let ((buffer-read-only nil) - (inhibit-point-motion-hooks t) - (marks (gnus-dissect-cited-text)) - (adaptive-fill-mode nil) - (filladapt-mode nil) - (fill-column (if width (prefix-numeric-value width) fill-column))) - (save-restriction - (while (cdr marks) - (narrow-to-region (caar marks) (caadr marks)) - (let ((adaptive-fill-regexp - (concat "^" (regexp-quote (cdar marks)) " *")) - (fill-prefix - (if (string= (cdar marks) "") "" - (concat (cdar marks) " ")))) - (fill-region (point-min) (point-max))) - (set-marker (caar marks) nil) - (setq marks (cdr marks))) - (when marks - (set-marker (caar marks) nil)) - ;; All this information is now incorrect. - (setq gnus-cite-prefix-alist nil - gnus-cite-attribution-alist nil - gnus-cite-loose-prefix-alist nil - gnus-cite-loose-attribution-alist nil - gnus-cite-article nil))))) - -(defun gnus-article-hide-citation (&optional arg force) - "Toggle hiding of all cited text except attribution lines. -See the documentation for `gnus-article-highlight-citation'. -If given a negative prefix, always show; if given a positive prefix, -always hide." - (interactive (append (gnus-article-hidden-arg) (list 'force))) - (gnus-set-format 'cited-opened-text-button t) - (gnus-set-format 'cited-closed-text-button t) - (save-excursion - (set-buffer gnus-article-buffer) - (let ((buffer-read-only nil) - marks - (inhibit-point-motion-hooks t) - (props (nconc (list 'article-type 'cite) - gnus-hidden-properties)) - (point (point-min)) - found beg end start) - (while (setq point - (text-property-any point (point-max) - 'gnus-callback - 'gnus-article-toggle-cited-text)) - (setq found t) - (goto-char point) - (gnus-article-toggle-cited-text - (get-text-property point 'gnus-data) arg) - (forward-line 1) - (setq point (point))) - (unless found - (setq marks (gnus-dissect-cited-text)) - (while marks - (setq beg nil - end nil) - (while (and marks (string= (cdar marks) "")) - (setq marks (cdr marks))) - (when marks - (setq beg (caar marks))) - (while (and marks (not (string= (cdar marks) ""))) - (setq marks (cdr marks))) - (when marks - (setq end (caar marks))) - ;; Skip past lines we want to leave visible. - (when (and beg end gnus-cited-lines-visible) - (goto-char beg) - (forward-line (if (consp gnus-cited-lines-visible) - (car gnus-cited-lines-visible) - gnus-cited-lines-visible)) - (if (>= (point) end) - (setq beg nil) - (setq beg (point-marker)) - (when (consp gnus-cited-lines-visible) - (goto-char end) - (forward-line (- (cdr gnus-cited-lines-visible))) - (if (<= (point) beg) - (setq beg nil) - (setq end (point-marker)))))) - (when (and beg end) - ;; We use markers for the end-points to facilitate later - ;; wrapping and mangling of text. - (setq beg (set-marker (make-marker) beg) - end (set-marker (make-marker) end)) - (gnus-add-text-properties-when 'article-type nil beg end props) - (goto-char beg) - (unless (save-excursion (search-backward "\n\n" nil t)) - (insert "\n")) - (put-text-property - (setq start (point-marker)) - (progn - (gnus-article-add-button - (point) - (progn (eval gnus-cited-closed-text-button-line-format-spec) - (point)) - `gnus-article-toggle-cited-text - (list (cons beg end) start)) - (point)) - 'article-type 'annotation) - (set-marker beg (point)))))))) - -(defun gnus-article-toggle-cited-text (args &optional arg) - "Toggle hiding the text in REGION. -ARG can be nil or a number. Positive means hide, negative -means show, nil means toggle." - (let* ((region (car args)) - (beg (car region)) - (end (cdr region)) - (start (cadr args)) - (hidden - (text-property-any beg (1- end) 'article-type 'cite)) - (inhibit-point-motion-hooks t) - buffer-read-only) - (when (or (null arg) - (zerop arg) - (and (> arg 0) (not hidden)) - (and (< arg 0) hidden)) - (if hidden - (gnus-remove-text-properties-when - 'article-type 'cite beg end - (cons 'article-type (cons 'cite - gnus-hidden-properties))) - (gnus-add-text-properties-when - 'article-type nil beg end - (cons 'article-type (cons 'cite - gnus-hidden-properties)))) - (save-excursion - (goto-char start) - (gnus-delete-line) - (put-text-property - (point) - (progn - (gnus-article-add-button - (point) - (progn (eval - (if hidden - gnus-cited-opened-text-button-line-format-spec - gnus-cited-closed-text-button-line-format-spec)) - (point)) - `gnus-article-toggle-cited-text - args) - (point)) - 'article-type 'annotation))))) - -(defun gnus-article-hide-citation-maybe (&optional arg force) - "Toggle hiding of cited text that has an attribution line. -If given a negative prefix, always show; if given a positive prefix, -always hide. -This will do nothing unless at least `gnus-cite-hide-percentage' -percent and at least `gnus-cite-hide-absolute' lines of the body is -cited text with attributions. When called interactively, these two -variables are ignored. -See also the documentation for `gnus-article-highlight-citation'." - (interactive (append (gnus-article-hidden-arg) '(force))) - (unless (gnus-article-check-hidden-text 'cite arg) - (save-excursion - (set-buffer gnus-article-buffer) - (gnus-cite-parse-maybe force) - (article-goto-body) - (let ((start (point)) - (atts gnus-cite-attribution-alist) - (buffer-read-only nil) - (inhibit-point-motion-hooks t) - (hidden 0) - total) - (goto-char (point-max)) - (gnus-article-search-signature) - (setq total (count-lines start (point))) - (while atts - (setq hidden (+ hidden (length (cdr (assoc (cdar atts) - gnus-cite-prefix-alist)))) - atts (cdr atts))) - (when (or force - (and (> (* 100 hidden) (* gnus-cite-hide-percentage total)) - (> hidden gnus-cite-hide-absolute))) - (setq atts gnus-cite-attribution-alist) - (while atts - (setq total (cdr (assoc (cdar atts) gnus-cite-prefix-alist)) - atts (cdr atts)) - (while total - (setq hidden (car total) - total (cdr total)) - (goto-char (point-min)) - (forward-line (1- hidden)) - (unless (assq hidden gnus-cite-attribution-alist) - (gnus-add-text-properties - (point) (progn (forward-line 1) (point)) - (nconc (list 'article-type 'cite) - gnus-hidden-properties)))))))))) - -(defun gnus-article-hide-citation-in-followups () - "Hide cited text in non-root articles." - (interactive) - (save-excursion - (set-buffer gnus-article-buffer) - (let ((article (cdr gnus-article-current))) - (unless (save-excursion - (set-buffer gnus-summary-buffer) - (gnus-article-displayed-root-p article)) - (gnus-article-hide-citation))))) - -;;; Internal functions: - -(defun gnus-cite-parse-maybe (&optional force no-overlay) - "Always parse the buffer." - (gnus-cite-localize) - ;;Reset parser information. - (setq gnus-cite-prefix-alist nil - gnus-cite-attribution-alist nil - gnus-cite-loose-prefix-alist nil - gnus-cite-loose-attribution-alist nil) - (unless no-overlay - (gnus-cite-delete-overlays)) - ;; Parse if not too large. - (if (and gnus-cite-parse-max-size - (> (buffer-size) gnus-cite-parse-max-size)) - () - (setq gnus-cite-article (cons (car gnus-article-current) - (cdr gnus-article-current))) - (gnus-cite-parse-wrapper))) - -(defun gnus-cite-delete-overlays () - (dolist (overlay gnus-cite-overlay-list) - (when (or (not (gnus-overlay-end overlay)) - (and (>= (gnus-overlay-end overlay) (point-min)) - (<= (gnus-overlay-end overlay) (point-max)))) - (setq gnus-cite-overlay-list (delete overlay gnus-cite-overlay-list)) - (gnus-delete-overlay overlay)))) - -(defun gnus-cite-parse-wrapper () - ;; Wrap chopped gnus-cite-parse. - (article-goto-body) - (let ((inhibit-point-motion-hooks t)) - (save-excursion - (gnus-cite-parse-attributions)) - (save-excursion - (gnus-cite-parse)) - (save-excursion - (gnus-cite-connect-attributions)))) - -(defun gnus-cite-parse () - ;; Parse and connect citation prefixes and attribution lines. - - ;; Parse current buffer searching for citation prefixes. - (let ((line (1+ (count-lines (point-min) (point)))) - (case-fold-search t) - (max (save-excursion - (goto-char (point-max)) - (gnus-article-search-signature) - (point))) - (prefix-regexp (concat "^\\(" message-cite-prefix-regexp "\\)")) - alist entry start begin end numbers prefix guess-limit mc-flag) - ;; Get all potential prefixes in `alist'. - (while (< (point) max) - ;; Each line. - (setq begin (point) - guess-limit (progn (skip-chars-forward "^> \t\r\n") (point)) - end (progn (beginning-of-line 2) (point)) - start end) - (goto-char begin) - ;; Ignore standard Supercite attribution prefix. - (when (and (< guess-limit (+ begin gnus-cite-max-prefix)) - (looking-at gnus-supercite-regexp)) - (if (match-end 1) - (setq end (1+ (match-end 1))) - (setq end (1+ begin)))) - ;; Ignore very long prefixes. - (when (> end (+ begin gnus-cite-max-prefix)) - (setq end (+ begin gnus-cite-max-prefix))) - (while (re-search-forward prefix-regexp (1- end) t) - ;; Each prefix. - (setq end (match-end 0) - prefix (buffer-substring begin end)) - (gnus-set-text-properties 0 (length prefix) nil prefix) - (setq entry (assoc prefix alist)) - (if entry - (setcdr entry (cons line (cdr entry))) - (push (list prefix line) alist)) - (goto-char begin)) - (goto-char start) - (setq line (1+ line))) - ;; We got all the potential prefixes. Now create - ;; `gnus-cite-prefix-alist' containing the oldest prefix for each - ;; line that appears at least gnus-cite-minimum-match-count - ;; times. First sort them by length. Longer is older. - (setq alist (sort alist (lambda (a b) - (> (length (car a)) (length (car b)))))) - (while alist - (setq entry (car alist) - prefix (car entry) - numbers (cdr entry) - alist (cdr alist)) - (cond ((null numbers) - ;; No lines with this prefix that wasn't also part of - ;; a longer prefix. - ) - ((< (length numbers) gnus-cite-minimum-match-count) - ;; Too few lines with this prefix. We keep it a bit - ;; longer in case it is an exact match for an attribution - ;; line, but we don't remove the line from other - ;; prefixes. - (push entry gnus-cite-prefix-alist)) - (t - (push entry - gnus-cite-prefix-alist) - ;; Remove articles from other prefixes. - (let ((loop alist) - current) - (while loop - (setq current (car loop) - loop (cdr loop)) - (setcdr current - (gnus-set-difference (cdr current) numbers))))))))) - -(defun gnus-cite-parse-attributions () - (let (al-alist) - ;; Parse attributions - (while (re-search-forward gnus-cite-attribution-suffix (point-max) t) - (let* ((start (match-beginning 0)) - (end (match-end 0)) - (wrote (count-lines (point-min) end)) - (prefix (gnus-cite-find-prefix wrote)) - ;; Check previous line for an attribution leader. - (tag (progn - (beginning-of-line 1) - (when (looking-at gnus-supercite-secondary-regexp) - (buffer-substring (match-beginning 1) - (match-end 1))))) - (in (progn - (goto-char start) - (and (re-search-backward gnus-cite-attribution-prefix - (save-excursion - (beginning-of-line 0) - (point)) - t) - (not (re-search-forward gnus-cite-attribution-suffix - start t)) - (count-lines (point-min) (1+ (point))))))) - (when (eq wrote in) - (setq in nil)) - (goto-char end) - ;; don't add duplicates - (let ((al (buffer-substring (save-excursion (beginning-of-line 0) - (1+ (point))) - end))) - (if (not (assoc al al-alist)) - (progn - (push (list wrote in prefix tag) - gnus-cite-loose-attribution-alist) - (push (cons al t) al-alist)))))))) - -(defun gnus-cite-connect-attributions () - ;; Connect attributions to citations - - ;; No citations have been connected to attribution lines yet. - (setq gnus-cite-loose-prefix-alist (append gnus-cite-prefix-alist nil)) - - ;; Parse current buffer searching for attribution lines. - ;; Find exact supercite citations. - (gnus-cite-match-attributions 'small nil - (lambda (prefix tag) - (when tag - (concat "\\`" - (regexp-quote prefix) "[ \t]*" - (regexp-quote tag) ">")))) - ;; Find loose supercite citations after attributions. - (gnus-cite-match-attributions 'small t - (lambda (prefix tag) - (when tag - (concat "\\<" - (regexp-quote tag) - "\\>")))) - ;; Find loose supercite citations anywhere. - (gnus-cite-match-attributions 'small nil - (lambda (prefix tag) - (when tag - (concat "\\<" - (regexp-quote tag) - "\\>")))) - ;; Find nested citations after attributions. - (gnus-cite-match-attributions 'small-if-unique t - (lambda (prefix tag) - (concat "\\`" (regexp-quote prefix) ".+"))) - ;; Find nested citations anywhere. - (gnus-cite-match-attributions 'small nil - (lambda (prefix tag) - (concat "\\`" (regexp-quote prefix) ".+"))) - ;; Remove loose prefixes with too few lines. - (let ((alist gnus-cite-loose-prefix-alist) - entry) - (while alist - (setq entry (car alist) - alist (cdr alist)) - (when (< (length (cdr entry)) gnus-cite-minimum-match-count) - (setq gnus-cite-prefix-alist - (delq entry gnus-cite-prefix-alist) - gnus-cite-loose-prefix-alist - (delq entry gnus-cite-loose-prefix-alist))))) - ;; Find flat attributions. - (gnus-cite-match-attributions 'first t nil) - ;; Find any attributions (are we getting desperate yet?). - (gnus-cite-match-attributions 'first nil nil)) - -(defun gnus-cite-match-attributions (sort after fun) - ;; Match all loose attributions and citations (SORT AFTER FUN) . - ;; - ;; If SORT is `small', the citation with the shortest prefix will be - ;; used, if it is `first' the first prefix will be used, if it is - ;; `small-if-unique' the shortest prefix will be used if the - ;; attribution line does not share its own prefix with other - ;; loose attribution lines, otherwise the first prefix will be used. - ;; - ;; If AFTER is non-nil, only citations after the attribution line - ;; will be considered. - ;; - ;; If FUN is non-nil, it will be called with the arguments (WROTE - ;; PREFIX TAG) and expected to return a regular expression. Only - ;; citations whose prefix matches the regular expression will be - ;; considered. - ;; - ;; WROTE is the attribution line number. - ;; PREFIX is the attribution line prefix. - ;; TAG is the Supercite tag on the attribution line. - (let ((atts gnus-cite-loose-attribution-alist) - (case-fold-search t) - att wrote in prefix tag regexp limit smallest best size) - (while atts - (setq att (car atts) - atts (cdr atts) - wrote (nth 0 att) - in (nth 1 att) - prefix (nth 2 att) - tag (nth 3 att) - regexp (if fun (funcall fun prefix tag) "") - size (cond ((eq sort 'small) t) - ((eq sort 'first) nil) - (t (< (length (gnus-cite-find-loose prefix)) 2))) - limit (if after wrote -1) - smallest 1000000 - best nil) - (let ((cites gnus-cite-loose-prefix-alist) - cite candidate numbers first compare) - (while cites - (setq cite (car cites) - cites (cdr cites) - candidate (car cite) - numbers (cdr cite) - first (apply 'min numbers) - compare (if size (length candidate) first)) - (and (> first limit) - regexp - (string-match regexp candidate) - (< compare smallest) - (setq best cite - smallest compare)))) - (if (null best) - () - (setq gnus-cite-loose-attribution-alist - (delq att gnus-cite-loose-attribution-alist)) - (push (cons wrote (car best)) gnus-cite-attribution-alist) - (when in - (push (cons in (car best)) gnus-cite-attribution-alist)) - (when (memq best gnus-cite-loose-prefix-alist) - (let ((loop gnus-cite-prefix-alist) - (numbers (cdr best)) - current) - (setq gnus-cite-loose-prefix-alist - (delq best gnus-cite-loose-prefix-alist)) - (while loop - (setq current (car loop) - loop (cdr loop)) - (if (eq current best) - () - (setcdr current (gnus-set-difference (cdr current) numbers)) - (when (null (cdr current)) - (setq gnus-cite-loose-prefix-alist - (delq current gnus-cite-loose-prefix-alist) - atts (delq current atts))))))))))) - -(defun gnus-cite-find-loose (prefix) - ;; Return a list of loose attribution lines prefixed by PREFIX. - (let* ((atts gnus-cite-loose-attribution-alist) - att line lines) - (while atts - (setq att (car atts) - line (car att) - atts (cdr atts)) - (when (string-equal (gnus-cite-find-prefix line) prefix) - (push line lines))) - lines)) - -(defun gnus-cite-add-face (number prefix face) - ;; At line NUMBER, ignore PREFIX and add FACE to the rest of the line. - (when face - (let ((inhibit-point-motion-hooks t) - from to overlay) - (goto-char (point-min)) - (when (zerop (forward-line (1- number))) - (static-if (or (featurep 'xemacs) - (and (eq emacs-major-version 20) - (>= emacs-minor-version 3)) - (>= emacs-major-version 21)) - (forward-char (length prefix)) - (move-to-column (string-width prefix))) - (skip-chars-forward " \t") - (setq from (point)) - (end-of-line 1) - (skip-chars-backward " \t") - (setq to (point)) - (when (< from to) - (push (setq overlay (gnus-make-overlay from to)) - gnus-cite-overlay-list) - (gnus-overlay-put overlay 'face face)))))) - -(defun gnus-cite-toggle (prefix) - (save-excursion - (set-buffer gnus-article-buffer) - (gnus-cite-parse-maybe nil t) - (let ((buffer-read-only nil) - (numbers (cdr (assoc prefix gnus-cite-prefix-alist))) - (inhibit-point-motion-hooks t) - number) - (while numbers - (setq number (car numbers) - numbers (cdr numbers)) - (goto-char (point-min)) - (forward-line (1- number)) - (cond ((get-text-property (point) 'invisible) - (remove-text-properties (point) (progn (forward-line 1) (point)) - gnus-hidden-properties)) - ((assq number gnus-cite-attribution-alist)) - (t - (gnus-add-text-properties - (point) (progn (forward-line 1) (point)) - (nconc (list 'article-type 'cite) - gnus-hidden-properties)))))))) - -(defun gnus-cite-find-prefix (line) - ;; Return citation prefix for LINE. - (let ((alist gnus-cite-prefix-alist) - (prefix "") - entry) - (while alist - (setq entry (car alist) - alist (cdr alist)) - (when (memq line (cdr entry)) - (setq prefix (car entry)))) - prefix)) - -(defun gnus-cite-localize () - "Make the citation variables local to the article buffer." - (let ((vars '(gnus-cite-article - gnus-cite-overlay-list gnus-cite-prefix-alist - gnus-cite-attribution-alist gnus-cite-loose-prefix-alist - gnus-cite-loose-attribution-alist))) - (while vars - (make-local-variable (pop vars))))) - -(gnus-ems-redefine) - -(provide 'gnus-cite) - -;; Local Variables: -;; coding: iso-8859-1 -;; End: - -;;; gnus-cite.el ends here diff --git a/lisp/gnus-clfns.el b/lisp/gnus-clfns.el deleted file mode 100644 index 123b9b1..0000000 --- a/lisp/gnus-clfns.el +++ /dev/null @@ -1,411 +0,0 @@ -;;; gnus-clfns.el --- compiler macros for emulating cl functions -;; Copyright (C) 2000, 2001 Free Software Foundation, Inc. - -;; Author: Kastsumi Yamaoka -;; Keywords: cl, compile - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;; This module is for mainly avoiding cl runtime functions in FSF -;; Emacsen. Function should also be defined as an ordinary function -;; if it will not be provided in cl. - -;;; Code: - -(if (featurep 'xemacs) - nil - (eval-when-compile (require 'cl)) - (require 'pym) - - (define-compiler-macro butlast (&whole form x &optional n) - (if (and (fboundp 'butlast) - (subrp (symbol-function 'butlast))) - form - (if n - `(let ((x ,x) - (n ,n)) - (if (and n (<= n 0)) - x - (let ((m (length x))) - (or n (setq n 1)) - (and (< n m) - (progn - (if (> n 0) (setcdr (nthcdr (- (1- m) n) x) nil)) - x))))) - `(let* ((x ,x) - (m (length x))) - (and (< 1 m) - (progn - (setcdr (nthcdr (- m 2) x) nil) - x)))))) - - (define-compiler-macro coerce (&whole form x type) - (if (and (fboundp 'coerce) - (subrp (symbol-function 'coerce))) - form - `(let ((x ,x) - (type ,type)) - (cond ((eq type 'list) (if (listp x) x (append x nil))) - ((eq type 'vector) (if (vectorp x) x (vconcat x))) - ((eq type 'string) (if (stringp x) x (concat x))) - ((eq type 'array) (if (arrayp x) x (vconcat x))) - ((and (eq type 'character) (stringp x) (= (length x) 1)) - (aref x 0)) - ((and (eq type 'character) (symbolp x) - (= (length (symbol-name x)) 1)) - (aref (symbol-name x) 0)) - ((eq type 'float) (float x)) - ((typep x type) x) - (t (error "Can't coerce %s to type %s" x type)))))) - - (define-compiler-macro copy-list (&whole form list) - (if (and (fboundp 'copy-list) - (subrp (symbol-function 'copy-list))) - form - `(let ((list ,list)) - (if (consp list) - (let ((res nil)) - (while (consp list) (push (pop list) res)) - (prog1 (nreverse res) (setcdr res list))) - (car list))))) - - (define-compiler-macro last (&whole form x &optional n) - (if (and (fboundp 'last) - (subrp (symbol-function 'last))) - form - (if n - `(let* ((x ,x) - (n ,n) - (m 0) - (p x)) - (while (consp p) - (incf m) - (pop p)) - (if (<= n 0) - p - (if (< n m) - (nthcdr (- m n) x) - x))) - `(let ((x ,x)) - (while (consp (cdr x)) - (pop x)) - x)))) - - (define-compiler-macro merge (&whole form type seq1 seq2 pred &rest keys) - (if (and (fboundp 'merge) - (subrp (symbol-function 'merge))) - form - `(let ((type ,type) - (seq1 ,seq1) - (seq2 ,seq2) - (pred ,pred)) - (or (listp seq1) (setq seq1 (append seq1 nil))) - (or (listp seq2) (setq seq2 (append seq2 nil))) - (let ((res nil)) - (while (and seq1 seq2) - (if (funcall pred (car seq2) (car seq1)) - (push (pop seq2) res) - (push (pop seq1) res))) - (coerce (nconc (nreverse res) seq1 seq2) type))))) - - (define-compiler-macro string (&whole form &rest args) - (if (and (fboundp 'string) - (subrp (symbol-function 'string))) - form - (list 'concat (cons 'list args)))) - - (defun-maybe string (&rest args) - "Concatenate all the argument characters and make the result a string." - (concat args)) - - (define-compiler-macro string-to-list (&whole form string) - (cond ((fboundp 'string-to-list) - form) - ((fboundp 'string-to-char-list) - (list 'string-to-char-list string)) - (t - `(let* ((str ,string) - (len (length str)) - (idx 0) - c l) - (while (< idx len) - (setq c (sref str idx)) - (setq idx (+ idx (char-bytes c))) - (setq l (cons c l))) - (nreverse l))))) - - ;; 92.7.2 by K.Handa (imported from Mule 2.3) - (defun-maybe string-to-list (str) - (let ((len (length str)) - (idx 0) - c l) - (while (< idx len) - (setq c (sref str idx)) - (setq idx (+ idx (char-bytes c))) - (setq l (cons c l))) - (nreverse l))) - - (define-compiler-macro subseq (&whole form seq start &optional end) - (if (and (fboundp 'subseq) - (subrp (symbol-function 'subseq))) - form - (if end - `(let ((seq ,seq) - (start ,start) - (end ,end)) - (if (stringp seq) - (substring seq start end) - (let (len) - (if (< end 0) - (setq end (+ end (setq len (length seq))))) - (if (< start 0) - (setq start (+ start (or len (setq len (length seq)))))) - (cond ((listp seq) - (if (> start 0) - (setq seq (nthcdr start seq))) - (let ((res nil)) - (while (>= (setq end (1- end)) start) - (push (pop seq) res)) - (nreverse res))) - (t - (let ((res (make-vector (max (- end start) 0) nil)) - (i 0)) - (while (< start end) - (aset res i (aref seq start)) - (setq i (1+ i) - start (1+ start))) - res)))))) - `(let ((seq ,seq) - (start ,start)) - (if (stringp seq) - (substring seq start) - (let (len) - (if (< start 0) - (setq start (+ start (or len (setq len (length seq)))))) - (cond ((listp seq) - (if (> start 0) - (setq seq (nthcdr start seq))) - (copy-sequence seq)) - (t - (let* ((end (or len (length seq))) - (res (make-vector (max (- end start) 0) nil)) - (i 0)) - (while (< start end) - (aset res i (aref seq start)) - (setq i (1+ i) - start (1+ start))) - res))))))))) - ) - -;; A tool for the developers. - -(defvar cl-run-time-functions - '(Values - Values-list acons assoc-if assoc-if-not build-klist butlast ceiling* - coerce common-lisp-indent-function compiler-macroexpand concatenate - copy-list count count-if count-if-not delete* delete-duplicates delete-if - delete-if-not duplicate-symbols-p elt-satisfies-test-p equalp evenp every - extract-from-klist fill find find-if find-if-not floatp-safe floor* gcd - gensym gentemp get-setf-method getf hash-table-count hash-table-p - intersection isqrt keyword-argument-supplied-p keyword-of keywordp last - lcm ldiff lisp-indent-259 lisp-indent-do lisp-indent-function-lambda-hack - lisp-indent-report-bad-format lisp-indent-tagbody list-length - make-hash-table make-random-state map mapc mapcan mapcar* mapcon mapl - maplist member-if member-if-not merge mismatch mod* nbutlast nintersection - notany notevery nreconc nset-difference nset-exclusive-or nsublis nsubst - nsubst-if nsubst-if-not nsubstitute nsubstitute-if nsubstitute-if-not - nunion oddp pair-with-newsyms pairlis position position-if position-if-not - proclaim random* random-state-p rassoc* rassoc-if rassoc-if-not - reassemble-argslists reduce rem* remove remove* remove-duplicates - remove-if remove-if-not remq replace revappend round* safe-idiv search - set-difference set-exclusive-or setelt setnth setnthcdr signum some sort* - stable-sort sublis subseq subsetp subst subst-if subst-if-not substitute - substitute-if substitute-if-not tailp tree-equal truncate* union - unzip-lists zip-lists) - "A list of CL run-time functions. Some functions were built-in, nowadays.") - -;;;###autoload -(defun find-cl-run-time-functions (file-or-directory arg) - "Find CL run-time functions in the FILE-OR-DIRECTORY. You can alter -the behavior of this command with the prefix ARG as described below. - -By default, it searches for all the CL run-time functions listed in - the variable `cl-run-time-functions'. -With 1 or 3 \\[universal-argument]'s, the built-in functions in this Emacs\ - will not be - reported. -With 2 or 3 \\[universal-argument]'s, just the symbols will also be reported. - -You can use the `digit-argument' 1, 2 or 3 instead of\ - \\[universal-argument]'s." - (interactive (list (read-file-name "Find CL run-time functions in: " - nil default-directory t) - current-prefix-arg)) - (unless (interactive-p) - (error "You should invoke `M-x find-cl-run-time-functions' interactively")) - (let ((report-symbols (member arg '((16) (64) 2 3))) - files clfns working file lines form forms fns fn newform buffer - window scroll - buffer-file-format format-alist - insert-file-contents-post-hook insert-file-contents-pre-hook) - (cond ((file-directory-p file-or-directory) - (setq files (directory-files file-or-directory t "\\.el$")) - (dolist (file files) - (unless (file-exists-p file) - (setq files (delete file files)))) - (unless files - (message "No files found in: %s" file-or-directory)) - files) - ((file-exists-p file-or-directory) - (setq files (list file-or-directory))) - (t - (message "No such file or directory: %s" file-or-directory))) - (when files - (if (member arg '((4) (64) 1 3)) - (dolist (fn cl-run-time-functions) - (unless (and (fboundp fn) - (subrp (symbol-function fn))) - (push fn clfns))) - (setq clfns cl-run-time-functions)) - (set-buffer (setq working - (get-buffer-create - " *Searching for CL run-time functions*"))) - (let (emacs-lisp-mode-hook) - (emacs-lisp-mode)) - (while files - (setq file (pop files) - lines (list nil nil)) - (message "Searching for CL run-time functions in: %s..." - (file-name-nondirectory file)) - (insert-file-contents file nil nil nil t) - ;; XEmacs moves point to the beginning of the buffer after - ;; inserting a file, FSFmacs doesn't so if the fifth argument - ;; of `insert-file-contents' is specified. - (goto-char (point-min)) - ;; - (while (progn - (while (and (looking-at "[\t\v\f\r ]*\\(;.*\\)?$") - (zerop (forward-line 1)))) - (not (eobp))) - (setcar lines (if (bolp) - (1+ (count-lines (point-min) (point))) - (count-lines (point-min) (point)))) - (when (consp;; Ignore stand-alone symbols, strings, etc. - (setq form (condition-case nil - (read working) - (error nil)))) - (setcdr lines (list (count-lines (point-min) (point)))) - (setq forms (list form) - fns nil) - (while forms - (setq form (pop forms)) - (when (consp form) - (setq fn (pop form)) - (cond ((memq fn '(apply mapatoms mapcar mapconcat - mapextent symbol-function)) - (if (consp (car form)) - (when (memq (caar form) '(\` backquote quote)) - (setcar form (cdar form))) - (setq form (cdr form)))) - ((memq fn '(\` backquote quote)) - (if report-symbols - (progn - (setq form (car form) - newform nil) - (while form - (push (list (or (car-safe form) form)) - newform) - (setq form (cdr-safe form))) - (setq form (nreverse newform))) - (setq form nil))) - ((memq fn '(defadvice - defmacro defsubst defun - defmacro-maybe defmacro-maybe-cond - defsubst-maybe defun-maybe - defun-maybe-cond)) - (setq form (cddr form))) - ((memq fn '(defalias lambda fset)) - (setq form (cdr form))) - ((eq fn 'define-compiler-macro) - (setq form nil)) - ((eq fn 'dolist) - (setcar form (cadar form))) - ((memq fn '(let let*)) - (setq form - (append - (delq nil - (mapcar - (lambda (element) - (when (and (consp element) - (consp (cadr element))) - (cadr element))) - (car form))) - (cdr form)))) - ((eq fn 'sort) - (when (and (consp (cadr form)) - (memq (caadr form) '(\` backquote quote))) - (setcdr form (list (cdadr form))))) - ((and (memq fn clfns) - (listp form)) - (push fn fns))) - (setq forms (append form forms)))) - (when fns - (if buffer - (set-buffer buffer) - (display-buffer - (setq buffer (get-buffer-create - (concat "*CL run-time functions in: " - file-or-directory "*")))) - (set-buffer buffer) - (erase-buffer) - (setq window (get-buffer-window buffer t) - scroll (- 2 (window-height window)) - fill-column (max 16 (- (window-width window) 2)) - fill-prefix " ")) - (when file - (insert file "\n") - (setq file nil)) - (narrow-to-region - (point) - (progn - (insert fill-prefix - (mapconcat (lambda (fn) (format "%s" fn)) - (nreverse fns) " ")) - (point))) - (fill-region (point-min) (point-max)) - (goto-char (point-min)) - (widen) - (delete-char 14) - (insert (format "%5d - %5d:" (car lines) (cadr lines))) - (goto-char (point-max)) - (forward-line scroll) - (set-window-start window (point)) - (goto-char (point-max)) - (sit-for 0) - (set-buffer working))))) - (kill-buffer working) - (if buffer - (message "Done") - (message "No CL run-time functions found in: %s" - file-or-directory))))) - -(provide 'gnus-clfns) - -;;; gnus-clfns.el ends here diff --git a/lisp/gnus-cus.el b/lisp/gnus-cus.el deleted file mode 100644 index d32f65f..0000000 --- a/lisp/gnus-cus.el +++ /dev/null @@ -1,762 +0,0 @@ -;;; gnus-cus.el --- customization commands for Gnus -;; -;; Copyright (C) 1996,1999, 2000 Free Software Foundation, Inc. - -;; Author: Per Abrahamsen -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; Code: - -(require 'wid-edit) -(require 'gnus) -(require 'gnus-score) -(require 'gnus-topic) -(require 'gnus-art) - -;;; Widgets: - -(defun gnus-custom-mode () - "Major mode for editing Gnus customization buffers. - -The following commands are available: - -\\[widget-forward] Move to next button or editable field. -\\[widget-backward] Move to previous button or editable field. -\\[widget-button-click] Activate button under the mouse pointer. -\\[widget-button-press] Activate button under point. - -Entry to this mode calls the value of `gnus-custom-mode-hook' -if that value is non-nil." - (kill-all-local-variables) - (setq major-mode 'gnus-custom-mode - mode-name "Gnus Customize") - (use-local-map widget-keymap) - ;; Emacs 21 stuff: - (when (and (facep 'custom-button-face) - (facep 'custom-button-pressed-face)) - (set (make-local-variable 'widget-button-face) - 'custom-button-face) - (set (make-local-variable 'widget-button-pressed-face) - 'custom-button-pressed-face) - (set (make-local-variable 'widget-mouse-face) - 'custom-button-pressed-face)) - (when (and (boundp 'custom-raised-buttons) - (symbol-value 'custom-raised-buttons)) - (set (make-local-variable 'widget-push-button-prefix) "") - (set (make-local-variable 'widget-push-button-suffix) "") - (set (make-local-variable 'widget-link-prefix) "") - (set (make-local-variable 'widget-link-suffix) "")) - (gnus-run-hooks 'gnus-custom-mode-hook)) - -;;; Group Customization: - -(defconst gnus-group-parameters - '((extra-aliases (choice - :tag "Extra Aliases" - (list - :tag "List" - (editable-list - :inline t - (gnus-email-address :tag "Address"))) - (gnus-email-address :tag "Address")) "\ -Store messages posted from or to this address in this group. - -You must be using gnus-group-split for this to work. The VALUE of the -nnmail-split-fancy SPLIT generated for this group will match these -addresses.") - - (split-regexp (regexp :tag "gnus-group-split Regular Expression") "\ -Like gnus-group-split Address, but expects a regular expression.") - - (split-exclude (list :tag "gnus-group-split Restricts" - (editable-list - :inline t (regexp :tag "Restrict"))) "\ -Regular expression that cancels gnus-group-split matches. - -Each entry is added to the nnmail-split-fancy SPLIT as a separate -RESTRICT clause.") - - (split-spec (choice :tag "gnus-group-split Overrider" - (sexp :tag "Fancy Split") - (const :tag "Catch All" catch-all) - (const :tag "Ignore" nil)) "\ -Override all other gnus-group-split fields. - -In `Fancy Split', you can enter any nnmail-split-fancy SPLIT. Note -that the name of this group won't be automatically assumed, you have -to add it to the SPLITs yourself. This means you can use such splits -to split messages to other groups too. - -If you select `Catch All', this group will get postings for any -messages not matched in any other group. It overrides the variable -gnus-group-split-default-catch-all-group. - -Selecting `Ignore' forces no SPLIT to be generated for this group, -disabling all other gnus-group-split fields.") - - (broken-reply-to (const :tag "Broken Reply To" t) "\ -Ignore `Reply-To' headers in this group. - -That can be useful if you're reading a mailing list group where the -listserv has inserted `Reply-To' headers that point back to the -listserv itself. This is broken behavior. So there!") - - (to-group (string :tag "To Group") "\ -All posts will be sent to the specified group.") - - (gcc-self (choice :tag "GCC" - :value t - (const :tag "To current group" t) - (const none) - (string :format "%v" :hide-front-space t)) "\ -Specify default value for GCC header. - -If this symbol is present in the group parameter list and set to `t', -new composed messages will be `Gcc''d to the current group. If it is -present and set to `none', no `Gcc:' header will be generated, if it -is present and a string, this string will be inserted literally as a -`gcc' header (this symbol takes precedence over any default `Gcc' -rules as described later).") - - (expiry-wait (choice :tag "Expire Wait" - :value never - (const never) - (const immediate) - (number :hide-front-space t - :format "%v")) "\ -When to expire. - -Overrides any `nnmail-expiry-wait' and `nnmail-expiry-wait-function' -when expiring expirable messages. The value can either be a number of -days (not necessarily an integer) or the symbols `never' or -`immediate'.") - - (expiry-target (choice :tag "Expiry Target" - :value delete - (const delete) - (function :format "%v" nnmail-) - string) "\ -Where expired messages end up. - -Overrides `nnmail-expiry-target', which see.") - - (score-file (file :tag "Score File") "\ -Make the specified file into the current score file. -This means that all score commands you issue will end up in this file.") - - (adapt-file (file :tag "Adapt File") "\ -Make the specified file into the current adaptive file. -All adaptive score entries will be put into this file.") - - (admin-address (gnus-email-address :tag "Admin Address") "\ -Administration address for a mailing list. - -When unsubscribing to a mailing list you should never send the -unsubscription notice to the mailing list itself. Instead, you'd -send messages to the administrative address. This parameter allows -you to put the admin address somewhere convenient.") - - (display (choice :tag "Display" - :value default - (const all) - (const default)) "\ -Which articles to display on entering the group. - -`all' - Display all articles, both read and unread. - -`default' - Display the default visible articles, which normally includes - unread and ticked articles.") - - (comment (string :tag "Comment") "\ -An arbitrary comment on the group.") - - (visible (const :tag "Permanently visible" t) "\ -Always display this group, even when there are no unread articles -in it..") - - (highlight-words - (choice :tag "Highlight words" - :value nil - (repeat (list (regexp :tag "Highlight regexp") - (number :tag "Group for entire word" 0) - (number :tag "Group for displayed part" 0) - (symbol :tag "Face" - gnus-emphasis-highlight-words)))) - "highlight regexps. -See gnus-emphasis-alist.") - - (posting-style - (choice :tag "Posting style" - :value nil - (repeat (list - (choice :tag "Type" - :value nil - (const signature) - (const signature-file) - (const organization) - (const address) - (const name) - (const body)) - (string :format "%v")))) - "post style. -See gnus-posting-styles.")) - "Alist of valid group or topic parameters. - -Each entry has the form (NAME TYPE DOC), where NAME is the parameter -itself (a symbol), TYPE is the parameters type (a sexp widget), and -DOC is a documentation string for the parameter.") - -(defconst gnus-extra-topic-parameters - '((subscribe (regexp :tag "Subscribe") "\ -If `gnus-subscribe-newsgroup-method' or -`gnus-subscribe-options-newsgroup-method' is set to -`gnus-subscribe-topics', new groups that matches this regexp will -automatically be subscribed to this topic")) - "Alist of topic parameters that are not also group parameters. - -Each entry has the form (NAME TYPE DOC), where NAME is the parameter -itself (a symbol), TYPE is the parameters type (a sexp widget), and -DOC is a documentation string for the parameter.") - -(defconst gnus-extra-group-parameters - '((uidvalidity (string :tag "IMAP uidvalidity") "\ -Server-assigned value attached to IMAP groups, used to maintain consistency.")) - "Alist of group parameters that are not also topic parameters. - -Each entry has the form (NAME TYPE DOC), where NAME is the parameter -itself (a symbol), TYPE is the parameters type (a sexp widget), and -DOC is a documentation string for the parameter.") -(defvar gnus-custom-params) -(defvar gnus-custom-method) -(defvar gnus-custom-group) -(defvar gnus-custom-topic) - -(defun gnus-group-customize (group &optional topic) - "Edit the group or topic on the current line." - (interactive (list (gnus-group-group-name) (gnus-group-topic-name))) - (let (info - (types (mapcar (lambda (entry) - `(cons :format "%v%h\n" - :doc ,(nth 2 entry) - (const :format "" ,(nth 0 entry)) - ,(nth 1 entry))) - (append (reverse gnus-group-parameters-more) - gnus-group-parameters - (if group - gnus-extra-group-parameters - gnus-extra-topic-parameters))))) - (unless (or group topic) - (error "No group on current line")) - (when (and group topic) - (error "Both a group an topic on current line")) - (unless (or topic (setq info (gnus-get-info group))) - (error "Killed group; can't be edited")) - ;; Ready. - (kill-buffer (gnus-get-buffer-create "*Gnus Customize*")) - (switch-to-buffer (gnus-get-buffer-create "*Gnus Customize*")) - (gnus-custom-mode) - (make-local-variable 'gnus-custom-group) - (setq gnus-custom-group group) - (make-local-variable 'gnus-custom-topic) - (setq gnus-custom-topic topic) - (buffer-disable-undo) - (widget-insert "Customize the ") - (if group - (widget-create 'info-link - :help-echo "Push me to learn more." - :tag "group parameters" - "(gnus)Group Parameters") - (widget-create 'info-link - :help-echo "Push me to learn more." - :tag "topic parameters" - "(gnus)Topic Parameters")) - (widget-insert " for <") - (widget-insert (gnus-group-decoded-name (or group topic))) - (widget-insert "> and press ") - (widget-create 'push-button - :tag "done" - :help-echo "Push me when done customizing." - :action 'gnus-group-customize-done) - (widget-insert ".\n\n") - (make-local-variable 'gnus-custom-params) - (setq gnus-custom-params - (widget-create 'group - :value (if group - (gnus-info-params info) - (gnus-topic-parameters topic)) - `(set :inline t - :greedy t - :tag "Parameters" - :format "%t:\n%h%v" - :doc "\ -These special parameters are recognized by Gnus. -Check the [ ] for the parameters you want to apply to this group or -to the groups in this topic, then edit the value to suit your taste." - ,@types) - '(repeat :inline t - :tag "Variables" - :format "%t:\n%h%v%i\n\n" - :doc "\ -Set variables local to the group you are entering. - -If you want to turn threading off in `news.answers', you could put -`(gnus-show-threads nil)' in the group parameters of that group. -`gnus-show-threads' will be made into a local variable in the summary -buffer you enter, and the form `nil' will be `eval'ed there. - -This can also be used as a group-specific hook function, if you'd -like. If you want to hear a beep when you enter a group, you could -put something like `(dummy-variable (ding))' in the parameters of that -group. `dummy-variable' will be set to the result of the `(ding)' -form, but who cares?" - (list :format "%v" :value (nil nil) - (symbol :tag "Variable") - (sexp :tag - "Value"))) - - '(repeat :inline t - :tag "Unknown entries" - sexp))) - (when group - (widget-insert "\n\nYou can also edit the ") - (widget-create 'info-link - :tag "select method" - :help-echo "Push me to learn more about select methods." - "(gnus)Select Methods") - (widget-insert " for the group.\n") - (setq gnus-custom-method - (widget-create 'sexp - :tag "Method" - :value (gnus-info-method info)))) - (use-local-map widget-keymap) - (widget-setup) - (buffer-enable-undo) - (goto-char (point-min)))) - -(defun gnus-group-customize-done (&rest ignore) - "Apply changes and bury the buffer." - (interactive) - (if gnus-custom-topic - (gnus-topic-set-parameters gnus-custom-topic - (widget-value gnus-custom-params)) - (gnus-group-edit-group-done 'params gnus-custom-group - (widget-value gnus-custom-params)) - (gnus-group-edit-group-done 'method gnus-custom-group - (widget-value gnus-custom-method))) - (bury-buffer)) - -;;; Score Customization: - -(defconst gnus-score-parameters - '((mark (number :tag "Mark") "\ -The value of this entry should be a number. -Any articles with a score lower than this number will be marked as read.") - - (expunge (number :tag "Expunge") "\ -The value of this entry should be a number. -Any articles with a score lower than this number will be removed from -the summary buffer.") - - (mark-and-expunge (number :tag "Mark-and-expunge") "\ -The value of this entry should be a number. -Any articles with a score lower than this number will be marked as -read and removed from the summary buffer.") - - (thread-mark-and-expunge (number :tag "Thread-mark-and-expunge") "\ -The value of this entry should be a number. -All articles that belong to a thread that has a total score below this -number will be marked as read and removed from the summary buffer. -`gnus-thread-score-function' says how to compute the total score -for a thread.") - - (files (repeat :inline t :tag "Files" file) "\ -The value of this entry should be any number of file names. -These files are assumed to be score files as well, and will be loaded -the same way this one was.") - - (exclude-files (repeat :inline t :tag "Exclude-files" file) "\ -The clue of this entry should be any number of files. -These files will not be loaded, even though they would normally be so, -for some reason or other.") - - (eval (sexp :tag "Eval" :value nil) "\ -The value of this entry will be `eval'el. -This element will be ignored when handling global score files.") - - (read-only (boolean :tag "Read-only" :value t) "\ -Read-only score files will not be updated or saved. -Global score files should feature this atom.") - - (orphan (number :tag "Orphan") "\ -The value of this entry should be a number. -Articles that do not have parents will get this number added to their -scores. Imagine you follow some high-volume newsgroup, like -`comp.lang.c'. Most likely you will only follow a few of the threads, -also want to see any new threads. - -You can do this with the following two score file entries: - - (orphan -500) - (mark-and-expunge -100) - -When you enter the group the first time, you will only see the new -threads. You then raise the score of the threads that you find -interesting (with `I T' or `I S'), and ignore (`C y') the rest. -Next time you enter the group, you will see new articles in the -interesting threads, plus any new threads. - -I.e.---the orphan score atom is for high-volume groups where there -exist a few interesting threads which can't be found automatically -by ordinary scoring rules.") - - (adapt (choice :tag "Adapt" - (const t) - (const ignore) - (sexp :format "%v" - :hide-front-space t)) "\ -This entry controls the adaptive scoring. -If it is `t', the default adaptive scoring rules will be used. If it -is `ignore', no adaptive scoring will be performed on this group. If -it is a list, this list will be used as the adaptive scoring rules. -If it isn't present, or is something other than `t' or `ignore', the -default adaptive scoring rules will be used. If you want to use -adaptive scoring on most groups, you'd set `gnus-use-adaptive-scoring' -to `t', and insert an `(adapt ignore)' in the groups where you do not -want adaptive scoring. If you only want adaptive scoring in a few -groups, you'd set `gnus-use-adaptive-scoring' to `nil', and insert -`(adapt t)' in the score files of the groups where you want it.") - - (adapt-file (file :tag "Adapt-file") "\ -All adaptive score entries will go to the file named by this entry. -It will also be applied when entering the group. This atom might -be handy if you want to adapt on several groups at once, using the -same adaptive file for a number of groups.") - - (local (repeat :tag "Local" - (group :value (nil nil) - (symbol :tag "Variable") - (sexp :tag "Value"))) "\ -The value of this entry should be a list of `(VAR VALUE)' pairs. -Each VAR will be made buffer-local to the current summary buffer, -and set to the value specified. This is a convenient, if somewhat -strange, way of setting variables in some groups if you don't like -hooks much.") - (touched (sexp :format "Touched\n") "Internal variable.")) - "Alist of valid symbolic score parameters. - -Each entry has the form (NAME TYPE DOC), where NAME is the parameter -itself (a symbol), TYPE is the parameters type (a sexp widget), and DOC is a -documentation string for the parameter.") - -(define-widget 'gnus-score-string 'group - "Edit score entries for string-valued headers." - :convert-widget 'gnus-score-string-convert) - -(defun gnus-score-string-convert (widget) - ;; Set args appropriately. - (let* ((tag (widget-get widget :tag)) - (item `(const :format "" :value ,(downcase tag))) - (match '(string :tag "Match")) - (score '(choice :tag "Score" - (const :tag "default" nil) - (integer :format "%v" - :hide-front-space t))) - (expire '(choice :tag "Expire" - (const :tag "off" nil) - (integer :format "%v" - :hide-front-space t))) - (type '(choice :tag "Type" - :value s - ;; I should really create a forgiving :match - ;; function for each type below, that only - ;; looked at the first letter. - (const :tag "Regexp" r) - (const :tag "Regexp (fixed case)" R) - (const :tag "Substring" s) - (const :tag "Substring (fixed case)" S) - (const :tag "Exact" e) - (const :tag "Exact (fixed case)" E) - (const :tag "Word" w) - (const :tag "Word (fixed case)" W) - (const :tag "default" nil))) - (group `(group ,match ,score ,expire ,type)) - (doc (concat (or (widget-get widget :doc) - (concat "Change score based on the " tag - " header.\n")) - " -You can have an arbitrary number of score entries for this header, -each score entry has four elements: - -1. The \"match element\". This should be the string to look for in the - header. - -2. The \"score element\". This number should be an integer in the - neginf to posinf interval. This number is added to the score - of the article if the match is successful. If this element is - not present, the `gnus-score-interactive-default-score' number - will be used instead. This is 1000 by default. - -3. The \"date element\". This date says when the last time this score - entry matched, which provides a mechanism for expiring the - score entries. It this element is not present, the score - entry is permanent. The date is represented by the number of - days since December 31, 1 ce. - -4. The \"type element\". This element specifies what function should - be used to see whether this score entry matches the article. - - There are the regexp, as well as substring types, and exact match, - and word match types. If this element is not present, Gnus will - assume that substring matching should be used. There is case - sensitive variants of all match types."))) - (widget-put widget :args `(,item - (repeat :inline t - :indent 0 - :tag ,tag - :doc ,doc - :format "%t:\n%h%v%i\n\n" - (choice :format "%v" - :value ("" nil nil s) - ,group - sexp))))) - widget) - -(define-widget 'gnus-score-integer 'group - "Edit score entries for integer-valued headers." - :convert-widget 'gnus-score-integer-convert) - -(defun gnus-score-integer-convert (widget) - ;; Set args appropriately. - (let* ((tag (widget-get widget :tag)) - (item `(const :format "" :value ,(downcase tag))) - (match '(integer :tag "Match")) - (score '(choice :tag "Score" - (const :tag "default" nil) - (integer :format "%v" - :hide-front-space t))) - (expire '(choice :tag "Expire" - (const :tag "off" nil) - (integer :format "%v" - :hide-front-space t))) - (type '(choice :tag "Type" - :value < - (const <) - (const >) - (const =) - (const >=) - (const <=))) - (group `(group ,match ,score ,expire ,type)) - (doc (concat (or (widget-get widget :doc) - (concat "Change score based on the " tag - " header."))))) - (widget-put widget :args `(,item - (repeat :inline t - :indent 0 - :tag ,tag - :doc ,doc - :format "%t:\n%h%v%i\n\n" - ,group)))) - widget) - -(define-widget 'gnus-score-date 'group - "Edit score entries for date-valued headers." - :convert-widget 'gnus-score-date-convert) - -(defun gnus-score-date-convert (widget) - ;; Set args appropriately. - (let* ((tag (widget-get widget :tag)) - (item `(const :format "" :value ,(downcase tag))) - (match '(string :tag "Match")) - (score '(choice :tag "Score" - (const :tag "default" nil) - (integer :format "%v" - :hide-front-space t))) - (expire '(choice :tag "Expire" - (const :tag "off" nil) - (integer :format "%v" - :hide-front-space t))) - (type '(choice :tag "Type" - :value regexp - (const regexp) - (const before) - (const at) - (const after))) - (group `(group ,match ,score ,expire ,type)) - (doc (concat (or (widget-get widget :doc) - (concat "Change score based on the " tag - " header.")) - " -For the Date header we have three kinda silly match types: `before', -`at' and `after'. I can't really imagine this ever being useful, but, -like, it would feel kinda silly not to provide this function. Just in -case. You never know. Better safe than sorry. Once burnt, twice -shy. Don't judge a book by its cover. Never not have sex on a first -date. (I have been told that at least one person, and I quote, -\"found this function indispensable\", however.) - -A more useful match type is `regexp'. With it, you can match the date -string using a regular expression. The date is normalized to ISO8601 -compact format first---`YYYYMMDDTHHMMSS'. If you want to match all -articles that have been posted on April 1st in every year, you could -use `....0401.........' as a match string, for instance. (Note that -the date is kept in its original time zone, so this will match -articles that were posted when it was April 1st where the article was -posted from. Time zones are such wholesome fun for the whole family, -eh?"))) - (widget-put widget :args `(,item - (repeat :inline t - :indent 0 - :tag ,tag - :doc ,doc - :format "%t:\n%h%v%i\n\n" - ,group)))) - widget) - -(defvar gnus-custom-scores) -(defvar gnus-custom-score-alist) - -(defun gnus-score-customize (file) - "Customize score file FILE. -When called interactively, FILE defaults to the current score file. -This can be changed using the `\\[gnus-score-change-score-file]' command." - (interactive (list gnus-current-score-file)) - (unless file - (error (format "No score file for %s" - (gnus-group-decoded-name gnus-newsgroup-name)))) - (let ((scores (gnus-score-load file)) - (types (mapcar (lambda (entry) - `(group :format "%v%h\n" - :doc ,(nth 2 entry) - (const :format "" ,(nth 0 entry)) - ,(nth 1 entry))) - gnus-score-parameters))) - ;; Ready. - (kill-buffer (gnus-get-buffer-create "*Gnus Customize*")) - (switch-to-buffer (gnus-get-buffer-create "*Gnus Customize*")) - (gnus-custom-mode) - (make-local-variable 'gnus-custom-score-alist) - (setq gnus-custom-score-alist scores) - (widget-insert "Customize the ") - (widget-create 'info-link - :help-echo "Push me to learn more." - :tag "score entries" - "(gnus)Score File Format") - (widget-insert " for\n\t") - (widget-insert file) - (widget-insert "\nand press ") - (widget-create 'push-button - :tag "done" - :help-echo "Push me when done customizing." - :action 'gnus-score-customize-done) - (widget-insert ".\n -Check the [ ] for the entries you want to apply to this score file, then -edit the value to suit your taste. Don't forget to mark the checkbox, -if you do all your changes will be lost. ") - (widget-create 'push-button - :action (lambda (&rest ignore) - (require 'gnus-audio) - (gnus-audio-play "Evil_Laugh.au")) - "Bhahahah!") - (widget-insert "\n\n") - (make-local-variable 'gnus-custom-scores) - (setq gnus-custom-scores - (widget-create 'group - :value scores - `(checklist :inline t - :greedy t - (gnus-score-string :tag "From") - (gnus-score-string :tag "Subject") - (gnus-score-string :tag "References") - (gnus-score-string :tag "Xref") - (gnus-score-string :tag "Extra") - (gnus-score-string :tag "Message-ID") - (gnus-score-integer :tag "Lines") - (gnus-score-integer :tag "Chars") - (gnus-score-date :tag "Date") - (gnus-score-string :tag "Head" - :doc "\ -Match all headers in the article. - -Using one of `Head', `Body', `All' will slow down scoring considerable. -") - (gnus-score-string :tag "Body" - :doc "\ -Match the body sans header of the article. - -Using one of `Head', `Body', `All' will slow down scoring considerable. -") - (gnus-score-string :tag "All" - :doc "\ -Match the entire article, including both headers and body. - -Using one of `Head', `Body', `All' will slow down scoring -considerable. -") - (gnus-score-string :tag - "Followup" - :doc "\ -Score all followups to the specified authors. - -This entry is somewhat special, in that it will match the `From:' -header, and affect the score of not only the matching articles, but -also all followups to the matching articles. This allows you -e.g. increase the score of followups to your own articles, or decrease -the score of followups to the articles of some known trouble-maker. -") - (gnus-score-string :tag "Thread" - :doc "\ -Add a score entry on all articles that are part of a thread. - -This match key works along the same lines as the `Followup' match key. -If you say that you want to score on a (sub-)thread that is started by -an article with a `Message-ID' X, then you add a `thread' match. This -will add a new `thread' match for each article that has X in its -`References' header. (These new `thread' matches will use the -`Message-ID's of these matching articles.) This will ensure that you -can raise/lower the score of an entire thread, even though some -articles in the thread may not have complete `References' headers. -Note that using this may lead to undeterministic scores of the -articles in the thread. -") - ,@types) - '(repeat :inline t - :tag "Unknown entries" - sexp))) - (use-local-map widget-keymap) - (widget-setup))) - -(defun gnus-score-customize-done (&rest ignore) - "Reset the score alist with the present value." - (let ((alist gnus-custom-score-alist) - (value (widget-value gnus-custom-scores))) - (setcar alist (car value)) - (setcdr alist (cdr value)) - (gnus-score-set 'touched '(t) alist)) - (bury-buffer)) - -;;; The End: - -(provide 'gnus-cus) - -;;; gnus-cus.el ends here diff --git a/lisp/gnus-delay.el b/lisp/gnus-delay.el deleted file mode 100644 index ac89011..0000000 --- a/lisp/gnus-delay.el +++ /dev/null @@ -1,161 +0,0 @@ -;;; gnus-delay.el --- Delayed posting of articles -*- coding: latin-1; -*- - -;; Copyright (C) 2001 Free Software Foundation, Inc. - -;; Author: Kai Großjohann -;; Keywords: mail, news, extensions - -;; 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. - -;;; Commentary: - -;; Provide delayed posting of articles. - -;;; Code: - -(require 'nndraft) -(require 'gnus-draft) - -(defvar gnus-delay-group "delayed" - "Group name for storing delayed articles.") - -(defvar gnus-delay-header "X-Gnus-Delayed" - "Header name for storing info about delayed articles.") - -(defvar gnus-delay-default-delay "3d" - "*Default length of delay.") - -(defvar gnus-delay-default-hour 8 - "*If deadline is given as date, then assume this time of day.") - -(defun gnus-delay-article (delay) - "Delay this article by some time. -DELAY is a string, giving the length of the time. Possible values are: - -* for in minutes (`m'), hours (`h'), days (`d'), - weeks (`w'), months (`M'), or years (`Y'); - -* YYYY-MM-DD for a specific date. The time of day is given by the - variable `gnus-delay-default-hour', minute and second are zero. - -* hh:mm for a specific time. Use 24h format. If it is later than this - time, then the deadline is tomorrow, else today." - (interactive - (list (read-string - "Target date (YYYY-MM-DD) or length of delay (units in [mhdwMY]): " - gnus-delay-default-delay))) - (let (num unit days year month day hour minute deadline) - (cond ((string-match - "\\([0-9][0-9][0-9]?[0-9]?\\)-\\([0-9]+\\)-\\([0-9]+\\)" - delay) - (setq year (string-to-number (match-string 1 delay)) - month (string-to-number (match-string 2 delay)) - day (string-to-number (match-string 3 delay))) - (setq deadline - (message-make-date - (encode-time 0 0 ; second and minute - gnus-delay-default-hour - day month year)))) - ((string-match "\\([0-9]+\\):\\([0-9]+\\)" delay) - (setq hour (string-to-number (match-string 1 delay)) - minute (string-to-number (match-string 2 delay))) - ;; Use current time, except... - (setq deadline (apply 'vector (decode-time (current-time)))) - ;; ... for minute and hour. - (aset deadline 1 minute) - (aset deadline 2 hour) - ;; Convert to seconds. - (setq deadline (time-to-seconds (apply 'encode-time - (append deadline nil)))) - ;; If this time has passed already, add a day. - (when (< deadline (time-to-seconds (current-time))) - (setq deadline (+ 3600 deadline))) ;3600 secs/day - ;; Convert seconds to date header. - (setq deadline (message-make-date - (seconds-to-time deadline)))) - ((string-match "\\([0-9]+\\)\\s-*\\([mhdwMY]\\)" delay) - (setq num (match-string 1 delay)) - (setq unit (match-string 2 delay)) - ;; Start from seconds, then multiply into needed units. - (setq num (string-to-number num)) - (cond ((string= unit "Y") - (setq delay (* num 60 60 24 365))) - ((string= unit "M") - (setq delay (* num 60 60 24 30))) - ((string= unit "w") - (setq delay (* num 60 60 24 7))) - ((string= unit "d") - (setq delay (* num 60 60 24))) - ((string= unit "h") - (setq delay (* num 60 60))) - (t - (setq delay (* num 60)))) - (setq deadline (message-make-date - (seconds-to-time (+ (time-to-seconds (current-time)) - delay))))) - (t (error "Malformed delay `%s'" delay))) - (message-add-header (format "%s: %s" gnus-delay-header deadline))) - (set-buffer-modified-p t) - (nndraft-request-create-group gnus-delay-group) - (message-disassociate-draft) - (nndraft-request-associate-buffer gnus-delay-group) - (save-buffer 0) - (kill-buffer (current-buffer)) - (message-do-actions message-postpone-actions)) - -(defun gnus-delay-send-drafts () - "Send all the delayed messages that are due now." - (interactive) - (save-excursion - (let* ((group (format "nndraft:%s" gnus-delay-group)) - articles - article deadline) - (gnus-activate-group group) - (setq articles (nndraft-articles)) - (while (setq article (pop articles)) - (gnus-request-head article group) - (set-buffer nntp-server-buffer) - (goto-char (point-min)) - (if (re-search-forward - (concat "^" (regexp-quote gnus-delay-header) ":\\s-+") - nil t) - (progn - (setq deadline (nnheader-header-value)) - (setq deadline (apply 'encode-time (parse-time-string deadline))) - (setq deadline (time-since deadline)) - (when (and (>= (nth 0 deadline) 0) - (>= (nth 1 deadline) 0)) - (message "Sending delayed article %d" article) - (gnus-draft-send article group) - (message "Sending delayed article %d...done" article))) - (message "Delay header missing for article %d" article)))))) - -;;;###autoload -(defun gnus-delay-initialize (&optional no-keymap no-check) - "Initialize the gnus-delay package. -This sets up a key binding in `message-mode' to delay a message. -This tells Gnus to look for delayed messages after getting new news. - -Key binding is skipped if optional arg NO-KEYMAP is non-nil. -Checking delayed messages is skipped if optional arg NO-CHECK is non-nil." - (unless no-keymap - (require 'message) - (define-key message-mode-map "\C-c\n" 'gnus-delay-article)) - (unless no-check - (add-hook 'gnus-get-new-news-hook 'gnus-delay-send-drafts))) - -(provide 'gnus-delay) -;;; gnus-delay.el ends here diff --git a/lisp/gnus-demon.el b/lisp/gnus-demon.el deleted file mode 100644 index 2c73b37..0000000 --- a/lisp/gnus-demon.el +++ /dev/null @@ -1,325 +0,0 @@ -;;; gnus-demon.el --- daemonic Gnus behaviour - -;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) - -(require 'gnus) -(require 'gnus-int) -(require 'nnheader) -(require 'nntp) -(require 'nnmail) -(require 'gnus-util) -(eval-and-compile - (if (featurep 'xemacs) - (require 'itimer) - (require 'timer))) - -(defgroup gnus-demon nil - "Demonic behaviour." - :group 'gnus) - -(defcustom gnus-demon-handlers nil - "Alist of daemonic handlers to be run at intervals. -Each handler is a list on the form - -\(FUNCTION TIME IDLE) - -FUNCTION is the function to be called. -TIME is the number of `gnus-demon-timestep's between each call. -If nil, never call. If t, call each `gnus-demon-timestep'. -If IDLE is t, only call if Emacs has been idle for a while. If IDLE -is a number, only call when Emacs has been idle more than this number -of `gnus-demon-timestep's. If IDLE is nil, don't care about -idleness. If IDLE is a number and TIME is nil, then call once each -time Emacs has been idle for IDLE `gnus-demon-timestep's." - :group 'gnus-demon - :type '(repeat (list function - (choice :tag "Time" - (const :tag "never" nil) - (const :tag "one" t) - (integer :tag "steps" 1)) - (choice :tag "Idle" - (const :tag "don't care" nil) - (const :tag "for a while" t) - (integer :tag "steps" 1))))) - -(defcustom gnus-demon-timestep 60 - "*Number of seconds in each demon timestep." - :group 'gnus-demon - :type 'integer) - -;;; Internal variables. - -(defvar gnus-demon-timer nil) -(defvar gnus-demon-idle-has-been-called nil) -(defvar gnus-demon-idle-time 0) -(defvar gnus-demon-handler-state nil) -(defvar gnus-demon-last-keys nil) -(defvar gnus-inhibit-demon nil - "*If non-nil, no daemonic function will be run.") - -;;; Functions. - -(defun gnus-demon-add-handler (function time idle) - "Add the handler FUNCTION to be run at TIME and IDLE." - ;; First remove any old handlers that use this function. - (gnus-demon-remove-handler function) - ;; Then add the new one. - (push (list function time idle) gnus-demon-handlers) - (gnus-demon-init)) - -(defun gnus-demon-remove-handler (function &optional no-init) - "Remove the handler FUNCTION from the list of handlers." - (gnus-pull function gnus-demon-handlers) - (unless no-init - (gnus-demon-init))) - -(defun gnus-demon-init () - "Initialize the Gnus daemon." - (interactive) - (gnus-demon-cancel) - (when gnus-demon-handlers - ;; Set up the timer. - (setq gnus-demon-timer - (nnheader-run-at-time - gnus-demon-timestep gnus-demon-timestep 'gnus-demon)) - ;; Reset control variables. - (setq gnus-demon-handler-state - (mapcar - (lambda (handler) - (list (car handler) (gnus-demon-time-to-step (nth 1 handler)) - (nth 2 handler))) - gnus-demon-handlers)) - (setq gnus-demon-idle-time 0) - (setq gnus-demon-idle-has-been-called nil))) - -(gnus-add-shutdown 'gnus-demon-cancel 'gnus) - -(defun gnus-demon-cancel () - "Cancel any Gnus daemons." - (interactive) - (when gnus-demon-timer - (nnheader-cancel-timer gnus-demon-timer)) - (setq gnus-demon-timer nil - gnus-demon-idle-has-been-called nil) - (condition-case () - (nnheader-cancel-function-timers 'gnus-demon) - (error t))) - -(defun gnus-demon-is-idle-p () - "Whether Emacs is idle or not." - ;; We do this simply by comparing the 100 most recent keystrokes - ;; with the ones we had last time. If they are the same, one might - ;; guess that Emacs is indeed idle. This only makes sense if one - ;; calls this function seldom -- like once a minute, which is what - ;; we do here. - (let ((keys (recent-keys))) - (or (equal keys gnus-demon-last-keys) - (progn - (setq gnus-demon-last-keys keys) - nil)))) - -(defun gnus-demon-time-to-step (time) - "Find out how many seconds to TIME, which is on the form \"17:43\"." - (if (not (stringp time)) - time - (let* ((now (current-time)) - ;; obtain NOW as discrete components -- make a vector for speed - (nowParts (decode-time now)) - ;; obtain THEN as discrete components - (thenParts (parse-time-string time)) - (thenHour (elt thenParts 2)) - (thenMin (elt thenParts 1)) - ;; convert time as elements into number of seconds since EPOCH. - (then (encode-time 0 - thenMin - thenHour - ;; If THEN is earlier than NOW, make it - ;; same time tomorrow. Doc for encode-time - ;; says that this is OK. - (+ (elt nowParts 3) - (if (or (< thenHour (elt nowParts 2)) - (and (= thenHour (elt nowParts 2)) - (<= thenMin (elt nowParts 1)))) - 1 0)) - (elt nowParts 4) - (elt nowParts 5) - (elt nowParts 6) - (elt nowParts 7) - (elt nowParts 8))) - ;; calculate number of seconds between NOW and THEN - (diff (+ (* 65536 (- (car then) (car now))) - (- (cadr then) (cadr now))))) - ;; return number of timesteps in the number of seconds - (round (/ diff gnus-demon-timestep))))) - -(defun gnus-demon () - "The Gnus daemon that takes care of running all Gnus handlers." - ;; Increase or reset the time Emacs has been idle. - (if (gnus-demon-is-idle-p) - (incf gnus-demon-idle-time) - (setq gnus-demon-idle-time 0) - (setq gnus-demon-idle-has-been-called nil)) - ;; Disable all daemonic stuff if we're in the minibuffer - (when (and (not (window-minibuffer-p (selected-window))) - (not gnus-inhibit-demon)) - ;; Then we go through all the handler and call those that are - ;; sufficiently ripe. - (let ((handlers gnus-demon-handler-state) - (gnus-inhibit-demon t) - ;; Try to avoid dialog boxes, e.g. by Mailcrypt. - ;; Unfortunately, Emacs 20's `message-or-box...' doesn't - ;; obey `use-dialog-box'. - use-dialog-box (last-nonmenu-event 10) - handler time idle) - (while handlers - (setq handler (pop handlers)) - (cond - ((numberp (setq time (nth 1 handler))) - ;; These handlers use a regular timeout mechanism. We decrease - ;; the timer if it hasn't reached zero yet. - (unless (zerop time) - (setcar (nthcdr 1 handler) (decf time))) - (and (zerop time) ; If the timer now is zero... - ;; Test for appropriate idleness - (progn - (setq idle (nth 2 handler)) - (cond - ((null idle) t) ; Don't care about idle. - ((numberp idle) ; Numerical idle... - (< idle gnus-demon-idle-time)) ; Idle timed out. - (t (< 0 gnus-demon-idle-time)))) ; Or just need to be idle. - ;; So we call the handler. - (progn - (ignore-errors (funcall (car handler))) - ;; And reset the timer. - (setcar (nthcdr 1 handler) - (gnus-demon-time-to-step - (nth 1 (assq (car handler) gnus-demon-handlers))))))) - ;; These are only supposed to be called when Emacs is idle. - ((null (setq idle (nth 2 handler))) - ;; We do nothing. - ) - ((and (not (numberp idle)) - (gnus-demon-is-idle-p)) - ;; We want to call this handler each and every time that - ;; Emacs is idle. - (ignore-errors (funcall (car handler)))) - (t - ;; We want to call this handler only if Emacs has been idle - ;; for a specified number of timesteps. - (and (not (memq (car handler) gnus-demon-idle-has-been-called)) - (< idle gnus-demon-idle-time) - (gnus-demon-is-idle-p) - (progn - (ignore-errors (funcall (car handler))) - ;; Make sure the handler won't be called once more in - ;; this idle-cycle. - (push (car handler) gnus-demon-idle-has-been-called))))))))) - -(defun gnus-demon-add-nocem () - "Add daemonic NoCeM handling to Gnus." - (gnus-demon-add-handler 'gnus-demon-scan-nocem 60 30)) - -(defun gnus-demon-scan-nocem () - "Scan NoCeM groups for NoCeM messages." - (save-window-excursion - (gnus-nocem-scan-groups))) - -(defun gnus-demon-add-disconnection () - "Add daemonic server disconnection to Gnus." - (gnus-demon-add-handler 'gnus-demon-close-connections nil 30)) - -(defun gnus-demon-close-connections () - (save-window-excursion - (gnus-close-backends))) - -(defun gnus-demon-add-nntp-close-connection () - "Add daemonic nntp server disconnection to Gnus. -If no commands have gone out via nntp during the last five -minutes, the connection is closed." - (gnus-demon-add-handler 'gnus-demon-nntp-close-connections 5 nil)) - -(defun gnus-demon-nntp-close-connection () - (save-window-excursion - (when (time-less-p '(0 300) (time-since nntp-last-command-time)) - (nntp-close-server)))) - -(defun gnus-demon-add-scanmail () - "Add daemonic scanning of mail from the mail backends." - (gnus-demon-add-handler 'gnus-demon-scan-mail 120 60)) - -(defun gnus-demon-scan-mail () - (save-window-excursion - (let ((servers gnus-opened-servers) - server - (nnmail-fetched-sources (list t))) - (while (setq server (car (pop servers))) - (and (gnus-check-backend-function 'request-scan (car server)) - (or (gnus-server-opened server) - (gnus-open-server server)) - (gnus-request-scan nil server)))))) - -(defun gnus-demon-add-rescan () - "Add daemonic scanning of new articles from all backends." - (gnus-demon-add-handler 'gnus-demon-scan-news 120 60)) - -(defun gnus-demon-scan-news () - (let ((win (current-window-configuration))) - (unwind-protect - (save-window-excursion - (save-excursion - (when (gnus-alive-p) - (save-excursion - (set-buffer gnus-group-buffer) - (gnus-group-get-new-news))))) - (set-window-configuration win)))) - -(defun gnus-demon-add-scan-timestamps () - "Add daemonic updating of timestamps in empty newgroups." - (gnus-demon-add-handler 'gnus-demon-scan-timestamps nil 30)) - -(defun gnus-demon-scan-timestamps () - "Set the timestamp on all newsgroups with no unread and no ticked articles." - (when (gnus-alive-p) - (let ((cur-time (current-time)) - (newsrc (cdr gnus-newsrc-alist)) - info group unread has-ticked) - (while (setq info (pop newsrc)) - (setq group (gnus-info-group info) - unread (gnus-group-unread group) - has-ticked (cdr (assq 'tick (gnus-info-marks info)))) - (when (and (numberp unread) - (= unread 0) - (not has-ticked)) - (gnus-group-set-parameter group 'timestamp cur-time)))))) - -(provide 'gnus-demon) - -;;; gnus-demon.el ends here diff --git a/lisp/gnus-draft.el b/lisp/gnus-draft.el deleted file mode 100644 index dd93227..0000000 --- a/lisp/gnus-draft.el +++ /dev/null @@ -1,277 +0,0 @@ -;;; gnus-draft.el --- draft message support for Semi-gnus -;; Copyright (C) 1997, 1998, 1999, 2000 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; MORIOKA Tomohiko -;; Tatsuya Ichikawa -;; Keywords: mail, news, MIME, offline - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; Code: - -(require 'gnus) -(require 'gnus-sum) -(require 'message) -(require 'gnus-msg) -(require 'nndraft) -(require 'gnus-agent) -(eval-when-compile (require 'cl)) - -;;; Draft minor mode - -(defvar gnus-draft-mode nil - "Minor mode for providing a draft summary buffers.") - -(defvar gnus-draft-mode-map nil) - -(unless gnus-draft-mode-map - (setq gnus-draft-mode-map (make-sparse-keymap)) - - (gnus-define-keys gnus-draft-mode-map - "Dt" gnus-draft-toggle-sending - "De" gnus-draft-edit-message - "Ds" gnus-draft-send-message - "DS" gnus-draft-send-all-messages)) - -(defun gnus-draft-make-menu-bar () - (unless (boundp 'gnus-draft-menu) - (easy-menu-define - gnus-draft-menu gnus-draft-mode-map "" - '("Drafts" - ["Toggle whether to send" gnus-draft-toggle-sending t] - ["Edit" gnus-draft-edit-message t] - ["Send selected message(s)" gnus-draft-send-message t] - ["Send all messages" gnus-draft-send-all-messages t] - ["Delete draft" gnus-summary-delete-article t])))) - -(defun gnus-draft-mode (&optional arg) - "Minor mode for providing a draft summary buffers. - -\\{gnus-draft-mode-map}" - (interactive "P") - (when (eq major-mode 'gnus-summary-mode) - (when (set (make-local-variable 'gnus-draft-mode) - (if (null arg) (not gnus-draft-mode) - (> (prefix-numeric-value arg) 0))) - ;; Set up the menu. - (when (gnus-visual-p 'draft-menu 'menu) - (gnus-draft-make-menu-bar)) - (gnus-add-minor-mode 'gnus-draft-mode " Draft" gnus-draft-mode-map) - (gnus-run-hooks 'gnus-draft-mode-hook)))) - -;;; Commands - -(defun gnus-draft-toggle-sending (article) - "Toggle whether to send an article or not." - (interactive (list (gnus-summary-article-number))) - (if (gnus-draft-article-sendable-p article) - (progn - (push article gnus-newsgroup-unsendable) - (gnus-summary-mark-article article gnus-unsendable-mark)) - (setq gnus-newsgroup-unsendable - (delq article gnus-newsgroup-unsendable)) - (gnus-summary-mark-article article gnus-unread-mark)) - (gnus-summary-position-point)) - -(defun gnus-draft-edit-message () - "Enter a mail/post buffer to edit and send the draft." - (interactive) - (let ((article (gnus-summary-article-number)) - (group gnus-newsgroup-name)) - (gnus-summary-mark-as-read article gnus-canceled-mark) - (gnus-draft-setup-for-editing article group) - (set-buffer-modified-p t) - (save-excursion - (save-restriction - (message-narrow-to-headers) - (message-remove-header "date"))) - (message-save-drafts) - (let ((gnus-verbose-backends nil)) - (gnus-request-expire-articles (list article) group t)) - (push - `((lambda () - (when (gnus-buffer-exists-p ,gnus-summary-buffer) - (save-excursion - (set-buffer ,gnus-summary-buffer) - (gnus-cache-possibly-remove-article ,article nil nil nil t))))) - message-send-actions))) - -(defun gnus-draft-send-message (&optional n) - "Send the current draft." - (interactive "P") - (let* ((articles (gnus-summary-work-articles n)) - (total (length articles)) - article) - (while (setq article (pop articles)) - (gnus-summary-remove-process-mark article) - (unless (memq article gnus-newsgroup-unsendable) - (let ((message-sending-message - (format "Sending message %d of %d..." - (- total (length articles)) total))) - (gnus-draft-send article gnus-newsgroup-name t)) - (gnus-summary-mark-article article gnus-canceled-mark))))) - -(defun gnus-draft-send (article &optional group interactive) - "Send message ARTICLE." - (let ((message-syntax-checks (if interactive nil - 'dont-check-for-anything-just-trust-me)) - (message-inhibit-body-encoding (or (not group) - (equal group "nndraft:queue") - message-inhibit-body-encoding)) - (message-send-hook (and group (not (equal group "nndraft:queue")) - message-send-hook)) - (message-setup-hook (and group (not (equal group "nndraft:queue")) - message-setup-hook)) - type method) - (gnus-draft-setup-for-sending article (or group "nndraft:queue")) - ;; We read the meta-information that says how and where - ;; this message is to be sent. - (save-restriction - (message-narrow-to-head) - (when (re-search-forward - (concat "^" (regexp-quote gnus-agent-meta-information-header) ":") - nil t) - (setq type (ignore-errors (read (current-buffer))) - method (ignore-errors (read (current-buffer)))) - (message-remove-header gnus-agent-meta-information-header))) - ;; Let Agent restore any GCC lines and have message.el perform them. - (gnus-agent-restore-gcc) - ;; Then we send it. If we have no meta-information, we just send - ;; it and let Message figure out how. - (when (let ((mail-header-separator "")) - (cond ((eq type 'news) - (mime-edit-maybe-split-and-send - (function - (lambda () - (interactive) - (funcall message-send-news-function method)))) - (funcall message-send-news-function method)) - ((eq type 'mail) - (mime-edit-maybe-split-and-send - (function - (lambda () - (interactive) - (funcall message-send-mail-function)))) - (funcall message-send-mail-function) - t))) - (let ((gnus-verbose-backends nil)) - (gnus-request-expire-articles - (list article) (or group "nndraft:queue") t))))) - -(defun gnus-draft-send-all-messages () - "Send all the sendable drafts." - (interactive) - (gnus-uu-mark-buffer) - (gnus-draft-send-message)) - -(defun gnus-group-send-drafts () - "Send all sendable articles from the queue group." - (interactive) - (gnus-activate-group "nndraft:queue") - (save-excursion - (let* ((articles (nndraft-articles)) - (unsendable (gnus-uncompress-range - (cdr (assq 'unsend - (gnus-info-marks - (gnus-get-info "nndraft:queue")))))) - (total (length articles)) - article) - (while (setq article (pop articles)) - (unless (memq article unsendable) - (let ((message-sending-message - (format "Sending message %d of %d..." - (- total (length articles)) total))) - (gnus-draft-send article))))))) - -;;;###autoload -(defun gnus-draft-reminder () - "Reminder user if there are unsent drafts." - (interactive) - (if (gnus-alive-p) - (let (active) - (catch 'continue - (dolist (group '("nndraft:drafts" "nndraft:queue")) - (setq active (gnus-activate-group group)) - (if (and active (>= (cdr active) (car active))) - (if (y-or-n-p "There are unsent drafts. Confirm to exit?") - (throw 'continue t) - (error "Stop!")))))))) - -;;; Utility functions - -(defcustom gnus-draft-decoding-function - #'mime-edit-decode-message-in-buffer - "*Function called to decode the message from network representation." - :group 'gnus-agent - :type 'function) - -;;;!!!If this is byte-compiled, it fails miserably. -;;;!!!This is because `gnus-setup-message' uses uninterned symbols. -;;;!!!This has been fixed in recent versions of Emacs and XEmacs, -;;;!!!but for the time being, we'll just run this tiny function uncompiled. - -(defun gnus-draft-setup-for-editing (narticle group) - (let (ga) - (gnus-setup-message 'forward - (let ((article narticle)) - (message-mail) - (erase-buffer) - (if (not (gnus-request-restore-buffer article group)) - (error "Couldn't restore the article") - (funcall gnus-draft-decoding-function) - ;; Insert the separator. - (goto-char (point-min)) - (search-forward "\n\n") - (forward-char -1) - (insert mail-header-separator) - (forward-line 1) - (setq ga (message-fetch-field gnus-draft-meta-information-header)) - (message-set-auto-save-file-name)))) - (gnus-backlog-remove-article group narticle) - (when (and ga - (ignore-errors (setq ga (car (read-from-string ga))))) - (setq gnus-newsgroup-name - (if (equal (car ga) "") nil (car ga))) - (setq message-post-method - `(lambda (arg) - (gnus-post-method arg ,(car ga)))) - (message-add-action - `(gnus-add-mark ,(car ga) 'replied ,(cadr ga)) - 'send)))) - -(defvar gnus-draft-send-draft-buffer " *send draft*") -(defun gnus-draft-setup-for-sending (narticle group) - (let ((article narticle)) - (if (not (get-buffer gnus-draft-send-draft-buffer)) - (get-buffer-create gnus-draft-send-draft-buffer)) - (set-buffer gnus-draft-send-draft-buffer) - (erase-buffer) - (if (not (gnus-request-restore-buffer article group)) - (error "Couldn't restore the article")))) - -(defun gnus-draft-article-sendable-p (article) - "Say whether ARTICLE is sendable." - (not (memq article gnus-newsgroup-unsendable))) - -(provide 'gnus-draft) - -;;; gnus-draft.el ends here diff --git a/lisp/gnus-dup.el b/lisp/gnus-dup.el deleted file mode 100644 index a2b5544..0000000 --- a/lisp/gnus-dup.el +++ /dev/null @@ -1,165 +0,0 @@ -;;; gnus-dup.el --- suppression of duplicate articles in Gnus -;; Copyright (C) 1996, 1997, 1998, 1999, 2000 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;; This package tries to mark articles as read the second time the -;; user reads a copy. This is useful if the server doesn't support -;; Xref properly, or if the user reads the same group from several -;; servers. - -;;; Code: - -(eval-when-compile (require 'cl)) - -(require 'gnus) -(require 'gnus-art) - -(defgroup gnus-duplicate nil - "Suppression of duplicate articles." - :group 'gnus) - -(defcustom gnus-save-duplicate-list nil - "*If non-nil, save the duplicate list when shutting down Gnus. -If nil, duplicate suppression will only work on duplicates -seen in the same session." - :group 'gnus-duplicate - :type 'boolean) - -(defcustom gnus-duplicate-list-length 10000 - "*The number of Message-IDs to keep in the duplicate suppression list." - :group 'gnus-duplicate - :type 'integer) - -(defcustom gnus-duplicate-file (nnheader-concat gnus-directory "suppression") - "*The name of the file to store the duplicate suppression list." - :group 'gnus-duplicate - :type 'file) - -;;; Internal variables - -(defvar gnus-dup-list nil) -(defvar gnus-dup-hashtb nil) - -(defvar gnus-dup-list-dirty nil) - -;;; -;;; Starting and stopping -;;; - -(gnus-add-shutdown 'gnus-dup-close 'gnus) - -(defun gnus-dup-close () - "Possibly save the duplicate suppression list and shut down the subsystem." - (gnus-dup-save) - (setq gnus-dup-list nil - gnus-dup-hashtb nil - gnus-dup-list-dirty nil)) - -(defun gnus-dup-open () - "Possibly read the duplicate suppression list and start the subsystem." - (if gnus-save-duplicate-list - (gnus-dup-read) - (setq gnus-dup-list nil)) - (setq gnus-dup-hashtb (gnus-make-hashtable gnus-duplicate-list-length)) - ;; Enter all Message-IDs into the hash table. - (let ((list gnus-dup-list) - (obarray gnus-dup-hashtb)) - (while list - (intern (pop list))))) - -(defun gnus-dup-read () - "Read the duplicate suppression list." - (setq gnus-dup-list nil) - (when (file-exists-p gnus-duplicate-file) - (load gnus-duplicate-file t t t))) - -(defun gnus-dup-save () - "Save the duplicate suppression list." - (when (and gnus-save-duplicate-list - gnus-dup-list-dirty) - (with-temp-file gnus-duplicate-file - (gnus-prin1 `(setq gnus-dup-list ',gnus-dup-list)))) - (setq gnus-dup-list-dirty nil)) - -;;; -;;; Interface functions -;;; - -(defun gnus-dup-enter-articles () - "Enter articles from the current group for future duplicate suppression." - (unless gnus-dup-list - (gnus-dup-open)) - (setq gnus-dup-list-dirty t) ; mark list for saving - (let ((data gnus-newsgroup-data) - datum msgid) - ;; Enter the Message-IDs of all read articles into the list - ;; and hash table. - (while (setq datum (pop data)) - (when (and (not (gnus-data-pseudo-p datum)) - (> (gnus-data-number datum) 0) - (not (memq (gnus-data-number datum) gnus-newsgroup-unreads)) - (not (= (gnus-data-mark datum) gnus-canceled-mark)) - (setq msgid (mail-header-id (gnus-data-header datum))) - (not (nnheader-fake-message-id-p msgid)) - (not (intern-soft msgid gnus-dup-hashtb))) - (push msgid gnus-dup-list) - (intern msgid gnus-dup-hashtb)))) - ;; Chop off excess Message-IDs from the list. - (let ((end (nthcdr gnus-duplicate-list-length gnus-dup-list))) - (when end - (setcdr end nil)))) - -(defun gnus-dup-suppress-articles () - "Mark duplicate articles as read." - (unless gnus-dup-list - (gnus-dup-open)) - (gnus-message 6 "Suppressing duplicates...") - (let ((headers gnus-newsgroup-headers) - (auto (and gnus-newsgroup-auto-expire - (memq gnus-duplicate-mark gnus-auto-expirable-marks))) - number header) - (while (setq header (pop headers)) - (when (and (intern-soft (mail-header-id header) gnus-dup-hashtb) - (gnus-summary-article-unread-p (mail-header-number header))) - (setq gnus-newsgroup-unreads - (delq (setq number (mail-header-number header)) - gnus-newsgroup-unreads)) - (if (not auto) - (push (cons number gnus-duplicate-mark) gnus-newsgroup-reads) - (push number gnus-newsgroup-expirable) - (push (cons number gnus-expirable-mark) gnus-newsgroup-reads))))) - (gnus-message 6 "Suppressing duplicates...done")) - -(defun gnus-dup-unsuppress-article (article) - "Stop suppression of ARTICLE." - (let ((id (mail-header-id (gnus-data-header (gnus-data-find article))))) - (when id - (setq gnus-dup-list-dirty t) - (setq gnus-dup-list (delete id gnus-dup-list)) - (unintern id gnus-dup-hashtb)))) - -(provide 'gnus-dup) - -;;; gnus-dup.el ends here diff --git a/lisp/gnus-eform.el b/lisp/gnus-eform.el deleted file mode 100644 index d55a6b5..0000000 --- a/lisp/gnus-eform.el +++ /dev/null @@ -1,133 +0,0 @@ -;;; gnus-eform.el --- a mode for editing forms for Gnus -;; Copyright (C) 1996, 1997, 1998, 1999, 2000 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; Code: - -(require 'gnus) -(require 'gnus-win) - -;;; -;;; Editing forms -;;; - -(defgroup gnus-edit-form nil - "A mode for editing forms." - :group 'gnus) - -(defcustom gnus-edit-form-mode-hook nil - "Hook run in `gnus-edit-form-mode' buffers." - :group 'gnus-edit-form - :type 'hook) - -(defcustom gnus-edit-form-menu-hook nil - "Hook run when creating menus in `gnus-edit-form-mode' buffers." - :group 'gnus-edit-form - :type 'hook) - -;;; Internal variables - -(defvar gnus-edit-form-buffer "*Gnus edit form*") -(defvar gnus-edit-form-done-function nil) - -(defvar gnus-edit-form-mode-map nil) -(unless gnus-edit-form-mode-map - (setq gnus-edit-form-mode-map (make-sparse-keymap)) - (set-keymap-parent gnus-edit-form-mode-map emacs-lisp-mode-map) - (gnus-define-keys gnus-edit-form-mode-map - "\C-c\C-c" gnus-edit-form-done - "\C-c\C-k" gnus-edit-form-exit)) - -(defun gnus-edit-form-make-menu-bar () - (unless (boundp 'gnus-edit-form-menu) - (easy-menu-define - gnus-edit-form-menu gnus-edit-form-mode-map "" - '("Edit Form" - ["Exit and save changes" gnus-edit-form-done t] - ["Exit" gnus-edit-form-exit t])) - (gnus-run-hooks 'gnus-edit-form-menu-hook))) - -(defun gnus-edit-form-mode () - "Major mode for editing forms. -It is a slightly enhanced emacs-lisp-mode. - -\\{gnus-edit-form-mode-map}" - (interactive) - (when (gnus-visual-p 'group-menu 'menu) - (gnus-edit-form-make-menu-bar)) - (kill-all-local-variables) - (setq major-mode 'gnus-edit-form-mode) - (setq mode-name "Edit Form") - (use-local-map gnus-edit-form-mode-map) - (make-local-variable 'gnus-edit-form-done-function) - (make-local-variable 'gnus-prev-winconf) - (gnus-run-hooks 'gnus-edit-form-mode-hook)) - -(defun gnus-edit-form (form documentation exit-func) - "Edit FORM in a new buffer. -Call EXIT-FUNC on exit. Display DOCUMENTATION in the beginning -of the buffer." - (let ((winconf (current-window-configuration))) - (set-buffer (gnus-get-buffer-create gnus-edit-form-buffer)) - (gnus-configure-windows 'edit-form) - (gnus-edit-form-mode) - (setq gnus-prev-winconf winconf) - (setq gnus-edit-form-done-function exit-func) - (erase-buffer) - (insert documentation) - (unless (bolp) - (insert "\n")) - (goto-char (point-min)) - (while (not (eobp)) - (insert ";;; ") - (forward-line 1)) - (insert ";; Type `C-c C-c' after you've finished editing.\n") - (insert "\n") - (let ((p (point))) - (pp form (current-buffer)) - (insert "\n") - (goto-char p)))) - -(defun gnus-edit-form-done () - "Update changes and kill the current buffer." - (interactive) - (goto-char (point-min)) - (let ((form (condition-case nil - (read (current-buffer)) - (end-of-file nil))) - (func gnus-edit-form-done-function)) - (gnus-edit-form-exit) - (funcall func form))) - -(defun gnus-edit-form-exit () - "Kill the current buffer." - (interactive) - (let ((winconf gnus-prev-winconf)) - (kill-buffer (current-buffer)) - (set-window-configuration winconf))) - -(provide 'gnus-eform) - -;;; gnus-eform.el ends here diff --git a/lisp/gnus-ems.el b/lisp/gnus-ems.el deleted file mode 100644 index 1682e0f..0000000 --- a/lisp/gnus-ems.el +++ /dev/null @@ -1,347 +0,0 @@ -;;; gnus-ems.el --- functions for making Semi-gnus work under different Emacsen -;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Tatsuya Ichikawa -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; Code: - -(eval-when-compile - (require 'cl) - (require 'ring)) - -;;; Function aliases later to be redefined for XEmacs usage. - -(defvar gnus-mouse-2 [mouse-2]) -(defvar gnus-down-mouse-3 [down-mouse-3]) -(defvar gnus-down-mouse-2 [down-mouse-2]) -(defvar gnus-widget-button-keymap nil) -(defvar gnus-mode-line-modified - (if (or (featurep 'xemacs) - (< emacs-major-version 20)) - '("--**-" . "-----") - '("**" "--"))) - -(eval-and-compile - (autoload 'gnus-xmas-define "gnus-xmas") - (autoload 'gnus-xmas-redefine "gnus-xmas") - (autoload 'appt-select-lowest-window "appt")) - -(if (featurep 'xemacs) - (autoload 'gnus-smiley-display "smiley") - (autoload 'gnus-smiley-display "smiley-ems")) ; override XEmacs version - -(defun gnus-kill-all-overlays () - "Delete all overlays in the current buffer." - (let* ((overlayss (overlay-lists)) - (buffer-read-only nil) - (overlays (delq nil (nconc (car overlayss) (cdr overlayss))))) - (while overlays - (delete-overlay (pop overlays))))) - -;;; Mule functions. - -(eval-and-compile - (defalias 'gnus-char-width - (if (fboundp 'char-width) - 'char-width - (lambda (ch) 1)))) ;; A simple hack. - -(eval-and-compile - (if (featurep 'xemacs) - (gnus-xmas-define) - (defvar gnus-mouse-face-prop 'mouse-face - "Property used for highlighting mouse regions."))) - -(eval-and-compile - (let ((case-fold-search t)) - (cond - ((string-match "windows-nt\\|os/2\\|emx\\|cygwin32" - (symbol-name system-type)) - (setq nnheader-file-name-translation-alist - (append nnheader-file-name-translation-alist - (mapcar (lambda (c) (cons c ?_)) - '(?: ?* ?\" ?< ?> ??)) - (if (string-match "windows-nt\\|cygwin32" - (symbol-name system-type)) - nil - '((?+ . ?-))))))))) - -(defvar gnus-tmp-unread) -(defvar gnus-tmp-replied) -(defvar gnus-tmp-score-char) -(defvar gnus-tmp-indentation) -(defvar gnus-tmp-opening-bracket) -(defvar gnus-tmp-lines) -(defvar gnus-tmp-name) -(defvar gnus-tmp-closing-bracket) -(defvar gnus-tmp-subject-or-nil) -(defvar gnus-check-before-posting) - -(defun gnus-ems-redefine () - (cond - ((featurep 'xemacs) - (gnus-xmas-redefine)) - - ((featurep 'mule) - ;; Mule and new Emacs definitions - - ;; [Note] Now there are three kinds of mule implementations, - ;; original MULE, XEmacs/mule and Emacs 20+ including - ;; MULE features. Unfortunately these API are different. In - ;; particular, Emacs (including original MULE) and XEmacs are - ;; quite different. However, this version of Gnus doesn't support - ;; anything other than XEmacs 20+ and Emacs 20.3+. - - ;; Predicates to check are following: - ;; (boundp 'MULE) is t only if MULE (original; anything older than - ;; Mule 2.3) is running. - ;; (featurep 'mule) is t when every mule variants are running. - - ;; It is possible to detect XEmacs/mule by (featurep 'mule) and - ;; checking `emacs-version'. In this case, the implementation for - ;; XEmacs/mule may be shareable between XEmacs and XEmacs/mule. - - (defvar gnus-summary-display-table nil - "Display table used in summary mode buffers.") - - (defalias 'gnus-summary-set-display-table (lambda ())) - - (if (fboundp 'truncate-string-to-width) - (fset 'gnus-truncate-string 'truncate-string-to-width) - (fset 'gnus-truncate-string 'truncate-string)) - - (when (boundp 'gnus-check-before-posting) - (setq gnus-check-before-posting - (delq 'long-lines - (delq 'control-chars gnus-check-before-posting)))) - )) - (when (featurep 'mule) - (defun gnus-tilde-max-form (el max-width) - "Return a form that limits EL to MAX-WIDTH." - (let ((max (abs max-width))) - (if (symbolp el) - (if (< max-width 0) - `(let ((width (string-width ,el))) - (gnus-truncate-string ,el width (- width ,max))) - `(gnus-truncate-string ,el ,max)) - (if (< max-width 0) - `(let* ((val (eval ,el)) - (width (string-width val))) - (gnus-truncate-string val width (- width ,max))) - `(let ((val (eval ,el))) - (gnus-truncate-string val ,max)))))) - - (defun gnus-tilde-cut-form (el cut-width) - "Return a form that cuts CUT-WIDTH off of EL." - (let ((cut (abs cut-width))) - (if (symbolp el) - (if (< cut-width 0) - `(gnus-truncate-string ,el (- (string-width ,el) ,cut)) - `(gnus-truncate-string ,el (string-width ,el) ,cut)) - (if (< cut-width 0) - `(let ((val (eval ,el))) - (gnus-truncate-string val (- (string-width val) ,cut))) - `(let ((val (eval ,el))) - (gnus-truncate-string val (string-width val) ,cut)))))) - )) - -(defun gnus-region-active-p () - "Say whether the region is active." - (and (boundp 'transient-mark-mode) - transient-mark-mode - (boundp 'mark-active) - mark-active)) - -(if (fboundp 'add-minor-mode) - (defalias 'gnus-add-minor-mode 'add-minor-mode) - (defun gnus-add-minor-mode (mode name map &rest rest) - (set (make-local-variable mode) t) - (unless (assq mode minor-mode-alist) - (push `(,mode ,name) minor-mode-alist)) - (unless (assq mode minor-mode-map-alist) - (push (cons mode map) - minor-mode-map-alist)))) - -(defun gnus-x-splash () - "Show a splash screen using a pixmap in the current buffer." - (let ((dir (nnheader-find-etc-directory "gnus")) - pixmap file height beg i) - (save-excursion - (switch-to-buffer (gnus-get-buffer-create gnus-group-buffer)) - (let ((buffer-read-only nil) - width height) - (erase-buffer) - (when (and dir - (file-exists-p (setq file - (expand-file-name "x-splash" dir)))) - (with-temp-buffer - (insert-file-contents-as-binary file) - (goto-char (point-min)) - (ignore-errors - (setq pixmap (read (current-buffer)))))) - (when pixmap - (make-face 'gnus-splash) - (setq height (/ (car pixmap) (frame-char-height)) - width (/ (cadr pixmap) (frame-char-width))) - (set-face-foreground 'gnus-splash "Brown") - (set-face-stipple 'gnus-splash pixmap) - (insert-char ?\n (* (/ (window-height) 2 height) height)) - (setq i height) - (while (> i 0) - (insert-char ?\ (* (/ (window-width) 2 width) width)) - (setq beg (point)) - (insert-char ?\ width) - (set-text-properties beg (point) '(face gnus-splash)) - (insert ?\n) - (decf i)) - (goto-char (point-min)) - (sit-for 0)))))) - -(defvar gnus-article-xface-ring-internal nil - "Cache for face data.") - -;; Worth customizing? -(defvar gnus-article-xface-ring-size 6 - "Length of the ring used for `gnus-article-xface-ring-internal'.") - -(defvar gnus-article-compface-xbm - (condition-case () - (eq 0 (string-match "#define" - (shell-command-to-string "uncompface -X"))) - (error nil)) - "Non-nil means the compface program supports the -X option. -That produces XBM output.") - -(defun gnus-article-display-xface (beg end &optional buffer) - "Display an XFace header from between BEG and END in BUFFER. -Requires support for images in your Emacs and the external programs -`uncompface', and `icontopbm'. On a GNU/Linux system these -might be in packages with names like `compface' or `faces-xface' and -`netpbm' or `libgr-progs', for instance. See also -`gnus-article-compface-xbm'. - -This function is for Emacs 21+. See `gnus-xmas-article-display-xface' -for XEmacs." - ;; It might be worth converting uncompface's output in Lisp. - - (when (if (fboundp 'display-graphic-p) - (display-graphic-p)) - (unless gnus-article-xface-ring-internal ; Only load ring when needed. - (setq gnus-article-xface-ring-internal - (make-ring gnus-article-xface-ring-size))) - (save-excursion - (let* ((cur (current-buffer)) - (data (if buffer - (with-current-buffer buffer - (buffer-substring beg end)) - (buffer-substring beg end))) - (image (cdr-safe (assoc data (ring-elements - gnus-article-xface-ring-internal)))) - default-enable-multibyte-characters) - (unless image - (with-temp-buffer - (insert data) - (and (eq 0 (apply #'call-process-region (point-min) (point-max) - "uncompface" - 'delete '(t nil) nil - (if gnus-article-compface-xbm - '("-X")))) - (if gnus-article-compface-xbm - t - (goto-char (point-min)) - (progn (insert "/* Width=48, Height=48 */\n") t) - (eq 0 (call-process-region (point-min) (point-max) - "icontopbm" - 'delete '(t nil)))) - ;; Miles Bader says that faces don't look right as - ;; light on dark. - (if (eq 'dark (cdr-safe (assq 'background-mode - (frame-parameters)))) - (setq image (create-image (buffer-string) - (if gnus-article-compface-xbm - 'xbm - 'pbm) - t - :ascent 'center - :foreground "black" - :background "white")) - (setq image (create-image (buffer-string) - (if gnus-article-compface-xbm - 'xbm - 'pbm) - t - :ascent 'center))))) - (ring-insert gnus-article-xface-ring-internal (cons data image))) - (when image - (goto-char (point-min)) - (re-search-forward "^From:" nil 'move) - (insert-image image)))))) - -(defun-maybe assoc-ignore-case (key alist) - "Like `assoc', but assumes KEY is a string and ignores case when comparing." - (setq key (downcase key)) - (let (element) - (while (and alist (not element)) - (if (equal key (downcase (car (car alist)))) - (setq element (car alist))) - (setq alist (cdr alist))) - element)) - - -;;; Language support staffs. - -(defvar-maybe current-language-environment "English" - "The language environment.") - -(defvar-maybe language-info-alist nil - "Alist of language environment definitions.") - -(defun-maybe get-language-info (lang-env key) - "Return information listed under KEY for language environment LANG-ENV." - (if (symbolp lang-env) - (setq lang-env (symbol-name lang-env))) - (let ((lang-slot (assoc-ignore-case lang-env language-info-alist))) - (if lang-slot - (cdr (assq key (cdr lang-slot)))))) - -(defun-maybe set-language-info (lang-env key info) - "Modify part of the definition of language environment LANG-ENV." - (if (symbolp lang-env) - (setq lang-env (symbol-name lang-env))) - (let (lang-slot key-slot) - (setq lang-slot (assoc lang-env language-info-alist)) - (if (null lang-slot) ; If no slot for the language, add it. - (setq lang-slot (list lang-env) - language-info-alist (cons lang-slot language-info-alist))) - (setq key-slot (assq key lang-slot)) - (if (null key-slot) ; If no slot for the key, add it. - (progn - (setq key-slot (list key)) - (setcdr lang-slot (cons key-slot (cdr lang-slot))))) - (setcdr key-slot info))) - -(provide 'gnus-ems) - -;;; gnus-ems.el ends here diff --git a/lisp/gnus-gl.el b/lisp/gnus-gl.el deleted file mode 100644 index df12c92..0000000 --- a/lisp/gnus-gl.el +++ /dev/null @@ -1,860 +0,0 @@ -;;; gnus-gl.el --- an interface to GroupLens for Gnus - -;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000 -;; Free Software Foundation, Inc. - -;; Author: Brad Miller -;; Keywords: news, score - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; GroupLens software and documentation is copyright (c) 1995 by Paul -;; Resnick (Massachusetts Institute of Technology); Brad Miller, John -;; Riedl, Jon Herlocker, and Joseph Konstan (University of Minnesota), -;; and David Maltz (Carnegie-Mellon University). -;; -;; Permission to use, copy, modify, and distribute this documentation -;; for non-commercial and commercial purposes without fee is hereby -;; granted provided that this copyright notice and permission notice -;; appears in all copies and that the names of the individuals and -;; institutions holding this copyright are not used in advertising or -;; publicity pertaining to this software without specific, written -;; prior permission. The copyright holders make no representations -;; about the suitability of this software and documentation for any -;; purpose. It is provided ``as is'' without express or implied -;; warranty. -;; -;; The copyright holders request that they be notified of -;; modifications of this code. Please send electronic mail to -;; grouplens@cs.umn.edu for more information or to announce derived -;; works. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Author: Brad Miller -;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; -;; User Documentation: -;; To use GroupLens you must load this file. -;; You must also register a pseudonym with the Better Bit Bureau. -;; http://www.cs.umn.edu/Research/GroupLens -;; -;; ---------------- For your .emacs or .gnus file ---------------- -;; -;; As of version 2.5, grouplens now works as a minor mode of -;; gnus-summary-mode. To get make that work you just need a couple of -;; hooks. -;; (setq gnus-use-grouplens t) -;; (setq grouplens-pseudonym "") -;; (setq grouplens-bbb-host "grouplens.cs.umn.edu") -;; -;; (setq gnus-summary-default-score 0) -;; -;; USING GROUPLENS -;; How do I Rate an article?? -;; Before you type n to go to the next article, hit a number from 1-5 -;; Type r in the summary buffer and you will be prompted. -;; Note that when you're in grouplens-minor-mode 'r' masks the -;; usual reply binding for 'r' -;; -;; What if, Gasp, I find a bug??? -;; Please type M-x gnus-gl-submit-bug-report. This will set up a -;; mail buffer with the state of variables and buffers that will help -;; me debug the problem. A short description up front would help too! -;; -;; How do I display the prediction for an article: -;; If you set the gnus-summary-line-format as shown above, the score -;; (prediction) will be shown automatically. -;; -;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Programmer Notes -;; 10/9/95 -;; gnus-scores-articles contains the articles -;; When scoring is done, the call tree looks something like: -;; gnus-possibly-score-headers -;; ==> gnus-score-headers -;; ==> gnus-score-load-file -;; ==> get-all-mids (from the eval form) -;; -;; it would be nice to have one that gets called after all the other -;; headers have been scored. -;; we may want a variable gnus-grouplens-scale-factor -;; and gnus-grouplens-offset this would probably be either -3 or 0 -;; to make the scores centered around zero or not. -;; Notes 10/12/95 -;; According to Lars, Norse god of gnus, the simple way to insert a -;; call to an external function is to have a function added to the -;; variable gnus-score-find-files-function This new function -;; gnus-grouplens-score-alist will return a core alist that -;; has (("message-id" ("" score) ("" score)) -;; This seems like it would be pretty inefficient, though workable. -;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; TODO -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; -;; 3. Add some more ways to rate messages -;; 4. Better error handling for token timeouts. -;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; bugs -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; - -;;; Code: - -(eval-when-compile (require 'cl)) - -(require 'gnus-score) -(require 'gnus) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;;; User variables -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -(defvar gnus-summary-grouplens-line-format - "%U\%R\%z%l%I\%(%[%4L: %-23,23n%]%) %s\n" - "*The line format spec in summary GroupLens mode buffers.") - -(defvar grouplens-pseudonym "" - "User's pseudonym. -This pseudonym is obtained during the registration process") - -(defvar grouplens-bbb-host "grouplens.cs.umn.edu" - "Host where the bbbd is running.") - -(defvar grouplens-bbb-port 9000 - "Port where the bbbd is listening.") - -(defvar grouplens-newsgroups - '("comp.groupware" "comp.human-factors" "comp.lang.c++" - "comp.lang.java" "comp.os.linux.admin" "comp.os.linux.advocacy" - "comp.os.linux.announce" "comp.os.linux.answers" - "comp.os.linux.development" "comp.os.linux.development.apps" - "comp.os.linux.development.system" "comp.os.linux.hardware" - "comp.os.linux.help" "comp.os.linux.m68k" "comp.os.linux.misc" - "comp.os.linux.networking" "comp.os.linux.setup" "comp.os.linux.x" - "mn.general" "rec.arts.movies" "rec.arts.movies.current-films" - "rec.food.recipes" "rec.humor") - "*Groups that are part of the GroupLens experiment.") - -(defvar grouplens-prediction-display 'prediction-spot - "valid values are: - prediction-spot -- an * corresponding to the prediction between 1 and 5, - confidence-interval -- a numeric confidence interval - prediction-bar -- |##### | the longer the bar, the better the article, - confidence-bar -- | ----- } the prediction is in the middle of the bar, - confidence-spot -- ) * | the spot gets bigger with more confidence, - prediction-num -- plain-old numeric value, - confidence-plus-minus -- prediction +/i confidence") - -(defvar grouplens-score-offset 0 - "Offset the prediction by this value. -Setting this variable to -2 would have the following effect on -GroupLens scores: - - 1 --> -2 - 2 --> -1 - 3 --> 0 - 4 --> 1 - 5 --> 2 - -The reason is that a user might want to do this is to combine -GroupLens predictions with scores calculated by other score methods.") - -(defvar grouplens-score-scale-factor 1 - "This variable allows the user to magnify the effect of GroupLens scores. -The scale factor is applied after the offset.") - -(defvar gnus-grouplens-override-scoring 'override - "Tell GroupLens to override the normal Gnus scoring mechanism. -GroupLens scores can be combined with gnus scores in one of three ways. -'override -- just use grouplens predictions for grouplens groups -'combine -- combine grouplens scores with gnus scores -'separate -- treat grouplens scores completely separate from gnus") - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;;; Program global variables -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(defvar grouplens-bbb-token nil - "Current session token number.") - -(defvar grouplens-bbb-process nil - "Process Id of current bbbd network stream process.") - -(defvar grouplens-bbb-buffer nil - "Buffer associated with the BBBD process.") - -(defvar grouplens-rating-alist nil - "Current set of message-id rating pairs.") - -(defvar grouplens-current-hashtable nil - "A hashtable to hold predictions from the BBB.") - -(defvar grouplens-current-group nil) - -;;(defvar bbb-alist nil) - -(defvar bbb-timeout-secs 10 - "Number of seconds to wait for some response from the BBB. -If this times out we give up and assume that something has died..." ) - -(defvar grouplens-previous-article nil - "Message-ID of the last article read.") - -(defvar bbb-read-point) -(defvar bbb-response-point) - -(defun bbb-renew-hash-table () - (setq grouplens-current-hashtable (make-vector 100 0))) - -(bbb-renew-hash-table) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;;; Utility Functions -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -(defun bbb-connect-to-bbbd (host port) - (unless grouplens-bbb-buffer - (setq grouplens-bbb-buffer - (gnus-get-buffer-create (format " *BBBD trace: %s*" host))) - (save-excursion - (set-buffer grouplens-bbb-buffer) - (make-local-variable 'bbb-read-point) - (make-local-variable 'bbb-response-point) - (setq bbb-read-point (point-min)))) - - ;; if an old process is still running for some reason, kill it - (when grouplens-bbb-process - (ignore-errors - (when (eq 'open (process-status grouplens-bbb-process)) - (set-process-buffer grouplens-bbb-process nil) - (delete-process grouplens-bbb-process)))) - - ;; clear the trace buffer of old output - (save-excursion - (set-buffer grouplens-bbb-buffer) - (erase-buffer)) - - ;; open the connection to the server - (catch 'done - (condition-case error - (setq grouplens-bbb-process - (open-network-stream-as-binary - "BBBD" grouplens-bbb-buffer host port)) - (error (gnus-message 3 "Error: Failed to connect to BBB") - nil)) - (and (null grouplens-bbb-process) - (throw 'done nil)) - (save-excursion - (set-buffer grouplens-bbb-buffer) - (setq bbb-read-point (point-min)) - (or (bbb-read-response grouplens-bbb-process) - (throw 'done nil)))) - - ;; return the process - grouplens-bbb-process) - -(defun bbb-send-command (process command) - (goto-char (point-max)) - (insert command) - (insert "\r\n") - (setq bbb-read-point (point)) - (setq bbb-response-point (point)) - (set-marker (process-mark process) (point)) ; process output also comes here - (process-send-string process command) - (process-send-string process "\r\n") - (process-send-eof process)) - -(defun bbb-read-response (process) - "This function eats the initial response of OK or ERROR from the BBB." - (let ((case-fold-search nil) - match-end) - (goto-char bbb-read-point) - (while (and (not (search-forward "\r\n" nil t)) - (accept-process-output process bbb-timeout-secs)) - (goto-char bbb-read-point)) - (setq match-end (point)) - (goto-char bbb-read-point) - (setq bbb-read-point match-end) - (looking-at "OK"))) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;;; Login Functions -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(defun bbb-login () - "return the token number if login is successful, otherwise return nil." - (interactive) - (setq grouplens-bbb-token nil) - (if (not (equal grouplens-pseudonym "")) - (let ((bbb-process - (bbb-connect-to-bbbd grouplens-bbb-host grouplens-bbb-port))) - (if bbb-process - (save-excursion - (set-buffer (process-buffer bbb-process)) - (bbb-send-command bbb-process - (concat "login " grouplens-pseudonym)) - (if (bbb-read-response bbb-process) - (setq grouplens-bbb-token (bbb-extract-token-number)) - (gnus-message 3 "Error: GroupLens login failed"))))) - (gnus-message 3 "Error: you must set a pseudonym")) - grouplens-bbb-token) - -(defun bbb-extract-token-number () - (let ((token-pos (search-forward "token=" nil t))) - (when (looking-at "[0-9]+") - (buffer-substring token-pos (match-end 0))))) - -(gnus-add-shutdown 'bbb-logout 'gnus) - -(defun bbb-logout () - "logout of bbb session." - (when grouplens-bbb-token - (let ((bbb-process - (bbb-connect-to-bbbd grouplens-bbb-host grouplens-bbb-port))) - (when bbb-process - (save-excursion - (set-buffer (process-buffer bbb-process)) - (bbb-send-command bbb-process (concat "logout " grouplens-bbb-token)) - (bbb-read-response bbb-process)))))) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;;; Get Predictions -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -(defun bbb-build-mid-scores-alist (groupname) - "this function can be called as part of the function to return the list of score files to use. -See the gnus variable gnus-score-find-score-files-function. - -*Note:* If you want to use grouplens scores along with calculated scores, -you should see the offset and scale variables. At this point, I don't -recommend using both scores and grouplens predictions together." - (setq grouplens-current-group groupname) - (when (member groupname grouplens-newsgroups) - (setq grouplens-previous-article nil) - ;; scores-alist should be a list of lists: - ;; ((("message-id" ("" score1 nil s) (" score2 nil s)))) - ;;`((("message-id" . ,predict-list))) ; Yes, this is the return value - (list - (list - (list (append (list "message-id") - (bbb-get-predictions (bbb-get-all-mids) groupname))))))) - -(defun bbb-get-predictions (midlist groupname) - "Ask the bbb for predictions, and build up the score alist." - (gnus-message 5 "Fetching Predictions...") - (if grouplens-bbb-token - (let ((bbb-process (bbb-connect-to-bbbd grouplens-bbb-host - grouplens-bbb-port))) - (when bbb-process - (save-excursion - (set-buffer (process-buffer bbb-process)) - (bbb-send-command bbb-process - (bbb-build-predict-command midlist groupname - grouplens-bbb-token)) - (if (bbb-read-response bbb-process) - (bbb-get-prediction-response bbb-process) - (gnus-message 1 "Invalid Token, login and try again") - (ding))))) - (gnus-message 3 "Error: You are not logged in to a BBB") - (ding))) - -(defun bbb-get-all-mids () - (mapcar (function (lambda (x) (mail-header-id x))) gnus-newsgroup-headers)) - -(defun bbb-build-predict-command (mlist grpname token) - (concat "getpredictions " token " " grpname "\r\n" - (mapconcat 'identity mlist "\r\n") "\r\n.\r\n")) - -(defun bbb-get-prediction-response (process) - (let ((case-fold-search nil)) - (goto-char bbb-read-point) - (while (and (not (search-forward ".\r\n" nil t)) - (accept-process-output process bbb-timeout-secs)) - (goto-char bbb-read-point)) - (goto-char (+ bbb-response-point 4));; we ought to be right before OK - (bbb-build-response-alist))) - -;; build-response-alist assumes that the cursor has been positioned at -;; the first line of the list of mid/rating pairs. -(defun bbb-build-response-alist () - (let (resp mid pred) - (while - (cond - ((looking-at "\\(<.*>\\) :nopred=") - ;;(push `(,(bbb-get-mid) ,gnus-summary-default-score nil s) resp) - (forward-line 1) - t) - ((looking-at "\\(<.*>\\) :pred=\\([0-9]\.[0-9][0-9]\\) :conflow=\\([0-9]\.[0-9][0-9]\\) :confhigh=\\([0-9]\.[0-9][0-9]\\)") - (setq mid (bbb-get-mid) - pred (bbb-get-pred)) - (push `(,mid ,pred nil s) resp) - (gnus-sethash mid (list pred (bbb-get-confl) (bbb-get-confh)) - grouplens-current-hashtable) - (forward-line 1) - t) - ((looking-at "\\(<.*>\\) :pred=\\([0-9]\.[0-9][0-9]\\)") - (setq mid (bbb-get-mid) - pred (bbb-get-pred)) - (push `(,mid ,pred nil s) resp) - (gnus-sethash mid (list pred 0 0) grouplens-current-hashtable) - (forward-line 1) - t) - (t nil))) - resp)) - -;; these "get" functions assume that there is an active match lying -;; around. Where the first parenthesized expression is the -;; message-id, and the second is the prediction, the third and fourth -;; are the confidence interval -;; -;; Since gnus assumes that scores are integer values?? we round the -;; prediction. -(defun bbb-get-mid () - (buffer-substring (match-beginning 1) (match-end 1))) - -(defun bbb-get-pred () - (let ((tpred (string-to-number (buffer-substring (match-beginning 2) - (match-end 2))))) - (if (> tpred 0) - (round (* grouplens-score-scale-factor - (+ grouplens-score-offset tpred))) - 1))) - -(defun bbb-get-confl () - (string-to-number (buffer-substring (match-beginning 4) (match-end 4)))) - -(defun bbb-get-confh () - (string-to-number (buffer-substring (match-beginning 4) (match-end 4)))) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;;; Prediction Display -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(defconst grplens-rating-range 4.0) -(defconst grplens-maxrating 5) -(defconst grplens-minrating 1) -(defconst grplens-predstringsize 12) - -(defvar gnus-tmp-score) -(defun bbb-grouplens-score (header) - (if (eq gnus-grouplens-override-scoring 'separate) - (bbb-grouplens-other-score header) - (let* ((rate-string (make-string 12 ?\ )) - (mid (mail-header-id header)) - (hashent (gnus-gethash mid grouplens-current-hashtable)) - (iscore gnus-tmp-score) - (low (car (cdr hashent))) - (high (car (cdr (cdr hashent))))) - (aset rate-string 0 ?|) - (aset rate-string 11 ?|) - (unless (member grouplens-current-group grouplens-newsgroups) - (unless (equal grouplens-prediction-display 'prediction-num) - (cond ((< iscore 0) - (setq iscore 1)) - ((> iscore 5) - (setq iscore 5)))) - (setq low 0) - (setq high 0)) - (if (and (bbb-valid-score iscore) - (not (null mid))) - (cond - ;; prediction-spot - ((equal grouplens-prediction-display 'prediction-spot) - (setq rate-string (bbb-fmt-prediction-spot rate-string iscore))) - ;; confidence-interval - ((equal grouplens-prediction-display 'confidence-interval) - (setq rate-string (bbb-fmt-confidence-interval iscore low high))) - ;; prediction-bar - ((equal grouplens-prediction-display 'prediction-bar) - (setq rate-string (bbb-fmt-prediction-bar rate-string iscore))) - ;; confidence-bar - ((equal grouplens-prediction-display 'confidence-bar) - (setq rate-string (format "| %4.2f |" iscore))) - ;; confidence-spot - ((equal grouplens-prediction-display 'confidence-spot) - (setq rate-string (format "| %4.2f |" iscore))) - ;; prediction-num - ((equal grouplens-prediction-display 'prediction-num) - (setq rate-string (bbb-fmt-prediction-num iscore))) - ;; confidence-plus-minus - ((equal grouplens-prediction-display 'confidence-plus-minus) - (setq rate-string (bbb-fmt-confidence-plus-minus iscore low high)) - ) - (t (gnus-message 3 "Invalid prediction display type"))) - (aset rate-string 5 ?N) (aset rate-string 6 ?A)) - rate-string))) - -;; Gnus user format function that doesn't depend on -;; bbb-build-mid-scores-alist being used as the score function, but is -;; instead called from gnus-select-group-hook. -- LAB -(defun bbb-grouplens-other-score (header) - (if (not (member grouplens-current-group grouplens-newsgroups)) - ;; Return an empty string - "" - (let* ((rate-string (make-string 12 ?\ )) - (mid (mail-header-id header)) - (hashent (gnus-gethash mid grouplens-current-hashtable)) - (pred (or (nth 0 hashent) 0)) - (low (nth 1 hashent)) - (high (nth 2 hashent))) - ;; Init rate-string - (aset rate-string 0 ?|) - (aset rate-string 11 ?|) - (unless (equal grouplens-prediction-display 'prediction-num) - (cond ((< pred 0) - (setq pred 1)) - ((> pred 5) - (setq pred 5)))) - ;; If no entry in BBB hash mark rate string as NA and return - (cond - ((null hashent) - (aset rate-string 5 ?N) - (aset rate-string 6 ?A) - rate-string) - - ((equal grouplens-prediction-display 'prediction-spot) - (bbb-fmt-prediction-spot rate-string pred)) - - ((equal grouplens-prediction-display 'confidence-interval) - (bbb-fmt-confidence-interval pred low high)) - - ((equal grouplens-prediction-display 'prediction-bar) - (bbb-fmt-prediction-bar rate-string pred)) - - ((equal grouplens-prediction-display 'confidence-bar) - (format "| %4.2f |" pred)) - - ((equal grouplens-prediction-display 'confidence-spot) - (format "| %4.2f |" pred)) - - ((equal grouplens-prediction-display 'prediction-num) - (bbb-fmt-prediction-num pred)) - - ((equal grouplens-prediction-display 'confidence-plus-minus) - (bbb-fmt-confidence-plus-minus pred low high)) - - (t - (gnus-message 3 "Invalid prediction display type") - (aset rate-string 0 ?|) - (aset rate-string 11 ?|) - rate-string))))) - -(defun bbb-valid-score (score) - (or (equal grouplens-prediction-display 'prediction-num) - (and (>= score grplens-minrating) - (<= score grplens-maxrating)))) - -(defun bbb-requires-confidence (format-type) - (or (equal format-type 'confidence-plus-minus) - (equal format-type 'confidence-spot) - (equal format-type 'confidence-interval))) - -(defun bbb-have-confidence (clow chigh) - (not (or (null clow) - (null chigh)))) - -(defun bbb-fmt-prediction-spot (rate-string score) - (aset rate-string - (round (* (/ (- score grplens-minrating) grplens-rating-range) - (+ (- grplens-predstringsize 4) 1.49))) - ?*) - rate-string) - -(defun bbb-fmt-confidence-interval (score low high) - (if (bbb-have-confidence low high) - (format "|%4.2f-%4.2f |" low high) - (bbb-fmt-prediction-num score))) - -(defun bbb-fmt-confidence-plus-minus (score low high) - (if (bbb-have-confidence low high) - (format "|%3.1f+/-%4.2f|" score (/ (- high low) 2.0)) - (bbb-fmt-prediction-num score))) - -(defun bbb-fmt-prediction-bar (rate-string score) - (let* ((i 1) - (step (/ grplens-rating-range (- grplens-predstringsize 4))) - (half-step (/ step 2)) - (loc (- grplens-minrating half-step))) - (while (< i (- grplens-predstringsize 2)) - (if (> score loc) - (aset rate-string i ?#) - (aset rate-string i ?\ )) - (setq i (+ i 1)) - (setq loc (+ loc step))) - ) - rate-string) - -(defun bbb-fmt-prediction-num (score) - (format "| %4.2f |" score)) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;;; Put Ratings -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -(defun bbb-put-ratings () - (if (and grouplens-bbb-token - grouplens-rating-alist - (member gnus-newsgroup-name grouplens-newsgroups)) - (let ((bbb-process (bbb-connect-to-bbbd grouplens-bbb-host - grouplens-bbb-port)) - (rate-command (bbb-build-rate-command grouplens-rating-alist))) - (if bbb-process - (save-excursion - (set-buffer (process-buffer bbb-process)) - (gnus-message 5 "Sending Ratings...") - (bbb-send-command bbb-process rate-command) - (if (bbb-read-response bbb-process) - (setq grouplens-rating-alist nil) - (gnus-message 1 - "Token timed out: call bbb-login and quit again") - (ding)) - (gnus-message 5 "Sending Ratings...Done")) - (gnus-message 3 "No BBB connection"))) - (setq grouplens-rating-alist nil))) - -(defun bbb-build-rate-command (rate-alist) - (concat "putratings " grouplens-bbb-token " " grouplens-current-group " \r\n" - (mapconcat (lambda (this) ; form (mid . (score . time)) - (concat (car this) - " :rating=" (cadr this) ".00" - " :time=" (cddr this))) - rate-alist "\r\n") - "\r\n.\r\n")) - -;; Interactive rating functions. -(defun bbb-summary-rate-article (rating &optional midin) - (interactive "nRating: ") - (when (member gnus-newsgroup-name grouplens-newsgroups) - (let ((mid (or midin (bbb-get-current-id)))) - (if (and rating - (>= rating grplens-minrating) - (<= rating grplens-maxrating) - mid) - (let ((oldrating (assoc mid grouplens-rating-alist))) - (if oldrating - (setcdr oldrating (cons rating 0)) - (push `(,mid . (,rating . 0)) grouplens-rating-alist)) - (gnus-summary-mark-article nil (int-to-string rating))) - (gnus-message 3 "Invalid rating"))))) - -(defun grouplens-next-unread-article (rating) - "Select unread article after current one." - (interactive "P") - (when rating - (bbb-summary-rate-article rating)) - (gnus-summary-next-unread-article)) - -(defun grouplens-best-unread-article (rating) - "Select unread article after current one." - (interactive "P") - (when rating - (bbb-summary-rate-article rating)) - (gnus-summary-best-unread-article)) - -(defun grouplens-summary-catchup-and-exit (rating) - "Mark all articles not marked as unread in this newsgroup as read, then exit. -If prefix argument ALL is non-nil, all articles are marked as read." - (interactive "P") - (when rating - (bbb-summary-rate-article rating)) - (if (numberp rating) - (gnus-summary-catchup-and-exit) - (gnus-summary-catchup-and-exit rating))) - -(defun grouplens-score-thread (score) - "Raise the score of the articles in the current thread with SCORE." - (interactive "nRating: ") - (let (e) - (save-excursion - (let ((articles (gnus-summary-articles-in-thread)) - article) - (while (setq article (pop articles)) - (gnus-summary-goto-subject article) - (bbb-summary-rate-article score - (mail-header-id - (gnus-summary-article-header article))))) - (setq e (point))) - (let ((gnus-summary-check-current t)) - (or (zerop (gnus-summary-next-subject 1 t)) - (goto-char e)))) - (gnus-summary-recenter) - (gnus-summary-position-point) - (gnus-set-mode-line 'summary)) - -(defun bbb-exit-group () - (bbb-put-ratings) - (bbb-renew-hash-table)) - -(defun bbb-get-current-id () - (if gnus-current-headers - (mail-header-id gnus-current-headers) - (gnus-message 3 "You must select an article before you rate it"))) - -(defun bbb-grouplens-group-p (group) - "Say whether GROUP is a GroupLens group." - (if (member group grouplens-newsgroups) " (GroupLens Enhanced)" "")) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; TIME SPENT READING -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(defvar grouplens-current-starting-time nil) - -(defun grouplens-start-timer () - (setq grouplens-current-starting-time (current-time))) - -(defun grouplens-elapsed-time () - (let ((et (bbb-time-float (current-time)))) - (- et (bbb-time-float grouplens-current-starting-time)))) - -(defun bbb-time-float (timeval) - (+ (* (car timeval) 65536) - (cadr timeval))) - -(defun grouplens-do-time () - (when (member gnus-newsgroup-name grouplens-newsgroups) - (when grouplens-previous-article - (let ((elapsed-time (grouplens-elapsed-time)) - (oldrating (assoc grouplens-previous-article - grouplens-rating-alist))) - (if (not oldrating) - (push `(,grouplens-previous-article . (0 . ,elapsed-time)) - grouplens-rating-alist) - (setcdr oldrating (cons (cadr oldrating) elapsed-time))))) - (grouplens-start-timer) - (setq grouplens-previous-article (bbb-get-current-id)))) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; BUG REPORTING -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -(defconst gnus-gl-version "gnus-gl.el 2.50") -(defconst gnus-gl-maintainer-address "grouplens-bug@cs.umn.edu") -(defun gnus-gl-submit-bug-report () - "Submit via mail a bug report on gnus-gl." - (interactive) - (require 'reporter) - (reporter-submit-bug-report gnus-gl-maintainer-address - (concat "gnus-gl.el " gnus-gl-version) - (list 'grouplens-pseudonym - 'grouplens-bbb-host - 'grouplens-bbb-port - 'grouplens-newsgroups - 'grouplens-bbb-token - 'grouplens-bbb-process - 'grouplens-current-group - 'grouplens-previous-article) - nil - 'gnus-gl-get-trace)) - -(defun gnus-gl-get-trace () - "Insert the contents of the BBBD trace buffer." - (when grouplens-bbb-buffer - (insert-buffer-substring grouplens-bbb-buffer))) - -;; -;; GroupLens minor mode -;; - -(defvar gnus-grouplens-mode nil - "Minor mode for providing a GroupLens interface in Gnus summary buffers.") - -(defvar gnus-grouplens-mode-map nil) - -(unless gnus-grouplens-mode-map - (setq gnus-grouplens-mode-map (make-keymap)) - (gnus-define-keys - gnus-grouplens-mode-map - "n" grouplens-next-unread-article - "r" bbb-summary-rate-article - "k" grouplens-score-thread - "c" grouplens-summary-catchup-and-exit - "," grouplens-best-unread-article)) - -(defun gnus-grouplens-make-menu-bar () - (unless (boundp 'gnus-grouplens-menu) - (easy-menu-define - gnus-grouplens-menu gnus-grouplens-mode-map "" - '("GroupLens" - ["Login" bbb-login t] - ["Rate" bbb-summary-rate-article t] - ["Next article" grouplens-next-unread-article t] - ["Best article" grouplens-best-unread-article t] - ["Raise thread" grouplens-score-thread t] - ["Report bugs" gnus-gl-submit-bug-report t])))) - -(defun gnus-grouplens-mode (&optional arg) - "Minor mode for providing a GroupLens interface in Gnus summary buffers." - (interactive "P") - (when (and (eq major-mode 'gnus-summary-mode) - (member gnus-newsgroup-name grouplens-newsgroups)) - (make-local-variable 'gnus-grouplens-mode) - (setq gnus-grouplens-mode - (if (null arg) (not gnus-grouplens-mode) - (> (prefix-numeric-value arg) 0))) - (when gnus-grouplens-mode - (make-local-hook 'gnus-select-article-hook) - (add-hook 'gnus-select-article-hook 'grouplens-do-time nil 'local) - (make-local-hook 'gnus-exit-group-hook) - (add-hook 'gnus-exit-group-hook 'bbb-exit-group nil 'local) - (make-local-variable 'gnus-score-find-score-files-function) - - (cond - ((eq gnus-grouplens-override-scoring 'combine) - ;; either add bbb-buld-mid-scores-alist to a list - ;; or make a list - (if (listp gnus-score-find-score-files-function) - (setq gnus-score-find-score-files-function - (append 'bbb-build-mid-scores-alist - gnus-score-find-score-files-function)) - (setq gnus-score-find-score-files-function - (list gnus-score-find-score-files-function - 'bbb-build-mid-scores-alist)))) - ;; leave the gnus-score-find-score-files variable alone - ((eq gnus-grouplens-override-scoring 'separate) - (add-hook 'gnus-select-group-hook - (lambda () - (bbb-get-predictions (bbb-get-all-mids) - gnus-newsgroup-name)))) - ;; default is to override - (t - (setq gnus-score-find-score-files-function - 'bbb-build-mid-scores-alist))) - - ;; Change how summary lines look - (make-local-variable 'gnus-summary-line-format) - (make-local-variable 'gnus-summary-line-format-spec) - (setq gnus-summary-line-format gnus-summary-grouplens-line-format) - (setq gnus-summary-line-format-spec nil) - (gnus-update-format-specifications nil 'summary) - (gnus-update-summary-mark-positions) - - ;; Set up the menu. - (when (and menu-bar-mode - (gnus-visual-p 'grouplens-menu 'menu)) - (gnus-grouplens-make-menu-bar)) - (gnus-add-minor-mode - 'gnus-grouplens-mode " GroupLens" gnus-grouplens-mode-map) - (gnus-run-hooks 'gnus-grouplens-mode-hook)))) - -(provide 'gnus-gl) - -;;; gnus-gl.el ends here diff --git a/lisp/gnus-group.el b/lisp/gnus-group.el deleted file mode 100644 index 1b9fc0b..0000000 --- a/lisp/gnus-group.el +++ /dev/null @@ -1,4006 +0,0 @@ -;;; gnus-group.el --- group mode commands for Gnus -;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) - -(require 'gnus) -(require 'gnus-start) -(require 'nnmail) -(require 'gnus-spec) -(require 'gnus-int) -(require 'gnus-range) -(require 'gnus-win) -(require 'gnus-undo) -(require 'time-date) -(require 'gnus-ems) - -(defcustom gnus-group-archive-directory - "*ftp@ftp.hpc.uh.edu:/pub/emacs/ding-list/" - "*The address of the (ding) archives." - :group 'gnus-group-foreign - :type 'directory) - -(defcustom gnus-group-recent-archive-directory - "*ftp@ftp.hpc.uh.edu:/pub/emacs/ding-list-recent/" - "*The address of the most recent (ding) articles." - :group 'gnus-group-foreign - :type 'directory) - -(defcustom gnus-no-groups-message "No gnus is bad news" - "*Message displayed by Gnus when no groups are available." - :group 'gnus-start - :type 'string) - -(defcustom gnus-keep-same-level nil - "*Non-nil means that the next newsgroup after the current will be on the same level. -When you type, for instance, `n' after reading the last article in the -current newsgroup, you will go to the next newsgroup. If this variable -is nil, the next newsgroup will be the next from the group -buffer. -If this variable is non-nil, Gnus will either put you in the -next newsgroup with the same level, or, if no such newsgroup is -available, the next newsgroup with the lowest possible level higher -than the current level. -If this variable is `best', Gnus will make the next newsgroup the one -with the best level." - :group 'gnus-group-levels - :type '(choice (const nil) - (const best) - (sexp :tag "other" t))) - -(defcustom gnus-group-goto-unread t - "*If non-nil, movement commands will go to the next unread and subscribed group." - :link '(custom-manual "(gnus)Group Maneuvering") - :group 'gnus-group-various - :type 'boolean) - -(defcustom gnus-goto-next-group-when-activating t - "*If non-nil, the \\\\[gnus-group-get-new-news-this-group] command will advance point to the next group." - :link '(custom-manual "(gnus)Scanning New Messages") - :group 'gnus-group-various - :type 'boolean) - -(defcustom gnus-permanently-visible-groups nil - "*Regexp to match groups that should always be listed in the group buffer. -This means that they will still be listed even when there are no -unread articles in the groups. - -If nil, no groups are permanently visible." - :group 'gnus-group-listing - :type '(choice regexp (const nil))) - -(defcustom gnus-list-groups-with-ticked-articles t - "*If non-nil, list groups that have only ticked articles. -If nil, only list groups that have unread articles." - :group 'gnus-group-listing - :type 'boolean) - -(defcustom gnus-group-default-list-level gnus-level-subscribed - "*Default listing level. -Ignored if `gnus-group-use-permanent-levels' is non-nil." - :group 'gnus-group-listing - :type 'integer) - -(defcustom gnus-group-list-inactive-groups t - "*If non-nil, inactive groups will be listed." - :group 'gnus-group-listing - :group 'gnus-group-levels - :type 'boolean) - -(defcustom gnus-group-sort-function 'gnus-group-sort-by-alphabet - "*Function used for sorting the group buffer. -This function will be called with group info entries as the arguments -for the groups to be sorted. Pre-made functions include -`gnus-group-sort-by-alphabet', `gnus-group-sort-by-real-name', -`gnus-group-sort-by-unread', `gnus-group-sort-by-level', -`gnus-group-sort-by-score', `gnus-group-sort-by-method', -`gnus-group-sort-by-server', and `gnus-group-sort-by-rank'. - -This variable can also be a list of sorting functions. In that case, -the most significant sort function should be the last function in the -list." - :group 'gnus-group-listing - :link '(custom-manual "(gnus)Sorting Groups") - :type '(radio (function-item gnus-group-sort-by-alphabet) - (function-item gnus-group-sort-by-real-name) - (function-item gnus-group-sort-by-unread) - (function-item gnus-group-sort-by-level) - (function-item gnus-group-sort-by-score) - (function-item gnus-group-sort-by-method) - (function-item gnus-group-sort-by-server) - (function-item gnus-group-sort-by-rank) - (function :tag "other" nil))) - -(defcustom gnus-group-line-format "%M\%S\%p\%P\%5y: %(%g%)%l\n" - "*Format of group lines. -It works along the same lines as a normal formatting string, -with some simple extensions. - -%M Only marked articles (character, \"*\" or \" \") -%S Whether the group is subscribed (character, \"U\", \"K\", \"Z\" or \" \") -%L Level of subscribedness (integer) -%N Number of unread articles (integer) -%I Number of dormant articles (integer) -%i Number of ticked and dormant (integer) -%T Number of ticked articles (integer) -%R Number of read articles (integer) -%t Estimated total number of articles (integer) -%y Number of unread, unticked articles (integer) -%G Group name (string) -%g Qualified group name (string) -%D Group description (string) -%s Select method (string) -%o Moderated group (char, \"m\") -%p Process mark (char) -%O Moderated group (string, \"(m)\" or \"\") -%P Topic indentation (string) -%m Whether there is new(ish) mail in the group (char, \"%\") -%w Number of new(ish) mails in the group (integer) -%l Whether there are GroupLens predictions for this group (string) -%n Select from where (string) -%z A string that look like `<%s:%n>' if a foreign select method is used -%d The date the group was last entered. -%E Icon as defined by `gnus-group-icon-list'. -%u User defined specifier. The next character in the format string should - be a letter. Gnus will call the function gnus-user-format-function-X, - where X is the letter following %u. The function will be passed the - current header as argument. The function should return a string, which - will be inserted into the buffer just like information from any other - group specifier. - -Text between %( and %) will be highlighted with `gnus-mouse-face' when -the mouse point move inside the area. There can only be one such area. - -Note that this format specification is not always respected. For -reasons of efficiency, when listing killed groups, this specification -is ignored altogether. If the spec is changed considerably, your -output may end up looking strange when listing both alive and killed -groups. - -If you use %o or %O, reading the active file will be slower and quite -a bit of extra memory will be used. %D will also worsen performance. -Also note that if you change the format specification to include any -of these specs, you must probably re-start Gnus to see them go into -effect." - :group 'gnus-group-visual - :type 'string) - -(defcustom gnus-group-mode-line-format "Gnus: %%b {%M\%:%S}" - "*The format specification for the group mode line. -It works along the same lines as a normal formatting string, -with some simple extensions: - -%S The native news server. -%M The native select method. -%: \":\" if %S isn't \"\"." - :group 'gnus-group-visual - :type 'string) - -(defcustom gnus-group-mode-hook nil - "Hook for Gnus group mode." - :group 'gnus-group-various - :options '(gnus-topic-mode) - :type 'hook) - -;; Extracted from gnus-xmas-redefine in order to preserve user settings -(when (featurep 'xemacs) - (add-hook 'gnus-group-mode-hook 'gnus-xmas-group-menu-add) - (add-hook 'gnus-group-mode-hook 'gnus-xmas-setup-group-toolbar)) - -(defcustom gnus-group-menu-hook nil - "Hook run after the creation of the group mode menu." - :group 'gnus-group-various - :type 'hook) - -(defcustom gnus-group-catchup-group-hook nil - "Hook run when catching up a group from the group buffer." - :group 'gnus-group-various - :link '(custom-manual "(gnus)Group Data") - :type 'hook) - -(defcustom gnus-group-update-group-hook nil - "Hook called when updating group lines." - :group 'gnus-group-visual - :type 'hook) - -(defcustom gnus-group-prepare-function 'gnus-group-prepare-flat - "*A function that is called to generate the group buffer. -The function is called with three arguments: The first is a number; -all group with a level less or equal to that number should be listed, -if the second is non-nil, empty groups should also be displayed. If -the third is non-nil, it is a number. No groups with a level lower -than this number should be displayed. - -The only current function implemented is `gnus-group-prepare-flat'." - :group 'gnus-group-listing - :type 'function) - -(defcustom gnus-group-prepare-hook nil - "Hook called after the group buffer has been generated. -If you want to modify the group buffer, you can use this hook." - :group 'gnus-group-listing - :type 'hook) - -(defcustom gnus-suspend-gnus-hook nil - "Hook called when suspending (not exiting) Gnus." - :group 'gnus-exit - :type 'hook) - -(defcustom gnus-exit-gnus-hook nil - "Hook called when exiting Gnus." - :group 'gnus-exit - :type 'hook) - -(defcustom gnus-after-exiting-gnus-hook nil - "Hook called after exiting Gnus." - :group 'gnus-exit - :type 'hook) - -(defcustom gnus-group-update-hook '(gnus-group-highlight-line) - "Hook called when a group line is changed. -The hook will not be called if `gnus-visual' is nil. - -The default function `gnus-group-highlight-line' will -highlight the line according to the `gnus-group-highlight' -variable." - :group 'gnus-group-visual - :type 'hook) - -(defcustom gnus-useful-groups - '(("(ding) mailing list mirrored at sunsite.auc.dk" - "emacs.ding" - (nntp "sunsite.auc.dk" - (nntp-address "sunsite.auc.dk"))) - ("gnus-bug archive" - "gnus-bug" - (nndir "/ftp@ftp.ifi.uio.no:/pub/emacs/gnus/gnus-bug/")) - ("Gnus help group" - "gnus-help" - (nndoc "gnus-help" - (nndoc-article-type mbox) - (eval `(nndoc-address - ,(let ((file (nnheader-find-etc-directory - "gnus-tut.txt" t))) - (unless file - (error "Couldn't find doc group")) - file)))))) - "*Alist of useful group-server pairs." - :group 'gnus-group-listing - :type '(repeat (list (string :tag "Description") - (string :tag "Name") - (sexp :tag "Method")))) - -(defcustom gnus-group-highlight - '(;; Mail. - ((and mailp (= unread 0) (eq level 1)) . - gnus-group-mail-1-empty-face) - ((and mailp (eq level 1)) . - gnus-group-mail-1-face) - ((and mailp (= unread 0) (eq level 2)) . - gnus-group-mail-2-empty-face) - ((and mailp (eq level 2)) . - gnus-group-mail-2-face) - ((and mailp (= unread 0) (eq level 3)) . - gnus-group-mail-3-empty-face) - ((and mailp (eq level 3)) . - gnus-group-mail-3-face) - ((and mailp (= unread 0)) . - gnus-group-mail-low-empty-face) - ((and mailp) . - gnus-group-mail-low-face) - ;; News. - ((and (= unread 0) (eq level 1)) . - gnus-group-news-1-empty-face) - ((and (eq level 1)) . - gnus-group-news-1-face) - ((and (= unread 0) (eq level 2)) . - gnus-group-news-2-empty-face) - ((and (eq level 2)) . - gnus-group-news-2-face) - ((and (= unread 0) (eq level 3)) . - gnus-group-news-3-empty-face) - ((and (eq level 3)) . - gnus-group-news-3-face) - ((and (= unread 0) (eq level 4)) . - gnus-group-news-4-empty-face) - ((and (eq level 4)) . - gnus-group-news-4-face) - ((and (= unread 0) (eq level 5)) . - gnus-group-news-5-empty-face) - ((and (eq level 5)) . - gnus-group-news-5-face) - ((and (= unread 0) (eq level 6)) . - gnus-group-news-6-empty-face) - ((and (eq level 6)) . - gnus-group-news-6-face) - ((and (= unread 0)) . - gnus-group-news-low-empty-face) - (t . - gnus-group-news-low-face)) - "*Controls the highlighting of group buffer lines. - -Below is a list of `Form'/`Face' pairs. When deciding how a a -particular group line should be displayed, each form is -evaluated. The content of the face field after the first true form is -used. You can change how those group lines are displayed by -editing the face field. - -It is also possible to change and add form fields, but currently that -requires an understanding of Lisp expressions. Hopefully this will -change in a future release. For now, you can use the following -variables in the Lisp expression: - -group: The name of the group. -unread: The number of unread articles in the group. -method: The select method used. -mailp: Whether it's a mail group or not. -level: The level of the group. -score: The score of the group. -ticked: The number of ticked articles." - :group 'gnus-group-visual - :type '(repeat (cons (sexp :tag "Form") face))) - -(defcustom gnus-new-mail-mark ?% - "Mark used for groups with new mail." - :group 'gnus-group-visual - :type 'character) - -(defgroup gnus-group-icons nil - "Add Icons to your group buffer. " - :group 'gnus-group-visual) - -(defcustom gnus-group-icon-list - nil - "*Controls the insertion of icons into group buffer lines. - -Below is a list of `Form'/`File' pairs. When deciding how a -particular group line should be displayed, each form is evaluated. -The icon from the file field after the first true form is used. You -can change how those group lines are displayed by editing the file -field. The File will either be found in the -`gnus-group-glyph-directory' or by designating absolute path to the -file. - -It is also possible to change and add form fields, but currently that -requires an understanding of Lisp expressions. Hopefully this will -change in a future release. For now, you can use the following -variables in the Lisp expression: - -group: The name of the group. -unread: The number of unread articles in the group. -method: The select method used. -mailp: Whether it's a mail group or not. -newsp: Whether it's a news group or not -level: The level of the group. -score: The score of the group. -ticked: The number of ticked articles." - :group 'gnus-group-icons - :type '(repeat (cons (sexp :tag "Form") file))) - -(defcustom gnus-group-name-charset-method-alist nil - "*Alist of method and the charset for group names. - -For example: - (((nntp \"news.com.cn\") . cn-gb-2312)) -" - :version "21.1" - :group 'gnus-charset - :type '(repeat (cons (sexp :tag "Method") (symbol :tag "Charset")))) - -(defcustom gnus-group-name-charset-group-alist nil - "*Alist of group regexp and the charset for group names. - -For example: - ((\"\\.com\\.cn:\" . cn-gb-2312)) -" - :group 'gnus-charset - :type '(repeat (cons (regexp :tag "Group") (symbol :tag "Charset")))) - -(defcustom gnus-group-jump-to-group-prompt nil - "Default prompt for `gnus-group-jump-to-group'. -If non-nil, the value should be a string, e.g. \"nnml:\", -in which case `gnus-group-jump-to-group' offers \"Group: nnml:\" -in the minibuffer prompt." - :group 'gnus-group-various - :type '(choice (string :tag "Prompt string") - (const :tag "Empty" nil))) - -(defvar gnus-group-listing-limit 1000 - "*A limit of the number of groups when listing. -If the number of groups is larger than the limit, list them in a -simple manner.") - -;;; Internal variables - -(defvar gnus-group-sort-alist-function 'gnus-group-sort-flat - "Function for sorting the group buffer.") - -(defvar gnus-group-sort-selected-function 'gnus-group-sort-selected-flat - "Function for sorting the selected groups in the group buffer.") - -(defvar gnus-group-indentation-function nil) -(defvar gnus-goto-missing-group-function nil) -(defvar gnus-group-update-group-function nil) -(defvar gnus-group-goto-next-group-function nil - "Function to override finding the next group after listing groups.") - -(defvar gnus-group-edit-buffer nil) - -(defvar gnus-group-line-format-alist - `((?M gnus-tmp-marked-mark ?c) - (?S gnus-tmp-subscribed ?c) - (?L gnus-tmp-level ?d) - (?N (cond ((eq number t) "*" ) - ((numberp number) - (int-to-string - (+ number - (gnus-range-length (cdr (assq 'dormant gnus-tmp-marked))) - (gnus-range-length (cdr (assq 'tick gnus-tmp-marked)))))) - (t number)) ?s) - (?R gnus-tmp-number-of-read ?s) - (?t gnus-tmp-number-total ?d) - (?y gnus-tmp-number-of-unread ?s) - (?I (gnus-range-length (cdr (assq 'dormant gnus-tmp-marked))) ?d) - (?T (gnus-range-length (cdr (assq 'tick gnus-tmp-marked))) ?d) - (?i (+ (gnus-range-length (cdr (assq 'dormant gnus-tmp-marked))) - (gnus-range-length (cdr (assq 'tick gnus-tmp-marked)))) ?d) - (?g gnus-tmp-group ?s) - (?G gnus-tmp-qualified-group ?s) - (?c (gnus-short-group-name gnus-tmp-group) ?s) - (?D gnus-tmp-newsgroup-description ?s) - (?o gnus-tmp-moderated ?c) - (?O gnus-tmp-moderated-string ?s) - (?p gnus-tmp-process-marked ?c) - (?s gnus-tmp-news-server ?s) - (?n gnus-tmp-news-method ?s) - (?P gnus-group-indentation ?s) - (?E gnus-tmp-group-icon ?s) - (?l gnus-tmp-grouplens ?s) - (?z gnus-tmp-news-method-string ?s) - (?m (gnus-group-new-mail gnus-tmp-group) ?c) - (?w (if (gnus-news-group-p gnus-tmp-group) - "" - (int-to-string - (length - (nnmail-new-mail-numbers (gnus-group-real-name gnus-tmp-group)) - ))) - ?s) - (?d (gnus-group-timestamp-string gnus-tmp-group) ?s) - (?u gnus-tmp-user-defined ?s))) - -(defvar gnus-group-mode-line-format-alist - `((?S gnus-tmp-news-server ?s) - (?M gnus-tmp-news-method ?s) - (?u gnus-tmp-user-defined ?s) - (?: gnus-tmp-colon ?s))) - -(defvar gnus-topic-topology nil - "The complete topic hierarchy.") - -(defvar gnus-topic-alist nil - "The complete topic-group alist.") - -(defvar gnus-group-marked nil) - -(defvar gnus-group-list-mode nil) - - -(defvar gnus-group-icon-cache nil) - -(defvar gnus-group-listed-groups nil) -(defvar gnus-group-list-option nil) - -;;; -;;; Gnus group mode -;;; - -(put 'gnus-group-mode 'mode-class 'special) - -(when t - (gnus-define-keys gnus-group-mode-map - " " gnus-group-read-group - "=" gnus-group-select-group - "\r" gnus-group-select-group - "\M-\r" gnus-group-quick-select-group - "\M- " gnus-group-visible-select-group - [(meta control return)] gnus-group-select-group-ephemerally - "j" gnus-group-jump-to-group - "n" gnus-group-next-unread-group - "p" gnus-group-prev-unread-group - "\177" gnus-group-prev-unread-group - [delete] gnus-group-prev-unread-group - [backspace] gnus-group-prev-unread-group - "N" gnus-group-next-group - "P" gnus-group-prev-group - "\M-n" gnus-group-next-unread-group-same-level - "\M-p" gnus-group-prev-unread-group-same-level - "," gnus-group-best-unread-group - "." gnus-group-first-unread-group - "u" gnus-group-unsubscribe-current-group - "U" gnus-group-unsubscribe-group - "c" gnus-group-catchup-current - "C" gnus-group-catchup-current-all - "\M-c" gnus-group-clear-data - "l" gnus-group-list-groups - "L" gnus-group-list-all-groups - "m" gnus-group-mail - "g" gnus-group-get-new-news - "\M-g" gnus-group-get-new-news-this-group - "R" gnus-group-restart - "r" gnus-group-read-init-file - "B" gnus-group-browse-foreign-server - "b" gnus-group-check-bogus-groups - "F" gnus-group-find-new-groups - "\C-c\C-d" gnus-group-describe-group - "\M-d" gnus-group-describe-all-groups - "\C-c\C-a" gnus-group-apropos - "\C-c\M-\C-a" gnus-group-description-apropos - "a" gnus-group-post-news - "\ek" gnus-group-edit-local-kill - "\eK" gnus-group-edit-global-kill - "\C-k" gnus-group-kill-group - "\C-y" gnus-group-yank-group - "\C-w" gnus-group-kill-region - "\C-x\C-t" gnus-group-transpose-groups - "\C-c\C-l" gnus-group-list-killed - "\C-c\C-x" gnus-group-expire-articles - "\C-c\M-\C-x" gnus-group-expire-all-groups - "V" gnus-version - "s" gnus-group-save-newsrc - "z" gnus-group-suspend - "q" gnus-group-exit - "Q" gnus-group-quit - "?" gnus-group-describe-briefly - "\C-c\C-i" gnus-info-find-node - "\M-e" gnus-group-edit-group-method - "^" gnus-group-enter-server-mode - gnus-mouse-2 gnus-mouse-pick-group - "<" beginning-of-buffer - ">" end-of-buffer - "\C-c\C-b" gnus-bug - "\C-c\C-s" gnus-group-sort-groups - "t" gnus-topic-mode - "\C-c\M-g" gnus-activate-all-groups - "\M-&" gnus-group-universal-argument - "#" gnus-group-mark-group - "\M-#" gnus-group-unmark-group) - - (gnus-define-keys (gnus-group-mark-map "M" gnus-group-mode-map) - "m" gnus-group-mark-group - "u" gnus-group-unmark-group - "w" gnus-group-mark-region - "b" gnus-group-mark-buffer - "r" gnus-group-mark-regexp - "U" gnus-group-unmark-all-groups) - - (gnus-define-keys (gnus-group-group-map "G" gnus-group-mode-map) - "d" gnus-group-make-directory-group - "h" gnus-group-make-help-group - "u" gnus-group-make-useful-group - "a" gnus-group-make-archive-group - "k" gnus-group-make-kiboze-group - "l" gnus-group-nnimap-edit-acl - "m" gnus-group-make-group - "E" gnus-group-edit-group - "e" gnus-group-edit-group-method - "p" gnus-group-edit-group-parameters - "v" gnus-group-add-to-virtual - "V" gnus-group-make-empty-virtual - "D" gnus-group-enter-directory - "f" gnus-group-make-doc-group - "w" gnus-group-make-web-group - "r" gnus-group-rename-group - "c" gnus-group-customize - "x" gnus-group-nnimap-expunge - "\177" gnus-group-delete-group - [delete] gnus-group-delete-group) - - (gnus-define-keys (gnus-group-soup-map "s" gnus-group-group-map) - "b" gnus-group-brew-soup - "w" gnus-soup-save-areas - "s" gnus-soup-send-replies - "p" gnus-soup-pack-packet - "r" nnsoup-pack-replies) - - (gnus-define-keys (gnus-group-sort-map "S" gnus-group-group-map) - "s" gnus-group-sort-groups - "a" gnus-group-sort-groups-by-alphabet - "u" gnus-group-sort-groups-by-unread - "l" gnus-group-sort-groups-by-level - "v" gnus-group-sort-groups-by-score - "r" gnus-group-sort-groups-by-rank - "m" gnus-group-sort-groups-by-method) - - (gnus-define-keys (gnus-group-sort-selected-map "P" gnus-group-group-map) - "s" gnus-group-sort-selected-groups - "a" gnus-group-sort-selected-groups-by-alphabet - "u" gnus-group-sort-selected-groups-by-unread - "l" gnus-group-sort-selected-groups-by-level - "v" gnus-group-sort-selected-groups-by-score - "r" gnus-group-sort-selected-groups-by-rank - "m" gnus-group-sort-selected-groups-by-method) - - (gnus-define-keys (gnus-group-list-map "A" gnus-group-mode-map) - "k" gnus-group-list-killed - "z" gnus-group-list-zombies - "s" gnus-group-list-groups - "u" gnus-group-list-all-groups - "A" gnus-group-list-active - "a" gnus-group-apropos - "d" gnus-group-description-apropos - "m" gnus-group-list-matching - "M" gnus-group-list-all-matching - "l" gnus-group-list-level - "c" gnus-group-list-cached - "?" gnus-group-list-dormant) - - (gnus-define-keys (gnus-group-list-limit-map "/" gnus-group-list-map) - "k" gnus-group-list-limit - "z" gnus-group-list-limit - "s" gnus-group-list-limit - "u" gnus-group-list-limit - "A" gnus-group-list-limit - "m" gnus-group-list-limit - "M" gnus-group-list-limit - "l" gnus-group-list-limit - "c" gnus-group-list-limit - "?" gnus-group-list-limit) - - (gnus-define-keys (gnus-group-list-flush-map "f" gnus-group-list-map) - "k" gnus-group-list-flush - "z" gnus-group-list-flush - "s" gnus-group-list-flush - "u" gnus-group-list-flush - "A" gnus-group-list-flush - "m" gnus-group-list-flush - "M" gnus-group-list-flush - "l" gnus-group-list-flush - "c" gnus-group-list-flush - "?" gnus-group-list-flush) - - (gnus-define-keys (gnus-group-list-plus-map "p" gnus-group-list-map) - "k" gnus-group-list-plus - "z" gnus-group-list-plus - "s" gnus-group-list-plus - "u" gnus-group-list-plus - "A" gnus-group-list-plus - "m" gnus-group-list-plus - "M" gnus-group-list-plus - "l" gnus-group-list-plus - "c" gnus-group-list-plus - "?" gnus-group-list-plus) - - (gnus-define-keys (gnus-group-score-map "W" gnus-group-mode-map) - "f" gnus-score-flush-cache) - - (gnus-define-keys (gnus-group-help-map "H" gnus-group-mode-map) - "d" gnus-group-describe-group - "f" gnus-group-fetch-faq - "v" gnus-version) - - (gnus-define-keys (gnus-group-sub-map "S" gnus-group-mode-map) - "l" gnus-group-set-current-level - "t" gnus-group-unsubscribe-current-group - "s" gnus-group-unsubscribe-group - "k" gnus-group-kill-group - "y" gnus-group-yank-group - "w" gnus-group-kill-region - "\C-k" gnus-group-kill-level - "z" gnus-group-kill-all-zombies)) - -(defun gnus-group-make-menu-bar () - (gnus-turn-off-edit-menu 'group) - (unless (boundp 'gnus-group-reading-menu) - - (easy-menu-define - gnus-group-reading-menu gnus-group-mode-map "" - `("Group" - ["Read" gnus-group-read-group (gnus-group-group-name)] - ["Select" gnus-group-select-group (gnus-group-group-name)] - ["See old articles" (gnus-group-select-group 'all) - :keys "C-u SPC" :active (gnus-group-group-name)] - ["Catch up" gnus-group-catchup-current :active (gnus-group-group-name) - ,@(if (featurep 'xemacs) nil - '(:help "Mark unread articles in the current group as read"))] - ["Catch up all articles" gnus-group-catchup-current-all - (gnus-group-group-name)] - ["Check for new articles" gnus-group-get-new-news-this-group - :active (gnus-group-group-name) - ,@(if (featurep 'xemacs) nil - '(:help "Check for new messages in current group"))] - ["Toggle subscription" gnus-group-unsubscribe-current-group - (gnus-group-group-name)] - ["Kill" gnus-group-kill-group :active (gnus-group-group-name) - ,@(if (featurep 'xemacs) nil - '(:help "Kill (remove) current group"))] - ["Yank" gnus-group-yank-group gnus-list-of-killed-groups] - ["Describe" gnus-group-describe-group :active (gnus-group-group-name) - ,@(if (featurep 'xemacs) nil - '(:help "Display description of the current group"))] - ["Fetch FAQ" gnus-group-fetch-faq (gnus-group-group-name)] - ;; Actually one should check, if any of the marked groups gives t for - ;; (gnus-check-backend-function 'request-expire-articles ...) - ["Expire articles" gnus-group-expire-articles - (or (and (gnus-group-group-name) - (gnus-check-backend-function - 'request-expire-articles - (gnus-group-group-name))) gnus-group-marked)] - ["Set group level" gnus-group-set-current-level - (gnus-group-group-name)] - ["Select quick" gnus-group-quick-select-group (gnus-group-group-name)] - ["Customize" gnus-group-customize (gnus-group-group-name)] - ("Edit" - ["Parameters" gnus-group-edit-group-parameters - (gnus-group-group-name)] - ["Select method" gnus-group-edit-group-method - (gnus-group-group-name)] - ["Info" gnus-group-edit-group (gnus-group-group-name)] - ["Local kill file" gnus-group-edit-local-kill (gnus-group-group-name)] - ["Global kill file" gnus-group-edit-global-kill t]))) - - (easy-menu-define - gnus-group-group-menu gnus-group-mode-map "" - '("Groups" - ("Listing" - ["List unread subscribed groups" gnus-group-list-groups t] - ["List (un)subscribed groups" gnus-group-list-all-groups t] - ["List killed groups" gnus-group-list-killed gnus-killed-list] - ["List zombie groups" gnus-group-list-zombies gnus-zombie-list] - ["List level..." gnus-group-list-level t] - ["Describe all groups" gnus-group-describe-all-groups t] - ["Group apropos..." gnus-group-apropos t] - ["Group and description apropos..." gnus-group-description-apropos t] - ["List groups matching..." gnus-group-list-matching t] - ["List all groups matching..." gnus-group-list-all-matching t] - ["List active file" gnus-group-list-active t] - ["List groups with cached" gnus-group-list-cached t] - ["List groups with dormant" gnus-group-list-dormant t]) - ("Sort" - ["Default sort" gnus-group-sort-groups t] - ["Sort by method" gnus-group-sort-groups-by-method t] - ["Sort by rank" gnus-group-sort-groups-by-rank t] - ["Sort by score" gnus-group-sort-groups-by-score t] - ["Sort by level" gnus-group-sort-groups-by-level t] - ["Sort by unread" gnus-group-sort-groups-by-unread t] - ["Sort by name" gnus-group-sort-groups-by-alphabet t]) - ("Sort process/prefixed" - ["Default sort" gnus-group-sort-selected-groups - (or (not (boundp 'gnus-topic-mode)) (not gnus-topic-mode))] - ["Sort by method" gnus-group-sort-selected-groups-by-method - (or (not (boundp 'gnus-topic-mode)) (not gnus-topic-mode))] - ["Sort by rank" gnus-group-sort-selected-groups-by-rank - (or (not (boundp 'gnus-topic-mode)) (not gnus-topic-mode))] - ["Sort by score" gnus-group-sort-selected-groups-by-score - (or (not (boundp 'gnus-topic-mode)) (not gnus-topic-mode))] - ["Sort by level" gnus-group-sort-selected-groups-by-level - (or (not (boundp 'gnus-topic-mode)) (not gnus-topic-mode))] - ["Sort by unread" gnus-group-sort-selected-groups-by-unread - (or (not (boundp 'gnus-topic-mode)) (not gnus-topic-mode))] - ["Sort by name" gnus-group-sort-selected-groups-by-alphabet - (or (not (boundp 'gnus-topic-mode)) (not gnus-topic-mode))]) - ("Mark" - ["Mark group" gnus-group-mark-group - (and (gnus-group-group-name) - (not (memq (gnus-group-group-name) gnus-group-marked)))] - ["Unmark group" gnus-group-unmark-group - (and (gnus-group-group-name) - (memq (gnus-group-group-name) gnus-group-marked))] - ["Unmark all" gnus-group-unmark-all-groups gnus-group-marked] - ["Mark regexp..." gnus-group-mark-regexp t] - ["Mark region" gnus-group-mark-region t] - ["Mark buffer" gnus-group-mark-buffer t] - ["Execute command" gnus-group-universal-argument - (or gnus-group-marked (gnus-group-group-name))]) - ("Subscribe" - ["Subscribe to a group" gnus-group-unsubscribe-group t] - ["Kill all newsgroups in region" gnus-group-kill-region t] - ["Kill all zombie groups" gnus-group-kill-all-zombies - gnus-zombie-list] - ["Kill all groups on level..." gnus-group-kill-level t]) - ("Foreign groups" - ["Make a foreign group" gnus-group-make-group t] - ["Add a directory group" gnus-group-make-directory-group t] - ["Add the help group" gnus-group-make-help-group t] - ["Add the archive group" gnus-group-make-archive-group t] - ["Make a doc group" gnus-group-make-doc-group t] - ["Make a web group" gnus-group-make-web-group t] - ["Make a kiboze group" gnus-group-make-kiboze-group t] - ["Make a virtual group" gnus-group-make-empty-virtual t] - ["Add a group to a virtual" gnus-group-add-to-virtual t] - ["Rename group" gnus-group-rename-group - (gnus-check-backend-function - 'request-rename-group (gnus-group-group-name))] - ["Delete group" gnus-group-delete-group - (gnus-check-backend-function - 'request-delete-group (gnus-group-group-name))]) - ("Move" - ["Next" gnus-group-next-group t] - ["Previous" gnus-group-prev-group t] - ["Next unread" gnus-group-next-unread-group t] - ["Previous unread" gnus-group-prev-unread-group t] - ["Next unread same level" gnus-group-next-unread-group-same-level t] - ["Previous unread same level" - gnus-group-prev-unread-group-same-level t] - ["Jump to group" gnus-group-jump-to-group t] - ["First unread group" gnus-group-first-unread-group t] - ["Best unread group" gnus-group-best-unread-group t]) - ["Delete bogus groups" gnus-group-check-bogus-groups t] - ["Find new newsgroups" gnus-group-find-new-groups t] - ["Transpose" gnus-group-transpose-groups - (gnus-group-group-name)] - ["Read a directory as a group..." gnus-group-enter-directory t])) - - (easy-menu-define - gnus-group-misc-menu gnus-group-mode-map "" - `("Gnus" - ("SOUP" - ["Pack replies" nnsoup-pack-replies (fboundp 'nnsoup-request-group)] - ["Send replies" gnus-soup-send-replies - (fboundp 'gnus-soup-pack-packet)] - ["Pack packet" gnus-soup-pack-packet (fboundp 'gnus-soup-pack-packet)] - ["Save areas" gnus-soup-save-areas (fboundp 'gnus-soup-pack-packet)] - ["Brew SOUP" gnus-group-brew-soup (fboundp 'gnus-soup-pack-packet)]) - ["Send a mail" gnus-group-mail t] - ["Post an article..." gnus-group-post-news t] - ["Check for new news" gnus-group-get-new-news - ,@(if (featurep 'xemacs) '(t) - '(:help "Get newly arrived articles")) - ] - ["Activate all groups" gnus-activate-all-groups t] - ["Restart Gnus" gnus-group-restart t] - ["Read init file" gnus-group-read-init-file t] - ["Browse foreign server" gnus-group-browse-foreign-server t] - ["Enter server buffer" gnus-group-enter-server-mode t] - ["Expire all expirable articles" gnus-group-expire-all-groups t] - ["Generate any kiboze groups" nnkiboze-generate-groups t] - ["Gnus version" gnus-version t] - ["Save .newsrc files" gnus-group-save-newsrc t] - ["Suspend Gnus" gnus-group-suspend t] - ["Clear dribble buffer" gnus-group-clear-dribble t] - ["Read manual" gnus-info-find-node t] - ["Flush score cache" gnus-score-flush-cache t] - ["Toggle topics" gnus-topic-mode t] - ["Send a bug report" gnus-bug t] - ["Exit from Gnus" gnus-group-exit - ,@(if (featurep 'xemacs) '(t) - '(:help "Quit reading news"))] - ["Exit without saving" gnus-group-quit t])) - - (gnus-run-hooks 'gnus-group-menu-hook))) - -(defvar gnus-group-toolbar-map nil) - -;; Emacs 21 tool bar. Should be no-op otherwise. -(defun gnus-group-make-tool-bar () - (if (and (fboundp 'tool-bar-add-item-from-menu) - (default-value 'tool-bar-mode) - (not gnus-group-toolbar-map)) - (setq gnus-group-toolbar-map - (let ((tool-bar-map (make-sparse-keymap)) - (load-path (mm-image-load-path))) - (tool-bar-add-item-from-menu - 'gnus-group-get-new-news "get-news" gnus-group-mode-map) - (tool-bar-add-item-from-menu - 'gnus-group-get-new-news-this-group "gnntg" gnus-group-mode-map) - (tool-bar-add-item-from-menu - 'gnus-group-catchup-current "catchup" gnus-group-mode-map) - (tool-bar-add-item-from-menu - 'gnus-group-describe-group "describe-group" gnus-group-mode-map) - (tool-bar-add-item "subscribe" 'gnus-group-subscribe 'subscribe - :help "Subscribe to the current group") - (tool-bar-add-item "unsubscribe" 'gnus-group-unsubscribe - 'unsubscribe - :help "Unsubscribe from the current group") - (tool-bar-add-item-from-menu - 'gnus-group-exit "exit-gnus" gnus-group-mode-map) - tool-bar-map))) - (if gnus-group-toolbar-map - (set (make-local-variable 'tool-bar-map) gnus-group-toolbar-map))) - -(defun gnus-group-mode () - "Major mode for reading news. - -All normal editing commands are switched off. -\\ -The group buffer lists (some of) the groups available. For instance, -`\\[gnus-group-list-groups]' will list all subscribed groups with unread articles, while `\\[gnus-group-list-zombies]' -lists all zombie groups. - -Groups that are displayed can be entered with `\\[gnus-group-read-group]'. To subscribe -to a group not displayed, type `\\[gnus-group-unsubscribe-group]'. - -For more in-depth information on this mode, read the manual (`\\[gnus-info-find-node]'). - -The following commands are available: - -\\{gnus-group-mode-map}" - (interactive) - (kill-all-local-variables) - (when (gnus-visual-p 'group-menu 'menu) - (gnus-group-make-menu-bar) - (gnus-group-make-tool-bar)) - (gnus-simplify-mode-line) - (setq major-mode 'gnus-group-mode) - (setq mode-name "Group") - (gnus-group-set-mode-line) - (setq mode-line-process nil) - (use-local-map gnus-group-mode-map) - (buffer-disable-undo) - (setq truncate-lines t) - (setq buffer-read-only t) - (gnus-set-default-directory) - (gnus-update-format-specifications nil 'group 'group-mode) - (gnus-update-group-mark-positions) - (when gnus-use-undo - (gnus-undo-mode 1)) - (when gnus-slave - (gnus-slave-mode)) - (gnus-run-hooks 'gnus-group-mode-hook)) - -(defun gnus-update-group-mark-positions () - (save-excursion - (let ((gnus-process-mark ?\200) - (gnus-group-update-hook nil) - (gnus-group-marked '("dummy.group")) - (gnus-active-hashtb (make-vector 10 0)) - (topic "")) - (gnus-set-active "dummy.group" '(0 . 0)) - (gnus-set-work-buffer) - (gnus-group-insert-group-line "dummy.group" 0 nil 0 nil) - (goto-char (point-min)) - (setq gnus-group-mark-positions - (list (cons 'process (and (search-forward "\200" nil t) - (- (point) 2)))))))) - -(defun gnus-mouse-pick-group (e) - "Enter the group under the mouse pointer." - (interactive "e") - (mouse-set-point e) - (gnus-group-read-group nil)) - -;; Look at LEVEL and find out what the level is really supposed to be. -;; If LEVEL is non-nil, LEVEL will be returned, if not, what happens -;; will depend on whether `gnus-group-use-permanent-levels' is used. -(defun gnus-group-default-level (&optional level number-or-nil) - (cond - (gnus-group-use-permanent-levels - (or (setq gnus-group-use-permanent-levels - (or level (if (numberp gnus-group-use-permanent-levels) - gnus-group-use-permanent-levels - (or gnus-group-default-list-level - gnus-level-subscribed)))) - gnus-group-default-list-level gnus-level-subscribed)) - (number-or-nil - level) - (t - (or level gnus-group-default-list-level gnus-level-subscribed)))) - -(defun gnus-group-setup-buffer () - (set-buffer (gnus-get-buffer-create gnus-group-buffer)) - (unless (eq major-mode 'gnus-group-mode) - (gnus-group-mode) - (when gnus-carpal - (gnus-carpal-setup-buffer 'group)))) - -(defsubst gnus-group-name-charset (method group) - (if (null method) - (setq method (gnus-find-method-for-group group))) - (let ((item (assoc method gnus-group-name-charset-method-alist)) - (alist gnus-group-name-charset-group-alist) - result) - (if item - (cdr item) - (while (setq item (pop alist)) - (if (string-match (car item) group) - (setq alist nil - result (cdr item)))) - result))) - -(defsubst gnus-group-name-decode (string charset) - (if (and string charset (featurep 'mule)) - (decode-coding-string string charset) - string)) - -(defun gnus-group-decoded-name (string) - (let ((charset (gnus-group-name-charset nil string))) - (gnus-group-name-decode string charset))) - -(defun gnus-group-list-groups (&optional level unread lowest) - "List newsgroups with level LEVEL or lower that have unread articles. -Default is all subscribed groups. -If argument UNREAD is non-nil, groups with no unread articles are also -listed. - -Also see the `gnus-group-use-permanent-levels' variable." - (interactive - (list (if current-prefix-arg - (prefix-numeric-value current-prefix-arg) - (or - (gnus-group-default-level nil t) - gnus-group-default-list-level - gnus-level-subscribed)))) - (unless level - (setq level (car gnus-group-list-mode) - unread (cdr gnus-group-list-mode))) - (setq level (gnus-group-default-level level)) - (gnus-group-setup-buffer) - (gnus-update-format-specifications nil 'group 'group-mode) - (let ((case-fold-search nil) - (props (text-properties-at (gnus-point-at-bol))) - (empty (= (point-min) (point-max))) - (group (gnus-group-group-name)) - number) - (set-buffer gnus-group-buffer) - (setq number (funcall gnus-group-prepare-function level unread lowest)) - (when (or (and (numberp number) - (zerop number)) - (zerop (buffer-size))) - ;; No groups in the buffer. - (gnus-message 5 gnus-no-groups-message)) - ;; We have some groups displayed. - (goto-char (point-max)) - (when (or (not gnus-group-goto-next-group-function) - (not (funcall gnus-group-goto-next-group-function - group props))) - (cond - (empty - (goto-char (point-min))) - ((not group) - ;; Go to the first group with unread articles. - (gnus-group-search-forward t)) - (t - ;; Find the right group to put point on. If the current group - ;; has disappeared in the new listing, try to find the next - ;; one. If no next one can be found, just leave point at the - ;; first newsgroup in the buffer. - (when (not (gnus-goto-char - (text-property-any - (point-min) (point-max) - 'gnus-group (gnus-intern-safe - group gnus-active-hashtb)))) - (let ((newsrc (cdddr (gnus-gethash group gnus-newsrc-hashtb)))) - (while (and newsrc - (not (gnus-goto-char - (text-property-any - (point-min) (point-max) 'gnus-group - (gnus-intern-safe - (caar newsrc) gnus-active-hashtb))))) - (setq newsrc (cdr newsrc))) - (unless newsrc - (goto-char (point-max)) - (forward-line -1))))))) - ;; Adjust cursor point. - (gnus-group-position-point))) - -(defun gnus-group-list-level (level &optional all) - "List groups on LEVEL. -If ALL (the prefix), also list groups that have no unread articles." - (interactive "nList groups on level: \nP") - (gnus-group-list-groups level all level)) - -(defun gnus-group-prepare-logic (group test) - (or (and gnus-group-listed-groups - (null gnus-group-list-option) - (member group gnus-group-listed-groups)) - (cond - ((null gnus-group-listed-groups) test) - ((null gnus-group-list-option) test) - (t (and (member group gnus-group-listed-groups) - (if (eq gnus-group-list-option 'flush) - (not test) - test)))))) - -(defun gnus-group-prepare-flat (level &optional predicate lowest regexp) - "List all newsgroups with unread articles of level LEVEL or lower. -If PREDICATE is a function, list groups that the function returns non-nil; -if it is t, list groups that have no unread articles. -If LOWEST is non-nil, list all newsgroups of level LOWEST or higher. -If REGEXP is a function, list dead groups that the function returns non-nil; -if it is a string, only list groups matching REGEXP." - (set-buffer gnus-group-buffer) - (let ((buffer-read-only nil) - (newsrc (cdr gnus-newsrc-alist)) - (lowest (or lowest 1)) - (not-in-list (and gnus-group-listed-groups - (copy-sequence gnus-group-listed-groups))) - info clevel unread group params) - (erase-buffer) - (when (or (< lowest gnus-level-zombie) - gnus-group-listed-groups) - ;; List living groups. - (while newsrc - (setq info (car newsrc) - group (gnus-info-group info) - params (gnus-info-params info) - newsrc (cdr newsrc) - unread (car (gnus-gethash group gnus-newsrc-hashtb))) - (if not-in-list - (setq not-in-list (delete group not-in-list))) - (and - (gnus-group-prepare-logic - group - (and unread ; This group might be unchecked - (or (not (stringp regexp)) - (string-match regexp group)) - (<= (setq clevel (gnus-info-level info)) level) - (>= clevel lowest) - (cond - ((functionp predicate) - (funcall predicate info)) - (predicate t) ; We list all groups? - (t - (or - (if (eq unread t) ; Unactivated? - gnus-group-list-inactive-groups - ; We list unactivated - (> unread 0)) - ; We list groups with unread articles - (and gnus-list-groups-with-ticked-articles - (cdr (assq 'tick (gnus-info-marks info)))) - ; And groups with tickeds - ;; Check for permanent visibility. - (and gnus-permanently-visible-groups - (string-match gnus-permanently-visible-groups group)) - (memq 'visible params) - (cdr (assq 'visible params))))))) - (gnus-group-insert-group-line - group (gnus-info-level info) - (gnus-info-marks info) unread (gnus-info-method info))))) - - ;; List dead groups. - (if (or gnus-group-listed-groups - (and (>= level gnus-level-zombie) - (<= lowest gnus-level-zombie))) - (gnus-group-prepare-flat-list-dead - (setq gnus-zombie-list (sort gnus-zombie-list 'string<)) - gnus-level-zombie ?Z - regexp)) - (if not-in-list - (dolist (group gnus-zombie-list) - (setq not-in-list (delete group not-in-list)))) - (if (or gnus-group-listed-groups - (and (>= level gnus-level-killed) (<= lowest gnus-level-killed))) - (gnus-group-prepare-flat-list-dead - (gnus-union - not-in-list - (setq gnus-killed-list (sort gnus-killed-list 'string<))) - gnus-level-killed ?K regexp)) - - (gnus-group-set-mode-line) - (setq gnus-group-list-mode (cons level predicate)) - (gnus-run-hooks 'gnus-group-prepare-hook) - t)) - -(defun gnus-group-prepare-flat-list-dead (groups level mark regexp) - ;; List zombies and killed lists somewhat faster, which was - ;; suggested by Jack Vinson . It does - ;; this by ignoring the group format specification altogether. - (let (group) - (if (> (length groups) gnus-group-listing-limit) - (while groups - (setq group (pop groups)) - (when (gnus-group-prepare-logic - group - (or (not regexp) - (and (stringp regexp) (string-match regexp group)) - (and (functionp regexp) (funcall regexp group)))) - (gnus-add-text-properties - (point) (prog1 (1+ (point)) - (insert " " mark " *: " - (gnus-group-decoded-name group) - "\n")) - (list 'gnus-group (gnus-intern-safe group gnus-active-hashtb) - 'gnus-unread t - 'gnus-level level)))) - (while groups - (setq group (pop groups)) - (when (gnus-group-prepare-logic - group - (or (not regexp) - (and (stringp regexp) (string-match regexp group)) - (and (functionp regexp) (funcall regexp group)))) - (gnus-group-insert-group-line - group level nil - (let ((active (gnus-active group))) - (if active - (if (zerop (cdr active)) - 0 - (- (1+ (cdr active)) (car active))) - nil)) - (gnus-method-simplify (gnus-find-method-for-group group)))))))) - -(defun gnus-group-update-group-line () - "Update the current line in the group buffer." - (let* ((buffer-read-only nil) - (group (gnus-group-group-name)) - (entry (and group (gnus-gethash group gnus-newsrc-hashtb))) - gnus-group-indentation) - (when group - (and entry - (not (gnus-ephemeral-group-p group)) - (gnus-dribble-enter - (concat "(gnus-group-set-info '" - (gnus-prin1-to-string (nth 2 entry)) - ")"))) - (setq gnus-group-indentation (gnus-group-group-indentation)) - (gnus-delete-line) - (gnus-group-insert-group-line-info group) - (forward-line -1) - (gnus-group-position-point)))) - -(defun gnus-group-insert-group-line-info (group) - "Insert GROUP on the current line." - (let ((entry (gnus-gethash group gnus-newsrc-hashtb)) - (gnus-group-indentation (gnus-group-group-indentation)) - active info) - (if entry - (progn - ;; (Un)subscribed group. - (setq info (nth 2 entry)) - (gnus-group-insert-group-line - group (gnus-info-level info) (gnus-info-marks info) - (or (car entry) t) (gnus-info-method info))) - ;; This group is dead. - (gnus-group-insert-group-line - group - (if (member group gnus-zombie-list) gnus-level-zombie gnus-level-killed) - nil - (if (setq active (gnus-active group)) - (if (zerop (cdr active)) - 0 - (- (1+ (cdr active)) (car active))) - nil) - (gnus-method-simplify (gnus-find-method-for-group group)))))) - -(defun gnus-group-insert-group-line (gnus-tmp-group gnus-tmp-level - gnus-tmp-marked number - gnus-tmp-method) - "Insert a group line in the group buffer." - (let* ((gnus-tmp-method - (gnus-server-get-method gnus-tmp-group gnus-tmp-method)) - (group-name-charset (gnus-group-name-charset gnus-tmp-method - gnus-tmp-group)) - (gnus-tmp-active (gnus-active gnus-tmp-group)) - (gnus-tmp-number-total - (if gnus-tmp-active - (1+ (- (cdr gnus-tmp-active) (car gnus-tmp-active))) - 0)) - (gnus-tmp-number-of-unread - (if (numberp number) (int-to-string (max 0 number)) - "*")) - (gnus-tmp-number-of-read - (if (numberp number) - (int-to-string (max 0 (- gnus-tmp-number-total number))) - "*")) - (gnus-tmp-subscribed - (cond ((<= gnus-tmp-level gnus-level-subscribed) ? ) - ((<= gnus-tmp-level gnus-level-unsubscribed) ?U) - ((= gnus-tmp-level gnus-level-zombie) ?Z) - (t ?K))) - (gnus-tmp-qualified-group - (gnus-group-name-decode (gnus-group-real-name gnus-tmp-group) - group-name-charset)) - (gnus-tmp-newsgroup-description - (if gnus-description-hashtb - (or (gnus-group-name-decode - (gnus-gethash gnus-tmp-group gnus-description-hashtb) - group-name-charset) "") - "")) - (gnus-tmp-moderated - (if (and gnus-moderated-hashtb - (gnus-gethash gnus-tmp-group gnus-moderated-hashtb)) - ?m ? )) - (gnus-tmp-moderated-string - (if (eq gnus-tmp-moderated ?m) "(m)" "")) - (gnus-tmp-group-icon "==&&==") - (gnus-tmp-news-server (or (cadr gnus-tmp-method) "")) - (gnus-tmp-news-method (or (car gnus-tmp-method) "")) - (gnus-tmp-news-method-string - (if gnus-tmp-method - (format "(%s:%s)" (car gnus-tmp-method) - (cadr gnus-tmp-method)) "")) - (gnus-tmp-marked-mark - (if (and (numberp number) - (zerop number) - (cdr (assq 'tick gnus-tmp-marked))) - ?* ? )) - (gnus-tmp-process-marked - (if (member gnus-tmp-group gnus-group-marked) - gnus-process-mark ? )) - (gnus-tmp-grouplens - (or (and gnus-use-grouplens - (bbb-grouplens-group-p gnus-tmp-group)) - "")) - (buffer-read-only nil) - header gnus-tmp-header) ; passed as parameter to user-funcs. - (beginning-of-line) - (gnus-add-text-properties - (point) - (prog1 (1+ (point)) - ;; Insert the text. - (eval gnus-group-line-format-spec)) - `(gnus-group ,(gnus-intern-safe gnus-tmp-group gnus-active-hashtb) - gnus-unread ,(if (numberp number) - (string-to-int gnus-tmp-number-of-unread) - t) - gnus-marked ,gnus-tmp-marked-mark - gnus-indentation ,gnus-group-indentation - gnus-level ,gnus-tmp-level)) - (forward-line -1) - (when (inline (gnus-visual-p 'group-highlight 'highlight)) - (gnus-run-hooks 'gnus-group-update-hook)) - (forward-line) - ;; Allow XEmacs to remove front-sticky text properties. - (gnus-group-remove-excess-properties))) - -(defun gnus-group-highlight-line () - "Highlight the current line according to `gnus-group-highlight'." - (let* ((list gnus-group-highlight) - (p (point)) - (end (progn (end-of-line) (point))) - ;; now find out where the line starts and leave point there. - (beg (progn (beginning-of-line) (point))) - (group (gnus-group-group-name)) - (entry (gnus-group-entry group)) - (unread (if (numberp (car entry)) (car entry) 0)) - (active (gnus-active group)) - (total (if active (1+ (- (cdr active) (car active))) 0)) - (info (nth 2 entry)) - (method (gnus-server-get-method group (gnus-info-method info))) - (marked (gnus-info-marks info)) - (mailp (apply 'append - (mapcar - (lambda (x) - (memq x (assoc (symbol-name - (car (or method gnus-select-method))) - gnus-valid-select-methods))) - '(mail post-mail)))) - (level (or (gnus-info-level info) gnus-level-killed)) - (score (or (gnus-info-score info) 0)) - (ticked (gnus-range-length (cdr (assq 'tick marked)))) - (group-age (gnus-group-timestamp-delta group)) - (inhibit-read-only t)) - ;; Eval the cars of the lists until we find a match. - (while (and list - (not (eval (caar list)))) - (setq list (cdr list))) - (let ((face (cdar list))) - (unless (eq face (get-text-property beg 'face)) - (gnus-put-text-property-excluding-characters-with-faces - beg end 'face - (setq face (if (boundp face) (symbol-value face) face))) - (gnus-extent-start-open beg))) - (goto-char p))) - -(defun gnus-group-update-group (group &optional visible-only) - "Update all lines where GROUP appear. -If VISIBLE-ONLY is non-nil, the group won't be displayed if it isn't -already." - ;; Can't use `save-excursion' here, so we do it manually. - (let ((buf (current-buffer)) - mark) - (set-buffer gnus-group-buffer) - (setq mark (point-marker)) - ;; The buffer may be narrowed. - (save-restriction - (widen) - (let ((ident (gnus-intern-safe group gnus-active-hashtb)) - (loc (point-min)) - found buffer-read-only) - ;; Enter the current status into the dribble buffer. - (let ((entry (gnus-gethash group gnus-newsrc-hashtb))) - (when (and entry - (not (gnus-ephemeral-group-p group))) - (gnus-dribble-enter - (concat "(gnus-group-set-info '" - (gnus-prin1-to-string (nth 2 entry)) - ")")))) - ;; Find all group instances. If topics are in use, each group - ;; may be listed in more than once. - (while (setq loc (text-property-any - loc (point-max) 'gnus-group ident)) - (setq found t) - (goto-char loc) - (let ((gnus-group-indentation (gnus-group-group-indentation))) - (gnus-delete-line) - (gnus-group-insert-group-line-info group) - (save-excursion - (forward-line -1) - (gnus-run-hooks 'gnus-group-update-group-hook))) - (setq loc (1+ loc))) - (unless (or found visible-only) - ;; No such line in the buffer, find out where it's supposed to - ;; go, and insert it there (or at the end of the buffer). - (if gnus-goto-missing-group-function - (funcall gnus-goto-missing-group-function group) - (let ((entry (cddr (gnus-gethash group gnus-newsrc-hashtb)))) - (while (and entry (car entry) - (not - (gnus-goto-char - (text-property-any - (point-min) (point-max) - 'gnus-group (gnus-intern-safe - (caar entry) gnus-active-hashtb))))) - (setq entry (cdr entry))) - (or entry (goto-char (point-max))))) - ;; Finally insert the line. - (let ((gnus-group-indentation (gnus-group-group-indentation))) - (gnus-group-insert-group-line-info group) - (save-excursion - (forward-line -1) - (gnus-run-hooks 'gnus-group-update-group-hook)))) - (when gnus-group-update-group-function - (funcall gnus-group-update-group-function group)) - (gnus-group-set-mode-line))) - (goto-char mark) - (set-marker mark nil) - (set-buffer buf))) - -(defun gnus-group-set-mode-line () - "Update the mode line in the group buffer." - (when (memq 'group gnus-updated-mode-lines) - ;; Yes, we want to keep this mode line updated. - (save-excursion - (set-buffer gnus-group-buffer) - (let* ((gformat (or gnus-group-mode-line-format-spec - (gnus-set-format 'group-mode))) - (gnus-tmp-news-server (cadr gnus-select-method)) - (gnus-tmp-news-method (car gnus-select-method)) - (gnus-tmp-colon (if (equal gnus-tmp-news-server "") "" ":")) - (max-len 60) - gnus-tmp-header ;Dummy binding for user-defined formats - ;; Get the resulting string. - (modified - (and gnus-dribble-buffer - (buffer-name gnus-dribble-buffer) - (buffer-modified-p gnus-dribble-buffer) - (save-excursion - (set-buffer gnus-dribble-buffer) - (not (zerop (buffer-size)))))) - (mode-string (eval gformat))) - ;; Say whether the dribble buffer has been modified. - (setq mode-line-modified - (if modified (car gnus-mode-line-modified) - (cdr gnus-mode-line-modified))) - ;; If the line is too long, we chop it off. - (when (> (length mode-string) max-len) - (setq mode-string (substring mode-string 0 (- max-len 4)))) - (prog1 - (setq mode-line-buffer-identification - (gnus-mode-line-buffer-identification - (list mode-string))) - (set-buffer-modified-p modified)))))) - -(defun gnus-group-group-name () - "Get the name of the newsgroup on the current line." - (let ((group (get-text-property (gnus-point-at-bol) 'gnus-group))) - (when group - (symbol-name group)))) - -(defun gnus-group-group-level () - "Get the level of the newsgroup on the current line." - (get-text-property (gnus-point-at-bol) 'gnus-level)) - -(defun gnus-group-group-indentation () - "Get the indentation of the newsgroup on the current line." - (or (get-text-property (gnus-point-at-bol) 'gnus-indentation) - (and gnus-group-indentation-function - (funcall gnus-group-indentation-function)) - "")) - -(defun gnus-group-group-unread () - "Get the number of unread articles of the newsgroup on the current line." - (get-text-property (gnus-point-at-bol) 'gnus-unread)) - -(defun gnus-group-new-mail (group) - (if (nnmail-new-mail-p (gnus-group-real-name group)) - gnus-new-mail-mark - ? )) - -(defun gnus-group-level (group) - "Return the estimated level of GROUP." - (or (gnus-info-level (gnus-get-info group)) - (and (member group gnus-zombie-list) gnus-level-zombie) - gnus-level-killed)) - -(defun gnus-group-search-forward (&optional backward all level first-too) - "Find the next newsgroup with unread articles. -If BACKWARD is non-nil, find the previous newsgroup instead. -If ALL is non-nil, just find any newsgroup. -If LEVEL is non-nil, find group with level LEVEL, or higher if no such -group exists. -If FIRST-TOO, the current line is also eligible as a target." - (let ((way (if backward -1 1)) - (low gnus-level-killed) - (beg (point)) - pos found lev) - (if (and backward (progn (beginning-of-line)) (bobp)) - nil - (unless first-too - (forward-line way)) - (while (and - (not (eobp)) - (not (setq - found - (and - (get-text-property (point) 'gnus-group) - (or all - (and - (let ((unread - (get-text-property (point) 'gnus-unread))) - (and (numberp unread) (> unread 0))) - (setq lev (get-text-property (point) - 'gnus-level)) - (<= lev gnus-level-subscribed))) - (or (not level) - (and (setq lev (get-text-property (point) - 'gnus-level)) - (or (= lev level) - (and (< lev low) - (< level lev) - (progn - (setq low lev) - (setq pos (point)) - nil)))))))) - (zerop (forward-line way))))) - (if found - (progn (gnus-group-position-point) t) - (goto-char (or pos beg)) - (and pos t)))) - -;;; Gnus group mode commands - -;; Group marking. - -(defun gnus-group-mark-line-p () - (save-excursion - (beginning-of-line) - (forward-char (or (cdr (assq 'process gnus-group-mark-positions)) 2)) - (eq (char-after) gnus-process-mark))) - -(defun gnus-group-mark-group (n &optional unmark no-advance) - "Mark the current group." - (interactive "p") - (let ((buffer-read-only nil) - group) - (while (and (> n 0) - (not (eobp))) - (when (setq group (gnus-group-group-name)) - ;; Go to the mark position. - (beginning-of-line) - (forward-char (or (cdr (assq 'process gnus-group-mark-positions)) 2)) - (subst-char-in-region - (point) (1+ (point)) (char-after) - (if unmark - (progn - (setq gnus-group-marked (delete group gnus-group-marked)) - ? ) - (setq gnus-group-marked - (cons group (delete group gnus-group-marked))) - gnus-process-mark))) - (unless no-advance - (gnus-group-next-group 1)) - (decf n)) - (gnus-summary-position-point) - n)) - -(defun gnus-group-unmark-group (n) - "Remove the mark from the current group." - (interactive "p") - (gnus-group-mark-group n 'unmark) - (gnus-group-position-point)) - -(defun gnus-group-unmark-all-groups () - "Unmark all groups." - (interactive) - (let ((groups gnus-group-marked)) - (save-excursion - (while groups - (gnus-group-remove-mark (pop groups))))) - (gnus-group-position-point)) - -(defun gnus-group-mark-region (unmark beg end) - "Mark all groups between point and mark. -If UNMARK, remove the mark instead." - (interactive "P\nr") - (let ((num (count-lines beg end))) - (save-excursion - (goto-char beg) - (- num (gnus-group-mark-group num unmark))))) - -(defun gnus-group-mark-buffer (&optional unmark) - "Mark all groups in the buffer. -If UNMARK, remove the mark instead." - (interactive "P") - (gnus-group-mark-region unmark (point-min) (point-max))) - -(defun gnus-group-mark-regexp (regexp) - "Mark all groups that match some regexp." - (interactive "sMark (regexp): ") - (let ((alist (cdr gnus-newsrc-alist)) - group) - (while alist - (when (string-match regexp (setq group (gnus-info-group (pop alist)))) - (gnus-group-set-mark group)))) - (gnus-group-position-point)) - -(defun gnus-group-remove-mark (group &optional test-marked) - "Remove the process mark from GROUP and move point there. -Return nil if the group isn't displayed." - (if (gnus-group-goto-group group nil test-marked) - (save-excursion - (gnus-group-mark-group 1 'unmark t) - t) - (setq gnus-group-marked - (delete group gnus-group-marked)) - nil)) - -(defun gnus-group-set-mark (group) - "Set the process mark on GROUP." - (if (gnus-group-goto-group group) - (save-excursion - (gnus-group-mark-group 1 nil t)) - (setq gnus-group-marked (cons group (delete group gnus-group-marked))))) - -(defun gnus-group-universal-argument (arg &optional groups func) - "Perform any command on all groups according to the process/prefix convention." - (interactive "P") - (if (eq (setq func (or func - (key-binding - (read-key-sequence - (substitute-command-keys - "\\\\[gnus-group-universal-argument]"))))) - 'undefined) - (gnus-error 1 "Undefined key") - (gnus-group-iterate arg - (lambda (group) - (command-execute func)))) - (gnus-group-position-point)) - -(defun gnus-group-process-prefix (n) - "Return a list of groups to work on. -Take into consideration N (the prefix) and the list of marked groups." - (cond - (n - (setq n (prefix-numeric-value n)) - ;; There is a prefix, so we return a list of the N next - ;; groups. - (let ((way (if (< n 0) -1 1)) - (n (abs n)) - group groups) - (save-excursion - (while (> n 0) - (if (setq group (gnus-group-group-name)) - (push group groups)) - (setq n (1- n)) - (gnus-group-next-group way))) - (nreverse groups))) - ((gnus-region-active-p) - ;; Work on the region between point and mark. - (let ((max (max (point) (mark))) - groups) - (save-excursion - (goto-char (min (point) (mark))) - (while - (and - (push (gnus-group-group-name) groups) - (zerop (gnus-group-next-group 1)) - (< (point) max))) - (nreverse groups)))) - (gnus-group-marked - ;; No prefix, but a list of marked articles. - (reverse gnus-group-marked)) - (t - ;; Neither marked articles or a prefix, so we return the - ;; current group. - (let ((group (gnus-group-group-name))) - (and group (list group)))))) - -;;; !!!Surely gnus-group-iterate should be a macro instead? I can't -;;; imagine why I went through these contortions... -(eval-and-compile - (let ((function (make-symbol "gnus-group-iterate-function")) - (window (make-symbol "gnus-group-iterate-window")) - (groups (make-symbol "gnus-group-iterate-groups")) - (group (make-symbol "gnus-group-iterate-group"))) - (eval - `(defun gnus-group-iterate (arg ,function) - "Iterate FUNCTION over all process/prefixed groups. -FUNCTION will be called with the group name as the parameter -and with point over the group in question." - (let ((,groups (gnus-group-process-prefix arg)) - (,window (selected-window)) - ,group) - (while ,groups - (setq ,group (car ,groups) - ,groups (cdr ,groups)) - (select-window ,window) - (gnus-group-remove-mark ,group) - (save-selected-window - (save-excursion - (funcall ,function ,group))))))))) - -(put 'gnus-group-iterate 'lisp-indent-function 1) - -;; Selecting groups. - -(defun gnus-group-read-group (&optional all no-article group select-articles) - "Read news in this newsgroup. -If the prefix argument ALL is non-nil, already read articles become -readable. IF ALL is a number, fetch this number of articles. If the -optional argument NO-ARTICLE is non-nil, no article will be -auto-selected upon group entry. If GROUP is non-nil, fetch that -group." - (interactive "P") - (let ((no-display (eq all 0)) - (group (or group (gnus-group-group-name))) - number active marked entry) - (when (eq all 0) - (setq all nil)) - (unless group - (error "No group on current line")) - (setq marked (gnus-info-marks - (nth 2 (setq entry (gnus-gethash - group gnus-newsrc-hashtb))))) - ;; This group might be a dead group. In that case we have to get - ;; the number of unread articles from `gnus-active-hashtb'. - (setq number - (cond ((numberp all) all) - (entry (car entry)) - ((setq active (gnus-active group)) - (- (1+ (cdr active)) (car active))))) - (gnus-summary-read-group - group (or all (and (numberp number) - (zerop (+ number (gnus-range-length - (cdr (assq 'tick marked))) - (gnus-range-length - (cdr (assq 'dormant marked))))))) - no-article nil no-display nil select-articles))) - -(defun gnus-group-select-group (&optional all) - "Select this newsgroup. -No article is selected automatically. -If the group is opened, just switch the summary buffer. -If ALL is non-nil, already read articles become readable. -If ALL is a number, fetch this number of articles." - (interactive "P") - (gnus-group-read-group all t)) - -(defun gnus-group-quick-select-group (&optional all) - "Select the current group \"quickly\". -This means that no highlighting or scoring will be performed. -If ALL (the prefix argument) is 0, don't even generate the summary -buffer. - -This might be useful if you want to toggle threading -before entering the group." - (interactive "P") - (require 'gnus-score) - (let (gnus-visual - gnus-score-find-score-files-function - gnus-home-score-file - gnus-apply-kill-hook - gnus-summary-expunge-below) - (gnus-group-read-group all t))) - -(defun gnus-group-visible-select-group (&optional all) - "Select the current group without hiding any articles." - (interactive "P") - (let ((gnus-inhibit-limiting t)) - (gnus-group-read-group all t))) - -(defun gnus-group-select-group-ephemerally () - "Select the current group without doing any processing whatsoever. -You will actually be entered into a group that's a copy of -the current group; no changes you make while in this group will -be permanent." - (interactive) - (require 'gnus-score) - (let* (gnus-visual - gnus-score-find-score-files-function gnus-apply-kill-hook - gnus-summary-expunge-below gnus-show-threads gnus-suppress-duplicates - gnus-summary-mode-hook gnus-select-group-hook - (group (gnus-group-group-name)) - (method (gnus-find-method-for-group group))) - (gnus-group-read-ephemeral-group - (gnus-group-prefixed-name group method) method))) - -;;;###autoload -(defun gnus-fetch-group (group) - "Start Gnus if necessary and enter GROUP. -Returns whether the fetching was successful or not." - (interactive (list (completing-read "Group name: " gnus-active-hashtb))) - (unless (get-buffer gnus-group-buffer) - (gnus-no-server)) - (gnus-group-read-group nil nil group)) - -;;;###autoload -(defun gnus-fetch-group-other-frame (group) - "Pop up a frame and enter GROUP." - (interactive "P") - (let ((window (get-buffer-window gnus-group-buffer))) - (cond (window - (select-frame (window-frame window))) - ((= (length (frame-list)) 1) - (select-frame (make-frame))) - (t - (other-frame 1)))) - (gnus-fetch-group group)) - -(defvar gnus-ephemeral-group-server 0) - -;; Enter a group that is not in the group buffer. Non-nil is returned -;; if selection was successful. -(defun gnus-group-read-ephemeral-group (group method &optional activate - quit-config request-only - select-articles) - "Read GROUP from METHOD as an ephemeral group. -If ACTIVATE, request the group first. -If QUIT-CONFIG, use that window configuration when exiting from the -ephemeral group. -If REQUEST-ONLY, don't actually read the group; just request it. -If SELECT-ARTICLES, only select those articles. - -Return the name of the group if selection was successful." - ;; Transform the select method into a unique server. - (when (stringp method) - (setq method (gnus-server-to-method method))) - (setq method - `(,(car method) ,(concat (cadr method) "-ephemeral") - (,(intern (format "%s-address" (car method))) ,(cadr method)) - ,@(cddr method))) - (let ((group (if (gnus-group-foreign-p group) group - (gnus-group-prefixed-name group method)))) - (gnus-sethash - group - `(-1 nil (,group - ,gnus-level-default-subscribed nil nil ,method - ((quit-config . - ,(if quit-config quit-config - (cons gnus-summary-buffer - gnus-current-window-configuration)))))) - gnus-newsrc-hashtb) - (push method gnus-ephemeral-servers) - (set-buffer gnus-group-buffer) - (unless (gnus-check-server method) - (error "Unable to contact server: %s" (gnus-status-message method))) - (when activate - (gnus-activate-group group 'scan) - (unless (gnus-request-group group) - (error "Couldn't request group: %s" - (nnheader-get-report (car method))))) - (if request-only - group - (condition-case () - (when (gnus-group-read-group t t group select-articles) - group) - ;;(error nil) - (quit - (message "Quit reading the ephemeral group") - nil))))) - -(defun gnus-group-jump-to-group (group) - "Jump to newsgroup GROUP." - (interactive - (list (completing-read - "Group: " gnus-active-hashtb nil - (gnus-read-active-file-p) - gnus-group-jump-to-group-prompt - 'gnus-group-history))) - - (when (equal group "") - (error "Empty group name")) - - (unless (gnus-ephemeral-group-p group) - ;; Either go to the line in the group buffer... - (unless (gnus-group-goto-group group) - ;; ... or insert the line. - (gnus-group-update-group group) - (gnus-group-goto-group group))) - ;; Adjust cursor point. - (gnus-group-position-point)) - -(defun gnus-group-goto-group (group &optional far test-marked) - "Goto to newsgroup GROUP. -If FAR, it is likely that the group is not on the current line. -If TEST-MARKED, the line must be marked." - (when group - (beginning-of-line) - (cond - ;; It's quite likely that we are on the right line, so - ;; we check the current line first. - ((and (not far) - (eq (get-text-property (point) 'gnus-group) - (gnus-intern-safe group gnus-active-hashtb)) - (or (not test-marked) (gnus-group-mark-line-p))) - (point)) - ;; Previous and next line are also likely, so we check them as well. - ((and (not far) - (save-excursion - (forward-line -1) - (and (eq (get-text-property (point) 'gnus-group) - (gnus-intern-safe group gnus-active-hashtb)) - (or (not test-marked) (gnus-group-mark-line-p))))) - (forward-line -1) - (point)) - ((and (not far) - (save-excursion - (forward-line 1) - (and (eq (get-text-property (point) 'gnus-group) - (gnus-intern-safe group gnus-active-hashtb)) - (or (not test-marked) (gnus-group-mark-line-p))))) - (forward-line 1) - (point)) - (test-marked - (goto-char (point-min)) - (let (found) - (while (and (not found) - (gnus-goto-char - (text-property-any - (point) (point-max) - 'gnus-group - (gnus-intern-safe group gnus-active-hashtb)))) - (if (gnus-group-mark-line-p) - (setq found t) - (forward-line 1))) - found)) - (t - ;; Search through the entire buffer. - (gnus-goto-char - (text-property-any - (point-min) (point-max) - 'gnus-group (gnus-intern-safe group gnus-active-hashtb))))))) - -(defun gnus-group-next-group (n &optional silent) - "Go to next N'th newsgroup. -If N is negative, search backward instead. -Returns the difference between N and the number of skips actually -done." - (interactive "p") - (gnus-group-next-unread-group n t nil silent)) - -(defun gnus-group-next-unread-group (n &optional all level silent) - "Go to next N'th unread newsgroup. -If N is negative, search backward instead. -If ALL is non-nil, choose any newsgroup, unread or not. -If LEVEL is non-nil, choose the next group with level LEVEL, or, if no -such group can be found, the next group with a level higher than -LEVEL. -Returns the difference between N and the number of skips actually -made." - (interactive "p") - (let ((backward (< n 0)) - (n (abs n))) - (while (and (> n 0) - (gnus-group-search-forward - backward (or (not gnus-group-goto-unread) all) level)) - (setq n (1- n))) - (when (and (/= 0 n) - (not silent)) - (gnus-message 7 "No more%s newsgroups%s" (if all "" " unread") - (if level " on this level or higher" ""))) - n)) - -(defun gnus-group-prev-group (n) - "Go to previous N'th newsgroup. -Returns the difference between N and the number of skips actually -done." - (interactive "p") - (gnus-group-next-unread-group (- n) t)) - -(defun gnus-group-prev-unread-group (n) - "Go to previous N'th unread newsgroup. -Returns the difference between N and the number of skips actually -done." - (interactive "p") - (gnus-group-next-unread-group (- n))) - -(defun gnus-group-next-unread-group-same-level (n) - "Go to next N'th unread newsgroup on the same level. -If N is negative, search backward instead. -Returns the difference between N and the number of skips actually -done." - (interactive "p") - (gnus-group-next-unread-group n t (gnus-group-group-level)) - (gnus-group-position-point)) - -(defun gnus-group-prev-unread-group-same-level (n) - "Go to next N'th unread newsgroup on the same level. -Returns the difference between N and the number of skips actually -done." - (interactive "p") - (gnus-group-next-unread-group (- n) t (gnus-group-group-level)) - (gnus-group-position-point)) - -(defun gnus-group-best-unread-group (&optional exclude-group) - "Go to the group with the highest level. -If EXCLUDE-GROUP, do not go to that group." - (interactive) - (goto-char (point-min)) - (let ((best 100000) - unread best-point) - (while (not (eobp)) - (setq unread (get-text-property (point) 'gnus-unread)) - (when (and (numberp unread) (> unread 0)) - (when (and (get-text-property (point) 'gnus-level) - (< (get-text-property (point) 'gnus-level) best) - (or (not exclude-group) - (not (equal exclude-group (gnus-group-group-name))))) - (setq best (get-text-property (point) 'gnus-level)) - (setq best-point (point)))) - (forward-line 1)) - (when best-point - (goto-char best-point)) - (gnus-summary-position-point) - (and best-point (gnus-group-group-name)))) - -(defun gnus-group-first-unread-group () - "Go to the first group with unread articles." - (interactive) - (prog1 - (let ((opoint (point)) - unread) - (goto-char (point-min)) - (if (or (eq (setq unread (gnus-group-group-unread)) t) ; Not active. - (and (numberp unread) ; Not a topic. - (not (zerop unread))) ; Has unread articles. - (zerop (gnus-group-next-unread-group 1))) ; Next unread group. - (point) ; Success. - (goto-char opoint) - nil)) ; Not success. - (gnus-group-position-point))) - -(defun gnus-group-enter-server-mode () - "Jump to the server buffer." - (interactive) - (gnus-enter-server-buffer)) - -(defun gnus-group-make-group (name &optional method address args) - "Add a new newsgroup. -The user will be prompted for a NAME, for a select METHOD, and an -ADDRESS." - (interactive - (list - (gnus-read-group "Group name: ") - (gnus-read-method "From method: "))) - - (when (stringp method) - (setq method (or (gnus-server-to-method method) method))) - (let* ((meth (gnus-method-simplify - (when (and method - (not (gnus-server-equal method gnus-select-method))) - (if address (list (intern method) address) - method)))) - (nname (if method (gnus-group-prefixed-name name meth) name)) - backend info) - (when (gnus-gethash nname gnus-newsrc-hashtb) - (error "Group %s already exists" nname)) - ;; Subscribe to the new group. - (gnus-group-change-level - (setq info (list t nname gnus-level-default-subscribed nil nil meth)) - gnus-level-default-subscribed gnus-level-killed - (and (gnus-group-group-name) - (gnus-gethash (gnus-group-group-name) - gnus-newsrc-hashtb)) - t) - ;; Make it active. - (gnus-set-active nname (cons 1 0)) - (unless (gnus-ephemeral-group-p name) - (gnus-dribble-enter - (concat "(gnus-group-set-info '" - (gnus-prin1-to-string (cdr info)) ")"))) - ;; Insert the line. - (gnus-group-insert-group-line-info nname) - (forward-line -1) - (gnus-group-position-point) - - ;; Load the backend and try to make the backend create - ;; the group as well. - (when (assoc (symbol-name (setq backend (car (gnus-server-get-method - nil meth)))) - gnus-valid-select-methods) - (require backend)) - (gnus-check-server meth) - (when (gnus-check-backend-function 'request-create-group nname) - (gnus-request-create-group nname nil args)) - t)) - -(defun gnus-group-delete-groups (&optional arg) - "Delete the current group. Only meaningful with editable groups." - (interactive "P") - (let ((n (length (gnus-group-process-prefix arg)))) - (when (gnus-yes-or-no-p - (if (= n 1) - "Delete this 1 group? " - (format "Delete these %d groups? " n))) - (gnus-group-iterate arg - (lambda (group) - (gnus-group-delete-group group nil t)))))) - -(defun gnus-group-delete-group (group &optional force no-prompt) - "Delete the current group. Only meaningful with editable groups. -If FORCE (the prefix) is non-nil, all the articles in the group will -be deleted. This is \"deleted\" as in \"removed forever from the face -of the Earth\". There is no undo. The user will be prompted before -doing the deletion." - (interactive - (list (gnus-group-group-name) - current-prefix-arg)) - (unless group - (error "No group to rename")) - (unless (gnus-check-backend-function 'request-delete-group group) - (error "This backend does not support group deletion")) - (prog1 - (if (and (not no-prompt) - (not (gnus-yes-or-no-p - (format - "Do you really want to delete %s%s? " - group (if force " and all its contents" ""))))) - () ; Whew! - (gnus-message 6 "Deleting group %s..." group) - (if (not (gnus-request-delete-group group force)) - (gnus-error 3 "Couldn't delete group %s" group) - (gnus-message 6 "Deleting group %s...done" group) - (gnus-group-goto-group group) - (gnus-group-kill-group 1 t) - (gnus-sethash group nil gnus-active-hashtb) - t)) - (gnus-group-position-point))) - -(defun gnus-group-rename-group (group new-name) - "Rename group from GROUP to NEW-NAME. -When used interactively, GROUP is the group under point -and NEW-NAME will be prompted for." - (interactive - (list - (gnus-group-group-name) - (progn - (unless (gnus-check-backend-function - 'request-rename-group (gnus-group-group-name)) - (error "This backend does not support renaming groups")) - (gnus-read-group "Rename group to: " - (gnus-group-real-name (gnus-group-group-name)))))) - - (unless (gnus-check-backend-function 'request-rename-group group) - (error "This backend does not support renaming groups")) - (unless group - (error "No group to rename")) - (when (equal (gnus-group-real-name group) new-name) - (error "Can't rename to the same name")) - - ;; We find the proper prefixed name. - (setq new-name - (if (gnus-group-native-p group) - ;; Native group. - new-name - ;; Foreign group. - (gnus-group-prefixed-name - (gnus-group-real-name new-name) - (gnus-info-method (gnus-get-info group))))) - - (gnus-message 6 "Renaming group %s to %s..." group new-name) - (prog1 - (if (progn - (gnus-group-goto-group group) - (not (when (< (gnus-group-group-level) gnus-level-zombie) - (gnus-request-rename-group group new-name)))) - (gnus-error 3 "Couldn't rename group %s to %s" group new-name) - ;; We rename the group internally by killing it... - (gnus-group-kill-group) - ;; ... changing its name ... - (setcar (cdar gnus-list-of-killed-groups) new-name) - ;; ... and then yanking it. Magic! - (gnus-group-yank-group) - (gnus-set-active new-name (gnus-active group)) - (gnus-message 6 "Renaming group %s to %s...done" group new-name) - new-name) - (setq gnus-killed-list (delete group gnus-killed-list)) - (gnus-set-active group nil) - (gnus-dribble-touch) - (gnus-group-position-point))) - -(defun gnus-group-edit-group (group &optional part) - "Edit the group on the current line." - (interactive (list (gnus-group-group-name))) - (let ((part (or part 'info)) - info) - (unless group - (error "No group on current line")) - (unless (setq info (gnus-get-info group)) - (error "Killed group; can't be edited")) - (ignore-errors - (gnus-close-group group)) - (gnus-edit-form - ;; Find the proper form to edit. - (cond ((eq part 'method) - (or (gnus-info-method info) "native")) - ((eq part 'params) - (gnus-info-params info)) - (t info)) - ;; The proper documentation. - (format - "Editing the %s for `%s'." - (cond - ((eq part 'method) "select method") - ((eq part 'params) "group parameters") - (t "group info")) - (gnus-group-decoded-name group)) - `(lambda (form) - (gnus-group-edit-group-done ',part ,group form))) - (local-set-key - "\C-c\C-i" - (gnus-create-info-command - (cond - ((eq part 'method) - "(gnus)Select Methods") - ((eq part 'params) - "(gnus)Group Parameters") - (t - "(gnus)Group Info")))))) - -(defun gnus-group-edit-group-method (group) - "Edit the select method of GROUP." - (interactive (list (gnus-group-group-name))) - (gnus-group-edit-group group 'method)) - -(defun gnus-group-edit-group-parameters (group) - "Edit the group parameters of GROUP." - (interactive (list (gnus-group-group-name))) - (gnus-group-edit-group group 'params)) - -(defun gnus-group-edit-group-done (part group form) - "Update variables." - (let* ((method (cond ((eq part 'info) (nth 4 form)) - ((eq part 'method) form) - (t nil))) - (info (cond ((eq part 'info) form) - ((eq part 'method) (gnus-get-info group)) - (t nil))) - (new-group (if info - (if (or (not method) - (gnus-server-equal - gnus-select-method method)) - (gnus-group-real-name (car info)) - (gnus-group-prefixed-name - (gnus-group-real-name (car info)) method)) - nil))) - (when (and new-group - (not (equal new-group group))) - (when (gnus-group-goto-group group) - (gnus-group-kill-group 1)) - (gnus-activate-group new-group)) - ;; Set the info. - (if (not (and info new-group)) - (gnus-group-set-info form (or new-group group) part) - (setq info (gnus-copy-sequence info)) - (setcar info new-group) - (unless (gnus-server-equal method "native") - (unless (nthcdr 3 info) - (nconc info (list nil nil))) - (unless (nthcdr 4 info) - (nconc info (list nil))) - (gnus-info-set-method info method)) - (gnus-group-set-info info)) - (gnus-group-update-group (or new-group group)) - (gnus-group-position-point))) - -(defun gnus-group-make-useful-group (group method) - "Create one of the groups described in `gnus-useful-groups'." - (interactive - (let ((entry (assoc (completing-read "Create group: " gnus-useful-groups - nil t) - gnus-useful-groups))) - (list (cadr entry) (caddr entry)))) - (setq method (gnus-copy-sequence method)) - (let (entry) - (while (setq entry (memq (assq 'eval method) method)) - (setcar entry (eval (cadar entry))))) - (gnus-group-make-group group method)) - -(defun gnus-group-make-help-group () - "Create the Gnus documentation group." - (interactive) - (let ((name (gnus-group-prefixed-name "gnus-help" '(nndoc "gnus-help"))) - (file (nnheader-find-etc-directory "gnus-tut.txt" t))) - (when (gnus-gethash name gnus-newsrc-hashtb) - (error "Documentation group already exists")) - (if (not file) - (gnus-message 1 "Couldn't find doc group") - (gnus-group-make-group - (gnus-group-real-name name) - (list 'nndoc "gnus-help" - (list 'nndoc-address file) - (list 'nndoc-article-type 'mbox))))) - (gnus-group-position-point)) - -(defun gnus-group-make-doc-group (file type) - "Create a group that uses a single file as the source." - (interactive - (list (read-file-name "File name: ") - (and current-prefix-arg 'ask))) - (when (eq type 'ask) - (let ((err "") - char found) - (while (not found) - (message - "%sFile type (mbox, babyl, digest, forward, mmdf, guess) [mbdfag]: " - err) - (setq found (cond ((= (setq char (read-char)) ?m) 'mbox) - ((= char ?b) 'babyl) - ((= char ?d) 'digest) - ((= char ?f) 'forward) - ((= char ?a) 'mmfd) - ((= char ?g) 'guess) - (t (setq err (format "%c unknown. " char)) - nil)))) - (setq type found))) - (let* ((file (expand-file-name file)) - (name (gnus-generate-new-group-name - (gnus-group-prefixed-name - (file-name-nondirectory file) '(nndoc ""))))) - (gnus-group-make-group - (gnus-group-real-name name) - (list 'nndoc file - (list 'nndoc-address file) - (list 'nndoc-article-type (or type 'guess)))))) - -(defvar nnweb-type-definition) -(defvar gnus-group-web-type-history nil) -(defvar gnus-group-web-search-history nil) -(defun gnus-group-make-web-group (&optional solid) - "Create an ephemeral nnweb group. -If SOLID (the prefix), create a solid group." - (interactive "P") - (require 'nnweb) - (let* ((group - (if solid (gnus-read-group "Group name: ") - (message-unique-id))) - (default-type (or (car gnus-group-web-type-history) - (symbol-name (caar nnweb-type-definition)))) - (type - (gnus-string-or - (completing-read - (format "Search engine type (default %s): " default-type) - (mapcar (lambda (elem) (list (symbol-name (car elem)))) - nnweb-type-definition) - nil t nil 'gnus-group-web-type-history) - default-type)) - (search - (read-string - "Search string: " - (cons (or (car gnus-group-web-search-history) "") 0) - 'gnus-group-web-search-history)) - (method - `(nnweb ,group (nnweb-search ,search) - (nnweb-type ,(intern type)) - (nnweb-ephemeral-p t)))) - (if solid - (gnus-group-make-group group "nnweb" "" `(,(intern type) ,search)) - (gnus-group-read-ephemeral-group - group method t - (cons (current-buffer) - (if (eq major-mode 'gnus-summary-mode) 'summary 'group)))))) - -(defvar nnwarchive-type-definition) -(defvar gnus-group-warchive-type-history nil) -(defvar gnus-group-warchive-login-history nil) -(defvar gnus-group-warchive-address-history nil) - -(defun gnus-group-make-warchive-group () - "Create a nnwarchive group." - (interactive) - (require 'nnwarchive) - (let* ((group (gnus-read-group "Group name: ")) - (default-type (or (car gnus-group-warchive-type-history) - (symbol-name (caar nnwarchive-type-definition)))) - (type - (gnus-string-or - (completing-read - (format "Warchive type (default %s): " default-type) - (mapcar (lambda (elem) (list (symbol-name (car elem)))) - nnwarchive-type-definition) - nil t nil 'gnus-group-warchive-type-history) - default-type)) - (address (read-string "Warchive address: " - nil 'gnus-group-warchive-address-history)) - (default-login (or (car gnus-group-warchive-login-history) - user-mail-address)) - (login - (gnus-string-or - (read-string - (format "Warchive login (default %s): " user-mail-address) - default-login 'gnus-group-warchive-login-history) - user-mail-address)) - (method - `(nnwarchive ,address - (nnwarchive-type ,(intern type)) - (nnwarchive-login ,login)))) - (gnus-group-make-group group method))) - -(defun gnus-group-make-archive-group (&optional all) - "Create the (ding) Gnus archive group of the most recent articles. -Given a prefix, create a full group." - (interactive "P") - (let ((group (gnus-group-prefixed-name - (if all "ding.archives" "ding.recent") '(nndir "")))) - (when (gnus-gethash group gnus-newsrc-hashtb) - (error "Archive group already exists")) - (gnus-group-make-group - (gnus-group-real-name group) - (list 'nndir (if all "hpc" "edu") - (list 'nndir-directory - (if all gnus-group-archive-directory - gnus-group-recent-archive-directory)))) - (gnus-group-add-parameter group (cons 'to-address "ding@gnus.org")))) - -(defun gnus-group-make-directory-group (dir) - "Create an nndir group. -The user will be prompted for a directory. The contents of this -directory will be used as a newsgroup. The directory should contain -mail messages or news articles in files that have numeric names." - (interactive - (list (read-file-name "Create group from directory: "))) - (unless (file-exists-p dir) - (error "No such directory")) - (unless (file-directory-p dir) - (error "Not a directory")) - (let ((ext "") - (i 0) - group) - (while (or (not group) (gnus-gethash group gnus-newsrc-hashtb)) - (setq group - (gnus-group-prefixed-name - (expand-file-name ext dir) - '(nndir ""))) - (setq ext (format "<%d>" (setq i (1+ i))))) - (gnus-group-make-group - (gnus-group-real-name group) - (list 'nndir (gnus-group-real-name group) (list 'nndir-directory dir))))) - -(eval-when-compile (defvar nnkiboze-score-file)) -(defun gnus-group-make-kiboze-group (group address scores) - "Create an nnkiboze group. -The user will be prompted for a name, a regexp to match groups, and -score file entries for articles to include in the group." - (interactive - (list - (read-string "nnkiboze group name: ") - (read-string "Source groups (regexp): ") - (let ((headers (mapcar (lambda (group) (list group)) - '("subject" "from" "number" "date" "message-id" - "references" "chars" "lines" "xref" - "followup" "all" "body" "head"))) - scores header regexp regexps) - (while (not (equal "" (setq header (completing-read - "Match on header: " headers nil t)))) - (setq regexps nil) - (while (not (equal "" (setq regexp (read-string - (format "Match on %s (regexp): " - header))))) - (push (list regexp nil nil 'r) regexps)) - (push (cons header regexps) scores)) - scores))) - (gnus-group-make-group group "nnkiboze" address) - (let* ((nnkiboze-current-group group) - (score-file (car (nnkiboze-score-file ""))) - (score-dir (file-name-directory score-file))) - (unless (file-exists-p score-dir) - (make-directory score-dir)) - (with-temp-file score-file - (let (emacs-lisp-mode-hook) - (pp scores (current-buffer)))))) - -(defun gnus-group-add-to-virtual (n vgroup) - "Add the current group to a virtual group." - (interactive - (list current-prefix-arg - (completing-read "Add to virtual group: " gnus-newsrc-hashtb nil t - "nnvirtual:"))) - (unless (eq (car (gnus-find-method-for-group vgroup)) 'nnvirtual) - (error "%s is not an nnvirtual group" vgroup)) - (gnus-close-group vgroup) - (let* ((groups (gnus-group-process-prefix n)) - (method (gnus-info-method (gnus-get-info vgroup)))) - (setcar (cdr method) - (concat - (nth 1 method) "\\|" - (mapconcat - (lambda (s) - (gnus-group-remove-mark s) - (concat "\\(^" (regexp-quote s) "$\\)")) - groups "\\|")))) - (gnus-group-position-point)) - -(defun gnus-group-make-empty-virtual (group) - "Create a new, fresh, empty virtual group." - (interactive "sCreate new, empty virtual group: ") - (let* ((method (list 'nnvirtual "^$")) - (pgroup (gnus-group-prefixed-name group method))) - ;; Check whether it exists already. - (when (gnus-gethash pgroup gnus-newsrc-hashtb) - (error "Group %s already exists" pgroup)) - ;; Subscribe the new group after the group on the current line. - (gnus-subscribe-group pgroup (gnus-group-group-name) method) - (gnus-group-update-group pgroup) - (forward-line -1) - (gnus-group-position-point))) - -(defun gnus-group-enter-directory (dir) - "Enter an ephemeral nneething group." - (interactive "DDirectory to read: ") - (let* ((method (list 'nneething dir '(nneething-read-only t))) - (leaf (gnus-group-prefixed-name - (file-name-nondirectory (directory-file-name dir)) - method)) - (name (gnus-generate-new-group-name leaf))) - (unless (gnus-group-read-ephemeral-group - name method t - (cons (current-buffer) - (if (eq major-mode 'gnus-summary-mode) - 'summary 'group))) - (error "Couldn't enter %s" dir)))) - -(eval-and-compile - (autoload 'nnimap-expunge "nnimap") - (autoload 'nnimap-acl-get "nnimap") - (autoload 'nnimap-acl-edit "nnimap")) - -(defun gnus-group-nnimap-expunge (group) - "Expunge deleted articles in current nnimap GROUP." - (interactive (list (gnus-group-group-name))) - (let ((mailbox (gnus-group-real-name group)) method) - (unless group - (error "No group on current line")) - (unless (gnus-get-info group) - (error "Killed group; can't be edited")) - (unless (eq 'nnimap (car (setq method (gnus-find-method-for-group group)))) - (error "%s is not an nnimap group" group)) - (nnimap-expunge mailbox (cadr method)))) - -(defun gnus-group-nnimap-edit-acl (group) - "Edit the Access Control List of current nnimap GROUP." - (interactive (list (gnus-group-group-name))) - (let ((mailbox (gnus-group-real-name group)) method acl) - (unless group - (error "No group on current line")) - (unless (gnus-get-info group) - (error "Killed group; can't be edited")) - (unless (eq (car (setq method (gnus-find-method-for-group group))) 'nnimap) - (error "%s is not an nnimap group" group)) - (unless (setq acl (nnimap-acl-get mailbox (cadr method))) - (error "Server does not support ACL's")) - (gnus-edit-form acl (format "Editing the access control list for `%s'. - - An access control list is a list of (identifier . rights) elements. - - The identifier string specifies the corresponding user. The - identifier \"anyone\" is reserved to refer to the universal identity. - - Rights is a string listing a (possibly empty) set of alphanumeric - characters, each character listing a set of operations which is being - controlled. Letters are reserved for ``standard'' rights, listed - below. Digits are reserved for implementation or site defined rights. - - l - lookup (mailbox is visible to LIST/LSUB commands) - r - read (SELECT the mailbox, perform CHECK, FETCH, PARTIAL, - SEARCH, COPY from mailbox) - s - keep seen/unseen information across sessions (STORE \\SEEN flag) - w - write (STORE flags other than \\SEEN and \\DELETED) - i - insert (perform APPEND, COPY into mailbox) - p - post (send mail to submission address for mailbox, - not enforced by IMAP4 itself) - c - create and delete mailbox (CREATE new sub-mailboxes in any - implementation-defined hierarchy, RENAME or DELETE mailbox) - d - delete messages (STORE \\DELETED flag, perform EXPUNGE) - a - administer (perform SETACL)" group) - `(lambda (form) - (nnimap-acl-edit - ,mailbox ',method ',acl form))))) - -;; Group sorting commands -;; Suggested by Joe Hildebrand . - -(defun gnus-group-sort-groups (func &optional reverse) - "Sort the group buffer according to FUNC. -When used interactively, the sorting function used will be -determined by the `gnus-group-sort-function' variable. -If REVERSE (the prefix), reverse the sorting order." - (interactive (list gnus-group-sort-function current-prefix-arg)) - (funcall gnus-group-sort-alist-function - (gnus-make-sort-function func) reverse) - (gnus-group-list-groups) - (gnus-dribble-touch)) - -(defun gnus-group-sort-flat (func reverse) - ;; We peel off the dummy group from the alist. - (when func - (when (equal (gnus-info-group (car gnus-newsrc-alist)) "dummy.group") - (pop gnus-newsrc-alist)) - ;; Do the sorting. - (setq gnus-newsrc-alist - (sort gnus-newsrc-alist func)) - (when reverse - (setq gnus-newsrc-alist (nreverse gnus-newsrc-alist))) - ;; Regenerate the hash table. - (gnus-make-hashtable-from-newsrc-alist))) - -(defun gnus-group-sort-groups-by-alphabet (&optional reverse) - "Sort the group buffer alphabetically by group name. -If REVERSE, sort in reverse order." - (interactive "P") - (gnus-group-sort-groups 'gnus-group-sort-by-alphabet reverse)) - -(defun gnus-group-sort-groups-by-unread (&optional reverse) - "Sort the group buffer by number of unread articles. -If REVERSE, sort in reverse order." - (interactive "P") - (gnus-group-sort-groups 'gnus-group-sort-by-unread reverse)) - -(defun gnus-group-sort-groups-by-level (&optional reverse) - "Sort the group buffer by group level. -If REVERSE, sort in reverse order." - (interactive "P") - (gnus-group-sort-groups 'gnus-group-sort-by-level reverse)) - -(defun gnus-group-sort-groups-by-score (&optional reverse) - "Sort the group buffer by group score. -If REVERSE, sort in reverse order." - (interactive "P") - (gnus-group-sort-groups 'gnus-group-sort-by-score reverse)) - -(defun gnus-group-sort-groups-by-rank (&optional reverse) - "Sort the group buffer by group rank. -If REVERSE, sort in reverse order." - (interactive "P") - (gnus-group-sort-groups 'gnus-group-sort-by-rank reverse)) - -(defun gnus-group-sort-groups-by-method (&optional reverse) - "Sort the group buffer alphabetically by backend name. -If REVERSE, sort in reverse order." - (interactive "P") - (gnus-group-sort-groups 'gnus-group-sort-by-method reverse)) - -(defun gnus-group-sort-groups-by-server (&optional reverse) - "Sort the group buffer alphabetically by server name. -If REVERSE, sort in reverse order." - (interactive "P") - (gnus-group-sort-groups 'gnus-group-sort-by-server reverse)) - -;;; Selected group sorting. - -(defun gnus-group-sort-selected-groups (n func &optional reverse) - "Sort the process/prefixed groups." - (interactive (list current-prefix-arg gnus-group-sort-function)) - (let ((groups (gnus-group-process-prefix n))) - (funcall gnus-group-sort-selected-function - groups (gnus-make-sort-function func) reverse) - (gnus-group-list-groups))) - -(defun gnus-group-sort-selected-flat (groups func reverse) - (let (entries infos) - ;; First find all the group entries for these groups. - (while groups - (push (nthcdr 2 (gnus-gethash (pop groups) gnus-newsrc-hashtb)) - entries)) - ;; Then sort the infos. - (setq infos - (sort - (mapcar - (lambda (entry) (car entry)) - (setq entries (nreverse entries))) - func)) - (when reverse - (setq infos (nreverse infos))) - ;; Go through all the infos and replace the old entries - ;; with the new infos. - (while infos - (setcar (car entries) (pop infos)) - (pop entries)) - ;; Update the hashtable. - (gnus-make-hashtable-from-newsrc-alist))) - -(defun gnus-group-sort-selected-groups-by-alphabet (&optional n reverse) - "Sort the group buffer alphabetically by group name. -Obeys the process/prefix convention. If REVERSE (the symbolic prefix), -sort in reverse order." - (interactive (gnus-interactive "P\ny")) - (gnus-group-sort-selected-groups n 'gnus-group-sort-by-alphabet reverse)) - -(defun gnus-group-sort-selected-groups-by-unread (&optional n reverse) - "Sort the group buffer by number of unread articles. -Obeys the process/prefix convention. If REVERSE (the symbolic prefix), -sort in reverse order." - (interactive (gnus-interactive "P\ny")) - (gnus-group-sort-selected-groups n 'gnus-group-sort-by-unread reverse)) - -(defun gnus-group-sort-selected-groups-by-level (&optional n reverse) - "Sort the group buffer by group level. -Obeys the process/prefix convention. If REVERSE (the symbolic prefix), -sort in reverse order." - (interactive (gnus-interactive "P\ny")) - (gnus-group-sort-selected-groups n 'gnus-group-sort-by-level reverse)) - -(defun gnus-group-sort-selected-groups-by-score (&optional n reverse) - "Sort the group buffer by group score. -Obeys the process/prefix convention. If REVERSE (the symbolic prefix), -sort in reverse order." - (interactive (gnus-interactive "P\ny")) - (gnus-group-sort-selected-groups n 'gnus-group-sort-by-score reverse)) - -(defun gnus-group-sort-selected-groups-by-rank (&optional n reverse) - "Sort the group buffer by group rank. -Obeys the process/prefix convention. If REVERSE (the symbolic prefix), -sort in reverse order." - (interactive (gnus-interactive "P\ny")) - (gnus-group-sort-selected-groups n 'gnus-group-sort-by-rank reverse)) - -(defun gnus-group-sort-selected-groups-by-method (&optional n reverse) - "Sort the group buffer alphabetically by backend name. -Obeys the process/prefix convention. If REVERSE (the symbolic prefix), -sort in reverse order." - (interactive (gnus-interactive "P\ny")) - (gnus-group-sort-selected-groups n 'gnus-group-sort-by-method reverse)) - -;;; Sorting predicates. - -(defun gnus-group-sort-by-alphabet (info1 info2) - "Sort alphabetically." - (string< (gnus-info-group info1) (gnus-info-group info2))) - -(defun gnus-group-sort-by-real-name (info1 info2) - "Sort alphabetically on real (unprefixed) names." - (string< (gnus-group-real-name (gnus-info-group info1)) - (gnus-group-real-name (gnus-info-group info2)))) - -(defun gnus-group-sort-by-unread (info1 info2) - "Sort by number of unread articles." - (let ((n1 (car (gnus-gethash (gnus-info-group info1) gnus-newsrc-hashtb))) - (n2 (car (gnus-gethash (gnus-info-group info2) gnus-newsrc-hashtb)))) - (< (or (and (numberp n1) n1) 0) - (or (and (numberp n2) n2) 0)))) - -(defun gnus-group-sort-by-level (info1 info2) - "Sort by level." - (< (gnus-info-level info1) (gnus-info-level info2))) - -(defun gnus-group-sort-by-method (info1 info2) - "Sort alphabetically by backend name." - (string< (symbol-name (car (gnus-find-method-for-group - (gnus-info-group info1) info1))) - (symbol-name (car (gnus-find-method-for-group - (gnus-info-group info2) info2))))) - -(defun gnus-group-sort-by-server (info1 info2) - "Sort alphabetically by server name." - (string< (gnus-method-to-server-name - (gnus-find-method-for-group - (gnus-info-group info1) info1)) - (gnus-method-to-server-name - (gnus-find-method-for-group - (gnus-info-group info2) info2)))) - -(defun gnus-group-sort-by-score (info1 info2) - "Sort by group score." - (> (gnus-info-score info1) (gnus-info-score info2))) - -(defun gnus-group-sort-by-rank (info1 info2) - "Sort by level and score." - (let ((level1 (gnus-info-level info1)) - (level2 (gnus-info-level info2))) - (or (< level1 level2) - (and (= level1 level2) - (> (gnus-info-score info1) (gnus-info-score info2)))))) - -;;; Clearing data - -(defun gnus-group-clear-data (&optional arg) - "Clear all marks and read ranges from the current group." - (interactive "P") - (gnus-group-iterate arg - (lambda (group) - (let (info) - (gnus-info-clear-data (setq info (gnus-get-info group))) - (gnus-get-unread-articles-in-group info (gnus-active group) t) - (when (gnus-group-goto-group group) - (gnus-group-update-group-line)))))) - -(defun gnus-group-clear-data-on-native-groups () - "Clear all marks and read ranges from all native groups." - (interactive) - (when (gnus-yes-or-no-p "Really clear all data from almost all groups? ") - (let ((alist (cdr gnus-newsrc-alist)) - info) - (while (setq info (pop alist)) - (when (gnus-group-native-p (gnus-info-group info)) - (gnus-info-clear-data info))) - (gnus-get-unread-articles) - (gnus-dribble-touch) - (when (gnus-y-or-n-p - "Move the cache away to avoid problems in the future? ") - (call-interactively 'gnus-cache-move-cache))))) - -(defun gnus-info-clear-data (info) - "Clear all marks and read ranges from INFO." - (let ((group (gnus-info-group info)) - action) - (dolist (el (gnus-info-marks info)) - (push `(,(cdr el) add (,(car el))) action)) - (push `(,(gnus-info-read info) add (read)) action) - (gnus-undo-register - `(progn - (gnus-request-set-mark ,group ',action) - (gnus-info-set-marks ',info ',(gnus-info-marks info) t) - (gnus-info-set-read ',info ',(gnus-info-read info)) - (when (gnus-group-goto-group ,group) - (gnus-get-unread-articles-in-group ',info ',(gnus-active group) t) - (gnus-group-update-group-line)))) - (setq action (mapcar (lambda (el) (list (nth 0 el) 'del (nth 2 el))) - action)) - (gnus-request-set-mark group action) - (gnus-info-set-read info nil) - (when (gnus-info-marks info) - (gnus-info-set-marks info nil)))) - -;; Group catching up. - -(defun gnus-group-catchup-current (&optional n all) - "Mark all unread articles in the current newsgroup as read. -If prefix argument N is numeric, the next N newsgroups will be -caught up. If ALL is non-nil, marked articles will also be marked as -read. Cross references (Xref: header) of articles are ignored. -The number of newsgroups that this function was unable to catch -up is returned." - (interactive "P") - (let ((groups (gnus-group-process-prefix n)) - (ret 0) - group) - (unless groups (error "No groups selected")) - (if (not - (or (not gnus-interactive-catchup) ;Without confirmation? - gnus-expert-user - (gnus-y-or-n-p - (format - (if all - "Do you really want to mark all articles in %s as read? " - "Mark all unread articles in %s as read? ") - (if (= (length groups) 1) - (car groups) - (format "these %d groups" (length groups))))))) - n - (while (setq group (pop groups)) - (gnus-group-remove-mark group) - ;; Virtual groups have to be given special treatment. - (let ((method (gnus-find-method-for-group group))) - (when (eq 'nnvirtual (car method)) - (nnvirtual-catchup-group - (gnus-group-real-name group) (nth 1 method) all))) - (if (>= (gnus-group-level group) gnus-level-zombie) - (gnus-message 2 "Dead groups can't be caught up") - (if (prog1 - (gnus-group-goto-group group) - (gnus-group-catchup group all)) - (gnus-group-update-group-line) - (setq ret (1+ ret))))) - (gnus-group-next-unread-group 1) - ret))) - -(defun gnus-group-catchup-current-all (&optional n) - "Mark all articles in current newsgroup as read. -Cross references (Xref: header) of articles are ignored." - (interactive "P") - (gnus-group-catchup-current n 'all)) - -(defun gnus-group-catchup (group &optional all) - "Mark all articles in GROUP as read. -If ALL is non-nil, all articles are marked as read. -The return value is the number of articles that were marked as read, -or nil if no action could be taken." - (let* ((entry (gnus-gethash group gnus-newsrc-hashtb)) - (num (car entry))) - ;; Remove entries for this group. - (nnmail-purge-split-history (gnus-group-real-name group)) - ;; Do the updating only if the newsgroup isn't killed. - (if (not (numberp (car entry))) - (gnus-message 1 "Can't catch up %s; non-active group" group) - ;; Do auto-expirable marks if that's required. - (when (gnus-group-auto-expirable-p group) - (gnus-add-marked-articles - group 'expire (gnus-list-of-unread-articles group)) - (when all - (let ((marks (nth 3 (nth 2 entry)))) - (gnus-add-marked-articles - group 'expire (gnus-uncompress-range (cdr (assq 'tick marks)))) - (gnus-add-marked-articles - group 'expire (gnus-uncompress-range (cdr (assq 'tick marks))))))) - (when entry - (gnus-update-read-articles group nil) - ;; Also nix out the lists of marks and dormants. - (when all - (gnus-add-marked-articles group 'tick nil nil 'force) - (gnus-add-marked-articles group 'dormant nil nil 'force)) - (let ((gnus-newsgroup-name group)) - (gnus-run-hooks 'gnus-group-catchup-group-hook)) - num)))) - -(defun gnus-group-expire-articles (&optional n) - "Expire all expirable articles in the current newsgroup." - (interactive "P") - (let ((groups (gnus-group-process-prefix n)) - group) - (unless groups - (error "No groups to expire")) - (while (setq group (pop groups)) - (gnus-group-remove-mark group) - (gnus-group-expire-articles-1 group) - (gnus-dribble-touch) - (gnus-group-position-point)))) - -(defun gnus-group-expire-articles-1 (group) - (when (gnus-check-backend-function 'request-expire-articles group) - (gnus-message 6 "Expiring articles in %s..." group) - (let* ((info (gnus-get-info group)) - (expirable (if (gnus-group-total-expirable-p group) - (cons nil (gnus-list-of-read-articles group)) - (assq 'expire (gnus-info-marks info)))) - (expiry-wait (gnus-group-find-parameter group 'expiry-wait)) - (nnmail-expiry-target - (or (gnus-group-find-parameter group 'expiry-target) - nnmail-expiry-target))) - (when expirable - (gnus-check-group group) - (setcdr - expirable - (gnus-compress-sequence - (if expiry-wait - ;; We set the expiry variables to the group - ;; parameter. - (let ((nnmail-expiry-wait-function nil) - (nnmail-expiry-wait expiry-wait)) - (gnus-request-expire-articles - (gnus-uncompress-sequence (cdr expirable)) group)) - ;; Just expire using the normal expiry values. - (gnus-request-expire-articles - (gnus-uncompress-sequence (cdr expirable)) group)))) - (gnus-close-group group)) - (gnus-message 6 "Expiring articles in %s...done" group) - ;; Return the list of un-expired articles. - (cdr expirable)))) - -(defun gnus-group-expire-all-groups () - "Expire all expirable articles in all newsgroups." - (interactive) - (save-excursion - (gnus-message 5 "Expiring...") - (let ((gnus-group-marked (mapcar (lambda (info) (gnus-info-group info)) - (cdr gnus-newsrc-alist)))) - (gnus-group-expire-articles nil))) - (gnus-group-position-point) - (gnus-message 5 "Expiring...done")) - -(defun gnus-group-set-current-level (n level) - "Set the level of the next N groups to LEVEL." - (interactive - (list - current-prefix-arg - (string-to-int - (let ((s (read-string - (format "Level (default %s): " - (or (gnus-group-group-level) - gnus-level-default-subscribed))))) - (if (string-match "^\\s-*$" s) - (int-to-string (or (gnus-group-group-level) - gnus-level-default-subscribed)) - s))))) - (unless (and (>= level 1) (<= level gnus-level-killed)) - (error "Invalid level: %d" level)) - (let ((groups (gnus-group-process-prefix n)) - group) - (while (setq group (pop groups)) - (gnus-group-remove-mark group) - (gnus-message 6 "Changed level of %s from %d to %d" - group (or (gnus-group-group-level) gnus-level-killed) - level) - (gnus-group-change-level - group level (or (gnus-group-group-level) gnus-level-killed)) - (gnus-group-update-group-line))) - (gnus-group-position-point)) - -(defun gnus-group-unsubscribe (&optional n) - "Unsubscribe the current group." - (interactive "P") - (gnus-group-unsubscribe-current-group n 'unsubscribe)) - -(defun gnus-group-subscribe (&optional n) - "Subscribe the current group." - (interactive "P") - (gnus-group-unsubscribe-current-group n 'subscribe)) - -(defun gnus-group-unsubscribe-current-group (&optional n do-sub) - "Toggle subscription of the current group. -If given numerical prefix, toggle the N next groups." - (interactive "P") - (let ((groups (gnus-group-process-prefix n)) - group) - (while groups - (setq group (car groups) - groups (cdr groups)) - (gnus-group-remove-mark group) - (gnus-group-unsubscribe-group - group - (cond - ((eq do-sub 'unsubscribe) - gnus-level-default-unsubscribed) - ((eq do-sub 'subscribe) - gnus-level-default-subscribed) - ((<= (gnus-group-group-level) gnus-level-subscribed) - gnus-level-default-unsubscribed) - (t - gnus-level-default-subscribed)) - t) - (gnus-group-update-group-line)) - (gnus-group-next-group 1))) - -(defun gnus-group-unsubscribe-group (group &optional level silent) - "Toggle subscription to GROUP. -Killed newsgroups are subscribed. If SILENT, don't try to update the -group line." - (interactive - (list (completing-read - "Group: " gnus-active-hashtb nil - (gnus-read-active-file-p) - nil - 'gnus-group-history))) - (let ((newsrc (gnus-gethash group gnus-newsrc-hashtb))) - (cond - ((string-match "^[ \t]*$" group) - (error "Empty group name")) - (newsrc - ;; Toggle subscription flag. - (gnus-group-change-level - newsrc (if level level (if (<= (gnus-info-level (nth 2 newsrc)) - gnus-level-subscribed) - (1+ gnus-level-subscribed) - gnus-level-default-subscribed))) - (unless silent - (gnus-group-update-group group))) - ((and (stringp group) - (or (not (gnus-read-active-file-p)) - (gnus-active group))) - ;; Add new newsgroup. - (gnus-group-change-level - group - (if level level gnus-level-default-subscribed) - (or (and (member group gnus-zombie-list) - gnus-level-zombie) - gnus-level-killed) - (when (gnus-group-group-name) - (gnus-gethash (gnus-group-group-name) gnus-newsrc-hashtb))) - (unless silent - (gnus-group-update-group group))) - (t (error "No such newsgroup: %s" group))) - (gnus-group-position-point))) - -(defun gnus-group-transpose-groups (n) - "Move the current newsgroup up N places. -If given a negative prefix, move down instead. The difference between -N and the number of steps taken is returned." - (interactive "p") - (unless (gnus-group-group-name) - (error "No group on current line")) - (gnus-group-kill-group 1) - (prog1 - (forward-line (- n)) - (gnus-group-yank-group) - (gnus-group-position-point))) - -(defun gnus-group-kill-all-zombies (&optional dummy) - "Kill all zombie newsgroups. -The optional DUMMY should always be nil." - (interactive (list (not (gnus-yes-or-no-p "Really kill all zombies? ")))) - (unless dummy - (setq gnus-killed-list (nconc gnus-zombie-list gnus-killed-list)) - (setq gnus-zombie-list nil) - (gnus-dribble-touch) - (gnus-group-list-groups))) - -(defun gnus-group-kill-region (begin end) - "Kill newsgroups in current region (excluding current point). -The killed newsgroups can be yanked by using \\[gnus-group-yank-group]." - (interactive "r") - (let ((lines - ;; Count lines. - (save-excursion - (count-lines - (progn - (goto-char begin) - (beginning-of-line) - (point)) - (progn - (goto-char end) - (beginning-of-line) - (point)))))) - (goto-char begin) - (beginning-of-line) ;Important when LINES < 1 - (gnus-group-kill-group lines))) - -(defun gnus-group-kill-group (&optional n discard) - "Kill the next N groups. -The killed newsgroups can be yanked by using \\[gnus-group-yank-group]. -However, only groups that were alive can be yanked; already killed -groups or zombie groups can't be yanked. -The return value is the name of the group that was killed, or a list -of groups killed." - (interactive "P") - (let ((buffer-read-only nil) - (groups (gnus-group-process-prefix n)) - group entry level out) - (if (< (length groups) 10) - ;; This is faster when there are few groups. - (while groups - (push (setq group (pop groups)) out) - (gnus-group-remove-mark group) - (setq level (gnus-group-group-level)) - (gnus-delete-line) - (when (and (not discard) - (setq entry (gnus-gethash group gnus-newsrc-hashtb))) - (gnus-undo-register - `(progn - (gnus-group-goto-group ,(gnus-group-group-name)) - (gnus-group-yank-group))) - (push (cons (car entry) (nth 2 entry)) - gnus-list-of-killed-groups)) - (gnus-group-change-level - (if entry entry group) gnus-level-killed (if entry nil level)) - (message "Killed group %s" group)) - ;; If there are lots and lots of groups to be killed, we use - ;; this thing instead. - (let (entry) - (setq groups (nreverse groups)) - (while groups - (gnus-group-remove-mark (setq group (pop groups))) - (gnus-delete-line) - (push group gnus-killed-list) - (setq gnus-newsrc-alist - (delq (assoc group gnus-newsrc-alist) - gnus-newsrc-alist)) - (when gnus-group-change-level-function - (funcall gnus-group-change-level-function - group gnus-level-killed 3)) - (cond - ((setq entry (gnus-gethash group gnus-newsrc-hashtb)) - (push (cons (car entry) (nth 2 entry)) - gnus-list-of-killed-groups) - (setcdr (cdr entry) (cdddr entry))) - ((member group gnus-zombie-list) - (setq gnus-zombie-list (delete group gnus-zombie-list)))) - ;; There may be more than one instance displayed. - (while (gnus-group-goto-group group) - (gnus-delete-line))) - (gnus-make-hashtable-from-newsrc-alist))) - - (gnus-group-position-point) - (if (< (length out) 2) (car out) (nreverse out)))) - -(defun gnus-group-yank-group (&optional arg) - "Yank the last newsgroups killed with \\[gnus-group-kill-group], inserting it before the current newsgroup. -The numeric ARG specifies how many newsgroups are to be yanked. The -name of the newsgroup yanked is returned, or (if several groups are -yanked) a list of yanked groups is returned." - (interactive "p") - (setq arg (or arg 1)) - (let (info group prev out) - (while (>= (decf arg) 0) - (when (not (setq info (pop gnus-list-of-killed-groups))) - (error "No more newsgroups to yank")) - (push (setq group (nth 1 info)) out) - ;; Find which newsgroup to insert this one before - search - ;; backward until something suitable is found. If there are no - ;; other newsgroups in this buffer, just make this newsgroup the - ;; first newsgroup. - (setq prev (gnus-group-group-name)) - (gnus-group-change-level - info (gnus-info-level (cdr info)) gnus-level-killed - (and prev (gnus-gethash prev gnus-newsrc-hashtb)) - t) - (gnus-group-insert-group-line-info group) - (gnus-undo-register - `(when (gnus-group-goto-group ,group) - (gnus-group-kill-group 1)))) - (forward-line -1) - (gnus-group-position-point) - (if (< (length out) 2) (car out) (nreverse out)))) - -(defun gnus-group-kill-level (level) - "Kill all groups that is on a certain LEVEL." - (interactive "nKill all groups on level: ") - (cond - ((= level gnus-level-zombie) - (setq gnus-killed-list - (nconc gnus-zombie-list gnus-killed-list)) - (setq gnus-zombie-list nil)) - ((and (< level gnus-level-zombie) - (> level 0) - (or gnus-expert-user - (gnus-yes-or-no-p - (format - "Do you really want to kill all groups on level %d? " - level)))) - (let* ((prev gnus-newsrc-alist) - (alist (cdr prev))) - (while alist - (if (= (gnus-info-level (car alist)) level) - (progn - (push (gnus-info-group (car alist)) gnus-killed-list) - (setcdr prev (cdr alist))) - (setq prev alist)) - (setq alist (cdr alist))) - (gnus-make-hashtable-from-newsrc-alist) - (gnus-group-list-groups))) - (t - (error "Can't kill; invalid level: %d" level)))) - -(defun gnus-group-list-all-groups (&optional arg) - "List all newsgroups with level ARG or lower. -Default is gnus-level-unsubscribed, which lists all subscribed and most -unsubscribed groups." - (interactive "P") - (gnus-group-list-groups (or arg gnus-level-unsubscribed) t)) - -;; Redefine this to list ALL killed groups if prefix arg used. -;; Rewritten by engstrom@src.honeywell.com (Eric Engstrom). -(defun gnus-group-list-killed (&optional arg) - "List all killed newsgroups in the group buffer. -If ARG is non-nil, list ALL killed groups known to Gnus. This may -entail asking the server for the groups." - (interactive "P") - ;; Find all possible killed newsgroups if arg. - (when arg - (gnus-get-killed-groups)) - (if (not gnus-killed-list) - (gnus-message 6 "No killed groups") - (let (gnus-group-list-mode) - (funcall gnus-group-prepare-function - gnus-level-killed t gnus-level-killed)) - (goto-char (point-min))) - (gnus-group-position-point)) - -(defun gnus-group-list-zombies () - "List all zombie newsgroups in the group buffer." - (interactive) - (if (not gnus-zombie-list) - (gnus-message 6 "No zombie groups") - (let (gnus-group-list-mode) - (funcall gnus-group-prepare-function - gnus-level-zombie t gnus-level-zombie)) - (goto-char (point-min))) - (gnus-group-position-point)) - -(defun gnus-group-list-active () - "List all groups that are available from the server(s)." - (interactive) - ;; First we make sure that we have really read the active file. - (unless (gnus-read-active-file-p) - (let ((gnus-read-active-file t) - (gnus-agent nil)) ; Trick the agent into ignoring the active file. - (gnus-read-active-file))) - ;; Find all groups and sort them. - (let ((groups - (sort - (let (list) - (mapatoms - (lambda (sym) - (and (boundp sym) - (symbol-value sym) - (push (symbol-name sym) list))) - gnus-active-hashtb) - list) - 'string<)) - (buffer-read-only nil) - group) - (erase-buffer) - (while groups - (setq group (pop groups)) - (gnus-add-text-properties - (point) (prog1 (1+ (point)) - (insert " *: " - (gnus-group-decoded-name group) - "\n")) - (list 'gnus-group (gnus-intern-safe group gnus-active-hashtb) - 'gnus-unread t - 'gnus-level (inline (gnus-group-level group))))) - (goto-char (point-min)))) - -(defun gnus-activate-all-groups (level) - "Activate absolutely all groups." - (interactive (list gnus-level-unsubscribed)) - (let ((gnus-activate-level level) - (gnus-activate-foreign-newsgroups level)) - (gnus-group-get-new-news))) - -(defun gnus-group-get-new-news (&optional arg) - "Get newly arrived articles. -If ARG is a number, it specifies which levels you are interested in -re-scanning. If ARG is non-nil and not a number, this will force -\"hard\" re-reading of the active files from all servers." - (interactive "P") - (require 'nnmail) - (let ((gnus-inhibit-demon t) - ;; Binding this variable will inhibit multiple fetchings - ;; of the same mail source. - (nnmail-fetched-sources (list t))) - (gnus-run-hooks 'gnus-get-new-news-hook) - - ;; Read any slave files. - (unless gnus-slave - (gnus-master-read-slave-newsrc)) - - ;; We might read in new NoCeM messages here. - (when (and gnus-use-nocem - (null arg)) - (gnus-nocem-scan-groups)) - ;; If ARG is not a number, then we read the active file. - (when (and arg (not (numberp arg))) - (let ((gnus-read-active-file t)) - (gnus-read-active-file)) - (setq arg nil) - - ;; If the user wants it, we scan for new groups. - (when (eq gnus-check-new-newsgroups 'always) - (gnus-find-new-newsgroups))) - - (setq arg (gnus-group-default-level arg t)) - (if (and gnus-read-active-file (not arg)) - (progn - (gnus-read-active-file) - (gnus-get-unread-articles arg)) - (let ((gnus-read-active-file (if arg nil gnus-read-active-file))) - (gnus-get-unread-articles arg))) - (gnus-run-hooks 'gnus-after-getting-new-news-hook) - (gnus-group-list-groups (and (numberp arg) - (max (car gnus-group-list-mode) arg)))) - ;; Update modeline. - (when (and gnus-agent (not (interactive-p))) - (gnus-agent-toggle-plugged gnus-plugged))) - -(defun gnus-group-get-new-news-this-group (&optional n dont-scan) - "Check for newly arrived news in the current group (and the N-1 next groups). -The difference between N and the number of newsgroup checked is returned. -If N is negative, this group and the N-1 previous groups will be checked." - (interactive "P") - (let* ((groups (gnus-group-process-prefix n)) - (ret (if (numberp n) (- n (length groups)) 0)) - (beg (unless n - (point))) - group method - (gnus-inhibit-demon t) - ;; Binding this variable will inhibit multiple fetchings - ;; of the same mail source. - (nnmail-fetched-sources (list t))) - (gnus-run-hooks 'gnus-get-new-news-hook) - (while (setq group (pop groups)) - (gnus-group-remove-mark group) - ;; Bypass any previous denials from the server. - (gnus-remove-denial (setq method (gnus-find-method-for-group group))) - (if (gnus-activate-group group (if dont-scan nil 'scan)) - (progn - (gnus-get-unread-articles-in-group - (gnus-get-info group) (gnus-active group) t) - (unless (gnus-virtual-group-p group) - (gnus-close-group group)) - (when gnus-agent - (gnus-agent-save-group-info - method (gnus-group-real-name group) (gnus-active group))) - (gnus-group-update-group group)) - (if (eq (gnus-server-status (gnus-find-method-for-group group)) - 'denied) - (gnus-error 3 "Server denied access") - (gnus-error 3 "%s error: %s" group (gnus-status-message group))))) - (when beg - (goto-char beg)) - (when gnus-goto-next-group-when-activating - (gnus-group-next-unread-group 1 t)) - (gnus-summary-position-point) - ret)) - -(defun gnus-group-fetch-faq (group &optional faq-dir) - "Fetch the FAQ for the current group. -If given a prefix argument, prompt for the FAQ dir -to use." - (interactive - (list - (gnus-group-group-name) - (when current-prefix-arg - (completing-read - "Faq dir: " (and (listp gnus-group-faq-directory) - (mapcar #'list - gnus-group-faq-directory)))))) - (unless group - (error "No group name given")) - (let ((dirs (or faq-dir gnus-group-faq-directory)) - dir found file) - (unless (listp dirs) - (setq dirs (list dirs))) - (while (and (not found) - (setq dir (pop dirs))) - (let ((name (gnus-group-real-name group))) - (setq file (expand-file-name name dir))) - (if (not (file-exists-p file)) - (gnus-message 1 "No such file: %s" file) - (let ((enable-local-variables nil)) - (find-file file) - (setq found t)))))) - -(defun gnus-group-describe-group (force &optional group) - "Display a description of the current newsgroup." - (interactive (list current-prefix-arg (gnus-group-group-name))) - (let* ((method (gnus-find-method-for-group group)) - (mname (gnus-group-prefixed-name "" method)) - desc) - (when (and force - gnus-description-hashtb) - (gnus-sethash mname nil gnus-description-hashtb)) - (unless group - (error "No group name given")) - (when (or (and gnus-description-hashtb - ;; We check whether this group's method has been - ;; queried for a description file. - (gnus-gethash mname gnus-description-hashtb)) - (setq desc (gnus-group-get-description group)) - (gnus-read-descriptions-file method)) - (gnus-message 1 - (or desc (gnus-gethash group gnus-description-hashtb) - "No description available"))))) - -;; Suggested by Per Abrahamsen . -(defun gnus-group-describe-all-groups (&optional force) - "Pop up a buffer with descriptions of all newsgroups." - (interactive "P") - (when force - (setq gnus-description-hashtb nil)) - (when (not (or gnus-description-hashtb - (gnus-read-all-descriptions-files))) - (error "Couldn't request descriptions file")) - (let ((buffer-read-only nil) - b) - (erase-buffer) - (mapatoms - (lambda (group) - (setq b (point)) - (let ((charset (gnus-group-name-charset nil (symbol-name group)))) - (insert (format " *: %-20s %s\n" - (gnus-group-name-decode - (symbol-name group) charset) - (gnus-group-name-decode - (symbol-value group) charset)))) - (gnus-add-text-properties - b (1+ b) (list 'gnus-group group - 'gnus-unread t 'gnus-marked nil - 'gnus-level (1+ gnus-level-subscribed)))) - gnus-description-hashtb) - (goto-char (point-min)) - (gnus-group-position-point))) - -;; Suggested by Daniel Quinlan . -(defun gnus-group-apropos (regexp &optional search-description) - "List all newsgroups that have names that match a regexp." - (interactive "sGnus apropos (regexp): ") - (let ((prev "") - (obuf (current-buffer)) - groups des) - ;; Go through all newsgroups that are known to Gnus. - (mapatoms - (lambda (group) - (and (symbol-name group) - (string-match regexp (symbol-name group)) - (symbol-value group) - (push (symbol-name group) groups))) - gnus-active-hashtb) - ;; Also go through all descriptions that are known to Gnus. - (when search-description - (mapatoms - (lambda (group) - (and (string-match regexp (symbol-value group)) - (push (symbol-name group) groups))) - gnus-description-hashtb)) - (if (not groups) - (gnus-message 3 "No groups matched \"%s\"." regexp) - ;; Print out all the groups. - (save-excursion - (pop-to-buffer "*Gnus Help*") - (buffer-disable-undo) - (erase-buffer) - (setq groups (sort groups 'string<)) - (while groups - ;; Groups may be entered twice into the list of groups. - (when (not (string= (car groups) prev)) - (setq prev (car groups)) - (let ((charset (gnus-group-name-charset nil prev))) - (insert (gnus-group-name-decode prev charset) "\n") - (when (and gnus-description-hashtb - (setq des (gnus-gethash (car groups) - gnus-description-hashtb))) - (insert " " (gnus-group-name-decode des charset) "\n")))) - (setq groups (cdr groups))) - (goto-char (point-min)))) - (pop-to-buffer obuf))) - -(defun gnus-group-description-apropos (regexp) - "List all newsgroups that have names or descriptions that match a regexp." - (interactive "sGnus description apropos (regexp): ") - (when (not (or gnus-description-hashtb - (gnus-read-all-descriptions-files))) - (error "Couldn't request descriptions file")) - (gnus-group-apropos regexp t)) - -;; Suggested by Per Abrahamsen . -(defun gnus-group-list-matching (level regexp &optional all lowest) - "List all groups with unread articles that match REGEXP. -If the prefix LEVEL is non-nil, it should be a number that says which -level to cut off listing groups. -If ALL, also list groups with no unread articles. -If LOWEST, don't list groups with level lower than LOWEST. - -This command may read the active file." - (interactive "P\nsList newsgroups matching: ") - ;; First make sure active file has been read. - (when (and level - (> (prefix-numeric-value level) gnus-level-killed)) - (gnus-get-killed-groups)) - (funcall gnus-group-prepare-function - (or level gnus-level-subscribed) (and all t) (or lowest 1) regexp) - (goto-char (point-min)) - (gnus-group-position-point)) - -(defun gnus-group-list-all-matching (level regexp &optional lowest) - "List all groups that match REGEXP. -If the prefix LEVEL is non-nil, it should be a number that says which -level to cut off listing groups. -If LOWEST, don't list groups with level lower than LOWEST." - (interactive "P\nsList newsgroups matching: ") - (when level - (setq level (prefix-numeric-value level))) - (gnus-group-list-matching (or level gnus-level-killed) regexp t lowest)) - -;; Suggested by Jack Vinson . -(defun gnus-group-save-newsrc (&optional force) - "Save the Gnus startup files. -If FORCE, force saving whether it is necessary or not." - (interactive "P") - (gnus-save-newsrc-file force)) - -(defun gnus-group-restart (&optional arg) - "Force Gnus to read the .newsrc file." - (interactive "P") - (when (gnus-yes-or-no-p - (format "Are you sure you want to restart Gnus? ")) - (gnus-save-newsrc-file) - (gnus-clear-system) - (gnus))) - -(defun gnus-group-read-init-file () - "Read the Gnus elisp init file." - (interactive) - (gnus-read-init-file) - (gnus-message 5 "Read %s" gnus-init-file)) - -(defun gnus-group-check-bogus-groups (&optional silent) - "Check bogus newsgroups. -If given a prefix, don't ask for confirmation before removing a bogus -group." - (interactive "P") - (gnus-check-bogus-newsgroups (and (not silent) (not gnus-expert-user))) - (gnus-group-list-groups)) - -(defun gnus-group-find-new-groups (&optional arg) - "Search for new groups and add them. -Each new group will be treated with `gnus-subscribe-newsgroup-method.' -With 1 C-u, use the `ask-server' method to query the server for new -groups. -With 2 C-u's, use most complete method possible to query the server -for new groups, and subscribe the new groups as zombies." - (interactive "p") - (gnus-find-new-newsgroups (or arg 1)) - (gnus-group-list-groups)) - -(defun gnus-group-edit-global-kill (&optional article group) - "Edit the global kill file. -If GROUP, edit that local kill file instead." - (interactive "P") - (setq gnus-current-kill-article article) - (gnus-kill-file-edit-file group) - (gnus-message - 6 - (substitute-command-keys - (format "Editing a %s kill file (Type \\[gnus-kill-file-exit] to exit)" - (if group "local" "global"))))) - -(defun gnus-group-edit-local-kill (article group) - "Edit a local kill file." - (interactive (list nil (gnus-group-group-name))) - (gnus-group-edit-global-kill article group)) - -(defun gnus-group-force-update () - "Update `.newsrc' file." - (interactive) - (gnus-save-newsrc-file)) - -(defun gnus-group-suspend () - "Suspend the current Gnus session. -In fact, cleanup buffers except for group mode buffer. -The hook gnus-suspend-gnus-hook is called before actually suspending." - (interactive) - (gnus-run-hooks 'gnus-suspend-gnus-hook) - (gnus-offer-save-summaries) - ;; Kill Gnus buffers except for group mode buffer. - (let ((group-buf (get-buffer gnus-group-buffer))) - (mapcar (lambda (buf) - (unless (member buf (list group-buf gnus-dribble-buffer)) - (gnus-kill-buffer buf))) - (gnus-buffers)) - (gnus-kill-gnus-frames) - (when group-buf - (bury-buffer group-buf) - (delete-windows-on group-buf t)))) - -(defun gnus-group-clear-dribble () - "Clear all information from the dribble buffer." - (interactive) - (gnus-dribble-clear) - (gnus-message 7 "Cleared dribble buffer")) - -(defun gnus-group-exit () - "Quit reading news after updating .newsrc.eld and .newsrc. -The hook `gnus-exit-gnus-hook' is called before actually exiting." - (interactive) - (when - (or noninteractive ;For gnus-batch-kill - (not gnus-interactive-exit) ;Without confirmation - gnus-expert-user - (gnus-y-or-n-p "Are you sure you want to quit reading news? ")) - (gnus-run-hooks 'gnus-exit-gnus-hook) - ;; Offer to save data from non-quitted summary buffers. - (gnus-offer-save-summaries) - ;; Save the newsrc file(s). - (gnus-save-newsrc-file) - ;; Kill-em-all. - (gnus-close-backends) - ;; Reset everything. - (gnus-clear-system) - ;; Allow the user to do things after cleaning up. - (gnus-run-hooks 'gnus-after-exiting-gnus-hook))) - -(defun gnus-group-quit () - "Quit reading news without updating .newsrc.eld or .newsrc. -The hook `gnus-exit-gnus-hook' is called before actually exiting." - (interactive) - (when (or noninteractive ;For gnus-batch-kill - (zerop (buffer-size)) - (not (gnus-server-opened gnus-select-method)) - gnus-expert-user - (not gnus-current-startup-file) - (gnus-yes-or-no-p - (format "Quit reading news without saving %s? " - (file-name-nondirectory gnus-current-startup-file)))) - (gnus-run-hooks 'gnus-exit-gnus-hook) - (gnus-configure-windows 'group t) - (when (and (gnus-buffer-live-p gnus-dribble-buffer) - (not (zerop (save-excursion - (set-buffer gnus-dribble-buffer) - (buffer-size))))) - (gnus-dribble-enter - ";;; Gnus was exited on purpose without saving the .newsrc files.")) - (gnus-dribble-save) - (gnus-close-backends) - (gnus-clear-system) - (gnus-kill-buffer gnus-group-buffer) - ;; Allow the user to do things after cleaning up. - (gnus-run-hooks 'gnus-after-exiting-gnus-hook))) - -(defun gnus-group-describe-briefly () - "Give a one line description of the group mode commands." - (interactive) - (gnus-message 7 (substitute-command-keys "\\\\[gnus-group-read-group]:Select \\[gnus-group-next-unread-group]:Forward \\[gnus-group-prev-unread-group]:Backward \\[gnus-group-exit]:Exit \\[gnus-info-find-node]:Run Info \\[gnus-group-describe-briefly]:This help"))) - -(defun gnus-group-browse-foreign-server (method) - "Browse a foreign news server. -If called interactively, this function will ask for a select method - (nntp, nnspool, etc.) and a server address (eg. nntp.some.where). -If not, METHOD should be a list where the first element is the method -and the second element is the address." - (interactive - (list (let ((how (completing-read - "Which backend: " - (append gnus-valid-select-methods gnus-server-alist) - nil t (cons "nntp" 0) 'gnus-method-history))) - ;; We either got a backend name or a virtual server name. - ;; If the first, we also need an address. - (if (assoc how gnus-valid-select-methods) - (list (intern how) - ;; Suggested by mapjph@bath.ac.uk. - (completing-read - "Address: " - (mapcar (lambda (server) (list server)) - gnus-secondary-servers))) - ;; We got a server name. - how)))) - (gnus-browse-foreign-server method)) - -(defun gnus-group-set-info (info &optional method-only-group part) - (when (or info part) - (let* ((entry (gnus-gethash - (or method-only-group (gnus-info-group info)) - gnus-newsrc-hashtb)) - (part-info info) - (info (if method-only-group (nth 2 entry) info)) - method) - (when method-only-group - (unless entry - (error "Trying to change non-existent group %s" method-only-group)) - ;; We have received parts of the actual group info - either the - ;; select method or the group parameters. We first check - ;; whether we have to extend the info, and if so, do that. - (let ((len (length info)) - (total (if (eq part 'method) 5 6))) - (when (< len total) - (setcdr (nthcdr (1- len) info) - (make-list (- total len) nil))) - ;; Then we enter the new info. - (setcar (nthcdr (1- total) info) part-info))) - (unless entry - ;; This is a new group, so we just create it. - (save-excursion - (set-buffer gnus-group-buffer) - (setq method (gnus-info-method info)) - (when (gnus-server-equal method "native") - (setq method nil)) - (save-excursion - (set-buffer gnus-group-buffer) - (if method - ;; It's a foreign group... - (gnus-group-make-group - (gnus-group-real-name (gnus-info-group info)) - (if (stringp method) method - (prin1-to-string (car method))) - (and (consp method) - (nth 1 (gnus-info-method info)))) - ;; It's a native group. - (gnus-group-make-group (gnus-info-group info)))) - (gnus-message 6 "Note: New group created") - (setq entry - (gnus-gethash (gnus-group-prefixed-name - (gnus-group-real-name (gnus-info-group info)) - (or (gnus-info-method info) gnus-select-method)) - gnus-newsrc-hashtb)))) - ;; Whether it was a new group or not, we now have the entry, so we - ;; can do the update. - (if entry - (progn - (setcar (nthcdr 2 entry) info) - (when (and (not (eq (car entry) t)) - (gnus-active (gnus-info-group info))) - (setcar entry (length - (gnus-list-of-unread-articles (car info)))))) - (error "No such group: %s" (gnus-info-group info)))))) - -(defun gnus-group-set-method-info (group select-method) - (gnus-group-set-info select-method group 'method)) - -(defun gnus-group-set-params-info (group params) - (gnus-group-set-info params group 'params)) - -(defun gnus-add-marked-articles (group type articles &optional info force) - ;; Add ARTICLES of TYPE to the info of GROUP. - ;; If INFO is non-nil, use that info. If FORCE is non-nil, don't - ;; add, but replace marked articles of TYPE with ARTICLES. - (let ((info (or info (gnus-get-info group))) - marked m) - (or (not info) - (and (not (setq marked (nthcdr 3 info))) - (or (null articles) - (setcdr (nthcdr 2 info) - (list (list (cons type (gnus-compress-sequence - articles t))))))) - (and (not (setq m (assq type (car marked)))) - (or (null articles) - (setcar marked - (cons (cons type (gnus-compress-sequence articles t) ) - (car marked))))) - (if force - (if (null articles) - (setcar (nthcdr 3 info) - (gnus-delete-alist type (car marked))) - (setcdr m (gnus-compress-sequence articles t))) - (setcdr m (gnus-compress-sequence - (sort (nconc (gnus-uncompress-range (cdr m)) - (copy-sequence articles)) '<) t)))))) - -(defun gnus-add-mark (group mark article) - "Mark ARTICLE in GROUP with MARK, whether the group is displayed or not." - (let ((buffer (gnus-summary-buffer-name group))) - (if (gnus-buffer-live-p buffer) - (save-excursion - (set-buffer (get-buffer buffer)) - (gnus-summary-add-mark article mark)) - (gnus-add-marked-articles group (cdr (assq mark gnus-article-mark-lists)) - (list article))))) - -;;; -;;; Group timestamps -;;; - -(defun gnus-group-set-timestamp () - "Change the timestamp of the current group to the current time. -This function can be used in hooks like `gnus-select-group-hook' -or `gnus-group-catchup-group-hook'." - (when gnus-newsgroup-name - (let ((time (current-time))) - (setcdr (cdr time) nil) - (gnus-group-set-parameter gnus-newsgroup-name 'timestamp time)))) - -(defsubst gnus-group-timestamp (group) - "Return the timestamp for GROUP." - (gnus-group-get-parameter group 'timestamp t)) - -(defun gnus-group-timestamp-delta (group) - "Return the offset in seconds from the timestamp for GROUP to the current time, as a floating point number." - (let* ((time (or (gnus-group-timestamp group) - (list 0 0))) - (delta (subtract-time (current-time) time))) - (+ (* (nth 0 delta) 65536.0) - (nth 1 delta)))) - -(defun gnus-group-timestamp-string (group) - "Return a string of the timestamp for GROUP." - (let ((time (gnus-group-timestamp group))) - (if (not time) - "" - (gnus-time-iso8601 time)))) - -(defun gnus-group-list-cached (level &optional lowest) - "List all groups with cached articles. -If the prefix LEVEL is non-nil, it should be a number that says which -level to cut off listing groups. -If LOWEST, don't list groups with level lower than LOWEST. - -This command may read the active file." - (interactive "P") - (when level - (setq level (prefix-numeric-value level))) - (when (or (not level) (>= level gnus-level-zombie)) - (gnus-cache-open)) - (funcall gnus-group-prepare-function - (or level gnus-level-subscribed) - #'(lambda (info) - (let ((marks (gnus-info-marks info))) - (assq 'cache marks))) - lowest - #'(lambda (group) - (or (gnus-gethash group - gnus-cache-active-hashtb) - ;; Cache active file might use "." - ;; instead of ":". - (gnus-gethash - (mapconcat 'identity - (split-string group ":") - ".") - gnus-cache-active-hashtb)))) - (goto-char (point-min)) - (gnus-group-position-point)) - -(defun gnus-group-list-dormant (level &optional lowest) - "List all groups with dormant articles. -If the prefix LEVEL is non-nil, it should be a number that says which -level to cut off listing groups. -If LOWEST, don't list groups with level lower than LOWEST. - -This command may read the active file." - (interactive "P") - (when level - (setq level (prefix-numeric-value level))) - (when (or (not level) (>= level gnus-level-zombie)) - (gnus-cache-open)) - (funcall gnus-group-prepare-function - (or level gnus-level-subscribed) - #'(lambda (info) - (let ((marks (gnus-info-marks info))) - (assq 'dormant marks))) - lowest - 'ignore) - (goto-char (point-min)) - (gnus-group-position-point)) - -(defun gnus-group-listed-groups () - "Return a list of listed groups." - (let (point groups) - (goto-char (point-min)) - (while (setq point (text-property-not-all (point) (point-max) - 'gnus-group nil)) - (goto-char point) - (push (symbol-name (get-text-property point 'gnus-group)) groups) - (forward-char 1)) - groups)) - -(defun gnus-group-list-plus (&optional args) - "List groups plus the current selection." - (interactive "P") - (let ((gnus-group-listed-groups (gnus-group-listed-groups)) - (gnus-group-list-mode gnus-group-list-mode) ;; Save it. - func) - (push last-command-event unread-command-events) - (if (featurep 'xemacs) - (push (make-event 'key-press '(key ?A)) unread-command-events) - (push ?A unread-command-events)) - (let (gnus-pick-mode keys) - (setq keys (if (featurep 'xemacs) - (events-to-keys (read-key-sequence nil)) - (read-key-sequence nil))) - (setq func (lookup-key (current-local-map) keys))) - (if (or (not func) - (numberp func)) - (ding) - (call-interactively func)))) - -(defun gnus-group-list-flush (&optional args) - "Flush groups from the current selection." - (interactive "P") - (let ((gnus-group-list-option 'flush)) - (gnus-group-list-plus args))) - -(defun gnus-group-list-limit (&optional args) - "List groups limited within the current selection." - (interactive "P") - (let ((gnus-group-list-option 'limit)) - (gnus-group-list-plus args))) - -(defun gnus-group-mark-article-read (group article) - "Mark ARTICLE read." - (gnus-activate-group group) - (let ((buffer (gnus-summary-buffer-name group)) - (mark gnus-read-mark)) - (unless - (and - (get-buffer buffer) - (with-current-buffer buffer - (when gnus-newsgroup-prepared - (when (and gnus-newsgroup-auto-expire - (memq mark gnus-auto-expirable-marks)) - (setq mark gnus-expirable-mark)) - (setq mark (gnus-request-update-mark - group article mark)) - (gnus-mark-article-as-read article mark) - (setq gnus-newsgroup-active (gnus-active group)) - t))) - (gnus-group-make-articles-read group - (list article)) - (when (gnus-group-auto-expirable-p group) - (gnus-add-marked-articles - group 'expire (list article)))))) - -(provide 'gnus-group) - -;;; gnus-group.el ends here diff --git a/lisp/gnus-i18n.el b/lisp/gnus-i18n.el deleted file mode 100644 index c71b1e2..0000000 --- a/lisp/gnus-i18n.el +++ /dev/null @@ -1,95 +0,0 @@ -;;; gnus-i18n.el --- Internationalization for Gnus - -;; Copyright (C) 1996,1997 Free Software Foundation, Inc. - -;; Author: MORIOKA Tomohiko -;; Created: 1997/11/27 -;; Keywords: internationalization, news, mail - -;; This file is not part of GNU Emacs yet. - -;; This program 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 program 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. - -;;; Code: - -;;; @ newsgroup default charset -;;; - -(defvar gnus-newsgroup-default-charset-alist - '(("\\(^\\|:\\)\\(fj\\|tnn\\|japan\\)\\." . iso-2022-jp-2) - ("\\(^\\|:\\)han\\." . euc-kr) - ("\\(^\\|:\\)relcom\\." . koi8-r) - ("\\(^\\|:\\)alt\\.chinese\\.text\\.big5" . cn-big5) - ("\\(^\\|:\\)hk\\(star\\)?\\." . cn-big5) - ("\\(^\\|:\\)tw\\." . cn-big5) - ("\\(^\\|:\\)alt\\.chinese" . hz-gb-2312) - ) - "Alist of newsgroup patterns vs. corresponding default MIME charset. -Each element looks like (REGEXP . SYMBOL). REGEXP is pattern for -newsgroup name. SYMBOL is MIME charset or coding-system.") - -(defun gnus-set-newsgroup-default-charset (newsgroup charset) - "Set CHARSET for the NEWSGROUP as default MIME charset." - (let* ((ng-regexp (concat "^" (regexp-quote newsgroup) "\\($\\|\\.\\)")) - (pair (assoc ng-regexp gnus-newsgroup-default-charset-alist)) - ) - (if pair - (setcdr pair charset) - (setq gnus-newsgroup-default-charset-alist - (cons (cons ng-regexp charset) - gnus-newsgroup-default-charset-alist)) - ))) - - -;;; @ localization -;;; - -(defun gnus-set-summary-default-charset () - "Set up `default-mime-charset' of summary buffer. -It is specified by variable `gnus-newsgroup-default-charset-alist' -\(cf. function `gnus-set-newsgroup-default-charset')." - (if (buffer-live-p gnus-summary-buffer) - (let ((charset - (catch 'found - (let ((group - (save-excursion - (set-buffer gnus-summary-buffer) - gnus-newsgroup-name)) - (alist gnus-newsgroup-default-charset-alist)) - (while alist - (let ((pair (car alist))) - (if (string-match (car pair) group) - (throw 'found (cdr pair)) - )) - (setq alist (cdr alist))) - )))) - (if charset - (progn - (save-excursion - (set-buffer gnus-summary-buffer) - (make-local-variable 'default-mime-charset) - (setq default-mime-charset charset)) - (make-local-variable 'default-mime-charset) - (setq default-mime-charset charset)) - (kill-local-variable 'default-mime-charset))))) - - -;;; @ end -;;; - -(provide 'gnus-i18n) - -;;; gnus-i18n.el ends here diff --git a/lisp/gnus-int.el b/lisp/gnus-int.el deleted file mode 100644 index 0fb9a18..0000000 --- a/lisp/gnus-int.el +++ /dev/null @@ -1,534 +0,0 @@ -;;; gnus-int.el --- backend interface functions for Gnus -;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; MORIOKA Tomohiko -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) - -(require 'gnus) - -(defcustom gnus-open-server-hook nil - "Hook called just before opening connection to the news server." - :group 'gnus-start - :type 'hook) - -;;; -;;; Server Communication -;;; - -(defun gnus-start-news-server (&optional confirm) - "Open a method for getting news. -If CONFIRM is non-nil, the user will be asked for an NNTP server." - (let (how) - (if gnus-current-select-method - ;; Stream is already opened. - nil - ;; Open NNTP server. - (unless gnus-nntp-service - (setq gnus-nntp-server nil)) - (when confirm - ;; Read server name with completion. - (setq gnus-nntp-server - (completing-read "NNTP server: " - (mapcar (lambda (server) (list server)) - (cons (list gnus-nntp-server) - gnus-secondary-servers)) - nil nil gnus-nntp-server))) - - (when (and gnus-nntp-server - (stringp gnus-nntp-server) - (not (string= gnus-nntp-server ""))) - (setq gnus-select-method - (cond ((or (string= gnus-nntp-server "") - (string= gnus-nntp-server "::")) - (list 'nnspool (system-name))) - ((string-match "^:" gnus-nntp-server) - (list 'nnmh gnus-nntp-server - (list 'nnmh-directory - (file-name-as-directory - (expand-file-name - (substring gnus-nntp-server 1) "~/"))) - (list 'nnmh-get-new-mail nil))) - (t - (list 'nntp gnus-nntp-server))))) - - (setq how (car gnus-select-method)) - (cond - ((eq how 'nnspool) - (require 'nnspool) - (gnus-message 5 "Looking up local news spool...")) - ((eq how 'nnmh) - (require 'nnmh) - (gnus-message 5 "Looking up mh spool...")) - (t - (require 'nntp))) - (setq gnus-current-select-method gnus-select-method) - (gnus-run-hooks 'gnus-open-server-hook) - (or - ;; gnus-open-server-hook might have opened it - (gnus-server-opened gnus-select-method) - (gnus-open-server gnus-select-method) - gnus-batch-mode - (gnus-y-or-n-p - (format - "%s (%s) open error: '%s'. Continue? " - (car gnus-select-method) (cadr gnus-select-method) - (gnus-status-message gnus-select-method))) - (gnus-error 1 "Couldn't open server on %s" - (nth 1 gnus-select-method)))))) - -(defun gnus-check-group (group) - "Try to make sure that the server where GROUP exists is alive." - (let ((method (gnus-find-method-for-group group))) - (or (gnus-server-opened method) - (gnus-open-server method)))) - -(defun gnus-check-server (&optional method silent) - "Check whether the connection to METHOD is down. -If METHOD is nil, use `gnus-select-method'. -If it is down, start it up (again)." - (let ((method (or method gnus-select-method))) - ;; Transform virtual server names into select methods. - (when (stringp method) - (setq method (gnus-server-to-method method))) - (if (gnus-server-opened method) - ;; The stream is already opened. - t - ;; Open the server. - (unless silent - (gnus-message 5 "Opening %s server%s..." (car method) - (if (equal (nth 1 method) "") "" - (format " on %s" (nth 1 method))))) - (gnus-run-hooks 'gnus-open-server-hook) - (prog1 - (condition-case () - (gnus-open-server method) - (quit (message "Quit gnus-check-server") - nil)) - (unless silent - (message "")))))) - -(defun gnus-get-function (method function &optional noerror) - "Return a function symbol based on METHOD and FUNCTION." - ;; Translate server names into methods. - (unless method - (error "Attempted use of a nil select method")) - (when (stringp method) - (setq method (gnus-server-to-method method))) - ;; Check cache of constructed names. - (let* ((method-sym (if gnus-agent - (gnus-agent-get-function method) - (car method))) - (method-fns (get method-sym 'gnus-method-functions)) - (func (let ((method-fnlist-elt (assq function method-fns))) - (unless method-fnlist-elt - (setq method-fnlist-elt - (cons function - (intern (format "%s-%s" method-sym function)))) - (put method-sym 'gnus-method-functions - (cons method-fnlist-elt method-fns))) - (cdr method-fnlist-elt)))) - ;; Maybe complain if there is no function. - (unless (fboundp func) - (unless (car method) - (error "Trying to require a method that doesn't exist")) - (require (car method)) - (when (not (fboundp func)) - (if noerror - (setq func nil) - (error "No such function: %s" func)))) - func)) - - -;;; -;;; Interface functions to the backends. -;;; - -(defun gnus-open-server (gnus-command-method) - "Open a connection to GNUS-COMMAND-METHOD." - (when (stringp gnus-command-method) - (setq gnus-command-method (gnus-server-to-method gnus-command-method))) - (let ((elem (assoc gnus-command-method gnus-opened-servers))) - ;; If this method was previously denied, we just return nil. - (if (eq (nth 1 elem) 'denied) - (progn - (gnus-message 1 "Denied server") - nil) - ;; Open the server. - (let ((result - (funcall (gnus-get-function gnus-command-method 'open-server) - (nth 1 gnus-command-method) - (nthcdr 2 gnus-command-method)))) - ;; If this hasn't been opened before, we add it to the list. - (unless elem - (setq elem (list gnus-command-method nil) - gnus-opened-servers (cons elem gnus-opened-servers))) - ;; Set the status of this server. - (setcar (cdr elem) (if result 'ok 'denied)) - ;; Return the result from the "open" call. - result)))) - -(defun gnus-close-server (gnus-command-method) - "Close the connection to GNUS-COMMAND-METHOD." - (when (stringp gnus-command-method) - (setq gnus-command-method (gnus-server-to-method gnus-command-method))) - (funcall (gnus-get-function gnus-command-method 'close-server) - (nth 1 gnus-command-method))) - -(defun gnus-request-list (gnus-command-method) - "Request the active file from GNUS-COMMAND-METHOD." - (when (stringp gnus-command-method) - (setq gnus-command-method (gnus-server-to-method gnus-command-method))) - (funcall (gnus-get-function gnus-command-method 'request-list) - (nth 1 gnus-command-method))) - -(defun gnus-request-list-newsgroups (gnus-command-method) - "Request the newsgroups file from GNUS-COMMAND-METHOD." - (when (stringp gnus-command-method) - (setq gnus-command-method (gnus-server-to-method gnus-command-method))) - (funcall (gnus-get-function gnus-command-method 'request-list-newsgroups) - (nth 1 gnus-command-method))) - -(defun gnus-request-newgroups (date gnus-command-method) - "Request all new groups since DATE from GNUS-COMMAND-METHOD." - (when (stringp gnus-command-method) - (setq gnus-command-method (gnus-server-to-method gnus-command-method))) - (let ((func (gnus-get-function gnus-command-method 'request-newgroups t))) - (when func - (funcall func date (nth 1 gnus-command-method))))) - -(defun gnus-server-opened (gnus-command-method) - "Check whether a connection to GNUS-COMMAND-METHOD has been opened." - (unless (eq (gnus-server-status gnus-command-method) - 'denied) - (when (stringp gnus-command-method) - (setq gnus-command-method (gnus-server-to-method gnus-command-method))) - (funcall (inline (gnus-get-function gnus-command-method 'server-opened)) - (nth 1 gnus-command-method)))) - -(defun gnus-status-message (gnus-command-method) - "Return the status message from GNUS-COMMAND-METHOD. -If GNUS-COMMAND-METHOD is a string, it is interpreted as a group name. The method -this group uses will be queried." - (let ((gnus-command-method - (if (stringp gnus-command-method) - (gnus-find-method-for-group gnus-command-method) - gnus-command-method))) - (funcall (gnus-get-function gnus-command-method 'status-message) - (nth 1 gnus-command-method)))) - -(defun gnus-request-regenerate (gnus-command-method) - "Request a data generation from GNUS-COMMAND-METHOD." - (when (stringp gnus-command-method) - (setq gnus-command-method (gnus-server-to-method gnus-command-method))) - (funcall (gnus-get-function gnus-command-method 'request-regenerate) - (nth 1 gnus-command-method))) - -(defun gnus-request-group (group &optional dont-check gnus-command-method) - "Request GROUP. If DONT-CHECK, no information is required." - (let ((gnus-command-method - (or gnus-command-method (inline (gnus-find-method-for-group group))))) - (when (stringp gnus-command-method) - (setq gnus-command-method - (inline (gnus-server-to-method gnus-command-method)))) - (funcall (inline (gnus-get-function gnus-command-method 'request-group)) - (gnus-group-real-name group) (nth 1 gnus-command-method) - dont-check))) - -(defun gnus-list-active-group (group) - "Request active information on GROUP." - (let ((gnus-command-method (gnus-find-method-for-group group)) - (func 'list-active-group)) - (when (gnus-check-backend-function func group) - (funcall (gnus-get-function gnus-command-method func) - (gnus-group-real-name group) (nth 1 gnus-command-method))))) - -(defun gnus-request-group-description (group) - "Request a description of GROUP." - (let ((gnus-command-method (gnus-find-method-for-group group)) - (func 'request-group-description)) - (when (gnus-check-backend-function func group) - (funcall (gnus-get-function gnus-command-method func) - (gnus-group-real-name group) (nth 1 gnus-command-method))))) - -(defun gnus-request-group-articles (group) - "Request a list of existing articles in GROUP." - (let ((gnus-command-method (gnus-find-method-for-group group)) - (func 'request-group-articles)) - (when (gnus-check-backend-function func group) - (funcall (gnus-get-function gnus-command-method func) - (gnus-group-real-name group) (nth 1 gnus-command-method))))) - -(defun gnus-close-group (group) - "Request the GROUP be closed." - (let ((gnus-command-method (inline (gnus-find-method-for-group group)))) - (funcall (gnus-get-function gnus-command-method 'close-group) - (gnus-group-real-name group) (nth 1 gnus-command-method)))) - -(defun gnus-retrieve-headers (articles group &optional fetch-old) - "Request headers for ARTICLES in GROUP. -If FETCH-OLD, retrieve all headers (or some subset thereof) in the group." - (let ((gnus-command-method (gnus-find-method-for-group group))) - (if (and gnus-use-cache (numberp (car articles))) - (gnus-cache-retrieve-headers articles group fetch-old) - (funcall (gnus-get-function gnus-command-method 'retrieve-headers) - articles (gnus-group-real-name group) - (nth 1 gnus-command-method) fetch-old)))) - -(defun gnus-retrieve-articles (articles group) - "Request ARTICLES in GROUP." - (let ((gnus-command-method (gnus-find-method-for-group group))) - (funcall (gnus-get-function gnus-command-method 'retrieve-articles) - articles (gnus-group-real-name group) - (nth 1 gnus-command-method)))) - -(defun gnus-retrieve-groups (groups gnus-command-method) - "Request active information on GROUPS from GNUS-COMMAND-METHOD." - (when (stringp gnus-command-method) - (setq gnus-command-method (gnus-server-to-method gnus-command-method))) - (funcall (gnus-get-function gnus-command-method 'retrieve-groups) - groups (nth 1 gnus-command-method))) - -(defun gnus-request-type (group &optional article) - "Return the type (`post' or `mail') of GROUP (and ARTICLE)." - (let ((gnus-command-method (gnus-find-method-for-group group))) - (if (not (gnus-check-backend-function - 'request-type (car gnus-command-method))) - 'unknown - (funcall (gnus-get-function gnus-command-method 'request-type) - (gnus-group-real-name group) article)))) - -(defun gnus-request-set-mark (group action) - "Set marks on articles in the backend." - (let ((gnus-command-method (gnus-find-method-for-group group))) - (if (not (gnus-check-backend-function - 'request-set-mark (car gnus-command-method))) - action - (funcall (gnus-get-function gnus-command-method 'request-set-mark) - (gnus-group-real-name group) action - (nth 1 gnus-command-method))))) - -(defun gnus-request-update-mark (group article mark) - "Allow the backend to change the mark the user tries to put on an article." - (let ((gnus-command-method (gnus-find-method-for-group group))) - (if (not (gnus-check-backend-function - 'request-update-mark (car gnus-command-method))) - mark - (funcall (gnus-get-function gnus-command-method 'request-update-mark) - (gnus-group-real-name group) article mark)))) - -(defun gnus-request-article (article group &optional buffer) - "Request the ARTICLE in GROUP. -ARTICLE can either be an article number or an article Message-ID. -If BUFFER, insert the article in that group." - (let ((gnus-command-method (gnus-find-method-for-group group))) - (funcall (gnus-get-function gnus-command-method 'request-article) - article (gnus-group-real-name group) - (nth 1 gnus-command-method) buffer))) - -(defun gnus-request-head (article group) - "Request the head of ARTICLE in GROUP." - (let* ((gnus-command-method (gnus-find-method-for-group group)) - (head (gnus-get-function gnus-command-method 'request-head t)) - res clean-up) - (cond - ;; Check the cache. - ((and gnus-use-cache - (numberp article) - (gnus-cache-request-article article group)) - (setq res (cons group article) - clean-up t)) - ;; Use `head' function. - ((fboundp head) - (setq res (funcall head article (gnus-group-real-name group) - (nth 1 gnus-command-method)))) - ;; Use `article' function. - (t - (setq res (gnus-request-article article group) - clean-up t))) - (when clean-up - (save-excursion - (set-buffer nntp-server-buffer) - (goto-char (point-min)) - (when (search-forward "\n\n" nil t) - (delete-region (1- (point)) (point-max))) - (nnheader-fold-continuation-lines))) - res)) - -(defun gnus-request-body (article group) - "Request the body of ARTICLE in GROUP." - (let* ((gnus-command-method (gnus-find-method-for-group group)) - (head (gnus-get-function gnus-command-method 'request-body t)) - res clean-up) - (cond - ;; Check the cache. - ((and gnus-use-cache - (numberp article) - (gnus-cache-request-article article group)) - (setq res (cons group article) - clean-up t)) - ;; Use `head' function. - ((fboundp head) - (setq res (funcall head article (gnus-group-real-name group) - (nth 1 gnus-command-method)))) - ;; Use `article' function. - (t - (setq res (gnus-request-article article group) - clean-up t))) - (when clean-up - (save-excursion - (set-buffer nntp-server-buffer) - (goto-char (point-min)) - (when (search-forward "\n\n" nil t) - (delete-region (point-min) (1- (point)))))) - res)) - -(defun gnus-request-post (gnus-command-method) - "Post the current buffer using GNUS-COMMAND-METHOD." - (when (stringp gnus-command-method) - (setq gnus-command-method (gnus-server-to-method gnus-command-method))) - (funcall (gnus-get-function gnus-command-method 'request-post) - (nth 1 gnus-command-method))) - -(defun gnus-request-scan (group gnus-command-method) - "Request a SCAN being performed in GROUP from GNUS-COMMAND-METHOD. -If GROUP is nil, all groups on GNUS-COMMAND-METHOD are scanned." - (let ((gnus-command-method - (if group (gnus-find-method-for-group group) gnus-command-method)) - (gnus-inhibit-demon t) - (mail-source-plugged gnus-plugged)) - (if (or gnus-plugged (not (gnus-agent-method-p gnus-command-method))) - (funcall (gnus-get-function gnus-command-method 'request-scan) - (and group (gnus-group-real-name group)) - (nth 1 gnus-command-method))))) - -(defsubst gnus-request-update-info (info gnus-command-method) - "Request that GNUS-COMMAND-METHOD update INFO." - (when (stringp gnus-command-method) - (setq gnus-command-method (gnus-server-to-method gnus-command-method))) - (when (gnus-check-backend-function - 'request-update-info (car gnus-command-method)) - (funcall (gnus-get-function gnus-command-method 'request-update-info) - (gnus-group-real-name (gnus-info-group info)) - info (nth 1 gnus-command-method)))) - -(defun gnus-request-expire-articles (articles group &optional force) - (let ((gnus-command-method (gnus-find-method-for-group group))) - (funcall (gnus-get-function gnus-command-method 'request-expire-articles) - articles (gnus-group-real-name group) (nth 1 gnus-command-method) - force))) - -(defun gnus-request-move-article - (article group server accept-function &optional last) - (let ((gnus-command-method (gnus-find-method-for-group group))) - (funcall (gnus-get-function gnus-command-method 'request-move-article) - article (gnus-group-real-name group) - (nth 1 gnus-command-method) accept-function last))) - -(defun gnus-request-accept-article (group &optional gnus-command-method last - no-encode) - ;; Make sure there's a newline at the end of the article. - (when (stringp gnus-command-method) - (setq gnus-command-method (gnus-server-to-method gnus-command-method))) - (when (and (not gnus-command-method) - (stringp group)) - (setq gnus-command-method (gnus-group-name-to-method group))) - (goto-char (point-max)) - (unless (bolp) - (insert "\n")) - (let ((func (car (or gnus-command-method - (gnus-find-method-for-group group))))) - (funcall (intern (format "%s-request-accept-article" func)) - (if (stringp group) (gnus-group-real-name group) group) - (cadr gnus-command-method) - last))) - -(defun gnus-request-replace-article (article group buffer &optional no-encode) - (let ((func (car (gnus-group-name-to-method group)))) - (funcall (intern (format "%s-request-replace-article" func)) - article (gnus-group-real-name group) buffer))) - -(defun gnus-request-associate-buffer (group) - (let ((gnus-command-method (gnus-find-method-for-group group))) - (funcall (gnus-get-function gnus-command-method 'request-associate-buffer) - (gnus-group-real-name group)))) - -(defun gnus-request-restore-buffer (article group) - "Request a new buffer restored to the state of ARTICLE." - (let ((gnus-command-method (gnus-find-method-for-group group))) - (funcall (gnus-get-function gnus-command-method 'request-restore-buffer) - article (gnus-group-real-name group) - (nth 1 gnus-command-method)))) - -(defun gnus-request-create-group (group &optional gnus-command-method args) - (when (stringp gnus-command-method) - (setq gnus-command-method (gnus-server-to-method gnus-command-method))) - (let ((gnus-command-method - (or gnus-command-method (gnus-find-method-for-group group)))) - (funcall (gnus-get-function gnus-command-method 'request-create-group) - (gnus-group-real-name group) (nth 1 gnus-command-method) args))) - -(defun gnus-request-delete-group (group &optional force) - (let ((gnus-command-method (gnus-find-method-for-group group))) - (funcall (gnus-get-function gnus-command-method 'request-delete-group) - (gnus-group-real-name group) force (nth 1 gnus-command-method)))) - -(defun gnus-request-rename-group (group new-name) - (let ((gnus-command-method (gnus-find-method-for-group group))) - (funcall (gnus-get-function gnus-command-method 'request-rename-group) - (gnus-group-real-name group) - (gnus-group-real-name new-name) (nth 1 gnus-command-method)))) - -(defun gnus-close-backends () - ;; Send a close request to all backends that support such a request. - (let ((methods gnus-valid-select-methods) - (gnus-inhibit-demon t) - func gnus-command-method) - (while (setq gnus-command-method (pop methods)) - (when (fboundp (setq func (intern - (concat (car gnus-command-method) - "-request-close")))) - (funcall func))))) - -(defun gnus-asynchronous-p (gnus-command-method) - (let ((func (gnus-get-function gnus-command-method 'asynchronous-p t))) - (when (fboundp func) - (funcall func)))) - -(defun gnus-remove-denial (gnus-command-method) - (when (stringp gnus-command-method) - (setq gnus-command-method (gnus-server-to-method gnus-command-method))) - (let* ((elem (assoc gnus-command-method gnus-opened-servers)) - (status (cadr elem))) - ;; If this hasn't been opened before, we add it to the list. - (when (eq status 'denied) - ;; Set the status of this server. - (setcar (cdr elem) 'closed)))) - -(provide 'gnus-int) - -;;; gnus-int.el ends here diff --git a/lisp/gnus-kill.el b/lisp/gnus-kill.el deleted file mode 100644 index 1ead0ac..0000000 --- a/lisp/gnus-kill.el +++ /dev/null @@ -1,730 +0,0 @@ -;;; gnus-kill.el --- kill commands for Gnus -;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000 -;; Free Software Foundation, Inc. - -;; Author: Masanobu UMEDA -;; Lars Magne Ingebrigtsen -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) - -(require 'gnus) -(require 'gnus-art) -(require 'gnus-range) - -(defcustom gnus-kill-file-mode-hook nil - "Hook for Gnus kill file mode." - :group 'gnus-score-kill - :type 'hook) - -(defcustom gnus-kill-expiry-days 7 - "*Number of days before expiring unused kill file entries." - :group 'gnus-score-kill - :group 'gnus-score-expire - :type 'integer) - -(defcustom gnus-kill-save-kill-file nil - "*If non-nil, will save kill files after processing them." - :group 'gnus-score-kill - :type 'boolean) - -(defcustom gnus-winconf-kill-file nil - "What does this do, Lars? -I don't know, Per." - :group 'gnus-score-kill - :type 'sexp) - -(defcustom gnus-kill-killed t - "*If non-nil, Gnus will apply kill files to already killed articles. -If it is nil, Gnus will never apply kill files to articles that have -already been through the scoring process, which might very well save lots -of time." - :group 'gnus-score-kill - :type 'boolean) - - - -(defmacro gnus-raise (field expression level) - `(gnus-kill ,field ,expression - (function (gnus-summary-raise-score ,level)) t)) - -(defmacro gnus-lower (field expression level) - `(gnus-kill ,field ,expression - (function (gnus-summary-raise-score (- ,level))) t)) - -;;; -;;; Gnus Kill File Mode -;;; - -(defvar gnus-kill-file-mode-map nil) - -(unless gnus-kill-file-mode-map - (gnus-define-keymap (setq gnus-kill-file-mode-map - (copy-keymap emacs-lisp-mode-map)) - "\C-c\C-k\C-s" gnus-kill-file-kill-by-subject - "\C-c\C-k\C-a" gnus-kill-file-kill-by-author - "\C-c\C-k\C-t" gnus-kill-file-kill-by-thread - "\C-c\C-k\C-x" gnus-kill-file-kill-by-xref - "\C-c\C-a" gnus-kill-file-apply-buffer - "\C-c\C-e" gnus-kill-file-apply-last-sexp - "\C-c\C-c" gnus-kill-file-exit)) - -(defun gnus-kill-file-mode () - "Major mode for editing kill files. - -If you are using this mode - you probably shouldn't. Kill files -perform badly and paint with a pretty broad brush. Score files, on -the other hand, are vastly faster (40x speedup) and give you more -control over what to do. - -In addition to Emacs-Lisp Mode, the following commands are available: - -\\{gnus-kill-file-mode-map} - - A kill file contains Lisp expressions to be applied to a selected -newsgroup. The purpose is to mark articles as read on the basis of -some set of regexps. A global kill file is applied to every newsgroup, -and a local kill file is applied to a specified newsgroup. Since a -global kill file is applied to every newsgroup, for better performance -use a local one. - - A kill file can contain any kind of Emacs Lisp expressions expected -to be evaluated in the Summary buffer. Writing Lisp programs for this -purpose is not so easy because the internal working of Gnus must be -well-known. For this reason, Gnus provides a general function which -does this easily for non-Lisp programmers. - - The `gnus-kill' function executes commands available in Summary Mode -by their key sequences. `gnus-kill' should be called with FIELD, -REGEXP and optional COMMAND and ALL. FIELD is a string representing -the header field or an empty string. If FIELD is an empty string, the -entire article body is searched for. REGEXP is a string which is -compared with FIELD value. COMMAND is a string representing a valid -key sequence in Summary mode or Lisp expression. COMMAND defaults to -'(gnus-summary-mark-as-read nil \"X\"). Make sure that COMMAND is -executed in the Summary buffer. If the second optional argument ALL -is non-nil, the COMMAND is applied to articles which are already -marked as read or unread. Articles which are marked are skipped over -by default. - - For example, if you want to mark articles of which subjects contain -the string `AI' as read, a possible kill file may look like: - - (gnus-kill \"Subject\" \"AI\") - - If you want to mark articles with `D' instead of `X', you can use -the following expression: - - (gnus-kill \"Subject\" \"AI\" \"d\") - -In this example it is assumed that the command -`gnus-summary-mark-as-read-forward' is assigned to `d' in Summary Mode. - - It is possible to delete unnecessary headers which are marked with -`X' in a kill file as follows: - - (gnus-expunge \"X\") - - If the Summary buffer is empty after applying kill files, Gnus will -exit the selected newsgroup normally. If headers which are marked -with `D' are deleted in a kill file, it is impossible to read articles -which are marked as read in the previous Gnus sessions. Marks other -than `D' should be used for articles which should really be deleted. - -Entry to this mode calls emacs-lisp-mode-hook and -gnus-kill-file-mode-hook with no arguments, if that value is non-nil." - (interactive) - (kill-all-local-variables) - (use-local-map gnus-kill-file-mode-map) - (set-syntax-table emacs-lisp-mode-syntax-table) - (setq major-mode 'gnus-kill-file-mode) - (setq mode-name "Kill") - (lisp-mode-variables nil) - (gnus-run-hooks 'emacs-lisp-mode-hook 'gnus-kill-file-mode-hook)) - -(defun gnus-kill-file-edit-file (newsgroup) - "Begin editing a kill file for NEWSGROUP. -If NEWSGROUP is nil, the global kill file is selected." - (interactive "sNewsgroup: ") - (let ((file (gnus-newsgroup-kill-file newsgroup))) - (gnus-make-directory (file-name-directory file)) - ;; Save current window configuration if this is first invocation. - (or (and (get-file-buffer file) - (get-buffer-window (get-file-buffer file))) - (setq gnus-winconf-kill-file (current-window-configuration))) - ;; Hack windows. - (let ((buffer (find-file-noselect file))) - (cond ((get-buffer-window buffer) - (pop-to-buffer buffer)) - ((eq major-mode 'gnus-group-mode) - (gnus-configure-windows 'group) ;Take all windows. - (pop-to-buffer buffer)) - ((eq major-mode 'gnus-summary-mode) - (gnus-configure-windows 'article) - (pop-to-buffer gnus-article-buffer) - (bury-buffer gnus-article-buffer) - (switch-to-buffer buffer)) - (t ;No good rules. - (find-file-other-window file)))) - (gnus-kill-file-mode))) - -;; Fix by Sudish Joseph . -(defun gnus-kill-set-kill-buffer () - (let* ((file (gnus-newsgroup-kill-file gnus-newsgroup-name)) - (buffer (find-file-noselect file))) - (set-buffer buffer) - (gnus-kill-file-mode) - (bury-buffer buffer))) - -(defun gnus-kill-file-enter-kill (field regexp &optional dont-move) - ;; Enter kill file entry. - ;; FIELD: String containing the name of the header field to kill. - ;; REGEXP: The string to kill. - (save-excursion - (let (string) - (unless (eq major-mode 'gnus-kill-file-mode) - (gnus-kill-set-kill-buffer)) - (unless dont-move - (goto-char (point-max))) - (insert (setq string (format "(gnus-kill %S %S)\n" field regexp))) - (gnus-kill-file-apply-string string)))) - -(defun gnus-kill-file-kill-by-subject () - "Kill by subject." - (interactive) - (gnus-kill-file-enter-kill - "Subject" - (if (vectorp gnus-current-headers) - (regexp-quote - (gnus-simplify-subject (mail-header-subject gnus-current-headers))) - "") - t)) - -(defun gnus-kill-file-kill-by-author () - "Kill by author." - (interactive) - (gnus-kill-file-enter-kill - "From" - (if (vectorp gnus-current-headers) - (regexp-quote (mail-header-from gnus-current-headers)) - "") t)) - -(defun gnus-kill-file-kill-by-thread () - "Kill by author." - (interactive) - (gnus-kill-file-enter-kill - "References" - (if (vectorp gnus-current-headers) - (regexp-quote (mail-header-id gnus-current-headers)) - ""))) - -(defun gnus-kill-file-kill-by-xref () - "Kill by Xref." - (interactive) - (let ((xref (and (vectorp gnus-current-headers) - (mail-header-xref gnus-current-headers))) - (start 0) - group) - (if xref - (while (string-match " \\([^ \t]+\\):" xref start) - (setq start (match-end 0)) - (when (not (string= - (setq group - (substring xref (match-beginning 1) (match-end 1))) - gnus-newsgroup-name)) - (gnus-kill-file-enter-kill - "Xref" (concat " " (regexp-quote group) ":") t))) - (gnus-kill-file-enter-kill "Xref" "" t)))) - -(defun gnus-kill-file-raise-followups-to-author (level) - "Raise score for all followups to the current author." - (interactive "p") - (let ((name (mail-header-from gnus-current-headers)) - string) - (save-excursion - (gnus-kill-set-kill-buffer) - (goto-char (point-min)) - (setq name (read-string (concat "Add " level - " to followup articles to: ") - (regexp-quote name))) - (setq - string - (format - "(gnus-kill %S %S '(gnus-summary-temporarily-raise-by-thread %S))\n" - "From" name level)) - (insert string) - (gnus-kill-file-apply-string string)) - (gnus-message - 6 "Added temporary score file entry for followups to %s." name))) - -(defun gnus-kill-file-apply-buffer () - "Apply current buffer to current newsgroup." - (interactive) - (if (and gnus-current-kill-article - (get-buffer gnus-summary-buffer)) - ;; Assume newsgroup is selected. - (gnus-kill-file-apply-string (buffer-string)) - (ding) (gnus-message 2 "No newsgroup is selected."))) - -(defun gnus-kill-file-apply-string (string) - "Apply STRING to current newsgroup." - (interactive) - (let ((string (concat "(progn \n" string "\n)"))) - (save-excursion - (save-window-excursion - (pop-to-buffer gnus-summary-buffer) - (eval (car (read-from-string string))))))) - -(defun gnus-kill-file-apply-last-sexp () - "Apply sexp before point in current buffer to current newsgroup." - (interactive) - (if (and gnus-current-kill-article - (get-buffer gnus-summary-buffer)) - ;; Assume newsgroup is selected. - (let ((string - (buffer-substring - (save-excursion (forward-sexp -1) (point)) (point)))) - (save-excursion - (save-window-excursion - (pop-to-buffer gnus-summary-buffer) - (eval (car (read-from-string string)))))) - (ding) (gnus-message 2 "No newsgroup is selected."))) - -(defun gnus-kill-file-exit () - "Save a kill file, then return to the previous buffer." - (interactive) - (save-buffer) - (let ((killbuf (current-buffer))) - ;; We don't want to return to article buffer. - (when (get-buffer gnus-article-buffer) - (bury-buffer gnus-article-buffer)) - ;; Delete the KILL file windows. - (delete-windows-on killbuf) - ;; Restore last window configuration if available. - (when gnus-winconf-kill-file - (set-window-configuration gnus-winconf-kill-file)) - (setq gnus-winconf-kill-file nil) - ;; Kill the KILL file buffer. Suggested by tale@pawl.rpi.edu. - (kill-buffer killbuf))) - -;; For kill files - -(defun gnus-Newsgroup-kill-file (newsgroup) - "Return the name of a kill file for NEWSGROUP. -If NEWSGROUP is nil, return the global kill file instead." - (cond ((or (null newsgroup) - (string-equal newsgroup "")) - ;; The global kill file is placed at top of the directory. - (expand-file-name gnus-kill-file-name gnus-kill-files-directory)) - (gnus-use-long-file-name - ;; Append ".KILL" to capitalized newsgroup name. - (expand-file-name (concat (gnus-capitalize-newsgroup newsgroup) - "." gnus-kill-file-name) - gnus-kill-files-directory)) - (t - ;; Place "KILL" under the hierarchical directory. - (expand-file-name (concat (gnus-newsgroup-directory-form newsgroup) - "/" gnus-kill-file-name) - gnus-kill-files-directory)))) - -(defun gnus-expunge (marks) - "Remove lines marked with MARKS." - (save-excursion - (set-buffer gnus-summary-buffer) - (gnus-summary-limit-to-marks marks 'reverse))) - -(defun gnus-apply-kill-file-unless-scored () - "Apply .KILL file, unless a .SCORE file for the same newsgroup exists." - (cond ((file-exists-p (gnus-score-file-name gnus-newsgroup-name)) - ;; Ignores global KILL. - (when (file-exists-p (gnus-newsgroup-kill-file gnus-newsgroup-name)) - (gnus-message 3 "Note: Ignoring %s.KILL; preferring .SCORE" - gnus-newsgroup-name)) - 0) - ((or (file-exists-p (gnus-newsgroup-kill-file nil)) - (file-exists-p (gnus-newsgroup-kill-file gnus-newsgroup-name))) - (gnus-apply-kill-file-internal)) - (t - 0))) - -(defun gnus-apply-kill-file-internal () - "Apply a kill file to the current newsgroup. -Returns the number of articles marked as read." - (let* ((kill-files (list (gnus-newsgroup-kill-file nil) - (gnus-newsgroup-kill-file gnus-newsgroup-name))) - (unreads (length gnus-newsgroup-unreads)) - (gnus-summary-inhibit-highlight t) - beg) - (setq gnus-newsgroup-kill-headers nil) - ;; If there are any previously scored articles, we remove these - ;; from the `gnus-newsgroup-headers' list that the score functions - ;; will see. This is probably pretty wasteful when it comes to - ;; conses, but is, I think, faster than having to assq in every - ;; single score function. - (let ((files kill-files)) - (while files - (if (file-exists-p (car files)) - (let ((headers gnus-newsgroup-headers)) - (if gnus-kill-killed - (setq gnus-newsgroup-kill-headers - (mapcar (lambda (header) (mail-header-number header)) - headers)) - (while headers - (unless (gnus-member-of-range - (mail-header-number (car headers)) - gnus-newsgroup-killed) - (push (mail-header-number (car headers)) - gnus-newsgroup-kill-headers)) - (setq headers (cdr headers)))) - (setq files nil)) - (setq files (cdr files))))) - (if (not gnus-newsgroup-kill-headers) - () - (save-window-excursion - (save-excursion - (while kill-files - (if (not (file-exists-p (car kill-files))) - () - (gnus-message 6 "Processing kill file %s..." (car kill-files)) - (find-file (car kill-files)) - (goto-char (point-min)) - - (if (consp (ignore-errors (read (current-buffer)))) - (gnus-kill-parse-gnus-kill-file) - (gnus-kill-parse-rn-kill-file)) - - (gnus-message - 6 "Processing kill file %s...done" (car kill-files))) - (setq kill-files (cdr kill-files))))) - - (gnus-set-mode-line 'summary) - - (if beg - (let ((nunreads (- unreads (length gnus-newsgroup-unreads)))) - (or (eq nunreads 0) - (gnus-message 6 "Marked %d articles as read" nunreads)) - nunreads) - 0)))) - -;; Parse a Gnus killfile. -(defun gnus-score-insert-help (string alist idx) - (save-excursion - (pop-to-buffer "*Score Help*") - (buffer-disable-undo) - (erase-buffer) - (insert string ":\n\n") - (while alist - (insert (format " %c: %s\n" (caar alist) (nth idx (car alist)))) - (setq alist (cdr alist))))) - -(defun gnus-kill-parse-gnus-kill-file () - (goto-char (point-min)) - (gnus-kill-file-mode) - (let (beg form) - (while (progn - (setq beg (point)) - (setq form (ignore-errors (read (current-buffer))))) - (unless (listp form) - (error "Invalid kill entry (possibly rn kill file?): %s" form)) - (if (or (eq (car form) 'gnus-kill) - (eq (car form) 'gnus-raise) - (eq (car form) 'gnus-lower)) - (progn - (delete-region beg (point)) - (insert (or (eval form) ""))) - (save-excursion - (set-buffer gnus-summary-buffer) - (ignore-errors (eval form))))) - (and (buffer-modified-p) - gnus-kill-save-kill-file - (save-buffer)) - (set-buffer-modified-p nil))) - -;; Parse an rn killfile. -(defun gnus-kill-parse-rn-kill-file () - (goto-char (point-min)) - (gnus-kill-file-mode) - (let ((mod-to-header - '((?a . "") - (?h . "") - (?f . "from") - (?: . "subject"))) - ;;(com-to-com - ;; '((?m . " ") - ;; (?j . "X"))) - pattern modifier commands) - (while (not (eobp)) - (if (not (looking-at "[ \t]*/\\([^/]*\\)/\\([ahfcH]\\)?:\\([a-z=:]*\\)")) - () - (setq pattern (buffer-substring (match-beginning 1) (match-end 1))) - (setq modifier (if (match-beginning 2) (char-after (match-beginning 2)) - ?s)) - (setq commands (buffer-substring (match-beginning 3) (match-end 3))) - - ;; The "f:+" command marks everything *but* the matches as read, - ;; so we simply first match everything as read, and then unmark - ;; PATTERN later. - (when (string-match "\\+" commands) - (gnus-kill "from" ".") - (setq commands "m")) - - (gnus-kill - (or (cdr (assq modifier mod-to-header)) "subject") - pattern - (if (string-match "m" commands) - '(gnus-summary-mark-as-unread nil " ") - '(gnus-summary-mark-as-read nil "X")) - nil t)) - (forward-line 1)))) - -;; Kill changes and new format by suggested by JWZ and Sudish Joseph -;; . -(defun gnus-kill (field regexp &optional exe-command all silent) - "If FIELD of an article matches REGEXP, execute COMMAND. -Optional 1st argument COMMAND is default to - (gnus-summary-mark-as-read nil \"X\"). -If optional 2nd argument ALL is non-nil, articles marked are also applied to. -If FIELD is an empty string (or nil), entire article body is searched for. -COMMAND must be a lisp expression or a string representing a key sequence." - ;; We don't want to change current point nor window configuration. - (let ((old-buffer (current-buffer))) - (save-excursion - (save-window-excursion - ;; Selected window must be summary buffer to execute keyboard - ;; macros correctly. See command_loop_1. - (switch-to-buffer gnus-summary-buffer 'norecord) - (goto-char (point-min)) ;From the beginning. - (let ((kill-list regexp) - (date (current-time-string)) - (command (or exe-command '(gnus-summary-mark-as-read - nil gnus-kill-file-mark))) - kill kdate prev) - (if (listp kill-list) - ;; It is a list. - (if (not (consp (cdr kill-list))) - ;; It's of the form (regexp . date). - (if (zerop (gnus-execute field (car kill-list) - command nil (not all))) - (when (> (days-between date (cdr kill-list)) - gnus-kill-expiry-days) - (setq regexp nil)) - (setcdr kill-list date)) - (while (setq kill (car kill-list)) - (if (consp kill) - ;; It's a temporary kill. - (progn - (setq kdate (cdr kill)) - (if (zerop (gnus-execute - field (car kill) command nil (not all))) - (when (> (days-between date kdate) - gnus-kill-expiry-days) - ;; Time limit has been exceeded, so we - ;; remove the match. - (if prev - (setcdr prev (cdr kill-list)) - (setq regexp (cdr regexp)))) - ;; Successful kill. Set the date to today. - (setcdr kill date))) - ;; It's a permanent kill. - (gnus-execute field kill command nil (not all))) - (setq prev kill-list) - (setq kill-list (cdr kill-list)))) - (gnus-execute field kill-list command nil (not all)))))) - (switch-to-buffer old-buffer) - (when (and (eq major-mode 'gnus-kill-file-mode) regexp (not silent)) - (gnus-pp-gnus-kill - (nconc (list 'gnus-kill field - (if (consp regexp) (list 'quote regexp) regexp)) - (when (or exe-command all) - (list (list 'quote exe-command))) - (if all (list t) nil)))))) - -(defun gnus-pp-gnus-kill (object) - (if (or (not (consp (nth 2 object))) - (not (consp (cdr (nth 2 object)))) - (and (eq 'quote (car (nth 2 object))) - (not (consp (cdadr (nth 2 object)))))) - (concat "\n" (gnus-prin1-to-string object)) - (save-excursion - (set-buffer (gnus-get-buffer-create "*Gnus PP*")) - (buffer-disable-undo) - (erase-buffer) - (insert (format "\n(%S %S\n '(" (nth 0 object) (nth 1 object))) - (let ((klist (cadr (nth 2 object))) - (first t)) - (while klist - (insert (if first (progn (setq first nil) "") "\n ") - (gnus-prin1-to-string (car klist))) - (setq klist (cdr klist)))) - (insert ")") - (and (nth 3 object) - (insert "\n " - (if (and (consp (nth 3 object)) - (not (eq 'quote (car (nth 3 object))))) - "'" "") - (gnus-prin1-to-string (nth 3 object)))) - (when (nth 4 object) - (insert "\n t")) - (insert ")") - (prog1 - (buffer-substring (point-min) (point-max)) - (kill-buffer (current-buffer)))))) - -(defun gnus-execute-1 (function regexp form header) - (save-excursion - (let (did-kill) - (if (null header) - nil ;Nothing to do. - (if function - ;; Compare with header field. - (let (value) - (and header - (progn - (setq value (funcall function header)) - ;; Number (Lines:) or symbol must be converted to string. - (unless (stringp value) - (setq value (gnus-prin1-to-string value))) - (setq did-kill (string-match regexp value))) - (cond ((stringp form) ;Keyboard macro. - (execute-kbd-macro form)) - ((gnus-functionp form) - (funcall form)) - (t - (eval form))))) - ;; Search article body. - (let ((gnus-current-article nil) ;Save article pointer. - (gnus-last-article nil) - (gnus-break-pages nil) ;No need to break pages. - (gnus-mark-article-hook nil)) ;Inhibit marking as read. - (gnus-message - 6 "Searching for article: %d..." (mail-header-number header)) - (gnus-article-setup-buffer) - (gnus-article-prepare (mail-header-number header) t) - (when (save-excursion - (set-buffer gnus-article-buffer) - (goto-char (point-min)) - (setq did-kill (re-search-forward regexp nil t))) - (cond ((stringp form) ;Keyboard macro. - (execute-kbd-macro form)) - ((gnus-functionp form) - (funcall form)) - (t - (eval form))))))) - did-kill))) - -(defun gnus-execute (field regexp form &optional backward unread) - "If FIELD of article header matches REGEXP, execute lisp FORM (or a string). -If FIELD is an empty string (or nil), entire article body is searched for. -If optional 1st argument BACKWARD is non-nil, do backward instead. -If optional 2nd argument UNREAD is non-nil, articles which are -marked as read or ticked are ignored." - (save-excursion - (let ((killed-no 0) - function article header extras) - (cond - ;; Search body. - ((or (null field) - (string-equal field "")) - (setq function nil)) - ;; Get access function of header field. - ((cond ((fboundp - (setq function - (intern-soft - (concat "mail-header-" (downcase field))))) - (setq function `(lambda (h) (,function h)))) - ((when (setq extras - (member (downcase field) - (mapcar (lambda (header) - (downcase (symbol-name header))) - gnus-extra-headers))) - (setq function - `(lambda (h) - (gnus-extra-header - (quote ,(nth (- (length gnus-extra-headers) - (length extras)) - gnus-extra-headers)) - h))))))) - ;; Signal error. - (t - (error "Unknown header field: \"%s\"" field))) - ;; Starting from the current article. - (while (or - ;; First article. - (and (not article) - (setq article (gnus-summary-article-number))) - ;; Find later articles. - (setq article - (gnus-summary-search-forward unread nil backward))) - (and (or (null gnus-newsgroup-kill-headers) - (memq article gnus-newsgroup-kill-headers)) - (vectorp (setq header (gnus-summary-article-header article))) - (gnus-execute-1 function regexp form header) - (setq killed-no (1+ killed-no)))) - ;; Return the number of killed articles. - killed-no))) - -;;;###autoload -(defalias 'gnus-batch-kill 'gnus-batch-score) -;;;###autoload -(defun gnus-batch-score () - "Run batched scoring. -Usage: emacs -batch -l ~/.emacs -l gnus -f gnus-batch-score" - (interactive) - (let* ((gnus-newsrc-options-n - (gnus-newsrc-parse-options - (concat "options -n " - (mapconcat 'identity command-line-args-left " ")))) - (gnus-expert-user t) - (nnmail-spool-file nil) - (mail-sources nil) - (gnus-use-dribble-file nil) - (gnus-batch-mode t) - info group newsrc entry - ;; Disable verbose message. - gnus-novice-user gnus-large-newsgroup - gnus-options-subscribe gnus-auto-subscribed-groups - gnus-options-not-subscribe) - ;; Eat all arguments. - (setq command-line-args-left nil) - (gnus-slave) - ;; Apply kills to specified newsgroups in command line arguments. - (setq newsrc (cdr gnus-newsrc-alist)) - (while (setq info (pop newsrc)) - (setq group (gnus-info-group info) - entry (gnus-gethash group gnus-newsrc-hashtb)) - (when (and (<= (gnus-info-level info) gnus-level-subscribed) - (and (car entry) - (or (eq (car entry) t) - (not (zerop (car entry)))))) - (ignore-errors - (gnus-summary-read-group group nil t nil t)) - (when (eq (current-buffer) (get-buffer gnus-summary-buffer)) - (gnus-summary-exit)))) - ;; Exit Emacs. - (switch-to-buffer gnus-group-buffer) - (gnus-group-save-newsrc))) - -(provide 'gnus-kill) - -;;; gnus-kill.el ends here diff --git a/lisp/gnus-logic.el b/lisp/gnus-logic.el deleted file mode 100644 index 9d2c009..0000000 --- a/lisp/gnus-logic.el +++ /dev/null @@ -1,230 +0,0 @@ -;;; gnus-logic.el --- advanced scoring code for Gnus -;; Copyright (C) 1996, 1997, 1998, 1999, 2000 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) - -(require 'gnus) -(require 'gnus-score) -(require 'gnus-util) - -;;; Internal variables. - -(defvar gnus-advanced-headers nil) - -;; To avoid having 8-bit characters in the source file. -(defvar gnus-advanced-not (intern (format "%c" 172))) - -(defconst gnus-advanced-index - ;; Name to index alist. - '(("number" 0 gnus-advanced-integer) - ("subject" 1 gnus-advanced-string) - ("from" 2 gnus-advanced-string) - ("date" 3 gnus-advanced-date) - ("message-id" 4 gnus-advanced-string) - ("references" 5 gnus-advanced-string) - ("chars" 6 gnus-advanced-integer) - ("lines" 7 gnus-advanced-integer) - ("xref" 8 gnus-advanced-string) - ("head" nil gnus-advanced-body) - ("body" nil gnus-advanced-body) - ("all" nil gnus-advanced-body))) - -(eval-and-compile - (autoload 'parse-time-string "parse-time")) - -(defun gnus-score-advanced (rule &optional trace) - "Apply advanced scoring RULE to all the articles in the current group." - (let ((headers gnus-newsgroup-headers) - gnus-advanced-headers score) - (while (setq gnus-advanced-headers (pop headers)) - (when (gnus-advanced-score-rule (car rule)) - ;; This rule was successful, so we add the score to - ;; this article. - (if (setq score (assq (mail-header-number gnus-advanced-headers) - gnus-newsgroup-scored)) - (setcdr score - (+ (cdr score) - (or (nth 1 rule) - gnus-score-interactive-default-score))) - (push (cons (mail-header-number gnus-advanced-headers) - (or (nth 1 rule) - gnus-score-interactive-default-score)) - gnus-newsgroup-scored) - (when trace - (push (cons "A file" rule) - gnus-score-trace))))))) - -(defun gnus-advanced-score-rule (rule) - "Apply RULE to `gnus-advanced-headers'." - (let ((type (car rule))) - (cond - ;; "And" rule. - ((or (eq type '&) (eq type 'and)) - (pop rule) - (if (not rule) - t ; Empty rule is true. - (while (and rule - (gnus-advanced-score-rule (car rule))) - (pop rule)) - ;; If all the rules were true, then `rule' should be nil. - (not rule))) - ;; "Or" rule. - ((or (eq type '|) (eq type 'or)) - (pop rule) - (if (not rule) - nil - (while (and rule - (not (gnus-advanced-score-rule (car rule)))) - (pop rule)) - ;; If one of the rules returned true, then `rule' should be non-nil. - rule)) - ;; "Not" rule. - ((or (eq type '!) (eq type 'not) (eq type gnus-advanced-not)) - (not (gnus-advanced-score-rule (nth 1 rule)))) - ;; This is a `1-'-type redirection rule. - ((and (symbolp type) - (string-match "^[0-9]+-$\\|^\\^+$" (symbol-name type))) - (let ((gnus-advanced-headers - (gnus-parent-headers - gnus-advanced-headers - (if (string-match "^\\([0-9]+\\)-$" (symbol-name type)) - ;; 1- type redirection. - (string-to-number - (substring (symbol-name type) - (match-beginning 0) (match-end 0))) - ;; ^^^ type redirection. - (length (symbol-name type)))))) - (when gnus-advanced-headers - (gnus-advanced-score-rule (nth 1 rule))))) - ;; Plain scoring rule. - ((stringp type) - (gnus-advanced-score-article rule)) - ;; Bug-out time! - (t - (error "Unknown advanced score type: %s" rule))))) - -(defun gnus-advanced-score-article (rule) - ;; `rule' is a semi-normal score rule, so we find out - ;; what function that's supposed to do the actual - ;; processing. - (let* ((header (car rule)) - (func (assoc (downcase header) gnus-advanced-index))) - (if (not func) - (error "No such header: %s" rule) - ;; Call the score function. - (funcall (caddr func) (or (cadr func) header) - (cadr rule) (caddr rule))))) - -(defun gnus-advanced-string (index match type) - "See whether string MATCH of TYPE matches `gnus-advanced-headers' in INDEX." - (let* ((type (or type 's)) - (case-fold-search (not (eq (downcase (symbol-name type)) - (symbol-name type)))) - (header (or (aref gnus-advanced-headers index) ""))) - (cond - ((memq type '(r R regexp Regexp)) - (string-match match header)) - ((memq type '(s S string String)) - (string-match (regexp-quote match) header)) - ((memq type '(e E exact Exact)) - (string= match header)) - ((memq type '(f F fuzzy Fuzzy)) - (string-match (regexp-quote (gnus-simplify-subject-fuzzy match)) - header)) - (t - (error "No such string match type: %s" type))))) - -(defun gnus-advanced-integer (index match type) - (if (not (memq type '(< > <= >= =))) - (error "No such integer score type: %s" type) - (funcall type match (or (aref gnus-advanced-headers index) 0)))) - -(defun gnus-advanced-date (index match type) - (let ((date (apply 'encode-time (parse-time-string - (aref gnus-advanced-headers index)))) - (match (apply 'encode-time (parse-time-string match)))) - (cond - ((eq type 'at) - (equal date match)) - ((eq type 'before) - (time-less-p match date)) - ((eq type 'after) - (time-less-p date match)) - (t - (error "No such date score type: %s" type))))) - -(defun gnus-advanced-body (header match type) - (when (string= header "all") - (setq header "article")) - (save-excursion - (set-buffer nntp-server-buffer) - (let* ((request-func (cond ((string= "head" header) - 'gnus-request-head) - ((string= "body" header) - 'gnus-request-body) - (t 'gnus-request-article))) - ofunc article) - ;; Not all backends support partial fetching. In that case, - ;; we just fetch the entire article. - (unless (gnus-check-backend-function - (intern (concat "request-" header)) - gnus-newsgroup-name) - (setq ofunc request-func) - (setq request-func 'gnus-request-article)) - (setq article (mail-header-number gnus-advanced-headers)) - (gnus-message 7 "Scoring article %s..." article) - (when (funcall request-func article gnus-newsgroup-name) - (goto-char (point-min)) - ;; If just parts of the article is to be searched and the - ;; backend didn't support partial fetching, we just narrow - ;; to the relevant parts. - (when ofunc - (if (eq ofunc 'gnus-request-head) - (narrow-to-region - (point) - (or (search-forward "\n\n" nil t) (point-max))) - (narrow-to-region - (or (search-forward "\n\n" nil t) (point)) - (point-max)))) - (let* ((case-fold-search (not (eq (downcase (symbol-name type)) - (symbol-name type)))) - (search-func - (cond ((memq type '(r R regexp Regexp)) - 're-search-forward) - ((memq type '(s S string String)) - 'search-forward) - (t - (error "Invalid match type: %s" type))))) - (goto-char (point-min)) - (prog1 - (funcall search-func match nil t) - (widen))))))) - -(provide 'gnus-logic) - -;;; gnus-logic.el ends here diff --git a/lisp/gnus-mailcap.el b/lisp/gnus-mailcap.el deleted file mode 100644 index 0dae2a9..0000000 --- a/lisp/gnus-mailcap.el +++ /dev/null @@ -1,963 +0,0 @@ -;;; mailcap.el --- MIME media types configuration -;; Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. - -;; Author: William M. Perry -;; Lars Magne Ingebrigtsen -;; Keywords: news, mail, multimedia - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;; Provides configuration of MIME media types from directly from Lisp -;; and via the usual mailcap mechanism (RFC 1524). Deals with -;; mime.types similarly. - -;;; Code: - -(eval-when-compile (require 'cl)) -(require 'mail-parse) -(require 'mm-util) - -(defgroup mailcap nil - "Definition of viewers for MIME types." - :version "21.1" - :group 'mime) - -(defvar mailcap-parse-args-syntax-table - (let ((table (copy-syntax-table emacs-lisp-mode-syntax-table))) - (modify-syntax-entry ?' "\"" table) - (modify-syntax-entry ?` "\"" table) - (modify-syntax-entry ?{ "(" table) - (modify-syntax-entry ?} ")" table) - table) - "A syntax table for parsing sgml attributes.") - -;; Postpone using defcustom for this as it's so big and we essentially -;; have to have two copies of the data around then. Perhaps just -;; customize the Lisp viewers and rely on the normal configuration -;; files for the rest? -- fx -(defvar mailcap-mime-data - '(("application" - ("vnd.ms-excel" - (viewer . "gnumeric %s") - (test . (getenv "DISPLAY")) - (type . "application/vnd.ms-excel")) - ("x-x509-ca-cert" - (viewer . ssl-view-site-cert) - (test . (fboundp 'ssl-view-site-cert)) - (type . "application/x-x509-ca-cert")) - ("x-x509-user-cert" - (viewer . ssl-view-user-cert) - (test . (fboundp 'ssl-view-user-cert)) - (type . "application/x-x509-user-cert")) - ("octet-stream" - (viewer . mailcap-save-binary-file) - (non-viewer . t) - (type . "application/octet-stream")) -;;; XEmacs says `ns' device-type not implemented. -;; ("dvi" -;; (viewer . "open %s") -;; (type . "application/dvi") -;; (test . (eq (mm-device-type) 'ns))) - ("dvi" - (viewer . "xdvi %s") - (test . (eq (mm-device-type) 'x)) - ("needsx11") - (type . "application/dvi")) - ("dvi" - (viewer . "dvitty %s") - (test . (not (getenv "DISPLAY"))) - (type . "application/dvi")) - ("emacs-lisp" - (viewer . mailcap-maybe-eval) - (type . "application/emacs-lisp")) - ("x-tar" - (viewer . mailcap-save-binary-file) - (non-viewer . t) - (type . "application/x-tar")) - ("x-latex" - (viewer . tex-mode) - (test . (fboundp 'tex-mode)) - (type . "application/x-latex")) - ("x-tex" - (viewer . tex-mode) - (test . (fboundp 'tex-mode)) - (type . "application/x-tex")) - ("latex" - (viewer . tex-mode) - (test . (fboundp 'tex-mode)) - (type . "application/latex")) - ("tex" - (viewer . tex-mode) - (test . (fboundp 'tex-mode)) - (type . "application/tex")) - ("texinfo" - (viewer . texinfo-mode) - (test . (fboundp 'texinfo-mode)) - (type . "application/tex")) - ("zip" - (viewer . mailcap-save-binary-file) - (non-viewer . t) - (type . "application/zip") - ("copiousoutput")) - ;; Prefer free viewers. - ("pdf" - (viewer . "gv %s") - (type . "application/pdf") - (test . window-system)) - ("pdf" - (viewer . "xpdf %s") - (type . "application/pdf") - (test . (eq (mm-device-type) 'x))) - ("pdf" - (viewer . "acroread %s") - (type . "application/pdf")) -;;; XEmacs says `ns' device-type not implemented. -;; ("postscript" -;; (viewer . "open %s") -;; (type . "application/postscript") -;; (test . (eq (mm-device-type) 'ns))) - ("postscript" - (viewer . "gv -safer %s") - (type . "application/postscript") - (test . window-system) - ("needsx11")) - ("postscript" - (viewer . "ghostview -dSAFER %s") - (type . "application/postscript") - (test . (eq (mm-device-type) 'x)) - ("needsx11")) - ("postscript" - (viewer . "ps2ascii %s") - (type . "application/postscript") - (test . (not (getenv "DISPLAY"))) - ("copiousoutput")) - ("sieve" - (viewer . sieve-mode) - (test . (fboundp 'sieve-mode)) - (type . "application/sieve"))) - ("audio" - ("x-mpeg" - (viewer . "maplay %s") - (type . "audio/x-mpeg")) - (".*" - (viewer . "showaudio") - (type . "audio/*"))) - ("message" - ("rfc-*822" - (viewer . mm-view-message) - (test . (and (featurep 'gnus) - (gnus-alive-p))) - (type . "message/rfc822")) - ("rfc-*822" - (viewer . vm-mode) - (test . (fboundp 'vm-mode)) - (type . "message/rfc822")) - ("rfc-*822" - (viewer . w3-mode) - (test . (fboundp 'w3-mode)) - (type . "message/rfc822")) - ("rfc-*822" - (viewer . view-mode) - (type . "message/rfc822"))) - ("image" - ("x-xwd" - (viewer . "xwud -in %s") - (type . "image/x-xwd") - ("compose" . "xwd -frame > %s") - (test . (eq (mm-device-type) 'x)) - ("needsx11")) - ("x11-dump" - (viewer . "xwud -in %s") - (type . "image/x-xwd") - ("compose" . "xwd -frame > %s") - (test . (eq (mm-device-type) 'x)) - ("needsx11")) - ("windowdump" - (viewer . "xwud -in %s") - (type . "image/x-xwd") - ("compose" . "xwd -frame > %s") - (test . (eq (mm-device-type) 'x)) - ("needsx11")) -;;; XEmacs says `ns' device-type not implemented. -;; (".*" -;; (viewer . "aopen %s") -;; (type . "image/*") -;; (test . (eq (mm-device-type) 'ns))) - (".*" - (viewer . "display %s") - (type . "image/*") - (test . (eq (mm-device-type) 'x)) - ("needsx11")) - (".*" - (viewer . "ee %s") - (type . "image/*") - (test . (eq (mm-device-type) 'x)) - ("needsx11"))) - ("text" - ("plain" - (viewer . w3-mode) - (test . (fboundp 'w3-mode)) - (type . "text/plain")) - ("plain" - (viewer . view-mode) - (test . (fboundp 'view-mode)) - (type . "text/plain")) - ("plain" - (viewer . fundamental-mode) - (type . "text/plain")) - ("enriched" - (viewer . enriched-decode-region) - (test . (fboundp 'enriched-decode)) - (type . "text/enriched")) - ("html" - (viewer . mm-w3-prepare-buffer) - (test . (fboundp 'w3-prepare-buffer)) - (type . "text/html"))) - ("video" - ("mpeg" - (viewer . "mpeg_play %s") - (type . "video/mpeg") - (test . (eq (mm-device-type) 'x)) - ("needsx11"))) - ("x-world" - ("x-vrml" - (viewer . "webspace -remote %s -URL %u") - (type . "x-world/x-vrml") - ("description" - "VRML document"))) - ("archive" - ("tar" - (viewer . tar-mode) - (type . "archive/tar") - (test . (fboundp 'tar-mode))))) - "The mailcap structure is an assoc list of assoc lists. -1st assoc list is keyed on the major content-type -2nd assoc list is keyed on the minor content-type (which can be a regexp) - -Which looks like: ------------------ - ((\"application\" - (\"postscript\" . )) - (\"text\" - (\"plain\" . ))) - -Where is another assoc list of the various information -related to the mailcap RFC 1524. This is keyed on the lowercase -attribute name (viewer, test, etc). This looks like: - ((viewer . VIEWERINFO) - (test . TESTINFO) - (xxxx . \"STRING\") - FLAG) - -Where VIEWERINFO specifies how the content-type is viewed. Can be -a string, in which case it is run through a shell, with -appropriate parameters, or a symbol, in which case the symbol is -`funcall'ed, with the buffer as an argument. - -TESTINFO is a test for the viewer's applicability, or nil. If nil, it -means the viewer is always valid. If it is a Lisp function, it is -called with a list of items from any extra fields from the -Content-Type header as argument to return a boolean value for the -validity. Otherwise, if it is a non-function Lisp symbol or list -whose car is a symbol, it is `eval'led to yield the validity. If it -is a string or list of strings, it represents a shell command to run -to return a true or false shell value for the validity.") - -(defcustom mailcap-download-directory nil - "*Directory to which `mailcap-save-binary-file' downloads files by default. -Nil means your home directory." - :type '(choice (const :tag "Home directory" nil) - directory) - :group 'mailcap) - -(defvar mailcap-poor-system-types - '(ms-dos ms-windows windows-nt win32 w32 mswindows) - "Systems that don't have a Unix-like directory hierarchy.") - -;;; -;;; Utility functions -;;; - -(defun mailcap-save-binary-file () - (goto-char (point-min)) - (unwind-protect - (let ((file (read-file-name - "Filename to save as: " - (or mailcap-download-directory "~/"))) - (require-final-newline nil)) - (write-region (point-min) (point-max) file)) - (kill-buffer (current-buffer)))) - -(defvar mailcap-maybe-eval-warning - "*** WARNING *** - -This MIME part contains untrusted and possibly harmful content. -If you evaluate the Emacs Lisp code contained in it, a lot of nasty -things can happen. Please examine the code very carefully before you -instruct Emacs to evaluate it. You can browse the buffer containing -the code using \\[scroll-other-window]. - -If you are unsure what to do, please answer \"no\"." - "Text of warning message displayed by `mailcap-maybe-eval'. -Make sure that this text consists only of few text lines. Otherwise, -Gnus might fail to display all of it.") - -(defun mailcap-maybe-eval () - "Maybe evaluate a buffer of Emacs Lisp code." - (let ((lisp-buffer (current-buffer))) - (goto-char (point-min)) - (when - (save-window-excursion - (delete-other-windows) - (let ((buffer (get-buffer-create (generate-new-buffer-name - "*Warning*")))) - (unwind-protect - (with-current-buffer buffer - (insert (substitute-command-keys - mailcap-maybe-eval-warning)) - (goto-char (point-min)) - (display-buffer buffer) - (yes-or-no-p "This is potentially dangerous emacs-lisp code, evaluate it? ")) - (kill-buffer buffer)))) - (eval-buffer (current-buffer))) - (when (buffer-live-p lisp-buffer) - (with-current-buffer lisp-buffer - (emacs-lisp-mode))))) - - -;;; -;;; The mailcap parser -;;; - -(defun mailcap-replace-regexp (regexp to-string) - ;; Quiet replace-regexp. - (goto-char (point-min)) - (while (re-search-forward regexp nil t) - (replace-match to-string t nil))) - -(defvar mailcap-parsed-p nil) - -(defun mailcap-parse-mailcaps (&optional path force) - "Parse out all the mailcaps specified in a path string PATH. -Components of PATH are separated by the `path-separator' character -appropriate for this system. If FORCE, re-parse even if already -parsed. If PATH is omitted, use the value of environment variable -MAILCAPS if set; otherwise (on Unix) use the path from RFC 1524, plus -/usr/local/etc/mailcap." - (interactive (list nil t)) - (when (or (not mailcap-parsed-p) - force) - (cond - (path nil) - ((getenv "MAILCAPS") (setq path (getenv "MAILCAPS"))) - ((memq system-type mailcap-poor-system-types) - (setq path '("~/.mailcap" "~/mail.cap" "~/etc/mail.cap"))) - (t (setq path - ;; This is per RFC 1524, specifically - ;; with /usr before /usr/local. - '("~/.mailcap" "/etc/mailcap" "/usr/etc/mailcap" - "/usr/local/etc/mailcap")))) - (let ((fnames (reverse - (if (stringp path) - (delete "" (split-string path path-separator)) - path))) - fname) - (while fnames - (setq fname (car fnames)) - (if (and (file-readable-p fname) - (file-regular-p fname)) - (mailcap-parse-mailcap fname)) - (setq fnames (cdr fnames)))) - (setq mailcap-parsed-p t))) - -(defun mailcap-parse-mailcap (fname) - "Parse out the mailcap file specified by FNAME." - (let (major ; The major mime type (image/audio/etc) - minor ; The minor mime type (gif, basic, etc) - save-pos ; Misc saved positions used in parsing - viewer ; How to view this mime type - info ; Misc info about this mime type - ) - (with-temp-buffer - (insert-file-contents fname) - (set-syntax-table mailcap-parse-args-syntax-table) - (mailcap-replace-regexp "#.*" "") ; Remove all comments - (mailcap-replace-regexp "\\\\[ \t]*\n" " ") ; And collapse spaces - (mailcap-replace-regexp "\n+" "\n") ; And blank lines - (goto-char (point-max)) - (skip-chars-backward " \t\n") - (delete-region (point) (point-max)) - (while (not (bobp)) - (skip-chars-backward " \t\n") - (beginning-of-line) - (setq save-pos (point) - info nil) - (skip-chars-forward "^/; \t\n") - (downcase-region save-pos (point)) - (setq major (buffer-substring save-pos (point))) - (skip-chars-forward " \t") - (setq minor "") - (when (eq (char-after) ?/) - (forward-char) - (skip-chars-forward " \t") - (setq save-pos (point)) - (skip-chars-forward "^; \t\n") - (downcase-region save-pos (point)) - (setq minor - (cond - ((eq ?* (or (char-after save-pos) 0)) ".*") - ((= (point) save-pos) ".*") - (t (regexp-quote (buffer-substring save-pos (point))))))) - (skip-chars-forward " \t") - ;;; Got the major/minor chunks, now for the viewers/etc - ;;; The first item _must_ be a viewer, according to the - ;;; RFC for mailcap files (#1524) - (setq viewer "") - (when (eq (char-after) ?\;) - (forward-char) - (skip-chars-forward " \t") - (setq save-pos (point)) - (skip-chars-forward "^;\n") - ;; skip \; - (while (eq (char-before) ?\\) - (backward-delete-char 1) - (forward-char) - (skip-chars-forward "^;\n")) - (if (eq (or (char-after save-pos) 0) ?') - (setq viewer (progn - (narrow-to-region (1+ save-pos) (point)) - (goto-char (point-min)) - (prog1 - (read (current-buffer)) - (goto-char (point-max)) - (widen)))) - (setq viewer (buffer-substring save-pos (point))))) - (setq save-pos (point)) - (end-of-line) - (unless (equal viewer "") - (setq info (nconc (list (cons 'viewer viewer) - (cons 'type (concat major "/" - (if (string= minor ".*") - "*" minor)))) - (mailcap-parse-mailcap-extras save-pos (point)))) - (mailcap-mailcap-entry-passes-test info) - (mailcap-add-mailcap-entry major minor info)) - (beginning-of-line))))) - -(defun mailcap-parse-mailcap-extras (st nd) - "Grab all the extra stuff from a mailcap entry." - (let ( - name ; From name= - value ; its value - results ; Assoc list of results - name-pos ; Start of XXXX= position - val-pos ; Start of value position - done ; Found end of \'d ;s? - ) - (save-restriction - (narrow-to-region st nd) - (goto-char (point-min)) - (skip-chars-forward " \n\t;") - (while (not (eobp)) - (setq done nil) - (setq name-pos (point)) - (skip-chars-forward "^ \n\t=;") - (downcase-region name-pos (point)) - (setq name (buffer-substring name-pos (point))) - (skip-chars-forward " \t\n") - (if (not (eq (char-after (point)) ?=)) ; There is no value - (setq value t) - (skip-chars-forward " \t\n=") - (setq val-pos (point)) - (if (memq (char-after val-pos) '(?\" ?')) - (progn - (setq val-pos (1+ val-pos)) - (condition-case nil - (progn - (forward-sexp 1) - (backward-char 1)) - (error (goto-char (point-max))))) - (while (not done) - (skip-chars-forward "^;") - (if (eq (char-after (1- (point))) ?\\ ) - (progn - (subst-char-in-region (1- (point)) (point) ?\\ ? ) - (skip-chars-forward ";")) - (setq done t)))) - (setq value (buffer-substring val-pos (point)))) - (setq results (cons (cons name value) results)) - (skip-chars-forward " \";\n\t")) - results))) - -(defun mailcap-mailcap-entry-passes-test (info) - "Return non-nil iff mailcap entry INFO passes its test clause. -Also return non-nil if no test clause is present." - (let ((test (assq 'test info)) ; The test clause - status) - (setq status (and test (split-string (cdr test) " "))) - (if (and (or (assoc "needsterm" info) - (assoc "needsterminal" info) - (assoc "needsx11" info)) - (not (getenv "DISPLAY"))) - (setq status nil) - (cond - ((and (equal (nth 0 status) "test") - (equal (nth 1 status) "-n") - (or (equal (nth 2 status) "$DISPLAY") - (equal (nth 2 status) "\"$DISPLAY\""))) - (setq status (if (getenv "DISPLAY") t nil))) - ((and (equal (nth 0 status) "test") - (equal (nth 1 status) "-z") - (or (equal (nth 2 status) "$DISPLAY") - (equal (nth 2 status) "\"$DISPLAY\""))) - (setq status (if (getenv "DISPLAY") nil t))) - (test nil) - (t nil))) - (and test (listp test) (setcdr test status)))) - -;;; -;;; The action routines. -;;; - -(defun mailcap-possible-viewers (major minor) - "Return a list of possible viewers from MAJOR for minor type MINOR." - (let ((exact '()) - (wildcard '())) - (while major - (cond - ((equal (car (car major)) minor) - (setq exact (cons (cdr (car major)) exact))) - ((and minor (string-match (concat "^" (car (car major)) "$") minor)) - (setq wildcard (cons (cdr (car major)) wildcard)))) - (setq major (cdr major))) - (nconc exact wildcard))) - -(defun mailcap-unescape-mime-test (test type-info) - (let (save-pos save-chr subst) - (cond - ((symbolp test) test) - ((and (listp test) (symbolp (car test))) test) - ((or (stringp test) - (and (listp test) (stringp (car test)) - (setq test (mapconcat 'identity test " ")))) - (with-temp-buffer - (insert test) - (goto-char (point-min)) - (while (not (eobp)) - (skip-chars-forward "^%") - (if (/= (- (point) - (progn (skip-chars-backward "\\\\") - (point))) - 0) ; It is an escaped % - (progn - (delete-char 1) - (skip-chars-forward "%.")) - (setq save-pos (point)) - (skip-chars-forward "%") - (setq save-chr (char-after (point))) - ;; Escapes: - ;; %s: name of a file for the body data - ;; %t: content-type - ;; %{ -;; Lars Magne Ingebrigtsen -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; Send mail using mh-e. - -;; The following mh-e interface is all cooperative works of -;; tanaka@flab.fujitsu.CO.JP (TANAKA Hiroshi), kawabe@sra.CO.JP -;; (Yoshikatsu Kawabe), and shingu@casund.cpr.canon.co.jp (Toshiaki -;; SHINGU). - -;;; Code: - -(require 'gnus) -(require 'mh-e) -(require 'mh-comp) -(require 'gnus-msg) -(require 'gnus-sum) - -(eval-when-compile - (defvar mh-lib-progs)) - -(defun gnus-summary-save-article-folder (&optional arg) - "Append the current article to an mh folder. -If N is a positive number, save the N next articles. -If N is a negative number, save the N previous articles. -If N is nil and any articles have been marked with the process mark, -save those articles instead." - (interactive "P") - (require 'gnus-art) - (let ((gnus-default-article-saver 'gnus-summary-save-in-folder)) - (gnus-summary-save-article arg))) - -(defun gnus-summary-save-in-folder (&optional folder) - "Save this article to MH folder (using `rcvstore' in MH library). -Optional argument FOLDER specifies folder name." - ;; Thanks to yuki@flab.Fujitsu.JUNET and ohm@kaba.junet. - (mh-find-path) - (let ((folder - (cond ((and (eq folder 'default) - gnus-newsgroup-last-folder) - gnus-newsgroup-last-folder) - (folder folder) - (t (mh-prompt-for-folder - "Save article in" - (funcall gnus-folder-save-name gnus-newsgroup-name - gnus-current-headers gnus-newsgroup-last-folder) - t)))) - (errbuf (gnus-get-buffer-create " *Gnus rcvstore*")) - ;; Find the rcvstore program. - (exec-path (cond - ((and (boundp 'mh-lib-progs) mh-lib-progs) - (cons mh-lib-progs exec-path)) - (mh-lib (cons mh-lib exec-path)) - (t exec-path)))) - (with-current-buffer gnus-original-article-buffer - (save-restriction - (widen) - (unwind-protect - (call-process-region - (point-min) (point-max) "rcvstore" nil errbuf nil folder) - (set-buffer errbuf) - (if (zerop (buffer-size)) - (message "Article saved in folder: %s" folder) - (message "%s" (buffer-string))) - (kill-buffer errbuf)))) - (setq gnus-newsgroup-last-folder folder))) - -(defun gnus-Folder-save-name (newsgroup headers &optional last-folder) - "Generate folder name from NEWSGROUP, HEADERS, and optional LAST-FOLDER. -If variable `gnus-use-long-file-name' is nil, it is +News.group. -Otherwise, it is like +news/group." - (or last-folder - (concat "+" - (if gnus-use-long-file-name - (gnus-capitalize-newsgroup newsgroup) - (gnus-newsgroup-directory-form newsgroup))))) - -(defun gnus-folder-save-name (newsgroup headers &optional last-folder) - "Generate folder name from NEWSGROUP, HEADERS, and optional LAST-FOLDER. -If variable `gnus-use-long-file-name' is nil, it is +news.group. -Otherwise, it is like +news/group." - (or last-folder - (concat "+" - (if gnus-use-long-file-name - newsgroup - (gnus-newsgroup-directory-form newsgroup))))) - -(provide 'gnus-mh) - -;;; gnus-mh.el ends here diff --git a/lisp/gnus-ml.el b/lisp/gnus-ml.el deleted file mode 100644 index 6bd3e2d..0000000 --- a/lisp/gnus-ml.el +++ /dev/null @@ -1,201 +0,0 @@ -;;; gnus-ml.el --- Mailing list minor mode for Gnus - -;; Copyright (C) 2000 Free Software Foundation, Inc. - -;; Author: Julien Gilles -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;; implement (small subset of) RFC 2369 - -;;; Code: - -(require 'gnus) -(require 'gnus-msg) -(eval-when-compile (require 'cl)) - -;;; Mailing list minor mode - -(defvar gnus-mailing-list-mode nil - "Minor mode for providing mailing-list commands.") - -(defvar gnus-mailing-list-mode-map nil) - -(defvar gnus-mailing-list-menu) - -(unless gnus-mailing-list-mode-map - (setq gnus-mailing-list-mode-map (make-sparse-keymap)) - - (gnus-define-keys gnus-mailing-list-mode-map - "\C-c\C-nh" gnus-mailing-list-help - "\C-c\C-ns" gnus-mailing-list-subscribe - "\C-c\C-nu" gnus-mailing-list-unsubscribe - "\C-c\C-np" gnus-mailing-list-post - "\C-c\C-no" gnus-mailing-list-owner - "\C-c\C-na" gnus-mailing-list-archive - )) - -(defun gnus-mailing-list-make-menu-bar () - (unless (boundp 'gnus-mailing-list-menu) - (easy-menu-define - gnus-mailing-list-menu gnus-mailing-list-mode-map "" - '("Mailing-Lists" - ["Get help" gnus-mailing-list-help t] - ["Subscribe" gnus-mailing-list-subscribe t] - ["Unsubscribe" gnus-mailing-list-unsubscribe t] - ["Post a message" gnus-mailing-list-post t] - ["Mail to owner" gnus-mailing-list-owner t] - ["Browse archive" gnus-mailing-list-archive t])))) - -;;;###autoload -(defun turn-on-gnus-mailing-list-mode () - (when (gnus-group-find-parameter gnus-newsgroup-name 'to-list) - (gnus-mailing-list-mode 1))) - -;;;###autoload -(defun gnus-mailing-list-insinuate (&optional force) - "Setup group parameters from List-Post header. -If FORCE is non-nil, replace the old ones." - (interactive "P") - (let ((list-post - (with-current-buffer gnus-original-article-buffer - (gnus-fetch-field "list-post")))) - (if list-post - (if (and (not force) - (gnus-group-get-parameter gnus-newsgroup-name 'to-list)) - (gnus-message 1 "to-list is non-nil.") - (if (string-match "]*\\)>" list-post) - (setq list-post (match-string 1 list-post))) - (gnus-group-add-parameter gnus-newsgroup-name - (cons 'to-list list-post)) - (gnus-mailing-list-mode 1)) - (gnus-message 1 "no list-post in this message.")))) - -;;;###autoload -(defun gnus-mailing-list-mode (&optional arg) - "Minor mode for providing mailing-list commands. - -\\{gnus-mailing-list-mode-map}" - (interactive "P") - (when (eq major-mode 'gnus-summary-mode) - (when (set (make-local-variable 'gnus-mailing-list-mode) - (if (null arg) (not gnus-mailing-list-mode) - (> (prefix-numeric-value arg) 0))) - ;; Set up the menu. - (when (gnus-visual-p 'mailing-list-menu 'menu) - (gnus-mailing-list-make-menu-bar)) - (gnus-add-minor-mode 'gnus-mailing-list-mode " Mailing-List" gnus-mailing-list-mode-map) - (gnus-run-hooks 'gnus-mailing-list-mode-hook)))) - -;;; Commands - -(defun gnus-mailing-list-help () - "Get help from mailing list server." - (interactive) - (let ((list-help - (with-current-buffer gnus-original-article-buffer - (gnus-fetch-field "list-help")))) - (cond (list-help (gnus-mailing-list-message list-help)) - (t (gnus-message 1 "no list-help in this group"))))) - -(defun gnus-mailing-list-subscribe () - "Subscribe" - (interactive) - (let ((list-subscribe - (with-current-buffer gnus-original-article-buffer - (gnus-fetch-field "list-subscribe")))) - (cond (list-subscribe (gnus-mailing-list-message list-subscribe)) - (t (gnus-message 1 "no list-subscribe in this group"))))) - -(defun gnus-mailing-list-unsubscribe () - "Unsubscribe" - (interactive) - (let ((list-unsubscribe - (with-current-buffer gnus-original-article-buffer - (gnus-fetch-field "list-unsubscribe")))) - (cond (list-unsubscribe (gnus-mailing-list-message list-unsubscribe)) - (t (gnus-message 1 "no list-unsubscribe in this group"))))) - -(defun gnus-mailing-list-post () - "Post message (really useful ?)" - (interactive) - (let ((list-post - (with-current-buffer gnus-original-article-buffer - (gnus-fetch-field "list-post")))) - (cond (list-post (gnus-mailing-list-message list-post)) - (t (gnus-message 1 "no list-post in this group"))))) - -(defun gnus-mailing-list-owner () - "Mail to the owner" - (interactive) - (let ((list-owner - (with-current-buffer gnus-original-article-buffer - (gnus-fetch-field "list-owner")))) - (cond (list-owner (gnus-mailing-list-message list-owner)) - (t (gnus-message 1 "no list-owner in this group"))))) - -(defun gnus-mailing-list-archive () - "Browse archive" - (interactive) - (require 'browse-url) - (let ((list-archive - (with-current-buffer gnus-original-article-buffer - (gnus-fetch-field "list-archive")))) - (cond (list-archive - (if (string-match "<\\(http:[^>]*\\)>" list-archive) - (browse-url (match-string 1 list-archive)) - (browse-url list-archive))) - (t (gnus-message 1 "no list-archive in this group"))))) - -;;; Utility functions - -(defun gnus-mailing-list-message (address) - "" - (let ((mailto "") - (to ()) - (subject "None") - (body "") - ) - (cond - ((string-match "]*\\)>" address) - (let ((args (match-string 1 address))) - (cond ; with param - ((string-match "\\(.*\\)\\?\\(.*\\)" args) - (setq mailto (match-string 1 args)) - (let ((param (match-string 2 args))) - (if (string-match "subject=\\([^&]*\\)" param) - (setq subject (match-string 1 param))) - (if (string-match "body=\\([^&]*\\)" param) - (setq body (match-string 1 param))) - (if (string-match "to=\\([^&]*\\)" param) - (push (match-string 1 param) to)) - )) - (t (setq mailto args))))) ; without param - - ; other case -;; Keywords: news, mail - -;; This program 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 program 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 this program; see the file COPYING. If not, write to -;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) -(require 'gnus) -(require 'gnus-sum) -(require 'gnus-group) -(require 'nnmail) - -(defvar gnus-group-split-updated-hook nil - "Hook called just after nnmail-split-fancy is updated by -gnus-group-split-update.") - -(defvar gnus-group-split-default-catch-all-group "mail.misc" - "Group name (or arbitrary fancy split) with default splitting rules. -Used by gnus-group-split and gnus-group-split-update as a fallback -split, in case none of the group-based splits matches.") - -;;;###autoload -(defun gnus-group-split-setup (&optional auto-update catch-all) - "Set up the split for nnmail-split-fancy. -Sets things up so that nnmail-split-fancy is used for mail -splitting, and defines the variable nnmail-split-fancy according with -group parameters. - -If AUTO-UPDATE is non-nil (prefix argument accepted, if called -interactively), it makes sure nnmail-split-fancy is re-computed before -getting new mail, by adding gnus-group-split-update to -nnmail-pre-get-new-mail-hook. - -A non-nil CATCH-ALL replaces the current value of -gnus-group-split-default-catch-all-group. This variable is only used -by gnus-group-split-update, and only when its CATCH-ALL argument is -nil. This argument may contain any fancy split, that will be added as -the last split in a `|' split produced by gnus-group-split-fancy, -unless overridden by any group marked as a catch-all group. Typical -uses are as simple as the name of a default mail group, but more -elaborate fancy splits may also be useful to split mail that doesn't -match any of the group-specified splitting rules. See -gnus-group-split-fancy for details." - (interactive "P") - (setq nnmail-split-methods 'nnmail-split-fancy) - (when catch-all - (setq gnus-group-split-default-catch-all-group catch-all)) - (gnus-group-split-update) - (when auto-update - (add-hook 'nnmail-pre-get-new-mail-hook 'gnus-group-split-update))) - -;;;###autoload -(defun gnus-group-split-update (&optional catch-all) - "Computes nnmail-split-fancy from group params and CATCH-ALL, by -calling (gnus-group-split-fancy nil nil CATCH-ALL). - -If CATCH-ALL is nil, gnus-group-split-default-catch-all-group is used -instead. This variable is set by gnus-group-split-setup." - (interactive) - (setq nnmail-split-fancy - (gnus-group-split-fancy - nil (null nnmail-crosspost) - (or catch-all gnus-group-split-default-catch-all-group))) - (run-hooks 'gnus-group-split-updated-hook)) - -;;;###autoload -(defun gnus-group-split () - "Uses information from group parameters in order to split mail. -See gnus-group-split-fancy for more information. - -gnus-group-split is a valid value for nnmail-split-methods." - (let (nnmail-split-fancy) - (gnus-group-split-update) - (nnmail-split-fancy))) - -;;;###autoload -(defun gnus-group-split-fancy - (&optional groups no-crosspost catch-all) - "Uses information from group parameters in order to split mail. It -can be embedded into nnmail-split-fancy lists with the SPLIT - -\(: gnus-group-split-fancy GROUPS NO-CROSSPOST CATCH-ALL\) - -GROUPS may be a regular expression or a list of group names, that will -be used to select candidate groups. If it is ommited or nil, all -existing groups are considered. - -if NO-CROSSPOST is ommitted or nil, a & split will be returned, -otherwise, a | split, that does not allow crossposting, will be -returned. - -For each selected group, a SPLIT is composed like this: if SPLIT-SPEC -is specified, this split is returned as-is (unless it is nil: in this -case, the group is ignored). Otherwise, if TO-ADDRESS, TO-LIST and/or -EXTRA-ALIASES are specified, a regexp that matches any of them is -constructed (extra-aliases may be a list). Additionally, if -SPLIT-REGEXP is specified, the regexp will be extended so that it -matches this regexp too, and if SPLIT-EXCLUDE is specified, RESTRICT -clauses will be generated. - -If CATCH-ALL is nil, no catch-all handling is performed, regardless of -catch-all marks in group parameters. Otherwise, if there is no -selected group whose SPLIT-REGEXP matches the empty string, nor is -there a selected group whose SPLIT-SPEC is 'catch-all, this fancy -split (say, a group name) will be appended to the returned SPLIT list, -as the last element of a '| SPLIT. - -For example, given the following group parameters: - -nnml:mail.bar: -\((to-address . \"bar@femail.com\") - (split-regexp . \".*@femail\\\\.com\")) -nnml:mail.foo: -\((to-list . \"foo@nowhere.gov\") - (extra-aliases \"foo@localhost\" \"foo-redist@home\") - (split-exclude \"bugs-foo\" \"rambling-foo\") - (admin-address . \"foo-request@nowhere.gov\")) -nnml:mail.others: -\((split-spec . catch-all)) - -Calling (gnus-group-split-fancy nil nil \"mail.misc\") returns: - -\(| (& (any \"\\\\(bar@femail\\\\.com\\\\|.*@femail\\\\.com\\\\)\" - \"mail.bar\") - (any \"\\\\(foo@nowhere\\\\.gov\\\\|foo@localhost\\\\|foo-redist@home\\\\)\" - - \"bugs-foo\" - \"rambling-foo\" \"mail.foo\")) - \"mail.others\")" - (let* ((newsrc (cdr gnus-newsrc-alist)) - split) - (dolist (info newsrc) - (let ((group (gnus-info-group info)) - (params (gnus-info-params info))) - ;; For all GROUPs that match the specified GROUPS - (when (or (not groups) - (and (listp groups) - (memq group groups)) - (and (stringp groups) - (string-match groups group))) - (let ((split-spec (assoc 'split-spec params)) group-clean) - ;; Remove backend from group name - (setq group-clean (string-match ":" group)) - (setq group-clean - (if group-clean - (substring group (1+ group-clean)) - group)) - (if split-spec - (when (setq split-spec (cdr split-spec)) - (if (eq split-spec 'catch-all) - ;; Emit catch-all only when requested - (when catch-all - (setq catch-all group-clean)) - ;; Append split-spec to the main split - (push split-spec split))) - ;; Let's deduce split-spec from other params - (let ((to-address (cdr (assoc 'to-address params))) - (to-list (cdr (assoc 'to-list params))) - (extra-aliases (cdr (assoc 'extra-aliases params))) - (split-regexp (cdr (assoc 'split-regexp params))) - (split-exclude (cdr (assoc 'split-exclude params)))) - (when (or to-address to-list extra-aliases split-regexp) - ;; regexp-quote to-address, to-list and extra-aliases - ;; and add them all to split-regexp - (setq split-regexp - (concat - "\\(" - (mapconcat - 'identity - (append - (and to-address (list (regexp-quote to-address))) - (and to-list (list (regexp-quote to-list))) - (and extra-aliases - (if (listp extra-aliases) - (mapcar 'regexp-quote extra-aliases) - (list extra-aliases))) - (and split-regexp (list split-regexp))) - "\\|") - "\\)")) - ;; Now create the new SPLIT - (push (append - (list 'any split-regexp) - ;; Generate RESTRICTs for SPLIT-EXCLUDEs. - (if (listp split-exclude) - (apply #'append - (mapcar (lambda (arg) (list '- arg)) - split-exclude)) - (list '- split-exclude)) - (list group-clean)) - split) - ;; If it matches the empty string, it is a catch-all - (when (string-match split-regexp "") - (setq catch-all nil))))))))) - ;; Add catch-all if not crossposting - (if (and catch-all no-crosspost) - (push catch-all split)) - ;; Move it to the tail, while arranging that SPLITs appear in the - ;; same order as groups. - (setq split (reverse split)) - ;; Decide whether to accept cross-postings or not. - (push (if no-crosspost '| '&) split) - ;; Even if we can cross-post, catch-all should not get - ;; cross-posts. - (if (and catch-all (not no-crosspost)) - (setq split (list '| split catch-all))) - split)) - -(provide 'gnus-mlspl) - -;;; gnus-mlspl.el ends here diff --git a/lisp/gnus-move.el b/lisp/gnus-move.el deleted file mode 100644 index 36839c8..0000000 --- a/lisp/gnus-move.el +++ /dev/null @@ -1,185 +0,0 @@ -;;; gnus-move.el --- commands for moving Gnus from one server to another -;; Copyright (C) 1996, 1997, 1998, 1999, 2000 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) - -(require 'gnus) -(require 'gnus-start) -(require 'gnus-int) -(require 'gnus-range) - -;;; -;;; Moving by comparing Message-ID's. -;;; - -;;;###autoload -(defun gnus-change-server (from-server to-server) - "Move from FROM-SERVER to TO-SERVER. -Update the .newsrc.eld file to reflect the change of nntp server." - (interactive - (list gnus-select-method (gnus-read-method "Move to method: "))) - - ;; First start Gnus. - (let ((gnus-activate-level 0) - (mail-sources nil) - (nnmail-spool-file nil)) - (gnus)) - - (save-excursion - ;; Go through all groups and translate. - (let ((newsrc gnus-newsrc-alist) - (nntp-nov-gap nil) - info) - (while (setq info (pop newsrc)) - (when (gnus-group-native-p (gnus-info-group info)) - (gnus-move-group-to-server info from-server to-server)))))) - -(defun gnus-move-group-to-server (info from-server to-server) - "Move group INFO from FROM-SERVER to TO-SERVER." - (let ((group (gnus-info-group info)) - to-active hashtb type mark marks - to-article to-reads to-marks article - act-articles) - (gnus-message 7 "Translating %s..." group) - (when (gnus-request-group group nil to-server) - (setq to-active (gnus-parse-active) - hashtb (gnus-make-hashtable 1024) - act-articles (gnus-uncompress-range to-active)) - ;; Fetch the headers from the `to-server'. - (when (and to-active - act-articles - (setq type (gnus-retrieve-headers - act-articles - group to-server))) - ;; Convert HEAD headers. I don't care. - (when (eq type 'headers) - (nnvirtual-convert-headers)) - ;; Create a mapping from Message-ID to article number. - (set-buffer nntp-server-buffer) - (goto-char (point-min)) - (while (looking-at - "^[0-9]+\t[^\t]*\t[^\t]*\t[^\t]*\t\\([^\t]*\\)\t") - (gnus-sethash - (buffer-substring (match-beginning 1) (match-end 1)) - (read (current-buffer)) - hashtb) - (forward-line 1)) - ;; Then we read the headers from the `from-server'. - (when (and (gnus-request-group group nil from-server) - (gnus-active group) - (gnus-uncompress-range - (gnus-active group)) - (setq type (gnus-retrieve-headers - (gnus-uncompress-range - (gnus-active group)) - group from-server))) - ;; Make it easier to map marks. - (let ((mark-lists (gnus-info-marks info)) - ms type m) - (while mark-lists - (setq type (caar mark-lists) - ms (gnus-uncompress-range (cdr (pop mark-lists)))) - (while ms - (if (setq m (assq (car ms) marks)) - (setcdr m (cons type (cdr m))) - (push (list (car ms) type) marks)) - (pop ms)))) - ;; Convert. - (when (eq type 'headers) - (nnvirtual-convert-headers)) - ;; Go through the headers and map away. - (set-buffer nntp-server-buffer) - (goto-char (point-min)) - (while (looking-at - "^[0-9]+\t[^\t]*\t[^\t]*\t[^\t]*\t\\([^\t]*\\)\t") - (when (setq to-article - (gnus-gethash - (buffer-substring (match-beginning 1) (match-end 1)) - hashtb)) - ;; Add this article to the list of read articles. - (push to-article to-reads) - ;; See if there are any marks and then add them. - (when (setq mark (assq (read (current-buffer)) marks)) - (setq marks (delq mark marks)) - (setcar mark to-article) - (push mark to-marks)) - (forward-line 1))) - ;; Now we know what the read articles are and what the - ;; article marks are. We transform the information - ;; into the Gnus info format. - (setq to-reads - (gnus-range-add - (gnus-compress-sequence - (and (setq to-reads (delq nil to-reads)) - (sort to-reads '<)) - t) - (cons 1 (1- (car to-active))))) - (gnus-info-set-read info to-reads) - ;; Do the marks. I'm sure y'all understand what's - ;; going on down below, so I won't bother with any - ;; further comments. - (let ((mlists gnus-article-mark-lists) - lists ms a) - (while mlists - (push (list (cdr (pop mlists))) lists)) - (while (setq ms (pop marks)) - (setq article (pop ms)) - (while ms - (setcdr (setq a (assq (pop ms) lists)) - (cons article (cdr a))))) - (setq a lists) - (while a - (setcdr (car a) (gnus-compress-sequence - (and (cdar a) (sort (cdar a) '<)))) - (pop a)) - (gnus-info-set-marks info lists t))))) - (gnus-message 7 "Translating %s...done" group))) - -(defun gnus-group-move-group-to-server (info from-server to-server) - "Move the group on the current line from FROM-SERVER to TO-SERVER." - (interactive - (let ((info (gnus-get-info (gnus-group-group-name)))) - (list info (gnus-find-method-for-group (gnus-info-group info)) - (gnus-read-method (format "Move group %s to method: " - (gnus-info-group info)))))) - (save-excursion - (gnus-move-group-to-server info from-server to-server) - ;; We have to update the group info to point use the right server. - (gnus-info-set-method info to-server t) - ;; We also have to change the name of the group and stuff. - (let* ((group (gnus-info-group info)) - (new-name (gnus-group-prefixed-name - (gnus-group-real-name group) to-server))) - (gnus-info-set-group info new-name) - (gnus-sethash new-name (gnus-gethash group gnus-newsrc-hashtb) - gnus-newsrc-hashtb) - (gnus-sethash group nil gnus-newsrc-hashtb)))) - -(provide 'gnus-move) - -;;; gnus-move.el ends here diff --git a/lisp/gnus-msg.el b/lisp/gnus-msg.el deleted file mode 100644 index ad0fef6..0000000 --- a/lisp/gnus-msg.el +++ /dev/null @@ -1,1681 +0,0 @@ -;;; gnus-msg.el --- mail and post interface for Semi-gnus -;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001 -;; Free Software Foundation, Inc. - -;; Author: Masanobu UMEDA -;; Lars Magne Ingebrigtsen -;; MORIOKA Tomohiko -;; Shuhei KOBAYASHI -;; Katsumi Yamaoka -;; Kiyokazu SUTO -;; Keywords: mail, news, MIME - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) -(eval-when-compile (require 'static)) - -(require 'gnus) -(require 'gnus-ems) -(require 'message) -(require 'gnus-art) - -(defcustom gnus-post-method 'current - "*Preferred method for posting USENET news. - -If this variable is `current' (which is the default), Gnus will use -the \"current\" select method when posting. If it is nil, Gnus will -use the native select method when posting. - -This method will not be used in mail groups and the like, only in -\"real\" newsgroups. - -If not nil nor `native', the value must be a valid method as discussed -in the documentation of `gnus-select-method'. It can also be a list of -methods. If that is the case, the user will be queried for what select -method to use when posting." - :group 'gnus-group-foreign - :type `(choice (const nil) - (const current) - (const native) - (sexp :tag "Methods" ,gnus-select-method))) - -(defcustom gnus-outgoing-message-group nil - "*All outgoing messages will be put in this group. -If you want to store all your outgoing mail and articles in the group -\"nnml:archive\", you set this variable to that value. This variable -can also be a list of group names. - -If you want to have greater control over what group to put each -message in, you can set this variable to a function that checks the -current newsgroup name and then returns a suitable group name (or list -of names)." - :group 'gnus-message - :type '(choice (string :tag "Group") - (function))) - -(defcustom gnus-mailing-list-groups nil - "*Regexp matching groups that are really mailing lists. -This is useful when you're reading a mailing list that has been -gatewayed to a newsgroup, and you want to followup to an article in -the group." - :group 'gnus-message - :type 'regexp) - -(defcustom gnus-add-to-list nil - "*If non-nil, add a `to-list' parameter automatically." - :group 'gnus-message - :type 'boolean) - -(defcustom gnus-crosspost-complaint - "Hi, - -You posted the article below with the following Newsgroups header: - -Newsgroups: %s - -The %s group, at least, was an inappropriate recipient -of this message. Please trim your Newsgroups header to exclude this -group before posting in the future. - -Thank you. - -" - "Format string to be inserted when complaining about crossposts. -The first %s will be replaced by the Newsgroups header; -the second with the current group name." - :group 'gnus-message - :type 'string) - -(defcustom gnus-message-setup-hook '(gnus-maybe-setup-default-charset) - "Hook run after setting up a message buffer." - :group 'gnus-message - :type 'hook) - -(defcustom gnus-bug-create-help-buffer t - "*Should we create the *Gnus Help Bug* buffer?" - :group 'gnus-message - :type 'boolean) - -(defcustom gnus-posting-styles nil - "*Alist of styles to use when posting." - :group 'gnus-message - :type '(repeat (cons (choice (regexp) - (function) - (variable) - (sexp)) - (repeat (list - (choice (const signature) - (const signature-file) - (const organization) - (const address) - (const name) - (const body) - (string :tag "Header")) - (choice (string) - (function) - (variable) - (sexp))))))) - -(defcustom gnus-inews-mark-gcc-as-read nil - "If non-nil, automatically mark Gcc articles as read." - :group 'gnus-message - :type 'boolean) - -(defcustom gnus-group-posting-charset-alist - '(("^\\(no\\|fr\\)\\.[^,]*\\(,[ \t\n]*\\(no\\|fr\\)\\.[^,]*\\)*$" iso-8859-1 (iso-8859-1)) - ("^\\(fido7\\|relcom\\)\\.[^,]*\\(,[ \t\n]*\\(fido7\\|relcom\\)\\.[^,]*\\)*$" koi8-r (koi8-r)) - (message-this-is-mail nil nil) - (message-this-is-news nil t)) - "Alist of regexps and permitted unencoded charsets for posting. -Each element of the alist has the form (TEST HEADER BODY-LIST), where -TEST is either a regular expression matching the newsgroup header or a -variable to query, -HEADER is the charset which may be left unencoded in the header (nil -means encode all charsets), -BODY-LIST is a list of charsets which may be encoded using 8bit -content-transfer encoding in the body, or one of the special values -nil (always encode using quoted-printable) or t (always use 8bit). - -Note that any value other than nil for HEADER infringes some RFCs, so -use this option with care." - :type '(repeat (list :tag "Permitted unencoded charsets" - (choice :tag "Where" - (regexp :tag "Group") - (const :tag "Mail message" - :value message-this-is-mail) - (const :tag "News article" - :value message-this-is-news)) - (choice :tag "Header" - (const :tag "None" nil) - (symbol :tag "Charset")) - (choice :tag "Body" - (const :tag "Any" :value t) - (const :tag "None" :value nil) - (repeat :tag "Charsets" - (symbol :tag "Charset"))))) - :group 'gnus-charset) - -;;; Internal variables. - -(defvar gnus-inhibit-posting-styles nil - "Inhibit the use of posting styles.") - -(defvar gnus-message-buffer "*Mail Gnus*") -(defvar gnus-article-copy nil) -(defvar gnus-check-before-posting nil) -(defvar gnus-last-posting-server nil) -(defvar gnus-message-group-art nil) - -(defvar gnus-msg-force-broken-reply-to nil) - -(defconst gnus-bug-message - (format "Sending a bug report to the Gnus Towers. -======================================== - -This gnus is the %s%s. -If you think the bug is a Semi-gnus bug, send a bug report to Semi-gnus -Developers. (the addresses below are mailing list addresses) - -======================================== - -The buffer below is a mail buffer. When you press `C-c C-c', it will -be sent to the Gnus Bug Exterminators. - -The thing near the bottom of the buffer is how the environment -settings will be included in the mail. Please do not delete that. -They will tell the Bug People what your environment is, so that it -will be easier to locate the bugs. - -If you have found a bug that makes Emacs go \"beep\", set -debug-on-error to t (`M-x set-variable RET debug-on-error RET t RET') -and include the backtrace in your bug report. - -Please describe the bug in annoying, painstaking detail. - -Thank you for your help in stamping out bugs. -" - gnus-product-name - (if (string= gnus-product-name "Semi-gnus") - "" - ", a modified version of Semi-gnus"))) - -(eval-and-compile - (autoload 'gnus-uu-post-news "gnus-uu" nil t) - (autoload 'news-setup "rnewspost") - (autoload 'news-reply-mode "rnewspost") - (autoload 'rmail-dont-reply-to "mail-utils") - (autoload 'rmail-output "rmailout")) - - -;;; -;;; Gnus Posting Functions -;;; - -(gnus-define-keys (gnus-summary-send-map "S" gnus-summary-mode-map) - "p" gnus-summary-post-news - "f" gnus-summary-followup - "F" gnus-summary-followup-with-original - "c" gnus-summary-cancel-article - "s" gnus-summary-supersede-article - "r" gnus-summary-reply - "y" gnus-summary-yank-message - "R" gnus-summary-reply-with-original - "w" gnus-summary-wide-reply - "W" gnus-summary-wide-reply-with-original - "v" gnus-summary-very-wide-reply - "V" gnus-summary-very-wide-reply-with-original - "n" gnus-summary-followup-to-mail - "N" gnus-summary-followup-to-mail-with-original - "m" gnus-summary-mail-other-window - "u" gnus-uu-post-news - "\M-c" gnus-summary-mail-crosspost-complaint - "Br" gnus-summary-reply-broken-reply-to - "BR" gnus-summary-reply-broken-reply-to-with-original - "om" gnus-summary-mail-forward - "op" gnus-summary-post-forward - "Om" gnus-summary-digest-mail-forward - "Op" gnus-summary-digest-post-forward) - -(gnus-define-keys (gnus-send-bounce-map "D" gnus-summary-send-map) - "b" gnus-summary-resend-bounced-mail - ;; "c" gnus-summary-send-draft - "r" gnus-summary-resend-message) - -;;; Internal functions. - -(defvar gnus-article-reply nil) -(defmacro gnus-setup-message (config &rest forms) - (let ((winconf (make-symbol "gnus-setup-message-winconf")) - (buffer (make-symbol "gnus-setup-message-buffer")) - (article (make-symbol "gnus-setup-message-article")) - (group (make-symbol "gnus-setup-message-group"))) - `(let ((,winconf (current-window-configuration)) - (,buffer (buffer-name (current-buffer))) - (,article gnus-article-reply) - (,group gnus-newsgroup-name) - (message-header-setup-hook - (copy-sequence message-header-setup-hook)) - (message-mode-hook (copy-sequence message-mode-hook)) - (message-startup-parameter-alist - '((reply-buffer . gnus-copy-article-buffer) - (original-buffer . gnus-original-article-buffer) - (user-agent . Gnus)))) - (add-hook 'message-header-setup-hook 'gnus-inews-insert-gcc) - (add-hook 'message-header-setup-hook 'gnus-inews-insert-archive-gcc) - (add-hook 'message-mode-hook 'gnus-configure-posting-styles) - (unwind-protect - (progn - ,@forms) - (gnus-inews-add-send-actions ,winconf ,buffer ,article ,config) - (gnus-inews-insert-draft-meta-information ,group ,article) - (setq gnus-message-buffer (current-buffer)) - (set (make-local-variable 'gnus-message-group-art) - (cons ,group ,article)) - (set (make-local-variable 'gnus-newsgroup-name) ,group) - (gnus-run-hooks 'gnus-message-setup-hook)) - (gnus-add-buffer) - (gnus-configure-windows ,config t) - (set-buffer-modified-p nil)))) - -(defun gnus-inews-insert-draft-meta-information (group article) - (save-excursion - (when (and group - (not (string= group "")) - (not (message-fetch-field gnus-draft-meta-information-header))) - (goto-char (point-min)) - (insert gnus-draft-meta-information-header ": (\"" group "\" " - (if article (number-to-string - (if (listp article) - (car article) - article)) "\"\"") - ")\n")))) - -;;;###autoload -(defun gnus-msg-mail (&optional to subject other-headers continue - switch-action yank-action send-actions) - "Start editing a mail message to be sent. -Like `message-mail', but with Gnus paraphernalia, particularly the -Gcc: header for archiving purposes." - (interactive) - (let ((buf (current-buffer)) - mail-buf) - (gnus-setup-message 'message - (message-mail to subject other-headers continue - nil yank-action send-actions)) - (when switch-action - (setq mail-buf (current-buffer)) - (switch-to-buffer buf) - (apply switch-action mail-buf nil))) - ;; COMPOSEFUNC should return t if succeed. Undocumented ??? - t) - -;;;###autoload -(defun gnus-button-mailto (address) - "Mail to ADDRESS." - (set-buffer (gnus-copy-article-buffer)) - (gnus-setup-message 'message - (message-reply address))) - -;;;###autoload -(defun gnus-button-reply (&optional to-address wide) - "Like `message-reply'." - (interactive) - (gnus-setup-message 'message - (message-reply to-address wide))) - -;;;###autoload -(define-mail-user-agent 'gnus-user-agent - 'gnus-msg-mail 'message-send-and-exit - 'message-kill-buffer 'message-send-hook) - -(defun gnus-setup-posting-charset (group) - (let ((alist gnus-group-posting-charset-alist) - (group (or group "")) - elem) - (when group - (catch 'found - (while (setq elem (pop alist)) - (when (or (and (stringp (car elem)) - (string-match (car elem) group)) - (and (gnus-functionp (car elem)) - (funcall (car elem) group)) - (and (symbolp (car elem)) - (symbol-value (car elem)))) - (throw 'found (cons (cadr elem) (caddr elem))))))))) - -(defun gnus-inews-add-send-actions (winconf buffer article &optional config) - (make-local-hook 'message-sent-hook) - (add-hook 'message-sent-hook (if gnus-agent 'gnus-agent-possibly-do-gcc - 'gnus-inews-do-gcc) nil t) - (when gnus-agent - (make-local-hook 'message-header-hook) - (add-hook 'message-header-hook 'gnus-agent-possibly-save-gcc nil t)) - (setq message-post-method - `(lambda (arg) - (gnus-post-method arg ,gnus-newsgroup-name))) - (setq message-user-agent (gnus-extended-version)) - (when (not message-use-multi-frames) - (message-add-action - `(set-window-configuration ,winconf) 'exit 'postpone 'kill)) - (message-add-action - `(when (gnus-buffer-exists-p ,buffer) - (save-excursion - (set-buffer ,buffer) - ,(when article - (if (eq config 'forward) - `(gnus-summary-mark-article-as-forwarded ',article) - `(gnus-summary-mark-article-as-replied ',article))))) - 'send)) - -(put 'gnus-setup-message 'lisp-indent-function 1) -(put 'gnus-setup-message 'edebug-form-spec '(form body)) - -;;; Post news commands of Gnus group mode and summary mode - -(defun gnus-group-mail (&optional arg) - "Start composing a mail. -If ARG, use the group under the point to find a posting style. -If ARG is 1, prompt for a group name to find the posting style." - (interactive "P") - ;; We can't `let' gnus-newsgroup-name here, since that leads - ;; to local variables leaking. - (let ((group gnus-newsgroup-name) - (buffer (current-buffer))) - (unwind-protect - (progn - (setq gnus-newsgroup-name - (if arg - (if (= 1 (prefix-numeric-value arg)) - (completing-read "Use posting style of group: " - gnus-active-hashtb nil - (gnus-read-active-file-p)) - (gnus-group-group-name)) - "")) - (gnus-setup-message 'message (message-mail))) - (save-excursion - (set-buffer buffer) - (setq gnus-newsgroup-name group))))) - -(defun gnus-group-post-news (&optional arg) - "Start composing a news message. -If ARG, post to the group under point. -If ARG is 1, prompt for a group name." - (interactive "P") - ;; Bind this variable here to make message mode hooks work ok. - (let ((gnus-newsgroup-name - (if arg - (if (= 1 (prefix-numeric-value arg)) - (completing-read "Newsgroup: " gnus-active-hashtb nil - (gnus-read-active-file-p)) - (gnus-group-group-name)) - ""))) - (gnus-post-news 'post gnus-newsgroup-name))) - -(defun gnus-summary-post-news () - "Start composing a news message." - (interactive) - (gnus-post-news 'post gnus-newsgroup-name)) - -(defun gnus-summary-followup (yank &optional force-news) - "Compose a followup to an article. -If prefix argument YANK is non-nil, original article is yanked automatically." - (interactive - (list (and current-prefix-arg - (gnus-summary-work-articles 1)))) - (when yank - (gnus-summary-goto-subject (car yank))) - (save-window-excursion - (gnus-summary-select-article)) - (let ((headers (gnus-summary-article-header (gnus-summary-article-number))) - (gnus-newsgroup-name gnus-newsgroup-name)) - ;; Send a followup. - (gnus-post-news nil gnus-newsgroup-name - headers gnus-article-buffer - yank nil force-news))) - -(defun gnus-summary-followup-with-original (n &optional force-news) - "Compose a followup to an article and include the original article." - (interactive "P") - (gnus-summary-followup (gnus-summary-work-articles n) force-news)) - -(defun gnus-summary-followup-to-mail (&optional arg) - "Followup to the current mail message via news." - (interactive - (list (and current-prefix-arg - (gnus-summary-work-articles 1)))) - (gnus-summary-followup arg t)) - -(defun gnus-summary-followup-to-mail-with-original (&optional arg) - "Followup to the current mail message via news." - (interactive "P") - (gnus-summary-followup (gnus-summary-work-articles arg) t)) - -(defun gnus-inews-yank-articles (articles) - (let ((more-than-one (cdr articles)) - (cur (current-buffer)) - refs beg article window) - (message-goto-body) - (while (setq article (pop articles)) - (save-window-excursion - (set-buffer gnus-summary-buffer) - (gnus-summary-select-article nil nil nil article) - (gnus-summary-remove-process-mark article)) - - ;; Gathering references. - (when more-than-one - (setq refs (message-list-references - refs - (mail-header-references gnus-current-headers) - (mail-header-message-id gnus-current-headers))) - (when message-use-multi-frames - (when (setq window (get-buffer-window cur t)) - (select-frame (window-frame window))))) - - (gnus-copy-article-buffer) - (let ((message-reply-buffer gnus-article-copy) - (message-reply-headers - (with-current-buffer gnus-article-copy - ;; The headers are decoded. - (nnheader-parse-head t)))) - (message-yank-original) - (setq beg (or beg (mark t)))) - (when articles - (insert "\n"))) - (push-mark) - - ;; Replace with the gathered references. - (when refs - (push-mark beg) - (save-restriction - (message-narrow-to-headers) - (let ((case-fold-search t)) - (if (re-search-forward "^References:\\([\t ]+.+\n\\)+" nil t) - (replace-match "") - (goto-char (point-max)))) - (mail-header-format - (list (or (assq 'References message-header-format-alist) - '(References . message-shorten-references))) - (list (cons 'References - (mapconcat 'identity (nreverse refs) " ")))) - (backward-delete-char 1)) - (setq beg (mark t)) - (pop-mark)) - - (goto-char beg))) - -(defun gnus-summary-cancel-article (&optional n symp) - "Cancel an article you posted. -Uses the process-prefix convention. If given the symbolic -prefix `a', cancel using the standard posting method; if not -post using the current select method." - (interactive (gnus-interactive "P\ny")) - (let ((articles (gnus-summary-work-articles n)) - (message-post-method - `(lambda (arg) - (gnus-post-method (not (eq symp 'a)) ,gnus-newsgroup-name))) - article) - (while (setq article (pop articles)) - (when (gnus-summary-select-article t nil nil article) - (when (gnus-eval-in-buffer-window gnus-article-buffer - (save-excursion - (set-buffer gnus-original-article-buffer) - (message-cancel-news))) - (gnus-summary-mark-as-read article gnus-canceled-mark) - (gnus-cache-remove-article 1)) - (gnus-article-hide-headers-if-wanted)) - (gnus-summary-remove-process-mark article)))) - -(defun gnus-summary-supersede-article () - "Compose an article that will supersede a previous article. -This is done simply by taking the old article and adding a Supersedes -header line with the old Message-ID." - (interactive) - (let ((article (gnus-summary-article-number)) - (gnus-message-setup-hook '(gnus-maybe-setup-default-charset))) - (gnus-setup-message 'reply-yank - (gnus-summary-select-article t) - (set-buffer gnus-original-article-buffer) - (message-supersede) - (push - `((lambda () - (when (gnus-buffer-exists-p ,gnus-summary-buffer) - (save-excursion - (set-buffer ,gnus-summary-buffer) - (gnus-cache-possibly-remove-article ,article nil nil nil t) - (gnus-summary-mark-as-read ,article gnus-canceled-mark))))) - message-send-actions)))) - - - -(defun gnus-copy-article-buffer (&optional article-buffer) - ;; make a copy of the article buffer with all text properties removed - ;; this copy is in the buffer gnus-article-copy. - ;; if ARTICLE-BUFFER is nil, gnus-article-buffer is used - ;; this buffer should be passed to all mail/news reply/post routines. - (setq gnus-article-copy (gnus-get-buffer-create " *gnus article copy*")) - (let ((article-buffer (or article-buffer gnus-article-buffer)) - end beg) - (if (not (and (get-buffer article-buffer) - (gnus-buffer-exists-p article-buffer))) - (error "Can't find any article buffer") - (save-excursion - (set-buffer article-buffer) - (let ((gnus-newsgroup-charset (or gnus-article-charset - gnus-newsgroup-charset)) - (gnus-newsgroup-ignored-charsets - (or gnus-article-ignored-charsets - gnus-newsgroup-ignored-charsets))) - (save-restriction - ;; Copy over the (displayed) article buffer, delete - ;; hidden text and remove text properties. - (widen) - (let ((inhibit-read-only t)) - (copy-to-buffer gnus-article-copy (point-min) (point-max)) - (set-buffer gnus-article-copy) - ;; Encode bitmap smileys to ordinary text. - ;; Possibly, the original text might be restored. - (static-unless (featurep 'xemacs) - (when (featurep 'smiley-mule) - (smiley-encode-buffer))) - (gnus-article-delete-text-of-type 'annotation) - (gnus-remove-text-with-property 'gnus-prev) - (gnus-remove-text-with-property 'gnus-next) - (gnus-remove-text-with-property 'x-face-mule-bitmap-image) - (insert - (prog1 - (static-if (featurep 'xemacs) - ;; Revome smiley extents for (possibly) XEmacs 21.1. - (format "%s" - (buffer-substring-no-properties (point-min) - (point-max))) - (buffer-substring-no-properties (point-min) (point-max))) - (erase-buffer)))) - ;; Find the original headers. - (set-buffer gnus-original-article-buffer) - (goto-char (point-min)) - (while (looking-at message-unix-mail-delimiter) - (forward-line 1)) - (setq beg (point)) - (setq end (or (message-goto-body) beg)) - ;; Delete the headers from the displayed articles. - (set-buffer gnus-article-copy) - (delete-region (goto-char (point-min)) - (or (message-goto-body) (point-max))) - ;; Insert the original article headers. - (insert-buffer-substring gnus-original-article-buffer beg end) - (article-decode-encoded-words)))) - gnus-article-copy))) - -(defun gnus-post-news (post &optional group header article-buffer yank subject - force-news) - (when article-buffer - (gnus-copy-article-buffer)) - (let ((gnus-article-reply (and article-buffer (gnus-summary-article-number))) - (add-to-list gnus-add-to-list)) - (gnus-setup-message (cond (yank 'reply-yank) - (article-buffer 'reply) - (t 'message)) - (let* ((group (or group gnus-newsgroup-name)) - (charset (gnus-group-name-charset nil group)) - (pgroup group) - to-address to-group mailing-list to-list - newsgroup-p) - (when group - (setq to-address (gnus-parameter-to-address group) - to-group (gnus-group-find-parameter group 'to-group) - to-list (gnus-parameter-to-list group) - newsgroup-p (gnus-group-find-parameter group 'newsgroup) - mailing-list (when gnus-mailing-list-groups - (string-match gnus-mailing-list-groups group)) - group (gnus-group-name-decode (gnus-group-real-name group) - charset))) - (if (or (and to-group - (gnus-news-group-p to-group)) - newsgroup-p - force-news - (and (gnus-news-group-p - (or pgroup gnus-newsgroup-name) - (if header (mail-header-number header) - gnus-current-article)) - (not mailing-list) - (not to-list) - (not to-address))) - ;; This is news. - (if post - (message-news (or to-group group)) - (set-buffer gnus-article-copy) - (gnus-msg-treat-broken-reply-to) - (message-followup (if (or newsgroup-p force-news) - (if (save-restriction - (article-narrow-to-head) - (message-fetch-field "newsgroups")) - nil - "") - to-group))) - ;; The is mail. - (if post - (progn - (message-mail (or to-address to-list)) - ;; Arrange for mail groups that have no `to-address' to - ;; get that when the user sends off the mail. - (when (and (not to-list) - (not to-address) - add-to-list) - (push (list 'gnus-inews-add-to-address pgroup) - message-send-actions))) - (set-buffer gnus-article-copy) - (gnus-msg-treat-broken-reply-to) - (message-wide-reply to-address))) - (when yank - (gnus-inews-yank-articles yank)))))) - -(defun gnus-msg-treat-broken-reply-to (&optional force) - "Remove the Reply-to header iff broken-reply-to." - (when (or force - (gnus-group-find-parameter - gnus-newsgroup-name 'broken-reply-to)) - (save-restriction - (message-narrow-to-head) - (message-remove-header "reply-to")))) - -(defun gnus-post-method (arg group &optional silent) - "Return the posting method based on GROUP and ARG. -If SILENT, don't prompt the user." - (let ((gnus-post-method (or (gnus-parameter-post-method group) - gnus-post-method)) - (group-method (gnus-find-method-for-group group))) - (cond - ;; If the group-method is nil (which shouldn't happen) we use - ;; the default method. - ((null group-method) - (or (and (null (eq gnus-post-method 'active)) gnus-post-method) - gnus-select-method message-post-method)) - ;; We want the inverse of the default - ((and arg (not (eq arg 0))) - (if (eq gnus-post-method 'active) - gnus-select-method - group-method)) - ;; We query the user for a post method. - ((or arg - (and gnus-post-method - (not (eq gnus-post-method 'current)) - (listp (car gnus-post-method)))) - (let* ((methods - ;; Collect all methods we know about. - (append - (when (and gnus-post-method - (not (eq gnus-post-method 'current))) - (if (listp (car gnus-post-method)) - gnus-post-method - (list gnus-post-method))) - gnus-secondary-select-methods - (mapcar 'cdr gnus-server-alist) - (mapcar 'car gnus-opened-servers) - (list gnus-select-method) - (list group-method))) - method-alist post-methods method) - ;; Weed out all mail methods. - (while methods - (setq method (gnus-server-get-method "" (pop methods))) - (when (and (or (gnus-method-option-p method 'post) - (gnus-method-option-p method 'post-mail)) - (not (member method post-methods))) - (push method post-methods))) - ;; Create a name-method alist. - (setq method-alist - (mapcar - (lambda (m) - (if (equal (cadr m) "") - (list (symbol-name (car m)) m) - (list (concat (cadr m) " (" (symbol-name (car m)) ")") m))) - post-methods)) - ;; Query the user. - (cadr - (assoc - (setq gnus-last-posting-server - (if (and silent - gnus-last-posting-server) - ;; Just use the last value. - gnus-last-posting-server - (completing-read - "Posting method: " method-alist nil t - (cons (or gnus-last-posting-server "") 0)))) - method-alist)))) - ;; Override normal method. - ((and (eq gnus-post-method 'current) - (not (eq (car group-method) 'nndraft)) - (gnus-get-function group-method 'request-post t) - (not arg)) - group-method) - ((and gnus-post-method - (not (eq gnus-post-method 'current))) - gnus-post-method) - ;; Use the normal select method. - (t gnus-select-method)))) - - -(defun gnus-message-make-user-agent (&optional include-mime-info max-column - newline-product) - "Return a user-agent info. If INCLUDE-MIME-INFO is non-nil and the -variable `mime-edit-user-agent-value' is bound, the value will be -included in the return value. If MAX-COLUMN is specified, the return -value will be folded up as it were filled. NEWLINE-PRODUCT specifies -whether a newline should be inserted in front of each product-token. -If the value is t or `hard', it works strictly. Otherwise, if it is -non-nil (e.g. `soft'), it works semi-strictly. - -Here is an example of how to use this function: - -\(add-hook 'gnus-message-setup-hook - (lambda nil - (setq message-user-agent nil) - (save-excursion - (save-restriction - (message-narrow-to-headers) - (goto-char (point-max)) - (insert \"User-Agent: \" - (gnus-message-make-user-agent t 76 'soft) - \"\\n\"))))) -" - (let ((user-agent (if (and include-mime-info - (boundp 'mime-edit-user-agent-value)) - (concat (gnus-extended-version) - " " - mime-edit-user-agent-value) - (gnus-extended-version)))) - (when max-column - (unless (natnump max-column) - (setq max-column 76)) - (with-temp-buffer - (set-buffer-multibyte t) - (insert (mapconcat 'identity (split-string user-agent) " ")) - (goto-char (point-min)) - (let ((bol t) - start agent agents width element swidth) - (while (re-search-forward "\\([^ ]+\\) ?" nil t) - (setq start (match-beginning 0)) - (if (eq (char-after start) ?\() - (progn - (goto-char start) - (forward-list) - (push (buffer-substring start (point)) agent)) - (when agent - (push (nreverse agent) agents)) - (setq agent (list (match-string 1))))) - (when agent - (push (nreverse agent) agents)) - (setq agents (nreverse agents)) - (if (> (+ 12 (string-width (caar agents))) max-column) - (setq user-agent "\n" - width 0) - (setq user-agent "" - width 11)) - (while agents - (setq agent (car agents) - agents (cdr agents)) - (when (and (not bol) - (or (memq newline-product '(t hard)) - (and newline-product - (> (+ width 1 - (string-width (mapconcat 'identity - agent " "))) - max-column)))) - (setq user-agent (concat user-agent "\n") - width 0 - bol t)) - (while agent - (setq element (car agent) - swidth (string-width element) - agent (cdr agent)) - (if bol - (setq user-agent (if (member user-agent '("" "\n")) - (concat user-agent element) - (concat user-agent " " element)) - width (+ width 1 swidth) - bol nil) - (if (> (+ width 1 swidth) max-column) - (setq user-agent (concat user-agent "\n " element) - width (1+ swidth)) - (setq user-agent (concat user-agent " " element) - width (+ width 1 swidth))))))))) - user-agent)) - - -;;; -;;; Gnus Mail Functions -;;; - -;;; Mail reply commands of Gnus summary mode - -(defun gnus-summary-reply (&optional yank wide very-wide) - "Start composing a mail reply to the current message. -If prefix argument YANK is non-nil, the original article is yanked -automatically. -If WIDE, make a wide reply. -If VERY-WIDE, make a very wide reply." - (interactive - (list (and current-prefix-arg - (gnus-summary-work-articles 1)))) - ;; Stripping headers should be specified with mail-yank-ignored-headers. - (when yank - (gnus-summary-goto-subject (car yank))) - (let ((gnus-article-reply (or yank (gnus-summary-article-number))) - (headers "")) - (gnus-setup-message (if yank 'reply-yank 'reply) - (if (not very-wide) - (gnus-summary-select-article) - (dolist (article very-wide) - (gnus-summary-select-article nil nil nil article) - (save-excursion - (set-buffer (gnus-copy-article-buffer)) - (gnus-msg-treat-broken-reply-to) - (save-restriction - (message-narrow-to-head) - (setq headers (concat headers (buffer-string))))))) - (set-buffer (gnus-copy-article-buffer)) - (gnus-msg-treat-broken-reply-to gnus-msg-force-broken-reply-to) - (save-restriction - (message-narrow-to-head) - (when very-wide - (erase-buffer) - (insert headers)) - (goto-char (point-max))) - (message-reply nil wide) - (when yank - (gnus-inews-yank-articles yank))))) - -(defun gnus-summary-reply-with-original (n &optional wide) - "Start composing a reply mail to the current message. -The original article will be yanked." - (interactive "P") - (gnus-summary-reply (gnus-summary-work-articles n) wide)) - -(defun gnus-summary-reply-broken-reply-to (&optional yank wide very-wide) - "Like `gnus-summary-reply' except removing reply-to field. -If prefix argument YANK is non-nil, the original article is yanked -automatically. -If WIDE, make a wide reply. -If VERY-WIDE, make a very wide reply." - (interactive - (list (and current-prefix-arg - (gnus-summary-work-articles 1)))) - (let ((gnus-msg-force-broken-reply-to t)) - (gnus-summary-reply yank wide very-wide))) - -(defun gnus-summary-reply-broken-reply-to-with-original (n &optional wide) - "Like `gnus-summary-reply-with-original' except removing reply-to field. -The original article will be yanked." - (interactive "P") - (gnus-summary-reply-broken-reply-to (gnus-summary-work-articles n) wide)) - -(defun gnus-summary-wide-reply (&optional yank) - "Start composing a wide reply mail to the current message. -If prefix argument YANK is non-nil, the original article is yanked -automatically." - (interactive - (list (and current-prefix-arg - (gnus-summary-work-articles 1)))) - (gnus-summary-reply yank t)) - -(defun gnus-summary-wide-reply-with-original (n) - "Start composing a wide reply mail to the current message. -The original article will be yanked." - (interactive "P") - (gnus-summary-reply-with-original n t)) - -(defun gnus-summary-very-wide-reply (&optional yank) - "Start composing a very wide reply mail to the current message. -If prefix argument YANK is non-nil, the original article is yanked -automatically." - (interactive - (list (and current-prefix-arg - (gnus-summary-work-articles 1)))) - (gnus-summary-reply yank t (gnus-summary-work-articles yank))) - -(defun gnus-summary-very-wide-reply-with-original (n) - "Start composing a very wide reply mail to the current message. -The original article will be yanked." - (interactive "P") - (gnus-summary-reply - (gnus-summary-work-articles n) t (gnus-summary-work-articles n))) - -(defun gnus-summary-mail-forward (&optional full-headers post) - "Forward the current message to another user. -If FULL-HEADERS (the prefix), include full headers when forwarding." - (interactive "P") - (gnus-setup-message 'forward - (gnus-summary-select-article) - (let ((charset default-mime-charset)) - (set-buffer gnus-original-article-buffer) - (make-local-variable 'default-mime-charset) - (setq default-mime-charset charset)) - (let ((message-included-forward-headers - (if full-headers "" message-included-forward-headers))) - (message-forward post)))) - -(defun gnus-summary-digest-mail-forward (&optional n post) - "Digests and forwards all articles in this series. -If N is a positive number, forward the N next articles. -If N is a negative number, forward the N previous articles. -If N is nil and any articles have been marked with the process mark, -forward those articles instead. -Optional POST will use news to forward instead of mail." - (interactive "P") - (let ((articles (gnus-summary-work-articles n)) - (topics "Topics:\n") - subject article frame) - (when (car articles) - (gnus-setup-message 'forward - (gnus-summary-select-article) - (if (cdr articles) - (setq articles (sort articles '<) - subject "Digested Articles") - (with-current-buffer gnus-original-article-buffer - (setq subject (message-make-forward-subject)))) - (if post - (message-news nil subject) - (message-mail nil subject)) - (when (and message-use-multi-frames (cdr articles)) - (setq frame (window-frame (get-buffer-window (current-buffer))))) - (message-goto-body) - (while (setq article (pop articles)) - (save-window-excursion - (set-buffer gnus-summary-buffer) - (gnus-summary-select-article nil nil nil article) - (setq topics (concat topics " " - (mail-header-subject gnus-current-headers) - "\n")) - (gnus-summary-remove-process-mark article)) - (when frame - (select-frame frame)) - (insert (mime-make-tag "message" "rfc822") "\n") - (narrow-to-region (point) (point)) - (insert-buffer-substring gnus-original-article-buffer) - (save-restriction - (article-narrow-to-head) - (message-remove-header message-included-forward-headers t nil t)) - (goto-char (point-max)) - (widen)) - (push-mark) - (message-goto-body) - (insert topics) - (message-goto-body) - (mime-edit-enclose-digest-region (point)(mark t)))))) - -(defun gnus-summary-digest-post-forward (&optional n) - "Digest and forwards all articles in this series to a newsgroup. -If N is a positive number, forward the N next articles. -If N is a negative number, forward the N previous articles. -If N is nil and any articles have been marked with the process mark, -forward those articles instead." - (interactive "P") - (gnus-summary-digest-mail-forward n t)) - -(defun gnus-summary-resend-message (address n) - "Resend the current article to ADDRESS." - (interactive - (list (message-read-from-minibuffer "Resend message(s) to: ") - current-prefix-arg)) - (let ((articles (gnus-summary-work-articles n)) - article) - (while (setq article (pop articles)) - (gnus-summary-select-article nil nil nil article) - (save-excursion - (set-buffer gnus-original-article-buffer) - (message-resend address)) - (gnus-summary-mark-article-as-forwarded article)))) - -(defun gnus-summary-post-forward (&optional full-headers) - "Forward the current article to a newsgroup. -If FULL-HEADERS (the prefix), include full headers when forwarding." - (interactive "P") - (gnus-summary-mail-forward full-headers t)) - -(defvar gnus-nastygram-message - "The following article was inappropriately posted to %s.\n\n" - "Format string to insert in nastygrams. -The current group name will be inserted at \"%s\".") - -(defun gnus-summary-mail-nastygram (n) - "Send a nastygram to the author of the current article." - (interactive "P") - (when (or gnus-expert-user - (gnus-y-or-n-p - "Really send a nastygram to the author of the current article? ")) - (let ((group gnus-newsgroup-name)) - (gnus-summary-reply-with-original n) - (set-buffer gnus-message-buffer) - (message-goto-body) - (insert (format gnus-nastygram-message group)) - (message-send-and-exit)))) - -(defun gnus-summary-mail-crosspost-complaint (n) - "Send a complaint about crossposting to the current article(s)." - (interactive "P") - (let ((articles (gnus-summary-work-articles n)) - article) - (while (setq article (pop articles)) - (set-buffer gnus-summary-buffer) - (gnus-summary-goto-subject article) - (let ((group (gnus-group-real-name gnus-newsgroup-name)) - newsgroups followup-to) - (gnus-summary-select-article) - (set-buffer gnus-original-article-buffer) - (if (and (<= (length (message-tokenize-header - (setq newsgroups - (mail-fetch-field "newsgroups")) - ", ")) - 1) - (or (not (setq followup-to (mail-fetch-field "followup-to"))) - (not (member group (message-tokenize-header - followup-to ", "))))) - (if followup-to - (gnus-message 1 "Followup-to restricted") - (gnus-message 1 "Not a crossposted article")) - (set-buffer gnus-summary-buffer) - (gnus-summary-reply-with-original 1) - (set-buffer gnus-message-buffer) - (message-goto-body) - (insert (format gnus-crosspost-complaint newsgroups group)) - (message-goto-subject) - (re-search-forward " *$") - (replace-match " (crosspost notification)" t t) - (gnus-deactivate-mark) - (when (gnus-y-or-n-p "Send this complaint? ") - (message-send-and-exit))))))) - -(defun gnus-summary-mail-other-window () - "Compose mail in other window." - (interactive) - (gnus-setup-message 'message - (message-mail))) - -(defun gnus-mail-parse-comma-list () - (let (accumulated - beg) - (skip-chars-forward " ") - (while (not (eobp)) - (setq beg (point)) - (skip-chars-forward "^,") - (while (zerop - (save-excursion - (save-restriction - (let ((i 0)) - (narrow-to-region beg (point)) - (goto-char beg) - (logand (progn - (while (search-forward "\"" nil t) - (incf i)) - (if (zerop i) 2 i)) - 2))))) - (skip-chars-forward ",") - (skip-chars-forward "^,")) - (skip-chars-backward " ") - (push (buffer-substring beg (point)) - accumulated) - (skip-chars-forward "^,") - (skip-chars-forward ", ")) - accumulated)) - -(defun gnus-inews-add-to-address (group) - (let ((to-address (mail-fetch-field "to"))) - (when (and to-address - (gnus-alive-p)) - ;; This mail group doesn't have a `to-list', so we add one - ;; here. Magic! - (when (gnus-y-or-n-p - (format "Do you want to add this as `to-list': %s " to-address)) - (gnus-group-add-parameter group (cons 'to-list to-address)))))) - -(defun gnus-put-message () - "Put the current message in some group and return to Gnus." - (interactive) - (let ((reply gnus-article-reply) - (winconf gnus-prev-winconf) - (group gnus-newsgroup-name)) - (unless (and group - (not (gnus-group-read-only-p group))) - (setq group (read-string "Put in group: " nil (gnus-writable-groups)))) - - (when (gnus-gethash group gnus-newsrc-hashtb) - (error "No such group: %s" group)) - (save-excursion - (save-restriction - (widen) - (message-narrow-to-headers) - (let ((gnus-deletable-headers nil)) - (message-generate-headers - (if (message-news-p) - message-required-news-headers - message-required-mail-headers))) - (goto-char (point-max)) - (insert "Gcc: " group "\n") - (widen))) - (gnus-inews-do-gcc) - (when (and (get-buffer gnus-group-buffer) - (gnus-buffer-exists-p (car-safe reply)) - (cdr reply)) - (set-buffer (car reply)) - (gnus-summary-mark-article-as-replied (cdr reply))) - (when winconf - (set-window-configuration winconf)))) - -(defun gnus-article-mail (yank) - "Send a reply to the address near point. -If YANK is non-nil, include the original article." - (interactive "P") - (let ((address - (buffer-substring - (save-excursion (re-search-backward "[ \t\n]" nil t) (1+ (point))) - (save-excursion (re-search-forward "[ \t\n]" nil t) (1- (point)))))) - (when address - (message-reply address) - (when yank - (gnus-inews-yank-articles (list (cdr gnus-article-current))))))) - -(defvar nntp-server-type) -(defun gnus-bug () - "Send a bug report to the Gnus maintainers." - (interactive) - (unless (gnus-alive-p) - (error "Gnus has been shut down")) - (gnus-setup-message (if (message-mail-user-agent) 'message 'bug) - (unless (message-mail-user-agent) - (message-pop-to-buffer "*Gnus Bug*") - (delete-other-windows) - (when gnus-bug-create-help-buffer - (switch-to-buffer "*Gnus Help Bug*") - (erase-buffer) - (insert gnus-bug-message) - (goto-char (point-min)) - (sit-for 0) - (set-buffer "*Gnus Bug*"))) - (let ((message-this-is-mail t)) - (message-setup `((To . ,gnus-maintainer) (Subject . "")))) - (when gnus-bug-create-help-buffer - (push `(gnus-bug-kill-buffer) message-send-actions)) - (goto-char (point-min)) - (re-search-forward (concat "^" (regexp-quote mail-header-separator) "$")) - (forward-line 1) - (insert gnus-product-name " " gnus-version-number - " (r" gnus-revision-number ") " - "based on " gnus-original-product-name " v" - gnus-original-version-number "\n" - (emacs-version) "\n") - (when (and (boundp 'nntp-server-type) - (stringp nntp-server-type)) - (insert nntp-server-type)) - (insert "\n\n\n\n\n") - (let (mime-content-types) - (mime-edit-insert-tag "text" "plain" "; type=emacs-lisp")) - (insert (with-temp-buffer - (gnus-debug) - (buffer-string))) - (let (mime-content-types) - (mime-edit-insert-tag "text" "plain")) - (goto-char (point-min)) - (search-forward "Subject: " nil t) - (message ""))) - -(defun gnus-bug-kill-buffer () - (when (get-buffer "*Gnus Help Bug*") - (kill-buffer "*Gnus Help Bug*"))) - -(defun gnus-summary-yank-message (buffer n) - "Yank the current article into a composed message." - (interactive - (list (completing-read "Buffer: " (mapcar 'list (message-buffers)) nil t) - current-prefix-arg)) - (when (gnus-buffer-live-p buffer) - (let ((summary-frame (selected-frame)) - (message-frame (when (static-if (featurep 'xemacs) - (device-on-window-system-p) - window-system) - (let ((window (get-buffer-window buffer t))) - (when window - (window-frame window))))) - (separator (concat "^" (regexp-quote mail-header-separator) - "\n"))) - (gnus-summary-iterate n - (gnus-summary-select-article) - (gnus-copy-article-buffer) - (when (frame-live-p message-frame) - (raise-frame message-frame) - (select-frame message-frame)) - (with-current-buffer buffer - (when (save-excursion - (beginning-of-line) - (let (case-fold-search) - (and (not (re-search-backward separator nil t)) - (re-search-forward separator nil t)))) - (goto-char (match-end 0))) - (message-yank-buffer gnus-article-copy)) - (select-frame summary-frame)) - (when (frame-live-p message-frame) - (select-frame message-frame))))) - -(defun gnus-debug () - "Attempts to go through the Gnus source file and report what variables have been changed. -The source file has to be in the Emacs load path." - (interactive) - (let ((files '("gnus.el" "gnus-sum.el" "gnus-group.el" - "gnus-art.el" "gnus-start.el" "gnus-async.el" - "gnus-msg.el" "gnus-score.el" "gnus-win.el" "gnus-topic.el" - "nnmail.el" "nntp.el" "message.el")) - (point (point)) - file expr olist sym) - (gnus-message 4 "Please wait while we snoop your variables...") - ;; Go through all the files looking for non-default values for variables. - (save-excursion - (sit-for 0) - (set-buffer (gnus-get-buffer-create " *gnus bug info*")) - (while files - (erase-buffer) - (when (and (setq file (locate-library (pop files))) - (file-exists-p file)) - (insert-file-contents file) - (goto-char (point-min)) - (if (not (re-search-forward "^;;* *Internal variables" nil t)) - (gnus-message 4 "Malformed sources in file %s" file) - (narrow-to-region (point-min) (point)) - (goto-char (point-min)) - (while (setq expr (ignore-errors (read (current-buffer)))) - (ignore-errors - (and (memq (car expr) '(defvar defcustom defvoo)) - (stringp (nth 3 expr)) - (or (not (boundp (nth 1 expr))) - (not (equal (eval (nth 2 expr)) - (symbol-value (nth 1 expr))))) - (push (nth 1 expr) olist))))))) - (kill-buffer (current-buffer))) - (when (setq olist (nreverse olist)) - (insert ";----------------- Environment follows ------------------\n\n")) - (while olist - (if (boundp (car olist)) - (condition-case () - (pp `(setq ,(car olist) - ,(if (or (consp (setq sym (symbol-value (car olist)))) - (and (symbolp sym) - (not (or (eq sym nil) - (eq sym t))))) - (list 'quote (symbol-value (car olist))) - (symbol-value (car olist)))) - (current-buffer)) - (error - (format "(setq %s 'whatever)\n" (car olist)))) - (insert ";; (makeunbound '" (symbol-name (car olist)) ")\n")) - (setq olist (cdr olist))) - ;; Remove any control chars - they seem to cause trouble for some - ;; mailers. (Byte-compiled output from the stuff above.) - (goto-char point) - (while (re-search-forward "[\000-\010\013-\037\200-\237]" nil t) - (replace-match (format "\\%03o" (string-to-char (match-string 0))) - t t)) - ;; Break MIME tags purposely. - (goto-char point) - (while (re-search-forward mime-edit-tag-regexp nil t) - (goto-char (1+ (match-beginning 0))) - (insert "X")))) - -;;; Treatment of rejected articles. -;;; Bounced mail. - -(defun gnus-summary-resend-bounced-mail (&optional fetch) - "Re-mail the current message. -This only makes sense if the current message is a bounce message than -contains some mail you have written which has been bounced back to -you. -If FETCH, try to fetch the article that this is a reply to, if indeed -this is a reply." - (interactive "P") - (gnus-summary-select-article t) - (set-buffer gnus-original-article-buffer) - (let ((gnus-message-setup-hook '(gnus-maybe-setup-default-charset))) - (gnus-setup-message 'compose-bounce - (let* ((references (mail-fetch-field "references")) - (parent (and references (gnus-parent-id references)))) - (message-bounce) - ;; If there are references, we fetch the article we answered to. - (and fetch parent - (gnus-summary-refer-article parent) - (gnus-summary-show-all-headers)))))) - -;;; Gcc handling. - -(defun gnus-inews-group-method (group) - (cond - ;; If the group doesn't exist, we assume - ;; it's an archive group... - ((and (null (gnus-get-info group)) - (eq (car (gnus-server-to-method gnus-message-archive-method)) - (car (gnus-server-to-method (gnus-group-method group))))) - gnus-message-archive-method) - ;; Use the method. - ((gnus-info-method (gnus-get-info group)) - (gnus-info-method (gnus-get-info group))) - ;; Find the method. - (t (gnus-server-to-method (gnus-group-method group))))) - -;; Do Gcc handling, which copied the message over to some group. -(defun gnus-inews-do-gcc (&optional gcc) - (interactive) - (save-excursion - (save-restriction - (message-narrow-to-headers) - (let ((gcc (or gcc (mail-fetch-field "gcc" nil t))) - (coding-system-for-write 'raw-text) - (output-coding-system 'raw-text) - groups group method group-art) - (when gcc - (message-remove-header "gcc") - (widen) - (setq groups (message-unquote-tokens - (message-tokenize-header gcc " ,"))) - ;; Copy the article over to some group(s). - (while (setq group (pop groups)) - (unless (gnus-check-server - (setq method (gnus-inews-group-method group))) - (error "Can't open server %s" (if (stringp method) method - (car method)))) - (unless (gnus-request-group group nil method) - (gnus-request-create-group group method)) - (save-excursion - (nnheader-set-temp-buffer " *acc*") - (insert-buffer-substring message-encoding-buffer) - (gnus-run-hooks 'gnus-before-do-gcc-hook) - (goto-char (point-min)) - (when (re-search-forward - (concat "^" (regexp-quote mail-header-separator) "$") - nil t) - (replace-match "" t t )) - (unless (setq group-art - (gnus-request-accept-article group method t t)) - (gnus-message 1 "Couldn't store article in group %s: %s" - group (gnus-status-message method)) - (sit-for 2)) - (when (and group-art gnus-inews-mark-gcc-as-read) - (gnus-group-mark-article-read group (cdr group-art))) - (kill-buffer (current-buffer))))))))) - -(defun gnus-inews-insert-gcc () - "Insert Gcc headers based on `gnus-outgoing-message-group'." - (save-excursion - (save-restriction - (message-narrow-to-headers) - (let* ((group gnus-outgoing-message-group) - (gcc (cond - ((gnus-functionp group) - (funcall group)) - ((or (stringp group) (list group)) - group)))) - (when gcc - (insert "Gcc: " - (if (stringp gcc) gcc - (mapconcat 'identity gcc " ")) - "\n")))))) - -(defun gnus-inews-insert-archive-gcc (&optional group) - "Insert the Gcc to say where the article is to be archived." - (let* ((var gnus-message-archive-group) - (group (or group gnus-newsgroup-name "")) - (gcc-self-val - (and gnus-newsgroup-name - (not (equal gnus-newsgroup-name "")) - (gnus-group-find-parameter - gnus-newsgroup-name 'gcc-self))) - result - (groups - (cond - ((null gnus-message-archive-method) - ;; Ignore. - nil) - ((stringp var) - ;; Just a single group. - (list var)) - ((null var) - ;; We don't want this. - nil) - ((and (listp var) (stringp (car var))) - ;; A list of groups. - var) - ((gnus-functionp var) - ;; A function. - (funcall var group)) - (t - ;; An alist of regexps/functions/forms. - (while (and var - (not - (setq result - (cond - ((stringp (caar var)) - ;; Regexp. - (when (string-match (caar var) group) - (cdar var))) - ((gnus-functionp (car var)) - ;; Function. - (funcall (car var) group)) - (t - (eval (car var))))))) - (setq var (cdr var))) - result))) - name) - (when (or groups gcc-self-val) - (when (stringp groups) - (setq groups (list groups))) - (save-excursion - (save-restriction - (message-narrow-to-headers) - (goto-char (point-max)) - (insert "Gcc: ") - (if gcc-self-val - ;; Use the `gcc-self' param value instead. - (progn - (insert - (if (stringp gcc-self-val) - gcc-self-val - group)) - (if (not (eq gcc-self-val 'none)) - (insert "\n") - (progn - (beginning-of-line) - (kill-line)))) - ;; Use the list of groups. - (while (setq name (pop groups)) - (insert (if (string-match ":" name) - name - (gnus-group-prefixed-name - name gnus-message-archive-method))) - (when groups - (insert " "))) - (insert "\n"))))))) - -;;; Posting styles. - -(defun gnus-configure-posting-styles () - "Configure posting styles according to `gnus-posting-styles'." - (unless gnus-inhibit-posting-styles - (let ((group (or gnus-newsgroup-name "")) - (styles gnus-posting-styles) - style match variable attribute value v results - filep name address element) - ;; If the group has a posting-style parameter, add it at the end with a - ;; regexp matching everything, to be sure it takes precedence over all - ;; the others. - (when gnus-newsgroup-name - (let ((tmp-style (gnus-group-find-parameter group 'posting-style t))) - (when tmp-style - (setq styles (append styles (list (cons ".*" tmp-style))))))) - ;; Go through all styles and look for matches. - (dolist (style styles) - (setq match (pop style)) - (goto-char (point-min)) - (when (cond - ((stringp match) - ;; Regexp string match on the group name. - (string-match match group)) - ((eq match 'header) - (and (gnus-buffer-live-p gnus-article-copy) - (with-current-buffer gnus-article-copy - (let ((header (message-fetch-field (pop style)))) - (and header - (string-match (pop style) header)))))) - ((or (symbolp match) - (gnus-functionp match)) - (cond - ((gnus-functionp match) - ;; Function to be called. - (funcall match)) - ((boundp match) - ;; Variable to be checked. - (symbol-value match)))) - ((listp match) - ;; This is a form to be evaled. - (eval match))) - ;; We have a match, so we set the variables. - (dolist (attribute style) - (setq element (pop attribute) - variable nil - filep nil) - (setq value - (cond - ((eq (car attribute) ':file) - (setq filep t) - (cadr attribute)) - ((eq (car attribute) :value) - (cadr attribute)) - (t - (car attribute)))) - ;; We get the value. - (setq v - (cond - ((stringp value) - value) - ((or (symbolp value) - (gnus-functionp value)) - (cond ((gnus-functionp value) - (funcall value)) - ((boundp value) - (symbol-value value)))) - ((listp value) - (eval value)))) - ;; Translate obsolescent value. - (when (eq element 'signature-file) - (setq element 'signature - filep t)) - ;; Get the contents of file elems. - (when (and filep v) - (setq v (with-temp-buffer - (insert-file-contents v) - (buffer-string)))) - (setq results (delq (assoc element results) results)) - (push (cons element v) results)))) - ;; Now we have all the styles, so we insert them. - (setq name (assq 'name results) - address (assq 'address results)) - (setq results (delq name (delq address results))) - (make-local-variable 'message-setup-hook) - (dolist (result results) - (add-hook 'message-setup-hook - (cond - ((eq 'eval (car result)) - 'ignore) - ((eq 'body (car result)) - `(lambda () - (save-excursion - (message-goto-body) - (insert ,(cdr result))))) - ((eq 'signature (car result)) - (set (make-local-variable 'message-signature) nil) - (set (make-local-variable 'message-signature-file) nil) - (if (not (cdr result)) - 'ignore - `(lambda () - (save-excursion - (let ((message-signature ,(cdr result))) - (when message-signature - (message-insert-signature))))))) - (t - (let ((header - (if (symbolp (car result)) - (capitalize (symbol-name (car result))) - (car result)))) - `(lambda () - (save-excursion - (message-remove-header ,header) - (let ((value ,(cdr result))) - (when value - (message-goto-eoh) - (insert ,header ": " value "\n")))))))))) - (when (or name address) - (add-hook 'message-setup-hook - `(lambda () - (set (make-local-variable 'user-mail-address) - ,(or (cdr address) user-mail-address)) - (let ((user-full-name ,(or (cdr name) (user-full-name))) - (user-mail-address - ,(or (cdr address) user-mail-address))) - (save-excursion - (message-remove-header "From") - (message-goto-eoh) - (insert "From: " (message-make-from) "\n"))))))))) - - -;;; @ for MIME Edit mode -;;; - -(defun gnus-maybe-setup-default-charset () - (let ((charset - (and (boundp 'gnus-summary-buffer) - (buffer-live-p gnus-summary-buffer) - (save-excursion - (set-buffer gnus-summary-buffer) - default-mime-charset)))) - (if charset - (progn - (make-local-variable 'default-mime-charset) - (setq default-mime-charset charset) - )))) - - -;;; @ for MIME view mode -;;; - -(defun gnus-following-method (buf) - (gnus-setup-message 'reply-yank - (set-buffer buf) - (if (message-news-p) - (message-followup) - (message-reply nil 'wide)) - (let ((message-reply-buffer buf)) - (message-yank-original)) - (message-goto-body)) - (kill-buffer buf)) - - -;;; Allow redefinition of functions. - -(gnus-ems-redefine) - -(provide 'gnus-msg) - -;;; gnus-msg.el ends here diff --git a/lisp/gnus-nocem.el b/lisp/gnus-nocem.el deleted file mode 100644 index 0ae227c..0000000 --- a/lisp/gnus-nocem.el +++ /dev/null @@ -1,390 +0,0 @@ -;;; gnus-nocem.el --- NoCeM pseudo-cancellation treatment - -;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) -(eval-when-compile (require 'gnus-clfns)) - -(require 'gnus) -(require 'nnmail) -(require 'gnus-art) -(require 'gnus-sum) -(require 'gnus-range) - -(defgroup gnus-nocem nil - "NoCeM pseudo-cancellation treatment" - :group 'gnus-score) - -(defcustom gnus-nocem-groups - '("news.lists.filters" "news.admin.net-abuse.bulletins" - "alt.nocem.misc" "news.admin.net-abuse.announce") - "*List of groups that will be searched for NoCeM messages." - :group 'gnus-nocem - :type '(repeat (string :tag "Group"))) - -(defcustom gnus-nocem-issuers - '("AutoMoose-1" ; CancelMoose[tm] - "clewis@ferret.ocunix" ; Chris Lewis - "cosmo.roadkill" - "SpamHippo" - "hweede@snafu.de") - "*List of NoCeM issuers to pay attention to. - -This can also be a list of `(ISSUER CONDITION ...)' elements. - -See for an -issuer registry." - :group 'gnus-nocem - :type '(repeat (choice string sexp))) - -(defcustom gnus-nocem-directory - (nnheader-concat gnus-article-save-directory "NoCeM/") - "*Directory where NoCeM files will be stored." - :group 'gnus-nocem - :type 'directory) - -(defcustom gnus-nocem-expiry-wait 15 - "*Number of days to keep NoCeM headers in the cache." - :group 'gnus-nocem - :type 'integer) - -(defcustom gnus-nocem-verifyer 'mc-verify - "*Function called to verify that the NoCeM message is valid. -One likely value is `mc-verify'. If the function in this variable -isn't bound, the message will be used unconditionally." - :group 'gnus-nocem - :type '(radio (function-item mc-verify) - (function :tag "other"))) - -(defcustom gnus-nocem-liberal-fetch nil - "*If t try to fetch all messages which have @@NCM in the subject. -Otherwise don't fetch messages which have references or whose message-id -matches an previously scanned and verified nocem message." - :group 'gnus-nocem - :type 'boolean) - -(defcustom gnus-nocem-check-article-limit 500 - "*If non-nil, the maximum number of articles to check in any NoCeM group." - :group 'gnus-nocem - :version "21.1" - :type '(choice (const :tag "unlimited" nil) - (integer 1000))) - -(defcustom gnus-nocem-check-from t - "Non-nil means check for valid issuers in message bodies. -Otherwise don't bother fetching articles unless their author matches a -valid issuer, which is much faster if you are selective about the issuers." - :group 'gnus-nocem - :version "21.1" - :type 'boolean) - -;;; Internal variables - -(defvar gnus-nocem-active nil) -(defvar gnus-nocem-alist nil) -(defvar gnus-nocem-touched-alist nil) -(defvar gnus-nocem-hashtb nil) -(defvar gnus-nocem-seen-message-ids nil) - -;;; Functions - -(defun gnus-nocem-active-file () - (concat (file-name-as-directory gnus-nocem-directory) "active")) - -(defun gnus-nocem-cache-file () - (concat (file-name-as-directory gnus-nocem-directory) "cache")) - -;; -;; faster lookups for group names: -;; - -(defvar gnus-nocem-real-group-hashtb nil - "Real-name mappings of subscribed groups.") - -(defun gnus-fill-real-hashtb () - "Fill up a hash table with the real-name mappings from the user's active file." - (setq gnus-nocem-real-group-hashtb (gnus-make-hashtable - (length gnus-newsrc-alist))) - (mapcar (lambda (group) - (setq group (gnus-group-real-name (car group))) - (gnus-sethash group t gnus-nocem-real-group-hashtb)) - gnus-newsrc-alist)) - -(defun gnus-nocem-scan-groups () - "Scan all NoCeM groups for new NoCeM messages." - (interactive) - (let ((groups gnus-nocem-groups) - (gnus-inhibit-demon t) - group active gactive articles check-headers) - (gnus-make-directory gnus-nocem-directory) - ;; Load any previous NoCeM headers. - (gnus-nocem-load-cache) - ;; Get the group name mappings: - (gnus-fill-real-hashtb) - ;; Read the active file if it hasn't been read yet. - (and (file-exists-p (gnus-nocem-active-file)) - (not gnus-nocem-active) - (ignore-errors - (load (gnus-nocem-active-file) t t t))) - ;; Go through all groups and see whether new articles have - ;; arrived. - (while (setq group (pop groups)) - (if (not (setq gactive (gnus-activate-group group))) - () ; This group doesn't exist. - (setq active (nth 1 (assoc group gnus-nocem-active))) - (when (and (not (< (cdr gactive) (car gactive))) ; Empty group. - (or (not active) - (< (cdr active) (cdr gactive)))) - ;; Ok, there are new articles in this group, se we fetch the - ;; headers. - (save-excursion - (let ((dependencies (make-vector 10 nil)) - headers header) - (with-temp-buffer - (setq headers - (if (eq 'nov - (gnus-retrieve-headers - (setq articles - (gnus-uncompress-range - (cons - (if active (1+ (cdr active)) - (car gactive)) - (cdr gactive)))) - group)) - (gnus-get-newsgroup-headers-xover - articles nil dependencies) - (gnus-get-newsgroup-headers dependencies))) - (while (setq header (pop headers)) - ;; We take a closer look on all articles that have - ;; "@@NCM" in the subject. Unless we already read - ;; this cross posted message. Nocem messages - ;; are not allowed to have references, so we can - ;; ignore scanning followups. - (and (string-match "@@NCM" (mail-header-subject header)) - (and gnus-nocem-check-from - (let ((case-fold-search t)) - (catch 'ok - (mapcar - (lambda (author) - (if (consp author) - (setq author (car author))) - (if (string-match - author (mail-header-from header)) - (throw 'ok t))) - gnus-nocem-issuers) - nil))) - (or gnus-nocem-liberal-fetch - (and (or (string= "" (mail-header-references - header)) - (null (mail-header-references header))) - (not (member (mail-header-message-id header) - gnus-nocem-seen-message-ids)))) - (push header check-headers))) - (let* ((i 0) - (check-headers - (last check-headers gnus-nocem-check-article-limit)) - (len (length check-headers))) - (dolist (h check-headers) - (gnus-message - 7 "Checking article %d in %s for NoCeM (%d of %d)..." - (mail-header-number h) group (incf i) len) - (gnus-nocem-check-article group h))))))) - (setq gnus-nocem-active - (cons (list group gactive) - (delq (assoc group gnus-nocem-active) - gnus-nocem-active))))) - ;; Save the results, if any. - (gnus-nocem-save-cache) - (gnus-nocem-save-active))) - -(defun gnus-nocem-check-article (group header) - "Check whether the current article is an NCM article and that we want it." - ;; Get the article. - (let ((date (mail-header-date header)) - (gnus-newsgroup-name group) - issuer b e type) - (when (or (not date) - (time-less-p - (time-since (date-to-time date)) - (days-to-time gnus-nocem-expiry-wait))) - (gnus-request-article-this-buffer (mail-header-number header) group) - (goto-char (point-min)) - (when (re-search-forward "-----BEGIN PGP MESSAGE-----" nil t) - (delete-region (point-min) (match-beginning 0))) - (when (re-search-forward "-----END PGP MESSAGE-----\n?" nil t) - (delete-region (match-end 0) (point-max))) - (goto-char (point-min)) - ;; The article has to have proper NoCeM headers. - (when (and (setq b (search-forward "\n@@BEGIN NCM HEADERS\n" nil t)) - (setq e (search-forward "\n@@BEGIN NCM BODY\n" nil t))) - ;; We get the name of the issuer. - (narrow-to-region b e) - (setq issuer (mail-fetch-field "issuer") - type (mail-fetch-field "issuer")) - (widen) - (if (not (gnus-nocem-message-wanted-p issuer type)) - (message "invalid NoCeM issuer: %s" issuer) - (and (gnus-nocem-verify-issuer issuer) ; She is who she says she is. - (gnus-nocem-enter-article) ; We gobble the message. - (push (mail-header-message-id header) ; But don't come back for - gnus-nocem-seen-message-ids))))))) ; second helpings. - -(defun gnus-nocem-message-wanted-p (issuer type) - (let ((issuers gnus-nocem-issuers) - wanted conditions condition) - (cond - ;; Do the quick check first. - ((member issuer issuers) - t) - ((setq conditions (cdr (assoc issuer issuers))) - ;; Check whether we want this type. - (while (setq condition (pop conditions)) - (cond - ((stringp condition) - (setq wanted (string-match condition type))) - ((and (consp condition) - (eq (car condition) 'not) - (stringp (cadr condition))) - (setq wanted (not (string-match (cadr condition) type)))) - (t - (error "Invalid NoCeM condition: %S" condition)))) - wanted)))) - -(defun gnus-nocem-verify-issuer (person) - "Verify using PGP that the canceler is who she says she is." - (if (fboundp gnus-nocem-verifyer) - (ignore-errors - (funcall gnus-nocem-verifyer)) - ;; If we don't have Mailcrypt, then we use the message anyway. - t)) - -(defun gnus-nocem-enter-article () - "Enter the current article into the NoCeM cache." - (goto-char (point-min)) - (let ((b (search-forward "\n@@BEGIN NCM BODY\n" nil t)) - (e (search-forward "\n@@END NCM BODY\n" nil t)) - (buf (current-buffer)) - ncm id group) - (when (and b e) - (narrow-to-region b (1+ (match-beginning 0))) - (goto-char (point-min)) - (while (search-forward "\t" nil t) - (cond - ((not (ignore-errors - (setq group (let ((obarray gnus-active-hashtb)) (read buf))))) - ;; An error. - ) - ((not (symbolp group)) - ;; Ignore invalid entries. - ) - ((not (boundp group)) - ;; Make sure all entries in the hashtb are bound. - (set group nil)) - (t - (when (gnus-gethash (gnus-group-real-name (symbol-name group)) - gnus-nocem-real-group-hashtb) - ;; Valid group. - (beginning-of-line) - (while (eq (char-after) ?\t) - (forward-line -1)) - (setq id (buffer-substring (point) (1- (search-forward "\t")))) - (unless (gnus-gethash id gnus-nocem-hashtb) - ;; only store if not already present - (gnus-sethash id t gnus-nocem-hashtb) - (push id ncm)) - (forward-line 1) - (while (eq (char-after) ?\t) - (forward-line 1)))))) - (when ncm - (setq gnus-nocem-touched-alist t) - (push (cons (let ((time (current-time))) (setcdr (cdr time) nil) time) - ncm) - gnus-nocem-alist)) - t))) - -(defun gnus-nocem-load-cache () - "Load the NoCeM cache." - (interactive) - (unless gnus-nocem-alist - ;; The buffer doesn't exist, so we create it and load the NoCeM - ;; cache. - (when (file-exists-p (gnus-nocem-cache-file)) - (load (gnus-nocem-cache-file) t t t) - (gnus-nocem-alist-to-hashtb)))) - -(defun gnus-nocem-save-cache () - "Save the NoCeM cache." - (when (and gnus-nocem-alist - gnus-nocem-touched-alist) - (with-temp-file (gnus-nocem-cache-file) - (gnus-prin1 `(setq gnus-nocem-alist ',gnus-nocem-alist))) - (setq gnus-nocem-touched-alist nil))) - -(defun gnus-nocem-save-active () - "Save the NoCeM active file." - (with-temp-file (gnus-nocem-active-file) - (gnus-prin1 `(setq gnus-nocem-active ',gnus-nocem-active)))) - -(defun gnus-nocem-alist-to-hashtb () - "Create a hashtable from the Message-IDs we have." - (let* ((alist gnus-nocem-alist) - (pprev (cons nil alist)) - (prev pprev) - (expiry (days-to-time gnus-nocem-expiry-wait)) - entry) - (setq gnus-nocem-hashtb (gnus-make-hashtable (* (length alist) 51))) - (while (setq entry (car alist)) - (if (not (time-less-p (time-since (car entry)) expiry)) - ;; This entry has expired, so we remove it. - (setcdr prev (cdr alist)) - (setq prev alist) - ;; This is ok, so we enter it into the hashtable. - (setq entry (cdr entry)) - (while entry - (gnus-sethash (car entry) t gnus-nocem-hashtb) - (setq entry (cdr entry)))) - (setq alist (cdr alist))))) - -(gnus-add-shutdown 'gnus-nocem-close 'gnus) - -(defun gnus-nocem-close () - "Clear internal NoCeM variables." - (setq gnus-nocem-alist nil - gnus-nocem-hashtb nil - gnus-nocem-active nil - gnus-nocem-touched-alist nil - gnus-nocem-seen-message-ids nil - gnus-nocem-real-group-hashtb nil)) - -(defun gnus-nocem-unwanted-article-p (id) - "Say whether article ID in the current group is wanted." - (and gnus-nocem-hashtb - (gnus-gethash id gnus-nocem-hashtb))) - -(provide 'gnus-nocem) - -;;; gnus-nocem.el ends here diff --git a/lisp/gnus-offline.el b/lisp/gnus-offline.el deleted file mode 100644 index fd97d06..0000000 --- a/lisp/gnus-offline.el +++ /dev/null @@ -1,978 +0,0 @@ -;;; gnus-offline.el --- To process mail & news at offline environment. - -;;; Copyright (C) 1998, 2001 Tatsuya Ichikawa -;;; Copyright (C) 1998, 2001 Yukihiro Ito -;;; Author: Tatsuya Ichikawa -;;; Yukihiro Ito -;;; Hidekazu Nakamura -;;; Tsukamoto Tetsuo - -;;; Version: 2.20 -;;; Keywords: news , mail , offline , gnus -;;; -;;; SPECIAL THANKS -;;; Keiichi Suzuki -;;; KORIYAMA Naohiro -;;; Katsumi Yamaoka - -;;; This file is part of Semi-gnus. -;;; -;;; GNU Emacs 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. - -;;; GNU Emacs 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. -;;; -;;;; Commentary: -;;; Note. -;;; This file works only with after version of Emacs 19.30. -;;; This file needs miee.el and SEMI. -;;; If you set gnus-offline-drafts-queue-type to 'agent , you don't need -;;; miee.el -;;; You must use T-gnus 6.12.0 or later. -;;; -;;; How to use. -;;; -;;; Add following code at the end in your .emacs -;;; -;;; (load "gnus-ofsetup") -;;; (gnus-setup-for-offline) -;;; -;;; If you use gnus-agent as souper , put gnus-agent setup code in you .gnus.el -;;; -;;; If you use nnspool as souper , put following code in your .emacs before -;;; gnus-offline setting. -;;; -;;; Then , put hang.exe in exec-path directory. -;;; -;;; In Gnus group buffer , type g to get all news and mail. -;;; Then send mail and news in spool directory. -;;; -;;; Variables. -;;; gnus-offline-dialup-program-arguments -;;; ... List of dialup program arguments. -;;; gnus-offline-hangup-program-arguments -;;; ... List of hangup program arguments. -;;; gnus-offline-mail-treat-environ ... toggle sending mail online/offline. -;;; gnus-offline-articles-to-fetch ... toggle fetch articles. -;;; both->mail->news->both... -;;; gnus-offline-load-hook ... hook before gnus-offline load. -;;; gnus-offline-before-online-hook ... hook before all online jobs. -;;; gnus-offline-after-online-hook ... hook after all online jobs. -;;; gnus-offline-interval-time ... Interval time to do all online jobs. -;;; (minutes) -;;; gnus-offline-dialup-function ... Function to diualup. -;;; gnus-offline-hangup-function ... Function to hangup. - -;;; Code: - -(eval '(run-hooks 'gnus-offline-load-hook)) - -(eval-when-compile (require 'cl)) - -(eval-when-compile - (require 'static) - (require 'gnus-agent) - (require 'gnus-group)) -(require 'custom) -(require 'easymenu) -(provide 'gnus-offline) - -(defgroup gnus-offline nil - "Offline backend utility for Gnus." - :prefix "gnus-offline-" - :group 'gnus - :group 'mail - :group 'news) - -(defconst gnus-offline-version-number "2.20") -(defconst gnus-offline-codename -;; "Beta5" ; Beta -;; "This is the time" ; 2.00 -;; "A matter of trust" -;; "Modern Woman" -;; "Ahhhhhhh!!" ; 2.10b1 - "Cup of life" ; 2.20 -;; "Code of silence" - ) - -(defconst gnus-offline-version (format "Gnus offline backend utiliy v%s" - gnus-offline-version-number)) - -(eval-when-compile - (defvar nnagent-version) - (defvar nnspool-version) - (defvar msspool-news-server) - (defvar msspool-news-service) - (defvar miee-popup-menu)) - -(if (featurep 'meadow) - (define-process-argument-editing "/hang\\.exe\\'" - (lambda (x) - (general-process-argument-editing-function - x nil t t nil t t)))) - -(defcustom gnus-offline-auto-ppp '(connect disconnect) - "*This variable decides whether to connect and/or disconnect automatically." - :group 'gnus-offline - :type '(choice - (const :tag "Connection and Disconnection" (connect disconnect)) - (const :tag "Connection Only" (connect)) - (const :tag "Do Everything Manually" nil))) - -(defcustom gnus-offline-load-hook nil - "*Hook to be run after the gnus-offline package has been loaded." - :group 'gnus-offline - :type 'hook) - -(defcustom gnus-offline-before-online-hook nil - "*Hook to be run before all online jobs." - :group 'gnus-offline - :type 'hook) - -(defcustom gnus-offline-after-online-hook nil - "*Hook to be run after all online jobs." - :group 'gnus-offline - :type 'hook) - -(defcustom gnus-offline-mail-treat-environ 'offline - "*If online , gnus-offline send all mail under online environ. -If offline , gnus-offline send all mail temporary to spool dir." - :group 'gnus-offline - :type '(choice (const offline) - (const online))) - -(defcustom gnus-offline-articles-to-fetch 'both - "*If both , gnus-offline fetch mail and news articles. -If mail , gnus-offline only fetch mail articles. - If news , gnus-offline only fetch news articles." - :group 'gnus-offline - :type '(choice (const both) - (const mail) - (const news))) - -(defcustom gnus-offline-mail-group-level 1 - "*Group level for mail group." - :group 'gnus-offline - :type 'integer) - -(defcustom gnus-offline-after-empting-spool-hook nil - "*Hook to be run before empting spool." - :group 'gnus-offline - :type 'hook) - -(defcustom gnus-offline-before-empting-spool-hook nil - "*Hook to be run after empting spool." - :group 'gnus-offline - :type 'hook) - -(defcustom gnus-offline-dialup-function 'gnus-offline-connect-server - "*Function to dialup." - :group 'gnus-offline - :type 'function) - -(defcustom gnus-offline-hangup-function 'gnus-offline-hangup-line - "*Function to hangup." - :group 'gnus-offline - :type 'function) - -(defcustom gnus-offline-auto-expire t - "*Non-nil means expire articles on every session." - :group 'gnus-offline - :type 'boolean) - -;; These variables should be customized using `gnus-offline-customize', -;; not by `customize'. - -(defvar gnus-offline-dialup-program nil - "*Program name for dialup.") - -(defvar gnus-offline-hangup-program nil - "*Program name for hangup.") - -(defvar gnus-offline-dialup-program-arguments nil - "*Program arguments of gnus-offline-dialup-program.") - -(defvar gnus-offline-hangup-program-arguments nil - "*Program arguments of gnus-offline-hangup-program.") - -(defvar gnus-offline-interval-time 0 - "*Interval time(minutes) to do online jobs. -If set to 0 , timer call is disabled.") - -(defvar gnus-offline-drafts-queue-type 'agent - "*Queuing function used for draft messages.") - -(defvar gnus-offline-MTA-type 'smtp - "*Type of MTA, sendmail or smtp.el.") - -;;; Internal variables. -(defvar gnus-offline-connected nil - "*If value is t , dialup line is connected status. -If value is nil , dialup line is disconnected status.") - -(defvar gnus-offline-news-fetch-method nil - "*Method to fetch news articles.") - -(defvar gnus-offline-mail-fetch-method nil - "*Method to fetch mail articles.") - -(defvar gnus-offline-header-string - (format "%s - \"%s\"" - gnus-offline-version - gnus-offline-codename) - "*Header string for gnus-offline.") - -(defvar gnus-offline-stored-group-level nil - "*Mail Group level before changing.") - -(defvar gnus-offline-mail-source nil - "*mail-sources save variable.") - -(defvar gnus-offline-lang) - -(defvar gnus-offline-resource-en - '((error-check-1 - . "WARNING!!: gnus-agent.el or nnagent.el is not loaded. -Please check your .emacs or .gnus.el to work gnus-agent fine.") - (error-check-2 ."WARNING!!: nnspool.el is not loaded. -Please check your .emacs or .gnus.el to work nnspool fine.") - (connect-server-1 . "Dialing ...") - (connect-server-2 . "Dialing ... done.") - (get-new-news-function-1 . "Set to online status.") - (hangup-line-1 . "Hang up line ... ") - (hangup-line-2 . "Hang up line ... done.") - (after-jobs-done-1 . "All online jobs has done.") - (set-auto-ppp-1 . "Connect and disconnect automatically.") - (set-auto-ppp-2 . "Connect automatically.") - (set-auto-ppp-3 . "Connect and disconnect manually.") - (set-auto-ppp-menu-1 . "Automatically Connect/Disconnect") - (set-auto-ppp-menu-2 . "Automatically Connect") - (set-auto-ppp-menu-3 . "Manually Connect/Disconnect") - (toggle-on/off-send-mail-1 . "Sending mail immidiately.") - (toggle-on/off-send-mail-2 . "Sending mail temporary to spool directory.") - (toggle-articles-to-fetch-1 . "Articles fetch from server.") - (toggle-articles-to-fetch-2 . "Only Mail") - (toggle-articles-to-fetch-3 . "Only News") - (toggle-articles-to-fetch-4 . "Mail/News both") - (empting-spool-1 . "Sending mails in spool ...") - (empting-spool-2 . "Sending mails in spool ... done.") - (empting-spool-3 . "Posting news in spool ...") - (empting-spool-4 . "Posting news in spool ... done.") - (empting-spool-5 . "Sending messages in spool ...") - (empting-spool-6 . "Sending messages in spool ... done.") - (interval-time-1 . "Interval time (now %d minutes) : ") - (interval-time-2 . "Retrieving message logic by timer is disabled.") - (interval-time-3 . "Interval time set to %d minutes") - (menu-miee-1 . "Post news in spool") - (menu-miee-2 . "Send mails in spool") - (menu-miee-3 . "Message Offline") - (menu-miee-4 . "Message Online") - (menu-1 . "Toggle articles to fetch") - (menu-2 . "Toggle online/offline send mail") - (menu-3 . "Set auto PPP") - (menu-4 . "Expire articles") - (menu-5 . "Set interval time") - (menu-6 . "Hang up Line.") - (menu-7 . "Customize options..."))) - -(defvar gnus-offline-resource-ja - '((error-check-1 - . "$B7Y9p(B!!: gnus-agent.el $B$^$?$O(B nnagent.el $B$,%m!<%I$5$l$F$$$^$;$s!#(B -.emacs $B$^$?$O(B .gnus.el $B$N(B gnus-agent $B$N@_Dj$r@5$7$/$7$F$/$@$5$$!#(B") - (error-check-2 ."$B7Y9p(B!!: nnspool.el $B$,%m!<%I$5$l$F$$$^$;$s!#(B -.emacs $B$^$?$O(B .gnus.el $B$N(B nnspool $B$N@_Dj$r@5$7$/$7$F$/$@$5$$!#(B") - (connect-server-1 . "$B@\B3$7$F$$$^$9(B...") - (connect-server-2 . "$B@\B3$7$F$$$^$9(B...$B40N;!#(B") - (get-new-news-function-1 . "$B%*%s%i%$%s>uBV$G$9!#(B") - (set-auto-ppp-1 . "$B<+F0E*$K(B PPP $B@\B3!&@ZCG$7$^$9!#(B") - (set-auto-ppp-2 . "$B<+F0E*$K(B PPP $B@\B3$7$^$9!#(B") - (set-auto-ppp-3 . "$B@\Aw?.$7$^$9!#(B") - (toggle-on/off-send-mail-2 . "$B%a!<%k$O%-%e!<$KAw$i$l$^$9!#(B") - (toggle-articles-to-fetch-1 . "$BJ}$G$9!#(B") - (empting-spool-1 . "$B%-%e!<$N%a!<%k$rAw?.Cf(B...") - (empting-spool-2 . "$B%-%e!<$N%a!<%k$rAw?.Cf(B... $B40N;!#(B") - (empting-spool-3 . "$B%-%e!<$N%K%e!<%95-;v$rAw?.Cf(B...") - (empting-spool-4 . "$B%-%e!<$N%K%e!<%95-;v$rAw?.Cf(B... $B40N;!#(B") - (empting-spool-5 . "$B%-%e!<$N%a%C%;!<%8$rAw?.Cf(B...") - (empting-spool-6 . "$B%-%e!<$N%a%C%;!<%8$rAw?.Cf(B... $B40N;!#(B") - (interval-time-1 . "$BAwuBV$X(B") - (menu-miee-4 . "Online $B>uBV$X(B") - (menu-1 . "$BC$9(B") - (menu-5 . "$B5-;v mail -> news -> both -;; -(defun gnus-offline-toggle-articles-to-fetch () - "*Set articles to fetch... both(Mail/News) -> mail only -> News only -> both" - (interactive) - (let ((string (gnus-offline-gettext 'toggle-articles-to-fetch-1)) - str) - (cond ((eq gnus-offline-articles-to-fetch 'both) - (setq gnus-offline-articles-to-fetch 'mail - str (gnus-offline-gettext 'toggle-articles-to-fetch-2))) - ((eq gnus-offline-articles-to-fetch 'mail) - (setq gnus-offline-articles-to-fetch 'news - str (gnus-offline-gettext 'toggle-articles-to-fetch-3))) - (t - (setq gnus-offline-articles-to-fetch 'both - str (gnus-offline-gettext 'toggle-articles-to-fetch-4)))) - (message "%s %s" string str))) -;; -;; Send mail and Post news using Miee or gnus-agent. -;; -(defun gnus-offline-empting-spool () - "*Send all drafts on queue." - (run-hooks 'gnus-offline-before-empting-spool-hook) - (if (eq gnus-offline-drafts-queue-type 'miee) - ;; Send queued message by miee.el. - (progn - (if (eq gnus-offline-mail-treat-environ 'offline) - (progn - (message "%s" (gnus-offline-gettext 'empting-spool-1)) - ;; Using miee to send mail. - (mail-spool-send) - (message "%s" (gnus-offline-gettext 'empting-spool-2)))) - (message "%s" (gnus-offline-gettext 'empting-spool-3)) - ;; Using miee to post news. - (if (and (not (stringp msspool-news-server)) - (not msspool-news-service)) - (progn - (setq msspool-news-server (nth 1 gnus-select-method)) - (setq msspool-news-service 119))) - (news-spool-post) - (message "%s" (gnus-offline-gettext 'empting-spool-4))) - ;; Send queued message by gnus-agent - (message "%s" (gnus-offline-gettext 'empting-spool-5)) - (gnus-group-send-drafts) - (message "%s" (gnus-offline-gettext 'empting-spool-6))) - ;; - (run-hooks 'gnus-offline-after-empting-spool-hook)) -;; -;; Set interval time -;; -(defun gnus-offline-set-interval-time () - "*Set interval time for gnus-daemon." - (interactive) - (setq gnus-offline-interval-time - (string-to-int (read-from-minibuffer - (format (gnus-offline-gettext 'interval-time-1) - gnus-offline-interval-time) - nil))) - (if (< gnus-offline-interval-time 2) - (progn - (message "%s" (gnus-offline-gettext 'interval-time-2)) - (setq gnus-offline-interval-time 0)) - (message - (format (gnus-offline-gettext 'interval-time-3) - gnus-offline-interval-time))) - (gnus-offline-processed-by-timer)) - -;; -;; Menu. -;; -(defun gnus-offline-define-menu-and-key () - "*Set key and menu." - (cond ((eq gnus-offline-drafts-queue-type 'miee) - (static-cond - ((featurep 'xemacs) - (add-hook 'gnus-group-mode-hook 'gnus-offline-define-menu-on-miee)) - (t - (gnus-offline-define-menu-on-miee)))) - (t - (add-hook 'gnus-group-mode-hook 'gnus-offline-define-menu-on-agent))) - ;; - (add-hook 'gnus-group-mode-hook - #'(lambda () - (local-set-key "\C-coh" 'gnus-offline-set-unplugged-state) - (local-set-key "\C-cof" 'gnus-offline-toggle-articles-to-fetch) - (local-set-key "\C-coo" 'gnus-offline-toggle-on/off-send-mail) - (local-set-key "\C-cox" 'gnus-offline-set-auto-ppp) - (local-set-key "\C-cos" 'gnus-offline-set-interval-time) - (if (eq gnus-offline-news-fetch-method 'nnagent) - (local-set-key "\C-coe" 'gnus-agent-expire)) - (static-unless (featurep 'xemacs) - (local-set-key - (if (eq system-type 'windows-nt) [S-mouse-2] [mouse-3]) - 'gnus-offline-popup-menu))))) - -;; -;; -(defun gnus-offline-popup (menu &optional title) - (static-cond - ((featurep 'xemacs) - (popup-menu menu)) - (t - (let ((menu-func (or (and (fboundp 'easy-menu-create-menu) - 'easy-menu-create-menu) - 'easy-menu-create-keymaps)) - keymap pop func) - (static-cond ((< emacs-major-version 20) - ;; For Emacsen from 19.34 down to 19.28. - ;; Seems the first item in MENU will be ignored. - (or (keymapp menu) - (setq menu - (append (list "" ;; This will be ignored. - (or title "Popup Menu") - "-----" - "-----") - (cdr menu)))) - (setq keymap - (if (keymapp menu) - (append (list 'keymap - (if title - `(nil ,title) - '(nil "Popup Menu")) - '(nil "") - '(nil "")) - (cdr menu)) - (funcall menu-func (car menu) (cdr menu))))) - (t - (setq keymap - (if (keymapp menu) - menu - (funcall menu-func (car menu) (cdr menu)))))) - ;; Display the popup menu. - (if (and (setq pop (x-popup-menu t keymap)) - (setq func (lookup-key keymap - (apply 'vector pop)))) - (funcall func)))))) - -(defun gnus-offline-get-menu-items (list) - (let (result) - (dolist (elem list) - (setq result - (nconc result - (list (if (listp elem) - (progn - (setcar elem (gnus-offline-gettext (car elem))) - (vconcat elem)) - elem))))) - result)) - -(defvar gnus-offline-menu - (gnus-offline-get-menu-items - '((menu-1 gnus-offline-toggle-articles-to-fetch t) - (menu-2 gnus-offline-toggle-on/off-send-mail t) - (menu-3 gnus-offline-set-auto-ppp t) - "----" - (menu-4 gnus-agent-expire - (eq gnus-offline-news-fetch-method 'nnagent)) - (menu-5 gnus-offline-set-interval-time t) - "----" - (menu-6 gnus-offline-set-unplugged-state gnus-offline-connected) - "----" - (menu-7 gnus-ofsetup-customize t)))) - -(defun gnus-offline-define-menu-on-miee () - "*Set and change menu bar on MIEE menu." - (let ((miee-menu - (gnus-offline-get-menu-items - '((menu-miee-1 news-spool-post t) - (menu-miee-2 mail-spool-send t) - "----" - (menu-miee-3 message-offline-state (not message-offline-state)) - (menu-miee-4 message-online-state message-offline-state) - "----"))) - menu) - (setq menu - (easy-menu-change - nil "Miee" - (append miee-menu - (list (cons "Gnus Offline" gnus-offline-menu))))) - (static-if (featurep 'xemacs) - (easy-menu-add menu)))) -;; -;; define menu without miee. -;; -(defun gnus-offline-define-menu-on-agent () - "*Set menu bar on OFFLINE menu." - (easy-menu-define - gnus-offline-menu-on-agent gnus-group-mode-map "Gnus offline Menu" - (cons "Offline" gnus-offline-menu)) - (static-if (featurep 'xemacs) - (easy-menu-add gnus-offline-menu-on-agent))) -;; -;; Popup menu within the group buffer (under Emacs). -;; -(static-unless (featurep 'xemacs) - (defun gnus-offline-popup-menu (event) - "Popup menu for Gnus Offline." - (interactive "e") - (apply 'gnus-offline-popup - (if (boundp 'miee-popup-menu) - (list (or (assq 'keymap - (assq 'Miee (assq 'menu-bar global-map))) - miee-popup-menu) - "Miee") - (list (symbol-value 'gnus-offline-menu-on-agent) - "Offline"))))) - -;; -;; Timer Function -(defun gnus-offline-processed-by-timer () - "*Set timer interval." - (let ((func (lambda () (call-interactively 'gnus-group-get-new-news))) - (time gnus-offline-interval-time)) - (cond ((and (> time 0) (not gnus-offline-connected)) - ;; Timer call - (gnus-demon-add-handler func time time)) - ((= gnus-offline-interval-time 0) - (gnus-demon-remove-handler func t))))) -;; -;; Code for making Gnus and Gnus Offline cooperate with each other. -;; - -;; Display `X-Gnus-Offline-Backend' message header aesthetically. -(eval-after-load "eword-decode" - '(mime-set-field-decoder 'X-Gnus-Offline-Backend nil nil)) - -;; Enable key and menu definitions here. -(eval '(funcall 'gnus-offline-define-menu-and-key)) - -;; -;; -;;; gnus-offline.el ends here diff --git a/lisp/gnus-ofsetup.el b/lisp/gnus-ofsetup.el deleted file mode 100644 index 4125f8a..0000000 --- a/lisp/gnus-ofsetup.el +++ /dev/null @@ -1,761 +0,0 @@ -;;; gnus-ofsetup.el --- Setup advisor for Offline reading for Mail/News. - -;; Copyright (C) 1998, 2001 Tatsuya Ichikawa - -;; Author: Tatsuya Ichikawa -;; Tsukamoto Tetsuo -;; -;; This file is part of Semi-gnus. - -;; GNU Emacs 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. - -;; GNU Emacs 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. -;; - -;;; Commentary: - -;; How to use. -;; -;; M-x load[RET]gnus-ofsetup -;; M-x gnus-setup-for-offline -;; - -;;; Code: - -(eval-when-compile (require 'cl)) - -(require 'read-passwd) - -(eval-and-compile - (defvar gnus-offline-lang - (cond ((and (featurep 'meadow) - (string= current-language-environment "Japanese")) - "ja_complete") - ((and (boundp 'current-language-environment) - (string= current-language-environment "Japanese")) - "ja") - (t - "en")) - "This variable decides which language will be used for display.")) - -(eval-when-compile - (require 'gnus) - (require 'gnus-offline)) - -(defvar gnus-offline-setting-file - (let ((user (user-login-name)) - (real-user (user-real-login-name))) - (if (string= user real-user) - "~/.gnus-offline.el" - ;; Seems it is after "su". - (let ((file (concat "~" user "/.gnus-offline.el")) - (real-file (concat "~" real-user "/.gnus-offline.el"))) - (cond ((file-exists-p real-file) - real-file) - ((file-exists-p file) - file) - (t - real-file)))))) - -(eval-when-compile - (defvar gnus-ofsetup-prepare-for-miee - '(;; Spool directory setting - MIEE. - (setq mail-spool (or mail-spool "/usr/spool/mail.out")) - (setq news-spool (or news-spool "/usr/spool/news.out")) - (condition-case nil - (progn - (if (not (file-exists-p mail-spool)) - (make-directory mail-spool t)) - (if (not (file-exists-p news-spool)) - (make-directory news-spool t))) - (error - (error (gnus-ofsetup-gettext 'prepare-miee-1)))))) - - (defvar gnus-ofsetup-update-setting-file - '((save-excursion - (set-buffer (get-buffer-create "* Setting")) - (erase-buffer) - (insert ";;\n") - (insert ";; This file is created by gnus-ofsetup.el\n") - (insert ";; Creation date : " (current-time-string) "\n") - (insert ";;\n") - - ;; write Basic setting - (insert "(setq gnus-offline-news-fetch-method '" - (prin1-to-string news-method) ")\n") - (insert "(setq gnus-offline-mail-fetch-method '" - (prin1-to-string mail-method) ")\n") - - ;; write dialup/hangup program and options. - (insert "(setq gnus-offline-dialup-program " - (prin1-to-string dialup-program) ")\n") - (if (stringp dialup-program) - (insert "(setq gnus-offline-dialup-program-arguments '" - (prin1-to-string dialup-program-arguments) ")\n")) - (insert "(setq gnus-offline-hangup-program " - (prin1-to-string hangup-program) ")\n") - (if (stringp hangup-program) - (insert "(setq gnus-offline-hangup-program-arguments '" - (prin1-to-string hangup-program-arguments) ")\n")) - - (if (integerp interval) - (insert "(setq gnus-offline-interval-time " - (prin1-to-string interval) ")\n")) - - ;; write setting about MIEE. - (when use-miee - (insert "(setq sendmail-to-spool-directory " - (prin1-to-string mail-spool) ")\n") - (insert "(setq news-spool-request-post-directory " - (prin1-to-string news-spool) ")\n") - (insert "(if (not (boundp 'miee-version)) - (load \"miee\"))\n") - (insert "(setq message-send-news-function 'gnspool-request-post)\n")) - - ;; write setting about nnspool and gnus-agent. - (if (eq news-method 'nnspool) - (insert "(message-offline-state)\n") - (insert "(setq gnus-agent-directory " - (prin1-to-string agent-directory) ")\n")) - - ;; write setting about queue type -- MIEE or nnagent. - (insert "(setq gnus-offline-drafts-queue-type '" - (prin1-to-string drafts-queue-type) ")\n") - (insert "(setq gnus-offline-MTA-type '" - (prin1-to-string MTA-type) ")\n") - - ;; Write setting about hooks. - (when (eq news-method 'nnspool) - (insert (format "%s %s %s\n" - "(add-hook" - "'after-getting-news-hook" - "'gnus-offline-nnspool-hangup-line)")) - (insert (format "%s %s %s\n" - "(add-hook" - "'gnus-before-startup-hook" - "(lambda () (setq nnmail-spool-file nil) - (setq mail-sources nil)))"))) - - ;; Write stting about mail-source.el - (insert "(setq gnus-offline-mail-source '" - (prin1-to-string mail-source) ")\n") - (insert "(setq mail-sources gnus-offline-mail-source)\n") - (if save-passwd - (insert "(add-hook 'gnus-setup-news-hook - (lambda () - (add-to-list 'gnus-variable-list 'mail-source-password-cache)))\n")) - - ;; - (write-region (point-min) (point-max) gnus-offline-setting-file)) - (kill-buffer "* Setting"))) - - (defmacro gnus-ofsetup-prepare (list) - (let ((forms (symbol-value list))) - `(progn ,@forms)))) - -(defvar gnus-ofsetup-resource-en - '((prepare-miee-1 - . "Making directories failed. Set mail/news spool directories properly.") - (completing-read-symbol-1 . " (TAB to completion): ") - (setup-1 . "Method for offline News reading") - (setup-2 . "Agent directory: ") - (setup-3 . "Dialup program (give a null string if you do not use): ") - (setup-4 . "Dialup program options: ") - (setup-5 . "Hangup program (give a null string if you do not use): ") - (setup-6 . "Hangup program options: ") - (setup-7 . "Select MTA type for sending mail") - (setup-8 . "Use MIEE post/send message ") - (setup-9 . "News spool directory for sending: ") - (setup-10 . "Mail spool directory for sending: ") - (setup-11 . "How many mail sources will get mails from? : ") - (setup-12 . "What type of the mail source? ") - (setup-13 . "Mail Account name : ") - (setup-14 . "Mail server : ") - (setup-15 . "Authentification Method ") - (setup-16 . "Do you use pop3.el to fetch mail? ") - (setup-17 . "movemail program name: ") - (setup-18 . "movemail options: ") - (setup-19 . "What network stream? ") - (setup-20 . "File: ") - (setup-21 . "Directory: ") - (setup-22 . "Do you save password information to newsrc file? ") - - (param-news-method-1 . "News Method") - (param-news-method-2 . "Gnus Agent") - (param-news-method-3 . "nnspool") - (param-news-method-4 . "\ -Method to fetch news articles.") - (param-dialup-program-1 . "Dialup Program") - (param-dialup-program-2 . "Use program..") - (param-dialup-program-3 . "Don't use a program.") - (param-dialup-program-4 . "\ -Program which does dial.") - (param-dialup-program-arg-1 . "Dialup Program Arguments") - (param-dialup-program-arg-2 . "Argument") - (param-dialup-program-arg-3 . "\ -Program arguments of gnus-offline-dialup-program.") - (param-hangup-program-1 . "Hangup Program") - (param-hangup-program-2 . "Use program..") - (param-hangup-program-3 . "Don't use a program.") - (param-hangup-program-4 . "\ -Program which does hangup.") - (param-hangup-program-arg-1 . "Hangup Program Arguments") - (param-hangup-program-arg-2 . "Argument") - (param-hangup-program-arg-3 . "\ -Program arguments of gnus-offline-hangup-program.") - (param-interval-1 . "Interval between Jobs") - (param-interval-2 . "\ -Interval time(minutes) to do online jobs. -If set to 0 , timer call is disabled.") - (param-drafts-queue-type-1 . "Drafts Queue Type") - (param-drafts-queue-type-2 . "Gnus Draft for queuing.") - (param-drafts-queue-type-3 . "I prefer MIEE for queuing.") - (param-drafts-queue-type-4 . "\ -Type of queue used for draft messages. - -If the select method for news is nnspool, you must choose MIEE. -MIEE is another library for offline messaging. It isn't part of -Semi-gnus. If you want to know about MIEE, see README-offline.{en,ja}.") - (param-mail-spool-1 . "Mail Spool Directory for MIEE") - (param-news-spool-1 . "News Spool Directory for MIEE") - (param-MTA-type-1 . "MTA Type") - (param-MTA-type-2 . "Use smtp.el") - (param-MTA-type-3 . "Use sendmail") - (param-MTA-type-4 . "\ -Type of MTA used for sending mail.") - (param-save-passwd-1 . "Save Password in Startup File") - (param-save-passwd-2 . "OK, I'm sure it's safe.") - (param-save-passwd-3 . "No way, it's too dangerous!") - (param-save-passwd-4 . "\ -Whether you want your POP passwords written in .newsrc.eld or not.") - (param-mail-source-1 . "Mail Sources") - (param-mail-source-2 . "\ -Information of mail sources. Actually, a list of `Mail Source Specifiers'. - -The format of this variable is just the same as `mail-sources' (or -`nnmail-spool-file' which seems obsolete). - -`Mail Source Specifiers' can take a lot of keywords. For example, -if you want to use movemail instead of pop3.el which comes with -Gnus, you can set a specifier using the kerword :program as shown -below: - - (pop :program \"movemail -pf po:%u %t %p\") - -If you want to know more about mail source specifiers and keywords, -click the button below.") - (customize-1 . "Customize the Gnus Offline Parameters, and press ") - (customize-2 . "done") - (customize-3 . "Push me when done customizing.") - (customize-4 . "Parameters") - (customize-5 . "\ -These parameters will be saved in ~/.gnus-offline.el. - -Note: Touching these parameters may require Gnus or even Emacs to be -restarted.") - (customize-6 . "Push me to learn more.") - (customize-done-1 . "(No changes need to be saved)") - (customize-done-2 - . "Invalid parameters. Check the news method and drafts queue type."))) - -(defvar gnus-ofsetup-resource-ja - '((prepare-miee-1 - . "$B%G%#%l%/%H%j$,:n$l$^$;$s!#%9%W!<%k$N@_Dj$r@5$7$/$7$F$/$@$5$$!#(B") - (completing-read-symbol-1 . "(TAB $B$GJd40$7$^$9(B): ") - (setup-1 . "$B%*%U%i%$%s$G%K%e!<%9$rFI$`J}K!$rA*$s$G$/$@$5$$(B ") - (setup-2 . "Gnus Agent $B$N%G%#%l%/%H%j(B: ") - (setup-3 - . "$B%@%$%d%k@\B3%W%m%0%i%`L>(B ($B;H$o$J$$>l9g$O6uJ8;zNs$rJV$7$F2<$5$$(B): ") - (setup-4 . "$B%@%$%d%k@\B3%W%m%0%i%`$N0z?t(B: ") - (setup-5 - . "$B%@%$%d%k@ZCG%W%m%0%i%`L>(B ($B;H$o$J$$>l9g$O6uJ8;zNs$rJV$7$F2<$5$$(B): ") - (setup-6 . "$B%@%$%d%k@ZCG%W%m%0%i%`$N0z?t(B: ") - (setup-7 . "$B%a!<%kAw?.$K;H$&(B MTA $B$rA*$s$G2<$5$$(B ") - (setup-8 . "$B%a%C%;!<%8$NAw?.$K(B MIEE $B$r;H$$$^$9$+(B? ") - (setup-9 . "$B%K%e!<%9$N%9%W!<%k%G%#%l%/%H%j(B: ") - (setup-10 . "$B%a!<%k$N%9%W!<%k%G%#%l%/%H%j(B: ") - (setup-11 . "$B@_Dj$9$k%a!<%k(B: ") - (setup-14 . "$B$=$N%"%+%&%s%H$N$"$k%a!<%k%5!<%PL>(B: ") - (setup-15 . "$BG'>ZJ}<0$O(B? ") - (setup-16 . "$B%a!<%k$NA0(B: ") - (setup-18 . "movemail $B%W%m%0%i%`$KEO$90z?t(B: ") - (setup-19 . "$B@\B3J}<0$O(B? ") - (setup-20 . "$B%U%!%$%k(B: ") - (setup-21 . "$B%G%#%l%/%H%j(B: ") - (setup-22 . "newsrc $B%U%!%$%k$K(B POP $B%Q%9%o!<%I$rJ]B8$7$^$9$+(B? ") - - (param-news-method-4 . "\ -$B%K%e!<%95-;v$rl9g!"(BMIEE $B$r;XDj$9$kI,MW$,$"$j$^$9!#(B -MIEE $B$O%*%U%i%$%s$G$N%a!<%k(B/$B%K%e!<%9Aw?.5!G=$rDs6!$9$k%i%$%V%i%j$G$9$,!"(B -Semi-gnus $B$K$OIUB0$7$F$$$^$;$s!#(BMIEE $B$K$D$$$FCN$j$?$$>l9g$O(B -README-offline.{en,ja} $B$r;2>H$7$F$/$@$5$$!#(B") - (param-MTA-type-4 . "\ -MTA $B$O%a!<%k$NAw?.$rl9g$K$O!"(B:program $B$r$$$&%-!<%o!<(B -$B%I$r;XDj$7$F0J2<$NMM$K5-=R$7$^$9!#(B - - (pop :program \"movemail -pf po:%u %t %p\") - -mail source specifier $B$H$+>e5-$N$h$&$J%-!<%o!<%I$K$D$$$F$b$C$H$h$/(B -$BCN$j$?$$>l9g$O!"0J2<$N%\%?%s$r%/%j%C%/$7$F$/$@$5$$!#(B(Info $B$N3:Ev2U=j(B -$B$X$N%j%s%/$K$J$C$F$$$^$9!#(B)" ) - - (customize-1 - . "Gnus Offline $B$N%Q%i%a!<%?!#=*$o$C$?$i1&$N%\%?%s$r2!$7$F$/$@$5$$!#(B") - (customize-2 . "done") - (customize-3 . "$B@_Dj$7=*$o$C$?$i%\%/$r2!$7$F$M!#(B") - (customize-4 . "$B%Q%i%a!<%?(B") - (customize-5 . "\ -$B$3$l$i$N%Q%i%a!<%?$O(B ~/.gnus-offline.el $B$KJ]B8$5$l$^$9!#(B - -$BCm0U(B: $B$3$l$i$N%Q%i%a!<%?$NJQ99$O>l9g$K$h$C$F$O(B Gnus ($B$5$i$K>l9g$K(B -$B$h$C$F$O(B Emacs) $B$N:F5/F0$rI,MW$H$9$k$3$H$,$"$j$^$9!#(B") - (customize-6 . "$B$b$C$HCN$j$?$$>l9g$O%\%/$r2!$7$F$M!#(B") - (customize-done-1 . "($BJ]B8$9$Y$-JQ99$O$"$j$^$;$s(B)") - (customize-done-2 - . "$B%K%e!<%99VFI$7$F$/$@$5$$!#(B") - )) - -(defvar gnus-ofsetup-resource-ja_complete - (append - gnus-ofsetup-resource-ja - '((param-news-method-1 . "$B%K%e!<%99VFIJ}K!(B") - (param-news-method-2 . "Gnus Agent") - (param-news-method-3 . "nnspool") - (param-dialup-program-1 . "$B%@%$%d%k@\B3%W%m%0%i%`(B") - (param-dialup-program-2 . "$B%W%m%0%i%`$r;H$&(B..") - (param-dialup-program-3 . "$B%W%m%0%i%`$O;XDj$7$J$$(B") - (param-dialup-program-arg-1 . "$B%@%$%d%k@\B3%W%m%0%i%`$N0z?t(B") - (param-dialup-program-arg-2 . "$B0z?t(B") - (param-hangup-program-1 . "$B%@%$%d%k@ZCG%W%m%0%i%`(B") - (param-hangup-program-2 . "$B%W%m%0%i%`$r;H$&(B..") - (param-hangup-program-3 . "$B%W%m%0%i%`$O;XDj$7$J$$(B") - (param-hangup-program-arg-1 . "$B%@%$%d%k@ZCG%W%m%0%i%`$N0z?t(B") - (param-hangup-program-arg-2 . "$B0z?t(B") - (param-interval-1 . "$B<+F0AwpJs(B")))) - -(defsubst gnus-ofsetup-gettext (symbol &optional lang) - (setq lang (or lang gnus-offline-lang)) - (or - (cdr (assq symbol (symbol-value - (intern (format "gnus-ofsetup-resource-%s" lang))))) - (cdr (assq symbol gnus-ofsetup-resource-en)))) - -(defun gnus-ofsetup-completing-read-symbol (msg &rest syms) - (intern - (completing-read (concat - msg - (gnus-ofsetup-gettext 'completing-read-symbol-1)) - (mapcar - #'(lambda (sym) - (list (symbol-name sym))) - syms) - nil t nil))) - -(defun gnus-setup-for-offline (&optional force) - "*Set up Gnus for offline environment." - (interactive "P") - (unless (and (file-exists-p gnus-offline-setting-file) (not force)) - (let (news-method - mail-method agent-directory drafts-queue-type news-spool mail-spool - use-miee MTA-type dialup-program dialup-program-arguments - hangup-program hangup-program-arguments interval - num-of-address i n mail-source save-passwd) - (setq news-method - (gnus-ofsetup-completing-read-symbol - (gnus-ofsetup-gettext 'setup-1) - 'nnagent 'nnspool)) - ;; Setting for gnus-agent. - (if (eq news-method 'nnagent) - (setq agent-directory - (read-from-minibuffer - (gnus-ofsetup-gettext 'setup-2) "~/News/agent"))) - (setq mail-method 'nnmail) - (setq dialup-program - (read-file-name - (gnus-ofsetup-gettext 'setup-3) - nil nil t)) - (if (string-match "^[ \t]*$" dialup-program) - (setq dialup-program nil) - (setq dialup-program-arguments - (delete "" (split-string - (read-from-minibuffer - (gnus-ofsetup-gettext 'setup-4)) - "[\t ]+")))) - (setq hangup-program - (read-file-name - (gnus-ofsetup-gettext 'setup-5) - nil nil t)) - (if (string-match "^[ \t]*$" hangup-program) - (setq hangup-program nil) - (setq hangup-program-arguments - (delete "" (split-string - (read-from-minibuffer - (gnus-ofsetup-gettext 'setup-6)) - "[\t ]+")))) - (setq MTA-type (gnus-ofsetup-completing-read-symbol - (gnus-ofsetup-gettext 'setup-7) - 'smtp 'sendmail)) - (if (eq news-method 'nnspool) - (setq use-miee t) - (setq use-miee (y-or-n-p (gnus-ofsetup-gettext 'setup-8)))) - (if use-miee - (progn - ;; Setting for MIEE. - (setq news-spool - (read-from-minibuffer - (gnus-ofsetup-gettext 'setup-9) - "/usr/spool/news.out")) - (setq mail-spool - (read-from-minibuffer - (gnus-ofsetup-gettext 'setup-10) - "/usr/spool/mail.out")) - (setq drafts-queue-type 'miee) - (gnus-ofsetup-prepare gnus-ofsetup-prepare-for-miee)) - ;; Set drafts type gnus-agent. - (setq drafts-queue-type 'agent)) - ;; Create a list of mail source specifiers. - (setq num-of-address - (read-from-minibuffer (gnus-ofsetup-gettext 'setup-11))) - (setq i (setq n (string-to-int num-of-address))) - ;; - (while (> i 0) - (let* ((j (- n (1- i))) - (type (gnus-ofsetup-completing-read-symbol - (format "<%d of %d> %s" j n - (gnus-ofsetup-gettext 'setup-12)) - 'pop 'imap 'file 'directory 'maildir)) - user server authentication stream islisp source - prog args program path) - ;; Prepare. - (when (or (string= type "pop") (string= type "imap")) - (setq user (read-from-minibuffer - (format "<%d of %d> %s" j n - (gnus-ofsetup-gettext 'setup-13)))) - (setq server (read-from-minibuffer - (format "<%d of %d> %s" j n - (gnus-ofsetup-gettext 'setup-14))))) - (when (string= type "pop") - (setq authentication (gnus-ofsetup-completing-read-symbol - (format "<%d of %d> %s" j n - (gnus-ofsetup-gettext 'setup-15)) - 'password 'apop)) - (setq islisp (y-or-n-p - (format "<%d of %d> %s" j n - (gnus-ofsetup-gettext 'setup-16)))) - (unless islisp - (setq prog (read-file-name - (format "<%d of %d> %s" j n - (gnus-ofsetup-gettext 'setup-17)) - exec-directory "movemail")) - (setq args (read-from-minibuffer - (format "<%d of %d> %s" j n - (gnus-ofsetup-gettext 'setup-18) "-pf"))) - (setq program (format "%s %s %s %s %s" - prog args "po:%u" "%t" "%p")))) - (when (string= type "imap") - (setq stream (gnus-ofsetup-completing-read-symbol - (format "<%d of %d> %s" j n - (gnus-ofsetup-gettext 'setup-19)) - 'kerberos4 'starttls 'ssl 'network)) - (setq authentication (gnus-ofsetup-completing-read-symbol - (format "<%d of %d> %s" j n - (gnus-ofsetup-gettext 'setup-14)) - 'kerberos4 'digest-md5 'cram-md5 'login - 'anonymous))) - (when (string= type "file") - (setq path (read-file-name - (format "<%d of %d> %s" j n - (gnus-ofsetup-gettext 'setup-20))))) - (when (or (string= type "directory") (string= type "maildir")) - (setq path (read-file-name - (format "<%d of %d> %s" j n - (gnus-ofsetup-gettext 'setup-21))))) - ;; Now set a mail source specifier. - (setq source (list type)) - (let (value) - (dolist (symbol '(path user server authentication stream program)) - (when (setq value (symbol-value symbol)) - (setq source (nconc source - (list (make-symbol (format ":%s" symbol)) - value)))))) - (setq mail-source (nconc mail-source (list source)))) - (setq i (1- i))) - (setq save-passwd - (y-or-n-p (gnus-ofsetup-gettext 'setup-22))) - ;; - (gnus-ofsetup-prepare gnus-ofsetup-update-setting-file))) - (load gnus-offline-setting-file)) - - -;; Suppport for customizing gnus-ofsetup parameters. - -(defvar sendmail-to-spool-directory) -(defvar news-spool-request-post-directory) - -(defun gnus-ofsetup-find-parameters () - "Return the each current value of gnus-offline parameters." - `((news-method - (choice :tag ,(gnus-ofsetup-gettext 'param-news-method-1) - :value ,gnus-offline-news-fetch-method - (const :tag ,(gnus-ofsetup-gettext 'param-news-method-2) - nnagent) - (const :tag ,(gnus-ofsetup-gettext 'param-news-method-3) - nnspool)) - ,(gnus-ofsetup-gettext 'param-news-method-4)) - - (dialup-program - (choice :tag ,(gnus-ofsetup-gettext 'param-dialup-program-1) - :value ,gnus-offline-dialup-program - (string :tag ,(gnus-ofsetup-gettext 'param-dialup-program-2)) - (const :tag ,(gnus-ofsetup-gettext - 'param-dialup-program-3) nil)) - ,(gnus-ofsetup-gettext 'param-dialup-program-4)) - - (dialup-program-arguments - (repeat :tag ,(gnus-ofsetup-gettext 'param-dialup-program-arg-1) - :value ,gnus-offline-dialup-program-arguments - (string :tag ,(gnus-ofsetup-gettext - 'param-dialup-program-arg-2))) - ,(gnus-ofsetup-gettext 'param-dialup-program-arg-3)) - - (hangup-program - (choice :tag ,(gnus-ofsetup-gettext 'param-hangup-program-1) - :value ,gnus-offline-hangup-program - (string :tag ,(gnus-ofsetup-gettext 'param-hangup-program-2)) - (const :tag ,(gnus-ofsetup-gettext 'param-hangup-program-3) - nil)) - ,(gnus-ofsetup-gettext 'param-hangup-program-4)) - - (hangup-program-arguments - (repeat :tag ,(gnus-ofsetup-gettext 'param-hangup-program-arg-1) - :value ,gnus-offline-hangup-program-arguments - (string :tag ,(gnus-ofsetup-gettext - 'param-hangup-program-arg-2))) - ,(gnus-ofsetup-gettext 'param-hangup-program-arg-3)) - - (interval - (integer :tag ,(gnus-ofsetup-gettext 'param-interval-1) - :value ,gnus-offline-interval-time) - ,(gnus-ofsetup-gettext 'param-interval-2)) - - (drafts-queue-type - (choice :tag ,(gnus-ofsetup-gettext 'param-drafts-queue-type-1) - :value ,gnus-offline-drafts-queue-type - (const :tag ,(gnus-ofsetup-gettext 'param-drafts-queue-type-2) - agent) - (const :tag ,(gnus-ofsetup-gettext 'param-drafts-queue-type-3) - miee)) - ,(gnus-ofsetup-gettext 'param-drafts-queue-type-4)) - - (mail-spool - (directory :tag ,(gnus-ofsetup-gettext 'param-mail-spool-1) - :value ,(cond ((and (boundp 'sendmail-to-spool-directory) - sendmail-to-spool-directory) - sendmail-to-spool-directory) - (t - "/usr/spool/mail.out")))) - - (news-spool - (directory :tag ,(gnus-ofsetup-gettext 'param-news-spool-1) - :value ,(cond ((and (boundp 'news-spool-request-post-directory) - news-spool-request-post-directory) - news-spool-request-post-directory) - (t - "/usr/spool/news.out")))) - - (MTA-type - (choice :tag ,(gnus-ofsetup-gettext 'param-MTA-type-1) - :value ,gnus-offline-MTA-type - (const :tag ,(gnus-ofsetup-gettext 'param-MTA-type-2) smtp) - (const :tag ,(gnus-ofsetup-gettext 'param-MTA-type-3) - sendmail)) - ,(gnus-ofsetup-gettext 'param-MTA-type-4)) - - (save-passwd - (choice :tag ,(gnus-ofsetup-gettext 'param-save-passwd-1) - :value ,(if (memq 'mail-source-password-cache gnus-variable-list) - t - nil) - (const :tag ,(gnus-ofsetup-gettext 'param-save-passwd-2) t) - (const :tag ,(gnus-ofsetup-gettext 'param-save-passwd-3) nil)) - ,(gnus-ofsetup-gettext 'param-save-passwd-4)) - - (mail-source - (sexp :tag ,(gnus-ofsetup-gettext 'param-mail-source-1) - :value ,gnus-offline-mail-source) - ,(gnus-ofsetup-gettext 'param-mail-source-2)))) - -(defvar gnus-ofsetup-params) - -(defun gnus-ofsetup-customize () - "Edit the gnus-offline parameters." - (interactive) - (let* ((params (gnus-ofsetup-find-parameters)) - (types (mapcar #'(lambda (entry) - `(cons :format "%v%h\n" - :doc ,(nth 2 entry) - (const :format "" ,(nth 0 entry)) - ,(nth 1 entry))) - params))) - (kill-buffer (gnus-get-buffer-create "*Gnus Offline Customize*")) - (switch-to-buffer (gnus-get-buffer-create "*Gnus Offline Customize*")) - (gnus-custom-mode) - (widget-insert (gnus-ofsetup-gettext 'customize-1)) - (widget-create 'push-button - :tag (gnus-ofsetup-gettext 'customize-2) - :help-echo (gnus-ofsetup-gettext 'customize-3) - :action 'gnus-ofsetup-customize-done) - (widget-insert "\n\n") - (make-local-variable 'gnus-ofsetup-params) - (setq gnus-ofsetup-params - (widget-create 'group - `(set :inline t - :greedy t - :tag ,(gnus-ofsetup-gettext 'customize-4) - :format "%t:\n%h%v" - :doc ,(gnus-ofsetup-gettext 'customize-5) - ,@types))) - - (widget-create 'info-link - :help-echo (gnus-ofsetup-gettext 'customize-6) - :tag " mail sources" - (if (string-match "^ja" gnus-offline-lang) - "(gnus-ja)Mail Sources" - "(gnus)Mail Sources")) - - (use-local-map widget-keymap) - (local-set-key "q" 'bury-buffer) - (widget-setup) - (goto-char (point-min)))) - -(defun gnus-ofsetup-customize-done (&rest ignore) - "Apply changes and bury the buffer." - (interactive) - (let ((params (widget-value gnus-ofsetup-params)) - (news-method gnus-offline-news-fetch-method) - (mail-method gnus-offline-mail-fetch-method) - (agent-directory gnus-agent-directory) - (dialup-program gnus-offline-dialup-program) - (dialup-program-arguments gnus-offline-dialup-program-arguments) - (hangup-program gnus-offline-hangup-program) - (hangup-program-arguments gnus-offline-hangup-program-arguments) - (drafts-queue-type gnus-offline-drafts-queue-type) - (interval gnus-offline-interval-time) - (use-miee (and (boundp 'miee-version) - (or (eq gnus-offline-news-fetch-method 'nnspool) - (eq gnus-offline-drafts-queue-type 'miee)))) - (mail-spool (or (and (boundp 'sendmail-to-spool-directory) - sendmail-to-spool-directory) - "/usr/spool/mail.out")) - (news-spool (or (and (boundp 'news-spool-request-post-directory) - news-spool-request-post-directory) - "/usr/spool/news.out")) - (MTA-type gnus-offline-MTA-type) - (mail-source gnus-offline-mail-source) - (save-passwd (and (memq 'mail-source-password-cache gnus-variable-list) - t))) - (if (null params) - (gnus-message 4 (gnus-ofsetup-gettext 'customize-done-1)) - (let (symbol value) - (dolist (elem params) - (setq symbol (car elem) - value (cdr elem)) - (set symbol value) - (cond ((eq symbol 'news-method) - (if (eq value 'nnspool) - (setq use-miee t))) - ((eq symbol 'drafts-queue-type) - (setq use-miee (eq value 'miee))) - ((eq symbol 'save-passwd) - (if value - (add-to-list 'gnus-variable-list - 'mail-source-password-cache) - (setq gnus-variable-list - (delq 'mail-source-password-cache - gnus-variable-list))))))) - (if (and (eq news-method 'nnspool) - (not (eq drafts-queue-type 'miee))) - (error (gnus-ofsetup-gettext 'customize-done-2))) - (if use-miee - (gnus-ofsetup-prepare gnus-ofsetup-prepare-for-miee)) - (gnus-ofsetup-prepare gnus-ofsetup-update-setting-file) - (load gnus-offline-setting-file))) - (bury-buffer) - (switch-to-buffer gnus-group-buffer)) - - -;;; Code for making Gnus and Gnus Offline cooperate with each other. - -;; Advice. -(defadvice gnus (around gnus-ofsetup-advice activate preactivate) - "Setup offline environment when Gnus is invoked." - (require 'gnus-offline) ad-do-it (gnus-offline-setup)) - -;; Miscellaneous settings. - -(setq gnus-nntp-service nil) -(setq gnus-nntp-server nil) -(eval-after-load "gnus-start" - '(add-hook 'gnus-after-getting-new-news-hook 'gnus-offline-after-get-new-news)) -(eval-after-load "message" - '(add-hook 'message-send-hook 'gnus-offline-message-add-header)) -(setq mail-source-read-passwd 'read-pw-read-passwd) -(add-hook 'gnus-setup-news-hook 'read-pw-set-mail-source-passwd-cache) - -(provide 'gnus-ofsetup) - -;;; gnus-ofsetup.el ends here diff --git a/lisp/gnus-picon.el b/lisp/gnus-picon.el deleted file mode 100644 index 9a4c9ba..0000000 --- a/lisp/gnus-picon.el +++ /dev/null @@ -1,757 +0,0 @@ -;;; gnus-picon.el --- displaying pretty icons in Gnus - -;; Copyright (C) 1996, 1997, 1998, 1999, 2000 -;; Free Software Foundation, Inc. - -;; Author: Wes Hardaker -;; Keywords: news xpm annotation glyph faces - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) - -(require 'gnus) -;; (require 'xpm) -(require 'annotations) -(require 'custom) -(require 'gnus-art) -(require 'gnus-win) - -;;; User variables: - -(defgroup picons nil - "Show pictures of people, domains, and newsgroups (XEmacs). -For this to work, you must switch on the `gnus-treat-display-picons' -variable." - :group 'gnus-visual) - -(defcustom gnus-picons-display-where 'picons - "Where to display the group and article icons. -Valid values are `article' and `picons'." - :type '(choice symbol string) - :group 'picons) - -(defcustom gnus-picons-has-modeline-p t - "*Whether the picons window should have a modeline. -This is only useful if `gnus-picons-display-where' is `picons'." - :type 'boolean - :group 'picons) - -(defcustom gnus-picons-database "/usr/local/faces" - "*Defines the location of the faces database. -For information on obtaining this database of pretty pictures, please -see http://www.cs.indiana.edu/picons/ftp/index.html" - :type 'directory - :group 'picons) - -(defcustom gnus-picons-news-directories '("news") - "*List of directories to search for newsgroups faces." - :type '(repeat string) - :group 'picons) -(define-obsolete-variable-alias 'gnus-picons-news-directory - 'gnus-picons-news-directories) - -(defcustom gnus-picons-user-directories '("local" "users" "usenix" "misc") - "*List of directories to search for user faces." - :type '(repeat string) - :group 'picons) - -(defcustom gnus-picons-domain-directories '("domains") - "*List of directories to search for domain faces. -Some people may want to add \"unknown\" to this list." - :type '(repeat string) - :group 'picons) - -(defcustom gnus-picons-refresh-before-display nil - "*If non-nil, display the article buffer before computing the picons." - :type 'boolean - :group 'picons) - -(defcustom gnus-picons-group-excluded-groups nil - "*If this regexp matches the group name, group picons will be disabled." - :type 'regexp - :group 'picons) - -(defcustom gnus-picons-display-as-address t - "*If t display textual email addresses along with pictures." - :type 'boolean - :group 'picons) - -(defcustom gnus-picons-file-suffixes - (when (featurep 'x) - (let ((types (list "xbm"))) - (when (featurep 'gif) - (setq types (cons "gif" types))) - (when (featurep 'xpm) - (setq types (cons "xpm" types))) - types)) - "*List of suffixes on picon file names to try." - :type '(repeat string) - :group 'picons) - -(defcustom gnus-picons-display-article-move-p nil - "*Whether to move point to first empty line when displaying picons. -This has only an effect if `gnus-picons-display-where' has value `article'." - :type 'boolean - :group 'picons) - -(defcustom gnus-picons-clear-cache-on-shutdown t - "*Whether to clear the picons cache when exiting gnus. -Gnus caches every picons it finds while it is running. This saves -some time in the search process but eats some memory. If this -variable is set to nil, Gnus will never clear the cache itself; you -will have to manually call `gnus-picons-clear-cache' to clear it. -Otherwise the cache will be cleared every time you exit Gnus." - :type 'boolean - :group 'picons) - -(defcustom gnus-picons-piconsearch-url nil - "*The url to query for picons. Setting this to nil will disable it. -The only publicly available address currently known is -http://www.cs.indiana.edu:800/piconsearch. If you know of any other, -please tell me so that we can list it." - :type '(choice (const :tag "Disable" :value nil) - (const :tag "www.cs.indiana.edu" - :value "http://www.cs.indiana.edu:800/piconsearch") - (string)) - :group 'picons) - -(defface gnus-picons-xbm-face '((t (:foreground "black" :background "white"))) - "Face to show xbm picons in." - :group 'picons) - -(defface gnus-picons-face '((t (:foreground "black" :background "white"))) - "Face to show picons in." - :group 'picons) - -(defcustom gnus-picons-setup-hook nil - "Hook run in Picons buffers." - :group 'picons - :type 'hook) - -;;; Internal variables: - -(defvar gnus-picons-setup-p nil) -(defvar gnus-picons-processes-alist nil - "Picons processes currently running and their environment.") -(defvar gnus-picons-glyph-alist nil - "Picons glyphs cache. -List of pairs (KEY . GLYPH) where KEY is either a filename or an URL.") -(defvar gnus-picons-url-alist nil - "Picons file names cache. -List of pairs (KEY . NAME) where KEY is (USER HOST DBS) and NAME is an URL.") - -(defvar gnus-picons-jobs-alist nil - "List of jobs that still need be done. -This is a list of (SYM-ANN TAG ARGS...) where SYM-ANN three annotations list, -TAG is one of `picon' or `search' indicating that the job should query a -picon or do a search for picons file names, and ARGS is some additionnal -arguments necessary for the job.") - -(defvar gnus-picons-job-already-running nil - "Lock to ensure only one stream of http requests is running.") - -;;; Functions: - -(defun gnus-picons-remove-all () - "Removes all picons from the Gnus display(s)." - (interactive) - (map-extents (function (lambda (ext unused) (delete-annotation ext) nil)) - nil nil nil nil nil 'gnus-picon) - (setq gnus-picons-jobs-alist '()) - ;; notify running job that it may have been preempted - (if (and (listp gnus-picons-job-already-running) - gnus-picons-job-already-running) - (setq gnus-picons-job-already-running t))) - -(defun gnus-get-buffer-name (variable) - "Returns the buffer name associated with the contents of a variable." - (let ((buf (gnus-get-buffer-create - (gnus-window-to-buffer-helper - (cdr (assq variable gnus-window-to-buffer)))))) - (and buf - (buffer-name buf)))) - -(defun gnus-picons-buffer-name () - (cond ((or (stringp gnus-picons-display-where) - (bufferp gnus-picons-display-where)) - gnus-picons-display-where) - ((eq gnus-picons-display-where 'picons) - (if gnus-single-article-buffer - "*Picons*" - (concat "*Picons " gnus-newsgroup-name "*"))) - (t - (gnus-get-buffer-name gnus-picons-display-where)))) - -(defun gnus-picons-kill-buffer () - (let ((buf (get-buffer (gnus-picons-buffer-name)))) - (when (and (buffer-live-p buf) - (string-match "Picons" (buffer-name buf))) - (kill-buffer buf)))) - -(defun gnus-picons-setup-buffer () - (let ((name (gnus-picons-buffer-name))) - (save-excursion - (if (and (get-buffer name) - (with-current-buffer name - gnus-picons-setup-p)) - (set-buffer name) - (set-buffer (gnus-get-buffer-create name)) - (buffer-disable-undo) - (setq buffer-read-only t) - (run-hooks 'gnus-picons-setup-hook) - (set (make-local-variable 'gnus-picons-setup-p) t) - (add-hook 'gnus-summary-prepare-exit-hook 'gnus-picons-kill-buffer)) - (current-buffer)))) - -(defun gnus-picons-set-buffer () - (set-buffer (gnus-picons-setup-buffer)) - (goto-char (point-min)) - (if (and (eq gnus-picons-display-where 'article) - gnus-picons-display-article-move-p) - (if (search-forward "\n\n" nil t) - (forward-line -1) - (goto-char (point-max))) - (setq buffer-read-only t) - (unless gnus-picons-has-modeline-p - (set-specifier has-modeline-p - (list (list (current-buffer) - (cons nil gnus-picons-has-modeline-p))))))) - -(defun gnus-picons-prepare-for-annotations () - "Prepare picons buffer for putting annotations." - ;; let drawing catch up - (when gnus-picons-refresh-before-display - (sit-for 0)) - (gnus-picons-set-buffer) - (gnus-picons-remove-all)) - -(defun gnus-picons-make-annotation (&rest args) - (let ((annot (apply 'make-annotation args))) - (set-extent-property annot 'gnus-picon t) - (set-extent-property annot 'duplicable t) - annot)) - -(defun gnus-article-display-picons () - "Display faces for an author and her domain in gnus-picons-display-where." - (interactive) - (let (from at-idx) - (when (and (featurep 'xpm) - (or (not (fboundp 'device-type)) (equal (device-type) 'x)) - (setq from (mail-fetch-field "from")) - (setq from (downcase (or (cadr - (funcall gnus-extract-address-components - from)) - ""))) - (or (setq at-idx (string-match "@" from)) - (setq at-idx (length from)))) - (save-excursion - (let ((username (downcase (substring from 0 at-idx))) - (addrs (if (eq at-idx (length from)) - (if gnus-local-domain - (message-tokenize-header gnus-local-domain ".")) - (message-tokenize-header (substring from (1+ at-idx)) - ".")))) - (gnus-picons-prepare-for-annotations) - (gnus-group-display-picons) - (unless gnus-picons-display-article-move-p - (let ((buffer-read-only nil) - (case-fold-search t)) - (when (re-search-forward "^From *: *" nil t) - (when (search-forward from (gnus-point-at-eol) t) - (gnus-put-text-property - (match-beginning 0) (match-end 0) - 'invisible t))))) - (if (null gnus-picons-piconsearch-url) - (progn - (gnus-picons-display-pairs (gnus-picons-lookup-pairs - addrs - gnus-picons-domain-directories) - gnus-picons-display-as-address - "." t) - (if (and gnus-picons-display-as-address addrs) - (gnus-picons-make-annotation - [string :data "@"] nil 'text nil nil nil t)) - (gnus-picons-display-picon-or-name - (gnus-picons-lookup-user username addrs) - username t)) - (push (list 'gnus-article-annotations 'search username addrs - gnus-picons-domain-directories t (point-marker)) - gnus-picons-jobs-alist) - (gnus-picons-next-job))))))) - -(defun gnus-group-display-picons () - "Display icons for the group in the `gnus-picons-display-where' buffer." - (interactive) - (when (and (featurep 'xpm) - (or (not (fboundp 'device-type)) (equal (device-type) 'x)) - (or (null gnus-picons-group-excluded-groups) - (not (string-match gnus-picons-group-excluded-groups - gnus-newsgroup-name)))) - (let* ((newsgroups (mail-fetch-field "newsgroups")) - (groups - (if (or gnus-picons-display-article-move-p - (not newsgroups)) - (list (gnus-group-real-name gnus-newsgroup-name)) - (split-string newsgroups ","))) - group) - (save-excursion - (gnus-picons-prepare-for-annotations) - (while (setq group (pop groups)) - (unless gnus-picons-display-article-move-p - (let ((buffer-read-only nil) - (case-fold-search t)) - (goto-char (point-min)) - (if (and (re-search-forward "^Newsgroups *: *" nil t) - (search-forward group (gnus-point-at-eol) t)) - (gnus-put-text-property - (match-beginning 0) (match-end 0) - 'invisible t) - (let ((article-goto-body-goes-to-point-min-p nil)) - (article-goto-body)) - (unless (bobp) - (backward-char 1))))) - (if (null gnus-picons-piconsearch-url) - (gnus-picons-display-pairs - (gnus-picons-lookup-pairs - (reverse (split-string group "\\.")) - gnus-picons-news-directories) - t ".") - (push (list 'gnus-group-annotations 'search nil - (split-string group "\\.") - (if (listp gnus-picons-news-directories) - gnus-picons-news-directories - (list gnus-picons-news-directories)) - nil (point-marker)) - gnus-picons-jobs-alist) - (gnus-picons-next-job)) - - (add-hook 'gnus-summary-exit-hook 'gnus-picons-remove-all)))))) - -(defun gnus-picons-lookup-internal (addrs dir) - (setq dir (expand-file-name dir gnus-picons-database)) - (gnus-picons-try-face (dolist (part (reverse addrs) dir) - (setq dir (expand-file-name part dir))))) - -(defun gnus-picons-lookup (addrs dirs) - "Lookup the picon for ADDRS in databases DIRS. -Returns the picon filename or NIL if none found." - (let (result) - (while (and dirs (null result)) - (setq result (gnus-picons-lookup-internal addrs (pop dirs)))) - result)) - -(defun gnus-picons-lookup-user-internal (user domains) - (let ((dirs gnus-picons-user-directories) - domains-tmp dir picon) - (while (and dirs (null picon)) - (setq domains-tmp domains - dir (pop dirs)) - (while (and domains-tmp - (null (setq picon (gnus-picons-lookup-internal - (cons user domains-tmp) dir)))) - (pop domains-tmp)) - ;; Also make a try in MISC subdir - (unless picon - (setq picon (gnus-picons-lookup-internal (list user "MISC") dir)))) - picon)) - -(defun gnus-picons-lookup-user (user domains) - "Lookup the picon for USER at DOMAINS. -USER is a string containing a name. -DOMAINS is a list of strings from the fully qualified domain name." - (or (gnus-picons-lookup-user-internal user domains) - (gnus-picons-lookup-user-internal "unknown" domains))) - -(defun gnus-picons-lookup-pairs (domains directories) - "Lookup picons for DOMAINS and all its parents in DIRECTORIES. -Returns a list of PAIRS whose CAR is the picon filename or NIL if -none, and whose CDR is the corresponding element of DOMAINS." - (let (picons) - (setq directories (if (listp directories) - directories - (list directories))) - (while domains - (push (list (gnus-picons-lookup (cons "unknown" domains) directories) - (pop domains)) - picons)) - picons)) - -(defun gnus-picons-display-picon-or-name (picon name &optional right-p) - (cond (picon (gnus-picons-display-glyph picon name right-p)) - (gnus-picons-display-as-address (list (gnus-picons-make-annotation - (vector 'string :data name) - nil 'text - nil nil nil right-p))))) - -(defun gnus-picons-display-pairs (pairs &optional bar-p dot-p right-p) - "Display picons in list PAIRS." - (let ((domain-p (and gnus-picons-display-as-address dot-p)) - pair picons) - (when (and bar-p domain-p right-p - gnus-picons-display-article-move-p) - (setq picons (gnus-picons-display-glyph - (let ((gnus-picons-file-suffixes '("xbm"))) - (gnus-picons-try-face - gnus-xmas-glyph-directory "bar.")) - nil right-p))) - (while (setq pair (pop pairs)) - (setq picons (nconc picons - (gnus-picons-display-picon-or-name - (car pair) (cadr pair) right-p) - (if (and domain-p pairs) - (list (gnus-picons-make-annotation - (vector 'string :data dot-p) - nil 'text nil nil nil right-p)))))) - picons)) - -(defun gnus-picons-try-face (dir &optional filebase) - (let* ((dir (file-name-as-directory dir)) - (filebase (or filebase "face.")) - (key (concat dir filebase)) - (glyph (cdr (assoc key gnus-picons-glyph-alist))) - (suffixes gnus-picons-file-suffixes) - f suf) - (while (setq suf (pop suffixes)) - (when (file-exists-p (setq f (expand-file-name - (concat filebase suf) - dir))) - (setq suffixes nil - glyph (make-glyph f)) - (if (equal suf "xbm") - (set-glyph-face glyph 'gnus-picons-xbm-face) - (set-glyph-face glyph 'gnus-picons-face)) - (push (cons key glyph) gnus-picons-glyph-alist))) - glyph)) - -(defun gnus-picons-display-glyph (glyph &optional part rightp) - (set-glyph-baseline glyph 70) - (let ((new (gnus-picons-make-annotation - glyph (point) 'text nil nil nil rightp))) - (when (and part gnus-picons-display-as-address) - (set-annotation-data - new (cons new (make-glyph (vector 'string :data part)))) - (set-annotation-action new 'gnus-picons-action-toggle)) - (nconc - (list new) - (if (and (eq major-mode 'gnus-article-mode) - (not gnus-picons-display-as-address) - (not part)) - (list (gnus-picons-make-annotation [string :data " "] (point) - 'text nil nil nil rightp)))))) - -(defun gnus-picons-action-toggle (data) - "Toggle annotation." - (interactive "e") - (let* ((annot (car data)) - (glyph (annotation-glyph annot))) - (set-annotation-glyph annot (cdr data)) - (set-annotation-data annot (cons annot glyph)))) - -(defun gnus-picons-clear-cache () - "Clear the picons cache." - (interactive) - (setq gnus-picons-glyph-alist nil - gnus-picons-url-alist nil)) - -(gnus-add-shutdown 'gnus-picons-close 'gnus) - -(defun gnus-picons-close () - "Shut down the picons." - (if gnus-picons-clear-cache-on-shutdown - (gnus-picons-clear-cache))) - -;;; Query a remote DB. This requires some stuff from w3 ! - -(eval-and-compile - (ignore-errors - (require 'url) - (require 'w3-forms))) - -(defun gnus-picons-url-retrieve (url fn arg) - (let ((old-asynch (default-value 'url-be-asynchronous)) - (url-working-buffer (generate-new-buffer " *picons*")) - (url-package-name "Gnus") - (url-package-version gnus-version-number) - url-request-method) - (setq-default url-be-asynchronous t) - (save-excursion - (set-buffer url-working-buffer) - (setq url-be-asynchronous t - url-current-callback-data arg - url-current-callback-func fn) - (url-retrieve url t)) - (setq-default url-be-asynchronous old-asynch))) - -(defun gnus-picons-make-glyph (type) - "Make a TYPE glyph using current buffer as data. Handles xbm nicely." - (cond ((null type) nil) - ((eq type 'xbm) (let ((fname (make-temp-name "/tmp/picon"))) - (write-region (point-min) (point-max) fname - nil 'quiet) - (prog1 (make-glyph (vector 'xbm :file fname)) - (delete-file fname)))) - (t (make-glyph (vector type :data (buffer-string)))))) - -;;; Parsing of piconsearch result page. - -;; Assumes: -;; 1 - each value field has the form: "key = value" -;; 2 - a "

" separates the keywords from the results -;; 3 - every results begins by the path within the database at the beginning -;; of the line in raw text. -;; 3b - and the href following it is the preferred image type. - -;; if 1 or 2 is not met, it will probably cause an error. The other -;; will go undetected - -(defun gnus-picons-parse-value (name) - (goto-char (point-min)) - (if (re-search-forward (concat "" - (regexp-quote name) - " *= * *\\([^ <][^<]*\\) *") - nil t) - (buffer-substring (match-beginning 1) (match-end 1)))) - -(defun gnus-picons-parse-filenames () - ;; returns an alist of ((USER ADDRS DB) . URL) - (let ((case-fold-search t) - (user (gnus-picons-parse-value "user")) - (host (gnus-picons-parse-value "host")) - (dbs (message-tokenize-header (gnus-picons-parse-value "db") " ")) - start-re cur-db cur-host cur-user types res) - ;; now point will be somewhere in the header. Find beginning of - ;; entries - (when (and user host dbs) - (setq start-re - (concat - ;; dbs - "^\\(" (mapconcat 'regexp-quote dbs "\\|") "\\)/" - ;; host - "\\(\\(" (mapconcat 'regexp-quote - (message-tokenize-header host ".") "/\\|") - "/\\|MISC/\\)*\\)" - ;; user - "\\(" (regexp-quote user) "\\|unknown\\)/" - "face\\.")) - (re-search-forward "

[ \t\n]*") - (while (re-search-forward start-re nil t) - (setq cur-db (buffer-substring (match-beginning 1) (match-end 1)) - cur-host (buffer-substring (match-beginning 2) (match-end 2)) - cur-user (buffer-substring (match-beginning 4) (match-end 4)) - cur-host (nreverse (message-tokenize-header cur-host "/"))) - ;; XXX - KLUDGE: there is a blank picon in news/MISC/unknown - (unless (and (string-equal cur-db "news") - (string-equal cur-user "unknown") - (equal cur-host '("MISC"))) - ;; ok now we have found an entry (USER HOST DB), find the - ;; corresponding picon URL - (save-restriction - ;; restrict region to this entry - (narrow-to-region (point) (search-forward "
")) - (goto-char (point-min)) - (setq types gnus-picons-file-suffixes) - (while (and types - (not (re-search-forward - (concat " -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) - -;;; List and range functions - -(defsubst gnus-range-normalize (range) - "Normalize RANGE. -If RANGE is a single range, return (RANGE). Otherwise, return RANGE." - (if (listp (cdr range)) (list range) range)) - -(defun gnus-last-element (list) - "Return last element of LIST." - (while (cdr list) - (setq list (cdr list))) - (car list)) - -(defun gnus-copy-sequence (list) - "Do a complete, total copy of a list." - (let (out) - (while (consp list) - (if (consp (car list)) - (push (gnus-copy-sequence (pop list)) out) - (push (pop list) out))) - (if list - (nconc (nreverse out) list) - (nreverse out)))) - -(defun gnus-set-difference (list1 list2) - "Return a list of elements of LIST1 that do not appear in LIST2." - (let ((list1 (copy-sequence list1))) - (while list2 - (setq list1 (delq (car list2) list1)) - (setq list2 (cdr list2))) - list1)) - -(defun gnus-sorted-complement (list1 list2) - "Return a list of elements that are in LIST1 or LIST2 but not both. -Both lists have to be sorted over <." - (let (out) - (if (or (null list1) (null list2)) - (or list1 list2) - (while (and list1 list2) - (cond ((= (car list1) (car list2)) - (setq list1 (cdr list1) - list2 (cdr list2))) - ((< (car list1) (car list2)) - (setq out (cons (car list1) out)) - (setq list1 (cdr list1))) - (t - (setq out (cons (car list2) out)) - (setq list2 (cdr list2))))) - (nconc (nreverse out) (or list1 list2))))) - -(defun gnus-intersection (list1 list2) - (let ((result nil)) - (while list2 - (when (memq (car list2) list1) - (setq result (cons (car list2) result))) - (setq list2 (cdr list2))) - result)) - -(defun gnus-sorted-intersection (list1 list2) - ;; LIST1 and LIST2 have to be sorted over <. - (let (out) - (while (and list1 list2) - (cond ((= (car list1) (car list2)) - (setq out (cons (car list1) out) - list1 (cdr list1) - list2 (cdr list2))) - ((< (car list1) (car list2)) - (setq list1 (cdr list1))) - (t - (setq list2 (cdr list2))))) - (nreverse out))) - -(defun gnus-set-sorted-intersection (list1 list2) - ;; LIST1 and LIST2 have to be sorted over <. - ;; This function modifies LIST1. - (let* ((top (cons nil list1)) - (prev top)) - (while (and list1 list2) - (cond ((= (car list1) (car list2)) - (setq prev list1 - list1 (cdr list1) - list2 (cdr list2))) - ((< (car list1) (car list2)) - (setcdr prev (cdr list1)) - (setq list1 (cdr list1))) - (t - (setq list2 (cdr list2))))) - (setcdr prev nil) - (cdr top))) - -(defun gnus-compress-sequence (numbers &optional always-list) - "Convert list of numbers to a list of ranges or a single range. -If ALWAYS-LIST is non-nil, this function will always release a list of -ranges." - (let* ((first (car numbers)) - (last (car numbers)) - result) - (if (null numbers) - nil - (if (not (listp (cdr numbers))) - numbers - (while numbers - (cond ((= last (car numbers)) nil) ;Omit duplicated number - ((= (1+ last) (car numbers)) ;Still in sequence - (setq last (car numbers))) - (t ;End of one sequence - (setq result - (cons (if (= first last) first - (cons first last)) - result)) - (setq first (car numbers)) - (setq last (car numbers)))) - (setq numbers (cdr numbers))) - (if (and (not always-list) (null result)) - (if (= first last) (list first) (cons first last)) - (nreverse (cons (if (= first last) first (cons first last)) - result))))))) - -(defalias 'gnus-uncompress-sequence 'gnus-uncompress-range) -(defun gnus-uncompress-range (ranges) - "Expand a list of ranges into a list of numbers. -RANGES is either a single range on the form `(num . num)' or a list of -these ranges." - (let (first last result) - (cond - ((null ranges) - nil) - ((not (listp (cdr ranges))) - (setq first (car ranges)) - (setq last (cdr ranges)) - (while (<= first last) - (setq result (cons first result)) - (setq first (1+ first))) - (nreverse result)) - (t - (while ranges - (if (atom (car ranges)) - (when (numberp (car ranges)) - (setq result (cons (car ranges) result))) - (setq first (caar ranges)) - (setq last (cdar ranges)) - (while (<= first last) - (setq result (cons first result)) - (setq first (1+ first)))) - (setq ranges (cdr ranges))) - (nreverse result))))) - -(defun gnus-add-to-range (ranges list) - "Return a list of ranges that has all articles from both RANGES and LIST. -Note: LIST has to be sorted over `<'." - (if (not ranges) - (gnus-compress-sequence list t) - (setq list (copy-sequence list)) - (unless (listp (cdr ranges)) - (setq ranges (list ranges))) - (let ((out ranges) - ilist lowest highest temp) - (while (and ranges list) - (setq ilist list) - (setq lowest (or (and (atom (car ranges)) (car ranges)) - (caar ranges))) - (while (and list (cdr list) (< (cadr list) lowest)) - (setq list (cdr list))) - (when (< (car ilist) lowest) - (setq temp list) - (setq list (cdr list)) - (setcdr temp nil) - (setq out (nconc (gnus-compress-sequence ilist t) out))) - (setq highest (or (and (atom (car ranges)) (car ranges)) - (cdar ranges))) - (while (and list (<= (car list) highest)) - (setq list (cdr list))) - (setq ranges (cdr ranges))) - (when list - (setq out (nconc (gnus-compress-sequence list t) out))) - (setq out (sort out (lambda (r1 r2) - (< (or (and (atom r1) r1) (car r1)) - (or (and (atom r2) r2) (car r2)))))) - (setq ranges out) - (while ranges - (if (atom (car ranges)) - (when (cdr ranges) - (if (atom (cadr ranges)) - (when (= (1+ (car ranges)) (cadr ranges)) - (setcar ranges (cons (car ranges) - (cadr ranges))) - (setcdr ranges (cddr ranges))) - (when (= (1+ (car ranges)) (caadr ranges)) - (setcar (cadr ranges) (car ranges)) - (setcar ranges (cadr ranges)) - (setcdr ranges (cddr ranges))))) - (when (cdr ranges) - (if (atom (cadr ranges)) - (when (= (1+ (cdar ranges)) (cadr ranges)) - (setcdr (car ranges) (cadr ranges)) - (setcdr ranges (cddr ranges))) - (when (= (1+ (cdar ranges)) (caadr ranges)) - (setcdr (car ranges) (cdadr ranges)) - (setcdr ranges (cddr ranges)))))) - (setq ranges (cdr ranges))) - out))) - -(defun gnus-remove-from-range (range1 range2) - "Return a range that has all articles from RANGE2 removed from RANGE1. -The returned range is always a list. RANGE2 can also be a unsorted -list of articles. RANGE1 is modified by side effects, RANGE2 is not -modified." - (if (or (null range1) (null range2)) - range1 - (let (out r1 r2 r1_min r1_max r2_min r2_max - (range2 (gnus-copy-sequence range2))) - (setq range1 (if (listp (cdr range1)) range1 (list range1)) - range2 (sort (if (listp (cdr range2)) range2 (list range2)) - (lambda (e1 e2) - (< (if (consp e1) (car e1) e1) - (if (consp e2) (car e2) e2)))) - r1 (car range1) - r2 (car range2) - r1_min (if (consp r1) (car r1) r1) - r1_max (if (consp r1) (cdr r1) r1) - r2_min (if (consp r2) (car r2) r2) - r2_max (if (consp r2) (cdr r2) r2)) - (while (and range1 range2) - (cond ((< r2_max r1_min) ; r2 < r1 - (pop range2) - (setq r2 (car range2) - r2_min (if (consp r2) (car r2) r2) - r2_max (if (consp r2) (cdr r2) r2))) - ((and (<= r2_min r1_min) (<= r1_max r2_max)) ; r2 overlap r1 - (pop range1) - (setq r1 (car range1) - r1_min (if (consp r1) (car r1) r1) - r1_max (if (consp r1) (cdr r1) r1))) - ((and (<= r2_min r1_min) (<= r2_max r1_max)) ; r2 overlap min r1 - (pop range2) - (setq r1_min (1+ r2_max) - r2 (car range2) - r2_min (if (consp r2) (car r2) r2) - r2_max (if (consp r2) (cdr r2) r2))) - ((and (<= r1_min r2_min) (<= r2_max r1_max)) ; r2 contained in r1 - (if (eq r1_min (1- r2_min)) - (push r1_min out) - (push (cons r1_min (1- r2_min)) out)) - (pop range2) - (if (< r2_max r1_max) ; finished with r1? - (setq r1_min (1+ r2_max)) - (pop range1) - (setq r1 (car range1) - r1_min (if (consp r1) (car r1) r1) - r1_max (if (consp r1) (cdr r1) r1))) - (setq r2 (car range2) - r2_min (if (consp r2) (car r2) r2) - r2_max (if (consp r2) (cdr r2) r2))) - ((and (<= r2_min r1_max) (<= r1_max r2_max)) ; r2 overlap max r1 - (if (eq r1_min (1- r2_min)) - (push r1_min out) - (push (cons r1_min (1- r2_min)) out)) - (pop range1) - (setq r1 (car range1) - r1_min (if (consp r1) (car r1) r1) - r1_max (if (consp r1) (cdr r1) r1))) - ((< r1_max r2_min) ; r2 > r1 - (pop range1) - (if (eq r1_min r1_max) - (push r1_min out) - (push (cons r1_min r1_max) out)) - (setq r1 (car range1) - r1_min (if (consp r1) (car r1) r1) - r1_max (if (consp r1) (cdr r1) r1))))) - (when r1 - (if (eq r1_min r1_max) - (push r1_min out) - (push (cons r1_min r1_max) out)) - (pop range1)) - (while range1 - (push (pop range1) out)) - (nreverse out)))) - -(defun gnus-member-of-range (number ranges) - (if (not (listp (cdr ranges))) - (and (>= number (car ranges)) - (<= number (cdr ranges))) - (let ((not-stop t)) - (while (and ranges - (if (numberp (car ranges)) - (>= number (car ranges)) - (>= number (caar ranges))) - not-stop) - (when (if (numberp (car ranges)) - (= number (car ranges)) - (and (>= number (caar ranges)) - (<= number (cdar ranges)))) - (setq not-stop nil)) - (setq ranges (cdr ranges))) - (not not-stop)))) - -(defun gnus-range-length (range) - "Return the length RANGE would have if uncompressed." - (length (gnus-uncompress-range range))) - -(defun gnus-sublist-p (list sublist) - "Test whether all elements in SUBLIST are members of LIST." - (let ((sublistp t)) - (while sublist - (unless (memq (pop sublist) list) - (setq sublistp nil - sublist nil))) - sublistp)) - -(defun gnus-range-add (range1 range2) - "Add RANGE2 to RANGE1 (nondestructively)." - (unless (listp (cdr range1)) - (setq range1 (list range1))) - (unless (listp (cdr range2)) - (setq range2 (list range2))) - (let ((item1 (pop range1)) - (item2 (pop range2)) - range item selector) - (while (or item1 item2) - (setq selector - (cond - ((null item1) nil) - ((null item2) t) - ((and (numberp item1) (numberp item2)) (< item1 item2)) - ((numberp item1) (< item1 (car item2))) - ((numberp item2) (< (car item1) item2)) - (t (< (car item1) (car item2))))) - (setq item - (or - (let ((tmp1 item) (tmp2 (if selector item1 item2))) - (cond - ((null tmp1) tmp2) - ((null tmp2) tmp1) - ((and (numberp tmp1) (numberp tmp2)) - (cond - ((eq tmp1 tmp2) tmp1) - ((eq (1+ tmp1) tmp2) (cons tmp1 tmp2)) - ((eq (1+ tmp2) tmp1) (cons tmp2 tmp1)) - (t nil))) - ((numberp tmp1) - (cond - ((and (>= tmp1 (car tmp2)) (<= tmp1 (cdr tmp2))) tmp2) - ((eq (1+ tmp1) (car tmp2)) (cons tmp1 (cdr tmp2))) - ((eq (1- tmp1) (cdr tmp2)) (cons (car tmp2) tmp1)) - (t nil))) - ((numberp tmp2) - (cond - ((and (>= tmp2 (car tmp1)) (<= tmp2 (cdr tmp1))) tmp1) - ((eq (1+ tmp2) (car tmp1)) (cons tmp2 (cdr tmp1))) - ((eq (1- tmp2) (cdr tmp1)) (cons (car tmp1) tmp2)) - (t nil))) - ((< (1+ (cdr tmp1)) (car tmp2)) nil) - ((< (1+ (cdr tmp2)) (car tmp1)) nil) - (t (cons (min (car tmp1) (car tmp2)) - (max (cdr tmp1) (cdr tmp2)))))) - (progn - (if item (push item range)) - (if selector item1 item2)))) - (if selector - (setq item1 (pop range1)) - (setq item2 (pop range2)))) - (if item (push item range)) - (reverse range))) - -(provide 'gnus-range) - -;;; gnus-range.el ends here diff --git a/lisp/gnus-salt.el b/lisp/gnus-salt.el deleted file mode 100644 index b76bac2..0000000 --- a/lisp/gnus-salt.el +++ /dev/null @@ -1,1052 +0,0 @@ -;;; gnus-salt.el --- alternate summary mode interfaces for Gnus - -;; Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) - -(require 'gnus) -(require 'gnus-sum) - -;;; -;;; gnus-pick-mode -;;; - -(defvar gnus-pick-mode nil - "Minor mode for providing a pick-and-read interface in Gnus -summary buffers.") - -(defcustom gnus-pick-display-summary nil - "*Display summary while reading." - :type 'boolean - :group 'gnus-summary-pick) - -(defcustom gnus-pick-mode-hook nil - "Hook run in summary pick mode buffers." - :type 'hook - :group 'gnus-summary-pick) - -(when (featurep 'xemacs) - (add-hook 'gnus-pick-mode-hook 'gnus-xmas-pick-menu-add)) - -(defcustom gnus-mark-unpicked-articles-as-read nil - "*If non-nil, mark all unpicked articles as read." - :type 'boolean - :group 'gnus-summary-pick) - -(defcustom gnus-pick-elegant-flow t - "If non-nil, `gnus-pick-start-reading' runs - `gnus-summary-next-group' when no articles have been picked." - :type 'boolean - :group 'gnus-summary-pick) - -(defcustom gnus-summary-pick-line-format - "%-5P %U\%R\%z\%I\%(%[%4L: %-23,23n%]%) %s\n" - "*The format specification of the lines in pick buffers. -It accepts the same format specs that `gnus-summary-line-format' does." - :type 'string - :group 'gnus-summary-pick) - -;;; Internal variables. - -(defvar gnus-pick-mode-map nil) - -(unless gnus-pick-mode-map - (setq gnus-pick-mode-map (make-sparse-keymap)) - - (gnus-define-keys gnus-pick-mode-map - " " gnus-pick-next-page - "u" gnus-pick-unmark-article-or-thread - "." gnus-pick-article-or-thread - gnus-down-mouse-2 gnus-pick-mouse-pick-region - "\r" gnus-pick-start-reading)) - -(defun gnus-pick-make-menu-bar () - (unless (boundp 'gnus-pick-menu) - (easy-menu-define - gnus-pick-menu gnus-pick-mode-map "" - '("Pick" - ("Pick" - ["Article" gnus-summary-mark-as-processable t] - ["Thread" gnus-uu-mark-thread t] - ["Region" gnus-uu-mark-region t] - ["Regexp" gnus-uu-mark-by-regexp t] - ["Buffer" gnus-uu-mark-buffer t]) - ("Unpick" - ["Article" gnus-summary-unmark-as-processable t] - ["Thread" gnus-uu-unmark-thread t] - ["Region" gnus-uu-unmark-region t] - ["Regexp" gnus-uu-unmark-by-regexp t] - ["Buffer" gnus-summary-unmark-all-processable t]) - ["Start reading" gnus-pick-start-reading t] - ["Switch pick mode off" gnus-pick-mode gnus-pick-mode])))) - -(defun gnus-pick-mode (&optional arg) - "Minor mode for providing a pick-and-read interface in Gnus summary buffers. - -\\{gnus-pick-mode-map}" - (interactive "P") - (when (eq major-mode 'gnus-summary-mode) - (if (not (set (make-local-variable 'gnus-pick-mode) - (if (null arg) (not gnus-pick-mode) - (> (prefix-numeric-value arg) 0)))) - (remove-hook 'gnus-message-setup-hook 'gnus-pick-setup-message) - ;; Make sure that we don't select any articles upon group entry. - (set (make-local-variable 'gnus-auto-select-first) nil) - ;; Change line format. - (setq gnus-summary-line-format gnus-summary-pick-line-format) - (setq gnus-summary-line-format-spec nil) - (gnus-update-format-specifications nil 'summary) - (gnus-update-summary-mark-positions) - (add-hook 'gnus-message-setup-hook 'gnus-pick-setup-message) - (set (make-local-variable 'gnus-summary-goto-unread) 'never) - ;; Set up the menu. - (when (gnus-visual-p 'pick-menu 'menu) - (gnus-pick-make-menu-bar)) - (gnus-add-minor-mode 'gnus-pick-mode " Pick" gnus-pick-mode-map - nil 'gnus-pick-mode) - (gnus-run-hooks 'gnus-pick-mode-hook)))) - -(defun gnus-pick-setup-message () - "Make Message do the right thing on exit." - (when (and (gnus-buffer-live-p gnus-summary-buffer) - (save-excursion - (set-buffer gnus-summary-buffer) - gnus-pick-mode)) - (message-add-action - '(gnus-configure-windows ,gnus-current-window-configuration t) - 'send 'exit 'postpone 'kill))) - -(defvar gnus-pick-line-number 1) -(defun gnus-pick-line-number () - "Return the current line number." - (if (bobp) - (setq gnus-pick-line-number 1) - (incf gnus-pick-line-number))) - -(defun gnus-pick-start-reading (&optional catch-up) - "Start reading the picked articles. -If given a prefix, mark all unpicked articles as read." - (interactive "P") - (if gnus-newsgroup-processable - (progn - (gnus-summary-limit-to-articles nil) - (when (or catch-up gnus-mark-unpicked-articles-as-read) - (gnus-summary-limit-mark-excluded-as-read)) - (gnus-summary-first-article) - (gnus-configure-windows - (if gnus-pick-display-summary 'article 'pick) t)) - (if gnus-pick-elegant-flow - (progn - (when (or catch-up gnus-mark-unpicked-articles-as-read) - (gnus-summary-catchup nil t)) - (if (gnus-group-quit-config gnus-newsgroup-name) - (gnus-summary-exit) - (gnus-summary-next-group))) - (error "No articles have been picked")))) - -(defun gnus-pick-goto-article (arg) - "Go to the article number indicated by ARG. -If ARG is an invalid article number, then stay on current line." - (let (pos) - (save-excursion - (goto-char (point-min)) - (when (zerop (forward-line (1- (prefix-numeric-value arg)))) - (setq pos (point)))) - (if (not pos) - (gnus-error 2 "No such line: %s" arg) - (goto-char pos)))) - -(defun gnus-pick-article (&optional arg) - "Pick the article on the current line. -If ARG, pick the article on that line instead." - (interactive "P") - (when arg - (gnus-pick-goto-article arg)) - (gnus-summary-mark-as-processable 1)) - -(defun gnus-pick-article-or-thread (&optional arg) - "If `gnus-thread-hide-subtree' is t, then pick the thread on the current line. -Otherwise pick the article on the current line. -If ARG, pick the article/thread on that line instead." - (interactive "P") - (when arg - (gnus-pick-goto-article arg)) - (if gnus-thread-hide-subtree - (progn - (save-excursion - (gnus-uu-mark-thread)) - (forward-line 1)) - (gnus-summary-mark-as-processable 1))) - -(defun gnus-pick-unmark-article-or-thread (&optional arg) - "If `gnus-thread-hide-subtree' is t, then unmark the thread on current line. -Otherwise unmark the article on current line. -If ARG, unmark thread/article on that line instead." - (interactive "P") - (when arg - (gnus-pick-goto-article arg)) - (if gnus-thread-hide-subtree - (save-excursion - (gnus-uu-unmark-thread)) - (gnus-summary-unmark-as-processable 1))) - -(defun gnus-pick-mouse-pick (e) - (interactive "e") - (mouse-set-point e) - (save-excursion - (gnus-summary-mark-as-processable 1))) - -(defun gnus-pick-mouse-pick-region (start-event) - "Pick articles that the mouse is dragged over. -This must be bound to a button-down mouse event." - (interactive "e") - (mouse-minibuffer-check start-event) - (let* ((echo-keystrokes 0) - (start-posn (event-start start-event)) - (start-point (posn-point start-posn)) - (start-line (1+ (count-lines 1 start-point))) - (start-window (posn-window start-posn)) - (bounds (gnus-window-edges start-window)) - (top (nth 1 bounds)) - (bottom (if (window-minibuffer-p start-window) - (nth 3 bounds) - ;; Don't count the mode line. - (1- (nth 3 bounds)))) - (click-count (1- (event-click-count start-event)))) - (setq mouse-selection-click-count click-count) - (setq mouse-selection-click-count-buffer (current-buffer)) - (mouse-set-point start-event) - ;; In case the down click is in the middle of some intangible text, - ;; use the end of that text, and put it in START-POINT. - (when (< (point) start-point) - (goto-char start-point)) - (gnus-pick-article) - (setq start-point (point)) - ;; end-of-range is used only in the single-click case. - ;; It is the place where the drag has reached so far - ;; (but not outside the window where the drag started). - (let (event end end-point (end-of-range (point))) - (track-mouse - (while (progn - (setq event (cdr (gnus-read-event-char))) - (or (mouse-movement-p event) - (eq (car-safe event) 'switch-frame))) - (if (eq (car-safe event) 'switch-frame) - nil - (setq end (event-end event) - end-point (posn-point end)) - - (cond - ;; Are we moving within the original window? - ((and (eq (posn-window end) start-window) - (integer-or-marker-p end-point)) - ;; Go to START-POINT first, so that when we move to END-POINT, - ;; if it's in the middle of intangible text, - ;; point jumps in the direction away from START-POINT. - (goto-char start-point) - (goto-char end-point) - (gnus-pick-article) - ;; In case the user moved his mouse really fast, pick - ;; articles on the line between this one and the last one. - (let* ((this-line (1+ (count-lines 1 end-point))) - (min-line (min this-line start-line)) - (max-line (max this-line start-line))) - (while (< min-line max-line) - (goto-line min-line) - (gnus-pick-article) - (setq min-line (1+ min-line))) - (setq start-line this-line)) - (when (zerop (% click-count 3)) - (setq end-of-range (point)))) - (t - (let ((mouse-row (cdr (cdr (mouse-position))))) - (cond - ((null mouse-row)) - ((< mouse-row top) - (mouse-scroll-subr start-window (- mouse-row top))) - ((>= mouse-row bottom) - (mouse-scroll-subr start-window - (1+ (- mouse-row bottom))))))))))) - (when (consp event) - (let ((fun (key-binding (vector (car event))))) - ;; Run the binding of the terminating up-event, if possible. - ;; In the case of a multiple click, it gives the wrong results, - ;; because it would fail to set up a region. - (when nil - ;; (and (= (mod mouse-selection-click-count 3) 0) (fboundp fun)) - ;; In this case, we can just let the up-event execute normally. - (let ((end (event-end event))) - ;; Set the position in the event before we replay it, - ;; because otherwise it may have a position in the wrong - ;; buffer. - (setcar (cdr end) end-of-range) - ;; Delete the overlay before calling the function, - ;; because delete-overlay increases buffer-modified-tick. - (push event unread-command-events)))))))) - -(defun gnus-pick-next-page () - "Go to the next page. If at the end of the buffer, start reading articles." - (interactive) - (let ((scroll-in-place nil)) - (condition-case nil - (scroll-up) - (end-of-buffer (gnus-pick-start-reading))))) - -;;; -;;; gnus-binary-mode -;;; - -(defvar gnus-binary-mode nil - "Minor mode for providing a binary group interface in Gnus summary buffers.") - -(defvar gnus-binary-mode-hook nil - "Hook run in summary binary mode buffers.") - -(defvar gnus-binary-mode-map nil) - -(unless gnus-binary-mode-map - (setq gnus-binary-mode-map (make-sparse-keymap)) - - (gnus-define-keys - gnus-binary-mode-map - "g" gnus-binary-show-article)) - -(defun gnus-binary-make-menu-bar () - (unless (boundp 'gnus-binary-menu) - (easy-menu-define - gnus-binary-menu gnus-binary-mode-map "" - '("Pick" - ["Switch binary mode off" gnus-binary-mode t])))) - -(defun gnus-binary-mode (&optional arg) - "Minor mode for providing a binary group interface in Gnus summary buffers." - (interactive "P") - (when (eq major-mode 'gnus-summary-mode) - (make-local-variable 'gnus-binary-mode) - (setq gnus-binary-mode - (if (null arg) (not gnus-binary-mode) - (> (prefix-numeric-value arg) 0))) - (when gnus-binary-mode - ;; Make sure that we don't select any articles upon group entry. - (make-local-variable 'gnus-auto-select-first) - (setq gnus-auto-select-first nil) - (make-local-variable 'gnus-summary-display-article-function) - (setq gnus-summary-display-article-function 'gnus-binary-display-article) - ;; Set up the menu. - (when (gnus-visual-p 'binary-menu 'menu) - (gnus-binary-make-menu-bar)) - (gnus-add-minor-mode 'gnus-binary-mode " Binary" - gnus-binary-mode-map nil 'gnus-binary-mode) - (gnus-run-hooks 'gnus-binary-mode-hook)))) - -(defun gnus-binary-display-article (article &optional all-header) - "Run ARTICLE through the binary decode functions." - (when (gnus-summary-goto-subject article) - (let ((gnus-view-pseudos 'automatic)) - (gnus-uu-decode-uu)))) - -(defun gnus-binary-show-article (&optional arg) - "Bypass the binary functions and show the article." - (interactive "P") - (let (gnus-summary-display-article-function) - (gnus-summary-show-article arg))) - -;;; -;;; gnus-tree-mode -;;; - -(defcustom gnus-tree-line-format "%(%[%3,3n%]%)" - "Format of tree elements." - :type 'string - :group 'gnus-summary-tree) - -(defcustom gnus-tree-minimize-window t - "If non-nil, minimize the tree buffer window. -If a number, never let the tree buffer grow taller than that number of -lines." - :type '(choice boolean - integer) - :group 'gnus-summary-tree) - -(defcustom gnus-selected-tree-face 'modeline - "*Face used for highlighting selected articles in the thread tree." - :type 'face - :group 'gnus-summary-tree) - -(defvar gnus-tree-brackets '((?\[ . ?\]) (?\( . ?\)) - (?\{ . ?\}) (?< . ?>)) - "Brackets used in tree nodes.") - -(defvar gnus-tree-parent-child-edges '(?- ?\\ ?|) - "Characters used to connect parents with children.") - -(defcustom gnus-tree-mode-line-format "Gnus: %%b %S %Z" - "*The format specification for the tree mode line." - :type 'string - :group 'gnus-summary-tree) - -(defcustom gnus-generate-tree-function 'gnus-generate-vertical-tree - "*Function for generating a thread tree. -Two predefined functions are available: -`gnus-generate-horizontal-tree' and `gnus-generate-vertical-tree'." - :type '(radio (function-item gnus-generate-vertical-tree) - (function-item gnus-generate-horizontal-tree) - (function :tag "Other" nil)) - :group 'gnus-summary-tree) - -(defcustom gnus-tree-mode-hook nil - "*Hook run in tree mode buffers." - :type 'hook - :group 'gnus-summary-tree) - -(when (featurep 'xemacs) - (add-hook 'gnus-tree-mode-hook 'gnus-xmas-tree-menu-add) - (add-hook 'gnus-tree-mode-hook 'gnus-xmas-switch-horizontal-scrollbar-off)) - - -;;; Internal variables. - -(defvar gnus-tree-line-format-alist - `((?n gnus-tmp-name ?s) - (?f gnus-tmp-from ?s) - (?N gnus-tmp-number ?d) - (?\[ gnus-tmp-open-bracket ?c) - (?\] gnus-tmp-close-bracket ?c) - (?s gnus-tmp-subject ?s))) - -(defvar gnus-tree-mode-line-format-alist gnus-summary-mode-line-format-alist) - -(defvar gnus-tree-mode-line-format-spec nil) -(defvar gnus-tree-line-format-spec nil) - -(defvar gnus-tree-node-length nil) -(defvar gnus-selected-tree-overlay nil) - -(defvar gnus-tree-displayed-thread nil) -(defvar gnus-tree-inhibit nil) - -(defvar gnus-tree-mode-map nil) -(put 'gnus-tree-mode 'mode-class 'special) - -(unless gnus-tree-mode-map - (setq gnus-tree-mode-map (make-keymap)) - (suppress-keymap gnus-tree-mode-map) - (gnus-define-keys - gnus-tree-mode-map - "\r" gnus-tree-select-article - gnus-mouse-2 gnus-tree-pick-article - "\C-?" gnus-tree-read-summary-keys - "h" gnus-tree-show-summary - - "\C-c\C-i" gnus-info-find-node) - - (substitute-key-definition - 'undefined 'gnus-tree-read-summary-keys gnus-tree-mode-map)) - -(defun gnus-tree-make-menu-bar () - (unless (boundp 'gnus-tree-menu) - (easy-menu-define - gnus-tree-menu gnus-tree-mode-map "" - '("Tree" - ["Select article" gnus-tree-select-article t])))) - -(defun gnus-tree-mode () - "Major mode for displaying thread trees." - (interactive) - (gnus-set-format 'tree-mode) - (gnus-set-format 'tree t) - (when (gnus-visual-p 'tree-menu 'menu) - (gnus-tree-make-menu-bar)) - (kill-all-local-variables) - (gnus-simplify-mode-line) - (setq mode-name "Tree") - (setq major-mode 'gnus-tree-mode) - (use-local-map gnus-tree-mode-map) - (buffer-disable-undo) - (setq buffer-read-only t) - (setq truncate-lines t) - (save-excursion - (gnus-set-work-buffer) - (gnus-tree-node-insert (make-mail-header "") nil) - (setq gnus-tree-node-length (1- (point)))) - (gnus-run-hooks 'gnus-tree-mode-hook)) - -(defun gnus-tree-read-summary-keys (&optional arg) - "Read a summary buffer key sequence and execute it." - (interactive "P") - (unless gnus-tree-inhibit - (let ((buf (current-buffer)) - (gnus-tree-inhibit t) - win) - (set-buffer gnus-article-buffer) - (gnus-article-read-summary-keys arg nil t) - (when (setq win (get-buffer-window buf)) - (select-window win) - (when gnus-selected-tree-overlay - (goto-char (or (gnus-overlay-end gnus-selected-tree-overlay) 1))) - (gnus-tree-minimize))))) - -(defun gnus-tree-show-summary () - "Reconfigure windows to show summary buffer." - (interactive) - (if (not (gnus-buffer-live-p gnus-summary-buffer)) - (error "There is no summary buffer for this tree buffer") - (gnus-configure-windows 'article) - (gnus-summary-goto-subject gnus-current-article))) - -(defun gnus-tree-select-article (article) - "Select the article under point, if any." - (interactive (list (gnus-tree-article-number))) - (let ((buf (current-buffer))) - (when article - (save-excursion - (set-buffer gnus-summary-buffer) - (gnus-summary-goto-article article)) - (select-window (get-buffer-window buf))))) - -(defun gnus-tree-pick-article (e) - "Select the article under the mouse pointer." - (interactive "e") - (mouse-set-point e) - (gnus-tree-select-article (gnus-tree-article-number))) - -(defun gnus-tree-article-number () - (get-text-property (point) 'gnus-number)) - -(defun gnus-tree-article-region (article) - "Return a cons with BEG and END of the article region." - (let ((pos (text-property-any - (point-min) (point-max) 'gnus-number article))) - (when pos - (cons pos (next-single-property-change pos 'gnus-number))))) - -(defun gnus-tree-goto-article (article) - (let ((pos (text-property-any - (point-min) (point-max) 'gnus-number article))) - (when pos - (goto-char pos)))) - -(defun gnus-tree-recenter () - "Center point in the tree window." - (let ((selected (selected-window)) - (tree-window (get-buffer-window gnus-tree-buffer t))) - (when tree-window - (select-window tree-window) - (when gnus-selected-tree-overlay - (goto-char (or (gnus-overlay-end gnus-selected-tree-overlay) 1))) - (let* ((top (cond ((< (window-height) 4) 0) - ((< (window-height) 7) 1) - (t 2))) - (height (1- (window-height))) - (bottom (save-excursion (goto-char (point-max)) - (forward-line (- height)) - (point)))) - ;; Set the window start to either `bottom', which is the biggest - ;; possible valid number, or the second line from the top, - ;; whichever is the least. - (set-window-start - tree-window (min bottom (save-excursion - (forward-line (- top)) (point))))) - (select-window selected)))) - -(defun gnus-get-tree-buffer () - "Return the tree buffer properly initialized." - (save-excursion - (set-buffer (gnus-get-buffer-create gnus-tree-buffer)) - (unless (eq major-mode 'gnus-tree-mode) - (gnus-tree-mode)) - (current-buffer))) - -(defun gnus-tree-minimize () - (when (and gnus-tree-minimize-window - (not (one-window-p))) - (let ((windows 0) - tot-win-height) - (walk-windows (lambda (window) (incf windows))) - (setq tot-win-height - (- (frame-height) - (* window-min-height (1- windows)) - 2)) - (let* ((window-min-height 2) - (height (count-lines (point-min) (point-max))) - (min (max (1- window-min-height) height)) - (tot (if (numberp gnus-tree-minimize-window) - (min gnus-tree-minimize-window min) - min)) - (win (get-buffer-window (current-buffer))) - (wh (and win (1- (window-height win))))) - (setq tot (min tot tot-win-height)) - (when (and win - (not (eq tot wh))) - (let ((selected (selected-window))) - (when (ignore-errors (select-window win)) - (enlarge-window (- tot wh)) - (select-window selected)))))))) - -;;; Generating the tree. - -(defun gnus-tree-node-insert (header sparse &optional adopted) - (let* ((dummy (stringp header)) - (header (if (vectorp header) header - (progn - (setq header (make-mail-header "*****")) - (mail-header-set-number header 0) - (mail-header-set-lines header 0) - (mail-header-set-chars header 0) - header))) - (gnus-tmp-from (mail-header-from header)) - (gnus-tmp-subject (mail-header-subject header)) - (gnus-tmp-number (mail-header-number header)) - (gnus-tmp-name - (cond - ((string-match "(.+)" gnus-tmp-from) - (substring gnus-tmp-from - (1+ (match-beginning 0)) (1- (match-end 0)))) - ((string-match "<[^>]+> *$" gnus-tmp-from) - (let ((beg (match-beginning 0))) - (or (and (string-match "^\"[^\"]*\"" gnus-tmp-from) - (substring gnus-tmp-from (1+ (match-beginning 0)) - (1- (match-end 0)))) - (substring gnus-tmp-from 0 beg)))) - ((memq gnus-tmp-number sparse) - "***") - (t gnus-tmp-from))) - (gnus-tmp-open-bracket - (cond ((memq gnus-tmp-number sparse) - (caadr gnus-tree-brackets)) - (dummy (caaddr gnus-tree-brackets)) - (adopted (car (nth 3 gnus-tree-brackets))) - (t (caar gnus-tree-brackets)))) - (gnus-tmp-close-bracket - (cond ((memq gnus-tmp-number sparse) - (cdadr gnus-tree-brackets)) - (adopted (cdr (nth 3 gnus-tree-brackets))) - (dummy - (cdaddr gnus-tree-brackets)) - (t (cdar gnus-tree-brackets)))) - (buffer-read-only nil) - beg end) - (gnus-add-text-properties - (setq beg (point)) - (setq end (progn (eval gnus-tree-line-format-spec) (point))) - (list 'gnus-number gnus-tmp-number)) - (when (or t (gnus-visual-p 'tree-highlight 'highlight)) - (gnus-tree-highlight-node gnus-tmp-number beg end)))) - -(defun gnus-tree-highlight-node (article beg end) - "Highlight current line according to `gnus-summary-highlight'." - (let ((list gnus-summary-highlight) - face) - (save-excursion - (set-buffer gnus-summary-buffer) - (let* ((score (or (cdr (assq article gnus-newsgroup-scored)) - gnus-summary-default-score 0)) - (default gnus-summary-default-score) - (default-high gnus-summary-default-high-score) - (default-low gnus-summary-default-low-score) - (mark (or (gnus-summary-article-mark article) gnus-unread-mark))) - ;; Eval the cars of the lists until we find a match. - (while (and list - (not (eval (caar list)))) - (setq list (cdr list))))) - (unless (eq (setq face (cdar list)) (get-text-property beg 'face)) - (gnus-put-text-property-excluding-characters-with-faces - beg end 'face - (if (boundp face) (symbol-value face) face))))) - -(defun gnus-tree-indent (level) - (insert (make-string (1- (* (1+ gnus-tree-node-length) level)) ? ))) - -(defvar gnus-tmp-limit) -(defvar gnus-tmp-sparse) -(defvar gnus-tmp-indent) - -(defun gnus-generate-tree (thread) - "Generate a thread tree for THREAD." - (save-excursion - (set-buffer (gnus-get-tree-buffer)) - (let ((buffer-read-only nil) - (gnus-tmp-indent 0)) - (erase-buffer) - (funcall gnus-generate-tree-function thread 0) - (gnus-set-mode-line 'tree) - (goto-char (point-min)) - (gnus-tree-minimize) - (gnus-tree-recenter) - (let ((selected (selected-window))) - (when (get-buffer-window (set-buffer gnus-tree-buffer) t) - (select-window (get-buffer-window (set-buffer gnus-tree-buffer) t)) - (gnus-horizontal-recenter) - (select-window selected)))))) - -(defun gnus-generate-horizontal-tree (thread level &optional dummyp adopted) - "Generate a horizontal tree." - (let* ((dummy (stringp (car thread))) - (do (or dummy - (and (car thread) - (memq (mail-header-number (car thread)) - gnus-tmp-limit)))) - col beg) - (if (not do) - ;; We don't want this article. - (setq thread (cdr thread)) - (if (not (bolp)) - ;; Not the first article on the line, so we insert a "-". - (insert (car gnus-tree-parent-child-edges)) - ;; If the level isn't zero, then we insert some indentation. - (unless (zerop level) - (gnus-tree-indent level) - (insert (cadr gnus-tree-parent-child-edges)) - (setq col (- (setq beg (point)) (gnus-point-at-bol) 1)) - ;; Draw "|" lines upwards. - (while (progn - (forward-line -1) - (forward-char col) - (eq (char-after) ? )) - (delete-char 1) - (insert (caddr gnus-tree-parent-child-edges))) - (goto-char beg))) - (setq dummyp nil) - ;; Insert the article node. - (gnus-tree-node-insert (pop thread) gnus-tmp-sparse adopted)) - (if (null thread) - ;; End of the thread, so we go to the next line. - (unless (bolp) - (insert "\n")) - ;; Recurse downwards in all children of this article. - (while thread - (gnus-generate-horizontal-tree - (pop thread) (if do (1+ level) level) - (or dummyp dummy) dummy))))) - -(defsubst gnus-tree-indent-vertical () - (let ((len (- (* (1+ gnus-tree-node-length) gnus-tmp-indent) - (- (point) (gnus-point-at-bol))))) - (when (> len 0) - (insert (make-string len ? ))))) - -(defsubst gnus-tree-forward-line (n) - (while (>= (decf n) 0) - (unless (zerop (forward-line 1)) - (end-of-line) - (insert "\n"))) - (end-of-line)) - -(defun gnus-generate-vertical-tree (thread level &optional dummyp adopted) - "Generate a vertical tree." - (let* ((dummy (stringp (car thread))) - (do (or dummy - (and (car thread) - (memq (mail-header-number (car thread)) - gnus-tmp-limit)))) - beg) - (if (not do) - ;; We don't want this article. - (setq thread (cdr thread)) - (if (not (save-excursion (beginning-of-line) (bobp))) - ;; Not the first article on the line, so we insert a "-". - (progn - (gnus-tree-indent-vertical) - (insert (make-string (/ gnus-tree-node-length 2) ? )) - (insert (caddr gnus-tree-parent-child-edges)) - (gnus-tree-forward-line 1)) - ;; If the level isn't zero, then we insert some indentation. - (unless (zerop gnus-tmp-indent) - (gnus-tree-forward-line (1- (* 2 level))) - (gnus-tree-indent-vertical) - (delete-char -1) - (insert (cadr gnus-tree-parent-child-edges)) - (setq beg (point)) - (forward-char -1) - ;; Draw "-" lines leftwards. - (while (and (> (point) 1) - (eq (char-after (1- (point))) ? )) - (delete-char -1) - (insert (car gnus-tree-parent-child-edges)) - (forward-char -1)) - (goto-char beg) - (gnus-tree-forward-line 1))) - (setq dummyp nil) - ;; Insert the article node. - (gnus-tree-indent-vertical) - (gnus-tree-node-insert (pop thread) gnus-tmp-sparse adopted) - (gnus-tree-forward-line 1)) - (if (null thread) - ;; End of the thread, so we go to the next line. - (progn - (goto-char (point-min)) - (end-of-line) - (incf gnus-tmp-indent)) - ;; Recurse downwards in all children of this article. - (while thread - (gnus-generate-vertical-tree - (pop thread) (if do (1+ level) level) - (or dummyp dummy) dummy))))) - -;;; Interface functions. - -(defun gnus-possibly-generate-tree (article &optional force) - "Generate the thread tree for ARTICLE if it isn't displayed already." - (when (save-excursion - (set-buffer gnus-summary-buffer) - (and gnus-use-trees - gnus-show-threads - (vectorp (gnus-summary-article-header article)))) - (save-excursion - (let ((top (save-excursion - (set-buffer gnus-summary-buffer) - (gnus-cut-thread - (gnus-remove-thread - (mail-header-id - (gnus-summary-article-header article)) - t)))) - (gnus-tmp-limit gnus-newsgroup-limit) - (gnus-tmp-sparse gnus-newsgroup-sparse)) - (when (or force - (not (eq top gnus-tree-displayed-thread))) - (gnus-generate-tree top) - (setq gnus-tree-displayed-thread top)))))) - -(defun gnus-tree-open (group) - (gnus-get-tree-buffer)) - -(defun gnus-tree-close (group) - (gnus-kill-buffer gnus-tree-buffer)) - -(defun gnus-highlight-selected-tree (article) - "Highlight the selected article in the tree." - (let ((buf (current-buffer)) - region) - (set-buffer gnus-tree-buffer) - (when (setq region (gnus-tree-article-region article)) - (when (or (not gnus-selected-tree-overlay) - (gnus-extent-detached-p gnus-selected-tree-overlay)) - ;; Create a new overlay. - (gnus-overlay-put - (setq gnus-selected-tree-overlay (gnus-make-overlay 1 2)) - 'face gnus-selected-tree-face)) - ;; Move the overlay to the article. - (gnus-move-overlay - gnus-selected-tree-overlay (goto-char (car region)) (cdr region)) - (gnus-tree-minimize) - (gnus-tree-recenter) - (let ((selected (selected-window))) - (when (get-buffer-window (set-buffer gnus-tree-buffer) t) - (select-window (get-buffer-window (set-buffer gnus-tree-buffer) t)) - (gnus-horizontal-recenter) - (select-window selected)))) - ;; If we remove this save-excursion, it updates the wrong mode lines?!? - (save-excursion - (set-buffer gnus-tree-buffer) - (gnus-set-mode-line 'tree)) - (set-buffer buf))) - -(defun gnus-tree-highlight-article (article face) - (save-excursion - (set-buffer (gnus-get-tree-buffer)) - (let (region) - (when (setq region (gnus-tree-article-region article)) - (gnus-put-text-property (car region) (cdr region) 'face face) - (set-window-point - (get-buffer-window (current-buffer) t) (cdr region)))))) - -;;; -;;; gnus-carpal -;;; - -(defvar gnus-carpal-group-buffer-buttons - '(("next" . gnus-group-next-unread-group) - ("prev" . gnus-group-prev-unread-group) - ("read" . gnus-group-read-group) - ("select" . gnus-group-select-group) - ("catch-up" . gnus-group-catchup-current) - ("new-news" . gnus-group-get-new-news-this-group) - ("toggle-sub" . gnus-group-unsubscribe-current-group) - ("subscribe" . gnus-group-unsubscribe-group) - ("kill" . gnus-group-kill-group) - ("yank" . gnus-group-yank-group) - ("describe" . gnus-group-describe-group) - "list" - ("subscribed" . gnus-group-list-groups) - ("all" . gnus-group-list-all-groups) - ("killed" . gnus-group-list-killed) - ("zombies" . gnus-group-list-zombies) - ("matching" . gnus-group-list-matching) - ("post" . gnus-group-post-news) - ("mail" . gnus-group-mail) - ("rescan" . gnus-group-get-new-news) - ("browse-foreign" . gnus-group-browse-foreign) - ("exit" . gnus-group-exit))) - -(defvar gnus-carpal-summary-buffer-buttons - '("mark" - ("read" . gnus-summary-mark-as-read-forward) - ("tick" . gnus-summary-tick-article-forward) - ("clear" . gnus-summary-clear-mark-forward) - ("expirable" . gnus-summary-mark-as-expirable) - "move" - ("scroll" . gnus-summary-next-page) - ("next-unread" . gnus-summary-next-unread-article) - ("prev-unread" . gnus-summary-prev-unread-article) - ("first" . gnus-summary-first-unread-article) - ("best" . gnus-summary-best-unread-article) - "article" - ("headers" . gnus-summary-toggle-header) - ("uudecode" . gnus-uu-decode-uu) - ("enter-digest" . gnus-summary-enter-digest-group) - ("fetch-parent" . gnus-summary-refer-parent-article) - "mail" - ("move" . gnus-summary-move-article) - ("copy" . gnus-summary-copy-article) - ("respool" . gnus-summary-respool-article) - "threads" - ("lower" . gnus-summary-lower-thread) - ("kill" . gnus-summary-kill-thread) - "post" - ("post" . gnus-summary-post-news) - ("mail" . gnus-summary-mail) - ("followup" . gnus-summary-followup-with-original) - ("reply" . gnus-summary-reply-with-original) - ("cancel" . gnus-summary-cancel-article) - "misc" - ("exit" . gnus-summary-exit) - ("fed-up" . gnus-summary-catchup-and-goto-next-group))) - -(defvar gnus-carpal-server-buffer-buttons - '(("add" . gnus-server-add-server) - ("browse" . gnus-server-browse-server) - ("list" . gnus-server-list-servers) - ("kill" . gnus-server-kill-server) - ("yank" . gnus-server-yank-server) - ("copy" . gnus-server-copy-server) - ("exit" . gnus-server-exit))) - -(defvar gnus-carpal-browse-buffer-buttons - '(("subscribe" . gnus-browse-unsubscribe-current-group) - ("exit" . gnus-browse-exit))) - -(defvar gnus-carpal-group-buffer "*Carpal Group*") -(defvar gnus-carpal-summary-buffer "*Carpal Summary*") -(defvar gnus-carpal-server-buffer "*Carpal Server*") -(defvar gnus-carpal-browse-buffer "*Carpal Browse*") - -(defvar gnus-carpal-attached-buffer nil) - -(defvar gnus-carpal-mode-hook nil - "*Hook run in carpal mode buffers.") - -(defvar gnus-carpal-button-face 'bold - "*Face used on carpal buttons.") - -(defvar gnus-carpal-header-face 'bold-italic - "*Face used on carpal buffer headers.") - -(defvar gnus-carpal-mode-map nil) -(put 'gnus-carpal-mode 'mode-class 'special) - -(if gnus-carpal-mode-map - nil - (setq gnus-carpal-mode-map (make-keymap)) - (suppress-keymap gnus-carpal-mode-map) - (define-key gnus-carpal-mode-map " " 'gnus-carpal-select) - (define-key gnus-carpal-mode-map "\r" 'gnus-carpal-select) - (define-key gnus-carpal-mode-map gnus-mouse-2 'gnus-carpal-mouse-select)) - -(defun gnus-carpal-mode () - "Major mode for clicking buttons. - -All normal editing commands are switched off. -\\ -The following commands are available: - -\\{gnus-carpal-mode-map}" - (interactive) - (kill-all-local-variables) - (setq mode-line-modified (cdr gnus-mode-line-modified)) - (setq major-mode 'gnus-carpal-mode) - (setq mode-name "Gnus Carpal") - (setq mode-line-process nil) - (use-local-map gnus-carpal-mode-map) - (buffer-disable-undo) - (setq buffer-read-only t) - (make-local-variable 'gnus-carpal-attached-buffer) - (gnus-run-hooks 'gnus-carpal-mode-hook)) - -(defun gnus-carpal-setup-buffer (type) - (let ((buffer (symbol-value (intern (format "gnus-carpal-%s-buffer" type))))) - (if (get-buffer buffer) - () - (save-excursion - (set-buffer (gnus-get-buffer-create buffer)) - (gnus-carpal-mode) - (setq gnus-carpal-attached-buffer - (intern (format "gnus-%s-buffer" type))) - (let ((buttons (symbol-value - (intern (format "gnus-carpal-%s-buffer-buttons" - type)))) - (buffer-read-only nil) - button) - (while buttons - (setq button (car buttons) - buttons (cdr buttons)) - (if (stringp button) - (gnus-set-text-properties - (point) - (prog2 (insert button) (point) (insert " ")) - (list 'face gnus-carpal-header-face)) - (gnus-set-text-properties - (point) - (prog2 (insert (car button)) (point) (insert " ")) - (list 'gnus-callback (cdr button) - 'face gnus-carpal-button-face - gnus-mouse-face-prop 'highlight)))) - (let ((fill-column (- (window-width) 2))) - (fill-region (point-min) (point-max))) - (set-window-point (get-buffer-window (current-buffer)) - (point-min))))))) - -(defun gnus-carpal-select () - "Select the button under point." - (interactive) - (let ((func (get-text-property (point) 'gnus-callback))) - (if (null func) - () - (pop-to-buffer (symbol-value gnus-carpal-attached-buffer)) - (call-interactively func)))) - -(defun gnus-carpal-mouse-select (event) - "Select the button under the mouse pointer." - (interactive "e") - (mouse-set-point event) - (gnus-carpal-select)) - -;;; Allow redefinition of functions. -(gnus-ems-redefine) - -(provide 'gnus-salt) - -;;; gnus-salt.el ends here diff --git a/lisp/gnus-score.el b/lisp/gnus-score.el deleted file mode 100644 index 497d93b..0000000 --- a/lisp/gnus-score.el +++ /dev/null @@ -1,3008 +0,0 @@ -;;; gnus-score.el --- scoring code for Gnus -;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001 -;; Free Software Foundation, Inc. - -;; Author: Per Abrahamsen -;; Lars Magne Ingebrigtsen -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) -(eval-when-compile (require 'gnus-clfns)) - -(require 'gnus) -(require 'gnus-sum) -(require 'gnus-range) -(require 'message) -(require 'score-mode) - -(defcustom gnus-global-score-files nil - "List of global score files and directories. -Set this variable if you want to use people's score files. One entry -for each score file or each score file directory. Gnus will decide -by itself what score files are applicable to which group. - -Say you want to use the single score file -\"/ftp.gnus.org@ftp:/pub/larsi/ding/score/soc.motss.SCORE\" and all -score files in the \"/ftp.some-where:/pub/score\" directory. - - (setq gnus-global-score-files - '(\"/ftp.gnus.org:/pub/larsi/ding/score/soc.motss.SCORE\" - \"/ftp.some-where:/pub/score\"))" - :group 'gnus-score-files - :type '(repeat file)) - -(defcustom gnus-score-file-single-match-alist nil - "Alist mapping regexps to lists of score files. -Each element of this alist should be of the form - (\"REGEXP\" [ \"SCORE-FILE-1\" ] [ \"SCORE-FILE-2\" ] ... ) - -If the name of a group is matched by REGEXP, the corresponding scorefiles -will be used for that group. -The first match found is used, subsequent matching entries are ignored (to -use multiple matches, see gnus-score-file-multiple-match-alist). - -These score files are loaded in addition to any files returned by -gnus-score-find-score-files-function (which see)." - :group 'gnus-score-files - :type '(repeat (cons regexp (repeat file)))) - -(defcustom gnus-score-file-multiple-match-alist nil - "Alist mapping regexps to lists of score files. -Each element of this alist should be of the form - (\"REGEXP\" [ \"SCORE-FILE-1\" ] [ \"SCORE-FILE-2\" ] ... ) - -If the name of a group is matched by REGEXP, the corresponding scorefiles -will be used for that group. -If multiple REGEXPs match a group, the score files corresponding to each -match will be used (for only one match to be used, see -gnus-score-file-single-match-alist). - -These score files are loaded in addition to any files returned by -gnus-score-find-score-files-function (which see)." - :group 'gnus-score-files - :type '(repeat (cons regexp (repeat file)))) - -(defcustom gnus-score-file-suffix "SCORE" - "Suffix of the score files." - :group 'gnus-score-files - :type 'string) - -(defcustom gnus-adaptive-file-suffix "ADAPT" - "Suffix of the adaptive score files." - :group 'gnus-score-files - :group 'gnus-score-adapt - :type 'string) - -(defcustom gnus-score-find-score-files-function 'gnus-score-find-bnews - "Function used to find score files. -The function will be called with the group name as the argument, and -should return a list of score files to apply to that group. The score -files do not actually have to exist. - -Predefined values are: - -gnus-score-find-single: Only apply the group's own score file. -gnus-score-find-hierarchical: Also apply score files from parent groups. -gnus-score-find-bnews: Apply score files whose names matches. - -See the documentation to these functions for more information. - -This variable can also be a list of functions to be called. Each -function is given the group name as argument and should either return -a list of score files, or a list of score alists. - -If functions other than these pre-defined functions are used, -the `a' symbolic prefix to the score commands will always use -\"all.SCORE\"." - :group 'gnus-score-files - :type '(radio (function-item gnus-score-find-single) - (function-item gnus-score-find-hierarchical) - (function-item gnus-score-find-bnews) - (repeat :tag "List of functions" - (choice (function :tag "Other" :value 'ignore) - (function-item gnus-score-find-single) - (function-item gnus-score-find-hierarchical) - (function-item gnus-score-find-bnews))) - (function :tag "Other" :value 'ignore))) - -(defcustom gnus-score-interactive-default-score 1000 - "*Scoring commands will raise/lower the score with this number as the default." - :group 'gnus-score-default - :type 'integer) - -(defcustom gnus-score-expiry-days 7 - "*Number of days before unused score file entries are expired. -If this variable is nil, no score file entries will be expired." - :group 'gnus-score-expire - :type '(choice (const :tag "never" nil) - number)) - -(defcustom gnus-update-score-entry-dates t - "*In non-nil, update matching score entry dates. -If this variable is nil, then score entries that provide matches -will be expired along with non-matching score entries." - :group 'gnus-score-expire - :type 'boolean) - -(defcustom gnus-decay-scores nil - "*If non-nil, decay non-permanent scores." - :group 'gnus-score-decay - :type 'boolean) - -(defcustom gnus-decay-score-function 'gnus-decay-score - "*Function called to decay a score. -It is called with one parameter -- the score to be decayed." - :group 'gnus-score-decay - :type '(radio (function-item gnus-decay-score) - (function :tag "Other"))) - -(defcustom gnus-score-decay-constant 3 - "*Decay all \"small\" scores with this amount." - :group 'gnus-score-decay - :type 'integer) - -(defcustom gnus-score-decay-scale .05 - "*Decay all \"big\" scores with this factor." - :group 'gnus-score-decay - :type 'number) - -(defcustom gnus-home-score-file nil - "Variable to control where interactive score entries are to go. -It can be: - - * A string - This file file will be used as the home score file. - - * A function - The result of this function will be used as the home score file. - The function will be passed the name of the group as its - parameter. - - * A list - The elements in this list can be: - - * `(regexp file-name ...)' - If the `regexp' matches the group name, the first `file-name' will - will be used as the home score file. (Multiple filenames are - allowed so that one may use gnus-score-file-single-match-alist to - set this variable.) - - * A function. - If the function returns non-nil, the result will be used - as the home score file. The function will be passed the - name of the group as its parameter. - - * A string. Use the string as the home score file. - - The list will be traversed from the beginning towards the end looking - for matches." - :group 'gnus-score-files - :type '(choice string - (repeat (choice string - (cons regexp (repeat file)) - (function :value fun))) - (function-item gnus-hierarchial-home-score-file) - (function-item gnus-current-home-score-file) - (function :value fun))) - -(defcustom gnus-home-adapt-file nil - "Variable to control where new adaptive score entries are to go. -This variable allows the same syntax as `gnus-home-score-file'." - :group 'gnus-score-adapt - :group 'gnus-score-files - :type '(choice string - (repeat (choice string - (cons regexp (repeat file)) - (function :value fun))) - (function :value fun))) - -(defcustom gnus-default-adaptive-score-alist - '((gnus-kill-file-mark) - (gnus-unread-mark) - (gnus-read-mark (from 3) (subject 30)) - (gnus-catchup-mark (subject -10)) - (gnus-killed-mark (from -1) (subject -20)) - (gnus-del-mark (from -2) (subject -15))) - "*Alist of marks and scores." - :group 'gnus-score-adapt - :type '(repeat (cons (symbol :tag "Mark") - (repeat (list (choice :tag "Header" - (const from) - (const subject) - (symbol :tag "other")) - (integer :tag "Score")))))) - -(defcustom gnus-adaptive-word-length-limit nil - "*Words of a length lesser than this limit will be ignored when doing adaptive scoring." - :group 'gnus-score-adapt - :type 'integer) - -(defcustom gnus-ignored-adaptive-words nil - "List of words to be ignored when doing adaptive word scoring." - :group 'gnus-score-adapt - :type '(repeat string)) - -(defcustom gnus-default-ignored-adaptive-words - '("a" "i" "the" "to" "of" "and" "in" "is" "it" "for" "that" "if" "you" - "this" "be" "on" "with" "not" "have" "are" "or" "as" "from" "can" - "but" "by" "at" "an" "will" "no" "all" "was" "do" "there" "my" "one" - "so" "we" "they" "what" "would" "any" "which" "about" "get" "your" - "use" "some" "me" "then" "name" "like" "out" "when" "up" "time" - "other" "more" "only" "just" "end" "also" "know" "how" "new" "should" - "been" "than" "them" "he" "who" "make" "may" "people" "these" "now" - "their" "here" "into" "first" "could" "way" "had" "see" "work" "well" - "were" "two" "very" "where" "while" "us" "because" "good" "same" - "even" "much" "most" "many" "such" "long" "his" "over" "last" "since" - "right" "before" "our" "without" "too" "those" "why" "must" "part" - "being" "current" "back" "still" "go" "point" "value" "each" "did" - "both" "true" "off" "say" "another" "state" "might" "under" "start" - "try" "re") - "*Default list of words to be ignored when doing adaptive word scoring." - :group 'gnus-score-adapt - :type '(repeat string)) - -(defcustom gnus-default-adaptive-word-score-alist - `((,gnus-read-mark . 30) - (,gnus-catchup-mark . -10) - (,gnus-killed-mark . -20) - (,gnus-del-mark . -15)) - "*Alist of marks and scores." - :group 'gnus-score-adapt - :type '(repeat (cons (character :tag "Mark") - (integer :tag "Score")))) - -(defcustom gnus-adaptive-word-minimum nil - "If a number, this is the minimum score value that can be assigned to a word." - :group 'gnus-score-adapt - :type '(choice (const nil) integer)) - -(defcustom gnus-adaptive-word-no-group-words nil - "If t, don't adaptively score words included in the group name." - :group 'gnus-score-adapt - :type 'boolean) - -(defcustom gnus-score-mimic-keymap nil - "*Have the score entry functions pretend that they are a keymap." - :group 'gnus-score-default - :type 'boolean) - -(defcustom gnus-score-exact-adapt-limit 10 - "*Number that says how long a match has to be before using substring matching. -When doing adaptive scoring, one normally uses fuzzy or substring -matching. However, if the header one matches is short, the possibility -for false positives is great, so if the length of the match is less -than this variable, exact matching will be used. - -If this variable is nil, exact matching will always be used." - :group 'gnus-score-adapt - :type '(choice (const nil) integer)) - -(defcustom gnus-score-uncacheable-files "ADAPT$" - "All score files that match this regexp will not be cached." - :group 'gnus-score-adapt - :group 'gnus-score-files - :type 'regexp) - -(defcustom gnus-score-default-header nil - "Default header when entering new scores. - -Should be one of the following symbols. - - a: from - s: subject - b: body - h: head - i: message-id - t: references - x: xref - e: `extra' (non-standard overview) - l: lines - d: date - f: followup - -If nil, the user will be asked for a header." - :group 'gnus-score-default - :type '(choice (const :tag "from" a) - (const :tag "subject" s) - (const :tag "body" b) - (const :tag "head" h) - (const :tag "message-id" i) - (const :tag "references" t) - (const :tag "xref" x) - (const :tag "extra" e) - (const :tag "lines" l) - (const :tag "date" d) - (const :tag "followup" f) - (const :tag "ask" nil))) - -(defcustom gnus-score-default-type nil - "Default match type when entering new scores. - -Should be one of the following symbols. - - s: substring - e: exact string - f: fuzzy string - r: regexp string - b: before date - a: after date - n: this date - <: less than number - >: greater than number - =: equal to number - -If nil, the user will be asked for a match type." - :group 'gnus-score-default - :type '(choice (const :tag "substring" s) - (const :tag "exact string" e) - (const :tag "fuzzy string" f) - (const :tag "regexp string" r) - (const :tag "before date" b) - (const :tag "after date" a) - (const :tag "this date" n) - (const :tag "less than number" <) - (const :tag "greater than number" >) - (const :tag "equal than number" =) - (const :tag "ask" nil))) - -(defcustom gnus-score-default-fold nil - "Use case folding for new score file entries iff not nil." - :group 'gnus-score-default - :type 'boolean) - -(defcustom gnus-score-default-duration nil - "Default duration of effect when entering new scores. - -Should be one of the following symbols. - - t: temporary - p: permanent - i: immediate - -If nil, the user will be asked for a duration." - :group 'gnus-score-default - :type '(choice (const :tag "temporary" t) - (const :tag "permanent" p) - (const :tag "immediate" i) - (const :tag "ask" nil))) - -(defcustom gnus-score-after-write-file-function nil - "Function called with the name of the score file just written to disk." - :group 'gnus-score-files - :type '(choice (const nil) function)) - -(defcustom gnus-score-thread-simplify nil - "If non-nil, subjects will simplified as in threading." - :group 'gnus-score-various - :type 'boolean) - - - -;; Internal variables. - -(defvar gnus-score-use-all-scores t - "If nil, only `gnus-score-find-score-files-function' is used.") - -(defvar gnus-adaptive-word-syntax-table - (let ((table (copy-syntax-table (standard-syntax-table))) - (numbers '(?0 ?1 ?2 ?3 ?4 ?5 ?6 ?7 ?8 ?9))) - (while numbers - (modify-syntax-entry (pop numbers) " " table)) - (modify-syntax-entry ?' "w" table) - table) - "Syntax table used when doing adaptive word scoring.") - -(defvar gnus-scores-exclude-files nil) -(defvar gnus-internal-global-score-files nil) -(defvar gnus-score-file-list nil) - -(defvar gnus-short-name-score-file-cache nil) - -(defvar gnus-score-help-winconf nil) -(defvar gnus-adaptive-score-alist gnus-default-adaptive-score-alist) -(defvar gnus-adaptive-word-score-alist gnus-default-adaptive-word-score-alist) -(defvar gnus-score-trace nil) -(defvar gnus-score-edit-buffer nil) - -(defvar gnus-score-alist nil - "Alist containing score information. -The keys can be symbols or strings. The following symbols are defined. - -touched: If this alist has been modified. -mark: Automatically mark articles below this. -expunge: Automatically expunge articles below this. -files: List of other score files to load when loading this one. -eval: Sexp to be evaluated when the score file is loaded. - -String entries have the form (HEADER (MATCH TYPE SCORE DATE) ...) -where HEADER is the header being scored, MATCH is the string we are -looking for, TYPE is a flag indicating whether it should use regexp or -substring matching, SCORE is the score to add and DATE is the date -of the last successful match.") - -(defvar gnus-score-cache nil) -(defvar gnus-scores-articles nil) -(defvar gnus-score-index nil) - - -(defconst gnus-header-index - ;; Name to index alist. - `(("number" - ,(luna-class-slot-index (luna-find-class 'mime-gnus-entity) - 'location) - gnus-score-integer) - ("subject" - ,(luna-class-slot-index (luna-find-class 'mime-gnus-entity) - 'subject) - gnus-score-string) - ("from" - ,(luna-class-slot-index (luna-find-class 'mime-gnus-entity) - 'from) - gnus-score-string) - ("date" - ,(luna-class-slot-index (luna-find-class 'mime-gnus-entity) - 'date) - gnus-score-date) - ("message-id" - ,(luna-class-slot-index (luna-find-class 'mime-gnus-entity) - 'id) - gnus-score-string) - ("references" - ,(luna-class-slot-index (luna-find-class 'mime-gnus-entity) - 'references) - gnus-score-string) - ("chars" - ,(luna-class-slot-index (luna-find-class 'mime-gnus-entity) - 'chars) - gnus-score-integer) - ("lines" - ,(luna-class-slot-index (luna-find-class 'mime-gnus-entity) - 'lines) - gnus-score-integer) - ("xref" - ,(luna-class-slot-index (luna-find-class 'mime-gnus-entity) - 'xref) - gnus-score-string) -;; ("extra" 16 gnus-score-string) - ("extra" -1 gnus-score-body) - ("head" -1 gnus-score-body) - ("body" -1 gnus-score-body) - ("all" -1 gnus-score-body) - ("followup" - ,(luna-class-slot-index (luna-find-class 'mime-gnus-entity) - 'from) - gnus-score-followup) - ("thread" - ,(luna-class-slot-index (luna-find-class 'mime-gnus-entity) - 'references) - gnus-score-thread))) - -;;; Summary mode score maps. - -(gnus-define-keys (gnus-summary-score-map "V" gnus-summary-mode-map) - "s" gnus-summary-set-score - "S" gnus-summary-current-score - "c" gnus-score-change-score-file - "C" gnus-score-customize - "m" gnus-score-set-mark-below - "x" gnus-score-set-expunge-below - "R" gnus-summary-rescore - "e" gnus-score-edit-current-scores - "f" gnus-score-edit-file - "F" gnus-score-flush-cache - "t" gnus-score-find-trace - "w" gnus-score-find-favourite-words) - -;; Summary score file commands - -;; Much modification of the kill (ahem, score) code and lots of the -;; functions are written by Per Abrahamsen . - -(defun gnus-summary-lower-score (&optional score symp) - "Make a score entry based on the current article. -The user will be prompted for header to score on, match type, -permanence, and the string to be used. The numerical prefix will be -used as score." - (interactive (gnus-interactive "P\ny")) - (gnus-summary-increase-score (- (gnus-score-delta-default score)) symp)) - -(defun gnus-score-kill-help-buffer () - (when (get-buffer "*Score Help*") - (kill-buffer "*Score Help*") - (when gnus-score-help-winconf - (set-window-configuration gnus-score-help-winconf)))) - -(defun gnus-summary-increase-score (&optional score symp) - "Make a score entry based on the current article. -The user will be prompted for header to score on, match type, -permanence, and the string to be used. The numerical prefix will be -used as score." - (interactive (gnus-interactive "P\ny")) - (let* ((nscore (gnus-score-delta-default score)) - (prefix (if (< nscore 0) ?L ?I)) - (increase (> nscore 0)) - (char-to-header - '((?a "from" nil nil string) - (?s "subject" nil nil string) - (?b "body" "" nil body-string) - (?h "head" "" nil body-string) - (?i "message-id" nil nil string) - (?r "references" "message-id" nil string) - (?x "xref" nil nil string) - (?e "extra" nil nil string) - (?l "lines" nil nil number) - (?d "date" nil nil date) - (?f "followup" nil nil string) - (?t "thread" "message-id" nil string))) - (char-to-type - '((?s s "substring" string) - (?e e "exact string" string) - (?f f "fuzzy string" string) - (?r r "regexp string" string) - (?z s "substring" body-string) - (?p r "regexp string" body-string) - (?b before "before date" date) - (?a after "after date" date) - (?n at "this date" date) - (?< < "less than number" number) - (?> > "greater than number" number) - (?= = "equal to number" number))) - (current-score-file gnus-current-score-file) - (char-to-perm - (list (list ?t (current-time-string) "temporary") - '(?p perm "permanent") '(?i now "immediate"))) - (mimic gnus-score-mimic-keymap) - (hchar (and gnus-score-default-header - (aref (symbol-name gnus-score-default-header) 0))) - (tchar (and gnus-score-default-type - (aref (symbol-name gnus-score-default-type) 0))) - (pchar (and gnus-score-default-duration - (aref (symbol-name gnus-score-default-duration) 0))) - entry temporary type match extra) - - (unwind-protect - (progn - - ;; First we read the header to score. - (while (not hchar) - (if mimic - (progn - (sit-for 1) - (message "%c-" prefix)) - (message "%s header (%s?): " (if increase "Increase" "Lower") - (mapconcat (lambda (s) (char-to-string (car s))) - char-to-header ""))) - (setq hchar (read-char)) - (when (or (= hchar ??) (= hchar ?\C-h)) - (setq hchar nil) - (gnus-score-insert-help "Match on header" char-to-header 1))) - - (gnus-score-kill-help-buffer) - (unless (setq entry (assq (downcase hchar) char-to-header)) - (if mimic (error "%c %c" prefix hchar) - (error "Invalid header type"))) - - (when (/= (downcase hchar) hchar) - ;; This was a majuscule, so we end reading and set the defaults. - (if mimic (message "%c %c" prefix hchar) (message "")) - (setq tchar (or tchar ?s) - pchar (or pchar ?t))) - - (let ((legal-types - (delq nil - (mapcar (lambda (s) - (if (eq (nth 4 entry) - (nth 3 s)) - s nil)) - char-to-type)))) - ;; We continue reading - the type. - (while (not tchar) - (if mimic - (progn - (sit-for 1) (message "%c %c-" prefix hchar)) - (message "%s header '%s' with match type (%s?): " - (if increase "Increase" "Lower") - (nth 1 entry) - (mapconcat (lambda (s) (char-to-string (car s))) - legal-types ""))) - (setq tchar (read-char)) - (when (or (= tchar ??) (= tchar ?\C-h)) - (setq tchar nil) - (gnus-score-insert-help "Match type" legal-types 2))) - - (gnus-score-kill-help-buffer) - (unless (setq type (nth 1 (assq (downcase tchar) legal-types))) - (if mimic (error "%c %c" prefix hchar) - (error "Invalid match type")))) - - (when (/= (downcase tchar) tchar) - ;; It was a majuscule, so we end reading and use the default. - (if mimic (message "%c %c %c" prefix hchar tchar) - (message "")) - (setq pchar (or pchar ?t))) - - ;; We continue reading. - (while (not pchar) - (if mimic - (progn - (sit-for 1) (message "%c %c %c-" prefix hchar tchar)) - (message "%s permanence (%s?): " (if increase "Increase" "Lower") - (mapconcat (lambda (s) (char-to-string (car s))) - char-to-perm ""))) - (setq pchar (read-char)) - (when (or (= pchar ??) (= pchar ?\C-h)) - (setq pchar nil) - (gnus-score-insert-help "Match permanence" char-to-perm 2))) - - (gnus-score-kill-help-buffer) - (if mimic (message "%c %c %c" prefix hchar tchar pchar) - (message "")) - (unless (setq temporary (cadr (assq pchar char-to-perm))) - ;; Deal with der(r)ided superannuated paradigms. - (when (and (eq (1+ prefix) 77) - (eq (+ hchar 12) 109) - (eq (1- tchar) 113) - (eq (- pchar 4) 111)) - (error "You rang?")) - (if mimic - (error "%c %c %c %c" prefix hchar tchar pchar) - (error "Invalid match duration")))) - ;; Always kill the score help buffer. - (gnus-score-kill-help-buffer)) - - ;; If scoring an extra (non-standard overview) header, - ;; we must find out which header is in question. - (setq extra - (and gnus-extra-headers - (equal (nth 1 entry) "extra") - (intern ; need symbol - (gnus-completing-read - (symbol-name (car gnus-extra-headers)) ; default response - "Score extra header:" ; prompt - (mapcar (lambda (x) ; completion list - (cons (symbol-name x) x)) - gnus-extra-headers) - nil ; no completion limit - t)))) ; require match - ;; extra is now nil or a symbol. - - ;; We have all the data, so we enter this score. - (setq match (if (string= (nth 2 entry) "") "" - (gnus-summary-header (or (nth 2 entry) (nth 1 entry)) - nil extra))) - - ;; Modify the match, perhaps. - (cond - ((equal (nth 1 entry) "xref") - (when (string-match "^Xref: *" match) - (setq match (substring match (match-end 0)))) - (when (string-match "^[^:]* +" match) - (setq match (substring match (match-end 0)))))) - - (when (memq type '(r R regexp Regexp)) - (setq match (regexp-quote match))) - - ;; Change score file to the "all.SCORE" file. - (when (eq symp 'a) - (save-excursion - (set-buffer gnus-summary-buffer) - (gnus-score-load-file - ;; This is a kludge; yes... - (cond - ((eq gnus-score-find-score-files-function - 'gnus-score-find-hierarchical) - (gnus-score-file-name "")) - ((eq gnus-score-find-score-files-function 'gnus-score-find-single) - current-score-file) - (t - (gnus-score-file-name "all")))))) - - (gnus-summary-score-entry - (nth 1 entry) ; Header - match ; Match - type ; Type - (if (eq score 's) nil score) ; Score - (if (eq temporary 'perm) ; Temp - nil - temporary) - (not (nth 3 entry)) ; Prompt - nil ; not silent - extra) ; non-standard overview. - - (when (eq symp 'a) - ;; We change the score file back to the previous one. - (save-excursion - (set-buffer gnus-summary-buffer) - (gnus-score-load-file current-score-file))))) - -(defun gnus-score-insert-help (string alist idx) - (setq gnus-score-help-winconf (current-window-configuration)) - (save-excursion - (set-buffer (gnus-get-buffer-create "*Score Help*")) - (buffer-disable-undo) - (delete-windows-on (current-buffer)) - (erase-buffer) - (insert string ":\n\n") - (let ((max -1) - (list alist) - (i 0) - n width pad format) - ;; find the longest string to display - (while list - (setq n (length (nth idx (car list)))) - (unless (> max n) - (setq max n)) - (setq list (cdr list))) - (setq max (+ max 4)) ; %c, `:', SPACE, a SPACE at end - (setq n (/ (1- (window-width)) max)) ; items per line - (setq width (/ (1- (window-width)) n)) ; width of each item - ;; insert `n' items, each in a field of width `width' - (while alist - (if (< i n) - () - (setq i 0) - (delete-char -1) ; the `\n' takes a char - (insert "\n")) - (setq pad (- width 3)) - (setq format (concat "%c: %-" (int-to-string pad) "s")) - (insert (format format (caar alist) (nth idx (car alist)))) - (setq alist (cdr alist)) - (setq i (1+ i)))) - ;; display ourselves in a small window at the bottom - (gnus-appt-select-lowest-window) - (split-window) - (pop-to-buffer "*Score Help*") - (let ((window-min-height 1)) - (shrink-window-if-larger-than-buffer)) - (select-window (get-buffer-window gnus-summary-buffer t)))) - -(defun gnus-summary-header (header &optional no-err extra) - ;; Return HEADER for current articles, or error. - (let ((article (gnus-summary-article-number)) - headers) - (if article - (if (and (setq headers (gnus-summary-article-header article)) - (vectorp headers)) - (if extra ; `header' must be "extra" - (or (cdr (assq extra (mail-header-extra headers))) "") - (aref headers (nth 1 (assoc header gnus-header-index)))) - (if no-err - nil - (error "Pseudo-articles can't be scored"))) - (if no-err - (error "No article on current line") - nil)))) - -(defun gnus-newsgroup-score-alist () - (or - (let ((param-file (gnus-group-find-parameter - gnus-newsgroup-name 'score-file))) - (when param-file - (gnus-score-load param-file))) - (gnus-score-load - (gnus-score-file-name gnus-newsgroup-name))) - gnus-score-alist) - -(defsubst gnus-score-get (symbol &optional alist) - ;; Get SYMBOL's definition in ALIST. - (cdr (assoc symbol - (or alist - gnus-score-alist - (gnus-newsgroup-score-alist))))) - -(defun gnus-summary-score-entry (header match type score date - &optional prompt silent extra) - "Enter score file entry. -HEADER is the header being scored. -MATCH is the string we are looking for. -TYPE is the match type: substring, regexp, exact, fuzzy. -SCORE is the score to add. -DATE is the expire date, or nil for no expire, or 'now for immediate expire. -If optional argument `PROMPT' is non-nil, allow user to edit match. -If optional argument `SILENT' is nil, show effect of score entry. -If optional argument `EXTRA' is non-nil, it's a non-standard overview header." - ;; Regexp is the default type. - (when (eq type t) - (setq type 'r)) - ;; Simplify matches... - (cond ((or (eq type 'r) (eq type 's) (eq type nil)) - (setq match (if match (gnus-simplify-subject-re match) ""))) - ((eq type 'f) - (setq match (gnus-simplify-subject-fuzzy match)))) - (let ((score (gnus-score-delta-default score)) - (header (downcase header)) - new) - (set-text-properties 0 (length header) nil header) - (when prompt - (setq match (read-string - (format "Match %s on %s, %s: " - (cond ((eq date 'now) - "now") - ((stringp date) - "temp") - (t "permanent")) - header - (if (< score 0) "lower" "raise")) - (if (numberp match) - (int-to-string match) - match)))) - - ;; If this is an integer comparison, we transform from string to int. - (if (eq (nth 2 (assoc header gnus-header-index)) 'gnus-score-integer) - (if (stringp match) - (setq match (string-to-int match))) - (set-text-properties 0 (length match) nil match)) - - (unless (eq date 'now) - ;; Add the score entry to the score file. - (when (= score gnus-score-interactive-default-score) - (setq score nil)) - (let ((old (gnus-score-get header)) - elem) - (setq new - (cond - (extra - (list match score - (and date (if (numberp date) date - (date-to-day date))) - type (symbol-name extra))) - (type - (list match score - (and date (if (numberp date) date - (date-to-day date))) - type)) - (date (list match score (date-to-day date))) - (score (list match score)) - (t (list match)))) - ;; We see whether we can collapse some score entries. - ;; This isn't quite correct, because there may be more elements - ;; later on with the same key that have matching elems... Hm. - (if (and old - (setq elem (assoc match old)) - (eq (nth 3 elem) (nth 3 new)) - (or (and (numberp (nth 2 elem)) (numberp (nth 2 new))) - (and (not (nth 2 elem)) (not (nth 2 new))))) - ;; Yup, we just add this new score to the old elem. - (setcar (cdr elem) (+ (or (nth 1 elem) - gnus-score-interactive-default-score) - (or (nth 1 new) - gnus-score-interactive-default-score))) - ;; Nope, we have to add a new elem. - (gnus-score-set header (if old (cons new old) (list new)) nil t)) - (gnus-score-set 'touched '(t)))) - - ;; Score the current buffer. - (unless silent - (if (and (>= (nth 1 (assoc header gnus-header-index)) 0) - (eq (nth 2 (assoc header gnus-header-index)) - 'gnus-score-string)) - (gnus-summary-score-effect header match type score extra) - (gnus-summary-rescore))) - - ;; Return the new scoring rule. - new)) - -(defun gnus-summary-score-effect (header match type score extra) - "Simulate the effect of a score file entry. -HEADER is the header being scored. -MATCH is the string we are looking for. -TYPE is the score type. -SCORE is the score to add. -EXTRA is the possible non-standard header." - (interactive (list (completing-read "Header: " - gnus-header-index - (lambda (x) (fboundp (nth 2 x))) - t) - (read-string "Match: ") - (y-or-n-p "Use regexp match? ") - (prefix-numeric-value current-prefix-arg))) - (save-excursion - (unless (and (stringp match) (> (length match) 0)) - (error "No match")) - (goto-char (point-min)) - (let ((regexp (cond ((eq type 'f) - (gnus-simplify-subject-fuzzy match)) - ((eq type 'r) - match) - ((eq type 'e) - (concat "\\`" (regexp-quote match) "\\'")) - (t - (regexp-quote match))))) - (while (not (eobp)) - (let ((content (gnus-summary-header header 'noerr extra)) - (case-fold-search t)) - (and content - (when (if (eq type 'f) - (string-equal (gnus-simplify-subject-fuzzy content) - regexp) - (string-match regexp content)) - (gnus-summary-raise-score score)))) - (beginning-of-line 2)))) - (gnus-set-mode-line 'summary)) - -(defun gnus-summary-score-crossposting (score date) - ;; Enter score file entry for current crossposting. - ;; SCORE is the score to add. - ;; DATE is the expire date. - (let ((xref (gnus-summary-header "xref")) - (start 0) - group) - (unless xref - (error "This article is not crossposted")) - (while (string-match " \\([^ \t]+\\):" xref start) - (setq start (match-end 0)) - (when (not (string= - (setq group - (substring xref (match-beginning 1) (match-end 1))) - gnus-newsgroup-name)) - (gnus-summary-score-entry - "xref" (concat " " group ":") nil score date t))))) - - -;;; -;;; Gnus Score Files -;;; - -;; All score code written by Per Abrahamsen . - -;; Added by Per Abrahamsen . -(defun gnus-score-set-mark-below (score) - "Automatically mark articles with score below SCORE as read." - (interactive - (list (or (and current-prefix-arg (prefix-numeric-value current-prefix-arg)) - (string-to-int (read-string "Mark below: "))))) - (setq score (or score gnus-summary-default-score 0)) - (gnus-score-set 'mark (list score)) - (gnus-score-set 'touched '(t)) - (setq gnus-summary-mark-below score) - (gnus-score-update-lines)) - -(defun gnus-score-update-lines () - "Update all lines in the summary buffer." - (save-excursion - (goto-char (point-min)) - (while (not (eobp)) - (gnus-summary-update-line) - (forward-line 1)))) - -(defun gnus-score-update-all-lines () - "Update all lines in the summary buffer, even the hidden ones." - (save-excursion - (goto-char (point-min)) - (let (hidden) - (while (not (eobp)) - (when (gnus-summary-show-thread) - (push (point) hidden)) - (gnus-summary-update-line) - (forward-line 1)) - ;; Re-hide the hidden threads. - (while hidden - (goto-char (pop hidden)) - (gnus-summary-hide-thread))))) - -(defun gnus-score-set-expunge-below (score) - "Automatically expunge articles with score below SCORE." - (interactive - (list (or (and current-prefix-arg (prefix-numeric-value current-prefix-arg)) - (string-to-int (read-string "Set expunge below: "))))) - (setq score (or score gnus-summary-default-score 0)) - (gnus-score-set 'expunge (list score)) - (gnus-score-set 'touched '(t))) - -(defun gnus-score-followup-article (&optional score) - "Add SCORE to all followups to the article in the current buffer." - (interactive "P") - (setq score (gnus-score-delta-default score)) - (when (gnus-buffer-live-p gnus-summary-buffer) - (save-excursion - (save-restriction - (message-narrow-to-headers) - (let ((id (mail-fetch-field "message-id"))) - (when id - (set-buffer gnus-summary-buffer) - (gnus-summary-score-entry - "references" (concat id "[ \t]*$") 'r - score (current-time-string) nil t))))))) - -(defun gnus-score-followup-thread (&optional score) - "Add SCORE to all later articles in the thread the current buffer is part of." - (interactive "P") - (setq score (gnus-score-delta-default score)) - (when (gnus-buffer-live-p gnus-summary-buffer) - (save-excursion - (save-restriction - (goto-char (point-min)) - (let ((id (mail-fetch-field "message-id"))) - (when id - (set-buffer gnus-summary-buffer) - (gnus-summary-score-entry - "references" id 's - score (current-time-string)))))))) - -(defun gnus-score-set (symbol value &optional alist warn) - ;; Set SYMBOL to VALUE in ALIST. - (let* ((alist - (or alist - gnus-score-alist - (gnus-newsgroup-score-alist))) - (entry (assoc symbol alist))) - (cond ((gnus-score-get 'read-only alist) - ;; This is a read-only score file, so we do nothing. - (when warn - (gnus-message 4 "Note: read-only score file; entry discarded"))) - (entry - (setcdr entry value)) - ((null alist) - (error "Empty alist")) - (t - (setcdr alist - (cons (cons symbol value) (cdr alist))))))) - -(defun gnus-summary-raise-score (n) - "Raise the score of the current article by N." - (interactive "p") - (gnus-summary-set-score (+ (gnus-summary-article-score) - (or n gnus-score-interactive-default-score )))) - -(defun gnus-summary-set-score (n) - "Set the score of the current article to N." - (interactive "p") - (save-excursion - (gnus-summary-show-thread) - (let ((buffer-read-only nil)) - ;; Set score. - (gnus-summary-update-mark - (if (= n (or gnus-summary-default-score 0)) ? ;Whitespace - (if (< n (or gnus-summary-default-score 0)) - gnus-score-below-mark gnus-score-over-mark)) - 'score)) - (let* ((article (gnus-summary-article-number)) - (score (assq article gnus-newsgroup-scored))) - (if score (setcdr score n) - (push (cons article n) gnus-newsgroup-scored))) - (gnus-summary-update-line))) - -(defun gnus-summary-current-score () - "Return the score of the current article." - (interactive) - (gnus-message 1 "%s" (gnus-summary-article-score))) - -(defun gnus-score-change-score-file (file) - "Change current score alist." - (interactive - (list (read-file-name "Change to score file: " gnus-kill-files-directory))) - (gnus-score-load-file file) - (gnus-set-mode-line 'summary)) - -(defvar gnus-score-edit-exit-function) -(defun gnus-score-edit-current-scores (file) - "Edit the current score alist." - (interactive (list gnus-current-score-file)) - (if (not gnus-current-score-file) - (error "No current score file") - (let ((winconf (current-window-configuration))) - (when (buffer-name gnus-summary-buffer) - (gnus-score-save)) - (gnus-make-directory (file-name-directory file)) - (setq gnus-score-edit-buffer (find-file-noselect file)) - (gnus-configure-windows 'edit-score) - (gnus-score-mode) - (setq gnus-score-edit-exit-function 'gnus-score-edit-done) - (make-local-variable 'gnus-prev-winconf) - (setq gnus-prev-winconf winconf)) - (gnus-message - 4 (substitute-command-keys - "\\\\[gnus-score-edit-exit] to save edits")))) - -(defun gnus-score-edit-file (file) - "Edit a score file." - (interactive - (list (read-file-name "Edit score file: " gnus-kill-files-directory))) - (gnus-make-directory (file-name-directory file)) - (when (buffer-name gnus-summary-buffer) - (gnus-score-save)) - (let ((winconf (current-window-configuration))) - (setq gnus-score-edit-buffer (find-file-noselect file)) - (gnus-configure-windows 'edit-score) - (gnus-score-mode) - (setq gnus-score-edit-exit-function 'gnus-score-edit-done) - (make-local-variable 'gnus-prev-winconf) - (setq gnus-prev-winconf winconf)) - (gnus-message - 4 (substitute-command-keys - "\\\\[gnus-score-edit-exit] to save edits"))) - -(defun gnus-score-load-file (file) - ;; Load score file FILE. Returns a list a retrieved score-alists. - (let* ((file (expand-file-name - (or (and (string-match - (concat "^" (regexp-quote - (expand-file-name - gnus-kill-files-directory))) - (expand-file-name file)) - file) - (expand-file-name file gnus-kill-files-directory)))) - (cached (assoc file gnus-score-cache)) - (global (member file gnus-internal-global-score-files)) - lists alist) - (if cached - ;; The score file was already loaded. - (setq alist (cdr cached)) - ;; We load the score file. - (setq gnus-score-alist nil) - (setq alist (gnus-score-load-score-alist file)) - ;; We add '(touched) to the alist to signify that it hasn't been - ;; touched (yet). - (unless (assq 'touched alist) - (push (list 'touched nil) alist)) - ;; If it is a global score file, we make it read-only. - (and global - (not (assq 'read-only alist)) - (push (list 'read-only t) alist)) - (push (cons file alist) gnus-score-cache)) - (let ((a alist) - found) - (while a - ;; Downcase all header names. - (cond - ((stringp (caar a)) - (setcar (car a) (downcase (caar a))) - (setq found t)) - ;; Advanced scoring. - ((consp (caar a)) - (setq found t))) - (pop a)) - ;; If there are actual scores in the alist, we add it to the - ;; return value of this function. - (when found - (setq lists (list alist)))) - ;; Treat the other possible atoms in the score alist. - (let ((mark (car (gnus-score-get 'mark alist))) - (expunge (car (gnus-score-get 'expunge alist))) - (mark-and-expunge (car (gnus-score-get 'mark-and-expunge alist))) - (files (gnus-score-get 'files alist)) - (exclude-files (gnus-score-get 'exclude-files alist)) - (orphan (car (gnus-score-get 'orphan alist))) - (adapt (gnus-score-get 'adapt alist)) - (thread-mark-and-expunge - (car (gnus-score-get 'thread-mark-and-expunge alist))) - (adapt-file (car (gnus-score-get 'adapt-file alist))) - (local (gnus-score-get 'local alist)) - (decay (car (gnus-score-get 'decay alist))) - (eval (car (gnus-score-get 'eval alist)))) - ;; Perform possible decays. - (when (and gnus-decay-scores - (or cached (file-exists-p file)) - (or (not decay) - (gnus-decay-scores alist decay))) - (gnus-score-set 'touched '(t) alist) - (gnus-score-set 'decay (list (time-to-days (current-time))) alist)) - ;; We do not respect eval and files atoms from global score - ;; files. - (when (and files (not global)) - (setq lists (apply 'append lists - (mapcar (lambda (file) - (gnus-score-load-file file)) - (if adapt-file (cons adapt-file files) - files))))) - (when (and eval (not global)) - (eval eval)) - ;; We then expand any exclude-file directives. - (setq gnus-scores-exclude-files - (nconc - (apply - 'nconc - (mapcar - (lambda (sfile) - (list - (expand-file-name sfile (file-name-directory file)) - (expand-file-name sfile gnus-kill-files-directory))) - exclude-files)) - gnus-scores-exclude-files)) - (when local - (save-excursion - (set-buffer gnus-summary-buffer) - (while local - (and (consp (car local)) - (symbolp (caar local)) - (progn - (make-local-variable (caar local)) - (set (caar local) (nth 1 (car local))))) - (setq local (cdr local))))) - (when orphan - (setq gnus-orphan-score orphan)) - (setq gnus-adaptive-score-alist - (cond ((equal adapt '(t)) - (setq gnus-newsgroup-adaptive t) - gnus-default-adaptive-score-alist) - ((equal adapt '(ignore)) - (setq gnus-newsgroup-adaptive nil)) - ((consp adapt) - (setq gnus-newsgroup-adaptive t) - adapt) - (t - ;;(setq gnus-newsgroup-adaptive gnus-use-adaptive-scoring) - gnus-default-adaptive-score-alist))) - (setq gnus-thread-expunge-below - (or thread-mark-and-expunge gnus-thread-expunge-below)) - (setq gnus-summary-mark-below - (or mark mark-and-expunge gnus-summary-mark-below)) - (setq gnus-summary-expunge-below - (or expunge mark-and-expunge gnus-summary-expunge-below)) - (setq gnus-newsgroup-adaptive-score-file - (or adapt-file gnus-newsgroup-adaptive-score-file))) - (setq gnus-current-score-file file) - (setq gnus-score-alist alist) - lists)) - -(defun gnus-score-load (file) - ;; Load score FILE. - (let ((cache (assoc file gnus-score-cache))) - (if cache - (setq gnus-score-alist (cdr cache)) - (setq gnus-score-alist nil) - (gnus-score-load-score-alist file) - (unless gnus-score-alist - (setq gnus-score-alist (copy-alist '((touched nil))))) - (push (cons file gnus-score-alist) gnus-score-cache)))) - -(defun gnus-score-remove-from-cache (file) - (setq gnus-score-cache - (delq (assoc file gnus-score-cache) gnus-score-cache))) - -(defun gnus-score-load-score-alist (file) - "Read score FILE." - (let (alist) - (if (not (file-readable-p file)) - ;; Couldn't read file. - (setq gnus-score-alist nil) - ;; Read file. - (with-temp-buffer - (insert-file-contents-as-coding-system - score-mode-coding-system file) - (goto-char (point-min)) - ;; Only do the loading if the score file isn't empty. - (when (save-excursion (re-search-forward "[()0-9a-zA-Z]" nil t)) - (setq alist - (condition-case () - (read (current-buffer)) - (error - (gnus-error 3.2 "Problem with score file %s" file)))))) - (cond - ((and alist - (atom alist)) - ;; Bogus score file. - (error "Invalid syntax with score file %s" file)) - ((eq (car alist) 'setq) - ;; This is an old-style score file. - (setq gnus-score-alist (gnus-score-transform-old-to-new alist))) - (t - (setq gnus-score-alist alist))) - ;; Check the syntax of the score file. - (setq gnus-score-alist - (gnus-score-check-syntax gnus-score-alist file))))) - -(defun gnus-score-check-syntax (alist file) - "Check the syntax of the score ALIST." - (cond - ((null alist) - nil) - ((not (consp alist)) - (gnus-message 1 "Score file is not a list: %s" file) - (ding) - nil) - (t - (let ((a alist) - sr err s type) - (while (and a (not err)) - (setq - err - (cond - ((not (listp (car a))) - (format "Invalid score element %s in %s" (car a) file)) - ((stringp (caar a)) - (cond - ((not (listp (setq sr (cdar a)))) - (format "Invalid header match %s in %s" (nth 1 (car a)) file)) - (t - (setq type (caar a)) - (while (and sr (not err)) - (setq s (pop sr)) - (setq - err - (cond - ((if (member (downcase type) '("lines" "chars")) - (not (numberp (car s))) - (not (stringp (car s)))) - (format "Invalid match %s in %s" (car s) file)) - ((and (cadr s) (not (integerp (cadr s)))) - (format "Non-integer score %s in %s" (cadr s) file)) - ((and (caddr s) (not (integerp (caddr s)))) - (format "Non-integer date %s in %s" (caddr s) file)) - ((and (cadddr s) (not (symbolp (cadddr s)))) - (format "Non-symbol match type %s in %s" (cadddr s) file))))) - err))))) - (setq a (cdr a))) - (if err - (progn - (ding) - (gnus-message 3 err) - (sit-for 2) - nil) - alist))))) - -(defun gnus-score-transform-old-to-new (alist) - (let* ((alist (nth 2 alist)) - out entry) - (when (eq (car alist) 'quote) - (setq alist (nth 1 alist))) - (while alist - (setq entry (car alist)) - (if (stringp (car entry)) - (let ((scor (cdr entry))) - (push entry out) - (while scor - (setcar scor - (list (caar scor) (nth 2 (car scor)) - (and (nth 3 (car scor)) - (date-to-day (nth 3 (car scor)))) - (if (nth 1 (car scor)) 'r 's))) - (setq scor (cdr scor)))) - (push (if (not (listp (cdr entry))) - (list (car entry) (cdr entry)) - entry) - out)) - (setq alist (cdr alist))) - (cons (list 'touched t) (nreverse out)))) - -(defun gnus-score-save () - ;; Save all score information. - (let ((cache gnus-score-cache) - entry score file) - (save-excursion - (setq gnus-score-alist nil) - (nnheader-set-temp-buffer " *Gnus Scores*") - (while cache - (current-buffer) - (setq entry (pop cache) - file (nnheader-translate-file-chars (car entry) t) - score (cdr entry)) - (if (or (not (equal (gnus-score-get 'touched score) '(t))) - (gnus-score-get 'read-only score) - (and (file-exists-p file) - (not (file-writable-p file)))) - () - (setq score (setcdr entry (gnus-delete-alist 'touched score))) - (erase-buffer) - (let (emacs-lisp-mode-hook) - (if (string-match - (concat (regexp-quote gnus-adaptive-file-suffix) "$") - file) - ;; This is an adaptive score file, so we do not run - ;; it through `pp'. These files can get huge, and - ;; are not meant to be edited by human hands. - (gnus-prin1 score) - ;; This is a normal score file, so we print it very - ;; prettily. - (let ((lisp-mode-syntax-table score-mode-syntax-table)) - (pp score (current-buffer))))) - (gnus-make-directory (file-name-directory file)) - ;; If the score file is empty, we delete it. - (if (zerop (buffer-size)) - (delete-file file) - ;; There are scores, so we write the file. - (when (file-writable-p file) - (gnus-write-buffer-as-coding-system - score-mode-coding-system file) - (when gnus-score-after-write-file-function - (funcall gnus-score-after-write-file-function file))))) - (and gnus-score-uncacheable-files - (string-match gnus-score-uncacheable-files file) - (gnus-score-remove-from-cache file))) - (kill-buffer (current-buffer))))) - -(defun gnus-score-load-files (score-files) - "Load all score files in SCORE-FILES." - ;; Load the score files. - (let (scores) - (while score-files - (if (stringp (car score-files)) - ;; It is a string, which means that it's a score file name, - ;; so we load the score file and add the score alist to - ;; the list of alists. - (setq scores (nconc (gnus-score-load-file (car score-files)) scores)) - ;; It is an alist, so we just add it to the list directly. - (setq scores (nconc (car score-files) scores))) - (setq score-files (cdr score-files))) - ;; Prune the score files that are to be excluded, if any. - (when gnus-scores-exclude-files - (let ((s scores) - c) - (while s - (and (setq c (rassq (car s) gnus-score-cache)) - (member (car c) gnus-scores-exclude-files) - (setq scores (delq (car s) scores))) - (setq s (cdr s))))) - scores)) - -(defun gnus-score-headers (score-files &optional trace) - ;; Score `gnus-newsgroup-headers'. - (let (scores news) - ;; PLM: probably this is not the best place to clear orphan-score - (setq gnus-orphan-score nil - gnus-scores-articles nil - gnus-scores-exclude-files nil - scores (gnus-score-load-files score-files)) - (setq news scores) - ;; Do the scoring. - (while news - (setq scores news - news nil) - (when (and gnus-summary-default-score - scores) - (let* ((entries gnus-header-index) - (now (date-to-day (current-time-string))) - (expire (and gnus-score-expiry-days - (- now gnus-score-expiry-days))) - (headers gnus-newsgroup-headers) - (current-score-file gnus-current-score-file) - entry header new) - (gnus-message 7 "Scoring...") - ;; Create articles, an alist of the form `(HEADER . SCORE)'. - (while (setq header (pop headers)) - ;; WARNING: The assq makes the function O(N*S) while it could - ;; be written as O(N+S), where N is (length gnus-newsgroup-headers) - ;; and S is (length gnus-newsgroup-scored). - (unless (assq (mail-header-number header) gnus-newsgroup-scored) - (setq gnus-scores-articles ;Total of 2 * N cons-cells used. - (cons (cons header (or gnus-summary-default-score 0)) - gnus-scores-articles)))) - - (save-excursion - (set-buffer (gnus-get-buffer-create "*Headers*")) - (buffer-disable-undo) - (when (gnus-buffer-live-p gnus-summary-buffer) - (message-clone-locals gnus-summary-buffer)) - - ;; Set the global variant of this variable. - (setq gnus-current-score-file current-score-file) - ;; score orphans - (when gnus-orphan-score - (setq gnus-score-index - (nth 1 (assoc "references" gnus-header-index))) - (gnus-score-orphans gnus-orphan-score)) - ;; Run each header through the score process. - (while entries - (setq entry (pop entries) - header (nth 0 entry) - gnus-score-index (nth 1 (assoc header gnus-header-index))) - (when (< 0 (apply 'max (mapcar - (lambda (score) - (length (gnus-score-get header score))) - scores))) - ;; Call the scoring function for this type of "header". - (when (setq new (funcall (nth 2 entry) scores header - now expire trace)) - (push new news)))) - (when (gnus-buffer-live-p gnus-summary-buffer) - (let ((scored gnus-newsgroup-scored)) - (with-current-buffer gnus-summary-buffer - (setq gnus-newsgroup-scored scored)))) - ;; Remove the buffer. - (kill-buffer (current-buffer))) - - ;; Add articles to `gnus-newsgroup-scored'. - (while gnus-scores-articles - (when (or (/= gnus-summary-default-score - (cdar gnus-scores-articles)) - gnus-save-score) - (push (cons (mail-header-number (caar gnus-scores-articles)) - (cdar gnus-scores-articles)) - gnus-newsgroup-scored)) - (setq gnus-scores-articles (cdr gnus-scores-articles))) - - (let (score) - (while (setq score (pop scores)) - (while score - (when (consp (caar score)) - (gnus-score-advanced (car score) trace)) - (pop score)))) - - (gnus-message 7 "Scoring...done")))))) - -(defun gnus-score-lower-thread (thread score-adjust) - "Lower the score on THREAD with SCORE-ADJUST. -THREAD is expected to contain a list of the form `(PARENT [CHILD1 -CHILD2 ...])' where PARENT is a header array and each CHILD is a list -of the same form as THREAD. The empty list `nil' is valid. For each -article in the tree, the score of the corresponding entry in -GNUS-NEWSGROUP-SCORED is adjusted by SCORE-ADJUST." - (while thread - (let ((head (car thread))) - (if (listp head) - ;; handle a child and its descendants - (gnus-score-lower-thread head score-adjust) - ;; handle the parent - (let* ((article (mail-header-number head)) - (score (assq article gnus-newsgroup-scored))) - (if score (setcdr score (+ (cdr score) score-adjust)) - (push (cons article score-adjust) gnus-newsgroup-scored))))) - (setq thread (cdr thread)))) - -(defun gnus-score-orphans (score) - "Score orphans. -A root is an article with no references. An orphan is an article -which has references, but is not connected via its references to a -root article. This function finds all the orphans, and adjusts their -score in GNUS-NEWSGROUP-SCORED by SCORE." - ;; gnus-make-threads produces a list, where each entry is a "thread" - ;; as described in the gnus-score-lower-thread docs. This function - ;; will be called again (after limiting has been done) if the display - ;; is threaded. It would be nice to somehow save this info and use - ;; it later. - (dolist (thread (gnus-make-threads)) - (let ((id (aref (car thread) gnus-score-index))) - ;; If the parent of the thread is not a root, lower the score of - ;; it and its descendants. Note that some roots seem to satisfy - ;; (eq id nil) and some (eq id ""); not sure why. - (when (and id - (not (string= id ""))) - (gnus-score-lower-thread thread score))))) - -(defun gnus-score-integer (scores header now expire &optional trace) - (let ((gnus-score-index (nth 1 (assoc header gnus-header-index))) - entries alist) - ;; Find matches. - (while scores - (setq alist (car scores) - scores (cdr scores) - entries (assoc header alist)) - (while (cdr entries) ;First entry is the header index. - (let* ((rest (cdr entries)) - (kill (car rest)) - (match (nth 0 kill)) - (type (or (nth 3 kill) '>)) - (score (or (nth 1 kill) gnus-score-interactive-default-score)) - (date (nth 2 kill)) - (found nil) - (match-func (if (or (eq type '>) (eq type '<) (eq type '<=) - (eq type '>=) (eq type '=)) - type - (error "Invalid match type: %s" type))) - (articles gnus-scores-articles)) - ;; Instead of doing all the clever stuff that - ;; `gnus-score-string' does to minimize searches and stuff, - ;; I will assume that people generally will put so few - ;; matches on numbers that any cleverness will take more - ;; time than one would gain. - (while articles - (when (funcall match-func - (or (aref (caar articles) gnus-score-index) 0) - match) - (when trace - (push (cons (car-safe (rassq alist gnus-score-cache)) kill) - gnus-score-trace)) - (setq found t) - (setcdr (car articles) (+ score (cdar articles)))) - (setq articles (cdr articles))) - ;; Update expire date - (cond ((null date)) ;Permanent entry. - ((and found gnus-update-score-entry-dates) ;Match, update date. - (gnus-score-set 'touched '(t) alist) - (setcar (nthcdr 2 kill) now)) - ((and expire (< date expire)) ;Old entry, remove. - (gnus-score-set 'touched '(t) alist) - (setcdr entries (cdr rest)) - (setq rest entries))) - (setq entries rest))))) - nil) - -(defun gnus-score-date (scores header now expire &optional trace) - (let ((gnus-score-index (nth 1 (assoc header gnus-header-index))) - entries alist match match-func article) - ;; Find matches. - (while scores - (setq alist (car scores) - scores (cdr scores) - entries (assoc header alist)) - (while (cdr entries) ;First entry is the header index. - (let* ((rest (cdr entries)) - (kill (car rest)) - (type (or (nth 3 kill) 'before)) - (score (or (nth 1 kill) gnus-score-interactive-default-score)) - (date (nth 2 kill)) - (found nil) - (articles gnus-scores-articles) - l) - (cond - ((eq type 'after) - (setq match-func 'string< - match (gnus-date-iso8601 (nth 0 kill)))) - ((eq type 'before) - (setq match-func 'gnus-string> - match (gnus-date-iso8601 (nth 0 kill)))) - ((eq type 'at) - (setq match-func 'string= - match (gnus-date-iso8601 (nth 0 kill)))) - ((eq type 'regexp) - (setq match-func 'string-match - match (nth 0 kill))) - (t (error "Invalid match type: %s" type))) - ;; Instead of doing all the clever stuff that - ;; `gnus-score-string' does to minimize searches and stuff, - ;; I will assume that people generally will put so few - ;; matches on numbers that any cleverness will take more - ;; time than one would gain. - (while (setq article (pop articles)) - (when (and - (setq l (aref (car article) gnus-score-index)) - (funcall match-func match (gnus-date-iso8601 l))) - (when trace - (push (cons (car-safe (rassq alist gnus-score-cache)) kill) - gnus-score-trace)) - (setq found t) - (setcdr article (+ score (cdr article))))) - ;; Update expire date - (cond ((null date)) ;Permanent entry. - ((and found gnus-update-score-entry-dates) ;Match, update date. - (gnus-score-set 'touched '(t) alist) - (setcar (nthcdr 2 kill) now)) - ((and expire (< date expire)) ;Old entry, remove. - (gnus-score-set 'touched '(t) alist) - (setcdr entries (cdr rest)) - (setq rest entries))) - (setq entries rest))))) - nil) - -(defun gnus-score-body (scores header now expire &optional trace) - (if gnus-agent-fetching - nil - (save-excursion - (setq gnus-scores-articles - (sort gnus-scores-articles - (lambda (a1 a2) - (< (mail-header-number (car a1)) - (mail-header-number (car a2)))))) - (set-buffer nntp-server-buffer) - (save-restriction - (let* ((buffer-read-only nil) - (articles gnus-scores-articles) - (all-scores scores) - (request-func (cond ((string= "head" header) - 'gnus-request-head) - ((string= "body" header) - 'gnus-request-body) - (t 'gnus-request-article))) - entries alist ofunc article last) - (when articles - (setq last (mail-header-number (caar (last articles)))) - ;; Not all backends support partial fetching. In that case, - ;; we just fetch the entire article. - (unless (gnus-check-backend-function - (and (string-match "^gnus-" (symbol-name request-func)) - (intern (substring (symbol-name request-func) - (match-end 0)))) - gnus-newsgroup-name) - (setq ofunc request-func) - (setq request-func 'gnus-request-article)) - (while articles - (setq article (mail-header-number (caar articles))) - (gnus-message 7 "Scoring article %s of %s..." article last) - (widen) - (when (funcall request-func article gnus-newsgroup-name) - (goto-char (point-min)) - ;; If just parts of the article is to be searched, but the - ;; backend didn't support partial fetching, we just narrow - ;; to the relevant parts. - (when ofunc - (if (eq ofunc 'gnus-request-head) - (narrow-to-region - (point) - (or (search-forward "\n\n" nil t) (point-max))) - (narrow-to-region - (or (search-forward "\n\n" nil t) (point)) - (point-max)))) - (setq scores all-scores) - ;; Find matches. - (while scores - (setq alist (pop scores) - entries (assoc header alist)) - (while (cdr entries) ;First entry is the header index. - (let* ((rest (cdr entries)) - (kill (car rest)) - (match (nth 0 kill)) - (type (or (nth 3 kill) 's)) - (score (or (nth 1 kill) - gnus-score-interactive-default-score)) - (date (nth 2 kill)) - (found nil) - (case-fold-search - (not (or (eq type 'R) (eq type 'S) - (eq type 'Regexp) (eq type 'String)))) - (search-func - (cond ((or (eq type 'r) (eq type 'R) - (eq type 'regexp) (eq type 'Regexp)) - 're-search-forward) - ((or (eq type 's) (eq type 'S) - (eq type 'string) (eq type 'String)) - 'search-forward) - (t - (error "Invalid match type: %s" type))))) - (goto-char (point-min)) - (when (funcall search-func match nil t) - ;; Found a match, update scores. - (setcdr (car articles) (+ score (cdar articles))) - (setq found t) - (when trace - (push - (cons (car-safe (rassq alist gnus-score-cache)) kill) - gnus-score-trace))) - ;; Update expire date - (unless trace - (cond - ((null date)) ;Permanent entry. - ((and found gnus-update-score-entry-dates) - ;; Match, update date. - (gnus-score-set 'touched '(t) alist) - (setcar (nthcdr 2 kill) now)) - ((and expire (< date expire)) ;Old entry, remove. - (gnus-score-set 'touched '(t) alist) - (setcdr entries (cdr rest)) - (setq rest entries)))) - (setq entries rest))))) - (setq articles (cdr articles))))))) - nil)) - -(defun gnus-score-thread (scores header now expire &optional trace) - (gnus-score-followup scores header now expire trace t)) - -(defun gnus-score-followup (scores header now expire &optional trace thread) - (if gnus-agent-fetching - ;; FIXME: It seems doable in fetching mode. - nil - ;; Insert the unique article headers in the buffer. - (let ((gnus-score-index (nth 1 (assoc header gnus-header-index))) - (current-score-file gnus-current-score-file) - (all-scores scores) - ;; gnus-score-index is used as a free variable. - alike last this art entries alist articles - new news) - - ;; Change score file to the adaptive score file. All entries that - ;; this function makes will be put into this file. - (save-excursion - (set-buffer gnus-summary-buffer) - (gnus-score-load-file - (or gnus-newsgroup-adaptive-score-file - (gnus-score-file-name - gnus-newsgroup-name gnus-adaptive-file-suffix)))) - - (setq gnus-scores-articles (sort gnus-scores-articles - 'gnus-score-string<) - articles gnus-scores-articles) - - (erase-buffer) - (while articles - (setq art (car articles) - this (aref (car art) gnus-score-index) - articles (cdr articles)) - (if (equal last this) - (push art alike) - (when last - (insert last ?\n) - (put-text-property (1- (point)) (point) 'articles alike)) - (setq alike (list art) - last this))) - (when last ; Bwadr, duplicate code. - (insert last ?\n) - (put-text-property (1- (point)) (point) 'articles alike)) - - ;; Find matches. - (while scores - (setq alist (car scores) - scores (cdr scores) - entries (assoc header alist)) - (while (cdr entries) ;First entry is the header index. - (let* ((rest (cdr entries)) - (kill (car rest)) - (match (nth 0 kill)) - (type (or (nth 3 kill) 's)) - (score (or (nth 1 kill) gnus-score-interactive-default-score)) - (date (nth 2 kill)) - (found nil) - (mt (aref (symbol-name type) 0)) - (case-fold-search - (not (or (= mt ?R) (= mt ?S) (= mt ?E) (= mt ?F)))) - (dmt (downcase mt)) - (search-func - (cond ((= dmt ?r) 're-search-forward) - ((or (= dmt ?e) (= dmt ?s) (= dmt ?f)) 'search-forward) - (t (error "Invalid match type: %s" type)))) - arts art) - (goto-char (point-min)) - (if (= dmt ?e) - (while (funcall search-func match nil t) - (and (= (progn (beginning-of-line) (point)) - (match-beginning 0)) - (= (progn (end-of-line) (point)) - (match-end 0)) - (progn - (setq found (setq arts (get-text-property - (point) 'articles))) - ;; Found a match, update scores. - (while arts - (setq art (car arts) - arts (cdr arts)) - (gnus-score-add-followups - (car art) score all-scores thread)))) - (end-of-line)) - (while (funcall search-func match nil t) - (end-of-line) - (setq found (setq arts (get-text-property (point) 'articles))) - ;; Found a match, update scores. - (while (setq art (pop arts)) - (when (setq new (gnus-score-add-followups - (car art) score all-scores thread)) - (push new news))))) - ;; Update expire date - (cond ((null date)) ;Permanent entry. - ((and found gnus-update-score-entry-dates) - ;Match, update date. - (gnus-score-set 'touched '(t) alist) - (setcar (nthcdr 2 kill) now)) - ((and expire (< date expire)) ;Old entry, remove. - (gnus-score-set 'touched '(t) alist) - (setcdr entries (cdr rest)) - (setq rest entries))) - (setq entries rest)))) - ;; We change the score file back to the previous one. - (save-excursion - (set-buffer gnus-summary-buffer) - (gnus-score-load-file current-score-file)) - (list (cons "references" news))))) - -(defun gnus-score-add-followups (header score scores &optional thread) - "Add a score entry to the adapt file." - (save-excursion - (set-buffer gnus-summary-buffer) - (let* ((id (mail-header-id header)) - (scores (car scores)) - entry dont) - ;; Don't enter a score if there already is one. - (while (setq entry (pop scores)) - (and (equal "references" (car entry)) - (or (null (nth 3 (cadr entry))) - (eq 's (nth 3 (cadr entry)))) - (assoc id entry) - (setq dont t))) - (unless dont - (gnus-summary-score-entry - (if thread "thread" "references") - id 's score (current-time-string) nil t))))) - -(defun gnus-score-string (score-list header now expire &optional trace) - ;; Score ARTICLES according to HEADER in SCORE-LIST. - ;; Update matching entries to NOW and remove unmatched entries older - ;; than EXPIRE. - - ;; Insert the unique article headers in the buffer. - (let ((gnus-score-index (nth 1 (assoc header gnus-header-index))) - ;; gnus-score-index is used as a free variable. - (simplify (and gnus-score-thread-simplify - (string= "subject" header))) - alike last this art entries alist articles - fuzzies arts words kill) - - ;; Sorting the articles costs os O(N*log N) but will allow us to - ;; only match with each unique header. Thus the actual matching - ;; will be O(M*U) where M is the number of strings to match with, - ;; and U is the number of unique headers. It is assumed (but - ;; untested) this will be a net win because of the large constant - ;; factor involved with string matching. - (setq gnus-scores-articles - ;; We cannot string-sort the extra headers list. *sigh* - (if (= gnus-score-index 9) - gnus-scores-articles - (sort gnus-scores-articles 'gnus-score-string<)) - articles gnus-scores-articles) - - (erase-buffer) - (while (setq art (pop articles)) - (setq this (aref (car art) gnus-score-index)) - - ;; If we're working with non-standard headers, we are stuck - ;; with working on them as a group. What a hassle. - ;; Just wait 'til you see what horrors we commit against `match'... - (if (= gnus-score-index 9) - (setq this (prin1-to-string this))) ; ick. - - (if simplify - (setq this (gnus-map-function gnus-simplify-subject-functions this))) - (if (equal last this) - ;; O(N*H) cons-cells used here, where H is the number of - ;; headers. - (push art alike) - (when last - ;; Insert the line, with a text property on the - ;; terminating newline referring to the articles with - ;; this line. - (insert last ?\n) - (put-text-property (1- (point)) (point) 'articles alike)) - (setq alike (list art) - last this))) - (when last ; Bwadr, duplicate code. - (insert last ?\n) - (put-text-property (1- (point)) (point) 'articles alike)) - - ;; Go through all the score alists and pick out the entries - ;; for this header. - (while score-list - (setq alist (pop score-list) - ;; There's only one instance of this header for - ;; each score alist. - entries (assoc header alist)) - (while (cdr entries) ;First entry is the header index. - (let* ((kill (cadr entries)) - (type (or (nth 3 kill) 's)) - (score (or (nth 1 kill) gnus-score-interactive-default-score)) - (date (nth 2 kill)) - (extra (nth 4 kill)) ; non-standard header; string. - (found nil) - (mt (aref (symbol-name type) 0)) - (case-fold-search (not (memq mt '(?R ?S ?E ?F)))) - (dmt (downcase mt)) - ;; Assume user already simplified regexp and fuzzies - (match (if (and simplify (not (memq dmt '(?f ?r)))) - (gnus-map-function - gnus-simplify-subject-functions - (nth 0 kill)) - (nth 0 kill))) - (search-func - (cond ((= dmt ?r) 're-search-forward) - ((or (= dmt ?e) (= dmt ?s) (= dmt ?f)) 'search-forward) - ((= dmt ?w) nil) - (t (error "Invalid match type: %s" type))))) - - ;; Evil hackery to make match usable in non-standard headers. - (when extra - (setq match (concat "[ (](" extra " \\. \"[^)]*" - match "[^\"]*\")[ )]") - search-func 're-search-forward)) ; XXX danger?!? - - (cond - ;; Fuzzy matches. We save these for later. - ((= dmt ?f) - (push (cons entries alist) fuzzies) - (setq entries (cdr entries))) - ;; Word matches. Save these for even later. - ((= dmt ?w) - (push (cons entries alist) words) - (setq entries (cdr entries))) - ;; Exact matches. - ((= dmt ?e) - ;; Do exact matching. - (goto-char (point-min)) - (while (and (not (eobp)) - (funcall search-func match nil t)) - ;; Is it really exact? - (and (eolp) - (= (gnus-point-at-bol) (match-beginning 0)) - ;; Yup. - (progn - (setq found (setq arts (get-text-property - (point) 'articles))) - ;; Found a match, update scores. - (if trace - (while (setq art (pop arts)) - (setcdr art (+ score (cdr art))) - (push - (cons - (car-safe (rassq alist gnus-score-cache)) - kill) - gnus-score-trace)) - (while (setq art (pop arts)) - (setcdr art (+ score (cdr art))))))) - (forward-line 1)) - ;; Update expiry date - (if trace - (setq entries (cdr entries)) - (cond - ;; Permanent entry. - ((null date) - (setq entries (cdr entries))) - ;; We have a match, so we update the date. - ((and found gnus-update-score-entry-dates) - (gnus-score-set 'touched '(t) alist) - (setcar (nthcdr 2 kill) now) - (setq entries (cdr entries))) - ;; This entry has expired, so we remove it. - ((and expire (< date expire)) - (gnus-score-set 'touched '(t) alist) - (setcdr entries (cddr entries))) - ;; No match; go to next entry. - (t - (setq entries (cdr entries)))))) - ;; Regexp and substring matching. - (t - (goto-char (point-min)) - (when (string= match "") - (setq match "\n")) - (while (and (not (eobp)) - (funcall search-func match nil t)) - (goto-char (match-beginning 0)) - (end-of-line) - (setq found (setq arts (get-text-property (point) 'articles))) - ;; Found a match, update scores. - (if trace - (while (setq art (pop arts)) - (setcdr art (+ score (cdr art))) - (push (cons (car-safe (rassq alist gnus-score-cache)) kill) - gnus-score-trace)) - (while (setq art (pop arts)) - (setcdr art (+ score (cdr art))))) - (forward-line 1)) - ;; Update expiry date - (if trace - (setq entries (cdr entries)) - (cond - ;; Permanent entry. - ((null date) - (setq entries (cdr entries))) - ;; We have a match, so we update the date. - ((and found gnus-update-score-entry-dates) - (gnus-score-set 'touched '(t) alist) - (setcar (nthcdr 2 kill) now) - (setq entries (cdr entries))) - ;; This entry has expired, so we remove it. - ((and expire (< date expire)) - (gnus-score-set 'touched '(t) alist) - (setcdr entries (cddr entries))) - ;; No match; go to next entry. - (t - (setq entries (cdr entries)))))))))) - - ;; Find fuzzy matches. - (when fuzzies - ;; Simplify the entire buffer for easy matching. - (gnus-simplify-buffer-fuzzy) - (while (setq kill (cadaar fuzzies)) - (let* ((match (nth 0 kill)) - (type (nth 3 kill)) - (score (or (nth 1 kill) gnus-score-interactive-default-score)) - (date (nth 2 kill)) - (mt (aref (symbol-name type) 0)) - (case-fold-search (not (= mt ?F))) - found) - (goto-char (point-min)) - (while (and (not (eobp)) - (search-forward match nil t)) - (when (and (= (gnus-point-at-bol) (match-beginning 0)) - (eolp)) - (setq found (setq arts (get-text-property (point) 'articles))) - (if trace - (while (setq art (pop arts)) - (setcdr art (+ score (cdr art))) - (push (cons - (car-safe (rassq (cdar fuzzies) gnus-score-cache)) - kill) - gnus-score-trace)) - ;; Found a match, update scores. - (while (setq art (pop arts)) - (setcdr art (+ score (cdr art)))))) - (forward-line 1)) - ;; Update expiry date - (if (not trace) - (cond - ;; Permanent. - ((null date) - ;; Do nothing. - ) - ;; Match, update date. - ((and found gnus-update-score-entry-dates) - (gnus-score-set 'touched '(t) (cdar fuzzies)) - (setcar (nthcdr 2 kill) now)) - ;; Old entry, remove. - ((and expire (< date expire)) - (gnus-score-set 'touched '(t) (cdar fuzzies)) - (setcdr (caar fuzzies) (cddaar fuzzies))))) - (setq fuzzies (cdr fuzzies))))) - - (when words - ;; Enter all words into the hashtb. - (let ((hashtb (gnus-make-hashtable - (* 10 (count-lines (point-min) (point-max)))))) - (gnus-enter-score-words-into-hashtb hashtb) - (while (setq kill (cadaar words)) - (let* ((score (or (nth 1 kill) gnus-score-interactive-default-score)) - (date (nth 2 kill)) - found) - (when (setq arts (intern-soft (nth 0 kill) hashtb)) - (setq arts (symbol-value arts)) - (setq found t) - (if trace - (while (setq art (pop arts)) - (setcdr art (+ score (cdr art))) - (push (cons - (car-safe (rassq (cdar words) gnus-score-cache)) - kill) - gnus-score-trace)) - ;; Found a match, update scores. - (while (setq art (pop arts)) - (setcdr art (+ score (cdr art)))))) - ;; Update expiry date - (if (not trace) - (cond - ;; Permanent. - ((null date) - ;; Do nothing. - ) - ;; Match, update date. - ((and found gnus-update-score-entry-dates) - (gnus-score-set 'touched '(t) (cdar words)) - (setcar (nthcdr 2 kill) now)) - ;; Old entry, remove. - ((and expire (< date expire)) - (gnus-score-set 'touched '(t) (cdar words)) - (setcdr (caar words) (cddaar words))))) - (setq words (cdr words)))))) - nil)) - -(defun gnus-enter-score-words-into-hashtb (hashtb) - ;; Find all the words in the buffer and enter them into - ;; the hashtable. - (let ((syntab (syntax-table)) - word val) - (goto-char (point-min)) - (unwind-protect - (progn - (set-syntax-table gnus-adaptive-word-syntax-table) - (while (re-search-forward "\\b\\w+\\b" nil t) - (setq val - (gnus-gethash - (setq word (downcase (buffer-substring - (match-beginning 0) (match-end 0)))) - hashtb)) - (gnus-sethash - word - (append (get-text-property (gnus-point-at-eol) 'articles) val) - hashtb))) - (set-syntax-table syntab)) - ;; Make all the ignorable words ignored. - (let ((ignored (append gnus-ignored-adaptive-words - (if gnus-adaptive-word-no-group-words - (message-tokenize-header - (gnus-group-real-name gnus-newsgroup-name) - ".")) - gnus-default-ignored-adaptive-words))) - (while ignored - (gnus-sethash (pop ignored) nil hashtb))))) - -(defun gnus-score-string< (a1 a2) - ;; Compare headers in articles A2 and A2. - ;; The header index used is the free variable `gnus-score-index'. - (string-lessp (aref (car a1) gnus-score-index) - (aref (car a2) gnus-score-index))) - -(defun gnus-current-score-file-nondirectory (&optional score-file) - (let ((score-file (or score-file gnus-current-score-file))) - (if score-file - (gnus-short-group-name (file-name-nondirectory score-file)) - "none"))) - -(defun gnus-score-adaptive () - "Create adaptive score rules for this newsgroup." - (when gnus-newsgroup-adaptive - ;; We change the score file to the adaptive score file. - (save-excursion - (set-buffer gnus-summary-buffer) - (gnus-score-load-file - (or gnus-newsgroup-adaptive-score-file - (gnus-home-score-file gnus-newsgroup-name t) - (gnus-score-file-name - gnus-newsgroup-name gnus-adaptive-file-suffix)))) - ;; Perform ordinary line scoring. - (when (or (not (listp gnus-newsgroup-adaptive)) - (memq 'line gnus-newsgroup-adaptive)) - (save-excursion - (let* ((malist (gnus-copy-sequence gnus-adaptive-score-alist)) - (alist malist) - (date (current-time-string)) - (data gnus-newsgroup-data) - elem headers match func) - ;; First we transform the adaptive rule alist into something - ;; that's faster to process. - (while malist - (setq elem (car malist)) - (when (symbolp (car elem)) - (setcar elem (symbol-value (car elem)))) - (setq elem (cdr elem)) - (while elem - (when (fboundp - (setq func - (intern - (concat "mail-header-" - (if (eq (caar elem) 'followup) - "message-id" - (downcase (symbol-name (caar elem)))))))) - (setcdr (car elem) - (cons (if (eq (caar elem) 'followup) - "references" - (symbol-name (caar elem))) - (cdar elem))) - (setcar (car elem) - `(lambda (h) - (,func h)))) - (setq elem (cdr elem))) - (setq malist (cdr malist))) - ;; Then we score away. - (while data - (setq elem (cdr (assq (gnus-data-mark (car data)) alist))) - (if (or (not elem) - (gnus-data-pseudo-p (car data))) - () - (when (setq headers (gnus-data-header (car data))) - (while elem - (setq match (funcall (caar elem) headers)) - (gnus-summary-score-entry - (nth 1 (car elem)) match - (cond - ((numberp match) - '=) - ((equal (nth 1 (car elem)) "date") - 'a) - (t - ;; Whether we use substring or exact matches is - ;; controlled here. - (if (or (not gnus-score-exact-adapt-limit) - (< (length match) gnus-score-exact-adapt-limit)) - 'e - (if (equal (nth 1 (car elem)) "subject") - 'f 's)))) - (nth 2 (car elem)) date nil t) - (setq elem (cdr elem))))) - (setq data (cdr data)))))) - - ;; Perform adaptive word scoring. - (when (and (listp gnus-newsgroup-adaptive) - (memq 'word gnus-newsgroup-adaptive)) - (with-temp-buffer - (let* ((hashtb (gnus-make-hashtable 1000)) - (date (date-to-day (current-time-string))) - (data gnus-newsgroup-data) - (syntab (syntax-table)) - word d score val) - (unwind-protect - (progn - (set-syntax-table gnus-adaptive-word-syntax-table) - ;; Go through all articles. - (while (setq d (pop data)) - (when (and - (not (gnus-data-pseudo-p d)) - (setq score - (cdr (assq - (gnus-data-mark d) - gnus-adaptive-word-score-alist)))) - ;; This article has a mark that should lead to - ;; adaptive word rules, so we insert the subject - ;; and find all words in that string. - (insert (mail-header-subject (gnus-data-header d))) - (downcase-region (point-min) (point-max)) - (goto-char (point-min)) - (while (re-search-forward "\\b\\w+\\b" nil t) - ;; Put the word and score into the hashtb. - (setq val (gnus-gethash (setq word (match-string 0)) - hashtb)) - (when (or (not gnus-adaptive-word-length-limit) - (> (length word) - gnus-adaptive-word-length-limit)) - (setq val (+ score (or val 0))) - (if (and gnus-adaptive-word-minimum - (< val gnus-adaptive-word-minimum)) - (setq val gnus-adaptive-word-minimum)) - (gnus-sethash word val hashtb))) - (erase-buffer)))) - (set-syntax-table syntab)) - ;; Make all the ignorable words ignored. - (let ((ignored (append gnus-ignored-adaptive-words - (if gnus-adaptive-word-no-group-words - (message-tokenize-header - (gnus-group-real-name - gnus-newsgroup-name) - ".")) - gnus-default-ignored-adaptive-words))) - (while ignored - (gnus-sethash (pop ignored) nil hashtb))) - ;; Now we have all the words and scores, so we - ;; add these rules to the ADAPT file. - (set-buffer gnus-summary-buffer) - (mapatoms - (lambda (word) - (when (symbol-value word) - (gnus-summary-score-entry - "subject" (symbol-name word) 'w (symbol-value word) - date nil t))) - hashtb)))))) - -(defun gnus-score-edit-done () - (let ((bufnam (buffer-file-name (current-buffer))) - (winconf gnus-prev-winconf)) - (when winconf - (set-window-configuration winconf)) - (gnus-score-remove-from-cache bufnam) - (gnus-score-load-file bufnam))) - -(defun gnus-score-find-trace () - "Find all score rules that applies to the current article." - (interactive) - (let ((old-scored gnus-newsgroup-scored)) - (let ((gnus-newsgroup-headers - (list (gnus-summary-article-header))) - (gnus-newsgroup-scored nil) - trace) - (save-excursion - (nnheader-set-temp-buffer "*Score Trace*")) - (setq gnus-score-trace nil) - (gnus-possibly-score-headers 'trace) - (if (not (setq trace gnus-score-trace)) - (gnus-error - 1 "No score rules apply to the current article (default score %d)." - gnus-summary-default-score) - (set-buffer "*Score Trace*") - (setq truncate-lines t) - (while trace - (insert (format "%S -> %s\n" (cdar trace) - (or (caar trace) "(non-file rule)"))) - (setq trace (cdr trace))) - (goto-char (point-min)) - (gnus-configure-windows 'score-trace))) - (set-buffer gnus-summary-buffer) - (setq gnus-newsgroup-scored old-scored))) - -(defun gnus-score-find-favourite-words () - "List words used in scoring." - (interactive) - (let ((alists (gnus-score-load-files (gnus-all-score-files))) - alist rule rules kill) - ;; Go through all the score alists for this group - ;; and find all `w' rules. - (while (setq alist (pop alists)) - (while (setq rule (pop alist)) - (when (and (stringp (car rule)) - (equal "subject" (downcase (pop rule)))) - (while (setq kill (pop rule)) - (when (memq (nth 3 kill) '(w W word Word)) - (push (cons (or (nth 1 kill) - gnus-score-interactive-default-score) - (car kill)) - rules)))))) - (setq rules (sort rules (lambda (r1 r2) - (string-lessp (cdr r1) (cdr r2))))) - ;; Add up words that have appeared several times. - (let ((r rules)) - (while (cdr r) - (if (equal (cdar r) (cdadr r)) - (progn - (setcar (car r) (+ (caar r) (caadr r))) - (setcdr r (cddr r))) - (pop r)))) - ;; Insert the words. - (nnheader-set-temp-buffer "*Score Words*") - (if (not (setq rules (sort rules (lambda (r1 r2) (> (car r1) (car r2)))))) - (gnus-error 3 "No word score rules") - (while rules - (insert (format "%-5d: %s\n" (caar rules) (cdar rules))) - (pop rules)) - (goto-char (point-min)) - (gnus-configure-windows 'score-words)))) - -(defun gnus-summary-rescore () - "Redo the entire scoring process in the current summary." - (interactive) - (gnus-score-save) - (setq gnus-score-cache nil) - (setq gnus-newsgroup-scored nil) - (gnus-possibly-score-headers) - (gnus-score-update-all-lines)) - -(defun gnus-score-flush-cache () - "Flush the cache of score files." - (interactive) - (gnus-score-save) - (setq gnus-score-cache nil - gnus-score-alist nil - gnus-short-name-score-file-cache nil) - (gnus-message 6 "The score cache is now flushed")) - -(gnus-add-shutdown 'gnus-score-close 'gnus) - -(defvar gnus-score-file-alist-cache nil) - -(defun gnus-score-close () - "Clear all internal score variables." - (setq gnus-score-cache nil - gnus-internal-global-score-files nil - gnus-score-file-list nil - gnus-score-file-alist-cache nil)) - -;; Summary score marking commands. - -(defun gnus-summary-raise-same-subject-and-select (score) - "Raise articles which has the same subject with SCORE and select the next." - (interactive "p") - (let ((subject (gnus-summary-article-subject))) - (gnus-summary-raise-score score) - (while (gnus-summary-find-subject subject) - (gnus-summary-raise-score score)) - (gnus-summary-next-article t))) - -(defun gnus-summary-raise-same-subject (score) - "Raise articles which has the same subject with SCORE." - (interactive "p") - (let ((subject (gnus-summary-article-subject))) - (gnus-summary-raise-score score) - (while (gnus-summary-find-subject subject) - (gnus-summary-raise-score score)) - (gnus-summary-next-subject 1 t))) - -(defun gnus-score-delta-default (level) - (if level (prefix-numeric-value level) - gnus-score-interactive-default-score)) - -(defun gnus-summary-raise-thread (&optional score) - "Raise the score of the articles in the current thread with SCORE." - (interactive "P") - (setq score (gnus-score-delta-default score)) - (let (e) - (save-excursion - (let ((articles (gnus-summary-articles-in-thread))) - (while articles - (gnus-summary-goto-subject (car articles)) - (gnus-summary-raise-score score) - (setq articles (cdr articles)))) - (setq e (point))) - (let ((gnus-summary-check-current t)) - (unless (zerop (gnus-summary-next-subject 1 t)) - (goto-char e)))) - (gnus-summary-recenter) - (gnus-summary-position-point) - (gnus-set-mode-line 'summary)) - -(defun gnus-summary-lower-same-subject-and-select (score) - "Raise articles which has the same subject with SCORE and select the next." - (interactive "p") - (gnus-summary-raise-same-subject-and-select (- score))) - -(defun gnus-summary-lower-same-subject (score) - "Raise articles which has the same subject with SCORE." - (interactive "p") - (gnus-summary-raise-same-subject (- score))) - -(defun gnus-summary-lower-thread (&optional score) - "Lower score of articles in the current thread with SCORE." - (interactive "P") - (gnus-summary-raise-thread (- (gnus-score-delta-default score)))) - -;;; Finding score files. - -(defun gnus-score-score-files (group) - "Return a list of all possible score files." - ;; Search and set any global score files. - (when gnus-global-score-files - (unless gnus-internal-global-score-files - (gnus-score-search-global-directories gnus-global-score-files))) - ;; Fix the kill-file dir variable. - (setq gnus-kill-files-directory - (file-name-as-directory gnus-kill-files-directory)) - ;; If we can't read it, there are no score files. - (if (not (file-exists-p (expand-file-name gnus-kill-files-directory))) - (setq gnus-score-file-list nil) - (if (not (gnus-use-long-file-name 'not-score)) - ;; We do not use long file names, so we have to do some - ;; directory traversing. - (setq gnus-score-file-list - (cons nil - (or gnus-short-name-score-file-cache - (prog2 - (gnus-message 6 "Finding all score files...") - (setq gnus-short-name-score-file-cache - (gnus-score-score-files-1 - gnus-kill-files-directory)) - (gnus-message 6 "Finding all score files...done"))))) - ;; We want long file names. - (when (or (not gnus-score-file-list) - (not (car gnus-score-file-list)) - (gnus-file-newer-than gnus-kill-files-directory - (car gnus-score-file-list))) - (setq gnus-score-file-list - (cons (nth 5 (file-attributes gnus-kill-files-directory)) - (nreverse - (directory-files - gnus-kill-files-directory t - (gnus-score-file-regexp))))))) - (cdr gnus-score-file-list))) - -(defun gnus-score-score-files-1 (dir) - "Return all possible score files under DIR." - (let ((files (list (expand-file-name dir))) - (regexp (gnus-score-file-regexp)) - (case-fold-search nil) - seen out file) - (while (setq file (pop files)) - (cond - ;; Ignore files that start with a dot. - ((string-match "^\\." (file-name-nondirectory file)) - nil) - ;; Add subtrees of directory to also be searched. - ((and (file-directory-p file) - (not (member (file-truename file) seen))) - (push (file-truename file) seen) - (setq files (nconc (directory-files file t nil t) files))) - ;; Add files to the list of score files. - ((string-match regexp file) - (push file out)))) - (or out - ;; Return a dummy value. - (list (expand-file-name "this.file.does.not.exist.SCORE" - gnus-kill-files-directory))))) - -(defun gnus-score-file-regexp () - "Return a regexp that match all score files." - (concat "\\(" (regexp-quote gnus-score-file-suffix ) - "\\|" (regexp-quote gnus-adaptive-file-suffix) "\\)\\'")) - -(defun gnus-score-find-bnews (group) - "Return a list of score files for GROUP. -The score files are those files in the ~/News/ directory which matches -GROUP using BNews sys file syntax." - (let* ((sfiles (append (gnus-score-score-files group) - gnus-internal-global-score-files)) - (kill-dir (file-name-as-directory - (expand-file-name gnus-kill-files-directory))) - (klen (length kill-dir)) - (score-regexp (gnus-score-file-regexp)) - (trans (cdr (assq ?: nnheader-file-name-translation-alist))) - (group-trans (nnheader-translate-file-chars group t)) - ofiles not-match regexp) - (save-excursion - (set-buffer (gnus-get-buffer-create "*gnus score files*")) - (buffer-disable-undo) - ;; Go through all score file names and create regexp with them - ;; as the source. - (while sfiles - (erase-buffer) - (insert (car sfiles)) - (goto-char (point-min)) - ;; First remove the suffix itself. - (when (re-search-forward (concat "." score-regexp) nil t) - (replace-match "" t t) - (goto-char (point-min)) - (if (looking-at (regexp-quote kill-dir)) - ;; If the file name was just "SCORE", `klen' is one character - ;; too much. - (delete-char (min (1- (point-max)) klen)) - (goto-char (point-max)) - (if (search-backward (string directory-sep-char) nil t) - (delete-region (1+ (point)) (point-min)) - (gnus-message 1 "Can't find directory separator in %s" - (car sfiles)))) - ;; If short file names were used, we have to translate slashes. - (goto-char (point-min)) - (let ((regexp (concat - "[/:" (if trans (char-to-string trans)) "]"))) - (while (re-search-forward regexp nil t) - (replace-match "." t t))) - ;; Kludge to get rid of "nntp+" problems. - (goto-char (point-min)) - (when (looking-at "nn[a-z]+\\+") - (search-forward "+") - (forward-char -1) - (insert "\\") - (forward-char 1)) - ;; Kludge to deal with "++". - (while (search-forward "+" nil t) - (replace-match "\\+" t t)) - ;; Translate "all" to ".*". - (goto-char (point-min)) - (while (search-forward "all" nil t) - (replace-match ".*" t t)) - (goto-char (point-min)) - ;; Deal with "not."s. - (if (looking-at "not.") - (progn - (setq not-match t) - (setq regexp - (concat "^" (buffer-substring 5 (point-max)) "$"))) - (setq regexp (concat "^" (buffer-substring 1 (point-max)) "$")) - (setq not-match nil)) - ;; Finally - if this resulting regexp matches the group name, - ;; we add this score file to the list of score files - ;; applicable to this group. - (when (or (and not-match - (ignore-errors - (not (string-match regexp group-trans)))) - (and (not not-match) - (ignore-errors (string-match regexp group-trans)))) - (push (car sfiles) ofiles))) - (setq sfiles (cdr sfiles))) - (kill-buffer (current-buffer)) - ;; Slight kludge here - the last score file returned should be - ;; the local score file, whether it exists or not. This is so - ;; that any score commands the user enters will go to the right - ;; file, and not end up in some global score file. - (let ((localscore (gnus-score-file-name group))) - (setq ofiles (cons localscore (delete localscore ofiles)))) - (gnus-sort-score-files (nreverse ofiles))))) - -(defun gnus-score-find-single (group) - "Return list containing the score file for GROUP." - (list (or gnus-newsgroup-adaptive-score-file - (gnus-score-file-name group gnus-adaptive-file-suffix)) - (gnus-score-file-name group))) - -(defun gnus-score-find-hierarchical (group) - "Return list of score files for GROUP. -This includes the score file for the group and all its parents." - (let* ((prefix (gnus-group-real-prefix group)) - (all (list nil)) - (group (gnus-group-real-name group)) - (start 0)) - (while (string-match "\\." group (1+ start)) - (setq start (match-beginning 0)) - (push (substring group 0 start) all)) - (push group all) - (setq all - (nconc - (mapcar (lambda (group) - (gnus-score-file-name group gnus-adaptive-file-suffix)) - (setq all (nreverse all))) - (mapcar 'gnus-score-file-name all))) - (if (equal prefix "") - all - (mapcar - (lambda (file) - (nnheader-translate-file-chars - (concat (file-name-directory file) prefix - (file-name-nondirectory file)))) - all)))) - -(defun gnus-score-file-rank (file) - "Return a number that says how specific score FILE is. -Destroys the current buffer." - (if (member file gnus-internal-global-score-files) - 0 - (when (string-match - (concat "^" (regexp-quote - (expand-file-name - (file-name-as-directory gnus-kill-files-directory)))) - file) - (setq file (substring file (match-end 0)))) - (insert file) - (goto-char (point-min)) - (let ((beg (point)) - elems) - (while (re-search-forward "[./]" nil t) - (push (buffer-substring beg (1- (point))) - elems)) - (erase-buffer) - (setq elems (delete "all" elems)) - (length elems)))) - -(defun gnus-sort-score-files (files) - "Sort FILES so that the most general files come first." - (with-temp-buffer - (let ((alist - (mapcar - (lambda (file) - (cons (inline (gnus-score-file-rank file)) file)) - files))) - (mapcar - (lambda (f) (cdr f)) - (sort alist 'car-less-than-car))))) - -(defun gnus-score-find-alist (group) - "Return list of score files for GROUP. -The list is determined from the variable gnus-score-file-alist." - (let ((alist gnus-score-file-multiple-match-alist) - score-files) - ;; if this group has been seen before, return the cached entry - (if (setq score-files (assoc group gnus-score-file-alist-cache)) - (cdr score-files) ;ensures caching groups with no matches - ;; handle the multiple match alist - (while alist - (when (string-match (caar alist) group) - (setq score-files - (nconc score-files (copy-sequence (cdar alist))))) - (setq alist (cdr alist))) - (setq alist gnus-score-file-single-match-alist) - ;; handle the single match alist - (while alist - (when (string-match (caar alist) group) - ;; progn used just in case ("regexp") has no files - ;; and score-files is still nil. -sj - ;; this can be construed as a "stop searching here" feature :> - ;; and used to simplify regexps in the single-alist - (setq score-files - (nconc score-files (copy-sequence (cdar alist)))) - (setq alist nil)) - (setq alist (cdr alist))) - ;; cache the score files - (push (cons group score-files) gnus-score-file-alist-cache) - score-files))) - -(defun gnus-all-score-files (&optional group) - "Return a list of all score files for the current group." - (let ((funcs gnus-score-find-score-files-function) - (group (or group gnus-newsgroup-name)) - score-files) - (when group - ;; Make sure funcs is a list. - (and funcs - (not (listp funcs)) - (setq funcs (list funcs))) - (when gnus-score-use-all-scores - ;; Get the initial score files for this group. - (when funcs - (setq score-files (nreverse (gnus-score-find-alist group)))) - ;; Add any home adapt files. - (let ((home (gnus-home-score-file group t))) - (when home - (push home score-files) - (setq gnus-newsgroup-adaptive-score-file home))) - ;; Check whether there is a `adapt-file' group parameter. - (let ((param-file (gnus-group-find-parameter group 'adapt-file))) - (when param-file - (push param-file score-files) - (setq gnus-newsgroup-adaptive-score-file param-file)))) - ;; Go through all the functions for finding score files (or actual - ;; scores) and add them to a list. - (while funcs - (when (gnus-functionp (car funcs)) - (setq score-files - (append score-files - (nreverse (funcall (car funcs) group))))) - (setq funcs (cdr funcs))) - (when gnus-score-use-all-scores - ;; Add any home score files. - (let ((home (gnus-home-score-file group))) - (when home - (push home score-files))) - ;; Check whether there is a `score-file' group parameter. - (let ((param-file (gnus-group-find-parameter group 'score-file))) - (when param-file - (push param-file score-files)))) - ;; Expand all files names. - (let ((files score-files)) - (while files - (when (stringp (car files)) - (setcar files (expand-file-name - (car files) gnus-kill-files-directory))) - (pop files))) - (setq score-files (nreverse score-files)) - ;; Remove any duplicate score files. - (while (and score-files - (member (car score-files) (cdr score-files))) - (pop score-files)) - (let ((files score-files)) - (while (cdr files) - (if (member (cadr files) (cddr files)) - (setcdr files (cddr files)) - (pop files)))) - ;; Do the scoring if there are any score files for this group. - score-files))) - -(defun gnus-possibly-score-headers (&optional trace) - "Do scoring if scoring is required." - (let ((score-files (gnus-all-score-files))) - (when score-files - (gnus-score-headers score-files trace)))) - -(defun gnus-score-file-name (newsgroup &optional suffix) - "Return the name of a score file for NEWSGROUP." - (let ((suffix (or suffix gnus-score-file-suffix))) - (nnheader-translate-file-chars - (cond - ((or (null newsgroup) - (string-equal newsgroup "")) - ;; The global score file is placed at top of the directory. - (expand-file-name suffix gnus-kill-files-directory)) - ((gnus-use-long-file-name 'not-score) - ;; Append ".SCORE" to newsgroup name. - (expand-file-name (concat (gnus-newsgroup-savable-name newsgroup) - "." suffix) - gnus-kill-files-directory)) - (t - ;; Place "SCORE" under the hierarchical directory. - (expand-file-name (concat (gnus-newsgroup-directory-form newsgroup) - "/" suffix) - gnus-kill-files-directory)))))) - -(defun gnus-score-search-global-directories (files) - "Scan all global score directories for score files." - ;; Set the variable `gnus-internal-global-score-files' to all - ;; available global score files. - (interactive (list gnus-global-score-files)) - (let (out) - (while files - ;; #### /$ Unix-specific? - (if (file-directory-p (car files)) - (setq out (nconc (directory-files - (car files) t - (concat (gnus-score-file-regexp) "$")))) - (push (car files) out)) - (setq files (cdr files))) - (setq gnus-internal-global-score-files out))) - -(defun gnus-score-default-fold-toggle () - "Toggle folding for new score file entries." - (interactive) - (setq gnus-score-default-fold (not gnus-score-default-fold)) - (if gnus-score-default-fold - (gnus-message 1 "New score file entries will be case insensitive.") - (gnus-message 1 "New score file entries will be case sensitive."))) - -;;; Home score file. - -(defun gnus-home-score-file (group &optional adapt) - "Return the home score file for GROUP. -If ADAPT, return the home adaptive file instead." - (let ((list (if adapt gnus-home-adapt-file gnus-home-score-file)) - elem found) - ;; Make sure we have a list. - (unless (listp list) - (setq list (list list))) - ;; Go through the list and look for matches. - (while (and (not found) - (setq elem (pop list))) - (setq found - (cond - ;; Simple string. - ((stringp elem) - elem) - ;; Function. - ((gnus-functionp elem) - (funcall elem group)) - ;; Regexp-file cons. - ((consp elem) - (when (string-match (gnus-globalify-regexp (car elem)) group) - (replace-match (cadr elem) t nil group)))))) - (when found - (setq found (nnheader-translate-file-chars found)) - (if (file-name-absolute-p found) - found - (nnheader-concat gnus-kill-files-directory found))))) - -(defun gnus-hierarchial-home-score-file (group) - "Return the score file of the top-level hierarchy of GROUP." - (if (string-match "^[^.]+\\." group) - (concat (match-string 0 group) gnus-score-file-suffix) - ;; Group name without any dots. - (concat group (if (gnus-use-long-file-name 'not-score) "." "/") - gnus-score-file-suffix))) - -(defun gnus-hierarchial-home-adapt-file (group) - "Return the adapt file of the top-level hierarchy of GROUP." - (if (string-match "^[^.]+\\." group) - (concat (match-string 0 group) gnus-adaptive-file-suffix) - ;; Group name without any dots. - (concat group (if (gnus-use-long-file-name 'not-score) "." "/") - gnus-adaptive-file-suffix))) - -(defun gnus-current-home-score-file (group) - "Return the \"current\" regular score file." - (car (nreverse (gnus-score-find-alist group)))) - -;;; -;;; Score decays -;;; - -(defun gnus-decay-score (score) - "Decay SCORE according to `gnus-score-decay-constant' and `gnus-score-decay-scale'." - (floor - (- score - (* (if (< score 0) -1 1) - (min (abs score) - (max gnus-score-decay-constant - (* (abs score) - gnus-score-decay-scale))))))) - -(defun gnus-decay-scores (alist day) - "Decay non-permanent scores in ALIST." - (let ((times (- (time-to-days (current-time)) day)) - kill entry updated score n) - (unless (zerop times) ;Done decays today already? - (while (setq entry (pop alist)) - (when (stringp (car entry)) - (setq entry (cdr entry)) - (while (setq kill (pop entry)) - (when (nth 2 kill) - (setq updated t) - (setq score (or (nth 1 kill) - gnus-score-interactive-default-score) - n times) - (while (natnump (decf n)) - (setq score (funcall gnus-decay-score-function score))) - (setcdr kill (cons score - (cdr (cdr kill))))))))) - ;; Return whether this score file needs to be saved. By Je-haysuss! - updated)) - -(defun gnus-score-regexp-bad-p (regexp) - "Test whether REGEXP is safe for Gnus scoring. -A regexp is unsafe if it matches newline or a buffer boundary. - -If the regexp is good, return nil. If the regexp is bad, return a -cons cell (SYM . STRING), where the symbol SYM is `new' or `bad'. -In the `new' case, the string is a safe replacement for REGEXP. -In the `bad' case, the string is a unsafe subexpression of REGEXP, -and we do not have a simple replacement to suggest. - -See `(Gnus)Scoring Tips' for examples of good regular expressions." - (let (case-fold-search) - (and - ;; First, try a relatively fast necessary condition. - ;; Notice ranges (like [^:] or [\t-\r]), \s>, \Sw, \W, \', \`: - (string-match "\n\\|\\\\[SsW`']\\|\\[\\^\\|[\0-\n]-" regexp) - ;; Now break the regexp into tokens, and check each: - (let ((tail regexp) ; remaining regexp to check - tok ; current token - bad ; nil, or bad subexpression - new ; nil, or replacement regexp so far - end) ; length of current token - (while (and (not bad) - (string-match - "\\`\\(\\\\[sS]?.\\|\\[\\^?]?[^]]*]\\|[^\\]\\)" - tail)) - (setq end (match-end 0) - tok (substring tail 0 end) - tail (substring tail end)) - (if;; Is token `bad' (matching newline or buffer ends)? - (or (member tok '("\n" "\\W" "\\`" "\\'")) - ;; This next handles "[...]", "\\s.", and "\\S.": - (and (> end 2) (string-match tok "\n"))) - (let ((newtok - ;; Try to suggest a replacement for tok ... - (cond ((string-equal tok "\\`") "^") ; or "\\(^\\)" - ((string-equal tok "\\'") "$") ; or "\\($\\)" - ((string-match "\\[\\^" tok) ; very common - (concat (substring tok 0 -1) "\n]"))))) - (if newtok - (setq new - (concat - (or new - ;; good prefix so far: - (substring regexp 0 (- (+ (length tail) end)))) - newtok)) - ;; No replacement idea, so give up: - (setq bad tok))) - ;; tok is good, may need to extend new - (and new (setq new (concat new tok))))) - ;; Now return a value: - (cond - (bad (cons 'bad bad)) - (new (cons 'new new)) - (t nil)))))) - -(provide 'gnus-score) - -;;; gnus-score.el ends here diff --git a/lisp/gnus-setup.el b/lisp/gnus-setup.el deleted file mode 100644 index 4f7634d..0000000 --- a/lisp/gnus-setup.el +++ /dev/null @@ -1,194 +0,0 @@ -;;; gnus-setup.el --- Initialization & Setup for Gnus 5 - -;; Copyright (C) 1995, 1996, 2000 Free Software Foundation, Inc. - -;; Author: Steven L. Baur -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: -;; My head is starting to spin with all the different mail/news packages. -;; Stop The Madness! - -;; Given that Emacs Lisp byte codes may be diverging, it is probably best -;; not to byte compile this, and just arrange to have the .el loaded out -;; of .emacs. - -;;; Code: - -(eval-when-compile (require 'cl)) - -(defvar gnus-use-installed-gnus t - "*If non-nil use installed version of Gnus.") - -(defvar gnus-use-installed-mailcrypt (featurep 'xemacs) - "*If non-nil use installed version of mailcrypt.") - -(defvar gnus-emacs-lisp-directory (if (featurep 'xemacs) - "/usr/local/lib/xemacs/" - "/usr/local/share/emacs/") - "Directory where Emacs site lisp is located.") - -(defvar gnus-gnus-lisp-directory (concat gnus-emacs-lisp-directory - "gnus/lisp/") - "Directory where Gnus Emacs lisp is found.") - -(defvar gnus-mailcrypt-lisp-directory (concat gnus-emacs-lisp-directory - "site-lisp/mailcrypt/") - "Directory where Mailcrypt Emacs Lisp is found.") - -(defvar gnus-bbdb-lisp-directory (concat gnus-emacs-lisp-directory - "site-lisp/bbdb/") - "Directory where Big Brother Database is found.") - -(defvar gnus-use-mhe nil - "Set this if you want to use MH-E for mail reading.") -(defvar gnus-use-rmail nil - "Set this if you want to use RMAIL for mail reading.") -(defvar gnus-use-sendmail t - "Set this if you want to use SENDMAIL for mail reading.") -(defvar gnus-use-vm nil - "Set this if you want to use the VM package for mail reading.") -(defvar gnus-use-sc nil - "Set this if you want to use Supercite.") -(defvar gnus-use-mailcrypt t - "Set this if you want to use Mailcrypt for dealing with PGP messages.") -(defvar gnus-use-bbdb nil - "Set this if you want to use the Big Brother DataBase.") - -(when (and (not gnus-use-installed-gnus) - (null (member gnus-gnus-lisp-directory load-path))) - (push gnus-gnus-lisp-directory load-path)) - -;;; We can't do this until we know where Gnus is. -(require 'message) - -;;; Mailcrypt by -;;; Jin Choi -;;; Patrick LoPresti - -(when gnus-use-mailcrypt - (when (and (not gnus-use-installed-mailcrypt) - (null (member gnus-mailcrypt-lisp-directory load-path))) - (setq load-path (cons gnus-mailcrypt-lisp-directory load-path))) - (autoload 'mc-install-write-mode "mailcrypt" nil t) - (autoload 'mc-install-read-mode "mailcrypt" nil t) -;;; (add-hook 'message-mode-hook 'mc-install-write-mode) -;;; (add-hook 'gnus-summary-mode-hook 'mc-install-read-mode) - (when gnus-use-mhe - (add-hook 'mh-folder-mode-hook 'mc-install-read-mode) - (add-hook 'mh-letter-mode-hook 'mc-install-write-mode))) - -;;; BBDB by -;;; Jamie Zawinski - -(when gnus-use-bbdb - ;; bbdb will never be installed with emacs. - (when (null (member gnus-bbdb-lisp-directory load-path)) - (setq load-path (cons gnus-bbdb-lisp-directory load-path))) - (autoload 'bbdb "bbdb-com" - "Insidious Big Brother Database" t) - (autoload 'bbdb-name "bbdb-com" - "Insidious Big Brother Database" t) - (autoload 'bbdb-company "bbdb-com" - "Insidious Big Brother Database" t) - (autoload 'bbdb-net "bbdb-com" - "Insidious Big Brother Database" t) - (autoload 'bbdb-notes "bbdb-com" - "Insidious Big Brother Database" t) - - (when gnus-use-vm - (autoload 'bbdb-insinuate-vm "bbdb-vm" - "Hook BBDB into VM" t)) - - (when gnus-use-rmail - (autoload 'bbdb-insinuate-rmail "bbdb-rmail" - "Hook BBDB into RMAIL" t) - (add-hook 'rmail-mode-hook 'bbdb-insinuate-rmail)) - - (when gnus-use-mhe - (autoload 'bbdb-insinuate-mh "bbdb-mh" - "Hook BBDB into MH-E" t) - (add-hook 'mh-folder-mode-hook 'bbdb-insinuate-mh)) - - (autoload 'bbdb-insinuate-gnus "bbdb-gnus" - "Hook BBDB into Gnus" t) - (add-hook 'gnus-startup-hook 'bbdb-insinuate-gnus) - - (when gnus-use-sendmail - (autoload 'bbdb-insinuate-sendmail "bbdb" - "Insidious Big Brother Database" t) - (add-hook 'mail-setup-hook 'bbdb-insinuate-sendmail) - (add-hook 'message-setup-hook 'bbdb-insinuate-sendmail))) - -(when gnus-use-sc - (add-hook 'mail-citation-hook 'sc-cite-original) - (setq message-cite-function 'sc-cite-original) - (autoload 'sc-cite-original "supercite")) - -;;;### (autoloads (gnus gnus-slave gnus-no-server) "gnus" "lisp/gnus.el" (12473 2137)) -;;; Generated autoloads from lisp/gnus.el - -;; Don't redo this if autoloads already exist -(unless (fboundp 'gnus) - (autoload 'gnus-slave-no-server "gnus" "\ -Read network news as a slave without connecting to local server." t nil) - - (autoload 'gnus-no-server "gnus" "\ -Read network news. -If ARG is a positive number, Gnus will use that as the -startup level. If ARG is nil, Gnus will be started at level 2. -If ARG is non-nil and not a positive number, Gnus will -prompt the user for the name of an NNTP server to use. -As opposed to `gnus', this command will not connect to the local server." t nil) - - (autoload 'gnus-slave "gnus" "\ -Read news as a slave." t nil) - - (autoload 'gnus "gnus" "\ -Read network news. -If ARG is non-nil and a positive number, Gnus will use that as the -startup level. If ARG is non-nil and not a positive number, Gnus will -prompt the user for the name of an NNTP server to use." t nil) - -;;;*** - -;;; These have moved out of gnus.el into other files. -;;; FIX FIX FIX: should other things be in gnus-setup? or these not in it? - (autoload 'gnus-update-format "gnus-spec" "\ -Update the format specification near point." t nil) - - (autoload 'gnus-fetch-group "gnus-group" "\ -Start Gnus if necessary and enter GROUP. -Returns whether the fetching was successful or not." t nil) - - (defalias 'gnus-batch-kill 'gnus-batch-score) - - (autoload 'gnus-batch-score "gnus-kill" "\ -Run batched scoring. -Usage: emacs -batch -l gnus -f gnus-batch-score ... -Newsgroups is a list of strings in Bnews format. If you want to score -the comp hierarchy, you'd say \"comp.all\". If you would not like to -score the alt hierarchy, you'd say \"!alt.all\"." t nil)) - -(provide 'gnus-setup) - -(run-hooks 'gnus-setup-load-hook) - -;;; gnus-setup.el ends here diff --git a/lisp/gnus-soup.el b/lisp/gnus-soup.el deleted file mode 100644 index 9b974a8..0000000 --- a/lisp/gnus-soup.el +++ /dev/null @@ -1,576 +0,0 @@ -;;; gnus-soup.el --- SOUP packet writing support for Gnus - -;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000 -;; Free Software Foundation, Inc. - -;; Author: Per Abrahamsen -;; Lars Magne Ingebrigtsen -;; Keywords: news, mail - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) - -(require 'gnus) -(require 'gnus-art) -(require 'message) -(require 'gnus-start) -(require 'gnus-range) - -;;; User Variables: - -(defvar gnus-soup-directory (nnheader-concat gnus-home-directory "SoupBrew/") - "*Directory containing an unpacked SOUP packet.") - -(defvar gnus-soup-replies-directory - (nnheader-concat gnus-soup-directory "SoupReplies/") - "*Directory where Gnus will do processing of replies.") - -(defvar gnus-soup-prefix-file "gnus-prefix" - "*Name of the file where Gnus stores the last used prefix.") - -(defvar gnus-soup-packer "tar cf - %s | gzip > $HOME/Soupout%d.tgz" - "Format string command for packing a SOUP packet. -The SOUP files will be inserted where the %s is in the string. -This string MUST contain both %s and %d. The file number will be -inserted where %d appears.") - -(defvar gnus-soup-unpacker "gunzip -c %s | tar xvf -" - "*Format string command for unpacking a SOUP packet. -The SOUP packet file name will be inserted at the %s.") - -(defvar gnus-soup-packet-directory gnus-home-directory - "*Where gnus-soup will look for REPLIES packets.") - -(defvar gnus-soup-packet-regexp "Soupin" - "*Regular expression matching SOUP REPLIES packets in `gnus-soup-packet-directory'.") - -(defvar gnus-soup-ignored-headers "^Xref:" - "*Regexp to match headers to be removed when brewing SOUP packets.") - -;;; Internal Variables: - -(defvar gnus-soup-encoding-type ?u - "*Soup encoding type. -`u' is USENET news format, `m' is Unix mbox format, and `M' is MMDF mailbox -format.") - -(defvar gnus-soup-index-type ?c - "*Soup index type. -`n' means no index file and `c' means standard Cnews overview -format.") - -(defvar gnus-soup-areas nil) -(defvar gnus-soup-last-prefix nil) -(defvar gnus-soup-prev-prefix nil) -(defvar gnus-soup-buffers nil) - -;;; Access macros: - -(defmacro gnus-soup-area-prefix (area) - `(aref ,area 0)) -(defmacro gnus-soup-set-area-prefix (area prefix) - `(aset ,area 0 ,prefix)) -(defmacro gnus-soup-area-name (area) - `(aref ,area 1)) -(defmacro gnus-soup-area-encoding (area) - `(aref ,area 2)) -(defmacro gnus-soup-area-description (area) - `(aref ,area 3)) -(defmacro gnus-soup-area-number (area) - `(aref ,area 4)) -(defmacro gnus-soup-area-set-number (area value) - `(aset ,area 4 ,value)) - -(defmacro gnus-soup-encoding-format (encoding) - `(aref ,encoding 0)) -(defmacro gnus-soup-encoding-index (encoding) - `(aref ,encoding 1)) -(defmacro gnus-soup-encoding-kind (encoding) - `(aref ,encoding 2)) - -(defmacro gnus-soup-reply-prefix (reply) - `(aref ,reply 0)) -(defmacro gnus-soup-reply-kind (reply) - `(aref ,reply 1)) -(defmacro gnus-soup-reply-encoding (reply) - `(aref ,reply 2)) - -;;; Commands: - -(defun gnus-soup-send-replies () - "Unpack and send all replies in the reply packet." - (interactive) - (let ((packets (directory-files - gnus-soup-packet-directory t gnus-soup-packet-regexp))) - (while packets - (when (gnus-soup-send-packet (car packets)) - (delete-file (car packets))) - (setq packets (cdr packets))))) - -(defun gnus-soup-add-article (n) - "Add the current article to SOUP packet. -If N is a positive number, add the N next articles. -If N is a negative number, add the N previous articles. -If N is nil and any articles have been marked with the process mark, -move those articles instead." - (interactive "P") - (let* ((articles (gnus-summary-work-articles n)) - (tmp-buf (gnus-get-buffer-create "*soup work*")) - (area (gnus-soup-area gnus-newsgroup-name)) - (prefix (gnus-soup-area-prefix area)) - headers) - (buffer-disable-undo tmp-buf) - (save-excursion - (while articles - ;; Put the article in a buffer. - (set-buffer tmp-buf) - (when (gnus-request-article-this-buffer - (car articles) gnus-newsgroup-name) - (setq headers (nnheader-parse-head t)) - (save-restriction - (message-narrow-to-head) - (message-remove-header gnus-soup-ignored-headers t)) - (gnus-soup-store gnus-soup-directory prefix headers - gnus-soup-encoding-type - gnus-soup-index-type) - (gnus-soup-area-set-number - area (1+ (or (gnus-soup-area-number area) 0)))) - ;; Mark article as read. - (set-buffer gnus-summary-buffer) - (gnus-summary-remove-process-mark (car articles)) - (gnus-summary-mark-as-read (car articles) gnus-souped-mark) - (setq articles (cdr articles))) - (kill-buffer tmp-buf)) - (gnus-soup-save-areas) - (gnus-set-mode-line 'summary))) - -(defun gnus-soup-pack-packet () - "Make a SOUP packet from the SOUP areas." - (interactive) - (gnus-soup-read-areas) - (if (file-exists-p gnus-soup-directory) - (if (directory-files gnus-soup-directory nil "\\.MSG$") - (gnus-soup-pack gnus-soup-directory gnus-soup-packer) - (message "No files to pack.")) - (message "No such directory: %s" gnus-soup-directory))) - -(defun gnus-group-brew-soup (n) - "Make a soup packet from the current group. -Uses the process/prefix convention." - (interactive "P") - (let ((groups (gnus-group-process-prefix n))) - (while groups - (gnus-group-remove-mark (car groups)) - (gnus-soup-group-brew (car groups) t) - (setq groups (cdr groups))) - (gnus-soup-save-areas))) - -(defun gnus-brew-soup (&optional level) - "Go through all groups on LEVEL or less and make a soup packet." - (interactive "P") - (let ((level (or level gnus-level-subscribed)) - (newsrc (cdr gnus-newsrc-alist))) - (while newsrc - (when (<= (nth 1 (car newsrc)) level) - (gnus-soup-group-brew (caar newsrc) t)) - (setq newsrc (cdr newsrc))) - (gnus-soup-save-areas))) - -;;;###autoload -(defun gnus-batch-brew-soup () - "Brew a SOUP packet from groups mention on the command line. -Will use the remaining command line arguments as regular expressions -for matching on group names. - -For instance, if you want to brew on all the nnml groups, as well as -groups with \"emacs\" in the name, you could say something like: - -$ emacs -batch -f gnus-batch-brew-soup ^nnml \".*emacs.*\" - -Note -- this function hasn't been implemented yet." - (interactive) - nil) - -;;; Internal Functions: - -;; Store the current buffer. -(defun gnus-soup-store (directory prefix headers format index) - ;; Create the directory, if needed. - (gnus-make-directory directory) - (let* ((msg-buf (nnheader-find-file-noselect - (concat directory prefix ".MSG"))) - (idx-buf (if (= index ?n) - nil - (nnheader-find-file-noselect - (concat directory prefix ".IDX")))) - (article-buf (current-buffer)) - from head-line beg type) - (setq gnus-soup-buffers (cons msg-buf (delq msg-buf gnus-soup-buffers))) - (buffer-disable-undo msg-buf) - (when idx-buf - (push idx-buf gnus-soup-buffers) - (buffer-disable-undo idx-buf)) - (save-excursion - ;; Make sure the last char in the buffer is a newline. - (goto-char (point-max)) - (unless (= (current-column) 0) - (insert "\n")) - ;; Find the "from". - (goto-char (point-min)) - (setq from - (gnus-mail-strip-quoted-names - (or (mail-fetch-field "from") - (mail-fetch-field "really-from") - (mail-fetch-field "sender")))) - (goto-char (point-min)) - ;; Depending on what encoding is supposed to be used, we make - ;; a soup header. - (setq head-line - (cond - ((or (= gnus-soup-encoding-type ?u) - (= gnus-soup-encoding-type ?n)) ;;Gnus back compatibility. - (format "#! rnews %d\n" (buffer-size))) - ((= gnus-soup-encoding-type ?m) - (while (search-forward "\nFrom " nil t) - (replace-match "\n>From " t t)) - (concat "From " (or from "unknown") - " " (current-time-string) "\n")) - ((= gnus-soup-encoding-type ?M) - "\^a\^a\^a\^a\n") - (t (error "Unsupported type: %c" gnus-soup-encoding-type)))) - ;; Insert the soup header and the article in the MSG buf. - (set-buffer msg-buf) - (goto-char (point-max)) - (insert head-line) - (setq beg (point)) - (insert-buffer-substring article-buf) - ;; Insert the index in the IDX buf. - (cond ((= index ?c) - (set-buffer idx-buf) - (gnus-soup-insert-idx beg headers)) - ((/= index ?n) - (error "Unknown index type: %c" type))) - ;; Return the MSG buf. - msg-buf))) - -(defun gnus-soup-group-brew (group &optional not-all) - "Enter GROUP and add all articles to a SOUP package. -If NOT-ALL, don't pack ticked articles." - (let ((gnus-expert-user t) - (gnus-large-newsgroup nil) - (entry (gnus-gethash group gnus-newsrc-hashtb))) - (when (or (null entry) - (eq (car entry) t) - (and (car entry) - (> (car entry) 0)) - (and (not not-all) - (gnus-range-length (cdr (assq 'tick (gnus-info-marks - (nth 2 entry))))))) - (when (gnus-summary-read-group group nil t) - (setq gnus-newsgroup-processable - (reverse - (if (not not-all) - (append gnus-newsgroup-marked gnus-newsgroup-unreads) - gnus-newsgroup-unreads))) - (gnus-soup-add-article nil) - (gnus-summary-exit))))) - -(defun gnus-soup-insert-idx (offset header) - ;; [number subject from date id references chars lines xref] - (goto-char (point-max)) - (insert - (format "%d\t%s\t%s\t%s\t%s\t%s\t%d\t%s\t\t\n" - offset - (or (mail-header-subject header) "(none)") - (or (mail-header-from header) "(nobody)") - (or (mail-header-date header) "") - (or (mail-header-id header) - (concat "soup-dummy-id-" - (mapconcat - (lambda (time) (int-to-string time)) - (current-time) "-"))) - (or (mail-header-references header) "") - (or (mail-header-chars header) 0) - (or (mail-header-lines header) "0")))) - -(defun gnus-soup-save-areas () - "Write all SOUP buffers." - (interactive) - (gnus-soup-write-areas) - (save-excursion - (let (buf) - (while gnus-soup-buffers - (setq buf (car gnus-soup-buffers) - gnus-soup-buffers (cdr gnus-soup-buffers)) - (if (not (buffer-name buf)) - () - (set-buffer buf) - (when (buffer-modified-p) - (save-buffer)) - (kill-buffer (current-buffer))))) - (gnus-soup-write-prefixes))) - -(defun gnus-soup-write-prefixes () - (let ((prefixes gnus-soup-last-prefix) - prefix) - (save-excursion - (gnus-set-work-buffer) - (while (setq prefix (pop prefixes)) - (erase-buffer) - (insert (format "(setq gnus-soup-prev-prefix %d)\n" (cdr prefix))) - (gnus-write-buffer-as-coding-system - nnheader-text-coding-system - (concat (car prefix) gnus-soup-prefix-file)))))) - -(defun gnus-soup-pack (dir packer) - (let* ((files (mapconcat 'identity - '("AREAS" "*.MSG" "*.IDX" "INFO" - "LIST" "REPLIES" "COMMANDS" "ERRORS") - " ")) - (packer (if (< (string-match "%s" packer) - (string-match "%d" packer)) - (format packer files - (string-to-int (gnus-soup-unique-prefix dir))) - (format packer - (string-to-int (gnus-soup-unique-prefix dir)) - files))) - (dir (expand-file-name dir))) - (gnus-make-directory dir) - (setq gnus-soup-areas nil) - (gnus-message 4 "Packing %s..." packer) - (if (zerop (call-process shell-file-name - nil nil nil shell-command-switch - (concat "cd " dir " ; " packer))) - (progn - (call-process shell-file-name nil nil nil shell-command-switch - (concat "cd " dir " ; rm " files)) - (gnus-message 4 "Packing...done" packer)) - (error "Couldn't pack packet")))) - -(defun gnus-soup-parse-areas (file) - "Parse soup area file FILE. -The result is a of vectors, each containing one entry from the AREA file. -The vector contain five strings, - [prefix name encoding description number] -though the two last may be nil if they are missing." - (let (areas) - (when (file-exists-p file) - (save-excursion - (set-buffer (nnheader-find-file-noselect file 'force)) - (buffer-disable-undo) - (goto-char (point-min)) - (while (not (eobp)) - (push (vector (gnus-soup-field) - (gnus-soup-field) - (gnus-soup-field) - (and (eq (preceding-char) ?\t) - (gnus-soup-field)) - (and (eq (preceding-char) ?\t) - (string-to-int (gnus-soup-field)))) - areas) - (when (eq (preceding-char) ?\t) - (beginning-of-line 2))) - (kill-buffer (current-buffer)))) - areas)) - -(defun gnus-soup-parse-replies (file) - "Parse soup REPLIES file FILE. -The result is a of vectors, each containing one entry from the REPLIES -file. The vector contain three strings, [prefix name encoding]." - (let (replies) - (save-excursion - (set-buffer (nnheader-find-file-noselect file)) - (buffer-disable-undo) - (goto-char (point-min)) - (while (not (eobp)) - (push (vector (gnus-soup-field) (gnus-soup-field) - (gnus-soup-field)) - replies) - (when (eq (preceding-char) ?\t) - (beginning-of-line 2))) - (kill-buffer (current-buffer))) - replies)) - -(defun gnus-soup-field () - (prog1 - (buffer-substring (point) (progn (skip-chars-forward "^\t\n") (point))) - (forward-char 1))) - -(defun gnus-soup-read-areas () - (or gnus-soup-areas - (setq gnus-soup-areas - (gnus-soup-parse-areas (concat gnus-soup-directory "AREAS"))))) - -(defun gnus-soup-write-areas () - "Write the AREAS file." - (interactive) - (when gnus-soup-areas - (with-temp-file (concat gnus-soup-directory "AREAS") - (let ((areas gnus-soup-areas) - area) - (while (setq area (pop areas)) - (insert - (format - "%s\t%s\t%s%s\n" - (gnus-soup-area-prefix area) - (gnus-soup-area-name area) - (gnus-soup-area-encoding area) - (if (or (gnus-soup-area-description area) - (gnus-soup-area-number area)) - (concat "\t" (or (gnus-soup-area-description - area) "") - (if (gnus-soup-area-number area) - (concat "\t" (int-to-string - (gnus-soup-area-number area))) - "")) "")))))))) - -(defun gnus-soup-write-replies (dir areas) - "Write a REPLIES file in DIR containing AREAS." - (with-temp-file (concat dir "REPLIES") - (let (area) - (while (setq area (pop areas)) - (insert (format "%s\t%s\t%s\n" - (gnus-soup-reply-prefix area) - (gnus-soup-reply-kind area) - (gnus-soup-reply-encoding area))))))) - -(defun gnus-soup-area (group) - (gnus-soup-read-areas) - (let ((areas gnus-soup-areas) - (real-group (gnus-group-real-name group)) - area result) - (while areas - (setq area (car areas) - areas (cdr areas)) - (when (equal (gnus-soup-area-name area) real-group) - (setq result area))) - (unless result - (setq result - (vector (gnus-soup-unique-prefix) - real-group - (format "%c%c%c" - gnus-soup-encoding-type - gnus-soup-index-type - (if (gnus-member-of-valid 'mail group) ?m ?n)) - nil nil) - gnus-soup-areas (cons result gnus-soup-areas))) - result)) - -(defun gnus-soup-unique-prefix (&optional dir) - (let* ((dir (file-name-as-directory (or dir gnus-soup-directory))) - (entry (assoc dir gnus-soup-last-prefix)) - gnus-soup-prev-prefix) - (if entry - () - (when (file-exists-p (concat dir gnus-soup-prefix-file)) - (ignore-errors - (load (concat dir gnus-soup-prefix-file) nil t t))) - (push (setq entry (cons dir (or gnus-soup-prev-prefix 0))) - gnus-soup-last-prefix)) - (setcdr entry (1+ (cdr entry))) - (gnus-soup-write-prefixes) - (int-to-string (cdr entry)))) - -(defun gnus-soup-unpack-packet (dir unpacker packet) - "Unpack PACKET into DIR using UNPACKER. -Return whether the unpacking was successful." - (gnus-make-directory dir) - (gnus-message 4 "Unpacking: %s" (format unpacker packet)) - (prog1 - (zerop (call-process - shell-file-name nil nil nil shell-command-switch - (format "cd %s ; %s" (expand-file-name dir) - (format unpacker packet)))) - (gnus-message 4 "Unpacking...done"))) - -(defun gnus-soup-send-packet (packet) - (gnus-soup-unpack-packet - gnus-soup-replies-directory gnus-soup-unpacker packet) - (let ((replies (gnus-soup-parse-replies - (concat gnus-soup-replies-directory "REPLIES")))) - (save-excursion - (while replies - (let* ((msg-file (concat gnus-soup-replies-directory - (gnus-soup-reply-prefix (car replies)) - ".MSG")) - (msg-buf (and (file-exists-p msg-file) - (nnheader-find-file-noselect msg-file))) - (tmp-buf (gnus-get-buffer-create " *soup send*")) - beg end) - (cond - ((and (/= (gnus-soup-encoding-format - (gnus-soup-reply-encoding (car replies))) - ?u) - (/= (gnus-soup-encoding-format - (gnus-soup-reply-encoding (car replies))) - ?n)) ;; Gnus back compatibility. - (error "Unsupported encoding")) - ((null msg-buf) - t) - (t - (buffer-disable-undo msg-buf) - (set-buffer msg-buf) - (goto-char (point-min)) - (while (not (eobp)) - (unless (looking-at "#! *rnews +\\([0-9]+\\)") - (error "Bad header")) - (forward-line 1) - (setq beg (point) - end (+ (point) (string-to-int - (buffer-substring - (match-beginning 1) (match-end 1))))) - (switch-to-buffer tmp-buf) - (erase-buffer) - (insert-buffer-substring msg-buf beg end) - (goto-char (point-min)) - (search-forward "\n\n") - (forward-char -1) - (insert mail-header-separator) - (setq message-user-agent (gnus-extended-version)) - (cond - ((string= (gnus-soup-reply-kind (car replies)) "news") - (gnus-message 5 "Sending news message to %s..." - (mail-fetch-field "newsgroups")) - (sit-for 1) - (let ((message-syntax-checks - 'dont-check-for-anything-just-trust-me)) - (funcall message-send-news-function))) - ((string= (gnus-soup-reply-kind (car replies)) "mail") - (gnus-message 5 "Sending mail to %s..." - (mail-fetch-field "to")) - (sit-for 1) - (message-send-mail)) - (t - (error "Unknown reply kind"))) - (set-buffer msg-buf) - (goto-char end)) - (delete-file (buffer-file-name)) - (kill-buffer msg-buf) - (kill-buffer tmp-buf) - (gnus-message 4 "Sent packet")))) - (setq replies (cdr replies))) - t))) - -(provide 'gnus-soup) - -;;; gnus-soup.el ends here diff --git a/lisp/gnus-spec.el b/lisp/gnus-spec.el deleted file mode 100644 index 0171a91..0000000 --- a/lisp/gnus-spec.el +++ /dev/null @@ -1,712 +0,0 @@ -;;; gnus-spec.el --- format spec functions for Gnus -*- coding: iso-latin-1 -*- -;; Copyright (C) 1996, 1997, 1998, 1999, 2000 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Katsumi Yamaoka -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) - -(require 'alist) -(require 'gnus) - -(defcustom gnus-use-correct-string-widths t - "*If non-nil, use correct functions for dealing with wide characters." - :group 'gnus-format - :type 'boolean) - -;;; Internal variables. - -(defvar gnus-summary-mark-positions nil) -(defvar gnus-group-mark-positions nil) -(defvar gnus-group-indentation "") - -;; Format specs. The chunks below are the machine-generated forms -;; that are to be evaled as the result of the default format strings. -;; We write them in here to get them byte-compiled. That way the -;; default actions will be quite fast, while still retaining the full -;; flexibility of the user-defined format specs. - -;; First we have lots of dummy defvars to let the compiler know these -;; are really dynamic variables. - -(defvar gnus-tmp-unread) -(defvar gnus-tmp-replied) -(defvar gnus-tmp-score-char) -(defvar gnus-tmp-indentation) -(defvar gnus-tmp-opening-bracket) -(defvar gnus-tmp-lines) -(defvar gnus-tmp-name) -(defvar gnus-tmp-closing-bracket) -(defvar gnus-tmp-subject-or-nil) -(defvar gnus-tmp-subject) -(defvar gnus-tmp-marked) -(defvar gnus-tmp-marked-mark) -(defvar gnus-tmp-subscribed) -(defvar gnus-tmp-process-marked) -(defvar gnus-tmp-number-of-unread) -(defvar gnus-tmp-group-name) -(defvar gnus-tmp-group) -(defvar gnus-tmp-article-number) -(defvar gnus-tmp-unread-and-unselected) -(defvar gnus-tmp-news-method) -(defvar gnus-tmp-news-server) -(defvar gnus-tmp-article-number) -(defvar gnus-mouse-face) -(defvar gnus-mouse-face-prop) - -(defun gnus-summary-line-format-spec () - (insert gnus-tmp-unread gnus-tmp-replied - gnus-tmp-score-char gnus-tmp-indentation) - (gnus-put-text-property - (point) - (progn - (insert - gnus-tmp-opening-bracket - (format "%4d: %-20s" - gnus-tmp-lines - (if (> (length gnus-tmp-name) 20) - (substring gnus-tmp-name 0 20) - gnus-tmp-name)) - gnus-tmp-closing-bracket) - (point)) - gnus-mouse-face-prop gnus-mouse-face) - (insert " " gnus-tmp-subject-or-nil "\n")) - -(defvar gnus-summary-line-format-spec - (gnus-byte-code 'gnus-summary-line-format-spec)) - -(defun gnus-summary-dummy-line-format-spec () - (insert "* ") - (gnus-put-text-property - (point) - (progn - (insert ": :") - (point)) - gnus-mouse-face-prop gnus-mouse-face) - (insert " " gnus-tmp-subject "\n")) - -(defvar gnus-summary-dummy-line-format-spec - (gnus-byte-code 'gnus-summary-dummy-line-format-spec)) - -(defun gnus-group-line-format-spec () - (insert gnus-tmp-marked-mark gnus-tmp-subscribed - gnus-tmp-process-marked - gnus-group-indentation - (format "%5s: " gnus-tmp-number-of-unread)) - (gnus-put-text-property - (point) - (progn - (insert gnus-tmp-group "\n") - (1- (point))) - gnus-mouse-face-prop gnus-mouse-face)) -(defvar gnus-group-line-format-spec - (gnus-byte-code 'gnus-group-line-format-spec)) - -(defvar gnus-format-specs - `((group ("%M\%S\%p\%P\%5y: %(%g%)%l\n" ,gnus-group-line-format-spec)) - (summary-dummy ("* %(: :%) %S\n" - ,gnus-summary-dummy-line-format-spec)) - (summary ("%U\%R\%z\%I\%(%[%4L: %-23,23n%]%) %s\n" - ,gnus-summary-line-format-spec))) - "Alist of format specs.") - -(defvar gnus-format-specs-compiled nil - "Alist of compiled format specs. Each element should be the form: -\(TYPE (FORMAT-STRING-1 . COMPILED-FUNCTION-1) - : - (FORMAT-STRING-n . COMPILED-FUNCTION-n)).") - -(defvar gnus-article-mode-line-format-spec nil) -(defvar gnus-summary-mode-line-format-spec nil) -(defvar gnus-group-mode-line-format-spec nil) - -;;; Phew. All that gruft is over with, fortunately. - -;;;###autoload -(defun gnus-update-format (var) - "Update the format specification near point." - (interactive - (list - (save-excursion - (eval-defun nil) - ;; Find the end of the current word. - (re-search-forward "[ \t\n]" nil t) - ;; Search backward. - (when (re-search-backward "\\(gnus-[-a-z]+-line-format\\)" nil t) - (match-string 1))))) - (let* ((type (intern (progn (string-match "gnus-\\([-a-z]+\\)-line" var) - (match-string 1 var)))) - (value (symbol-value (intern var))) - (spec (set - (intern (format "%s-spec" var)) - (gnus-parse-format - value (symbol-value (intern (format "%s-alist" var))) - (not (string-match "mode" var))))) - (entry (assq type gnus-format-specs))) - (if entry - (let ((elem (assoc value entry))) - (if elem - (setcdr elem spec) - (setcdr entry (cons (cons value elem) (cdr entry))))) - (push (list type (cons value spec)) gnus-format-specs)) - (gnus-product-variable-touch 'gnus-format-specs) - - (pop-to-buffer "*Gnus Format*") - (erase-buffer) - (lisp-interaction-mode) - (insert (pp-to-string spec)))) - -(put 'gnus-search-or-regist-spec 'lisp-indent-function 1) -(defmacro gnus-search-or-regist-spec (mspec &rest body) - (let ((specs (nth 0 mspec)) (type (nth 1 mspec)) (format (nth 2 mspec)) - (spec (nth 3 mspec)) (entry (nth 4 mspec)) (elem (nth 5 mspec))) - `(let* ((,entry (assq ,type ,specs)) - (,elem (assoc ,format (cdr ,entry)))) - (or (cdr ,elem) - (when (progn ,@body) - (if ,entry - (if ,elem - (setcdr ,elem ,spec) - (setcdr ,entry (cons (cons ,format ,spec) (cdr ,entry)))) - (push (list ,type (cons ,format ,spec)) ,specs)) - (gnus-product-variable-touch (quote ,specs))) - ,spec)))) - -(defun gnus-update-format-specification-1 (type format val) - (set (intern (format "gnus-%s-line-format-spec" type)) - (gnus-search-or-regist-spec (gnus-format-specs-compiled - type format val entry elem) - (when (and gnus-compile-user-specs val) - (setq val (prog1 - (progn - (fset 'gnus-tmp-func `(lambda () ,val)) - (require 'bytecomp) - (let (byte-compile-warnings) - (byte-compile 'gnus-tmp-func)) - (gnus-byte-code 'gnus-tmp-func)) - (when (get-buffer "*Compile-Log*") - (bury-buffer "*Compile-Log*")) - (when (get-buffer "*Compile-Log-Show*") - (bury-buffer "*Compile-Log-Show*")))))))) - -(defun gnus-update-format-specifications (&optional force &rest types) - "Update all (necessary) format specifications." - ;; Make the indentation array. - ;; See whether all the stored info needs to be flushed. - (when force - (message "%s" "Force update format specs.") - (setq gnus-format-specs nil - gnus-format-specs-compiled nil) - (gnus-product-variable-touch 'gnus-format-specs - 'gnus-format-specs-compiled)) - - ;; Go through all the formats and see whether they need updating. - (let (type val) - (save-excursion - (while (setq type (pop types)) - ;; Jump to the proper buffer to find out the value of the - ;; variable, if possible. (It may be buffer-local.) - (let* ((new-format - (let ((buffer (intern (format "gnus-%s-buffer" type)))) - (when (and (boundp buffer) - (setq val (symbol-value buffer)) - (gnus-buffer-exists-p val)) - (set-buffer val)) - (symbol-value - (intern (format "gnus-%s-line-format" type)))))) - (or (gnus-update-format-specification-1 type new-format nil) - ;; This is a new format. - (gnus-update-format-specification-1 - type new-format - (gnus-search-or-regist-spec (gnus-format-specs - type new-format val entry elem) - (setq val (if (stringp new-format) - ;; This is a "real" format. - (gnus-parse-format - new-format - (symbol-value - (intern (format "gnus-%s-line-format-alist" - type))) - (not (string-match "mode$" - (symbol-name type)))) - ;; This is a function call or something. - new-format)))))))))) - -(defvar gnus-mouse-face-0 'highlight) -(defvar gnus-mouse-face-1 'highlight) -(defvar gnus-mouse-face-2 'highlight) -(defvar gnus-mouse-face-3 'highlight) -(defvar gnus-mouse-face-4 'highlight) - -(defun gnus-mouse-face-function (form type) - `(gnus-put-text-property - (point) (progn ,@form (point)) - gnus-mouse-face-prop - ,(if (equal type 0) - 'gnus-mouse-face - `(quote ,(symbol-value (intern (format "gnus-mouse-face-%d" type))))))) - -(defvar gnus-face-0 'bold) -(defvar gnus-face-1 'italic) -(defvar gnus-face-2 'bold-italic) -(defvar gnus-face-3 'bold) -(defvar gnus-face-4 'bold) - -(defun gnus-face-face-function (form type) - `(gnus-add-text-properties - (point) (progn ,@form (point)) - '(gnus-face t face ,(symbol-value (intern (format "gnus-face-%d" type)))))) - -;;; Avoid byte-compile warning. -(defun gnus-tilde-pad-form (el pad-width) - "Dummy function except for XEmacs-mule. It will be redefined -by `gnus-xmas-redefine'." - (let ((val (if (symbolp el) (eval el) el))) - (` (, val)))) - -(defun gnus-balloon-face-function (form type) - `(gnus-put-text-property - (point) (progn ,@form (point)) - 'balloon-help - ,(intern (format "gnus-balloon-face-%d" type)))) - -(defun gnus-spec-tab (column) - (if (> column 0) - `(insert (make-string (max (- ,column (current-column)) 0) ? )) - `(progn - (if (> (current-column) ,(abs column)) - (delete-region (point) - (- (point) (- (current-column) ,(abs column)))) - (insert (make-string (max (- ,(abs column) (current-column)) 0) - ? )))))) - -(defun gnus-correct-length (string) - "Return the correct width of STRING." - (let ((length 0)) - (mapcar (lambda (char) (incf length (gnus-char-width char))) string) - length)) - -(defun gnus-correct-substring (string start &optional end) - (let ((wstart 0) - (wend 0) - (seek 0) - (length (length string))) - ;; Find the start position. - (while (and (< seek length) - (< wstart start)) - (incf wstart (gnus-char-width (aref string seek))) - (incf seek)) - (setq wend wstart - wstart seek) - ;; Find the end position. - (while (and (< seek length) - (or (not end) - (<= wend end))) - (incf wend (gnus-char-width (aref string seek))) - (incf seek)) - (setq wend seek) - (substring string wstart (1- wend)))) - -(defun gnus-tilde-max-form (el max-width) - "Return a form that limits EL to MAX-WIDTH." - (let ((max (abs max-width))) - (if (symbolp el) - `(if (> (,(if gnus-use-correct-string-widths - 'gnus-correct-length - 'length) ,el) - ,max) - ,(if (< max-width 0) - `(,(if gnus-use-correct-string-widths - 'gnus-correct-substring - 'substring) - ,el (- (,(if gnus-use-correct-string-widths - 'gnus-correct-length - 'length) - el) ,max)) - `(,(if gnus-use-correct-string-widths - 'gnus-correct-substring - 'substring) - ,el 0 ,max)) - ,el) - `(let ((val (eval ,el))) - (if (> (,(if gnus-use-correct-string-widths - 'gnus-correct-length - 'length) val) ,max) - ,(if (< max-width 0) - `(,(if gnus-use-correct-string-widths - 'gnus-correct-substring - 'substring) - val (- (,(if gnus-use-correct-string-widths - 'gnus-correct-length - 'length) val) ,max)) - `(,(if gnus-use-correct-string-widths - 'gnus-correct-substring - 'substring) - val 0 ,max)) - val))))) - -(defun gnus-tilde-cut-form (el cut-width) - "Return a form that cuts CUT-WIDTH off of EL." - (let ((cut (abs cut-width))) - (if (symbolp el) - `(if (> (,(if gnus-use-correct-string-widths - 'gnus-correct-length - 'length) ,el) ,cut) - ,(if (< cut-width 0) - `(,(if gnus-use-correct-string-widths - 'gnus-correct-substring - 'substring) ,el 0 - (- (,(if gnus-use-correct-string-widths - 'gnus-correct-length - 'length) el) ,cut)) - `(,(if gnus-use-correct-string-widths - 'gnus-correct-substring - 'substring) ,el ,cut)) - ,el) - `(let ((val (eval ,el))) - (if (> (,(if gnus-use-correct-string-widths - 'gnus-correct-length - 'length) val) ,cut) - ,(if (< cut-width 0) - `(,(if gnus-use-correct-string-widths - 'gnus-correct-substring - 'substring) val 0 - (- (,(if gnus-use-correct-string-widths - 'gnus-correct-length - 'length) val) ,cut)) - `(,(if gnus-use-correct-string-widths - 'gnus-correct-substring - 'substring) val ,cut)) - val))))) - -(defun gnus-tilde-ignore-form (el ignore-value) - "Return a form that is blank when EL is IGNORE-VALUE." - (if (symbolp el) - `(if (equal ,el ,ignore-value) - "" ,el) - `(let ((val (eval ,el))) - (if (equal val ,ignore-value) - "" val)))) - -(defun gnus-parse-format (format spec-alist &optional insert) - ;; This function parses the FORMAT string with the help of the - ;; SPEC-ALIST and returns a list that can be eval'ed to return the - ;; string. If the FORMAT string contains the specifiers %( and %) - ;; the text between them will have the mouse-face text property. - ;; If the FORMAT string contains the specifiers %[ and %], the text between - ;; them will have the balloon-help text property. - (if (string-match - "\\`\\(.*\\)%[0-9]?[{(«]\\(.*\\)%[0-9]?[»})]\\(.*\n?\\)\\'" - format) - (gnus-parse-complex-format format spec-alist) - ;; This is a simple format. - (gnus-parse-simple-format format spec-alist insert))) - -(defun gnus-parse-complex-format (format spec-alist) - (save-excursion - (gnus-set-work-buffer) - (insert format) - (goto-char (point-min)) - (while (re-search-forward "\"" nil t) - (replace-match "\\\"" nil t)) - (goto-char (point-min)) - (insert "(\"") - ;; Convert all font specs into font spec lists. - (while (re-search-forward "%\\([0-9]+\\)?\\([«»{}()]\\)" nil t) - (let ((number (if (match-beginning 1) - (match-string 1) "0")) - (delim (aref (match-string 2) 0))) - (if (or (= delim ?\() - (= delim ?\{) - (= delim ?\«)) - (replace-match (concat "\"(" - (cond ((= delim ?\() "mouse") - ((= delim ?\{) "face") - (t "balloon")) - " " number " \"") - t t) - (replace-match "\")\"")))) - (goto-char (point-max)) - (insert "\")") - ;; Convert point position commands. - (goto-char (point-min)) - (while (re-search-forward "%\\([-0-9]+\\)?C" nil t) - (replace-match "\"(point)\"" t t)) - ;; Convert TAB commands. - (goto-char (point-min)) - (while (re-search-forward "%\\([-0-9]+\\)=" nil t) - (replace-match (format "\"(tab %s)\"" (match-string 1)) t t)) - ;; Convert the buffer into the spec. - (goto-char (point-min)) - (let ((form (read (current-buffer)))) - ;; If the first element is '(point), we just remove it. - (when (equal (car form) '(point)) - (pop form)) - (cons 'progn (gnus-complex-form-to-spec form spec-alist))))) - -(defun gnus-complex-form-to-spec (form spec-alist) - (delq nil - (mapcar - (lambda (sform) - (cond - ((stringp sform) - (gnus-parse-simple-format sform spec-alist t)) - ((eq (car sform) 'point) - `(gnus-put-text-property (1- (point)) (point) 'gnus-position t)) - ((eq (car sform) 'tab) - (gnus-spec-tab (cadr sform))) - (t - (funcall (intern (format "gnus-%s-face-function" (car sform))) - (gnus-complex-form-to-spec (cddr sform) spec-alist) - (nth 1 sform))))) - form))) - -(defun gnus-parse-simple-format (format spec-alist &optional insert) - ;; This function parses the FORMAT string with the help of the - ;; SPEC-ALIST and returns a list that can be eval'ed to return a - ;; string. - (let ((xemacs-mule-p (and (featurep 'xemacs) (featurep 'mule))) - max-width - spec flist fstring elem result dontinsert user-defined - type value pad-width spec-beg cut-width ignore-value - tilde-form tilde elem-type) - (save-excursion - (gnus-set-work-buffer) - (insert format) - (goto-char (point-min)) - (while (search-forward "%" nil t) - (setq user-defined nil - spec-beg nil - pad-width nil - max-width nil - cut-width nil - ignore-value nil - tilde-form nil) - (setq spec-beg (1- (point))) - - ;; Parse this spec fully. - (while - (cond - ((looking-at "\\([-.0-9]+\\)\\(,[-0-9]+\\)?") - (setq pad-width (string-to-number (match-string 1))) - (when (match-beginning 2) - (setq max-width (string-to-number (buffer-substring - (1+ (match-beginning 2)) - (match-end 2))))) - (goto-char (match-end 0))) - ((looking-at "~") - (forward-char 1) - (setq tilde (read (current-buffer)) - type (car tilde) - value (cadr tilde)) - (cond - ((memq type '(pad pad-left)) - (setq pad-width value)) - ((eq type 'pad-right) - (setq pad-width (- value))) - ((memq type '(max-right max)) - (setq max-width value)) - ((eq type 'max-left) - (setq max-width (- value))) - ((memq type '(cut cut-left)) - (setq cut-width value)) - ((eq type 'cut-right) - (setq cut-width (- value))) - ((eq type 'ignore) - (setq ignore-value - (if (stringp value) value (format "%s" value)))) - ((eq type 'form) - (setq tilde-form value)) - (t - (error "Unknown tilde type: %s" tilde))) - t) - (t - nil))) - ;; User-defined spec -- find the spec name. - (when (eq (setq spec (char-after)) ?u) - (forward-char 1) - (setq user-defined (char-after))) - (forward-char 1) - (delete-region spec-beg (point)) - - ;; Now we have all the relevant data on this spec, so - ;; we start doing stuff. - (insert "%") - (if (eq spec ?%) - ;; "%%" just results in a "%". - (insert "%") - (cond - ;; Do tilde forms. - ((eq spec ?@) - (setq elem (list tilde-form ?s))) - ;; Treat user defined format specifiers specially. - (user-defined - (setq elem - (list - (list (intern (format "gnus-user-format-function-%c" - user-defined)) - 'gnus-tmp-header) - ?s))) - ;; Find the specification from `spec-alist'. - ((setq elem (cdr (assq spec spec-alist)))) - (t - (setq elem '("*" ?s)))) - (setq elem-type (cadr elem)) - ;; Insert the new format elements. - (and pad-width (not xemacs-mule-p) - (insert (number-to-string pad-width))) - ;; Create the form to be evaled. - (if (or max-width cut-width ignore-value - (and pad-width xemacs-mule-p)) - (progn - (insert ?s) - (let ((el (car elem))) - (cond ((= (cadr elem) ?c) - (setq el (list 'char-to-string el))) - ((= (cadr elem) ?d) - (setq el (list 'int-to-string el)))) - (when ignore-value - (setq el (gnus-tilde-ignore-form el ignore-value))) - (when cut-width - (setq el (gnus-tilde-cut-form el cut-width))) - (when max-width - (setq el (gnus-tilde-max-form el max-width))) - (and pad-width xemacs-mule-p - (setq el (gnus-tilde-pad-form el pad-width))) - (push el flist))) - (insert elem-type) - (push (car elem) flist)))) - (setq fstring (buffer-string))) - - ;; Do some postprocessing to increase efficiency. - (setq - result - (cond - ;; Emptyness. - ((string= fstring "") - nil) - ;; Not a format string. - ((not (string-match "%" fstring)) - (list fstring)) - ;; A format string with just a single string spec. - ((string= fstring "%s") - (list (car flist))) - ;; A single character. - ((string= fstring "%c") - (list (car flist))) - ;; A single number. - ((string= fstring "%d") - (setq dontinsert) - (if insert - (list `(princ ,(car flist))) - (list `(int-to-string ,(car flist))))) - ;; Just lots of chars and strings. - ((string-match "\\`\\(%[cs]\\)+\\'" fstring) - (nreverse flist)) - ;; A single string spec at the beginning of the spec. - ((string-match "\\`%[sc][^%]+\\'" fstring) - (list (car flist) (substring fstring 2))) - ;; A single string spec in the middle of the spec. - ((string-match "\\`\\([^%]+\\)%[sc]\\([^%]+\\)\\'" fstring) - (list (match-string 1 fstring) (car flist) (match-string 2 fstring))) - ;; A single string spec in the end of the spec. - ((string-match "\\`\\([^%]+\\)%[sc]\\'" fstring) - (list (match-string 1 fstring) (car flist))) - ;; A more complex spec. - (t - (list (cons 'format (cons fstring (nreverse flist))))))) - - (if insert - (when result - (if dontinsert - result - (cons 'insert result))) - (cond ((stringp result) - result) - ((consp result) - (cons 'concat result)) - (t ""))))) - -(defun gnus-eval-format (format &optional alist props) - "Eval the format variable FORMAT, using ALIST. -If PROPS, insert the result." - (let ((form (gnus-parse-format format alist props))) - (if props - (gnus-add-text-properties (point) (progn (eval form) (point)) props) - (eval form)))) - -(defun gnus-compile () - "Byte-compile the user-defined format specs." - (interactive) - (require 'bytecomp) - (let ((entries gnus-format-specs) - (byte-compile-warnings '(unresolved callargs redefine)) - entry type compiled-function) - (save-excursion - (gnus-message 7 "Compiling format specs...") - - (while entries - (setq entry (pop entries) - type (car entry)) - (if (memq type '(gnus-version version)) - (setq gnus-format-specs (delq entry gnus-format-specs)) - (let ((form (caddr entry))) - (when (and (listp form) - ;; Under GNU Emacs, it's (byte-code ...) - (not (eq 'byte-code (car form))) - ;; Under XEmacs, it's (funcall #) - (not (and (eq 'funcall (car form)) - (byte-code-function-p (cadr form))))) - (defalias 'gnus-tmp-func `(lambda () ,form)) - (byte-compile 'gnus-tmp-func) - (setq compiled-function (gnus-byte-code 'gnus-tmp-func)) - (set (intern (format "gnus-%s-line-format-spec" type)) - compiled-function) - (let ((elem (cdr (assq type gnus-format-specs-compiled)))) - (if elem - (set-alist 'elem (cadr entry) compiled-function) - (setq elem (list (cadr entry) compiled-function))) - (set-alist 'gnus-format-specs-compiled type elem)))))) - - (push (cons 'version emacs-version) gnus-format-specs) - (gnus-message 7 "Compiling user specs...done")))) - -(defun gnus-set-format (type &optional insertable) - (set (intern (format "gnus-%s-line-format-spec" type)) - (gnus-parse-format - (symbol-value (intern (format "gnus-%s-line-format" type))) - (symbol-value (intern (format "gnus-%s-line-format-alist" type))) - insertable))) - -(gnus-ems-redefine) - -(provide 'gnus-spec) - -;; Local Variables: -;; coding: iso-8859-1 -;; End: - -;;; gnus-spec.el ends here diff --git a/lisp/gnus-srvr.el b/lisp/gnus-srvr.el deleted file mode 100644 index bc9df3d..0000000 --- a/lisp/gnus-srvr.el +++ /dev/null @@ -1,912 +0,0 @@ -;;; gnus-srvr.el --- virtual server support for Gnus -;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) - -(require 'gnus) -(require 'gnus-spec) -(require 'gnus-group) -(require 'gnus-int) -(require 'gnus-range) - -(defvar gnus-server-mode-hook nil - "Hook run in `gnus-server-mode' buffers.") - -(defconst gnus-server-line-format " {%(%h:%w%)} %s%a\n" - "Format of server lines. -It works along the same lines as a normal formatting string, -with some simple extensions. - -The following specs are understood: - -%h backend -%n name -%w address -%s status -%a agent covered") - -(defvar gnus-server-mode-line-format "Gnus: %%b" - "The format specification for the server mode line.") - -(defvar gnus-server-exit-hook nil - "*Hook run when exiting the server buffer.") - -(defvar gnus-server-browse-in-group-buffer nil - "Whether browse server in group buffer.") - -;;; Internal variables. - -(defvar gnus-inserted-opened-servers nil) - -(defvar gnus-server-line-format-alist - `((?h gnus-tmp-how ?s) - (?n gnus-tmp-name ?s) - (?w gnus-tmp-where ?s) - (?s gnus-tmp-status ?s) - (?a gnus-tmp-agent ?s))) - -(defvar gnus-server-mode-line-format-alist - `((?S gnus-tmp-news-server ?s) - (?M gnus-tmp-news-method ?s) - (?u gnus-tmp-user-defined ?s))) - -(defvar gnus-server-line-format-spec nil) -(defvar gnus-server-mode-line-format-spec nil) -(defvar gnus-server-killed-servers nil) - -(defvar gnus-server-mode-map) - -(defvar gnus-server-menu-hook nil - "*Hook run after the creation of the server mode menu.") - -(defun gnus-server-make-menu-bar () - (gnus-turn-off-edit-menu 'server) - (unless (boundp 'gnus-server-server-menu) - (easy-menu-define - gnus-server-server-menu gnus-server-mode-map "" - '("Server" - ["Add" gnus-server-add-server t] - ["Browse" gnus-server-read-server t] - ["Scan" gnus-server-scan-server t] - ["List" gnus-server-list-servers t] - ["Kill" gnus-server-kill-server t] - ["Yank" gnus-server-yank-server t] - ["Copy" gnus-server-copy-server t] - ["Edit" gnus-server-edit-server t] - ["Regenerate" gnus-server-regenerate-server t] - ["Exit" gnus-server-exit t])) - - (easy-menu-define - gnus-server-connections-menu gnus-server-mode-map "" - '("Connections" - ["Open" gnus-server-open-server t] - ["Close" gnus-server-close-server t] - ["Deny" gnus-server-deny-server t] - "---" - ["Open All" gnus-server-open-all-servers t] - ["Close All" gnus-server-close-all-servers t] - ["Reset All" gnus-server-remove-denials t])) - - (gnus-run-hooks 'gnus-server-menu-hook))) - -(defvar gnus-server-mode-map nil) -(put 'gnus-server-mode 'mode-class 'special) - -(unless gnus-server-mode-map - (setq gnus-server-mode-map (make-sparse-keymap)) - (suppress-keymap gnus-server-mode-map) - - (gnus-define-keys gnus-server-mode-map - " " gnus-server-read-server-in-server-buffer - "\r" gnus-server-read-server - gnus-mouse-2 gnus-server-pick-server - "q" gnus-server-exit - "l" gnus-server-list-servers - "k" gnus-server-kill-server - "y" gnus-server-yank-server - "c" gnus-server-copy-server - "a" gnus-server-add-server - "e" gnus-server-edit-server - "s" gnus-server-scan-server - - "O" gnus-server-open-server - "\M-o" gnus-server-open-all-servers - "C" gnus-server-close-server - "\M-c" gnus-server-close-all-servers - "D" gnus-server-deny-server - "R" gnus-server-remove-denials - - "n" next-line - "p" previous-line - - "g" gnus-server-regenerate-server - - "\C-c\C-i" gnus-info-find-node - "\C-c\C-b" gnus-bug)) - -(defface gnus-server-agent-face - '((((class color) (background light)) (:foreground "PaleTurquoise" :bold t)) - (((class color) (background dark)) (:foreground "PaleTurquoise" :bold t)) - (t (:bold t))) - "Face used for displaying AGENTIZED servers" - :group 'gnus-server-visual) - -(defface gnus-server-opened-face - '((((class color) (background light)) (:foreground "Green3" :bold t)) - (((class color) (background dark)) (:foreground "Green1" :bold t)) - (t (:bold t))) - "Face used for displaying OPENED servers" - :group 'gnus-server-visual) - -(defface gnus-server-closed-face - '((((class color) (background light)) (:foreground "Steel Blue" :italic t)) - (((class color) (background dark)) - (:foreground "Light Steel Blue" :italic t)) - (t (:italic t))) - "Face used for displaying CLOSED servers" - :group 'gnus-server-visual) - -(defface gnus-server-denied-face - '((((class color) (background light)) (:foreground "Red" :bold t)) - (((class color) (background dark)) (:foreground "Pink" :bold t)) - (t (:inverse-video t :bold t))) - "Face used for displaying DENIED servers" - :group 'gnus-server-visual) - -(defcustom gnus-server-agent-face 'gnus-server-agent-face - "Face name to use on AGENTIZED servers." - :group 'gnus-server-visual - :type 'face) - -(defcustom gnus-server-opened-face 'gnus-server-opened-face - "Face name to use on OPENED servers." - :group 'gnus-server-visual - :type 'face) - -(defcustom gnus-server-closed-face 'gnus-server-closed-face - "Face name to use on CLOSED servers." - :group 'gnus-server-visual - :type 'face) - -(defcustom gnus-server-denied-face 'gnus-server-denied-face - "Face name to use on DENIED servers." - :group 'gnus-server-visual - :type 'face) - -(defvar gnus-server-font-lock-keywords - (list - '("(\\(agent\\))" 1 gnus-server-agent-face) - '("(\\(opened\\))" 1 gnus-server-opened-face) - '("(\\(closed\\))" 1 gnus-server-closed-face) - '("(\\(denied\\))" 1 gnus-server-denied-face))) - -(defun gnus-server-mode () - "Major mode for listing and editing servers. - -All normal editing commands are switched off. -\\ -For more in-depth information on this mode, read the manual -(`\\[gnus-info-find-node]'). - -The following commands are available: - -\\{gnus-server-mode-map}" - (interactive) - (when (gnus-visual-p 'server-menu 'menu) - (gnus-server-make-menu-bar)) - (kill-all-local-variables) - (gnus-simplify-mode-line) - (setq major-mode 'gnus-server-mode) - (setq mode-name "Server") - (gnus-set-default-directory) - (setq mode-line-process nil) - (use-local-map gnus-server-mode-map) - (buffer-disable-undo) - (setq truncate-lines t) - (setq buffer-read-only t) - (if (featurep 'xemacs) - (put 'gnus-server-mode 'font-lock-defaults '(gnus-server-font-lock-keywords t)) - (set (make-local-variable 'font-lock-defaults) - '(gnus-server-font-lock-keywords t))) - (gnus-run-hooks 'gnus-server-mode-hook)) - -(defun gnus-server-insert-server-line (gnus-tmp-name method) - (let* ((gnus-tmp-how (car method)) - (gnus-tmp-where (nth 1 method)) - (elem (assoc method gnus-opened-servers)) - (gnus-tmp-status (cond ((eq (nth 1 elem) 'denied) - "(denied)") - ((or (gnus-server-opened method) - (eq (nth 1 elem) 'ok)) - "(opened)") - (t - "(closed)"))) - (gnus-tmp-agent (if (and gnus-agent - (member method - gnus-agent-covered-methods)) - " (agent)" - ""))) - (beginning-of-line) - (gnus-add-text-properties - (point) - (prog1 (1+ (point)) - ;; Insert the text. - (eval gnus-server-line-format-spec)) - (list 'gnus-server (intern gnus-tmp-name))))) - -(defun gnus-enter-server-buffer () - "Set up the server buffer." - (gnus-server-setup-buffer) - (gnus-configure-windows 'server) - (gnus-server-prepare)) - -(defun gnus-server-setup-buffer () - "Initialize the server buffer." - (unless (get-buffer gnus-server-buffer) - (save-excursion - (set-buffer (gnus-get-buffer-create gnus-server-buffer)) - (gnus-server-mode) - (when gnus-carpal - (gnus-carpal-setup-buffer 'server))))) - -(defun gnus-server-prepare () - (gnus-set-format 'server-mode) - (gnus-set-format 'server t) - (let ((alist gnus-server-alist) - (buffer-read-only nil) - (opened gnus-opened-servers) - done server op-ser) - (erase-buffer) - (setq gnus-inserted-opened-servers nil) - ;; First we do the real list of servers. - (while alist - (unless (member (cdar alist) done) - (push (cdar alist) done) - (cdr (setq server (pop alist))) - (when (and server (car server) (cdr server)) - (gnus-server-insert-server-line (car server) (cdr server)))) - (when (member (cdar alist) done) - (pop alist))) - ;; Then we insert the list of servers that have been opened in - ;; this session. - (while opened - (when (and (not (member (caar opened) done)) - ;; Just ignore ephemeral servers. - (not (member (caar opened) gnus-ephemeral-servers))) - (push (caar opened) done) - (gnus-server-insert-server-line - (setq op-ser (format "%s:%s" (caaar opened) (nth 1 (caar opened)))) - (caar opened)) - (push (list op-ser (caar opened)) gnus-inserted-opened-servers)) - (setq opened (cdr opened)))) - (goto-char (point-min)) - (gnus-server-position-point)) - -(defun gnus-server-server-name () - (let ((server (get-text-property (gnus-point-at-bol) 'gnus-server))) - (and server (symbol-name server)))) - -(defalias 'gnus-server-position-point 'gnus-goto-colon) - -(defconst gnus-server-edit-buffer "*Gnus edit server*") - -(defun gnus-server-update-server (server) - (save-excursion - (set-buffer gnus-server-buffer) - (let* ((buffer-read-only nil) - (entry (assoc server gnus-server-alist)) - (oentry (assoc (gnus-server-to-method server) - gnus-opened-servers))) - (when entry - (gnus-dribble-enter - (concat "(gnus-server-set-info \"" server "\" '" - (prin1-to-string (cdr entry)) ")\n"))) - (when (or entry oentry) - ;; Buffer may be narrowed. - (save-restriction - (widen) - (when (gnus-server-goto-server server) - (gnus-delete-line)) - (if entry - (gnus-server-insert-server-line (car entry) (cdr entry)) - (gnus-server-insert-server-line - (format "%s:%s" (caar oentry) (nth 1 (car oentry))) - (car oentry))) - (gnus-server-position-point)))))) - -(defun gnus-server-set-info (server info) - ;; Enter a select method into the virtual server alist. - (when (and server info) - (gnus-dribble-enter - (concat "(gnus-server-set-info \"" server "\" '" - (prin1-to-string info) ")")) - (let* ((server (nth 1 info)) - (entry (assoc server gnus-server-alist))) - (if entry (setcdr entry info) - (setq gnus-server-alist - (nconc gnus-server-alist (list (cons server info)))))))) - -;;; Interactive server functions. - -(defun gnus-server-kill-server (server) - "Kill the server on the current line." - (interactive (list (gnus-server-server-name))) - (unless (gnus-server-goto-server server) - (if server (error "No such server: %s" server) - (error "No server on the current line"))) - (unless (assoc server gnus-server-alist) - (error "Read-only server %s" server)) - (gnus-dribble-touch) - (let ((buffer-read-only nil)) - (gnus-delete-line)) - (push (assoc server gnus-server-alist) gnus-server-killed-servers) - (setq gnus-server-alist (delq (car gnus-server-killed-servers) - gnus-server-alist)) - (let ((groups (gnus-groups-from-server server))) - (when (and groups - (gnus-yes-or-no-p - (format "Kill all %s groups from this server? " - (length groups)))) - (dolist (group groups) - (setq gnus-newsrc-alist - (delq (assoc group gnus-newsrc-alist) - gnus-newsrc-alist)) - (when gnus-group-change-level-function - (funcall gnus-group-change-level-function - group gnus-level-killed 3))))) - (gnus-server-position-point)) - -(defun gnus-server-yank-server () - "Yank the previously killed server." - (interactive) - (unless gnus-server-killed-servers - (error "No killed servers to be yanked")) - (let ((alist gnus-server-alist) - (server (gnus-server-server-name)) - (killed (car gnus-server-killed-servers))) - (if (not server) - (setq gnus-server-alist (nconc gnus-server-alist (list killed))) - (if (string= server (caar gnus-server-alist)) - (push killed gnus-server-alist) - (while (and (cdr alist) - (not (string= server (caadr alist)))) - (setq alist (cdr alist))) - (if alist - (setcdr alist (cons killed (cdr alist))) - (setq gnus-server-alist (list killed))))) - (gnus-server-update-server (car killed)) - (setq gnus-server-killed-servers (cdr gnus-server-killed-servers)) - (gnus-server-position-point))) - -(defun gnus-server-exit () - "Return to the group buffer." - (interactive) - (gnus-run-hooks 'gnus-server-exit-hook) - (kill-buffer (current-buffer)) - (gnus-configure-windows 'group t)) - -(defun gnus-server-list-servers () - "List all available servers." - (interactive) - (let ((cur (gnus-server-server-name))) - (gnus-server-prepare) - (if cur (gnus-server-goto-server cur) - (goto-char (point-max)) - (forward-line -1)) - (gnus-server-position-point))) - -(defun gnus-server-set-status (method status) - "Make METHOD have STATUS." - (let ((entry (assoc method gnus-opened-servers))) - (if entry - (setcar (cdr entry) status) - (push (list method status) gnus-opened-servers)))) - -(defun gnus-opened-servers-remove (method) - "Remove METHOD from the list of opened servers." - (setq gnus-opened-servers (delq (assoc method gnus-opened-servers) - gnus-opened-servers))) - -(defun gnus-server-open-server (server) - "Force an open of SERVER." - (interactive (list (gnus-server-server-name))) - (let ((method (gnus-server-to-method server))) - (unless method - (error "No such server: %s" server)) - (gnus-server-set-status method 'ok) - (prog1 - (or (gnus-open-server method) - (progn (message "Couldn't open %s" server) nil)) - (gnus-server-update-server server) - (gnus-server-position-point)))) - -(defun gnus-server-open-all-servers () - "Open all servers." - (interactive) - (let ((servers gnus-inserted-opened-servers)) - (while servers - (gnus-server-open-server (car (pop servers)))))) - -(defun gnus-server-close-server (server) - "Close SERVER." - (interactive (list (gnus-server-server-name))) - (let ((method (gnus-server-to-method server))) - (unless method - (error "No such server: %s" server)) - (gnus-server-set-status method 'closed) - (prog1 - (gnus-close-server method) - (gnus-server-update-server server) - (gnus-server-position-point)))) - -(defun gnus-server-close-all-servers () - "Close all servers." - (interactive) - (dolist (server gnus-inserted-opened-servers) - (gnus-server-close-server (car server)))) - -(defun gnus-server-deny-server (server) - "Make sure SERVER will never be attempted opened." - (interactive (list (gnus-server-server-name))) - (let ((method (gnus-server-to-method server))) - (unless method - (error "No such server: %s" server)) - (gnus-server-set-status method 'denied)) - (gnus-server-update-server server) - (gnus-server-position-point) - t) - -(defun gnus-server-remove-denials () - "Make all denied servers into closed servers." - (interactive) - (dolist (server gnus-opened-servers) - (when (eq (nth 1 server) 'denied) - (setcar (nthcdr 1 server) 'closed))) - (gnus-server-list-servers)) - -(defun gnus-server-copy-server (from to) - (interactive - (list - (or (gnus-server-server-name) - (error "No server on the current line")) - (read-string "Copy to: "))) - (unless from - (error "No server on current line")) - (unless (and to (not (string= to ""))) - (error "No name to copy to")) - (when (assoc to gnus-server-alist) - (error "%s already exists" to)) - (unless (gnus-server-to-method from) - (error "%s: no such server" from)) - (let ((to-entry (cons from (gnus-copy-sequence - (gnus-server-to-method from))))) - (setcar to-entry to) - (setcar (nthcdr 2 to-entry) to) - (push to-entry gnus-server-killed-servers) - (gnus-server-yank-server))) - -(defun gnus-server-add-server (how where) - (interactive - (list (intern (completing-read "Server method: " - gnus-valid-select-methods nil t)) - (read-string "Server name: "))) - (when (assq where gnus-server-alist) - (error "Server with that name already defined")) - (push (list where how where) gnus-server-killed-servers) - (gnus-server-yank-server)) - -(defun gnus-server-goto-server (server) - "Jump to a server line." - (interactive - (list (completing-read "Goto server: " gnus-server-alist nil t))) - (let ((to (text-property-any (point-min) (point-max) - 'gnus-server (intern server)))) - (when to - (goto-char to) - (gnus-server-position-point)))) - -(defun gnus-server-edit-server (server) - "Edit the server on the current line." - (interactive (list (gnus-server-server-name))) - (unless server - (error "No server on current line")) - (unless (assoc server gnus-server-alist) - (error "This server can't be edited")) - (let ((info (cdr (assoc server gnus-server-alist)))) - (gnus-close-server info) - (gnus-edit-form - info "Editing the server." - `(lambda (form) - (gnus-server-set-info ,server form) - (gnus-server-list-servers) - (gnus-server-position-point))))) - -(defun gnus-server-scan-server (server) - "Request a scan from the current server." - (interactive (list (gnus-server-server-name))) - (let ((method (gnus-server-to-method server))) - (if (not (gnus-get-function method 'request-scan)) - (error "Server %s can't scan" (car method)) - (gnus-message 3 "Scanning %s..." server) - (gnus-request-scan nil method) - (gnus-message 3 "Scanning %s...done" server)))) - -(defun gnus-server-read-server-in-server-buffer (server) - "Browse a server in server buffer." - (interactive (list (gnus-server-server-name))) - (let (gnus-server-browse-in-group-buffer) - (gnus-server-read-server server))) - -(defun gnus-server-read-server (server) - "Browse a server." - (interactive (list (gnus-server-server-name))) - (let ((buf (current-buffer))) - (prog1 - (gnus-browse-foreign-server server buf) - (save-excursion - (set-buffer buf) - (gnus-server-update-server (gnus-server-server-name)) - (gnus-server-position-point))))) - -(defun gnus-server-pick-server (e) - (interactive "e") - (mouse-set-point e) - (gnus-server-read-server (gnus-server-server-name))) - - -;;; -;;; Browse Server Mode -;;; - -(defvar gnus-browse-menu-hook nil - "*Hook run after the creation of the browse mode menu.") - -(defvar gnus-browse-mode-hook nil) -(defvar gnus-browse-mode-map nil) -(put 'gnus-browse-mode 'mode-class 'special) - -(unless gnus-browse-mode-map - (setq gnus-browse-mode-map (make-keymap)) - (suppress-keymap gnus-browse-mode-map) - - (gnus-define-keys - gnus-browse-mode-map - " " gnus-browse-read-group - "=" gnus-browse-select-group - "n" gnus-browse-next-group - "p" gnus-browse-prev-group - "\177" gnus-browse-prev-group - [delete] gnus-browse-prev-group - "N" gnus-browse-next-group - "P" gnus-browse-prev-group - "\M-n" gnus-browse-next-group - "\M-p" gnus-browse-prev-group - "\r" gnus-browse-select-group - "u" gnus-browse-unsubscribe-current-group - "l" gnus-browse-exit - "L" gnus-browse-exit - "q" gnus-browse-exit - "Q" gnus-browse-exit - "\C-c\C-c" gnus-browse-exit - "?" gnus-browse-describe-briefly - - "\C-c\C-i" gnus-info-find-node - "\C-c\C-b" gnus-bug)) - -(defun gnus-browse-make-menu-bar () - (gnus-turn-off-edit-menu 'browse) - (unless (boundp 'gnus-browse-menu) - (easy-menu-define - gnus-browse-menu gnus-browse-mode-map "" - '("Browse" - ["Subscribe" gnus-browse-unsubscribe-current-group t] - ["Read" gnus-browse-read-group t] - ["Select" gnus-browse-select-group t] - ["Next" gnus-browse-next-group t] - ["Prev" gnus-browse-prev-group t] - ["Exit" gnus-browse-exit t])) - (gnus-run-hooks 'gnus-browse-menu-hook))) - -(defvar gnus-browse-current-method nil) -(defvar gnus-browse-return-buffer nil) - -(defvar gnus-browse-buffer "*Gnus Browse Server*") - -(defun gnus-browse-foreign-server (server &optional return-buffer) - "Browse the server SERVER." - (setq gnus-browse-current-method (gnus-server-to-method server)) - (setq gnus-browse-return-buffer return-buffer) - (let* ((method gnus-browse-current-method) - (orig-select-method gnus-select-method) - (gnus-select-method method) - groups group) - (gnus-message 5 "Connecting to %s..." (nth 1 method)) - (cond - ((not (gnus-check-server method)) - (gnus-message - 1 "Unable to contact server %s: %s" (nth 1 method) - (gnus-status-message method)) - nil) - ((not - (prog2 - (gnus-message 6 "Reading active file...") - (gnus-request-list method) - (gnus-message 6 "Reading active file...done"))) - (gnus-message - 1 "Couldn't request list: %s" (gnus-status-message method)) - nil) - (t - (save-excursion - (set-buffer nntp-server-buffer) - (let ((cur (current-buffer))) - (goto-char (point-min)) - (unless (string= gnus-ignored-newsgroups "") - (delete-matching-lines gnus-ignored-newsgroups)) - (while (not (eobp)) - (ignore-errors - (push (cons - (if (eq (char-after) ?\") - (read cur) - (let ((p (point)) (name "")) - (skip-chars-forward "^ \t\\\\") - (setq name (buffer-substring p (point))) - (while (eq (char-after) ?\\) - (setq p (1+ (point))) - (forward-char 2) - (skip-chars-forward "^ \t\\\\") - (setq name (concat name (buffer-substring - p (point))))) - name)) - (let ((last (read cur))) - (cons (read cur) last))) - groups)) - (forward-line)))) - (setq groups (sort groups - (lambda (l1 l2) - (string< (car l1) (car l2))))) - (if gnus-server-browse-in-group-buffer - (let* ((gnus-select-method orig-select-method) - (gnus-group-listed-groups - (mapcar (lambda (group) - (let ((name - (gnus-group-prefixed-name - (car group) method))) - (gnus-set-active name (cdr group)) - name)) - groups))) - (gnus-configure-windows 'group) - (funcall gnus-group-prepare-function - gnus-level-killed 'ignore 1 'ingore)) - (gnus-get-buffer-create gnus-browse-buffer) - (when gnus-carpal - (gnus-carpal-setup-buffer 'browse)) - (gnus-configure-windows 'browse) - (buffer-disable-undo) - (let ((buffer-read-only nil)) - (erase-buffer)) - (gnus-browse-mode) - (setq mode-line-buffer-identification - (list - (format - "Gnus: %%b {%s:%s}" (car method) (cadr method)))) - (let ((buffer-read-only nil) charset) - (while groups - (setq group (car groups)) - (setq charset (gnus-group-name-charset method group)) - (gnus-add-text-properties - (point) - (prog1 (1+ (point)) - (insert - (format "%c%7d: %s\n" - (let ((level - (let ((gnus-select-method orig-select-method)) - (gnus-group-level - (gnus-group-prefixed-name (car group) - method))))) - (cond - ((<= level gnus-level-subscribed) ? ) - ((<= level gnus-level-unsubscribed) ?U) - ((= level gnus-level-zombie) ?Z) - (t ?K))) - (max 0 (- (1+ (cddr group)) (cadr group))) - (gnus-group-name-decode (car group) charset)))) - (list 'gnus-group (car group))) - (setq groups (cdr groups)))) - (switch-to-buffer (current-buffer))) - (goto-char (point-min)) - (gnus-group-position-point) - (gnus-message 5 "Connecting to %s...done" (nth 1 method)) - t)))) - -(defun gnus-browse-mode () - "Major mode for browsing a foreign server. - -All normal editing commands are switched off. - -\\ -The only things you can do in this buffer is - -1) `\\[gnus-browse-unsubscribe-current-group]' to subscribe to a group. -The group will be inserted into the group buffer upon exit from this -buffer. - -2) `\\[gnus-browse-read-group]' to read a group ephemerally. - -3) `\\[gnus-browse-exit]' to return to the group buffer." - (interactive) - (kill-all-local-variables) - (when (gnus-visual-p 'browse-menu 'menu) - (gnus-browse-make-menu-bar)) - (gnus-simplify-mode-line) - (setq major-mode 'gnus-browse-mode) - (setq mode-name "Browse Server") - (setq mode-line-process nil) - (use-local-map gnus-browse-mode-map) - (buffer-disable-undo) - (setq truncate-lines t) - (gnus-set-default-directory) - (setq buffer-read-only t) - (gnus-run-hooks 'gnus-browse-mode-hook)) - -(defun gnus-browse-read-group (&optional no-article) - "Enter the group at the current line." - (interactive) - (let ((group (gnus-browse-group-name))) - (if (or (not (gnus-get-info group)) - (gnus-ephemeral-group-p group)) - (unless (gnus-group-read-ephemeral-group - (gnus-group-real-name group) gnus-browse-current-method nil - (cons (current-buffer) 'browse)) - (error "Couldn't enter %s" group)) - (unless (gnus-group-read-group nil no-article group) - (error "Couldn't enter %s" group))))) - -(defun gnus-browse-select-group () - "Select the current group." - (interactive) - (gnus-browse-read-group 'no)) - -(defun gnus-browse-next-group (n) - "Go to the next group." - (interactive "p") - (prog1 - (forward-line n) - (gnus-group-position-point))) - -(defun gnus-browse-prev-group (n) - "Go to the next group." - (interactive "p") - (gnus-browse-next-group (- n))) - -(defun gnus-browse-unsubscribe-current-group (arg) - "(Un)subscribe to the next ARG groups." - (interactive "p") - (when (eobp) - (error "No group at current line")) - (let ((ward (if (< arg 0) -1 1)) - (arg (abs arg))) - (while (and (> arg 0) - (not (eobp)) - (gnus-browse-unsubscribe-group) - (zerop (gnus-browse-next-group ward))) - (decf arg)) - (gnus-group-position-point) - (when (/= 0 arg) - (gnus-message 7 "No more newsgroups")) - arg)) - -(defun gnus-browse-group-name () - (save-excursion - (beginning-of-line) - (let ((name (get-text-property (point) 'gnus-group))) - (when (re-search-forward ": \\(.*\\)$" (gnus-point-at-eol) t) - (gnus-group-prefixed-name - (or name - (match-string-no-properties 1)) - gnus-browse-current-method))))) - -(defun gnus-browse-unsubscribe-group () - "Toggle subscription of the current group in the browse buffer." - (let ((sub nil) - (buffer-read-only nil) - group) - (save-excursion - (beginning-of-line) - ;; If this group it killed, then we want to subscribe it. - (unless (eq (char-after) ? ) - (setq sub t)) - (setq group (gnus-browse-group-name)) - ;;;; - ;;(when (and sub - ;; (cadr (gnus-gethash group gnus-newsrc-hashtb))) - ;;(error "Group already subscribed")) - (if sub - (progn - ;; Make sure the group has been properly removed before we - ;; subscribe to it. - (gnus-kill-ephemeral-group group) - (gnus-group-change-level - (list t group gnus-level-default-subscribed - nil nil (if (gnus-server-equal - gnus-browse-current-method "native") - nil - (gnus-method-simplify - gnus-browse-current-method))) - gnus-level-default-subscribed (gnus-group-level group) - (and (car (nth 1 gnus-newsrc-alist)) - (gnus-gethash (car (nth 1 gnus-newsrc-alist)) - gnus-newsrc-hashtb)) - t) - (delete-char 1) - (insert ? )) - (gnus-group-change-level - group gnus-level-unsubscribed gnus-level-default-subscribed) - (delete-char 1) - (insert ?U))) - t)) - -(defun gnus-browse-exit () - "Quit browsing and return to the group buffer." - (interactive) - (when (eq major-mode 'gnus-browse-mode) - (kill-buffer (current-buffer))) - ;; Insert the newly subscribed groups in the group buffer. - (save-excursion - (set-buffer gnus-group-buffer) - (gnus-group-list-groups nil)) - (if gnus-browse-return-buffer - (gnus-configure-windows 'server 'force) - (gnus-configure-windows 'group 'force))) - -(defun gnus-browse-describe-briefly () - "Give a one line description of the group mode commands." - (interactive) - (gnus-message 6 - (substitute-command-keys "\\\\[gnus-group-next-group]:Forward \\[gnus-group-prev-group]:Backward \\[gnus-browse-exit]:Exit \\[gnus-info-find-node]:Run Info \\[gnus-browse-describe-briefly]:This help"))) - -(defun gnus-server-regenerate-server () - "Issue a command to the server to regenerate all its data structures." - (interactive) - (let ((server (gnus-server-server-name))) - (unless server - (error "No server on the current line")) - (condition-case () - (gnus-get-function (gnus-server-to-method server) - 'request-regenerate) - (error - (error "This backend doesn't support regeneration"))) - (gnus-message 5 "Requesting regeneration of %s..." server) - (unless (gnus-open-server server) - (error "Couldn't open server")) - (if (gnus-request-regenerate server) - (gnus-message 5 "Requesting regeneration of %s...done" server) - (gnus-message 5 "Couldn't regenerate %s" server)))) - -(provide 'gnus-srvr) - -;;; gnus-srvr.el ends here diff --git a/lisp/gnus-start.el b/lisp/gnus-start.el deleted file mode 100644 index 85762a9..0000000 --- a/lisp/gnus-start.el +++ /dev/null @@ -1,2882 +0,0 @@ -;;; gnus-start.el --- startup functions for Gnus -;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) -(eval-when-compile (require 'static)) - -(require 'gnus) -(require 'gnus-win) -(require 'gnus-int) -(require 'gnus-spec) -(require 'gnus-range) -(require 'gnus-util) -(require 'message) - -(defcustom gnus-startup-file (nnheader-concat gnus-home-directory ".newsrc") - "Your `.newsrc' file. -`.newsrc-SERVER' will be used instead if that exists." - :group 'gnus-start - :type 'file) - -(defcustom gnus-product-directory - (nnheader-concat gnus-directory (concat "." gnus-product-name)) - "Product depend data files directory." - :group 'gnus-start - :type '(choice directory (const nil))) - -(defcustom gnus-init-file (nnheader-concat gnus-home-directory ".gnus") - "Your Gnus Emacs-Lisp startup file name. -If a file with the `.el' or `.elc' suffixes exists, it will be read instead." - :group 'gnus-start - :type 'file) - -(defcustom gnus-site-init-file - (condition-case nil - (concat (file-name-directory - (directory-file-name installation-directory)) - "site-lisp/gnus-init") - (error nil)) - "The site-wide Gnus Emacs-Lisp startup file name, or nil if none. -If a file with the `.el' or `.elc' suffixes exists, it will be read instead." - :group 'gnus-start - :type '(choice file (const nil))) - -(defcustom gnus-default-subscribed-newsgroups nil - "List of newsgroups to subscribe, when a user runs Gnus the first time. -The value should be a list of strings. -If it is t, Gnus will not do anything special the first time it is -started; it'll just use the normal newsgroups subscription methods." - :group 'gnus-start - :type '(choice (repeat string) (const :tag "Nothing special" t))) - -(defcustom gnus-use-dribble-file t - "*Non-nil means that Gnus will use a dribble file to store user updates. -If Emacs should crash without saving the .newsrc files, complete -information can be restored from the dribble file." - :group 'gnus-dribble-file - :type 'boolean) - -(defcustom gnus-dribble-directory nil - "*The directory where dribble files will be saved. -If this variable is nil, the directory where the .newsrc files are -saved will be used." - :group 'gnus-dribble-file - :type '(choice directory (const nil))) - -(defcustom gnus-check-new-newsgroups 'ask-server - "*Non-nil means that Gnus will run `gnus-find-new-newsgroups' at startup. -This normally finds new newsgroups by comparing the active groups the -servers have already reported with those Gnus already knows, either alive -or killed. - -When any of the following are true, `gnus-find-new-newsgroups' will instead -ask the servers (primary, secondary, and archive servers) to list new -groups since the last time it checked: - 1. This variable is `ask-server'. - 2. This variable is a list of select methods (see below). - 3. `gnus-read-active-file' is nil or `some'. - 4. A prefix argument is given to `gnus-find-new-newsgroups' interactively. - -Thus, if this variable is `ask-server' or a list of select methods or -`gnus-read-active-file' is nil or `some', then the killed list is no -longer necessary, so you could safely set `gnus-save-killed-list' to nil. - -This variable can be a list of select methods which Gnus will query with -the `ask-server' method in addition to the primary, secondary, and archive -servers. - -Eg. - (setq gnus-check-new-newsgroups - '((nntp \"some.server\") (nntp \"other.server\"))) - -If this variable is nil, then you have to tell Gnus explicitly to -check for new newsgroups with \\\\[gnus-find-new-newsgroups]." - :group 'gnus-start - :type '(choice (const :tag "no" nil) - (const :tag "by brute force" t) - (const :tag "ask servers" ask-server) - (repeat :menu-tag "ask additional servers" - :tag "ask additional servers" - :value ((nntp "")) - (sexp :format "%v")))) - -(defcustom gnus-check-bogus-newsgroups nil - "*Non-nil means that Gnus will check and remove bogus newsgroup at startup. -If this variable is nil, then you have to tell Gnus explicitly to -check for bogus newsgroups with \\\\[gnus-group-check-bogus-groups]." - :group 'gnus-start-server - :type 'boolean) - -(defcustom gnus-read-active-file 'some - "*Non-nil means that Gnus will read the entire active file at startup. -If this variable is nil, Gnus will only know about the groups in your -`.newsrc' file. - -If this variable is `some', Gnus will try to only read the relevant -parts of the active file from the server. Not all servers support -this, and it might be quite slow with other servers, but this should -generally be faster than both the t and nil value. - -If you set this variable to nil or `some', you probably still want to -be told about new newsgroups that arrive. To do that, set -`gnus-check-new-newsgroups' to `ask-server'. This may not work -properly with all servers." - :group 'gnus-start-server - :type '(choice (const nil) - (const some) - (const t))) - -(defconst gnus-level-subscribed 5 - "Groups with levels less than or equal to this variable are subscribed.") - -(defconst gnus-level-unsubscribed 7 - "Groups with levels less than or equal to this variable are unsubscribed. -Groups with levels less than `gnus-level-subscribed', which should be -less than this variable, are subscribed.") - -(defconst gnus-level-zombie 8 - "Groups with this level are zombie groups.") - -(defconst gnus-level-killed 9 - "Groups with this level are killed.") - -(defcustom gnus-level-default-subscribed 3 - "*New subscribed groups will be subscribed at this level." - :group 'gnus-group-levels - :type 'integer) - -(defcustom gnus-level-default-unsubscribed 6 - "*New unsubscribed groups will be unsubscribed at this level." - :group 'gnus-group-levels - :type 'integer) - -(defcustom gnus-activate-level (1+ gnus-level-subscribed) - "*Groups higher than this level won't be activated on startup. -Setting this variable to something low might save lots of time when -you have many groups that you aren't interested in." - :group 'gnus-group-levels - :type 'integer) - -(defcustom gnus-activate-foreign-newsgroups 4 - "*If nil, Gnus will not check foreign newsgroups at startup. -If it is non-nil, it should be a number between one and nine. Foreign -newsgroups that have a level lower or equal to this number will be -activated on startup. For instance, if you want to active all -subscribed newsgroups, but not the rest, you'd set this variable to -`gnus-level-subscribed'. - -If you subscribe to lots of newsgroups from different servers, startup -might take a while. By setting this variable to nil, you'll save time, -but you won't be told how many unread articles there are in the -groups." - :group 'gnus-group-levels - :type '(choice integer - (const :tag "none" nil))) - -(defcustom gnus-read-newsrc-file t - "*Non-nil means that Gnus will read the `.newsrc' file. -Gnus always reads its own startup file, which is called -\".newsrc.eld\". The file called \".newsrc\" is in a format that can -be readily understood by other newsreaders. If you don't plan on -using other newsreaders, set this variable to nil to save some time on -entry." - :version "21.1" - :group 'gnus-newsrc - :type 'boolean) - -(defcustom gnus-save-newsrc-file t - "*Non-nil means that Gnus will save the `.newsrc' file. -Gnus always saves its own startup file, which is called -\".newsrc.eld\". The file called \".newsrc\" is in a format that can -be readily understood by other newsreaders. If you don't plan on -using other newsreaders, set this variable to nil to save some time on -exit." - :group 'gnus-newsrc - :type 'boolean) - -(defcustom gnus-save-killed-list t - "*If non-nil, save the list of killed groups to the startup file. -If you set this variable to nil, you'll save both time (when starting -and quitting) and space (both memory and disk), but it will also mean -that Gnus has no record of which groups are new and which are old, so -the automatic new newsgroups subscription methods become meaningless. - -You should always set `gnus-check-new-newsgroups' to `ask-server' or -nil if you set this variable to nil. - -This variable can also be a regexp. In that case, all groups that do -not match this regexp will be removed before saving the list." - :group 'gnus-newsrc - :type 'boolean) - -(defcustom gnus-ignored-newsgroups - (mapconcat 'identity - '("^to\\." ; not "real" groups - "^[0-9. \t]+\\( \\|$\\)" ; all digits in name - "^[\"][]\"[#'()]" ; bogus characters - ) - "\\|") - "*A regexp to match uninteresting newsgroups in the active file. -Any lines in the active file matching this regular expression are -removed from the newsgroup list before anything else is done to it, -thus making them effectively non-existent." - :group 'gnus-group-new - :type 'regexp) - -(defcustom gnus-subscribe-newsgroup-method 'gnus-subscribe-zombies - "*Function(s) called with a group name when new group is detected. -A few pre-made functions are supplied: `gnus-subscribe-randomly' -inserts new groups at the beginning of the list of groups; -`gnus-subscribe-alphabetically' inserts new groups in strict -alphabetic order; `gnus-subscribe-hierarchically' inserts new groups -in hierarchical newsgroup order; `gnus-subscribe-interactively' asks -for your decision; `gnus-subscribe-killed' kills all new groups; -`gnus-subscribe-zombies' will make all new groups into zombies; -`gnus-subscribe-topics' will enter groups into the topics that -claim them." - :group 'gnus-group-new - :type '(radio (function-item gnus-subscribe-randomly) - (function-item gnus-subscribe-alphabetically) - (function-item gnus-subscribe-hierarchically) - (function-item gnus-subscribe-interactively) - (function-item gnus-subscribe-killed) - (function-item gnus-subscribe-zombies) - (function-item gnus-subscribe-topics) - function - (repeat function))) - -(defcustom gnus-subscribe-newsgroup-hooks nil - "*Hooks run after you subscribe to a new group. The hooks will be called -with new group's name as argument." - :group 'gnus-group-new - :type 'hook) - -(defcustom gnus-subscribe-options-newsgroup-method - 'gnus-subscribe-alphabetically - "*Function(s) called to subscribe newsgroups mentioned on \"options -n\" lines. -If, for instance, you want to subscribe to all newsgroups in the -\"no\" and \"alt\" hierarchies, you'd put the following in your -.newsrc file: - -options -n no.all alt.all - -Gnus will the subscribe all new newsgroups in these hierarchies with -the subscription method in this variable." - :group 'gnus-group-new - :type '(radio (function-item gnus-subscribe-randomly) - (function-item gnus-subscribe-alphabetically) - (function-item gnus-subscribe-hierarchically) - (function-item gnus-subscribe-interactively) - (function-item gnus-subscribe-killed) - (function-item gnus-subscribe-zombies) - (function-item gnus-subscribe-topics) - function - (repeat function))) - -(defcustom gnus-subscribe-hierarchical-interactive nil - "*If non-nil, Gnus will offer to subscribe hierarchically. -When a new hierarchy appears, Gnus will ask the user: - -'alt.binaries': Do you want to subscribe to this hierarchy? ([d]ys): - -If the user pressed `d', Gnus will descend the hierarchy, `y' will -subscribe to all newsgroups in the hierarchy and `s' will skip this -hierarchy in its entirety." - :group 'gnus-group-new - :type 'boolean) - -(defcustom gnus-auto-subscribed-groups - "nnml\\|^nnfolder\\|^nnmbox\\|^nnmh\\|^nnbabyl" - "*All new groups that match this regexp will be subscribed automatically. -Note that this variable only deals with new groups. It has no effect -whatsoever on old groups. - -New groups that match this regexp will not be handled by -`gnus-subscribe-newsgroup-method'. Instead, they will -be subscribed using `gnus-subscribe-options-newsgroup-method'." - :group 'gnus-group-new - :type 'regexp) - -(defcustom gnus-options-subscribe nil - "*All new groups matching this regexp will be subscribed unconditionally. -Note that this variable deals only with new newsgroups. This variable -does not affect old newsgroups. - -New groups that match this regexp will not be handled by -`gnus-subscribe-newsgroup-method'. Instead, they will -be subscribed using `gnus-subscribe-options-newsgroup-method'." - :group 'gnus-group-new - :type '(choice regexp - (const :tag "none" nil))) - -(defcustom gnus-options-not-subscribe nil - "*All new groups matching this regexp will be ignored. -Note that this variable deals only with new newsgroups. This variable -does not affect old (already subscribed) newsgroups." - :group 'gnus-group-new - :type '(choice regexp - (const :tag "none" nil))) - -(defcustom gnus-modtime-botch nil - "*Non-nil means .newsrc should be deleted prior to save. -Its use is due to the bogus appearance that .newsrc was modified on -disc." - :group 'gnus-newsrc - :type 'boolean) - -(defcustom gnus-check-bogus-groups-hook nil - "A hook run after removing bogus groups." - :group 'gnus-start-server - :type 'hook) - -(defcustom gnus-startup-hook nil - "A hook called at startup. -This hook is called after Gnus is connected to the NNTP server." - :group 'gnus-start - :type 'hook) - -(defcustom gnus-before-startup-hook nil - "A hook called at before startup. -This hook is called as the first thing when Gnus is started." - :group 'gnus-start - :type 'hook) - -(defcustom gnus-started-hook nil - "A hook called as the last thing after startup." - :group 'gnus-start - :type 'hook) - -(defcustom gnus-setup-news-hook nil - "A hook after reading the .newsrc file, but before generating the buffer." - :group 'gnus-start - :type 'hook) - -(defcustom gnus-get-new-news-hook nil - "A hook run just before Gnus checks for new news." - :group 'gnus-group-new - :type 'hook) - -(defcustom gnus-after-getting-new-news-hook - '(gnus-display-time-event-handler) - "A hook run after Gnus checks for new news when Gnus is already running." - :group 'gnus-group-new - :type 'hook) - -(defcustom gnus-save-newsrc-hook nil - "A hook called before saving any of the newsrc files." - :group 'gnus-newsrc - :type 'hook) - -(defcustom gnus-save-quick-newsrc-hook nil - "A hook called just before saving the quick newsrc file. -Can be used to turn version control on or off." - :group 'gnus-newsrc - :type 'hook) - -(defcustom gnus-save-standard-newsrc-hook nil - "A hook called just before saving the standard newsrc file. -Can be used to turn version control on or off." - :group 'gnus-newsrc - :type 'hook) - -(defcustom gnus-always-read-dribble-file nil - "Unconditionally read the dribble file." - :group 'gnus-newsrc - :type 'boolean) - -(defvar gnus-startup-file-coding-system (static-if (boundp 'MULE) - '*ctext* - 'ctext) - "*Coding system for startup file.") - -(defvar gnus-ding-file-coding-system gnus-startup-file-coding-system - "*Coding system for ding file.") -;; Note that the ding file for T-gnus ought not to have byte-codes. - -;;; Internal variables - -(defvar gnus-newsrc-file-version nil) -(defvar gnus-override-subscribe-method nil) -(defvar gnus-dribble-buffer nil) -(defvar gnus-newsrc-options nil - "Options line in the .newsrc file.") - -(defvar gnus-newsrc-options-n nil - "List of regexps representing groups to be subscribed/ignored unconditionally.") - -(defvar gnus-newsrc-last-checked-date nil - "Date Gnus last asked server for new newsgroups.") - -(defvar gnus-current-startup-file nil - "Startup file for the current host.") - -;; Byte-compiler warning. -(defvar gnus-group-line-format) - -;; Suggested by Brian Edmonds . -(defvar gnus-init-inhibit nil) -(defun gnus-read-init-file (&optional inhibit-next) - ;; Don't load .gnus if the -q option was used. - (when init-file-user - (if gnus-init-inhibit - (setq gnus-init-inhibit nil) - (setq gnus-init-inhibit inhibit-next) - (let ((files (list gnus-site-init-file gnus-init-file)) - file) - (while files - (and (setq file (pop files)) - (or (and (file-exists-p file) - ;; Don't try to load a directory. - (not (file-directory-p file))) - (file-exists-p (concat file ".el")) - (file-exists-p (concat file ".elc"))) - (condition-case var - (load file nil t) - (error - (error "Error in %s: %s" file var))))))))) - -;; For subscribing new newsgroup - -(defun gnus-subscribe-hierarchical-interactive (groups) - (let ((groups (sort groups 'string<)) - prefixes prefix start ans group starts) - (while groups - (setq prefixes (list "^")) - (while (and groups prefixes) - (while (not (string-match (car prefixes) (car groups))) - (setq prefixes (cdr prefixes))) - (setq prefix (car prefixes)) - (setq start (1- (length prefix))) - (if (and (string-match "[^\\.]\\." (car groups) start) - (cdr groups) - (setq prefix - (concat "^" (substring (car groups) 0 (match-end 0)))) - (string-match prefix (cadr groups))) - (progn - (push prefix prefixes) - (message "Descend hierarchy %s? ([y]nsq): " - (substring prefix 1 (1- (length prefix)))) - (while (not (memq (setq ans (read-char-exclusive)) - '(?y ?\n ?\r ?n ?s ?q))) - (ding) - (message "Descend hierarchy %s? ([y]nsq): " - (substring prefix 1 (1- (length prefix))))) - (cond ((= ans ?n) - (while (and groups - (string-match prefix - (setq group (car groups)))) - (push group gnus-killed-list) - (gnus-sethash group group gnus-killed-hashtb) - (setq groups (cdr groups))) - (setq starts (cdr starts))) - ((= ans ?s) - (while (and groups - (string-match prefix - (setq group (car groups)))) - (gnus-sethash group group gnus-killed-hashtb) - (gnus-subscribe-alphabetically (car groups)) - (setq groups (cdr groups))) - (setq starts (cdr starts))) - ((= ans ?q) - (while groups - (setq group (car groups)) - (push group gnus-killed-list) - (gnus-sethash group group gnus-killed-hashtb) - (setq groups (cdr groups)))) - (t nil))) - (message "Subscribe %s? ([n]yq)" (car groups)) - (while (not (memq (setq ans (read-char-exclusive)) - '(?y ?\n ?\r ?q ?n))) - (ding) - (message "Subscribe %s? ([n]yq)" (car groups))) - (setq group (car groups)) - (cond ((= ans ?y) - (gnus-subscribe-alphabetically (car groups)) - (gnus-sethash group group gnus-killed-hashtb)) - ((= ans ?q) - (while groups - (setq group (car groups)) - (push group gnus-killed-list) - (gnus-sethash group group gnus-killed-hashtb) - (setq groups (cdr groups)))) - (t - (push group gnus-killed-list) - (gnus-sethash group group gnus-killed-hashtb))) - (setq groups (cdr groups))))))) - -(defun gnus-subscribe-randomly (newsgroup) - "Subscribe new NEWSGROUP by making it the first newsgroup." - (gnus-subscribe-newsgroup newsgroup)) - -(defun gnus-subscribe-alphabetically (newgroup) - "Subscribe new NEWSGROUP and insert it in alphabetical order." - (let ((groups (cdr gnus-newsrc-alist)) - before) - (while (and (not before) groups) - (if (string< newgroup (caar groups)) - (setq before (caar groups)) - (setq groups (cdr groups)))) - (gnus-subscribe-newsgroup newgroup before))) - -(defun gnus-subscribe-hierarchically (newgroup) - "Subscribe new NEWSGROUP and insert it in hierarchical newsgroup order." - ;; Basic ideas by mike-w@cs.aukuni.ac.nz (Mike Williams) - (save-excursion - (set-buffer (nnheader-find-file-noselect gnus-current-startup-file)) - (prog1 - (let ((groupkey newgroup) before) - (while (and (not before) groupkey) - (goto-char (point-min)) - (let ((groupkey-re - (concat "^\\(" (regexp-quote groupkey) ".*\\)[!:]"))) - (while (and (re-search-forward groupkey-re nil t) - (progn - (setq before (match-string 1)) - (string< before newgroup))))) - ;; Remove tail of newsgroup name (eg. a.b.c -> a.b) - (setq groupkey - (when (string-match "^\\(.*\\)\\.[^.]+$" groupkey) - (substring groupkey (match-beginning 1) (match-end 1))))) - (gnus-subscribe-newsgroup newgroup before)) - (kill-buffer (current-buffer))))) - -(defun gnus-subscribe-interactively (group) - "Subscribe the new GROUP interactively. -It is inserted in hierarchical newsgroup order if subscribed. If not, -it is killed." - (if (gnus-y-or-n-p (format "Subscribe new newsgroup: %s " group)) - (gnus-subscribe-hierarchically group) - (push group gnus-killed-list))) - -(defun gnus-subscribe-zombies (group) - "Make the new GROUP into a zombie group." - (push group gnus-zombie-list)) - -(defun gnus-subscribe-killed (group) - "Make the new GROUP a killed group." - (push group gnus-killed-list)) - -(defun gnus-subscribe-newsgroup (newsgroup &optional next) - "Subscribe new NEWSGROUP. -If NEXT is non-nil, it is inserted before NEXT. Otherwise it is made -the first newsgroup." - (save-excursion - (goto-char (point-min)) - ;; We subscribe the group by changing its level to `subscribed'. - (gnus-group-change-level - newsgroup gnus-level-default-subscribed - gnus-level-killed (gnus-gethash (or next "dummy.group") - gnus-newsrc-hashtb)) - (gnus-message 5 "Subscribe newsgroup: %s" newsgroup) - (run-hook-with-args 'gnus-subscribe-newsgroup-hooks newsgroup) - t)) - -(defun gnus-read-active-file-p () - "Say whether the active file has been read from `gnus-select-method'." - (memq gnus-select-method gnus-have-read-active-file)) - -;;; General various misc type functions. - -;; Silence byte-compiler. -(defvar gnus-current-headers) -(defvar gnus-thread-indent-array) -(defvar gnus-newsgroup-name) -(defvar gnus-newsgroup-headers) -(defvar gnus-group-list-mode) -(defvar gnus-group-mark-positions) -(defvar gnus-newsgroup-data) -(defvar gnus-newsgroup-unreads) -(defvar nnoo-state-alist) -(defvar gnus-current-select-method) - -(defun gnus-clear-quick-file-variables () - "Clear all variables in quick startup files." - (let ((variables gnus-variable-list)) - ;; Clear Gnus variables. - (while variables - (set (car variables) nil) - (setq variables (cdr variables)))) - (let ((files gnus-product-variable-file-list)) - (while files - (let ((variables (nthcdr 3 (car files)))) - (while variables - (set (car variables) nil) - (setq variables (cdr variables)))) - (setq files (cdr files))))) - -(defun gnus-close-all-servers () - "Close all servers." - (interactive) - (dolist (server gnus-opened-servers) - (gnus-close-server (car server)))) - -(defun gnus-clear-system () - "Clear all variables and buffers." - ;; Clear gnus variables. - (gnus-clear-quick-file-variables) - ;; Clear other internal variables. - (setq gnus-list-of-killed-groups nil - gnus-have-read-active-file nil - gnus-newsrc-alist nil - gnus-newsrc-hashtb nil - gnus-killed-list nil - gnus-zombie-list nil - gnus-killed-hashtb nil - gnus-active-hashtb nil - gnus-moderated-hashtb nil - gnus-description-hashtb nil - gnus-current-headers nil - gnus-thread-indent-array nil - gnus-newsgroup-headers nil - gnus-newsgroup-name nil - gnus-server-alist nil - gnus-group-list-mode nil - gnus-opened-servers nil - gnus-group-mark-positions nil - gnus-newsgroup-data nil - gnus-newsgroup-unreads nil - nnoo-state-alist nil - gnus-current-select-method nil - nnmail-split-history nil - gnus-ephemeral-servers nil) - (gnus-shutdown 'gnus) - ;; Kill the startup file. - (and gnus-current-startup-file - (get-file-buffer gnus-current-startup-file) - (kill-buffer (get-file-buffer gnus-current-startup-file))) - ;; Clear the dribble buffer. - (gnus-dribble-clear) - ;; Kill global KILL file buffer. - (when (get-file-buffer (gnus-newsgroup-kill-file nil)) - (kill-buffer (get-file-buffer (gnus-newsgroup-kill-file nil)))) - (gnus-kill-buffer nntp-server-buffer) - ;; Kill Gnus buffers. - (let ((buffers (gnus-buffers))) - (when buffers - (mapcar 'kill-buffer buffers))) - ;; Remove Gnus frames. - (gnus-kill-gnus-frames)) - -(defun gnus-no-server-1 (&optional arg slave) - "Read network news. -If ARG is a positive number, Gnus will use that as the -startup level. If ARG is nil, Gnus will be started at level 2. -If ARG is non-nil and not a positive number, Gnus will -prompt the user for the name of an NNTP server to use. -As opposed to `gnus', this command will not connect to the local server." - (interactive "P") - (let ((val (or arg (1- gnus-level-default-subscribed)))) - (gnus val t slave) - (make-local-variable 'gnus-group-use-permanent-levels) - (setq gnus-group-use-permanent-levels val))) - -(defun gnus-1 (&optional arg dont-connect slave) - "Read network news. -If ARG is non-nil and a positive number, Gnus will use that as the -startup level. If ARG is non-nil and not a positive number, Gnus will -prompt the user for the name of an NNTP server to use." - (interactive "P") - - (if (gnus-alive-p) - (progn - (switch-to-buffer gnus-group-buffer) - (gnus-group-get-new-news - (and (numberp arg) - (> arg 0) - (max (car gnus-group-list-mode) arg)))) - - (gnus-clear-system) - (gnus-splash) - (gnus-run-hooks 'gnus-before-startup-hook) - (nnheader-init-server-buffer) - (setq gnus-slave slave) - (gnus-read-init-file) - - (when gnus-simple-splash - (setq gnus-simple-splash nil) - (cond - ((featurep 'xemacs) - (gnus-xmas-splash)) - ((and window-system - (= (frame-height) (1+ (window-height)))) - (gnus-x-splash)))) - - (let ((level (and (numberp arg) (> arg 0) arg)) - did-connect) - (unwind-protect - (progn - (unless dont-connect - (setq did-connect - (gnus-start-news-server (and arg (not level)))))) - (if (and (not dont-connect) - (not did-connect)) - (gnus-group-quit) - (gnus-run-hooks 'gnus-startup-hook) - ;; NNTP server is successfully open. - - ;; Find the current startup file name. - (setq gnus-current-startup-file - (gnus-make-newsrc-file gnus-startup-file)) - - ;; Read the dribble file. - (when (or gnus-slave gnus-use-dribble-file) - (gnus-dribble-read-file)) - - ;; Allow using GroupLens predictions. - (when gnus-use-grouplens - (bbb-login) - (add-hook 'gnus-summary-mode-hook 'gnus-grouplens-mode)) - - ;; Do the actual startup. - (gnus-setup-news nil level dont-connect) - (gnus-run-hooks 'gnus-setup-news-hook) - (gnus-start-draft-setup) - ;; Generate the group buffer. - (gnus-group-list-groups level) - (gnus-group-first-unread-group) - (gnus-configure-windows 'group) - (gnus-group-set-mode-line) - ;; For reading Info. - (set-language-info "Japanese" 'gnus-info "gnus-ja") - (gnus-run-hooks 'gnus-started-hook)))))) - -(defun gnus-start-draft-setup () - "Make sure the draft group exists." - (gnus-request-create-group "drafts" '(nndraft "")) - (unless (gnus-gethash "nndraft:drafts" gnus-newsrc-hashtb) - (let ((gnus-level-default-subscribed 1)) - (gnus-subscribe-group "nndraft:drafts" nil '(nndraft ""))) - (gnus-group-set-parameter - "nndraft:drafts" 'gnus-dummy '((gnus-draft-mode))))) - -;;;###autoload -(defun gnus-unload () - "Unload all Gnus features. -\(For some value of `all' or `Gnus'.) Currently, features whose names -have prefixes `gnus-', `nn', `mm-' or `rfc' are unloaded. Use -cautiously -- unloading may cause trouble." - (interactive) - (dolist (feature features) - (if (string-match "^\\(gnus-\\|nn\\|mm-\\|rfc\\)" (symbol-name feature)) - (unload-feature feature 'force)))) - - -;;; -;;; Dribble file -;;; - -(defvar gnus-dribble-ignore nil) -(defvar gnus-dribble-eval-file nil) - -(defun gnus-dribble-file-name () - "Return the dribble file for the current .newsrc." - (concat - (if gnus-dribble-directory - (concat (file-name-as-directory gnus-dribble-directory) - (file-name-nondirectory gnus-current-startup-file)) - gnus-current-startup-file) - "-dribble")) - -(defun gnus-dribble-enter (string) - "Enter STRING into the dribble buffer." - (when (and (not gnus-dribble-ignore) - gnus-dribble-buffer - (buffer-name gnus-dribble-buffer)) - (let ((obuf (current-buffer))) - (set-buffer gnus-dribble-buffer) - (goto-char (point-max)) - (insert string "\n") - (set-window-point (get-buffer-window (current-buffer)) (point-max)) - (bury-buffer gnus-dribble-buffer) - (save-excursion - (set-buffer gnus-group-buffer) - (gnus-group-set-mode-line)) - (set-buffer obuf)))) - -(defun gnus-dribble-touch () - "Touch the dribble buffer." - (gnus-dribble-enter "")) - -(defun gnus-dribble-read-file () - "Read the dribble file from disk." - (let ((dribble-file (gnus-dribble-file-name))) - (save-excursion - (set-buffer (setq gnus-dribble-buffer - (gnus-get-buffer-create - (file-name-nondirectory dribble-file)))) - (erase-buffer) - (setq buffer-file-name dribble-file) - (auto-save-mode t) - (buffer-disable-undo) - (bury-buffer (current-buffer)) - (set-buffer-modified-p nil) - (let ((auto (make-auto-save-file-name)) - (gnus-dribble-ignore t) - (purpose nil) - modes) - (when (or (file-exists-p auto) (file-exists-p dribble-file)) - ;; Load whichever file is newest -- the auto save file - ;; or the "real" file. - (if (file-newer-than-file-p auto dribble-file) - (nnheader-insert-file-contents auto) - (nnheader-insert-file-contents dribble-file)) - (unless (zerop (buffer-size)) - (set-buffer-modified-p t)) - ;; Set the file modes to reflect the .newsrc file modes. - (save-buffer) - (when (and (file-exists-p gnus-current-startup-file) - (file-exists-p dribble-file) - (setq modes (file-modes gnus-current-startup-file))) - (set-file-modes dribble-file modes)) - (goto-char (point-min)) - (when (search-forward "Gnus was exited on purpose" nil t) - (setq purpose t)) - ;; Possibly eval the file later. - (when (or gnus-always-read-dribble-file - (gnus-y-or-n-p - (if purpose - "Gnus exited on purpose without saving; read auto-save file anyway? " - "Gnus auto-save file exists. Do you want to read it? "))) - (setq gnus-dribble-eval-file t))))))) - -(defun gnus-dribble-eval-file () - (when gnus-dribble-eval-file - (setq gnus-dribble-eval-file nil) - (save-excursion - (let ((gnus-dribble-ignore t)) - (set-buffer gnus-dribble-buffer) - (eval-buffer (current-buffer)))))) - -(defun gnus-dribble-delete-file () - (when (file-exists-p (gnus-dribble-file-name)) - (delete-file (gnus-dribble-file-name))) - (when gnus-dribble-buffer - (save-excursion - (set-buffer gnus-dribble-buffer) - (let ((auto (make-auto-save-file-name))) - (when (file-exists-p auto) - (delete-file auto)) - (erase-buffer) - (set-buffer-modified-p nil))))) - -(defun gnus-dribble-save () - (when (and gnus-dribble-buffer - (buffer-name gnus-dribble-buffer)) - (save-excursion - (set-buffer gnus-dribble-buffer) - (save-buffer)))) - -(defun gnus-dribble-clear () - (when (gnus-buffer-exists-p gnus-dribble-buffer) - (save-excursion - (set-buffer gnus-dribble-buffer) - (erase-buffer) - (set-buffer-modified-p nil) - (setq buffer-saved-size (buffer-size))))) - - -;;; -;;; Active & Newsrc File Handling -;;; - -(defun gnus-setup-news (&optional rawfile level dont-connect) - "Setup news information. -If RAWFILE is non-nil, the .newsrc file will also be read. -If LEVEL is non-nil, the news will be set up at level LEVEL." - (require 'nnmail) - (let ((init (not (and gnus-newsrc-alist gnus-active-hashtb (not rawfile)))) - ;; Binding this variable will inhibit multiple fetchings - ;; of the same mail source. - (nnmail-fetched-sources (list t))) - - (when init - ;; Clear some variables to re-initialize news information. - (setq gnus-newsrc-alist nil - gnus-active-hashtb nil) - ;; Read the newsrc file and create `gnus-newsrc-hashtb'. - (gnus-read-newsrc-file rawfile)) - - ;; Make sure the archive server is available to all and sundry. - (when gnus-message-archive-method - (unless (assoc "archive" gnus-server-alist) - (push `("archive" - (nnfolder - "archive" - (nnfolder-directory - ,(nnheader-concat message-directory "archive")) - (nnfolder-active-file - ,(nnheader-concat message-directory "archive/active")) - (nnfolder-get-new-mail nil) - (nnfolder-inhibit-expiry t))) - gnus-server-alist))) - - ;; If we don't read the complete active file, we fill in the - ;; hashtb here. - (when (or (null gnus-read-active-file) - (eq gnus-read-active-file 'some)) - (gnus-update-active-hashtb-from-killed)) - - ;; Read the active file and create `gnus-active-hashtb'. - ;; If `gnus-read-active-file' is nil, then we just create an empty - ;; hash table. The partial filling out of the hash table will be - ;; done in `gnus-get-unread-articles'. - (and gnus-read-active-file - (not level) - (gnus-read-active-file nil dont-connect)) - - (unless gnus-active-hashtb - (setq gnus-active-hashtb (gnus-make-hashtable 4096))) - - ;; Initialize the cache. - (when gnus-use-cache - (gnus-cache-open)) - - ;; Possibly eval the dribble file. - (and init - (or gnus-use-dribble-file gnus-slave) - (gnus-dribble-eval-file)) - - ;; Slave Gnusii should then clear the dribble buffer. - (when (and init gnus-slave) - (gnus-dribble-clear)) - - (gnus-update-format-specifications) - - ;; See whether we need to read the description file. - (when (and (boundp 'gnus-group-line-format) - (stringp gnus-group-line-format) - (let ((case-fold-search nil)) - (string-match "%[-,0-9]*D" gnus-group-line-format)) - (not gnus-description-hashtb) - (not dont-connect) - gnus-read-active-file) - (gnus-read-all-descriptions-files)) - - ;; Find new newsgroups and treat them. - (when (and init gnus-check-new-newsgroups (not level) - (gnus-check-server gnus-select-method) - (not gnus-slave) - gnus-plugged) - (gnus-find-new-newsgroups)) - - ;; Check and remove bogus newsgroups. - (when (and init gnus-check-bogus-newsgroups - gnus-read-active-file (not level) - (gnus-server-opened gnus-select-method)) - (gnus-check-bogus-newsgroups)) - - ;; We might read in new NoCeM messages here. - (when (and gnus-use-nocem - (not level) - (not dont-connect)) - (gnus-nocem-scan-groups)) - - ;; Read any slave files. - (gnus-master-read-slave-newsrc) - - ;; Find the number of unread articles in each non-dead group. - (let ((gnus-read-active-file (and (not level) gnus-read-active-file))) - (gnus-get-unread-articles level)))) - -(defun gnus-call-subscribe-functions (method group) - "Call METHOD to subscribe GROUP. -If no function returns `non-nil', call `gnus-subscribe-zombies'." - (unless (cond - ((gnus-functionp method) - (funcall method group)) - ((listp method) - (catch 'found - (dolist (func method) - (if (funcall func group) - (throw 'found t))) - nil)) - (t nil)) - (gnus-subscribe-zombies group))) - -(defun gnus-find-new-newsgroups (&optional arg) - "Search for new newsgroups and add them. -Each new newsgroup will be treated with `gnus-subscribe-newsgroup-method'. -The `-n' option line from .newsrc is respected. - -With 1 C-u, use the `ask-server' method to query the server for new -groups. -With 2 C-u's, use most complete method possible to query the server -for new groups, and subscribe the new groups as zombies." - (interactive "p") - (let* ((gnus-subscribe-newsgroup-method - gnus-subscribe-newsgroup-method) - (check (cond - ((or (and (= (or arg 1) 4) - (not (listp gnus-check-new-newsgroups))) - (null gnus-read-active-file) - (eq gnus-read-active-file 'some)) - 'ask-server) - ((= (or arg 1) 16) - (setq gnus-subscribe-newsgroup-method - 'gnus-subscribe-zombies) - t) - (t gnus-check-new-newsgroups)))) - (unless (gnus-check-first-time-used) - (if (or (consp check) - (eq check 'ask-server)) - ;; Ask the server for new groups. - (gnus-ask-server-for-new-groups) - ;; Go through the active hashtb and look for new groups. - (let ((groups 0) - group new-newsgroups) - (gnus-message 5 "Looking for new newsgroups...") - (unless gnus-have-read-active-file - (gnus-read-active-file)) - (setq gnus-newsrc-last-checked-date (message-make-date)) - (unless gnus-killed-hashtb - (gnus-make-hashtable-from-killed)) - ;; Go though every newsgroup in `gnus-active-hashtb' and compare - ;; with `gnus-newsrc-hashtb' and `gnus-killed-hashtb'. - (mapatoms - (lambda (sym) - (if (or (null (setq group (symbol-name sym))) - (not (boundp sym)) - (null (symbol-value sym)) - (gnus-gethash group gnus-killed-hashtb) - (gnus-gethash group gnus-newsrc-hashtb)) - () - (let ((do-sub (gnus-matches-options-n group))) - (cond - ((eq do-sub 'subscribe) - (setq groups (1+ groups)) - (gnus-sethash group group gnus-killed-hashtb) - (gnus-call-subscribe-functions - gnus-subscribe-options-newsgroup-method group)) - ((eq do-sub 'ignore) - nil) - (t - (setq groups (1+ groups)) - (gnus-sethash group group gnus-killed-hashtb) - (if gnus-subscribe-hierarchical-interactive - (push group new-newsgroups) - (gnus-call-subscribe-functions - gnus-subscribe-newsgroup-method group))))))) - gnus-active-hashtb) - (when new-newsgroups - (gnus-subscribe-hierarchical-interactive new-newsgroups)) - (if (> groups 0) - (gnus-message 5 "%d new newsgroup%s arrived." - groups (if (> groups 1) "s have" " has")) - (gnus-message 5 "No new newsgroups."))))))) - -(defun gnus-matches-options-n (group) - ;; Returns `subscribe' if the group is to be unconditionally - ;; subscribed, `ignore' if it is to be ignored, and nil if there is - ;; no match for the group. - - ;; First we check the two user variables. - (cond - ((and gnus-options-subscribe - (string-match gnus-options-subscribe group)) - 'subscribe) - ((and gnus-auto-subscribed-groups - (string-match gnus-auto-subscribed-groups group)) - 'subscribe) - ((and gnus-options-not-subscribe - (string-match gnus-options-not-subscribe group)) - 'ignore) - ;; Then we go through the list that was retrieved from the .newsrc - ;; file. This list has elements on the form - ;; `(REGEXP . {ignore,subscribe})'. The first match found (the list - ;; is in the reverse order of the options line) is returned. - (t - (let ((regs gnus-newsrc-options-n)) - (while (and regs - (not (string-match (caar regs) group))) - (setq regs (cdr regs))) - (and regs (cdar regs)))))) - -(defun gnus-ask-server-for-new-groups () - (let* ((new-date (message-make-date)) - (date (or gnus-newsrc-last-checked-date new-date)) - (methods (cons gnus-select-method - (nconc - (when (gnus-archive-server-wanted-p) - (list "archive")) - (append - (and (consp gnus-check-new-newsgroups) - gnus-check-new-newsgroups) - gnus-secondary-select-methods)))) - (groups 0) - group new-newsgroups got-new method hashtb - gnus-override-subscribe-method) - (unless gnus-killed-hashtb - (gnus-make-hashtable-from-killed)) - ;; Go through both primary and secondary select methods and - ;; request new newsgroups. - (while (setq method (gnus-server-get-method nil (pop methods))) - (setq new-newsgroups nil - gnus-override-subscribe-method method) - (when (and (gnus-check-server method) - (gnus-request-newgroups date method)) - (save-excursion - (setq got-new t - hashtb (gnus-make-hashtable 100)) - (set-buffer nntp-server-buffer) - ;; Enter all the new groups into a hashtable. - (gnus-active-to-gnus-format method hashtb 'ignore)) - ;; Now all new groups from `method' are in `hashtb'. - (mapatoms - (lambda (group-sym) - (if (or (null (setq group (symbol-name group-sym))) - (not (boundp group-sym)) - (null (symbol-value group-sym)) - (gnus-gethash group gnus-newsrc-hashtb) - (member group gnus-zombie-list) - (member group gnus-killed-list)) - ;; The group is already known. - () - ;; Make this group active. - (when (symbol-value group-sym) - (gnus-set-active group (symbol-value group-sym))) - ;; Check whether we want it or not. - (let ((do-sub (gnus-matches-options-n group))) - (cond - ((eq do-sub 'subscribe) - (incf groups) - (gnus-sethash group group gnus-killed-hashtb) - (gnus-call-subscribe-functions - gnus-subscribe-options-newsgroup-method group)) - ((eq do-sub 'ignore) - nil) - (t - (incf groups) - (gnus-sethash group group gnus-killed-hashtb) - (if gnus-subscribe-hierarchical-interactive - (push group new-newsgroups) - (gnus-call-subscribe-functions - gnus-subscribe-newsgroup-method group))))))) - hashtb)) - (when new-newsgroups - (gnus-subscribe-hierarchical-interactive new-newsgroups))) - (if (> groups 0) - (gnus-message 5 "%d new newsgroup%s arrived" - groups (if (> groups 1) "s have" " has")) - (gnus-message 5 "No new newsgroups")) - (when got-new - (setq gnus-newsrc-last-checked-date new-date)) - got-new)) - -(defun gnus-check-first-time-used () - (catch 'ended - ;; First check if any of the following files exist. If they do, - ;; it's not the first time the user has used Gnus. - (dolist (file (list gnus-current-startup-file - (concat gnus-current-startup-file ".el") - (concat gnus-current-startup-file ".eld") - gnus-startup-file - (concat gnus-startup-file ".el") - (concat gnus-startup-file ".eld"))) - (when (file-exists-p file) - (throw 'ended nil))) - (gnus-message 6 "First time user; subscribing you to default groups") - (unless (gnus-read-active-file-p) - (let ((gnus-read-active-file t)) - (gnus-read-active-file))) - (setq gnus-newsrc-last-checked-date (message-make-date)) - ;; Subscribe to the default newsgroups. - (let ((groups (or gnus-default-subscribed-newsgroups - gnus-backup-default-subscribed-newsgroups)) - group) - (if (eq groups t) - ;; If t, we subscribe (or not) all groups as if they were new. - (mapatoms - (lambda (sym) - (when (setq group (symbol-name sym)) - (let ((do-sub (gnus-matches-options-n group))) - (cond - ((eq do-sub 'subscribe) - (gnus-sethash group group gnus-killed-hashtb) - (gnus-call-subscribe-functions - gnus-subscribe-options-newsgroup-method group)) - ((eq do-sub 'ignore) - nil) - (t - (push group gnus-killed-list)))))) - gnus-active-hashtb) - (dolist (group groups) - ;; Only subscribe the default groups that are activated. - (when (gnus-active group) - (gnus-group-change-level - group gnus-level-default-subscribed gnus-level-killed))) - (save-excursion - (set-buffer gnus-group-buffer) - (gnus-group-make-help-group)) - (when gnus-novice-user - (gnus-message 7 "`A k' to list killed groups")))))) - -(defun gnus-subscribe-group (group &optional previous method) - "Subcribe GROUP and put it after PREVIOUS." - (gnus-group-change-level - (if method - (list t group gnus-level-default-subscribed nil nil method) - group) - gnus-level-default-subscribed gnus-level-killed previous t) - t) - -;; `gnus-group-change-level' is the fundamental function for changing -;; subscription levels of newsgroups. This might mean just changing -;; from level 1 to 2, which is pretty trivial, from 2 to 6 or back -;; again, which subscribes/unsubscribes a group, which is equally -;; trivial. Changing from 1-7 to 8-9 means that you kill a group, and -;; from 8-9 to 1-7 means that you remove the group from the list of -;; killed (or zombie) groups and add them to the (kinda) subscribed -;; groups. And last but not least, moving from 8 to 9 and 9 to 8, -;; which is trivial. -;; ENTRY can either be a string (newsgroup name) or a list (if -;; FROMKILLED is t, it's a list on the format (NUM INFO-LIST), -;; otherwise it's a list in the format of the `gnus-newsrc-hashtb' -;; entries. -;; LEVEL is the new level of the group, OLDLEVEL is the old level and -;; PREVIOUS is the group (in hashtb entry format) to insert this group -;; after. -(defun gnus-group-change-level (entry level &optional oldlevel - previous fromkilled) - (let (group info active num) - ;; Glean what info we can from the arguments - (if (consp entry) - (if fromkilled (setq group (nth 1 entry)) - (setq group (car (nth 2 entry)))) - (setq group entry)) - (when (and (stringp entry) - oldlevel - (< oldlevel gnus-level-zombie)) - (setq entry (gnus-gethash entry gnus-newsrc-hashtb))) - (if (and (not oldlevel) - (consp entry)) - (setq oldlevel (gnus-info-level (nth 2 entry))) - (setq oldlevel (or oldlevel gnus-level-killed))) - (when (stringp previous) - (setq previous (gnus-gethash previous gnus-newsrc-hashtb))) - - (if (and (>= oldlevel gnus-level-zombie) - (gnus-gethash group gnus-newsrc-hashtb)) - ;; We are trying to subscribe a group that is already - ;; subscribed. - () ; Do nothing. - - (unless (gnus-ephemeral-group-p group) - (gnus-dribble-enter - (format "(gnus-group-change-level %S %S %S %S %S)" - group level oldlevel (car (nth 2 previous)) fromkilled))) - - ;; Then we remove the newgroup from any old structures, if needed. - ;; If the group was killed, we remove it from the killed or zombie - ;; list. If not, and it is in fact going to be killed, we remove - ;; it from the newsrc hash table and assoc. - (cond - ((>= oldlevel gnus-level-zombie) - ;; oldlevel could be wrong. - (setq gnus-zombie-list (delete group gnus-zombie-list)) - (setq gnus-killed-list (delete group gnus-killed-list))) - (t - (when (and (>= level gnus-level-zombie) - entry) - (gnus-sethash (car (nth 2 entry)) nil gnus-newsrc-hashtb) - (when (nth 3 entry) - (setcdr (gnus-gethash (car (nth 3 entry)) - gnus-newsrc-hashtb) - (cdr entry))) - (setcdr (cdr entry) (cdddr entry))))) - - ;; Finally we enter (if needed) the list where it is supposed to - ;; go, and change the subscription level. If it is to be killed, - ;; we enter it into the killed or zombie list. - (cond - ((>= level gnus-level-zombie) - ;; Remove from the hash table. - (gnus-sethash group nil gnus-newsrc-hashtb) - ;; We do not enter foreign groups into the list of dead - ;; groups. - (unless (gnus-group-foreign-p group) - (if (= level gnus-level-zombie) - (push group gnus-zombie-list) - (if (= oldlevel gnus-level-killed) - ;; Remove from active hashtb. - (unintern group gnus-active-hashtb) - ;; Don't add it into killed-list if it was killed. - (push group gnus-killed-list))))) - (t - ;; If the list is to be entered into the newsrc assoc, and - ;; it was killed, we have to create an entry in the newsrc - ;; hashtb format and fix the pointers in the newsrc assoc. - (if (< oldlevel gnus-level-zombie) - ;; It was alive, and it is going to stay alive, so we - ;; just change the level and don't change any pointers or - ;; hash table entries. - (setcar (cdaddr entry) level) - (if (listp entry) - (setq info (cdr entry) - num (car entry)) - (setq active (gnus-active group)) - (setq num - (if active (- (1+ (cdr active)) (car active)) t)) - ;; Shorten the select method if possible, if we need to - ;; store it at all (native groups). - (let ((method (gnus-method-simplify - (or gnus-override-subscribe-method - (gnus-group-method group))))) - (if method - (setq info (list group level nil nil method)) - (setq info (list group level nil))))) - (unless previous - (setq previous - (let ((p gnus-newsrc-alist)) - (while (cddr p) - (setq p (cdr p))) - p))) - (setq entry (cons info (cddr previous))) - (if (cdr previous) - (progn - (setcdr (cdr previous) entry) - (gnus-sethash group (cons num (cdr previous)) - gnus-newsrc-hashtb)) - (setcdr previous entry) - (gnus-sethash group (cons num previous) - gnus-newsrc-hashtb)) - (when (cdr entry) - (setcdr (gnus-gethash (caadr entry) gnus-newsrc-hashtb) entry)) - (gnus-dribble-enter - (format - "(gnus-group-set-info '%S)" info))))) - (when gnus-group-change-level-function - (funcall gnus-group-change-level-function - group level oldlevel previous))))) - -(defun gnus-kill-newsgroup (newsgroup) - "Obsolete function. Kills a newsgroup." - (gnus-group-change-level - (gnus-gethash newsgroup gnus-newsrc-hashtb) gnus-level-killed)) - -(defun gnus-check-bogus-newsgroups (&optional confirm) - "Remove bogus newsgroups. -If CONFIRM is non-nil, the user has to confirm the deletion of every -newsgroup." - (let ((newsrc (cdr gnus-newsrc-alist)) - bogus group entry info) - (gnus-message 5 "Checking bogus newsgroups...") - (unless (gnus-read-active-file-p) - (gnus-read-active-file t)) - (when (gnus-read-active-file-p) - ;; Find all bogus newsgroup that are subscribed. - (while newsrc - (setq info (pop newsrc) - group (gnus-info-group info)) - (unless (or (gnus-active group) ; Active - (and (gnus-info-method info) - (not (gnus-secondary-method-p - (gnus-info-method info))))) ; Foreign - ;; Found a bogus newsgroup. - (push group bogus))) - (if confirm - (map-y-or-n-p - "Remove bogus group %s? " - (lambda (group) - ;; Remove all bogus subscribed groups by first killing them, and - ;; then removing them from the list of killed groups. - (when (setq entry (gnus-gethash group gnus-newsrc-hashtb)) - (gnus-group-change-level entry gnus-level-killed) - (setq gnus-killed-list (delete group gnus-killed-list)))) - bogus '("group" "groups" "remove")) - (while (setq group (pop bogus)) - ;; Remove all bogus subscribed groups by first killing them, and - ;; then removing them from the list of killed groups. - (when (setq entry (gnus-gethash group gnus-newsrc-hashtb)) - (gnus-group-change-level entry gnus-level-killed) - (setq gnus-killed-list (delete group gnus-killed-list))))) - ;; Then we remove all bogus groups from the list of killed and - ;; zombie groups. They are removed without confirmation. - (let ((dead-lists '(gnus-killed-list gnus-zombie-list)) - killed) - (while dead-lists - (setq killed (symbol-value (car dead-lists))) - (while killed - (unless (gnus-active (setq group (pop killed))) - ;; The group is bogus. - ;; !!!Slow as hell. - (set (car dead-lists) - (delete group (symbol-value (car dead-lists)))))) - (setq dead-lists (cdr dead-lists)))) - (gnus-run-hooks 'gnus-check-bogus-groups-hook) - (gnus-message 5 "Checking bogus newsgroups...done")))) - -(defun gnus-check-duplicate-killed-groups () - "Remove duplicates from the list of killed groups." - (interactive) - (let ((killed gnus-killed-list)) - (while killed - (gnus-message 9 "%d" (length killed)) - (setcdr killed (delete (car killed) (cdr killed))) - (setq killed (cdr killed))))) - -;; We want to inline a function from gnus-cache, so we cheat here: -(eval-when-compile - (defvar gnus-cache-active-hashtb) - (defun gnus-cache-possibly-alter-active (group active) - "Alter the ACTIVE info for GROUP to reflect the articles in the cache." - (when gnus-cache-active-hashtb - (let ((cache-active (gnus-gethash group gnus-cache-active-hashtb))) - (when cache-active - (when (< (car cache-active) (car active)) - (setcar active (car cache-active))) - (when (> (cdr cache-active) (cdr active)) - (setcdr active (cdr cache-active)))))))) - -(defun gnus-activate-group (group &optional scan dont-check method) - ;; Check whether a group has been activated or not. - ;; If SCAN, request a scan of that group as well. - (let ((method (or method (inline (gnus-find-method-for-group group)))) - active) - (and (inline (gnus-check-server method)) - ;; We escape all bugs and quit here to make it possible to - ;; continue if a group is so out-there that it reports bugs - ;; and stuff. - (progn - (and scan - (gnus-check-backend-function 'request-scan (car method)) - (gnus-request-scan group method)) - t) - (condition-case () - (inline (gnus-request-group group dont-check method)) - ;;(error nil) - (quit - (message "Quit activating %s" group) - nil)) - (unless dont-check - (setq active (gnus-parse-active)) - ;; If there are no articles in the group, the GROUP - ;; command may have responded with the `(0 . 0)'. We - ;; ignore this if we already have an active entry - ;; for the group. - (if (and (zerop (car active)) - (zerop (cdr active)) - (gnus-active group)) - (gnus-active group) - (gnus-set-active group active) - ;; Return the new active info. - active))))) - -(defun gnus-get-unread-articles-in-group (info active &optional update) - (when active - ;; Allow the backend to update the info in the group. - (when (and update - (gnus-request-update-info - info (inline (gnus-find-method-for-group - (gnus-info-group info))))) - (gnus-activate-group (gnus-info-group info) nil t)) - - (let* ((range (gnus-info-read info)) - (num 0)) - ;; If a cache is present, we may have to alter the active info. - (when (and gnus-use-cache info) - (inline (gnus-cache-possibly-alter-active - (gnus-info-group info) active))) - ;; Modify the list of read articles according to what articles - ;; are available; then tally the unread articles and add the - ;; number to the group hash table entry. - (cond - ((zerop (cdr active)) - (setq num 0)) - ((not range) - (setq num (- (1+ (cdr active)) (car active)))) - ((not (listp (cdr range))) - ;; Fix a single (num . num) range according to the - ;; active hash table. - ;; Fix by Carsten Bormann . - (and (< (cdr range) (car active)) (setcdr range (1- (car active)))) - (and (> (cdr range) (cdr active)) (setcdr range (cdr active))) - ;; Compute number of unread articles. - (setq num (max 0 (- (cdr active) (- (1+ (cdr range)) (car range)))))) - (t - ;; The read list is a list of ranges. Fix them according to - ;; the active hash table. - ;; First peel off any elements that are below the lower - ;; active limit. - (while (and (cdr range) - (>= (car active) - (or (and (atom (cadr range)) (cadr range)) - (caadr range)))) - (if (numberp (car range)) - (setcar range - (cons (car range) - (or (and (numberp (cadr range)) - (cadr range)) - (cdadr range)))) - (setcdr (car range) - (or (and (numberp (nth 1 range)) (nth 1 range)) - (cdadr range)))) - (setcdr range (cddr range))) - ;; Adjust the first element to be the same as the lower limit. - (when (and (not (atom (car range))) - (< (cdar range) (car active))) - (setcdr (car range) (1- (car active)))) - ;; Then we want to peel off any elements that are higher - ;; than the upper active limit. - (let ((srange range)) - ;; Go past all valid elements. - (while (and (cdr srange) - (<= (or (and (atom (cadr srange)) - (cadr srange)) - (caadr srange)) - (cdr active))) - (setq srange (cdr srange))) - (when (cdr srange) - ;; Nuke all remaining invalid elements. - (setcdr srange nil)) - - ;; Adjust the final element. - (when (and (not (atom (car srange))) - (> (cdar srange) (cdr active))) - (setcdr (car srange) (cdr active)))) - ;; Compute the number of unread articles. - (while range - (setq num (+ num (- (1+ (or (and (atom (car range)) (car range)) - (cdar range))) - (or (and (atom (car range)) (car range)) - (caar range))))) - (setq range (cdr range))) - (setq num (max 0 (- (cdr active) num))))) - ;; Set the number of unread articles. - (when info - (setcar (gnus-gethash (gnus-info-group info) gnus-newsrc-hashtb) num)) - num))) - -;; Go though `gnus-newsrc-alist' and compare with `gnus-active-hashtb' -;; and compute how many unread articles there are in each group. -(defun gnus-get-unread-articles (&optional level) - (let* ((newsrc (cdr gnus-newsrc-alist)) - (level (or level gnus-activate-level (1+ gnus-level-subscribed))) - (foreign-level - (min - (cond ((and gnus-activate-foreign-newsgroups - (not (numberp gnus-activate-foreign-newsgroups))) - (1+ gnus-level-subscribed)) - ((numberp gnus-activate-foreign-newsgroups) - gnus-activate-foreign-newsgroups) - (t 0)) - level)) - scanned-methods info group active method retrieve-groups) - (gnus-message 5 "Checking new news...") - - (while newsrc - (setq active (gnus-active (setq group (gnus-info-group - (setq info (pop newsrc)))))) - - ;; Check newsgroups. If the user doesn't want to check them, or - ;; they can't be checked (for instance, if the news server can't - ;; be reached) we just set the number of unread articles in this - ;; newsgroup to t. This means that Gnus thinks that there are - ;; unread articles, but it has no idea how many. - - ;; To be more explicit: - ;; >0 for an active group with messages - ;; 0 for an active group with no unread messages - ;; nil for non-foreign groups that the user has requested not be checked - ;; t for unchecked foreign groups or bogus groups, or groups that can't - ;; be checked, for one reason or other. - (if (and (setq method (gnus-info-method info)) - (not (inline - (gnus-server-equal - gnus-select-method - (setq method (gnus-server-get-method nil method))))) - (not (gnus-secondary-method-p method))) - ;; These groups are foreign. Check the level. - (when (and (<= (gnus-info-level info) foreign-level) - (setq active (gnus-activate-group group 'scan))) - ;; Let the Gnus agent save the active file. - (when (and gnus-agent gnus-plugged active) - (gnus-agent-save-group-info - method (gnus-group-real-name group) active)) - (unless (inline (gnus-virtual-group-p group)) - (inline (gnus-close-group group))) - (when (fboundp (intern (concat (symbol-name (car method)) - "-request-update-info"))) - (inline (gnus-request-update-info info method)))) - ;; These groups are native or secondary. - (cond - ;; We don't want these groups. - ((> (gnus-info-level info) level) - (setq active 'ignore)) - ;; Activate groups. - ((not gnus-read-active-file) - (if (gnus-check-backend-function 'retrieve-groups group) - ;; if server support gnus-retrieve-groups we push - ;; the group onto retrievegroups for later checking - (if (assoc method retrieve-groups) - (setcdr (assoc method retrieve-groups) - (cons group (cdr (assoc method retrieve-groups)))) - (push (list method group) retrieve-groups)) - ;; hack: `nnmail-get-new-mail' changes the mail-source depending - ;; on the group, so we must perform a scan for every group - ;; if the users has any directory mail sources. - ;; hack: if `nnmail-scan-directory-mail-source-once' is non-nil, - ;; for it scan all spool files even when the groups are - ;; not required. - (if (and - (or nnmail-scan-directory-mail-source-once - (null (assq 'directory - (or mail-sources - (if (listp nnmail-spool-file) - nnmail-spool-file - (list nnmail-spool-file)))))) - (member method scanned-methods)) - (setq active (gnus-activate-group group)) - (setq active (gnus-activate-group group 'scan)) - (push method scanned-methods)) - (when active - (gnus-close-group group)))))) - - ;; Get the number of unread articles in the group. - (cond - ((eq active 'ignore) - ;; Don't do anything. - ) - (active - (inline (gnus-get-unread-articles-in-group info active t))) - (t - ;; The group couldn't be reached, so we nix out the number of - ;; unread articles and stuff. - (gnus-set-active group nil) - (let ((tmp (gnus-gethash group gnus-newsrc-hashtb))) - (when tmp - (setcar tmp t)))))) - - ;; iterate through groups on methods which support gnus-retrieve-groups - ;; and fetch a partial active file and use it to find new news. - (dolist (rg retrieve-groups) - (let ((method (or (car rg) gnus-select-method)) - (groups (cdr rg))) - (when (gnus-check-server method) - ;; Request that the backend scan its incoming messages. - (when (gnus-check-backend-function 'request-scan (car method)) - (gnus-request-scan nil method)) - (gnus-read-active-file-2 - (mapcar (lambda (group) (gnus-group-real-name group)) groups) - method) - (dolist (group groups) - (cond - ((setq active (gnus-active (gnus-info-group - (setq info (gnus-get-info group))))) - (inline (gnus-get-unread-articles-in-group info active t))) - (t - ;; The group couldn't be reached, so we nix out the number of - ;; unread articles and stuff. - (gnus-set-active group nil) - (setcar (gnus-gethash group gnus-newsrc-hashtb) t))))))) - - (gnus-message 5 "Checking new news...done"))) - -;; Create a hash table out of the newsrc alist. The `car's of the -;; alist elements are used as keys. -(defun gnus-make-hashtable-from-newsrc-alist () - (let ((alist gnus-newsrc-alist) - (ohashtb gnus-newsrc-hashtb) - prev) - (setq gnus-newsrc-hashtb (gnus-make-hashtable (length alist))) - (setq alist - (setq prev (setq gnus-newsrc-alist - (if (equal (caar gnus-newsrc-alist) - "dummy.group") - gnus-newsrc-alist - (cons (list "dummy.group" 0 nil) alist))))) - (while alist - (gnus-sethash - (caar alist) - ;; Preserve number of unread articles in groups. - (cons (and ohashtb (car (gnus-gethash (caar alist) ohashtb))) - prev) - gnus-newsrc-hashtb) - (setq prev alist - alist (cdr alist))))) - -(defun gnus-make-hashtable-from-killed () - "Create a hash table from the killed and zombie lists." - (let ((lists '(gnus-killed-list gnus-zombie-list)) - list) - (setq gnus-killed-hashtb - (gnus-make-hashtable - (+ (length gnus-killed-list) (length gnus-zombie-list)))) - (while lists - (setq list (symbol-value (pop lists))) - (while list - (gnus-sethash (car list) (pop list) gnus-killed-hashtb))))) - -(defun gnus-parse-active () - "Parse active info in the nntp server buffer." - (save-excursion - (set-buffer nntp-server-buffer) - (goto-char (point-min)) - ;; Parse the result we got from `gnus-request-group'. - (when (looking-at "[0-9]+ [0-9]+ \\([0-9]+\\) [0-9]+") - (goto-char (match-beginning 1)) - (cons (read (current-buffer)) - (read (current-buffer)))))) - -(defun gnus-make-articles-unread (group articles) - "Mark ARTICLES in GROUP as unread." - (let* ((info (nth 2 (or (gnus-gethash group gnus-newsrc-hashtb) - (gnus-gethash (gnus-group-real-name group) - gnus-newsrc-hashtb)))) - (ranges (gnus-info-read info)) - news article) - (while articles - (when (gnus-member-of-range - (setq article (pop articles)) ranges) - (push article news))) - (when news - (gnus-info-set-read - info (gnus-remove-from-range (gnus-info-read info) (nreverse news))) - (gnus-group-update-group group t)))) - -;; Enter all dead groups into the hashtb. -(defun gnus-update-active-hashtb-from-killed () - (let ((hashtb (setq gnus-active-hashtb (gnus-make-hashtable 4096))) - (lists (list gnus-killed-list gnus-zombie-list)) - killed) - (while lists - (setq killed (car lists)) - (while killed - (gnus-sethash (car killed) nil hashtb) - (setq killed (cdr killed))) - (setq lists (cdr lists))))) - -(defun gnus-get-killed-groups () - "Go through the active hashtb and mark all unknown groups as killed." - ;; First make sure active file has been read. - (unless (gnus-read-active-file-p) - (let ((gnus-read-active-file t)) - (gnus-read-active-file))) - (unless gnus-killed-hashtb - (gnus-make-hashtable-from-killed)) - ;; Go through all newsgroups that are known to Gnus - enlarge kill list. - (mapatoms - (lambda (sym) - (let ((groups 0) - (group (symbol-name sym))) - (if (or (null group) - (gnus-gethash group gnus-killed-hashtb) - (gnus-gethash group gnus-newsrc-hashtb)) - () - (let ((do-sub (gnus-matches-options-n group))) - (if (or (eq do-sub 'subscribe) (eq do-sub 'ignore)) - () - (setq groups (1+ groups)) - (push group gnus-killed-list) - (gnus-sethash group group gnus-killed-hashtb)))))) - gnus-active-hashtb) - (gnus-dribble-touch)) - -;; Get the active file(s) from the backend(s). -(defun gnus-read-active-file (&optional force not-native) - (gnus-group-set-mode-line) - (let ((methods - (mapcar - (lambda (m) (if (stringp m) (gnus-server-get-method nil m) m)) - (append - (if (and (not not-native) - (gnus-check-server gnus-select-method)) - ;; The native server is available. - (cons gnus-select-method gnus-secondary-select-methods) - ;; The native server is down, so we just do the - ;; secondary ones. - gnus-secondary-select-methods) - ;; Also read from the archive server. - (when (gnus-archive-server-wanted-p) - (list "archive"))))) - method) - (setq gnus-have-read-active-file nil) - (save-excursion - (set-buffer nntp-server-buffer) - (while (setq method (pop methods)) - ;; Only do each method once, in case the methods appear more - ;; than once in this list. - (unless (member method methods) - (condition-case () - (gnus-read-active-file-1 method force) - ;; We catch C-g so that we can continue past servers - ;; that do not respond. - (quit - (message "Quit reading the active file") - nil))))))) - -(defun gnus-read-active-file-1 (method force) - (let (where mesg) - (setq where (nth 1 method) - mesg (format "Reading active file%s via %s..." - (if (and where (not (zerop (length where)))) - (concat " from " where) "") - (car method))) - (gnus-message 5 mesg) - (when (gnus-check-server method) - ;; Request that the backend scan its incoming messages. - (when (gnus-check-backend-function 'request-scan (car method)) - (gnus-request-scan nil method)) - (cond - ((and (eq gnus-read-active-file 'some) - (gnus-check-backend-function 'retrieve-groups (car method)) - (not force)) - (let ((newsrc (cdr gnus-newsrc-alist)) - (gmethod (gnus-server-get-method nil method)) - groups info) - (while (setq info (pop newsrc)) - (when (inline - (gnus-server-equal - (inline - (gnus-find-method-for-group - (gnus-info-group info) info)) - gmethod)) - (push (gnus-group-real-name (gnus-info-group info)) - groups))) - (gnus-read-active-file-2 groups method))) - ((null method) - t) - (t - (if (not (gnus-request-list method)) - (unless (equal method gnus-message-archive-method) - (gnus-error 1 "Cannot read active file from %s server" - (car method))) - (gnus-message 5 mesg) - (gnus-active-to-gnus-format method gnus-active-hashtb nil t) - ;; We mark this active file as read. - (push method gnus-have-read-active-file) - (gnus-message 5 "%sdone" mesg))))))) - -(defun gnus-read-active-file-2 (groups method) - "Read an active file for GROUPS in METHOD using gnus-retrieve-groups." - (when groups - (save-excursion - (set-buffer nntp-server-buffer) - (gnus-check-server method) - (let ((list-type (gnus-retrieve-groups groups method))) - (cond ((not list-type) - (gnus-error - 1.2 "Cannot read partial active file from %s server." - (car method))) - ((eq list-type 'active) - (gnus-active-to-gnus-format method gnus-active-hashtb nil t)) - (t - (gnus-groups-to-gnus-format method gnus-active-hashtb t))))))) - -;; Read an active file and place the results in `gnus-active-hashtb'. -(defun gnus-active-to-gnus-format (&optional method hashtb ignore-errors - real-active) - (unless method - (setq method gnus-select-method)) - (let ((cur (current-buffer)) - (hashtb (or hashtb - (if (and gnus-active-hashtb - (not (equal method gnus-select-method))) - gnus-active-hashtb - (setq gnus-active-hashtb - (if (equal method gnus-select-method) - (gnus-make-hashtable - (count-lines (point-min) (point-max))) - (gnus-make-hashtable 4096))))))) - ;; Delete unnecessary lines. - (goto-char (point-min)) - (cond - ((string= gnus-ignored-newsgroups "") - (delete-matching-lines "^to\\.")) - (t - (delete-matching-lines (concat "^to\\.\\|" gnus-ignored-newsgroups)))) - - (goto-char (point-min)) - (unless (re-search-forward "[\\\"]" nil t) - ;; Make the group names readable as a lisp expression even if they - ;; contain special characters. - (goto-char (point-max)) - (while (re-search-backward "[][';?()#]" nil t) - (insert ?\\))) - - ;; Let the Gnus agent save the active file. - (when (and gnus-agent real-active gnus-plugged) - (gnus-agent-save-active method)) - - ;; If these are groups from a foreign select method, we insert the - ;; group prefix in front of the group names. - (when (not (gnus-server-equal - (gnus-server-get-method nil method) - (gnus-server-get-method nil gnus-select-method))) - (let ((prefix (gnus-group-prefixed-name "" method))) - (goto-char (point-min)) - (while (and (not (eobp)) - (progn - (when (= (following-char) ?\") - (forward-char 1)) - (insert prefix) - (zerop (forward-line 1))))))) - ;; Store the active file in a hash table. - (goto-char (point-min)) - (let (group max min) - (while (not (eobp)) - (condition-case err - (progn - (narrow-to-region (point) (gnus-point-at-eol)) - ;; group gets set to a symbol interned in the hash table - ;; (what a hack!!) - jwz - (setq group (let ((obarray hashtb)) (read cur))) - ;; ### The extended group name scheme makes - ;; the previous optimization strategy sort of pointless... - (when (stringp group) - (setq group (intern group hashtb))) - (if (and (numberp (setq max (read cur))) - (numberp (setq min (read cur))) - (progn - (skip-chars-forward " \t") - (not - (or (eq (char-after) ?=) - (eq (char-after) ?x) - (eq (char-after) ?j))))) - (progn - (set group (cons min max)) - ;; if group is moderated, stick in moderation table - (when (eq (char-after) ?m) - (unless gnus-moderated-hashtb - (setq gnus-moderated-hashtb (gnus-make-hashtable))) - (gnus-sethash (symbol-name group) t - gnus-moderated-hashtb))) - (set group nil))) - (error - (and group - (symbolp group) - (set group nil)) - (unless ignore-errors - (gnus-message 3 "Warning - invalid active: %s" - (buffer-substring - (gnus-point-at-bol) (gnus-point-at-eol)))))) - (widen) - (forward-line 1))))) - -(defun gnus-groups-to-gnus-format (method &optional hashtb real-active) - ;; Parse a "groups" active file. - (let ((cur (current-buffer)) - (hashtb (or hashtb - (if (and method gnus-active-hashtb) - gnus-active-hashtb - (setq gnus-active-hashtb - (gnus-make-hashtable - (count-lines (point-min) (point-max))))))) - (prefix (and method - (not (gnus-server-equal - (gnus-server-get-method nil method) - (gnus-server-get-method nil gnus-select-method))) - (gnus-group-prefixed-name "" method)))) - - ;; Let the Gnus agent save the active file. - (if (and gnus-agent - real-active - gnus-plugged - (gnus-agent-method-p method)) - (progn - (gnus-agent-save-groups method) - (gnus-active-to-gnus-format method hashtb nil real-active)) - - (goto-char (point-min)) - ;; We split this into to separate loops, one with the prefix - ;; and one without to speed the reading up somewhat. - (if prefix - (let (min max opoint group) - (while (not (eobp)) - (condition-case () - (progn - (read cur) (read cur) - (setq min (read cur) - max (read cur) - opoint (point)) - (skip-chars-forward " \t") - (insert prefix) - (goto-char opoint) - (set (let ((obarray hashtb)) (read cur)) - (cons min max))) - (error (and group (symbolp group) (set group nil)))) - (forward-line 1))) - (let (min max group) - (while (not (eobp)) - (condition-case () - (when (eq (char-after) ?2) - (read cur) (read cur) - (setq min (read cur) - max (read cur)) - (set (setq group (let ((obarray hashtb)) (read cur))) - (cons min max))) - (error (and group (symbolp group) (set group nil)))) - (forward-line 1))))))) - -(defun gnus-read-newsrc-file (&optional force) - "Read startup file. -If FORCE is non-nil, the .newsrc file is read." - ;; Reset variables that might be defined in the .newsrc.eld file. - (gnus-clear-quick-file-variables) - (let* ((newsrc-file gnus-current-startup-file) - (quick-file (concat newsrc-file ".el"))) - (save-excursion - ;; We always load the .newsrc.eld file. If always contains - ;; much information that can not be gotten from the .newsrc - ;; file (ticked articles, killed groups, foreign methods, etc.) - (gnus-read-newsrc-el-file quick-file) - - (when (and gnus-read-newsrc-file - (file-exists-p gnus-current-startup-file) - (or force - (and (file-newer-than-file-p newsrc-file quick-file) - (file-newer-than-file-p newsrc-file - (concat quick-file "d"))) - (not gnus-newsrc-alist))) - ;; We read the .newsrc file. Note that if there if a - ;; .newsrc.eld file exists, it has already been read, and - ;; the `gnus-newsrc-hashtb' has been created. While reading - ;; the .newsrc file, Gnus will only use the information it - ;; can find there for changing the data already read - - ;; i. e., reading the .newsrc file will not trash the data - ;; already read (except for read articles). - (save-excursion - (gnus-message 5 "Reading %s..." newsrc-file) - (set-buffer (nnheader-find-file-noselect newsrc-file)) - (buffer-disable-undo) - (gnus-newsrc-to-gnus-format) - (kill-buffer (current-buffer)) - (gnus-message 5 "Reading %s...done" newsrc-file)))))) - -(defun gnus-read-newsrc-el-file (file) - (let ((ding-file (concat file "d"))) - ;; We always, always read the .eld file. - (gnus-message 5 "Reading %s..." ding-file) - (let (gnus-newsrc-assoc) - (when (file-exists-p ding-file) - (with-temp-buffer - (condition-case nil - (progn - (insert-file-contents-as-coding-system - gnus-ding-file-coding-system ding-file) - (eval-region (point-min) (point-max))) - (error - (ding) - (or (not (or (zerop (buffer-size)) - (eq 'binary gnus-startup-file-coding-system) - (gnus-re-read-newsrc-el-file ding-file))) - (gnus-yes-or-no-p - (format "Error in %s; continue? " ding-file)) - (error "Error in %s" ding-file))))) - (when gnus-newsrc-assoc - (setq gnus-newsrc-alist gnus-newsrc-assoc)))) - (gnus-make-hashtable-from-newsrc-alist) - (when (file-newer-than-file-p file ding-file) - ;; Old format quick file - (gnus-message 5 "Reading %s..." file) - ;; The .el file is newer than the .eld file, so we read that one - ;; as well. - (gnus-read-old-newsrc-el-file file))) - (when (and gnus-product-directory - (file-directory-p gnus-product-directory)) - (let ((list gnus-product-variable-file-list)) - (while list - (apply 'gnus-product-read-variable-file-1 (car list)) - (setq list (cdr list)))))) - -(defun gnus-re-read-newsrc-el-file (file) - "Attempt to re-read .newsrc.eld file. Returns `nil' if successful. -The backup file \".newsrc.eld_\" will be created before re-reading." - (message "Error in %s; retrying..." file) - (if (and - (condition-case nil - (let ((backup (concat file "_"))) - (copy-file file backup 'ok-if-already-exists 'keep-time) - (message " (The backup file %s has been created)" backup) - t) - (error nil)) - (progn - (insert-file-contents-as-binary file nil nil nil 'replace) - (when (re-search-forward - "^[\t ]*([\t\n\r ]*setq[\t\n\r ]+gnus-format-specs" nil t) - (delete-region (goto-char (match-beginning 0)) (forward-list 1)) - (decode-coding-region (point-min) (point-max) - gnus-startup-file-coding-system) - (condition-case nil - (progn - (eval-region (point-min) (point-max)) - t) - (error nil))))) - (prog1 - nil - (message "Error in %s; retrying...done" file)) - (message "Error in %s; retrying...failed" file) - t)) - -(defun gnus-product-read-variable-file-1 (file checking-methods coding - &rest variables) - (let (error gnus-product-file-version method file-ver) - (when (or - (condition-case err - (let ((coding-system-for-read coding) - (input-coding-system coding)) - (load (expand-file-name file gnus-product-directory) t nil t) - nil) - (error - (message "%s" err) - (setq error t))) - (and (assq 'emacs-version checking-methods) - (not (string= emacs-version - (cdr (assq 'emacs-version - gnus-product-file-version))))) - (and (setq method (assq 'product-version checking-methods)) - (or (not (setq file-ver - (cdr (assq 'product-version - gnus-product-file-version)))) - (< (product-version-compare file-ver (cadr method)) 0)))) - (unless error - (message "\"%s\" seems to have mismatched contents, updating..." - file)) - (while variables - (set (car variables) nil) - (gnus-product-variable-touch (car variables)) - (setq variables (cdr variables)))))) - -;; Parse the old-style quick startup file -(defun gnus-read-old-newsrc-el-file (file) - (let (newsrc killed marked group m info) - (prog1 - (let ((gnus-killed-assoc nil) - gnus-marked-assoc gnus-newsrc-alist gnus-newsrc-assoc) - (prog1 - (ignore-errors - (load file t t t)) - (setq newsrc gnus-newsrc-assoc - killed gnus-killed-assoc - marked gnus-marked-assoc))) - (setq gnus-newsrc-alist nil) - (while (setq group (pop newsrc)) - (if (setq info (gnus-get-info (car group))) - (progn - (gnus-info-set-read info (cddr group)) - (gnus-info-set-level - info (if (nth 1 group) gnus-level-default-subscribed - gnus-level-default-unsubscribed)) - (push info gnus-newsrc-alist)) - (push (setq info - (list (car group) - (if (nth 1 group) gnus-level-default-subscribed - gnus-level-default-unsubscribed) - (cddr group))) - gnus-newsrc-alist)) - ;; Copy marks into info. - (when (setq m (assoc (car group) marked)) - (unless (nthcdr 3 info) - (nconc info (list nil))) - (gnus-info-set-marks - info (list (cons 'tick (gnus-compress-sequence - (sort (cdr m) '<) t)))))) - (setq newsrc killed) - (while newsrc - (setcar newsrc (caar newsrc)) - (setq newsrc (cdr newsrc))) - (setq gnus-killed-list killed)) - ;; The .el file version of this variable does not begin with - ;; "options", while the .eld version does, so we just add it if it - ;; isn't there. - (when - gnus-newsrc-options - (when (not (string-match "^ *options" gnus-newsrc-options)) - (setq gnus-newsrc-options (concat "options " gnus-newsrc-options))) - (when (not (string-match "\n$" gnus-newsrc-options)) - (setq gnus-newsrc-options (concat gnus-newsrc-options "\n"))) - ;; Finally, if we read some options lines, we parse them. - (unless (string= gnus-newsrc-options "") - (gnus-newsrc-parse-options gnus-newsrc-options))) - - (setq gnus-newsrc-alist (nreverse gnus-newsrc-alist)) - (gnus-make-hashtable-from-newsrc-alist))) - -(defun gnus-make-newsrc-file (file) - "Make server dependent file name by catenating FILE and server host name." - (let* ((file (expand-file-name file nil)) - (real-file (concat file "-" (nth 1 gnus-select-method)))) - (if (or (file-exists-p real-file) - (file-exists-p (concat real-file ".el")) - (file-exists-p (concat real-file ".eld"))) - real-file - file))) - -(defun gnus-newsrc-to-gnus-format () - (setq gnus-newsrc-options "") - (setq gnus-newsrc-options-n nil) - - (unless gnus-active-hashtb - (setq gnus-active-hashtb (gnus-make-hashtable 4096))) - (let ((buf (current-buffer)) - (already-read (> (length gnus-newsrc-alist) 1)) - group subscribed options-symbol newsrc Options-symbol - symbol reads num1) - (goto-char (point-min)) - ;; We intern the symbol `options' in the active hashtb so that we - ;; can `eq' against it later. - (set (setq options-symbol (intern "options" gnus-active-hashtb)) nil) - (set (setq Options-symbol (intern "Options" gnus-active-hashtb)) nil) - - (while (not (eobp)) - ;; We first read the first word on the line by narrowing and - ;; then reading into `gnus-active-hashtb'. Most groups will - ;; already exist in that hashtb, so this will save some string - ;; space. - (narrow-to-region - (point) - (progn (skip-chars-forward "^ \t!:\n") (point))) - (goto-char (point-min)) - (setq symbol - (and (/= (point-min) (point-max)) - (let ((obarray gnus-active-hashtb)) (read buf)))) - (widen) - ;; Now, the symbol we have read is either `options' or a group - ;; name. If it is an options line, we just add it to a string. - (cond - ((or (eq symbol options-symbol) - (eq symbol Options-symbol)) - (setq gnus-newsrc-options - ;; This concating is quite inefficient, but since our - ;; thorough studies show that approx 99.37% of all - ;; .newsrc files only contain a single options line, we - ;; don't give a damn, frankly, my dear. - (concat gnus-newsrc-options - (buffer-substring - (gnus-point-at-bol) - ;; Options may continue on the next line. - (or (and (re-search-forward "^[^ \t]" nil 'move) - (progn (beginning-of-line) (point))) - (point))))) - (forward-line -1)) - (symbol - ;; Group names can be just numbers. - (when (numberp symbol) - (setq symbol (intern (int-to-string symbol) gnus-active-hashtb))) - (unless (boundp symbol) - (set symbol nil)) - ;; It was a group name. - (setq subscribed (eq (char-after) ?:) - group (symbol-name symbol) - reads nil) - (if (eolp) - ;; If the line ends here, this is clearly a buggy line, so - ;; we put point a the beginning of line and let the cond - ;; below do the error handling. - (beginning-of-line) - ;; We skip to the beginning of the ranges. - (skip-chars-forward "!: \t")) - ;; We are now at the beginning of the list of read articles. - ;; We read them range by range. - (while - (cond - ((looking-at "[0-9]+") - ;; We narrow and read a number instead of buffer-substring/ - ;; string-to-int because it's faster. narrow/widen is - ;; faster than save-restriction/narrow, and save-restriction - ;; produces a garbage object. - (setq num1 (progn - (narrow-to-region (match-beginning 0) (match-end 0)) - (read buf))) - (widen) - ;; If the next character is a dash, then this is a range. - (if (eq (char-after) ?-) - (progn - ;; We read the upper bound of the range. - (forward-char 1) - (if (not (looking-at "[0-9]+")) - ;; This is a buggy line, by we pretend that - ;; it's kinda OK. Perhaps the user should be - ;; dinged? - (push num1 reads) - (push - (cons num1 - (progn - (narrow-to-region (match-beginning 0) - (match-end 0)) - (read buf))) - reads) - (widen))) - ;; It was just a simple number, so we add it to the - ;; list of ranges. - (push num1 reads)) - ;; If the next char in ?\n, then we have reached the end - ;; of the line and return nil. - (not (eq (char-after) ?\n))) - ((eq (char-after) ?\n) - ;; End of line, so we end. - nil) - (t - ;; Not numbers and not eol, so this might be a buggy - ;; line... - (unless (eobp) - ;; If it was eob instead of ?\n, we allow it. - ;; The line was buggy. - (setq group nil) - (gnus-error 3.1 "Mangled line: %s" - (buffer-substring (gnus-point-at-bol) - (gnus-point-at-eol)))) - nil)) - ;; Skip past ", ". Spaces are invalid in these ranges, but - ;; we allow them, because it's a common mistake to put a - ;; space after the comma. - (skip-chars-forward ", ")) - - ;; We have already read .newsrc.eld, so we gently update the - ;; data in the hash table with the information we have just - ;; read. - (when group - (let ((info (gnus-get-info group)) - level) - (if info - ;; There is an entry for this file in the alist. - (progn - (gnus-info-set-read info (nreverse reads)) - ;; We update the level very gently. In fact, we - ;; only change it if there's been a status change - ;; from subscribed to unsubscribed, or vice versa. - (setq level (gnus-info-level info)) - (cond ((and (<= level gnus-level-subscribed) - (not subscribed)) - (setq level (if reads - gnus-level-default-unsubscribed - (1+ gnus-level-default-unsubscribed)))) - ((and (> level gnus-level-subscribed) subscribed) - (setq level gnus-level-default-subscribed))) - (gnus-info-set-level info level)) - ;; This is a new group. - (setq info (list group - (if subscribed - gnus-level-default-subscribed - (if reads - (1+ gnus-level-subscribed) - gnus-level-default-unsubscribed)) - (nreverse reads)))) - (push info newsrc))))) - (forward-line 1)) - - (setq newsrc (nreverse newsrc)) - - (if (not already-read) - () - ;; We now have two newsrc lists - `newsrc', which is what we - ;; have read from .newsrc, and `gnus-newsrc-alist', which is - ;; what we've read from .newsrc.eld. We have to merge these - ;; lists. We do this by "attaching" any (foreign) groups in the - ;; gnus-newsrc-alist to the (native) group that precedes them. - (let ((rc (cdr gnus-newsrc-alist)) - (prev gnus-newsrc-alist) - entry mentry) - (while rc - (or (null (nth 4 (car rc))) ; It's a native group. - (assoc (caar rc) newsrc) ; It's already in the alist. - (if (setq entry (assoc (caar prev) newsrc)) - (setcdr (setq mentry (memq entry newsrc)) - (cons (car rc) (cdr mentry))) - (push (car rc) newsrc))) - (setq prev rc - rc (cdr rc))))) - - (setq gnus-newsrc-alist newsrc) - ;; We make the newsrc hashtb. - (gnus-make-hashtable-from-newsrc-alist) - - ;; Finally, if we read some options lines, we parse them. - (unless (string= gnus-newsrc-options "") - (gnus-newsrc-parse-options gnus-newsrc-options)))) - -;; Parse options lines to find "options -n !all rec.all" and stuff. -;; The return value will be a list on the form -;; ((regexp1 . ignore) -;; (regexp2 . subscribe)...) -;; When handling new newsgroups, groups that match a `ignore' regexp -;; will be ignored, and groups that match a `subscribe' regexp will be -;; subscribed. A line like -;; options -n !all rec.all -;; will lead to a list that looks like -;; (("^rec\\..+" . subscribe) -;; ("^.+" . ignore)) -;; So all "rec.*" groups will be subscribed, while all the other -;; groups will be ignored. Note that "options -n !all rec.all" is very -;; different from "options -n rec.all !all". -(defun gnus-newsrc-parse-options (options) - (let (out eol) - (save-excursion - (gnus-set-work-buffer) - (insert (regexp-quote options)) - ;; First we treat all continuation lines. - (goto-char (point-min)) - (while (re-search-forward "\n[ \t]+" nil t) - (replace-match " " t t)) - ;; Then we transform all "all"s into ".+"s. - (goto-char (point-min)) - (while (re-search-forward "\\ball\\b" nil t) - (replace-match ".+" t t)) - (goto-char (point-min)) - ;; We remove all other options than the "-n" ones. - (while (re-search-forward "[ \t]-[^n][^-]*" nil t) - (replace-match " ") - (forward-char -1)) - (goto-char (point-min)) - - ;; We are only interested in "options -n" lines - we - ;; ignore the other option lines. - (while (re-search-forward "[ \t]-n" nil t) - (setq eol - (or (save-excursion - (and (re-search-forward "[ \t]-n" (gnus-point-at-eol) t) - (- (point) 2))) - (gnus-point-at-eol))) - ;; Search for all "words"... - (while (re-search-forward "[^ \t,\n]+" eol t) - (if (eq (char-after (match-beginning 0)) ?!) - ;; If the word begins with a bang (!), this is a "not" - ;; spec. We put this spec (minus the bang) and the - ;; symbol `ignore' into the list. - (push (cons (concat - "^" (buffer-substring - (1+ (match-beginning 0)) - (match-end 0)) - "\\($\\|\\.\\)") - 'ignore) - out) - ;; There was no bang, so this is a "yes" spec. - (push (cons (concat "^" (match-string 0) "\\($\\|\\.\\)") - 'subscribe) - out)))) - - (setq gnus-newsrc-options-n out)))) - -(defun gnus-save-newsrc-file (&optional force) - "Save .newsrc file." - ;; Note: We cannot save .newsrc file if all newsgroups are removed - ;; from the variable gnus-newsrc-alist. - (when (and (or gnus-newsrc-alist gnus-killed-list) - gnus-current-startup-file) - (save-excursion - (if (and (or gnus-use-dribble-file gnus-slave) - (not force) - (or (not gnus-dribble-buffer) - (not (buffer-name gnus-dribble-buffer)) - (zerop (save-excursion - (set-buffer gnus-dribble-buffer) - (buffer-size))))) - (gnus-message 4 "(No changes need to be saved)") - (gnus-run-hooks 'gnus-save-newsrc-hook) - (if gnus-slave - (gnus-slave-save-newsrc) - ;; Save .newsrc. - (when gnus-save-newsrc-file - (gnus-message 8 "Saving %s..." gnus-current-startup-file) - (gnus-gnus-to-newsrc-format) - (gnus-message 8 "Saving %s...done" gnus-current-startup-file)) - ;; Save .newsrc.eld. - (set-buffer (gnus-get-buffer-create " *Gnus-newsrc*")) - (make-local-variable 'version-control) - (setq version-control 'never) - (setq buffer-file-name - (concat gnus-current-startup-file ".eld")) - (setq default-directory (file-name-directory buffer-file-name)) - (buffer-disable-undo) - (erase-buffer) - (gnus-message 5 "Saving %s.eld..." gnus-current-startup-file) - (gnus-gnus-to-quick-newsrc-format) - (gnus-run-hooks 'gnus-save-quick-newsrc-hook) - (save-buffer-as-coding-system gnus-ding-file-coding-system) - (kill-buffer (current-buffer)) - (gnus-message - 5 "Saving %s.eld...done" gnus-current-startup-file)) - (gnus-dribble-delete-file) - (gnus-group-set-mode-line)))) - (when gnus-product-directory - (gnus-product-save-variable-file))) - -;; Call the function above at C-x C-c. -(defadvice save-buffers-kill-emacs (before save-gnus-newsrc-file-maybe - activate preactivate) - "Save .newsrc and .newsrc.eld when Emacs is killed." - (when (gnus-alive-p) - (gnus-run-hooks 'gnus-exit-gnus-hook) - (gnus-offer-save-summaries) - (gnus-save-newsrc-file))) - -(defun gnus-gnus-to-quick-newsrc-format () - "Insert Gnus variables such as gnus-newsrc-alist in lisp format." - (let ((print-quoted t) - (print-escape-newlines t)) - - (insert ";; -*- emacs-lisp -*-\n") - (insert ";; Gnus startup file.\n") - (insert "\ -;; Never delete this file -- if you want to force Gnus to read the -;; .newsrc file (if you have one), touch .newsrc instead.\n") - (insert "(setq gnus-newsrc-file-version " - (prin1-to-string gnus-version) ")\n") - (let* ((gnus-killed-list - (if (and gnus-save-killed-list - (stringp gnus-save-killed-list)) - (gnus-strip-killed-list) - gnus-killed-list)) - (variables - (if gnus-save-killed-list gnus-variable-list - ;; Remove the `gnus-killed-list' from the list of variables - ;; to be saved, if required. - (delq 'gnus-killed-list (copy-sequence gnus-variable-list)))) - ;; Peel off the "dummy" group. - (gnus-newsrc-alist (cdr gnus-newsrc-alist)) - variable) - ;; Insert the variables into the file. - (while variables - (when (and (boundp (setq variable (pop variables))) - (symbol-value variable)) - (insert "(setq " (symbol-name variable) " '") - (gnus-prin1 (symbol-value variable)) - (insert ")\n")))))) - -(defun gnus-product-variable-touch (&rest variables) - (while variables - (put (pop variables) 'gnus-product-variable 'dirty))) - -(defun gnus-product-variables-dirty-p (variables) - (catch 'done - (while variables - (when (eq (get (car variables) 'gnus-product-variable) 'dirty) - (throw 'done t)) - (setq variables (cdr variables))))) - -(defun gnus-product-save-variable-file (&optional force) - "Save all product variables to files, when need to be saved." - (let ((list gnus-product-variable-file-list)) - (gnus-make-directory gnus-product-directory) - (while list - (apply 'gnus-product-save-variable-file-1 force (car list)) - (setq list (cdr list))))) - -(defun gnus-product-save-variable-file-1 (force file checking-methods coding - &rest variables) - "Save a product variable file, when need to be saved." - (when (or force - (gnus-product-variables-dirty-p variables)) - (let ((product (product-find 'gnus-vers))) - (set-buffer (gnus-get-buffer-create " *gnus-product*")) - (make-local-variable 'version-control) - (setq version-control 'never) - (setq file (expand-file-name file gnus-product-directory) - buffer-file-name file - default-directory (file-name-directory file)) - (buffer-disable-undo) - (erase-buffer) - (gnus-message 5 "Saving %s..." file) - (apply 'gnus-product-quick-file-format product checking-methods coding - variables) - (save-buffer-as-coding-system coding) - (kill-buffer (current-buffer)) - (while variables - (put (car variables) 'gnus-product-variable nil) - (setq variables (cdr variables))) - (gnus-message - 5 "Saving %s...done" file)))) - -(defun gnus-product-quick-file-format (product checking-methods - coding &rest variables) - "Insert gnus product depend variables in lisp format." - (let ((print-quoted t) - (print-escape-newlines t) - variable param) - (insert (format ";; -*- Mode: emacs-lisp; coding: %s -*-\n" coding)) - (insert (format ";; %s startup file.\n" (product-name product))) - (when (setq param (cdr (assq 'product-version checking-methods))) - (insert "(or (>= (product-version-compare " - "(product-version (product-find 'gnus-vers))\n" - "\t\t\t\t '" (apply 'prin1-to-string param) ")\n" - "\t0)\n" - " (error \"This file was created by later version of " - "gnus.\"))\n")) - (insert "(setq gnus-product-file-version \n" - " '((product-version . " - (prin1-to-string (product-version product)) ")\n" - "\t(emacs-version . " (prin1-to-string emacs-version) ")))\n") - (while variables - (when (and (boundp (setq variable (pop variables))) - (symbol-value variable)) - (insert "(setq " (symbol-name variable) " '") - (gnus-prin1 (symbol-value variable)) - (insert ")\n"))))) - -(defun gnus-strip-killed-list () - "Return the killed list minus the groups that match `gnus-save-killed-list'." - (let ((list gnus-killed-list) - olist) - (while list - (when (string-match gnus-save-killed-list (car list)) - (push (car list) olist)) - (pop list)) - (nreverse olist))) - -(defun gnus-gnus-to-newsrc-format () - ;; Generate and save the .newsrc file. - (save-excursion - (set-buffer (create-file-buffer gnus-current-startup-file)) - (let ((newsrc (cdr gnus-newsrc-alist)) - (standard-output (current-buffer)) - info ranges range method) - (setq buffer-file-name gnus-current-startup-file) - (setq default-directory (file-name-directory buffer-file-name)) - (buffer-disable-undo) - (erase-buffer) - ;; Write options. - (when gnus-newsrc-options - (insert gnus-newsrc-options)) - ;; Write subscribed and unsubscribed. - (while (setq info (pop newsrc)) - ;; Don't write foreign groups to .newsrc. - (when (or (null (setq method (gnus-info-method info))) - (equal method "native") - (inline (gnus-server-equal method gnus-select-method))) - (insert (gnus-info-group info) - (if (> (gnus-info-level info) gnus-level-subscribed) - "!" ":")) - (when (setq ranges (gnus-info-read info)) - (insert " ") - (if (not (listp (cdr ranges))) - (if (= (car ranges) (cdr ranges)) - (princ (car ranges)) - (princ (car ranges)) - (insert "-") - (princ (cdr ranges))) - (while (setq range (pop ranges)) - (if (or (atom range) (= (car range) (cdr range))) - (princ (or (and (atom range) range) (car range))) - (princ (car range)) - (insert "-") - (princ (cdr range))) - (when ranges - (insert ","))))) - (insert "\n"))) - (make-local-variable 'version-control) - (setq version-control 'never) - ;; It has been reported that sometime the modtime on the .newsrc - ;; file seems to be off. We really do want to overwrite it, so - ;; we clear the modtime here before saving. It's a bit odd, - ;; though... - ;; sometimes the modtime clear isn't sufficient. most brute force: - ;; delete the silly thing entirely first. but this fails to provide - ;; such niceties as .newsrc~ creation. - (if gnus-modtime-botch - (delete-file gnus-startup-file) - (clear-visited-file-modtime)) - (gnus-run-hooks 'gnus-save-standard-newsrc-hook) - (save-buffer) - (kill-buffer (current-buffer))))) - - -;;; -;;; Slave functions. -;;; - -(defvar gnus-slave-mode nil) - -(defun gnus-slave-mode () - "Minor mode for slave Gnusae." - (gnus-add-minor-mode 'gnus-slave-mode " Slave" (make-sparse-keymap)) - (gnus-run-hooks 'gnus-slave-mode-hook)) - -(defun gnus-slave-save-newsrc () - (save-excursion - (set-buffer gnus-dribble-buffer) - (let ((slave-name - (make-temp-name (concat gnus-current-startup-file "-slave-"))) - (modes (ignore-errors - (file-modes (concat gnus-current-startup-file ".eld"))))) - (gnus-write-buffer-as-coding-system gnus-ding-file-coding-system - slave-name) - (when modes - (set-file-modes slave-name modes))))) - -(defun gnus-master-read-slave-newsrc () - (let ((slave-files - (directory-files - (file-name-directory gnus-current-startup-file) - t (concat - "^" (regexp-quote - (concat - (file-name-nondirectory gnus-current-startup-file) - "-slave-"))) - t)) - file) - (if (not slave-files) - () ; There are no slave files to read. - (gnus-message 7 "Reading slave newsrcs...") - (save-excursion - (set-buffer (gnus-get-buffer-create " *gnus slave*")) - (setq slave-files - (sort (mapcar (lambda (file) - (list (nth 5 (file-attributes file)) file)) - slave-files) - (lambda (f1 f2) - (or (< (caar f1) (caar f2)) - (< (nth 1 (car f1)) (nth 1 (car f2))))))) - (while slave-files - (erase-buffer) - (setq file (nth 1 (car slave-files))) - (nnheader-insert-file-contents file) - (when (condition-case () - (progn - (eval-buffer (current-buffer)) - t) - (error - (gnus-error 3.2 "Possible error in %s" file) - nil)) - (unless gnus-slave ; Slaves shouldn't delete these files. - (ignore-errors - (delete-file file)))) - (setq slave-files (cdr slave-files)))) - (gnus-dribble-touch) - (gnus-message 7 "Reading slave newsrcs...done")))) - - -;;; -;;; Group description. -;;; - -(defun gnus-read-all-descriptions-files () - (let ((methods (cons gnus-select-method - (nconc - (when (gnus-archive-server-wanted-p) - (list "archive")) - gnus-secondary-select-methods)))) - (while methods - (gnus-read-descriptions-file (car methods)) - (setq methods (cdr methods))) - t)) - -(defun gnus-read-descriptions-file (&optional method) - (let ((method (or method gnus-select-method)) - group) - (when (stringp method) - (setq method (gnus-server-to-method method))) - ;; We create the hashtable whether we manage to read the desc file - ;; to avoid trying to re-read after a failed read. - (unless gnus-description-hashtb - (setq gnus-description-hashtb - (gnus-make-hashtable (length gnus-active-hashtb)))) - ;; Mark this method's desc file as read. - (gnus-sethash (gnus-group-prefixed-name "" method) "Has read" - gnus-description-hashtb) - - (gnus-message 5 "Reading descriptions file via %s..." (car method)) - (cond - ((null (gnus-get-function method 'request-list-newsgroups t)) - t) - ((not (gnus-check-server method)) - (gnus-message 1 "Couldn't open server") - nil) - ((not (gnus-request-list-newsgroups method)) - (gnus-message 1 "Couldn't read newsgroups descriptions") - nil) - (t - (save-excursion - (save-restriction - (set-buffer nntp-server-buffer) - (goto-char (point-min)) - (when (or (search-forward "\n.\n" nil t) - (goto-char (point-max))) - (beginning-of-line) - (narrow-to-region (point-min) (point))) - ;; If these are groups from a foreign select method, we insert the - ;; group prefix in front of the group names. - (and method (not (inline - (gnus-server-equal - (gnus-server-get-method nil method) - (gnus-server-get-method - nil gnus-select-method)))) - (let ((prefix (gnus-group-prefixed-name "" method))) - (goto-char (point-min)) - (while (and (not (eobp)) - (progn (insert prefix) - (zerop (forward-line 1))))))) - (goto-char (point-min)) - (while (not (eobp)) - ;; If we get an error, we set group to 0, which is not a - ;; symbol... - (setq group - (condition-case () - (let ((obarray gnus-description-hashtb)) - ;; Group is set to a symbol interned in this - ;; hash table. - (read nntp-server-buffer)) - (error 0))) - (skip-chars-forward " \t") - ;; ... which leads to this line being effectively ignored. - (when (symbolp group) - (let* ((str (buffer-substring - (point) (progn (end-of-line) (point)))) - (name (symbol-name group)) - (charset - (or (gnus-group-name-charset method name) - (gnus-parameter-charset name)))) - (when (and str charset (featurep 'mule)) - (setq str (decode-coding-string str charset))) - (set group str))) - (forward-line 1)))) - (gnus-message 5 "Reading descriptions file...done") - t)))) - -(defun gnus-group-get-description (group) - "Get the description of a group by sending XGTITLE to the server." - (when (gnus-request-group-description group) - (save-excursion - (set-buffer nntp-server-buffer) - (goto-char (point-min)) - (when (looking-at "[^ \t]+[ \t]+\\(.*\\)") - (match-string 1))))) - -;;;###autoload -(defun gnus-declare-backend (name &rest abilities) - "Declare backend NAME with ABILITIES as a Gnus backend." - (setq gnus-valid-select-methods - (nconc gnus-valid-select-methods - (list (apply 'list name abilities)))) - (gnus-redefine-select-method-widget)) - -(defun gnus-set-default-directory () - "Set the default directory in the current buffer to `gnus-default-directory'. -If this variable is nil, don't do anything." - (setq default-directory - (if (and gnus-default-directory - (file-exists-p gnus-default-directory)) - (file-name-as-directory (expand-file-name gnus-default-directory)) - default-directory))) - -(defun gnus-display-time-event-handler () - "Like `display-time-event-handler', but test `display-time-timer'." - (when (gnus-boundp 'display-time-timer) - (display-time-event-handler))) - -(provide 'gnus-start) - -;;; gnus-start.el ends here diff --git a/lisp/gnus-sum.el b/lisp/gnus-sum.el deleted file mode 100644 index ba32f04..0000000 --- a/lisp/gnus-sum.el +++ /dev/null @@ -1,10924 +0,0 @@ -;;; gnus-sum.el --- summary mode commands for Semi-gnus -;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; MORIOKA Tomohiko -;; Katsumi Yamaoka -;; Keywords: mail, news, MIME - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) -(eval-when-compile (require 'gnus-clfns)) - -(require 'gnus) -(require 'gnus-group) -(require 'gnus-spec) -(require 'gnus-range) -(require 'gnus-int) -(require 'gnus-undo) -(require 'gnus-util) -;; Recursive :-(. -;; (require 'gnus-art) -(require 'nnoo) -(require 'mime-view) - -(eval-when-compile - (require 'mime-play) - (require 'static)) - -(eval-and-compile - (autoload 'pgg-decrypt-region "pgg" nil t) - (autoload 'pgg-verify-region "pgg" nil t)) - -(autoload 'gnus-summary-limit-include-cached "gnus-cache" nil t) -(autoload 'gnus-cache-write-active "gnus-cache") -(autoload 'gnus-set-summary-default-charset "gnus-i18n" nil t) -(autoload 'gnus-mailing-list-insinuate "gnus-ml" nil t) -(autoload 'turn-on-gnus-mailing-list-mode "gnus-ml" nil t) -(autoload 'mm-uu-dissect "mm-uu") - -(defcustom gnus-kill-summary-on-exit t - "*If non-nil, kill the summary buffer when you exit from it. -If nil, the summary will become a \"*Dead Summary*\" buffer, and -it will be killed sometime later." - :group 'gnus-summary-exit - :type 'boolean) - -(defcustom gnus-fetch-old-headers nil - "*Non-nil means that Gnus will try to build threads by grabbing old headers. -If an unread article in the group refers to an older, already read (or -just marked as read) article, the old article will not normally be -displayed in the Summary buffer. If this variable is non-nil, Gnus -will attempt to grab the headers to the old articles, and thereby -build complete threads. If it has the value `some', only enough -headers to connect otherwise loose threads will be displayed. This -variable can also be a number. In that case, no more than that number -of old headers will be fetched. If it has the value `invisible', all -old headers will be fetched, but none will be displayed. - -The server has to support NOV for any of this to work." - :group 'gnus-thread - :type '(choice (const :tag "off" nil) - (const some) - number - (sexp :menu-tag "other" t))) - -(defcustom gnus-refer-thread-limit 200 - "*The number of old headers to fetch when doing \\\\[gnus-summary-refer-thread]. -If t, fetch all the available old headers." - :group 'gnus-thread - :type '(choice number - (sexp :menu-tag "other" t))) - -(defcustom gnus-summary-make-false-root 'adopt - "*nil means that Gnus won't gather loose threads. -If the root of a thread has expired or been read in a previous -session, the information necessary to build a complete thread has been -lost. Instead of having many small sub-threads from this original thread -scattered all over the summary buffer, Gnus can gather them. - -If non-nil, Gnus will try to gather all loose sub-threads from an -original thread into one large thread. - -If this variable is non-nil, it should be one of `none', `adopt', -`dummy' or `empty'. - -If this variable is `none', Gnus will not make a false root, but just -present the sub-threads after another. -If this variable is `dummy', Gnus will create a dummy root that will -have all the sub-threads as children. -If this variable is `adopt', Gnus will make one of the \"children\" -the parent and mark all the step-children as such. -If this variable is `empty', the \"children\" are printed with empty -subject fields. (Or rather, they will be printed with a string -given by the `gnus-summary-same-subject' variable.)" - :group 'gnus-thread - :type '(choice (const :tag "off" nil) - (const none) - (const dummy) - (const adopt) - (const empty))) - -(defcustom gnus-summary-gather-exclude-subject "^ *$\\|^(none)$" - "*A regexp to match subjects to be excluded from loose thread gathering. -As loose thread gathering is done on subjects only, that means that -there can be many false gatherings performed. By rooting out certain -common subjects, gathering might become saner." - :group 'gnus-thread - :type 'regexp) - -(defcustom gnus-summary-gather-subject-limit nil - "*Maximum length of subject comparisons when gathering loose threads. -Use nil to compare full subjects. Setting this variable to a low -number will help gather threads that have been corrupted by -newsreaders chopping off subject lines, but it might also mean that -unrelated articles that have subject that happen to begin with the -same few characters will be incorrectly gathered. - -If this variable is `fuzzy', Gnus will use a fuzzy algorithm when -comparing subjects." - :group 'gnus-thread - :type '(choice (const :tag "off" nil) - (const fuzzy) - (sexp :menu-tag "on" t))) - -(defcustom gnus-simplify-subject-functions nil - "List of functions taking a string argument that simplify subjects. -The functions are applied recursively. - -Useful functions to put in this list include: `gnus-simplify-subject-re', -`gnus-simplify-subject-fuzzy' and `gnus-simplify-whitespace'." - :group 'gnus-thread - :type '(repeat function)) - -(defcustom gnus-simplify-ignored-prefixes nil - "*Regexp, matches for which are removed from subject lines when simplifying fuzzily." - :group 'gnus-thread - :type '(choice (const :tag "off" nil) - regexp)) - -(defcustom gnus-build-sparse-threads nil - "*If non-nil, fill in the gaps in threads. -If `some', only fill in the gaps that are needed to tie loose threads -together. If `more', fill in all leaf nodes that Gnus can find. If -non-nil and non-`some', fill in all gaps that Gnus manages to guess." - :group 'gnus-thread - :type '(choice (const :tag "off" nil) - (const some) - (const more) - (sexp :menu-tag "all" t))) - -(defcustom gnus-summary-thread-gathering-function - 'gnus-gather-threads-by-subject - "*Function used for gathering loose threads. -There are two pre-defined functions: `gnus-gather-threads-by-subject', -which only takes Subjects into consideration; and -`gnus-gather-threads-by-references', which compared the References -headers of the articles to find matches." - :group 'gnus-thread - :type '(radio (function-item gnus-gather-threads-by-subject) - (function-item gnus-gather-threads-by-references) - (function :tag "other"))) - -(defcustom gnus-summary-same-subject "" - "*String indicating that the current article has the same subject as the previous. -This variable will only be used if the value of -`gnus-summary-make-false-root' is `empty'." - :group 'gnus-summary-format - :type 'string) - -(defcustom gnus-summary-goto-unread t - "*If t, many commands will go to the next unread article. -This applies to marking commands as well as other commands that -\"naturally\" select the next article, like, for instance, `SPC' at -the end of an article. - -If nil, the marking commands do NOT go to the next unread article -(they go to the next article instead). If `never', commands that -usually go to the next unread article, will go to the next article, -whether it is read or not." - :group 'gnus-summary-marks - :link '(custom-manual "(gnus)Setting Marks") - :type '(choice (const :tag "off" nil) - (const never) - (sexp :menu-tag "on" t))) - -(defcustom gnus-summary-default-score 0 - "*Default article score level. -All scores generated by the score files will be added to this score. -If this variable is nil, scoring will be disabled." - :group 'gnus-score-default - :type '(choice (const :tag "disable") - integer)) - -(defcustom gnus-summary-default-high-score 0 - "*Default threshold for a high scored article. -An article will be highlighted as high scored if its score is greater -than this score." - :group 'gnus-score-default - :type 'integer) - -(defcustom gnus-summary-default-low-score 0 - "*Default threshold for a low scored article. -An article will be highlighted as low scored if its score is smaller -than this score." - :group 'gnus-score-default - :type 'integer) - -(defcustom gnus-summary-zcore-fuzz 0 - "*Fuzziness factor for the zcore in the summary buffer. -Articles with scores closer than this to `gnus-summary-default-score' -will not be marked." - :group 'gnus-summary-format - :type 'integer) - -(defcustom gnus-simplify-subject-fuzzy-regexp nil - "*Strings to be removed when doing fuzzy matches. -This can either be a regular expression or list of regular expressions -that will be removed from subject strings if fuzzy subject -simplification is selected." - :group 'gnus-thread - :type '(repeat regexp)) - -(defcustom gnus-show-threads t - "*If non-nil, display threads in summary mode." - :group 'gnus-thread - :type 'boolean) - -(defcustom gnus-thread-hide-subtree nil - "*If non-nil, hide all threads initially. -If threads are hidden, you have to run the command -`gnus-summary-show-thread' by hand or use `gnus-select-article-hook' -to expose hidden threads." - :group 'gnus-thread - :type 'boolean) - -(defcustom gnus-thread-hide-killed t - "*If non-nil, hide killed threads automatically." - :group 'gnus-thread - :type 'boolean) - -(defcustom gnus-thread-ignore-subject t - "*If non-nil, which is the default, ignore subjects and do all threading based on the Reference header. -If nil, articles that have different subjects from their parents will -start separate threads." - :group 'gnus-thread - :type 'boolean) - -(defcustom gnus-thread-operation-ignore-subject t - "*If non-nil, subjects will be ignored when doing thread commands. -This affects commands like `gnus-summary-kill-thread' and -`gnus-summary-lower-thread'. - -If this variable is nil, articles in the same thread with different -subjects will not be included in the operation in question. If this -variable is `fuzzy', only articles that have subjects that are fuzzily -equal will be included." - :group 'gnus-thread - :type '(choice (const :tag "off" nil) - (const fuzzy) - (sexp :tag "on" t))) - -(defcustom gnus-thread-indent-level 4 - "*Number that says how much each sub-thread should be indented." - :group 'gnus-thread - :type 'integer) - -(defcustom gnus-auto-extend-newsgroup t - "*If non-nil, extend newsgroup forward and backward when requested." - :group 'gnus-summary-choose - :type 'boolean) - -(defcustom gnus-auto-select-first t - "*If nil, don't select the first unread article when entering a group. -If this variable is `best', select the highest-scored unread article -in the group. If t, select the first unread article. - -This variable can also be a function to place point on a likely -subject line. Useful values include `gnus-summary-first-unread-subject', -`gnus-summary-first-unread-article' and -`gnus-summary-best-unread-article'. - -If you want to prevent automatic selection of the first unread article -in some newsgroups, set the variable to nil in -`gnus-select-group-hook'." - :group 'gnus-group-select - :type '(choice (const :tag "none" nil) - (const best) - (sexp :menu-tag "first" t) - (function-item gnus-summary-first-unread-subject) - (function-item gnus-summary-first-unread-article) - (function-item gnus-summary-best-unread-article))) - -(defcustom gnus-dont-select-after-jump-to-other-group nil - "If non-nil, don't select the first unread article after entering the -other group by the command `gnus-summary-jump-to-other-group'. If nil, -it is depend on the value of `gnus-auto-select-first' whether to select -or not." - :group 'gnus-group-select - :type 'boolean) - -(defcustom gnus-auto-select-next t - "*If non-nil, offer to go to the next group from the end of the previous. -If the value is t and the next newsgroup is empty, Gnus will exit -summary mode and go back to group mode. If the value is neither nil -nor t, Gnus will select the following unread newsgroup. In -particular, if the value is the symbol `quietly', the next unread -newsgroup will be selected without any confirmation, and if it is -`almost-quietly', the next group will be selected without any -confirmation if you are located on the last article in the group. -Finally, if this variable is `slightly-quietly', the `Z n' command -will go to the next group without confirmation." - :group 'gnus-summary-maneuvering - :type '(choice (const :tag "off" nil) - (const quietly) - (const almost-quietly) - (const slightly-quietly) - (sexp :menu-tag "on" t))) - -(defcustom gnus-auto-select-same nil - "*If non-nil, select the next article with the same subject. -If there are no more articles with the same subject, go to -the first unread article." - :group 'gnus-summary-maneuvering - :type 'boolean) - -(defcustom gnus-summary-check-current nil - "*If non-nil, consider the current article when moving. -The \"unread\" movement commands will stay on the same line if the -current article is unread." - :group 'gnus-summary-maneuvering - :type 'boolean) - -(defcustom gnus-auto-center-summary t - "*If non-nil, always center the current summary buffer. -In particular, if `vertical' do only vertical recentering. If non-nil -and non-`vertical', do both horizontal and vertical recentering." - :group 'gnus-summary-maneuvering - :type '(choice (const :tag "none" nil) - (const vertical) - (integer :tag "height") - (sexp :menu-tag "both" t))) - -(defcustom gnus-show-all-headers nil - "*If non-nil, don't hide any headers." - :group 'gnus-article-hiding - :group 'gnus-article-headers - :type 'boolean) - -(defcustom gnus-summary-ignore-duplicates nil - "*If non-nil, ignore articles with identical Message-ID headers." - :group 'gnus-summary - :type 'boolean) - -(defcustom gnus-single-article-buffer t - "*If non-nil, display all articles in the same buffer. -If nil, each group will get its own article buffer." - :group 'gnus-article-various - :type 'boolean) - -(defcustom gnus-break-pages t - "*If non-nil, do page breaking on articles. -The page delimiter is specified by the `gnus-page-delimiter' -variable." - :group 'gnus-article-various - :type 'boolean) - -(defcustom gnus-show-mime t - "*If non-nil, do mime processing of articles. -The articles will simply be fed to the function given by -`gnus-article-display-method-for-mime'." - :group 'gnus-article-mime - :type 'boolean) - -(defcustom gnus-move-split-methods nil - "*Variable used to suggest where articles are to be moved to. -It uses the same syntax as the `gnus-split-methods' variable. -However, whereas `gnus-split-methods' specifies file names as targets, -this variable specifies group names." - :group 'gnus-summary-mail - :type '(repeat (choice (list :value (fun) function) - (cons :value ("" "") regexp (repeat string)) - (sexp :value nil)))) - -(defcustom gnus-unread-mark ?\ ;;;Whitespace - "*Mark used for unread articles." - :group 'gnus-summary-marks - :type 'character) - -(defcustom gnus-ticked-mark ?! - "*Mark used for ticked articles." - :group 'gnus-summary-marks - :type 'character) - -(defcustom gnus-dormant-mark ?? - "*Mark used for dormant articles." - :group 'gnus-summary-marks - :type 'character) - -(defcustom gnus-del-mark ?r - "*Mark used for del'd articles." - :group 'gnus-summary-marks - :type 'character) - -(defcustom gnus-read-mark ?R - "*Mark used for read articles." - :group 'gnus-summary-marks - :type 'character) - -(defcustom gnus-expirable-mark ?E - "*Mark used for expirable articles." - :group 'gnus-summary-marks - :type 'character) - -(defcustom gnus-killed-mark ?K - "*Mark used for killed articles." - :group 'gnus-summary-marks - :type 'character) - -(defcustom gnus-souped-mark ?F - "*Mark used for souped articles." - :group 'gnus-summary-marks - :type 'character) - -(defcustom gnus-kill-file-mark ?X - "*Mark used for articles killed by kill files." - :group 'gnus-summary-marks - :type 'character) - -(defcustom gnus-low-score-mark ?Y - "*Mark used for articles with a low score." - :group 'gnus-summary-marks - :type 'character) - -(defcustom gnus-catchup-mark ?C - "*Mark used for articles that are caught up." - :group 'gnus-summary-marks - :type 'character) - -(defcustom gnus-replied-mark ?A - "*Mark used for articles that have been replied to." - :group 'gnus-summary-marks - :type 'character) - -(defcustom gnus-forwarded-mark ?F - "*Mark used for articles that have been forwarded." - :group 'gnus-summary-marks - :type 'character) - -(defcustom gnus-recent-mark ?N - "*Mark used for articles that are recent." - :group 'gnus-summary-marks - :type 'character) - -(defcustom gnus-cached-mark ?* - "*Mark used for articles that are in the cache." - :group 'gnus-summary-marks - :type 'character) - -(defcustom gnus-saved-mark ?S - "*Mark used for articles that have been saved." - :group 'gnus-summary-marks - :type 'character) - -(defcustom gnus-unseen-mark ?. - "*Mark used for articles that haven't been seen." - :group 'gnus-summary-marks - :type 'character) - -(defcustom gnus-no-mark ?\ ;;;Whitespace - "*Mark used for articles that have no other secondary mark." - :group 'gnus-summary-marks - :type 'character) - -(defcustom gnus-ancient-mark ?O - "*Mark used for ancient articles." - :group 'gnus-summary-marks - :type 'character) - -(defcustom gnus-sparse-mark ?Q - "*Mark used for sparsely reffed articles." - :group 'gnus-summary-marks - :type 'character) - -(defcustom gnus-canceled-mark ?G - "*Mark used for canceled articles." - :group 'gnus-summary-marks - :type 'character) - -(defcustom gnus-duplicate-mark ?M - "*Mark used for duplicate articles." - :group 'gnus-summary-marks - :type 'character) - -(defcustom gnus-undownloaded-mark ?@ - "*Mark used for articles that weren't downloaded." - :group 'gnus-summary-marks - :type 'character) - -(defcustom gnus-downloadable-mark ?% - "*Mark used for articles that are to be downloaded." - :group 'gnus-summary-marks - :type 'character) - -(defcustom gnus-unsendable-mark ?= - "*Mark used for articles that won't be sent." - :group 'gnus-summary-marks - :type 'character) - -(defcustom gnus-score-over-mark ?+ - "*Score mark used for articles with high scores." - :group 'gnus-summary-marks - :type 'character) - -(defcustom gnus-score-below-mark ?- - "*Score mark used for articles with low scores." - :group 'gnus-summary-marks - :type 'character) - -(defcustom gnus-empty-thread-mark ?\ ;;;Whitespace - "*There is no thread under the article." - :group 'gnus-summary-marks - :type 'character) - -(defcustom gnus-not-empty-thread-mark ?= - "*There is a thread under the article." - :group 'gnus-summary-marks - :type 'character) - -(defcustom gnus-view-pseudo-asynchronously nil - "*If non-nil, Gnus will view pseudo-articles asynchronously." - :group 'gnus-extract-view - :type 'boolean) - -(defcustom gnus-auto-expirable-marks - (list gnus-killed-mark gnus-del-mark gnus-catchup-mark - gnus-low-score-mark gnus-ancient-mark gnus-read-mark - gnus-souped-mark gnus-duplicate-mark) - "*The list of marks converted into expiration if a group is auto-expirable." - :version "21.1" - :group 'gnus-summary - :type '(repeat character)) - -(defcustom gnus-inhibit-user-auto-expire t - "*If non-nil, user marking commands will not mark an article as expirable, even if the group has auto-expire turned on." - :version "21.1" - :group 'gnus-summary - :type 'boolean) - -(defcustom gnus-view-pseudos nil - "*If `automatic', pseudo-articles will be viewed automatically. -If `not-confirm', pseudos will be viewed automatically, and the user -will not be asked to confirm the command." - :group 'gnus-extract-view - :type '(choice (const :tag "off" nil) - (const automatic) - (const not-confirm))) - -(defcustom gnus-view-pseudos-separately t - "*If non-nil, one pseudo-article will be created for each file to be viewed. -If nil, all files that use the same viewing command will be given as a -list of parameters to that command." - :group 'gnus-extract-view - :type 'boolean) - -(defcustom gnus-insert-pseudo-articles t - "*If non-nil, insert pseudo-articles when decoding articles." - :group 'gnus-extract-view - :type 'boolean) - -(defcustom gnus-summary-dummy-line-format - " %(: :%) %S\n" - "*The format specification for the dummy roots in the summary buffer. -It works along the same lines as a normal formatting string, -with some simple extensions. - -%S The subject" - :group 'gnus-threading - :type 'string) - -(defcustom gnus-summary-mode-line-format "Gnus: %g [%A] %Z" - "*The format specification for the summary mode line. -It works along the same lines as a normal formatting string, -with some simple extensions: - -%G Group name -%p Unprefixed group name -%A Current article number -%z Current article score -%V Gnus version -%U Number of unread articles in the group -%e Number of unselected articles in the group -%Z A string with unread/unselected article counts -%g Shortish group name -%S Subject of the current article -%u User-defined spec -%s Current score file name -%d Number of dormant articles -%r Number of articles that have been marked as read in this session -%E Number of articles expunged by the score files" - :group 'gnus-summary-format - :type 'string) - -(defcustom gnus-list-identifiers nil - "Regexp that matches list identifiers to be removed from subject. -This can also be a list of regexps." - :version "21.1" - :group 'gnus-summary-format - :group 'gnus-article-hiding - :type '(choice (const :tag "none" nil) - (regexp :value ".*") - (repeat :value (".*") regexp))) - -(defcustom gnus-summary-mark-below 0 - "*Mark all articles with a score below this variable as read. -This variable is local to each summary buffer and usually set by the -score file." - :group 'gnus-score-default - :type 'integer) - -(defcustom gnus-article-sort-functions '(gnus-article-sort-by-number) - "*List of functions used for sorting articles in the summary buffer. - -Each function takes two articles and returns non-nil if the first -article should be sorted before the other. If you use more than one -function, the primary sort function should be the last. You should -probably always include `gnus-article-sort-by-number' in the list of -sorting functions -- preferably first. Also note that sorting by date -is often much slower than sorting by number, and the sorting order is -very similar. (Sorting by date means sorting by the time the message -was sent, sorting by number means sorting by arrival time.) - -Ready-made functions include `gnus-article-sort-by-number', -`gnus-article-sort-by-author', `gnus-article-sort-by-subject', -`gnus-article-sort-by-date' and `gnus-article-sort-by-score'. - -When threading is turned on, the variable `gnus-thread-sort-functions' -controls how articles are sorted." - :group 'gnus-summary-sort - :type '(repeat (choice (function-item gnus-article-sort-by-number) - (function-item gnus-article-sort-by-author) - (function-item gnus-article-sort-by-subject) - (function-item gnus-article-sort-by-date) - (function-item gnus-article-sort-by-score) - (function :tag "other")))) - -(defcustom gnus-thread-sort-functions '(gnus-thread-sort-by-number) - "*List of functions used for sorting threads in the summary buffer. -By default, threads are sorted by article number. - -Each function takes two threads and returns non-nil if the first -thread should be sorted before the other. If you use more than one -function, the primary sort function should be the last. You should -probably always include `gnus-thread-sort-by-number' in the list of -sorting functions -- preferably first. Also note that sorting by date -is often much slower than sorting by number, and the sorting order is -very similar. (Sorting by date means sorting by the time the message -was sent, sorting by number means sorting by arrival time.) - -Ready-made functions include `gnus-thread-sort-by-number', -`gnus-thread-sort-by-author', `gnus-thread-sort-by-subject', -`gnus-thread-sort-by-date', `gnus-thread-sort-by-score' and -`gnus-thread-sort-by-total-score' (see `gnus-thread-score-function'). - -When threading is turned off, the variable -`gnus-article-sort-functions' controls how articles are sorted." - :group 'gnus-summary-sort - :type '(repeat (choice (function-item gnus-thread-sort-by-number) - (function-item gnus-thread-sort-by-author) - (function-item gnus-thread-sort-by-subject) - (function-item gnus-thread-sort-by-date) - (function-item gnus-thread-sort-by-score) - (function-item gnus-thread-sort-by-total-score) - (function :tag "other")))) - -(defcustom gnus-thread-score-function '+ - "*Function used for calculating the total score of a thread. - -The function is called with the scores of the article and each -subthread and should then return the score of the thread. - -Some functions you can use are `+', `max', or `min'." - :group 'gnus-summary-sort - :type 'function) - -(defcustom gnus-summary-expunge-below nil - "All articles that have a score less than this variable will be expunged. -This variable is local to the summary buffers." - :group 'gnus-score-default - :type '(choice (const :tag "off" nil) - integer)) - -(defcustom gnus-thread-expunge-below nil - "All threads that have a total score less than this variable will be expunged. -See `gnus-thread-score-function' for en explanation of what a -\"thread score\" is. - -This variable is local to the summary buffers." - :group 'gnus-threading - :group 'gnus-score-default - :type '(choice (const :tag "off" nil) - integer)) - -(defcustom gnus-summary-mode-hook nil - "*A hook for Gnus summary mode. -This hook is run before any variables are set in the summary buffer." - :options '(turn-on-gnus-mailing-list-mode) - :group 'gnus-summary-various - :type 'hook) - -;; Extracted from gnus-xmas-redefine in order to preserve user settings -(when (featurep 'xemacs) - (add-hook 'gnus-summary-mode-hook 'gnus-xmas-summary-menu-add) - (add-hook 'gnus-summary-mode-hook 'gnus-xmas-setup-summary-toolbar) - (add-hook 'gnus-summary-mode-hook - 'gnus-xmas-switch-horizontal-scrollbar-off)) - -(defcustom gnus-summary-menu-hook nil - "*Hook run after the creation of the summary mode menu." - :group 'gnus-summary-visual - :type 'hook) - -(defcustom gnus-summary-exit-hook nil - "*A hook called on exit from the summary buffer. -It will be called with point in the group buffer." - :group 'gnus-summary-exit - :type 'hook) - -(defcustom gnus-summary-prepare-hook nil - "*A hook called after the summary buffer has been generated. -If you want to modify the summary buffer, you can use this hook." - :group 'gnus-summary-various - :type 'hook) - -(defcustom gnus-summary-prepared-hook nil - "*A hook called as the last thing after the summary buffer has been generated." - :group 'gnus-summary-various - :type 'hook) - -(defcustom gnus-summary-generate-hook nil - "*A hook run just before generating the summary buffer. -This hook is commonly used to customize threading variables and the -like." - :group 'gnus-summary-various - :type 'hook) - -(defcustom gnus-select-group-hook nil - "*A hook called when a newsgroup is selected. - -If you'd like to simplify subjects like the -`gnus-summary-next-same-subject' command does, you can use the -following hook: - - (setq gnus-select-group-hook - (list - (lambda () - (mapcar (lambda (header) - (mail-header-set-subject - header - (gnus-simplify-subject - (mail-header-subject header) 're-only))) - gnus-newsgroup-headers))))" - :group 'gnus-group-select - :type 'hook) - -(defcustom gnus-select-article-hook nil - "*A hook called when an article is selected." - :group 'gnus-summary-choose - :type 'hook) - -(defcustom gnus-visual-mark-article-hook - (list 'gnus-highlight-selected-summary) - "*Hook run after selecting an article in the summary buffer. -It is meant to be used for highlighting the article in some way. It -is not run if `gnus-visual' is nil." - :group 'gnus-summary-visual - :type 'hook) - -(defcustom gnus-parse-headers-hook '(gnus-set-summary-default-charset) - "*A hook called before parsing the headers." - :group 'gnus-various - :type 'hook) - -(defcustom gnus-exit-group-hook nil - "*A hook called when exiting summary mode. -This hook is not called from the non-updating exit commands like `Q'." - :group 'gnus-various - :type 'hook) - -(defcustom gnus-summary-update-hook - (list 'gnus-summary-highlight-line) - "*A hook called when a summary line is changed. -The hook will not be called if `gnus-visual' is nil. - -The default function `gnus-summary-highlight-line' will -highlight the line according to the `gnus-summary-highlight' -variable." - :group 'gnus-summary-visual - :type 'hook) - -(defcustom gnus-mark-article-hook '(gnus-summary-mark-read-and-unread-as-read) - "*A hook called when an article is selected for the first time. -The hook is intended to mark an article as read (or unread) -automatically when it is selected." - :group 'gnus-summary-choose - :type 'hook) - -(defcustom gnus-group-no-more-groups-hook nil - "*A hook run when returning to group mode having no more (unread) groups." - :group 'gnus-group-select - :type 'hook) - -(defcustom gnus-ps-print-hook nil - "*A hook run before ps-printing something from Gnus." - :group 'gnus-summary - :type 'hook) - -(defcustom gnus-summary-display-arrow - (and (fboundp 'display-graphic-p) - (display-graphic-p)) - "*If non-nil, display an arrow highlighting the current article." - :version "21.1" - :group 'gnus-summary - :type 'boolean) - -(defcustom gnus-summary-selected-face 'gnus-summary-selected-face - "Face used for highlighting the current article in the summary buffer." - :group 'gnus-summary-visual - :type 'face) - -(defcustom gnus-summary-highlight - '(((= mark gnus-canceled-mark) - . gnus-summary-cancelled-face) - ((and (> score default-high) - (or (= mark gnus-dormant-mark) - (= mark gnus-ticked-mark))) - . gnus-summary-high-ticked-face) - ((and (< score default-low) - (or (= mark gnus-dormant-mark) - (= mark gnus-ticked-mark))) - . gnus-summary-low-ticked-face) - ((or (= mark gnus-dormant-mark) - (= mark gnus-ticked-mark)) - . gnus-summary-normal-ticked-face) - ((and (> score default-high) (= mark gnus-ancient-mark)) - . gnus-summary-high-ancient-face) - ((and (< score default-low) (= mark gnus-ancient-mark)) - . gnus-summary-low-ancient-face) - ((= mark gnus-ancient-mark) - . gnus-summary-normal-ancient-face) - ((and (> score default-high) (= mark gnus-unread-mark)) - . gnus-summary-high-unread-face) - ((and (< score default-low) (= mark gnus-unread-mark)) - . gnus-summary-low-unread-face) - ((= mark gnus-unread-mark) - . gnus-summary-normal-unread-face) - ((and (> score default-high) (memq mark (list gnus-downloadable-mark - gnus-undownloaded-mark))) - . gnus-summary-high-unread-face) - ((and (< score default-low) (memq mark (list gnus-downloadable-mark - gnus-undownloaded-mark))) - . gnus-summary-low-unread-face) - ((and (memq mark (list gnus-downloadable-mark gnus-undownloaded-mark)) - (memq article gnus-newsgroup-unreads)) - . gnus-summary-normal-unread-face) - ((memq mark (list gnus-downloadable-mark gnus-undownloaded-mark)) - . gnus-summary-normal-read-face) - ((> score default-high) - . gnus-summary-high-read-face) - ((< score default-low) - . gnus-summary-low-read-face) - (t - . gnus-summary-normal-read-face)) - "*Controls the highlighting of summary buffer lines. - -A list of (FORM . FACE) pairs. When deciding how a a particular -summary line should be displayed, each form is evaluated. The content -of the face field after the first true form is used. You can change -how those summary lines are displayed, by editing the face field. - -You can use the following variables in the FORM field. - -score: The article's score -default: The default article score. -default-high: The default score for high scored articles. -default-low: The default score for low scored articles. -below: The score below which articles are automatically marked as read. -mark: The articles mark." - :group 'gnus-summary-visual - :type '(repeat (cons (sexp :tag "Form" nil) - face))) - -(defcustom gnus-alter-header-function nil - "Function called to allow alteration of article header structures. -The function is called with one parameter, the article header vector, -which it may alter in any way.") - -(defvar gnus-decode-encoded-word-function - (mime-find-field-decoder 'From 'nov) - "Variable that says which function should be used to decode a string with encoded words.") - -(defcustom gnus-extra-headers nil - "*Extra headers to parse." - :version "21.1" - :group 'gnus-summary - :type '(repeat symbol)) - -(defcustom gnus-ignored-from-addresses - (and user-mail-address (regexp-quote user-mail-address)) - "*Regexp of From headers that may be suppressed in favor of To headers." - :version "21.1" - :group 'gnus-summary - :type 'regexp) - -(defcustom gnus-newsgroup-ignored-charsets '(unknown-8bit x-unknown) - "List of charsets that should be ignored. -When these charsets are used in the \"charset\" parameter, the -default charset will be used instead." - :version "21.1" - :type '(repeat symbol) - :group 'gnus-charset) - -(gnus-define-group-parameter - ignored-charsets - :type list - :function-document - "Return the ignored charsets of GROUP." - :variable gnus-group-ignored-charsets-alist - :variable-default - '(("alt\\.chinese\\.text" iso-8859-1)) - :variable-document - "Alist of regexps (to match group names) and charsets that should be ignored. -When these charsets are used in the \"charset\" parameter, the -default charset will be used instead." - :variable-group gnus-charset - :variable-type '(repeat (cons (regexp :tag "Group") - (repeat symbol))) - :parameter-type '(choice :tag "Ignored charsets" - :value nil - (repeat (symbol))) - :parameter-document "\ -List of charsets that should be ignored. - -When these charsets are used in the \"charset\" parameter, the -default charset will be used instead.") - -(defcustom gnus-group-highlight-words-alist nil - "Alist of group regexps and highlight regexps. -This variable uses the same syntax as `gnus-emphasis-alist'." - :version "21.1" - :type '(repeat (cons (regexp :tag "Group") - (repeat (list (regexp :tag "Highlight regexp") - (number :tag "Group for entire word" 0) - (number :tag "Group for displayed part" 0) - (symbol :tag "Face" - gnus-emphasis-highlight-words))))) - :group 'gnus-summary-visual) - -(defcustom gnus-use-wheel nil - "Use Intelli-mouse on summary movement" - :type 'boolean - :group 'gnus-summary-maneuvering) - -(defcustom gnus-wheel-scroll-amount '(5 . 1) - "Amount to scroll messages by spinning the mouse wheel. -This is actually a cons cell, where the first item is the amount to scroll -on a normal wheel event, and the second is the amount to scroll when the -wheel is moved with the shift key depressed." - :type '(cons (integer :tag "Shift") integer) - :group 'gnus-summary-maneuvering) - -(defcustom gnus-wheel-edge-resistance 2 - "How hard it should be to change the current article -by moving the mouse over the edge of the article window." - :type 'integer - :group 'gnus-summary-maneuvering) - -(defcustom gnus-summary-show-article-charset-alist - nil - "Alist of number and charset. -The article will be shown with the charset corresponding to the -numbered argument. -For example: ((1 . cn-gb-2312) (2 . big5))." - :version "21.1" - :type '(repeat (cons (number :tag "Argument" 1) - (symbol :tag "Charset"))) - :group 'gnus-charset) - -(defcustom gnus-preserve-marks t - "Whether marks are preserved when moving, copying and respooling messages." - :version "21.1" - :type 'boolean - :group 'gnus-summary-marks) - -(defcustom gnus-alter-articles-to-read-function nil - "Function to be called to alter the list of articles to be selected." - :type '(choice (const nil) function) - :group 'gnus-summary) - -(defcustom gnus-orphan-score nil - "*All orphans get this score added. Set in the score file." - :group 'gnus-score-default - :type '(choice (const nil) - integer)) - -(defcustom gnus-summary-save-parts-default-mime "image/.*" - "*A regexp to match MIME parts when saving multiple parts of a message -with gnus-summary-save-parts (X m). This regexp will be used by default -when prompting the user for which type of files to save." - :group 'gnus-summary - :type 'regexp) - - -(defcustom gnus-summary-save-parts-default-mime "image/.*" - "*A regexp to match MIME parts when saving multiple parts of a message -with gnus-summary-save-parts (X m). This regexp will be used by default -when prompting the user for which type of files to save." - :group 'gnus-summary - :type 'regexp) - -(defcustom gnus-read-all-available-headers nil - "Whether Gnus should parse all headers made available to it. -This is mostly relevant for slow backends where the user may -wish to widen the summary buffer to include all headers -that were fetched. Say, for nnultimate groups." - :group 'gnus-summary - :type '(choice boolean regexp)) - -;;; Internal variables - -(defvar gnus-summary-display-cache nil) -(defvar gnus-article-mime-handles nil) -(defvar gnus-article-decoded-p nil) -(defvar gnus-article-charset nil) -(defvar gnus-article-ignored-charsets nil) -(defvar gnus-scores-exclude-files nil) -(defvar gnus-page-broken nil) -(defvar gnus-inhibit-mime-unbuttonizing nil) - -(defvar gnus-original-article nil) -(defvar gnus-article-internal-prepare-hook nil) -(defvar gnus-newsgroup-process-stack nil) - -(defvar gnus-thread-indent-array nil) -(defvar gnus-thread-indent-array-level gnus-thread-indent-level) -(defvar gnus-sort-gathered-threads-function 'gnus-thread-sort-by-number - "Function called to sort the articles within a thread after it has been gathered together.") - -(defvar gnus-summary-save-parts-type-history nil) -(defvar gnus-summary-save-parts-last-directory nil) - -(defvar gnus-summary-save-parts-type-history nil) -(defvar gnus-summary-save-parts-last-directory nil) - -;; Avoid highlighting in kill files. -(defvar gnus-summary-inhibit-highlight nil) -(defvar gnus-newsgroup-selected-overlay nil) -(defvar gnus-inhibit-limiting nil) -(defvar gnus-newsgroup-adaptive-score-file nil) -(defvar gnus-current-score-file nil) -(defvar gnus-current-move-group nil) -(defvar gnus-current-copy-group nil) -(defvar gnus-current-crosspost-group nil) -(defvar gnus-newsgroup-display nil) - -(defvar gnus-newsgroup-dependencies nil) -(defvar gnus-newsgroup-adaptive nil) -(defvar gnus-summary-display-article-function nil) -(defvar gnus-summary-highlight-line-function nil - "Function called after highlighting a summary line.") - -(defvar gnus-summary-line-format-alist - `((?N ,(macroexpand '(mail-header-number gnus-tmp-header)) ?d) - (?S ,(macroexpand '(mail-header-subject gnus-tmp-header)) ?s) - (?s gnus-tmp-subject-or-nil ?s) - (?n gnus-tmp-name ?s) - (?A (std11-address-string - (car (mime-entity-read-field gnus-tmp-header 'From))) ?s) - (?a (or (std11-full-name-string - (car (mime-entity-read-field gnus-tmp-header 'From))) - gnus-tmp-from) ?s) - (?F gnus-tmp-from ?s) - (?x ,(macroexpand '(mail-header-xref gnus-tmp-header)) ?s) - (?D ,(macroexpand '(mail-header-date gnus-tmp-header)) ?s) - (?d (gnus-dd-mmm (mail-header-date gnus-tmp-header)) ?s) - (?o (gnus-date-iso8601 (mail-header-date gnus-tmp-header)) ?s) - (?M ,(macroexpand '(mail-header-id gnus-tmp-header)) ?s) - (?r ,(macroexpand '(mail-header-references gnus-tmp-header)) ?s) - (?c (or (mail-header-chars gnus-tmp-header) 0) ?d) - (?L gnus-tmp-lines ?s) - (?I gnus-tmp-indentation ?s) - (?T (if (= gnus-tmp-level 0) "" (make-string (frame-width) ? )) ?s) - (?R gnus-tmp-replied ?c) - (?\[ gnus-tmp-opening-bracket ?c) - (?\] gnus-tmp-closing-bracket ?c) - (?\> (make-string gnus-tmp-level ? ) ?s) - (?\< (make-string (max 0 (- 20 gnus-tmp-level)) ? ) ?s) - (?i gnus-tmp-score ?d) - (?z gnus-tmp-score-char ?c) - (?l (bbb-grouplens-score gnus-tmp-header) ?s) - (?V (gnus-thread-total-score (and (boundp 'thread) (car thread))) ?d) - (?U gnus-tmp-unread ?c) - (?f (gnus-summary-from-or-to-or-newsgroups gnus-tmp-header) ?s) - (?t (gnus-summary-number-of-articles-in-thread - (and (boundp 'thread) (car thread)) gnus-tmp-level) - ?d) - (?e (gnus-summary-number-of-articles-in-thread - (and (boundp 'thread) (car thread)) gnus-tmp-level t) - ?c) - (?u gnus-tmp-user-defined ?s) - (?P (gnus-pick-line-number) ?d) - (?B gnus-tmp-thread-tree-header-string ?s)) - "An alist of format specifications that can appear in summary lines. -These are paired with what variables they correspond with, along with -the type of the variable (string, integer, character, etc).") - -(defvar gnus-summary-dummy-line-format-alist - `((?S gnus-tmp-subject ?s) - (?N gnus-tmp-number ?d) - (?u gnus-tmp-user-defined ?s))) - -(defvar gnus-summary-mode-line-format-alist - `((?G gnus-tmp-group-name ?s) - (?g (gnus-short-group-name gnus-tmp-group-name) ?s) - (?p (gnus-group-real-name gnus-tmp-group-name) ?s) - (?A gnus-tmp-article-number ?d) - (?Z gnus-tmp-unread-and-unselected ?s) - (?V gnus-version ?s) - (?U gnus-tmp-unread-and-unticked ?d) - (?S gnus-tmp-subject ?s) - (?e gnus-tmp-unselected ?d) - (?u gnus-tmp-user-defined ?s) - (?d (length gnus-newsgroup-dormant) ?d) - (?t (length gnus-newsgroup-marked) ?d) - (?r (length gnus-newsgroup-reads) ?d) - (?z (gnus-summary-article-score gnus-tmp-article-number) ?d) - (?E gnus-newsgroup-expunged-tally ?d) - (?s (gnus-current-score-file-nondirectory) ?s))) - -(defvar gnus-last-search-regexp nil - "Default regexp for article search command.") - -(defvar gnus-summary-search-article-matched-data nil - "Last matched data of article search command. It is the local variable -in `gnus-article-buffer' which consists of the list of start position, -end position and text.") - -(defvar gnus-last-shell-command nil - "Default shell command on article.") - -(defvar gnus-newsgroup-begin nil) -(defvar gnus-newsgroup-end nil) -(defvar gnus-newsgroup-last-rmail nil) -(defvar gnus-newsgroup-last-mail nil) -(defvar gnus-newsgroup-last-folder nil) -(defvar gnus-newsgroup-last-file nil) -(defvar gnus-newsgroup-auto-expire nil) -(defvar gnus-newsgroup-active nil) - -(defvar gnus-newsgroup-data nil) -(defvar gnus-newsgroup-data-reverse nil) -(defvar gnus-newsgroup-limit nil) -(defvar gnus-newsgroup-limits nil) - -(defvar gnus-newsgroup-unreads nil - "List of unread articles in the current newsgroup.") - -(defvar gnus-newsgroup-unselected nil - "List of unselected unread articles in the current newsgroup.") - -(defvar gnus-newsgroup-reads nil - "Alist of read articles and article marks in the current newsgroup.") - -(defvar gnus-newsgroup-expunged-tally nil) - -(defvar gnus-newsgroup-marked nil - "List of ticked articles in the current newsgroup (a subset of unread art).") - -(defvar gnus-newsgroup-killed nil - "List of ranges of articles that have been through the scoring process.") - -(defvar gnus-newsgroup-cached nil - "List of articles that come from the article cache.") - -(defvar gnus-newsgroup-saved nil - "List of articles that have been saved.") - -(defvar gnus-newsgroup-kill-headers nil) - -(defvar gnus-newsgroup-replied nil - "List of articles that have been replied to in the current newsgroup.") - -(defvar gnus-newsgroup-forwarded nil - "List of articles that have been forwarded in the current newsgroup.") - -(defvar gnus-newsgroup-recent nil - "List of articles that have are recent in the current newsgroup.") - -(defvar gnus-newsgroup-expirable nil - "List of articles in the current newsgroup that can be expired.") - -(defvar gnus-newsgroup-processable nil - "List of articles in the current newsgroup that can be processed.") - -(defvar gnus-newsgroup-downloadable nil - "List of articles in the current newsgroup that can be processed.") - -(defvar gnus-newsgroup-undownloaded nil - "List of articles in the current newsgroup that haven't been downloaded..") - -(defvar gnus-newsgroup-unsendable nil - "List of articles in the current newsgroup that won't be sent.") - -(defvar gnus-newsgroup-bookmarks nil - "List of articles in the current newsgroup that have bookmarks.") - -(defvar gnus-newsgroup-dormant nil - "List of dormant articles in the current newsgroup.") - -(defvar gnus-newsgroup-unseen nil - "List of unseen articles in the current newsgroup.") - -(defvar gnus-newsgroup-seen nil - "Range of seen articles in the current newsgroup.") - -(defvar gnus-newsgroup-articles nil - "List of articles in the current newsgroup.") - -(defvar gnus-newsgroup-scored nil - "List of scored articles in the current newsgroup.") - -(defvar gnus-newsgroup-incorporated nil - "List of incorporated articles in the current newsgroup.") - -(defvar gnus-newsgroup-headers nil - "List of article headers in the current newsgroup.") - -(defvar gnus-newsgroup-threads nil) - -(defvar gnus-newsgroup-prepared nil - "Whether the current group has been prepared properly.") - -(defvar gnus-newsgroup-ancient nil - "List of `gnus-fetch-old-headers' articles in the current newsgroup.") - -(defvar gnus-newsgroup-sparse nil) - -(defvar gnus-current-article nil) -(defvar gnus-article-current nil) -(defvar gnus-current-headers nil) -(defvar gnus-have-all-headers nil) -(defvar gnus-last-article nil) -(defvar gnus-newsgroup-history nil) -(defvar gnus-newsgroup-charset nil) -(defvar gnus-newsgroup-ephemeral-charset nil) -(defvar gnus-newsgroup-ephemeral-ignored-charsets nil) - -(defvar gnus-article-before-search nil) - -(defconst gnus-summary-local-variables - '(gnus-newsgroup-name - gnus-newsgroup-begin gnus-newsgroup-end - gnus-newsgroup-last-rmail gnus-newsgroup-last-mail - gnus-newsgroup-last-folder gnus-newsgroup-last-file - gnus-newsgroup-auto-expire gnus-newsgroup-unreads - gnus-newsgroup-unselected gnus-newsgroup-marked - gnus-newsgroup-reads gnus-newsgroup-saved - gnus-newsgroup-replied gnus-newsgroup-forwarded - gnus-newsgroup-recent - gnus-newsgroup-expirable - gnus-newsgroup-processable gnus-newsgroup-killed - gnus-newsgroup-downloadable gnus-newsgroup-undownloaded - gnus-newsgroup-unsendable gnus-newsgroup-unseen - gnus-newsgroup-seen gnus-newsgroup-articles - gnus-newsgroup-bookmarks gnus-newsgroup-dormant - gnus-newsgroup-headers gnus-newsgroup-threads - gnus-newsgroup-prepared gnus-summary-highlight-line-function - gnus-current-article gnus-current-headers gnus-have-all-headers - gnus-last-article gnus-article-internal-prepare-hook - gnus-newsgroup-dependencies gnus-newsgroup-selected-overlay - gnus-newsgroup-scored gnus-newsgroup-kill-headers - gnus-thread-expunge-below - gnus-score-alist gnus-current-score-file - (gnus-summary-expunge-below . global) - (gnus-summary-mark-below . global) - (gnus-orphan-score . global) - gnus-newsgroup-active gnus-scores-exclude-files - gnus-newsgroup-history gnus-newsgroup-ancient - gnus-newsgroup-sparse gnus-newsgroup-process-stack - (gnus-newsgroup-adaptive . gnus-use-adaptive-scoring) - gnus-newsgroup-adaptive-score-file (gnus-reffed-article-number . -1) - (gnus-newsgroup-expunged-tally . 0) - gnus-cache-removable-articles gnus-newsgroup-cached - gnus-newsgroup-data gnus-newsgroup-data-reverse - gnus-newsgroup-limit gnus-newsgroup-limits - gnus-newsgroup-charset gnus-newsgroup-display - gnus-newsgroup-incorporated) - "Variables that are buffer-local to the summary buffers.") - -(defvar gnus-newsgroup-variables nil - "Variables that have separate values in the newsgroups.") - -;; Byte-compiler warning. -(eval-when-compile (defvar gnus-article-mode-map)) - -;; Subject simplification. - -(defun gnus-simplify-whitespace (str) - "Remove excessive whitespace from STR." - (let ((mystr str)) - ;; Multiple spaces. - (while (string-match "[ \t][ \t]+" mystr) - (setq mystr (concat (substring mystr 0 (match-beginning 0)) - " " - (substring mystr (match-end 0))))) - ;; Leading spaces. - (when (string-match "^[ \t]+" mystr) - (setq mystr (substring mystr (match-end 0)))) - ;; Trailing spaces. - (when (string-match "[ \t]+$" mystr) - (setq mystr (substring mystr 0 (match-beginning 0)))) - mystr)) - -(defsubst gnus-simplify-subject-re (subject) - "Remove \"Re:\" from subject lines." - (if (string-match message-subject-re-regexp subject) - (substring subject (match-end 0)) - subject)) - -(defun gnus-simplify-subject (subject &optional re-only) - "Remove `Re:' and words in parentheses. -If RE-ONLY is non-nil, strip leading `Re:'s only." - (let ((case-fold-search t)) ;Ignore case. - ;; Remove `Re:', `Re^N:', `Re(n)', and `Re[n]:'. - (when (string-match "\\`\\(re\\([[(^][0-9]+[])]?\\)?:[ \t]*\\)+" subject) - (setq subject (substring subject (match-end 0)))) - ;; Remove uninteresting prefixes. - (when (and (not re-only) - gnus-simplify-ignored-prefixes - (string-match gnus-simplify-ignored-prefixes subject)) - (setq subject (substring subject (match-end 0)))) - ;; Remove words in parentheses from end. - (unless re-only - (while (string-match "[ \t\n]*([^()]*)[ \t\n]*\\'" subject) - (setq subject (substring subject 0 (match-beginning 0))))) - ;; Return subject string. - subject)) - -;; Remove any leading "re:"s, any trailing paren phrases, and simplify -;; all whitespace. -(defsubst gnus-simplify-buffer-fuzzy-step (regexp &optional newtext) - (goto-char (point-min)) - (while (re-search-forward regexp nil t) - (replace-match (or newtext "")))) - -(defun gnus-simplify-buffer-fuzzy () - "Simplify string in the buffer fuzzily. -The string in the accessible portion of the current buffer is simplified. -It is assumed to be a single-line subject. -Whitespace is generally cleaned up, and miscellaneous leading/trailing -matter is removed. Additional things can be deleted by setting -`gnus-simplify-subject-fuzzy-regexp'." - (let ((case-fold-search t) - (modified-tick)) - (gnus-simplify-buffer-fuzzy-step "\t" " ") - - (while (not (eq modified-tick (buffer-modified-tick))) - (setq modified-tick (buffer-modified-tick)) - (cond - ((listp gnus-simplify-subject-fuzzy-regexp) - (mapcar 'gnus-simplify-buffer-fuzzy-step - gnus-simplify-subject-fuzzy-regexp)) - (gnus-simplify-subject-fuzzy-regexp - (gnus-simplify-buffer-fuzzy-step gnus-simplify-subject-fuzzy-regexp))) - (gnus-simplify-buffer-fuzzy-step "^ *\\[[-+?*!][-+?*!]\\] *") - (gnus-simplify-buffer-fuzzy-step - "^ *\\(re\\|fw\\|fwd\\)[[{(^0-9]*[])}]?[:;] *") - (gnus-simplify-buffer-fuzzy-step "^[[].*:\\( .*\\)[]]$" "\\1")) - - (gnus-simplify-buffer-fuzzy-step " *[[{(][^()\n]*[]})] *$") - (gnus-simplify-buffer-fuzzy-step " +" " ") - (gnus-simplify-buffer-fuzzy-step " $") - (gnus-simplify-buffer-fuzzy-step "^ +"))) - -(defun gnus-simplify-subject-fuzzy (subject) - "Simplify a subject string fuzzily. -See `gnus-simplify-buffer-fuzzy' for details." - (save-excursion - (gnus-set-work-buffer) - (let ((case-fold-search t)) - ;; Remove uninteresting prefixes. - (when (and gnus-simplify-ignored-prefixes - (string-match gnus-simplify-ignored-prefixes subject)) - (setq subject (substring subject (match-end 0)))) - (insert subject) - (inline (gnus-simplify-buffer-fuzzy)) - (buffer-string)))) - -(defsubst gnus-simplify-subject-fully (subject) - "Simplify a subject string according to gnus-summary-gather-subject-limit." - (cond - (gnus-simplify-subject-functions - (gnus-map-function gnus-simplify-subject-functions subject)) - ((null gnus-summary-gather-subject-limit) - (gnus-simplify-subject-re subject)) - ((eq gnus-summary-gather-subject-limit 'fuzzy) - (gnus-simplify-subject-fuzzy subject)) - ((numberp gnus-summary-gather-subject-limit) - (gnus-limit-string (gnus-simplify-subject-re subject) - gnus-summary-gather-subject-limit)) - (t - subject))) - -(defsubst gnus-subject-equal (s1 s2 &optional simple-first) - "Check whether two subjects are equal. -If optional argument simple-first is t, first argument is already -simplified." - (cond - ((null simple-first) - (equal (gnus-simplify-subject-fully s1) - (gnus-simplify-subject-fully s2))) - (t - (equal s1 - (gnus-simplify-subject-fully s2))))) - -(defun gnus-summary-bubble-group () - "Increase the score of the current group. -This is a handy function to add to `gnus-summary-exit-hook' to -increase the score of each group you read." - (gnus-group-add-score gnus-newsgroup-name)) - - -;;; -;;; Gnus summary mode -;;; - -(put 'gnus-summary-mode 'mode-class 'special) - -(defvar gnus-article-commands-menu) - -(when t - ;; Non-orthogonal keys - - (gnus-define-keys gnus-summary-mode-map - " " gnus-summary-next-page - "\177" gnus-summary-prev-page - [delete] gnus-summary-prev-page - [backspace] gnus-summary-prev-page - "\r" gnus-summary-scroll-up - "\M-\r" gnus-summary-scroll-down - "n" gnus-summary-next-unread-article - "p" gnus-summary-prev-unread-article - "N" gnus-summary-next-article - "P" gnus-summary-prev-article - "\M-\C-n" gnus-summary-next-same-subject - "\M-\C-p" gnus-summary-prev-same-subject - "\M-n" gnus-summary-next-unread-subject - "\M-p" gnus-summary-prev-unread-subject - "." gnus-summary-first-unread-article - "," gnus-summary-best-unread-article - "\M-s" gnus-summary-search-article-forward - "\M-r" gnus-summary-search-article-backward - "<" gnus-summary-beginning-of-article - ">" gnus-summary-end-of-article - "j" gnus-summary-goto-article - "^" gnus-summary-refer-parent-article - "\M-^" gnus-summary-refer-article - "u" gnus-summary-tick-article-forward - "!" gnus-summary-tick-article-forward - "U" gnus-summary-tick-article-backward - "d" gnus-summary-mark-as-read-forward - "D" gnus-summary-mark-as-read-backward - "E" gnus-summary-mark-as-expirable - "\M-u" gnus-summary-clear-mark-forward - "\M-U" gnus-summary-clear-mark-backward - "k" gnus-summary-kill-same-subject-and-select - "\C-k" gnus-summary-kill-same-subject - "\M-\C-k" gnus-summary-kill-thread - "\M-\C-l" gnus-summary-lower-thread - "e" gnus-summary-edit-article - "#" gnus-summary-mark-as-processable - "\M-#" gnus-summary-unmark-as-processable - "\M-\C-t" gnus-summary-toggle-threads - "\M-\C-s" gnus-summary-show-thread - "\M-\C-h" gnus-summary-hide-thread - "\M-\C-f" gnus-summary-next-thread - "\M-\C-b" gnus-summary-prev-thread - [(meta down)] gnus-summary-next-thread - [(meta up)] gnus-summary-prev-thread - "\M-\C-u" gnus-summary-up-thread - "\M-\C-d" gnus-summary-down-thread - "&" gnus-summary-execute-command - "c" gnus-summary-catchup-and-exit - "\C-w" gnus-summary-mark-region-as-read - "\C-t" gnus-summary-toggle-truncation - "?" gnus-summary-mark-as-dormant - "\C-c\M-\C-s" gnus-summary-limit-include-expunged - "\C-c\C-s\C-n" gnus-summary-sort-by-number - "\C-c\C-s\C-l" gnus-summary-sort-by-lines - "\C-c\C-s\C-c" gnus-summary-sort-by-chars - "\C-c\C-s\C-a" gnus-summary-sort-by-author - "\C-c\C-s\C-s" gnus-summary-sort-by-subject - "\C-c\C-s\C-d" gnus-summary-sort-by-date - "\C-c\C-s\C-i" gnus-summary-sort-by-score - "\C-c\C-s\C-o" gnus-summary-sort-by-original - "=" gnus-summary-expand-window - "\C-x\C-s" gnus-summary-reselect-current-group - "\M-g" gnus-summary-rescan-group - "w" gnus-summary-stop-page-breaking - "\C-c\C-r" gnus-summary-caesar-message - "\M-t" gnus-summary-toggle-mime - "f" gnus-summary-followup - "F" gnus-summary-followup-with-original - "C" gnus-summary-cancel-article - "r" gnus-summary-reply - "R" gnus-summary-reply-with-original - "\C-c\C-f" gnus-summary-mail-forward - "o" gnus-summary-save-article - "\C-o" gnus-summary-save-article-mail - "|" gnus-summary-pipe-output - "\M-k" gnus-summary-edit-local-kill - "\M-K" gnus-summary-edit-global-kill - ;; "V" gnus-version - "\C-c\C-d" gnus-summary-describe-group - "q" gnus-summary-exit - "Q" gnus-summary-exit-no-update - "\C-c\C-i" gnus-info-find-node - gnus-mouse-2 gnus-mouse-pick-article - "m" gnus-summary-mail-other-window - "a" gnus-summary-post-news - "x" gnus-summary-limit-to-unread - "s" gnus-summary-isearch-article - "t" gnus-article-toggle-headers - "g" gnus-summary-show-article - "l" gnus-summary-goto-last-article - "v" gnus-summary-preview-mime-message - "\C-c\C-v\C-v" gnus-uu-decode-uu-view - "\C-d" gnus-summary-enter-digest-group - "\M-\C-d" gnus-summary-read-document - "\M-\C-e" gnus-summary-edit-parameters - "\M-\C-a" gnus-summary-customize-parameters - "\C-c\C-b" gnus-bug - "*" gnus-cache-enter-article - "\M-*" gnus-cache-remove-article - "\M-&" gnus-summary-universal-argument - "\C-l" gnus-recenter - "I" gnus-summary-increase-score - "L" gnus-summary-lower-score - "\M-i" gnus-symbolic-argument - "h" gnus-summary-select-article-buffer - - "V" gnus-summary-score-map - "X" gnus-uu-extract-map - "S" gnus-summary-send-map) - - ;; Sort of orthogonal keymap - (gnus-define-keys (gnus-summary-mark-map "M" gnus-summary-mode-map) - "t" gnus-summary-tick-article-forward - "!" gnus-summary-tick-article-forward - "d" gnus-summary-mark-as-read-forward - "r" gnus-summary-mark-as-read-forward - "c" gnus-summary-clear-mark-forward - " " gnus-summary-clear-mark-forward - "e" gnus-summary-mark-as-expirable - "x" gnus-summary-mark-as-expirable - "?" gnus-summary-mark-as-dormant - "b" gnus-summary-set-bookmark - "B" gnus-summary-remove-bookmark - "#" gnus-summary-mark-as-processable - "\M-#" gnus-summary-unmark-as-processable - "S" gnus-summary-limit-include-expunged - "C" gnus-summary-catchup - "H" gnus-summary-catchup-to-here - "h" gnus-summary-catchup-from-here - "\C-c" gnus-summary-catchup-all - "k" gnus-summary-kill-same-subject-and-select - "K" gnus-summary-kill-same-subject - "P" gnus-uu-mark-map) - - (gnus-define-keys (gnus-summary-mscore-map "V" gnus-summary-mark-map) - "c" gnus-summary-clear-above - "u" gnus-summary-tick-above - "m" gnus-summary-mark-above - "k" gnus-summary-kill-below) - - (gnus-define-keys (gnus-summary-limit-map "/" gnus-summary-mode-map) - "/" gnus-summary-limit-to-subject - "n" gnus-summary-limit-to-articles - "w" gnus-summary-pop-limit - "s" gnus-summary-limit-to-subject - "a" gnus-summary-limit-to-author - "u" gnus-summary-limit-to-unread - "m" gnus-summary-limit-to-marks - "M" gnus-summary-limit-exclude-marks - "v" gnus-summary-limit-to-score - "*" gnus-summary-limit-include-cached - "D" gnus-summary-limit-include-dormant - "T" gnus-summary-limit-include-thread - "d" gnus-summary-limit-exclude-dormant - "t" gnus-summary-limit-to-age - "x" gnus-summary-limit-to-extra - "p" gnus-summary-limit-to-display-predicate - "E" gnus-summary-limit-include-expunged - "c" gnus-summary-limit-exclude-childless-dormant - "C" gnus-summary-limit-mark-excluded-as-read - "o" gnus-summary-insert-old-articles - "N" gnus-summary-insert-new-articles) - - (gnus-define-keys (gnus-summary-goto-map "G" gnus-summary-mode-map) - "n" gnus-summary-next-unread-article - "p" gnus-summary-prev-unread-article - "N" gnus-summary-next-article - "P" gnus-summary-prev-article - "\C-n" gnus-summary-next-same-subject - "\C-p" gnus-summary-prev-same-subject - "\M-n" gnus-summary-next-unread-subject - "\M-p" gnus-summary-prev-unread-subject - "f" gnus-summary-first-unread-article - "b" gnus-summary-best-unread-article - "j" gnus-summary-goto-article - "g" gnus-summary-goto-subject - "l" gnus-summary-goto-last-article - "o" gnus-summary-pop-article) - - (gnus-define-keys (gnus-summary-thread-map "T" gnus-summary-mode-map) - "k" gnus-summary-kill-thread - "l" gnus-summary-lower-thread - "i" gnus-summary-raise-thread - "T" gnus-summary-toggle-threads - "t" gnus-summary-rethread-current - "^" gnus-summary-reparent-thread - "s" gnus-summary-show-thread - "S" gnus-summary-show-all-threads - "h" gnus-summary-hide-thread - "H" gnus-summary-hide-all-threads - "n" gnus-summary-next-thread - "p" gnus-summary-prev-thread - "u" gnus-summary-up-thread - "o" gnus-summary-top-thread - "d" gnus-summary-down-thread - "#" gnus-uu-mark-thread - "\M-#" gnus-uu-unmark-thread) - - (gnus-define-keys (gnus-summary-buffer-map "Y" gnus-summary-mode-map) - "g" gnus-summary-prepare - "c" gnus-summary-insert-cached-articles) - - (gnus-define-keys (gnus-summary-exit-map "Z" gnus-summary-mode-map) - "c" gnus-summary-catchup-and-exit - "C" gnus-summary-catchup-all-and-exit - "E" gnus-summary-exit-no-update - "J" gnus-summary-jump-to-other-group - "Q" gnus-summary-exit - "Z" gnus-summary-exit - "n" gnus-summary-catchup-and-goto-next-group - "R" gnus-summary-reselect-current-group - "G" gnus-summary-rescan-group - "N" gnus-summary-next-group - "s" gnus-summary-save-newsrc - "P" gnus-summary-prev-group) - - (gnus-define-keys (gnus-summary-article-map "A" gnus-summary-mode-map) - " " gnus-summary-next-page - "n" gnus-summary-next-page - "\177" gnus-summary-prev-page - [delete] gnus-summary-prev-page - "p" gnus-summary-prev-page - "\r" gnus-summary-scroll-up - "\M-\r" gnus-summary-scroll-down - "<" gnus-summary-beginning-of-article - ">" gnus-summary-end-of-article - "b" gnus-summary-beginning-of-article - "e" gnus-summary-end-of-article - "^" gnus-summary-refer-parent-article - "r" gnus-summary-refer-parent-article - "D" gnus-summary-enter-digest-group - "R" gnus-summary-refer-references - "T" gnus-summary-refer-thread - "g" gnus-summary-show-article - "s" gnus-summary-isearch-article - "P" gnus-summary-print-article - "M" gnus-mailing-list-insinuate - "t" gnus-article-babel) - - (gnus-define-keys (gnus-summary-wash-map "W" gnus-summary-mode-map) - "b" gnus-article-add-buttons - "B" gnus-article-add-buttons-to-head - "o" gnus-article-treat-overstrike - "e" gnus-article-emphasize - "w" gnus-article-fill-cited-article - "Q" gnus-article-fill-long-lines - "C" gnus-article-capitalize-sentences - "c" gnus-article-remove-cr - "Z" gnus-article-decode-HZ - "f" gnus-article-display-x-face - "l" gnus-summary-stop-page-breaking - "r" gnus-summary-caesar-message - "t" gnus-article-toggle-headers - "v" gnus-summary-verbose-headers - "m" gnus-summary-toggle-mime - "a" gnus-article-strip-headers-in-body ;; mnemonic: wash archive - "p" gnus-article-verify-x-pgp-sig - "d" gnus-article-treat-dumbquotes - "s" gnus-smiley-display) - - (gnus-define-keys (gnus-summary-wash-hide-map "W" gnus-summary-wash-map) - "a" gnus-article-hide - "h" gnus-article-toggle-headers - "b" gnus-article-hide-boring-headers - "s" gnus-article-hide-signature - "c" gnus-article-hide-citation - "C" gnus-article-hide-citation-in-followups - "l" gnus-article-hide-list-identifiers - "p" gnus-article-hide-pgp - "B" gnus-article-strip-banner - "P" gnus-article-hide-pem - "\C-c" gnus-article-hide-citation-maybe) - - (gnus-define-keys (gnus-summary-wash-highlight-map "H" gnus-summary-wash-map) - "a" gnus-article-highlight - "h" gnus-article-highlight-headers - "c" gnus-article-highlight-citation - "s" gnus-article-highlight-signature) - - (gnus-define-keys (gnus-summary-wash-time-map "T" gnus-summary-wash-map) - "z" gnus-article-date-ut - "u" gnus-article-date-ut - "l" gnus-article-date-local - "p" gnus-article-date-english - "e" gnus-article-date-lapsed - "o" gnus-article-date-original - "i" gnus-article-date-iso8601 - "s" gnus-article-date-user) - - (gnus-define-keys (gnus-summary-wash-empty-map "E" gnus-summary-wash-map) - "t" gnus-article-remove-trailing-blank-lines - "l" gnus-article-strip-leading-blank-lines - "m" gnus-article-strip-multiple-blank-lines - "a" gnus-article-strip-blank-lines - "A" gnus-article-strip-all-blank-lines - "s" gnus-article-strip-leading-space - "e" gnus-article-strip-trailing-space - "w" gnus-article-remove-leading-whitespace) - - (gnus-define-keys (gnus-summary-help-map "H" gnus-summary-mode-map) - "v" gnus-version - "f" gnus-summary-fetch-faq - "d" gnus-summary-describe-group - "h" gnus-summary-describe-briefly - "i" gnus-info-find-node) - - (gnus-define-keys (gnus-summary-backend-map "B" gnus-summary-mode-map) - "e" gnus-summary-expire-articles - "\M-\C-e" gnus-summary-expire-articles-now - "\177" gnus-summary-delete-article - [delete] gnus-summary-delete-article - [backspace] gnus-summary-delete-article - "m" gnus-summary-move-article - "r" gnus-summary-respool-article - "w" gnus-summary-edit-article - "c" gnus-summary-copy-article - "B" gnus-summary-crosspost-article - "q" gnus-summary-respool-query - "t" gnus-summary-respool-trace - "i" gnus-summary-import-article - "I" gnus-summary-create-article - "p" gnus-summary-article-posted-p) - - (gnus-define-keys (gnus-summary-save-map "O" gnus-summary-mode-map) - "o" gnus-summary-save-article - "m" gnus-summary-save-article-mail - "F" gnus-summary-write-article-file - "r" gnus-summary-save-article-rmail - "f" gnus-summary-save-article-file - "b" gnus-summary-save-article-body-file - "h" gnus-summary-save-article-folder - "v" gnus-summary-save-article-vm - "p" gnus-summary-pipe-output - "s" gnus-soup-add-article) - - (gnus-define-keys (gnus-summary-mime-map "K" gnus-summary-mode-map) - "b" gnus-summary-display-buttonized - "m" gnus-summary-repair-multipart - "v" gnus-article-view-part - "o" gnus-article-save-part - "c" gnus-article-copy-part - "C" gnus-article-view-part-as-charset - "e" gnus-article-externalize-part - "E" gnus-article-encrypt-body - "i" gnus-article-inline-part - "|" gnus-article-pipe-part)) - -(defvar gnus-article-post-menu nil) - -(defun gnus-summary-make-menu-bar () - (gnus-turn-off-edit-menu 'summary) - - (unless (boundp 'gnus-summary-misc-menu) - - (easy-menu-define - gnus-summary-kill-menu gnus-summary-mode-map "" - (cons - "Score" - (nconc - (list - ["Customize" gnus-score-customize t]) - (gnus-make-score-map 'increase) - (gnus-make-score-map 'lower) - '(("Mark" - ["Kill below" gnus-summary-kill-below t] - ["Mark above" gnus-summary-mark-above t] - ["Tick above" gnus-summary-tick-above t] - ["Clear above" gnus-summary-clear-above t]) - ["Current score" gnus-summary-current-score t] - ["Set score" gnus-summary-set-score t] - ["Switch current score file..." gnus-score-change-score-file t] - ["Set mark below..." gnus-score-set-mark-below t] - ["Set expunge below..." gnus-score-set-expunge-below t] - ["Edit current score file" gnus-score-edit-current-scores t] - ["Edit score file" gnus-score-edit-file t] - ["Trace score" gnus-score-find-trace t] - ["Find words" gnus-score-find-favourite-words t] - ["Rescore buffer" gnus-summary-rescore t] - ["Increase score..." gnus-summary-increase-score t] - ["Lower score..." gnus-summary-lower-score t])))) - - ;; Define both the Article menu in the summary buffer and the equivalent - ;; Commands menu in the article buffer here for consistency. - (let ((innards - `(("Hide" - ["All" gnus-article-hide t] - ["Headers" gnus-article-toggle-headers t] - ["Signature" gnus-article-hide-signature t] - ["Citation" gnus-article-hide-citation t] - ["List identifiers" gnus-article-hide-list-identifiers t] - ["PGP" gnus-article-hide-pgp t] - ["Banner" gnus-article-strip-banner t] - ["Boring headers" gnus-article-hide-boring-headers t]) - ("Highlight" - ["All" gnus-article-highlight t] - ["Headers" gnus-article-highlight-headers t] - ["Signature" gnus-article-highlight-signature t] - ["Citation" gnus-article-highlight-citation t]) - ("Date" - ["Local" gnus-article-date-local t] - ["ISO8601" gnus-article-date-iso8601 t] - ["UT" gnus-article-date-ut t] - ["Original" gnus-article-date-original t] - ["Lapsed" gnus-article-date-lapsed t] - ["User-defined" gnus-article-date-user t]) - ("Washing" - ("Remove Blanks" - ["Leading" gnus-article-strip-leading-blank-lines t] - ["Multiple" gnus-article-strip-multiple-blank-lines t] - ["Trailing" gnus-article-remove-trailing-blank-lines t] - ["All of the above" gnus-article-strip-blank-lines t] - ["All" gnus-article-strip-all-blank-lines t] - ["Leading space" gnus-article-strip-leading-space t] - ["Trailing space" gnus-article-strip-trailing-space t] - ["Leading space in headers" - gnus-article-remove-leading-whitespace t]) - ["Overstrike" gnus-article-treat-overstrike t] - ["Dumb quotes" gnus-article-treat-dumbquotes t] - ["Emphasis" gnus-article-emphasize t] - ["Word wrap" gnus-article-fill-cited-article t] - ["Fill long lines" gnus-article-fill-long-lines t] - ["Capitalize sentences" gnus-article-capitalize-sentences t] - ["CR" gnus-article-remove-cr t] - ["Show X-Face" gnus-article-display-x-face t] - ["Rot 13" gnus-summary-caesar-message - ,@(if (featurep 'xemacs) '(t) - '(:help "\"Caesar rotate\" article by 13"))] - ["Unix pipe" gnus-summary-pipe-message t] - ["Add buttons" gnus-article-add-buttons t] - ["Add buttons to head" gnus-article-add-buttons-to-head t] - ["Stop page breaking" gnus-summary-stop-page-breaking t] - ["Toggle MIME" gnus-summary-toggle-mime t] - ["Verbose header" gnus-summary-verbose-headers t] - ["Toggle header" gnus-summary-toggle-header t] - ["Toggle smileys" gnus-smiley-display t] - ["Verify X-PGP-Sig" gnus-article-verify-x-pgp-sig t] - ["HZ" gnus-article-decode-HZ t]) - ("Output" - ["Save in default format" gnus-summary-save-article - ,@(if (featurep 'xemacs) '(t) - '(:help "Save article using default method"))] - ["Save in file" gnus-summary-save-article-file - ,@(if (featurep 'xemacs) '(t) - '(:help "Save article in file"))] - ["Save in Unix mail format" gnus-summary-save-article-mail t] - ["Save in MH folder" gnus-summary-save-article-folder t] - ["Save in VM folder" gnus-summary-save-article-vm t] - ["Save in RMAIL mbox" gnus-summary-save-article-rmail t] - ["Save body in file" gnus-summary-save-article-body-file t] - ["Pipe through a filter" gnus-summary-pipe-output t] - ["Add to SOUP packet" gnus-soup-add-article t] - ["Print" gnus-summary-print-article t]) - ("Backend" - ["Respool article..." gnus-summary-respool-article t] - ["Move article..." gnus-summary-move-article - (gnus-check-backend-function - 'request-move-article gnus-newsgroup-name)] - ["Copy article..." gnus-summary-copy-article t] - ["Crosspost article..." gnus-summary-crosspost-article - (gnus-check-backend-function - 'request-replace-article gnus-newsgroup-name)] - ["Import file..." gnus-summary-import-article t] - ["Create article..." gnus-summary-create-article t] - ["Check if posted" gnus-summary-article-posted-p t] - ["Edit article" gnus-summary-edit-article - (not (gnus-group-read-only-p))] - ["Delete article" gnus-summary-delete-article - (gnus-check-backend-function - 'request-expire-articles gnus-newsgroup-name)] - ["Query respool" gnus-summary-respool-query t] - ["Trace respool" gnus-summary-respool-trace t] - ["Delete expirable articles" gnus-summary-expire-articles-now - (gnus-check-backend-function - 'request-expire-articles gnus-newsgroup-name)]) - ("Extract" - ["Uudecode" gnus-uu-decode-uu - ,@(if (featurep 'xemacs) '(t) - '(:help "Decode uuencoded article(s)"))] - ["Uudecode and save" gnus-uu-decode-uu-and-save t] - ["Unshar" gnus-uu-decode-unshar t] - ["Unshar and save" gnus-uu-decode-unshar-and-save t] - ["Save" gnus-uu-decode-save t] - ["Binhex" gnus-uu-decode-binhex t] - ["Postscript" gnus-uu-decode-postscript t]) - ("Cache" - ["Enter article" gnus-cache-enter-article t] - ["Remove article" gnus-cache-remove-article t]) - ["Translate" gnus-article-babel t] - ["Select article buffer" gnus-summary-select-article-buffer t] - ["Enter digest buffer" gnus-summary-enter-digest-group t] - ["Isearch article..." gnus-summary-isearch-article t] - ["Beginning of the article" gnus-summary-beginning-of-article t] - ["End of the article" gnus-summary-end-of-article t] - ["Fetch parent of article" gnus-summary-refer-parent-article t] - ["Fetch referenced articles" gnus-summary-refer-references t] - ["Fetch current thread" gnus-summary-refer-thread t] - ["Fetch article with id..." gnus-summary-refer-article t] - ["Setup Mailing List Params" gnus-mailing-list-insinuate t] - ["Redisplay" gnus-summary-show-article t] - ["Raw article" gnus-summary-show-raw-article t]))) - (easy-menu-define - gnus-summary-article-menu gnus-summary-mode-map "" - (cons "Article" innards)) - - (if (not (keymapp gnus-summary-article-menu)) - (easy-menu-define - gnus-article-commands-menu gnus-article-mode-map "" - (cons "Commands" innards)) - ;; in Emacs, don't share menu. - (setq gnus-article-commands-menu - (copy-keymap gnus-summary-article-menu)) - (define-key gnus-article-mode-map [menu-bar commands] - (cons "Commands" gnus-article-commands-menu)))) - - (easy-menu-define - gnus-summary-thread-menu gnus-summary-mode-map "" - '("Threads" - ["Toggle threading" gnus-summary-toggle-threads t] - ["Hide threads" gnus-summary-hide-all-threads t] - ["Show threads" gnus-summary-show-all-threads t] - ["Hide thread" gnus-summary-hide-thread t] - ["Show thread" gnus-summary-show-thread t] - ["Go to next thread" gnus-summary-next-thread t] - ["Go to previous thread" gnus-summary-prev-thread t] - ["Go down thread" gnus-summary-down-thread t] - ["Go up thread" gnus-summary-up-thread t] - ["Top of thread" gnus-summary-top-thread t] - ["Mark thread as read" gnus-summary-kill-thread t] - ["Lower thread score" gnus-summary-lower-thread t] - ["Raise thread score" gnus-summary-raise-thread t] - ["Rethread current" gnus-summary-rethread-current t])) - - (easy-menu-define - gnus-summary-post-menu gnus-summary-mode-map "" - `("Post" - ["Post an article" gnus-summary-post-news - ,@(if (featurep 'xemacs) '(t) - '(:help "Post an article"))] - ["Followup" gnus-summary-followup - ,@(if (featurep 'xemacs) '(t) - '(:help "Post followup to this article"))] - ["Followup and yank" gnus-summary-followup-with-original - ,@(if (featurep 'xemacs) '(t) - '(:help "Post followup to this article, quoting its contents"))] - ["Supersede article" gnus-summary-supersede-article t] - ["Cancel article" gnus-summary-cancel-article - ,@(if (featurep 'xemacs) '(t) - '(:help "Cancel an article you posted"))] - ["Reply" gnus-summary-reply t] - ["Reply and yank" gnus-summary-reply-with-original t] - ["Wide reply" gnus-summary-wide-reply t] - ["Wide reply and yank" gnus-summary-wide-reply-with-original - ,@(if (featurep 'xemacs) '(t) - '(:help "Mail a reply, quoting this article"))] - ["Mail forward" gnus-summary-mail-forward t] - ["Post forward" gnus-summary-post-forward t] - ["Digest and mail" gnus-summary-digest-mail-forward t] - ["Digest and post" gnus-summary-digest-post-forward t] - ["Resend message" gnus-summary-resend-message t] - ["Send bounced mail" gnus-summary-resend-bounced-mail t] - ["Send a mail" gnus-summary-mail-other-window t] - ["Uuencode and post" gnus-uu-post-news - ,@(if (featurep 'xemacs) '(t) - '(:help "Post a uuencoded article"))] - ["Followup via news" gnus-summary-followup-to-mail t] - ["Followup via news and yank" - gnus-summary-followup-to-mail-with-original t] - ;;("Draft" - ;;["Send" gnus-summary-send-draft t] - ;;["Send bounced" gnus-resend-bounced-mail t]) - )) - - (cond - ((not (keymapp gnus-summary-post-menu)) - (setq gnus-article-post-menu gnus-summary-post-menu)) - ((not gnus-article-post-menu) - ;; Don't share post menu. - (setq gnus-article-post-menu - (copy-keymap gnus-summary-post-menu)))) - (define-key gnus-article-mode-map [menu-bar post] - (cons "Post" gnus-article-post-menu)) - - (easy-menu-define - gnus-summary-misc-menu gnus-summary-mode-map "" - `("Gnus" - ("Mark Read" - ["Mark as read" gnus-summary-mark-as-read-forward t] - ["Mark same subject and select" - gnus-summary-kill-same-subject-and-select t] - ["Mark same subject" gnus-summary-kill-same-subject t] - ["Catchup" gnus-summary-catchup - ,@(if (featurep 'xemacs) '(t) - '(:help "Mark unread articles in this group as read"))] - ["Catchup all" gnus-summary-catchup-all t] - ["Catchup to here" gnus-summary-catchup-to-here t] - ["Catchup from here" gnus-summary-catchup-from-here t] - ["Catchup region" gnus-summary-mark-region-as-read t] - ["Mark excluded" gnus-summary-limit-mark-excluded-as-read t]) - ("Mark Various" - ["Tick" gnus-summary-tick-article-forward t] - ["Mark as dormant" gnus-summary-mark-as-dormant t] - ["Remove marks" gnus-summary-clear-mark-forward t] - ["Set expirable mark" gnus-summary-mark-as-expirable t] - ["Set bookmark" gnus-summary-set-bookmark t] - ["Remove bookmark" gnus-summary-remove-bookmark t]) - ("Mark Limit" - ["Marks..." gnus-summary-limit-to-marks t] - ["Subject..." gnus-summary-limit-to-subject t] - ["Author..." gnus-summary-limit-to-author t] - ["Age..." gnus-summary-limit-to-age t] - ["Extra..." gnus-summary-limit-to-extra t] - ["Score" gnus-summary-limit-to-score t] - ["Score" gnus-summary-limit-to-display-predicate t] - ["Unread" gnus-summary-limit-to-unread t] - ["Non-dormant" gnus-summary-limit-exclude-dormant t] - ["Articles" gnus-summary-limit-to-articles t] - ["Pop limit" gnus-summary-pop-limit t] - ["Show dormant" gnus-summary-limit-include-dormant t] - ["Hide childless dormant" - gnus-summary-limit-exclude-childless-dormant t] - ;;["Hide thread" gnus-summary-limit-exclude-thread t] - ["Hide marked" gnus-summary-limit-exclude-marks t] - ["Show expunged" gnus-summary-limit-include-expunged t]) - ("Process Mark" - ["Set mark" gnus-summary-mark-as-processable t] - ["Remove mark" gnus-summary-unmark-as-processable t] - ["Remove all marks" gnus-summary-unmark-all-processable t] - ["Mark above" gnus-uu-mark-over t] - ["Mark series" gnus-uu-mark-series t] - ["Mark region" gnus-uu-mark-region t] - ["Unmark region" gnus-uu-unmark-region t] - ["Mark by regexp..." gnus-uu-mark-by-regexp t] - ["Unmark by regexp..." gnus-uu-unmark-by-regexp t] - ["Mark all" gnus-uu-mark-all t] - ["Mark buffer" gnus-uu-mark-buffer t] - ["Mark sparse" gnus-uu-mark-sparse t] - ["Mark thread" gnus-uu-mark-thread t] - ["Unmark thread" gnus-uu-unmark-thread t] - ("Process Mark Sets" - ["Kill" gnus-summary-kill-process-mark t] - ["Yank" gnus-summary-yank-process-mark - gnus-newsgroup-process-stack] - ["Save" gnus-summary-save-process-mark t])) - ("Scroll article" - ["Page forward" gnus-summary-next-page - ,@(if (featurep 'xemacs) '(t) - '(:help "Show next page of article"))] - ["Page backward" gnus-summary-prev-page - ,@(if (featurep 'xemacs) '(t) - '(:help "Show previous page of article"))] - ["Line forward" gnus-summary-scroll-up t]) - ("Move" - ["Next unread article" gnus-summary-next-unread-article t] - ["Previous unread article" gnus-summary-prev-unread-article t] - ["Next article" gnus-summary-next-article t] - ["Previous article" gnus-summary-prev-article t] - ["Next unread subject" gnus-summary-next-unread-subject t] - ["Previous unread subject" gnus-summary-prev-unread-subject t] - ["Next article same subject" gnus-summary-next-same-subject t] - ["Previous article same subject" gnus-summary-prev-same-subject t] - ["First unread article" gnus-summary-first-unread-article t] - ["Best unread article" gnus-summary-best-unread-article t] - ["Go to subject number..." gnus-summary-goto-subject t] - ["Go to article number..." gnus-summary-goto-article t] - ["Go to the last article" gnus-summary-goto-last-article t] - ["Pop article off history" gnus-summary-pop-article t]) - ("Sort" - ["Sort by number" gnus-summary-sort-by-number t] - ["Sort by author" gnus-summary-sort-by-author t] - ["Sort by subject" gnus-summary-sort-by-subject t] - ["Sort by date" gnus-summary-sort-by-date t] - ["Sort by score" gnus-summary-sort-by-score t] - ["Sort by lines" gnus-summary-sort-by-lines t] - ["Sort by characters" gnus-summary-sort-by-chars t] - ["Original sort" gnus-summary-sort-by-original t]) - ("Help" - ["Fetch group FAQ" gnus-summary-fetch-faq t] - ["Describe group" gnus-summary-describe-group t] - ["Read manual" gnus-info-find-node t]) - ("Modes" - ["Pick and read" gnus-pick-mode t] - ["Binary" gnus-binary-mode t]) - ("Regeneration" - ["Regenerate" gnus-summary-prepare t] - ["Insert cached articles" gnus-summary-insert-cached-articles t] - ["Toggle threading" gnus-summary-toggle-threads t]) - ["See old articles" gnus-summary-insert-old-articles t] - ["See new articles" gnus-summary-insert-new-articles t] - ["Filter articles..." gnus-summary-execute-command t] - ["Run command on subjects..." gnus-summary-universal-argument t] - ["Search articles forward..." gnus-summary-search-article-forward t] - ["Search articles backward..." gnus-summary-search-article-backward t] - ["Toggle line truncation" gnus-summary-toggle-truncation t] - ["Expand window" gnus-summary-expand-window t] - ["Expire expirable articles" gnus-summary-expire-articles - (gnus-check-backend-function - 'request-expire-articles gnus-newsgroup-name)] - ["Edit local kill file" gnus-summary-edit-local-kill t] - ["Edit main kill file" gnus-summary-edit-global-kill t] - ["Edit group parameters" gnus-summary-edit-parameters t] - ["Customize group parameters" gnus-summary-customize-parameters t] - ["Send a bug report" gnus-bug t] - ("Exit" - ["Catchup and exit" gnus-summary-catchup-and-exit - ,@(if (featurep 'xemacs) '(t) - '(:help "Mark unread articles in this group as read, then exit"))] - ["Catchup all and exit" gnus-summary-catchup-all-and-exit t] - ["Catchup and goto next" gnus-summary-catchup-and-goto-next-group t] - ["Exit group" gnus-summary-exit - ,@(if (featurep 'xemacs) '(t) - '(:help "Exit current group, return to group selection mode"))] - ["Exit group without updating" gnus-summary-exit-no-update t] - ["Exit and goto next group" gnus-summary-next-group t] - ["Exit and goto prev group" gnus-summary-prev-group t] - ["Reselect group" gnus-summary-reselect-current-group t] - ["Rescan group" gnus-summary-rescan-group t] - ["Update dribble" gnus-summary-save-newsrc t]))) - - (gnus-run-hooks 'gnus-summary-menu-hook))) - -(defvar gnus-summary-tool-bar-map nil) - -;; Emacs 21 tool bar. Should be no-op otherwise. -(defun gnus-summary-make-tool-bar () - (if (and (fboundp 'tool-bar-add-item-from-menu) - (default-value 'tool-bar-mode) - (not gnus-summary-tool-bar-map)) - (setq gnus-summary-tool-bar-map - (let ((tool-bar-map (make-sparse-keymap)) - (load-path (mm-image-load-path))) - (tool-bar-add-item-from-menu - 'gnus-summary-prev-unread "prev-ur" gnus-summary-mode-map) - (tool-bar-add-item-from-menu - 'gnus-summary-next-unread "next-ur" gnus-summary-mode-map) - (tool-bar-add-item-from-menu - 'gnus-summary-post-news "post" gnus-summary-mode-map) - (tool-bar-add-item-from-menu - 'gnus-summary-followup-with-original "fuwo" gnus-summary-mode-map) - (tool-bar-add-item-from-menu - 'gnus-summary-followup "followup" gnus-summary-mode-map) - (tool-bar-add-item-from-menu - 'gnus-summary-reply-with-original "reply-wo" gnus-summary-mode-map) - (tool-bar-add-item-from-menu - 'gnus-summary-reply "reply" gnus-summary-mode-map) - (tool-bar-add-item-from-menu - 'gnus-summary-caesar-message "rot13" gnus-summary-mode-map) - (tool-bar-add-item-from-menu - 'gnus-uu-decode-uu "uu-decode" gnus-summary-mode-map) - (tool-bar-add-item-from-menu - 'gnus-summary-save-article-file "save-aif" gnus-summary-mode-map) - (tool-bar-add-item-from-menu - 'gnus-summary-save-article "save-art" gnus-summary-mode-map) - (tool-bar-add-item-from-menu - 'gnus-uu-post-news "uu-post" gnus-summary-mode-map) - (tool-bar-add-item-from-menu - 'gnus-summary-catchup "catchup" gnus-summary-mode-map) - (tool-bar-add-item-from-menu - 'gnus-summary-catchup-and-exit "cu-exit" gnus-summary-mode-map) - (tool-bar-add-item-from-menu - 'gnus-summary-exit "exit-summ" gnus-summary-mode-map) - tool-bar-map))) - (if gnus-summary-tool-bar-map - (set (make-local-variable 'tool-bar-map) gnus-summary-tool-bar-map))) - -(defun gnus-score-set-default (var value) - "A version of set that updates the GNU Emacs menu-bar." - (set var value) - ;; It is the message that forces the active status to be updated. - (message "")) - -(defun gnus-make-score-map (type) - "Make a summary score map of type TYPE." - (if t - nil - (let ((headers '(("author" "from" string) - ("subject" "subject" string) - ("article body" "body" string) - ("article head" "head" string) - ("xref" "xref" string) - ("extra header" "extra" string) - ("lines" "lines" number) - ("followups to author" "followup" string))) - (types '((number ("less than" <) - ("greater than" >) - ("equal" =)) - (string ("substring" s) - ("exact string" e) - ("fuzzy string" f) - ("regexp" r)))) - (perms '(("temporary" (current-time-string)) - ("permanent" nil) - ("immediate" now))) - header) - (list - (apply - 'nconc - (list - (if (eq type 'lower) - "Lower score" - "Increase score")) - (let (outh) - (while headers - (setq header (car headers)) - (setq outh - (cons - (apply - 'nconc - (list (car header)) - (let ((ts (cdr (assoc (nth 2 header) types))) - outt) - (while ts - (setq outt - (cons - (apply - 'nconc - (list (caar ts)) - (let ((ps perms) - outp) - (while ps - (setq outp - (cons - (vector - (caar ps) - (list - 'gnus-summary-score-entry - (nth 1 header) - (if (or (string= (nth 1 header) - "head") - (string= (nth 1 header) - "body")) - "" - (list 'gnus-summary-header - (nth 1 header))) - (list 'quote (nth 1 (car ts))) - (list 'gnus-score-delta-default - nil) - (nth 1 (car ps)) - t) - t) - outp)) - (setq ps (cdr ps))) - (list (nreverse outp)))) - outt)) - (setq ts (cdr ts))) - (list (nreverse outt)))) - outh)) - (setq headers (cdr headers))) - (list (nreverse outh)))))))) - - - -(defun gnus-summary-mode (&optional group) - "Major mode for reading articles. - -All normal editing commands are switched off. -\\ -Each line in this buffer represents one article. To read an -article, you can, for instance, type `\\[gnus-summary-next-page]'. To move forwards -and backwards while displaying articles, type `\\[gnus-summary-next-unread-article]' and `\\[gnus-summary-prev-unread-article]', -respectively. - -You can also post articles and send mail from this buffer. To -follow up an article, type `\\[gnus-summary-followup]'. To mail a reply to the author -of an article, type `\\[gnus-summary-reply]'. - -There are approx. one gazillion commands you can execute in this -buffer; read the info pages for more information (`\\[gnus-info-find-node]'). - -The following commands are available: - -\\{gnus-summary-mode-map}" - (interactive) - (kill-all-local-variables) - (when (gnus-visual-p 'summary-menu 'menu) - (gnus-summary-make-menu-bar) - (gnus-summary-make-tool-bar)) - (gnus-summary-make-local-variables) - (let ((gnus-summary-local-variables gnus-newsgroup-variables)) - (gnus-summary-make-local-variables)) - (gnus-make-thread-indent-array) - (gnus-simplify-mode-line) - (setq major-mode 'gnus-summary-mode) - (setq mode-name "Summary") - (make-local-variable 'minor-mode-alist) - (use-local-map gnus-summary-mode-map) - (buffer-disable-undo) - (setq buffer-read-only t) ;Disable modification - (setq truncate-lines t) - (setq selective-display t) - (setq selective-display-ellipses t) ;Display `...' - (gnus-summary-set-display-table) - (gnus-set-default-directory) - (setq gnus-newsgroup-name group) - (unless (gnus-news-group-p group) - (setq gnus-newsgroup-incorporated - (nnmail-new-mail-numbers (gnus-group-real-name group)))) - (make-local-variable 'gnus-summary-line-format) - (make-local-variable 'gnus-summary-line-format-spec) - (make-local-variable 'gnus-summary-dummy-line-format) - (make-local-variable 'gnus-summary-dummy-line-format-spec) - (make-local-variable 'gnus-summary-mark-positions) - (make-local-hook 'pre-command-hook) - (add-hook 'pre-command-hook 'gnus-set-global-variables nil t) - (gnus-run-hooks 'gnus-summary-mode-hook) - (turn-on-gnus-mailing-list-mode) - (gnus-update-format-specifications nil 'summary 'summary-mode 'summary-dummy) - (gnus-update-summary-mark-positions)) - -(defun gnus-summary-make-local-variables () - "Make all the local summary buffer variables." - (let (global) - (dolist (local gnus-summary-local-variables) - (if (consp local) - (progn - (if (eq (cdr local) 'global) - ;; Copy the global value of the variable. - (setq global (symbol-value (car local))) - ;; Use the value from the list. - (setq global (eval (cdr local)))) - (set (make-local-variable (car local)) global)) - ;; Simple nil-valued local variable. - (set (make-local-variable local) nil))))) - -(defun gnus-summary-clear-local-variables () - (let ((locals gnus-summary-local-variables)) - (while locals - (if (consp (car locals)) - (and (vectorp (caar locals)) - (set (caar locals) nil)) - (and (vectorp (car locals)) - (set (car locals) nil))) - (setq locals (cdr locals))))) - -;; Summary data functions. - -(defmacro gnus-data-number (data) - `(car ,data)) - -(defmacro gnus-data-set-number (data number) - `(setcar ,data ,number)) - -(defmacro gnus-data-mark (data) - `(nth 1 ,data)) - -(defmacro gnus-data-set-mark (data mark) - `(setcar (nthcdr 1 ,data) ,mark)) - -(defmacro gnus-data-pos (data) - `(nth 2 ,data)) - -(defmacro gnus-data-set-pos (data pos) - `(setcar (nthcdr 2 ,data) ,pos)) - -(defmacro gnus-data-header (data) - `(nth 3 ,data)) - -(defmacro gnus-data-set-header (data header) - `(setcar (nthcdr 3 ,data) ,header)) - -(defmacro gnus-data-level (data) - `(nth 4 ,data)) - -(defmacro gnus-data-unread-p (data) - `(= (nth 1 ,data) gnus-unread-mark)) - -(defmacro gnus-data-read-p (data) - `(/= (nth 1 ,data) gnus-unread-mark)) - -(defmacro gnus-data-pseudo-p (data) - `(consp (nth 3 ,data))) - -(defmacro gnus-data-find (number) - `(assq ,number gnus-newsgroup-data)) - -(defmacro gnus-data-find-list (number &optional data) - `(let ((bdata ,(or data 'gnus-newsgroup-data))) - (memq (assq ,number bdata) - bdata))) - -(defmacro gnus-data-make (number mark pos header level) - `(list ,number ,mark ,pos ,header ,level)) - -(defun gnus-data-enter (after-article number mark pos header level offset) - (let ((data (gnus-data-find-list after-article))) - (unless data - (error "No such article: %d" after-article)) - (setcdr data (cons (gnus-data-make number mark pos header level) - (cdr data))) - (setq gnus-newsgroup-data-reverse nil) - (gnus-data-update-list (cddr data) offset))) - -(defun gnus-data-enter-list (after-article list &optional offset) - (when list - (let ((data (and after-article (gnus-data-find-list after-article))) - (ilist list)) - (if (not (or data - after-article)) - (let ((odata gnus-newsgroup-data)) - (setq gnus-newsgroup-data (nconc list gnus-newsgroup-data)) - (when offset - (gnus-data-update-list odata offset))) - ;; Find the last element in the list to be spliced into the main - ;; list. - (while (cdr list) - (setq list (cdr list))) - (if (not data) - (progn - (setcdr list gnus-newsgroup-data) - (setq gnus-newsgroup-data ilist) - (when offset - (gnus-data-update-list (cdr list) offset))) - (setcdr list (cdr data)) - (setcdr data ilist) - (when offset - (gnus-data-update-list (cdr list) offset)))) - (setq gnus-newsgroup-data-reverse nil)))) - -(defun gnus-data-remove (article &optional offset) - (let ((data gnus-newsgroup-data)) - (if (= (gnus-data-number (car data)) article) - (progn - (setq gnus-newsgroup-data (cdr gnus-newsgroup-data) - gnus-newsgroup-data-reverse nil) - (when offset - (gnus-data-update-list gnus-newsgroup-data offset))) - (while (cdr data) - (when (= (gnus-data-number (cadr data)) article) - (setcdr data (cddr data)) - (when offset - (gnus-data-update-list (cdr data) offset)) - (setq data nil - gnus-newsgroup-data-reverse nil)) - (setq data (cdr data)))))) - -(defmacro gnus-data-list (backward) - `(if ,backward - (or gnus-newsgroup-data-reverse - (setq gnus-newsgroup-data-reverse - (reverse gnus-newsgroup-data))) - gnus-newsgroup-data)) - -(defun gnus-data-update-list (data offset) - "Add OFFSET to the POS of all data entries in DATA." - (setq gnus-newsgroup-data-reverse nil) - (while data - (setcar (nthcdr 2 (car data)) (+ offset (nth 2 (car data)))) - (setq data (cdr data)))) - -(defun gnus-summary-article-pseudo-p (article) - "Say whether this article is a pseudo article or not." - (not (vectorp (gnus-data-header (gnus-data-find article))))) - -(defmacro gnus-summary-article-sparse-p (article) - "Say whether this article is a sparse article or not." - `(memq ,article gnus-newsgroup-sparse)) - -(defmacro gnus-summary-article-ancient-p (article) - "Say whether this article is a sparse article or not." - `(memq ,article gnus-newsgroup-ancient)) - -(defun gnus-article-parent-p (number) - "Say whether this article is a parent or not." - (let ((data (gnus-data-find-list number))) - (and (cdr data) ; There has to be an article after... - (< (gnus-data-level (car data)) ; And it has to have a higher level. - (gnus-data-level (nth 1 data)))))) - -(defun gnus-article-children (number) - "Return a list of all children to NUMBER." - (let* ((data (gnus-data-find-list number)) - (level (gnus-data-level (car data))) - children) - (setq data (cdr data)) - (while (and data - (= (gnus-data-level (car data)) (1+ level))) - (push (gnus-data-number (car data)) children) - (setq data (cdr data))) - children)) - -(defmacro gnus-summary-skip-intangible () - "If the current article is intangible, then jump to a different article." - '(let ((to (get-text-property (point) 'gnus-intangible))) - (and to (gnus-summary-goto-subject to)))) - -(defmacro gnus-summary-article-intangible-p () - "Say whether this article is intangible or not." - '(get-text-property (point) 'gnus-intangible)) - -(defun gnus-article-read-p (article) - "Say whether ARTICLE is read or not." - (not (or (memq article gnus-newsgroup-marked) - (memq article gnus-newsgroup-unreads) - (memq article gnus-newsgroup-unselected) - (memq article gnus-newsgroup-dormant)))) - -;; Some summary mode macros. - -(defmacro gnus-summary-article-number () - "The article number of the article on the current line. -If there isn's an article number here, then we return the current -article number." - '(progn - (gnus-summary-skip-intangible) - (or (get-text-property (point) 'gnus-number) - (gnus-summary-last-subject)))) - -(defmacro gnus-summary-article-header (&optional number) - "Return the header of article NUMBER." - `(gnus-data-header (gnus-data-find - ,(or number '(gnus-summary-article-number))))) - -(defmacro gnus-summary-thread-level (&optional number) - "Return the level of thread that starts with article NUMBER." - `(if (and (eq gnus-summary-make-false-root 'dummy) - (get-text-property (point) 'gnus-intangible)) - 0 - (gnus-data-level (gnus-data-find - ,(or number '(gnus-summary-article-number)))))) - -(defmacro gnus-summary-article-mark (&optional number) - "Return the mark of article NUMBER." - `(gnus-data-mark (gnus-data-find - ,(or number '(gnus-summary-article-number))))) - -(defmacro gnus-summary-article-pos (&optional number) - "Return the position of the line of article NUMBER." - `(gnus-data-pos (gnus-data-find - ,(or number '(gnus-summary-article-number))))) - -(defalias 'gnus-summary-subject-string 'gnus-summary-article-subject) -(defmacro gnus-summary-article-subject (&optional number) - "Return current subject string or nil if nothing." - `(let ((headers - ,(if number - `(gnus-data-header (assq ,number gnus-newsgroup-data)) - '(gnus-data-header (assq (gnus-summary-article-number) - gnus-newsgroup-data))))) - (and headers - (vectorp headers) - (mail-header-subject headers)))) - -(defmacro gnus-summary-article-score (&optional number) - "Return current article score." - `(or (cdr (assq ,(or number '(gnus-summary-article-number)) - gnus-newsgroup-scored)) - gnus-summary-default-score 0)) - -(defun gnus-summary-article-children (&optional number) - "Return a list of article numbers that are children of article NUMBER." - (let* ((data (gnus-data-find-list (or number (gnus-summary-article-number)))) - (level (gnus-data-level (car data))) - l children) - (while (and (setq data (cdr data)) - (> (setq l (gnus-data-level (car data))) level)) - (and (= (1+ level) l) - (push (gnus-data-number (car data)) - children))) - (nreverse children))) - -(defun gnus-summary-article-parent (&optional number) - "Return the article number of the parent of article NUMBER." - (let* ((data (gnus-data-find-list (or number (gnus-summary-article-number)) - (gnus-data-list t))) - (level (gnus-data-level (car data)))) - (if (zerop level) - () ; This is a root. - ;; We search until we find an article with a level less than - ;; this one. That function has to be the parent. - (while (and (setq data (cdr data)) - (not (< (gnus-data-level (car data)) level)))) - (and data (gnus-data-number (car data)))))) - -(defun gnus-unread-mark-p (mark) - "Say whether MARK is the unread mark." - (= mark gnus-unread-mark)) - -(defun gnus-read-mark-p (mark) - "Say whether MARK is one of the marks that mark as read. -This is all marks except unread, ticked, dormant, and expirable." - (not (or (= mark gnus-unread-mark) - (= mark gnus-ticked-mark) - (= mark gnus-dormant-mark) - (= mark gnus-expirable-mark)))) - -(defmacro gnus-article-mark (number) - "Return the MARK of article NUMBER. -This macro should only be used when computing the mark the \"first\" -time; i.e., when generating the summary lines. After that, -`gnus-summary-article-mark' should be used to examine the -marks of articles." - `(cond - ((memq ,number gnus-newsgroup-unsendable) gnus-unsendable-mark) - ((memq ,number gnus-newsgroup-undownloaded) gnus-undownloaded-mark) - ((memq ,number gnus-newsgroup-downloadable) gnus-downloadable-mark) - ((memq ,number gnus-newsgroup-unreads) gnus-unread-mark) - ((memq ,number gnus-newsgroup-marked) gnus-ticked-mark) - ((memq ,number gnus-newsgroup-dormant) gnus-dormant-mark) - ((memq ,number gnus-newsgroup-expirable) gnus-expirable-mark) - (t (or (cdr (assq ,number gnus-newsgroup-reads)) - gnus-ancient-mark)))) - -;; Saving hidden threads. - -(put 'gnus-save-hidden-threads 'lisp-indent-function 0) -(put 'gnus-save-hidden-threads 'edebug-form-spec '(body)) - -(defmacro gnus-save-hidden-threads (&rest forms) - "Save hidden threads, eval FORMS, and restore the hidden threads." - (let ((config (make-symbol "config"))) - `(let ((,config (gnus-hidden-threads-configuration))) - (unwind-protect - (save-excursion - ,@forms) - (gnus-restore-hidden-threads-configuration ,config))))) - -(defun gnus-data-compute-positions () - "Compute the positions of all articles." - (setq gnus-newsgroup-data-reverse nil) - (let ((data gnus-newsgroup-data)) - (save-excursion - (gnus-save-hidden-threads - (gnus-summary-show-all-threads) - (goto-char (point-min)) - (while data - (while (get-text-property (point) 'gnus-intangible) - (forward-line 1)) - (gnus-data-set-pos (car data) (+ (point) 3)) - (setq data (cdr data)) - (forward-line 1)))))) - -(defun gnus-hidden-threads-configuration () - "Return the current hidden threads configuration." - (save-excursion - (let (config) - (goto-char (point-min)) - (while (search-forward "\r" nil t) - (push (1- (point)) config)) - config))) - -(defun gnus-restore-hidden-threads-configuration (config) - "Restore hidden threads configuration from CONFIG." - (save-excursion - (let (point buffer-read-only) - (while (setq point (pop config)) - (when (and (< point (point-max)) - (goto-char point) - (eq (char-after) ?\n)) - (subst-char-in-region point (1+ point) ?\n ?\r)))))) - -;; Various summary mode internalish functions. - -(defun gnus-mouse-pick-article (e) - (interactive "e") - (mouse-set-point e) - (gnus-summary-next-page nil t)) - -(defun gnus-summary-set-display-table () - "Change the display table. -Odd characters have a tendency to mess -up nicely formatted displays - we make all possible glyphs -display only a single character." - - ;; We start from the standard display table, if any. - (let ((table (or (copy-sequence standard-display-table) - (make-display-table))) - (i 32)) - ;; Nix out all the control chars... - (while (>= (setq i (1- i)) 0) - (aset table i [??])) - ;; ... but not newline and cr, of course. (cr is necessary for the - ;; selective display). - (aset table ?\n nil) - (aset table ?\r nil) - ;; We keep TAB as well. - (aset table ?\t nil) - ;; We nix out any glyphs over 126 that are not set already. - (let ((i 256)) - (while (>= (setq i (1- i)) 127) - ;; Only modify if the entry is nil. - (unless (aref table i) - (aset table i [??])))) - (setq buffer-display-table table))) - -(defun gnus-summary-set-article-display-arrow (pos) - "Update the overlay arrow to point to line at position POS." - (when (and gnus-summary-display-arrow - (boundp 'overlay-arrow-position) - (boundp 'overlay-arrow-string)) - (save-excursion - (goto-char pos) - (beginning-of-line) - (unless overlay-arrow-position - (setq overlay-arrow-position (make-marker))) - (setq overlay-arrow-string "=>" - overlay-arrow-position (set-marker overlay-arrow-position - (point) - (current-buffer)))))) - -(defun gnus-summary-buffer-name (group) - "Return the summary buffer name of GROUP." - (concat "*Summary " group "*")) - -(defun gnus-summary-setup-buffer (group) - "Initialize summary buffer." - (let ((buffer (gnus-summary-buffer-name group))) - (if (get-buffer buffer) - (progn - (set-buffer buffer) - (setq gnus-summary-buffer (current-buffer)) - (not gnus-newsgroup-prepared)) - ;; Fix by Sudish Joseph - (setq gnus-summary-buffer (set-buffer (gnus-get-buffer-create buffer))) - (gnus-summary-mode group) - (when gnus-carpal - (gnus-carpal-setup-buffer 'summary)) - (unless gnus-single-article-buffer - (make-local-variable 'gnus-article-buffer) - (make-local-variable 'gnus-article-current) - (make-local-variable 'gnus-original-article-buffer)) - (setq gnus-newsgroup-name group) - ;; Set any local variables in the group parameters. - (gnus-summary-set-local-parameters gnus-newsgroup-name) - t))) - -(defun gnus-set-global-variables () - "Set the global equivalents of the buffer-local variables. -They are set to the latest values they had. These reflect the summary -buffer that was in action when the last article was fetched." - (when (eq major-mode 'gnus-summary-mode) - (setq gnus-summary-buffer (current-buffer)) - (let ((name gnus-newsgroup-name) - (marked gnus-newsgroup-marked) - (unread gnus-newsgroup-unreads) - (headers gnus-current-headers) - (data gnus-newsgroup-data) - (summary gnus-summary-buffer) - (article-buffer gnus-article-buffer) - (original gnus-original-article-buffer) - (gac gnus-article-current) - (reffed gnus-reffed-article-number) - (score-file gnus-current-score-file) - (default-charset gnus-newsgroup-charset) - vlist) - (let ((locals gnus-newsgroup-variables)) - (while locals - (if (consp (car locals)) - (push (eval (caar locals)) vlist) - (push (eval (car locals)) vlist)) - (setq locals (cdr locals))) - (setq vlist (nreverse vlist))) - (save-excursion - (set-buffer gnus-group-buffer) - (setq gnus-newsgroup-name name - gnus-newsgroup-marked marked - gnus-newsgroup-unreads unread - gnus-current-headers headers - gnus-newsgroup-data data - gnus-article-current gac - gnus-summary-buffer summary - gnus-article-buffer article-buffer - gnus-original-article-buffer original - gnus-reffed-article-number reffed - gnus-current-score-file score-file - gnus-newsgroup-charset default-charset) - (let ((locals gnus-newsgroup-variables)) - (while locals - (if (consp (car locals)) - (set (caar locals) (pop vlist)) - (set (car locals) (pop vlist))) - (setq locals (cdr locals)))) - ;; The article buffer also has local variables. - (when (gnus-buffer-live-p gnus-article-buffer) - (set-buffer gnus-article-buffer) - (setq gnus-summary-buffer summary)))))) - -(defun gnus-summary-article-unread-p (article) - "Say whether ARTICLE is unread or not." - (memq article gnus-newsgroup-unreads)) - -(defun gnus-summary-first-article-p (&optional article) - "Return whether ARTICLE is the first article in the buffer." - (if (not (setq article (or article (gnus-summary-article-number)))) - nil - (eq article (caar gnus-newsgroup-data)))) - -(defun gnus-summary-last-article-p (&optional article) - "Return whether ARTICLE is the last article in the buffer." - (if (not (setq article (or article (gnus-summary-article-number)))) - ;; All non-existent numbers are the last article. :-) - t - (not (cdr (gnus-data-find-list article))))) - -(defun gnus-make-thread-indent-array () - (let ((n 200)) - (unless (and gnus-thread-indent-array - (= gnus-thread-indent-level gnus-thread-indent-array-level)) - (setq gnus-thread-indent-array (make-vector 201 "") - gnus-thread-indent-array-level gnus-thread-indent-level) - (while (>= n 0) - (aset gnus-thread-indent-array n - (make-string (* n gnus-thread-indent-level) ? )) - (setq n (1- n)))))) - -(defun gnus-update-summary-mark-positions () - "Compute where the summary marks are to go." - (save-excursion - (when (gnus-buffer-exists-p gnus-summary-buffer) - (set-buffer gnus-summary-buffer)) - (let ((gnus-replied-mark 129) - (gnus-score-below-mark 130) - (gnus-score-over-mark 130) - (gnus-download-mark 131) - (spec gnus-summary-line-format-spec) - gnus-visual pos) - (save-excursion - (gnus-set-work-buffer) - (let ((gnus-summary-line-format-spec spec) - (gnus-newsgroup-downloadable '((0 . t)))) - (gnus-summary-insert-line - (make-full-mail-header 0 "" "nobody" - "05 Apr 2001 23:33:09 +0400" - "" "" 0 0 "" nil) - 0 nil 128 t nil "" nil 1) - (goto-char (point-min)) - (setq pos (list (cons 'unread (and (search-forward "\200" nil t) - (- (point) 2))))) - (goto-char (point-min)) - (push (cons 'replied (and (search-forward "\201" nil t) - (- (point) 2))) - pos) - (goto-char (point-min)) - (push (cons 'score (and (search-forward "\202" nil t) (- (point) 2))) - pos) - (goto-char (point-min)) - (push (cons 'download - (and (search-forward "\203" nil t) (- (point) 2))) - pos))) - (setq gnus-summary-mark-positions pos)))) - -(defun gnus-summary-insert-dummy-line (gnus-tmp-subject gnus-tmp-number) - "Insert a dummy root in the summary buffer." - (beginning-of-line) - (gnus-add-text-properties - (point) (progn (eval gnus-summary-dummy-line-format-spec) (point)) - (list 'gnus-number gnus-tmp-number 'gnus-intangible gnus-tmp-number))) - -(defun gnus-summary-from-or-to-or-newsgroups (header) - (let ((to (cdr (assq 'To (mail-header-extra header)))) - (newsgroups (cdr (assq 'Newsgroups (mail-header-extra header)))) - (default-mime-charset (with-current-buffer gnus-summary-buffer - default-mime-charset))) - (cond - ((and to - gnus-ignored-from-addresses - (string-match gnus-ignored-from-addresses - (mail-header-from header))) - (concat "-> " - (or (car (funcall gnus-extract-address-components - (funcall - gnus-decode-encoded-word-function to))) - (funcall gnus-decode-encoded-word-function to)))) - ((and newsgroups - gnus-ignored-from-addresses - (string-match gnus-ignored-from-addresses - (mail-header-from header))) - (concat "=> " newsgroups)) - (t - (or (car (funcall gnus-extract-address-components - (mail-header-from header))) - (mail-header-from header)))))) - -(defun gnus-summary-insert-line (gnus-tmp-header - gnus-tmp-level gnus-tmp-current - gnus-tmp-unread gnus-tmp-replied - gnus-tmp-expirable gnus-tmp-subject-or-nil - &optional gnus-tmp-dummy gnus-tmp-score - gnus-tmp-process) - (let* ((gnus-tmp-indentation (aref gnus-thread-indent-array gnus-tmp-level)) - (gnus-tmp-lines (mail-header-lines gnus-tmp-header)) - (gnus-tmp-score (or gnus-tmp-score gnus-summary-default-score 0)) - (gnus-tmp-score-char - (if (or (null gnus-summary-default-score) - (<= (abs (- gnus-tmp-score gnus-summary-default-score)) - gnus-summary-zcore-fuzz)) - ?\ ;;;Whitespace - (if (< gnus-tmp-score gnus-summary-default-score) - gnus-score-below-mark gnus-score-over-mark))) - (gnus-tmp-replied - (cond (gnus-tmp-process gnus-process-mark) - ((memq gnus-tmp-current gnus-newsgroup-cached) - gnus-cached-mark) - (gnus-tmp-replied gnus-replied-mark) - ((memq gnus-tmp-current gnus-newsgroup-saved) - gnus-saved-mark) - (t gnus-no-mark))) - (gnus-tmp-from (mail-header-from gnus-tmp-header)) - (gnus-tmp-name - (cond - ((string-match "<[^>]+> *$" gnus-tmp-from) - (let ((beg (match-beginning 0))) - (or (and (string-match "^\".+\"" gnus-tmp-from) - (substring gnus-tmp-from 1 (1- (match-end 0)))) - (substring gnus-tmp-from 0 beg)))) - ((string-match "(.+)" gnus-tmp-from) - (substring gnus-tmp-from - (1+ (match-beginning 0)) (1- (match-end 0)))) - (t gnus-tmp-from))) - (gnus-tmp-subject (mail-header-subject gnus-tmp-header)) - (gnus-tmp-number (mail-header-number gnus-tmp-header)) - (gnus-tmp-opening-bracket (if gnus-tmp-dummy ?\< ?\[)) - (gnus-tmp-closing-bracket (if gnus-tmp-dummy ?\> ?\])) - (buffer-read-only nil)) - (when (string= gnus-tmp-name "") - (setq gnus-tmp-name gnus-tmp-from)) - (unless (numberp gnus-tmp-lines) - (setq gnus-tmp-lines -1)) - (if (= gnus-tmp-lines -1) - (setq gnus-tmp-lines "?") - (setq gnus-tmp-lines (number-to-string gnus-tmp-lines))) - (gnus-put-text-property-excluding-characters-with-faces - (point) - (progn (eval gnus-summary-line-format-spec) (point)) - 'gnus-number gnus-tmp-number) - (when (gnus-visual-p 'summary-highlight 'highlight) - (forward-line -1) - (gnus-run-hooks 'gnus-summary-update-hook) - (forward-line 1)))) - -(defun gnus-summary-update-line (&optional dont-update) - "Update summary line after change." - (when (and gnus-summary-default-score - (not gnus-summary-inhibit-highlight)) - (let* ((gnus-summary-inhibit-highlight t) ; Prevent recursion. - (article (gnus-summary-article-number)) - (score (gnus-summary-article-score article))) - (unless dont-update - (if (and gnus-summary-mark-below - (< (gnus-summary-article-score) - gnus-summary-mark-below)) - ;; This article has a low score, so we mark it as read. - (when (memq article gnus-newsgroup-unreads) - (gnus-summary-mark-article-as-read gnus-low-score-mark)) - (when (eq (gnus-summary-article-mark) gnus-low-score-mark) - ;; This article was previously marked as read on account - ;; of a low score, but now it has risen, so we mark it as - ;; unread. - (gnus-summary-mark-article-as-unread gnus-unread-mark))) - (gnus-summary-update-mark - (if (or (null gnus-summary-default-score) - (<= (abs (- score gnus-summary-default-score)) - gnus-summary-zcore-fuzz)) - ?\ ;;;Whitespace - (if (< score gnus-summary-default-score) - gnus-score-below-mark gnus-score-over-mark)) - 'score)) - ;; Do visual highlighting. - (when (gnus-visual-p 'summary-highlight 'highlight) - (gnus-run-hooks 'gnus-summary-update-hook))))) - -(defvar gnus-tmp-new-adopts nil) - -(defun gnus-summary-number-of-articles-in-thread (thread &optional level char) - "Return the number of articles in THREAD. -This may be 0 in some cases -- if none of the articles in -the thread are to be displayed." - (let* ((number - ;; Fix by Luc Van Eycken . - (cond - ((not (listp thread)) - 1) - ((and (consp thread) (cdr thread)) - (apply - '+ 1 (mapcar - 'gnus-summary-number-of-articles-in-thread (cdr thread)))) - ((null thread) - 1) - ((memq (mail-header-number (car thread)) gnus-newsgroup-limit) - 1) - (t 0)))) - (when (and level (zerop level) gnus-tmp-new-adopts) - (incf number - (apply '+ (mapcar - 'gnus-summary-number-of-articles-in-thread - gnus-tmp-new-adopts)))) - (if char - (if (> number 1) gnus-not-empty-thread-mark - gnus-empty-thread-mark) - number))) - -(defun gnus-summary-set-local-parameters (group) - "Go through the local params of GROUP and set all variable specs in that list." - (let ((params (gnus-group-find-parameter group)) - (vars '(quit-config)) ; Ignore quit-config. - elem) - (while params - (setq elem (car params) - params (cdr params)) - (and (consp elem) ; Has to be a cons. - (consp (cdr elem)) ; The cdr has to be a list. - (symbolp (car elem)) ; Has to be a symbol in there. - (not (memq (car elem) vars)) - (ignore-errors ; So we set it. - (push (car elem) vars) - (make-local-variable (car elem)) - (set (car elem) (eval (nth 1 elem)))))))) - -(defun gnus-summary-read-group (group &optional show-all no-article - kill-buffer no-display backward - select-articles) - "Start reading news in newsgroup GROUP. -If SHOW-ALL is non-nil, already read articles are also listed. -If NO-ARTICLE is non-nil, no article is selected initially. -If NO-DISPLAY, don't generate a summary buffer." - (let (result) - (while (and group - (null (setq result - (let ((gnus-auto-select-next nil)) - (or (gnus-summary-read-group-1 - group show-all no-article - kill-buffer no-display - select-articles) - (setq show-all nil - select-articles nil))))) - (eq gnus-auto-select-next 'quietly)) - (set-buffer gnus-group-buffer) - ;; The entry function called above goes to the next - ;; group automatically, so we go two groups back - ;; if we are searching for the previous group. - (when backward - (gnus-group-prev-unread-group 2)) - (if (not (equal group (gnus-group-group-name))) - (setq group (gnus-group-group-name)) - (setq group nil))) - result)) - -(defun gnus-summary-jump-to-other-group (group &optional show-all) - "Directly jump to the other GROUP from summary buffer. -If SHOW-ALL is non-nil, already read articles are also listed." - (interactive - (if (eq gnus-summary-buffer (current-buffer)) - (list (completing-read - "Group: " gnus-active-hashtb nil t - (when (and gnus-newsgroup-name - (string-match "[.:][^.:]+$" gnus-newsgroup-name)) - (substring gnus-newsgroup-name 0 (1+ (match-beginning 0)))) - 'gnus-group-history) - current-prefix-arg) - (error "%s must be invoked from a gnus summary buffer." this-command))) - (unless (or (zerop (length group)) - (and gnus-newsgroup-name - (string-equal gnus-newsgroup-name group))) - (gnus-summary-exit) - (gnus-summary-read-group group show-all - gnus-dont-select-after-jump-to-other-group))) - -(defun gnus-summary-read-group-1 (group show-all no-article - kill-buffer no-display - &optional select-articles) - ;; Killed foreign groups can't be entered. - ;; (when (and (not (gnus-group-native-p group)) - ;; (not (gnus-gethash group gnus-newsrc-hashtb))) - ;; (error "Dead non-native groups can't be entered")) - (gnus-message 5 "Retrieving newsgroup: %s..." - (gnus-group-decoded-name group)) - (let* ((new-group (gnus-summary-setup-buffer group)) - (quit-config (gnus-group-quit-config group)) - (did-select (and new-group (gnus-select-newsgroup - group show-all select-articles)))) - (cond - ;; This summary buffer exists already, so we just select it. - ((not new-group) - (gnus-set-global-variables) - (when kill-buffer - (gnus-kill-or-deaden-summary kill-buffer)) - (gnus-configure-windows 'summary 'force) - (gnus-set-mode-line 'summary) - (gnus-summary-position-point) - (message "") - t) - ;; We couldn't select this group. - ((null did-select) - (when (and (eq major-mode 'gnus-summary-mode) - (not (equal (current-buffer) kill-buffer))) - (kill-buffer (current-buffer)) - (if (not quit-config) - (progn - ;; Update the info -- marks might need to be removed, - ;; for instance. - (gnus-summary-update-info) - (set-buffer gnus-group-buffer) - (gnus-group-jump-to-group group) - (gnus-group-next-unread-group 1)) - (gnus-handle-ephemeral-exit quit-config))) - (let ((grpinfo (gnus-get-info group))) - (if (null (gnus-info-read grpinfo)) - (gnus-message 3 "Group %s contains no messages" - (gnus-group-decoded-name group)) - (gnus-message 3 "Can't select group"))) - nil) - ;; The user did a `C-g' while prompting for number of articles, - ;; so we exit this group. - ((eq did-select 'quit) - (and (eq major-mode 'gnus-summary-mode) - (not (equal (current-buffer) kill-buffer)) - (kill-buffer (current-buffer))) - (when kill-buffer - (gnus-kill-or-deaden-summary kill-buffer)) - (if (not quit-config) - (progn - (set-buffer gnus-group-buffer) - (gnus-group-jump-to-group group) - (gnus-group-next-unread-group 1) - (gnus-configure-windows 'group 'force)) - (gnus-handle-ephemeral-exit quit-config)) - ;; Finally signal the quit. - (signal 'quit nil)) - ;; The group was successfully selected. - (t - (gnus-set-global-variables) - ;; Save the active value in effect when the group was entered. - (setq gnus-newsgroup-active - (gnus-copy-sequence - (gnus-active gnus-newsgroup-name))) - ;; You can change the summary buffer in some way with this hook. - (gnus-run-hooks 'gnus-select-group-hook) - (gnus-update-format-specifications - nil 'summary 'summary-mode 'summary-dummy) - (gnus-update-summary-mark-positions) - ;; Do score processing. - (when gnus-use-scoring - (gnus-possibly-score-headers)) - ;; Check whether to fill in the gaps in the threads. - (when gnus-build-sparse-threads - (gnus-build-sparse-threads)) - ;; Find the initial limit. - (if gnus-show-threads - (if show-all - (let ((gnus-newsgroup-dormant nil)) - (gnus-summary-initial-limit show-all)) - (gnus-summary-initial-limit show-all)) - ;; When untreaded, all articles are always shown. - (setq gnus-newsgroup-limit - (mapcar - (lambda (header) (mail-header-number header)) - gnus-newsgroup-headers))) - ;; Generate the summary buffer. - (unless no-display - (gnus-summary-prepare)) - (when gnus-use-trees - (gnus-tree-open group) - (setq gnus-summary-highlight-line-function - 'gnus-tree-highlight-article)) - ;; If the summary buffer is empty, but there are some low-scored - ;; articles or some excluded dormants, we include these in the - ;; buffer. - (when (and (zerop (buffer-size)) - (not no-display)) - (cond (gnus-newsgroup-dormant - (gnus-summary-limit-include-dormant)) - ((and gnus-newsgroup-scored show-all) - (gnus-summary-limit-include-expunged t)))) - ;; Function `gnus-apply-kill-file' must be called in this hook. - (gnus-run-hooks 'gnus-apply-kill-hook) - (if (and (zerop (buffer-size)) - (not no-display)) - (progn - ;; This newsgroup is empty. - (gnus-summary-catchup-and-exit nil t) - (gnus-message 6 "No unread news") - (when kill-buffer - (gnus-kill-or-deaden-summary kill-buffer)) - ;; Return nil from this function. - nil) - ;; Hide conversation thread subtrees. We cannot do this in - ;; gnus-summary-prepare-hook since kill processing may not - ;; work with hidden articles. - (and gnus-show-threads - gnus-thread-hide-subtree - (gnus-summary-hide-all-threads)) - (when kill-buffer - (gnus-kill-or-deaden-summary kill-buffer)) - ;; Show first unread article if requested. - (if (and (not no-article) - (not no-display) - gnus-newsgroup-unreads - gnus-auto-select-first) - (progn - (gnus-configure-windows 'summary) - (cond - ((eq gnus-auto-select-first 'best) - (gnus-summary-best-unread-article)) - ((eq gnus-auto-select-first t) - (gnus-summary-first-unread-article)) - ((gnus-functionp gnus-auto-select-first) - (funcall gnus-auto-select-first)))) - ;; Don't select any articles, just move point to the first - ;; article in the group. - (goto-char (point-min)) - (gnus-summary-position-point) - (gnus-configure-windows 'summary 'force) - (gnus-set-mode-line 'summary)) - (when (get-buffer-window gnus-group-buffer t) - ;; Gotta use windows, because recenter does weird stuff if - ;; the current buffer ain't the displayed window. - (let ((owin (selected-window))) - (select-window (get-buffer-window gnus-group-buffer t)) - (when (gnus-group-goto-group group) - (recenter)) - (select-window owin))) - ;; Mark this buffer as "prepared". - (setq gnus-newsgroup-prepared t) - (gnus-run-hooks 'gnus-summary-prepared-hook) - t))))) - -(defun gnus-summary-prepare () - "Generate the summary buffer." - (interactive) - (let ((buffer-read-only nil)) - (erase-buffer) - (setq gnus-newsgroup-data nil - gnus-newsgroup-data-reverse nil) - (gnus-run-hooks 'gnus-summary-generate-hook) - ;; Generate the buffer, either with threads or without. - (when gnus-newsgroup-headers - (gnus-summary-prepare-threads - (if gnus-show-threads - (gnus-sort-gathered-threads - (funcall gnus-summary-thread-gathering-function - (gnus-sort-threads - (gnus-cut-threads (gnus-make-threads))))) - ;; Unthreaded display. - (gnus-sort-articles gnus-newsgroup-headers)))) - (setq gnus-newsgroup-data (nreverse gnus-newsgroup-data)) - ;; Call hooks for modifying summary buffer. - (goto-char (point-min)) - (gnus-run-hooks 'gnus-summary-prepare-hook))) - -(defsubst gnus-general-simplify-subject (subject) - "Simply subject by the same rules as gnus-gather-threads-by-subject." - (setq subject - (cond - ;; Truncate the subject. - (gnus-simplify-subject-functions - (gnus-map-function gnus-simplify-subject-functions subject)) - ((numberp gnus-summary-gather-subject-limit) - (setq subject (gnus-simplify-subject-re subject)) - (if (> (length subject) gnus-summary-gather-subject-limit) - (substring subject 0 gnus-summary-gather-subject-limit) - subject)) - ;; Fuzzily simplify it. - ((eq 'fuzzy gnus-summary-gather-subject-limit) - (gnus-simplify-subject-fuzzy subject)) - ;; Just remove the leading "Re:". - (t - (gnus-simplify-subject-re subject)))) - - (if (and gnus-summary-gather-exclude-subject - (string-match gnus-summary-gather-exclude-subject subject)) - nil ; This article shouldn't be gathered - subject)) - -(defun gnus-summary-simplify-subject-query () - "Query where the respool algorithm would put this article." - (interactive) - (gnus-summary-select-article) - (message "%s" - (gnus-general-simplify-subject (gnus-summary-article-subject)))) - -(defun gnus-gather-threads-by-subject (threads) - "Gather threads by looking at Subject headers." - (if (not gnus-summary-make-false-root) - threads - (let ((hashtb (gnus-make-hashtable 1024)) - (prev threads) - (result threads) - subject hthread whole-subject) - (while threads - (setq subject (gnus-general-simplify-subject - (setq whole-subject (mail-header-subject - (caar threads))))) - (when subject - (if (setq hthread (gnus-gethash subject hashtb)) - (progn - ;; We enter a dummy root into the thread, if we - ;; haven't done that already. - (unless (stringp (caar hthread)) - (setcar hthread (list whole-subject (car hthread)))) - ;; We add this new gathered thread to this gathered - ;; thread. - (setcdr (car hthread) - (nconc (cdar hthread) (list (car threads)))) - ;; Remove it from the list of threads. - (setcdr prev (cdr threads)) - (setq threads prev)) - ;; Enter this thread into the hash table. - (gnus-sethash subject threads hashtb))) - (setq prev threads) - (setq threads (cdr threads))) - result))) - -(defun gnus-gather-threads-by-references (threads) - "Gather threads by looking at References headers." - (let ((idhashtb (gnus-make-hashtable 1024)) - (thhashtb (gnus-make-hashtable 1024)) - (prev threads) - (result threads) - ids references id gthread gid entered ref) - (while threads - (when (setq references (mail-header-references (caar threads))) - (setq id (mail-header-id (caar threads)) - ids (gnus-split-references references) - entered nil) - (while (setq ref (pop ids)) - (setq ids (delete ref ids)) - (if (not (setq gid (gnus-gethash ref idhashtb))) - (progn - (gnus-sethash ref id idhashtb) - (gnus-sethash id threads thhashtb)) - (setq gthread (gnus-gethash gid thhashtb)) - (unless entered - ;; We enter a dummy root into the thread, if we - ;; haven't done that already. - (unless (stringp (caar gthread)) - (setcar gthread (list (mail-header-subject (caar gthread)) - (car gthread)))) - ;; We add this new gathered thread to this gathered - ;; thread. - (setcdr (car gthread) - (nconc (cdar gthread) (list (car threads))))) - ;; Add it into the thread hash table. - (gnus-sethash id gthread thhashtb) - (setq entered t) - ;; Remove it from the list of threads. - (setcdr prev (cdr threads)) - (setq threads prev)))) - (setq prev threads) - (setq threads (cdr threads))) - result)) - -(defun gnus-sort-gathered-threads (threads) - "Sort subtreads inside each gathered thread by `gnus-sort-gathered-threads-function'." - (let ((result threads)) - (while threads - (when (stringp (caar threads)) - (setcdr (car threads) - (sort (cdar threads) gnus-sort-gathered-threads-function))) - (setq threads (cdr threads))) - result)) - -(defun gnus-thread-loop-p (root thread) - "Say whether ROOT is in THREAD." - (let ((stack (list thread)) - (infloop 0) - th) - (while (setq thread (pop stack)) - (setq th (cdr thread)) - (while (and th - (not (eq (caar th) root))) - (pop th)) - (if th - ;; We have found a loop. - (let (ref-dep) - (setcdr thread (delq (car th) (cdr thread))) - (if (boundp (setq ref-dep (intern "none" - gnus-newsgroup-dependencies))) - (setcdr (symbol-value ref-dep) - (nconc (cdr (symbol-value ref-dep)) - (list (car th)))) - (set ref-dep (list nil (car th)))) - (setq infloop 1 - stack nil)) - ;; Push all the subthreads onto the stack. - (push (cdr thread) stack))) - infloop)) - -(defun gnus-make-threads () - "Go through the dependency hashtb and find the roots. Return all threads." - (let (threads) - (while (catch 'infloop - (mapatoms - (lambda (refs) - ;; Deal with self-referencing References loops. - (when (and (car (symbol-value refs)) - (not (zerop - (apply - '+ - (mapcar - (lambda (thread) - (gnus-thread-loop-p - (car (symbol-value refs)) thread)) - (cdr (symbol-value refs))))))) - (setq threads nil) - (throw 'infloop t)) - (unless (car (symbol-value refs)) - ;; These threads do not refer back to any other articles, - ;; so they're roots. - (setq threads (append (cdr (symbol-value refs)) threads)))) - gnus-newsgroup-dependencies))) - threads)) - -;; Build the thread tree. -(defsubst gnus-dependencies-add-header (header dependencies force-new) - "Enter HEADER into the DEPENDENCIES table if it is not already there. - -If FORCE-NEW is not nil, enter HEADER into the DEPENDENCIES table even -if it was already present. - -If `gnus-summary-ignore-duplicates' is nil then duplicate Message-IDs -will not be entered in the DEPENDENCIES table. Otherwise duplicate -Message-IDs will be renamed be renamed to a unique Message-ID before -being entered. - -Returns HEADER if it was entered in the DEPENDENCIES. Returns nil otherwise." - (let* ((id (mail-header-id header)) - (id-dep (and id (intern id dependencies))) - ref ref-dep ref-header) - ;; Enter this `header' in the `dependencies' table. - (cond - ((not id-dep) - (setq header nil)) - ;; The first two cases do the normal part: enter a new `header' - ;; in the `dependencies' table. - ((not (boundp id-dep)) - (set id-dep (list header))) - ((null (car (symbol-value id-dep))) - (setcar (symbol-value id-dep) header)) - - ;; From here the `header' was already present in the - ;; `dependencies' table. - (force-new - ;; Overrides an existing entry; - ;; just set the header part of the entry. - (setcar (symbol-value id-dep) header)) - - ;; Renames the existing `header' to a unique Message-ID. - ((not gnus-summary-ignore-duplicates) - ;; An article with this Message-ID has already been seen. - ;; We rename the Message-ID. - (set (setq id-dep (intern (setq id (nnmail-message-id)) dependencies)) - (list header)) - (mail-header-set-id header id)) - - ;; The last case ignores an existing entry, except it adds any - ;; additional Xrefs (in case the two articles came from different - ;; servers. - ;; Also sets `header' to `nil' meaning that the `dependencies' - ;; table was *not* modified. - (t - (mail-header-set-xref - (car (symbol-value id-dep)) - (concat (or (mail-header-xref (car (symbol-value id-dep))) - "") - (or (mail-header-xref header) ""))) - (setq header nil))) - - (when header - ;; First check if that we are not creating a References loop. - (setq ref (gnus-parent-id (mail-header-references header))) - (while (and ref - (setq ref-dep (intern-soft ref dependencies)) - (boundp ref-dep) - (setq ref-header (car (symbol-value ref-dep)))) - (if (string= id ref) - ;; Yuk! This is a reference loop. Make the article be a - ;; root article. - (progn - (mail-header-set-references (car (symbol-value id-dep)) "none") - (setq ref nil)) - (setq ref (gnus-parent-id (mail-header-references ref-header))))) - (setq ref (gnus-parent-id (mail-header-references header))) - (setq ref-dep (intern (or ref "none") dependencies)) - (if (boundp ref-dep) - (setcdr (symbol-value ref-dep) - (nconc (cdr (symbol-value ref-dep)) - (list (symbol-value id-dep)))) - (set ref-dep (list nil (symbol-value id-dep))))) - header)) - -(defun gnus-build-sparse-threads () - (let ((headers gnus-newsgroup-headers) - (mail-parse-charset gnus-newsgroup-charset) - (gnus-summary-ignore-duplicates t) - header references generation relations - subject child end new-child date) - ;; First we create an alist of generations/relations, where - ;; generations is how much we trust the relation, and the relation - ;; is parent/child. - (gnus-message 7 "Making sparse threads...") - (save-excursion - (nnheader-set-temp-buffer " *gnus sparse threads*") - (while (setq header (pop headers)) - (when (and (setq references (mail-header-references header)) - (not (string= references ""))) - (insert references) - (setq child (mail-header-id header) - subject (mail-header-subject header) - date (mail-header-date header) - generation 0) - (while (search-backward ">" nil t) - (setq end (1+ (point))) - (when (search-backward "<" nil t) - (setq new-child (buffer-substring (point) end)) - (push (list (incf generation) - child (setq child new-child) - subject date) - relations))) - (when child - (push (list (1+ generation) child nil subject) relations)) - (erase-buffer))) - (kill-buffer (current-buffer))) - ;; Sort over trustworthiness. - (mapcar - (lambda (relation) - (when (gnus-dependencies-add-header - (make-full-mail-header-from-decoded-header - gnus-reffed-article-number - (nth 3 relation) "" (or (nth 4 relation) "") - (nth 1 relation) - (or (nth 2 relation) "") 0 0 "") - gnus-newsgroup-dependencies nil) - (push gnus-reffed-article-number gnus-newsgroup-limit) - (push gnus-reffed-article-number gnus-newsgroup-sparse) - (push (cons gnus-reffed-article-number gnus-sparse-mark) - gnus-newsgroup-reads) - (decf gnus-reffed-article-number))) - (sort relations 'car-less-than-car)) - (gnus-message 7 "Making sparse threads...done"))) - -(defun gnus-build-old-threads () - ;; Look at all the articles that refer back to old articles, and - ;; fetch the headers for the articles that aren't there. This will - ;; build complete threads - if the roots haven't been expired by the - ;; server, that is. - (let ((mail-parse-charset gnus-newsgroup-charset) - id heads) - (mapatoms - (lambda (refs) - (when (not (car (symbol-value refs))) - (setq heads (cdr (symbol-value refs))) - (while heads - (if (memq (mail-header-number (caar heads)) - gnus-newsgroup-dormant) - (setq heads (cdr heads)) - (setq id (symbol-name refs)) - (while (and (setq id (gnus-build-get-header id)) - (not (car (gnus-id-to-thread id))))) - (setq heads nil))))) - gnus-newsgroup-dependencies))) - -;; This function has to be called with point after the article number -;; on the beginning of the line. -(defsubst gnus-nov-parse-line (number dependencies &optional force-new) - (let ((eol (gnus-point-at-eol)) - (buffer (current-buffer)) - header) - - ;; overview: [num subject from date id refs chars lines misc] - (unwind-protect - (progn - (narrow-to-region (point) eol) - (unless (eobp) - (forward-char)) - - (setq header - (make-full-mail-header - number ; number - (nnheader-nov-field) ; subject - (nnheader-nov-field) ; from - (nnheader-nov-field) ; date - (nnheader-nov-read-message-id) ; id - (nnheader-nov-field) ; refs - (nnheader-nov-read-integer) ; chars - (nnheader-nov-read-integer) ; lines - (unless (eobp) - (if (looking-at "Xref: ") - (goto-char (match-end 0))) - (nnheader-nov-field)) ; Xref - (nnheader-nov-parse-extra)))) ; extra - - (widen)) - - (when gnus-alter-header-function - (funcall gnus-alter-header-function header)) - (gnus-dependencies-add-header header dependencies force-new))) - -(defun gnus-build-get-header (id) - "Look through the buffer of NOV lines and find the header to ID. -Enter this line into the dependencies hash table, and return -the id of the parent article (if any)." - (let ((deps gnus-newsgroup-dependencies) - found header) - (prog1 - (save-excursion - (set-buffer nntp-server-buffer) - (let ((case-fold-search nil)) - (goto-char (point-min)) - (while (and (not found) - (search-forward id nil t)) - (beginning-of-line) - (setq found (looking-at - (format "^[^\t]*\t[^\t]*\t[^\t]*\t[^\t]*\t%s" - (regexp-quote id)))) - (or found (beginning-of-line 2))) - (when found - (beginning-of-line) - (and - (setq header (gnus-nov-parse-line - (read (current-buffer)) deps)) - (gnus-parent-id (mail-header-references header)))))) - (when header - (let ((number (mail-header-number header))) - (push number gnus-newsgroup-limit) - (push header gnus-newsgroup-headers) - (if (memq number gnus-newsgroup-unselected) - (progn - (push number gnus-newsgroup-unreads) - (setq gnus-newsgroup-unselected - (delq number gnus-newsgroup-unselected))) - (push number gnus-newsgroup-ancient))))))) - -(defun gnus-build-all-threads () - "Read all the headers." - (let ((gnus-summary-ignore-duplicates t) - (mail-parse-charset gnus-newsgroup-charset) - (dependencies gnus-newsgroup-dependencies) - header article) - (save-excursion - (set-buffer nntp-server-buffer) - (let ((case-fold-search nil)) - (goto-char (point-min)) - (while (not (eobp)) - (ignore-errors - (setq article (read (current-buffer)) - header (gnus-nov-parse-line article dependencies))) - (when header - (save-excursion - (set-buffer gnus-summary-buffer) - (push header gnus-newsgroup-headers) - (if (memq (setq article (mail-header-number header)) - gnus-newsgroup-unselected) - (progn - (push article gnus-newsgroup-unreads) - (setq gnus-newsgroup-unselected - (delq article gnus-newsgroup-unselected))) - (push article gnus-newsgroup-ancient))) - (forward-line 1))))))) - -(defun gnus-summary-update-article-line (article header) - "Update the line for ARTICLE using HEADERS." - (let* ((id (mail-header-id header)) - (thread (gnus-id-to-thread id))) - (unless thread - (error "Article in no thread")) - ;; Update the thread. - (setcar thread header) - (gnus-summary-goto-subject article) - (let* ((datal (gnus-data-find-list article)) - (data (car datal)) - (length (when (cdr datal) - (- (gnus-data-pos data) - (gnus-data-pos (cadr datal))))) - (buffer-read-only nil) - (level (gnus-summary-thread-level))) - (gnus-delete-line) - (gnus-summary-insert-line - header level nil (gnus-article-mark article) - (memq article gnus-newsgroup-replied) - (memq article gnus-newsgroup-expirable) - ;; Only insert the Subject string when it's different - ;; from the previous Subject string. - (if (and - gnus-show-threads - (gnus-subject-equal - (condition-case () - (mail-header-subject - (gnus-data-header - (cadr - (gnus-data-find-list - article - (gnus-data-list t))))) - ;; Error on the side of excessive subjects. - (error "")) - (mail-header-subject header))) - "" - (mail-header-subject header)) - nil (cdr (assq article gnus-newsgroup-scored)) - (memq article gnus-newsgroup-processable)) - (when length - (gnus-data-update-list - (cdr datal) (- length (- (gnus-data-pos data) (point)))))))) - -(defun gnus-summary-update-article (article &optional iheader) - "Update ARTICLE in the summary buffer." - (set-buffer gnus-summary-buffer) - (let* ((header (gnus-summary-article-header article)) - (id (mail-header-id header)) - (data (gnus-data-find article)) - (thread (gnus-id-to-thread id)) - (references (mail-header-references header)) - (parent - (gnus-id-to-thread - (or (gnus-parent-id - (when (and references - (not (equal "" references))) - references)) - "none"))) - (buffer-read-only nil) - (old (car thread))) - (when thread - (unless iheader - (setcar thread nil) - (when parent - (delq thread parent))) - (if (gnus-summary-insert-subject id header) - ;; Set the (possibly) new article number in the data structure. - (gnus-data-set-number data (gnus-id-to-article id)) - (setcar thread old) - nil)))) - -(defun gnus-rebuild-thread (id &optional line) - "Rebuild the thread containing ID. -If LINE, insert the rebuilt thread starting on line LINE." - (let ((buffer-read-only nil) - old-pos current thread data) - (if (not gnus-show-threads) - (setq thread (list (car (gnus-id-to-thread id)))) - ;; Get the thread this article is part of. - (setq thread (gnus-remove-thread id))) - (setq old-pos (gnus-point-at-bol)) - (setq current (save-excursion - (and (re-search-backward "[\r\n]" nil t) - (gnus-summary-article-number)))) - ;; If this is a gathered thread, we have to go some re-gathering. - (when (stringp (car thread)) - (let ((subject (car thread)) - roots thr) - (setq thread (cdr thread)) - (while thread - (unless (memq (setq thr (gnus-id-to-thread - (gnus-root-id - (mail-header-id (caar thread))))) - roots) - (push thr roots)) - (setq thread (cdr thread))) - ;; We now have all (unique) roots. - (if (= (length roots) 1) - ;; All the loose roots are now one solid root. - (setq thread (car roots)) - (setq thread (cons subject (gnus-sort-threads roots)))))) - (let (threads) - ;; We then insert this thread into the summary buffer. - (when line - (goto-char (point-min)) - (forward-line (1- line))) - (let (gnus-newsgroup-data gnus-newsgroup-threads) - (if gnus-show-threads - (gnus-summary-prepare-threads (gnus-cut-threads (list thread))) - (gnus-summary-prepare-unthreaded thread)) - (setq data (nreverse gnus-newsgroup-data)) - (setq threads gnus-newsgroup-threads)) - ;; We splice the new data into the data structure. - ;;!!! This is kinda bogus. We assume that in LINE is non-nil, - ;;!!! then we want to insert at the beginning of the buffer. - ;;!!! That happens to be true with Gnus now, but that may - ;;!!! change in the future. Perhaps. - (gnus-data-enter-list - (if line nil current) data (- (point) old-pos)) - (setq gnus-newsgroup-threads - (nconc threads gnus-newsgroup-threads)) - (gnus-data-compute-positions)))) - -(defun gnus-number-to-header (number) - "Return the header for article NUMBER." - (let ((headers gnus-newsgroup-headers)) - (while (and headers - (not (= number (mail-header-number (car headers))))) - (pop headers)) - (when headers - (car headers)))) - -(defun gnus-parent-headers (in-headers &optional generation) - "Return the headers of the GENERATIONeth parent of HEADERS." - (unless generation - (setq generation 1)) - (let ((parent t) - (headers in-headers) - references) - (while (and parent - (not (zerop generation)) - (setq references (mail-header-references headers))) - (setq headers (if (and references - (setq parent (gnus-parent-id references))) - (car (gnus-id-to-thread parent)) - nil)) - (decf generation)) - (and (not (eq headers in-headers)) - headers))) - -(defun gnus-id-to-thread (id) - "Return the (sub-)thread where ID appears." - (gnus-gethash id gnus-newsgroup-dependencies)) - -(defun gnus-id-to-article (id) - "Return the article number of ID." - (let ((thread (gnus-id-to-thread id))) - (when (and thread - (car thread)) - (mail-header-number (car thread))))) - -(defun gnus-id-to-header (id) - "Return the article headers of ID." - (car (gnus-id-to-thread id))) - -(defun gnus-article-displayed-root-p (article) - "Say whether ARTICLE is a root(ish) article." - (let ((level (gnus-summary-thread-level article)) - (refs (mail-header-references (gnus-summary-article-header article))) - particle) - (cond - ((null level) nil) - ((zerop level) t) - ((null refs) t) - ((null (gnus-parent-id refs)) t) - ((and (= 1 level) - (null (setq particle (gnus-id-to-article - (gnus-parent-id refs)))) - (null (gnus-summary-thread-level particle))))))) - -(defun gnus-root-id (id) - "Return the id of the root of the thread where ID appears." - (let (last-id prev) - (while (and id (setq prev (car (gnus-id-to-thread id)))) - (setq last-id id - id (gnus-parent-id (mail-header-references prev)))) - last-id)) - -(defun gnus-articles-in-thread (thread) - "Return the list of articles in THREAD." - (cons (mail-header-number (car thread)) - (apply 'nconc (mapcar 'gnus-articles-in-thread (cdr thread))))) - -(defun gnus-remove-thread (id &optional dont-remove) - "Remove the thread that has ID in it." - (let (headers thread last-id) - ;; First go up in this thread until we find the root. - (setq last-id (gnus-root-id id) - headers (message-flatten-list (gnus-id-to-thread last-id))) - ;; We have now found the real root of this thread. It might have - ;; been gathered into some loose thread, so we have to search - ;; through the threads to find the thread we wanted. - (let ((threads gnus-newsgroup-threads) - sub) - (while threads - (setq sub (car threads)) - (if (stringp (car sub)) - ;; This is a gathered thread, so we look at the roots - ;; below it to find whether this article is in this - ;; gathered root. - (progn - (setq sub (cdr sub)) - (while sub - (when (member (caar sub) headers) - (setq thread (car threads) - threads nil - sub nil)) - (setq sub (cdr sub)))) - ;; It's an ordinary thread, so we check it. - (when (eq (car sub) (car headers)) - (setq thread sub - threads nil))) - (setq threads (cdr threads))) - ;; If this article is in no thread, then it's a root. - (if thread - (unless dont-remove - (setq gnus-newsgroup-threads (delq thread gnus-newsgroup-threads))) - (setq thread (gnus-id-to-thread last-id))) - (when thread - (prog1 - thread ; We return this thread. - (unless dont-remove - (if (stringp (car thread)) - (progn - ;; If we use dummy roots, then we have to remove the - ;; dummy root as well. - (when (eq gnus-summary-make-false-root 'dummy) - ;; We go to the dummy root by going to - ;; the first sub-"thread", and then one line up. - (gnus-summary-goto-article - (mail-header-number (caadr thread))) - (forward-line -1) - (gnus-delete-line) - (gnus-data-compute-positions)) - (setq thread (cdr thread)) - (while thread - (gnus-remove-thread-1 (car thread)) - (setq thread (cdr thread)))) - (gnus-remove-thread-1 thread)))))))) - -(defun gnus-remove-thread-1 (thread) - "Remove the thread THREAD recursively." - (let ((number (mail-header-number (pop thread))) - d) - (setq thread (reverse thread)) - (while thread - (gnus-remove-thread-1 (pop thread))) - (when (setq d (gnus-data-find number)) - (goto-char (gnus-data-pos d)) - (gnus-summary-show-thread) - (gnus-data-remove - number - (- (gnus-point-at-bol) - (prog1 - (1+ (gnus-point-at-eol)) - (gnus-delete-line))))))) - -(defun gnus-sort-threads-1 (threads func) - (sort (mapcar (lambda (thread) - (cons (car thread) - (and (cdr thread) - (gnus-sort-threads-1 (cdr thread) func)))) - threads) func)) - -(defun gnus-sort-threads (threads) - "Sort THREADS." - (if (not gnus-thread-sort-functions) - threads - (gnus-message 8 "Sorting threads...") - (prog1 - (gnus-sort-threads-1 - threads - (gnus-make-sort-function gnus-thread-sort-functions)) - (gnus-message 8 "Sorting threads...done")))) - -(defun gnus-sort-articles (articles) - "Sort ARTICLES." - (when gnus-article-sort-functions - (gnus-message 7 "Sorting articles...") - (prog1 - (setq gnus-newsgroup-headers - (sort articles (gnus-make-sort-function - gnus-article-sort-functions))) - (gnus-message 7 "Sorting articles...done")))) - -;; Written by Hallvard B Furuseth . -(defmacro gnus-thread-header (thread) - "Return header of first article in THREAD. -Note that THREAD must never, ever be anything else than a variable - -using some other form will lead to serious barfage." - (or (symbolp thread) (signal 'wrong-type-argument '(symbolp thread))) - ;; (8% speedup to gnus-summary-prepare, just for fun :-) - (list 'byte-code "\10\211:\203\17\0\211@;\203\16\0A@@\207" - (vector thread) 2)) - -(defsubst gnus-article-sort-by-number (h1 h2) - "Sort articles by article number." - (< (mail-header-number h1) - (mail-header-number h2))) - -(defun gnus-thread-sort-by-number (h1 h2) - "Sort threads by root article number." - (gnus-article-sort-by-number - (gnus-thread-header h1) (gnus-thread-header h2))) - -(defsubst gnus-article-sort-by-lines (h1 h2) - "Sort articles by article Lines header." - (< (mail-header-lines h1) - (mail-header-lines h2))) - -(defun gnus-thread-sort-by-lines (h1 h2) - "Sort threads by root article Lines header." - (gnus-article-sort-by-lines - (gnus-thread-header h1) (gnus-thread-header h2))) - -(defsubst gnus-article-sort-by-chars (h1 h2) - "Sort articles by octet length." - (< (mail-header-chars h1) - (mail-header-chars h2))) - -(defun gnus-thread-sort-by-chars (h1 h2) - "Sort threads by root article octet length." - (gnus-article-sort-by-chars - (gnus-thread-header h1) (gnus-thread-header h2))) - -(defsubst gnus-article-sort-by-author (h1 h2) - "Sort articles by root author." - (string-lessp - (let ((addr (car (mime-entity-read-field h1 'From)))) - (or (std11-full-name-string addr) - (std11-address-string addr) - "")) - (let ((addr (car (mime-entity-read-field h2 'From)))) - (or (std11-full-name-string addr) - (std11-address-string addr) - "")) - )) - -(defun gnus-thread-sort-by-author (h1 h2) - "Sort threads by root author." - (gnus-article-sort-by-author - (gnus-thread-header h1) (gnus-thread-header h2))) - -(defsubst gnus-article-sort-by-subject (h1 h2) - "Sort articles by root subject." - (string-lessp - (downcase (gnus-simplify-subject-re (mail-header-subject h1))) - (downcase (gnus-simplify-subject-re (mail-header-subject h2))))) - -(defun gnus-thread-sort-by-subject (h1 h2) - "Sort threads by root subject." - (gnus-article-sort-by-subject - (gnus-thread-header h1) (gnus-thread-header h2))) - -(defsubst gnus-article-sort-by-date (h1 h2) - "Sort articles by root article date." - (time-less-p - (gnus-date-get-time (mail-header-date h1)) - (gnus-date-get-time (mail-header-date h2)))) - -(defun gnus-thread-sort-by-date (h1 h2) - "Sort threads by root article date." - (gnus-article-sort-by-date - (gnus-thread-header h1) (gnus-thread-header h2))) - -(defsubst gnus-article-sort-by-score (h1 h2) - "Sort articles by root article score. -Unscored articles will be counted as having a score of zero." - (> (or (cdr (assq (mail-header-number h1) - gnus-newsgroup-scored)) - gnus-summary-default-score 0) - (or (cdr (assq (mail-header-number h2) - gnus-newsgroup-scored)) - gnus-summary-default-score 0))) - -(defun gnus-thread-sort-by-score (h1 h2) - "Sort threads by root article score." - (gnus-article-sort-by-score - (gnus-thread-header h1) (gnus-thread-header h2))) - -(defun gnus-thread-sort-by-total-score (h1 h2) - "Sort threads by the sum of all scores in the thread. -Unscored articles will be counted as having a score of zero." - (> (gnus-thread-total-score h1) (gnus-thread-total-score h2))) - -(defun gnus-thread-total-score (thread) - ;; This function find the total score of THREAD. - (cond ((null thread) - 0) - ((consp thread) - (if (stringp (car thread)) - (apply gnus-thread-score-function 0 - (mapcar 'gnus-thread-total-score-1 (cdr thread))) - (gnus-thread-total-score-1 thread))) - (t - (gnus-thread-total-score-1 (list thread))))) - -(defun gnus-thread-total-score-1 (root) - ;; This function find the total score of the thread below ROOT. - (setq root (car root)) - (apply gnus-thread-score-function - (or (append - (mapcar 'gnus-thread-total-score - (cdr (gnus-id-to-thread (mail-header-id root)))) - (when (> (mail-header-number root) 0) - (list (or (cdr (assq (mail-header-number root) - gnus-newsgroup-scored)) - gnus-summary-default-score 0)))) - (list gnus-summary-default-score) - '(0)))) - -;; Added by Per Abrahamsen . -(defvar gnus-tmp-prev-subject nil) -(defvar gnus-tmp-false-parent nil) -(defvar gnus-tmp-root-expunged nil) -(defvar gnus-tmp-dummy-line nil) - -(eval-when-compile (defvar gnus-tmp-header)) -(defun gnus-extra-header (type &optional header) - "Return the extra header of TYPE." - (or (cdr (assq type (mail-header-extra (or header gnus-tmp-header)))) - "")) - -(defvar gnus-tmp-thread-tree-header-string "") - -(defvar gnus-sum-thread-tree-root "> " - "With %B spec, used for the root of a thread. -If nil, use subject instead.") -(defvar gnus-sum-thread-tree-single-indent "" - "With %B spec, used for a thread with just one message. -If nil, use subject instead.") -(defvar gnus-sum-thread-tree-vertical "| " - "With %B spec, used for drawing a vertical line.") -(defvar gnus-sum-thread-tree-indent " " - "With %B spec, used for indenting.") -(defvar gnus-sum-thread-tree-leaf-with-other "+-> " - "With %B spec, used for a leaf with brothers.") -(defvar gnus-sum-thread-tree-single-leaf "\\-> " - "With %B spec, used for a leaf without brothers.") - -(defun gnus-summary-prepare-threads (threads) - "Prepare summary buffer from THREADS and indentation LEVEL. -THREADS is either a list of `(PARENT [(CHILD1 [(GRANDCHILD ...]...) ...])' -or a straight list of headers." - (gnus-message 7 "Generating summary...") - - (setq gnus-newsgroup-threads threads) - (beginning-of-line) - - (let ((gnus-tmp-level 0) - (default-score (or gnus-summary-default-score 0)) - (gnus-visual-p (gnus-visual-p 'summary-highlight 'highlight)) - thread number subject stack state gnus-tmp-gathered beg-match - new-roots gnus-tmp-new-adopts thread-end - gnus-tmp-header gnus-tmp-unread - gnus-tmp-replied gnus-tmp-subject-or-nil - gnus-tmp-dummy gnus-tmp-indentation gnus-tmp-lines gnus-tmp-score - gnus-tmp-score-char gnus-tmp-from gnus-tmp-name - gnus-tmp-number gnus-tmp-opening-bracket gnus-tmp-closing-bracket - tree-stack) - - (setq gnus-tmp-prev-subject nil) - - (if (vectorp (car threads)) - ;; If this is a straight (sic) list of headers, then a - ;; threaded summary display isn't required, so we just create - ;; an unthreaded one. - (gnus-summary-prepare-unthreaded threads) - - ;; Do the threaded display. - - (while (or threads stack gnus-tmp-new-adopts new-roots) - - (if (and (= gnus-tmp-level 0) - (or (not stack) - (= (caar stack) 0)) - (not gnus-tmp-false-parent) - (or gnus-tmp-new-adopts new-roots)) - (if gnus-tmp-new-adopts - (setq gnus-tmp-level (if gnus-tmp-root-expunged 0 1) - thread (list (car gnus-tmp-new-adopts)) - gnus-tmp-header (caar thread) - gnus-tmp-new-adopts (cdr gnus-tmp-new-adopts)) - (when new-roots - (setq thread (list (car new-roots)) - gnus-tmp-header (caar thread) - new-roots (cdr new-roots)))) - - (if threads - ;; If there are some threads, we do them before the - ;; threads on the stack. - (setq thread threads - gnus-tmp-header (caar thread)) - ;; There were no current threads, so we pop something off - ;; the stack. - (setq state (car stack) - gnus-tmp-level (car state) - tree-stack (cadr state) - thread (caddr state) - stack (cdr stack) - gnus-tmp-header (caar thread)))) - - (setq gnus-tmp-false-parent nil) - (setq gnus-tmp-root-expunged nil) - (setq thread-end nil) - - (if (stringp gnus-tmp-header) - ;; The header is a dummy root. - (cond - ((eq gnus-summary-make-false-root 'adopt) - ;; We let the first article adopt the rest. - (setq gnus-tmp-new-adopts (nconc gnus-tmp-new-adopts - (cddar thread))) - (setq gnus-tmp-gathered - (nconc (mapcar - (lambda (h) (mail-header-number (car h))) - (cddar thread)) - gnus-tmp-gathered)) - (setq thread (cons (list (caar thread) - (cadar thread)) - (cdr thread))) - (setq gnus-tmp-level -1 - gnus-tmp-false-parent t)) - ((eq gnus-summary-make-false-root 'empty) - ;; We print adopted articles with empty subject fields. - (setq gnus-tmp-gathered - (nconc (mapcar - (lambda (h) (mail-header-number (car h))) - (cddar thread)) - gnus-tmp-gathered)) - (setq gnus-tmp-level -1)) - ((eq gnus-summary-make-false-root 'dummy) - ;; We remember that we probably want to output a dummy - ;; root. - (setq gnus-tmp-dummy-line gnus-tmp-header) - (setq gnus-tmp-prev-subject gnus-tmp-header)) - (t - ;; We do not make a root for the gathered - ;; sub-threads at all. - (setq gnus-tmp-level -1))) - - (setq number (mail-header-number gnus-tmp-header) - subject (mail-header-subject gnus-tmp-header)) - - (cond - ;; If the thread has changed subject, we might want to make - ;; this subthread into a root. - ((and (null gnus-thread-ignore-subject) - (not (zerop gnus-tmp-level)) - gnus-tmp-prev-subject - (not (inline - (gnus-subject-equal gnus-tmp-prev-subject subject)))) - (setq new-roots (nconc new-roots (list (car thread))) - thread-end t - gnus-tmp-header nil)) - ;; If the article lies outside the current limit, - ;; then we do not display it. - ((not (memq number gnus-newsgroup-limit)) - (setq gnus-tmp-gathered - (nconc (mapcar - (lambda (h) (mail-header-number (car h))) - (cdar thread)) - gnus-tmp-gathered)) - (setq gnus-tmp-new-adopts (if (cdar thread) - (append gnus-tmp-new-adopts - (cdar thread)) - gnus-tmp-new-adopts) - thread-end t - gnus-tmp-header nil) - (when (zerop gnus-tmp-level) - (setq gnus-tmp-root-expunged t))) - ;; Perhaps this article is to be marked as read? - ((and gnus-summary-mark-below - (< (or (cdr (assq number gnus-newsgroup-scored)) - default-score) - gnus-summary-mark-below) - ;; Don't touch sparse articles. - (not (gnus-summary-article-sparse-p number)) - (not (gnus-summary-article-ancient-p number))) - (setq gnus-newsgroup-unreads - (delq number gnus-newsgroup-unreads)) - (if gnus-newsgroup-auto-expire - (push number gnus-newsgroup-expirable) - (push (cons number gnus-low-score-mark) - gnus-newsgroup-reads)))) - - (when gnus-tmp-header - ;; We may have an old dummy line to output before this - ;; article. - (when (and gnus-tmp-dummy-line - (gnus-subject-equal - gnus-tmp-dummy-line - (mail-header-subject gnus-tmp-header))) - (gnus-summary-insert-dummy-line - gnus-tmp-dummy-line (mail-header-number gnus-tmp-header)) - (setq gnus-tmp-dummy-line nil)) - - ;; Compute the mark. - (setq gnus-tmp-unread (gnus-article-mark number)) - - (push (gnus-data-make number gnus-tmp-unread (1+ (point)) - gnus-tmp-header gnus-tmp-level) - gnus-newsgroup-data) - - ;; Actually insert the line. - (setq - gnus-tmp-subject-or-nil - (cond - ((and gnus-thread-ignore-subject - gnus-tmp-prev-subject - (not (inline (gnus-subject-equal - gnus-tmp-prev-subject subject)))) - subject) - ((zerop gnus-tmp-level) - (if (and (eq gnus-summary-make-false-root 'empty) - (memq number gnus-tmp-gathered) - gnus-tmp-prev-subject - (inline (gnus-subject-equal - gnus-tmp-prev-subject subject))) - gnus-summary-same-subject - subject)) - (t gnus-summary-same-subject))) - (if (and (eq gnus-summary-make-false-root 'adopt) - (= gnus-tmp-level 1) - (memq number gnus-tmp-gathered)) - (setq gnus-tmp-opening-bracket ?\< - gnus-tmp-closing-bracket ?\>) - (setq gnus-tmp-opening-bracket ?\[ - gnus-tmp-closing-bracket ?\])) - (setq - gnus-tmp-indentation - (aref gnus-thread-indent-array gnus-tmp-level) - gnus-tmp-lines (mail-header-lines gnus-tmp-header) - gnus-tmp-score (or (cdr (assq number gnus-newsgroup-scored)) - gnus-summary-default-score 0) - gnus-tmp-score-char - (if (or (null gnus-summary-default-score) - (<= (abs (- gnus-tmp-score gnus-summary-default-score)) - gnus-summary-zcore-fuzz)) - ?\ ;;;Whitespace - (if (< gnus-tmp-score gnus-summary-default-score) - gnus-score-below-mark gnus-score-over-mark)) - gnus-tmp-replied - (cond ((memq number gnus-newsgroup-processable) - gnus-process-mark) - ((memq number gnus-newsgroup-cached) - gnus-cached-mark) - ((memq number gnus-newsgroup-replied) - gnus-replied-mark) - ((memq number gnus-newsgroup-forwarded) - gnus-forwarded-mark) - ((memq number gnus-newsgroup-saved) - gnus-saved-mark) - ((memq number gnus-newsgroup-recent) - gnus-recent-mark) - ((memq number gnus-newsgroup-unseen) - gnus-unseen-mark) - (t gnus-no-mark)) - gnus-tmp-from (mail-header-from gnus-tmp-header) - gnus-tmp-name - (cond - ((string-match "<[^>]+> *$" gnus-tmp-from) - (setq beg-match (match-beginning 0)) - (or (and (string-match "^\".+\"" gnus-tmp-from) - (substring gnus-tmp-from 1 (1- (match-end 0)))) - (substring gnus-tmp-from 0 beg-match))) - ((string-match "(.+)" gnus-tmp-from) - (substring gnus-tmp-from - (1+ (match-beginning 0)) (1- (match-end 0)))) - (t gnus-tmp-from)) - gnus-tmp-thread-tree-header-string - (cond - ((not gnus-show-threads) "") - ((zerop gnus-tmp-level) - (if (cdar thread) - (or gnus-sum-thread-tree-root subject) - (or gnus-sum-thread-tree-single-indent subject))) - (t - (concat (apply 'concat - (mapcar (lambda (item) - (if (= item 1) - gnus-sum-thread-tree-vertical - gnus-sum-thread-tree-indent)) - (cdr (reverse tree-stack)))) - (if (nth 1 thread) - gnus-sum-thread-tree-leaf-with-other - gnus-sum-thread-tree-single-leaf))))) - (when (string= gnus-tmp-name "") - (setq gnus-tmp-name gnus-tmp-from)) - (unless (numberp gnus-tmp-lines) - (setq gnus-tmp-lines -1)) - (if (= gnus-tmp-lines -1) - (setq gnus-tmp-lines "?") - (setq gnus-tmp-lines (number-to-string gnus-tmp-lines))) - (gnus-put-text-property - (point) - (progn (eval gnus-summary-line-format-spec) (point)) - 'gnus-number number) - (when gnus-visual-p - (forward-line -1) - (gnus-run-hooks 'gnus-summary-update-hook) - (forward-line 1)) - - (setq gnus-tmp-prev-subject subject))) - - (when (nth 1 thread) - (push (list (max 0 gnus-tmp-level) - (copy-list tree-stack) - (nthcdr 1 thread)) - stack)) - (push (if (nth 1 thread) 1 0) tree-stack) - (incf gnus-tmp-level) - (setq threads (if thread-end nil (cdar thread))) - (unless threads - (setq gnus-tmp-level 0))))) - (gnus-message 7 "Generating summary...done")) - -(defun gnus-summary-prepare-unthreaded (headers) - "Generate an unthreaded summary buffer based on HEADERS." - (let (header number mark) - - (beginning-of-line) - - (while headers - ;; We may have to root out some bad articles... - (when (memq (setq number (mail-header-number - (setq header (pop headers)))) - gnus-newsgroup-limit) - ;; Mark article as read when it has a low score. - (when (and gnus-summary-mark-below - (< (or (cdr (assq number gnus-newsgroup-scored)) - gnus-summary-default-score 0) - gnus-summary-mark-below) - (not (gnus-summary-article-ancient-p number))) - (setq gnus-newsgroup-unreads - (delq number gnus-newsgroup-unreads)) - (if gnus-newsgroup-auto-expire - (push number gnus-newsgroup-expirable) - (push (cons number gnus-low-score-mark) - gnus-newsgroup-reads))) - - (setq mark (gnus-article-mark number)) - (push (gnus-data-make number mark (1+ (point)) header 0) - gnus-newsgroup-data) - (gnus-summary-insert-line - header 0 number - mark (memq number gnus-newsgroup-replied) - (memq number gnus-newsgroup-expirable) - (mail-header-subject header) nil - (cdr (assq number gnus-newsgroup-scored)) - (memq number gnus-newsgroup-processable)))))) - -(defun gnus-summary-remove-list-identifiers () - "Remove list identifiers in `gnus-list-identifiers' from articles in the current group." - (let ((regexp (if (consp gnus-list-identifiers) - (mapconcat 'identity gnus-list-identifiers " *\\|") - gnus-list-identifiers)) - changed subject) - (when regexp - (dolist (header gnus-newsgroup-headers) - (setq subject (mail-header-subject header) - changed nil) - (while (string-match - (concat "^\\(R[Ee]: +\\)*\\(" regexp " *\\)") - subject) - (setq subject - (concat (substring subject 0 (match-beginning 2)) - (substring subject (match-end 0))) - changed t)) - (when (and changed - (string-match - "^\\(\\(R[Ee]: +\\)+\\)R[Ee]: +" subject)) - (setq subject - (concat (substring subject 0 (match-beginning 1)) - (substring subject (match-end 1))))) - (when changed - (mail-header-set-subject header subject)))))) - -(defun gnus-fetch-headers (articles) - "Fetch headers of ARTICLES." - (let ((name (gnus-group-decoded-name gnus-newsgroup-name))) - (gnus-message 5 "Fetching headers for %s..." name) - (prog1 - (if (eq 'nov - (setq gnus-headers-retrieved-by - (gnus-retrieve-headers - articles gnus-newsgroup-name - ;; We might want to fetch old headers, but - ;; not if there is only 1 article. - (and (or (and - (not (eq gnus-fetch-old-headers 'some)) - (not (numberp gnus-fetch-old-headers))) - (> (length articles) 1)) - gnus-fetch-old-headers)))) - (gnus-get-newsgroup-headers-xover - articles nil nil gnus-newsgroup-name t) - (gnus-get-newsgroup-headers)) - (gnus-message 5 "Fetching headers for %s...done" name)))) - -(defun gnus-select-newsgroup (group &optional read-all select-articles) - "Select newsgroup GROUP. -If READ-ALL is non-nil, all articles in the group are selected. -If SELECT-ARTICLES, only select those articles from GROUP." - (let* ((entry (gnus-gethash group gnus-newsrc-hashtb)) - ;;!!! Dirty hack; should be removed. - (gnus-summary-ignore-duplicates - (if (eq (car (gnus-find-method-for-group group)) 'nnvirtual) - t - gnus-summary-ignore-duplicates)) - (info (nth 2 entry)) - articles fetched-articles cached) - - (unless (gnus-check-server - (setq gnus-current-select-method - (gnus-find-method-for-group group))) - (error "Couldn't open server")) - - (or (and entry (not (eq (car entry) t))) ; Either it's active... - (gnus-activate-group group) ; Or we can activate it... - (progn ; Or we bug out. - (when (equal major-mode 'gnus-summary-mode) - (kill-buffer (current-buffer))) - (error "Couldn't activate group %s: %s" - group (gnus-status-message group)))) - - (unless (gnus-request-group group t) - (when (equal major-mode 'gnus-summary-mode) - (kill-buffer (current-buffer))) - (error "Couldn't request group %s: %s" - group (gnus-status-message group))) - - (setq gnus-newsgroup-name group - gnus-newsgroup-unselected nil - gnus-newsgroup-unreads (gnus-list-of-unread-articles group)) - - (let ((display (gnus-group-find-parameter group 'display))) - (setq gnus-newsgroup-display - (cond - ((eq display 'all) - 'gnus-not-ignore) - ((arrayp display) - (gnus-summary-display-make-predicate (mapcar 'identity display))) - (t - nil)))) - - (gnus-summary-setup-default-charset) - - ;; Kludge to avoid having cached articles nixed out in virtual groups. - (when (gnus-virtual-group-p group) - (setq cached gnus-newsgroup-cached)) - - (setq gnus-newsgroup-unreads - (gnus-set-difference - (gnus-set-difference gnus-newsgroup-unreads gnus-newsgroup-marked) - gnus-newsgroup-dormant)) - - (setq gnus-newsgroup-processable nil) - - (gnus-update-read-articles group gnus-newsgroup-unreads) - - ;; Adjust and set lists of article marks. - (when info - (gnus-adjust-marked-articles info)) - - (if (setq articles select-articles) - (setq gnus-newsgroup-unselected - (gnus-sorted-intersection - gnus-newsgroup-unreads - (gnus-sorted-complement gnus-newsgroup-unreads articles))) - (setq articles (gnus-articles-to-read group read-all))) - - (cond - ((null articles) - ;;(gnus-message 3 "Couldn't select newsgroup -- no articles to display") - 'quit) - ((eq articles 0) nil) - (t - ;; Init the dependencies hash table. - (setq gnus-newsgroup-dependencies - (gnus-make-hashtable (length articles))) - (gnus-set-global-variables) - ;; Retrieve the headers and read them in. - (setq gnus-newsgroup-headers (gnus-fetch-headers articles)) - - ;; Kludge to avoid having cached articles nixed out in virtual groups. - (when cached - (setq gnus-newsgroup-cached cached)) - - ;; Suppress duplicates? - (when gnus-suppress-duplicates - (gnus-dup-suppress-articles)) - - ;; Set the initial limit. - (setq gnus-newsgroup-limit (copy-sequence articles)) - ;; Remove canceled articles from the list of unread articles. - (setq fetched-articles - (mapcar (lambda (headers) (mail-header-number headers)) - gnus-newsgroup-headers)) - (setq gnus-newsgroup-articles fetched-articles) - (setq gnus-newsgroup-unreads - (gnus-set-sorted-intersection - gnus-newsgroup-unreads fetched-articles)) - - (let ((marks (assq 'seen (gnus-info-marks info)))) - ;; The `seen' marks are treated specially. - (when (setq gnus-newsgroup-seen (cdr marks)) - (dolist (article gnus-newsgroup-articles) - (unless (gnus-member-of-range - article gnus-newsgroup-seen) - (push article gnus-newsgroup-unseen))))) - - ;; Removed marked articles that do not exist. - (gnus-update-missing-marks - (gnus-sorted-complement fetched-articles articles)) - ;; We might want to build some more threads first. - (when (and gnus-fetch-old-headers - (eq gnus-headers-retrieved-by 'nov)) - (if (eq gnus-fetch-old-headers 'invisible) - (gnus-build-all-threads) - (gnus-build-old-threads))) - ;; Let the Gnus agent mark articles as read. - (when gnus-agent - (gnus-agent-get-undownloaded-list)) - ;; Remove list identifiers from subject - (when gnus-list-identifiers - (gnus-summary-remove-list-identifiers)) - ;; Check whether auto-expire is to be done in this group. - (setq gnus-newsgroup-auto-expire - (gnus-group-auto-expirable-p group)) - ;; Set up the article buffer now, if necessary. - (unless gnus-single-article-buffer - (gnus-article-setup-buffer)) - ;; First and last article in this newsgroup. - (when gnus-newsgroup-headers - (setq gnus-newsgroup-begin - (mail-header-number (car gnus-newsgroup-headers)) - gnus-newsgroup-end - (mail-header-number - (gnus-last-element gnus-newsgroup-headers)))) - ;; GROUP is successfully selected. - (or gnus-newsgroup-headers t))))) - -(defun gnus-summary-display-make-predicate (display) - (require 'gnus-agent) - (when (= (length display) 1) - (setq display (car display))) - (unless gnus-summary-display-cache - (dolist (elem (append (list (cons 'read 'read) - (cons 'unseen 'unseen)) - gnus-article-mark-lists)) - (push (cons (cdr elem) - (gnus-byte-compile - `(lambda () (gnus-article-marked-p ',(cdr elem))))) - gnus-summary-display-cache))) - (let ((gnus-category-predicate-alist gnus-summary-display-cache)) - (gnus-get-predicate display))) - -;; Uses the dynamically bound `number' variable. -(defvar number) -(defun gnus-article-marked-p (type &optional article) - (let ((article (or article number))) - (cond - ((eq type 'tick) - (memq article gnus-newsgroup-marked)) - ((eq type 'unsend) - (memq article gnus-newsgroup-unsendable)) - ((eq type 'undownload) - (memq article gnus-newsgroup-undownloaded)) - ((eq type 'download) - (memq article gnus-newsgroup-downloadable)) - ((eq type 'unread) - (memq article gnus-newsgroup-unreads)) - ((eq type 'read) - (memq article gnus-newsgroup-reads)) - ((eq type 'dormant) - (memq article gnus-newsgroup-dormant) ) - ((eq type 'expire) - (memq article gnus-newsgroup-expirable)) - ((eq type 'reply) - (memq article gnus-newsgroup-replied)) - ((eq type 'killed) - (memq article gnus-newsgroup-killed)) - ((eq type 'bookmark) - (assq article gnus-newsgroup-bookmarks)) - ((eq type 'score) - (assq article gnus-newsgroup-scored)) - ((eq type 'save) - (memq article gnus-newsgroup-saved)) - ((eq type 'cache) - (memq article gnus-newsgroup-cached)) - ((eq type 'forward) - (memq article gnus-newsgroup-forwarded)) - ((eq type 'seen) - (not (memq article gnus-newsgroup-unseen))) - ((eq type 'recent) - (memq article gnus-newsgroup-recent)) - (t t)))) - -(defun gnus-articles-to-read (group &optional read-all) - "Find out what articles the user wants to read." - (let* ((articles - ;; Select all articles if `read-all' is non-nil, or if there - ;; are no unread articles. - (if (or read-all - (and (zerop (length gnus-newsgroup-marked)) - (zerop (length gnus-newsgroup-unreads))) - (eq gnus-newsgroup-display 'gnus-not-ignore)) - ;; We want to select the headers for all the articles in - ;; the group, so we select either all the active - ;; articles in the group, or (if that's nil), the - ;; articles in the cache. - (or - (gnus-uncompress-range (gnus-active group)) - (gnus-cache-articles-in-group group)) - ;; Select only the "normal" subset of articles. - (sort (append gnus-newsgroup-dormant gnus-newsgroup-marked - (copy-sequence gnus-newsgroup-unreads)) - '<))) - (scored-list (gnus-killed-articles gnus-newsgroup-killed articles)) - (scored (length scored-list)) - (number (length articles)) - (marked (+ (length gnus-newsgroup-marked) - (length gnus-newsgroup-dormant))) - (select - (cond - ((numberp read-all) - read-all) - (t - (condition-case () - (cond - ((and (or (<= scored marked) (= scored number)) - (natnump gnus-large-newsgroup) - (> number gnus-large-newsgroup)) - (let* ((cursor-in-echo-area nil) - (input - (read-from-minibuffer - (format - "How many articles from %s (max %d): " - (gnus-limit-string - (gnus-group-decoded-name gnus-newsgroup-name) - 35) - number) - (cons (number-to-string gnus-large-newsgroup) - 0)))) - (if (string-match "^[ \t]*$" input) - number - input))) - ((and (> scored marked) (< scored number) - (> (- scored number) 20)) - (let ((input - (read-string - (format "%s %s (%d scored, %d total): " - "How many articles from" - (gnus-group-decoded-name group) - scored number)))) - (if (string-match "^[ \t]*$" input) - number input))) - (t number)) - (quit - (message "Quit getting the articles to read") - nil)))))) - (setq select (if (stringp select) (string-to-number select) select)) - (if (or (null select) (zerop select)) - select - (if (and (not (zerop scored)) (<= (abs select) scored)) - (progn - (setq articles (sort scored-list '<)) - (setq number (length articles))) - (setq articles (copy-sequence articles))) - - (when (< (abs select) number) - (if (< select 0) - ;; Select the N oldest articles. - (setcdr (nthcdr (1- (abs select)) articles) nil) - ;; Select the N most recent articles. - (setq articles (nthcdr (- number select) articles)))) - (setq gnus-newsgroup-unselected - (gnus-sorted-intersection - gnus-newsgroup-unreads - (gnus-sorted-complement gnus-newsgroup-unreads articles))) - (when gnus-alter-articles-to-read-function - (setq gnus-newsgroup-unreads - (sort - (funcall gnus-alter-articles-to-read-function - gnus-newsgroup-name gnus-newsgroup-unreads) - '<))) - articles))) - -(defun gnus-killed-articles (killed articles) - (let (out) - (while articles - (when (inline (gnus-member-of-range (car articles) killed)) - (push (car articles) out)) - (setq articles (cdr articles))) - out)) - -(defun gnus-uncompress-marks (marks) - "Uncompress the mark ranges in MARKS." - (let ((uncompressed '(score bookmark)) - out) - (while marks - (if (memq (caar marks) uncompressed) - (push (car marks) out) - (push (cons (caar marks) (gnus-uncompress-range (cdar marks))) out)) - (setq marks (cdr marks))) - out)) - -(defun gnus-article-mark-to-type (mark) - "Return the type of MARK." - (or (cadr (assq mark gnus-article-special-mark-lists)) - 'list)) - -(defun gnus-adjust-marked-articles (info) - "Set all article lists and remove all marks that are no longer valid." - (let* ((marked-lists (gnus-info-marks info)) - (active (gnus-active (gnus-info-group info))) - (min (car active)) - (max (cdr active)) - (types gnus-article-mark-lists) - marks var articles article mark mark-type) - - (dolist (marks marked-lists) - (setq mark (car marks) - mark-type (gnus-article-mark-to-type mark) - var (intern (format "gnus-newsgroup-%s" (car (rassq mark types))))) - - ;; We set the variable according to the type of the marks list, - ;; and then adjust the marks to a subset of the active articles. - (cond - ;; Adjust "simple" lists. - ((eq mark-type 'list) - (set var (setq articles (gnus-uncompress-range (cdr marks)))) - (when (memq mark '(tick dormant expire reply save)) - (while articles - (when (or (< (setq article (pop articles)) min) (> article max)) - (set var (delq article (symbol-value var))))))) - ;; Adjust assocs. - ((eq mark-type 'tuple) - (set var (setq articles (cdr marks))) - (when (not (listp (cdr (symbol-value var)))) - (set var (list (symbol-value var)))) - (when (not (listp (cdr articles))) - (setq articles (list articles))) - (while articles - (when (or (not (consp (setq article (pop articles)))) - (< (car article) min) - (> (car article) max)) - (set var (delq article (symbol-value var)))))) - ((eq mark-type 'range) - (cond - ((eq mark 'seen)))))))) - -(defun gnus-update-missing-marks (missing) - "Go through the list of MISSING articles and remove them from the mark lists." - (when missing - (let (var m) - ;; Go through all types. - (dolist (elem gnus-article-mark-lists) - (when (eq (gnus-article-mark-to-type (cdr elem)) 'list) - (setq var (intern (format "gnus-newsgroup-%s" (car elem)))) - (when (symbol-value var) - ;; This list has articles. So we delete all missing - ;; articles from it. - (setq m missing) - (while m - (set var (delq (pop m) (symbol-value var)))))))))) - -(defun gnus-update-marks () - "Enter the various lists of marked articles into the newsgroup info list." - (let ((types gnus-article-mark-lists) - (info (gnus-get-info gnus-newsgroup-name)) - (uncompressed '(score bookmark killed seen)) - type list newmarked symbol delta-marks) - (when info - ;; Add all marks lists to the list of marks lists. - (while (setq type (pop types)) - (setq list (symbol-value - (setq symbol - (intern (format "gnus-newsgroup-%s" (car type)))))) - - (when list - ;; Get rid of the entries of the articles that have the - ;; default score. - (when (and (eq (cdr type) 'score) - gnus-save-score - list) - (let* ((arts list) - (prev (cons nil list)) - (all prev)) - (while arts - (if (or (not (consp (car arts))) - (= (cdar arts) gnus-summary-default-score)) - (setcdr prev (cdr arts)) - (setq prev arts)) - (setq arts (cdr arts))) - (setq list (cdr all))))) - - (when (eq (cdr type) 'seen) - (setq list - (if list - (gnus-add-to-range list gnus-newsgroup-unseen) - (gnus-compress-sequence gnus-newsgroup-articles)))) - - (unless (memq (cdr type) uncompressed) - (setq list (gnus-compress-sequence (set symbol (sort list '<)) t))) - - (when (gnus-check-backend-function - 'request-set-mark gnus-newsgroup-name) - ;; propagate flags to server, with the following exceptions: - ;; uncompressed:s are not proper flags (they are cons cells) - ;; cache is a internal gnus flag - ;; download are local to one gnus installation (well) - ;; unsend are for nndraft groups only - ;; xxx: generality of this? this suits nnimap anyway - (unless (memq (cdr type) (append '(cache download unsend) - uncompressed)) - (let* ((old (cdr (assq (cdr type) (gnus-info-marks info)))) - (del (gnus-remove-from-range (gnus-copy-sequence old) list)) - (add (gnus-remove-from-range - (gnus-copy-sequence list) old))) - (when add - (push (list add 'add (list (cdr type))) delta-marks)) - (when del - (push (list del 'del (list (cdr type))) delta-marks))))) - - (when list - (push (cons (cdr type) list) newmarked))) - - (when delta-marks - (unless (gnus-check-group gnus-newsgroup-name) - (error "Can't open server for %s" gnus-newsgroup-name)) - (gnus-request-set-mark gnus-newsgroup-name delta-marks)) - - ;; Enter these new marks into the info of the group. - (if (nthcdr 3 info) - (setcar (nthcdr 3 info) newmarked) - ;; Add the marks lists to the end of the info. - (when newmarked - (setcdr (nthcdr 2 info) (list newmarked)))) - - ;; Cut off the end of the info if there's nothing else there. - (let ((i 5)) - (while (and (> i 2) - (not (nth i info))) - (when (nthcdr (decf i) info) - (setcdr (nthcdr i info) nil))))))) - -(defun gnus-set-mode-line (where) - "Set the mode line of the article or summary buffers. -If WHERE is `summary', the summary mode line format will be used." - ;; Is this mode line one we keep updated? - (when (and (memq where gnus-updated-mode-lines) - (symbol-value - (intern (format "gnus-%s-mode-line-format-spec" where)))) - (let (mode-string) - (save-excursion - ;; We evaluate this in the summary buffer since these - ;; variables are buffer-local to that buffer. - (set-buffer gnus-summary-buffer) - ;; We bind all these variables that are used in the `eval' form - ;; below. - (let* ((mformat (symbol-value - (intern - (format "gnus-%s-mode-line-format-spec" where)))) - (gnus-tmp-group-name (gnus-group-decoded-name - gnus-newsgroup-name)) - (gnus-tmp-article-number (or gnus-current-article 0)) - (gnus-tmp-unread gnus-newsgroup-unreads) - (gnus-tmp-unread-and-unticked (length gnus-newsgroup-unreads)) - (gnus-tmp-unselected (length gnus-newsgroup-unselected)) - (gnus-tmp-unread-and-unselected - (cond ((and (zerop gnus-tmp-unread-and-unticked) - (zerop gnus-tmp-unselected)) - "") - ((zerop gnus-tmp-unselected) - (format "{%d more}" gnus-tmp-unread-and-unticked)) - (t (format "{%d(+%d) more}" - gnus-tmp-unread-and-unticked - gnus-tmp-unselected)))) - (gnus-tmp-subject - (if (and gnus-current-headers - (vectorp gnus-current-headers)) - (gnus-mode-string-quote - (mail-header-subject gnus-current-headers)) - "")) - bufname-length max-len - gnus-tmp-header);; passed as argument to any user-format-funcs - (setq mode-string (eval mformat)) - (setq bufname-length (if (string-match "%b" mode-string) - (- (length - (buffer-name - (if (eq where 'summary) - nil - (get-buffer gnus-article-buffer)))) - 2) - 0)) - (setq max-len (max 4 (if gnus-mode-non-string-length - (- (window-width) - gnus-mode-non-string-length - bufname-length) - (length mode-string)))) - ;; We might have to chop a bit of the string off... - (when (> (length mode-string) max-len) - (setq mode-string - (concat (gnus-truncate-string mode-string (- max-len 3)) - "..."))) - ;; Pad the mode string a bit. - (setq mode-string (format (format "%%-%ds" max-len) mode-string)))) - ;; Update the mode line. - (setq mode-line-buffer-identification - (gnus-mode-line-buffer-identification (list mode-string))) - (set-buffer-modified-p t)))) - -(defun gnus-create-xref-hashtb (from-newsgroup headers unreads) - "Go through the HEADERS list and add all Xrefs to a hash table. -The resulting hash table is returned, or nil if no Xrefs were found." - (let* ((virtual (gnus-virtual-group-p from-newsgroup)) - (prefix (if virtual "" (gnus-group-real-prefix from-newsgroup))) - (xref-hashtb (gnus-make-hashtable)) - start group entry number xrefs header) - (while headers - (setq header (pop headers)) - (when (and (setq xrefs (mail-header-xref header)) - (not (memq (setq number (mail-header-number header)) - unreads))) - (setq start 0) - (while (string-match "\\([^ ]+\\)[:/]\\([0-9]+\\)" xrefs start) - (setq start (match-end 0)) - (setq group (if prefix - (concat prefix (substring xrefs (match-beginning 1) - (match-end 1))) - (substring xrefs (match-beginning 1) (match-end 1)))) - (setq number - (string-to-int (substring xrefs (match-beginning 2) - (match-end 2)))) - (if (setq entry (gnus-gethash group xref-hashtb)) - (setcdr entry (cons number (cdr entry))) - (gnus-sethash group (cons number nil) xref-hashtb))))) - (and start xref-hashtb))) - -(defun gnus-mark-xrefs-as-read (from-newsgroup headers unreads) - "Look through all the headers and mark the Xrefs as read." - (let ((virtual (gnus-virtual-group-p from-newsgroup)) - name entry info xref-hashtb idlist method nth4) - (save-excursion - (set-buffer gnus-group-buffer) - (when (setq xref-hashtb - (gnus-create-xref-hashtb from-newsgroup headers unreads)) - (mapatoms - (lambda (group) - (unless (string= from-newsgroup (setq name (symbol-name group))) - (setq idlist (symbol-value group)) - ;; Dead groups are not updated. - (and (prog1 - (setq entry (gnus-gethash name gnus-newsrc-hashtb) - info (nth 2 entry)) - (when (stringp (setq nth4 (gnus-info-method info))) - (setq nth4 (gnus-server-to-method nth4)))) - ;; Only do the xrefs if the group has the same - ;; select method as the group we have just read. - (or (gnus-methods-equal-p - nth4 (gnus-find-method-for-group from-newsgroup)) - virtual - (equal nth4 (setq method (gnus-find-method-for-group - from-newsgroup))) - (and (equal (car nth4) (car method)) - (equal (nth 1 nth4) (nth 1 method)))) - gnus-use-cross-reference - (or (not (eq gnus-use-cross-reference t)) - virtual - ;; Only do cross-references on subscribed - ;; groups, if that is what is wanted. - (<= (gnus-info-level info) gnus-level-subscribed)) - (gnus-group-make-articles-read name idlist)))) - xref-hashtb))))) - -(defun gnus-compute-read-articles (group articles) - (let* ((entry (gnus-gethash group gnus-newsrc-hashtb)) - (info (nth 2 entry)) - (active (gnus-active group)) - ninfo) - (when entry - ;; First peel off all invalid article numbers. - (when active - (let ((ids articles) - id first) - (while (setq id (pop ids)) - (when (and first (> id (cdr active))) - ;; We'll end up in this situation in one particular - ;; obscure situation. If you re-scan a group and get - ;; a new article that is cross-posted to a different - ;; group that has not been re-scanned, you might get - ;; crossposted article that has a higher number than - ;; Gnus believes possible. So we re-activate this - ;; group as well. This might mean doing the - ;; crossposting thingy will *increase* the number - ;; of articles in some groups. Tsk, tsk. - (setq active (or (gnus-activate-group group) active))) - (when (or (> id (cdr active)) - (< id (car active))) - (setq articles (delq id articles)))))) - ;; If the read list is nil, we init it. - (if (and active - (null (gnus-info-read info)) - (> (car active) 1)) - (setq ninfo (cons 1 (1- (car active)))) - (setq ninfo (gnus-info-read info))) - ;; Then we add the read articles to the range. - (gnus-add-to-range - ninfo (setq articles (sort articles '<)))))) - -(defun gnus-group-make-articles-read (group articles) - "Update the info of GROUP to say that ARTICLES are read." - (let* ((num 0) - (entry (gnus-gethash group gnus-newsrc-hashtb)) - (info (nth 2 entry)) - (active (gnus-active group)) - range) - (when entry - (setq range (gnus-compute-read-articles group articles)) - (save-excursion - (set-buffer gnus-group-buffer) - (gnus-undo-register - `(progn - (gnus-info-set-marks ',info ',(gnus-info-marks info) t) - (gnus-info-set-read ',info ',(gnus-info-read info)) - (gnus-get-unread-articles-in-group ',info (gnus-active ,group)) - (gnus-group-update-group ,group t)))) - ;; Add the read articles to the range. - (gnus-info-set-read info range) - (gnus-request-set-mark group (list (list range 'add '(read)))) - ;; Then we have to re-compute how many unread - ;; articles there are in this group. - (when active - (cond - ((not range) - (setq num (- (1+ (cdr active)) (car active)))) - ((not (listp (cdr range))) - (setq num (- (cdr active) (- (1+ (cdr range)) - (car range))))) - (t - (while range - (if (numberp (car range)) - (setq num (1+ num)) - (setq num (+ num (- (1+ (cdar range)) (caar range))))) - (setq range (cdr range))) - (setq num (- (cdr active) num)))) - ;; Update the number of unread articles. - (setcar entry num) - ;; Update the group buffer. - (gnus-group-update-group group t))))) - -(defvar gnus-newsgroup-none-id 0) - -(defun gnus-get-newsgroup-headers (&optional dependencies force-new) - (let ((cur nntp-server-buffer) - (dependencies - (or dependencies - (save-excursion (set-buffer gnus-summary-buffer) - gnus-newsgroup-dependencies))) - headers id end ref - (mail-parse-charset gnus-newsgroup-charset) - (mail-parse-ignored-charsets - (save-excursion (condition-case nil - (set-buffer gnus-summary-buffer) - (error)) - gnus-newsgroup-ignored-charsets))) - (save-excursion - (set-buffer nntp-server-buffer) - ;; Translate all TAB characters into SPACE characters. - (subst-char-in-region (point-min) (point-max) ?\t ? t) - (subst-char-in-region (point-min) (point-max) ?\r ? t) - (gnus-run-hooks 'gnus-parse-headers-hook) - (let ((case-fold-search t) - in-reply-to header p lines chars ctype) - (goto-char (point-min)) - ;; Search to the beginning of the next header. Error messages - ;; do not begin with 2 or 3. - (while (re-search-forward "^[23][0-9]+ " nil t) - (setq id nil - ref nil) - ;; This implementation of this function, with nine - ;; search-forwards instead of the one re-search-forward and - ;; a case (which basically was the old function) is actually - ;; about twice as fast, even though it looks messier. You - ;; can't have everything, I guess. Speed and elegance - ;; doesn't always go hand in hand. - (setq - header - (make-full-mail-header - ;; Number. - (prog1 - (read cur) - (end-of-line) - (setq p (point)) - (narrow-to-region (point) - (or (and (search-forward "\n.\n" nil t) - (- (point) 2)) - (point)))) - ;; Subject. - (progn - (goto-char p) - (if (search-forward "\nsubject:" nil t) - (nnheader-header-value) - "(none)")) - ;; From. - (progn - (goto-char p) - (if (search-forward "\nfrom:" nil t) - (nnheader-header-value) - "(nobody)")) - ;; Date. - (progn - (goto-char p) - (if (search-forward "\ndate:" nil t) - (nnheader-header-value) "")) - ;; Message-ID. - (progn - (goto-char p) - (setq id (if (re-search-forward - "^message-id: *\\(<[^\n\t> ]+>\\)" nil t) - ;; We do it this way to make sure the Message-ID - ;; is (somewhat) syntactically valid. - (buffer-substring (match-beginning 1) - (match-end 1)) - ;; If there was no message-id, we just fake one - ;; to make subsequent routines simpler. - (nnheader-generate-fake-message-id)))) - ;; References. - (progn - (goto-char p) - (if (search-forward "\nreferences:" nil t) - (progn - (setq end (point)) - (prog1 - (nnheader-header-value) - (setq ref - (buffer-substring - (progn - ;; (end-of-line) - (search-backward ">" end t) - (1+ (point))) - (progn - (search-backward "<" end t) - (point)))))) - ;; Get the references from the in-reply-to header if there - ;; were no references and the in-reply-to header looks - ;; promising. - (if (and (search-forward "\nin-reply-to:" nil t) - (setq in-reply-to (nnheader-header-value)) - (string-match "<[^>]+>" in-reply-to)) - (let (ref2) - (setq ref (substring in-reply-to (match-beginning 0) - (match-end 0))) - (while (string-match "<[^>]+>" in-reply-to (match-end 0)) - (setq ref2 (substring in-reply-to (match-beginning 0) - (match-end 0))) - (when (> (length ref2) (length ref)) - (setq ref ref2))) - ref) - (setq ref nil)))) - ;; Chars. - (progn - (goto-char p) - (if (search-forward "\nchars: " nil t) - (if (numberp (setq chars (ignore-errors (read cur)))) - chars -1) - -1)) - ;; Lines. - (progn - (goto-char p) - (if (search-forward "\nlines: " nil t) - (if (numberp (setq lines (ignore-errors (read cur)))) - lines -1) - -1)) - ;; Xref. - (progn - (goto-char p) - (and (search-forward "\nxref:" nil t) - (nnheader-header-value))) - ;; Extra. - (when gnus-extra-headers - (let ((extra gnus-extra-headers) - out) - (while extra - (goto-char p) - (when (search-forward - (concat "\n" (symbol-name (car extra)) ":") nil t) - (push (cons (car extra) (nnheader-header-value)) out)) - (pop extra)) - out)))) - (goto-char p) - (if (and (search-forward "\ncontent-type: " nil t) - (setq ctype (nnheader-header-value))) - (mime-entity-set-content-type-internal - header (mime-parse-Content-Type ctype))) - (when (equal id ref) - (setq ref nil)) - - (when gnus-alter-header-function - (funcall gnus-alter-header-function header) - (setq id (mail-header-id header) - ref (gnus-parent-id (mail-header-references header)))) - - (when (setq header - (gnus-dependencies-add-header - header dependencies force-new)) - (push header headers)) - (goto-char (point-max)) - (widen)) - (nreverse headers))))) - -;; Goes through the xover lines and returns a list of vectors -(defun gnus-get-newsgroup-headers-xover (sequence &optional - force-new dependencies - group also-fetch-heads) - "Parse the news overview data in the server buffer. -Return a list of headers that match SEQUENCE (see -`nntp-retrieve-headers')." - ;; Get the Xref when the users reads the articles since most/some - ;; NNTP servers do not include Xrefs when using XOVER. - (setq gnus-article-internal-prepare-hook '(gnus-article-get-xrefs)) - (let ((mail-parse-charset gnus-newsgroup-charset) - (mail-parse-ignored-charsets gnus-newsgroup-ignored-charsets) - (cur nntp-server-buffer) - (dependencies (or dependencies gnus-newsgroup-dependencies)) - (allp (cond - ((eq gnus-read-all-available-headers t) - t) - ((stringp gnus-read-all-available-headers) - (string-match gnus-read-all-available-headers group)) - (t - nil))) - number headers header) - (save-excursion - (set-buffer nntp-server-buffer) - (subst-char-in-region (point-min) (point-max) ?\r ? t) - ;; Allow the user to mangle the headers before parsing them. - (gnus-run-hooks 'gnus-parse-headers-hook) - (goto-char (point-min)) - (while (not (eobp)) - (condition-case () - (while (and (or sequence allp) - (not (eobp))) - (setq number (read cur)) - (when (not allp) - (while (and sequence - (< (car sequence) number)) - (setq sequence (cdr sequence)))) - (when (and (or allp - (and sequence - (eq number (car sequence)))) - (progn - (setq sequence (cdr sequence)) - (setq header (inline - (gnus-nov-parse-line - number dependencies force-new))))) - (push header headers)) - (forward-line 1)) - (error - (gnus-error 4 "Strange nov line (%d)" - (count-lines (point-min) (point))))) - (forward-line 1)) - ;; A common bug in inn is that if you have posted an article and - ;; then retrieves the active file, it will answer correctly -- - ;; the new article is included. However, a NOV entry for the - ;; article may not have been generated yet, so this may fail. - ;; We work around this problem by retrieving the last few - ;; headers using HEAD. - (if (or (not also-fetch-heads) - (not sequence)) - ;; We (probably) got all the headers. - (nreverse headers) - (let ((gnus-nov-is-evil t)) - (nconc - (nreverse headers) - (when (eq (gnus-retrieve-headers sequence group) 'headers) - (gnus-get-newsgroup-headers)))))))) - -(defun gnus-article-get-xrefs () - "Fill in the Xref value in `gnus-current-headers', if necessary. -This is meant to be called in `gnus-article-internal-prepare-hook'." - (let ((headers (save-excursion (set-buffer gnus-summary-buffer) - gnus-current-headers))) - (or (not gnus-use-cross-reference) - (not headers) - (and (mail-header-xref headers) - (not (string= (mail-header-xref headers) ""))) - (let ((case-fold-search t) - xref) - (save-restriction - (nnheader-narrow-to-headers) - (goto-char (point-min)) - (when (or (and (not (eobp)) - (eq (downcase (char-after)) ?x) - (looking-at "Xref:")) - (search-forward "\nXref:" nil t)) - (goto-char (1+ (match-end 0))) - (setq xref (buffer-substring (point) - (progn (end-of-line) (point)))) - (mail-header-set-xref headers xref))))))) - -(defun gnus-summary-insert-subject (id &optional old-header use-old-header) - "Find article ID and insert the summary line for that article. -OLD-HEADER can either be a header or a line number to insert -the subject line on." - (let* ((line (and (numberp old-header) old-header)) - (old-header (and (vectorp old-header) old-header)) - (header (cond ((and old-header use-old-header) - old-header) - ((and (numberp id) - (gnus-number-to-header id)) - (gnus-number-to-header id)) - (t - (gnus-read-header id)))) - (number (and (numberp id) id)) - d) - (when header - ;; Rebuild the thread that this article is part of and go to the - ;; article we have fetched. - (when (and (not gnus-show-threads) - old-header) - (when (and number - (setq d (gnus-data-find (mail-header-number old-header)))) - (goto-char (gnus-data-pos d)) - (gnus-data-remove - number - (- (gnus-point-at-bol) - (prog1 - (1+ (gnus-point-at-eol)) - (gnus-delete-line)))))) - (when old-header - (mail-header-set-number header (mail-header-number old-header))) - (setq gnus-newsgroup-sparse - (delq (setq number (mail-header-number header)) - gnus-newsgroup-sparse)) - (setq gnus-newsgroup-ancient (delq number gnus-newsgroup-ancient)) - (push number gnus-newsgroup-limit) - (gnus-rebuild-thread (mail-header-id header) line) - (gnus-summary-goto-subject number nil t)) - (when (and (numberp number) - (> number 0)) - ;; We have to update the boundaries even if we can't fetch the - ;; article if ID is a number -- so that the next `P' or `N' - ;; command will fetch the previous (or next) article even - ;; if the one we tried to fetch this time has been canceled. - (when (> number gnus-newsgroup-end) - (setq gnus-newsgroup-end number)) - (when (< number gnus-newsgroup-begin) - (setq gnus-newsgroup-begin number)) - (setq gnus-newsgroup-unselected - (delq number gnus-newsgroup-unselected))) - ;; Report back a success? - (and header (mail-header-number header)))) - -;;; Process/prefix in the summary buffer - -(defun gnus-summary-work-articles (n) - "Return a list of articles to be worked upon. -The prefix argument, the list of process marked articles, and the -current article will be taken into consideration." - (save-excursion - (set-buffer gnus-summary-buffer) - (cond - (n - ;; A numerical prefix has been given. - (setq n (prefix-numeric-value n)) - (let ((backward (< n 0)) - (n (abs (prefix-numeric-value n))) - articles article) - (save-excursion - (while - (and (> n 0) - (push (setq article (gnus-summary-article-number)) - articles) - (if backward - (gnus-summary-find-prev nil article) - (gnus-summary-find-next nil article))) - (decf n))) - (nreverse articles))) - ((and (gnus-region-active-p) (mark)) - (message "region active") - ;; Work on the region between point and mark. - (let ((max (max (point) (mark))) - articles article) - (save-excursion - (goto-char (min (point) (mark))) - (while - (and - (push (setq article (gnus-summary-article-number)) articles) - (gnus-summary-find-next nil article) - (< (point) max))) - (nreverse articles)))) - (gnus-newsgroup-processable - ;; There are process-marked articles present. - ;; Save current state. - (gnus-summary-save-process-mark) - ;; Return the list. - (reverse gnus-newsgroup-processable)) - (t - ;; Just return the current article. - (list (gnus-summary-article-number)))))) - -(defmacro gnus-summary-iterate (arg &rest forms) - "Iterate over the process/prefixed articles and do FORMS. -ARG is the interactive prefix given to the command. FORMS will be -executed with point over the summary line of the articles." - (let ((articles (make-symbol "gnus-summary-iterate-articles"))) - `(let ((,articles (gnus-summary-work-articles ,arg))) - (while ,articles - (gnus-summary-goto-subject (car ,articles)) - ,@forms - (pop ,articles))))) - -(put 'gnus-summary-iterate 'lisp-indent-function 1) -(put 'gnus-summary-iterate 'edebug-form-spec '(form body)) - -(defun gnus-summary-save-process-mark () - "Push the current set of process marked articles on the stack." - (interactive) - (push (copy-sequence gnus-newsgroup-processable) - gnus-newsgroup-process-stack)) - -(defun gnus-summary-kill-process-mark () - "Push the current set of process marked articles on the stack and unmark." - (interactive) - (gnus-summary-save-process-mark) - (gnus-summary-unmark-all-processable)) - -(defun gnus-summary-yank-process-mark () - "Pop the last process mark state off the stack and restore it." - (interactive) - (unless gnus-newsgroup-process-stack - (error "Empty mark stack")) - (gnus-summary-process-mark-set (pop gnus-newsgroup-process-stack))) - -(defun gnus-summary-process-mark-set (set) - "Make SET into the current process marked articles." - (gnus-summary-unmark-all-processable) - (while set - (gnus-summary-set-process-mark (pop set)))) - -;;; Searching and stuff - -(defun gnus-summary-search-group (&optional backward use-level) - "Search for next unread newsgroup. -If optional argument BACKWARD is non-nil, search backward instead." - (save-excursion - (set-buffer gnus-group-buffer) - (when (gnus-group-search-forward - backward nil (if use-level (gnus-group-group-level) nil)) - (gnus-group-group-name)))) - -(defun gnus-summary-best-group (&optional exclude-group) - "Find the name of the best unread group. -If EXCLUDE-GROUP, do not go to this group." - (save-excursion - (set-buffer gnus-group-buffer) - (save-excursion - (gnus-group-best-unread-group exclude-group)))) - -(defun gnus-summary-find-next (&optional unread article backward undownloaded) - (if backward (gnus-summary-find-prev) - (let* ((dummy (gnus-summary-article-intangible-p)) - (article (or article (gnus-summary-article-number))) - (arts (gnus-data-find-list article)) - result) - (when (and (not dummy) - (or (not gnus-summary-check-current) - (not unread) - (not (gnus-data-unread-p (car arts))))) - (setq arts (cdr arts))) - (when (setq result - (if unread - (progn - (while arts - (when (or (and undownloaded - (eq gnus-undownloaded-mark - (gnus-data-mark (car arts)))) - (gnus-data-unread-p (car arts))) - (setq result (car arts) - arts nil)) - (setq arts (cdr arts))) - result) - (car arts))) - (goto-char (gnus-data-pos result)) - (gnus-data-number result))))) - -(defun gnus-summary-find-prev (&optional unread article) - (let* ((eobp (eobp)) - (article (or article (gnus-summary-article-number))) - (arts (gnus-data-find-list article (gnus-data-list 'rev))) - result) - (when (and (not eobp) - (or (not gnus-summary-check-current) - (not unread) - (not (gnus-data-unread-p (car arts))))) - (setq arts (cdr arts))) - (when (setq result - (if unread - (progn - (while arts - (when (gnus-data-unread-p (car arts)) - (setq result (car arts) - arts nil)) - (setq arts (cdr arts))) - result) - (car arts))) - (goto-char (gnus-data-pos result)) - (gnus-data-number result)))) - -(defun gnus-summary-find-subject (subject &optional unread backward article) - (let* ((simp-subject (gnus-simplify-subject-fully subject)) - (article (or article (gnus-summary-article-number))) - (articles (gnus-data-list backward)) - (arts (gnus-data-find-list article articles)) - result) - (when (or (not gnus-summary-check-current) - (not unread) - (not (gnus-data-unread-p (car arts)))) - (setq arts (cdr arts))) - (while arts - (and (or (not unread) - (gnus-data-unread-p (car arts))) - (vectorp (gnus-data-header (car arts))) - (gnus-subject-equal - simp-subject (mail-header-subject (gnus-data-header (car arts))) t) - (setq result (car arts) - arts nil)) - (setq arts (cdr arts))) - (and result - (goto-char (gnus-data-pos result)) - (gnus-data-number result)))) - -(defun gnus-summary-search-forward (&optional unread subject backward) - "Search forward for an article. -If UNREAD, look for unread articles. If SUBJECT, look for -articles with that subject. If BACKWARD, search backward instead." - (cond (subject (gnus-summary-find-subject subject unread backward)) - (backward (gnus-summary-find-prev unread)) - (t (gnus-summary-find-next unread)))) - -(defun gnus-recenter (&optional n) - "Center point in window and redisplay frame. -Also do horizontal recentering." - (interactive "P") - (when (and gnus-auto-center-summary - (not (eq gnus-auto-center-summary 'vertical))) - (gnus-horizontal-recenter)) - (recenter n)) - -(defun gnus-summary-recenter () - "Center point in the summary window. -If `gnus-auto-center-summary' is nil, or the article buffer isn't -displayed, no centering will be performed." - ;; Suggested by earle@mahendo.JPL.NASA.GOV (Greg Earle). - ;; Recenter only when requested. Suggested by popovich@park.cs.columbia.edu. - (interactive) - (let* ((top (cond ((< (window-height) 4) 0) - ((< (window-height) 7) 1) - (t (if (numberp gnus-auto-center-summary) - gnus-auto-center-summary - 2)))) - (height (1- (window-height))) - (bottom (save-excursion (goto-char (point-max)) - (forward-line (- height)) - (point))) - (window (get-buffer-window (current-buffer)))) - ;; The user has to want it. - (when gnus-auto-center-summary - (when (get-buffer-window gnus-article-buffer) - ;; Only do recentering when the article buffer is displayed, - ;; Set the window start to either `bottom', which is the biggest - ;; possible valid number, or the second line from the top, - ;; whichever is the least. - (let ((top-pos (save-excursion (forward-line (- top)) (point)))) - (if (> bottom top-pos) - ;; Keep the second line from the top visible - (set-window-start window top-pos t) - ;; Try to keep the bottom line visible; if it's partially - ;; obscured, either scroll one more line to make it fully - ;; visible, or revert to using TOP-POS. - (save-excursion - (goto-char (point-max)) - (forward-line -1) - (let ((last-line-start (point))) - (goto-char bottom) - (set-window-start window (point) t) - (when (not (pos-visible-in-window-p last-line-start window)) - (forward-line 1) - (set-window-start window (min (point) top-pos) t))))))) - ;; Do horizontal recentering while we're at it. - (when (and (get-buffer-window (current-buffer) t) - (not (eq gnus-auto-center-summary 'vertical))) - (let ((selected (selected-window))) - (select-window (get-buffer-window (current-buffer) t)) - (gnus-summary-position-point) - (gnus-horizontal-recenter) - (select-window selected)))))) - -(defun gnus-summary-jump-to-group (newsgroup) - "Move point to NEWSGROUP in group mode buffer." - ;; Keep update point of group mode buffer if visible. - (if (eq (current-buffer) (get-buffer gnus-group-buffer)) - (save-window-excursion - ;; Take care of tree window mode. - (when (get-buffer-window gnus-group-buffer) - (pop-to-buffer gnus-group-buffer)) - (gnus-group-jump-to-group newsgroup)) - (save-excursion - ;; Take care of tree window mode. - (if (get-buffer-window gnus-group-buffer) - (pop-to-buffer gnus-group-buffer) - (set-buffer gnus-group-buffer)) - (gnus-group-jump-to-group newsgroup)))) - -;; This function returns a list of article numbers based on the -;; difference between the ranges of read articles in this group and -;; the range of active articles. -(defun gnus-list-of-unread-articles (group) - (let* ((read (gnus-info-read (gnus-get-info group))) - (active (or (gnus-active group) (gnus-activate-group group))) - (last (cdr active)) - first nlast unread) - ;; If none are read, then all are unread. - (if (not read) - (setq first (car active)) - ;; If the range of read articles is a single range, then the - ;; first unread article is the article after the last read - ;; article. Sounds logical, doesn't it? - (if (and (not (listp (cdr read))) - (or (< (car read) (car active)) - (progn (setq read (list read)) - nil))) - (setq first (max (car active) (1+ (cdr read)))) - ;; `read' is a list of ranges. - (when (/= (setq nlast (or (and (numberp (car read)) (car read)) - (caar read))) - 1) - (setq first (car active))) - (while read - (when first - (while (< first nlast) - (push first unread) - (setq first (1+ first)))) - (setq first (1+ (if (atom (car read)) (car read) (cdar read)))) - (setq nlast (if (atom (cadr read)) (cadr read) (caadr read))) - (setq read (cdr read))))) - ;; And add the last unread articles. - (while (<= first last) - (push first unread) - (setq first (1+ first))) - ;; Return the list of unread articles. - (delq 0 (nreverse unread)))) - -(defun gnus-list-of-read-articles (group) - "Return a list of unread, unticked and non-dormant articles." - (let* ((info (gnus-get-info group)) - (marked (gnus-info-marks info)) - (active (gnus-active group))) - (and info active - (gnus-set-difference - (gnus-sorted-complement - (gnus-uncompress-range active) - (gnus-list-of-unread-articles group)) - (append - (gnus-uncompress-range (cdr (assq 'dormant marked))) - (gnus-uncompress-range (cdr (assq 'tick marked)))))))) - -;; Various summary commands - -(defun gnus-summary-select-article-buffer () - "Reconfigure windows to show article buffer." - (interactive) - (if (not (gnus-buffer-live-p gnus-article-buffer)) - (error "There is no article buffer for this summary buffer") - (gnus-configure-windows 'article) - (select-window (get-buffer-window gnus-article-buffer)))) - -(defun gnus-summary-universal-argument (arg) - "Perform any operation on all articles that are process/prefixed." - (interactive "P") - (let ((articles (gnus-summary-work-articles arg)) - func article) - (if (eq - (setq - func - (key-binding - (read-key-sequence - (substitute-command-keys - "\\\\[gnus-summary-universal-argument]")))) - 'undefined) - (gnus-error 1 "Undefined key") - (save-excursion - (while articles - (gnus-summary-goto-subject (setq article (pop articles))) - (let (gnus-newsgroup-processable) - (command-execute func)) - (gnus-summary-remove-process-mark article))))) - (gnus-summary-position-point)) - -(defun gnus-summary-toggle-truncation (&optional arg) - "Toggle truncation of summary lines. -With arg, turn line truncation on iff arg is positive." - (interactive "P") - (setq truncate-lines - (if (null arg) (not truncate-lines) - (> (prefix-numeric-value arg) 0))) - (redraw-display)) - -(defun gnus-summary-reselect-current-group (&optional all rescan) - "Exit and then reselect the current newsgroup. -The prefix argument ALL means to select all articles." - (interactive "P") - (when (gnus-ephemeral-group-p gnus-newsgroup-name) - (error "Ephemeral groups can't be reselected")) - (let ((current-subject (gnus-summary-article-number)) - (group gnus-newsgroup-name)) - (setq gnus-newsgroup-begin nil) - (gnus-summary-exit) - ;; We have to adjust the point of group mode buffer because - ;; point was moved to the next unread newsgroup by exiting. - (gnus-summary-jump-to-group group) - (when rescan - (save-excursion - (save-window-excursion - ;; Don't show group contents. - (set-window-start (selected-window) (point-max)) - (gnus-group-get-new-news-this-group 1)))) - (gnus-group-read-group all t) - (gnus-summary-goto-subject current-subject nil t))) - -(defun gnus-summary-rescan-group (&optional all) - "Exit the newsgroup, ask for new articles, and select the newsgroup." - (interactive "P") - (gnus-summary-reselect-current-group all t)) - -(defun gnus-summary-update-info (&optional non-destructive) - (save-excursion - (let ((group gnus-newsgroup-name)) - (when group - (when gnus-newsgroup-kill-headers - (setq gnus-newsgroup-killed - (gnus-compress-sequence - (nconc - (gnus-set-sorted-intersection - (gnus-uncompress-range gnus-newsgroup-killed) - (setq gnus-newsgroup-unselected - (sort gnus-newsgroup-unselected '<))) - (setq gnus-newsgroup-unreads - (sort gnus-newsgroup-unreads '<))) - t))) - (unless (listp (cdr gnus-newsgroup-killed)) - (setq gnus-newsgroup-killed (list gnus-newsgroup-killed))) - (let ((headers gnus-newsgroup-headers)) - ;; Set the new ranges of read articles. - (save-excursion - (set-buffer gnus-group-buffer) - (gnus-undo-force-boundary)) - (gnus-update-read-articles - group (append gnus-newsgroup-unreads gnus-newsgroup-unselected)) - ;; Set the current article marks. - (let ((gnus-newsgroup-scored - (if (and (not gnus-save-score) - (not non-destructive)) - nil - gnus-newsgroup-scored))) - (save-excursion - (gnus-update-marks))) - ;; Do the cross-ref thing. - (when gnus-use-cross-reference - (gnus-mark-xrefs-as-read group headers gnus-newsgroup-unreads)) - ;; Do not switch windows but change the buffer to work. - (set-buffer gnus-group-buffer) - (unless (gnus-ephemeral-group-p group) - (gnus-group-update-group group))))))) - -(defun gnus-summary-save-newsrc (&optional force) - "Save the current number of read/marked articles in the dribble buffer. -The dribble buffer will then be saved. -If FORCE (the prefix), also save the .newsrc file(s)." - (interactive "P") - (gnus-summary-update-info t) - (if force - (gnus-save-newsrc-file) - (gnus-dribble-save))) - -(defun gnus-summary-exit (&optional temporary) - "Exit reading current newsgroup, and then return to group selection mode. -`gnus-exit-group-hook' is called with no arguments if that value is non-nil." - (interactive) - (gnus-set-global-variables) - (gnus-kill-save-kill-buffer) - (gnus-async-halt-prefetch) - (let* ((group gnus-newsgroup-name) - (quit-config (gnus-group-quit-config gnus-newsgroup-name)) - (mode major-mode) - (group-point nil) - (buf (current-buffer))) - (unless quit-config - ;; Do adaptive scoring, and possibly save score files. - (when gnus-newsgroup-adaptive - (gnus-score-adaptive)) - (when gnus-use-scoring - (gnus-score-save))) - (gnus-run-hooks 'gnus-summary-prepare-exit-hook) - ;; If we have several article buffers, we kill them at exit. - (unless gnus-single-article-buffer - (gnus-kill-buffer gnus-original-article-buffer) - (setq gnus-article-current nil)) - (when gnus-use-cache - (gnus-cache-possibly-remove-articles) - (gnus-cache-save-buffers)) - (gnus-async-prefetch-remove-group group) - (when gnus-suppress-duplicates - (gnus-dup-enter-articles)) - (when gnus-use-trees - (gnus-tree-close group)) - (when gnus-use-cache - (gnus-cache-write-active)) - ;; Remove entries for this group. - (nnmail-purge-split-history (gnus-group-real-name group)) - ;; Make all changes in this group permanent. - (unless quit-config - (gnus-run-hooks 'gnus-exit-group-hook) - (gnus-summary-update-info)) - (gnus-close-group group) - ;; Make sure where we were, and go to next newsgroup. - (set-buffer gnus-group-buffer) - (unless quit-config - (gnus-group-jump-to-group group)) - (gnus-run-hooks 'gnus-summary-exit-hook) - (unless (or quit-config - ;; If this group has disappeared from the summary - ;; buffer, don't skip forwards. - (not (string= group (gnus-group-group-name)))) - (gnus-group-next-unread-group 1)) - (setq group-point (point)) - (if temporary - nil ;Nothing to do. - ;; If we have several article buffers, we kill them at exit. - (unless gnus-single-article-buffer - (gnus-kill-buffer gnus-article-buffer) - (gnus-kill-buffer gnus-original-article-buffer) - (setq gnus-article-current nil)) - (set-buffer buf) - (if (not gnus-kill-summary-on-exit) - (progn - (gnus-deaden-summary) - (setq mode nil)) - ;; We set all buffer-local variables to nil. It is unclear why - ;; this is needed, but if we don't, buffer-local variables are - ;; not garbage-collected, it seems. This would the lead to en - ;; ever-growing Emacs. - (gnus-summary-clear-local-variables) - (let ((gnus-summary-local-variables gnus-newsgroup-variables)) - (gnus-summary-clear-local-variables)) - (when (get-buffer gnus-article-buffer) - (bury-buffer gnus-article-buffer)) - ;; We clear the global counterparts of the buffer-local - ;; variables as well, just to be on the safe side. - (set-buffer gnus-group-buffer) - (gnus-summary-clear-local-variables) - (let ((gnus-summary-local-variables gnus-newsgroup-variables)) - (gnus-summary-clear-local-variables))) - (setq gnus-current-select-method gnus-select-method) - (pop-to-buffer gnus-group-buffer) - (if (not quit-config) - (progn - (goto-char group-point) - (gnus-configure-windows 'group 'force) - (unless (pos-visible-in-window-p) - (forward-line (/ (static-if (featurep 'xemacs) - (window-displayed-height) - (1- (window-height))) - -2)) - (set-window-start (selected-window) (point)) - (goto-char group-point))) - (gnus-handle-ephemeral-exit quit-config)) - ;; Return to group mode buffer. - (when (eq mode 'gnus-summary-mode) - (gnus-kill-buffer buf)) - ;; Clear the current group name. - (unless quit-config - (setq gnus-newsgroup-name nil))))) - -(defalias 'gnus-summary-quit 'gnus-summary-exit-no-update) -(defun gnus-summary-exit-no-update (&optional no-questions) - "Quit reading current newsgroup without updating read article info." - (interactive) - (let* ((group gnus-newsgroup-name) - (quit-config (gnus-group-quit-config group))) - (when (or no-questions - gnus-expert-user - (gnus-y-or-n-p "Discard changes to this group and exit? ")) - (gnus-async-halt-prefetch) - (mapcar 'funcall - (delq 'gnus-summary-expire-articles - (copy-sequence gnus-summary-prepare-exit-hook))) - ;; If we have several article buffers, we kill them at exit. - (unless gnus-single-article-buffer - (gnus-kill-buffer gnus-article-buffer) - (gnus-kill-buffer gnus-original-article-buffer) - (setq gnus-article-current nil)) - (if (not gnus-kill-summary-on-exit) - (gnus-deaden-summary) - (gnus-close-group group) - (gnus-summary-clear-local-variables) - (let ((gnus-summary-local-variables gnus-newsgroup-variables)) - (gnus-summary-clear-local-variables)) - (set-buffer gnus-group-buffer) - (gnus-summary-clear-local-variables) - (let ((gnus-summary-local-variables gnus-newsgroup-variables)) - (gnus-summary-clear-local-variables)) - (when (get-buffer gnus-summary-buffer) - (kill-buffer gnus-summary-buffer))) - (unless gnus-single-article-buffer - (setq gnus-article-current nil)) - (when gnus-use-trees - (gnus-tree-close group)) - (gnus-async-prefetch-remove-group group) - (when (get-buffer gnus-article-buffer) - (bury-buffer gnus-article-buffer)) - ;; Return to the group buffer. - (gnus-configure-windows 'group 'force) - ;; Clear the current group name. - (setq gnus-newsgroup-name nil) - (when (equal (gnus-group-group-name) group) - (gnus-group-next-unread-group 1)) - (when quit-config - (gnus-handle-ephemeral-exit quit-config))))) - -(defun gnus-handle-ephemeral-exit (quit-config) - "Handle movement when leaving an ephemeral group. -The state which existed when entering the ephemeral is reset." - (if (not (buffer-name (car quit-config))) - (gnus-configure-windows 'group 'force) - (set-buffer (car quit-config)) - (cond ((eq major-mode 'gnus-summary-mode) - (gnus-set-global-variables)) - ((eq major-mode 'gnus-article-mode) - (save-excursion - ;; The `gnus-summary-buffer' variable may point - ;; to the old summary buffer when using a single - ;; article buffer. - (unless (gnus-buffer-live-p gnus-summary-buffer) - (set-buffer gnus-group-buffer)) - (set-buffer gnus-summary-buffer) - (gnus-set-global-variables)))) - (if (or (eq (cdr quit-config) 'article) - (eq (cdr quit-config) 'pick)) - (progn - ;; The current article may be from the ephemeral group - ;; thus it is best that we reload this article - (gnus-summary-show-article) - (if (and (boundp 'gnus-pick-mode) (symbol-value 'gnus-pick-mode)) - (gnus-configure-windows 'pick 'force) - (gnus-configure-windows (cdr quit-config) 'force))) - (gnus-configure-windows (cdr quit-config) 'force)) - (when (eq major-mode 'gnus-summary-mode) - (gnus-summary-next-subject 1 nil t) - (gnus-summary-recenter) - (gnus-summary-position-point)))) - -(defun gnus-summary-preview-mime-message () - "MIME decode and play this message." - (interactive) - (let ((gnus-break-pages nil) - (gnus-show-mime t)) - (gnus-summary-select-article gnus-show-all-headers t)) - (select-window (get-buffer-window gnus-article-buffer))) - -;;; Dead summaries. - -(defvar gnus-dead-summary-mode-map nil) - -(unless gnus-dead-summary-mode-map - (setq gnus-dead-summary-mode-map (make-keymap)) - (suppress-keymap gnus-dead-summary-mode-map) - (substitute-key-definition - 'undefined 'gnus-summary-wake-up-the-dead gnus-dead-summary-mode-map) - (let ((keys '("\C-d" "\r" "\177" [delete]))) - (while keys - (define-key gnus-dead-summary-mode-map - (pop keys) 'gnus-summary-wake-up-the-dead)))) - -(defvar gnus-dead-summary-mode nil - "Minor mode for Gnus summary buffers.") - -(defun gnus-dead-summary-mode (&optional arg) - "Minor mode for Gnus summary buffers." - (interactive "P") - (when (eq major-mode 'gnus-summary-mode) - (make-local-variable 'gnus-dead-summary-mode) - (setq gnus-dead-summary-mode - (if (null arg) (not gnus-dead-summary-mode) - (> (prefix-numeric-value arg) 0))) - (when gnus-dead-summary-mode - (gnus-add-minor-mode - 'gnus-dead-summary-mode " Dead" gnus-dead-summary-mode-map)))) - -(defun gnus-deaden-summary () - "Make the current summary buffer into a dead summary buffer." - ;; Kill any previous dead summary buffer. - (when (and gnus-dead-summary - (buffer-name gnus-dead-summary)) - (save-excursion - (set-buffer gnus-dead-summary) - (when gnus-dead-summary-mode - (kill-buffer (current-buffer))))) - ;; Make this the current dead summary. - (setq gnus-dead-summary (current-buffer)) - (gnus-dead-summary-mode 1) - (let ((name (buffer-name))) - (when (string-match "Summary" name) - (rename-buffer - (concat (substring name 0 (match-beginning 0)) "Dead " - (substring name (match-beginning 0))) - t) - (bury-buffer)))) - -(defun gnus-kill-or-deaden-summary (buffer) - "Kill or deaden the summary BUFFER." - (save-excursion - (when (and (buffer-name buffer) - (not gnus-single-article-buffer)) - (save-excursion - (set-buffer buffer) - (gnus-kill-buffer gnus-article-buffer) - (gnus-kill-buffer gnus-original-article-buffer))) - (cond (gnus-kill-summary-on-exit - (when (and gnus-use-trees - (gnus-buffer-exists-p buffer)) - (save-excursion - (set-buffer buffer) - (gnus-tree-close gnus-newsgroup-name))) - (gnus-kill-buffer buffer)) - ((gnus-buffer-exists-p buffer) - (save-excursion - (set-buffer buffer) - (gnus-deaden-summary)))))) - -(defun gnus-summary-wake-up-the-dead (&rest args) - "Wake up the dead summary buffer." - (interactive) - (gnus-dead-summary-mode -1) - (let ((name (buffer-name))) - (when (string-match "Dead " name) - (rename-buffer - (concat (substring name 0 (match-beginning 0)) - (substring name (match-end 0))) - t))) - (gnus-message 3 "This dead summary is now alive again")) - -;; Suggested by Andrew Eskilsson . -(defun gnus-summary-fetch-faq (&optional faq-dir) - "Fetch the FAQ for the current group. -If FAQ-DIR (the prefix), prompt for a directory to search for the faq -in." - (interactive - (list - (when current-prefix-arg - (completing-read - "Faq dir: " (and (listp gnus-group-faq-directory) - (mapcar (lambda (file) (list file)) - gnus-group-faq-directory)))))) - (let (gnus-faq-buffer) - (when (setq gnus-faq-buffer - (gnus-group-fetch-faq gnus-newsgroup-name faq-dir)) - (gnus-configure-windows 'summary-faq)))) - -;; Suggested by Per Abrahamsen . -(defun gnus-summary-describe-group (&optional force) - "Describe the current newsgroup." - (interactive "P") - (gnus-group-describe-group force gnus-newsgroup-name)) - -(defun gnus-summary-describe-briefly () - "Describe summary mode commands briefly." - (interactive) - (gnus-message 6 (substitute-command-keys "\\\\[gnus-summary-next-page]:Select \\[gnus-summary-next-unread-article]:Forward \\[gnus-summary-prev-unread-article]:Backward \\[gnus-summary-exit]:Exit \\[gnus-info-find-node]:Run Info \\[gnus-summary-describe-briefly]:This help"))) - -;; Walking around group mode buffer from summary mode. - -(defun gnus-summary-next-group (&optional no-article target-group backward) - "Exit current newsgroup and then select next unread newsgroup. -If prefix argument NO-ARTICLE is non-nil, no article is selected -initially. If NEXT-GROUP, go to this group. If BACKWARD, go to -previous group instead." - (interactive "P") - ;; Stop pre-fetching. - (gnus-async-halt-prefetch) - (let ((current-group gnus-newsgroup-name) - (current-buffer (current-buffer)) - entered) - ;; First we semi-exit this group to update Xrefs and all variables. - ;; We can't do a real exit, because the window conf must remain - ;; the same in case the user is prompted for info, and we don't - ;; want the window conf to change before that... - (gnus-summary-exit t) - (while (not entered) - ;; Then we find what group we are supposed to enter. - (set-buffer gnus-group-buffer) - (gnus-group-jump-to-group current-group) - (setq target-group - (or target-group - (if (eq gnus-keep-same-level 'best) - (gnus-summary-best-group gnus-newsgroup-name) - (gnus-summary-search-group backward gnus-keep-same-level)))) - (if (not target-group) - ;; There are no further groups, so we return to the group - ;; buffer. - (progn - (gnus-message 5 "Returning to the group buffer") - (setq entered t) - (when (gnus-buffer-live-p current-buffer) - (set-buffer current-buffer) - (gnus-summary-exit)) - (gnus-run-hooks 'gnus-group-no-more-groups-hook)) - ;; We try to enter the target group. - (gnus-group-jump-to-group target-group) - (let ((unreads (gnus-group-group-unread))) - (if (and (or (eq t unreads) - (and unreads (not (zerop unreads)))) - (gnus-summary-read-group - target-group nil no-article - (and (buffer-name current-buffer) current-buffer) - nil backward)) - (setq entered t) - (setq current-group target-group - target-group nil))))))) - -(defun gnus-summary-prev-group (&optional no-article) - "Exit current newsgroup and then select previous unread newsgroup. -If prefix argument NO-ARTICLE is non-nil, no article is selected initially." - (interactive "P") - (gnus-summary-next-group no-article nil t)) - -;; Walking around summary lines. - -(defun gnus-summary-first-subject (&optional unread undownloaded) - "Go to the first unread subject. -If UNREAD is non-nil, go to the first unread article. -Returns the article selected or nil if there are no unread articles." - (interactive "P") - (prog1 - (cond - ;; Empty summary. - ((null gnus-newsgroup-data) - (gnus-message 3 "No articles in the group") - nil) - ;; Pick the first article. - ((not unread) - (goto-char (gnus-data-pos (car gnus-newsgroup-data))) - (gnus-data-number (car gnus-newsgroup-data))) - ;; No unread articles. - ((null gnus-newsgroup-unreads) - (gnus-message 3 "No more unread articles") - nil) - ;; Find the first unread article. - (t - (let ((data gnus-newsgroup-data)) - (while (and data - (and (not (and undownloaded - (eq gnus-undownloaded-mark - (gnus-data-mark (car data))))) - (not (gnus-data-unread-p (car data))))) - (setq data (cdr data))) - (when data - (goto-char (gnus-data-pos (car data))) - (gnus-data-number (car data)))))) - (gnus-summary-position-point))) - -(defun gnus-summary-next-subject (n &optional unread dont-display) - "Go to next N'th summary line. -If N is negative, go to the previous N'th subject line. -If UNREAD is non-nil, only unread articles are selected. -The difference between N and the actual number of steps taken is -returned." - (interactive "p") - (let ((backward (< n 0)) - (n (abs n))) - (while (and (> n 0) - (if backward - (gnus-summary-find-prev unread) - (gnus-summary-find-next unread))) - (unless (zerop (setq n (1- n))) - (gnus-summary-show-thread))) - (when (/= 0 n) - (gnus-message 7 "No more%s articles" - (if unread " unread" ""))) - (unless dont-display - (gnus-summary-recenter) - (gnus-summary-position-point)) - n)) - -(defun gnus-summary-next-unread-subject (n) - "Go to next N'th unread summary line." - (interactive "p") - (gnus-summary-next-subject n t)) - -(defun gnus-summary-prev-subject (n &optional unread) - "Go to previous N'th summary line. -If optional argument UNREAD is non-nil, only unread article is selected." - (interactive "p") - (gnus-summary-next-subject (- n) unread)) - -(defun gnus-summary-prev-unread-subject (n) - "Go to previous N'th unread summary line." - (interactive "p") - (gnus-summary-next-subject (- n) t)) - -(defun gnus-summary-goto-subject (article &optional force silent) - "Go the subject line of ARTICLE. -If FORCE, also allow jumping to articles not currently shown." - (interactive "nArticle number: ") - (let ((b (point)) - (data (gnus-data-find article))) - ;; We read in the article if we have to. - (and (not data) - force - (gnus-summary-insert-subject - article - (if (or (numberp force) (vectorp force)) force) - t) - (setq data (gnus-data-find article))) - (goto-char b) - (if (not data) - (progn - (unless silent - (gnus-message 3 "Can't find article %d" article)) - nil) - (let ((pt (gnus-data-pos data))) - (goto-char pt) - (gnus-summary-set-article-display-arrow pt)) - (gnus-summary-position-point) - article))) - -;; Walking around summary lines with displaying articles. - -(defun gnus-summary-expand-window (&optional arg) - "Make the summary buffer take up the entire Emacs frame. -Given a prefix, will force an `article' buffer configuration." - (interactive "P") - (if arg - (gnus-configure-windows 'article 'force) - (gnus-configure-windows 'summary 'force))) - -(defun gnus-summary-display-article (article &optional all-header) - "Display ARTICLE in article buffer." - (when (gnus-buffer-live-p gnus-article-buffer) - (with-current-buffer gnus-article-buffer - (set-buffer-multibyte t))) - (gnus-set-global-variables) - (when (gnus-buffer-live-p gnus-article-buffer) - (with-current-buffer gnus-article-buffer - (setq gnus-article-charset gnus-newsgroup-charset) - (setq gnus-article-ignored-charsets gnus-newsgroup-ignored-charsets))) - (if (null article) - nil - (prog1 - (if gnus-summary-display-article-function - (funcall gnus-summary-display-article-function article all-header) - (gnus-article-prepare article all-header)) - (with-current-buffer gnus-article-buffer - (set (make-local-variable 'gnus-summary-search-article-matched-data) - nil)) - (gnus-run-hooks 'gnus-select-article-hook) - (when (and gnus-current-article - (not (zerop gnus-current-article))) - (gnus-summary-goto-subject gnus-current-article)) - (gnus-summary-recenter) - (when (and gnus-use-trees gnus-show-threads) - (gnus-possibly-generate-tree article) - (gnus-highlight-selected-tree article)) - ;; Successfully display article. - (gnus-article-set-window-start - (cdr (assq article gnus-newsgroup-bookmarks)))))) - -(defun gnus-summary-select-article (&optional all-headers force pseudo article) - "Select the current article. -If ALL-HEADERS is non-nil, show all header fields. If FORCE is -non-nil, the article will be re-fetched even if it already present in -the article buffer. If PSEUDO is non-nil, pseudo-articles will also -be displayed." - ;; Make sure we are in the summary buffer to work around bbdb bug. - (unless (eq major-mode 'gnus-summary-mode) - (set-buffer gnus-summary-buffer)) - (let ((article (or article (gnus-summary-article-number))) - (all-headers (not (not all-headers))) ;Must be T or NIL. - gnus-summary-display-article-function) - (and (not pseudo) - (gnus-summary-article-pseudo-p article) - (error "This is a pseudo-article")) - (save-excursion - (set-buffer gnus-summary-buffer) - (if (or (and gnus-single-article-buffer - (or (null gnus-current-article) - (null gnus-article-current) - (null (get-buffer gnus-article-buffer)) - (not (eq article (cdr gnus-article-current))) - (not (equal (car gnus-article-current) - gnus-newsgroup-name)))) - (and (not gnus-single-article-buffer) - (or (null gnus-current-article) - (not (eq gnus-current-article article)))) - force) - ;; The requested article is different from the current article. - (progn - (gnus-summary-display-article article all-headers) - (when (or all-headers gnus-show-all-headers) - (gnus-article-show-all-headers)) - (gnus-article-set-window-start - (cdr (assq article gnus-newsgroup-bookmarks))) - article) - (when (or all-headers gnus-show-all-headers) - (gnus-article-show-all-headers)) - 'old)))) - -(defun gnus-summary-force-verify-and-decrypt () - (interactive) - (let ((mm-verify-option 'known) - (mm-decrypt-option 'known)) - (gnus-summary-select-article nil 'force))) - -(defun gnus-summary-set-current-mark (&optional current-mark) - "Obsolete function." - nil) - -(defun gnus-summary-next-article (&optional unread subject backward push) - "Select the next article. -If UNREAD, only unread articles are selected. -If SUBJECT, only articles with SUBJECT are selected. -If BACKWARD, the previous article is selected instead of the next." - (interactive "P") - (cond - ;; Is there such an article? - ((and (gnus-summary-search-forward unread subject backward) - (or (gnus-summary-display-article (gnus-summary-article-number)) - (eq (gnus-summary-article-mark) gnus-canceled-mark))) - (gnus-summary-position-point)) - ;; If not, we try the first unread, if that is wanted. - ((and subject - gnus-auto-select-same - (gnus-summary-first-unread-article)) - (gnus-summary-position-point) - (gnus-message 6 "Wrapped")) - ;; Try to get next/previous article not displayed in this group. - ((and gnus-auto-extend-newsgroup - (not unread) (not subject)) - (gnus-summary-goto-article - (if backward (1- gnus-newsgroup-begin) (1+ gnus-newsgroup-end)) - nil (count-lines (point-min) (point)))) - ;; Go to next/previous group. - (t - (unless (gnus-ephemeral-group-p gnus-newsgroup-name) - (gnus-summary-jump-to-group gnus-newsgroup-name)) - (let ((cmd last-command-char) - (point - (save-excursion - (set-buffer gnus-group-buffer) - (point))) - (group - (if (eq gnus-keep-same-level 'best) - (gnus-summary-best-group gnus-newsgroup-name) - (gnus-summary-search-group backward gnus-keep-same-level)))) - ;; For some reason, the group window gets selected. We change - ;; it back. - (select-window (get-buffer-window (current-buffer))) - ;; Select next unread newsgroup automagically. - (cond - ((or (not gnus-auto-select-next) - (not cmd)) - (gnus-message 7 "No more%s articles" (if unread " unread" ""))) - ((or (eq gnus-auto-select-next 'quietly) - (and (eq gnus-auto-select-next 'slightly-quietly) - push) - (and (eq gnus-auto-select-next 'almost-quietly) - (gnus-summary-last-article-p))) - ;; Select quietly. - (if (gnus-ephemeral-group-p gnus-newsgroup-name) - (gnus-summary-exit) - (gnus-message 7 "No more%s articles (%s)..." - (if unread " unread" "") - (if group (concat "selecting " group) - "exiting")) - (gnus-summary-next-group nil group backward))) - (t - (when (gnus-key-press-event-p last-input-event) - (gnus-summary-walk-group-buffer - gnus-newsgroup-name cmd unread backward point)))))))) - -(defun gnus-summary-walk-group-buffer (from-group cmd unread backward start) - (let ((keystrokes '((?\C-n (gnus-group-next-unread-group 1)) - (?\C-p (gnus-group-prev-unread-group 1)))) - (cursor-in-echo-area t) - keve key group ended) - (save-excursion - (set-buffer gnus-group-buffer) - (goto-char start) - (setq group - (if (eq gnus-keep-same-level 'best) - (gnus-summary-best-group gnus-newsgroup-name) - (gnus-summary-search-group backward gnus-keep-same-level)))) - (while (not ended) - (gnus-message - 5 "No more%s articles%s" (if unread " unread" "") - (if (and group - (not (gnus-ephemeral-group-p gnus-newsgroup-name))) - (format " (Type %s for %s [%s])" - (single-key-description cmd) group - (car (gnus-gethash group gnus-newsrc-hashtb))) - (format " (Type %s to exit %s)" - (single-key-description cmd) - gnus-newsgroup-name))) - ;; Confirm auto selection. - (setq key (car (setq keve (gnus-read-event-char)))) - (setq ended t) - (cond - ((assq key keystrokes) - (let ((obuf (current-buffer))) - (switch-to-buffer gnus-group-buffer) - (when group - (gnus-group-jump-to-group group)) - (eval (cadr (assq key keystrokes))) - (setq group (gnus-group-group-name)) - (switch-to-buffer obuf)) - (setq ended nil)) - ((equal key cmd) - (if (or (not group) - (gnus-ephemeral-group-p gnus-newsgroup-name)) - (gnus-summary-exit) - (gnus-summary-next-group nil group backward))) - (t - (push (cdr keve) unread-command-events)))))) - -(defun gnus-summary-next-unread-article () - "Select unread article after current one." - (interactive) - (gnus-summary-next-article - (or (not (eq gnus-summary-goto-unread 'never)) - (gnus-summary-last-article-p (gnus-summary-article-number))) - (and gnus-auto-select-same - (gnus-summary-article-subject)))) - -(defun gnus-summary-prev-article (&optional unread subject) - "Select the article after the current one. -If UNREAD is non-nil, only unread articles are selected." - (interactive "P") - (gnus-summary-next-article unread subject t)) - -(defun gnus-summary-prev-unread-article () - "Select unread article before current one." - (interactive) - (gnus-summary-prev-article - (or (not (eq gnus-summary-goto-unread 'never)) - (gnus-summary-first-article-p (gnus-summary-article-number))) - (and gnus-auto-select-same - (gnus-summary-article-subject)))) - -(defun gnus-summary-next-page (&optional lines circular) - "Show next page of the selected article. -If at the end of the current article, select the next article. -LINES says how many lines should be scrolled up. - -If CIRCULAR is non-nil, go to the start of the article instead of -selecting the next article when reaching the end of the current -article." - (interactive "P") - (setq gnus-summary-buffer (current-buffer)) - (gnus-set-global-variables) - (let ((article (gnus-summary-article-number)) - (article-window (get-buffer-window gnus-article-buffer t)) - endp) - ;; If the buffer is empty, we have no article. - (unless article - (error "No article to select")) - (gnus-configure-windows 'article) - (if (eq (cdr (assq article gnus-newsgroup-reads)) gnus-canceled-mark) - (if (and (eq gnus-summary-goto-unread 'never) - (not (gnus-summary-last-article-p article))) - (gnus-summary-next-article) - (gnus-summary-next-unread-article)) - (if (or (null gnus-current-article) - (null gnus-article-current) - (/= article (cdr gnus-article-current)) - (not (equal (car gnus-article-current) gnus-newsgroup-name))) - ;; Selected subject is different from current article's. - (gnus-summary-display-article article) - (when article-window - (gnus-eval-in-buffer-window gnus-article-buffer - (setq endp (gnus-article-next-page lines))) - (when endp - (cond (circular - (gnus-summary-beginning-of-article)) - (lines - (gnus-message 3 "End of message")) - ((null lines) - (if (and (eq gnus-summary-goto-unread 'never) - (not (gnus-summary-last-article-p article))) - (gnus-summary-next-article) - (gnus-summary-next-unread-article)))))))) - (gnus-summary-recenter) - (gnus-summary-position-point))) - -(defun gnus-summary-prev-page (&optional lines move) - "Show previous page of selected article. -Argument LINES specifies lines to be scrolled down. -If MOVE, move to the previous unread article if point is at -the beginning of the buffer." - (interactive "P") - (let ((article (gnus-summary-article-number)) - (article-window (get-buffer-window gnus-article-buffer t)) - endp) - (gnus-configure-windows 'article) - (if (or (null gnus-current-article) - (null gnus-article-current) - (/= article (cdr gnus-article-current)) - (not (equal (car gnus-article-current) gnus-newsgroup-name))) - ;; Selected subject is different from current article's. - (gnus-summary-display-article article) - (gnus-summary-recenter) - (when article-window - (gnus-eval-in-buffer-window gnus-article-buffer - (setq endp (gnus-article-prev-page lines))) - (when (and move endp) - (cond (lines - (gnus-message 3 "Beginning of message")) - ((null lines) - (if (and (eq gnus-summary-goto-unread 'never) - (not (gnus-summary-first-article-p article))) - (gnus-summary-prev-article) - (gnus-summary-prev-unread-article)))))))) - (gnus-summary-position-point)) - -(defun gnus-summary-prev-page-or-article (&optional lines) - "Show previous page of selected article. -Argument LINES specifies lines to be scrolled down. -If at the beginning of the article, go to the next article." - (interactive "P") - (gnus-summary-prev-page lines t)) - -(defun gnus-summary-scroll-up (lines) - "Scroll up (or down) one line current article. -Argument LINES specifies lines to be scrolled up (or down if negative)." - (interactive "p") - (gnus-configure-windows 'article) - (gnus-summary-show-thread) - (when (eq (gnus-summary-select-article nil nil 'pseudo) 'old) - (gnus-eval-in-buffer-window gnus-article-buffer - (cond ((> lines 0) - (when (gnus-article-next-page lines) - (gnus-message 3 "End of message"))) - ((< lines 0) - (gnus-article-prev-page (- lines)))))) - (gnus-summary-recenter) - (gnus-summary-position-point)) - -(defun gnus-summary-scroll-down (lines) - "Scroll down (or up) one line current article. -Argument LINES specifies lines to be scrolled down (or up if negative)." - (interactive "p") - (gnus-summary-scroll-up (- lines))) - -(defun gnus-summary-next-same-subject () - "Select next article which has the same subject as current one." - (interactive) - (gnus-summary-next-article nil (gnus-summary-article-subject))) - -(defun gnus-summary-prev-same-subject () - "Select previous article which has the same subject as current one." - (interactive) - (gnus-summary-prev-article nil (gnus-summary-article-subject))) - -(defun gnus-summary-next-unread-same-subject () - "Select next unread article which has the same subject as current one." - (interactive) - (gnus-summary-next-article t (gnus-summary-article-subject))) - -(defun gnus-summary-prev-unread-same-subject () - "Select previous unread article which has the same subject as current one." - (interactive) - (gnus-summary-prev-article t (gnus-summary-article-subject))) - -(defun gnus-summary-first-unread-article () - "Select the first unread article. -Return nil if there are no unread articles." - (interactive) - (prog1 - (when (gnus-summary-first-subject t) - (gnus-summary-show-thread) - (gnus-summary-first-subject t) - (gnus-summary-display-article (gnus-summary-article-number))) - (gnus-summary-position-point))) - -(defun gnus-summary-first-unread-subject () - "Place the point on the subject line of the first unread article. -Return nil if there are no unread articles." - (interactive) - (prog1 - (when (gnus-summary-first-subject t) - (gnus-summary-show-thread) - (gnus-summary-first-subject t)) - (gnus-summary-position-point))) - -(defun gnus-summary-first-article () - "Select the first article. -Return nil if there are no articles." - (interactive) - (prog1 - (when (gnus-summary-first-subject) - (gnus-summary-show-thread) - (gnus-summary-first-subject) - (gnus-summary-display-article (gnus-summary-article-number))) - (gnus-summary-position-point))) - -(defun gnus-summary-best-unread-article () - "Select the unread article with the highest score." - (interactive) - (let ((best -1000000) - (data gnus-newsgroup-data) - article score) - (while data - (and (gnus-data-unread-p (car data)) - (> (setq score - (gnus-summary-article-score (gnus-data-number (car data)))) - best) - (setq best score - article (gnus-data-number (car data)))) - (setq data (cdr data))) - (prog1 - (if article - (gnus-summary-goto-article article) - (error "No unread articles")) - (gnus-summary-position-point)))) - -(defun gnus-summary-last-subject () - "Go to the last displayed subject line in the group." - (let ((article (gnus-data-number (car (gnus-data-list t))))) - (when article - (gnus-summary-goto-subject article)))) - -(defun gnus-summary-goto-article (article &optional all-headers force) - "Fetch ARTICLE (article number or Message-ID) and display it if it exists. -If ALL-HEADERS is non-nil, no header lines are hidden. -If FORCE, go to the article even if it isn't displayed. If FORCE -is a number, it is the line the article is to be displayed on." - (interactive - (list - (completing-read - "Article number or Message-ID: " - (mapcar (lambda (number) (list (int-to-string number))) - gnus-newsgroup-limit)) - current-prefix-arg - t)) - (prog1 - (if (and (stringp article) - (string-match "@" article)) - (gnus-summary-refer-article article) - (when (stringp article) - (setq article (string-to-number article))) - (if (gnus-summary-goto-subject article force) - (gnus-summary-display-article article all-headers) - (gnus-message 4 "Couldn't go to article %s" article) nil)) - (gnus-summary-position-point))) - -(defun gnus-summary-goto-last-article () - "Go to the previously read article." - (interactive) - (prog1 - (when gnus-last-article - (gnus-summary-goto-article gnus-last-article nil t)) - (gnus-summary-position-point))) - -(defun gnus-summary-pop-article (number) - "Pop one article off the history and go to the previous. -NUMBER articles will be popped off." - (interactive "p") - (let (to) - (setq gnus-newsgroup-history - (cdr (setq to (nthcdr number gnus-newsgroup-history)))) - (if to - (gnus-summary-goto-article (car to) nil t) - (error "Article history empty"))) - (gnus-summary-position-point)) - -;; Summary commands and functions for limiting the summary buffer. - -(defun gnus-summary-limit-to-articles (n) - "Limit the summary buffer to the next N articles. -If not given a prefix, use the process marked articles instead." - (interactive "P") - (prog1 - (let ((articles (gnus-summary-work-articles n))) - (setq gnus-newsgroup-processable nil) - (gnus-summary-limit articles)) - (gnus-summary-position-point))) - -(defun gnus-summary-pop-limit (&optional total) - "Restore the previous limit. -If given a prefix, remove all limits." - (interactive "P") - (when total - (setq gnus-newsgroup-limits - (list (mapcar (lambda (h) (mail-header-number h)) - gnus-newsgroup-headers)))) - (unless gnus-newsgroup-limits - (error "No limit to pop")) - (prog1 - (gnus-summary-limit nil 'pop) - (gnus-summary-position-point))) - -(defun gnus-summary-limit-to-subject (subject &optional header) - "Limit the summary buffer to articles that have subjects that match a regexp." - (interactive "sLimit to subject (regexp): ") - (unless header - (setq header "subject")) - (when (not (equal "" subject)) - (prog1 - (let ((articles (gnus-summary-find-matching - (or header "subject") subject 'all))) - (unless articles - (error "Found no matches for \"%s\"" subject)) - (gnus-summary-limit articles)) - (gnus-summary-position-point)))) - -(defun gnus-summary-limit-to-author (from) - "Limit the summary buffer to articles that have authors that match a regexp." - (interactive "sLimit to author (regexp): ") - (gnus-summary-limit-to-subject from "from")) - -(defun gnus-summary-limit-to-age (age &optional younger-p) - "Limit the summary buffer to articles that are older than (or equal) AGE days. -If YOUNGER-P (the prefix) is non-nil, limit the summary buffer to -articles that are younger than AGE days." - (interactive - (let ((younger current-prefix-arg) - (days-got nil) - days) - (while (not days-got) - (setq days (if younger - (read-string "Limit to articles within (in days): ") - (read-string "Limit to articles older than (in days): "))) - (when (> (length days) 0) - (setq days (read days))) - (if (numberp days) - (setq days-got t) - (message "Please enter a number.") - (sleep-for 1))) - (list days younger))) - (prog1 - (let ((data gnus-newsgroup-data) - (cutoff (days-to-time age)) - articles d date is-younger) - (while (setq d (pop data)) - (when (and (vectorp (gnus-data-header d)) - (setq date (mail-header-date (gnus-data-header d)))) - (setq is-younger (time-less-p - (time-since (condition-case () - (date-to-time date) - (error '(0 0)))) - cutoff)) - (when (if younger-p - is-younger - (not is-younger)) - (push (gnus-data-number d) articles)))) - (gnus-summary-limit (nreverse articles))) - (gnus-summary-position-point))) - -(defun gnus-summary-limit-to-extra (header regexp) - "Limit the summary buffer to articles that match an 'extra' header." - (interactive - (let ((header - (intern - (gnus-completing-read - (symbol-name (car gnus-extra-headers)) - "Limit extra header:" - (mapcar (lambda (x) - (cons (symbol-name x) x)) - gnus-extra-headers) - nil - t)))) - (list header - (read-string (format "Limit to header %s (regexp): " header))))) - (when (not (equal "" regexp)) - (prog1 - (let ((articles (gnus-summary-find-matching - (cons 'extra header) regexp 'all))) - (unless articles - (error "Found no matches for \"%s\"" regexp)) - (gnus-summary-limit articles)) - (gnus-summary-position-point)))) - -(defun gnus-summary-limit-to-display-predicate () - "Limit the summary buffer to the predicated in the `display' group parameter." - (interactive) - (unless gnus-newsgroup-display - (error "There is no `diplay' group parameter")) - (let (articles) - (dolist (number gnus-newsgroup-articles) - (when (funcall gnus-newsgroup-display) - (push number articles))) - (gnus-summary-limit articles)) - (gnus-summary-position-point)) - -(defalias 'gnus-summary-delete-marked-as-read 'gnus-summary-limit-to-unread) -(make-obsolete - 'gnus-summary-delete-marked-as-read 'gnus-summary-limit-to-unread) - -(defun gnus-summary-limit-to-unread (&optional all) - "Limit the summary buffer to articles that are not marked as read. -If ALL is non-nil, limit strictly to unread articles." - (interactive "P") - (if all - (gnus-summary-limit-to-marks (char-to-string gnus-unread-mark)) - (gnus-summary-limit-to-marks - ;; Concat all the marks that say that an article is read and have - ;; those removed. - (list gnus-del-mark gnus-read-mark gnus-ancient-mark - gnus-killed-mark gnus-kill-file-mark - gnus-low-score-mark gnus-expirable-mark - gnus-canceled-mark gnus-catchup-mark gnus-sparse-mark - gnus-duplicate-mark gnus-souped-mark) - 'reverse))) - -(defalias 'gnus-summary-delete-marked-with 'gnus-summary-limit-exclude-marks) -(make-obsolete 'gnus-summary-delete-marked-with - 'gnus-summary-limit-exlude-marks) - -(defun gnus-summary-limit-exclude-marks (marks &optional reverse) - "Exclude articles that are marked with MARKS (e.g. \"DK\"). -If REVERSE, limit the summary buffer to articles that are marked -with MARKS. MARKS can either be a string of marks or a list of marks. -Returns how many articles were removed." - (interactive "sMarks: ") - (gnus-summary-limit-to-marks marks t)) - -(defun gnus-summary-limit-to-marks (marks &optional reverse) - "Limit the summary buffer to articles that are marked with MARKS (e.g. \"DK\"). -If REVERSE (the prefix), limit the summary buffer to articles that are -not marked with MARKS. MARKS can either be a string of marks or a -list of marks. -Returns how many articles were removed." - (interactive "sMarks: \nP") - (prog1 - (let ((data gnus-newsgroup-data) - (marks (if (listp marks) marks - (append marks nil))) ; Transform to list. - articles) - (while data - (when (if reverse (not (memq (gnus-data-mark (car data)) marks)) - (memq (gnus-data-mark (car data)) marks)) - (push (gnus-data-number (car data)) articles)) - (setq data (cdr data))) - (gnus-summary-limit articles)) - (gnus-summary-position-point))) - -(defun gnus-summary-limit-to-score (&optional score) - "Limit to articles with score at or above SCORE." - (interactive "P") - (setq score (if score - (prefix-numeric-value score) - (or gnus-summary-default-score 0))) - (let ((data gnus-newsgroup-data) - articles) - (while data - (when (>= (gnus-summary-article-score (gnus-data-number (car data))) - score) - (push (gnus-data-number (car data)) articles)) - (setq data (cdr data))) - (prog1 - (gnus-summary-limit articles) - (gnus-summary-position-point)))) - -(defun gnus-summary-limit-include-thread (id) - "Display all the hidden articles that is in the thread with ID in it. -When called interactively, ID is the Message-ID of the current -article." - (interactive (list (mail-header-id (gnus-summary-article-header)))) - (let ((articles (gnus-articles-in-thread - (gnus-id-to-thread (gnus-root-id id))))) - (prog1 - (gnus-summary-limit (nconc articles gnus-newsgroup-limit)) - (gnus-summary-limit-include-matching-articles - "subject" - (regexp-quote (gnus-simplify-subject-re - (mail-header-subject (gnus-id-to-header id))))) - (gnus-summary-position-point)))) - -(defun gnus-summary-limit-include-matching-articles (header regexp) - "Display all the hidden articles that have HEADERs that match REGEXP." - (interactive (list (read-string "Match on header: ") - (read-string "Regexp: "))) - (let ((articles (gnus-find-matching-articles header regexp))) - (prog1 - (gnus-summary-limit (nconc articles gnus-newsgroup-limit)) - (gnus-summary-position-point)))) - -(defun gnus-summary-limit-include-dormant () - "Display all the hidden articles that are marked as dormant. -Note that this command only works on a subset of the articles currently -fetched for this group." - (interactive) - (unless gnus-newsgroup-dormant - (error "There are no dormant articles in this group")) - (prog1 - (gnus-summary-limit (append gnus-newsgroup-dormant gnus-newsgroup-limit)) - (gnus-summary-position-point))) - -(defun gnus-summary-limit-exclude-dormant () - "Hide all dormant articles." - (interactive) - (prog1 - (gnus-summary-limit-to-marks (list gnus-dormant-mark) 'reverse) - (gnus-summary-position-point))) - -(defun gnus-summary-limit-exclude-childless-dormant () - "Hide all dormant articles that have no children." - (interactive) - (let ((data (gnus-data-list t)) - articles d children) - ;; Find all articles that are either not dormant or have - ;; children. - (while (setq d (pop data)) - (when (or (not (= (gnus-data-mark d) gnus-dormant-mark)) - (and (setq children - (gnus-article-children (gnus-data-number d))) - (let (found) - (while children - (when (memq (car children) articles) - (setq children nil - found t)) - (pop children)) - found))) - (push (gnus-data-number d) articles))) - ;; Do the limiting. - (prog1 - (gnus-summary-limit articles) - (gnus-summary-position-point)))) - -(defun gnus-summary-limit-mark-excluded-as-read (&optional all) - "Mark all unread excluded articles as read. -If ALL, mark even excluded ticked and dormants as read." - (interactive "P") - (let ((articles (gnus-sorted-complement - (sort - (mapcar (lambda (h) (mail-header-number h)) - gnus-newsgroup-headers) - '<) - (sort gnus-newsgroup-limit '<))) - article) - (setq gnus-newsgroup-unreads - (gnus-intersection gnus-newsgroup-unreads gnus-newsgroup-limit)) - (if all - (setq gnus-newsgroup-dormant nil - gnus-newsgroup-marked nil - gnus-newsgroup-reads - (nconc - (mapcar (lambda (n) (cons n gnus-catchup-mark)) articles) - gnus-newsgroup-reads)) - (while (setq article (pop articles)) - (unless (or (memq article gnus-newsgroup-dormant) - (memq article gnus-newsgroup-marked)) - (push (cons article gnus-catchup-mark) gnus-newsgroup-reads)))))) - -(defun gnus-summary-limit (articles &optional pop) - (if pop - ;; We pop the previous limit off the stack and use that. - (setq articles (car gnus-newsgroup-limits) - gnus-newsgroup-limits (cdr gnus-newsgroup-limits)) - ;; We use the new limit, so we push the old limit on the stack. - (push gnus-newsgroup-limit gnus-newsgroup-limits)) - ;; Set the limit. - (setq gnus-newsgroup-limit articles) - (let ((total (length gnus-newsgroup-data)) - (data (gnus-data-find-list (gnus-summary-article-number))) - (gnus-summary-mark-below nil) ; Inhibit this. - found) - ;; This will do all the work of generating the new summary buffer - ;; according to the new limit. - (gnus-summary-prepare) - ;; Hide any threads, possibly. - (and gnus-show-threads - gnus-thread-hide-subtree - (gnus-summary-hide-all-threads)) - ;; Try to return to the article you were at, or one in the - ;; neighborhood. - (when data - ;; We try to find some article after the current one. - (while data - (when (gnus-summary-goto-subject (gnus-data-number (car data)) nil t) - (setq data nil - found t)) - (setq data (cdr data)))) - (unless found - ;; If there is no data, that means that we were after the last - ;; article. The same goes when we can't find any articles - ;; after the current one. - (goto-char (point-max)) - (gnus-summary-find-prev)) - (gnus-set-mode-line 'summary) - ;; We return how many articles were removed from the summary - ;; buffer as a result of the new limit. - (- total (length gnus-newsgroup-data)))) - -(defsubst gnus-invisible-cut-children (threads) - (let ((num 0)) - (while threads - (when (memq (mail-header-number (caar threads)) gnus-newsgroup-limit) - (incf num)) - (pop threads)) - (< num 2))) - -(defsubst gnus-cut-thread (thread) - "Go forwards in the thread until we find an article that we want to display." - (when (or (eq gnus-fetch-old-headers 'some) - (eq gnus-fetch-old-headers 'invisible) - (numberp gnus-fetch-old-headers) - (eq gnus-build-sparse-threads 'some) - (eq gnus-build-sparse-threads 'more)) - ;; Deal with old-fetched headers and sparse threads. - (while (and - thread - (or - (gnus-summary-article-sparse-p (mail-header-number (car thread))) - (gnus-summary-article-ancient-p - (mail-header-number (car thread)))) - (if (or (<= (length (cdr thread)) 1) - (eq gnus-fetch-old-headers 'invisible)) - (setq gnus-newsgroup-limit - (delq (mail-header-number (car thread)) - gnus-newsgroup-limit) - thread (cadr thread)) - (when (gnus-invisible-cut-children (cdr thread)) - (let ((th (cdr thread))) - (while th - (if (memq (mail-header-number (caar th)) - gnus-newsgroup-limit) - (setq thread (car th) - th nil) - (setq th (cdr th)))))))))) - thread) - -(defun gnus-cut-threads (threads) - "Cut off all uninteresting articles from the beginning of threads." - (when (or (eq gnus-fetch-old-headers 'some) - (eq gnus-fetch-old-headers 'invisible) - (numberp gnus-fetch-old-headers) - (eq gnus-build-sparse-threads 'some) - (eq gnus-build-sparse-threads 'more)) - (let ((th threads)) - (while th - (setcar th (gnus-cut-thread (car th))) - (setq th (cdr th))))) - ;; Remove nixed out threads. - (delq nil threads)) - -(defun gnus-summary-initial-limit (&optional show-if-empty) - "Figure out what the initial limit is supposed to be on group entry. -This entails weeding out unwanted dormants, low-scored articles, -fetch-old-headers verbiage, and so on." - ;; Most groups have nothing to remove. - (if (or gnus-inhibit-limiting - (and (null gnus-newsgroup-dormant) - (eq gnus-newsgroup-display 'gnus-not-ignore) - (not (eq gnus-fetch-old-headers 'some)) - (not (numberp gnus-fetch-old-headers)) - (not (eq gnus-fetch-old-headers 'invisible)) - (null gnus-summary-expunge-below) - (not (eq gnus-build-sparse-threads 'some)) - (not (eq gnus-build-sparse-threads 'more)) - (null gnus-thread-expunge-below) - (not gnus-use-nocem))) - () ; Do nothing. - (push gnus-newsgroup-limit gnus-newsgroup-limits) - (setq gnus-newsgroup-limit nil) - (mapatoms - (lambda (node) - (unless (car (symbol-value node)) - ;; These threads have no parents -- they are roots. - (let ((nodes (cdr (symbol-value node))) - thread) - (while nodes - (if (and gnus-thread-expunge-below - (< (gnus-thread-total-score (car nodes)) - gnus-thread-expunge-below)) - (gnus-expunge-thread (pop nodes)) - (setq thread (pop nodes)) - (gnus-summary-limit-children thread)))))) - gnus-newsgroup-dependencies) - ;; If this limitation resulted in an empty group, we might - ;; pop the previous limit and use it instead. - (when (and (not gnus-newsgroup-limit) - show-if-empty) - (setq gnus-newsgroup-limit (pop gnus-newsgroup-limits))) - gnus-newsgroup-limit)) - -(defun gnus-summary-limit-children (thread) - "Return 1 if this subthread is visible and 0 if it is not." - ;; First we get the number of visible children to this thread. This - ;; is done by recursing down the thread using this function, so this - ;; will really go down to a leaf article first, before slowly - ;; working its way up towards the root. - (when thread - (let ((children - (if (cdr thread) - (apply '+ (mapcar 'gnus-summary-limit-children - (cdr thread))) - 0)) - (number (mail-header-number (car thread))) - score) - (if (and - (not (memq number gnus-newsgroup-marked)) - (or - ;; If this article is dormant and has absolutely no visible - ;; children, then this article isn't visible. - (and (memq number gnus-newsgroup-dormant) - (zerop children)) - ;; If this is "fetch-old-headered" and there is no - ;; visible children, then we don't want this article. - (and (or (eq gnus-fetch-old-headers 'some) - (numberp gnus-fetch-old-headers)) - (gnus-summary-article-ancient-p number) - (zerop children)) - ;; If this is "fetch-old-headered" and `invisible', then - ;; we don't want this article. - (and (eq gnus-fetch-old-headers 'invisible) - (gnus-summary-article-ancient-p number)) - ;; If this is a sparsely inserted article with no children, - ;; we don't want it. - (and (eq gnus-build-sparse-threads 'some) - (gnus-summary-article-sparse-p number) - (zerop children)) - ;; If we use expunging, and this article is really - ;; low-scored, then we don't want this article. - (when (and gnus-summary-expunge-below - (< (setq score - (or (cdr (assq number gnus-newsgroup-scored)) - gnus-summary-default-score)) - gnus-summary-expunge-below)) - ;; We increase the expunge-tally here, but that has - ;; nothing to do with the limits, really. - (incf gnus-newsgroup-expunged-tally) - ;; We also mark as read here, if that's wanted. - (when (and gnus-summary-mark-below - (< score gnus-summary-mark-below)) - (setq gnus-newsgroup-unreads - (delq number gnus-newsgroup-unreads)) - (if gnus-newsgroup-auto-expire - (push number gnus-newsgroup-expirable) - (push (cons number gnus-low-score-mark) - gnus-newsgroup-reads))) - t) - ;; Do the `display' group parameter. - (and gnus-newsgroup-display - (not (funcall gnus-newsgroup-display))) - ;; Check NoCeM things. - (if (and gnus-use-nocem - (gnus-nocem-unwanted-article-p - (mail-header-id (car thread)))) - (progn - (setq gnus-newsgroup-unreads - (delq number gnus-newsgroup-unreads)) - t)))) - ;; Nope, invisible article. - 0 - ;; Ok, this article is to be visible, so we add it to the limit - ;; and return 1. - (push number gnus-newsgroup-limit) - 1)))) - -(defun gnus-expunge-thread (thread) - "Mark all articles in THREAD as read." - (let* ((number (mail-header-number (car thread)))) - (incf gnus-newsgroup-expunged-tally) - ;; We also mark as read here, if that's wanted. - (setq gnus-newsgroup-unreads - (delq number gnus-newsgroup-unreads)) - (if gnus-newsgroup-auto-expire - (push number gnus-newsgroup-expirable) - (push (cons number gnus-low-score-mark) - gnus-newsgroup-reads))) - ;; Go recursively through all subthreads. - (mapcar 'gnus-expunge-thread (cdr thread))) - -;; Summary article oriented commands - -(defun gnus-summary-refer-parent-article (n) - "Refer parent article N times. -If N is negative, go to ancestor -N instead. -The difference between N and the number of articles fetched is returned." - (interactive "p") - (let ((skip 1) - error header ref) - (when (not (natnump n)) - (setq skip (abs n) - n 1)) - (while (and (> n 0) - (not error)) - (setq header (gnus-summary-article-header)) - (if (and (eq (mail-header-number header) - (cdr gnus-article-current)) - (equal gnus-newsgroup-name - (car gnus-article-current))) - ;; If we try to find the parent of the currently - ;; displayed article, then we take a look at the actual - ;; References header, since this is slightly more - ;; reliable than the References field we got from the - ;; server. - (save-excursion - (set-buffer gnus-original-article-buffer) - (nnheader-narrow-to-headers) - (unless (setq ref (message-fetch-field "references")) - (setq ref (message-fetch-field "in-reply-to"))) - (widen)) - (setq ref - ;; It's not the current article, so we take a bet on - ;; the value we got from the server. - (mail-header-references header))) - (if (and ref - (not (equal ref ""))) - (unless (gnus-summary-refer-article (gnus-parent-id ref skip)) - (gnus-message 1 "Couldn't find parent")) - (gnus-message 1 "No references in article %d" - (gnus-summary-article-number)) - (setq error t)) - (decf n)) - (gnus-summary-position-point) - n)) - -(defun gnus-summary-refer-references () - "Fetch all articles mentioned in the References header. -Return the number of articles fetched." - (interactive) - (let ((ref (mail-header-references (gnus-summary-article-header))) - (current (gnus-summary-article-number)) - (n 0)) - (if (or (not ref) - (equal ref "")) - (error "No References in the current article") - ;; For each Message-ID in the References header... - (while (string-match "<[^>]*>" ref) - (incf n) - ;; ... fetch that article. - (gnus-summary-refer-article - (prog1 (match-string 0 ref) - (setq ref (substring ref (match-end 0)))))) - (gnus-summary-goto-subject current) - (gnus-summary-position-point) - n))) - -(defun gnus-summary-refer-thread (&optional limit) - "Fetch all articles in the current thread. -If LIMIT (the numerical prefix), fetch that many old headers instead -of what's specified by the `gnus-refer-thread-limit' variable." - (interactive "P") - (let ((id (mail-header-id (gnus-summary-article-header))) - (limit (if limit (prefix-numeric-value limit) - gnus-refer-thread-limit))) - ;; We want to fetch LIMIT *old* headers, but we also have to - ;; re-fetch all the headers in the current buffer, because many of - ;; them may be undisplayed. So we adjust LIMIT. - (when (numberp limit) - (incf limit (- gnus-newsgroup-end gnus-newsgroup-begin))) - (unless (eq gnus-fetch-old-headers 'invisible) - (gnus-message 5 "Fetching headers for %s..." gnus-newsgroup-name) - ;; Retrieve the headers and read them in. - (if (eq (gnus-retrieve-headers - (list gnus-newsgroup-end) gnus-newsgroup-name limit) - 'nov) - (gnus-build-all-threads) - (error "Can't fetch thread from backends that don't support NOV")) - (gnus-message 5 "Fetching headers for %s...done" gnus-newsgroup-name)) - (gnus-summary-limit-include-thread id))) - -(defun gnus-summary-refer-article (message-id) - "Fetch an article specified by MESSAGE-ID." - (interactive "sMessage-ID: ") - (when (and (stringp message-id) - (not (zerop (length message-id)))) - ;; Construct the correct Message-ID if necessary. - ;; Suggested by tale@pawl.rpi.edu. - (unless (string-match "^<" message-id) - (setq message-id (concat "<" message-id))) - (unless (string-match ">$" message-id) - (setq message-id (concat message-id ">"))) - (let* ((header (gnus-id-to-header message-id)) - (sparse (and header - (gnus-summary-article-sparse-p - (mail-header-number header)) - (memq (mail-header-number header) - gnus-newsgroup-limit))) - number) - (cond - ;; If the article is present in the buffer we just go to it. - ((and header - (or (not (gnus-summary-article-sparse-p - (mail-header-number header))) - sparse)) - (prog1 - (gnus-summary-goto-article - (mail-header-number header) nil t) - (when sparse - (gnus-summary-update-article (mail-header-number header))))) - (t - ;; We fetch the article. - (catch 'found - (dolist (gnus-override-method (gnus-refer-article-methods)) - (gnus-check-server gnus-override-method) - ;; Fetch the header, and display the article. - (when (setq number (gnus-summary-insert-subject message-id)) - (gnus-summary-select-article nil nil nil number) - (throw 'found t))) - (gnus-message 3 "Couldn't fetch article %s" message-id))))))) - -(defun gnus-refer-article-methods () - "Return a list of referrable methods." - (cond - ;; No method, so we default to current and native. - ((null gnus-refer-article-method) - (list gnus-current-select-method gnus-select-method)) - ;; Current. - ((eq 'current gnus-refer-article-method) - (list gnus-current-select-method)) - ;; List of select methods. - ((not (and (symbolp (car gnus-refer-article-method)) - (assq (car gnus-refer-article-method) nnoo-definition-alist))) - (let (out) - (dolist (method gnus-refer-article-method) - (push (if (eq 'current method) - gnus-current-select-method - method) - out)) - (nreverse out))) - ;; One single select method. - (t - (list gnus-refer-article-method)))) - -(defun gnus-summary-edit-parameters () - "Edit the group parameters of the current group." - (interactive) - (gnus-group-edit-group gnus-newsgroup-name 'params)) - -(defun gnus-summary-customize-parameters () - "Customize the group parameters of the current group." - (interactive) - (gnus-group-customize gnus-newsgroup-name)) - -(defun gnus-summary-enter-digest-group (&optional force) - "Enter an nndoc group based on the current article. -If FORCE, force a digest interpretation. If not, try -to guess what the document format is." - (interactive "P") - (let ((conf gnus-current-window-configuration)) - (save-excursion - (gnus-summary-select-article)) - (setq gnus-current-window-configuration conf) - (let* ((name (format "%s-%d" - (gnus-group-prefixed-name - gnus-newsgroup-name (list 'nndoc "")) - (save-excursion - (set-buffer gnus-summary-buffer) - gnus-current-article))) - (ogroup gnus-newsgroup-name) - (params (append (gnus-info-params (gnus-get-info ogroup)) - (list (cons 'to-group ogroup)) - (list (cons 'save-article-group ogroup)))) - (case-fold-search t) - (buf (current-buffer)) - dig to-address) - (save-excursion - (set-buffer gnus-original-article-buffer) - ;; Have the digest group inherit the main mail address of - ;; the parent article. - (when (setq to-address (or (message-fetch-field "reply-to") - (message-fetch-field "from"))) - (setq params (append - (list (cons 'to-address - (funcall gnus-decode-encoded-word-function - to-address)))))) - (setq dig (nnheader-set-temp-buffer " *gnus digest buffer*")) - (insert-buffer-substring gnus-original-article-buffer) - ;; Remove lines that may lead nndoc to misinterpret the - ;; document type. - (narrow-to-region - (goto-char (point-min)) - (or (search-forward "\n\n" nil t) (point))) - (goto-char (point-min)) - (delete-matching-lines "^Path:\\|^From ") - (widen)) - (unwind-protect - (if (let ((gnus-newsgroup-ephemeral-charset gnus-newsgroup-charset) - (gnus-newsgroup-ephemeral-ignored-charsets - gnus-newsgroup-ignored-charsets)) - (gnus-group-read-ephemeral-group - name `(nndoc ,name (nndoc-address ,(get-buffer dig)) - (nndoc-article-type - ,(if force 'mbox 'guess))) t)) - ;; Make all postings to this group go to the parent group. - (nconc (gnus-info-params (gnus-get-info name)) - params) - ;; Couldn't select this doc group. - (switch-to-buffer buf) - (gnus-set-global-variables) - (gnus-configure-windows 'summary) - (gnus-message 3 "Article couldn't be entered?")) - (kill-buffer dig))))) - -(defun gnus-summary-read-document (n) - "Open a new group based on the current article(s). -This will allow you to read digests and other similar -documents as newsgroups. -Obeys the standard process/prefix convention." - (interactive "P") - (let* ((articles (gnus-summary-work-articles n)) - (ogroup gnus-newsgroup-name) - (params (append (gnus-info-params (gnus-get-info ogroup)) - (list (cons 'to-group ogroup)))) - article group egroup groups vgroup) - (while (setq article (pop articles)) - (setq group (format "%s-%d" gnus-newsgroup-name article)) - (gnus-summary-remove-process-mark article) - (when (gnus-summary-display-article article) - (save-excursion - (with-temp-buffer - (insert-buffer-substring gnus-original-article-buffer) - ;; Remove some headers that may lead nndoc to make - ;; the wrong guess. - (message-narrow-to-head) - (goto-char (point-min)) - (delete-matching-lines "^\\(Path\\):\\|^From ") - (widen) - (if (setq egroup - (gnus-group-read-ephemeral-group - group `(nndoc ,group (nndoc-address ,(current-buffer)) - (nndoc-article-type guess)) - t nil t)) - (progn - ;; Make all postings to this group go to the parent group. - (nconc (gnus-info-params (gnus-get-info egroup)) - params) - (push egroup groups)) - ;; Couldn't select this doc group. - (gnus-error 3 "Article couldn't be entered")))))) - ;; Now we have selected all the documents. - (cond - ((not groups) - (error "None of the articles could be interpreted as documents")) - ((gnus-group-read-ephemeral-group - (setq vgroup (format - "nnvirtual:%s-%s" gnus-newsgroup-name - (format-time-string "%Y%m%dT%H%M%S" (current-time)))) - `(nnvirtual ,vgroup (nnvirtual-component-groups ,groups)) - t - (cons (current-buffer) 'summary))) - (t - (error "Couldn't select virtual nndoc group"))))) - -(defun gnus-summary-isearch-article (&optional regexp-p) - "Do incremental search forward on the current article. -If REGEXP-P (the prefix) is non-nil, do regexp isearch." - (interactive "P") - (let* ((gnus-inhibit-treatment t) - (old (gnus-summary-select-article))) - (gnus-configure-windows 'article) - (gnus-eval-in-buffer-window gnus-article-buffer - (save-restriction - (widen) - (when (eq 'old old) - (gnus-article-show-all-headers)) - (goto-char (point-min)) - (isearch-forward regexp-p))))) - -(defun gnus-summary-search-article-forward (regexp &optional backward) - "Search for an article containing REGEXP forward. -If BACKWARD, search backward instead." - (interactive - (list (read-string - (format "Search article %s (regexp%s): " - (if current-prefix-arg "backward" "forward") - (if gnus-last-search-regexp - (concat ", default " gnus-last-search-regexp) - ""))) - current-prefix-arg)) - (if (string-equal regexp "") - (setq regexp (or gnus-last-search-regexp "")) - (setq gnus-last-search-regexp regexp) - (setq gnus-article-before-search gnus-current-article)) - ;; Intentionally set gnus-last-article. - (setq gnus-last-article gnus-article-before-search) - (let ((gnus-last-article gnus-last-article)) - (if (gnus-summary-search-article regexp backward) - (gnus-summary-show-thread) - (error "Search failed: \"%s\"" regexp)))) - -(defun gnus-summary-search-article-backward (regexp) - "Search for an article containing REGEXP backward." - (interactive - (list (read-string - (format "Search article backward (regexp%s): " - (if gnus-last-search-regexp - (concat ", default " gnus-last-search-regexp) - ""))))) - (gnus-summary-search-article-forward regexp 'backward)) - -(eval-when-compile - (defmacro gnus-summary-search-article-position-point (regexp backward) - "Dehighlight the last matched text and goto the beginning position." - (` (if (and gnus-summary-search-article-matched-data - (let ((text (caddr gnus-summary-search-article-matched-data)) - (inhibit-read-only t) - buffer-read-only) - (delete-region - (goto-char (car gnus-summary-search-article-matched-data)) - (cadr gnus-summary-search-article-matched-data)) - (insert text) - (string-match (, regexp) text))) - (if (, backward) (beginning-of-line) (end-of-line)) - (goto-char (if (, backward) (point-max) (point-min)))))) - - (defmacro gnus-summary-search-article-highlight-goto-x-face (opoint) - "Place point where X-Face image is displayed." - (if (featurep 'xemacs) - (` (let ((end (if (search-forward "\n\n" nil t) - (goto-char (1- (point))) - (point-min))) - extent) - (or (search-backward "\n\n" nil t) (goto-char (point-min))) - (unless (and (re-search-forward "^From:" end t) - (setq extent (extent-at (point))) - (extent-begin-glyph extent)) - (goto-char (, opoint))))) - (` (let ((end (if (search-forward "\n\n" nil t) - (goto-char (1- (point))) - (point-min))) - (start (or (search-backward "\n\n" nil t) (point-min)))) - (goto-char - (or (text-property-any start end 'x-face-image t);; x-face-e21 - (text-property-any start end 'x-face-mule-bitmap-image t) - (, opoint))))))) - - (defmacro gnus-summary-search-article-highlight-matched-text - (backward treated x-face) - "Highlight matched text in the function `gnus-summary-search-article'." - (` (let ((start (set-marker (make-marker) (match-beginning 0))) - (end (set-marker (make-marker) (match-end 0))) - (inhibit-read-only t) - buffer-read-only) - (unless treated - (let ((,@ - (let ((items (mapcar 'car gnus-treatment-function-alist))) - (mapcar - (lambda (item) (setq items (delq item items))) - '(gnus-treat-buttonize - gnus-treat-fill-article - gnus-treat-fill-long-lines - gnus-treat-emphasize - gnus-treat-highlight-headers - gnus-treat-highlight-citation - gnus-treat-highlight-signature - gnus-treat-overstrike - gnus-treat-display-xface - gnus-treat-buttonize-head - gnus-treat-decode-article-as-default-mime-charset)) - (static-if (featurep 'xemacs) - items - (cons '(x-face-mule-delete-x-face-field - (quote never)) - items)))) - (gnus-treat-display-xface - (when (, x-face) gnus-treat-display-xface))) - (gnus-article-prepare-mime-display))) - (goto-char (if (, backward) start end)) - (when (, x-face) - (gnus-summary-search-article-highlight-goto-x-face (point))) - (setq gnus-summary-search-article-matched-data - (list start end (buffer-substring start end))) - (unless (eq start end);; matched text has been deleted. :-< - (put-text-property start end 'face - (or (find-face 'isearch) - 'secondary-selection)))))) - ) - -(defun gnus-summary-search-article (regexp &optional backward) - "Search for an article containing REGEXP. -Optional argument BACKWARD means do search for backward. -`gnus-select-article-hook' is not called during the search." - ;; We have to require this here to make sure that the following - ;; dynamic binding isn't shadowed by autoloading. - (require 'gnus-async) - (require 'gnus-art) - (let ((gnus-select-article-hook nil) ;Disable hook. - (gnus-article-prepare-hook nil) - (gnus-mark-article-hook nil) ;Inhibit marking as read. - (gnus-use-article-prefetch nil) - (gnus-xmas-force-redisplay nil) ;Inhibit XEmacs redisplay. - (gnus-use-trees nil) ;Inhibit updating tree buffer. - (sum (current-buffer)) - (found nil) - point treated) - (gnus-save-hidden-threads - (static-if (featurep 'xemacs) - (let ((gnus-inhibit-treatment t)) - (setq treated (eq 'old (gnus-summary-select-article))) - (when (and treated - (not (and (gnus-buffer-live-p gnus-article-buffer) - (window-live-p (get-buffer-window - gnus-article-buffer t))))) - (gnus-summary-select-article nil t) - (setq treated nil))) - (let ((gnus-inhibit-treatment t) - (x-face-mule-delete-x-face-field 'never)) - (setq treated (eq 'old (gnus-summary-select-article))) - (when (and treated - (not - (and (gnus-buffer-live-p gnus-article-buffer) - (window-live-p (get-buffer-window - gnus-article-buffer t)) - (or (not (string-match "^\\^X-Face:" regexp)) - (with-current-buffer gnus-article-buffer - gnus-summary-search-article-matched-data))))) - (gnus-summary-select-article nil t) - (setq treated nil)))) - (set-buffer gnus-article-buffer) - (widen) - (if treated - (progn - (gnus-article-show-all-headers) - (gnus-summary-search-article-position-point regexp backward)) - (goto-char (if backward (point-max) (point-min)))) - (while (not found) - (gnus-message 7 "Searching article: %d..." (cdr gnus-article-current)) - (if (if backward - (re-search-backward regexp nil t) - (re-search-forward regexp nil t)) - ;; We found the regexp. - (progn - (gnus-summary-search-article-highlight-matched-text - backward treated (string-match "^\\^X-Face:" regexp)) - (setq found 'found) - (forward-line - (/ (- 2 (window-height - (get-buffer-window gnus-article-buffer t))) - 2)) - (set-window-start - (get-buffer-window (current-buffer)) - (point)) - (set-buffer sum) - (setq point (point))) - ;; We didn't find it, so we go to the next article. - (set-buffer sum) - (setq found 'not) - (while (eq found 'not) - (if (not (if backward (gnus-summary-find-prev) - (gnus-summary-find-next))) - ;; No more articles. - (setq found t) - ;; Select the next article and adjust point. - (unless (gnus-summary-article-sparse-p - (gnus-summary-article-number)) - (setq found nil) - (let ((gnus-inhibit-treatment t)) - (gnus-summary-select-article)) - (setq treated nil) - (set-buffer gnus-article-buffer) - (widen) - (goto-char (if backward (point-max) (point-min)))))))) - (gnus-message 7 "")) - ;; Return whether we found the regexp. - (when (eq found 'found) - (goto-char point) - (gnus-summary-show-thread) - (gnus-summary-goto-subject gnus-current-article) - (gnus-summary-position-point) - t))) - -(defun gnus-find-matching-articles (header regexp) - "Return a list of all articles that match REGEXP on HEADER. -This search includes all articles in the current group that Gnus has -fetched headers for, whether they are displayed or not." - (let ((articles nil) - (func `(lambda (h) (,(intern (concat "mail-header-" header)) h))) - (case-fold-search t)) - (dolist (header gnus-newsgroup-headers) - (when (string-match regexp (funcall func header)) - (push (mail-header-number header) articles))) - (nreverse articles))) - -(defun gnus-summary-find-matching (header regexp &optional backward unread - not-case-fold) - "Return a list of all articles that match REGEXP on HEADER. -The search stars on the current article and goes forwards unless -BACKWARD is non-nil. If BACKWARD is `all', do all articles. -If UNREAD is non-nil, only unread articles will -be taken into consideration. If NOT-CASE-FOLD, case won't be folded -in the comparisons." - (let ((case-fold-search (not not-case-fold)) - articles d func) - (if (consp header) - (if (eq (car header) 'extra) - (setq func - `(lambda (h) - (or (cdr (assq ',(cdr header) (mail-header-extra h))) - ""))) - (error "%s is an invalid header" header)) - (unless (fboundp (intern (concat "mail-header-" header))) - (error "%s is not a valid header" header)) - (setq func `(lambda (h) (,(intern (concat "mail-header-" header)) h)))) - (dolist (d (if (eq backward 'all) - gnus-newsgroup-data - (gnus-data-find-list - (gnus-summary-article-number) - (gnus-data-list backward)))) - (when (and (or (not unread) ; We want all articles... - (gnus-data-unread-p d)) ; Or just unreads. - (vectorp (gnus-data-header d)) ; It's not a pseudo. - (string-match regexp - (funcall func (gnus-data-header d)))) ; Match. - (push (gnus-data-number d) articles))) ; Success! - (nreverse articles))) - -(defun gnus-summary-execute-command (header regexp command &optional backward) - "Search forward for an article whose HEADER matches REGEXP and execute COMMAND. -If HEADER is an empty string (or nil), the match is done on the entire -article. If BACKWARD (the prefix) is non-nil, search backward instead." - (interactive - (list (let ((completion-ignore-case t)) - (completing-read - "Header name: " - (mapcar (lambda (header) (list (format "%s" header))) - (append - '("Number" "Subject" "From" "Lines" "Date" - "Message-ID" "Xref" "References" "Body") - gnus-extra-headers)) - nil 'require-match)) - (read-string "Regexp: ") - (read-key-sequence "Command: ") - current-prefix-arg)) - (when (equal header "Body") - (setq header "")) - ;; Hidden thread subtrees must be searched as well. - (gnus-summary-show-all-threads) - ;; We don't want to change current point nor window configuration. - (save-excursion - (save-window-excursion - (gnus-message 6 "Executing %s..." (key-description command)) - ;; We'd like to execute COMMAND interactively so as to give arguments. - (gnus-execute header regexp - `(call-interactively ',(key-binding command)) - backward) - (gnus-message 6 "Executing %s...done" (key-description command))))) - -(defun gnus-summary-beginning-of-article () - "Scroll the article back to the beginning." - (interactive) - (gnus-summary-select-article) - (gnus-configure-windows 'article) - (gnus-eval-in-buffer-window gnus-article-buffer - (widen) - (goto-char (point-min)) - (when gnus-page-broken - (gnus-narrow-to-page)))) - -(defun gnus-summary-end-of-article () - "Scroll to the end of the article." - (interactive) - (gnus-summary-select-article) - (gnus-configure-windows 'article) - (gnus-eval-in-buffer-window gnus-article-buffer - (widen) - (goto-char (point-max)) - (recenter -3) - (when gnus-page-broken - (gnus-narrow-to-page)))) - -(defun gnus-summary-print-article (&optional filename n) - "Generate and print a PostScript image of the N next (mail) articles. - -If N is negative, print the N previous articles. If N is nil and articles -have been marked with the process mark, print these instead. - -If the optional first argument FILENAME is nil, send the image to the -printer. If FILENAME is a string, save the PostScript image in a file with -that name. If FILENAME is a number, prompt the user for the name of the file -to save in." - (interactive (list (ps-print-preprint current-prefix-arg))) - (dolist (article (gnus-summary-work-articles n)) - (gnus-summary-select-article nil nil 'pseudo article) - (gnus-eval-in-buffer-window gnus-article-buffer - (let ((buffer (generate-new-buffer " *print*"))) - (unwind-protect - (progn - (copy-to-buffer buffer (point-min) (point-max)) - (set-buffer buffer) - (gnus-article-delete-invisible-text) - (when (gnus-visual-p 'article-highlight 'highlight) - ;; Copy-to-buffer doesn't copy overlay. So redo - ;; highlight. - (let ((gnus-article-buffer buffer)) - (gnus-article-highlight-citation t) - (gnus-article-highlight-signature))) - (let ((ps-left-header - (list - (concat "(" - (mail-header-subject gnus-current-headers) ")") - (concat "(" - (mail-header-from gnus-current-headers) ")"))) - (ps-right-header - (list - "/pagenumberstring load" - (concat "(" - (mail-header-date gnus-current-headers) ")")))) - (gnus-run-hooks 'gnus-ps-print-hook) - (save-excursion - (if window-system - (ps-spool-buffer-with-faces) - (ps-spool-buffer))))) - (kill-buffer buffer)))) - (gnus-summary-remove-process-mark article)) - (ps-despool filename)) - -(defun gnus-summary-show-article (&optional arg) - "Force re-fetching of the current article. -If ARG (the prefix) is a number, show the article with the charset -defined in `gnus-summary-show-article-charset-alist', or the charset -input. -If ARG (the prefix) is non-nil and not a number, show the raw article -without any article massaging functions being run." - (interactive "P") - (cond - ((numberp arg) - (gnus-summary-show-article t) - (let ((gnus-newsgroup-charset - (or (cdr (assq arg gnus-summary-show-article-charset-alist)) - (mm-read-coding-system - "View as charset: " - (save-excursion - (set-buffer gnus-article-buffer) - (detect-coding-region (point) (point-max) t))))) - (gnus-newsgroup-ignored-charsets 'gnus-all)) - (gnus-summary-select-article nil 'force) - (let ((deps gnus-newsgroup-dependencies) - head header) - (save-excursion - (set-buffer gnus-original-article-buffer) - (save-restriction - (message-narrow-to-head) - (setq head (buffer-string))) - (with-temp-buffer - (insert (format "211 %d Article retrieved.\n" - (cdr gnus-article-current))) - (insert head) - (insert ".\n") - (let ((nntp-server-buffer (current-buffer))) - (setq header (car (gnus-get-newsgroup-headers deps t)))))) - (gnus-data-set-header - (gnus-data-find (cdr gnus-article-current)) - header) - (gnus-summary-update-article-line - (cdr gnus-article-current) header) - (when (gnus-summary-goto-subject (cdr gnus-article-current) nil t) - (gnus-summary-update-secondary-mark (cdr gnus-article-current)))))) - ((not arg) - ;; Select the article the normal way. - (gnus-summary-select-article nil 'force)) - (t - ;; We have to require this here to make sure that the following - ;; dynamic binding isn't shadowed by autoloading. - (require 'gnus-async) - (require 'gnus-art) - ;; Bind the article treatment functions to nil. - (let ((gnus-have-all-headers t) - gnus-article-prepare-hook - gnus-article-decode-hook - gnus-break-pages - gnus-show-mime - (gnus-inhibit-treatment t)) - (gnus-summary-select-article nil 'force)))) - (gnus-summary-goto-subject gnus-current-article) - (gnus-summary-position-point)) - -(defun gnus-summary-show-raw-article () - "Show the raw article without any article massaging functions being run." - (interactive) - (gnus-summary-show-article t)) - -(defun gnus-summary-verbose-headers (&optional arg) - "Toggle permanent full header display. -If ARG is a positive number, turn header display on. -If ARG is a negative number, turn header display off." - (interactive "P") - (setq gnus-show-all-headers - (cond ((or (not (numberp arg)) - (zerop arg)) - (not gnus-show-all-headers)) - ((natnump arg) - t))) - (gnus-summary-show-article)) - -(defun gnus-summary-toggle-header (&optional arg) - "Show the headers if they are hidden, or hide them if they are shown. -If ARG is a positive number, show the entire header. -If ARG is a negative number, hide the unwanted header lines." - (interactive "P") - (save-excursion - (set-buffer gnus-article-buffer) - (save-restriction - (let* ((buffer-read-only nil) - (inhibit-point-motion-hooks t) - hidden e) - (setq hidden - (if (numberp arg) - (>= arg 0) - (save-restriction - (article-narrow-to-head) - (gnus-article-hidden-text-p 'headers)))) - (goto-char (point-min)) - (when (search-forward "\n\n" nil t) - (delete-region (point-min) (1- (point)))) - (goto-char (point-min)) - (save-excursion - (set-buffer gnus-original-article-buffer) - (goto-char (point-min)) - (setq e (1- (or (search-forward "\n\n" nil t) (point-max))))) - (insert-buffer-substring gnus-original-article-buffer 1 e) - (save-restriction - (narrow-to-region (point-min) (point)) - (article-decode-encoded-words) - (if hidden - (let ((gnus-treat-hide-headers nil) - (gnus-treat-hide-boring-headers nil)) - (setq gnus-article-wash-types - (delq 'headers gnus-article-wash-types)) - (gnus-treat-article 'head)) - (gnus-treat-article 'head))) - (gnus-set-mode-line 'article))))) - -(defun gnus-summary-show-all-headers () - "Make all header lines visible." - (interactive) - (gnus-summary-toggle-header 1)) - -(defun gnus-summary-toggle-mime (&optional arg) - "Toggle MIME processing. -If ARG is a positive number, turn MIME processing on." - (interactive "P") - (setq gnus-show-mime - (if (null arg) - (not gnus-show-mime) - (> (prefix-numeric-value arg) 0))) - (gnus-summary-select-article t 'force)) - -(defun gnus-summary-caesar-message (&optional arg) - "Caesar rotate the current article by 13. -The numerical prefix specifies how many places to rotate each letter -forward." - (interactive "P") - (gnus-summary-select-article) - (let ((mail-header-separator "")) - (gnus-eval-in-buffer-window gnus-article-buffer - (save-restriction - (widen) - (let ((start (window-start)) - buffer-read-only) - (message-caesar-buffer-body arg) - (set-window-start (get-buffer-window (current-buffer)) start)))))) - -(defun gnus-summary-stop-page-breaking () - "Stop page breaking in the current article." - (interactive) - (gnus-summary-select-article) - (gnus-eval-in-buffer-window gnus-article-buffer - (widen) - (when (gnus-visual-p 'page-marker) - (let ((buffer-read-only nil)) - (gnus-remove-text-with-property 'gnus-prev) - (gnus-remove-text-with-property 'gnus-next)) - (setq gnus-page-broken nil)))) - -(defun gnus-summary-move-article (&optional n to-newsgroup - select-method action) - "Move the current article to a different newsgroup. -If N is a positive number, move the N next articles. -If N is a negative number, move the N previous articles. -If N is nil and any articles have been marked with the process mark, -move those articles instead. -If TO-NEWSGROUP is string, do not prompt for a newsgroup to move to. -If SELECT-METHOD is non-nil, do not move to a specific newsgroup, but -re-spool using this method. - -For this function to work, both the current newsgroup and the -newsgroup that you want to move to have to support the `request-move' -and `request-accept' functions. - -ACTION can be either `move' (the default), `crosspost' or `copy'." - (interactive "P") - (unless action - (setq action 'move)) - ;; Check whether the source group supports the required functions. - (cond ((and (eq action 'move) - (not (gnus-check-backend-function - 'request-move-article gnus-newsgroup-name))) - (error "The current group does not support article moving")) - ((and (eq action 'crosspost) - (not (gnus-check-backend-function - 'request-replace-article gnus-newsgroup-name))) - (error "The current group does not support article editing"))) - (let ((articles (gnus-summary-work-articles n)) - (prefix (if (gnus-check-backend-function - 'request-move-article gnus-newsgroup-name) - (gnus-group-real-prefix gnus-newsgroup-name) - "")) - (names '((move "Move" "Moving") - (copy "Copy" "Copying") - (crosspost "Crosspost" "Crossposting"))) - (copy-buf (save-excursion - (nnheader-set-temp-buffer " *copy article*"))) - (default-marks gnus-article-mark-lists) - (no-expire-marks (delete '(expirable . expire) - (copy-sequence gnus-article-mark-lists))) - art-group to-method new-xref article to-groups) - (unless (assq action names) - (error "Unknown action %s" action)) - ;; Read the newsgroup name. - (when (and (not to-newsgroup) - (not select-method)) - (setq to-newsgroup - (gnus-read-move-group-name - (cadr (assq action names)) - (symbol-value (intern (format "gnus-current-%s-group" action))) - articles prefix)) - (set (intern (format "gnus-current-%s-group" action)) to-newsgroup)) - (setq to-method (or select-method - (gnus-server-to-method - (gnus-group-method to-newsgroup)))) - ;; Check the method we are to move this article to... - (unless (gnus-check-backend-function - 'request-accept-article (car to-method)) - (error "%s does not support article copying" (car to-method))) - (unless (gnus-check-server to-method) - (error "Can't open server %s" (car to-method))) - (gnus-message 6 "%s to %s: %s..." - (caddr (assq action names)) - (or (car select-method) to-newsgroup) articles) - (while articles - (setq article (pop articles)) - (setq - art-group - (cond - ;; Move the article. - ((eq action 'move) - ;; Remove this article from future suppression. - (gnus-dup-unsuppress-article article) - (gnus-request-move-article - article ; Article to move - gnus-newsgroup-name ; From newsgroup - (nth 1 (gnus-find-method-for-group - gnus-newsgroup-name)) ; Server - (list 'gnus-request-accept-article - to-newsgroup (list 'quote select-method) - (not articles) t) ; Accept form - (not articles))) ; Only save nov last time - ;; Copy the article. - ((eq action 'copy) - (save-excursion - (set-buffer copy-buf) - (when (gnus-request-article-this-buffer article gnus-newsgroup-name) - (gnus-request-accept-article - to-newsgroup select-method (not articles) t)))) - ;; Crosspost the article. - ((eq action 'crosspost) - (let ((xref (message-tokenize-header - (mail-header-xref (gnus-summary-article-header article)) - " "))) - (setq new-xref (concat (gnus-group-real-name gnus-newsgroup-name) - ":" article)) - (unless xref - (setq xref (list (system-name)))) - (setq new-xref - (concat - (mapconcat 'identity - (delete "Xref:" (delete new-xref xref)) - " ") - " " new-xref)) - (save-excursion - (set-buffer copy-buf) - ;; First put the article in the destination group. - (gnus-request-article-this-buffer article gnus-newsgroup-name) - (when (consp (setq art-group - (gnus-request-accept-article - to-newsgroup select-method (not articles)))) - (setq new-xref (concat new-xref " " (car art-group) - ":" (cdr art-group))) - ;; Now we have the new Xrefs header, so we insert - ;; it and replace the new article. - (nnheader-replace-header "Xref" new-xref) - (gnus-request-replace-article - (cdr art-group) to-newsgroup (current-buffer)) - art-group)))))) - (cond - ((not art-group) - (gnus-message 1 "Couldn't %s article %s: %s" - (cadr (assq action names)) article - (nnheader-get-report (car to-method)))) - ((eq art-group 'junk) - (when (eq action 'move) - (gnus-summary-mark-article article gnus-canceled-mark) - (gnus-message 4 "Deleted article %s" article))) - (t - (let* ((pto-group (gnus-group-prefixed-name - (car art-group) to-method)) - (entry - (gnus-gethash pto-group gnus-newsrc-hashtb)) - (info (nth 2 entry)) - (to-group (gnus-info-group info)) - to-marks) - ;; Update the group that has been moved to. - (when (and info - (memq action '(move copy))) - (unless (member to-group to-groups) - (push to-group to-groups)) - - (unless (memq article gnus-newsgroup-unreads) - (push 'read to-marks) - (gnus-info-set-read - info (gnus-add-to-range (gnus-info-read info) - (list (cdr art-group))))) - - ;; See whether the article is to be put in the cache. - (let ((marks (if (gnus-group-auto-expirable-p to-group) - default-marks - no-expire-marks)) - (to-article (cdr art-group))) - - ;; Enter the article into the cache in the new group, - ;; if that is required. - (when gnus-use-cache - (gnus-cache-possibly-enter-article - to-group to-article - (let ((header (copy-sequence - (gnus-summary-article-header article)))) - (mail-header-set-number header to-article) - header) - (memq article gnus-newsgroup-marked) - (memq article gnus-newsgroup-dormant) - (memq article gnus-newsgroup-unreads))) - - (when gnus-preserve-marks - ;; Copy any marks over to the new group. - (when (and (equal to-group gnus-newsgroup-name) - (not (memq article gnus-newsgroup-unreads))) - ;; Mark this article as read in this group. - (push (cons to-article gnus-read-mark) gnus-newsgroup-reads) - (setcdr (gnus-active to-group) to-article) - (setcdr gnus-newsgroup-active to-article)) - - (while marks - (when (eq (gnus-article-mark-to-type (cdar marks)) 'list) - (when (memq article (symbol-value - (intern (format "gnus-newsgroup-%s" - (caar marks))))) - (push (cdar marks) to-marks) - ;; If the other group is the same as this group, - ;; then we have to add the mark to the list. - (when (equal to-group gnus-newsgroup-name) - (set (intern (format "gnus-newsgroup-%s" (caar marks))) - (cons to-article - (symbol-value - (intern (format "gnus-newsgroup-%s" - (caar marks))))))) - ;; Copy the marks to other group. - (gnus-add-marked-articles - to-group (cdar marks) (list to-article) info))) - (setq marks (cdr marks))) - - (gnus-request-set-mark to-group (list (list (list to-article) - 'add - to-marks)))) - - (gnus-dribble-enter - (concat "(gnus-group-set-info '" - (gnus-prin1-to-string (gnus-get-info to-group)) - ")")))) - - ;; Update the Xref header in this article to point to - ;; the new crossposted article we have just created. - (when (eq action 'crosspost) - (save-excursion - (set-buffer copy-buf) - (gnus-request-article-this-buffer article gnus-newsgroup-name) - (nnheader-replace-header "Xref" new-xref) - (gnus-request-replace-article - article gnus-newsgroup-name (current-buffer))))) - - ;;;!!!Why is this necessary? - (set-buffer gnus-summary-buffer) - - (gnus-summary-goto-subject article) - (when (eq action 'move) - (gnus-summary-mark-article article gnus-canceled-mark)))) - (gnus-summary-remove-process-mark article)) - ;; Re-activate all groups that have been moved to. - (while to-groups - (save-excursion - (set-buffer gnus-group-buffer) - (when (gnus-group-goto-group (car to-groups) t) - (gnus-group-get-new-news-this-group 1 t)) - (pop to-groups))) - - (gnus-kill-buffer copy-buf) - (gnus-summary-position-point) - (gnus-set-mode-line 'summary))) - -(defun gnus-summary-copy-article (&optional n to-newsgroup select-method) - "Move the current article to a different newsgroup. -If TO-NEWSGROUP is string, do not prompt for a newsgroup to move to. -If SELECT-METHOD is non-nil, do not move to a specific newsgroup, but -re-spool using this method." - (interactive "P") - (gnus-summary-move-article n to-newsgroup select-method 'copy)) - -(defun gnus-summary-crosspost-article (&optional n) - "Crosspost the current article to some other group." - (interactive "P") - (gnus-summary-move-article n nil nil 'crosspost)) - -(defcustom gnus-summary-respool-default-method nil - "Default method for respooling an article. -If nil, use to the current newsgroup method." - :type '(choice (gnus-select-method :value (nnml "")) - (const nil)) - :group 'gnus-summary-mail) - -(defun gnus-summary-respool-article (&optional n method) - "Respool the current article. -The article will be squeezed through the mail spooling process again, -which means that it will be put in some mail newsgroup or other -depending on `nnmail-split-methods'. -If N is a positive number, respool the N next articles. -If N is a negative number, respool the N previous articles. -If N is nil and any articles have been marked with the process mark, -respool those articles instead. - -Respooling can be done both from mail groups and \"real\" newsgroups. -In the former case, the articles in question will be moved from the -current group into whatever groups they are destined to. In the -latter case, they will be copied into the relevant groups." - (interactive - (list current-prefix-arg - (let* ((methods (gnus-methods-using 'respool)) - (methname - (symbol-name (or gnus-summary-respool-default-method - (car (gnus-find-method-for-group - gnus-newsgroup-name))))) - (method - (gnus-completing-read - methname "What backend do you want to use when respooling?" - methods nil t nil 'gnus-mail-method-history)) - ms) - (cond - ((zerop (length (setq ms (gnus-servers-using-backend - (intern method))))) - (list (intern method) "")) - ((= 1 (length ms)) - (car ms)) - (t - (let ((ms-alist (mapcar (lambda (m) (cons (cadr m) m)) ms))) - (cdr (assoc (completing-read "Server name: " ms-alist nil t) - ms-alist)))))))) - (unless method - (error "No method given for respooling")) - (if (assoc (symbol-name - (car (gnus-find-method-for-group gnus-newsgroup-name))) - (gnus-methods-using 'respool)) - (gnus-summary-move-article n nil method) - (gnus-summary-copy-article n nil method))) - -(defun gnus-summary-import-article (file &optional edit) - "Import an arbitrary file into a mail newsgroup." - (interactive "fImport file: \nP") - (let ((group gnus-newsgroup-name) - (now (current-time)) - atts lines group-art) - (unless (gnus-check-backend-function 'request-accept-article group) - (error "%s does not support article importing" group)) - (or (file-readable-p file) - (not (file-regular-p file)) - (error "Can't read %s" file)) - (save-excursion - (set-buffer (gnus-get-buffer-create " *import file*")) - (erase-buffer) - (nnheader-insert-file-contents file) - (goto-char (point-min)) - (if (nnheader-article-p) - (save-restriction - (goto-char (point-min)) - (search-forward "\n\n" nil t) - (narrow-to-region (point-min) (1- (point))) - (goto-char (point-min)) - (unless (re-search-forward "^date:" nil t) - (goto-char (point-max)) - (insert "Date: " (message-make-date (nth 5 atts)) "\n"))) - ;; This doesn't look like an article, so we fudge some headers. - (setq atts (file-attributes file) - lines (count-lines (point-min) (point-max))) - (insert "From: " (read-string "From: ") "\n" - "Subject: " (read-string "Subject: ") "\n" - "Date: " (message-make-date (nth 5 atts)) "\n" - "Message-ID: " (message-make-message-id) "\n" - "Lines: " (int-to-string lines) "\n" - "Chars: " (int-to-string (nth 7 atts)) "\n\n")) - (setq group-art (gnus-request-accept-article group nil t)) - (kill-buffer (current-buffer))) - (setq gnus-newsgroup-active (gnus-activate-group group)) - (forward-line 1) - (gnus-summary-goto-article (cdr group-art) nil t) - (when edit - (gnus-summary-edit-article)))) - -(defun gnus-summary-create-article () - "Create an article in a mail newsgroup." - (interactive) - (let ((group gnus-newsgroup-name) - (now (current-time)) - group-art) - (unless (gnus-check-backend-function 'request-accept-article group) - (error "%s does not support article importing" group)) - (save-excursion - (set-buffer (gnus-get-buffer-create " *import file*")) - (erase-buffer) - (goto-char (point-min)) - ;; This doesn't look like an article, so we fudge some headers. - (insert "From: " (read-string "From: ") "\n" - "Subject: " (read-string "Subject: ") "\n" - "Date: " (message-make-date now) "\n" - "Message-ID: " (message-make-message-id) "\n") - (setq group-art (gnus-request-accept-article group nil t)) - (kill-buffer (current-buffer))) - (setq gnus-newsgroup-active (gnus-activate-group group)) - (forward-line 1) - (gnus-summary-goto-article (cdr group-art) nil t) - (gnus-summary-edit-article))) - -(defun gnus-summary-article-posted-p () - "Say whether the current (mail) article is available from news as well. -This will be the case if the article has both been mailed and posted." - (interactive) - (let ((id (mail-header-references (gnus-summary-article-header))) - (gnus-override-method (car (gnus-refer-article-methods)))) - (if (gnus-request-head id "") - (gnus-message 2 "The current message was found on %s" - gnus-override-method) - (gnus-message 2 "The current message couldn't be found on %s" - gnus-override-method) - nil))) - -(defun gnus-summary-expire-articles (&optional now) - "Expire all articles that are marked as expirable in the current group." - (interactive) - (when (gnus-check-backend-function - 'request-expire-articles gnus-newsgroup-name) - ;; This backend supports expiry. - (let* ((total (gnus-group-total-expirable-p gnus-newsgroup-name)) - (expirable (if total - (progn - ;; We need to update the info for - ;; this group for `gnus-list-of-read-articles' - ;; to give us the right answer. - (gnus-run-hooks 'gnus-exit-group-hook) - (gnus-summary-update-info) - (gnus-list-of-read-articles gnus-newsgroup-name)) - (setq gnus-newsgroup-expirable - (sort gnus-newsgroup-expirable '<)))) - (expiry-wait (if now 'immediate - (gnus-group-find-parameter - gnus-newsgroup-name 'expiry-wait))) - (nnmail-expiry-target - (or (gnus-group-find-parameter gnus-newsgroup-name 'expiry-target) - nnmail-expiry-target)) - es) - (when expirable - ;; There are expirable articles in this group, so we run them - ;; through the expiry process. - (gnus-message 6 "Expiring articles...") - (unless (gnus-check-group gnus-newsgroup-name) - (error "Can't open server for %s" gnus-newsgroup-name)) - ;; The list of articles that weren't expired is returned. - (save-excursion - (if expiry-wait - (let ((nnmail-expiry-wait-function nil) - (nnmail-expiry-wait expiry-wait)) - (setq es (gnus-request-expire-articles - expirable gnus-newsgroup-name))) - (setq es (gnus-request-expire-articles - expirable gnus-newsgroup-name))) - (unless total - (setq gnus-newsgroup-expirable es)) - ;; We go through the old list of expirable, and mark all - ;; really expired articles as nonexistent. - (unless (eq es expirable) ;If nothing was expired, we don't mark. - (let ((gnus-use-cache nil)) - (while expirable - (unless (memq (car expirable) es) - (when (gnus-data-find (car expirable)) - (gnus-summary-mark-article - (car expirable) gnus-canceled-mark))) - (setq expirable (cdr expirable)))))) - (gnus-message 6 "Expiring articles...done"))))) - -(defun gnus-summary-expire-articles-now () - "Expunge all expirable articles in the current group. -This means that *all* articles that are marked as expirable will be -deleted forever, right now." - (interactive) - (or gnus-expert-user - (gnus-yes-or-no-p - "Are you really, really, really sure you want to delete all these messages? ") - (error "Phew!")) - (gnus-summary-expire-articles t)) - -;; Suggested by Jack Vinson . -(defun gnus-summary-delete-article (&optional n) - "Delete the N next (mail) articles. -This command actually deletes articles. This is not a marking -command. The article will disappear forever from your life, never to -return. -If N is negative, delete backwards. -If N is nil and articles have been marked with the process mark, -delete these instead." - (interactive "P") - (unless (gnus-check-backend-function 'request-expire-articles - gnus-newsgroup-name) - (error "The current newsgroup does not support article deletion")) - (unless (gnus-check-server (gnus-find-method-for-group gnus-newsgroup-name)) - (error "Couldn't open server")) - ;; Compute the list of articles to delete. - (let ((articles (sort (copy-sequence (gnus-summary-work-articles n)) '<)) - not-deleted) - (if (and gnus-novice-user - (not (gnus-yes-or-no-p - (format "Do you really want to delete %s forever? " - (if (> (length articles) 1) - (format "these %s articles" (length articles)) - "this article"))))) - () - ;; Delete the articles. - (setq not-deleted (gnus-request-expire-articles - articles gnus-newsgroup-name 'force)) - (while articles - (gnus-summary-remove-process-mark (car articles)) - ;; The backend might not have been able to delete the article - ;; after all. - (unless (memq (car articles) not-deleted) - (gnus-summary-mark-article (car articles) gnus-canceled-mark)) - (setq articles (cdr articles))) - (when not-deleted - (gnus-message 4 "Couldn't delete articles %s" not-deleted))) - (gnus-summary-position-point) - (gnus-set-mode-line 'summary) - not-deleted)) - -(defun gnus-summary-edit-article (&optional force) - "Edit the current article. -This will have permanent effect only in mail groups. -If FORCE is non-nil, allow editing of articles even in read-only -groups." - (interactive "P") - (save-excursion - (set-buffer gnus-summary-buffer) - (let ((mail-parse-charset gnus-newsgroup-charset) - (mail-parse-ignored-charsets gnus-newsgroup-ignored-charsets)) - (gnus-set-global-variables) - (when (and (not force) - (gnus-group-read-only-p)) - (error "The current newsgroup does not support article editing")) - (gnus-summary-show-article t) - (gnus-article-edit-article - 'ignore - `(lambda (no-highlight) - (let ((mail-parse-charset ',gnus-newsgroup-charset) - (message-options message-options) - (message-options-set-recipient) - (mail-parse-ignored-charsets - ',gnus-newsgroup-ignored-charsets)) - (gnus-summary-edit-article-done - ,(or (mail-header-references gnus-current-headers) "") - ,(gnus-group-read-only-p) ,gnus-summary-buffer no-highlight))))))) - -(defalias 'gnus-summary-edit-article-postpone 'gnus-article-edit-exit) - -(defun gnus-summary-edit-article-done (&optional references read-only buffer - no-highlight) - "Make edits to the current article permanent." - (interactive) - (save-excursion - ;; The buffer restriction contains the entire article if it exists. - (when (article-goto-body) - (let ((lines (count-lines (point) (point-max))) - (length (- (point-max) (point))) - (case-fold-search t) - (body (copy-marker (point)))) - (goto-char (point-min)) - (when (re-search-forward "^content-length:[ \t]\\([0-9]+\\)" body t) - (delete-region (match-beginning 1) (match-end 1)) - (insert (number-to-string length))) - (goto-char (point-min)) - (when (re-search-forward - "^x-content-length:[ \t]\\([0-9]+\\)" body t) - (delete-region (match-beginning 1) (match-end 1)) - (insert (number-to-string length))) - (goto-char (point-min)) - (when (re-search-forward "^lines:[ \t]\\([0-9]+\\)" body t) - (delete-region (match-beginning 1) (match-end 1)) - (insert (number-to-string lines)))))) - ;; Replace the article. - (let ((buf (current-buffer))) - (with-temp-buffer - (insert-buffer-substring buf) - - (if (and (not read-only) - (not (gnus-request-replace-article - (cdr gnus-article-current) (car gnus-article-current) - (current-buffer) t))) - (error "Couldn't replace article") - ;; Update the summary buffer. - (if (and references - (equal (message-tokenize-header references " ") - (message-tokenize-header - (or (message-fetch-field "references") "") " "))) - ;; We only have to update this line. - (save-excursion - (save-restriction - (message-narrow-to-head) - (let ((head (buffer-string)) - header) - (with-temp-buffer - (insert (format "211 %d Article retrieved.\n" - (cdr gnus-article-current))) - (insert head) - (insert ".\n") - (let ((nntp-server-buffer (current-buffer))) - (setq header (car (gnus-get-newsgroup-headers - (save-excursion - (set-buffer gnus-summary-buffer) - gnus-newsgroup-dependencies) - t)))) - (save-excursion - (set-buffer gnus-summary-buffer) - (gnus-data-set-header - (gnus-data-find (cdr gnus-article-current)) - header) - (gnus-summary-update-article-line - (cdr gnus-article-current) header) - (if (gnus-summary-goto-subject - (cdr gnus-article-current) nil t) - (gnus-summary-update-secondary-mark - (cdr gnus-article-current)))))))) - ;; Update threads. - (set-buffer (or buffer gnus-summary-buffer)) - (gnus-summary-update-article (cdr gnus-article-current)) - (if (gnus-summary-goto-subject (cdr gnus-article-current) nil t) - (gnus-summary-update-secondary-mark - (cdr gnus-article-current)))) - ;; Prettify the article buffer again. - (unless no-highlight - (save-excursion - (set-buffer gnus-article-buffer) - ;;;!!! Fix this -- article should be rehighlighted. - ;;;(gnus-run-hooks 'gnus-article-display-hook) - (set-buffer gnus-original-article-buffer) - (gnus-request-article - (cdr gnus-article-current) - (car gnus-article-current) (current-buffer)))) - ;; Prettify the summary buffer line. - (when (gnus-visual-p 'summary-highlight 'highlight) - (gnus-run-hooks 'gnus-visual-mark-article-hook)))))) - -(defun gnus-summary-edit-wash (key) - "Perform editing command KEY in the article buffer." - (interactive - (list - (progn - (message "%s" (concat (this-command-keys) "- ")) - (read-char)))) - (message "") - (gnus-summary-edit-article) - (execute-kbd-macro (concat (this-command-keys) key)) - (gnus-article-edit-done)) - -;;; Respooling - -(defun gnus-summary-respool-query (&optional silent trace) - "Query where the respool algorithm would put this article." - (interactive) - (let (gnus-mark-article-hook) - (gnus-summary-select-article) - (save-excursion - (set-buffer gnus-original-article-buffer) - (save-restriction - (message-narrow-to-head) - (let ((groups (nnmail-article-group 'identity trace))) - (unless silent - (if groups - (message "This message would go to %s" - (mapconcat 'car groups ", ")) - (message "This message would go to no groups")) - groups)))))) - -(defun gnus-summary-respool-trace () - "Trace where the respool algorithm would put this article. -Display a buffer showing all fancy splitting patterns which matched." - (interactive) - (gnus-summary-respool-query nil t)) - -;; Summary marking commands. - -(defun gnus-summary-kill-same-subject-and-select (&optional unmark) - "Mark articles which has the same subject as read, and then select the next. -If UNMARK is positive, remove any kind of mark. -If UNMARK is negative, tick articles." - (interactive "P") - (when unmark - (setq unmark (prefix-numeric-value unmark))) - (let ((count - (gnus-summary-mark-same-subject - (gnus-summary-article-subject) unmark))) - ;; Select next unread article. If auto-select-same mode, should - ;; select the first unread article. - (gnus-summary-next-article t (and gnus-auto-select-same - (gnus-summary-article-subject))) - (gnus-message 7 "%d article%s marked as %s" - count (if (= count 1) " is" "s are") - (if unmark "unread" "read")))) - -(defun gnus-summary-kill-same-subject (&optional unmark) - "Mark articles which has the same subject as read. -If UNMARK is positive, remove any kind of mark. -If UNMARK is negative, tick articles." - (interactive "P") - (when unmark - (setq unmark (prefix-numeric-value unmark))) - (let ((count - (gnus-summary-mark-same-subject - (gnus-summary-article-subject) unmark))) - ;; If marked as read, go to next unread subject. - (when (null unmark) - ;; Go to next unread subject. - (gnus-summary-next-subject 1 t)) - (gnus-message 7 "%d articles are marked as %s" - count (if unmark "unread" "read")))) - -(defun gnus-summary-mark-same-subject (subject &optional unmark) - "Mark articles with same SUBJECT as read, and return marked number. -If optional argument UNMARK is positive, remove any kinds of marks. -If optional argument UNMARK is negative, mark articles as unread instead." - (let ((count 1)) - (save-excursion - (cond - ((null unmark) ; Mark as read. - (while (and - (progn - (gnus-summary-mark-article-as-read gnus-killed-mark) - (gnus-summary-show-thread) t) - (gnus-summary-find-subject subject)) - (setq count (1+ count)))) - ((> unmark 0) ; Tick. - (while (and - (progn - (gnus-summary-mark-article-as-unread gnus-ticked-mark) - (gnus-summary-show-thread) t) - (gnus-summary-find-subject subject)) - (setq count (1+ count)))) - (t ; Mark as unread. - (while (and - (progn - (gnus-summary-mark-article-as-unread gnus-unread-mark) - (gnus-summary-show-thread) t) - (gnus-summary-find-subject subject)) - (setq count (1+ count))))) - (gnus-set-mode-line 'summary) - ;; Return the number of marked articles. - count))) - -(defun gnus-summary-mark-as-processable (n &optional unmark) - "Set the process mark on the next N articles. -If N is negative, mark backward instead. If UNMARK is non-nil, remove -the process mark instead. The difference between N and the actual -number of articles marked is returned." - (interactive "P") - (if (and (null n) (gnus-region-active-p)) - (gnus-uu-mark-region (region-beginning) (region-end) unmark) - (setq n (prefix-numeric-value n)) - (let ((backward (< n 0)) - (n (abs n))) - (while (and - (> n 0) - (if unmark - (gnus-summary-remove-process-mark - (gnus-summary-article-number)) - (gnus-summary-set-process-mark (gnus-summary-article-number))) - (zerop (gnus-summary-next-subject (if backward -1 1) nil t))) - (setq n (1- n))) - (when (/= 0 n) - (gnus-message 7 "No more articles")) - (gnus-summary-recenter) - (gnus-summary-position-point) - n))) - -(defun gnus-summary-unmark-as-processable (n) - "Remove the process mark from the next N articles. -If N is negative, unmark backward instead. The difference between N and -the actual number of articles unmarked is returned." - (interactive "P") - (gnus-summary-mark-as-processable n t)) - -(defun gnus-summary-unmark-all-processable () - "Remove the process mark from all articles." - (interactive) - (save-excursion - (while gnus-newsgroup-processable - (gnus-summary-remove-process-mark (car gnus-newsgroup-processable)))) - (gnus-summary-position-point)) - -(defun gnus-summary-add-mark (article type) - "Mark ARTICLE with a mark of TYPE." - (let ((vtype (car (assq type gnus-article-mark-lists))) - var) - (if (not vtype) - (error "No such mark type: %s" type) - (setq var (intern (format "gnus-newsgroup-%s" type))) - (set var (cons article (symbol-value var))) - (if (memq type '(processable cached replied forwarded recent saved)) - (gnus-summary-update-secondary-mark article) - ;;; !!! This is bogus. We should find out what primary - ;;; !!! mark we want to set. - (gnus-summary-update-mark gnus-del-mark 'unread))))) - -(defun gnus-summary-mark-as-expirable (n) - "Mark N articles forward as expirable. -If N is negative, mark backward instead. The difference between N and -the actual number of articles marked is returned." - (interactive "p") - (gnus-summary-mark-forward n gnus-expirable-mark)) - -(defun gnus-summary-mark-article-as-replied (article) - "Mark ARTICLE as replied to and update the summary line. -ARTICLE can also be a list of articles." - (interactive (list (gnus-summary-article-number))) - (let ((articles (if (listp article) article (list article)))) - (dolist (article articles) - (push article gnus-newsgroup-replied) - (let ((buffer-read-only nil)) - (when (gnus-summary-goto-subject article nil t) - (gnus-summary-update-secondary-mark article)))))) - -(defun gnus-summary-mark-article-as-forwarded (article) - "Mark ARTICLE as forwarded and update the summary line. -ARTICLE can also be a list of articles." - (let ((articles (if (listp article) article (list article)))) - (dolist (article articles) - (push article gnus-newsgroup-forwarded) - (let ((buffer-read-only nil)) - (when (gnus-summary-goto-subject article nil t) - (gnus-summary-update-secondary-mark article)))))) - -(defun gnus-summary-set-bookmark (article) - "Set a bookmark in current article." - (interactive (list (gnus-summary-article-number))) - (when (or (not (get-buffer gnus-article-buffer)) - (not gnus-current-article) - (not gnus-article-current) - (not (equal gnus-newsgroup-name (car gnus-article-current)))) - (error "No current article selected")) - ;; Remove old bookmark, if one exists. - (let ((old (assq article gnus-newsgroup-bookmarks))) - (when old - (setq gnus-newsgroup-bookmarks - (delq old gnus-newsgroup-bookmarks)))) - ;; Set the new bookmark, which is on the form - ;; (article-number . line-number-in-body). - (push - (cons article - (save-excursion - (set-buffer gnus-article-buffer) - (count-lines - (min (point) - (save-excursion - (goto-char (point-min)) - (search-forward "\n\n" nil t) - (point))) - (point)))) - gnus-newsgroup-bookmarks) - (gnus-message 6 "A bookmark has been added to the current article.")) - -(defun gnus-summary-remove-bookmark (article) - "Remove the bookmark from the current article." - (interactive (list (gnus-summary-article-number))) - ;; Remove old bookmark, if one exists. - (let ((old (assq article gnus-newsgroup-bookmarks))) - (if old - (progn - (setq gnus-newsgroup-bookmarks - (delq old gnus-newsgroup-bookmarks)) - (gnus-message 6 "Removed bookmark.")) - (gnus-message 6 "No bookmark in current article.")))) - -;; Suggested by Daniel Quinlan . -(defun gnus-summary-mark-as-dormant (n) - "Mark N articles forward as dormant. -If N is negative, mark backward instead. The difference between N and -the actual number of articles marked is returned." - (interactive "p") - (gnus-summary-mark-forward n gnus-dormant-mark)) - -(defun gnus-summary-set-process-mark (article) - "Set the process mark on ARTICLE and update the summary line." - (setq gnus-newsgroup-processable - (cons article - (delq article gnus-newsgroup-processable))) - (when (gnus-summary-goto-subject article) - (gnus-summary-show-thread) - (gnus-summary-goto-subject article) - (gnus-summary-update-secondary-mark article))) - -(defun gnus-summary-remove-process-mark (article) - "Remove the process mark from ARTICLE and update the summary line." - (setq gnus-newsgroup-processable (delq article gnus-newsgroup-processable)) - (when (gnus-summary-goto-subject article) - (gnus-summary-show-thread) - (gnus-summary-goto-subject article) - (gnus-summary-update-secondary-mark article))) - -(defun gnus-summary-set-saved-mark (article) - "Set the process mark on ARTICLE and update the summary line." - (push article gnus-newsgroup-saved) - (when (gnus-summary-goto-subject article) - (gnus-summary-update-secondary-mark article))) - -(defun gnus-summary-mark-forward (n &optional mark no-expire) - "Mark N articles as read forwards. -If N is negative, mark backwards instead. Mark with MARK, ?r by default. -The difference between N and the actual number of articles marked is -returned. -Iff NO-EXPIRE, auto-expiry will be inhibited." - (interactive "p") - (gnus-summary-show-thread) - (let ((backward (< n 0)) - (gnus-summary-goto-unread - (and gnus-summary-goto-unread - (not (eq gnus-summary-goto-unread 'never)) - (not (memq mark (list gnus-unread-mark - gnus-ticked-mark gnus-dormant-mark))))) - (n (abs n)) - (mark (or mark gnus-del-mark))) - (while (and (> n 0) - (gnus-summary-mark-article nil mark no-expire) - (zerop (gnus-summary-next-subject - (if backward -1 1) - (and gnus-summary-goto-unread - (not (eq gnus-summary-goto-unread 'never))) - t))) - (setq n (1- n))) - (when (/= 0 n) - (gnus-message 7 "No more %sarticles" (if mark "" "unread "))) - (gnus-summary-recenter) - (gnus-summary-position-point) - (gnus-set-mode-line 'summary) - n)) - -(defun gnus-summary-mark-article-as-read (mark) - "Mark the current article quickly as read with MARK." - (let ((article (gnus-summary-article-number))) - (setq gnus-newsgroup-unreads (delq article gnus-newsgroup-unreads)) - (setq gnus-newsgroup-marked (delq article gnus-newsgroup-marked)) - (setq gnus-newsgroup-dormant (delq article gnus-newsgroup-dormant)) - (push (cons article mark) gnus-newsgroup-reads) - ;; Possibly remove from cache, if that is used. - (when gnus-use-cache - (gnus-cache-enter-remove-article article)) - ;; Allow the backend to change the mark. - (setq mark (gnus-request-update-mark gnus-newsgroup-name article mark)) - ;; Check for auto-expiry. - (when (and gnus-newsgroup-auto-expire - (memq mark gnus-auto-expirable-marks)) - (setq mark gnus-expirable-mark) - ;; Let the backend know about the mark change. - (setq mark (gnus-request-update-mark gnus-newsgroup-name article mark)) - (push article gnus-newsgroup-expirable)) - ;; Set the mark in the buffer. - (gnus-summary-update-mark mark 'unread) - t)) - -(defun gnus-summary-mark-article-as-unread (mark) - "Mark the current article quickly as unread with MARK." - (let* ((article (gnus-summary-article-number)) - (old-mark (gnus-summary-article-mark article))) - ;; Allow the backend to change the mark. - (setq mark (gnus-request-update-mark gnus-newsgroup-name article mark)) - (if (eq mark old-mark) - t - (if (<= article 0) - (progn - (gnus-error 1 "Can't mark negative article numbers") - nil) - (setq gnus-newsgroup-marked (delq article gnus-newsgroup-marked)) - (setq gnus-newsgroup-dormant (delq article gnus-newsgroup-dormant)) - (setq gnus-newsgroup-expirable (delq article gnus-newsgroup-expirable)) - (setq gnus-newsgroup-reads (delq article gnus-newsgroup-reads)) - (cond ((= mark gnus-ticked-mark) - (push article gnus-newsgroup-marked)) - ((= mark gnus-dormant-mark) - (push article gnus-newsgroup-dormant)) - (t - (push article gnus-newsgroup-unreads))) - (gnus-pull article gnus-newsgroup-reads) - - ;; See whether the article is to be put in the cache. - (and gnus-use-cache - (vectorp (gnus-summary-article-header article)) - (save-excursion - (gnus-cache-possibly-enter-article - gnus-newsgroup-name article - (gnus-summary-article-header article) - (= mark gnus-ticked-mark) - (= mark gnus-dormant-mark) (= mark gnus-unread-mark)))) - - ;; Fix the mark. - (gnus-summary-update-mark mark 'unread) - t)))) - -(defun gnus-summary-mark-article (&optional article mark no-expire) - "Mark ARTICLE with MARK. MARK can be any character. -Four MARK strings are reserved: `? ' (unread), `?!' (ticked), -`??' (dormant) and `?E' (expirable). -If MARK is nil, then the default character `?r' is used. -If ARTICLE is nil, then the article on the current line will be -marked. -Iff NO-EXPIRE, auto-expiry will be inhibited." - ;; The mark might be a string. - (when (stringp mark) - (setq mark (aref mark 0))) - ;; If no mark is given, then we check auto-expiring. - (when (null mark) - (setq mark gnus-del-mark)) - (when (and (not no-expire) - gnus-newsgroup-auto-expire - (memq mark gnus-auto-expirable-marks)) - (setq mark gnus-expirable-mark)) - (let ((article (or article (gnus-summary-article-number))) - (old-mark (gnus-summary-article-mark article))) - ;; Allow the backend to change the mark. - (setq mark (gnus-request-update-mark gnus-newsgroup-name article mark)) - (if (eq mark old-mark) - t - (unless article - (error "No article on current line")) - (if (not (if (or (= mark gnus-unread-mark) - (= mark gnus-ticked-mark) - (= mark gnus-dormant-mark)) - (gnus-mark-article-as-unread article mark) - (gnus-mark-article-as-read article mark))) - t - ;; See whether the article is to be put in the cache. - (and gnus-use-cache - (not (= mark gnus-canceled-mark)) - (vectorp (gnus-summary-article-header article)) - (save-excursion - (gnus-cache-possibly-enter-article - gnus-newsgroup-name article - (gnus-summary-article-header article) - (= mark gnus-ticked-mark) - (= mark gnus-dormant-mark) (= mark gnus-unread-mark)))) - - (when (gnus-summary-goto-subject article nil t) - (let ((buffer-read-only nil)) - (gnus-summary-show-thread) - ;; Fix the mark. - (gnus-summary-update-mark mark 'unread) - t)))))) - -(defun gnus-summary-update-secondary-mark (article) - "Update the secondary (read, process, cache) mark." - (gnus-summary-update-mark - (cond ((memq article gnus-newsgroup-processable) - gnus-process-mark) - ((memq article gnus-newsgroup-cached) - gnus-cached-mark) - ((memq article gnus-newsgroup-replied) - gnus-replied-mark) - ((memq article gnus-newsgroup-forwarded) - gnus-forwarded-mark) - ((memq article gnus-newsgroup-saved) - gnus-saved-mark) - ((memq article gnus-newsgroup-recent) - gnus-recent-mark) - ((memq article gnus-newsgroup-unseen) - gnus-unseen-mark) - (t gnus-no-mark)) - 'replied) - (when (gnus-visual-p 'summary-highlight 'highlight) - (gnus-run-hooks 'gnus-summary-update-hook)) - t) - -(defun gnus-summary-update-mark (mark type) - (let ((forward (cdr (assq type gnus-summary-mark-positions))) - (buffer-read-only nil)) - (re-search-backward "[\n\r]" (gnus-point-at-bol) 'move-to-limit) - (when forward - (when (looking-at "\r") - (incf forward)) - (when (<= (+ forward (point)) (point-max)) - ;; Go to the right position on the line. - (goto-char (+ forward (point))) - ;; Replace the old mark with the new mark. - (subst-char-in-region (point) (1+ (point)) (char-after) mark) - ;; Optionally update the marks by some user rule. - (when (eq type 'unread) - (gnus-data-set-mark - (gnus-data-find (gnus-summary-article-number)) mark) - (gnus-summary-update-line (eq mark gnus-unread-mark))))))) - -(defun gnus-mark-article-as-read (article &optional mark) - "Enter ARTICLE in the pertinent lists and remove it from others." - ;; Make the article expirable. - (let ((mark (or mark gnus-del-mark))) - (if (= mark gnus-expirable-mark) - (push article gnus-newsgroup-expirable) - (setq gnus-newsgroup-expirable (delq article gnus-newsgroup-expirable))) - ;; Remove from unread and marked lists. - (setq gnus-newsgroup-unreads (delq article gnus-newsgroup-unreads)) - (setq gnus-newsgroup-marked (delq article gnus-newsgroup-marked)) - (setq gnus-newsgroup-dormant (delq article gnus-newsgroup-dormant)) - (push (cons article mark) gnus-newsgroup-reads) - ;; Possibly remove from cache, if that is used. - (when gnus-use-cache - (gnus-cache-enter-remove-article article)) - t)) - -(defun gnus-mark-article-as-unread (article &optional mark) - "Enter ARTICLE in the pertinent lists and remove it from others." - (let ((mark (or mark gnus-ticked-mark))) - (if (<= article 0) - (progn - (gnus-error 1 "Can't mark negative article numbers") - nil) - (setq gnus-newsgroup-marked (delq article gnus-newsgroup-marked) - gnus-newsgroup-dormant (delq article gnus-newsgroup-dormant) - gnus-newsgroup-expirable (delq article gnus-newsgroup-expirable) - gnus-newsgroup-unreads (delq article gnus-newsgroup-unreads)) - - ;; Unsuppress duplicates? - (when gnus-suppress-duplicates - (gnus-dup-unsuppress-article article)) - - (cond ((= mark gnus-ticked-mark) - (push article gnus-newsgroup-marked)) - ((= mark gnus-dormant-mark) - (push article gnus-newsgroup-dormant)) - (t - (push article gnus-newsgroup-unreads))) - (gnus-pull article gnus-newsgroup-reads) - t))) - -(defalias 'gnus-summary-mark-as-unread-forward - 'gnus-summary-tick-article-forward) -(make-obsolete 'gnus-summary-mark-as-unread-forward - 'gnus-summary-tick-article-forward) -(defun gnus-summary-tick-article-forward (n) - "Tick N articles forwards. -If N is negative, tick backwards instead. -The difference between N and the number of articles ticked is returned." - (interactive "p") - (gnus-summary-mark-forward n gnus-ticked-mark)) - -(defalias 'gnus-summary-mark-as-unread-backward - 'gnus-summary-tick-article-backward) -(make-obsolete 'gnus-summary-mark-as-unread-backward - 'gnus-summary-tick-article-backward) -(defun gnus-summary-tick-article-backward (n) - "Tick N articles backwards. -The difference between N and the number of articles ticked is returned." - (interactive "p") - (gnus-summary-mark-forward (- n) gnus-ticked-mark)) - -(defalias 'gnus-summary-mark-as-unread 'gnus-summary-tick-article) -(make-obsolete 'gnus-summary-mark-as-unread 'gnus-summary-tick-article) -(defun gnus-summary-tick-article (&optional article clear-mark) - "Mark current article as unread. -Optional 1st argument ARTICLE specifies article number to be marked as unread. -Optional 2nd argument CLEAR-MARK remove any kinds of mark." - (interactive) - (gnus-summary-mark-article article (if clear-mark gnus-unread-mark - gnus-ticked-mark))) - -(defun gnus-summary-mark-as-read-forward (n) - "Mark N articles as read forwards. -If N is negative, mark backwards instead. -The difference between N and the actual number of articles marked is -returned." - (interactive "p") - (gnus-summary-mark-forward n gnus-del-mark gnus-inhibit-user-auto-expire)) - -(defun gnus-summary-mark-as-read-backward (n) - "Mark the N articles as read backwards. -The difference between N and the actual number of articles marked is -returned." - (interactive "p") - (gnus-summary-mark-forward - (- n) gnus-del-mark gnus-inhibit-user-auto-expire)) - -(defun gnus-summary-mark-as-read (&optional article mark) - "Mark current article as read. -ARTICLE specifies the article to be marked as read. -MARK specifies a string to be inserted at the beginning of the line." - (gnus-summary-mark-article article mark)) - -(defun gnus-summary-clear-mark-forward (n) - "Clear marks from N articles forward. -If N is negative, clear backward instead. -The difference between N and the number of marks cleared is returned." - (interactive "p") - (gnus-summary-mark-forward n gnus-unread-mark)) - -(defun gnus-summary-clear-mark-backward (n) - "Clear marks from N articles backward. -The difference between N and the number of marks cleared is returned." - (interactive "p") - (gnus-summary-mark-forward (- n) gnus-unread-mark)) - -(defun gnus-summary-mark-unread-as-read () - "Intended to be used by `gnus-summary-mark-article-hook'." - (when (memq gnus-current-article gnus-newsgroup-unreads) - (gnus-summary-mark-article gnus-current-article gnus-read-mark))) - -(defun gnus-summary-mark-read-and-unread-as-read () - "Intended to be used by `gnus-summary-mark-article-hook'." - (let ((mark (gnus-summary-article-mark))) - (when (or (gnus-unread-mark-p mark) - (gnus-read-mark-p mark)) - (gnus-summary-mark-article gnus-current-article gnus-read-mark)))) - -(defun gnus-summary-mark-unread-as-ticked () - "Intended to be used by `gnus-summary-mark-article-hook'." - (when (memq gnus-current-article gnus-newsgroup-unreads) - (gnus-summary-mark-article gnus-current-article gnus-ticked-mark))) - -(defun gnus-summary-mark-region-as-read (point mark all) - "Mark all unread articles between point and mark as read. -If given a prefix, mark all articles between point and mark as read, -even ticked and dormant ones." - (interactive "r\nP") - (save-excursion - (let (article) - (goto-char point) - (beginning-of-line) - (while (and - (< (point) mark) - (progn - (when (or all - (memq (setq article (gnus-summary-article-number)) - gnus-newsgroup-unreads)) - (gnus-summary-mark-article article gnus-del-mark)) - t) - (gnus-summary-find-next)))))) - -(defun gnus-summary-mark-below (score mark) - "Mark articles with score less than SCORE with MARK." - (interactive "P\ncMark: ") - (setq score (if score - (prefix-numeric-value score) - (or gnus-summary-default-score 0))) - (save-excursion - (set-buffer gnus-summary-buffer) - (goto-char (point-min)) - (while - (progn - (and (< (gnus-summary-article-score) score) - (gnus-summary-mark-article nil mark)) - (gnus-summary-find-next))))) - -(defun gnus-summary-kill-below (&optional score) - "Mark articles with score below SCORE as read." - (interactive "P") - (gnus-summary-mark-below score gnus-killed-mark)) - -(defun gnus-summary-clear-above (&optional score) - "Clear all marks from articles with score above SCORE." - (interactive "P") - (gnus-summary-mark-above score gnus-unread-mark)) - -(defun gnus-summary-tick-above (&optional score) - "Tick all articles with score above SCORE." - (interactive "P") - (gnus-summary-mark-above score gnus-ticked-mark)) - -(defun gnus-summary-mark-above (score mark) - "Mark articles with score over SCORE with MARK." - (interactive "P\ncMark: ") - (setq score (if score - (prefix-numeric-value score) - (or gnus-summary-default-score 0))) - (save-excursion - (set-buffer gnus-summary-buffer) - (goto-char (point-min)) - (while (and (progn - (when (> (gnus-summary-article-score) score) - (gnus-summary-mark-article nil mark)) - t) - (gnus-summary-find-next))))) - -;; Suggested by Daniel Quinlan . -(defalias 'gnus-summary-show-all-expunged 'gnus-summary-limit-include-expunged) -(defun gnus-summary-limit-include-expunged (&optional no-error) - "Display all the hidden articles that were expunged for low scores." - (interactive) - (let ((buffer-read-only nil)) - (let ((scored gnus-newsgroup-scored) - headers h) - (while scored - (unless (gnus-summary-article-header (caar scored)) - (and (setq h (gnus-number-to-header (caar scored))) - (< (cdar scored) gnus-summary-expunge-below) - (push h headers))) - (setq scored (cdr scored))) - (if (not headers) - (when (not no-error) - (error "No expunged articles hidden")) - (goto-char (point-min)) - (push gnus-newsgroup-limit gnus-newsgroup-limits) - (setq gnus-newsgroup-limit (copy-sequence gnus-newsgroup-limit)) - (mapcar (lambda (x) (push (mail-header-number x) - gnus-newsgroup-limit)) - headers) - (gnus-summary-prepare-unthreaded (nreverse headers)) - (goto-char (point-min)) - (gnus-summary-position-point) - t)))) - -(defun gnus-summary-catchup (&optional all quietly to-here not-mark reverse) - "Mark all unread articles in this newsgroup as read. -If prefix argument ALL is non-nil, ticked and dormant articles will -also be marked as read. -If QUIETLY is non-nil, no questions will be asked. -If TO-HERE is non-nil, it should be a point in the buffer. All -articles before (after, if REVERSE is set) this point will be marked as read. -Note that this function will only catch up the unread article -in the current summary buffer limitation. -The number of articles marked as read is returned." - (interactive "P") - (prog1 - (save-excursion - (when (or quietly - (not gnus-interactive-catchup) ;Without confirmation? - gnus-expert-user - (gnus-y-or-n-p - (if all - "Mark absolutely all articles as read? " - "Mark all unread articles as read? "))) - (if (and not-mark - (not gnus-newsgroup-adaptive) - (not gnus-newsgroup-auto-expire) - (not gnus-suppress-duplicates) - (or (not gnus-use-cache) - (eq gnus-use-cache 'passive))) - (progn - (when all - (setq gnus-newsgroup-marked nil - gnus-newsgroup-dormant nil)) - (setq gnus-newsgroup-unreads gnus-newsgroup-downloadable)) - ;; We actually mark all articles as canceled, which we - ;; have to do when using auto-expiry or adaptive scoring. - (gnus-summary-show-all-threads) - (if (and to-here reverse) - (progn - (goto-char to-here) - (while (and - (gnus-summary-mark-article-as-read gnus-catchup-mark) - (gnus-summary-find-next (not all) nil nil t)))) - (when (gnus-summary-first-subject (not all) t) - (while (and - (if to-here (< (point) to-here) t) - (gnus-summary-mark-article-as-read gnus-catchup-mark) - (gnus-summary-find-next (not all) nil nil t))))) - (gnus-set-mode-line 'summary)) - t)) - (gnus-summary-position-point))) - -(defun gnus-summary-catchup-to-here (&optional all) - "Mark all unticked articles before the current one as read. -If ALL is non-nil, also mark ticked and dormant articles as read." - (interactive "P") - (save-excursion - (gnus-save-hidden-threads - (let ((beg (point))) - ;; We check that there are unread articles. - (when (or all (gnus-summary-find-prev)) - (gnus-summary-catchup all t beg))))) - (gnus-summary-position-point)) - -(defun gnus-summary-catchup-from-here (&optional all) - "Mark all unticked articles after the current one as read. -If ALL is non-nil, also mark ticked and dormant articles as read." - (interactive "P") - (save-excursion - (gnus-save-hidden-threads - (let ((beg (point))) - ;; We check that there are unread articles. - (when (or all (gnus-summary-find-next)) - (gnus-summary-catchup all t beg nil t))))) - (gnus-summary-position-point)) - -(defun gnus-summary-catchup-all (&optional quietly) - "Mark all articles in this newsgroup as read." - (interactive "P") - (gnus-summary-catchup t quietly)) - -(defun gnus-summary-catchup-and-exit (&optional all quietly) - "Mark all unread articles in this group as read, then exit. -If prefix argument ALL is non-nil, all articles are marked as read. -If QUIETLY is non-nil, no questions will be asked." - (interactive "P") - (when (gnus-summary-catchup all quietly nil 'fast) - ;; Select next newsgroup or exit. - (if (and (not (gnus-group-quit-config gnus-newsgroup-name)) - (eq gnus-auto-select-next 'quietly)) - (gnus-summary-next-group nil) - (gnus-summary-exit)))) - -(defun gnus-summary-catchup-all-and-exit (&optional quietly) - "Mark all articles in this newsgroup as read, and then exit." - (interactive "P") - (gnus-summary-catchup-and-exit t quietly)) - -(defun gnus-summary-catchup-and-goto-next-group (&optional all) - "Mark all articles in this group as read and select the next group. -If given a prefix, mark all articles, unread as well as ticked, as -read." - (interactive "P") - (save-excursion - (gnus-summary-catchup all)) - (gnus-summary-next-group)) - -;;; -;;; with article -;;; - -(defmacro gnus-with-article (article &rest forms) - "Select ARTICLE and perform FORMS in the original article buffer. -Then replace the article with the result." - `(progn - ;; We don't want the article to be marked as read. - (let (gnus-mark-article-hook) - (gnus-summary-select-article t t nil ,article)) - (set-buffer gnus-original-article-buffer) - ,@forms - (if (not (gnus-check-backend-function - 'request-replace-article (car gnus-article-current))) - (gnus-message 5 "Read-only group; not replacing") - (unless (gnus-request-replace-article - ,article (car gnus-article-current) - (current-buffer) t) - (error "Couldn't replace article"))) - ;; The cache and backlog have to be flushed somewhat. - (when gnus-keep-backlog - (gnus-backlog-remove-article - (car gnus-article-current) (cdr gnus-article-current))) - (when gnus-use-cache - (gnus-cache-update-article - (car gnus-article-current) (cdr gnus-article-current))))) - -(put 'gnus-with-article 'lisp-indent-function 1) -(put 'gnus-with-article 'edebug-form-spec '(form body)) - -;; Thread-based commands. - -(defun gnus-summary-articles-in-thread (&optional article) - "Return a list of all articles in the current thread. -If ARTICLE is non-nil, return all articles in the thread that starts -with that article." - (let* ((article (or article (gnus-summary-article-number))) - (data (gnus-data-find-list article)) - (top-level (gnus-data-level (car data))) - (top-subject - (cond ((null gnus-thread-operation-ignore-subject) - (gnus-simplify-subject-re - (mail-header-subject (gnus-data-header (car data))))) - ((eq gnus-thread-operation-ignore-subject 'fuzzy) - (gnus-simplify-subject-fuzzy - (mail-header-subject (gnus-data-header (car data))))) - (t nil))) - (end-point (save-excursion - (if (gnus-summary-go-to-next-thread) - (point) (point-max)))) - articles) - (while (and data - (< (gnus-data-pos (car data)) end-point)) - (when (or (not top-subject) - (string= top-subject - (if (eq gnus-thread-operation-ignore-subject 'fuzzy) - (gnus-simplify-subject-fuzzy - (mail-header-subject - (gnus-data-header (car data)))) - (gnus-simplify-subject-re - (mail-header-subject - (gnus-data-header (car data))))))) - (push (gnus-data-number (car data)) articles)) - (unless (and (setq data (cdr data)) - (> (gnus-data-level (car data)) top-level)) - (setq data nil))) - ;; Return the list of articles. - (nreverse articles))) - -(defun gnus-summary-rethread-current () - "Rethread the thread the current article is part of." - (interactive) - (let* ((gnus-show-threads t) - (article (gnus-summary-article-number)) - (id (mail-header-id (gnus-summary-article-header))) - (gnus-newsgroup-threads (list (gnus-id-to-thread (gnus-root-id id))))) - (unless id - (error "No article on the current line")) - (gnus-rebuild-thread id) - (gnus-summary-goto-subject article))) - -(defun gnus-summary-reparent-thread () - "Make the current article child of the marked (or previous) article. - -Note that the re-threading will only work if `gnus-thread-ignore-subject' -is non-nil or the Subject: of both articles are the same." - (interactive) - (unless (not (gnus-group-read-only-p)) - (error "The current newsgroup does not support article editing")) - (unless (<= (length gnus-newsgroup-processable) 1) - (error "No more than one article may be marked")) - (save-window-excursion - (let ((gnus-article-buffer " *reparent*") - (current-article (gnus-summary-article-number)) - ;; First grab the marked article, otherwise one line up. - (parent-article (if (not (null gnus-newsgroup-processable)) - (car gnus-newsgroup-processable) - (save-excursion - (if (eq (forward-line -1) 0) - (gnus-summary-article-number) - (error "Beginning of summary buffer")))))) - (unless (not (eq current-article parent-article)) - (error "An article may not be self-referential")) - (let ((message-id (mail-header-id - (gnus-summary-article-header parent-article)))) - (unless (and message-id (not (equal message-id ""))) - (error "No message-id in desired parent")) - (gnus-with-article current-article - (save-restriction - (goto-char (point-min)) - (message-narrow-to-head) - (if (re-search-forward "^References: " nil t) - (progn - (re-search-forward "^[^ \t]" nil t) - (forward-line -1) - (end-of-line) - (insert " " message-id)) - (insert "References: " message-id "\n")))) - (set-buffer gnus-summary-buffer) - (gnus-summary-unmark-all-processable) - (gnus-summary-update-article current-article) - (if (gnus-summary-goto-subject (cdr gnus-article-current) nil t) - (gnus-summary-update-secondary-mark (cdr gnus-article-current))) - (gnus-summary-rethread-current) - (gnus-message 3 "Article %d is now the child of article %d" - current-article parent-article))))) - -(defun gnus-summary-toggle-threads (&optional arg) - "Toggle showing conversation threads. -If ARG is positive number, turn showing conversation threads on." - (interactive "P") - (let ((current (or (gnus-summary-article-number) gnus-newsgroup-end))) - (setq gnus-show-threads - (if (null arg) (not gnus-show-threads) - (> (prefix-numeric-value arg) 0))) - (gnus-summary-prepare) - (gnus-summary-goto-subject current) - (gnus-message 6 "Threading is now %s" (if gnus-show-threads "on" "off")) - (gnus-summary-position-point))) - -(defun gnus-summary-show-all-threads () - "Show all threads." - (interactive) - (save-excursion - (let ((buffer-read-only nil)) - (subst-char-in-region (point-min) (point-max) ?\^M ?\n t))) - (gnus-summary-position-point)) - -(defun gnus-summary-show-thread () - "Show thread subtrees. -Returns nil if no thread was there to be shown." - (interactive) - (let ((buffer-read-only nil) - (orig (point)) - ;; first goto end then to beg, to have point at beg after let - (end (progn (end-of-line) (point))) - (beg (progn (beginning-of-line) (point)))) - (prog1 - ;; Any hidden lines here? - (search-forward "\r" end t) - (subst-char-in-region beg end ?\^M ?\n t) - (goto-char orig) - (gnus-summary-position-point)))) - -(defun gnus-summary-hide-all-threads () - "Hide all thread subtrees." - (interactive) - (save-excursion - (goto-char (point-min)) - (gnus-summary-hide-thread) - (while (zerop (gnus-summary-next-thread 1 t)) - (gnus-summary-hide-thread))) - (gnus-summary-position-point)) - -(defun gnus-summary-hide-thread () - "Hide thread subtrees. -Returns nil if no threads were there to be hidden." - (interactive) - (let ((buffer-read-only nil) - (start (point)) - (article (gnus-summary-article-number))) - (goto-char start) - ;; Go forward until either the buffer ends or the subthread - ;; ends. - (when (and (not (eobp)) - (or (zerop (gnus-summary-next-thread 1 t)) - (goto-char (point-max)))) - (prog1 - (if (and (> (point) start) - (search-backward "\n" start t)) - (progn - (subst-char-in-region start (point) ?\n ?\^M) - (gnus-summary-goto-subject article)) - (goto-char start) - nil))))) - -(defun gnus-summary-go-to-next-thread (&optional previous) - "Go to the same level (or less) next thread. -If PREVIOUS is non-nil, go to previous thread instead. -Return the article number moved to, or nil if moving was impossible." - (let ((level (gnus-summary-thread-level)) - (way (if previous -1 1)) - (beg (point))) - (forward-line way) - (while (and (not (eobp)) - (< level (gnus-summary-thread-level))) - (forward-line way)) - (if (eobp) - (progn - (goto-char beg) - nil) - (setq beg (point)) - (prog1 - (gnus-summary-article-number) - (goto-char beg))))) - -(defun gnus-summary-next-thread (n &optional silent) - "Go to the same level next N'th thread. -If N is negative, search backward instead. -Returns the difference between N and the number of skips actually -done. - -If SILENT, don't output messages." - (interactive "p") - (let ((backward (< n 0)) - (n (abs n))) - (while (and (> n 0) - (gnus-summary-go-to-next-thread backward)) - (decf n)) - (unless silent - (gnus-summary-position-point)) - (when (and (not silent) (/= 0 n)) - (gnus-message 7 "No more threads")) - n)) - -(defun gnus-summary-prev-thread (n) - "Go to the same level previous N'th thread. -Returns the difference between N and the number of skips actually -done." - (interactive "p") - (gnus-summary-next-thread (- n))) - -(defun gnus-summary-go-down-thread () - "Go down one level in the current thread." - (let ((children (gnus-summary-article-children))) - (when children - (gnus-summary-goto-subject (car children))))) - -(defun gnus-summary-go-up-thread () - "Go up one level in the current thread." - (let ((parent (gnus-summary-article-parent))) - (when parent - (gnus-summary-goto-subject parent)))) - -(defun gnus-summary-down-thread (n) - "Go down thread N steps. -If N is negative, go up instead. -Returns the difference between N and how many steps down that were -taken." - (interactive "p") - (let ((up (< n 0)) - (n (abs n))) - (while (and (> n 0) - (if up (gnus-summary-go-up-thread) - (gnus-summary-go-down-thread))) - (setq n (1- n))) - (gnus-summary-position-point) - (when (/= 0 n) - (gnus-message 7 "Can't go further")) - n)) - -(defun gnus-summary-up-thread (n) - "Go up thread N steps. -If N is negative, go down instead. -Returns the difference between N and how many steps down that were -taken." - (interactive "p") - (gnus-summary-down-thread (- n))) - -(defun gnus-summary-top-thread () - "Go to the top of the thread." - (interactive) - (while (gnus-summary-go-up-thread)) - (gnus-summary-article-number)) - -(defun gnus-summary-kill-thread (&optional unmark) - "Mark articles under current thread as read. -If the prefix argument is positive, remove any kinds of marks. -If the prefix argument is negative, tick articles instead." - (interactive "P") - (when unmark - (setq unmark (prefix-numeric-value unmark))) - (let ((articles (gnus-summary-articles-in-thread))) - (save-excursion - ;; Expand the thread. - (gnus-summary-show-thread) - ;; Mark all the articles. - (while articles - (gnus-summary-goto-subject (car articles)) - (cond ((null unmark) - (gnus-summary-mark-article-as-read gnus-killed-mark)) - ((> unmark 0) - (gnus-summary-mark-article-as-unread gnus-unread-mark)) - (t - (gnus-summary-mark-article-as-unread gnus-ticked-mark))) - (setq articles (cdr articles)))) - ;; Hide killed subtrees. - (and (null unmark) - gnus-thread-hide-killed - (gnus-summary-hide-thread)) - ;; If marked as read, go to next unread subject. - (when (null unmark) - ;; Go to next unread subject. - (gnus-summary-next-subject 1 t))) - (gnus-set-mode-line 'summary)) - -;; Summary sorting commands - -(defun gnus-summary-sort-by-number (&optional reverse) - "Sort the summary buffer by article number. -Argument REVERSE means reverse order." - (interactive "P") - (gnus-summary-sort 'number reverse)) - -(defun gnus-summary-sort-by-author (&optional reverse) - "Sort the summary buffer by author name alphabetically. -If `case-fold-search' is non-nil, case of letters is ignored. -Argument REVERSE means reverse order." - (interactive "P") - (gnus-summary-sort 'author reverse)) - -(defun gnus-summary-sort-by-subject (&optional reverse) - "Sort the summary buffer by subject alphabetically. `Re:'s are ignored. -If `case-fold-search' is non-nil, case of letters is ignored. -Argument REVERSE means reverse order." - (interactive "P") - (gnus-summary-sort 'subject reverse)) - -(defun gnus-summary-sort-by-date (&optional reverse) - "Sort the summary buffer by date. -Argument REVERSE means reverse order." - (interactive "P") - (gnus-summary-sort 'date reverse)) - -(defun gnus-summary-sort-by-score (&optional reverse) - "Sort the summary buffer by score. -Argument REVERSE means reverse order." - (interactive "P") - (gnus-summary-sort 'score reverse)) - -(defun gnus-summary-sort-by-lines (&optional reverse) - "Sort the summary buffer by the number of lines. -Argument REVERSE means reverse order." - (interactive "P") - (gnus-summary-sort 'lines reverse)) - -(defun gnus-summary-sort-by-chars (&optional reverse) - "Sort the summary buffer by article length. -Argument REVERSE means reverse order." - (interactive "P") - (gnus-summary-sort 'chars reverse)) - -(defun gnus-summary-sort-by-original (&optional reverse) - "Sort the summary buffer using the default sorting method. -Argument REVERSE means reverse order." - (interactive "P") - (let* ((buffer-read-only) - (gnus-summary-prepare-hook nil)) - ;; We do the sorting by regenerating the threads. - (gnus-summary-prepare) - ;; Hide subthreads if needed. - (when (and gnus-show-threads gnus-thread-hide-subtree) - (gnus-summary-hide-all-threads)))) - -(defun gnus-summary-sort (predicate reverse) - "Sort summary buffer by PREDICATE. REVERSE means reverse order." - (let* ((thread (intern (format "gnus-thread-sort-by-%s" predicate))) - (article (intern (format "gnus-article-sort-by-%s" predicate))) - (gnus-thread-sort-functions - (if (not reverse) - thread - `(lambda (t1 t2) - (,thread t2 t1)))) - (gnus-sort-gathered-threads-function - gnus-thread-sort-functions) - (gnus-article-sort-functions - (if (not reverse) - article - `(lambda (t1 t2) - (,article t2 t1)))) - (buffer-read-only) - (gnus-summary-prepare-hook nil)) - ;; We do the sorting by regenerating the threads. - (gnus-summary-prepare) - ;; Hide subthreads if needed. - (when (and gnus-show-threads gnus-thread-hide-subtree) - (gnus-summary-hide-all-threads)))) - -;; Summary saving commands. - -(defun gnus-summary-save-article (&optional n not-saved) - "Save the current article using the default saver function. -If N is a positive number, save the N next articles. -If N is a negative number, save the N previous articles. -If N is nil and any articles have been marked with the process mark, -save those articles instead. -The variable `gnus-default-article-saver' specifies the saver function." - (interactive "P") - (let* ((articles (gnus-summary-work-articles n)) - (save-buffer (save-excursion - (nnheader-set-temp-buffer " *Gnus Save*"))) - (num (length articles)) - header file) - (dolist (article articles) - (setq header (gnus-summary-article-header article)) - (if (not (vectorp header)) - ;; This is a pseudo-article. - (if (assq 'name header) - (gnus-copy-file (cdr (assq 'name header))) - (gnus-message 1 "Article %d is unsaveable" article)) - ;; This is a real article. - (save-window-excursion - (gnus-summary-select-article t nil nil article)) - (save-excursion - (set-buffer save-buffer) - (erase-buffer) - (insert-buffer-substring gnus-original-article-buffer)) - (setq file (gnus-article-save save-buffer file num)) - (gnus-summary-remove-process-mark article) - (unless not-saved - (gnus-summary-set-saved-mark article)))) - (gnus-kill-buffer save-buffer) - (gnus-summary-position-point) - (gnus-set-mode-line 'summary) - n)) - -(defun gnus-summary-pipe-output (&optional arg) - "Pipe the current article to a subprocess. -If N is a positive number, pipe the N next articles. -If N is a negative number, pipe the N previous articles. -If N is nil and any articles have been marked with the process mark, -pipe those articles instead." - (interactive "P") - (require 'gnus-art) - (let ((gnus-default-article-saver 'gnus-summary-save-in-pipe)) - (gnus-summary-save-article arg t)) - (let ((buffer (get-buffer "*Shell Command Output*"))) - (if (and buffer - (with-current-buffer buffer (> (point-max) (point-min)))) - (gnus-configure-windows 'pipe)))) - -(defun gnus-summary-save-article-mail (&optional arg) - "Append the current article to an mail file. -If N is a positive number, save the N next articles. -If N is a negative number, save the N previous articles. -If N is nil and any articles have been marked with the process mark, -save those articles instead." - (interactive "P") - (require 'gnus-art) - (let ((gnus-default-article-saver 'gnus-summary-save-in-mail)) - (gnus-summary-save-article arg))) - -(defun gnus-summary-save-article-rmail (&optional arg) - "Append the current article to an rmail file. -If N is a positive number, save the N next articles. -If N is a negative number, save the N previous articles. -If N is nil and any articles have been marked with the process mark, -save those articles instead." - (interactive "P") - (require 'gnus-art) - (let ((gnus-default-article-saver 'gnus-summary-save-in-rmail)) - (gnus-summary-save-article arg))) - -(defun gnus-summary-save-article-file (&optional arg) - "Append the current article to a file. -If N is a positive number, save the N next articles. -If N is a negative number, save the N previous articles. -If N is nil and any articles have been marked with the process mark, -save those articles instead." - (interactive "P") - (require 'gnus-art) - (let ((gnus-default-article-saver 'gnus-summary-save-in-file)) - (gnus-summary-save-article arg))) - -(defun gnus-summary-write-article-file (&optional arg) - "Write the current article to a file, deleting the previous file. -If N is a positive number, save the N next articles. -If N is a negative number, save the N previous articles. -If N is nil and any articles have been marked with the process mark, -save those articles instead." - (interactive "P") - (require 'gnus-art) - (let ((gnus-default-article-saver 'gnus-summary-write-to-file)) - (gnus-summary-save-article arg))) - -(defun gnus-summary-save-article-body-file (&optional arg) - "Append the current article body to a file. -If N is a positive number, save the N next articles. -If N is a negative number, save the N previous articles. -If N is nil and any articles have been marked with the process mark, -save those articles instead." - (interactive "P") - (require 'gnus-art) - (let ((gnus-default-article-saver 'gnus-summary-save-body-in-file)) - (gnus-summary-save-article arg))) - -(defun gnus-summary-pipe-message (program) - "Pipe the current article through PROGRAM." - (interactive "sProgram: ") - (gnus-summary-select-article) - (let ((mail-header-separator "")) - (gnus-eval-in-buffer-window gnus-article-buffer - (save-restriction - (widen) - (let ((start (window-start)) - buffer-read-only) - (message-pipe-buffer-body program) - (set-window-start (get-buffer-window (current-buffer)) start)))))) - -(defun gnus-get-split-value (methods) - "Return a value based on the split METHODS." - (let (split-name method result match) - (when methods - (save-excursion - (set-buffer gnus-original-article-buffer) - (save-restriction - (nnheader-narrow-to-headers) - (while (and methods (not split-name)) - (goto-char (point-min)) - (setq method (pop methods)) - (setq match (car method)) - (when (cond - ((stringp match) - ;; Regular expression. - (ignore-errors - (re-search-forward match nil t))) - ((gnus-functionp match) - ;; Function. - (save-restriction - (widen) - (setq result (funcall match gnus-newsgroup-name)))) - ((consp match) - ;; Form. - (save-restriction - (widen) - (setq result (eval match))))) - (setq split-name (cdr method)) - (cond ((stringp result) - (push (expand-file-name - result gnus-article-save-directory) - split-name)) - ((consp result) - (setq split-name (append result split-name))))))))) - (nreverse split-name))) - -(defun gnus-valid-move-group-p (group) - (and (boundp group) - (symbol-name group) - (symbol-value group) - (gnus-get-function (gnus-find-method-for-group - (symbol-name group)) 'request-accept-article t))) - -(defun gnus-read-move-group-name (prompt default articles prefix) - "Read a group name." - (let* ((split-name (gnus-get-split-value gnus-move-split-methods)) - (minibuffer-confirm-incomplete nil) ; XEmacs - (prom - (format "%s %s to:" - prompt - (if (> (length articles) 1) - (format "these %d articles" (length articles)) - "this article"))) - (to-newsgroup - (cond - ((null split-name) - (gnus-completing-read default prom - gnus-active-hashtb - 'gnus-valid-move-group-p - nil prefix - 'gnus-group-history)) - ((= 1 (length split-name)) - (gnus-completing-read (car split-name) prom - gnus-active-hashtb - 'gnus-valid-move-group-p - nil nil - 'gnus-group-history)) - (t - (gnus-completing-read nil prom - (mapcar (lambda (el) (list el)) - (nreverse split-name)) - nil nil nil - 'gnus-group-history)))) - (to-method (gnus-server-to-method (gnus-group-method to-newsgroup)))) - (when to-newsgroup - (if (or (string= to-newsgroup "") - (string= to-newsgroup prefix)) - (setq to-newsgroup default)) - (unless to-newsgroup - (error "No group name entered")) - (or (gnus-active to-newsgroup) - (gnus-activate-group to-newsgroup nil nil to-method) - (if (gnus-y-or-n-p (format "No such group: %s. Create it? " - to-newsgroup)) - (or (and (gnus-request-create-group to-newsgroup to-method) - (gnus-activate-group - to-newsgroup nil nil to-method) - (gnus-subscribe-group to-newsgroup)) - (error "Couldn't create group %s" to-newsgroup))) - (error "No such group: %s" to-newsgroup))) - to-newsgroup)) - -(defun gnus-summary-save-parts (type dir n &optional reverse) - "Save parts matching TYPE to DIR. -If REVERSE, save parts that do not match TYPE." - (interactive - (list (read-string "Save parts of type: " - (or (car gnus-summary-save-parts-type-history) - gnus-summary-save-parts-default-mime) - 'gnus-summary-save-parts-type-history) - (setq gnus-summary-save-parts-last-directory - (read-file-name "Save to directory: " - gnus-summary-save-parts-last-directory - nil t)) - current-prefix-arg)) - (gnus-summary-iterate n - (let ((gnus-display-mime-function nil) - (gnus-inhibit-treatment t)) - (gnus-summary-select-article)) - (save-excursion - (set-buffer gnus-article-buffer) - (let ((handles (or gnus-article-mime-handles - (mm-dissect-buffer) (mm-uu-dissect)))) - (when handles - (gnus-summary-save-parts-1 type dir handles reverse) - (unless gnus-article-mime-handles ;; Don't destroy this case. - (mm-destroy-parts handles))))))) - -(defun gnus-summary-save-parts-1 (type dir handle reverse) - (if (stringp (car handle)) - (mapcar (lambda (h) (gnus-summary-save-parts-1 type dir h reverse)) - (cdr handle)) - (when (if reverse - (not (string-match type (mm-handle-media-type handle))) - (string-match type (mm-handle-media-type handle))) - (let ((file (expand-file-name - (file-name-nondirectory - (or - (mail-content-type-get - (mm-handle-disposition handle) 'filename) - (concat gnus-newsgroup-name - "." (number-to-string - (cdr gnus-article-current))))) - dir))) - (unless (file-exists-p file) - (mm-save-part-to-file handle file)))))) - -;; Summary extract commands - -(defun gnus-summary-insert-pseudos (pslist &optional not-view) - (let ((buffer-read-only nil) - (article (gnus-summary-article-number)) - after-article b e) - (unless (gnus-summary-goto-subject article) - (error "No such article: %d" article)) - (gnus-summary-position-point) - ;; If all commands are to be bunched up on one line, we collect - ;; them here. - (unless gnus-view-pseudos-separately - (let ((ps (setq pslist (sort pslist 'gnus-pseudos<))) - files action) - (while ps - (setq action (cdr (assq 'action (car ps)))) - (setq files (list (cdr (assq 'name (car ps))))) - (while (and ps (cdr ps) - (string= (or action "1") - (or (cdr (assq 'action (cadr ps))) "2"))) - (push (cdr (assq 'name (cadr ps))) files) - (setcdr ps (cddr ps))) - (when files - (when (not (string-match "%s" action)) - (push " " files)) - (push " " files) - (when (assq 'execute (car ps)) - (setcdr (assq 'execute (car ps)) - (funcall (if (string-match "%s" action) - 'format 'concat) - action - (mapconcat - (lambda (f) - (if (equal f " ") - f - (gnus-quote-arg-for-sh-or-csh f))) - files " "))))) - (setq ps (cdr ps))))) - (if (and gnus-view-pseudos (not not-view)) - (while pslist - (when (assq 'execute (car pslist)) - (gnus-execute-command (cdr (assq 'execute (car pslist))) - (eq gnus-view-pseudos 'not-confirm))) - (setq pslist (cdr pslist))) - (save-excursion - (while pslist - (setq after-article (or (cdr (assq 'article (car pslist))) - (gnus-summary-article-number))) - (gnus-summary-goto-subject after-article) - (forward-line 1) - (setq b (point)) - (insert " " (file-name-nondirectory - (cdr (assq 'name (car pslist)))) - ": " (or (cdr (assq 'execute (car pslist))) "") "\n") - (setq e (point)) - (forward-line -1) ; back to `b' - (gnus-add-text-properties - b (1- e) (list 'gnus-number gnus-reffed-article-number - gnus-mouse-face-prop gnus-mouse-face)) - (gnus-data-enter - after-article gnus-reffed-article-number - gnus-unread-mark b (car pslist) 0 (- e b)) - (push gnus-reffed-article-number gnus-newsgroup-unreads) - (setq gnus-reffed-article-number (1- gnus-reffed-article-number)) - (setq pslist (cdr pslist))))))) - -(defun gnus-pseudos< (p1 p2) - (let ((c1 (cdr (assq 'action p1))) - (c2 (cdr (assq 'action p2)))) - (and c1 c2 (string< c1 c2)))) - -(defun gnus-request-pseudo-article (props) - (cond ((assq 'execute props) - (gnus-execute-command (cdr (assq 'execute props))))) - (let ((gnus-current-article (gnus-summary-article-number))) - (gnus-run-hooks 'gnus-mark-article-hook))) - -(defun gnus-execute-command (command &optional automatic) - (save-excursion - (gnus-article-setup-buffer) - (set-buffer gnus-article-buffer) - (setq buffer-read-only nil) - (let ((command (if automatic command - (read-string "Command: " (cons command 0))))) - (erase-buffer) - (insert "$ " command "\n\n") - (if gnus-view-pseudo-asynchronously - (start-process "gnus-execute" (current-buffer) shell-file-name - shell-command-switch command) - (call-process shell-file-name nil t nil - shell-command-switch command))))) - -;; Summary kill commands. - -(defun gnus-summary-edit-global-kill (article) - "Edit the \"global\" kill file." - (interactive (list (gnus-summary-article-number))) - (gnus-group-edit-global-kill article)) - -(defun gnus-summary-edit-local-kill () - "Edit a local kill file applied to the current newsgroup." - (interactive) - (setq gnus-current-headers (gnus-summary-article-header)) - (gnus-group-edit-local-kill - (gnus-summary-article-number) gnus-newsgroup-name)) - -;;; Header reading. - -(defun gnus-read-header (id &optional header) - "Read the headers of article ID and enter them into the Gnus system." - (let ((group gnus-newsgroup-name) - (gnus-override-method - (or - gnus-override-method - (and (gnus-news-group-p gnus-newsgroup-name) - (car (gnus-refer-article-methods))))) - where) - ;; First we check to see whether the header in question is already - ;; fetched. - (if (stringp id) - ;; This is a Message-ID. - (setq header (or header (gnus-id-to-header id))) - ;; This is an article number. - (setq header (or header (gnus-summary-article-header id)))) - (if (and header - (not (gnus-summary-article-sparse-p (mail-header-number header)))) - ;; We have found the header. - header - ;; If this is a sparse article, we have to nix out its - ;; previous entry in the thread hashtb. - (when (and header - (gnus-summary-article-sparse-p (mail-header-number header))) - (let* ((parent (gnus-parent-id (mail-header-references header))) - (thread (and parent (gnus-id-to-thread parent)))) - (when thread - (delq (assq header thread) thread)))) - ;; We have to really fetch the header to this article. - (save-excursion - (set-buffer nntp-server-buffer) - (when (setq where (gnus-request-head id group)) - (nnheader-fold-continuation-lines) - (goto-char (point-max)) - (insert ".\n") - (goto-char (point-min)) - (insert "211 ") - (princ (cond - ((numberp id) id) - ((cdr where) (cdr where)) - (header (mail-header-number header)) - (t gnus-reffed-article-number)) - (current-buffer)) - (insert " Article retrieved.\n")) - (if (or (not where) - (not (setq header (car (gnus-get-newsgroup-headers nil t))))) - () ; Malformed head. - (unless (gnus-summary-article-sparse-p (mail-header-number header)) - (when (and (stringp id) - (not (string= (gnus-group-real-name group) - (car where)))) - ;; If we fetched by Message-ID and the article came - ;; from a different group, we fudge some bogus article - ;; numbers for this article. - (mail-header-set-number header gnus-reffed-article-number)) - (save-excursion - (set-buffer gnus-summary-buffer) - (decf gnus-reffed-article-number) - (gnus-remove-header (mail-header-number header)) - (push header gnus-newsgroup-headers) - (setq gnus-current-headers header) - (push (mail-header-number header) gnus-newsgroup-limit))) - header))))) - -(defun gnus-remove-header (number) - "Remove header NUMBER from `gnus-newsgroup-headers'." - (if (and gnus-newsgroup-headers - (= number (mail-header-number (car gnus-newsgroup-headers)))) - (pop gnus-newsgroup-headers) - (let ((headers gnus-newsgroup-headers)) - (while (and (cdr headers) - (not (= number (mail-header-number (cadr headers))))) - (pop headers)) - (when (cdr headers) - (setcdr headers (cddr headers)))))) - -;;; -;;; summary highlights -;;; - -(defun gnus-highlight-selected-summary () - "Highlight selected article in summary buffer." - ;; Added by Per Abrahamsen . - (when gnus-summary-selected-face - (save-excursion - (let* ((beg (progn (beginning-of-line) (point))) - (end (progn (end-of-line) (point))) - ;; Fix by Mike Dugan . - (from (if (get-text-property beg gnus-mouse-face-prop) - beg - (or (next-single-property-change - beg gnus-mouse-face-prop nil end) - beg))) - (to - (if (= from end) - (- from 2) - (or (next-single-property-change - from gnus-mouse-face-prop nil end) - end)))) - ;; If no mouse-face prop on line we will have to = from = end, - ;; so we highlight the entire line instead. - (when (= (+ to 2) from) - (setq from beg) - (setq to end)) - (if gnus-newsgroup-selected-overlay - ;; Move old overlay. - (gnus-move-overlay - gnus-newsgroup-selected-overlay from to (current-buffer)) - ;; Create new overlay. - (gnus-overlay-put - (setq gnus-newsgroup-selected-overlay (gnus-make-overlay from to)) - 'face gnus-summary-selected-face)))))) - -;; New implementation by Christian Limpach . -(defun gnus-summary-highlight-line () - "Highlight current line according to `gnus-summary-highlight'." - (let* ((list gnus-summary-highlight) - (p (point)) - (end (progn (end-of-line) (point))) - ;; now find out where the line starts and leave point there. - (beg (progn (beginning-of-line) (point))) - (article (gnus-summary-article-number)) - (score (or (cdr (assq (or article gnus-current-article) - gnus-newsgroup-scored)) - gnus-summary-default-score 0)) - (mark (or (gnus-summary-article-mark) gnus-unread-mark)) - (inhibit-read-only t)) - ;; Eval the cars of the lists until we find a match. - (let ((default gnus-summary-default-score) - (default-high gnus-summary-default-high-score) - (default-low gnus-summary-default-low-score)) - (while (and list - (not (eval (caar list)))) - (setq list (cdr list)))) - (let ((face (cdar list))) - (unless (eq face (get-text-property beg 'face)) - (gnus-put-text-property-excluding-characters-with-faces - beg end 'face - (setq face (if (boundp face) (symbol-value face) face))) - (when gnus-summary-highlight-line-function - (funcall gnus-summary-highlight-line-function article face)))) - (goto-char p))) - -(defun gnus-update-read-articles (group unread &optional compute) - "Update the list of read articles in GROUP." - (let* ((active (or gnus-newsgroup-active (gnus-active group))) - (entry (gnus-gethash group gnus-newsrc-hashtb)) - (info (nth 2 entry)) - (prev 1) - (unread (sort (copy-sequence unread) '<)) - read) - (if (or (not info) (not active)) - ;; There is no info on this group if it was, in fact, - ;; killed. Gnus stores no information on killed groups, so - ;; there's nothing to be done. - ;; One could store the information somewhere temporarily, - ;; perhaps... Hmmm... - () - ;; Remove any negative articles numbers. - (while (and unread (< (car unread) 0)) - (setq unread (cdr unread))) - ;; Remove any expired article numbers - (while (and unread (< (car unread) (car active))) - (setq unread (cdr unread))) - ;; Compute the ranges of read articles by looking at the list of - ;; unread articles. - (while unread - (when (/= (car unread) prev) - (push (if (= prev (1- (car unread))) prev - (cons prev (1- (car unread)))) - read)) - (setq prev (1+ (car unread))) - (setq unread (cdr unread))) - (when (<= prev (cdr active)) - (push (cons prev (cdr active)) read)) - (setq read (if (> (length read) 1) (nreverse read) read)) - (if compute - read - (save-excursion - (let (setmarkundo) - ;; Propagate the read marks to the backend. - (when (gnus-check-backend-function 'request-set-mark group) - (let ((del (gnus-remove-from-range (gnus-info-read info) read)) - (add (gnus-remove-from-range read (gnus-info-read info)))) - (when (or add del) - (unless (gnus-check-group group) - (error "Can't open server for %s" group)) - (gnus-request-set-mark - group (delq nil (list (if add (list add 'add '(read))) - (if del (list del 'del '(read)))))) - (setq setmarkundo - `(gnus-request-set-mark - ,group - ',(delq nil (list - (if del (list del 'add '(read))) - (if add (list add 'del '(read)))))))))) - (set-buffer gnus-group-buffer) - (gnus-undo-register - `(progn - (gnus-info-set-marks ',info ',(gnus-info-marks info) t) - (gnus-info-set-read ',info ',(gnus-info-read info)) - (gnus-get-unread-articles-in-group ',info - (gnus-active ,group)) - (gnus-group-update-group ,group t) - ,setmarkundo)))) - ;; Enter this list into the group info. - (gnus-info-set-read info read) - ;; Set the number of unread articles in gnus-newsrc-hashtb. - (gnus-get-unread-articles-in-group info (gnus-active group)) - t)))) - -(defun gnus-offer-save-summaries () - "Offer to save all active summary buffers." - (let (buffers) - ;; Go through all buffers and find all summaries. - (dolist (buffer (buffer-list)) - (when (and (setq buffer (buffer-name buffer)) - (string-match "Summary" buffer) - (save-excursion - (set-buffer buffer) - ;; We check that this is, indeed, a summary buffer. - (and (eq major-mode 'gnus-summary-mode) - ;; Also make sure this isn't bogus. - gnus-newsgroup-prepared - ;; Also make sure that this isn't a - ;; dead summary buffer. - (not gnus-dead-summary-mode)))) - (push buffer buffers))) - ;; Go through all these summary buffers and offer to save them. - (when buffers - (save-excursion - (map-y-or-n-p - "Update summary buffer %s? " - (lambda (buf) - (switch-to-buffer buf) - (gnus-summary-exit)) - buffers))))) - - -;;; @ for mime-partial -;;; - -(defun gnus-request-partial-message () - (save-excursion - (let ((number (gnus-summary-article-number)) - (group gnus-newsgroup-name) - (mother gnus-article-buffer)) - (set-buffer (get-buffer-create " *Partial Article*")) - (erase-buffer) - (setq mime-preview-buffer mother) - (gnus-request-article-this-buffer number group) - (mime-parse-buffer) - ))) - -(autoload 'mime-combine-message/partial-pieces-automatically - "mime-partial" - "Internal method to combine message/partial messages automatically.") - -(mime-add-condition - 'action '((type . message)(subtype . partial) - (major-mode . gnus-original-article-mode) - (method . mime-combine-message/partial-pieces-automatically) - (summary-buffer-exp . gnus-summary-buffer) - (request-partial-message-method . gnus-request-partial-message) - )) - - -;;; @ for message/rfc822 -;;; - -(defun gnus-mime-extract-message/rfc822 (entity situation) - (let (group article num cwin swin cur) - (with-temp-buffer - (mime-insert-entity-content entity) - (setq group (or (cdr (assq 'group situation)) - (completing-read "Group: " - gnus-active-hashtb - nil - (gnus-read-active-file-p) - gnus-newsgroup-name)) - article (gnus-request-accept-article group))) - (when (and (consp article) - (numberp (setq article (cdr article)))) - (setq num (1+ (or (cdr (assq 'number situation)) 0)) - cwin (get-buffer-window (current-buffer) t)) - (save-window-excursion - (if (setq swin (get-buffer-window gnus-summary-buffer t)) - (select-window swin) - (set-buffer gnus-summary-buffer)) - (setq cur gnus-current-article) - (forward-line num) - (let (gnus-show-threads) - (gnus-summary-goto-subject article t)) - (gnus-summary-clear-mark-forward 1) - (gnus-summary-goto-subject cur)) - (when (and cwin (window-frame cwin)) - (select-frame (window-frame cwin))) - (when (boundp 'mime-acting-situation-to-override) - (set-alist 'mime-acting-situation-to-override - 'group - group) - (set-alist 'mime-acting-situation-to-override - 'after-method - `(progn - (save-current-buffer - (set-buffer gnus-group-buffer) - (gnus-activate-group ,group)) - (gnus-summary-goto-article ,cur - gnus-show-all-headers))) - (set-alist 'mime-acting-situation-to-override - 'number num))))) - -(mime-add-condition - 'action '((type . message)(subtype . rfc822) - (major-mode . gnus-original-article-mode) - (method . gnus-mime-extract-message/rfc822) - (mode . "extract") - )) - -(mime-add-condition - 'action '((type . message)(subtype . news) - (major-mode . gnus-original-article-mode) - (method . gnus-mime-extract-message/rfc822) - (mode . "extract") - )) - -(defun gnus-mime-extract-multipart (entity situation) - (let ((children (mime-entity-children entity)) - mime-acting-situation-to-override - f) - (while children - (mime-play-entity (car children) - (cons (assq 'mode situation) - mime-acting-situation-to-override)) - (setq children (cdr children))) - (if (setq f (cdr (assq 'after-method - mime-acting-situation-to-override))) - (eval f) - ))) - -(mime-add-condition - 'action '((type . multipart) - (method . gnus-mime-extract-multipart) - (mode . "extract") - ) - 'with-default) - - -;;; @ end -;;; - -(defun gnus-summary-setup-default-charset () - "Setup newsgroup default charset." - (if (equal gnus-newsgroup-name "nndraft:drafts") - (setq gnus-newsgroup-charset nil) - (let* ((ignored-charsets - (or gnus-newsgroup-ephemeral-ignored-charsets - (append - (and gnus-newsgroup-name - (gnus-parameter-ignored-charsets gnus-newsgroup-name)) - gnus-newsgroup-ignored-charsets)))) - (setq gnus-newsgroup-charset - (or gnus-newsgroup-ephemeral-charset - (and gnus-newsgroup-name - (gnus-parameter-charset gnus-newsgroup-name)) - gnus-default-charset)) - (set (make-local-variable 'gnus-newsgroup-ignored-charsets) - ignored-charsets)))) - -;;; -;;; Mime Commands -;;; - -(defun gnus-summary-display-buttonized (&optional show-all-parts) - "Display the current article buffer fully MIME-buttonized. -If SHOW-ALL-PARTS (the prefix) is non-nil, all multipart/* parts are -treated as multipart/mixed." - (interactive "P") - (require 'gnus-art) - (let ((gnus-unbuttonized-mime-types nil) - (gnus-mime-display-multipart-as-mixed show-all-parts)) - (gnus-summary-show-article))) - -(defun gnus-summary-repair-multipart (article) - "Add a Content-Type header to a multipart article without one." - (interactive (list (gnus-summary-article-number))) - (gnus-with-article article - (message-narrow-to-head) - (message-remove-header "Mime-Version") - (goto-char (point-max)) - (insert "Mime-Version: 1.0\n") - (widen) - (when (search-forward "\n--" nil t) - (let ((separator (buffer-substring (point) (gnus-point-at-eol)))) - (message-narrow-to-head) - (message-remove-header "Content-Type") - (goto-char (point-max)) - (insert (format "Content-Type: multipart/mixed; boundary=\"%s\"\n" - separator)) - (widen)))) - (let (gnus-mark-article-hook) - (gnus-summary-select-article t t nil article))) - -(defun gnus-summary-toggle-display-buttonized () - "Toggle the buttonizing of the article buffer." - (interactive) - (require 'gnus-art) - (if (setq gnus-inhibit-mime-unbuttonizing - (not gnus-inhibit-mime-unbuttonizing)) - (let ((gnus-unbuttonized-mime-types nil)) - (gnus-summary-show-article)) - (gnus-summary-show-article))) - -;;; -;;; Intelli-mouse commmands -;;; - -(defun gnus-wheel-summary-scroll (event) - (interactive "e") - (let ((amount (if (memq 'shift (event-modifiers event)) - (car gnus-wheel-scroll-amount) - (cdr gnus-wheel-scroll-amount))) - (direction (- (* (static-if (featurep 'xemacs) - (event-button event) - (cond ((eq 'mouse-4 (event-basic-type event)) - 4) - ((eq 'mouse-5 (event-basic-type event)) - 5))) - 2) 9)) - edge) - (gnus-summary-scroll-up (* amount direction)) - (when (gnus-eval-in-buffer-window gnus-article-buffer - (save-restriction - (widen) - (and (if (< 0 direction) - (gnus-article-next-page 0) - (gnus-article-prev-page 0) - (bobp)) - (if (setq edge (get-text-property - (point-min) 'gnus-wheel-edge)) - (setq edge (* edge direction)) - (setq edge -1)) - (or (plusp edge) - (let ((buffer-read-only nil) - (inhibit-read-only t)) - (put-text-property (point-min) (point-max) - 'gnus-wheel-edge direction) - nil)) - (or (> edge gnus-wheel-edge-resistance) - (let ((buffer-read-only nil) - (inhibit-read-only t)) - (put-text-property (point-min) (point-max) - 'gnus-wheel-edge - (* (1+ edge) direction)) - nil)) - (eq last-command 'gnus-wheel-summary-scroll)))) - (gnus-summary-next-article nil nil (minusp direction))))) - -(defun gnus-wheel-install () - "Enable mouse wheel support on summary window." - (when gnus-use-wheel - (let ((keys - '([(mouse-4)] [(shift mouse-4)] [(mouse-5)] [(shift mouse-5)]))) - (dolist (key keys) - (define-key gnus-summary-mode-map key - 'gnus-wheel-summary-scroll))))) - -(add-hook 'gnus-summary-mode-hook 'gnus-wheel-install) - -;;; -;;; Traditional PGP commmands -;;; - -(defun gnus-summary-decrypt-article (&optional force) - "Decrypt the current article in traditional PGP way. -This will have permanent effect only in mail groups. -If FORCE is non-nil, allow editing of articles even in read-only -groups." - (interactive "P") - (gnus-summary-select-article t) - (gnus-eval-in-buffer-window gnus-article-buffer - (save-excursion - (save-restriction - (widen) - (goto-char (point-min)) - (unless (re-search-forward (car pgg-armor-header-lines) nil t) - (error "Not a traditional PGP message!")) - (let ((armor-start (match-beginning 0))) - (if (and (pgg-decrypt-region armor-start (point-max)) - (or force (not (gnus-group-read-only-p)))) - (let ((inhibit-read-only t) - buffer-read-only) - (delete-region armor-start - (progn - (re-search-forward "^-+END PGP" nil t) - (beginning-of-line 2) - (point))) - (insert-buffer-substring pgg-output-buffer)))))))) - -(defun gnus-summary-verify-article () - "Verify the current article in traditional PGP way." - (interactive) - (save-excursion - (set-buffer gnus-original-article-buffer) - (goto-char (point-min)) - (unless (re-search-forward "^-+BEGIN PGP SIGNED MESSAGE" nil t) - (error "Not a traditional PGP message!")) - (re-search-forward "^-+END PGP" nil t) - (beginning-of-line 2) - (call-interactively (function pgg-verify-region)))) - -;;; -;;; Generic summary marking commands -;;; - -(defvar gnus-summary-marking-alist - '((read gnus-del-mark "d") - (unread gnus-unread-mark "u") - (ticked gnus-ticked-mark "!") - (dormant gnus-dormant-mark "?") - (expirable gnus-expirable-mark "e")) - "An alist of names/marks/keystrokes.") - -(defvar gnus-summary-generic-mark-map (make-sparse-keymap)) -(defvar gnus-summary-mark-map) - -(defun gnus-summary-make-all-marking-commands () - (define-key gnus-summary-mark-map "M" gnus-summary-generic-mark-map) - (dolist (elem gnus-summary-marking-alist) - (apply 'gnus-summary-make-marking-command elem))) - -(defun gnus-summary-make-marking-command (name mark keystroke) - (let ((map (make-sparse-keymap))) - (define-key gnus-summary-generic-mark-map keystroke map) - (dolist (lway `((next "next" next nil "n") - (next-unread "next unread" next t "N") - (prev "previous" prev nil "p") - (prev-unread "previous unread" prev t "P") - (nomove "" nil nil ,keystroke))) - (let ((func (gnus-summary-make-marking-command-1 - mark (car lway) lway name))) - (setq func (eval func)) - (define-key map (nth 4 lway) func))))) - -(defun gnus-summary-make-marking-command-1 (mark way lway name) - `(defun ,(intern - (format "gnus-summary-put-mark-as-%s%s" - name (if (eq way 'nomove) - "" - (concat "-" (symbol-name way))))) - (n) - ,(format - "Mark the current article as %s%s. -If N, the prefix, then repeat N times. -If N is negative, move in reverse order. -The difference between N and the actual number of articles marked is -returned." - name (car (cdr lway))) - (interactive "p") - (gnus-summary-generic-mark n ,mark ',(nth 2 lway) ,(nth 3 lway)))) - -(defun gnus-summary-generic-mark (n mark move unread) - "Mark N articles with MARK." - (unless (eq major-mode 'gnus-summary-mode) - (error "This command can only be used in the summary buffer")) - (gnus-summary-show-thread) - (let ((nummove - (cond - ((eq move 'next) 1) - ((eq move 'prev) -1) - (t 0)))) - (if (zerop nummove) - (setq n 1) - (when (< n 0) - (setq n (abs n) - nummove (* -1 nummove)))) - (while (and (> n 0) - (gnus-summary-mark-article nil mark) - (zerop (gnus-summary-next-subject nummove unread t))) - (setq n (1- n))) - (when (/= 0 n) - (gnus-message 7 "No more %sarticles" (if mark "" "unread "))) - (gnus-summary-recenter) - (gnus-summary-position-point) - (gnus-set-mode-line 'summary) - n)) - -(defun gnus-summary-insert-articles (articles) - (when (setq articles - (gnus-set-difference articles - (mapcar (lambda (h) (mail-header-number h)) - gnus-newsgroup-headers))) - (setq gnus-newsgroup-headers - (merge 'list - gnus-newsgroup-headers - (gnus-fetch-headers articles) - 'gnus-article-sort-by-number)) - ;; Suppress duplicates? - (when gnus-suppress-duplicates - (gnus-dup-suppress-articles)) - - ;; We might want to build some more threads first. - (when (and gnus-fetch-old-headers - (eq gnus-headers-retrieved-by 'nov)) - (if (eq gnus-fetch-old-headers 'invisible) - (gnus-build-all-threads) - (gnus-build-old-threads))) - ;; Let the Gnus agent mark articles as read. - (when gnus-agent - (gnus-agent-get-undownloaded-list)) - ;; Remove list identifiers from subject - (when gnus-list-identifiers - (gnus-summary-remove-list-identifiers)) - ;; First and last article in this newsgroup. - (when gnus-newsgroup-headers - (setq gnus-newsgroup-begin - (mail-header-number (car gnus-newsgroup-headers)) - gnus-newsgroup-end - (mail-header-number - (gnus-last-element gnus-newsgroup-headers)))) - (when gnus-use-scoring - (gnus-possibly-score-headers)))) - -(defun gnus-summary-insert-old-articles (&optional all) - "Insert all old articles in this group. -If ALL is non-nil, already read articles become readable. -If ALL is a number, fetch this number of articles." - (interactive "P") - (prog1 - (let ((old (mapcar 'car gnus-newsgroup-data)) - (i (car gnus-newsgroup-active)) - older len) - (while (<= i (cdr gnus-newsgroup-active)) - (or (memq i old) (push i older)) - (incf i)) - (setq len (length older)) - (cond - ((null older) nil) - ((numberp all) - (if (< all len) - (setq older (subseq older 0 all)))) - (all nil) - (t - (if (and (numberp gnus-large-newsgroup) - (> len gnus-large-newsgroup)) - (let ((input - (read-string - (format - "How many articles from %s (default %d): " - (gnus-limit-string - (gnus-group-decoded-name gnus-newsgroup-name) 35) - len)))) - (unless (string-match "^[ \t]*$" input) - (setq all (string-to-number input)) - (if (< all len) - (setq older (subseq older 0 all)))))))) - (if (not older) - (message "No old news.") - (gnus-summary-insert-articles older) - (gnus-summary-limit (gnus-union older old)))) - (gnus-summary-position-point))) - -(defun gnus-summary-insert-new-articles () - "Insert all new articles in this group." - (interactive) - (prog1 - (let ((old (mapcar 'car gnus-newsgroup-data)) - (old-active gnus-newsgroup-active) - (nnmail-fetched-sources (list t)) - i new) - (setq gnus-newsgroup-active - (gnus-activate-group gnus-newsgroup-name 'scan)) - (setq i (1+ (cdr old-active))) - (while (<= i (cdr gnus-newsgroup-active)) - (push i new) - (incf i)) - (if (not new) - (message "No gnus is bad news.") - (setq new (nreverse new)) - (gnus-summary-insert-articles new) - (setq gnus-newsgroup-unreads - (append gnus-newsgroup-unreads new)) - (gnus-summary-limit (gnus-union old new)))) - (gnus-summary-position-point))) - -(gnus-summary-make-all-marking-commands) - -(gnus-ems-redefine) - -(provide 'gnus-sum) - -(run-hooks 'gnus-sum-load-hook) - -;;; gnus-sum.el ends here diff --git a/lisp/gnus-topic.el b/lisp/gnus-topic.el deleted file mode 100644 index 2267def..0000000 --- a/lisp/gnus-topic.el +++ /dev/null @@ -1,1678 +0,0 @@ -;;; gnus-topic.el --- a folding minor mode for Gnus group buffers -;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001 -;; Free Software Foundation, Inc. - -;; Author: Ilja Weis -;; Lars Magne Ingebrigtsen -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) -(eval-when-compile (require 'gnus-clfns)) - -(require 'gnus) -(require 'gnus-group) -(require 'gnus-start) -(require 'gnus-util) - -(defgroup gnus-topic nil - "Group topics." - :group 'gnus-group) - -(defvar gnus-topic-mode nil - "Minor mode for Gnus group buffers.") - -(defcustom gnus-topic-mode-hook nil - "Hook run in topic mode buffers." - :type 'hook - :group 'gnus-topic) - -(when (featurep 'xemacs) - (add-hook 'gnus-topic-mode-hook 'gnus-xmas-topic-menu-add)) - -(defcustom gnus-topic-line-format "%i[ %(%{%n%}%) -- %A ]%v\n" - "Format of topic lines. -It works along the same lines as a normal formatting string, -with some simple extensions. - -%i Indentation based on topic level. -%n Topic name. -%v Nothing if the topic is visible, \"...\" otherwise. -%g Number of groups in the topic. -%a Number of unread articles in the groups in the topic. -%A Number of unread articles in the groups in the topic and its subtopics. -" - :type 'string - :group 'gnus-topic) - -(defcustom gnus-topic-indent-level 2 - "*How much each subtopic should be indented." - :type 'integer - :group 'gnus-topic) - -(defcustom gnus-topic-display-empty-topics t - "*If non-nil, display the topic lines even of topics that have no unread articles." - :type 'boolean - :group 'gnus-topic) - -;; Internal variables. - -(defvar gnus-topic-active-topology nil) -(defvar gnus-topic-active-alist nil) -(defvar gnus-topic-unreads nil) - -(defvar gnus-topology-checked-p nil - "Whether the topology has been checked in this session.") - -(defvar gnus-topic-killed-topics nil) -(defvar gnus-topic-inhibit-change-level nil) - -(defconst gnus-topic-line-format-alist - `((?n name ?s) - (?v visible ?s) - (?i indentation ?s) - (?g number-of-groups ?d) - (?a (gnus-topic-articles-in-topic entries) ?d) - (?A total-number-of-articles ?d) - (?l level ?d))) - -(defvar gnus-topic-line-format-spec nil) - -;;; Utility functions - -(defun gnus-group-topic-name () - "The name of the topic on the current line." - (let ((topic (get-text-property (gnus-point-at-bol) 'gnus-topic))) - (and topic (symbol-name topic)))) - -(defun gnus-group-topic-level () - "The level of the topic on the current line." - (get-text-property (gnus-point-at-bol) 'gnus-topic-level)) - -(defun gnus-group-topic-unread () - "The number of unread articles in topic on the current line." - (get-text-property (gnus-point-at-bol) 'gnus-topic-unread)) - -(defun gnus-topic-unread (topic) - "Return the number of unread articles in TOPIC." - (or (cdr (assoc topic gnus-topic-unreads)) - 0)) - -(defun gnus-group-topic-p () - "Return non-nil if the current line is a topic." - (gnus-group-topic-name)) - -(defun gnus-topic-visible-p () - "Return non-nil if the current topic is visible." - (get-text-property (gnus-point-at-bol) 'gnus-topic-visible)) - -(defun gnus-topic-articles-in-topic (entries) - (let ((total 0) - number) - (while entries - (when (numberp (setq number (car (pop entries)))) - (incf total number))) - total)) - -(defun gnus-group-topic (group) - "Return the topic GROUP is a member of." - (let ((alist gnus-topic-alist) - out) - (while alist - (when (member group (cdar alist)) - (setq out (caar alist) - alist nil)) - (setq alist (cdr alist))) - out)) - -(defun gnus-group-parent-topic (group) - "Return the topic GROUP is member of by looking at the group buffer." - (save-excursion - (set-buffer gnus-group-buffer) - (if (gnus-group-goto-group group) - (gnus-current-topic) - (gnus-group-topic group)))) - -(defun gnus-topic-goto-topic (topic) - (when topic - (gnus-goto-char (text-property-any (point-min) (point-max) - 'gnus-topic (intern topic))))) - -(defun gnus-topic-jump-to-topic (topic) - "Go to TOPIC." - (interactive - (list (completing-read "Go to topic: " - (mapcar 'list (gnus-topic-list)) - nil t))) - (dolist (topic (gnus-current-topics topic)) - (gnus-topic-fold t)) - (gnus-topic-goto-topic topic)) - -(defun gnus-current-topic () - "Return the name of the current topic." - (let ((result - (or (get-text-property (point) 'gnus-topic) - (save-excursion - (and (gnus-goto-char (previous-single-property-change - (point) 'gnus-topic)) - (get-text-property (max (1- (point)) (point-min)) - 'gnus-topic)))))) - (when result - (symbol-name result)))) - -(defun gnus-current-topics (&optional topic) - "Return a list of all current topics, lowest in hierarchy first. -If TOPIC, start with that topic." - (let ((topic (or topic (gnus-current-topic))) - topics) - (while topic - (push topic topics) - (setq topic (gnus-topic-parent-topic topic))) - (nreverse topics))) - -(defun gnus-group-active-topic-p () - "Say whether the current topic comes from the active topics." - (save-excursion - (beginning-of-line) - (get-text-property (point) 'gnus-active))) - -(defun gnus-topic-find-groups (topic &optional level all lowest recursive) - "Return entries for all visible groups in TOPIC. -If RECURSIVE is t, return groups in its subtopics too." - (let ((groups (cdr (assoc topic gnus-topic-alist))) - info clevel unread group params visible-groups entry active) - (setq lowest (or lowest 1)) - (setq level (or level gnus-level-unsubscribed)) - ;; We go through the newsrc to look for matches. - (while groups - (when (setq group (pop groups)) - (setq entry (gnus-gethash group gnus-newsrc-hashtb) - info (nth 2 entry) - params (gnus-info-params info) - active (gnus-active group) - unread (or (car entry) - (and (not (equal group "dummy.group")) - active - (- (1+ (cdr active)) (car active)))) - clevel (or (gnus-info-level info) - (if (member group gnus-zombie-list) - gnus-level-zombie gnus-level-killed)))) - (and - info ; nil means that the group is dead. - (<= clevel level) - (>= clevel lowest) ; Is inside the level we want. - (or all - (if (or (eq unread t) - (eq unread nil)) - gnus-group-list-inactive-groups - (> unread 0)) - (and gnus-list-groups-with-ticked-articles - (cdr (assq 'tick (gnus-info-marks info)))) - ;; Has right readedness. - ;; Check for permanent visibility. - (and gnus-permanently-visible-groups - (string-match gnus-permanently-visible-groups group)) - (memq 'visible params) - (cdr (assq 'visible params))) - ;; Add this group to the list of visible groups. - (push (or entry group) visible-groups))) - (setq visible-groups (nreverse visible-groups)) - (when recursive - (if (eq recursive t) - (setq recursive (cdr (gnus-topic-find-topology topic)))) - (mapcar (lambda (topic-topology) - (setq visible-groups - (nconc visible-groups - (gnus-topic-find-groups - (caar topic-topology) - level all lowest topic-topology)))) - (cdr recursive))) - visible-groups)) - -(defun gnus-topic-previous-topic (topic) - "Return the previous topic on the same level as TOPIC." - (let ((top (cddr (gnus-topic-find-topology - (gnus-topic-parent-topic topic))))) - (unless (equal topic (caaar top)) - (while (and top (not (equal (caaadr top) topic))) - (setq top (cdr top))) - (caaar top)))) - -(defun gnus-topic-parent-topic (topic &optional topology) - "Return the parent of TOPIC." - (unless topology - (setq topology gnus-topic-topology)) - (let ((parent (car (pop topology))) - result found) - (while (and topology - (not (setq found (equal (caaar topology) topic))) - (not (setq result (gnus-topic-parent-topic - topic (car topology))))) - (setq topology (cdr topology))) - (or result (and found parent)))) - -(defun gnus-topic-next-topic (topic &optional previous) - "Return the next sibling of TOPIC." - (let ((parentt (cddr (gnus-topic-find-topology - (gnus-topic-parent-topic topic)))) - prev) - (while (and parentt - (not (equal (caaar parentt) topic))) - (setq prev (caaar parentt) - parentt (cdr parentt))) - (if previous - prev - (caaadr parentt)))) - -(defun gnus-topic-forward-topic (num) - "Go to the next topic on the same level as the current one." - (let* ((topic (gnus-current-topic)) - (way (if (< num 0) 'gnus-topic-previous-topic - 'gnus-topic-next-topic)) - (num (abs num))) - (while (and (not (zerop num)) - (setq topic (funcall way topic))) - (when (gnus-topic-goto-topic topic) - (decf num))) - (unless (zerop num) - (goto-char (point-max))) - num)) - -(defun gnus-topic-find-topology (topic &optional topology level remove) - "Return the topology of TOPIC." - (unless topology - (setq topology gnus-topic-topology) - (setq level 0)) - (let ((top topology) - result) - (if (equal (caar topology) topic) - (progn - (when remove - (delq topology remove)) - (cons level topology)) - (setq topology (cdr topology)) - (while (and topology - (not (setq result (gnus-topic-find-topology - topic (car topology) (1+ level) - (and remove top))))) - (setq topology (cdr topology))) - result))) - -(defvar gnus-tmp-topics nil) -(defun gnus-topic-list (&optional topology) - "Return a list of all topics in the topology." - (unless topology - (setq topology gnus-topic-topology - gnus-tmp-topics nil)) - (push (caar topology) gnus-tmp-topics) - (mapcar 'gnus-topic-list (cdr topology)) - gnus-tmp-topics) - -;;; Topic parameter jazz - -(defun gnus-topic-parameters (topic) - "Return the parameters for TOPIC." - (let ((top (gnus-topic-find-topology topic))) - (when top - (nth 3 (cadr top))))) - -(defun gnus-topic-set-parameters (topic parameters) - "Set the topic parameters of TOPIC to PARAMETERS." - (let ((top (gnus-topic-find-topology topic))) - (unless top - (error "No such topic: %s" topic)) - ;; We may have to extend if there is no parameters here - ;; to begin with. - (unless (nthcdr 2 (cadr top)) - (nconc (cadr top) (list nil))) - (unless (nthcdr 3 (cadr top)) - (nconc (cadr top) (list nil))) - (setcar (nthcdr 3 (cadr top)) parameters) - (gnus-dribble-enter - (format "(gnus-topic-set-parameters %S '%S)" topic parameters)))) - -(defun gnus-group-topic-parameters (group) - "Compute the group parameters for GROUP taking into account inheritance from topics." - (let ((params-list (copy-sequence (gnus-group-get-parameter group)))) - (save-excursion - (gnus-group-goto-group group) - (nconc params-list - (gnus-topic-hierarchical-parameters (gnus-current-topic)))))) - -(defun gnus-topic-hierarchical-parameters (topic) - "Return a topic list computed for TOPIC." - (let ((topics (gnus-current-topics topic)) - params-list param out params) - (while topics - (push (gnus-topic-parameters (pop topics)) params-list)) - ;; We probably have lots of nil elements here, so - ;; we remove them. Probably faster than doing this "properly". - (setq params-list (delq nil params-list)) - ;; Now we have all the parameters, so we go through them - ;; and do inheritance in the obvious way. - (while (setq params (pop params-list)) - (while (setq param (pop params)) - (when (atom param) - (setq param (cons param t))) - ;; Override any old versions of this param. - (gnus-pull (car param) out) - (push param out))) - ;; Return the resulting parameter list. - out)) - -;;; General utility functions - -(defun gnus-topic-enter-dribble () - (gnus-dribble-enter - (format "(setq gnus-topic-topology '%S)" gnus-topic-topology))) - -;;; Generating group buffers - -(defun gnus-group-prepare-topics (level &optional predicate lowest - regexp list-topic topic-level) - "List all newsgroups with unread articles of level LEVEL or lower. -Use the `gnus-group-topics' to sort the groups. -If PREDICTE is a function, list groups that the function returns non-nil; -if it is t, list groups that have no unread articles. -If LOWEST is non-nil, list all newsgroups of level LOWEST or higher." - (set-buffer gnus-group-buffer) - (let ((buffer-read-only nil) - (lowest (or lowest 1)) - (not-in-list - (and gnus-group-listed-groups - (copy-sequence gnus-group-listed-groups)))) - - (when (or (not gnus-topic-alist) - (not gnus-topology-checked-p)) - (gnus-topic-check-topology)) - - (unless list-topic - (erase-buffer)) - - ;; List dead groups? - (when (or gnus-group-listed-groups - (and (>= level gnus-level-zombie) - (<= lowest gnus-level-zombie))) - (gnus-group-prepare-flat-list-dead - (setq gnus-zombie-list (sort gnus-zombie-list 'string<)) - gnus-level-zombie ?Z - regexp)) - - (when (or gnus-group-listed-groups - (and (>= level gnus-level-killed) - (<= lowest gnus-level-killed))) - (gnus-group-prepare-flat-list-dead - (setq gnus-killed-list (sort gnus-killed-list 'string<)) - gnus-level-killed ?K regexp) - (when not-in-list - (unless gnus-killed-hashtb - (gnus-make-hashtable-from-killed)) - (gnus-group-prepare-flat-list-dead - (gnus-delete-if (lambda (group) - (or (gnus-gethash group gnus-newsrc-hashtb) - (gnus-gethash group gnus-killed-hashtb))) - not-in-list) - gnus-level-killed ?K regexp))) - - ;; Use topics. - (prog1 - (when (or (< lowest gnus-level-zombie) - gnus-group-listed-groups) - (if list-topic - (let ((top (gnus-topic-find-topology list-topic))) - (gnus-topic-prepare-topic (cdr top) (car top) - (or topic-level level) predicate - nil lowest regexp)) - (gnus-topic-prepare-topic gnus-topic-topology 0 - (or topic-level level) predicate - nil lowest regexp))) - (gnus-group-set-mode-line) - (setq gnus-group-list-mode (cons level predicate)) - (gnus-run-hooks 'gnus-group-prepare-hook)))) - -(defun gnus-topic-prepare-topic (topicl level &optional list-level - predicate silent - lowest regexp) - "Insert TOPIC into the group buffer. -If SILENT, don't insert anything. Return the number of unread -articles in the topic and its subtopics." - (let* ((type (pop topicl)) - (entries (gnus-topic-find-groups - (car type) - (if gnus-group-listed-groups - gnus-level-killed - list-level) - (or predicate gnus-group-listed-groups - (cdr (assq 'visible - (gnus-topic-hierarchical-parameters - (car type))))) - (if gnus-group-listed-groups 0 lowest))) - (visiblep (and (eq (nth 1 type) 'visible) (not silent))) - (gnus-group-indentation - (make-string (* gnus-topic-indent-level level) ? )) - (beg (progn (beginning-of-line) (point))) - (topicl (reverse topicl)) - (all-entries entries) - (point-max (point-max)) - (unread 0) - (topic (car type)) - info entry end active tick) - ;; Insert any sub-topics. - (while topicl - (incf unread - (gnus-topic-prepare-topic - (pop topicl) (1+ level) list-level predicate - (not visiblep) lowest regexp))) - (setq end (point)) - (goto-char beg) - ;; Insert all the groups that belong in this topic. - (while (setq entry (pop entries)) - (when (if (stringp entry) - (gnus-group-prepare-logic - entry - (and - (or (not gnus-group-listed-groups) - (if (< list-level gnus-level-zombie) nil - (let ((entry-level - (if (member entry gnus-zombie-list) - gnus-level-zombie gnus-level-killed))) - (and (<= entry-level list-level) - (>= entry-level lowest))))) - (cond - ((stringp regexp) - (string-match regexp entry)) - ((functionp regexp) - (funcall regexp entry)) - ((null regexp) t) - (t nil)))) - (setq info (nth 2 entry)) - (gnus-group-prepare-logic - (gnus-info-group info) - (and (or (not gnus-group-listed-groups) - (let ((entry-level (gnus-info-level info))) - (and (<= entry-level list-level) - (>= entry-level lowest)))) - (or (not (functionp predicate)) - (funcall predicate info)) - (or (not (stringp regexp)) - (string-match regexp (gnus-info-group info)))))) - (when visiblep - (if (stringp entry) - ;; Dead groups. - (gnus-group-insert-group-line - entry (if (member entry gnus-zombie-list) - gnus-level-zombie gnus-level-killed) - nil (- (1+ (cdr (setq active (gnus-active entry)))) - (car active)) - nil) - ;; Living groups. - (when (setq info (nth 2 entry)) - (gnus-group-insert-group-line - (gnus-info-group info) - (gnus-info-level info) (gnus-info-marks info) - (car entry) (gnus-info-method info))))) - (when (and (listp entry) - (numberp (car entry))) - (incf unread (car entry))) - (when (listp entry) - (setq tick t)))) - (goto-char beg) - ;; Insert the topic line. - (when (and (not silent) - (or gnus-topic-display-empty-topics ;We want empty topics - (not (zerop unread)) ;Non-empty - tick ;Ticked articles - (/= point-max (point-max)))) ;Unactivated groups - (gnus-extent-start-open (point)) - (gnus-topic-insert-topic-line - (car type) visiblep - (not (eq (nth 2 type) 'hidden)) - level all-entries unread)) - (gnus-topic-update-unreads (car type) unread) - (goto-char end) - unread)) - -(defun gnus-topic-remove-topic (&optional insert total-remove hide in-level) - "Remove the current topic." - (let ((topic (gnus-group-topic-name)) - (level (gnus-group-topic-level)) - (beg (progn (beginning-of-line) (point))) - buffer-read-only) - (when topic - (while (and (zerop (forward-line 1)) - (> (or (gnus-group-topic-level) (1+ level)) level))) - (delete-region beg (point)) - ;; Do the change in this rather odd manner because it has been - ;; reported that some topics share parts of some lists, for some - ;; reason. I have been unable to determine why this is the - ;; case, but this hack seems to take care of things. - (let ((data (cadr (gnus-topic-find-topology topic)))) - (setcdr data - (list (if insert 'visible 'invisible) - (caddr data) - (cadddr data)))) - (if total-remove - (setq gnus-topic-alist - (delq (assoc topic gnus-topic-alist) gnus-topic-alist)) - (gnus-topic-insert-topic topic in-level))))) - -(defun gnus-topic-insert-topic (topic &optional level) - "Insert TOPIC." - (gnus-group-prepare-topics - (car gnus-group-list-mode) (cdr gnus-group-list-mode) - nil nil topic level)) - -(defun gnus-topic-fold (&optional insert topic) - "Remove/insert the current topic." - (let ((topic (or topic (gnus-group-topic-name)))) - (when topic - (save-excursion - (if (not (gnus-group-active-topic-p)) - (gnus-topic-remove-topic - (or insert (not (gnus-topic-visible-p)))) - (let ((gnus-topic-topology gnus-topic-active-topology) - (gnus-topic-alist gnus-topic-active-alist) - (gnus-group-list-mode (cons 5 t))) - (gnus-topic-remove-topic - (or insert (not (gnus-topic-visible-p))) nil nil 9) - (gnus-topic-enter-dribble))))))) - -(defun gnus-topic-insert-topic-line (name visiblep shownp level entries - &optional unread) - (let* ((visible (if visiblep "" "...")) - (indentation (make-string (* gnus-topic-indent-level level) ? )) - (total-number-of-articles unread) - (number-of-groups (length entries)) - (active-topic (eq gnus-topic-alist gnus-topic-active-alist)) - gnus-tmp-header) - (gnus-topic-update-unreads name unread) - (beginning-of-line) - ;; Insert the text. - (if shownp - (gnus-add-text-properties - (point) - (prog1 (1+ (point)) - (eval gnus-topic-line-format-spec)) - (list 'gnus-topic (intern name) - 'gnus-topic-level level - 'gnus-topic-unread unread - 'gnus-active active-topic - 'gnus-topic-visible visiblep))))) - -(defun gnus-topic-update-unreads (topic unreads) - (setq gnus-topic-unreads (delq (assoc topic gnus-topic-unreads) - gnus-topic-unreads)) - (push (cons topic unreads) gnus-topic-unreads)) - -(defun gnus-topic-update-topics-containing-group (group) - "Update all topics that have GROUP as a member." - (when (and (eq major-mode 'gnus-group-mode) - gnus-topic-mode) - (save-excursion - (let ((alist gnus-topic-alist)) - ;; This is probably not entirely correct. If a topic - ;; isn't shown, then it's not updated. But the updating - ;; should be performed in any case, since the topic's - ;; parent should be updated. Pfft. - (while alist - (when (and (member group (cdar alist)) - (gnus-topic-goto-topic (caar alist))) - (gnus-topic-update-topic-line (caar alist))) - (pop alist)))))) - -(defun gnus-topic-update-topic () - "Update all parent topics to the current group." - (when (and (eq major-mode 'gnus-group-mode) - gnus-topic-mode) - (let ((group (gnus-group-group-name)) - (m (point-marker)) - (buffer-read-only nil)) - (when (and group - (gnus-get-info group) - (gnus-topic-goto-topic (gnus-current-topic))) - (gnus-topic-update-topic-line (gnus-group-topic-name)) - (goto-char m) - (set-marker m nil) - (gnus-group-position-point))))) - -(defun gnus-topic-goto-missing-group (group) - "Place point where GROUP is supposed to be inserted." - (let* ((topic (gnus-group-topic group)) - (groups (cdr (assoc topic gnus-topic-alist))) - (g (cdr (member group groups))) - (unfound t) - entry) - ;; Try to jump to a visible group. - (while (and g (not (gnus-group-goto-group (car g) t))) - (pop g)) - ;; It wasn't visible, so we try to see where to insert it. - (when (not g) - (setq g (cdr (member group (reverse groups)))) - (while (and g unfound) - (when (gnus-group-goto-group (pop g) t) - (forward-line 1) - (setq unfound nil))) - (when (and unfound - topic - (not (gnus-topic-goto-missing-topic topic))) - (let* ((top (gnus-topic-find-topology topic)) - (children (cddr top)) - (type (cadr top)) - (unread 0) - (entries (gnus-topic-find-groups - (car type) (car gnus-group-list-mode) - (cdr gnus-group-list-mode)))) - (while children - (incf unread (gnus-topic-unread (caar (pop children))))) - (while (setq entry (pop entries)) - (when (numberp (car entry)) - (incf unread (car entry)))) - (gnus-topic-insert-topic-line - topic t t (car (gnus-topic-find-topology topic)) nil unread)))))) - -(defun gnus-topic-goto-missing-topic (topic) - (if (gnus-topic-goto-topic topic) - (forward-line 1) - ;; Topic not displayed. - (let* ((top (gnus-topic-find-topology - (gnus-topic-parent-topic topic))) - (tp (reverse (cddr top)))) - (if (not top) - (gnus-topic-insert-topic-line - topic t t (car (gnus-topic-find-topology topic)) nil 0) - (while (not (equal (caaar tp) topic)) - (setq tp (cdr tp))) - (pop tp) - (while (and tp - (not (gnus-topic-goto-topic (caaar tp)))) - (pop tp)) - (if tp - (gnus-topic-forward-topic 1) - (gnus-topic-goto-missing-topic (caadr top))))) - nil)) - -(defun gnus-topic-update-topic-line (topic-name &optional reads) - (let* ((top (gnus-topic-find-topology topic-name)) - (type (cadr top)) - (children (cddr top)) - (entries (gnus-topic-find-groups - (car type) (car gnus-group-list-mode) - (cdr gnus-group-list-mode))) - (parent (gnus-topic-parent-topic topic-name)) - (all-entries entries) - (unread 0) - old-unread entry new-unread) - (when (gnus-topic-goto-topic (car type)) - ;; Tally all the groups that belong in this topic. - (if reads - (setq unread (- (gnus-group-topic-unread) reads)) - (while children - (incf unread (gnus-topic-unread (caar (pop children))))) - (while (setq entry (pop entries)) - (when (numberp (car entry)) - (incf unread (car entry))))) - (setq old-unread (gnus-group-topic-unread)) - ;; Insert the topic line. - (gnus-topic-insert-topic-line - (car type) (gnus-topic-visible-p) - (not (eq (nth 2 type) 'hidden)) - (gnus-group-topic-level) all-entries unread) - (gnus-delete-line) - (forward-line -1) - (setq new-unread (gnus-group-topic-unread))) - (when parent - (forward-line -1) - (gnus-topic-update-topic-line - parent - (- (or old-unread 0) (or new-unread 0)))) - unread)) - -(defun gnus-topic-group-indentation () - (make-string - (* gnus-topic-indent-level - (or (save-excursion - (forward-line -1) - (gnus-topic-goto-topic (gnus-current-topic)) - (gnus-group-topic-level)) - 0)) - ? )) - -;;; Initialization - -(gnus-add-shutdown 'gnus-topic-close 'gnus) - -(defun gnus-topic-close () - (setq gnus-topic-active-topology nil - gnus-topic-active-alist nil - gnus-topic-killed-topics nil - gnus-topology-checked-p nil)) - -(defun gnus-topic-check-topology () - ;; The first time we set the topology to whatever we have - ;; gotten here, which can be rather random. - (unless gnus-topic-alist - (gnus-topic-init-alist)) - - (setq gnus-topology-checked-p t) - ;; Go through the topic alist and make sure that all topics - ;; are in the topic topology. - (let ((topics (gnus-topic-list)) - (alist gnus-topic-alist) - changed) - (while alist - (unless (member (caar alist) topics) - (nconc gnus-topic-topology - (list (list (list (caar alist) 'visible)))) - (setq changed t)) - (setq alist (cdr alist))) - (when changed - (gnus-topic-enter-dribble)) - ;; Conversely, go through the topology and make sure that all - ;; topologies have alists. - (while topics - (unless (assoc (car topics) gnus-topic-alist) - (push (list (car topics)) gnus-topic-alist)) - (pop topics))) - ;; Go through all living groups and make sure that - ;; they belong to some topic. - (let* ((tgroups (apply 'append (mapcar (lambda (entry) (cdr entry)) - gnus-topic-alist))) - (entry (last (assoc (caar gnus-topic-topology) gnus-topic-alist))) - (newsrc (cdr gnus-newsrc-alist)) - group) - (while newsrc - (unless (member (setq group (gnus-info-group (pop newsrc))) tgroups) - (setcdr entry (list group)) - (setq entry (cdr entry))))) - ;; Go through all topics and make sure they contain only living groups. - (let ((alist gnus-topic-alist) - topic) - (while (setq topic (pop alist)) - (while (cdr topic) - (if (and (cadr topic) - (gnus-gethash (cadr topic) gnus-newsrc-hashtb)) - (setq topic (cdr topic)) - (setcdr topic (cddr topic))))))) - -(defun gnus-topic-init-alist () - "Initialize the topic structures." - (setq gnus-topic-topology - (cons (list "Gnus" 'visible) - (mapcar (lambda (topic) - (list (list (car topic) 'visible))) - '(("misc"))))) - (setq gnus-topic-alist - (list (cons "misc" - (mapcar (lambda (info) (gnus-info-group info)) - (cdr gnus-newsrc-alist))) - (list "Gnus"))) - (gnus-topic-enter-dribble)) - -;;; Maintenance - -(defun gnus-topic-clean-alist () - "Remove bogus groups from the topic alist." - (let ((topic-alist gnus-topic-alist) - result topic) - (unless gnus-killed-hashtb - (gnus-make-hashtable-from-killed)) - (while (setq topic (pop topic-alist)) - (let ((topic-name (pop topic)) - group filtered-topic) - (while (setq group (pop topic)) - (when (and (or (gnus-gethash group gnus-active-hashtb) - (gnus-info-method (gnus-get-info group))) - (not (gnus-gethash group gnus-killed-hashtb))) - (push group filtered-topic))) - (push (cons topic-name (nreverse filtered-topic)) result))) - (setq gnus-topic-alist (nreverse result)))) - -(defun gnus-topic-change-level (group level oldlevel &optional previous) - "Run when changing levels to enter/remove groups from topics." - (save-excursion - (set-buffer gnus-group-buffer) - (let ((buffer-read-only nil)) - (unless gnus-topic-inhibit-change-level - (gnus-group-goto-group (or (car (nth 2 previous)) group)) - (when (and gnus-topic-mode - gnus-topic-alist - (not gnus-topic-inhibit-change-level)) - ;; Remove the group from the topics. - (if (and (< oldlevel gnus-level-zombie) - (>= level gnus-level-zombie)) - (let ((alist gnus-topic-alist)) - (while (gnus-group-goto-group group) - (gnus-delete-line)) - (while alist - (when (member group (car alist)) - (setcdr (car alist) (delete group (cdar alist)))) - (pop alist))) - ;; If the group is subscribed we enter it into the topics. - (when (and (< level gnus-level-zombie) - (>= oldlevel gnus-level-zombie)) - (let* ((prev (gnus-group-group-name)) - (gnus-topic-inhibit-change-level t) - (gnus-group-indentation - (make-string - (* gnus-topic-indent-level - (or (save-excursion - (gnus-topic-goto-topic (gnus-current-topic)) - (gnus-group-topic-level)) - 0)) - ? )) - (yanked (list group)) - alist talist end) - ;; Then we enter the yanked groups into the topics they belong - ;; to. - (when (setq alist (assoc (save-excursion - (forward-line -1) - (or - (gnus-current-topic) - (caar gnus-topic-topology))) - gnus-topic-alist)) - (setq talist alist) - (when (stringp yanked) - (setq yanked (list yanked))) - (if (not prev) - (nconc alist yanked) - (if (not (cdr alist)) - (setcdr alist (nconc yanked (cdr alist))) - (while (and (not end) (cdr alist)) - (when (equal (cadr alist) prev) - (setcdr alist (nconc yanked (cdr alist))) - (setq end t)) - (setq alist (cdr alist))) - (unless end - (nconc talist yanked)))))) - (gnus-topic-update-topic)))))))) - -(defun gnus-topic-goto-next-group (group props) - "Go to group or the next group after group." - (if (not group) - (if (not (memq 'gnus-topic props)) - (goto-char (point-max)) - (gnus-topic-goto-topic (symbol-name (cadr (memq 'gnus-topic props))))) - (if (gnus-group-goto-group group) - t - ;; The group is no longer visible. - (let* ((list (assoc (gnus-group-topic group) gnus-topic-alist)) - (after (cdr (member group (cdr list))))) - ;; First try to put point on a group after the current one. - (while (and after - (not (gnus-group-goto-group (car after)))) - (setq after (cdr after))) - ;; Then try to put point on a group before point. - (unless after - (setq after (cdr (member group (reverse (cdr list))))) - (while (and after - (not (gnus-group-goto-group (car after)))) - (setq after (cdr after)))) - ;; Finally, just put point on the topic. - (if (not (car list)) - (goto-char (point-min)) - (unless after - (gnus-topic-goto-topic (car list)) - (setq after nil))) - t)))) - -;;; Topic-active functions - -(defun gnus-topic-grok-active (&optional force) - "Parse all active groups and create topic structures for them." - ;; First we make sure that we have really read the active file. - (when (or force - (not gnus-topic-active-alist)) - (let (groups) - ;; Get a list of all groups available. - (mapatoms (lambda (g) (when (symbol-value g) - (push (symbol-name g) groups))) - gnus-active-hashtb) - (setq groups (sort groups 'string<)) - ;; Init the variables. - (setq gnus-topic-active-topology (list (list "" 'visible))) - (setq gnus-topic-active-alist nil) - ;; Descend the top-level hierarchy. - (gnus-topic-grok-active-1 gnus-topic-active-topology groups) - ;; Set the top-level topic names to something nice. - (setcar (car gnus-topic-active-topology) "Gnus active") - (setcar (car gnus-topic-active-alist) "Gnus active")))) - -(defun gnus-topic-grok-active-1 (topology groups) - (let* ((name (caar topology)) - (prefix (concat "^" (regexp-quote name))) - tgroups ntopology group) - (while (and groups - (string-match prefix (setq group (car groups)))) - (if (not (string-match "\\." group (match-end 0))) - ;; There are no further hierarchies here, so we just - ;; enter this group into the list belonging to this - ;; topic. - (push (pop groups) tgroups) - ;; New sub-hierarchy, so we add it to the topology. - (nconc topology (list (setq ntopology - (list (list (substring - group 0 (match-end 0)) - 'invisible))))) - ;; Descend the hierarchy. - (setq groups (gnus-topic-grok-active-1 ntopology groups)))) - ;; We remove the trailing "." from the topic name. - (setq name - (if (string-match "\\.$" name) - (substring name 0 (match-beginning 0)) - name)) - ;; Add this topic and its groups to the topic alist. - (push (cons name (nreverse tgroups)) gnus-topic-active-alist) - (setcar (car topology) name) - ;; We return the rest of the groups that didn't belong - ;; to this topic. - groups)) - -;;; Topic mode, commands and keymap. - -(defvar gnus-topic-mode-map nil) -(defvar gnus-group-topic-map nil) - -(unless gnus-topic-mode-map - (setq gnus-topic-mode-map (make-sparse-keymap)) - - ;; Override certain group mode keys. - (gnus-define-keys gnus-topic-mode-map - "=" gnus-topic-select-group - "\r" gnus-topic-select-group - " " gnus-topic-read-group - "\C-c\C-x" gnus-topic-expire-articles - "\C-k" gnus-topic-kill-group - "\C-y" gnus-topic-yank-group - "\M-g" gnus-topic-get-new-news-this-topic - "AT" gnus-topic-list-active - "Gp" gnus-topic-edit-parameters - "#" gnus-topic-mark-topic - "\M-#" gnus-topic-unmark-topic - [tab] gnus-topic-indent - [(meta tab)] gnus-topic-unindent - "\C-i" gnus-topic-indent - "\M-\C-i" gnus-topic-unindent - gnus-mouse-2 gnus-mouse-pick-topic) - - ;; Define a new submap. - (gnus-define-keys (gnus-group-topic-map "T" gnus-topic-mode-map) - "#" gnus-topic-mark-topic - "\M-#" gnus-topic-unmark-topic - "n" gnus-topic-create-topic - "m" gnus-topic-move-group - "D" gnus-topic-remove-group - "c" gnus-topic-copy-group - "h" gnus-topic-hide-topic - "s" gnus-topic-show-topic - "j" gnus-topic-jump-to-topic - "M" gnus-topic-move-matching - "C" gnus-topic-copy-matching - "\C-i" gnus-topic-indent - [tab] gnus-topic-indent - "r" gnus-topic-rename - "\177" gnus-topic-delete - [delete] gnus-topic-delete - "H" gnus-topic-toggle-display-empty-topics) - - (gnus-define-keys (gnus-topic-sort-map "S" gnus-group-topic-map) - "s" gnus-topic-sort-groups - "a" gnus-topic-sort-groups-by-alphabet - "u" gnus-topic-sort-groups-by-unread - "l" gnus-topic-sort-groups-by-level - "v" gnus-topic-sort-groups-by-score - "r" gnus-topic-sort-groups-by-rank - "m" gnus-topic-sort-groups-by-method)) - -(defun gnus-topic-make-menu-bar () - (unless (boundp 'gnus-topic-menu) - (easy-menu-define - gnus-topic-menu gnus-topic-mode-map "" - '("Topics" - ["Toggle topics" gnus-topic-mode t] - ("Groups" - ["Copy" gnus-topic-copy-group t] - ["Move" gnus-topic-move-group t] - ["Remove" gnus-topic-remove-group t] - ["Copy matching" gnus-topic-copy-matching t] - ["Move matching" gnus-topic-move-matching t]) - ("Topics" - ["Goto" gnus-topic-jump-to-topic t] - ["Show" gnus-topic-show-topic t] - ["Hide" gnus-topic-hide-topic t] - ["Delete" gnus-topic-delete t] - ["Rename" gnus-topic-rename t] - ["Create" gnus-topic-create-topic t] - ["Mark" gnus-topic-mark-topic t] - ["Indent" gnus-topic-indent t] - ["Sort" gnus-topic-sort-topics t] - ["Toggle hide empty" gnus-topic-toggle-display-empty-topics t] - ["Edit parameters" gnus-topic-edit-parameters t]) - ["List active" gnus-topic-list-active t])))) - -(defun gnus-topic-mode (&optional arg redisplay) - "Minor mode for topicsifying Gnus group buffers." - (interactive (list current-prefix-arg t)) - (when (eq major-mode 'gnus-group-mode) - (make-local-variable 'gnus-topic-mode) - (setq gnus-topic-mode - (if (null arg) (not gnus-topic-mode) - (> (prefix-numeric-value arg) 0))) - ;; Infest Gnus with topics. - (if (not gnus-topic-mode) - (setq gnus-goto-missing-group-function nil) - (when (gnus-visual-p 'topic-menu 'menu) - (gnus-topic-make-menu-bar)) - (gnus-set-format 'topic t) - (gnus-add-minor-mode 'gnus-topic-mode " Topic" - gnus-topic-mode-map nil (lambda (&rest junk) - (interactive) - (gnus-topic-mode nil t))) - (add-hook 'gnus-group-catchup-group-hook 'gnus-topic-update-topic) - (set (make-local-variable 'gnus-group-prepare-function) - 'gnus-group-prepare-topics) - (set (make-local-variable 'gnus-group-get-parameter-function) - 'gnus-group-topic-parameters) - (set (make-local-variable 'gnus-group-goto-next-group-function) - 'gnus-topic-goto-next-group) - (set (make-local-variable 'gnus-group-indentation-function) - 'gnus-topic-group-indentation) - (set (make-local-variable 'gnus-group-update-group-function) - 'gnus-topic-update-topics-containing-group) - (set (make-local-variable 'gnus-group-sort-alist-function) - 'gnus-group-sort-topic) - (setq gnus-group-change-level-function 'gnus-topic-change-level) - (setq gnus-goto-missing-group-function 'gnus-topic-goto-missing-group) - (make-local-hook 'gnus-check-bogus-groups-hook) - (add-hook 'gnus-check-bogus-groups-hook 'gnus-topic-clean-alist) - (setq gnus-topology-checked-p nil) - ;; We check the topology. - (when gnus-newsrc-alist - (gnus-topic-check-topology)) - (gnus-run-hooks 'gnus-topic-mode-hook)) - ;; Remove topic infestation. - (unless gnus-topic-mode - (remove-hook 'gnus-summary-exit-hook 'gnus-topic-update-topic) - (setq gnus-group-change-level-function nil) - (remove-hook 'gnus-check-bogus-groups-hook 'gnus-topic-clean-alist) - (setq gnus-group-prepare-function 'gnus-group-prepare-flat) - (setq gnus-group-sort-alist-function 'gnus-group-sort-flat)) - (when redisplay - (gnus-group-list-groups)))) - -(defun gnus-topic-select-group (&optional all) - "Select this newsgroup. -No article is selected automatically. -If the group is opened, just switch the summary buffer. -If ALL is non-nil, already read articles become readable. -If ALL is a number, fetch this number of articles. - -If performed over a topic line, toggle folding the topic." - (interactive "P") - (if (gnus-group-topic-p) - (let ((gnus-group-list-mode - (if all (cons (if (numberp all) all 7) t) gnus-group-list-mode))) - (gnus-topic-fold all) - (gnus-dribble-touch)) - (gnus-group-select-group all))) - -(defun gnus-mouse-pick-topic (e) - "Select the group or topic under the mouse pointer." - (interactive "e") - (mouse-set-point e) - (gnus-topic-read-group nil)) - -(defun gnus-topic-expire-articles (topic) - "Expire articles in this topic or group." - (interactive (list (gnus-group-topic-name))) - (if (not topic) - (call-interactively 'gnus-group-expire-articles) - (save-excursion - (gnus-message 5 "Expiring groups in %s..." topic) - (let ((gnus-group-marked - (mapcar (lambda (entry) (car (nth 2 entry))) - (gnus-topic-find-groups topic gnus-level-killed t)))) - (gnus-group-expire-articles nil)) - (gnus-message 5 "Expiring groups in %s...done" topic)))) - -(defun gnus-topic-read-group (&optional all no-article group) - "Read news in this newsgroup. -If the prefix argument ALL is non-nil, already read articles become -readable. IF ALL is a number, fetch this number of articles. If the -optional argument NO-ARTICLE is non-nil, no article will be -auto-selected upon group entry. If GROUP is non-nil, fetch that -group. - -If performed over a topic line, toggle folding the topic." - (interactive "P") - (if (gnus-group-topic-p) - (let ((gnus-group-list-mode - (if all (cons (if (numberp all) all 7) t) gnus-group-list-mode))) - (gnus-topic-fold all)) - (gnus-group-read-group all no-article group))) - -(defun gnus-topic-create-topic (topic parent &optional previous full-topic) - "Create a new TOPIC under PARENT. -When used interactively, PARENT will be the topic under point." - (interactive - (list - (read-string "New topic: ") - (gnus-current-topic))) - ;; Check whether this topic already exists. - (when (gnus-topic-find-topology topic) - (error "Topic already exists")) - (unless parent - (setq parent (caar gnus-topic-topology))) - (let ((top (cdr (gnus-topic-find-topology parent))) - (full-topic (or full-topic (list (list topic 'visible nil nil))))) - (unless top - (error "No such parent topic: %s" parent)) - (if previous - (progn - (while (and (cdr top) - (not (equal (caaadr top) previous))) - (setq top (cdr top))) - (setcdr top (cons full-topic (cdr top)))) - (nconc top (list full-topic))) - (unless (assoc topic gnus-topic-alist) - (push (list topic) gnus-topic-alist))) - (gnus-topic-enter-dribble) - (gnus-group-list-groups) - (gnus-topic-goto-topic topic)) - -;; FIXME: -;; 1. When the marked groups are overlapped with the process -;; region, the behavior of move or remove is not right. -;; 2. Can't process on several marked groups with a same name, -;; because gnus-group-marked only keeps one copy. - -(defun gnus-topic-move-group (n topic &optional copyp) - "Move the next N groups to TOPIC. -If COPYP, copy the groups instead." - (interactive - (list current-prefix-arg - (completing-read "Move to topic: " gnus-topic-alist nil t))) - (let ((use-marked (and (not n) (not (gnus-region-active-p)) - gnus-group-marked t)) - (groups (gnus-group-process-prefix n)) - (topicl (assoc topic gnus-topic-alist)) - (start-topic (gnus-group-topic-name)) - (start-group (progn (forward-line 1) (gnus-group-group-name))) - entry) - (if (and (not groups) (not copyp) start-topic) - (gnus-topic-move start-topic topic) - (mapcar - (lambda (g) - (gnus-group-remove-mark g use-marked) - (when (and - (setq entry (assoc (gnus-current-topic) gnus-topic-alist)) - (not copyp)) - (setcdr entry (gnus-delete-first g (cdr entry)))) - (nconc topicl (list g))) - groups) - (gnus-topic-enter-dribble) - (if start-group - (gnus-group-goto-group start-group) - (gnus-topic-goto-topic start-topic)) - (gnus-group-list-groups)))) - -(defun gnus-topic-remove-group (&optional n) - "Remove the current group from the topic." - (interactive "P") - (let ((use-marked (and (not n) (not (gnus-region-active-p)) - gnus-group-marked t)) - (groups (gnus-group-process-prefix n))) - (mapcar - (lambda (group) - (gnus-group-remove-mark group use-marked) - (let ((topicl (assoc (gnus-current-topic) gnus-topic-alist)) - (buffer-read-only nil)) - (when (and topicl group) - (gnus-delete-line) - (gnus-delete-first group topicl)) - (gnus-topic-update-topic))) - groups) - (gnus-topic-enter-dribble) - (gnus-group-position-point))) - -(defun gnus-topic-copy-group (n topic) - "Copy the current group to a topic." - (interactive - (list current-prefix-arg - (completing-read "Copy to topic: " gnus-topic-alist nil t))) - (gnus-topic-move-group n topic t)) - -(defun gnus-topic-kill-group (&optional n discard) - "Kill the next N groups." - (interactive "P") - (if (gnus-group-topic-p) - (let ((topic (gnus-group-topic-name))) - (push (cons - (gnus-topic-find-topology topic) - (assoc topic gnus-topic-alist)) - gnus-topic-killed-topics) - (gnus-topic-remove-topic nil t) - (gnus-topic-find-topology topic nil nil gnus-topic-topology) - (gnus-topic-enter-dribble)) - (gnus-group-kill-group n discard) - (if (not (gnus-group-topic-p)) - (gnus-topic-update-topic) - ;; Move up one line so that we update the right topic. - (forward-line -1) - (gnus-topic-update-topic) - (forward-line 1)))) - -(defun gnus-topic-yank-group (&optional arg) - "Yank the last topic." - (interactive "p") - (if gnus-topic-killed-topics - (let* ((previous - (or (gnus-group-topic-name) - (gnus-topic-next-topic (gnus-current-topic)))) - (data (pop gnus-topic-killed-topics)) - (alist (cdr data)) - (item (cdar data))) - (push alist gnus-topic-alist) - (gnus-topic-create-topic - (caar item) (gnus-topic-parent-topic previous) previous - item) - (gnus-topic-enter-dribble) - (gnus-topic-goto-topic (caar item))) - (let* ((prev (gnus-group-group-name)) - (gnus-topic-inhibit-change-level t) - (gnus-group-indentation - (make-string - (* gnus-topic-indent-level - (or (save-excursion - (gnus-topic-goto-topic (gnus-current-topic)) - (gnus-group-topic-level)) - 0)) - ? )) - yanked alist) - ;; We first yank the groups the normal way... - (setq yanked (gnus-group-yank-group arg)) - ;; Then we enter the yanked groups into the topics they belong - ;; to. - (setq alist (assoc (save-excursion - (forward-line -1) - (gnus-current-topic)) - gnus-topic-alist)) - (when (stringp yanked) - (setq yanked (list yanked))) - (if (not prev) - (nconc alist yanked) - (if (not (cdr alist)) - (setcdr alist (nconc yanked (cdr alist))) - (while (cdr alist) - (when (equal (cadr alist) prev) - (setcdr alist (nconc yanked (cdr alist))) - (setq alist nil)) - (setq alist (cdr alist)))))) - (gnus-topic-update-topic))) - -(defun gnus-topic-hide-topic (&optional permanent) - "Hide the current topic. -If PERMANENT, make it stay hidden in subsequent sessions as well." - (interactive "P") - (when (gnus-current-topic) - (gnus-topic-goto-topic (gnus-current-topic)) - (if permanent - (setcar (cddr - (cadr - (gnus-topic-find-topology (gnus-current-topic)))) - 'hidden)) - (gnus-topic-remove-topic nil nil))) - -(defun gnus-topic-show-topic (&optional permanent) - "Show the hidden topic. -If PERMANENT, make it stay shown in subsequent sessions as well." - (interactive "P") - (when (gnus-group-topic-p) - (if (not permanent) - (gnus-topic-remove-topic t nil) - (let ((topic - (gnus-topic-find-topology - (completing-read "Show topic: " gnus-topic-alist nil t)))) - (setcar (cddr (cadr topic)) nil) - (setcar (cdr (cadr topic)) 'visible) - (gnus-group-list-groups))))) - -(defun gnus-topic-mark-topic (topic &optional unmark recursive) - "Mark all groups in the TOPIC with the process mark. -If RECURSIVE is t, mark its subtopics too." - (interactive (list (gnus-group-topic-name) - nil - (and current-prefix-arg t))) - (if (not topic) - (call-interactively 'gnus-group-mark-group) - (save-excursion - (let ((groups (gnus-topic-find-groups topic gnus-level-killed t nil - recursive))) - (while groups - (funcall (if unmark 'gnus-group-remove-mark 'gnus-group-set-mark) - (gnus-info-group (nth 2 (pop groups))))))))) - -(defun gnus-topic-unmark-topic (topic &optional dummy recursive) - "Remove the process mark from all groups in the TOPIC. -If RECURSIVE is t, unmark its subtopics too." - (interactive (list (gnus-group-topic-name) - nil - (and current-prefix-arg t))) - (if (not topic) - (call-interactively 'gnus-group-unmark-group) - (gnus-topic-mark-topic topic t recursive))) - -(defun gnus-topic-get-new-news-this-topic (&optional n) - "Check for new news in the current topic." - (interactive "P") - (if (not (gnus-group-topic-p)) - (gnus-group-get-new-news-this-group n) - (let* ((topic (gnus-group-topic-name)) - (data (cadr (gnus-topic-find-topology topic)))) - (save-excursion - (gnus-topic-mark-topic topic nil (and n t)) - (gnus-group-get-new-news-this-group)) - (gnus-topic-remove-topic (eq 'visible (cadr data)))))) - -(defun gnus-topic-move-matching (regexp topic &optional copyp) - "Move all groups that match REGEXP to some topic." - (interactive - (let (topic) - (nreverse - (list - (setq topic (completing-read "Move to topic: " gnus-topic-alist nil t)) - (read-string (format "Move to %s (regexp): " topic)))))) - (gnus-group-mark-regexp regexp) - (gnus-topic-move-group nil topic copyp)) - -(defun gnus-topic-copy-matching (regexp topic &optional copyp) - "Copy all groups that match REGEXP to some topic." - (interactive - (let (topic) - (nreverse - (list - (setq topic (completing-read "Copy to topic: " gnus-topic-alist nil t)) - (read-string (format "Copy to %s (regexp): " topic)))))) - (gnus-topic-move-matching regexp topic t)) - -(defun gnus-topic-delete (topic) - "Delete a topic." - (interactive (list (gnus-group-topic-name))) - (unless topic - (error "No topic to be deleted")) - (let ((entry (assoc topic gnus-topic-alist)) - (buffer-read-only nil)) - (when (cdr entry) - (error "Topic not empty")) - ;; Delete if visible. - (when (gnus-topic-goto-topic topic) - (gnus-delete-line)) - ;; Remove from alist. - (setq gnus-topic-alist (delq entry gnus-topic-alist)) - ;; Remove from topology. - (gnus-topic-find-topology topic nil nil 'delete) - (gnus-dribble-touch))) - -(defun gnus-topic-rename (old-name new-name) - "Rename a topic." - (interactive - (let ((topic (gnus-current-topic))) - (list topic - (read-string "Rename topic to: " topic)))) - ;; Check whether the new name exists. - (when (gnus-topic-find-topology new-name) - (error "Topic '%s' already exists" new-name)) - ;; "nil" is an invalid name, for reasons I'd rather not go - ;; into here. Trust me. - (when (equal new-name "nil") - (error "Invalid name: %s" nil)) - ;; Do the renaming. - (let ((top (gnus-topic-find-topology old-name)) - (entry (assoc old-name gnus-topic-alist))) - (when top - (setcar (cadr top) new-name)) - (when entry - (setcar entry new-name)) - (forward-line -1) - (gnus-dribble-touch) - (gnus-group-list-groups) - (forward-line 1))) - -(defun gnus-topic-indent (&optional unindent) - "Indent a topic -- make it a sub-topic of the previous topic. -If UNINDENT, remove an indentation." - (interactive "P") - (if unindent - (gnus-topic-unindent) - (let* ((topic (gnus-current-topic)) - (parent (gnus-topic-previous-topic topic)) - (buffer-read-only nil)) - (unless parent - (error "Nothing to indent %s into" topic)) - (when topic - (gnus-topic-goto-topic topic) - (gnus-topic-kill-group) - (push (cdar gnus-topic-killed-topics) gnus-topic-alist) - (gnus-topic-create-topic - topic parent nil (cdaar gnus-topic-killed-topics)) - (pop gnus-topic-killed-topics) - (or (gnus-topic-goto-topic topic) - (gnus-topic-goto-topic parent)))))) - -(defun gnus-topic-unindent () - "Unindent a topic." - (interactive) - (let* ((topic (gnus-current-topic)) - (parent (gnus-topic-parent-topic topic)) - (grandparent (gnus-topic-parent-topic parent))) - (unless grandparent - (error "Nothing to indent %s into" topic)) - (when topic - (gnus-topic-goto-topic topic) - (gnus-topic-kill-group) - (push (cdar gnus-topic-killed-topics) gnus-topic-alist) - (gnus-topic-create-topic - topic grandparent (gnus-topic-next-topic parent) - (cdaar gnus-topic-killed-topics)) - (pop gnus-topic-killed-topics) - (gnus-topic-goto-topic topic)))) - -(defun gnus-topic-list-active (&optional force) - "List all groups that Gnus knows about in a topicsified fashion. -If FORCE, always re-read the active file." - (interactive "P") - (when force - (gnus-get-killed-groups)) - (gnus-topic-grok-active force) - (let ((gnus-topic-topology gnus-topic-active-topology) - (gnus-topic-alist gnus-topic-active-alist) - gnus-killed-list gnus-zombie-list) - (gnus-group-list-groups gnus-level-killed nil 1))) - -(defun gnus-topic-toggle-display-empty-topics () - "Show/hide topics that have no unread articles." - (interactive) - (setq gnus-topic-display-empty-topics - (not gnus-topic-display-empty-topics)) - (gnus-group-list-groups) - (message "%s empty topics" - (if gnus-topic-display-empty-topics - "Showing" "Hiding"))) - -;;; Topic sorting functions - -(defun gnus-topic-edit-parameters (group) - "Edit the group parameters of GROUP. -If performed on a topic, edit the topic parameters instead." - (interactive (list (gnus-group-group-name))) - (if group - (gnus-group-edit-group-parameters group) - (if (not (gnus-group-topic-p)) - (error "Nothing to edit on the current line") - (let ((topic (gnus-group-topic-name))) - (gnus-edit-form - (gnus-topic-parameters topic) - (format "Editing the topic parameters for `%s'." - (or group topic)) - `(lambda (form) - (gnus-topic-set-parameters ,topic form))))))) - -(defun gnus-group-sort-topic (func reverse) - "Sort groups in the topics according to FUNC and REVERSE." - (let ((alist gnus-topic-alist)) - (while alist - ;; !!!Sometimes nil elements sneak into the alist, - ;; for some reason or other. - (setcar alist (delq nil (car alist))) - (setcar alist (delete "dummy.group" (car alist))) - (gnus-topic-sort-topic (pop alist) func reverse)))) - -(defun gnus-topic-sort-topic (topic func reverse) - ;; Each topic only lists the name of the group, while - ;; the sort predicates expect group infos as inputs. - ;; So we first transform the group names into infos, - ;; then sort, and then transform back into group names. - (setcdr - topic - (mapcar - (lambda (info) (gnus-info-group info)) - (sort - (mapcar - (lambda (group) (gnus-get-info group)) - (cdr topic)) - func))) - ;; Do the reversal, if necessary. - (when reverse - (setcdr topic (nreverse (cdr topic))))) - -(defun gnus-topic-sort-groups (func &optional reverse) - "Sort the current topic according to FUNC. -If REVERSE, reverse the sorting order." - (interactive (list gnus-group-sort-function current-prefix-arg)) - (let ((topic (assoc (gnus-current-topic) gnus-topic-alist))) - (gnus-topic-sort-topic - topic (gnus-make-sort-function func) reverse) - (gnus-group-list-groups))) - -(defun gnus-topic-sort-groups-by-alphabet (&optional reverse) - "Sort the current topic alphabetically by group name. -If REVERSE, sort in reverse order." - (interactive "P") - (gnus-topic-sort-groups 'gnus-group-sort-by-alphabet reverse)) - -(defun gnus-topic-sort-groups-by-unread (&optional reverse) - "Sort the current topic by number of unread articles. -If REVERSE, sort in reverse order." - (interactive "P") - (gnus-topic-sort-groups 'gnus-group-sort-by-unread reverse)) - -(defun gnus-topic-sort-groups-by-level (&optional reverse) - "Sort the current topic by group level. -If REVERSE, sort in reverse order." - (interactive "P") - (gnus-topic-sort-groups 'gnus-group-sort-by-level reverse)) - -(defun gnus-topic-sort-groups-by-score (&optional reverse) - "Sort the current topic by group score. -If REVERSE, sort in reverse order." - (interactive "P") - (gnus-topic-sort-groups 'gnus-group-sort-by-score reverse)) - -(defun gnus-topic-sort-groups-by-rank (&optional reverse) - "Sort the current topic by group rank. -If REVERSE, sort in reverse order." - (interactive "P") - (gnus-topic-sort-groups 'gnus-group-sort-by-rank reverse)) - -(defun gnus-topic-sort-groups-by-method (&optional reverse) - "Sort the current topic alphabetically by backend name. -If REVERSE, sort in reverse order." - (interactive "P") - (gnus-topic-sort-groups 'gnus-group-sort-by-method reverse)) - -(defun gnus-topic-sort-topics-1 (top reverse) - (if (cdr top) - (let ((subtop - (mapcar (gnus-byte-compile - `(lambda (top) - (gnus-topic-sort-topics-1 top ,reverse))) - (sort (cdr top) - (lambda (t1 t2) - (string-lessp (caar t1) (caar t2))))))) - (setcdr top (if reverse (reverse subtop) subtop)))) - top) - -(defun gnus-topic-sort-topics (&optional topic reverse) - "Sort topics in TOPIC alphabeticaly by topic name. -If REVERSE, reverse the sorting order." - (interactive - (list (completing-read "Sort topics in : " gnus-topic-alist nil t - (gnus-current-topic)) - current-prefix-arg)) - (let ((topic-topology (or (and topic (cdr (gnus-topic-find-topology topic))) - gnus-topic-topology))) - (gnus-topic-sort-topics-1 topic-topology reverse) - (gnus-topic-enter-dribble) - (gnus-group-list-groups) - (gnus-topic-goto-topic topic))) - -(defun gnus-topic-move (current to) - "Move the CURRENT topic to TO." - (interactive - (list - (gnus-group-topic-name) - (completing-read "Move to topic: " gnus-topic-alist nil t))) - (unless (and current to) - (error "Can't find topic")) - (let ((current-top (cdr (gnus-topic-find-topology current))) - (to-top (cdr (gnus-topic-find-topology to)))) - (unless current-top - (error "Can't find topic `%s'" current)) - (unless to-top - (error "Can't find topic `%s'" to)) - (if (gnus-topic-find-topology to current-top 0);; Don't care the level - (error "Can't move `%s' to its sub-level" current)) - (gnus-topic-find-topology current nil nil 'delete) - (while (cdr to-top) - (setq to-top (cdr to-top))) - (setcdr to-top (list current-top)) - (gnus-topic-enter-dribble) - (gnus-group-list-groups) - (gnus-topic-goto-topic current))) - -(defun gnus-subscribe-topics (newsgroup) - (catch 'end - (let (match gnus-group-change-level-function) - (dolist (topic (gnus-topic-list)) - (when (and (setq match (cdr (assq 'subscribe - (gnus-topic-parameters topic)))) - (string-match match newsgroup)) - ;; Just subscribe the group. - (gnus-subscribe-alphabetically newsgroup) - ;; Add the group to the topic. - (nconc (assoc topic gnus-topic-alist) (list newsgroup)) - (throw 'end t))) - nil))) - -(provide 'gnus-topic) - -;;; gnus-topic.el ends here diff --git a/lisp/gnus-undo.el b/lisp/gnus-undo.el deleted file mode 100644 index 7dd333f..0000000 --- a/lisp/gnus-undo.el +++ /dev/null @@ -1,195 +0,0 @@ -;;; gnus-undo.el --- minor mode for undoing in Gnus - -;; Copyright (C) 1996, 1997, 1998, 1999, 2000 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;; This package allows arbitrary undoing in Gnus buffers. As all the -;; Gnus buffers aren't very text-oriented (what is in the buffers is -;; just some arbitrary representation of the actual data), normal Emacs -;; undoing doesn't work at all for Gnus. -;; -;; This package works by letting Gnus register functions for reversing -;; actions, and then calling these functions when the user pushes the -;; `undo' key. As with normal `undo', there it is possible to set -;; undo boundaries and so on. -;; -;; Internally, the undo sequence is represented by the -;; `gnus-undo-actions' list, where each element is a list of functions -;; to be called, in sequence, to undo some action. (An "action" is a -;; collection of functions.) -;; -;; For instance, a function for killing a group will call -;; `gnus-undo-register' with a function that un-kills the group. This -;; package will put that function into an action. - -;;; Code: - -(eval-when-compile (require 'cl)) - -(require 'gnus-util) -(require 'gnus) -(require 'custom) - -(defgroup gnus-undo nil - "Undoing in Gnus buffers." - :group 'gnus) - -(defcustom gnus-undo-limit 2000 - "The number of undoable actions recorded." - :type 'integer - :group 'gnus-undo) - -(defcustom gnus-undo-mode nil - "Minor mode for undoing in Gnus buffers." - :type 'boolean - :group 'gnus-undo) - -(defcustom gnus-undo-mode-hook nil - "Hook called in all `gnus-undo-mode' buffers." - :type 'hook - :group 'gnus-undo) - -;;; Internal variables. - -(defvar gnus-undo-actions nil) -(defvar gnus-undo-boundary t) -(defvar gnus-undo-last nil) -(defvar gnus-undo-boundary-inhibit nil) - -;;; Minor mode definition. - -(defvar gnus-undo-mode-map nil) - -(unless gnus-undo-mode-map - (setq gnus-undo-mode-map (make-sparse-keymap)) - - (gnus-define-keys gnus-undo-mode-map - "\M-\C-_" gnus-undo - "\C-_" gnus-undo - "\C-xu" gnus-undo - ;; many people are used to type `C-/' on X terminals and get `C-_'. - [(control /)] gnus-undo)) - -(defun gnus-undo-make-menu-bar () - ;; This is disabled for the time being. - (when nil - (define-key-after (current-local-map) [menu-bar file gnus-undo] - (cons "Undo" 'gnus-undo-actions) - [menu-bar file whatever]))) - -(defun gnus-undo-mode (&optional arg) - "Minor mode for providing `undo' in Gnus buffers. - -\\{gnus-undo-mode-map}" - (interactive "P") - (set (make-local-variable 'gnus-undo-mode) - (if (null arg) (not gnus-undo-mode) - (> (prefix-numeric-value arg) 0))) - (set (make-local-variable 'gnus-undo-actions) nil) - (set (make-local-variable 'gnus-undo-boundary) t) - (when gnus-undo-mode - ;; Set up the menu. - (when (gnus-visual-p 'undo-menu 'menu) - (gnus-undo-make-menu-bar)) - (gnus-add-minor-mode 'gnus-undo-mode "" gnus-undo-mode-map) - (make-local-hook 'post-command-hook) - (add-hook 'post-command-hook 'gnus-undo-boundary nil t) - (gnus-run-hooks 'gnus-undo-mode-hook))) - -;;; Interface functions. - -(defun gnus-disable-undo (&optional buffer) - "Disable undoing in the current buffer." - (interactive) - (save-excursion - (when buffer - (set-buffer buffer)) - (gnus-undo-mode -1))) - -(defun gnus-undo-boundary () - "Set Gnus undo boundary." - (if gnus-undo-boundary-inhibit - (setq gnus-undo-boundary-inhibit nil) - (setq gnus-undo-boundary t))) - -(defun gnus-undo-force-boundary () - "Set Gnus undo boundary." - (setq gnus-undo-boundary-inhibit nil - gnus-undo-boundary t)) - -(defun gnus-undo-register (form) - "Register FORMS as something to be performed to undo a change. -FORMS may use backtick quote syntax." - (when gnus-undo-mode - (gnus-undo-register-1 - `(lambda () - ,form)))) - -(put 'gnus-undo-register 'lisp-indent-function 0) -(put 'gnus-undo-register 'edebug-form-spec '(body)) - -(defun gnus-undo-register-1 (function) - "Register FUNCTION as something to be performed to undo a change." - (when gnus-undo-mode - (cond - ;; We are on a boundary, so we create a new action. - (gnus-undo-boundary - (push (list function) gnus-undo-actions) - (setq gnus-undo-boundary nil)) - ;; Prepend the function to an old action. - (gnus-undo-actions - (setcar gnus-undo-actions (cons function (car gnus-undo-actions)))) - ;; Initialize list. - (t - (setq gnus-undo-actions (list (list function))))) - ;; Limit the length of the undo list. - (let ((next (nthcdr gnus-undo-limit gnus-undo-actions))) - (when next - (setcdr next nil))) - ;; We are not at a boundary... - (setq gnus-undo-boundary-inhibit t))) - -(defun gnus-undo (n) - "Undo some previous changes in Gnus buffers. -Repeat this command to undo more changes. -A numeric argument serves as a repeat count." - (interactive "p") - (unless gnus-undo-mode - (error "Undoing is not enabled in this buffer")) - (message "%s" last-command) - (when (or (not (eq last-command 'gnus-undo)) - (not gnus-undo-last)) - (setq gnus-undo-last gnus-undo-actions)) - (let ((action (pop gnus-undo-last))) - (unless action - (error "Nothing further to undo")) - (setq gnus-undo-actions (delq action gnus-undo-actions)) - (setq gnus-undo-boundary t) - (while action - (funcall (pop action))))) - -(provide 'gnus-undo) - -;;; gnus-undo.el ends here diff --git a/lisp/gnus-util.el b/lisp/gnus-util.el deleted file mode 100644 index c5a04ec..0000000 --- a/lisp/gnus-util.el +++ /dev/null @@ -1,1125 +0,0 @@ -;;; gnus-util.el --- utility functions for Semi-gnus -;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Tatsuya Ichikawa -;; Keywords: mail, news, MIME - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;; Nothing in this file depends on any other parts of Gnus -- all -;; functions and macros in this file are utility functions that are -;; used by Gnus and may be used by any other package without loading -;; Gnus first. - -;;; Code: - -(eval-when-compile - (require 'cl) - ;; Fixme: this should be a gnus variable, not nnmail-. - (defvar nnmail-pathname-coding-system)) -(eval-when-compile (require 'static)) - -(require 'custom) -(require 'nnheader) -(require 'time-date) - -(eval-and-compile - (autoload 'message-fetch-field "message") - (autoload 'rmail-insert-rmail-file-header "rmail") - (autoload 'rmail-count-new-messages "rmail") - (autoload 'rmail-show-message "rmail")) - -(defun gnus-boundp (variable) - "Return non-nil if VARIABLE is bound and non-nil." - (and (boundp variable) - (symbol-value variable))) - -(defmacro gnus-eval-in-buffer-window (buffer &rest forms) - "Pop to BUFFER, evaluate FORMS, and then return to the original window." - (let ((tempvar (make-symbol "GnusStartBufferWindow")) - (w (make-symbol "w")) - (buf (make-symbol "buf")) - (frame (make-symbol "frame"))) - `(let* ((,tempvar (selected-window)) - (,buf ,buffer) - (,w (get-buffer-window ,buf 'visible)) - ,frame) - (unwind-protect - (progn - (if ,w - (progn - (select-window ,w) - (set-buffer (window-buffer ,w))) - (pop-to-buffer ,buf)) - ,@forms) - (setq ,frame (selected-frame)) - (select-window ,tempvar) - (select-frame ,frame))))) - -(put 'gnus-eval-in-buffer-window 'lisp-indent-function 1) -(put 'gnus-eval-in-buffer-window 'edebug-form-spec '(form body)) - -(defmacro gnus-intern-safe (string hashtable) - "Set hash value. Arguments are STRING, VALUE, and HASHTABLE." - `(let ((symbol (intern ,string ,hashtable))) - (or (boundp symbol) - (set symbol nil)) - symbol)) - -;; Added by Geoffrey T. Dairiki . A safe way -;; to limit the length of a string. This function is necessary since -;; `(substr "abc" 0 30)' pukes with "Args out of range". -(defsubst gnus-limit-string (str width) - (if (> (length str) width) - (substring str 0 width) - str)) - -(defsubst gnus-functionp (form) - "Return non-nil if FORM is funcallable." - (or (and (symbolp form) (fboundp form)) - (and (listp form) (eq (car form) 'lambda)) - (byte-code-function-p form))) - -(defsubst gnus-goto-char (point) - (and point (goto-char point))) - -(defmacro gnus-buffer-exists-p (buffer) - `(let ((buffer ,buffer)) - (when buffer - (funcall (if (stringp buffer) 'get-buffer 'buffer-name) - buffer)))) - -(defmacro gnus-kill-buffer (buffer) - `(let ((buf ,buffer)) - (when (gnus-buffer-exists-p buf) - (kill-buffer buf)))) - -(static-cond - ((fboundp 'point-at-bol) - (defalias 'gnus-point-at-bol 'point-at-bol)) - ((fboundp 'line-beginning-position) - (defalias 'gnus-point-at-bol 'line-beginning-position)) - (t - (defun gnus-point-at-bol () - "Return point at the beginning of the line." - (let ((p (point))) - (beginning-of-line) - (prog1 - (point) - (goto-char p)))) - )) -(static-cond - ((fboundp 'point-at-eol) - (defalias 'gnus-point-at-eol 'point-at-eol)) - ((fboundp 'line-end-position) - (defalias 'gnus-point-at-eol 'line-end-position)) - (t - (defun gnus-point-at-eol () - "Return point at the end of the line." - (let ((p (point))) - (end-of-line) - (prog1 - (point) - (goto-char p)))) - )) - -(defun gnus-delete-first (elt list) - "Delete by side effect the first occurrence of ELT as a member of LIST." - (if (equal (car list) elt) - (cdr list) - (let ((total list)) - (while (and (cdr list) - (not (equal (cadr list) elt))) - (setq list (cdr list))) - (when (cdr list) - (setcdr list (cddr list))) - total))) - -;; Delete the current line (and the next N lines). -(defmacro gnus-delete-line (&optional n) - `(delete-region (progn (beginning-of-line) (point)) - (progn (forward-line ,(or n 1)) (point)))) - -(defun gnus-byte-code (func) - "Return a form that can be `eval'ed based on FUNC." - (let ((fval (indirect-function func))) - (if (byte-code-function-p fval) - (let ((flist (append fval nil))) - (setcar flist 'byte-code) - flist) - (cons 'progn (cddr fval))))) - -(defun gnus-extract-address-components (from) - (let (name address) - ;; First find the address - the thing with the @ in it. This may - ;; not be accurate in mail addresses, but does the trick most of - ;; the time in news messages. - (when (string-match "\\b[^@ \t<>]+[!@][^@ \t<>]+\\b" from) - (setq address (substring from (match-beginning 0) (match-end 0)))) - ;; Then we check whether the "name

" format is used. - (and address - ;; Linear white space is not required. - (string-match (concat "[ \t]*<" (regexp-quote address) ">") from) - (and (setq name (substring from 0 (match-beginning 0))) - ;; Strip any quotes from the name. - (string-match "\".*\"" name) - (setq name (substring name 1 (1- (match-end 0)))))) - ;; If not, then "address (name)" is used. - (or name - (and (string-match "(.+)" from) - (setq name (substring from (1+ (match-beginning 0)) - (1- (match-end 0))))) - (and (string-match "()" from) - (setq name address)) - ;; XOVER might not support folded From headers. - (and (string-match "(.*" from) - (setq name (substring from (1+ (match-beginning 0)) - (match-end 0))))) - (list (if (string= name "") nil name) (or address from)))) - - -(defun gnus-fetch-field (field) - "Return the value of the header FIELD of current article." - (save-excursion - (save-restriction - (let ((case-fold-search t) - (inhibit-point-motion-hooks t)) - (nnheader-narrow-to-headers) - (message-fetch-field field))))) - -(defun gnus-goto-colon () - (beginning-of-line) - (let ((eol (gnus-point-at-eol))) - (goto-char (or (text-property-any (point) eol 'gnus-position t) - (search-forward ":" eol t) - (point))))) - -(defun gnus-remove-text-with-property (prop) - "Delete all text in the current buffer with text property PROP." - (save-excursion - (goto-char (point-min)) - (while (not (eobp)) - (while (get-text-property (point) prop) - (delete-char 1)) - (goto-char (next-single-property-change (point) prop nil (point-max)))))) - -(require 'nnheader) -(defun gnus-newsgroup-directory-form (newsgroup) - "Make hierarchical directory name from NEWSGROUP name." - (let* ((newsgroup (gnus-newsgroup-savable-name newsgroup)) - (idx (string-match ":" newsgroup))) - (concat - (if idx (substring newsgroup 0 idx)) - (if idx "/") - (nnheader-replace-chars-in-string - (if idx (substring newsgroup (1+ idx)) newsgroup) - ?. ?/)))) - -(defun gnus-newsgroup-savable-name (group) - ;; Replace any slashes in a group name (eg. an ange-ftp nndoc group) - ;; with dots. - (nnheader-replace-chars-in-string group ?/ ?.)) - -(defun gnus-string> (s1 s2) - (not (or (string< s1 s2) - (string= s1 s2)))) - -;;; Time functions. - -(defun gnus-file-newer-than (file date) - (let ((fdate (nth 5 (file-attributes file)))) - (or (> (car fdate) (car date)) - (and (= (car fdate) (car date)) - (> (nth 1 fdate) (nth 1 date)))))) - -;;; Keymap macros. - -(defmacro gnus-local-set-keys (&rest plist) - "Set the keys in PLIST in the current keymap." - `(gnus-define-keys-1 (current-local-map) ',plist)) - -(defmacro gnus-define-keys (keymap &rest plist) - "Define all keys in PLIST in KEYMAP." - `(gnus-define-keys-1 (quote ,keymap) (quote ,plist))) - -(defmacro gnus-define-keys-safe (keymap &rest plist) - "Define all keys in PLIST in KEYMAP without overwriting previous definitions." - `(gnus-define-keys-1 (quote ,keymap) (quote ,plist) t)) - -(put 'gnus-define-keys 'lisp-indent-function 1) -(put 'gnus-define-keys-safe 'lisp-indent-function 1) -(put 'gnus-local-set-keys 'lisp-indent-function 1) - -(defmacro gnus-define-keymap (keymap &rest plist) - "Define all keys in PLIST in KEYMAP." - `(gnus-define-keys-1 ,keymap (quote ,plist))) - -(put 'gnus-define-keymap 'lisp-indent-function 1) - -(defun gnus-define-keys-1 (keymap plist &optional safe) - (when (null keymap) - (error "Can't set keys in a null keymap")) - (cond ((symbolp keymap) - (setq keymap (symbol-value keymap))) - ((keymapp keymap)) - ((listp keymap) - (set (car keymap) nil) - (define-prefix-command (car keymap)) - (define-key (symbol-value (caddr keymap)) (cadr keymap) (car keymap)) - (setq keymap (symbol-value (car keymap))))) - (let (key) - (while plist - (when (symbolp (setq key (pop plist))) - (setq key (symbol-value key))) - (if (or (not safe) - (eq (lookup-key keymap key) 'undefined)) - (define-key keymap key (pop plist)) - (pop plist))))) - -(defun gnus-completing-read (default prompt &rest args) - ;; Like `completing-read', except that DEFAULT is the default argument. - (let* ((prompt (if default - (concat prompt " (default " default ") ") - (concat prompt " "))) - (answer (apply 'completing-read prompt args))) - (if (or (null answer) (zerop (length answer))) - default - answer))) - -;; Two silly functions to ensure that all `y-or-n-p' questions clear -;; the echo area. -(defun gnus-y-or-n-p (prompt) - (prog1 - (y-or-n-p prompt) - (message ""))) - -(defun gnus-yes-or-no-p (prompt) - (prog1 - (yes-or-no-p prompt) - (message ""))) - -(defun gnus-dd-mmm (messy-date) - "Return a string like DD-MMM from a big messy string." - (condition-case () - (format-time-string "%d-%b" (safe-date-to-time messy-date)) - (error " - "))) - -(defmacro gnus-date-get-time (date) - "Convert DATE string to Emacs time. -Cache the result as a text property stored in DATE." - ;; Either return the cached value... - `(let ((d ,date)) - (if (equal "" d) - '(0 0) - (or (get-text-property 0 'gnus-time d) - ;; or compute the value... - (let ((time (safe-date-to-time d))) - ;; and store it back in the string. - (put-text-property 0 1 'gnus-time time d) - time))))) - -(defsubst gnus-time-iso8601 (time) - "Return a string of TIME in YYYYMMDDTHHMMSS format." - (format-time-string "%Y%m%dT%H%M%S" time)) - -(defun gnus-date-iso8601 (date) - "Convert the DATE to YYYYMMDDTHHMMSS." - (condition-case () - (gnus-time-iso8601 (gnus-date-get-time date)) - (error ""))) - -(defun gnus-mode-string-quote (string) - "Quote all \"%\"'s in STRING." - (save-excursion - (gnus-set-work-buffer) - (insert string) - (goto-char (point-min)) - (while (search-forward "%" nil t) - (insert "%")) - (buffer-string))) - -;; Make a hash table (default and minimum size is 256). -;; Optional argument HASHSIZE specifies the table size. -(defun gnus-make-hashtable (&optional hashsize) - (make-vector (if hashsize (max (gnus-create-hash-size hashsize) 256) 256) 0)) - -;; Make a number that is suitable for hashing; bigger than MIN and -;; equal to some 2^x. Many machines (such as sparcs) do not have a -;; hardware modulo operation, so they implement it in software. On -;; many sparcs over 50% of the time to intern is spent in the modulo. -;; Yes, it's slower than actually computing the hash from the string! -;; So we use powers of 2 so people can optimize the modulo to a mask. -(defun gnus-create-hash-size (min) - (let ((i 1)) - (while (< i min) - (setq i (* 2 i))) - i)) - -(defcustom gnus-verbose 7 - "*Integer that says how verbose Gnus should be. -The higher the number, the more messages Gnus will flash to say what -it's doing. At zero, Gnus will be totally mute; at five, Gnus will -display most important messages; and at ten, Gnus will keep on -jabbering all the time." - :group 'gnus-start - :type 'integer) - -;; Show message if message has a lower level than `gnus-verbose'. -;; Guideline for numbers: -;; 1 - error messages, 3 - non-serious error messages, 5 - messages -;; for things that take a long time, 7 - not very important messages -;; on stuff, 9 - messages inside loops. -(defun gnus-message (level &rest args) - (if (<= level gnus-verbose) - (apply 'message args) - ;; We have to do this format thingy here even if the result isn't - ;; shown - the return value has to be the same as the return value - ;; from `message'. - (apply 'format args))) - -(defun gnus-error (level &rest args) - "Beep an error if LEVEL is equal to or less than `gnus-verbose'." - (when (<= (floor level) gnus-verbose) - (apply 'message args) - (ding) - (let (duration) - (when (and (floatp level) - (not (zerop (setq duration (* 10 (- level (floor level))))))) - (sit-for duration)))) - nil) - -(defun gnus-split-references (references) - "Return a list of Message-IDs in REFERENCES." - (let ((beg 0) - ids) - (while (string-match "<[^> \t]+>" references beg) - (push (substring references (match-beginning 0) (setq beg (match-end 0))) - ids)) - (nreverse ids))) - -(defsubst gnus-parent-id (references &optional n) - "Return the last Message-ID in REFERENCES. -If N, return the Nth ancestor instead." - (when references - (let ((ids (inline (gnus-split-references references)))) - (while (nthcdr (or n 1) ids) - (setq ids (cdr ids))) - (car ids)))) - -(defsubst gnus-buffer-live-p (buffer) - "Say whether BUFFER is alive or not." - (and buffer - (get-buffer buffer) - (buffer-name (get-buffer buffer)))) - -(defun gnus-horizontal-recenter () - "Recenter the current buffer horizontally." - (if (< (current-column) (/ (window-width) 2)) - (set-window-hscroll (get-buffer-window (current-buffer) t) 0) - (let* ((orig (point)) - (end (window-end (get-buffer-window (current-buffer) t))) - (max 0)) - (when end - ;; Find the longest line currently displayed in the window. - (goto-char (window-start)) - (while (and (not (eobp)) - (< (point) end)) - (end-of-line) - (setq max (max max (current-column))) - (forward-line 1)) - (goto-char orig) - ;; Scroll horizontally to center (sort of) the point. - (if (> max (window-width)) - (set-window-hscroll - (get-buffer-window (current-buffer) t) - (min (- (current-column) (/ (window-width) 3)) - (+ 2 (- max (window-width))))) - (set-window-hscroll (get-buffer-window (current-buffer) t) 0)) - max)))) - -(defun gnus-read-event-char () - "Get the next event." - (let ((event (read-event))) - ;; should be gnus-characterp, but this can't be called in XEmacs anyway - (cons (and (numberp event) event) event))) - -(defun gnus-sortable-date (date) - "Make string suitable for sorting from DATE." - (gnus-time-iso8601 (date-to-time date))) - -(defun gnus-copy-file (file &optional to) - "Copy FILE to TO." - (interactive - (list (read-file-name "Copy file: " default-directory) - (read-file-name "Copy file to: " default-directory))) - (unless to - (setq to (read-file-name "Copy file to: " default-directory))) - (when (file-directory-p to) - (setq to (concat (file-name-as-directory to) - (file-name-nondirectory file)))) - (copy-file file to)) - -(defvar gnus-work-buffer " *gnus work*") - -(defun gnus-set-work-buffer () - "Put point in the empty Gnus work buffer." - (if (get-buffer gnus-work-buffer) - (progn - (set-buffer gnus-work-buffer) - (erase-buffer)) - (set-buffer (gnus-get-buffer-create gnus-work-buffer)) - (kill-all-local-variables))) - -(defmacro gnus-group-real-name (group) - "Find the real name of a foreign newsgroup." - `(let ((gname ,group)) - (if (string-match "^[^:]+:" gname) - (substring gname (match-end 0)) - gname))) - -(defun gnus-make-sort-function (funs) - "Return a composite sort condition based on the functions in FUNC." - (cond - ;; Just a simple function. - ((gnus-functionp funs) funs) - ;; No functions at all. - ((null funs) funs) - ;; A list of functions. - ((or (cdr funs) - (listp (car funs))) - (gnus-byte-compile - `(lambda (t1 t2) - ,(gnus-make-sort-function-1 (reverse funs))))) - ;; A list containing just one function. - (t - (car funs)))) - -(defun gnus-make-sort-function-1 (funs) - "Return a composite sort condition based on the functions in FUNC." - (let ((function (car funs)) - (first 't1) - (last 't2)) - (when (consp function) - (cond - ;; Reversed spec. - ((eq (car function) 'not) - (setq function (cadr function) - first 't2 - last 't1)) - ((gnus-functionp function) - ;; Do nothing. - ) - (t - (error "Invalid sort spec: %s" function)))) - (if (cdr funs) - `(or (,function ,first ,last) - (and (not (,function ,last ,first)) - ,(gnus-make-sort-function-1 (cdr funs)))) - `(,function ,first ,last)))) - -(defun gnus-turn-off-edit-menu (type) - "Turn off edit menu in `gnus-TYPE-mode-map'." - (define-key (symbol-value (intern (format "gnus-%s-mode-map" type))) - [menu-bar edit] 'undefined)) - -(defun gnus-prin1 (form) - "Use `prin1' on FORM in the current buffer. -Bind `print-quoted' and `print-readably' to t while printing." - (let ((print-quoted t) - (print-readably t) - (print-escape-multibyte nil) - print-level print-length) - (prin1 form (current-buffer)))) - -(defun gnus-prin1-to-string (form) - "The same as `prin1', but bind `print-quoted' and `print-readably' to t." - (let ((print-quoted t) - (print-readably t)) - (prin1-to-string form))) - -(defun gnus-make-directory (directory) - "Make DIRECTORY (and all its parents) if it doesn't exist." - (require 'nnmail) - (let ((file-name-coding-system nnmail-pathname-coding-system) - (pathname-coding-system nnmail-pathname-coding-system)) - (when (and directory - (not (file-exists-p directory))) - (make-directory directory t))) - t) - -(defun gnus-write-buffer (file) - "Write the current buffer's contents to FILE." - ;; Make sure the directory exists. - (gnus-make-directory (file-name-directory file)) - (let ((file-name-coding-system nnmail-pathname-coding-system) - (pathname-coding-system nnmail-pathname-coding-system)) - ;; Write the buffer. - (write-region (point-min) (point-max) file nil 'quietly))) - -(defun gnus-write-buffer-as-binary (file) - "Write the current buffer's contents to FILE without code conversion." - ;; Make sure the directory exists. - (gnus-make-directory (file-name-directory file)) - ;; Write the buffer. - (write-region-as-binary (point-min) (point-max) file nil 'quietly)) - -(defun gnus-write-buffer-as-coding-system (coding-system file) - "Write the current buffer's contents to FILE with code conversion." - ;; Make sure the directory exists. - (gnus-make-directory (file-name-directory file)) - ;; Write the buffer. - (write-region-as-coding-system - coding-system (point-min) (point-max) file nil 'quietly)) - -(defun gnus-delete-file (file) - "Delete FILE if it exists." - (when (file-exists-p file) - (delete-file file))) - -(defun gnus-strip-whitespace (string) - "Return STRING stripped of all whitespace." - (while (string-match "[\r\n\t ]+" string) - (setq string (replace-match "" t t string))) - string) - -(defsubst gnus-put-text-property-excluding-newlines (beg end prop val) - "The same as `put-text-property', but don't put this prop on any newlines in the region." - (save-match-data - (save-excursion - (save-restriction - (goto-char beg) - (while (re-search-forward gnus-emphasize-whitespace-regexp end 'move) - (gnus-put-text-property beg (match-beginning 0) prop val) - (setq beg (point))) - (gnus-put-text-property beg (point) prop val))))) - -(defun gnus-put-text-property-excluding-characters-with-faces (beg end - prop val) - "The same as `put-text-property', but don't put props on characters with the `gnus-face' property." - (let ((b beg)) - (while (/= b end) - (when (get-text-property b 'gnus-face) - (setq b (next-single-property-change b 'gnus-face nil end))) - (when (/= b end) - (gnus-put-text-property - b (setq b (next-single-property-change b 'gnus-face nil end)) - prop val))))) - -;;; Protected and atomic operations. dmoore@ucsd.edu 21.11.1996 -;;; The primary idea here is to try to protect internal datastructures -;;; from becoming corrupted when the user hits C-g, or if a hook or -;;; similar blows up. Often in Gnus multiple tables/lists need to be -;;; updated at the same time, or information can be lost. - -(defvar gnus-atomic-be-safe t - "If t, certain operations will be protected from interruption by C-g.") - -(defmacro gnus-atomic-progn (&rest forms) - "Evaluate FORMS atomically, which means to protect the evaluation -from being interrupted by the user. An error from the forms themselves -will return without finishing the operation. Since interrupts from -the user are disabled, it is recommended that only the most minimal -operations are performed by FORMS. If you wish to assign many -complicated values atomically, compute the results into temporary -variables and then do only the assignment atomically." - `(let ((inhibit-quit gnus-atomic-be-safe)) - ,@forms)) - -(put 'gnus-atomic-progn 'lisp-indent-function 0) - -(defmacro gnus-atomic-progn-assign (protect &rest forms) - "Evaluate FORMS, but insure that the variables listed in PROTECT -are not changed if anything in FORMS signals an error or otherwise -non-locally exits. The variables listed in PROTECT are updated atomically. -It is safe to use gnus-atomic-progn-assign with long computations. - -Note that if any of the symbols in PROTECT were unbound, they will be -set to nil on a sucessful assignment. In case of an error or other -non-local exit, it will still be unbound." - (let* ((temp-sym-map (mapcar (lambda (x) (list (make-symbol - (concat (symbol-name x) - "-tmp")) - x)) - protect)) - (sym-temp-map (mapcar (lambda (x) (list (cadr x) (car x))) - temp-sym-map)) - (temp-sym-let (mapcar (lambda (x) (list (car x) - `(and (boundp ',(cadr x)) - ,(cadr x)))) - temp-sym-map)) - (sym-temp-let sym-temp-map) - (temp-sym-assign (apply 'append temp-sym-map)) - (sym-temp-assign (apply 'append sym-temp-map)) - (result (make-symbol "result-tmp"))) - `(let (,@temp-sym-let - ,result) - (let ,sym-temp-let - (setq ,result (progn ,@forms)) - (setq ,@temp-sym-assign)) - (let ((inhibit-quit gnus-atomic-be-safe)) - (setq ,@sym-temp-assign)) - ,result))) - -(put 'gnus-atomic-progn-assign 'lisp-indent-function 1) -;(put 'gnus-atomic-progn-assign 'edebug-form-spec '(sexp body)) - -(defmacro gnus-atomic-setq (&rest pairs) - "Similar to setq, except that the real symbols are only assigned when -there are no errors. And when the real symbols are assigned, they are -done so atomically. If other variables might be changed via side-effect, -see gnus-atomic-progn-assign. It is safe to use gnus-atomic-setq -with potentially long computations." - (let ((tpairs pairs) - syms) - (while tpairs - (push (car tpairs) syms) - (setq tpairs (cddr tpairs))) - `(gnus-atomic-progn-assign ,syms - (setq ,@pairs)))) - -;(put 'gnus-atomic-setq 'edebug-form-spec '(body)) - - -;;; Functions for saving to babyl/mail files. - -(defvar rmail-default-rmail-file) -(defun gnus-output-to-rmail (filename &optional ask) - "Append the current article to an Rmail file named FILENAME." - (require 'rmail) - ;; Most of these codes are borrowed from rmailout.el. - (setq filename (expand-file-name filename)) - (setq rmail-default-rmail-file filename) - (let ((artbuf (current-buffer)) - (tmpbuf (get-buffer-create " *Gnus-output*"))) - (save-excursion - (or (get-file-buffer filename) - (file-exists-p filename) - (if (or (not ask) - (gnus-yes-or-no-p - (concat "\"" filename "\" does not exist, create it? "))) - (let ((file-buffer (create-file-buffer filename))) - (save-excursion - (set-buffer file-buffer) - (rmail-insert-rmail-file-header) - (let ((require-final-newline nil)) - (gnus-write-buffer-as-coding-system - nnheader-text-coding-system filename))) - (kill-buffer file-buffer)) - (error "Output file does not exist"))) - (set-buffer tmpbuf) - (erase-buffer) - (insert-buffer-substring artbuf) - (gnus-convert-article-to-rmail) - ;; Decide whether to append to a file or to an Emacs buffer. - (let ((outbuf (get-file-buffer filename))) - (if (not outbuf) - (let ((file-name-coding-system nnmail-pathname-coding-system) - (pathname-coding-system nnmail-pathname-coding-system)) - (write-region-as-binary (point-min) (point-max) - filename 'append)) - ;; File has been visited, in buffer OUTBUF. - (set-buffer outbuf) - (let ((buffer-read-only nil) - (msg (and (boundp 'rmail-current-message) - (symbol-value 'rmail-current-message)))) - ;; If MSG is non-nil, buffer is in RMAIL mode. - (when msg - (widen) - (narrow-to-region (point-max) (point-max))) - (insert-buffer-substring tmpbuf) - (when msg - (goto-char (point-min)) - (widen) - (search-backward "\n\^_") - (narrow-to-region (point) (point-max)) - (rmail-count-new-messages t) - (when (rmail-summary-exists) - (rmail-select-summary - (rmail-update-summary))) - (rmail-count-new-messages t) - (rmail-show-message msg)) - (save-buffer))))) - (kill-buffer tmpbuf))) - -(defun gnus-output-to-mail (filename &optional ask) - "Append the current article to a mail file named FILENAME." - (setq filename (expand-file-name filename)) - (let ((artbuf (current-buffer)) - (tmpbuf (get-buffer-create " *Gnus-output*"))) - (save-excursion - ;; Create the file, if it doesn't exist. - (when (and (not (get-file-buffer filename)) - (not (file-exists-p filename))) - (if (or (not ask) - (gnus-y-or-n-p - (concat "\"" filename "\" does not exist, create it? "))) - (let ((file-buffer (create-file-buffer filename))) - (save-excursion - (set-buffer file-buffer) - (let ((require-final-newline nil)) - (gnus-write-buffer-as-coding-system - nnheader-text-coding-system filename))) - (kill-buffer file-buffer)) - (error "Output file does not exist"))) - (set-buffer tmpbuf) - (erase-buffer) - (insert-buffer-substring artbuf) - (goto-char (point-min)) - (if (looking-at "From ") - (forward-line 1) - (insert "From nobody " (current-time-string) "\n")) - (let (case-fold-search) - (while (re-search-forward "^From " nil t) - (beginning-of-line) - (insert ">"))) - ;; Decide whether to append to a file or to an Emacs buffer. - (let ((outbuf (get-file-buffer filename))) - (if (not outbuf) - (let ((buffer-read-only nil)) - (save-excursion - (goto-char (point-max)) - (forward-char -2) - (unless (looking-at "\n\n") - (goto-char (point-max)) - (unless (bolp) - (insert "\n")) - (insert "\n")) - (goto-char (point-max)) - (let ((file-name-coding-system nnmail-pathname-coding-system) - (pathname-coding-system nnmail-pathname-coding-system)) - (write-region-as-binary (point-min) (point-max) - filename 'append)))) - ;; File has been visited, in buffer OUTBUF. - (set-buffer outbuf) - (let ((buffer-read-only nil)) - (goto-char (point-max)) - (unless (eobp) - (insert "\n")) - (insert "\n") - (insert-buffer-substring tmpbuf))))) - (kill-buffer tmpbuf))) - -(defun gnus-convert-article-to-rmail () - "Convert article in current buffer to Rmail message format." - (let ((buffer-read-only nil)) - ;; Convert article directly into Babyl format. - (goto-char (point-min)) - (insert "\^L\n0, unseen,,\n*** EOOH ***\n") - (while (search-forward "\n\^_" nil t) ;single char - (replace-match "\n^_" t t)) ;2 chars: "^" and "_" - (goto-char (point-max)) - (insert "\^_"))) - -(defun gnus-map-function (funs arg) - "Applies the result of the first function in FUNS to the second, and so on. -ARG is passed to the first function." - (let ((myfuns funs)) - (while myfuns - (setq arg (funcall (pop myfuns) arg))) - arg)) - -(defun gnus-run-hooks (&rest funcs) - "Does the same as `run-hooks', but saves excursion." - (let ((buf (current-buffer))) - (unwind-protect - (apply 'run-hooks funcs) - (set-buffer buf)))) - -;;; -;;; .netrc and .authinforc parsing -;;; - -(defun gnus-parse-netrc (file) - "Parse FILE and return an list of all entries in the file." - (when (file-exists-p file) - (with-temp-buffer - (let ((tokens '("machine" "default" "login" - "password" "account" "macdef" "force" - "port")) - alist elem result pair) - (insert-file-contents file) - (goto-char (point-min)) - ;; Go through the file, line by line. - (while (not (eobp)) - (narrow-to-region (point) (gnus-point-at-eol)) - ;; For each line, get the tokens and values. - (while (not (eobp)) - (skip-chars-forward "\t ") - ;; Skip lines that begin with a "#". - (if (eq (char-after) ?#) - (goto-char (point-max)) - (unless (eobp) - (setq elem - (if (= (following-char) ?\") - (read (current-buffer)) - (buffer-substring - (point) (progn (skip-chars-forward "^\t ") - (point))))) - (cond - ((equal elem "macdef") - ;; We skip past the macro definition. - (widen) - (while (and (zerop (forward-line 1)) - (looking-at "$"))) - (narrow-to-region (point) (point))) - ((member elem tokens) - ;; Tokens that don't have a following value are ignored, - ;; except "default". - (when (and pair (or (cdr pair) - (equal (car pair) "default"))) - (push pair alist)) - (setq pair (list elem))) - (t - ;; Values that haven't got a preceding token are ignored. - (when pair - (setcdr pair elem) - (push pair alist) - (setq pair nil))))))) - (when alist - (push (nreverse alist) result)) - (setq alist nil - pair nil) - (widen) - (forward-line 1)) - (nreverse result))))) - -(defun gnus-netrc-machine (list machine &optional port defaultport) - "Return the netrc values from LIST for MACHINE or for the default entry. -If PORT specified, only return entries with matching port tokens. -Entries without port tokens default to DEFAULTPORT." - (let ((rest list) - result) - (while list - (when (equal (cdr (assoc "machine" (car list))) machine) - (push (car list) result)) - (pop list)) - (unless result - ;; No machine name matches, so we look for default entries. - (while rest - (when (assoc "default" (car rest)) - (push (car rest) result)) - (pop rest))) - (when result - (setq result (nreverse result)) - (while (and result - (not (equal (or port defaultport "nntp") - (or (gnus-netrc-get (car result) "port") - defaultport "nntp")))) - (pop result)) - (car result)))) - -(defun gnus-netrc-get (alist type) - "Return the value of token TYPE from ALIST." - (cdr (assoc type alist))) - -;;; Various - -(defvar gnus-group-buffer) ; Compiler directive -(defun gnus-alive-p () - "Say whether Gnus is running or not." - (and (boundp 'gnus-group-buffer) - (get-buffer gnus-group-buffer) - (save-excursion - (set-buffer gnus-group-buffer) - (eq major-mode 'gnus-group-mode)))) - -(defun gnus-remove-duplicates (list) - (let (new (tail list)) - (while tail - (or (member (car tail) new) - (setq new (cons (car tail) new))) - (setq tail (cdr tail))) - (nreverse new))) - -(defun gnus-delete-if (predicate list) - "Delete elements from LIST that satisfy PREDICATE." - (let (out) - (while list - (unless (funcall predicate (car list)) - (push (car list) out)) - (pop list)) - (nreverse out))) - -(if (fboundp 'assq-delete-all) - (defalias 'gnus-delete-alist 'assq-delete-all) - (defun gnus-delete-alist (key alist) - "Delete from ALIST all elements whose car is KEY. -Return the modified alist." - (let (entry) - (while (setq entry (assq key alist)) - (setq alist (delq entry alist))) - alist))) - -(defmacro gnus-pull (key alist &optional assoc-p) - "Modify ALIST to be without KEY." - (unless (symbolp alist) - (error "Not a symbol: %s" alist)) - (let ((fun (if assoc-p 'assoc 'assq))) - `(setq ,alist (delq (,fun ,key ,alist) ,alist)))) - -(defun gnus-globalify-regexp (re) - "Returns a regexp that matches a whole line, iff RE matches a part of it." - (concat (unless (string-match "^\\^" re) "^.*") - re - (unless (string-match "\\$$" re) ".*$"))) - -(defun gnus-set-window-start (&optional point) - "Set the window start to POINT, or (point) if nil." - (let ((win (get-buffer-window (current-buffer) t))) - (when win - (set-window-start win (or point (point)))))) - -(defun gnus-annotation-in-region-p (b e) - (if (= b e) - (eq (cadr (memq 'gnus-undeletable (text-properties-at b))) t) - (text-property-any b e 'gnus-undeletable t))) - -(defun gnus-or (&rest elems) - "Return non-nil if any of the elements are non-nil." - (catch 'found - (while elems - (when (pop elems) - (throw 'found t))))) - -(defun gnus-and (&rest elems) - "Return non-nil if all of the elements are non-nil." - (catch 'found - (while elems - (unless (pop elems) - (throw 'found nil))) - t)) - -(defun gnus-write-active-file (file hashtb &optional full-names) - (let ((output-coding-system nnmail-active-file-coding-system) - (coding-system-for-write nnmail-active-file-coding-system)) - (with-temp-file file - (mapatoms - (lambda (sym) - (when (and sym - (boundp sym) - (symbol-value sym)) - (insert (format "%S %d %d y\n" - (if full-names - sym - (intern (gnus-group-real-name (symbol-name sym)))) - (or (cdr (symbol-value sym)) - (car (symbol-value sym))) - (car (symbol-value sym)))))) - hashtb) - (goto-char (point-max)) - (while (search-backward "\\." nil t) - (delete-char 1))))) - -(if (fboundp 'union) - (defalias 'gnus-union 'union) - (defun gnus-union (l1 l2) - "Set union of lists L1 and L2." - (cond ((null l1) l2) - ((null l2) l1) - ((equal l1 l2) l1) - (t - (or (>= (length l1) (length l2)) - (setq l1 (prog1 l2 (setq l2 l1)))) - (while l2 - (or (member (car l2) l1) - (push (car l2) l1)) - (pop l2)) - l1)))) - -(defun gnus-add-text-properties-when - (property value start end properties &optional object) - "Like `gnus-add-text-properties', only applied on where PROPERTY is VALUE." - (let (point) - (while (and start - (< start end) ;; XEmacs will loop for every when start=end. - (setq point (text-property-not-all start end property value))) - (gnus-add-text-properties start point properties object) - (setq start (text-property-any point end property value))) - (if start - (gnus-add-text-properties start end properties object)))) - -(defun gnus-remove-text-properties-when - (property value start end properties &optional object) - "Like `remove-text-properties', only applied on where PROPERTY is VALUE." - (let (point) - (while (and start - (< start end) - (setq point (text-property-not-all start end property value))) - (remove-text-properties start point properties object) - (setq start (text-property-any point end property value))) - (if start - (remove-text-properties start end properties object)) - t)) - -(defun gnus-string-equal (x y) - "Like `string-equal', except it compares case-insensitively." - (and (= (length x) (length y)) - (or (string-equal x y) - (string-equal (downcase x) (downcase y))))) - -(defcustom gnus-use-byte-compile t - "If non-nil, byte-compile crucial run-time codes." - :type 'boolean - :version "21.1" - :group 'gnus-various) - -(defun gnus-byte-compile (form) - "Byte-compile FORM if `gnus-use-byte-compile' is non-nil." - (if gnus-use-byte-compile - (progn - (require 'bytecomp) - (defalias 'gnus-byte-compile 'byte-compile) - (byte-compile form)) - form)) - -(defun gnus-remassoc (key alist) - "Delete by side effect any elements of LIST whose car is `equal' to KEY. -The modified LIST is returned. If the first member -of LIST has a car that is `equal' to KEY, there is no way to remove it -by side effect; therefore, write `(setq foo (remassoc key foo))' to be -sure of changing the value of `foo'." - (when alist - (if (equal key (caar alist)) - (cdr alist) - (setcdr alist (gnus-remassoc key (cdr alist))) - alist))) - -(defun gnus-update-alist-soft (key value alist) - (if value - (cons (cons key value) (gnus-remassoc key alist)) - (gnus-remassoc key alist))) - -(defun gnus-create-info-command (node) - "Create a command that will go to info NODE." - `(lambda () - (interactive) - ,(concat "Enter the info system at node " node) - (Info-goto-node ,node) - (setq gnus-info-buffer (current-buffer)) - (gnus-configure-windows 'info))) - -(defun gnus-not-ignore (&rest args) - t) - -(provide 'gnus-util) - -;;; gnus-util.el ends here diff --git a/lisp/gnus-uu.el b/lisp/gnus-uu.el deleted file mode 100644 index bfce4bd..0000000 --- a/lisp/gnus-uu.el +++ /dev/null @@ -1,2151 +0,0 @@ -;;; gnus-uu.el --- extract (uu)encoded files in Gnus -;; Copyright (C) 1985, 1986, 1987, 1993, 1994, 1995, 1996, 1997, 1998, 2000, -;; 2001 Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Created: 2 Oct 1993 -;; Keyword: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) - -(require 'gnus) -(require 'gnus-art) -(require 'message) -(require 'gnus-msg) - -(defgroup gnus-extract nil - "Extracting encoded files." - :prefix "gnus-uu-" - :group 'gnus) - -(defgroup gnus-extract-view nil - "Viewwing extracted files." - :group 'gnus-extract) - -(defgroup gnus-extract-archive nil - "Extracting encoded archives." - :group 'gnus-extract) - -(defgroup gnus-extract-post nil - "Extracting encoded archives." - :prefix "gnus-uu-post" - :group 'gnus-extract) - -;; Default viewing action rules - -(defcustom gnus-uu-default-view-rules - '(("\\.te?xt$\\|\\.doc$\\|read.*me\\|\\.c?$\\|\\.h$\\|\\.bat$\\|\\.asm$\\|makefile" "cat %s | sed 's/\r$//'") - ("\\.pas$" "cat %s | sed 's/\r$//'") - ("\\.[1-9]$" "groff -mandoc -Tascii %s | sed s/\b.//g") - ("\\.\\(jpe?g\\|gif\\|tiff?\\|p[pgb]m\\|xwd\\|xbm\\|pcx\\)$" "display") - ("\\.tga$" "tgatoppm %s | ee -") - ("\\.\\(wav\\|aiff\\|hcom\\|u[blw]\\|s[bfw]\\|voc\\|smp\\)$" - "sox -v .5 %s -t .au -u - > /dev/audio") - ("\\.au$" "cat %s > /dev/audio") - ("\\.midi?$" "playmidi -f") - ("\\.mod$" "str32") - ("\\.ps$" "ghostview") - ("\\.dvi$" "xdvi") - ("\\.html$" "xmosaic") - ("\\.mpe?g$" "mpeg_play") - ("\\.\\(flc\\|fli\\|rle\\|iff\\|pfx\\|avi\\|sme\\|rpza\\|dl\\|qt\\|rsrc\\|mov\\)$" "xanim") - ("\\.\\(tar\\|arj\\|zip\\|zoo\\|arc\\|gz\\|Z\\|lzh\\|ar\\|lha\\)$" - "gnus-uu-archive")) - "*Default actions to be taken when the user asks to view a file. -To change the behaviour, you can either edit this variable or set -`gnus-uu-user-view-rules' to something useful. - -For example: - -To make gnus-uu use 'xli' to display JPEG and GIF files, put the -following in your .emacs file: - - (setq gnus-uu-user-view-rules '((\"jpg$\\\\|gif$\" \"xli\"))) - -Both these variables are lists of lists with two string elements. The -first string is a regular expression. If the file name matches this -regular expression, the command in the second string is executed with -the file as an argument. - -If the command string contains \"%s\", the file name will be inserted -at that point in the command string. If there's no \"%s\" in the -command string, the file name will be appended to the command string -before executing. - -There are several user variables to tailor the behaviour of gnus-uu to -your needs. First we have `gnus-uu-user-view-rules', which is the -variable gnus-uu first consults when trying to decide how to view a -file. If this variable contains no matches, gnus-uu examines the -default rule variable provided in this package. If gnus-uu finds no -match here, it uses `gnus-uu-user-view-rules-end' to try to make a -match." - :group 'gnus-extract-view - :type '(repeat (group regexp (string :tag "Command")))) - -(defcustom gnus-uu-user-view-rules nil - "What actions are to be taken to view a file. -See the documentation on the `gnus-uu-default-view-rules' variable for -details." - :group 'gnus-extract-view - :type '(repeat (group regexp (string :tag "Command")))) - -(defcustom gnus-uu-user-view-rules-end - '(("" "file")) - "*What actions are to be taken if no rule matched the file name. -See the documentation on the `gnus-uu-default-view-rules' variable for -details." - :group 'gnus-extract-view - :type '(repeat (group regexp (string :tag "Command")))) - -;; Default unpacking commands - -(defcustom gnus-uu-default-archive-rules - '(("\\.tar$" "tar xf") - ("\\.zip$" "unzip -o") - ("\\.ar$" "ar x") - ("\\.arj$" "unarj x") - ("\\.zoo$" "zoo -e") - ("\\.\\(lzh\\|lha\\)$" "lha x") - ("\\.Z$" "uncompress") - ("\\.gz$" "gunzip") - ("\\.arc$" "arc -x")) - "*See `gnus-uu-user-archive-rules'." - :group 'gnus-extract-archive - :type '(repeat (group regexp (string :tag "Command")))) - -(defvar gnus-uu-destructive-archivers - (list "uncompress" "gunzip")) - -(defcustom gnus-uu-user-archive-rules nil - "A list that can be set to override the default archive unpacking commands. -To use, for instance, 'untar' to unpack tar files and 'zip -x' to -unpack zip files, say the following: - (setq gnus-uu-user-archive-rules - '((\"\\\\.tar$\" \"untar\") - (\"\\\\.zip$\" \"zip -x\")))" - :group 'gnus-extract-archive - :type '(repeat (group regexp (string :tag "Command")))) - -(defcustom gnus-uu-ignore-files-by-name nil - "*A regular expression saying what files should not be viewed based on name. -If, for instance, you want gnus-uu to ignore all .au and .wav files, -you could say something like - - (setq gnus-uu-ignore-files-by-name \"\\\\.au$\\\\|\\\\.wav$\") - -Note that this variable can be used in conjunction with the -`gnus-uu-ignore-files-by-type' variable." - :group 'gnus-extract - :type '(choice (const :tag "off" nil) - (regexp :format "%v"))) - -(defcustom gnus-uu-ignore-files-by-type nil - "*A regular expression saying what files that shouldn't be viewed, based on MIME file type. -If, for instance, you want gnus-uu to ignore all audio files and all mpegs, -you could say something like - - (setq gnus-uu-ignore-files-by-type \"audio/\\\\|video/mpeg\") - -Note that this variable can be used in conjunction with the -`gnus-uu-ignore-files-by-name' variable." - :group 'gnus-extract - :type '(choice (const :tag "off" nil) - (regexp :format "%v"))) - -;; Pseudo-MIME support - -(defconst gnus-uu-ext-to-mime-list - '(("\\.gif$" "image/gif") - ("\\.jpe?g$" "image/jpeg") - ("\\.tiff?$" "image/tiff") - ("\\.xwd$" "image/xwd") - ("\\.pbm$" "image/pbm") - ("\\.pgm$" "image/pgm") - ("\\.ppm$" "image/ppm") - ("\\.xbm$" "image/xbm") - ("\\.pcx$" "image/pcx") - ("\\.tga$" "image/tga") - ("\\.ps$" "image/postscript") - ("\\.fli$" "video/fli") - ("\\.wav$" "audio/wav") - ("\\.aiff$" "audio/aiff") - ("\\.hcom$" "audio/hcom") - ("\\.voc$" "audio/voc") - ("\\.smp$" "audio/smp") - ("\\.mod$" "audio/mod") - ("\\.dvi$" "image/dvi") - ("\\.mpe?g$" "video/mpeg") - ("\\.au$" "audio/basic") - ("\\.\\(te?xt\\|doc\\|c\\|h\\)$" "text/plain") - ("\\.\\(c\\|h\\)$" "text/source") - ("read.*me" "text/plain") - ("\\.html$" "text/html") - ("\\.bat$" "text/bat") - ("\\.[1-6]$" "text/man") - ("\\.flc$" "video/flc") - ("\\.rle$" "video/rle") - ("\\.pfx$" "video/pfx") - ("\\.avi$" "video/avi") - ("\\.sme$" "video/sme") - ("\\.rpza$" "video/prza") - ("\\.dl$" "video/dl") - ("\\.qt$" "video/qt") - ("\\.rsrc$" "video/rsrc") - ("\\..*$" "unknown/unknown"))) - -;; Various variables users may set - -(defcustom gnus-uu-tmp-dir - (cond ((fboundp 'temp-directory) (temp-directory)) - ((boundp 'temporary-file-directory) temporary-file-directory) - ("/tmp/")) - "*Variable saying where gnus-uu is to do its work. -Default is \"/tmp/\"." - :group 'gnus-extract - :type 'directory) - -(defcustom gnus-uu-do-not-unpack-archives nil - "*Non-nil means that gnus-uu won't peek inside archives looking for files to display. -Default is nil." - :group 'gnus-extract-archive - :type 'boolean) - -(defcustom gnus-uu-ignore-default-view-rules nil - "*Non-nil means that gnus-uu will ignore the default viewing rules. -Only the user viewing rules will be consulted. Default is nil." - :group 'gnus-extract-view - :type 'boolean) - -(defcustom gnus-uu-grabbed-file-functions nil - "Functions run on each file after successful decoding. -They will be called with the name of the file as the argument. -Likely functions you can use in this list are `gnus-uu-grab-view' -and `gnus-uu-grab-move'." - :group 'gnus-extract - :options '(gnus-uu-grab-view gnus-uu-grab-move) - :type 'hook) - -(defcustom gnus-uu-ignore-default-archive-rules nil - "*Non-nil means that gnus-uu will ignore the default archive unpacking commands. -Only the user unpacking commands will be consulted. Default is nil." - :group 'gnus-extract-archive - :type 'boolean) - -(defcustom gnus-uu-kill-carriage-return t - "*Non-nil means that gnus-uu will strip all carriage returns from articles. -Default is t." - :group 'gnus-extract - :type 'boolean) - -(defcustom gnus-uu-view-with-metamail nil - "*Non-nil means that files will be viewed with metamail. -The gnus-uu viewing functions will be ignored and gnus-uu will try -to guess at a content-type based on file name suffixes. Default -it nil." - :group 'gnus-extract - :type 'boolean) - -(defcustom gnus-uu-unmark-articles-not-decoded nil - "*Non-nil means that gnus-uu will mark articles that were unsuccessfully decoded as unread. -Default is nil." - :group 'gnus-extract - :type 'boolean) - -(defcustom gnus-uu-correct-stripped-uucode nil - "*Non-nil means that gnus-uu will *try* to fix uuencoded files that have had trailing spaces deleted. -Default is nil." - :group 'gnus-extract - :type 'boolean) - -(defcustom gnus-uu-save-in-digest nil - "*Non-nil means that gnus-uu, when asked to save without decoding, will save in digests. -If this variable is nil, gnus-uu will just save everything in a -file without any embellishments. The digesting almost conforms to RFC1153 - -no easy way to specify any meaningful volume and issue numbers were found, -so I simply dropped them." - :group 'gnus-extract - :type 'boolean) - -(defcustom gnus-uu-pre-uudecode-hook nil - "Hook run before sending a message to uudecode." - :group 'gnus-extract - :type 'hook) - -(defcustom gnus-uu-digest-headers - '("^Date:" "^From:" "^To:" "^Cc:" "^Subject:" "^Message-ID:" "^Keywords:" - "^Summary:" "^References:" "^Content-Type:" "^Content-Transfer-Encoding:" - "^MIME-Version:" "^Content-Disposition:" "^Content-Description:" - "^Content-ID:" "^User-Agent:" "^X-Face:") - "*List of regexps to match headers included in digested messages. -The headers will be included in the sequence they are matched." - :group 'gnus-extract - :type '(repeat regexp)) - -(defcustom gnus-uu-save-separate-articles nil - "*Non-nil means that gnus-uu will save articles in separate files." - :group 'gnus-extract - :type 'boolean) - -(defcustom gnus-uu-be-dangerous 'ask - "*Specifies what to do if unusual situations arise during decoding. -If nil, be as conservative as possible. If t, ignore things that -didn't work, and overwrite existing files. Otherwise, ask each time." - :group 'gnus-extract - :type '(choice (const :tag "conservative" nil) - (const :tag "ask" ask) - (const :tag "liberal" t))) - -;; Internal variables - -(defvar gnus-uu-saved-article-name nil) - -(defvar gnus-uu-begin-string "^begin[ \t]+[0-7][0-7][0-7][ \t]+\\(.*\\)$") -(defvar gnus-uu-end-string "^end[ \t]*$") - -(defvar gnus-uu-body-line "^M") -(let ((i 61)) - (while (> (setq i (1- i)) 0) - (setq gnus-uu-body-line (concat gnus-uu-body-line "[^a-z]"))) - (setq gnus-uu-body-line (concat gnus-uu-body-line ".?$"))) - -;"^M.............................................................?$" - -(defvar gnus-uu-shar-begin-string "^#! */bin/sh") - -(defvar gnus-uu-shar-file-name nil) -(defvar gnus-uu-shar-name-marker - "begin [0-7][0-7][0-7][ \t]+\\(\\(\\w\\|\\.\\)*\\b\\)") - -(defvar gnus-uu-postscript-begin-string "^%!PS-") -(defvar gnus-uu-postscript-end-string "^%%EOF$") - -(defvar gnus-uu-file-name nil) -(defvar gnus-uu-uudecode-process nil) -(defvar gnus-uu-binhex-article-name nil) - -(defvar gnus-uu-work-dir nil) - -(defvar gnus-uu-output-buffer-name " *Gnus UU Output*") - -(defvar gnus-uu-default-dir gnus-article-save-directory) -(defvar gnus-uu-digest-from-subject nil) -(defvar gnus-uu-digest-buffer nil) - -;; Keymaps - -(gnus-define-keys (gnus-uu-mark-map "P" gnus-summary-mark-map) - "p" gnus-summary-mark-as-processable - "u" gnus-summary-unmark-as-processable - "U" gnus-summary-unmark-all-processable - "v" gnus-uu-mark-over - "s" gnus-uu-mark-series - "r" gnus-uu-mark-region - "g" gnus-uu-unmark-region - "R" gnus-uu-mark-by-regexp - "G" gnus-uu-unmark-by-regexp - "t" gnus-uu-mark-thread - "T" gnus-uu-unmark-thread - "a" gnus-uu-mark-all - "b" gnus-uu-mark-buffer - "S" gnus-uu-mark-sparse - "k" gnus-summary-kill-process-mark - "y" gnus-summary-yank-process-mark - "w" gnus-summary-save-process-mark - "i" gnus-uu-invert-processable) - -(gnus-define-keys (gnus-uu-extract-map "X" gnus-summary-mode-map) - ;;"x" gnus-uu-extract-any - "m" gnus-summary-save-parts - "u" gnus-uu-decode-uu - "U" gnus-uu-decode-uu-and-save - "s" gnus-uu-decode-unshar - "S" gnus-uu-decode-unshar-and-save - "o" gnus-uu-decode-save - "O" gnus-uu-decode-save - "b" gnus-uu-decode-binhex - "B" gnus-uu-decode-binhex - "p" gnus-uu-decode-postscript - "P" gnus-uu-decode-postscript-and-save) - -(gnus-define-keys - (gnus-uu-extract-view-map "v" gnus-uu-extract-map) - "u" gnus-uu-decode-uu-view - "U" gnus-uu-decode-uu-and-save-view - "s" gnus-uu-decode-unshar-view - "S" gnus-uu-decode-unshar-and-save-view - "o" gnus-uu-decode-save-view - "O" gnus-uu-decode-save-view - "b" gnus-uu-decode-binhex-view - "B" gnus-uu-decode-binhex-view - "p" gnus-uu-decode-postscript-view - "P" gnus-uu-decode-postscript-and-save-view) - - -;; Commands. - -(defun gnus-uu-decode-uu (&optional n) - "Uudecodes the current article." - (interactive "P") - (gnus-uu-decode-with-method 'gnus-uu-uustrip-article n)) - -(defun gnus-uu-decode-uu-and-save (n dir) - "Decodes and saves the resulting file." - (interactive - (list current-prefix-arg - (file-name-as-directory - (read-file-name "Uudecode and save in dir: " - gnus-uu-default-dir - gnus-uu-default-dir t)))) - (gnus-uu-decode-with-method 'gnus-uu-uustrip-article n dir nil nil t)) - -(defun gnus-uu-decode-unshar (&optional n) - "Unshars the current article." - (interactive "P") - (gnus-uu-decode-with-method 'gnus-uu-unshar-article n nil nil 'scan t)) - -(defun gnus-uu-decode-unshar-and-save (n dir) - "Unshars and saves the current article." - (interactive - (list current-prefix-arg - (file-name-as-directory - (read-file-name "Unshar and save in dir: " - gnus-uu-default-dir - gnus-uu-default-dir t)))) - (gnus-uu-decode-with-method 'gnus-uu-unshar-article n dir nil 'scan t)) - -(defun gnus-uu-decode-save (n file) - "Saves the current article." - (interactive - (list current-prefix-arg - (read-file-name - (if gnus-uu-save-separate-articles - "Save articles is dir: " - "Save articles in file: ") - gnus-uu-default-dir - gnus-uu-default-dir))) - (setq gnus-uu-saved-article-name file) - (gnus-uu-decode-with-method 'gnus-uu-save-article n nil t)) - -(defun gnus-uu-decode-binhex (n dir) - "Unbinhexes the current article." - (interactive - (list current-prefix-arg - (file-name-as-directory - (read-file-name "Unbinhex and save in dir: " - gnus-uu-default-dir - gnus-uu-default-dir)))) - (setq gnus-uu-binhex-article-name - (make-temp-name (concat gnus-uu-work-dir "binhex"))) - (gnus-uu-decode-with-method 'gnus-uu-binhex-article n dir)) - -(defun gnus-uu-decode-uu-view (&optional n) - "Uudecodes and views the current article." - (interactive "P") - (let ((gnus-view-pseudos (or gnus-view-pseudos 'automatic))) - (gnus-uu-decode-uu n))) - -(defun gnus-uu-decode-uu-and-save-view (n dir) - "Decodes, views and saves the resulting file." - (interactive - (list current-prefix-arg - (read-file-name "Uudecode, view and save in dir: " - gnus-uu-default-dir - gnus-uu-default-dir t))) - (let ((gnus-view-pseudos (or gnus-view-pseudos 'automatic))) - (gnus-uu-decode-uu-and-save n dir))) - -(defun gnus-uu-decode-unshar-view (&optional n) - "Unshars and views the current article." - (interactive "P") - (let ((gnus-view-pseudos (or gnus-view-pseudos 'automatic))) - (gnus-uu-decode-unshar n))) - -(defun gnus-uu-decode-unshar-and-save-view (n dir) - "Unshars and saves the current article." - (interactive - (list current-prefix-arg - (read-file-name "Unshar, view and save in dir: " - gnus-uu-default-dir - gnus-uu-default-dir t))) - (let ((gnus-view-pseudos (or gnus-view-pseudos 'automatic))) - (gnus-uu-decode-unshar-and-save n dir))) - -(defun gnus-uu-decode-save-view (n file) - "Saves and views the current article." - (interactive - (list current-prefix-arg - (read-file-name (if gnus-uu-save-separate-articles - "Save articles is dir: " - "Save articles in file: ") - gnus-uu-default-dir gnus-uu-default-dir))) - (let ((gnus-view-pseudos (or gnus-view-pseudos 'automatic))) - (gnus-uu-decode-save n file))) - -(defun gnus-uu-decode-binhex-view (n file) - "Unbinhexes and views the current article." - (interactive - (list current-prefix-arg - (read-file-name "Unbinhex, view and save in dir: " - gnus-uu-default-dir gnus-uu-default-dir))) - (setq gnus-uu-binhex-article-name - (make-temp-name (concat gnus-uu-work-dir "binhex"))) - (let ((gnus-view-pseudos (or gnus-view-pseudos 'automatic))) - (gnus-uu-decode-binhex n file))) - - -;; Digest and forward articles - -(defun gnus-uu-digest-mail-forward (&optional n post) - "Digests and forwards all articles in this series." - (interactive "P") - (let ((gnus-uu-save-in-digest t) - (file (make-temp-name (nnheader-concat gnus-uu-tmp-dir "forward"))) - (message-forward-as-mime message-forward-as-mime) - (mail-parse-charset gnus-newsgroup-charset) - (mail-parse-ignored-charsets gnus-newsgroup-ignored-charsets) - gnus-uu-digest-buffer subject from) - (if (and n (not (numberp n))) - (setq message-forward-as-mime (not message-forward-as-mime) - n nil)) - (let ((gnus-article-reply (gnus-summary-work-articles n))) - (gnus-setup-message 'forward - (setq gnus-uu-digest-from-subject nil) - (setq gnus-uu-digest-buffer - (gnus-get-buffer-create " *gnus-uu-forward*")) - (gnus-uu-decode-save n file) - (switch-to-buffer gnus-uu-digest-buffer) - (let ((fs gnus-uu-digest-from-subject)) - (when fs - (setq from (caar fs) - subject (gnus-simplify-subject-fuzzy (cdar fs)) - fs (cdr fs)) - (while (and fs (or from subject)) - (when from - (unless (string= from (caar fs)) - (setq from nil))) - (when subject - (unless (string= (gnus-simplify-subject-fuzzy (cdar fs)) - subject) - (setq subject nil))) - (setq fs (cdr fs)))) - (unless subject - (setq subject "Digested Articles")) - (unless from - (setq from - (if (gnus-news-group-p gnus-newsgroup-name) - gnus-newsgroup-name - "Various")))) - (goto-char (point-min)) - (when (re-search-forward "^Subject: ") - (delete-region (point) (gnus-point-at-eol)) - (insert subject)) - (goto-char (point-min)) - (when (re-search-forward "^From:") - (delete-region (point) (gnus-point-at-eol)) - (insert " " from)) - (let ((message-forward-decoded-p t)) - (message-forward post)))) - (setq gnus-uu-digest-from-subject nil))) - -(defun gnus-uu-digest-post-forward (&optional n) - "Digest and forward to a newsgroup." - (interactive "P") - (gnus-uu-digest-mail-forward n t)) - -;; Process marking. - -(defun gnus-message-process-mark (unmarkp new-marked) - (let ((old (- (length gnus-newsgroup-processable) (length new-marked)))) - (message "%d mark%s %s%s" - (length new-marked) - (if (= (length new-marked) 1) "" "s") - (if unmarkp "removed" "added") - (cond - ((and (zerop old) - (not unmarkp)) - "") - (unmarkp - (format ", %d remain marked" - (length gnus-newsgroup-processable))) - (t - (format ", %d already marked" old)))))) - -(defun gnus-new-processable (unmarkp articles) - (if unmarkp - (gnus-intersection gnus-newsgroup-processable articles) - (gnus-set-difference articles gnus-newsgroup-processable))) - -(defun gnus-uu-mark-by-regexp (regexp &optional unmark) - "Set the process mark on articles whose subjects match REGEXP. -When called interactively, prompt for REGEXP. -Optional UNMARK non-nil means unmark instead of mark." - (interactive "sMark (regexp): \nP") - (save-excursion - (let* ((articles (gnus-uu-find-articles-matching regexp)) - (new-marked (gnus-new-processable unmark articles))) - (while articles - (if unmark - (gnus-summary-remove-process-mark (pop articles)) - (gnus-summary-set-process-mark (pop articles)))) - (gnus-message-process-mark unmark new-marked))) - (gnus-summary-position-point)) - -(defun gnus-uu-unmark-by-regexp (regexp) - "Remove the process mark from articles whose subjects match REGEXP. -When called interactively, prompt for REGEXP." - (interactive "sUnmark (regexp): ") - (gnus-uu-mark-by-regexp regexp t)) - -(defun gnus-uu-mark-series () - "Mark the current series with the process mark." - (interactive) - (let ((articles (gnus-uu-find-articles-matching))) - (while articles - (gnus-summary-set-process-mark (car articles)) - (setq articles (cdr articles))) - (message "")) - (gnus-summary-position-point)) - -(defun gnus-uu-mark-region (beg end &optional unmark) - "Set the process mark on all articles between point and mark." - (interactive "r") - (save-excursion - (goto-char beg) - (while (< (point) end) - (if unmark - (gnus-summary-remove-process-mark (gnus-summary-article-number)) - (gnus-summary-set-process-mark (gnus-summary-article-number))) - (forward-line 1))) - (gnus-summary-position-point)) - -(defun gnus-uu-unmark-region (beg end) - "Remove the process mark from all articles between point and mark." - (interactive "r") - (gnus-uu-mark-region beg end t)) - -(defun gnus-uu-mark-buffer () - "Set the process mark on all articles in the buffer." - (interactive) - (gnus-uu-mark-region (point-min) (point-max))) - -(defun gnus-uu-unmark-buffer () - "Remove the process mark on all articles in the buffer." - (interactive) - (gnus-uu-mark-region (point-min) (point-max) t)) - -(defun gnus-uu-mark-thread () - "Marks all articles downwards in this thread." - (interactive) - (gnus-save-hidden-threads - (let ((level (gnus-summary-thread-level))) - (while (and (gnus-summary-set-process-mark - (gnus-summary-article-number)) - (zerop (gnus-summary-next-subject 1 nil t)) - (> (gnus-summary-thread-level) level))))) - (gnus-summary-position-point)) - -(defun gnus-uu-unmark-thread () - "Unmarks all articles downwards in this thread." - (interactive) - (let ((level (gnus-summary-thread-level))) - (while (and (gnus-summary-remove-process-mark - (gnus-summary-article-number)) - (zerop (gnus-summary-next-subject 1)) - (> (gnus-summary-thread-level) level)))) - (gnus-summary-position-point)) - -(defun gnus-uu-invert-processable () - "Invert the list of process-marked articles." - (interactive) - (let ((data gnus-newsgroup-data) - number) - (save-excursion - (while data - (if (memq (setq number (gnus-data-number (pop data))) - gnus-newsgroup-processable) - (gnus-summary-remove-process-mark number) - (gnus-summary-set-process-mark number))))) - (gnus-summary-position-point)) - -(defun gnus-uu-mark-over (&optional score) - "Mark all articles with a score over SCORE (the prefix)." - (interactive "P") - (let ((score (or score gnus-summary-default-score 0)) - (data gnus-newsgroup-data)) - (save-excursion - (while data - (when (> (or (cdr (assq (gnus-data-number (car data)) - gnus-newsgroup-scored)) - gnus-summary-default-score 0) - score) - (gnus-summary-set-process-mark (caar data))) - (setq data (cdr data)))) - (gnus-summary-position-point))) - -(defun gnus-uu-mark-sparse () - "Mark all series that have some articles marked." - (interactive) - (let ((marked (nreverse gnus-newsgroup-processable)) - subject articles total headers) - (unless marked - (error "No articles marked with the process mark")) - (setq gnus-newsgroup-processable nil) - (save-excursion - (while marked - (and (vectorp (setq headers - (gnus-summary-article-header (car marked)))) - (setq subject (mail-header-subject headers) - articles (gnus-uu-find-articles-matching - (gnus-uu-reginize-string subject)) - total (nconc total articles))) - (while articles - (gnus-summary-set-process-mark (car articles)) - (setcdr marked (delq (car articles) (cdr marked))) - (setq articles (cdr articles))) - (setq marked (cdr marked))) - (setq gnus-newsgroup-processable (nreverse total))) - (gnus-summary-position-point))) - -(defun gnus-uu-mark-all () - "Mark all articles in \"series\" order." - (interactive) - (setq gnus-newsgroup-processable nil) - (save-excursion - (let ((data gnus-newsgroup-data) - number) - (while data - (when (and (not (memq (setq number (gnus-data-number (car data))) - gnus-newsgroup-processable)) - (vectorp (gnus-data-header (car data)))) - (gnus-summary-goto-subject number) - (gnus-uu-mark-series)) - (setq data (cdr data))))) - (gnus-summary-position-point)) - -;; All PostScript functions written by Erik Selberg . - -(defun gnus-uu-decode-postscript (&optional n) - "Gets postscript of the current article." - (interactive "P") - (gnus-uu-decode-with-method 'gnus-uu-decode-postscript-article n)) - -(defun gnus-uu-decode-postscript-view (&optional n) - "Gets and views the current article." - (interactive "P") - (let ((gnus-view-pseudos (or gnus-view-pseudos 'automatic))) - (gnus-uu-decode-postscript n))) - -(defun gnus-uu-decode-postscript-and-save (n dir) - "Extracts postscript and saves the current article." - (interactive - (list current-prefix-arg - (file-name-as-directory - (read-file-name "Save in dir: " - gnus-uu-default-dir - gnus-uu-default-dir t)))) - (gnus-uu-decode-with-method 'gnus-uu-decode-postscript-article - n dir nil nil t)) - -(defun gnus-uu-decode-postscript-and-save-view (n dir) - "Decodes, views and saves the resulting file." - (interactive - (list current-prefix-arg - (read-file-name "Where do you want to save the file(s)? " - gnus-uu-default-dir - gnus-uu-default-dir t))) - (let ((gnus-view-pseudos (or gnus-view-pseudos 'automatic))) - (gnus-uu-decode-postscript-and-save n dir))) - - -;; Internal functions. - -(defun gnus-uu-decode-with-method (method n &optional save not-insert - scan cdir) - (gnus-uu-initialize scan) - (when save - (setq gnus-uu-default-dir save)) - ;; Create the directory we save to. - (when (and scan cdir save - (not (file-exists-p save))) - (make-directory save t)) - (let ((articles (gnus-uu-get-list-of-articles n)) - files) - (setq files (gnus-uu-grab-articles articles method t)) - (let ((gnus-current-article (car articles))) - (when scan - (setq files (gnus-uu-scan-directory gnus-uu-work-dir)))) - (when save - (gnus-uu-save-files files save)) - (when (eq gnus-uu-do-not-unpack-archives nil) - (setq files (gnus-uu-unpack-files files))) - (setq files (nreverse (gnus-uu-get-actions files))) - (or not-insert (not gnus-insert-pseudo-articles) - (gnus-summary-insert-pseudos files save)))) - -(defun gnus-uu-scan-directory (dir &optional rec) - "Return a list of all files under DIR." - (let ((files (directory-files dir t)) - out file) - (while (setq file (pop files)) - (unless (member (file-name-nondirectory file) '("." "..")) - (push (list (cons 'name file) - (cons 'article gnus-current-article)) - out) - (when (file-directory-p file) - (setq out (nconc (gnus-uu-scan-directory file t) out))))) - (if rec - out - (nreverse out)))) - -(defun gnus-uu-save-files (files dir) - "Save FILES in DIR." - (let ((len (length files)) - (reg (concat "^" (regexp-quote gnus-uu-work-dir))) - to-file file fromdir) - (while (setq file (cdr (assq 'name (pop files)))) - (when (file-exists-p file) - (string-match reg file) - (setq fromdir (substring file (match-end 0))) - (if (file-directory-p file) - (gnus-make-directory (concat dir fromdir)) - (setq to-file (concat dir fromdir)) - (when (or (not (file-exists-p to-file)) - (eq gnus-uu-be-dangerous t) - (and gnus-uu-be-dangerous - (gnus-y-or-n-p (format "%s exists; overwrite? " - to-file)))) - (copy-file file to-file t t))))) - (gnus-message 5 "Saved %d file%s" len (if (= len 1) "" "s")))) - -;; Functions for saving and possibly digesting articles without -;; any decoding. - -;; Function called by gnus-uu-grab-articles to treat each article. -(defun gnus-uu-save-article (buffer in-state) - (cond - (gnus-uu-save-separate-articles - (save-excursion - (set-buffer buffer) - (gnus-write-buffer-as-coding-system - nnheader-text-coding-system - (concat gnus-uu-saved-article-name gnus-current-article)) - (cond ((eq in-state 'first) (list gnus-uu-saved-article-name 'begin)) - ((eq in-state 'first-and-last) (list gnus-uu-saved-article-name - 'begin 'end)) - ((eq in-state 'last) (list 'end)) - (t (list 'middle))))) - ((not gnus-uu-save-in-digest) - (save-excursion - (set-buffer buffer) - (write-region (point-min) (point-max) gnus-uu-saved-article-name t) - (cond ((eq in-state 'first) (list gnus-uu-saved-article-name 'begin)) - ((eq in-state 'first-and-last) (list gnus-uu-saved-article-name - 'begin 'end)) - ((eq in-state 'last) (list 'end)) - (t (list 'middle))))) - (t - (let ((header (gnus-summary-article-header))) - (push (cons (mail-header-from header) - (mail-header-subject header)) - gnus-uu-digest-from-subject)) - (let ((name (file-name-nondirectory gnus-uu-saved-article-name)) - beg subj headers headline sorthead body end-string state) - (if (or (eq in-state 'first) - (eq in-state 'first-and-last)) - (progn - (setq state (list 'begin)) - (save-excursion - (set-buffer (gnus-get-buffer-create "*gnus-uu-body*")) - (erase-buffer)) - (save-excursion - (set-buffer (gnus-get-buffer-create "*gnus-uu-pre*")) - (erase-buffer) - (insert (format - "Date: %s\nFrom: %s\nSubject: %s Digest\n\n" - (current-time-string) name name)) - (insert "Topics:\n"))) - (when (not (eq in-state 'end)) - (setq state (list 'middle)))) - (save-excursion - (set-buffer "*gnus-uu-body*") - (goto-char (setq beg (point-max))) - (save-excursion - (save-restriction - (set-buffer buffer) - (let (buffer-read-only) - (gnus-set-text-properties (point-min) (point-max) nil) - ;; These two are necessary for XEmacs 19.12 fascism. - (put-text-property (point-min) (point-max) 'invisible nil) - (put-text-property (point-min) (point-max) 'intangible nil)) - (goto-char (point-min)) - (re-search-forward "\n\n") - (unless gnus-uu-digest-buffer - ;; Quote all 30-dash lines. - (save-excursion - (while (re-search-forward "^-" nil t) - (beginning-of-line) - (delete-char 1) - (insert "- ")))) - (setq body (buffer-substring (1- (point)) (point-max))) - (narrow-to-region (point-min) (point)) - (if (not (setq headers gnus-uu-digest-headers)) - (setq sorthead (buffer-substring (point-min) (point-max))) - (while headers - (setq headline (car headers)) - (setq headers (cdr headers)) - (goto-char (point-min)) - (while (re-search-forward headline nil t) - (setq sorthead - (concat sorthead - (buffer-substring - (match-beginning 0) - (or (and (re-search-forward "^[^ \t]" nil t) - (1- (point))) - (progn (forward-line 1) (point))))))))) - (widen))) - (insert message-forward-start-separator) - (insert sorthead) (goto-char (point-max)) - (insert body) (goto-char (point-max)) - (goto-char beg) - (when (re-search-forward "^Subject:" nil t) - (setq subj (nnheader-decode-subject - (buffer-substring (match-end 0) (std11-field-end))))) - (when subj - (save-excursion - (set-buffer "*gnus-uu-pre*") - (insert (format " %s\n" subj))))) - (when (or (eq in-state 'last) - (eq in-state 'first-and-last)) - (if gnus-uu-digest-buffer - (with-current-buffer gnus-uu-digest-buffer - (erase-buffer) - (insert-buffer "*gnus-uu-pre*") - (goto-char (point-max)) - (insert-buffer "*gnus-uu-body*")) - (save-excursion - (set-buffer "*gnus-uu-pre*") - (insert (format "\n\n%s\n\n" (make-string 70 ?-))) - (if gnus-uu-digest-buffer - (with-current-buffer gnus-uu-digest-buffer - (erase-buffer) - (insert-buffer "*gnus-uu-pre*")) - (gnus-write-buffer-as-coding-system - nnheader-text-coding-system gnus-uu-saved-article-name))) - (save-excursion - (set-buffer "*gnus-uu-body*") - (goto-char (point-max)) - (insert - (concat (setq end-string (format "End of %s Digest" name)) - "\n")) - (insert (concat (make-string (length end-string) ?*) "\n")) - (if gnus-uu-digest-buffer - (with-current-buffer gnus-uu-digest-buffer - (goto-char (point-max)) - (insert-buffer "*gnus-uu-body*")) - (let ((file-name-coding-system nnmail-pathname-coding-system) - (pathname-coding-system nnmail-pathname-coding-system)) - (write-region-as-coding-system - nnheader-text-coding-system - (point-min) (point-max) gnus-uu-saved-article-name t))))) - (gnus-kill-buffer "*gnus-uu-pre*") - (gnus-kill-buffer "*gnus-uu-body*") - (push 'end state)) - (if (memq 'begin state) - (cons gnus-uu-saved-article-name state) - state))))) - -;; Binhex treatment - not very advanced. - -(defvar gnus-uu-binhex-body-line - "^[^:]...............................................................$") -(defvar gnus-uu-binhex-begin-line - "^:...............................................................$") -(defvar gnus-uu-binhex-end-line - ":$") - -(defun gnus-uu-binhex-article (buffer in-state) - (let (state start-char) - (save-excursion - (set-buffer buffer) - (widen) - (goto-char (point-min)) - (when (not (re-search-forward gnus-uu-binhex-begin-line nil t)) - (when (not (re-search-forward gnus-uu-binhex-body-line nil t)) - (setq state (list 'wrong-type)))) - - (if (memq 'wrong-type state) - () - (beginning-of-line) - (setq start-char (point)) - (if (looking-at gnus-uu-binhex-begin-line) - (progn - (setq state (list 'begin)) - (write-region 1 1 gnus-uu-binhex-article-name)) - (setq state (list 'middle))) - (goto-char (point-max)) - (re-search-backward (concat gnus-uu-binhex-body-line "\\|" - gnus-uu-binhex-end-line) - nil t) - (when (looking-at gnus-uu-binhex-end-line) - (setq state (if (memq 'begin state) - (cons 'end state) - (list 'end)))) - (beginning-of-line) - (forward-line 1) - (when (file-exists-p gnus-uu-binhex-article-name) - (write-region-as-binary start-char (point) - gnus-uu-binhex-article-name 'append)))) - (if (memq 'begin state) - (cons gnus-uu-binhex-article-name state) - state))) - -;; PostScript - -(defun gnus-uu-decode-postscript-article (process-buffer in-state) - (let ((state (list 'ok)) - start-char end-char file-name) - (save-excursion - (set-buffer process-buffer) - (goto-char (point-min)) - (if (not (re-search-forward gnus-uu-postscript-begin-string nil t)) - (setq state (list 'wrong-type)) - (beginning-of-line) - (setq start-char (point)) - (if (not (re-search-forward gnus-uu-postscript-end-string nil t)) - (setq state (list 'wrong-type)) - (setq end-char (point)) - (set-buffer (gnus-get-buffer-create gnus-uu-output-buffer-name)) - (insert-buffer-substring process-buffer start-char end-char) - (setq file-name (concat gnus-uu-work-dir - (cdr gnus-article-current) ".ps")) - (write-region (point-min) (point-max) file-name) - (setq state (list file-name 'begin 'end))))) - state)) - - -;; Find actions. - -(defun gnus-uu-get-actions (files) - (let ((ofiles files) - action name) - (while files - (setq name (cdr (assq 'name (car files)))) - (and - (setq action (gnus-uu-get-action name)) - (setcar files (nconc (list (if (string= action "gnus-uu-archive") - (cons 'action "file") - (cons 'action action)) - (cons 'execute (gnus-uu-command - action name))) - (car files)))) - (setq files (cdr files))) - ofiles)) - -(defun gnus-uu-get-action (file-name) - (let (action) - (setq action - (gnus-uu-choose-action - file-name - (append - gnus-uu-user-view-rules - (if gnus-uu-ignore-default-view-rules - nil - gnus-uu-default-view-rules) - gnus-uu-user-view-rules-end))) - (when (and (not (string= (or action "") "gnus-uu-archive")) - gnus-uu-view-with-metamail) - (when (setq action - (gnus-uu-choose-action file-name gnus-uu-ext-to-mime-list)) - (setq action (format "metamail -d -b -c \"%s\"" action)))) - action)) - - -;; Functions for treating subjects and collecting series. - -(defun gnus-uu-reginize-string (string) - ;; Takes a string and puts a \ in front of every special character; - ;; replaces the last thing that looks like "2/3" with "[0-9]+/3" - ;; or, if it can't find something like that, tries "2 of 3", then - ;; finally just replaces the next to last number with "[0-9]+". - (save-excursion - (set-buffer (gnus-get-buffer-create gnus-uu-output-buffer-name)) - (buffer-disable-undo) - (erase-buffer) - (insert (regexp-quote string)) - - (setq case-fold-search nil) - - (end-of-line) - (if (re-search-backward "\\([^0-9]\\)[0-9]+/\\([0-9]+\\)" nil t) - (replace-match "\\1[0-9]+/\\2") - - (end-of-line) - (if (re-search-backward "\\([^0-9]\\)[0-9]+[ \t]*of[ \t]*\\([0-9]+\\)" - nil t) - (replace-match "\\1[0-9]+ of \\2") - - (end-of-line) - (if (re-search-backward "\\([^0-9]\\)[0-9]+\\([^0-9]+\\)[0-9]+" - nil t) - (replace-match "\\1[0-9]+\\2[0-9]+" t nil nil nil)))) - - (goto-char 1) - (while (re-search-forward "[ \t]+" nil t) - (replace-match "[ \t]+" t t)) - - (buffer-substring 1 (point-max)))) - -(defun gnus-uu-get-list-of-articles (n) - ;; If N is non-nil, the article numbers of the N next articles - ;; will be returned. - ;; If any articles have been marked as processable, they will be - ;; returned. - ;; Failing that, articles that have subjects that are part of the - ;; same "series" as the current will be returned. - (let (articles) - (cond - (n - (setq n (prefix-numeric-value n)) - (let ((backward (< n 0)) - (n (abs n))) - (save-excursion - (while (and (> n 0) - (push (gnus-summary-article-number) - articles) - (gnus-summary-search-forward nil nil backward)) - (setq n (1- n)))) - (nreverse articles))) - (gnus-newsgroup-processable - (reverse gnus-newsgroup-processable)) - (t - (gnus-uu-find-articles-matching))))) - -(defun gnus-uu-string< (l1 l2) - (string< (car l1) (car l2))) - -(defun gnus-uu-find-articles-matching - (&optional subject only-unread do-not-translate) - ;; Finds all articles that matches the regexp SUBJECT. If it is - ;; nil, the current article name will be used. If ONLY-UNREAD is - ;; non-nil, only unread articles are chosen. If DO-NOT-TRANSLATE is - ;; non-nil, article names are not equalized before sorting. - (let ((subject (or subject - (gnus-uu-reginize-string (gnus-summary-article-subject)))) - list-of-subjects) - (save-excursion - (when subject - ;; Collect all subjects matching subject. - (let ((case-fold-search t) - (data gnus-newsgroup-data) - subj mark d) - (while data - (setq d (pop data)) - (and (not (gnus-data-pseudo-p d)) - (or (not only-unread) - (= (setq mark (gnus-data-mark d)) - gnus-unread-mark) - (= mark gnus-ticked-mark) - (= mark gnus-dormant-mark)) - (setq subj (mail-header-subject (gnus-data-header d))) - (string-match subject subj) - (push (cons subj (gnus-data-number d)) - list-of-subjects)))) - - ;; Expand numbers, sort, and return the list of article - ;; numbers. - (mapcar (lambda (sub) (cdr sub)) - (sort (gnus-uu-expand-numbers - list-of-subjects - (not do-not-translate)) - 'gnus-uu-string<)))))) - -(defun gnus-uu-expand-numbers (string-list &optional translate) - ;; Takes a list of strings and "expands" all numbers in all the - ;; strings. That is, this function makes all numbers equal length by - ;; prepending lots of zeroes before each number. This is to ease later - ;; sorting to find out what sequence the articles are supposed to be - ;; decoded in. Returns the list of expanded strings. - (let ((out-list string-list) - string) - (save-excursion - (set-buffer (gnus-get-buffer-create gnus-uu-output-buffer-name)) - (buffer-disable-undo) - (while string-list - (erase-buffer) - (insert (caar string-list)) - ;; Translate multiple spaces to one space. - (goto-char (point-min)) - (while (re-search-forward "[ \t]+" nil t) - (replace-match " ")) - ;; Translate all characters to "a". - (goto-char (point-min)) - (when translate - (while (re-search-forward "[A-Za-z]" nil t) - (replace-match "a" t t))) - ;; Expand numbers. - (goto-char (point-min)) - (while (re-search-forward "[0-9]+" nil t) - (replace-match - (format "%06d" - (string-to-int (buffer-substring - (match-beginning 0) (match-end 0)))))) - (setq string (buffer-substring 1 (point-max))) - (setcar (car string-list) string) - (setq string-list (cdr string-list)))) - out-list)) - - -;; `gnus-uu-grab-articles' is the general multi-article treatment -;; function. It takes a list of articles to be grabbed and a function -;; to apply to each article. -;; -;; The function to be called should take two parameters. The first -;; parameter is the article buffer. The function should leave the -;; result, if any, in this buffer. Most treatment functions will just -;; generate files... -;; -;; The second parameter is the state of the list of articles, and can -;; have four values: `first', `middle', `last' and `first-and-last'. -;; -;; The function should return a list. The list may contain the -;; following symbols: -;; `error' if an error occurred -;; `begin' if the beginning of an encoded file has been received -;; If the list returned contains a `begin', the first element of -;; the list *must* be a string with the file name of the decoded -;; file. -;; `end' if the end of an encoded file has been received -;; `middle' if the article was a body part of an encoded file -;; `wrong-type' if the article was not a part of an encoded file -;; `ok', which can be used everything is ok - -(defvar gnus-uu-has-been-grabbed nil) - -(defun gnus-uu-unmark-list-of-grabbed (&optional dont-unmark-last-article) - (let (art) - (if (not (and gnus-uu-has-been-grabbed - gnus-uu-unmark-articles-not-decoded)) - () - (when dont-unmark-last-article - (setq art (car gnus-uu-has-been-grabbed)) - (setq gnus-uu-has-been-grabbed (cdr gnus-uu-has-been-grabbed))) - (while gnus-uu-has-been-grabbed - (gnus-summary-tick-article (car gnus-uu-has-been-grabbed) t) - (setq gnus-uu-has-been-grabbed (cdr gnus-uu-has-been-grabbed))) - (when dont-unmark-last-article - (setq gnus-uu-has-been-grabbed (list art)))))) - -;; This function takes a list of articles and a function to apply to -;; each article grabbed. -;; -;; This function returns a list of files decoded if the grabbing and -;; the process-function has been successful and nil otherwise. -(defun gnus-uu-grab-articles (articles process-function - &optional sloppy limit no-errors) - (let ((state 'first) - (gnus-asynchronous nil) - (gnus-inhibit-treatment t) - has-been-begin article result-file result-files process-state - gnus-summary-display-article-function - gnus-article-prepare-hook gnus-display-mime-function - article-series files) - - (while (and articles - (not (memq 'error process-state)) - (or sloppy - (not (memq 'end process-state)))) - - (setq article (pop articles)) - (when (vectorp (gnus-summary-article-header article)) - (push article article-series) - - (unless articles - (if (eq state 'first) - (setq state 'first-and-last) - (setq state 'last))) - - (let ((part (gnus-uu-part-number article))) - (gnus-message 6 "Getting article %d%s..." - article (if (string= part "") "" (concat ", " part)))) - (gnus-summary-display-article article) - - ;; Push the article to the processing function. - (save-excursion - (set-buffer gnus-original-article-buffer) - (let ((buffer-read-only nil)) - (save-excursion - (set-buffer gnus-summary-buffer) - (setq process-state - (funcall process-function - gnus-original-article-buffer state))))) - - (gnus-summary-remove-process-mark article) - - ;; If this is the beginning of a decoded file, we push it - ;; on to a list. - (when (or (memq 'begin process-state) - (and (or (eq state 'first) - (eq state 'first-and-last)) - (memq 'ok process-state))) - (when has-been-begin - ;; If there is a `result-file' here, that means that the - ;; file was unsuccessfully decoded, so we delete it. - (when (and result-file - (file-exists-p result-file) - (not gnus-uu-be-dangerous) - (or (eq gnus-uu-be-dangerous t) - (gnus-y-or-n-p - (format "Delete unsuccessfully decoded file %s" - result-file)))) - (delete-file result-file))) - (when (memq 'begin process-state) - (setq result-file (car process-state))) - (setq has-been-begin t)) - - ;; Check whether we have decoded one complete file. - (when (memq 'end process-state) - (setq article-series nil) - (setq has-been-begin nil) - (if (stringp result-file) - (setq files (list result-file)) - (setq files result-file)) - (setq result-file (car files)) - (while files - (push (list (cons 'name (pop files)) - (cons 'article article)) - result-files)) - ;; Allow user-defined functions to be run on this file. - (when gnus-uu-grabbed-file-functions - (let ((funcs gnus-uu-grabbed-file-functions)) - (unless (listp funcs) - (setq funcs (list funcs))) - (while funcs - (funcall (pop funcs) result-file)))) - (setq result-file nil) - ;; Check whether we have decoded enough articles. - (and limit (= (length result-files) limit) - (setq articles nil))) - - ;; If this is the last article to be decoded, and - ;; we still haven't reached the end, then we delete - ;; the partially decoded file. - (and (or (eq state 'last) (eq state 'first-and-last)) - (not (memq 'end process-state)) - result-file - (file-exists-p result-file) - (not gnus-uu-be-dangerous) - (or (eq gnus-uu-be-dangerous t) - (gnus-y-or-n-p - (format "Delete incomplete file %s? " result-file))) - (delete-file result-file)) - - ;; If this was a file of the wrong sort, then - (when (and (or (memq 'wrong-type process-state) - (memq 'error process-state)) - gnus-uu-unmark-articles-not-decoded) - (gnus-summary-tick-article article t)) - - ;; Set the new series state. - (if (and (not has-been-begin) - (not sloppy) - (or (memq 'end process-state) - (memq 'middle process-state))) - (progn - (setq process-state (list 'error)) - (gnus-message 2 "No begin part at the beginning") - (sleep-for 2)) - (setq state 'middle))) - - ;; When there are no result-files, then something must be wrong. - (if result-files - (message "") - (cond - ((not has-been-begin) - (gnus-message 2 "Wrong type file")) - ((memq 'error process-state) - (gnus-message 2 "An error occurred during decoding")) - ((not (or (memq 'ok process-state) - (memq 'end process-state))) - (gnus-message 2 "End of articles reached before end of file"))) - ;; Make unsuccessfully decoded articles unread. - (when gnus-uu-unmark-articles-not-decoded - (while article-series - (gnus-summary-tick-article (pop article-series) t))))) - - ;; The original article buffer is hosed, shoot it down. - (gnus-kill-buffer gnus-original-article-buffer) - - result-files)) - -(defun gnus-uu-grab-view (file) - "View FILE using the gnus-uu methods." - (let ((action (gnus-uu-get-action file))) - (gnus-execute-command - (if (string-match "%" action) - (format action file) - (concat action " " file)) - (eq gnus-view-pseudos 'not-confirm)))) - -(defun gnus-uu-grab-move (file) - "Move FILE to somewhere." - (when gnus-uu-default-dir - (let ((to-file (concat (file-name-as-directory gnus-uu-default-dir) - (file-name-nondirectory file)))) - (cond ((fboundp 'make-symbolic-link) - (rename-file file to-file) - (unless (file-exists-p file) - (make-symbolic-link to-file file))) - (t - (copy-file file to-file)))))) - -(defun gnus-uu-part-number (article) - (let* ((header (gnus-summary-article-header article)) - (subject (and header (mail-header-subject header))) - (part nil)) - (if subject - (while (string-match "[0-9]+/[0-9]+\\|[0-9]+[ \t]+of[ \t]+[0-9]+" - subject) - (setq part (match-string 0 subject)) - (setq subject (substring subject (match-end 0))))) - (or part - (while (string-match "\\([0-9]+\\)[^0-9]+\\([0-9]+\\)" subject) - (setq part (match-string 0 subject)) - (setq subject (substring subject (match-end 0))))) - (or part ""))) - -(defun gnus-uu-uudecode-sentinel (process event) - (delete-process (get-process process))) - -(defun gnus-uu-uustrip-article (process-buffer in-state) - ;; Uudecodes a file asynchronously. - (save-excursion - (set-buffer process-buffer) - (let ((state (list 'wrong-type)) - process-connection-type case-fold-search buffer-read-only - files start-char) - (goto-char (point-min)) - - ;; Deal with ^M at the end of the lines. - (when gnus-uu-kill-carriage-return - (save-excursion - (while (search-forward "\r" nil t) - (delete-backward-char 1)))) - - (while (or (re-search-forward gnus-uu-begin-string nil t) - (re-search-forward gnus-uu-body-line nil t)) - (setq state (list 'ok)) - ;; Ok, we are at the first uucoded line. - (beginning-of-line) - (setq start-char (point)) - - (if (not (looking-at gnus-uu-begin-string)) - (setq state (list 'middle)) - ;; This is the beginning of a uuencoded article. - ;; We replace certain characters that could make things messy. - (setq gnus-uu-file-name - (let ((nnheader-file-name-translation-alist - '((?/ . ?,) (? . ?_) (?* . ?_) (?$ . ?_)))) - (nnheader-translate-file-chars (match-string 1)))) - (replace-match (concat "begin 644 " gnus-uu-file-name) t t) - - ;; Remove any non gnus-uu-body-line right after start. - (forward-line 1) - (while (and (not (eobp)) - (not (looking-at gnus-uu-body-line))) - (gnus-delete-line)) - - ;; If a process is running, we kill it. - (when (and gnus-uu-uudecode-process - (memq (process-status gnus-uu-uudecode-process) - '(run stop))) - (delete-process gnus-uu-uudecode-process) - (gnus-uu-unmark-list-of-grabbed t)) - - ;; Start a new uudecoding process. - (let ((cdir default-directory)) - (unwind-protect - (progn - (cd gnus-uu-work-dir) - (setq gnus-uu-uudecode-process - (start-process - "*uudecode*" - (gnus-get-buffer-create gnus-uu-output-buffer-name) - shell-file-name shell-command-switch - (format "cd %s %s uudecode" gnus-uu-work-dir - gnus-shell-command-separator)))) - (cd cdir))) - (set-process-sentinel - gnus-uu-uudecode-process 'gnus-uu-uudecode-sentinel) - (setq state (list 'begin)) - (push (concat gnus-uu-work-dir gnus-uu-file-name) files)) - - ;; We look for the end of the thing to be decoded. - (if (re-search-forward gnus-uu-end-string nil t) - (push 'end state) - (goto-char (point-max)) - (re-search-backward gnus-uu-body-line nil t)) - - (forward-line 1) - - (when gnus-uu-uudecode-process - (when (memq (process-status gnus-uu-uudecode-process) '(run stop)) - ;; Try to correct mishandled uucode. - (when gnus-uu-correct-stripped-uucode - (gnus-uu-check-correct-stripped-uucode start-char (point))) - (gnus-run-hooks 'gnus-uu-pre-uudecode-hook) - - ;; Send the text to the process. - (condition-case nil - (process-send-region - gnus-uu-uudecode-process start-char (point)) - (error - (progn - (delete-process gnus-uu-uudecode-process) - (gnus-message 2 "gnus-uu: Couldn't uudecode") - (setq state (list 'wrong-type))))) - - (if (memq 'end state) - (progn - ;; Send an EOF, just in case. - (ignore-errors - (process-send-eof gnus-uu-uudecode-process)) - (while (memq (process-status gnus-uu-uudecode-process) - '(open run)) - (accept-process-output gnus-uu-uudecode-process 1))) - (when (or (not gnus-uu-uudecode-process) - (not (memq (process-status gnus-uu-uudecode-process) - '(run stop)))) - (setq state (list 'wrong-type))))))) - - (if (memq 'begin state) - (cons (if (= (length files) 1) (car files) files) state) - state)))) - -(defvar gnus-uu-unshar-warning - "*** WARNING *** - -Shell archives are an archaic method of bundling files for distribution -across computer networks. During the unpacking process, arbitrary commands -are executed on your system, and all kinds of nasty things can happen. -Please examine the archive very carefully before you instruct Emacs to -unpack it. You can browse the archive buffer using \\[scroll-other-window]. - -If you are unsure what to do, please answer \"no\"." - "Text of warning message displayed by `gnus-uu-unshar-article'. -Make sure that this text consists only of few text lines. Otherwise, -Gnus might fail to display all of it.") - - -;; This function is used by `gnus-uu-grab-articles' to treat -;; a shared article. -(defun gnus-uu-unshar-article (process-buffer in-state) - (let ((state (list 'ok)) - start-char) - (save-excursion - (set-buffer process-buffer) - (goto-char (point-min)) - (if (not (re-search-forward gnus-uu-shar-begin-string nil t)) - (setq state (list 'wrong-type)) - (save-window-excursion - (save-excursion - (switch-to-buffer (current-buffer)) - (delete-other-windows) - (let ((buffer (get-buffer-create (generate-new-buffer-name - "*Warning*")))) - (unless - (unwind-protect - (with-current-buffer buffer - (insert (substitute-command-keys - gnus-uu-unshar-warning)) - (goto-char (point-min)) - (display-buffer buffer) - (yes-or-no-p "This is a shell archive, unshar it? ")) - (kill-buffer buffer)) - (setq state (list 'error)))))) - (unless (memq 'error state) - (beginning-of-line) - (setq start-char (point)) - (call-process-region - start-char (point-max) shell-file-name nil - (gnus-get-buffer-create gnus-uu-output-buffer-name) nil - shell-command-switch - (concat "cd " gnus-uu-work-dir " " - gnus-shell-command-separator " sh"))))) - state)) - -;; Returns the name of what the shar file is going to unpack. -(defun gnus-uu-find-name-in-shar () - (let ((oldpoint (point)) - res) - (goto-char (point-min)) - (when (re-search-forward gnus-uu-shar-name-marker nil t) - (setq res (buffer-substring (match-beginning 1) (match-end 1)))) - (goto-char oldpoint) - res)) - -;; `gnus-uu-choose-action' chooses what action to perform given the name -;; and `gnus-uu-file-action-list'. Returns either nil if no action is -;; found, or the name of the command to run if such a rule is found. -(defun gnus-uu-choose-action (file-name file-action-list &optional no-ignore) - (let ((action-list (copy-sequence file-action-list)) - (case-fold-search t) - rule action) - (and - (unless no-ignore - (and (not - (and gnus-uu-ignore-files-by-name - (string-match gnus-uu-ignore-files-by-name file-name))) - (not - (and gnus-uu-ignore-files-by-type - (string-match gnus-uu-ignore-files-by-type - (or (gnus-uu-choose-action - file-name gnus-uu-ext-to-mime-list t) - "")))))) - (while (not (or (eq action-list ()) action)) - (setq rule (car action-list)) - (setq action-list (cdr action-list)) - (when (string-match (car rule) file-name) - (setq action (cadr rule))))) - action)) - -(defun gnus-uu-treat-archive (file-path) - ;; Unpacks an archive. Returns t if unpacking is successful. - (let ((did-unpack t) - action command dir) - (setq action (gnus-uu-choose-action - file-path (append gnus-uu-user-archive-rules - (if gnus-uu-ignore-default-archive-rules - nil - gnus-uu-default-archive-rules)))) - - (when (not action) - (error "No unpackers for the file %s" file-path)) - - (string-match "/[^/]*$" file-path) - (setq dir (substring file-path 0 (match-beginning 0))) - - (when (member action gnus-uu-destructive-archivers) - (copy-file file-path (concat file-path "~") t)) - - (setq command (format "cd %s ; %s" dir (gnus-uu-command action file-path))) - - (save-excursion - (set-buffer (gnus-get-buffer-create gnus-uu-output-buffer-name)) - (erase-buffer)) - - (gnus-message 5 "Unpacking: %s..." (gnus-uu-command action file-path)) - - (if (= 0 (call-process shell-file-name nil - (gnus-get-buffer-create gnus-uu-output-buffer-name) - nil shell-command-switch command)) - (message "") - (gnus-message 2 "Error during unpacking of archive") - (setq did-unpack nil)) - - (when (member action gnus-uu-destructive-archivers) - (rename-file (concat file-path "~") file-path t)) - - did-unpack)) - -(defun gnus-uu-dir-files (dir) - (let ((dirs (directory-files dir t "[^/][^\\.][^\\.]?$")) - files file) - (while dirs - (if (file-directory-p (setq file (car dirs))) - (setq files (append files (gnus-uu-dir-files file))) - (push file files)) - (setq dirs (cdr dirs))) - files)) - -(defun gnus-uu-unpack-files (files &optional ignore) - ;; Go through FILES and look for files to unpack. - (let* ((totfiles (gnus-uu-ls-r gnus-uu-work-dir)) - (ofiles files) - file did-unpack) - (while files - (setq file (cdr (assq 'name (car files)))) - (when (and (not (member file ignore)) - (equal (gnus-uu-get-action (file-name-nondirectory file)) - "gnus-uu-archive")) - (push file did-unpack) - (unless (gnus-uu-treat-archive file) - (gnus-message 2 "Error during unpacking of %s" file)) - (let* ((newfiles (gnus-uu-ls-r gnus-uu-work-dir)) - (nfiles newfiles)) - (while nfiles - (unless (member (car nfiles) totfiles) - (push (list (cons 'name (car nfiles)) - (cons 'original file)) - ofiles)) - (setq nfiles (cdr nfiles))) - (setq totfiles newfiles))) - (setq files (cdr files))) - (if did-unpack - (gnus-uu-unpack-files ofiles (append did-unpack ignore)) - ofiles))) - -(defun gnus-uu-ls-r (dir) - (let* ((files (gnus-uu-directory-files dir t)) - (ofiles files)) - (while files - (when (file-directory-p (car files)) - (setq ofiles (delete (car files) ofiles)) - (setq ofiles (append ofiles (gnus-uu-ls-r (car files))))) - (setq files (cdr files))) - ofiles)) - -;; Various stuff - -(defun gnus-uu-directory-files (dir &optional full) - (let (files out file) - (setq files (directory-files dir full)) - (while files - (setq file (car files)) - (setq files (cdr files)) - (unless (member (file-name-nondirectory file) '("." "..")) - (push file out))) - (setq out (nreverse out)) - out)) - -(defun gnus-uu-check-correct-stripped-uucode (start end) - (save-excursion - (let (found beg length) - (if (not gnus-uu-correct-stripped-uucode) - () - (goto-char start) - - (if (re-search-forward " \\|`" end t) - (progn - (goto-char start) - (while (not (eobp)) - (progn - (when (looking-at "\n") - (replace-match "")) - (forward-line 1)))) - - (while (not (eobp)) - (if (looking-at (concat gnus-uu-begin-string "\\|" - gnus-uu-end-string)) - () - (when (not found) - (beginning-of-line) - (setq beg (point)) - (end-of-line) - (setq length (- (point) beg))) - (setq found t) - (beginning-of-line) - (setq beg (point)) - (end-of-line) - (when (not (= length (- (point) beg))) - (insert (make-string (- length (- (point) beg)) ? )))) - (forward-line 1))))))) - -(defvar gnus-uu-tmp-alist nil) - -(defun gnus-uu-initialize (&optional scan) - (let (entry) - (if (and (not scan) - (when (setq entry (assoc gnus-newsgroup-name gnus-uu-tmp-alist)) - (if (file-exists-p (cdr entry)) - (setq gnus-uu-work-dir (cdr entry)) - (setq gnus-uu-tmp-alist (delq entry gnus-uu-tmp-alist)) - nil))) - t - (setq gnus-uu-tmp-dir (file-name-as-directory - (expand-file-name gnus-uu-tmp-dir))) - (if (not (file-directory-p gnus-uu-tmp-dir)) - (error "Temp directory %s doesn't exist" gnus-uu-tmp-dir) - (when (not (file-writable-p gnus-uu-tmp-dir)) - (error "Temp directory %s can't be written to" - gnus-uu-tmp-dir))) - - (setq gnus-uu-work-dir - (make-temp-name (concat gnus-uu-tmp-dir "gnus"))) - (gnus-make-directory gnus-uu-work-dir) - (set-file-modes gnus-uu-work-dir 448) - (setq gnus-uu-work-dir (file-name-as-directory gnus-uu-work-dir)) - (push (cons gnus-newsgroup-name gnus-uu-work-dir) - gnus-uu-tmp-alist)))) - - -;; Kills the temporary uu buffers, kills any processes, etc. -(defun gnus-uu-clean-up () - (let (buf) - (and gnus-uu-uudecode-process - (memq (process-status (or gnus-uu-uudecode-process "nevair")) - '(stop run)) - (delete-process gnus-uu-uudecode-process)) - (when (setq buf (get-buffer gnus-uu-output-buffer-name)) - (kill-buffer buf)))) - -(defun gnus-quote-arg-for-sh-or-csh (arg) - (let ((pos 0) new-pos accum) - ;; *** bug: we don't handle newline characters properly - (while (setq new-pos (string-match "[!`\"$\\& \t{}]" arg pos)) - (push (substring arg pos new-pos) accum) - (push "\\" accum) - (push (list (aref arg new-pos)) accum) - (setq pos (1+ new-pos))) - (if (= pos 0) - arg - (apply 'concat (nconc (nreverse accum) (list (substring arg pos))))))) - -;; Inputs an action and a filename and returns a full command, making sure -;; that the filename will be treated as a single argument when the shell -;; executes the command. -(defun gnus-uu-command (action file) - (let ((quoted-file (gnus-quote-arg-for-sh-or-csh file))) - (if (string-match "%s" action) - (format action quoted-file) - (concat action " " quoted-file)))) - -(defun gnus-uu-delete-work-dir (&optional dir) - "Delete recursively all files and directories under `gnus-uu-work-dir'." - (if dir - (gnus-message 7 "Deleting directory %s..." dir) - (setq dir gnus-uu-work-dir)) - (when (and dir - (file-exists-p dir)) - (let ((files (directory-files dir t nil t)) - file) - (while (setq file (pop files)) - (unless (member (file-name-nondirectory file) '("." "..")) - (if (file-directory-p file) - (gnus-uu-delete-work-dir file) - (gnus-message 9 "Deleting file %s..." file) - (delete-file file)))) - (delete-directory dir))) - (gnus-message 7 "")) - -;; Initializing - -(add-hook 'gnus-exit-group-hook 'gnus-uu-clean-up) -(add-hook 'gnus-exit-group-hook 'gnus-uu-delete-work-dir) - - - -;;; -;;; uuencoded posting -;;; - -;; Any function that is to be used as and encoding method will take two -;; parameters: PATH-NAME and FILE-NAME. (E.g. "/home/gaga/spiral.jpg" -;; and "spiral.jpg", respectively.) The function should return nil if -;; the encoding wasn't successful. -(defcustom gnus-uu-post-encode-method 'gnus-uu-post-encode-uuencode - "Function used for encoding binary files. -There are three functions supplied with gnus-uu for encoding files: -`gnus-uu-post-encode-uuencode', which does straight uuencoding; -`gnus-uu-post-encode-mime', which encodes with base64 and adds MIME -headers; and `gnus-uu-post-encode-mime-uuencode', which encodes with -uuencode and adds MIME headers." - :group 'gnus-extract-post - :type '(radio (function-item gnus-uu-post-encode-uuencode) - (function-item gnus-uu-post-encode-mime) - (function-item gnus-uu-post-encode-mime-uuencode) - (function :tag "Other"))) - -(defcustom gnus-uu-post-include-before-composing nil - "Non-nil means that gnus-uu will ask for a file to encode before you compose the article. -If this variable is t, you can either include an encoded file with -\\[gnus-uu-post-insert-binary-in-article] or have one included for you when you post the article." - :group 'gnus-extract-post - :type 'boolean) - -(defcustom gnus-uu-post-length 990 - "Maximum length of an article. -The encoded file will be split into how many articles it takes to -post the entire file." - :group 'gnus-extract-post - :type 'integer) - -(defcustom gnus-uu-post-threaded nil - "Non-nil means that gnus-uu will post the encoded file in a thread. -This may not be smart, as no other decoder I have seen are able to -follow threads when collecting uuencoded articles. (Well, I have seen -one package that does that - gnus-uu, but somehow, I don't think that -counts...) The default is nil." - :group 'gnus-extract-post - :type 'boolean) - -(defcustom gnus-uu-post-separate-description t - "Non-nil means that the description will be posted in a separate article. -The first article will typically be numbered (0/x). If this variable -is nil, the description the user enters will be included at the -beginning of the first article, which will be numbered (1/x). Default -is t." - :group 'gnus-extract-post - :type 'boolean) - -(defvar gnus-uu-post-binary-separator "--binary follows this line--") -(defvar gnus-uu-post-message-id nil) -(defvar gnus-uu-post-inserted-file-name nil) -(defvar gnus-uu-winconf-post-news nil) - -(defun gnus-uu-post-news () - "Compose an article and post an encoded file." - (interactive) - (setq gnus-uu-post-inserted-file-name nil) - (setq gnus-uu-winconf-post-news (current-window-configuration)) - - (gnus-summary-post-news) - - (let ((map (make-sparse-keymap))) - (set-keymap-parent map (current-local-map)) - (use-local-map map)) - ;;(local-set-key "\C-c\C-c" 'gnus-summary-edit-article-done) - (local-set-key "\C-c\C-c" 'gnus-uu-post-news-inews) - (local-set-key "\C-c\C-s" 'gnus-uu-post-news-inews) - (local-set-key "\C-c\C-i" 'gnus-uu-post-insert-binary-in-article) - - (when gnus-uu-post-include-before-composing - (save-excursion (setq gnus-uu-post-inserted-file-name - (gnus-uu-post-insert-binary))))) - -(defun gnus-uu-post-insert-binary-in-article () - "Inserts an encoded file in the buffer. -The user will be asked for a file name." - (interactive) - (save-excursion - (setq gnus-uu-post-inserted-file-name (gnus-uu-post-insert-binary)))) - -;; Encodes with uuencode and substitutes all spaces with backticks. -(defun gnus-uu-post-encode-uuencode (path file-name) - (when (gnus-uu-post-encode-file "uuencode" path file-name) - (goto-char (point-min)) - (forward-line 1) - (while (re-search-forward " " nil t) - (replace-match "`")) - t)) - -;; Encodes with uuencode and adds MIME headers. -(defun gnus-uu-post-encode-mime-uuencode (path file-name) - (when (gnus-uu-post-encode-uuencode path file-name) - (gnus-uu-post-make-mime file-name "x-uue") - t)) - -;; Encodes with base64 and adds MIME headers -(defun gnus-uu-post-encode-mime (path file-name) - (when (zerop (call-process shell-file-name nil t nil shell-command-switch - (format "%s %s -o %s" "mmencode" path file-name))) - (gnus-uu-post-make-mime file-name "base64") - t)) - -;; Adds MIME headers. -(defun gnus-uu-post-make-mime (file-name encoding) - (goto-char (point-min)) - (insert (format "Content-Type: %s; name=\"%s\"\n" - (gnus-uu-choose-action file-name gnus-uu-ext-to-mime-list) - file-name)) - (insert (format "Content-Transfer-Encoding: %s\n\n" encoding)) - (save-restriction - (set-buffer gnus-message-buffer) - (goto-char (point-min)) - (re-search-forward (concat "^" (regexp-quote mail-header-separator) "$")) - (forward-line -1) - (narrow-to-region 1 (point)) - (unless (mail-fetch-field "mime-version") - (widen) - (insert "MIME-Version: 1.0\n")) - (widen))) - -;; Encodes a file PATH with COMMAND, leaving the result in the -;; current buffer. -(defun gnus-uu-post-encode-file (command path file-name) - (= 0 (call-process shell-file-name nil t nil shell-command-switch - (format "%s %s %s" command path file-name)))) - -(defun gnus-uu-post-news-inews () - "Posts the composed news article and encoded file. -If no file has been included, the user will be asked for a file." - (interactive) - - (let (file-name) - - (if gnus-uu-post-inserted-file-name - (setq file-name gnus-uu-post-inserted-file-name) - (setq file-name (gnus-uu-post-insert-binary))) - - (gnus-uu-post-encoded file-name gnus-uu-post-threaded)) - (setq gnus-uu-post-inserted-file-name nil) - (when gnus-uu-winconf-post-news - (set-window-configuration gnus-uu-winconf-post-news))) - -;; Asks for a file to encode, encodes it and inserts the result in -;; the current buffer. Returns the file name the user gave. -(defun gnus-uu-post-insert-binary () - (let ((uuencode-buffer-name "*uuencode buffer*") - file-path uubuf file-name) - - (setq file-path (read-file-name - "What file do you want to encode? ")) - (when (not (file-exists-p file-path)) - (error "%s: No such file" file-path)) - - (goto-char (point-max)) - (insert (format "\n%s\n" gnus-uu-post-binary-separator)) - - ;; #### Unix-specific? - (when (string-match "^~/" file-path) - (setq file-path (concat "$HOME" (substring file-path 1)))) - ;; #### Unix-specific? - (if (string-match "/[^/]*$" file-path) - (setq file-name (substring file-path (1+ (match-beginning 0)))) - (setq file-name file-path)) - - (unwind-protect - (if (save-excursion - (set-buffer (setq uubuf - (gnus-get-buffer-create uuencode-buffer-name))) - (erase-buffer) - (funcall gnus-uu-post-encode-method file-path file-name)) - (insert-buffer-substring uubuf) - (error "Encoding unsuccessful")) - (kill-buffer uubuf)) - file-name)) - -;; Posts the article and all of the encoded file. -(defun gnus-uu-post-encoded (file-name &optional threaded) - (let ((send-buffer-name "*uuencode send buffer*") - (encoded-buffer-name "*encoded buffer*") - (top-string "[ cut here %s (%s %d/%d) %s gnus-uu ]") - (separator (concat mail-header-separator "\n\n")) - uubuf length parts header i end beg - beg-line minlen post-buf whole-len beg-binary end-binary) - - (setq post-buf (current-buffer)) - - (goto-char (point-min)) - (when (not (re-search-forward - (if gnus-uu-post-separate-description - (concat "^" (regexp-quote gnus-uu-post-binary-separator) - "$") - (concat "^" (regexp-quote mail-header-separator) "$")) - nil t)) - (error "Internal error: No binary/header separator")) - (beginning-of-line) - (forward-line 1) - (setq beg-binary (point)) - (setq end-binary (point-max)) - - (save-excursion - (set-buffer (setq uubuf (gnus-get-buffer-create encoded-buffer-name))) - (erase-buffer) - (insert-buffer-substring post-buf beg-binary end-binary) - (goto-char (point-min)) - (setq length (count-lines 1 (point-max))) - (setq parts (/ length gnus-uu-post-length)) - (unless (< (% length gnus-uu-post-length) 4) - (incf parts))) - - (when gnus-uu-post-separate-description - (forward-line -1)) - (delete-region (point) (point-max)) - - (goto-char (point-min)) - (re-search-forward - (concat "^" (regexp-quote mail-header-separator) "$") nil t) - (beginning-of-line) - (setq header (buffer-substring 1 (point))) - - (goto-char (point-min)) - (when gnus-uu-post-separate-description - (when (re-search-forward "^Subject: " nil t) - (end-of-line) - (insert (format " (0/%d)" parts))) - (save-excursion - (message-send)) - (setq gnus-uu-post-message-id (message-fetch-field "message-id"))) - - (save-excursion - (setq i 1) - (setq beg 1) - (while (not (> i parts)) - (set-buffer (gnus-get-buffer-create send-buffer-name)) - (erase-buffer) - (insert header) - (when (and threaded gnus-uu-post-message-id) - (insert "References: " gnus-uu-post-message-id "\n")) - (insert separator) - (setq whole-len - (- 62 (length (format top-string "" file-name i parts "")))) - (when (> 1 (setq minlen (/ whole-len 2))) - (setq minlen 1)) - (setq - beg-line - (format top-string - (make-string minlen ?-) - file-name i parts - (make-string - (if (= 0 (% whole-len 2)) (1- minlen) minlen) ?-))) - - (goto-char (point-min)) - (when (re-search-forward "^Subject: " nil t) - (end-of-line) - (insert (format " (%d/%d)" i parts))) - - (goto-char (point-max)) - (save-excursion - (set-buffer uubuf) - (goto-char beg) - (if (= i parts) - (goto-char (point-max)) - (forward-line gnus-uu-post-length)) - (when (and (= (1+ i) parts) (< (count-lines (point) (point-max)) 4)) - (forward-line -4)) - (setq end (point))) - (insert-buffer-substring uubuf beg end) - (insert beg-line "\n") - (setq beg end) - (incf i) - (goto-char (point-min)) - (re-search-forward - (concat "^" (regexp-quote mail-header-separator) "$") nil t) - (beginning-of-line) - (forward-line 2) - (when (re-search-forward - (concat "^" (regexp-quote gnus-uu-post-binary-separator) "$") - nil t) - (replace-match "") - (forward-line 1)) - (insert beg-line) - (insert "\n") - (let (message-sent-message-via) - (save-excursion - (message-send)) - (setq gnus-uu-post-message-id - (concat (message-fetch-field "references") " " - (message-fetch-field "message-id")))))) - - (gnus-kill-buffer send-buffer-name) - (gnus-kill-buffer encoded-buffer-name) - - (when (not gnus-uu-post-separate-description) - (set-buffer-modified-p nil) - (when (fboundp 'bury-buffer) - (bury-buffer))))) - -(provide 'gnus-uu) - -;;; gnus-uu.el ends here diff --git a/lisp/gnus-vers.el b/lisp/gnus-vers.el deleted file mode 100644 index 08c6ff3..0000000 --- a/lisp/gnus-vers.el +++ /dev/null @@ -1,88 +0,0 @@ -;;; gnus-vers.el --- Declare gnus version. - -;; Copyright (C) 2000, 2001 Free Software Foundation, Inc. - -;; Author: Keiichi Suzuki -;; Katsumi Yamaoka -;; Keywords: news, mail, compatibility - -;; This file is part of T-gnus. - -;; This program 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 program 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 this program; see the file COPYING. If not, write to -;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) -(eval-when-compile (require 'gnus-clfns)) - -(require 'poe) -(require 'product) -(provide 'gnus-vers) - -(defconst gnus-revision-number "06" - "Revision number for this version of gnus.") - -;; Product information of this gnus. -(product-provide 'gnus-vers - (product-define "T-gnus" nil - (list 6 15 4 - (string-to-number gnus-revision-number)))) - -(defconst gnus-original-version-number "0.04" - "Version number for this version of Gnus.") - -(provide 'running-pterodactyl-gnus-0_73-or-later) - -(defconst gnus-original-product-name "Oort Gnus" - "Product name of the original version of Gnus.") - -(defconst gnus-product-name (product-name (product-find 'gnus-vers)) - "Product name of this version of gnus.") - -(defconst gnus-version-number - (mapconcat - 'number-to-string - (butlast (product-version (product-find 'gnus-vers))) - ".") - "Version number for this version of gnus.") - -(defconst gnus-version - (format "%s %s r%s (based on %s v%s ; for SEMI 1.13, FLIM 1.13)" - gnus-product-name gnus-version-number gnus-revision-number - gnus-original-product-name gnus-original-version-number) - "Version string for this version of gnus.") - -(defun gnus-version (&optional arg) - "Version number of this version of Gnus. -If ARG, insert string at point." - (interactive "P") - (if arg - (insert (message "%s" gnus-version)) - (message "%s" gnus-version))) - -(defun gnus-extended-version () - "Stringified gnus version." - (concat gnus-product-name "/" gnus-version-number - " (based on " - gnus-original-product-name " v" gnus-original-version-number ")" - (if (zerop (string-to-number gnus-revision-number)) - "" - (concat " (revision " gnus-revision-number ")")) - )) - -;; gnus-vers.el ends here diff --git a/lisp/gnus-vm.el b/lisp/gnus-vm.el deleted file mode 100644 index 145eda5..0000000 --- a/lisp/gnus-vm.el +++ /dev/null @@ -1,167 +0,0 @@ -;;; gnus-vm.el --- vm interface for Gnus - -;; Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000 -;; Free Software Foundation, Inc. - -;; Author: Per Persson -;; Katsumi Yamaoka -;; Keywords: news, mail - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;; Major contributors: -;; Christian Limpach -;; Some code stolen from: -;; Rick Sladkey - -;;; Code: - -(eval-when-compile (require 'cl)) - -(require 'gnus-art) - -(eval-when-compile - (autoload 'vm-mode "vm") - (autoload 'vm-read-file-name "vm") - (autoload 'vm-save-message "vm")) - -(when (not (featurep 'vm)) - (load "vm")) - -(defvar vm-folder-directory) -(defvar vm-folder-history) -(defvar vm-primary-inbox) -(defvar vm-use-toolbar) - -(defun gnus-vm-make-folder (&optional buffer) - (let ((article (or buffer (current-buffer))) - (tmp-folder (generate-new-buffer " *tmp-folder*")) - (start (point-min)) - (end (point-max))) - (set-buffer tmp-folder) - (insert-buffer-substring article start end) - (goto-char (point-min)) - (if (looking-at "^\\(From [^ ]+ \\).*$") - (replace-match (concat "\\1" (current-time-string))) - (insert "From " gnus-newsgroup-name " " - (current-time-string) "\n")) - (while (re-search-forward "\n\nFrom " nil t) - (replace-match "\n\n>From ")) - ;; insert a newline, otherwise the last line gets lost - (goto-char (point-max)) - (insert "\n") - (let (mime-display-header-hook - mime-display-text/plain-hook mime-text-decode-hook - mime-view-define-keymap-hook mime-view-mode-hook) - (vm-mode)) - tmp-folder)) - -(defvar gnus-summary-save-article-vm-folder nil) -(defvar gnus-summary-save-article-vm-count nil) - -(defun gnus-summary-save-article-vm (&optional arg folder) - "Append the current article to a vm folder. -If N is a positive number, save the N next articles. -If N is a negative number, save the N previous articles. -If N is nil and any articles have been marked with the process mark, -save those articles instead." - (interactive - (let ((prefix-arg current-prefix-arg) - articles marks default-folder) - (setq default-folder (or (car vm-folder-history) vm-primary-inbox)) - (if (numberp prefix-arg) - (setq articles prefix-arg) - (setq marks (delq nil (gnus-summary-work-articles nil)) - articles (length marks))) - (list - prefix-arg - (unless (zerop articles) - (vm-read-file-name - (format - "Save %s in VM folder: " - (cond ((eq 1 articles) - (if (or (not marks) (eq gnus-current-article (car marks))) - "this article" - "the marked article")) - ((< 0 articles) - (if marks - (format "the marked %d articles" articles) - (format "the %d next articles" articles))) - ((> 0 articles) - (format "the %d previous articles" (- articles))))) - (if default-folder "" vm-folder-directory) - nil nil default-folder 'vm-folder-history))))) - (if (interactive-p) - (unless folder - (error "No articles to be saved")) - (unless (setq folder (or folder gnus-summary-save-article-vm-folder)) - (error "No VM folder is specified"))) - (unwind-protect - (progn - (setq gnus-summary-save-article-vm-folder folder - gnus-summary-save-article-vm-count 0) - (let ((gnus-default-article-saver 'gnus-summary-save-in-vm) - mime-display-header-hook mime-display-text/plain-hook - mime-text-decode-hook mime-view-define-keymap-hook - mime-view-mode-hook) - (gnus-summary-save-article arg)) - (cond ((eq 1 gnus-summary-save-article-vm-count) - (message "One article is saved in %s" folder)) - ((< 0 gnus-summary-save-article-vm-count) - (message "%d articles are saved in %s" - gnus-summary-save-article-vm-count folder)) - (t - (message "Maybe no articles are saved in %s" folder)))) - (setq gnus-summary-save-article-vm-folder nil - gnus-summary-save-article-vm-count nil))) - -(defun gnus-summary-save-in-vm (&optional folder) - (interactive - (let (default-folder) - (setq default-folder (or (car vm-folder-history) vm-primary-inbox)) - (list (vm-read-file-name "Save this article in VM folder: " - (if default-folder "" vm-folder-directory) - nil nil default-folder 'vm-folder-history)))) - (unless (interactive-p) - (setq folder (or folder gnus-summary-save-article-vm-folder))) - (unless folder - (error "No VM folder is specified")) - (unless (interactive-p) - (message "Saving the article %d in %s..." gnus-current-article folder) - (when (numberp gnus-summary-save-article-vm-count) - (incf gnus-summary-save-article-vm-count))) - (save-window-excursion - (apply 'gnus-summary-select-article gnus-show-all-headers - (unless (interactive-p) - (list nil nil gnus-current-article))) - (gnus-eval-in-buffer-window gnus-original-article-buffer - (save-excursion - (save-restriction - (widen) - (let* ((vm-use-toolbar nil) - (vm-folder (gnus-vm-make-folder))) - (vm-save-message folder) - (when (interactive-p) - (message "This article is saved in %s" folder)) - (kill-buffer vm-folder))))))) - -(provide 'gnus-vm) - -;;; gnus-vm.el ends here diff --git a/lisp/gnus-win.el b/lisp/gnus-win.el deleted file mode 100644 index 07819de..0000000 --- a/lisp/gnus-win.el +++ /dev/null @@ -1,559 +0,0 @@ -;;; gnus-win.el --- window configuration functions for Gnus -;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) - -(require 'gnus) - -(defgroup gnus-windows nil - "Window configuration." - :group 'gnus) - -(defcustom gnus-use-full-window t - "*If non-nil, use the entire Emacs screen." - :group 'gnus-windows - :type 'boolean) - -(defvar gnus-window-configuration nil - "Obsolete variable. See `gnus-buffer-configuration'.") - -(defcustom gnus-window-min-width 2 - "*Minimum width of Gnus buffers." - :group 'gnus-windows - :type 'integer) - -(defcustom gnus-window-min-height 1 - "*Minimum height of Gnus buffers." - :group 'gnus-windows - :type 'integer) - -(defcustom gnus-always-force-window-configuration nil - "*If non-nil, always force the Gnus window configurations." - :group 'gnus-windows - :type 'boolean) - -(defvar gnus-buffer-configuration - '((group - (vertical 1.0 - (group 1.0 point) - (if gnus-carpal '(group-carpal 4)))) - (summary - (vertical 1.0 - (summary 1.0 point) - (if gnus-carpal '(summary-carpal 4)))) - (article - (cond - ((and gnus-use-picons - (eq gnus-picons-display-where 'picons)) - '(frame 1.0 - (vertical 1.0 - (summary 0.25 point) - (if gnus-carpal '(summary-carpal 4)) - (article 1.0)) - (vertical ((height . 5) (width . 15) - (user-position . t) - (left . -1) (top . 1)) - (picons 1.0)))) - (gnus-use-trees - '(vertical 1.0 - (summary 0.25 point) - (tree 0.25) - (article 1.0))) - (t - '(vertical 1.0 - (summary 0.25 point) - (if gnus-carpal '(summary-carpal 4)) - (article 1.0))))) - (server - (vertical 1.0 - (server 1.0 point) - (if gnus-carpal '(server-carpal 2)))) - (browse - (vertical 1.0 - (browse 1.0 point) - (if gnus-carpal '(browse-carpal 2)))) - (message - (vertical 1.0 - (message 1.0 point))) - (pick - (vertical 1.0 - (article 1.0 point))) - (info - (vertical 1.0 - (info 1.0 point))) - (summary-faq - (vertical 1.0 - (summary 0.25) - (faq 1.0 point))) - (edit-article - (vertical 1.0 - (article 1.0 point))) - (edit-form - (vertical 1.0 - (group 0.5) - (edit-form 1.0 point))) - (edit-score - (vertical 1.0 - (summary 0.25) - (edit-score 1.0 point))) - (post - (vertical 1.0 - (post 1.0 point))) - (reply - (vertical 1.0 - (article-copy 0.5) - (message 1.0 point))) - (forward - (vertical 1.0 - (message 1.0 point))) - (reply-yank - (vertical 1.0 - (message 1.0 point))) - (mail-bounce - (vertical 1.0 - (article 0.5) - (message 1.0 point))) - (pipe - (vertical 1.0 - (summary 0.25 point) - (if gnus-carpal '(summary-carpal 4)) - ("*Shell Command Output*" 1.0))) - (bug - (vertical 1.0 - ("*Gnus Help Bug*" 0.5) - ("*Gnus Bug*" 1.0 point))) - (score-trace - (vertical 1.0 - (summary 0.5 point) - ("*Score Trace*" 1.0))) - (score-words - (vertical 1.0 - (summary 0.5 point) - ("*Score Words*" 1.0))) - (split-trace - (vertical 1.0 - (summary 0.5 point) - ("*Split Trace*" 1.0))) - (category - (vertical 1.0 - (category 1.0))) - (compose-bounce - (vertical 1.0 - (article 0.5) - (message 1.0 point))) - (display-term - (vertical 1.0 - ("*display*" 1.0)))) - "Window configuration for all possible Gnus buffers. -See the Gnus manual for an explanation of the syntax used.") - -(defvar gnus-window-to-buffer - '((group . gnus-group-buffer) - (summary . gnus-summary-buffer) - (article . gnus-article-buffer) - (server . gnus-server-buffer) - (browse . "*Gnus Browse Server*") - (edit-group . gnus-group-edit-buffer) - (edit-form . gnus-edit-form-buffer) - (edit-server . gnus-server-edit-buffer) - (group-carpal . gnus-carpal-group-buffer) - (summary-carpal . gnus-carpal-summary-buffer) - (server-carpal . gnus-carpal-server-buffer) - (browse-carpal . gnus-carpal-browse-buffer) - (edit-score . gnus-score-edit-buffer) - (message . gnus-message-buffer) - (mail . gnus-message-buffer) - (post-news . gnus-message-buffer) - (faq . gnus-faq-buffer) - (picons . gnus-picons-buffer-name) - (tree . gnus-tree-buffer) - (score-trace . "*Score Trace*") - (split-trace . "*Split Trace*") - (info . gnus-info-buffer) - (category . gnus-category-buffer) - (article-copy . gnus-article-copy) - (draft . gnus-draft-buffer)) - "Mapping from short symbols to buffer names or buffer variables.") - -;;; Internal variables. - -(defvar gnus-current-window-configuration nil - "The most recently set window configuration.") - -(defvar gnus-created-frames nil) -(defvar gnus-window-frame-focus nil) - -(defun gnus-kill-gnus-frames () - "Kill all frames Gnus has created." - (while gnus-created-frames - (when (frame-live-p (car gnus-created-frames)) - ;; We slap a condition-case around this `delete-frame' to ensure - ;; against errors if we try do delete the single frame that's left. - (ignore-errors - (delete-frame (car gnus-created-frames)))) - (pop gnus-created-frames))) - -(defun gnus-window-configuration-element (list) - (while (and list - (not (assq (car list) gnus-window-configuration))) - (pop list)) - (cadr (assq (car list) gnus-window-configuration))) - -(defun gnus-windows-old-to-new (setting) - ;; First we take care of the really, really old Gnus 3 actions. - (when (symbolp setting) - (setq setting - ;; Take care of ooold GNUS 3.x values. - (cond ((eq setting 'SelectArticle) 'article) - ((memq setting '(SelectNewsgroup SelectSubject ExpandSubject)) - 'summary) - ((memq setting '(ExitNewsgroup)) 'group) - (t setting)))) - (if (or (listp setting) - (not (and gnus-window-configuration - (memq setting '(group summary article))))) - setting - (let* ((elem - (cond - ((eq setting 'group) - (gnus-window-configuration-element - '(group newsgroups ExitNewsgroup))) - ((eq setting 'summary) - (gnus-window-configuration-element - '(summary SelectNewsgroup SelectSubject ExpandSubject))) - ((eq setting 'article) - (gnus-window-configuration-element - '(article SelectArticle))))) - (total (apply '+ elem)) - (types '(group summary article)) - (pbuf (if (eq setting 'newsgroups) 'group 'summary)) - (i 0) - perc out) - (while (< i 3) - (or (not (numberp (nth i elem))) - (zerop (nth i elem)) - (progn - (setq perc (if (= i 2) - 1.0 - (/ (float (nth i elem)) total))) - (push (if (eq pbuf (nth i types)) - (list (nth i types) perc 'point) - (list (nth i types) perc)) - out))) - (incf i)) - `(vertical 1.0 ,@(nreverse out))))) - -;;;###autoload -(defun gnus-add-configuration (conf) - "Add the window configuration CONF to `gnus-buffer-configuration'." - (setq gnus-buffer-configuration - (cons conf (delq (assq (car conf) gnus-buffer-configuration) - gnus-buffer-configuration)))) - -(defvar gnus-frame-list nil) - -(defun gnus-window-to-buffer-helper (obj) - (cond ((not (symbolp obj)) - obj) - ((boundp obj) - (symbol-value obj)) - ((fboundp obj) - (funcall obj)) - (t - nil))) - -(defun gnus-configure-frame (split &optional window) - "Split WINDOW according to SPLIT." - (let ((current-window - (or (get-buffer-window (current-buffer)) (selected-window)))) - (unless window - (setq window current-window)) - (select-window window) - ;; This might be an old-stylee buffer config. - (when (vectorp split) - (setq split (append split nil))) - (when (or (consp (car split)) - (vectorp (car split))) - (push 1.0 split) - (push 'vertical split)) - ;; The SPLIT might be something that is to be evaled to - ;; return a new SPLIT. - (while (and (not (assq (car split) gnus-window-to-buffer)) - (gnus-functionp (car split))) - (setq split (eval split))) - (let* ((type (car split)) - (subs (cddr split)) - (len (if (eq type 'horizontal) (window-width) (window-height))) - (total 0) - (window-min-width (or gnus-window-min-width window-min-width)) - (window-min-height (or gnus-window-min-height window-min-height)) - s result new-win rest comp-subs size sub) - (cond - ;; Nothing to do here. - ((null split)) - ;; Don't switch buffers. - ((null type) - (and (memq 'point split) window)) - ;; This is a buffer to be selected. - ((not (memq type '(frame horizontal vertical))) - (let ((buffer (cond ((stringp type) type) - (t (cdr (assq type gnus-window-to-buffer)))))) - (unless buffer - (error "Invalid buffer type: %s" type)) - (let ((buf (gnus-get-buffer-create - (gnus-window-to-buffer-helper buffer)))) - (if (eq buf (window-buffer (selected-window))) (set-buffer buf) - (switch-to-buffer buf))) - (when (memq 'frame-focus split) - (setq gnus-window-frame-focus window)) - ;; We return the window if it has the `point' spec. - (and (memq 'point split) window))) - ;; This is a frame split. - ((eq type 'frame) - (unless gnus-frame-list - (setq gnus-frame-list (list (window-frame current-window)))) - (let ((i 0) - params frame fresult) - (while (< i (length subs)) - ;; Frame parameter is gotten from the sub-split. - (setq params (cadr (elt subs i))) - ;; It should be a list. - (unless (listp params) - (setq params nil)) - ;; Create a new frame? - (unless (setq frame (elt gnus-frame-list i)) - (nconc gnus-frame-list (list (setq frame (make-frame params)))) - (push frame gnus-created-frames)) - ;; Is the old frame still alive? - (unless (frame-live-p frame) - (setcar (nthcdr i gnus-frame-list) - (setq frame (make-frame params)))) - ;; Select the frame in question and do more splits there. - (select-frame frame) - (setq fresult (or (gnus-configure-frame (elt subs i)) fresult)) - (incf i)) - ;; Select the frame that has the selected buffer. - (when fresult - (select-frame (window-frame fresult))))) - ;; This is a normal split. - (t - (when (> (length subs) 0) - ;; First we have to compute the sizes of all new windows. - (while subs - (setq sub (append (pop subs) nil)) - (while (and (not (assq (car sub) gnus-window-to-buffer)) - (gnus-functionp (car sub))) - (setq sub (eval sub))) - (when sub - (push sub comp-subs) - (setq size (cadar comp-subs)) - (cond ((equal size 1.0) - (setq rest (car comp-subs)) - (setq s 0)) - ((floatp size) - (setq s (floor (* size len)))) - ((integerp size) - (setq s size)) - (t - (error "Invalid size: %s" size))) - ;; Try to make sure that we are inside the safe limits. - (cond ((zerop s)) - ((eq type 'horizontal) - (setq s (max s window-min-width))) - ((eq type 'vertical) - (setq s (max s window-min-height)))) - (setcar (cdar comp-subs) s) - (incf total s))) - ;; Take care of the "1.0" spec. - (if rest - (setcar (cdr rest) (- len total)) - (error "No 1.0 specs in %s" split)) - ;; The we do the actual splitting in a nice recursive - ;; fashion. - (setq comp-subs (nreverse comp-subs)) - (while comp-subs - (if (null (cdr comp-subs)) - (setq new-win window) - (setq new-win - (split-window window (cadar comp-subs) - (eq type 'horizontal)))) - (setq result (or (gnus-configure-frame - (car comp-subs) window) - result)) - (select-window new-win) - (setq window new-win) - (setq comp-subs (cdr comp-subs)))) - ;; Return the proper window, if any. - (when result - (select-window result))))))) - -(defvar gnus-frame-split-p nil) - -(defun gnus-configure-windows (setting &optional force) - (if (window-configuration-p setting) - (set-window-configuration setting) - (setq gnus-current-window-configuration setting) - (setq force (or force gnus-always-force-window-configuration)) - (setq setting (gnus-windows-old-to-new setting)) - (let ((split (if (symbolp setting) - (cadr (assq setting gnus-buffer-configuration)) - setting)) - all-visible) - - (setq gnus-frame-split-p nil) - - (unless split - (error "No such setting in `gnus-buffer-configuration': %s" setting)) - - (if (and (setq all-visible (gnus-all-windows-visible-p split)) - (not force)) - ;; All the windows mentioned are already visible, so we just - ;; put point in the assigned buffer, and do not touch the - ;; winconf. - (select-window all-visible) - - ;; Make sure "the other" buffer, nntp-server-buffer, is live. - (unless (gnus-buffer-live-p nntp-server-buffer) - (nnheader-init-server-buffer)) - - ;; Either remove all windows or just remove all Gnus windows. - (let ((frame (selected-frame))) - (unwind-protect - (if gnus-use-full-window - ;; We want to remove all other windows. - (if (not gnus-frame-split-p) - ;; This is not a `frame' split, so we ignore the - ;; other frames. - (delete-other-windows) - ;; This is a `frame' split, so we delete all windows - ;; on all frames. - (gnus-delete-windows-in-gnusey-frames)) - ;; Just remove some windows. - (gnus-remove-some-windows) - (if (featurep 'xemacs) - (switch-to-buffer nntp-server-buffer) - (set-buffer nntp-server-buffer))) - (select-frame frame))) - - (let (gnus-window-frame-focus) - (if (featurep 'xemacs) - (switch-to-buffer nntp-server-buffer) - (set-buffer nntp-server-buffer)) - (gnus-configure-frame split) - (when gnus-window-frame-focus - (select-frame (window-frame gnus-window-frame-focus)))))))) - -(defun gnus-delete-windows-in-gnusey-frames () - "Do a `delete-other-windows' in all frames that have Gnus windows." - (let ((buffers (gnus-buffers))) - (mapcar - (lambda (frame) - (unless (eq (cdr (assq 'minibuffer - (frame-parameters frame))) - 'only) - (select-frame frame) - (let (do-delete) - (walk-windows - (lambda (window) - (when (memq (window-buffer window) buffers) - (setq do-delete t)))) - (when do-delete - (delete-other-windows))))) - (frame-list)))) - -(defun gnus-all-windows-visible-p (split) - "Say whether all buffers in SPLIT are currently visible. -In particular, the value returned will be the window that -should have point." - (let ((stack (list split)) - (all-visible t) - type buffer win buf) - (while (and (setq split (pop stack)) - all-visible) - ;; Be backwards compatible. - (when (vectorp split) - (setq split (append split nil))) - (when (or (consp (car split)) - (vectorp (car split))) - (push 1.0 split) - (push 'vertical split)) - ;; The SPLIT might be something that is to be evaled to - ;; return a new SPLIT. - (while (and (not (assq (car split) gnus-window-to-buffer)) - (gnus-functionp (car split))) - (setq split (eval split))) - - (setq type (elt split 0)) - (cond - ;; Nothing here. - ((null split) t) - ;; A buffer. - ((not (memq type '(horizontal vertical frame))) - (setq buffer (cond ((stringp type) type) - (t (cdr (assq type gnus-window-to-buffer))))) - (unless buffer - (error "Invalid buffer type: %s" type)) - (if (and (setq buf (get-buffer (gnus-window-to-buffer-helper buffer))) - (setq win (get-buffer-window buf t))) - (if (memq 'point split) - (setq all-visible win)) - (setq all-visible nil))) - (t - (when (eq type 'frame) - (setq gnus-frame-split-p t)) - (setq stack (append (cddr split) stack))))) - (unless (eq all-visible t) - all-visible))) - -(defun gnus-window-top-edge (&optional window) - (nth 1 (window-edges window))) - -(defun gnus-remove-some-windows () - (let ((buffers (gnus-buffers)) - buf bufs lowest-buf lowest) - (save-excursion - ;; Remove windows on all known Gnus buffers. - (while (setq buf (pop buffers)) - (when (get-buffer-window buf) - (push buf bufs) - (pop-to-buffer buf) - (when (or (not lowest) - (< (gnus-window-top-edge) lowest)) - (setq lowest (gnus-window-top-edge) - lowest-buf buf)))) - (when lowest-buf - (pop-to-buffer lowest-buf) - (if (featurep 'xemacs) - (switch-to-buffer nntp-server-buffer) - (set-buffer nntp-server-buffer))) - (mapcar (lambda (b) (delete-windows-on b t)) - (delq lowest-buf bufs))))) - -(provide 'gnus-win) - -;;; gnus-win.el ends here diff --git a/lisp/gnus-xmas.el b/lisp/gnus-xmas.el deleted file mode 100644 index f691cb7..0000000 --- a/lisp/gnus-xmas.el +++ /dev/null @@ -1,965 +0,0 @@ -;;; gnus-xmas.el --- Gnus functions for XEmacs - -;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Katsumi Yamaoka -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; Code: - -(require 'text-props) -(defvar menu-bar-mode (featurep 'menubar)) -(require 'messagexmas) -(require 'wid-edit) - -(defgroup gnus-xmas nil - "XEmacsoid support for Gnus" - :group 'gnus) - -(defcustom gnus-xmas-glyph-directory nil - "Directory where Gnus logos and icons are located. -If this variable is nil, Gnus will try to locate the directory -automatically." - :type '(choice (const :tag "autodetect" nil) - directory) - :group 'gnus-xmas) - -(unless gnus-xmas-glyph-directory - (unless (setq gnus-xmas-glyph-directory - (message-xmas-find-glyph-directory "gnus")) - (error "Can't find glyph directory. \ -Possibly the `etc' directory has not been installed."))) - -;;(format "%02x%02x%02x" 114 66 20) "724214" - -(defvar gnus-xmas-logo-color-alist - '((flame "#cc3300" "#ff2200") - (pine "#c0cc93" "#f8ffb8") - (moss "#a1cc93" "#d2ffb8") - (irish "#04cc90" "#05ff97") - (sky "#049acc" "#05deff") - (tin "#6886cc" "#82b6ff") - (velvet "#7c68cc" "#8c82ff") - (grape "#b264cc" "#cf7df") - (labia "#cc64c2" "#fd7dff") - (berry "#cc6485" "#ff7db5") - (dino "#724214" "#1e3f03") - (neutral "#b4b4b4" "#878787") - (september "#bf9900" "#ffcc00")) - "Color alist used for the Gnus logo.") - -(defcustom gnus-xmas-logo-color-style 'dino - "*Color styles used for the Gnus logo." - :type '(choice (const flame) (const pine) (const moss) - (const irish) (const sky) (const tin) - (const velvet) (const grape) (const labia) - (const berry) (const neutral) (const september) - (const dino)) - :group 'gnus-xmas) - -(defvar gnus-xmas-logo-colors - (cdr (assq gnus-xmas-logo-color-style gnus-xmas-logo-color-alist)) - "Colors used for the Gnus logo.") - -(defcustom gnus-article-x-face-command - (if (or (featurep 'xface) - (featurep 'xpm)) - 'gnus-xmas-article-display-xface - "{ echo '/* Width=48, Height=48 */'; uncompface; } | icontopbm | ee -") - "*String or function to be executed to display an X-Face header. -If it is a string, the command will be executed in a sub-shell -asynchronously. The compressed face will be piped to this command." - :type '(choice string function)) - -;;; Internal variables. - -;; Don't warn about these undefined variables. - -;;defined in gnus.el -(defvar gnus-active-hashtb) -(defvar gnus-article-buffer) -(defvar gnus-auto-center-summary) -(defvar gnus-current-headers) -(defvar gnus-level-killed) -(defvar gnus-level-zombie) -(defvar gnus-newsgroup-bookmarks) -(defvar gnus-newsgroup-dependencies) -(defvar gnus-newsgroup-selected-overlay) -(defvar gnus-newsrc-hashtb) -(defvar gnus-read-mark) -(defvar gnus-refer-article-method) -(defvar gnus-reffed-article-number) -(defvar gnus-unread-mark) -(defvar gnus-version) -(defvar gnus-view-pseudos) -(defvar gnus-view-pseudos-separately) -(defvar gnus-visual) -(defvar gnus-zombie-list) -;;defined in gnus-msg.el -(defvar gnus-article-copy) -(defvar gnus-check-before-posting) -;;defined in gnus-vis.el -(defvar gnus-article-button-face) -(defvar gnus-article-mouse-face) -(defvar gnus-summary-selected-face) -(defvar gnus-group-reading-menu) -(defvar gnus-group-group-menu) -(defvar gnus-group-misc-menu) -(defvar gnus-summary-article-menu) -(defvar gnus-summary-thread-menu) -(defvar gnus-summary-misc-menu) -(defvar gnus-summary-post-menu) -(defvar gnus-summary-kill-menu) -(defvar gnus-article-article-menu) -(defvar gnus-article-treatment-menu) -(defvar gnus-mouse-2) -(defvar standard-display-table) -(defvar gnus-tree-minimize-window) - -(defun gnus-xmas-set-text-properties (start end props &optional buffer) - "You should NEVER use this function. It is ideologically blasphemous. -It is provided only to ease porting of broken FSF Emacs programs." - (if (stringp buffer) - nil - (map-extents (lambda (extent ignored) - (remove-text-properties - start end - (list (extent-property extent 'text-prop) nil) - buffer) - nil) - buffer start end nil nil 'text-prop) - (gnus-add-text-properties start end props buffer))) - -(defun gnus-xmas-highlight-selected-summary () - ;; Highlight selected article in summary buffer - (when gnus-summary-selected-face - (when gnus-newsgroup-selected-overlay - (delete-extent gnus-newsgroup-selected-overlay)) - (setq gnus-newsgroup-selected-overlay - (make-extent (gnus-point-at-bol) (gnus-point-at-eol))) - (set-extent-face gnus-newsgroup-selected-overlay - gnus-summary-selected-face))) - -(defcustom gnus-xmas-force-redisplay nil - "*If non-nil, force a redisplay before recentering the summary buffer. -This is ugly, but it works around a bug in `window-displayed-height'." - :type 'boolean - :group 'gnus-xmas) - -(defun gnus-xmas-switch-horizontal-scrollbar-off () - (when (featurep 'scrollbar) - (set-specifier scrollbar-height (cons (current-buffer) 0)))) - -(defun gnus-xmas-summary-recenter () - "\"Center\" point in the summary window. -If `gnus-auto-center-summary' is nil, or the article buffer isn't -displayed, no centering will be performed." - ;; Suggested by earle@mahendo.JPL.NASA.GOV (Greg Earle). - ;; Recenter only when requested. Suggested by popovich@park.cs.columbia.edu. - ;; Force redisplay to get properly computed window height. - (when gnus-xmas-force-redisplay - (sit-for 0)) - (when gnus-auto-center-summary - (let* ((height (if (fboundp 'window-displayed-height) - (window-displayed-height) - (- (window-height) 2))) - (top (cond ((< height 4) 0) - ((< height 7) 1) - (t (if (numberp gnus-auto-center-summary) - gnus-auto-center-summary - 2)))) - (bottom (save-excursion (goto-char (point-max)) - (forward-line (- height)) - (point))) - (window (get-buffer-window (current-buffer)))) - (when (get-buffer-window gnus-article-buffer) - ;; Only do recentering when the article buffer is displayed, - ;; Set the window start to either `bottom', which is the biggest - ;; possible valid number, or the second line from the top, - ;; whichever is the least. - ;; NOFORCE parameter suggested by Daniel Pittman . - (set-window-start - window (min bottom (save-excursion (forward-line (- top)) (point))) - t)) - ;; Do horizontal recentering while we're at it. - (when (and (get-buffer-window (current-buffer) t) - (not (eq gnus-auto-center-summary 'vertical))) - (let ((selected (selected-window))) - (select-window (get-buffer-window (current-buffer) t)) - (gnus-summary-position-point) - (gnus-horizontal-recenter) - (select-window selected)))))) - -(defun gnus-xmas-summary-set-display-table () - ;; Setup the display table -- like `gnus-summary-setup-display-table', - ;; but done in an XEmacsish way. - (let ((table (make-display-table)) - (i 32)) - ;; Nix out all the control chars... - (while (>= (setq i (1- i)) 0) - (aset table i [??])) - ;; ... but not newline and cr, of course. (cr is necessary for the - ;; selective display). - (aset table ?\n nil) - (aset table ?\r nil) - ;; We keep TAB as well. - (aset table ?\t nil) - ;; We nix out any glyphs over 126 below ctl-arrow. - (let ((i (if (integerp ctl-arrow) ctl-arrow 160))) - (while (>= (setq i (1- i)) 127) - (unless (aref table i) - (aset table i [??])))) - ;; Can't use `set-specifier' because of a bug in 19.14 and earlier - (add-spec-to-specifier current-display-table table (current-buffer) nil))) - -(defun gnus-xmas-add-text-properties (start end props &optional object) - (add-text-properties start end props object) - (put-text-property start end 'start-closed nil object)) - -(defun gnus-xmas-put-text-property (start end prop value &optional object) - (put-text-property start end prop value object) - (put-text-property start end 'start-closed nil object)) - -(defun gnus-xmas-extent-start-open (point) - (map-extents (lambda (extent arg) - (set-extent-property extent 'start-open t)) - nil point (min (1+ (point)) (point-max)))) - -(defun gnus-xmas-article-push-button (event) - "Check text under the mouse pointer for a callback function. -If the text under the mouse pointer has a `gnus-callback' property, -call it with the value of the `gnus-data' text property." - (interactive "e") - (set-buffer (window-buffer (event-window event))) - (let* ((pos (event-closest-point event)) - (data (get-text-property pos 'gnus-data)) - (fun (get-text-property pos 'gnus-callback))) - (goto-char pos) - (when fun - (funcall fun data)))) - -(defun gnus-xmas-move-overlay (extent start end &optional buffer) - (set-extent-endpoints extent start end buffer)) - -(defun gnus-xmas-kill-all-overlays () - "Delete all extents in the current buffer." - (map-extents (lambda (extent ignore) - (delete-extent extent) - nil))) - -(defun gnus-xmas-window-top-edge (&optional window) - (nth 1 (window-pixel-edges window))) - -(defun gnus-xmas-tree-minimize () - (when (and gnus-tree-minimize-window - (not (one-window-p))) - (let* ((window-min-height 2) - (height (1+ (count-lines (point-min) (point-max)))) - (min (max (1- window-min-height) height)) - (tot (if (numberp gnus-tree-minimize-window) - (min gnus-tree-minimize-window min) - min)) - (win (get-buffer-window (current-buffer))) - (wh (and win (1- (window-height win))))) - (when (and win - (not (eq tot wh))) - (let ((selected (selected-window))) - (select-window win) - (enlarge-window (- tot wh)) - (select-window selected)))))) - -;; Select the lowest window on the frame. -(defun gnus-xmas-appt-select-lowest-window () - (let* ((lowest-window (selected-window)) - (bottom-edge (car (cdr (cdr (cdr (window-pixel-edges)))))) - (last-window (previous-window)) - (window-search t)) - (while window-search - (let* ((this-window (next-window)) - (next-bottom-edge (car (cdr (cdr (cdr - (window-pixel-edges - this-window))))))) - (when (< bottom-edge next-bottom-edge) - (setq bottom-edge next-bottom-edge) - (setq lowest-window this-window)) - - (select-window this-window) - (when (eq last-window this-window) - (select-window lowest-window) - (setq window-search nil)))))) - -(defmacro gnus-xmas-menu-add (type &rest menus) - `(gnus-xmas-menu-add-1 ',type ',menus)) -(put 'gnus-xmas-menu-add 'lisp-indent-function 1) - -(defun gnus-xmas-menu-add-1 (type menus) - (when (and menu-bar-mode - (gnus-visual-p (intern (format "%s-menu" type)) 'menu)) - (while menus - (easy-menu-add (symbol-value (pop menus)))))) - -(defun gnus-xmas-group-menu-add () - (gnus-xmas-menu-add group - gnus-group-reading-menu gnus-group-group-menu gnus-group-misc-menu)) - -(defun gnus-xmas-summary-menu-add () - (gnus-xmas-menu-add summary - gnus-summary-misc-menu gnus-summary-kill-menu - gnus-summary-article-menu gnus-summary-thread-menu - gnus-summary-post-menu )) - -(defun gnus-xmas-article-menu-add () - (gnus-xmas-menu-add article - gnus-article-article-menu gnus-article-treatment-menu - gnus-article-post-menu gnus-article-commands-menu)) - -(defun gnus-xmas-score-menu-add () - (gnus-xmas-menu-add score - gnus-score-menu)) - -(defun gnus-xmas-pick-menu-add () - (gnus-xmas-menu-add pick - gnus-pick-menu)) - -(defun gnus-xmas-topic-menu-add () - (gnus-xmas-menu-add topic - gnus-topic-menu)) - -(defun gnus-xmas-binary-menu-add () - (gnus-xmas-menu-add binary - gnus-binary-menu)) - -(defun gnus-xmas-agent-summary-menu-add () - (gnus-xmas-menu-add agent-summary - gnus-agent-summary-menu)) - -(defun gnus-xmas-agent-group-menu-add () - (gnus-xmas-menu-add agent-group - gnus-agent-group-menu)) - -(defun gnus-xmas-agent-server-menu-add () - (gnus-xmas-menu-add agent-server - gnus-agent-server-menu)) - -(defun gnus-xmas-tree-menu-add () - (gnus-xmas-menu-add tree - gnus-tree-menu)) - -(defun gnus-xmas-draft-menu-add () - (gnus-xmas-menu-add draft - gnus-draft-menu)) - -(defun gnus-xmas-server-menu-add () - (gnus-xmas-menu-add menu - gnus-server-server-menu gnus-server-connections-menu)) - -(defun gnus-xmas-browse-menu-add () - (gnus-xmas-menu-add browse - gnus-browse-menu)) - -(defun gnus-xmas-grouplens-menu-add () - (gnus-xmas-menu-add grouplens - gnus-grouplens-menu)) - -(defun gnus-xmas-read-event-char () - "Get the next event." - (let ((event (next-command-event))) - (sit-for 0) - ;; We junk all non-key events. Is this naughty? - (while (not (or (key-press-event-p event) - (button-press-event-p event))) - (dispatch-event event) - (setq event (next-command-event))) - (cons (and (key-press-event-p event) - (event-to-character event)) - event))) - -(defun gnus-xmas-define () - (setq gnus-mouse-2 [button2]) - (setq gnus-mouse-3 [button3]) - (setq gnus-widget-button-keymap widget-button-keymap) - - (unless (memq 'underline (face-list)) - (and (fboundp 'make-face) - (funcall (intern "make-face") 'underline))) - ;; Must avoid calling set-face-underline-p directly, because it - ;; is a defsubst in emacs19, and will make the .elc files non - ;; portable! - (unless (face-differs-from-default-p 'underline) - (funcall (intern "set-face-underline-p") 'underline t)) - - (cond - ((fboundp 'char-or-char-int-p) - ;; Handle both types of marks for XEmacs-20.x. - (defalias 'gnus-characterp 'char-or-char-int-p)) - ;; V19 of XEmacs, probably. - (t - (defalias 'gnus-characterp 'characterp))) - - (defalias 'gnus-make-overlay 'make-extent) - (defalias 'gnus-delete-overlay 'delete-extent) - (defalias 'gnus-overlay-put 'set-extent-property) - (defalias 'gnus-move-overlay 'gnus-xmas-move-overlay) - (defalias 'gnus-overlay-buffer 'extent-object) - (defalias 'gnus-overlay-start 'extent-start-position) - (defalias 'gnus-overlay-end 'extent-end-position) - (defalias 'gnus-kill-all-overlays 'gnus-xmas-kill-all-overlays) - (defalias 'gnus-extent-detached-p 'extent-detached-p) - (defalias 'gnus-add-text-properties 'gnus-xmas-add-text-properties) - (defalias 'gnus-put-text-property 'gnus-xmas-put-text-property) - (defalias 'gnus-deactivate-mark 'ignore) - (defalias 'gnus-window-edges 'window-pixel-edges) - - (if (and (<= emacs-major-version 19) - (< emacs-minor-version 14)) - (defalias 'gnus-set-text-properties 'gnus-xmas-set-text-properties)) - - (unless (boundp 'standard-display-table) - (setq standard-display-table nil)) - - (defvar gnus-mouse-face-prop 'highlight) - - (defun gnus-byte-code (func) - "Return a form that can be `eval'ed based on FUNC." - (let ((fval (indirect-function func))) - (if (compiled-function-p fval) - (list 'funcall fval) - (cons 'progn (cdr (cdr fval)))))) - - (defalias 'gnus-x-color-values - (if (fboundp 'x-color-values) - 'x-color-values - (lambda (color) - (color-instance-rgb-components - (make-color-instance color)))))) - -(defun gnus-xmas-redefine () - "Redefine lots of Gnus functions for XEmacs." - (defalias 'gnus-summary-set-display-table 'gnus-xmas-summary-set-display-table) - (defalias 'gnus-visual-turn-off-edit-menu 'identity) - (defalias 'gnus-summary-recenter 'gnus-xmas-summary-recenter) - (defalias 'gnus-extent-start-open 'gnus-xmas-extent-start-open) - (defalias 'gnus-article-push-button 'gnus-xmas-article-push-button) - (defalias 'gnus-window-top-edge 'gnus-xmas-window-top-edge) - (defalias 'gnus-read-event-char 'gnus-xmas-read-event-char) - (defalias 'gnus-group-startup-message 'gnus-xmas-group-startup-message) - (defalias 'gnus-tree-minimize 'gnus-xmas-tree-minimize) - (defalias 'gnus-appt-select-lowest-window - 'gnus-xmas-appt-select-lowest-window) - (defalias 'gnus-mail-strip-quoted-names 'gnus-xmas-mail-strip-quoted-names) - (defalias 'gnus-character-to-event 'character-to-event) - (defalias 'gnus-mode-line-buffer-identification - 'gnus-xmas-mode-line-buffer-identification) - (defalias 'gnus-key-press-event-p 'key-press-event-p) - (defalias 'gnus-region-active-p 'region-active-p) - (defalias 'gnus-annotation-in-region-p 'gnus-xmas-annotation-in-region-p) - (defalias 'gnus-mime-button-menu 'gnus-xmas-mime-button-menu) - - ;; These ones are not defcutom'ed, sometimes not even defvar'ed. They - ;; probably should. If that is done, the code below should then be moved - ;; where each variable is defined, in order not to mess with user settings. - ;; -- didier - (add-hook 'gnus-score-mode-hook 'gnus-xmas-score-menu-add) - (add-hook 'gnus-binary-mode-hook 'gnus-xmas-binary-menu-add) - (add-hook 'gnus-grouplens-mode-hook 'gnus-xmas-grouplens-menu-add) - (add-hook 'gnus-server-mode-hook 'gnus-xmas-server-menu-add) - (add-hook 'gnus-browse-mode-hook 'gnus-xmas-browse-menu-add) - (add-hook 'gnus-draft-mode-hook 'gnus-xmas-draft-menu-add) - (add-hook 'gnus-mailing-list-mode-hook 'gnus-xmas-mailing-list-menu-add) - - (when (featurep 'mule) - (defun gnus-truncate-string (str end-column &optional start-column padding) - "Truncate string STR to end at column END-COLUMN. -The optional 2nd arg START-COLUMN, if non-nil, specifies -the starting column; that means to return the characters occupying -columns START-COLUMN ... END-COLUMN of STR. - -The optional 3rd arg PADDING, if non-nil, specifies a padding character -to add at the end of the result if STR doesn't reach column END-COLUMN, -or if END-COLUMN comes in the middle of a character in STR. -PADDING is also added at the beginning of the result -if column START-COLUMN appears in the middle of a character in STR. - -If PADDING is nil, no padding is added in these cases, so -the resulting string may be narrower than END-COLUMN. -\[Emacs 20.3 emulating function]" - (or start-column - (setq start-column 0)) - (let ((len (length str)) - (idx 0) - (column 0) - (head-padding "") (tail-padding "") - ch last-column last-idx from-idx) - (condition-case nil - (while (< column start-column) - (setq ch (aref str idx) - column (+ column (char-width ch)) - idx (1+ idx))) - (args-out-of-range (setq idx len))) - (if (< column start-column) - (if padding (make-string end-column padding) "") - (if (and padding (> column start-column)) - (setq head-padding - (make-string (- column start-column) padding))) - (setq from-idx idx) - (if (< end-column column) - (setq idx from-idx) - (condition-case nil - (while (< column end-column) - (setq last-column column - last-idx idx - ch (aref str idx) - column (+ column (char-width ch)) - idx (1+ idx))) - (args-out-of-range (setq idx len))) - (if (> column end-column) - (setq column last-column idx last-idx)) - (if (and padding (< column end-column)) - (setq tail-padding - (make-string (- end-column column) padding)))) - (setq str (substring str from-idx idx)) - (if padding - (concat head-padding str tail-padding) - str)))) - - (defun gnus-tilde-pad-form (el pad-width) - "Return a form that pads EL to PAD-WIDTH." - (let ((pad (abs pad-width))) - (if (symbolp el) - (if (< pad-width 0) - `(let ((val (format "%s" ,el))) - (concat val (make-string - (max 0 (- ,pad (string-width val))) ?\ ))) - `(let ((val (format "%s" ,el))) - (concat (make-string - (max 0 (- ,pad (string-width val))) ?\ ) - val))) - (if (< pad-width 0) - `(let ((val (eval ,el))) - (concat val (make-string - (max 0 (- ,pad (string-width val))) ?\ ))) - `(let ((val (eval ,el))) - (concat (make-string - (max 0 (- ,pad (string-width val))) ?\ ) - val)))))) - )) - -;;; XEmacs logo and toolbar. - -(defun gnus-xmas-group-startup-message (&optional x y) - "Insert startup message in current buffer." - ;; Insert the message. - (erase-buffer) - (cond - ((and (console-on-window-system-p) - (or (featurep 'xpm) - (featurep 'xbm))) - (let* ((logo-xpm (expand-file-name "gnus.xpm" gnus-xmas-glyph-directory)) - (logo-xbm (expand-file-name "gnus.xbm" gnus-xmas-glyph-directory)) - (glyph (make-glyph - (cond ((featurep 'xpm) - `[xpm - :file ,logo-xpm - :color-symbols - (("thing" . ,(car gnus-xmas-logo-colors)) - ("shadow" . ,(cadr gnus-xmas-logo-colors)) - ("background" . ,(face-background 'default)))]) - ((featurep 'xbm) - `[xbm :file ,logo-xbm]) - (t [nothing])))) - (wpheight (window-pixel-height)) - (rest (max 0 (1- (/ (* (- wpheight (glyph-height glyph)) - (window-height)) - wpheight 2))))) - (insert " ") - (set-extent-begin-glyph (make-extent (point) (point)) glyph) - (goto-char (point-min)) - (while (not (eobp)) - (insert (make-string (/ (max (- (window-width) (or x 35)) 0) 2) - ?\ )) - (forward-line 1)) - (setq gnus-simple-splash nil) - (goto-char (point-min)) - (insert gnus-product-name " " gnus-version-number - (if (zerop (string-to-number gnus-revision-number)) - "" - (concat " (r" gnus-revision-number ")")) - " based on " gnus-original-product-name " v" - gnus-original-version-number "\n") - (end-of-line 0) - (put-text-property (point-min) (point) 'face 'gnus-splash-face) - (insert-char ?\ (prog1 - (max 0 (/ (- (window-width) (point)) 2)) - (goto-char (point-min)))) - (forward-line 1) - (insert-char ?\n rest) - (set-window-start (selected-window) (point-min)))) - (t - (insert " - _ ___ _ _ - _ ___ __ ___ __ _ ___ - __ _ ___ __ ___ - _ ___ _ - _ _ __ _ - ___ __ _ - __ _ - _ _ _ - _ _ _ - _ _ _ - __ ___ - _ _ _ _ - _ _ - _ _ - _ _ - _ - __ - -" - ) - (goto-char (point-min)) - (insert gnus-product-name " " gnus-version-number - (if (zerop (string-to-number gnus-revision-number)) - "" - (concat " (r" gnus-revision-number ")")) - " based on " gnus-original-product-name " v" - gnus-original-version-number) - (insert-char ?\ (prog1 - (max 0 (/ (- (window-width) (point)) 2)) - (goto-char (point-min)))) - (forward-line 1) - ;; And then hack it. - (gnus-indent-rigidly (point) (point-max) - (/ (max (- (window-width) (or x 46)) 0) 2)) - (goto-char (point-min)) - (forward-line 1) - (let* ((pheight (count-lines (point-min) (point-max))) - (wheight (window-height)) - (rest (- wheight pheight))) - (insert (make-string (max 0 (* 2 (/ rest 3))) ?\n))) - ;; Paint it. - (put-text-property (point-min) (point-max) 'face 'gnus-splash-face))) - (setq modeline-buffer-identification - (list (concat gnus-version ": *Group*"))) - (set-buffer-modified-p t)) - - -;;; The toolbar. - -(defcustom gnus-use-toolbar (if (featurep 'toolbar) - 'default-toolbar - nil) - "*If nil, do not use a toolbar. -If it is non-nil, it must be a toolbar. The five valid values are -`default-toolbar', `top-toolbar', `bottom-toolbar', -`right-toolbar', and `left-toolbar'." - :type '(choice (const default-toolbar) - (const top-toolbar) (const bottom-toolbar) - (const left-toolbar) (const right-toolbar) - (const :tag "no toolbar" nil)) - :group 'gnus-xmas) - -(defvar gnus-group-toolbar - '([gnus-group-get-new-news gnus-group-get-new-news t "Get new news"] - [gnus-group-get-new-news-this-group - gnus-group-get-new-news-this-group t "Get new news in this group"] - [gnus-group-catchup-current - gnus-group-catchup-current t "Catchup group"] - [gnus-group-describe-group - gnus-group-describe-group t "Describe group"] - [gnus-group-unsubscribe gnus-group-unsubscribe t "Unsubscribe group"] - [gnus-group-subscribe gnus-group-subscribe t "Subscribe group"] - [gnus-group-kill-group gnus-group-kill-group t "Kill group"] - [gnus-group-exit gnus-group-exit t "Exit Gnus"]) - "The group buffer toolbar.") - -(defvar gnus-summary-toolbar - '([gnus-summary-prev-unread - gnus-summary-prev-page-or-article t "Page up"] - [gnus-summary-next-unread - gnus-summary-next-page t "Page down"] - [gnus-summary-post-news - gnus-summary-post-news t "Post an article"] - [gnus-summary-followup-with-original - gnus-summary-followup-with-original t - "Post a followup and yank the original"] - [gnus-summary-followup - gnus-summary-followup t "Post a followup"] - [gnus-summary-reply-with-original - gnus-summary-reply-with-original t "Mail a reply and yank the original"] - [gnus-summary-reply - gnus-summary-reply t "Mail a reply"] - [gnus-summary-caesar-message - gnus-summary-caesar-message t "Rot 13"] - [gnus-uu-decode-uu - gnus-uu-decode-uu t "Decode uuencoded articles"] - [gnus-summary-save-article-file - gnus-summary-save-article-file t "Save article in file"] - [gnus-summary-save-article - gnus-summary-save-article t "Save article"] - [gnus-uu-post-news - gnus-uu-post-news t "Post a uuencoded article"] - [gnus-summary-cancel-article - gnus-summary-cancel-article t "Cancel article"] - [gnus-summary-catchup - gnus-summary-catchup t "Catchup"] - [gnus-summary-catchup-and-exit - gnus-summary-catchup-and-exit t "Catchup and exit"] - [gnus-summary-exit gnus-summary-exit t "Exit this summary"]) - "The summary buffer toolbar.") - -(defvar gnus-summary-mail-toolbar - '( - [gnus-summary-prev-unread - gnus-summary-prev-unread-article t "Prev unread article"] - [gnus-summary-next-unread - gnus-summary-next-unread-article t "Next unread article"] - [gnus-summary-mail-reply gnus-summary-reply t "Reply"] - [gnus-summary-mail-originate gnus-summary-post-news t "Originate"] - [gnus-summary-mail-save gnus-summary-save-article t "Save"] - [gnus-summary-mail-copy gnus-summary-copy-article t "Copy message"] - [gnus-summary-mail-forward gnus-summary-mail-forward t "Forward message"] - [gnus-summary-caesar-message - gnus-summary-caesar-message t "Rot 13"] - [gnus-uu-decode-uu - gnus-uu-decode-uu t "Decode uuencoded articles"] - [gnus-summary-save-article-file - gnus-summary-save-article-file t "Save article in file"] - [gnus-summary-save-article - gnus-summary-save-article t "Save article"] - [gnus-summary-catchup - gnus-summary-catchup t "Catchup"] - [gnus-summary-catchup-and-exit - gnus-summary-catchup-and-exit t "Catchup and exit"] - [gnus-summary-exit gnus-summary-exit t "Exit this summary"]) - "The summary buffer mail toolbar.") - -(defun gnus-xmas-setup-group-toolbar () - (and gnus-use-toolbar - (message-xmas-setup-toolbar gnus-group-toolbar nil "gnus") - (set-specifier (symbol-value gnus-use-toolbar) - (cons (current-buffer) gnus-group-toolbar)))) - -(defun gnus-xmas-setup-summary-toolbar () - (let ((bar (if (gnus-news-group-p gnus-newsgroup-name) - gnus-summary-toolbar gnus-summary-mail-toolbar))) - (and gnus-use-toolbar - (message-xmas-setup-toolbar bar nil "gnus") - (set-specifier (symbol-value gnus-use-toolbar) - (cons (current-buffer) bar))))) - -(defun gnus-xmas-mail-strip-quoted-names (address) - "Protect mail-strip-quoted-names from NIL input. -XEmacs compatibility workaround." - (if (null address) - nil - (mail-strip-quoted-names address))) - -(defun gnus-xmas-call-region (command &rest args) - (apply - 'call-process-region (point-min) (point-max) command t '(t nil) nil - args)) - -(defface gnus-x-face '((t (:foreground "black" :background "white"))) - "Face to show X face" - :group 'gnus-xmas) - -(defun gnus-xmas-article-display-xface (beg end &optional buffer) - "Display any XFace headers in BUFFER." - (save-excursion - (let ((xface-glyph - (cond - ((featurep 'xface) - (make-glyph (vector 'xface :data - (concat "X-Face: " - (if buffer - (with-current-buffer buffer - (buffer-substring beg end)) - (buffer-substring beg end)))))) - ((featurep 'xpm) - (let ((cur (or buffer (current-buffer)))) - (save-excursion - (gnus-set-work-buffer) - (insert-buffer-substring cur beg end) - (let ((coding-system-for-read 'binary) - (coding-system-for-write 'binary)) - (gnus-xmas-call-region "uncompface") - (goto-char (point-min)) - (insert "/* Width=48, Height=48 */\n") - (gnus-xmas-call-region "icontopbm") - (gnus-xmas-call-region "ppmtoxpm") - (make-glyph - (vector 'xpm :data (buffer-string))))))) - (t - (make-glyph [nothing])))) - (ext (make-extent (progn - (goto-char (point-min)) - (re-search-forward "^From:" nil t) - (point)) - (1+ (point))))) - (set-glyph-face xface-glyph 'gnus-x-face) - (set-extent-begin-glyph ext xface-glyph) - (set-extent-property ext 'duplicable t)))) - -(defvar gnus-xmas-modeline-left-extent - (let ((ext (copy-extent modeline-buffer-id-left-extent))) - ext)) - -(defvar gnus-xmas-modeline-right-extent - (let ((ext (copy-extent modeline-buffer-id-right-extent))) - ext)) - -(defvar gnus-xmas-modeline-glyph - (progn - (let* ((file-xpm (expand-file-name "gnus-pointer.xpm" - gnus-xmas-glyph-directory)) - (file-xbm (expand-file-name "gnus-pointer.xbm" - gnus-xmas-glyph-directory)) - (glyph (make-glyph - ;; Gag gag gag. - (cond ((featurep 'xpm) - ;; Let's try a nifty XPM - `[xpm :file ,file-xpm]) - ((featurep 'xbm) - ;; Then a not-so-nifty XBM - `[xbm :file ,file-xbm]) - ;; Then the simple string - (t [string :data "Gnus:"]))))) - (set-glyph-face glyph 'modeline-buffer-id) - glyph))) - -(defun gnus-xmas-mode-line-buffer-identification (line) - (let ((line (car line)) - chop) - (cond - ;; This is some weird type of id. - ((not (stringp line)) - (list line)) - ;; This is non-standard, so we just pass it through. - ((not (string-match "^Gnus:" line)) - (list line)) - ;; We have a standard line, so we colorize and glyphize it a bit. - (t - (setq chop (match-end 0)) - (list - (if gnus-xmas-modeline-glyph - (cons gnus-xmas-modeline-left-extent gnus-xmas-modeline-glyph) - (cons gnus-xmas-modeline-left-extent (substring line 0 chop))) - (cons gnus-xmas-modeline-right-extent (substring line chop))))))) - -(defun gnus-xmas-splash () - (when (eq (device-type) 'x) - (gnus-splash))) - -(defun gnus-xmas-annotation-in-region-p (b e) - (or (map-extents (lambda (e u) t) nil b e nil nil 'mm t) - (if (= b e) - (eq (cadr (memq 'gnus-undeletable (text-properties-at b))) t) - (text-property-any b e 'gnus-undeletable t)))) - -(defun gnus-xmas-mime-button-menu (event) - "Construct a context-sensitive menu of MIME commands." - (interactive "e") - (let ((response (get-popup-menu-response - `("MIME Part" - ,@(mapcar (lambda (c) `[,(caddr c) ,(car c) t]) - gnus-mime-button-commands))))) - (set-buffer (event-buffer event)) - (goto-char (event-point event)) - (funcall (event-function response) (event-object response)))) - -(defun gnus-group-add-icon () - "Add an icon to the current line according to `gnus-group-icon-list'." - (let* ((p (point)) - (end (progn (end-of-line) (point))) - ;; now find out where the line starts and leave point there. - (beg (progn (beginning-of-line) (point)))) - (save-restriction - (narrow-to-region beg end) - (goto-char beg) - (when (search-forward "==&&==" nil t) - (let* ((group (gnus-group-group-name)) - (entry (gnus-group-entry group)) - (unread (if (numberp (car entry)) (car entry) 0)) - (active (gnus-active group)) - (total (if active (1+ (- (cdr active) (car active))) 0)) - (info (nth 2 entry)) - (method (gnus-server-get-method group (gnus-info-method info))) - (marked (gnus-info-marks info)) - (mailp (memq 'mail (assoc (symbol-name - (car (or method gnus-select-method))) - gnus-valid-select-methods))) - (level (or (gnus-info-level info) gnus-level-killed)) - (score (or (gnus-info-score info) 0)) - (ticked (gnus-range-length (cdr (assq 'tick marked)))) - (group-age (gnus-group-timestamp-delta group)) - (inhibit-read-only t) - (list gnus-group-icon-list) - (mystart (match-beginning 0)) - (myend (match-end 0))) - (goto-char (point-min)) - (while (and list - (not (eval (caar list)))) - (setq list (cdr list))) - (if list - (let* ((file (cdar list)) - (glyph (gnus-group-icon-create-glyph - (buffer-substring mystart myend) - file))) - (if glyph - (progn - (mapcar 'delete-annotation (annotations-at myend)) - (let ((ext (make-extent mystart myend)) - (ant (make-annotation glyph myend 'text))) - ;; set text extent params - (set-extent-property ext 'end-open t) - (set-extent-property ext 'start-open t) - (set-extent-property ext 'invisible t))) - (delete-region mystart myend))) - (delete-region mystart myend)))) - (widen)) - (goto-char p))) - -(defun gnus-group-icon-create-glyph (substring pixmap) - "Create a glyph for insertion into a group line." - (or - (cdr-safe (assoc pixmap gnus-group-icon-cache)) - (let* ((glyph (make-glyph - (list - (cons 'x - (expand-file-name pixmap gnus-xmas-glyph-directory)) - (cons 'mswindows - (expand-file-name pixmap gnus-xmas-glyph-directory)) - (cons 'tty substring))))) - (setq gnus-group-icon-cache - (cons (cons pixmap glyph) gnus-group-icon-cache)) - (set-glyph-face glyph 'default) - glyph))) - -(defun gnus-xmas-mailing-list-menu-add () - (gnus-xmas-menu-add mailing-list - gnus-mailing-list-menu)) - -(provide 'gnus-xmas) - -;;; gnus-xmas.el ends here diff --git a/lisp/gnus.el b/lisp/gnus.el deleted file mode 100644 index cf8255a..0000000 --- a/lisp/gnus.el +++ /dev/null @@ -1,3292 +0,0 @@ -;;; gnus.el --- a newsreader for GNU Emacs -;; Copyright (C) 1987, 1988, 1989, 1990, 1993, 1994, 1995, 1996, -;; 1997, 1998, 2000, 2001 Free Software Foundation, Inc. - -;; Author: Masanobu UMEDA -;; Lars Magne Ingebrigtsen -;; Tatsuya Ichikawa -;; Yoshiki Hayashi -;; Keywords: news, mail - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; Code: - -(eval '(run-hooks 'gnus-load-hook)) - -(eval-when-compile (require 'cl)) -(eval-when-compile (require 'static)) - -(require 'wid-edit) - -(require 'gnus-vers) - -(defgroup gnus nil - "The coffee-brewing, all singing, all dancing, kitchen sink newsreader." - :group 'news - :group 'mail) - -(defgroup gnus-format nil - "Dealing with formatting issues." - :group 'news - :group 'mail) - -(defgroup gnus-charset nil - "Group character set issues." - :link '(custom-manual "(gnus)Charsets") - :version "21.1" - :group 'gnus) - -(defgroup gnus-cache nil - "Cache interface." - :group 'gnus) - -(defgroup gnus-start nil - "Starting your favorite newsreader." - :group 'gnus) - -(defgroup gnus-start-server nil - "Server options at startup." - :group 'gnus-start) - -;; These belong to gnus-group.el. -(defgroup gnus-group nil - "Group buffers." - :link '(custom-manual "(gnus)The Group Buffer") - :group 'gnus) - -(defgroup gnus-group-foreign nil - "Foreign groups." - :link '(custom-manual "(gnus)Foreign Groups") - :group 'gnus-group) - -(defgroup gnus-group-new nil - "Automatic subscription of new groups." - :group 'gnus-group) - -(defgroup gnus-group-levels nil - "Group levels." - :link '(custom-manual "(gnus)Group Levels") - :group 'gnus-group) - -(defgroup gnus-group-select nil - "Selecting a Group." - :link '(custom-manual "(gnus)Selecting a Group") - :group 'gnus-group) - -(defgroup gnus-group-listing nil - "Showing slices of the group list." - :link '(custom-manual "(gnus)Listing Groups") - :group 'gnus-group) - -(defgroup gnus-group-visual nil - "Sorting the group buffer." - :link '(custom-manual "(gnus)Group Buffer Format") - :group 'gnus-group - :group 'gnus-visual) - -(defgroup gnus-group-various nil - "Various group options." - :link '(custom-manual "(gnus)Scanning New Messages") - :group 'gnus-group) - -;; These belong to gnus-sum.el. -(defgroup gnus-summary nil - "Summary buffers." - :link '(custom-manual "(gnus)The Summary Buffer") - :group 'gnus) - -(defgroup gnus-summary-exit nil - "Leaving summary buffers." - :link '(custom-manual "(gnus)Exiting the Summary Buffer") - :group 'gnus-summary) - -(defgroup gnus-summary-marks nil - "Marks used in summary buffers." - :link '(custom-manual "(gnus)Marking Articles") - :group 'gnus-summary) - -(defgroup gnus-thread nil - "Ordering articles according to replies." - :link '(custom-manual "(gnus)Threading") - :group 'gnus-summary) - -(defgroup gnus-summary-format nil - "Formatting of the summary buffer." - :link '(custom-manual "(gnus)Summary Buffer Format") - :group 'gnus-summary) - -(defgroup gnus-summary-choose nil - "Choosing Articles." - :link '(custom-manual "(gnus)Choosing Articles") - :group 'gnus-summary) - -(defgroup gnus-summary-maneuvering nil - "Summary movement commands." - :link '(custom-manual "(gnus)Summary Maneuvering") - :group 'gnus-summary) - -(defgroup gnus-summary-mail nil - "Mail group commands." - :link '(custom-manual "(gnus)Mail Group Commands") - :group 'gnus-summary) - -(defgroup gnus-summary-sort nil - "Sorting the summary buffer." - :link '(custom-manual "(gnus)Sorting") - :group 'gnus-summary) - -(defgroup gnus-summary-visual nil - "Highlighting and menus in the summary buffer." - :link '(custom-manual "(gnus)Summary Highlighting") - :group 'gnus-visual - :group 'gnus-summary) - -(defgroup gnus-summary-various nil - "Various summary buffer options." - :link '(custom-manual "(gnus)Various Summary Stuff") - :group 'gnus-summary) - -(defgroup gnus-summary-pick nil - "Pick mode in the summary buffer." - :link '(custom-manual "(gnus)Pick and Read") - :prefix "gnus-pick-" - :group 'gnus-summary) - -(defgroup gnus-summary-tree nil - "Tree display of threads in the summary buffer." - :link '(custom-manual "(gnus)Tree Display") - :prefix "gnus-tree-" - :group 'gnus-summary) - -;; Belongs to gnus-uu.el -(defgroup gnus-extract-view nil - "Viewing extracted files." - :link '(custom-manual "(gnus)Viewing Files") - :group 'gnus-extract) - -;; Belongs to gnus-score.el -(defgroup gnus-score nil - "Score and kill file handling." - :group 'gnus) - -(defgroup gnus-score-kill nil - "Kill files." - :group 'gnus-score) - -(defgroup gnus-score-adapt nil - "Adaptive score files." - :group 'gnus-score) - -(defgroup gnus-score-default nil - "Default values for score files." - :group 'gnus-score) - -(defgroup gnus-score-expire nil - "Expiring score rules." - :group 'gnus-score) - -(defgroup gnus-score-decay nil - "Decaying score rules." - :group 'gnus-score) - -(defgroup gnus-score-files nil - "Score and kill file names." - :group 'gnus-score - :group 'gnus-files) - -(defgroup gnus-score-various nil - "Various scoring and killing options." - :group 'gnus-score) - -;; Other -(defgroup gnus-visual nil - "Options controling the visual fluff." - :group 'gnus - :group 'faces) - -(defgroup gnus-agent nil - "Offline support for Gnus." - :group 'gnus) - -(defgroup gnus-files nil - "Files used by Gnus." - :group 'gnus) - -(defgroup gnus-dribble-file nil - "Auto save file." - :link '(custom-manual "(gnus)Auto Save") - :group 'gnus-files) - -(defgroup gnus-newsrc nil - "Storing Gnus state." - :group 'gnus-files) - -(defgroup gnus-server nil - "Options related to newsservers and other servers used by Gnus." - :group 'gnus) - -(defgroup gnus-server-visual nil - "Highlighting and menus in the server buffer." - :group 'gnus-visual - :group 'gnus-server) - -(defgroup gnus-message '((message custom-group)) - "Composing replies and followups in Gnus." - :group 'gnus) - -(defgroup gnus-meta nil - "Meta variables controling major portions of Gnus. -In general, modifying these variables does not take affect until Gnus -is restarted, and sometimes reloaded." - :group 'gnus) - -(defgroup gnus-various nil - "Other Gnus options." - :link '(custom-manual "(gnus)Various Various") - :group 'gnus) - -(defgroup gnus-mime nil - "Variables for controlling the Gnus MIME interface." - :group 'gnus) - -(defgroup gnus-exit nil - "Exiting gnus." - :link '(custom-manual "(gnus)Exiting Gnus") - :group 'gnus) - -(defcustom gnus-inhibit-startup-message nil - "If non-nil, the startup message will not be displayed. -This variable is used before `.gnus.el' is loaded, so it should -be set in `.emacs' instead." - :group 'gnus-start - :type 'boolean) - -(defcustom gnus-play-startup-jingle nil - "If non-nil, play the Gnus jingle at startup." - :group 'gnus-start - :type 'boolean) - -(unless (fboundp 'gnus-group-remove-excess-properties) - (defalias 'gnus-group-remove-excess-properties 'ignore)) - -(unless (fboundp 'gnus-set-text-properties) - (defalias 'gnus-set-text-properties 'set-text-properties)) - -(unless (featurep 'gnus-xmas) - (defalias 'gnus-make-overlay 'make-overlay) - (defalias 'gnus-delete-overlay 'delete-overlay) - (defalias 'gnus-overlay-put 'overlay-put) - (defalias 'gnus-move-overlay 'move-overlay) - (defalias 'gnus-overlay-buffer 'overlay-buffer) - (defalias 'gnus-overlay-start 'overlay-start) - (defalias 'gnus-overlay-end 'overlay-end) - (defalias 'gnus-extent-detached-p 'ignore) - (defalias 'gnus-extent-start-open 'ignore) - (defalias 'gnus-appt-select-lowest-window 'appt-select-lowest-window) - (defalias 'gnus-mail-strip-quoted-names 'mail-strip-quoted-names) - (defalias 'gnus-character-to-event 'identity) - (defalias 'gnus-add-text-properties 'add-text-properties) - (defalias 'gnus-put-text-property 'put-text-property) - (defvar gnus-mode-line-image-cache t) - (if (fboundp 'find-image) - (defun gnus-mode-line-buffer-identification (line) - (let ((str (car-safe line))) - (if (and (stringp str) - (string-match "^Gnus:" str)) - (progn (add-text-properties - 0 5 - (list 'display - (if (eq t gnus-mode-line-image-cache) - (setq gnus-mode-line-image-cache - (find-image - '((:type xpm :file "gnus-pointer.xpm" - :ascent center) - (:type xbm :file "gnus-pointer.xbm" - :ascent center)))) - gnus-mode-line-image-cache) - 'help-echo "This is Gnus") - str) - (list str)) - line))) - (defalias 'gnus-mode-line-buffer-identification 'identity)) - (defalias 'gnus-characterp 'numberp) - (defalias 'gnus-deactivate-mark 'deactivate-mark) - (defalias 'gnus-window-edges 'window-edges) - (defalias 'gnus-key-press-event-p 'numberp) - ;;(defalias 'gnus-decode-rfc1522 'ignore) - ) - -;; We define these group faces here to avoid the display -;; update forced when creating new faces. - -(defface gnus-group-news-1-face - '((((class color) - (background dark)) - (:foreground "PaleTurquoise" :bold t)) - (((class color) - (background light)) - (:foreground "ForestGreen" :bold t)) - (t - ())) - "Level 1 newsgroup face.") - -(defface gnus-group-news-1-empty-face - '((((class color) - (background dark)) - (:foreground "PaleTurquoise")) - (((class color) - (background light)) - (:foreground "ForestGreen")) - (t - ())) - "Level 1 empty newsgroup face.") - -(defface gnus-group-news-2-face - '((((class color) - (background dark)) - (:foreground "turquoise" :bold t)) - (((class color) - (background light)) - (:foreground "CadetBlue4" :bold t)) - (t - ())) - "Level 2 newsgroup face.") - -(defface gnus-group-news-2-empty-face - '((((class color) - (background dark)) - (:foreground "turquoise")) - (((class color) - (background light)) - (:foreground "CadetBlue4")) - (t - ())) - "Level 2 empty newsgroup face.") - -(defface gnus-group-news-3-face - '((((class color) - (background dark)) - (:bold t)) - (((class color) - (background light)) - (:bold t)) - (t - ())) - "Level 3 newsgroup face.") - -(defface gnus-group-news-3-empty-face - '((((class color) - (background dark)) - ()) - (((class color) - (background light)) - ()) - (t - ())) - "Level 3 empty newsgroup face.") - -(defface gnus-group-news-4-face - '((((class color) - (background dark)) - (:bold t)) - (((class color) - (background light)) - (:bold t)) - (t - ())) - "Level 4 newsgroup face.") - -(defface gnus-group-news-4-empty-face - '((((class color) - (background dark)) - ()) - (((class color) - (background light)) - ()) - (t - ())) - "Level 4 empty newsgroup face.") - -(defface gnus-group-news-5-face - '((((class color) - (background dark)) - (:bold t)) - (((class color) - (background light)) - (:bold t)) - (t - ())) - "Level 5 newsgroup face.") - -(defface gnus-group-news-5-empty-face - '((((class color) - (background dark)) - ()) - (((class color) - (background light)) - ()) - (t - ())) - "Level 5 empty newsgroup face.") - -(defface gnus-group-news-6-face - '((((class color) - (background dark)) - (:bold t)) - (((class color) - (background light)) - (:bold t)) - (t - ())) - "Level 6 newsgroup face.") - -(defface gnus-group-news-6-empty-face - '((((class color) - (background dark)) - ()) - (((class color) - (background light)) - ()) - (t - ())) - "Level 6 empty newsgroup face.") - -(defface gnus-group-news-low-face - '((((class color) - (background dark)) - (:foreground "DarkTurquoise" :bold t)) - (((class color) - (background light)) - (:foreground "DarkGreen" :bold t)) - (t - ())) - "Low level newsgroup face.") - -(defface gnus-group-news-low-empty-face - '((((class color) - (background dark)) - (:foreground "DarkTurquoise")) - (((class color) - (background light)) - (:foreground "DarkGreen")) - (t - ())) - "Low level empty newsgroup face.") - -(defface gnus-group-mail-1-face - '((((class color) - (background dark)) - (:foreground "aquamarine1" :bold t)) - (((class color) - (background light)) - (:foreground "DeepPink3" :bold t)) - (t - (:bold t))) - "Level 1 mailgroup face.") - -(defface gnus-group-mail-1-empty-face - '((((class color) - (background dark)) - (:foreground "aquamarine1")) - (((class color) - (background light)) - (:foreground "DeepPink3")) - (t - (:italic t :bold t))) - "Level 1 empty mailgroup face.") - -(defface gnus-group-mail-2-face - '((((class color) - (background dark)) - (:foreground "aquamarine2" :bold t)) - (((class color) - (background light)) - (:foreground "HotPink3" :bold t)) - (t - (:bold t))) - "Level 2 mailgroup face.") - -(defface gnus-group-mail-2-empty-face - '((((class color) - (background dark)) - (:foreground "aquamarine2")) - (((class color) - (background light)) - (:foreground "HotPink3")) - (t - (:bold t))) - "Level 2 empty mailgroup face.") - -(defface gnus-group-mail-3-face - '((((class color) - (background dark)) - (:foreground "aquamarine3" :bold t)) - (((class color) - (background light)) - (:foreground "magenta4" :bold t)) - (t - (:bold t))) - "Level 3 mailgroup face.") - -(defface gnus-group-mail-3-empty-face - '((((class color) - (background dark)) - (:foreground "aquamarine3")) - (((class color) - (background light)) - (:foreground "magenta4")) - (t - ())) - "Level 3 empty mailgroup face.") - -(defface gnus-group-mail-low-face - '((((class color) - (background dark)) - (:foreground "aquamarine4" :bold t)) - (((class color) - (background light)) - (:foreground "DeepPink4" :bold t)) - (t - (:bold t))) - "Low level mailgroup face.") - -(defface gnus-group-mail-low-empty-face - '((((class color) - (background dark)) - (:foreground "aquamarine4")) - (((class color) - (background light)) - (:foreground "DeepPink4")) - (t - (:bold t))) - "Low level empty mailgroup face.") - -;; Summary mode faces. - -(defface gnus-summary-selected-face '((t - (:underline t))) - "Face used for selected articles.") - -(defface gnus-summary-cancelled-face - '((((class color)) - (:foreground "yellow" :background "black"))) - "Face used for cancelled articles.") - -(defface gnus-summary-high-ticked-face - '((((class color) - (background dark)) - (:foreground "pink" :bold t)) - (((class color) - (background light)) - (:foreground "firebrick" :bold t)) - (t - (:bold t))) - "Face used for high interest ticked articles.") - -(defface gnus-summary-low-ticked-face - '((((class color) - (background dark)) - (:foreground "pink" :italic t)) - (((class color) - (background light)) - (:foreground "firebrick" :italic t)) - (t - (:italic t))) - "Face used for low interest ticked articles.") - -(defface gnus-summary-normal-ticked-face - '((((class color) - (background dark)) - (:foreground "pink")) - (((class color) - (background light)) - (:foreground "firebrick")) - (t - ())) - "Face used for normal interest ticked articles.") - -(defface gnus-summary-high-ancient-face - '((((class color) - (background dark)) - (:foreground "SkyBlue" :bold t)) - (((class color) - (background light)) - (:foreground "RoyalBlue" :bold t)) - (t - (:bold t))) - "Face used for high interest ancient articles.") - -(defface gnus-summary-low-ancient-face - '((((class color) - (background dark)) - (:foreground "SkyBlue" :italic t)) - (((class color) - (background light)) - (:foreground "RoyalBlue" :italic t)) - (t - (:italic t))) - "Face used for low interest ancient articles.") - -(defface gnus-summary-normal-ancient-face - '((((class color) - (background dark)) - (:foreground "SkyBlue")) - (((class color) - (background light)) - (:foreground "RoyalBlue")) - (t - ())) - "Face used for normal interest ancient articles.") - -(defface gnus-summary-high-unread-face - '((t - (:bold t))) - "Face used for high interest unread articles.") - -(defface gnus-summary-low-unread-face - '((t - (:italic t))) - "Face used for low interest unread articles.") - -(defface gnus-summary-normal-unread-face - '((t - ())) - "Face used for normal interest unread articles.") - -(defface gnus-summary-incorporated-face - '((t - ())) - "Face used for incorporated articles.") - -(defface gnus-summary-high-read-face - '((((class color) - (background dark)) - (:foreground "PaleGreen" - :bold t)) - (((class color) - (background light)) - (:foreground "DarkGreen" - :bold t)) - (t - (:bold t))) - "Face used for high interest read articles.") - -(defface gnus-summary-low-read-face - '((((class color) - (background dark)) - (:foreground "PaleGreen" - :italic t)) - (((class color) - (background light)) - (:foreground "DarkGreen" - :italic t)) - (t - (:italic t))) - "Face used for low interest read articles.") - -(defface gnus-summary-normal-read-face - '((((class color) - (background dark)) - (:foreground "PaleGreen")) - (((class color) - (background light)) - (:foreground "DarkGreen")) - (t - ())) - "Face used for normal interest read articles.") - - -;;; -;;; Gnus buffers -;;; - -(defvar gnus-buffers nil) - -(defun gnus-get-buffer-create (name) - "Do the same as `get-buffer-create', but store the created buffer." - (or (get-buffer name) - (car (push (get-buffer-create name) gnus-buffers)))) - -(defun gnus-add-buffer () - "Add the current buffer to the list of Gnus buffers." - (push (current-buffer) gnus-buffers)) - -(defun gnus-buffers () - "Return a list of live Gnus buffers." - (while (and gnus-buffers - (not (buffer-name (car gnus-buffers)))) - (pop gnus-buffers)) - (let ((buffers gnus-buffers)) - (while (cdr buffers) - (if (buffer-name (cadr buffers)) - (pop buffers) - (setcdr buffers (cddr buffers))))) - gnus-buffers) - -;;; Splash screen. - -(defvar gnus-group-buffer "*Group*") - -(eval-and-compile - (autoload 'gnus-play-jingle "gnus-audio")) - -(defface gnus-splash-face - '((((class color) - (background dark)) - (:foreground "Brown")) - (((class color) - (background light)) - (:foreground "Brown")) - (t - ())) - "Face for the splash screen.") - -(defun gnus-splash () - (save-excursion - (switch-to-buffer (gnus-get-buffer-create gnus-group-buffer)) - (let ((buffer-read-only nil)) - (erase-buffer) - (unless gnus-inhibit-startup-message - (gnus-group-startup-message) - (sit-for 0) - (when gnus-play-startup-jingle - (gnus-play-jingle)))))) - -(defun gnus-indent-rigidly (start end arg) - "Indent rigidly using only spaces and no tabs." - (save-excursion - (save-restriction - (narrow-to-region start end) - (let ((tab-width 8)) - (indent-rigidly start end arg) - ;; We translate tabs into spaces -- not everybody uses - ;; an 8-character tab. - (goto-char (point-min)) - (while (search-forward "\t" nil t) - (replace-match " " t t)))))) - -(defvar gnus-simple-splash nil) - -(defun gnus-group-startup-message (&optional x y) - "Insert startup message in current buffer." - ;; Insert the message. - (erase-buffer) - (cond - ((and (fboundp 'find-image) - (display-graphic-p) - (let* ((bg (face-background 'default)) - (fg (face-foreground 'gnus-splash-face)) - (image (find-image - `((:type xpm :file "gnus.xpm" - :color-symbols (("thing" . "#724214") - ("shadow" . "#1e3f03") - ("background" . ,bg))) - (:type pbm :file "gnus.pbm" - ;; Account for the pbm's blackground. - :background ,bg :foreground ,fg) - (:type xbm :file "gnus.xbm" - ;; Account for the xbm's blackground. - :background ,bg :foreground ,fg))))) - (when image - (insert - (propertize - (concat gnus-product-name " " gnus-version-number - (if (zerop (string-to-number gnus-revision-number)) - "" - (concat " (r" gnus-revision-number ")")) - " based on " gnus-original-product-name " v" - gnus-original-version-number) - 'face `(variable-pitch :background ,bg :foreground ,fg))) - (let ((fill-column (window-width))) - (center-region (point-min) (point))) - (let ((size (image-size image))) - (insert-char ?\n (max 1 (round (- (window-height) - (or y (cdr size))) 2))) - (insert - (propertize " " 'display - `(space :align-to - ,(max 0 (round (- (window-width) - (or x (car size))) 2))))) - (insert-image image)) - (setq gnus-simple-splash nil) - t)))) - (t - (insert " - _ ___ _ _ - _ ___ __ ___ __ _ ___ - __ _ ___ __ ___ - _ ___ _ - _ _ __ _ - ___ __ _ - __ _ - _ _ _ - _ _ _ - _ _ _ - __ ___ - _ _ _ _ - _ _ - _ _ - _ _ - _ - __ - -" - ) - (goto-char (point-min)) - (insert gnus-product-name " " gnus-version-number - (if (zerop (string-to-number gnus-revision-number)) - "" - (concat " (r" gnus-revision-number ")")) - " based on " gnus-original-product-name " v" - gnus-original-version-number) - (insert-char ?\ (prog1 - (max 0 (/ (- (window-width) (point)) 2)) - (goto-char (point-min)))) - (forward-line 1) - ;; And then hack it. - (gnus-indent-rigidly (point) (point-max) - (/ (max (- (window-width) (or x 46)) 0) 2)) - (goto-char (point-min)) - (forward-line 1) - (let* ((pheight (count-lines (point-min) (point-max))) - (wheight (window-height)) - (rest (- wheight pheight))) - (insert (make-string (max 0 (* 2 (/ rest 3))) ?\n))) - ;; Fontify some. - (put-text-property (point-min) (point-max) 'face 'gnus-splash-face) - (setq gnus-simple-splash t))) - (goto-char (point-min)) - (setq mode-line-buffer-identification (concat " " gnus-version)) - (set-buffer-modified-p t)) - -(eval-when (load) - (let ((command (format "%s" this-command))) - (if (and (string-match "gnus" command) - (not (string-match "gnus-other-frame" command))) - (gnus-splash) - (gnus-get-buffer-create gnus-group-buffer)))) - -;;; Do the rest. - -(require 'gnus-util) -(require 'nnheader) - -(defcustom gnus-parameters nil - "Alist of group parameters. - -For example: - ((\"mail\\\\..*\" (gnus-show-threads nil) - (gnus-use-scoring nil) - (gnus-summary-line-format - \"%U%R%z%I%(%[%d:%ub%-23,23f%]%) %s\\n\") - (gcc-self . t) - (display . all)) - (\"mail\\\\.me\" (gnus-use-scoring t)) - (\"list\\\\..*\" (total-expire . t) - (broken-reply-to . t)))" - :group 'gnus-group-various - :type '(repeat (cons regexp - (repeat sexp)))) - -(defvar gnus-group-parameters-more nil) - -(defvar gnus-colon-keywords - (eval-when-compile - (when (boundp 'dgnushack-colon-keywords) - (symbol-value 'dgnushack-colon-keywords))) - "List of the colon keywords should be bound at run-time. This variable -defaults to a proper value only if this file is byte-compiled by make.") - -(dolist (keyword gnus-colon-keywords) - (set keyword keyword)) - -(defmacro gnus-define-group-parameter (param &rest rest) - "Define a group parameter PARAM. -REST is a plist of following: -:type One of `bool', `list' or `nil'. -:function The name of the function. -:function-document The document of the function. -:parameter-type The type for customizing the parameter. -:parameter-document The document for the parameter. -:variable The name of the variable. -:variable-document The document for the variable. -:variable-group The group for customizing the variable. -:variable-type The type for customizing the variable. -:variable-default The default value of the variable." - (let* ((type (plist-get rest :type)) - (parameter-type (plist-get rest :parameter-type)) - (parameter-document (plist-get rest :parameter-document)) - (function (or (plist-get rest :function) - (intern (format "gnus-parameter-%s" param)))) - (function-document (or (plist-get rest :function-document) "")) - (variable (or (plist-get rest :variable) - (intern (format "gnus-parameter-%s-alist" param)))) - (variable-document (or (plist-get rest :variable-document) "")) - (variable-group (plist-get rest :variable-group)) - (variable-type (or (plist-get rest :variable-type) - `(quote (repeat - (list (regexp :tag "Group") - ,(car (cdr parameter-type))))))) - (variable-default (plist-get rest :variable-default))) - (list - 'progn - `(defcustom ,variable ,variable-default - ,variable-document - :group 'gnus-group-parameter - :group ',variable-group - :type ,variable-type) - `(setq gnus-group-parameters-more - (delq (assq ',param gnus-group-parameters-more) - gnus-group-parameters-more)) - `(add-to-list 'gnus-group-parameters-more - (list ',param - ,parameter-type - ,parameter-document)) - (if (eq type 'bool) - `(defun ,function (name) - ,function-document - (let ((params (gnus-group-find-parameter name)) - val) - (cond - ((memq ',param params) - t) - ((setq val (assq ',param params)) - (cdr val)) - ((stringp ,variable) - (string-match ,variable name)) - (,variable - (let ((alist ,variable) - elem value) - (while (setq elem (pop alist)) - (when (and name - (string-match (car elem) name)) - (setq alist nil - value (cdr elem)))) - (if (consp value) (car value) value)))))) - `(defun ,function (name) - ,function-document - (and name - (or (gnus-group-find-parameter name ',param ,(and type t)) - (let ((alist ,variable) - elem value) - (while (setq elem (pop alist)) - (when (and name - (string-match (car elem) name)) - (setq alist nil - value (cdr elem)))) - ,(if type - 'value - '(if (consp value) (car value) value)))))))))) - -(defcustom gnus-home-directory "~/" - "Directory variable that specifies the \"home\" directory. -All other Gnus path variables are initialized from this variable." - :group 'gnus-files - :type 'directory) - -(defcustom gnus-directory (or (getenv "SAVEDIR") - (nnheader-concat gnus-home-directory "News/")) - "*Directory variable from which all other Gnus file variables are derived. - -Note that Gnus is mostly loaded when the `.gnus.el' file is read. -This means that other directory variables that are initialized from -this variable won't be set properly if you set this variable in `.gnus.el'. -Set this variable in `.emacs' instead." - :group 'gnus-files - :type 'directory) - -(defcustom gnus-default-directory nil - "*Default directory for all Gnus buffers." - :group 'gnus-files - :type '(choice (const :tag "current" nil) - directory)) - -;; Site dependent variables. These variables should be defined in -;; paths.el. - -(defvar gnus-default-nntp-server nil - "Specify a default NNTP server. -This variable should be defined in paths.el, and should never be set -by the user. -If you want to change servers, you should use `gnus-select-method'. -See the documentation to that variable.") - -;; Don't touch this variable. -(defvar gnus-nntp-service "nntp" - "NNTP service name (\"nntp\" or 119). -This is an obsolete variable, which is scarcely used. If you use an -nntp server for your newsgroup and want to change the port number -used to 899, you would say something along these lines: - - (setq gnus-select-method '(nntp \"my.nntp.server\" (nntp-port-number 899)))") - -(defcustom gnus-nntpserver-file "/etc/nntpserver" - "A file with only the name of the nntp server in it." - :group 'gnus-files - :group 'gnus-server - :type 'file) - -;; This function is used to check both the environment variable -;; NNTPSERVER and the /etc/nntpserver file to see whether one can find -;; an nntp server name default. -(defun gnus-getenv-nntpserver () - (or (getenv "NNTPSERVER") - (and (file-readable-p gnus-nntpserver-file) - (save-excursion - (set-buffer (gnus-get-buffer-create " *gnus nntp*")) - (insert-file-contents gnus-nntpserver-file) - (let ((name (buffer-string))) - (prog1 - (if (string-match "\\'[ \t\n]*$" name) - nil - name) - (kill-buffer (current-buffer)))))))) - -(defcustom gnus-select-method - (condition-case nil - (nconc - (list 'nntp (or (condition-case nil - (gnus-getenv-nntpserver) - (error nil)) - (when (and gnus-default-nntp-server - (not (string= gnus-default-nntp-server ""))) - gnus-default-nntp-server) - "news")) - (if (or (null gnus-nntp-service) - (equal gnus-nntp-service "nntp")) - nil - (list gnus-nntp-service))) - (error nil)) - "Default method for selecting a newsgroup. -This variable should be a list, where the first element is how the -news is to be fetched, the second is the address. - -For instance, if you want to get your news via NNTP from -\"flab.flab.edu\", you could say: - -\(setq gnus-select-method '(nntp \"flab.flab.edu\")) - -If you want to use your local spool, say: - -\(setq gnus-select-method (list 'nnspool (system-name))) - -If you use this variable, you must set `gnus-nntp-server' to nil. - -There is a lot more to know about select methods and virtual servers - -see the manual for details." - :group 'gnus-server - :type 'gnus-select-method) - -(defcustom gnus-message-archive-method "archive" - "*Method used for archiving messages you've sent. -This should be a mail method." - :group 'gnus-server - :group 'gnus-message - :type 'gnus-select-method) - -(defcustom gnus-message-archive-group nil - "*Name of the group in which to save the messages you've written. -This can either be a string; a list of strings; or an alist -of regexps/functions/forms to be evaluated to return a string (or a list -of strings). The functions are called with the name of the current -group (or nil) as a parameter. - -If you want to save your mail in one group and the news articles you -write in another group, you could say something like: - - \(setq gnus-message-archive-group - '((if (message-news-p) - \"misc-news\" - \"misc-mail\"))) - -Normally the group names returned by this variable should be -unprefixed -- which implicitly means \"store on the archive server\". -However, you may wish to store the message on some other server. In -that case, just return a fully prefixed name of the group -- -\"nnml+private:mail.misc\", for instance." - :group 'gnus-message - :type '(choice (const :tag "none" nil) - function - sexp - string)) - -(defcustom gnus-secondary-servers nil - "List of NNTP servers that the user can choose between interactively. -To make Gnus query you for a server, you have to give `gnus' a -non-numeric prefix - `C-u M-x gnus', in short." - :group 'gnus-server - :type '(repeat string)) - -(defcustom gnus-nntp-server nil - "*The name of the host running the NNTP server. -This variable is semi-obsolete. Use the `gnus-select-method' -variable instead." - :group 'gnus-server - :type '(choice (const :tag "disable" nil) - string)) - -(defcustom gnus-secondary-select-methods nil - "A list of secondary methods that will be used for reading news. -This is a list where each element is a complete select method (see -`gnus-select-method'). - -If, for instance, you want to read your mail with the nnml backend, -you could set this variable: - -\(setq gnus-secondary-select-methods '((nnml \"\")))" - :group 'gnus-server - :type '(repeat gnus-select-method)) - -(defvar gnus-backup-default-subscribed-newsgroups - '("news.announce.newusers" "news.groups.questions" "gnu.emacs.gnus") - "Default default new newsgroups the first time Gnus is run. -Should be set in paths.el, and shouldn't be touched by the user.") - -(defcustom gnus-local-domain nil - "Local domain name without a host name. -The DOMAINNAME environment variable is used instead if it is defined. -If the `system-name' function returns the full Internet name, there is -no need to set this variable." - :group 'gnus-message - :type '(choice (const :tag "default" nil) - string)) - -(defvar gnus-local-organization nil - "String with a description of what organization (if any) the user belongs to. -Obsolete variable; use `message-user-organization' instead.") - -;; Customization variables - -(defcustom gnus-refer-article-method nil - "Preferred method for fetching an article by Message-ID. -If you are reading news from the local spool (with nnspool), fetching -articles by Message-ID is painfully slow. By setting this method to an -nntp method, you might get acceptable results. - -The value of this variable must be a valid select method as discussed -in the documentation of `gnus-select-method'. - -It can also be a list of select methods, as well as the special symbol -`current', which means to use the current select method. If it is a -list, Gnus will try all the methods in the list until it finds a match." - :group 'gnus-server - :type '(choice (const :tag "default" nil) - (const :tag "DejaNews" (nnweb "refer" (nnweb-type dejanews))) - gnus-select-method - (repeat :menu-tag "Try multiple" - :tag "Multiple" - :value (current (nnweb "refer" (nnweb-type dejanews))) - (choice :tag "Method" - (const current) - (const :tag "DejaNews" - (nnweb "refer" (nnweb-type dejanews))) - gnus-select-method)))) - -(defcustom gnus-group-faq-directory - '("/ftp@mirrors.aol.com:/pub/rtfm/usenet/" - "/ftp@sunsite.auc.dk:/pub/usenet/" - "/ftp@sunsite.doc.ic.ac.uk:/pub/usenet/news-faqs/" - "/ftp@src.doc.ic.ac.uk:/usenet/news-FAQS/" - "/ftp@ftp.seas.gwu.edu:/pub/rtfm/" - "/ftp@rtfm.mit.edu:/pub/usenet/" - "/ftp@ftp.uni-paderborn.de:/pub/FAQ/" - "/ftp@ftp.sunet.se:/pub/usenet/" - "/ftp@nctuccca.edu.tw:/USENET/FAQ/" - "/ftp@hwarang.postech.ac.kr:/pub/usenet/" - "/ftp@ftp.hk.super.net:/mirror/faqs/") - "*Directory where the group FAQs are stored. -This will most commonly be on a remote machine, and the file will be -fetched by ange-ftp. - -This variable can also be a list of directories. In that case, the -first element in the list will be used by default. The others can -be used when being prompted for a site. - -Note that Gnus uses an aol machine as the default directory. If this -feels fundamentally unclean, just think of it as a way to finally get -something of value back from them. - -If the default site is too slow, try one of these: - - North America: mirrors.aol.com /pub/rtfm/usenet - ftp.seas.gwu.edu /pub/rtfm - rtfm.mit.edu /pub/usenet - Europe: ftp.uni-paderborn.de /pub/FAQ - src.doc.ic.ac.uk /usenet/news-FAQS - ftp.sunet.se /pub/usenet - sunsite.auc.dk /pub/usenet - Asia: nctuccca.edu.tw /USENET/FAQ - hwarang.postech.ac.kr /pub/usenet - ftp.hk.super.net /mirror/faqs" - :group 'gnus-group-various - :type '(choice directory - (repeat directory))) - -(defcustom gnus-use-cross-reference t - "*Non-nil means that cross referenced articles will be marked as read. -If nil, ignore cross references. If t, mark articles as read in -subscribed newsgroups. If neither t nor nil, mark as read in all -newsgroups." - :group 'gnus-server - :type '(choice (const :tag "off" nil) - (const :tag "subscribed" t) - (sexp :format "all" - :value always))) - -(defcustom gnus-process-mark ?# - "*Process mark." - :group 'gnus-group-visual - :group 'gnus-summary-marks - :type 'character) - -(defcustom gnus-large-newsgroup 200 - "*The number of articles which indicates a large newsgroup. -If the number of articles in a newsgroup is greater than this value, -confirmation is required for selecting the newsgroup. -If it is `nil', no confirmation is required." - :group 'gnus-group-select - :type 'integer) - -(defcustom gnus-use-long-file-name (not (memq system-type '(usg-unix-v xenix))) - "*Non-nil means that the default name of a file to save articles in is the group name. -If it's nil, the directory form of the group name is used instead. - -If this variable is a list, and the list contains the element -`not-score', long file names will not be used for score files; if it -contains the element `not-save', long file names will not be used for -saving; and if it contains the element `not-kill', long file names -will not be used for kill files. - -Note that the default for this variable varies according to what system -type you're using. On `usg-unix-v' and `xenix' this variable defaults -to nil while on all other systems it defaults to t." - :group 'gnus-start - :type 'boolean) - -(defcustom gnus-kill-files-directory gnus-directory - "*Name of the directory where kill files will be stored (default \"~/News\")." - :group 'gnus-score-files - :group 'gnus-score-kill - :type 'directory) - -(defcustom gnus-save-score nil - "*If non-nil, save group scoring info." - :group 'gnus-score-various - :group 'gnus-start - :type 'boolean) - -(defcustom gnus-use-undo t - "*If non-nil, allow undoing in Gnus group mode buffers." - :group 'gnus-meta - :type 'boolean) - -(defcustom gnus-use-adaptive-scoring nil - "*If non-nil, use some adaptive scoring scheme. -If a list, then the values `word' and `line' are meaningful. The -former will perform adaption on individual words in the subject -header while `line' will perform adaption on several headers." - :group 'gnus-meta - :group 'gnus-score-adapt - :type '(set (const word) (const line))) - -(defcustom gnus-use-cache 'passive - "*If nil, Gnus will ignore the article cache. -If `passive', it will allow entering (and reading) articles -explicitly entered into the cache. If anything else, use the -cache to the full extent of the law." - :group 'gnus-meta - :group 'gnus-cache - :type '(choice (const :tag "off" nil) - (const :tag "passive" passive) - (const :tag "active" t))) - -(defcustom gnus-use-trees nil - "*If non-nil, display a thread tree buffer." - :group 'gnus-meta - :type 'boolean) - -(defcustom gnus-use-grouplens nil - "*If non-nil, use GroupLens ratings." - :group 'gnus-meta - :type 'boolean) - -(defcustom gnus-keep-backlog nil - "*If non-nil, Gnus will keep read articles for later re-retrieval. -If it is a number N, then Gnus will only keep the last N articles -read. If it is neither nil nor a number, Gnus will keep all read -articles. This is not a good idea." - :group 'gnus-meta - :type '(choice (const :tag "off" nil) - integer - (sexp :format "all" - :value t))) - -(defcustom gnus-use-nocem nil - "*If non-nil, Gnus will read NoCeM cancel messages." - :group 'gnus-meta - :type 'boolean) - -(defcustom gnus-suppress-duplicates nil - "*If non-nil, Gnus will mark duplicate copies of the same article as read." - :group 'gnus-meta - :type 'boolean) - -(defcustom gnus-use-scoring t - "*If non-nil, enable scoring." - :group 'gnus-meta - :type 'boolean) - -(defcustom gnus-use-picons nil - "*If non-nil, display picons in a frame of their own." - :group 'gnus-meta - :type 'boolean) - -(defcustom gnus-summary-prepare-exit-hook - '(gnus-summary-expire-articles) - "*A hook called when preparing to exit from the summary buffer. -It calls `gnus-summary-expire-articles' by default." - :group 'gnus-summary-exit - :type 'hook) - -(defcustom gnus-novice-user t - "*Non-nil means that you are a usenet novice. -If non-nil, verbose messages may be displayed and confirmations may be -required." - :group 'gnus-meta - :type 'boolean) - -(defcustom gnus-expert-user nil - "*Non-nil means that you will never be asked for confirmation about anything. -That doesn't mean *anything* anything; particularly destructive -commands will still require prompting." - :group 'gnus-meta - :type 'boolean) - -(defcustom gnus-interactive-catchup t - "*If non-nil, require your confirmation when catching up a group." - :group 'gnus-group-select - :type 'boolean) - -(defcustom gnus-interactive-exit t - "*If non-nil, require your confirmation when exiting Gnus." - :group 'gnus-exit - :type 'boolean) - -(defcustom gnus-extract-address-components 'gnus-extract-address-components - "Function for extracting address components from a From header. -Three pre-defined functions exist: `gnus-extract-address-components', -which is the default, quite fast, and too simplistic solution, -`mail-extract-address-components', which works much better, but is -slower, and `std11-extract-address-components'." - :group 'gnus-summary-format - :type '(radio (function-item gnus-extract-address-components) - (function-item mail-extract-address-components) - (function-item std11-extract-address-components) - (function :tag "Other"))) - -(defcustom gnus-carpal nil - "*If non-nil, display clickable icons." - :group 'gnus-meta - :type 'boolean) - -(defcustom gnus-shell-command-separator ";" - "String used to separate to shell commands." - :group 'gnus-files - :type 'string) - -(defcustom gnus-valid-select-methods - '(("nntp" post address prompt-address physical-address) - ("nnspool" post address) - ("nnvirtual" post-mail virtual prompt-address) - ("nnmbox" mail respool address) - ("nnml" post-mail respool address) - ("nnmh" mail respool address) - ("nndir" post-mail prompt-address physical-address) - ("nneething" none address prompt-address physical-address) - ("nndoc" none address prompt-address) - ("nnbabyl" mail address respool) - ("nnkiboze" post virtual) - ("nnsoup" post-mail address) - ("nndraft" post-mail) - ("nnfolder" mail respool address) - ("nngateway" post-mail address prompt-address physical-address) - ("nnweb" none) - ("nnslashdot" post) - ("nnultimate" none) - ("nnrss" none) - ("nnwfm" none) - ("nnwarchive" none) - ("nnlistserv" none) - ("nnagent" post-mail) - ("nnimap" post-mail address prompt-address physical-address)) - "*An alist of valid select methods. -The first element of each list lists should be a string with the name -of the select method. The other elements may be the category of -this method (i. e., `post', `mail', `none' or whatever) or other -properties that this method has (like being respoolable). -If you implement a new select method, all you should have to change is -this variable. I think." - :group 'gnus-server - :type '(repeat (group (string :tag "Name") - (radio-button-choice (const :format "%v " post) - (const :format "%v " mail) - (const :format "%v " none) - (const post-mail)) - (checklist :inline t - (const :format "%v " address) - (const :format "%v " prompt-address) - (const :format "%v " physical-address) - (const :format "%v " virtual) - (const respool))))) - -(defun gnus-redefine-select-method-widget () - "Recomputes the select-method widget based on the value of -`gnus-valid-select-methods'." - (define-widget 'gnus-select-method 'list - "Widget for entering a select method." - :value '(nntp "") - :tag "Select Method" - :args `((choice :tag "Method" - ,@(mapcar (lambda (entry) - (list 'const :format "%v\n" - (intern (car entry)))) - gnus-valid-select-methods) - (symbol :tag "other")) - (string :tag "Address") - (repeat :tag "Options" - :inline t - (list :format "%v" - variable - (sexp :tag "Value")))))) - -(gnus-redefine-select-method-widget) - -(defcustom gnus-updated-mode-lines '(group article summary tree) - "List of buffers that should update their mode lines. -The list may contain the symbols `group', `article', `tree' and -`summary'. If the corresponding symbol is present, Gnus will keep -that mode line updated with information that may be pertinent. -If this variable is nil, screen refresh may be quicker." - :group 'gnus-various - :type '(set (const group) - (const article) - (const summary) - (const tree))) - -;; Added by Keinonen Kari . -(defcustom gnus-mode-non-string-length nil - "*Max length of mode-line non-string contents. -If this is nil, Gnus will take space as is needed, leaving the rest -of the modeline intact. Note that the default of nil is unlikely -to be desirable; see the manual for further details." - :group 'gnus-various - :type '(choice (const nil) - integer)) - -;; There should be special validation for this. -(define-widget 'gnus-email-address 'string - "An email address") - -(gnus-define-group-parameter - to-address - :function-document - "Return GROUP's to-address." - :variable-document - "*Alist of group regexps and correspondent to-addresses." - :parameter-type '(gnus-email-address :tag "To Address") - :parameter-document "\ -This will be used when doing followups and posts. - -This is primarily useful in mail groups that represent closed -mailing lists--mailing lists where it's expected that everybody that -writes to the mailing list is subscribed to it. Since using this -parameter ensures that the mail only goes to the mailing list itself, -it means that members won't receive two copies of your followups. - -Using `to-address' will actually work whether the group is foreign or -not. Let's say there's a group on the server that is called -`fa.4ad-l'. This is a real newsgroup, but the server has gotten the -articles from a mail-to-news gateway. Posting directly to this group -is therefore impossible--you have to send mail to the mailing list -address instead. - -The gnus-group-split mail splitting mechanism will behave as if this -address was listed in gnus-group-split Addresses (see below).") - -(gnus-define-group-parameter - to-list - :function-document - "Return GROUP's to-list." - :variable-document - "*Alist of group regexps and correspondent to-lists." - :parameter-type '(gnus-email-address :tag "To List") - :parameter-document "\ -This address will be used when doing a `a' in the group. - -It is totally ignored when doing a followup--except that if it is -present in a news group, you'll get mail group semantics when doing -`f'. - -The gnus-group-split mail splitting mechanism will behave as if this -address was listed in gnus-group-split Addresses (see below).") - -(gnus-define-group-parameter - auto-expire - :type bool - :function gnus-group-auto-expirable-p - :function-document - "Check whether GROUP is auto-expirable or not." - :variable gnus-auto-expirable-newsgroups - :variable-default nil - :variable-document - "*Groups in which to automatically mark read articles as expirable. -If non-nil, this should be a regexp that should match all groups in -which to perform auto-expiry. This only makes sense for mail groups." - :variable-group nnmail-expire - :variable-type '(choice (const nil) - regexp) - :parameter-type '(const :tag "Automatic Expire" t) - :parameter-document - "All articles that are read will be marked as expirable.") - -(gnus-define-group-parameter - total-expire - :type bool - :function gnus-group-total-expirable-p - :function-document - "Check whether GROUP is total-expirable or not." - :variable gnus-total-expirable-newsgroups - :variable-default nil - :variable-document - "*Groups in which to perform expiry of all read articles. -Use with extreme caution. All groups that match this regexp will be -expiring - which means that all read articles will be deleted after -\(say) one week. (This only goes for mail groups and the like, of -course.)" - :variable-group nnmail-expire - :variable-type '(choice (const nil) - regexp) - :parameter-type '(const :tag "Total Expire" t) - :parameter-document - "All read articles will be put through the expiry process - -This happens even if they are not marked as expirable. -Use with caution.") - -(gnus-define-group-parameter - charset - :function-document - "Return the default charset of GROUP." - :variable gnus-group-charset-alist - :variable-default - '(("\\(^\\|:\\)hk\\>\\|\\(^\\|:\\)tw\\>\\|\\" cn-big5) - ("\\(^\\|:\\)cn\\>\\|\\" cn-gb-2312) - ("\\(^\\|:\\)fj\\>\\|\\(^\\|:\\)japan\\>" iso-2022-jp-2) - ("\\(^\\|:\\)tnn\\>\\|\\(^\\|:\\)pin\\>\\|\\(^\\|:\\)sci.lang.japan" iso-2022-7bit) - ("\\(^\\|:\\)relcom\\>" koi8-r) - ("\\(^\\|:\\)fido7\\>" koi8-r) - ("\\(^\\|:\\)\\(cz\\|hun\\|pl\\|sk\\|hr\\)\\>" iso-8859-2) - ("\\(^\\|:\\)israel\\>" iso-8859-1) - ("\\(^\\|:\\)han\\>" euc-kr) - ("\\(^\\|:\\)alt.chinese.text.big5\\>" chinese-big5) - ("\\(^\\|:\\)soc.culture.vietnamese\\>" vietnamese-viqr) - ("\\(^\\|:\\)\\(comp\\|rec\\|alt\\|sci\\|soc\\|news\\|gnu\\|bofh\\)\\>" iso-8859-1) - (".*" iso-8859-1)) - :variable-document - "Alist of regexps (to match group names) and default charsets to be used when reading." - :variable-group gnus-charset - :variable-type '(repeat (list (regexp :tag "Group") - (symbol :tag "Charset"))) - :parameter-type '(symbol :tag "Charset") - :parameter-document "\ -The default charset to use in the group.") - -(gnus-define-group-parameter - post-method - :type list - :function-document - "Return a posting method for GROUP." - :variable gnus-post-method-alist - :variable-document - "Alist of regexps (to match group names) and method to be used when -posting an article." - :variable-group gnus-group-foreign - :parameter-type - '(choice :tag "Posting Method" - (const nil) - (const current) - (const native) - (list :convert-widget - (lambda (widget) - (list 'sexp :tag "Methods" - :value gnus-select-method)))) - :parameter-document - "Posting method for this group.") - -(defcustom gnus-group-uncollapsed-levels 1 - "Number of group name elements to leave alone when making a short group name." - :group 'gnus-group-visual - :type 'integer) - -(defcustom gnus-group-use-permanent-levels nil - "*If non-nil, once you set a level, Gnus will use this level." - :group 'gnus-group-levels - :type 'boolean) - -;; Hooks. - -(defcustom gnus-load-hook nil - "A hook run while Gnus is loaded." - :group 'gnus-start - :type 'hook) - -(defcustom gnus-apply-kill-hook '(gnus-apply-kill-file) - "A hook called to apply kill files to a group. -This hook is intended to apply a kill file to the selected newsgroup. -The function `gnus-apply-kill-file' is called by default. - -Since a general kill file is too heavy to use only for a few -newsgroups, I recommend you to use a lighter hook function. For -example, if you'd like to apply a kill file to articles which contains -a string `rmgroup' in subject in newsgroup `control', you can use the -following hook: - - (setq gnus-apply-kill-hook - (list - (lambda () - (cond ((string-match \"control\" gnus-newsgroup-name) - (gnus-kill \"Subject\" \"rmgroup\") - (gnus-expunge \"X\"))))))" - :group 'gnus-score-kill - :options '(gnus-apply-kill-file) - :type 'hook) - -(defcustom gnus-group-change-level-function nil - "Function run when a group level is changed. -It is called with three parameters -- GROUP, LEVEL and OLDLEVEL." - :group 'gnus-group-levels - :type 'function) - -;;; Face thingies. - -(defcustom gnus-visual - '(summary-highlight group-highlight article-highlight - mouse-face - summary-menu group-menu article-menu - tree-highlight menu highlight - browse-menu server-menu - page-marker tree-menu binary-menu pick-menu - grouplens-menu) - "*Enable visual features. -If `visual' is disabled, there will be no menus and few faces. Most of -the visual customization options below will be ignored. Gnus will use -less space and be faster as a result. - -This variable can also be a list of visual elements to switch on. For -instance, to switch off all visual things except menus, you can say: - - (setq gnus-visual '(menu)) - -Valid elements include `summary-highlight', `group-highlight', -`article-highlight', `mouse-face', `summary-menu', `group-menu', -`article-menu', `tree-highlight', `menu', `highlight', `browse-menu', -`server-menu', `page-marker', `tree-menu', `binary-menu', `pick-menu', -and `grouplens-menu'." - :group 'gnus-meta - :group 'gnus-visual - :type '(set (const summary-highlight) - (const group-highlight) - (const article-highlight) - (const mouse-face) - (const summary-menu) - (const group-menu) - (const article-menu) - (const tree-highlight) - (const menu) - (const highlight) - (const browse-menu) - (const server-menu) - (const page-marker) - (const tree-menu) - (const binary-menu) - (const pick-menu) - (const grouplens-menu))) - -;; Byte-compiler warning. -(defvar gnus-visual) -;; Find out whether the gnus-visual TYPE is wanted. -(defun gnus-visual-p (&optional type class) - (and gnus-visual ; Has to be non-nil, at least. - (if (not type) ; We don't care about type. - gnus-visual - (if (listp gnus-visual) ; It's a list, so we check it. - (or (memq type gnus-visual) - (memq class gnus-visual)) - t)))) - -(defcustom gnus-mouse-face - (condition-case () - (if (gnus-visual-p 'mouse-face 'highlight) - (if (boundp 'gnus-mouse-face) - (or gnus-mouse-face 'highlight) - 'highlight) - 'default) - (error 'highlight)) - "*Face used for group or summary buffer mouse highlighting. -The line beneath the mouse pointer will be highlighted with this -face." - :group 'gnus-visual - :type 'face) - -(defcustom gnus-article-save-directory gnus-directory - "*Name of the directory articles will be saved in (default \"~/News\")." - :group 'gnus-article-saving - :type 'directory) - -(defvar gnus-plugged t - "Whether Gnus is plugged or not.") - -(defcustom gnus-default-charset 'iso-8859-1 - "Default charset assumed to be used when viewing non-ASCII characters. -This variable is overridden on a group-to-group basis by the -gnus-group-charset-alist variable and is only used on groups not -covered by that variable." - :type 'symbol - :group 'gnus-charset) - - -;;; Internal variables - -(defvar gnus-agent-gcc-header "X-Gnus-Agent-Gcc") -(defvar gnus-agent-meta-information-header "X-Gnus-Agent-Meta-Information") -(defvar gnus-draft-meta-information-header "X-Draft-From") -(defvar gnus-group-get-parameter-function 'gnus-group-get-parameter) -(defvar gnus-original-article-buffer " *Original Article*") -(defvar gnus-newsgroup-name nil) -(defvar gnus-ephemeral-servers nil) - -(defvar gnus-agent nil - "Whether we want to use the Gnus agent or not.") - -(defvar gnus-agent-fetching nil - "Whether Gnus agent is in fetching mode.") - -(defvar gnus-command-method nil - "Dynamically bound variable that says what the current backend is.") - -(defvar gnus-current-select-method nil - "The current method for selecting a newsgroup.") - -(defvar gnus-tree-buffer "*Tree*" - "Buffer where Gnus thread trees are displayed.") - -;; Dummy variable. -(defvar gnus-use-generic-from nil) - -;; Variable holding the user answers to all method prompts. -(defvar gnus-method-history nil) - -;; Variable holding the user answers to all mail method prompts. -(defvar gnus-mail-method-history nil) - -;; Variable holding the user answers to all group prompts. -(defvar gnus-group-history nil) - -(defvar gnus-server-alist nil - "List of available servers.") - -(defcustom gnus-cache-directory - (nnheader-concat gnus-directory "cache/") - "*The directory where cached articles will be stored." - :group 'gnus-cache - :type 'directory) - -(defvar gnus-predefined-server-alist - `(("cache" - nnspool "cache" - (nnspool-spool-directory ,gnus-cache-directory) - (nnspool-nov-directory ,gnus-cache-directory) - (nnspool-active-file - ,(nnheader-concat gnus-cache-directory "active")))) - "List of predefined (convenience) servers.") - -(defvar gnus-topic-indentation "");; Obsolete variable. - -(defconst gnus-article-mark-lists - '((marked . tick) (replied . reply) - (expirable . expire) (killed . killed) - (bookmarks . bookmark) (dormant . dormant) - (scored . score) (saved . save) - (cached . cache) (downloadable . download) - (unsendable . unsend) (forwarded . forward) - (recent . recent) (seen . seen))) - -(defconst gnus-article-special-mark-lists - '((seen range) - (bookmark tuple) - (score tuple))) - -(defvar gnus-headers-retrieved-by nil) -(defvar gnus-article-reply nil) -(defvar gnus-override-method nil) -(defvar gnus-article-check-size nil) -(defvar gnus-opened-servers nil) - -(defvar gnus-current-kill-article nil) - -(defvar gnus-have-read-active-file nil) - -(defconst gnus-maintainer - "semi-gnus-ja@meadowy.org (T-gnus Bugfixing Girls + Boys)" - "The mail address of the T-gnus maintainers.") - -(defcustom gnus-info-filename nil - "*Controls language of gnus Info. -If nil and current-language-environment is Japanese, go to gnus-ja. -Otherwise go to corresponding Info. -This variable can be nil, gnus or gnus-ja." - :group 'gnus-start - :type '(choice (const nil) - (const :tag "English" gnus) - (const :tag "Japanese" gnus-ja))) - -(defvar gnus-info-nodes - '((gnus-group-mode "Group Buffer") - (gnus-summary-mode "Summary Buffer") - (gnus-article-mode "Article Buffer") - (gnus-server-mode "Server Buffer") - (gnus-browse-mode "Browse Foreign Server") - (gnus-tree-mode "Tree Display")) - "Alist of major modes and related Info nodes.") - -(defvar gnus-group-buffer "*Group*") -(defvar gnus-summary-buffer "*Summary*") -(defvar gnus-article-buffer "*Article*") -(defvar gnus-server-buffer "*Server*") - -(defvar gnus-slave nil - "Whether this Gnus is a slave or not.") - -(defvar gnus-batch-mode nil - "Whether this Gnus is running in batch mode or not.") - -(defvar gnus-variable-list - '(gnus-newsrc-options gnus-newsrc-options-n - gnus-newsrc-last-checked-date - gnus-newsrc-alist gnus-server-alist - gnus-killed-list gnus-zombie-list - gnus-topic-topology gnus-topic-alist) - "Gnus variables saved in the quick startup file.") - -(defvar gnus-product-variable-file-list - (let ((version (product-version (product-find 'gnus-vers))) - (codesys (static-if (boundp 'MULE) '*ctext* 'ctext))) - `(("strict-cache" ((product-version ,version) (emacs-version)) - binary - gnus-format-specs-compiled) - ("cache" ((product-version ,version) (emacs-version)) - ,codesys - gnus-format-specs))) - "Gnus variables are saved in the produce depend quick startup files.") - -(defcustom gnus-compile-user-specs t - "If non-nil, the user-defined format specs will be byte-compiled -automatically. -It has an effect on the values of `gnus-*-line-format-spec'." - :group 'gnus - :type 'boolean) - -(defvar gnus-newsrc-alist nil - "Assoc list of read articles. -gnus-newsrc-hashtb should be kept so that both hold the same information.") - -(defvar gnus-newsrc-hashtb nil - "Hashtable of gnus-newsrc-alist.") - -(defvar gnus-killed-list nil - "List of killed newsgroups.") - -(defvar gnus-killed-hashtb nil - "Hash table equivalent of gnus-killed-list.") - -(defvar gnus-zombie-list nil - "List of almost dead newsgroups.") - -(defvar gnus-description-hashtb nil - "Descriptions of newsgroups.") - -(defvar gnus-list-of-killed-groups nil - "List of newsgroups that have recently been killed by the user.") - -(defvar gnus-active-hashtb nil - "Hashtable of active articles.") - -(defvar gnus-moderated-hashtb nil - "Hashtable of moderated newsgroups.") - -;; Save window configuration. -(defvar gnus-prev-winconf nil) - -(defvar gnus-reffed-article-number nil) - -;;; Let the byte-compiler know that we know about this variable. -(defvar rmail-default-rmail-file) - -(defvar gnus-dead-summary nil) - -(defvar gnus-invalid-group-regexp "[: `'\"/]\\|^$" - "Regexp matching invalid groups.") - -;;; End of variables. - -;; Define some autoload functions Gnus might use. -(eval-and-compile - - ;; This little mapcar goes through the list below and marks the - ;; symbols in question as autoloaded functions. - (mapcar - (lambda (package) - (let ((interactive (nth 1 (memq ':interactive package)))) - (mapcar - (lambda (function) - (let (keymap) - (when (consp function) - (setq keymap (car (memq 'keymap function))) - (setq function (car function))) - (unless (fboundp function) - (autoload function (car package) nil interactive keymap)))) - (if (eq (nth 1 package) ':interactive) - (nthcdr 3 package) - (cdr package))))) - '(("info" :interactive t Info-goto-node) - ("pp" pp-to-string) - ("ps-print" ps-print-preprint) - ("message" :interactive t - message-send-and-exit message-yank-original) - ("babel" babel-as-string) - ("nnmail" nnmail-split-fancy nnmail-article-group) - ("nnvirtual" nnvirtual-catchup-group nnvirtual-convert-headers) - ("rmailout" rmail-output rmail-output-to-rmail-file) - ("rmail" rmail-insert-rmail-file-header rmail-count-new-messages - rmail-show-message rmail-summary-exists - rmail-select-summary rmail-update-summary) - ("gnus-audio" :interactive t gnus-audio-play) - ("gnus-xmas" gnus-xmas-splash) - ("gnus-soup" :interactive t - gnus-group-brew-soup gnus-brew-soup gnus-soup-add-article - gnus-soup-send-replies gnus-soup-save-areas gnus-soup-pack-packet) - ("nnsoup" nnsoup-pack-replies) - ("score-mode" :interactive t gnus-score-mode) - ("gnus-mh" gnus-summary-save-article-folder - gnus-Folder-save-name gnus-folder-save-name) - ("gnus-mh" :interactive t gnus-summary-save-in-folder) - ("gnus-demon" gnus-demon-add-nocem gnus-demon-add-scanmail - gnus-demon-add-rescan gnus-demon-add-scan-timestamps - gnus-demon-add-disconnection gnus-demon-add-handler - gnus-demon-remove-handler) - ("gnus-demon" :interactive t - gnus-demon-init gnus-demon-cancel) - ("gnus-salt" gnus-highlight-selected-tree gnus-possibly-generate-tree - gnus-tree-open gnus-tree-close gnus-carpal-setup-buffer) - ("gnus-nocem" gnus-nocem-scan-groups gnus-nocem-close - gnus-nocem-unwanted-article-p) - ("gnus-srvr" gnus-enter-server-buffer gnus-server-set-info - gnus-server-server-name) - ("gnus-srvr" gnus-browse-foreign-server) - ("gnus-cite" :interactive t - gnus-article-highlight-citation gnus-article-hide-citation-maybe - gnus-article-hide-citation gnus-article-fill-cited-article - gnus-article-hide-citation-in-followups) - ("gnus-kill" gnus-kill gnus-apply-kill-file-internal - gnus-kill-file-edit-file gnus-kill-file-raise-followups-to-author - gnus-execute gnus-expunge gnus-batch-kill gnus-batch-score) - ("gnus-cache" gnus-cache-possibly-enter-article gnus-cache-save-buffers - gnus-cache-possibly-remove-articles gnus-cache-request-article - gnus-cache-retrieve-headers gnus-cache-possibly-alter-active - gnus-cache-enter-remove-article gnus-cached-article-p - gnus-cache-open gnus-cache-close gnus-cache-update-article - gnus-cache-articles-in-group) - ("gnus-cache" :interactive t gnus-jog-cache gnus-cache-enter-article - gnus-cache-remove-article gnus-summary-insert-cached-articles) - ("gnus-score" :interactive t - gnus-summary-increase-score gnus-summary-set-score - gnus-summary-raise-thread gnus-summary-raise-same-subject - gnus-summary-raise-score gnus-summary-raise-same-subject-and-select - gnus-summary-lower-thread gnus-summary-lower-same-subject - gnus-summary-lower-score gnus-summary-lower-same-subject-and-select - gnus-summary-current-score gnus-score-delta-default - gnus-score-flush-cache gnus-score-close - gnus-possibly-score-headers gnus-score-followup-article - gnus-score-followup-thread) - ("gnus-score" - (gnus-summary-score-map keymap) gnus-score-save gnus-score-headers - gnus-current-score-file-nondirectory gnus-score-adaptive - gnus-score-find-trace gnus-score-file-name) - ("gnus-cus" :interactive t gnus-custom-mode gnus-group-customize - gnus-score-customize) - ("gnus-topic" :interactive t gnus-topic-mode) - ("gnus-topic" gnus-topic-remove-group gnus-topic-set-parameters - gnus-subscribe-topics) - ("gnus-salt" :interactive t gnus-pick-mode gnus-binary-mode) - ("gnus-uu" (gnus-uu-extract-map keymap) (gnus-uu-mark-map keymap)) - ("gnus-uu" :interactive t - gnus-uu-digest-mail-forward gnus-uu-digest-post-forward - gnus-uu-mark-series gnus-uu-mark-region gnus-uu-mark-buffer - gnus-uu-mark-by-regexp gnus-uu-mark-all - gnus-uu-mark-sparse gnus-uu-mark-thread gnus-uu-decode-uu - gnus-uu-decode-uu-and-save gnus-uu-decode-unshar - gnus-uu-decode-unshar-and-save gnus-uu-decode-save - gnus-uu-decode-binhex gnus-uu-decode-uu-view - gnus-uu-decode-uu-and-save-view gnus-uu-decode-unshar-view - gnus-uu-decode-unshar-and-save-view gnus-uu-decode-save-view - gnus-uu-decode-binhex-view gnus-uu-unmark-thread - gnus-uu-mark-over gnus-uu-post-news) - ("gnus-uu" gnus-uu-delete-work-dir gnus-quote-arg-for-sh-or-csh - gnus-uu-unmark-thread) - ("gnus-msg" (gnus-summary-send-map keymap) - gnus-article-mail gnus-copy-article-buffer gnus-following-method) - ("gnus-msg" :interactive t - gnus-group-post-news gnus-group-mail gnus-summary-post-news - gnus-summary-followup gnus-summary-followup-with-original - gnus-summary-cancel-article gnus-summary-supersede-article - gnus-post-news gnus-summary-reply gnus-summary-reply-with-original - gnus-summary-mail-forward gnus-summary-mail-other-window - gnus-summary-resend-message gnus-summary-resend-bounced-mail - gnus-summary-wide-reply gnus-summary-followup-to-mail - gnus-summary-followup-to-mail-with-original gnus-bug - gnus-summary-wide-reply-with-original gnus-summary-post-forward - gnus-summary-digest-mail-forward gnus-summary-digest-post-forward) - ("gnus-picon" :interactive t gnus-article-display-picons - gnus-group-display-picons) - ("gnus-picon" gnus-picons-buffer-name) - ("gnus-gl" bbb-login bbb-logout bbb-grouplens-group-p - gnus-grouplens-mode) - ("smiley" :interactive t gnus-smiley-display) - ("gnus-win" gnus-configure-windows gnus-add-configuration) - ("gnus-sum" gnus-summary-insert-line gnus-summary-read-group - gnus-list-of-unread-articles gnus-list-of-read-articles - gnus-offer-save-summaries gnus-make-thread-indent-array - gnus-summary-exit gnus-update-read-articles gnus-summary-last-subject - gnus-summary-skip-intangible gnus-summary-article-number - gnus-data-header gnus-data-find gnus-summary-jump-to-other-group) - ("gnus-group" gnus-group-insert-group-line gnus-group-quit - gnus-group-list-groups gnus-group-first-unread-group - gnus-group-set-mode-line gnus-group-set-info gnus-group-save-newsrc - gnus-group-setup-buffer gnus-group-get-new-news - gnus-group-make-help-group gnus-group-update-group - gnus-group-iterate gnus-group-group-name) - ("gnus-bcklg" gnus-backlog-request-article gnus-backlog-enter-article - gnus-backlog-remove-article) - ("gnus-art" gnus-article-read-summary-keys gnus-article-save - gnus-article-prepare gnus-article-set-window-start - gnus-article-next-page gnus-article-prev-page - gnus-request-article-this-buffer gnus-article-mode - gnus-article-setup-buffer gnus-narrow-to-page - gnus-article-delete-invisible-text gnus-treat-article) - ("gnus-art" :interactive t - gnus-article-hide-headers gnus-article-hide-boring-headers - gnus-article-treat-overstrike - gnus-article-remove-cr gnus-article-remove-trailing-blank-lines - gnus-article-display-x-face - gnus-article-decode-HZ - gnus-article-wash-html - gnus-article-hide-pgp - gnus-article-hide-pem gnus-article-hide-signature - gnus-article-strip-leading-blank-lines gnus-article-date-local - gnus-article-date-original gnus-article-date-lapsed - gnus-article-show-all-headers gnus-article-show-all - gnus-article-edit-mode gnus-article-edit-article - gnus-article-edit-done article-decode-encoded-words - gnus-start-date-timer gnus-stop-date-timer - gnus-article-toggle-headers) - ("gnus-int" gnus-request-type) - ("gnus-start" gnus-newsrc-parse-options gnus-1 gnus-no-server-1 - gnus-dribble-enter gnus-read-init-file gnus-dribble-touch) - ("gnus-dup" gnus-dup-suppress-articles gnus-dup-unsuppress-article - gnus-dup-enter-articles) - ("gnus-range" gnus-copy-sequence) - ("gnus-eform" gnus-edit-form) - ("gnus-move" :interactive t - gnus-group-move-group-to-server gnus-change-server) - ("gnus-logic" gnus-score-advanced) - ("gnus-undo" gnus-undo-mode gnus-undo-register) - ("gnus-async" gnus-async-request-fetched-article gnus-async-prefetch-next - gnus-async-prefetch-article gnus-async-prefetch-remove-group - gnus-async-halt-prefetch) - ("gnus-offline" - gnus-offline-setup) - ("gnus-offline" :interactive t - gnus-offline-toggle-plugged - gnus-offline-set-unplugged-state - gnus-offline-toggle-auto-hangup - gnus-offline-toggle-on/off-send-mail - gnus-offline-toggle-articles-to-fetch - gnus-offline-set-interval-time - gnus-offline-agent-expire) - ("miee" :interactive t gnspool-get-news - mail-spool-send news-spool-post) - ("international/mw32misc" define-process-argument-editing - general-process-argument-editing-function) - ("gnus-agent" gnus-open-agent gnus-agent-get-function - gnus-agent-save-groups gnus-agent-save-active gnus-agent-method-p - gnus-agent-get-undownloaded-list gnus-agent-fetch-session - gnus-summary-set-agent-mark gnus-agent-save-group-info) - ("gnus-agent" :interactive t - gnus-unplugged gnus-agentize gnus-agent-batch) - ("gnus-vm" :interactive t gnus-summary-save-in-vm - gnus-summary-save-article-vm) - ("gnus-draft" :interactive t gnus-draft-mode gnus-group-send-drafts) - ("gnus-mlspl" gnus-group-split gnus-group-split-fancy) - ("gnus-mlspl" :interactive t gnus-group-split-setup - gnus-group-split-update)))) - -(eval-and-compile - (unless (featurep 'xemacs) - (if (>= emacs-major-version 21) - (autoload 'x-face-decode-message-header "x-face-e21") - (autoload 'gnus-smiley-display "gnus-bitmap" nil t) - (autoload 'smiley-toggle-buffer "gnus-bitmap") - (autoload 'x-face-mule-gnus-article-display-x-face "x-face-mule")))) - -(unless (and (fboundp 'base64-encode-string) - (subrp (symbol-function 'base64-encode-string))) - (require 'base64)) - -;; To make shimbun groups. -(autoload 'gnus-group-make-shimbun-group "nnshimbun" nil t) - -;; A tool for the developers. -(autoload 'find-cl-run-time-functions "gnus-clfns" nil t) - -;;; gnus-sum.el thingies - - -(defcustom gnus-summary-line-format "%U%R%z%I%(%[%4L: %-23,23n%]%) %s\n" - "*The format specification of the lines in the summary buffer. - -It works along the same lines as a normal formatting string, -with some simple extensions. - -%N Article number, left padded with spaces (string) -%S Subject (string) -%s Subject if it is at the root of a thread, and \"\" otherwise (string) -%n Name of the poster (string) -%a Extracted name of the poster (string) -%A Extracted address of the poster (string) -%F Contents of the From: header (string) -%f Contents of the From: or To: headers (string) -%x Contents of the Xref: header (string) -%D Date of the article (string) -%d Date of the article (string) in DD-MMM format -%o Date of the article (string) in YYYYMMDD`T'HHMMSS format -%M Message-id of the article (string) -%r References of the article (string) -%c Number of characters in the article (integer) -%L Number of lines in the article (integer) -%I Indentation based on thread level (a string of spaces) -%B A complex trn-style thread tree (string) - The variables `gnus-sum-thread-*' can be used for customization. -%T A string with two possible values: 80 spaces if the article - is on thread level two or larger and 0 spaces on level one -%R \"A\" if this article has been replied to, \" \" otherwise (character) -%U Status of this article (character, \"R\", \"K\", \"-\" or \" \") -%[ Opening bracket (character, \"[\" or \"<\") -%] Closing bracket (character, \"]\" or \">\") -%> Spaces of length thread-level (string) -%< Spaces of length (- 20 thread-level) (string) -%i Article score (number) -%z Article zcore (character) -%t Number of articles under the current thread (number). -%e Whether the thread is empty or not (character). -%l GroupLens score (string). -%V Total thread score (number). -%P The line number (number). -%O Download mark (character). -%u User defined specifier. The next character in the format string should - be a letter. Gnus will call the function gnus-user-format-function-X, - where X is the letter following %u. The function will be passed the - current header as argument. The function should return a string, which - will be inserted into the summary just like information from any other - summary specifier. - -Text between %( and %) will be highlighted with `gnus-mouse-face' -when the mouse point is placed inside the area. There can only be one -such area. - -The %U (status), %R (replied) and %z (zcore) specs have to be handled -with care. For reasons of efficiency, Gnus will compute what column -these characters will end up in, and \"hard-code\" that. This means that -it is invalid to have these specs after a variable-length spec. Well, -you might not be arrested, but your summary buffer will look strange, -which is bad enough. - -The smart choice is to have these specs as far to the left as -possible. - -This restriction may disappear in later versions of Gnus." - :type 'string - :group 'gnus-summary-format) - -;;; -;;; Skeleton keymaps -;;; - -(defun gnus-suppress-keymap (keymap) - (suppress-keymap keymap) - (let ((keys `([backspace] [delete] "\177" "\M-u"))) ;gnus-mouse-2 - (while keys - (define-key keymap (pop keys) 'undefined)))) - -(defvar gnus-article-mode-map - (let ((keymap (make-sparse-keymap))) - (gnus-suppress-keymap keymap) - keymap)) -(defvar gnus-summary-mode-map - (let ((keymap (make-keymap))) - (gnus-suppress-keymap keymap) - keymap)) -(defvar gnus-group-mode-map - (let ((keymap (make-keymap))) - (gnus-suppress-keymap keymap) - keymap)) - - - -;; Fix by Hallvard B Furuseth . -;; If you want the cursor to go somewhere else, set these two -;; functions in some startup hook to whatever you want. -(defalias 'gnus-summary-position-point 'gnus-goto-colon) -(defalias 'gnus-group-position-point 'gnus-goto-colon) - -;;; Various macros and substs. - -(defun gnus-header-from (header) - (mail-header-from header)) - -(defmacro gnus-gethash (string hashtable) - "Get hash value of STRING in HASHTABLE." - `(symbol-value (intern-soft ,string ,hashtable))) - -(defmacro gnus-sethash (string value hashtable) - "Set hash value. Arguments are STRING, VALUE, and HASHTABLE." - `(set (intern ,string ,hashtable) ,value)) -(put 'gnus-sethash 'edebug-form-spec '(form form form)) - -(defmacro gnus-group-unread (group) - "Get the currently computed number of unread articles in GROUP." - `(car (gnus-gethash ,group gnus-newsrc-hashtb))) - -(defmacro gnus-group-entry (group) - "Get the newsrc entry for GROUP." - `(gnus-gethash ,group gnus-newsrc-hashtb)) - -(defmacro gnus-active (group) - "Get active info on GROUP." - `(gnus-gethash ,group gnus-active-hashtb)) - -(defmacro gnus-set-active (group active) - "Set GROUP's active info." - `(gnus-sethash ,group ,active gnus-active-hashtb)) - -;; Info access macros. - -(defmacro gnus-info-group (info) - `(nth 0 ,info)) -(defmacro gnus-info-rank (info) - `(nth 1 ,info)) -(defmacro gnus-info-read (info) - `(nth 2 ,info)) -(defmacro gnus-info-marks (info) - `(nth 3 ,info)) -(defmacro gnus-info-method (info) - `(nth 4 ,info)) -(defmacro gnus-info-params (info) - `(nth 5 ,info)) - -(defmacro gnus-info-level (info) - `(let ((rank (gnus-info-rank ,info))) - (if (consp rank) - (car rank) - rank))) -(defmacro gnus-info-score (info) - `(let ((rank (gnus-info-rank ,info))) - (or (and (consp rank) (cdr rank)) 0))) - -(defmacro gnus-info-set-group (info group) - `(setcar ,info ,group)) -(defmacro gnus-info-set-rank (info rank) - `(setcar (nthcdr 1 ,info) ,rank)) -(defmacro gnus-info-set-read (info read) - `(setcar (nthcdr 2 ,info) ,read)) -(defmacro gnus-info-set-marks (info marks &optional extend) - (if extend - `(gnus-info-set-entry ,info ,marks 3) - `(setcar (nthcdr 3 ,info) ,marks))) -(defmacro gnus-info-set-method (info method &optional extend) - (if extend - `(gnus-info-set-entry ,info ,method 4) - `(setcar (nthcdr 4 ,info) ,method))) -(defmacro gnus-info-set-params (info params &optional extend) - (if extend - `(gnus-info-set-entry ,info ,params 5) - `(setcar (nthcdr 5 ,info) ,params))) - -(defun gnus-info-set-entry (info entry number) - ;; Extend the info until we have enough elements. - (while (<= (length info) number) - (nconc info (list nil))) - ;; Set the entry. - (setcar (nthcdr number info) entry)) - -(defmacro gnus-info-set-level (info level) - `(let ((rank (cdr ,info))) - (if (consp (car rank)) - (setcar (car rank) ,level) - (setcar rank ,level)))) -(defmacro gnus-info-set-score (info score) - `(let ((rank (cdr ,info))) - (if (consp (car rank)) - (setcdr (car rank) ,score) - (setcar rank (cons (car rank) ,score))))) - -(defmacro gnus-get-info (group) - `(nth 2 (gnus-gethash ,group gnus-newsrc-hashtb))) - -;;; Load the compatability functions. - -(require 'gnus-ems) - - -;;; -;;; Shutdown -;;; - -(defvar gnus-shutdown-alist nil) - -(defun gnus-add-shutdown (function &rest symbols) - "Run FUNCTION whenever one of SYMBOLS is shut down." - (push (cons function symbols) gnus-shutdown-alist)) - -(defun gnus-shutdown (symbol) - "Shut down everything that waits for SYMBOL." - (let ((alist gnus-shutdown-alist) - entry) - (while (setq entry (pop alist)) - (when (memq symbol (cdr entry)) - (funcall (car entry)))))) - - -;;; -;;; Gnus Utility Functions -;;; - - -(defmacro gnus-string-or (&rest strings) - "Return the first element of STRINGS that is a non-blank string. -STRINGS will be evaluated in normal `or' order." - `(gnus-string-or-1 ',strings)) - -(defun gnus-string-or-1 (strings) - (let (string) - (while strings - (setq string (eval (pop strings))) - (if (string-match "^[ \t]*$" string) - (setq string nil) - (setq strings nil))) - string)) - -(defun gnus-info-find-node (&optional nodename) - "Find Info documentation of Gnus." - (interactive) - ;; Enlarge info window if needed. - (let (gnus-info-buffer) - (Info-goto-node - (format "(%s)%s" - (or gnus-info-filename - (get-language-info current-language-environment 'gnus-info) - "gnus") - (or nodename - (cadr (assq major-mode gnus-info-nodes)) - (and (eq (current-buffer) (get-buffer gnus-article-buffer)) - (cadr (assq 'gnus-article-mode gnus-info-nodes)))))) - (setq gnus-info-buffer (current-buffer)) - (gnus-configure-windows 'info))) - -;;; -;;; gnus-interactive -;;; - -(defvar gnus-current-prefix-symbol nil - "Current prefix symbol.") - -(defvar gnus-current-prefix-symbols nil - "List of current prefix symbols.") - -(defun gnus-interactive (string &optional params) - "Return a list that can be fed to `interactive'. -See `interactive' for full documentation. - -Adds the following specs: - -y -- The current symbolic prefix. -Y -- A list of the current symbolic prefix(es). -A -- Article number. -H -- Article header. -g -- Group name." - (let ((i 0) - out c prompt) - (while (< i (length string)) - (string-match ".\\([^\n]*\\)\n?" string i) - (setq c (aref string i)) - (when (match-end 1) - (setq prompt (match-string 1 string))) - (setq i (match-end 0)) - ;; We basically emulate just about everything that - ;; `interactive' does, but add the specs listed above. - (push - (cond - ((= c ?a) - (completing-read prompt obarray 'fboundp t)) - ((= c ?b) - (read-buffer prompt (current-buffer) t)) - ((= c ?B) - (read-buffer prompt (other-buffer (current-buffer)))) - ((= c ?c) - (read-char)) - ((= c ?C) - (completing-read prompt obarray 'commandp t)) - ((= c ?d) - (point)) - ((= c ?D) - (read-file-name prompt nil default-directory 'lambda)) - ((= c ?f) - (read-file-name prompt nil nil 'lambda)) - ((= c ?F) - (read-file-name prompt)) - ((= c ?k) - (read-key-sequence prompt)) - ((= c ?K) - (error "Not implemented spec")) - ((= c ?e) - (error "Not implemented spec")) - ((= c ?m) - (mark)) - ((= c ?N) - (error "Not implemented spec")) - ((= c ?n) - (string-to-number (read-from-minibuffer prompt))) - ((= c ?p) - (prefix-numeric-value current-prefix-arg)) - ((= c ?P) - current-prefix-arg) - ((= c ?r) - 'gnus-prefix-nil) - ((= c ?s) - (read-string prompt)) - ((= c ?S) - (intern (read-string prompt))) - ((= c ?v) - (read-variable prompt)) - ((= c ?x) - (read-minibuffer prompt)) - ((= c ?x) - (eval-minibuffer prompt)) - ;; And here the new specs come. - ((= c ?y) - gnus-current-prefix-symbol) - ((= c ?Y) - gnus-current-prefix-symbols) - ((= c ?g) - (gnus-group-group-name)) - ((= c ?A) - (gnus-summary-skip-intangible) - (or (get-text-property (point) 'gnus-number) - (gnus-summary-last-subject))) - ((= c ?H) - (gnus-data-header (gnus-data-find (gnus-summary-article-number)))) - (t - (error "Non-implemented spec"))) - out) - (cond - ((= c ?r) - (push (if (< (point) (mark)) (point) (mark)) out) - (push (if (> (point) (mark)) (point) (mark)) out)))) - (setq out (delq 'gnus-prefix-nil out)) - (nreverse out))) - -(defun gnus-symbolic-argument (&optional arg) - "Read a symbolic argument and a command, and then execute command." - (interactive "P") - (let* ((in-command (this-command-keys)) - (command in-command) - gnus-current-prefix-symbols - gnus-current-prefix-symbol - syms) - (while (equal in-command command) - (message "%s-" (key-description (this-command-keys))) - (push (intern (char-to-string (read-char))) syms) - (setq command (read-key-sequence nil t))) - (setq gnus-current-prefix-symbols (nreverse syms) - gnus-current-prefix-symbol (car gnus-current-prefix-symbols)) - (call-interactively (key-binding command t)))) - -;;; More various functions. - -(defsubst gnus-check-backend-function (func group) - "Check whether GROUP supports function FUNC. -GROUP can either be a string (a group name) or a select method." - (ignore-errors - (let ((method (if (stringp group) - (car (gnus-find-method-for-group group)) - group))) - (unless (featurep method) - (require method)) - (fboundp (intern (format "%s-%s" method func)))))) - -(defun gnus-group-read-only-p (&optional group) - "Check whether GROUP supports editing or not. -If GROUP is nil, `gnus-newsgroup-name' will be checked instead. Note -that that variable is buffer-local to the summary buffers." - (let ((group (or group gnus-newsgroup-name))) - (not (gnus-check-backend-function 'request-replace-article group)))) - -(defun gnus-virtual-group-p (group) - "Say whether GROUP is virtual or not." - (memq 'virtual (assoc (symbol-name (car (gnus-find-method-for-group group))) - gnus-valid-select-methods))) - -(defun gnus-news-group-p (group &optional article) - "Return non-nil if GROUP (and ARTICLE) come from a news server." - (or (gnus-member-of-valid 'post group) ; Ordinary news group. - (and (gnus-member-of-valid 'post-mail group) ; Combined group. - (if (or (null article) - (not (< article 0))) - (eq (gnus-request-type group article) 'news) - (if (not (vectorp article)) - nil - ;; It's a real article. - (eq (gnus-request-type group (mail-header-id article)) - 'news)))))) - -;; Returns a list of writable groups. -(defun gnus-writable-groups () - (let ((alist gnus-newsrc-alist) - groups group) - (while (setq group (car (pop alist))) - (unless (gnus-group-read-only-p group) - (push group groups))) - (nreverse groups))) - -;; Check whether to use long file names. -(defun gnus-use-long-file-name (symbol) - ;; The variable has to be set... - (and gnus-use-long-file-name - ;; If it isn't a list, then we return t. - (or (not (listp gnus-use-long-file-name)) - ;; If it is a list, and the list contains `symbol', we - ;; return nil. - (not (memq symbol gnus-use-long-file-name))))) - -;; Generate a unique new group name. -(defun gnus-generate-new-group-name (leaf) - (let ((name leaf) - (num 0)) - (while (gnus-gethash name gnus-newsrc-hashtb) - (setq name (concat leaf "<" (int-to-string (setq num (1+ num))) ">"))) - name)) - -(defun gnus-ephemeral-group-p (group) - "Say whether GROUP is ephemeral or not." - (gnus-group-get-parameter group 'quit-config t)) - -(defun gnus-group-quit-config (group) - "Return the quit-config of GROUP." - (gnus-group-get-parameter group 'quit-config t)) - -(defun gnus-kill-ephemeral-group (group) - "Remove ephemeral GROUP from relevant structures." - (gnus-sethash group nil gnus-newsrc-hashtb)) - -(defun gnus-simplify-mode-line () - "Make mode lines a bit simpler." - (setq mode-line-modified (cdr gnus-mode-line-modified)) - (when (listp mode-line-format) - (make-local-variable 'mode-line-format) - (setq mode-line-format (copy-sequence mode-line-format)) - (when (equal (nth 3 mode-line-format) " ") - (setcar (nthcdr 3 mode-line-format) " ")))) - -;;; Servers and groups. - -(defsubst gnus-server-add-address (method) - (let ((method-name (symbol-name (car method)))) - (if (and (memq 'address (assoc method-name gnus-valid-select-methods)) - (not (assq (intern (concat method-name "-address")) method)) - (memq 'physical-address (assq (car method) - gnus-valid-select-methods))) - (append method (list (list (intern (concat method-name "-address")) - (nth 1 method)))) - method))) - -(defsubst gnus-server-get-method (group method) - ;; Input either a server name, and extended server name, or a - ;; select method, and return a select method. - (cond ((stringp method) - (gnus-server-to-method method)) - ((equal method gnus-select-method) - gnus-select-method) - ((and (stringp (car method)) - group) - (gnus-server-extend-method group method)) - ((and method - (not group) - (equal (cadr method) "")) - method) - (t - (gnus-server-add-address method)))) - -(defun gnus-server-to-method (server) - "Map virtual server names to select methods." - (or - ;; Is this a method, perhaps? - (and server (listp server) server) - ;; Perhaps this is the native server? - (and (equal server "native") gnus-select-method) - ;; It should be in the server alist. - (cdr (assoc server gnus-server-alist)) - ;; It could be in the predefined server alist. - (cdr (assoc server gnus-predefined-server-alist)) - ;; If not, we look through all the opened server - ;; to see whether we can find it there. - (let ((opened gnus-opened-servers)) - (while (and opened - (not (equal server (format "%s:%s" (caaar opened) - (cadaar opened))))) - (pop opened)) - (caar opened)) - ;; It could be a named method, search all servers - (let ((servers gnus-secondary-select-methods)) - (while (and servers - (not (equal server (format "%s:%s" (caar servers) - (cadar servers))))) - (pop servers)) - (car servers)))) - -(defmacro gnus-method-equal (ss1 ss2) - "Say whether two servers are equal." - `(let ((s1 ,ss1) - (s2 ,ss2)) - (or (equal s1 s2) - (and (= (length s1) (length s2)) - (progn - (while (and s1 (member (car s1) s2)) - (setq s1 (cdr s1))) - (null s1)))))) - -(defun gnus-methods-equal-p (m1 m2) - (let ((m1 (or m1 gnus-select-method)) - (m2 (or m2 gnus-select-method))) - (or (equal m1 m2) - (and (eq (car m1) (car m2)) - (or (not (memq 'address (assoc (symbol-name (car m1)) - gnus-valid-select-methods))) - (equal (nth 1 m1) (nth 1 m2))))))) - -(defun gnus-server-equal (m1 m2) - "Say whether two methods are equal." - (let ((m1 (cond ((null m1) gnus-select-method) - ((stringp m1) (gnus-server-to-method m1)) - (t m1))) - (m2 (cond ((null m2) gnus-select-method) - ((stringp m2) (gnus-server-to-method m2)) - (t m2)))) - (gnus-method-equal m1 m2))) - -(defun gnus-servers-using-backend (backend) - "Return a list of known servers using BACKEND." - (let ((opened gnus-opened-servers) - out) - (while opened - (when (eq backend (caaar opened)) - (push (caar opened) out)) - (pop opened)) - out)) - -(defun gnus-archive-server-wanted-p () - "Say whether the user wants to use the archive server." - (cond - ((or (not gnus-message-archive-method) - (not gnus-message-archive-group)) - nil) - ((and gnus-message-archive-method gnus-message-archive-group) - t) - (t - (let ((active (cadr (assq 'nnfolder-active-file - gnus-message-archive-method)))) - (and active - (file-exists-p active)))))) - -(defsubst gnus-method-to-server-name (method) - (concat - (format "%s" (car method)) - (when (and - (or (assoc (format "%s" (car method)) - (gnus-methods-using 'address)) - (gnus-server-equal method gnus-message-archive-method)) - (nth 1 method) - (not (string= (nth 1 method) ""))) - (concat "+" (nth 1 method))))) - -(defun gnus-group-prefixed-name (group method) - "Return the whole name from GROUP and METHOD." - (and (stringp method) (setq method (gnus-server-to-method method))) - (if (or (not method) - (gnus-server-equal method "native")) - group - (concat (gnus-method-to-server-name method) ":" group))) - -(defun gnus-group-real-prefix (group) - "Return the prefix of the current group name." - (if (string-match "^[^:]+:" group) - (substring group 0 (match-end 0)) - "")) - -(defun gnus-group-method (group) - "Return the server or method used for selecting GROUP. -You should probably use `gnus-find-method-for-group' instead." - (let ((prefix (gnus-group-real-prefix group))) - (if (equal prefix "") - gnus-select-method - (let ((servers gnus-opened-servers) - (server "") - backend possible found) - (if (string-match "^[^\\+]+\\+" prefix) - (setq backend (intern (substring prefix 0 (1- (match-end 0)))) - server (substring prefix (match-end 0) (1- (length prefix)))) - (setq backend (intern (substring prefix 0 (1- (length prefix)))))) - (while servers - (when (eq (caaar servers) backend) - (setq possible (caar servers)) - (when (equal (cadaar servers) server) - (setq found (caar servers)))) - (pop servers)) - (or (car (rassoc found gnus-server-alist)) - found - (car (rassoc possible gnus-server-alist)) - possible - (list backend server)))))) - -(defsubst gnus-native-method-p (method) - "Return whether METHOD is the native select method." - (gnus-method-equal method gnus-select-method)) - -(defsubst gnus-secondary-method-p (method) - "Return whether METHOD is a secondary select method." - (let ((methods gnus-secondary-select-methods) - (gmethod (gnus-server-get-method nil method))) - (while (and methods - (not (gnus-method-equal - (gnus-server-get-method nil (car methods)) - gmethod))) - (setq methods (cdr methods))) - methods)) - -(defun gnus-method-simplify (method) - "Return the shortest uniquely identifying string or method for METHOD." - (cond ((stringp method) - method) - ((gnus-native-method-p method) - nil) - ((gnus-secondary-method-p method) - (format "%s:%s" (nth 0 method) (nth 1 method))) - (t - method))) - -(defun gnus-groups-from-server (server) - "Return a list of all groups that are fetched from SERVER." - (let ((alist (cdr gnus-newsrc-alist)) - info groups) - (while (setq info (pop alist)) - (when (gnus-server-equal (gnus-info-method info) server) - (push (gnus-info-group info) groups))) - (sort groups 'string<))) - -(defun gnus-group-foreign-p (group) - "Say whether a group is foreign or not." - (and (not (gnus-group-native-p group)) - (not (gnus-group-secondary-p group)))) - -(defun gnus-group-native-p (group) - "Say whether the group is native or not." - (not (string-match ":" group))) - -(defun gnus-group-secondary-p (group) - "Say whether the group is secondary or not." - (gnus-secondary-method-p (gnus-find-method-for-group group))) - -(defun gnus-parameters-get-parameter (group) - "Return the group parameters for GROUP from `gnus-parameters'." - (let (params-list) - (dolist (elem gnus-parameters) - (when (string-match (car elem) group) - (setq params-list - (nconc (gnus-expand-group-parameters - (car elem) (cdr elem) group) - params-list)))) - params-list)) - -(defun gnus-expand-group-parameters (match parameters group) - "Go through PARAMETERS and expand them according to the match data." - (let (new) - (dolist (elem parameters) - (if (and (stringp (cdr elem)) - (string-match "\\\\" (cdr elem))) - (push (cons (car elem) - (with-temp-buffer - (insert group) - (goto-char (point-min)) - (while (re-search-forward match nil t) - (replace-match (cdr elem))) - (buffer-string))) - new) - (push elem new))) - new)) - -(defun gnus-group-find-parameter (group &optional symbol allow-list) - "Return the group parameters for GROUP. -If SYMBOL, return the value of that symbol in the group parameters." - (save-excursion - (set-buffer gnus-group-buffer) - (let ((parameters - (nconc - (copy-sequence - (funcall gnus-group-get-parameter-function group)) - (gnus-parameters-get-parameter group)))) - (if symbol - (gnus-group-parameter-value parameters symbol allow-list) - parameters)))) - -(defun gnus-group-get-parameter (group &optional symbol allow-list) - "Return the group parameters for GROUP. -If SYMBOL, return the value of that symbol in the group parameters. -Most functions should use `gnus-group-find-parameter', which -also examines the topic parameters." - (let ((params (gnus-info-params (gnus-get-info group)))) - (if symbol - (gnus-group-parameter-value params symbol allow-list) - params))) - -(defun gnus-group-parameter-value (params symbol &optional allow-list) - "Return the value of SYMBOL in group PARAMS." - ;; We only wish to return group parameters (dotted lists) and - ;; not local variables, which may have the same names. - ;; But first we handle single elements... - (or (car (memq symbol params)) - ;; Handle alist. - (let (elem) - (catch 'found - (while (setq elem (pop params)) - (when (and (consp elem) - (eq (car elem) symbol) - (or allow-list - (atom (cdr elem)))) - (throw 'found (cdr elem)))))))) - -(defun gnus-group-add-parameter (group param) - "Add parameter PARAM to GROUP." - (let ((info (gnus-get-info group))) - (when info - (gnus-group-remove-parameter group (if (consp param) (car param) param)) - ;; Cons the new param to the old one and update. - (gnus-group-set-info (cons param (gnus-info-params info)) - group 'params)))) - -(defun gnus-group-set-parameter (group name value) - "Set parameter NAME to VALUE in GROUP." - (let ((info (gnus-get-info group))) - (when info - (gnus-group-remove-parameter group name) - (let ((old-params (gnus-info-params info)) - (new-params (list (cons name value)))) - (while old-params - (when (or (not (listp (car old-params))) - (not (eq (caar old-params) name))) - (setq new-params (append new-params (list (car old-params))))) - (setq old-params (cdr old-params))) - (gnus-group-set-info new-params group 'params))))) - -(defun gnus-group-remove-parameter (group name) - "Remove parameter NAME from GROUP." - (let ((info (gnus-get-info group))) - (when info - (let ((params (gnus-info-params info))) - (when params - (setq params (delq name params)) - (while (assq name params) - (gnus-pull name params)) - (gnus-info-set-params info params)))))) - -(defun gnus-group-add-score (group &optional score) - "Add SCORE to the GROUP score. -If SCORE is nil, add 1 to the score of GROUP." - (let ((info (gnus-get-info group))) - (when info - (gnus-info-set-score info (+ (gnus-info-score info) (or score 1)))))) - -(defun gnus-short-group-name (group &optional levels) - "Collapse GROUP name LEVELS. -Select methods are stripped and any remote host name is stripped down to -just the host name." - (let* ((name "") - (foreign "") - (depth 0) - (skip 1) - (levels (or levels - gnus-group-uncollapsed-levels - (progn - (while (string-match "\\." group skip) - (setq skip (match-end 0) - depth (+ depth 1))) - depth)))) - ;; Separate foreign select method from group name and collapse. - ;; If method contains a server, collapse to non-domain server name, - ;; otherwise collapse to select method. - (let* ((colon (string-match ":" group)) - (server (and colon (substring group 0 colon))) - (plus (and server (string-match "+" server)))) - (when server - (if plus - (setq foreign (substring server (+ 1 plus) - (string-match "\\." server)) - group (substring group (+ 1 colon))) - (setq foreign server - group (substring group (+ 1 colon)))) - (setq foreign (concat foreign ":"))) - ;; Collapse group name leaving LEVELS uncollapsed elements - (let* ((slist (split-string group "/")) - (slen (length slist)) - (dlist (split-string group "\\.")) - (dlen (length dlist)) - glist - glen - gsep - res) - (if (> slen dlen) - (setq glist slist - glen slen - gsep "/") - (setq glist dlist - glen dlen - gsep ".")) - (setq levels (- glen levels)) - (dolist (g glist) - (push (if (>= (decf levels) 0) - (if (zerop (length g)) - "" - (substring g 0 1)) - g) - res)) - (concat foreign (mapconcat 'identity (nreverse res) gsep)))))) - -(defun gnus-narrow-to-body () - "Narrow to the body of an article." - (narrow-to-region - (progn - (goto-char (point-min)) - (or (search-forward "\n\n" nil t) - (point-max))) - (point-max))) - - -;;; -;;; Kill file handling. -;;; - -(defun gnus-apply-kill-file () - "Apply a kill file to the current newsgroup. -Returns the number of articles marked as read." - (if (or (file-exists-p (gnus-newsgroup-kill-file nil)) - (file-exists-p (gnus-newsgroup-kill-file gnus-newsgroup-name))) - (gnus-apply-kill-file-internal) - 0)) - -(defun gnus-kill-save-kill-buffer () - (let ((file (gnus-newsgroup-kill-file gnus-newsgroup-name))) - (when (get-file-buffer file) - (save-excursion - (set-buffer (get-file-buffer file)) - (when (buffer-modified-p) - (save-buffer)) - (kill-buffer (current-buffer)))))) - -(defcustom gnus-kill-file-name "KILL" - "Suffix of the kill files." - :group 'gnus-score-kill - :group 'gnus-score-files - :type 'string) - -(defun gnus-newsgroup-kill-file (newsgroup) - "Return the name of a kill file name for NEWSGROUP. -If NEWSGROUP is nil, return the global kill file name instead." - (cond - ;; The global KILL file is placed at top of the directory. - ((or (null newsgroup) - (string-equal newsgroup "")) - (expand-file-name gnus-kill-file-name - gnus-kill-files-directory)) - ;; Append ".KILL" to newsgroup name. - ((gnus-use-long-file-name 'not-kill) - (expand-file-name (concat (gnus-newsgroup-savable-name newsgroup) - "." gnus-kill-file-name) - gnus-kill-files-directory)) - ;; Place "KILL" under the hierarchical directory. - (t - (expand-file-name (concat (gnus-newsgroup-directory-form newsgroup) - "/" gnus-kill-file-name) - gnus-kill-files-directory)))) - -;;; Server things. - -(defun gnus-member-of-valid (symbol group) - "Find out if GROUP has SYMBOL as part of its \"valid\" spec." - (memq symbol (assoc - (symbol-name (car (gnus-find-method-for-group group))) - gnus-valid-select-methods))) - -(defun gnus-method-option-p (method option) - "Return non-nil if select METHOD has OPTION as a parameter." - (when (stringp method) - (setq method (gnus-server-to-method method))) - (memq option (assoc (format "%s" (car method)) - gnus-valid-select-methods))) - -(defun gnus-similar-server-opened (method) - (let ((opened gnus-opened-servers)) - (while (and method opened) - (when (and (equal (cadr method) (cadaar opened)) - (equal (car method) (caaar opened)) - (not (equal method (caar opened)))) - (setq method nil)) - (pop opened)) - (not method))) - -(defun gnus-server-extend-method (group method) - ;; This function "extends" a virtual server. If the server is - ;; "hello", and the select method is ("hello" (my-var "something")) - ;; in the group "alt.alt", this will result in a new virtual server - ;; called "hello+alt.alt". - (if (or (not (inline (gnus-similar-server-opened method))) - (not (cddr method))) - method - `(,(car method) ,(concat (cadr method) "+" group) - (,(intern (format "%s-address" (car method))) ,(cadr method)) - ,@(cddr method)))) - -(defun gnus-server-status (method) - "Return the status of METHOD." - (nth 1 (assoc method gnus-opened-servers))) - -(defun gnus-group-name-to-method (group) - "Guess a select method based on GROUP." - (if (string-match ":" group) - (let ((server (substring group 0 (match-beginning 0)))) - (if (string-match "\\+" server) - (list (intern (substring server 0 (match-beginning 0))) - (substring server (match-end 0))) - (list (intern server) ""))) - gnus-select-method)) - -(defun gnus-server-string (server) - "Return a readable string that describes SERVER." - (let* ((server (gnus-server-to-method server)) - (address (nth 1 server))) - (if (and address - (not (zerop (length address)))) - (format "%s via %s" address (car server)) - (format "%s" (car server))))) - -(defun gnus-find-method-for-group (group &optional info) - "Find the select method that GROUP uses." - (or gnus-override-method - (and (not group) - gnus-select-method) - (and (not (gnus-group-entry group));; a new group - (gnus-group-name-to-method group)) - (let ((info (or info (gnus-get-info group))) - method) - (if (or (not info) - (not (setq method (gnus-info-method info))) - (equal method "native")) - gnus-select-method - (setq method - (cond ((stringp method) - (inline (gnus-server-to-method method))) - ((stringp (cadr method)) - (inline (gnus-server-extend-method group method))) - (t - method))) - (cond ((equal (cadr method) "") - method) - ((null (cadr method)) - (list (car method) "")) - (t - (gnus-server-add-address method))))))) - -(defun gnus-methods-using (feature) - "Find all methods that have FEATURE." - (let ((valids gnus-valid-select-methods) - outs) - (while valids - (when (memq feature (car valids)) - (push (car valids) outs)) - (setq valids (cdr valids))) - outs)) - -(defun gnus-read-group (prompt &optional default) - "Prompt the user for a group name. -Disallow invalid group names." - (let ((prefix "") - group) - (while (not group) - (when (string-match - gnus-invalid-group-regexp - (setq group (read-string (concat prefix prompt) - (cons (or default "") 0) - 'gnus-group-history))) - (setq prefix (format "Invalid group name: \"%s\". " group) - group nil))) - group)) - -(defun gnus-read-method (prompt) - "Prompt the user for a method. -Allow completion over sensible values." - (let* ((open-servers - (mapcar (lambda (i) (cons (format "%s:%s" (caar i) (cadar i)) i)) - gnus-opened-servers)) - (valid-methods - (let (methods) - (dolist (method gnus-valid-select-methods) - (if (or (memq 'prompt-address method) - (not (assoc (format "%s:" (car method)) open-servers))) - (push method methods))) - methods)) - (servers - (append valid-methods - open-servers - gnus-predefined-server-alist - gnus-server-alist)) - (method - (completing-read - prompt servers - nil t nil 'gnus-method-history))) - (cond - ((equal method "") - (setq method gnus-select-method)) - ((assoc method gnus-valid-select-methods) - (let ((address (if (memq 'prompt-address - (assoc method gnus-valid-select-methods)) - (read-string "Address: ") - ""))) - (or (cadr (assoc (format "%s:%s" method address) open-servers)) - (list (intern method) address)))) - ((assoc method servers) - method) - (t - (list (intern method) ""))))) - -;;; User-level commands. - -;;;###autoload -(defun gnus-slave-no-server (&optional arg) - "Read network news as a slave, without connecting to local server." - (interactive "P") - (gnus-no-server arg t)) - -;;;###autoload -(defun gnus-no-server (&optional arg slave) - "Read network news. -If ARG is a positive number, Gnus will use that as the -startup level. If ARG is nil, Gnus will be started at level 2. -If ARG is non-nil and not a positive number, Gnus will -prompt the user for the name of an NNTP server to use. -As opposed to `gnus', this command will not connect to the local server." - (interactive "P") - (gnus-no-server-1 arg slave)) - -;;;###autoload -(defun gnus-slave (&optional arg) - "Read news as a slave." - (interactive "P") - (gnus arg nil 'slave)) - -(defcustom gnus-frame-properties nil - "The properties of the frame in which gnus is displayed. Under XEmacs, -the variable `toolbar-news-frame-plist' will be refered instead." - :type '(repeat (cons :format "%v" - (symbol :tag "Parameter") - (sexp :tag "Value"))) - :group 'gnus) - -(defvar gnus-frame nil - "The frame in which gnus is displayed. It is not used under XEmacs.") - -;;;###autoload -(defun gnus-other-frame (&optional arg) - "Pop up a frame to read news." - (interactive "P") - (static-if (featurep 'xemacs) - (let ((toolbar-news-use-separate-frame t)) - (toolbar-gnus)) - (if (frame-live-p gnus-frame) - (raise-frame gnus-frame) - (setq gnus-frame (make-frame gnus-frame-properties)) - (if (and (gnus-buffer-live-p gnus-group-buffer) - (save-current-buffer - (set-buffer gnus-group-buffer) - (eq 'gnus-group-mode major-mode))) - (progn - (select-frame gnus-frame) - (switch-to-buffer gnus-group-buffer)) - (add-hook 'gnus-exit-gnus-hook - (lambda () - (when (and (frame-live-p gnus-frame) - (cdr (frame-list))) - (delete-frame gnus-frame)) - (setq gnus-frame nil))) - (select-frame gnus-frame) - (gnus arg))))) - -;;;###autoload -(defun gnus (&optional arg dont-connect slave) - "Read network news. -If ARG is non-nil and a positive number, Gnus will use that as the -startup level. If ARG is non-nil and not a positive number, Gnus will -prompt the user for the name of an NNTP server to use." - (interactive "P") - (gnus-1 arg dont-connect slave)) - -;; Allow redefinition of Gnus functions. - -(gnus-ems-redefine) - -(product-provide (provide 'gnus) 'gnus-vers) - -;;; gnus.el ends here diff --git a/lisp/ietf-drums.el b/lisp/ietf-drums.el deleted file mode 100644 index b39decb..0000000 --- a/lisp/ietf-drums.el +++ /dev/null @@ -1,250 +0,0 @@ -;;; ietf-drums.el --- Functions for parsing RFC822bis headers -;; Copyright (C) 1998, 1999, 2000 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;; DRUMS is an IETF Working Group that works (or worked) on the -;; successor to RFC822, "Standard For The Format Of Arpa Internet Text -;; Messages". This library is based on -;; draft-ietf-drums-msg-fmt-05.txt, released on 1998-08-05. - -;;; Code: - -(eval-when-compile (require 'cl)) -(require 'time-date) -(require 'mm-util) - -(defvar ietf-drums-no-ws-ctl-token "\001-\010\013\014\016-\037\177" - "US-ASCII control characters excluding CR, LF and white space.") -(defvar ietf-drums-text-token "\001-\011\013\014\016-\177" - "US-ASCII characters exlcuding CR and LF.") -(defvar ietf-drums-specials-token "()<>[]:;@\\,.\"" - "Special characters.") -(defvar ietf-drums-quote-token "\\" - "Quote character.") -(defvar ietf-drums-wsp-token " \t" - "White space.") -(defvar ietf-drums-fws-regexp - (concat "[" ietf-drums-wsp-token "]*\n[" ietf-drums-wsp-token "]+") - "Folding white space.") -(defvar ietf-drums-atext-token "-^a-zA-Z0-9!#$%&'*+/=?_`{|}~" - "Textual token.") -(defvar ietf-drums-dot-atext-token "-^a-zA-Z0-9!#$%&'*+/=?_`{|}~." - "Textual token including full stop.") -(defvar ietf-drums-qtext-token - (concat ietf-drums-no-ws-ctl-token "\041\043-\133\135-\177") - "Non-white-space control characaters, plus the rest of ASCII excluding backslash and doublequote.") -(defvar ietf-drums-tspecials "][()<>@,;:\\\"/?=" - "Tspecials.") - -(defvar ietf-drums-syntax-table - (let ((table (copy-syntax-table emacs-lisp-mode-syntax-table))) - (modify-syntax-entry ?\\ "/" table) - (modify-syntax-entry ?< "(" table) - (modify-syntax-entry ?> ")" table) - (modify-syntax-entry ?@ "w" table) - (modify-syntax-entry ?/ "w" table) - (modify-syntax-entry ?= " " table) - (modify-syntax-entry ?* " " table) - (modify-syntax-entry ?\; " " table) - (modify-syntax-entry ?\' " " table) - table)) - -(defun ietf-drums-token-to-list (token) - "Translate TOKEN into a list of characters." - (let ((i 0) - b e c out range) - (while (< i (length token)) - (setq c (mm-char-int (aref token i))) - (incf i) - (cond - ((eq c (mm-char-int ?-)) - (if b - (setq range t) - (push c out))) - (range - (while (<= b c) - (push (mm-make-char 'ascii b) out) - (incf b)) - (setq range nil)) - ((= i (length token)) - (push (mm-make-char 'ascii c) out)) - (t - (when b - (push (mm-make-char 'ascii b) out)) - (setq b c)))) - (nreverse out))) - -(defsubst ietf-drums-init (string) - (set-syntax-table ietf-drums-syntax-table) - (insert string) - (ietf-drums-unfold-fws) - (goto-char (point-min))) - -(defun ietf-drums-remove-comments (string) - "Remove comments from STRING." - (with-temp-buffer - (let (c) - (ietf-drums-init string) - (while (not (eobp)) - (setq c (char-after)) - (cond - ((eq c ?\") - (forward-sexp 1)) - ((eq c ?\() - (delete-region (point) (progn (forward-sexp 1) (point)))) - (t - (forward-char 1)))) - (buffer-string)))) - -(defun ietf-drums-remove-whitespace (string) - "Remove whitespace from STRING." - (with-temp-buffer - (ietf-drums-init string) - (let (c) - (while (not (eobp)) - (setq c (char-after)) - (cond - ((eq c ?\") - (forward-sexp 1)) - ((eq c ?\() - (forward-sexp 1)) - ((memq c '(? ?\t ?\n)) - (delete-char 1)) - (t - (forward-char 1)))) - (buffer-string)))) - -(defun ietf-drums-get-comment (string) - "Return the first comment in STRING." - (with-temp-buffer - (ietf-drums-init string) - (let (result c) - (while (not (eobp)) - (setq c (char-after)) - (cond - ((eq c ?\") - (forward-sexp 1)) - ((eq c ?\() - (setq result - (buffer-substring - (1+ (point)) - (progn (forward-sexp 1) (1- (point)))))) - (t - (forward-char 1)))) - result))) - -(defun ietf-drums-strip (string) - "Remove comments and whitespace from STRING." - (ietf-drums-remove-whitespace (ietf-drums-remove-comments string))) - -(defun ietf-drums-parse-address (string) - "Parse STRING and return a MAILBOX / DISPLAY-NAME pair." - (with-temp-buffer - (let (display-name mailbox c display-string) - (ietf-drums-init string) - (while (not (eobp)) - (setq c (char-after)) - (cond - ((or (eq c ? ) - (eq c ?\t)) - (forward-char 1)) - ((eq c ?\() - (forward-sexp 1)) - ((eq c ?\") - (push (buffer-substring - (1+ (point)) (progn (forward-sexp 1) (1- (point)))) - display-name)) - ((looking-at (concat "[" ietf-drums-atext-token "@" "]")) - (push (buffer-substring (point) (progn (forward-sexp 1) (point))) - display-name)) - ((eq c ?<) - (setq mailbox - (ietf-drums-remove-whitespace - (ietf-drums-remove-comments - (buffer-substring - (1+ (point)) - (progn (forward-sexp 1) (1- (point)))))))) - (t (error "Unknown symbol: %c" c)))) - ;; If we found no display-name, then we look for comments. - (if display-name - (setq display-string - (mapconcat 'identity (reverse display-name) " ")) - (setq display-string (ietf-drums-get-comment string))) - (if (not mailbox) - (when (string-match "@" display-string) - (cons - (mapconcat 'identity (nreverse display-name) "") - (ietf-drums-get-comment string))) - (cons mailbox display-string))))) - -(defun ietf-drums-parse-addresses (string) - "Parse STRING and return a list of MAILBOX / DISPLAY-NAME pairs." - (with-temp-buffer - (ietf-drums-init string) - (let ((beg (point)) - pairs c) - (while (not (eobp)) - (setq c (char-after)) - (cond - ((memq c '(?\" ?< ?\()) - (forward-sexp 1)) - ((eq c ?,) - (push (ietf-drums-parse-address (buffer-substring beg (point))) - pairs) - (forward-char 1) - (setq beg (point))) - (t - (forward-char 1)))) - (push (ietf-drums-parse-address (buffer-substring beg (point))) - pairs) - (nreverse pairs)))) - -(defun ietf-drums-unfold-fws () - "Unfold folding white space in the current buffer." - (goto-char (point-min)) - (while (re-search-forward ietf-drums-fws-regexp nil t) - (replace-match " " t t)) - (goto-char (point-min))) - -(defun ietf-drums-parse-date (string) - "Return an Emacs time spec from STRING." - (apply 'encode-time (parse-time-string string))) - -(defun ietf-drums-narrow-to-header () - "Narrow to the header section in the current buffer." - (narrow-to-region - (goto-char (point-min)) - (if (re-search-forward "^\r?$" nil 1) - (match-beginning 0) - (point-max))) - (goto-char (point-min))) - -(defun ietf-drums-quote-string (string) - "Quote string if it needs quoting to be displayed in a header." - (if (string-match (concat "[^" ietf-drums-atext-token "]") string) - (concat "\"" string "\"") - string)) - -(provide 'ietf-drums) - -;;; ietf-drums.el ends here diff --git a/lisp/imap.el b/lisp/imap.el deleted file mode 100644 index c89384e..0000000 --- a/lisp/imap.el +++ /dev/null @@ -1,2633 +0,0 @@ -;;; imap.el --- imap library -;; Copyright (C) 1998, 1999, 2000 -;; Free Software Foundation, Inc. - -;; Author: Simon Josefsson -;; Keywords: mail - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;; imap.el is a elisp library providing an interface for talking to -;; IMAP servers. -;; -;; imap.el is roughly divided in two parts, one that parses IMAP -;; responses from the server and storing data into buffer-local -;; variables, and one for utility functions which send commands to -;; server, waits for an answer, and return information. The latter -;; part is layered on top of the previous. -;; -;; The imap.el API consist of the following functions, other functions -;; in this file should not be called directly and the result of doing -;; so are at best undefined. -;; -;; Global commands: -;; -;; imap-open, imap-opened, imap-authenticate, imap-close, -;; imap-capability, imap-namespace, imap-error-text -;; -;; Mailbox commands: -;; -;; imap-mailbox-get, imap-mailbox-map, imap-current-mailbox, -;; imap-current-mailbox-p, imap-search, imap-mailbox-select, -;; imap-mailbox-examine, imap-mailbox-unselect, imap-mailbox-expunge -;; imap-mailbox-close, imap-mailbox-create, imap-mailbox-delete -;; imap-mailbox-rename, imap-mailbox-lsub, imap-mailbox-list -;; imap-mailbox-subscribe, imap-mailbox-unsubscribe, imap-mailbox-status -;; imap-mailbox-acl-get, imap-mailbox-acl-set, imap-mailbox-acl-delete -;; -;; Message commands: -;; -;; imap-fetch-asynch, imap-fetch, -;; imap-current-message, imap-list-to-message-set, -;; imap-message-get, imap-message-map -;; imap-message-envelope-date, imap-message-envelope-subject, -;; imap-message-envelope-from, imap-message-envelope-sender, -;; imap-message-envelope-reply-to, imap-message-envelope-to, -;; imap-message-envelope-cc, imap-message-envelope-bcc -;; imap-message-envelope-in-reply-to, imap-message-envelope-message-id -;; imap-message-body, imap-message-flag-permanent-p -;; imap-message-flags-set, imap-message-flags-del -;; imap-message-flags-add, imap-message-copyuid -;; imap-message-copy, imap-message-appenduid -;; imap-message-append, imap-envelope-from -;; imap-body-lines -;; -;; It is my hope that theese commands should be pretty self -;; explanatory for someone that know IMAP. All functions have -;; additional documentation on how to invoke them. -;; -;; imap.el support RFC1730/2060 (IMAP4/IMAP4rev1), implemented IMAP -;; extensions are RFC2195 (CRAM-MD5), RFC2086 (ACL), RFC2342 -;; (NAMESPACE), RFC2359 (UIDPLUS), the IMAP-part of RFC2595 (STARTTLS, -;; LOGINDISABLED) (with use of external library starttls.el and -;; program starttls) and the GSSAPI / kerberos V4 sections of RFC1731 -;; (with use of external program `imtest'). It also take advantage -;; the UNSELECT extension in Cyrus IMAPD. -;; -;; Without the work of John McClary Prevost and Jim Radford this library -;; would not have seen the light of day. Many thanks. -;; -;; This is a transcript of short interactive session for demonstration -;; purposes. -;; -;; (imap-open "my.mail.server") -;; => " *imap* my.mail.server:0" -;; -;; The rest are invoked with current buffer as the buffer returned by -;; `imap-open'. It is possible to do all without this, but it would -;; look ugly here since `buffer' is always the last argument for all -;; imap.el API functions. -;; -;; (imap-authenticate "myusername" "mypassword") -;; => auth -;; -;; (imap-mailbox-lsub "*") -;; => ("INBOX.sentmail" "INBOX.private" "INBOX.draft" "INBOX.spam") -;; -;; (imap-mailbox-list "INBOX.n%") -;; => ("INBOX.namedroppers" "INBOX.nnimap" "INBOX.ntbugtraq") -;; -;; (imap-mailbox-select "INBOX.nnimap") -;; => "INBOX.nnimap" -;; -;; (imap-mailbox-get 'exists) -;; => 166 -;; -;; (imap-mailbox-get 'uidvalidity) -;; => "908992622" -;; -;; (imap-search "FLAGGED SINCE 18-DEC-98") -;; => (235 236) -;; -;; (imap-fetch 235 "RFC822.PEEK" 'RFC822) -;; => "X-Sieve: cmu-sieve 1.3^M\nX-Username: ^M\r...." -;; -;; Todo: -;; -;; o Parse UIDs as strings? We need to overcome the 28 bit limit somehow. -;; o Don't use `read' at all (important places already fixed) -;; o Accept list of articles instead of message set string in most -;; imap-message-* functions. -;; -;; Revision history: -;; -;; - 19991218 added starttls/digest-md5 patch, -;; by Daiki Ueno -;; NB! you need SLIM for starttls.el and digest-md5.el -;; - 19991023 commited to pgnus -;; - -;;; Code: - -(eval-when-compile (require 'cl)) -(eval-when-compile (require 'static)) - -(require 'base64) - -(eval-and-compile - (autoload 'open-ssl-stream "ssl") - (autoload 'starttls-open-stream "starttls") - (autoload 'starttls-negotiate "starttls") - (autoload 'rfc2104-hash "rfc2104") - (autoload 'md5 "md5") - (autoload 'utf7-encode "utf7") - (autoload 'utf7-decode "utf7") - (autoload 'format-spec "format-spec") - (autoload 'format-spec-make "format-spec") - ;; Avoid use gnus-point-at-eol so we're independent of Gnus. These - ;; days we have point-at-eol anyhow. - (if (fboundp 'point-at-eol) - (defalias 'imap-point-at-eol 'point-at-eol) - (defun imap-point-at-eol () - (save-excursion - (end-of-line) - (point)))) - (autoload 'sasl-digest-md5-digest-response "sasl")) - -;; User variables. - -(defgroup imap nil - "Low-level IMAP issues." - :version "21.1" - :group 'mail) - -(defcustom imap-kerberos4-program '("imtest -m kerberos_v4 -u %l -p %p %s" - "imtest -kp %s %p") - "List of strings containing commands for Kerberos 4 authentication. -%s is replaced with server hostname, %p with port to connect to, and -%l with the value of `imap-default-user'. The program should accept -IMAP commands on stdin and return responses to stdout. Each entry in -the list is tried until a successful connection is made." - :group 'imap - :type '(repeat string)) - -(defcustom imap-gssapi-program '("imtest -m gssapi -u %l -p %p %s") - "List of strings containing commands for GSSAPI (krb5) authentication. -%s is replaced with server hostname, %p with port to connect to, and -%l with the value of `imap-default-user'. The program should accept -IMAP commands on stdin and return responses to stdout. Each entry in -the list is tried until a successful connection is made." - :group 'imap - :type '(repeat string)) - -(defcustom imap-ssl-program '("openssl s_client -quiet -ssl3 -connect %s:%p" - "openssl s_client -quiet -ssl2 -connect %s:%p" - "s_client -quiet -ssl3 -connect %s:%p" - "s_client -quiet -ssl2 -connect %s:%p") - "A string, or list of strings, containing commands for SSL connections. -Within a string, %s is replaced with the server address and %p with -port number on server. The program should accept IMAP commands on -stdin and return responses to stdout. Each entry in the list is tried -until a successful connection is made." - :group 'imap - :type '(choice string - (repeat string))) - -(defcustom imap-shell-program '("ssh %s imapd" - "rsh %s imapd" - "ssh %g ssh %s imapd" - "rsh %g rsh %s imapd") - "A list of strings, containing commands for IMAP connection. -Within a string, %s is replaced with the server address, %p with port -number on server, %g with `imap-shell-host', and %l with -`imap-default-user'. The program should read IMAP commands from stdin -and write IMAP response to stdout. Each entry in the list is tried -until a successful connection is made." - :group 'imap - :type '(repeat string)) - -(defcustom imap-process-connection-type nil - "*Value for `process-connection-type' to use for Kerberos4 and GSSAPI." - :group 'imap - :type 'boolean) - -(defvar imap-shell-host "gateway" - "Hostname of rlogin proxy.") - -(defvar imap-default-user (user-login-name) - "Default username to use.") - -(defvar imap-error nil - "Error codes from the last command.") - -;; Various variables. - -(defvar imap-fetch-data-hook nil - "Hooks called after receiving each FETCH response.") - -(defvar imap-streams '(gssapi kerberos4 starttls ssl network shell) - "Priority of streams to consider when opening connection to server.") - -(defvar imap-stream-alist - '((gssapi imap-gssapi-stream-p imap-gssapi-open) - (kerberos4 imap-kerberos4-stream-p imap-kerberos4-open) - (ssl imap-ssl-p imap-ssl-open) - (network imap-network-p imap-network-open) - (shell imap-shell-p imap-shell-open) - (starttls imap-starttls-p imap-starttls-open)) - "Definition of network streams. - -\(NAME CHECK OPEN) - -NAME names the stream, CHECK is a function returning non-nil if the -server support the stream and OPEN is a function for opening the -stream.") - -(defvar imap-authenticators '(gssapi - kerberos4 - digest-md5 - cram-md5 - login - anonymous) - "Priority of authenticators to consider when authenticating to server.") - -(defvar imap-authenticator-alist - '((gssapi imap-gssapi-auth-p imap-gssapi-auth) - (kerberos4 imap-kerberos4-auth-p imap-kerberos4-auth) - (cram-md5 imap-cram-md5-p imap-cram-md5-auth) - (login imap-login-p imap-login-auth) - (anonymous imap-anonymous-p imap-anonymous-auth) - (digest-md5 imap-digest-md5-p imap-digest-md5-auth)) - "Definition of authenticators. - -\(NAME CHECK AUTHENTICATE) - -NAME names the authenticator. CHECK is a function returning non-nil if -the server support the authenticator and AUTHENTICATE is a function -for doing the actuall authentification.") - -(defvar imap-use-utf7 t - "If non-nil, do utf7 encoding/decoding of mailbox names. -Since the UTF7 decoding currently only decodes into ISO-8859-1 -characters, you may disable this decoding if you need to access UTF7 -encoded mailboxes which doesn't translate into ISO-8859-1.") - -;; Internal constants. Change theese and die. - -(defconst imap-default-port 143) -(defconst imap-default-ssl-port 993) -(defconst imap-default-stream 'network) -(defconst imap-local-variables '(imap-server - imap-port - imap-client-eol - imap-server-eol - imap-auth - imap-stream - imap-username - imap-password - imap-current-mailbox - imap-current-target-mailbox - imap-message-data - imap-capability - imap-namespace - imap-state - imap-reached-tag - imap-failed-tags - imap-tag - imap-process - imap-calculate-literal-size-first - imap-mailbox-data)) - -;; Internal variables. - -(defvar imap-stream nil) -(defvar imap-auth nil) -(defvar imap-server nil) -(defvar imap-port nil) -(defvar imap-username nil) -(defvar imap-password nil) -(defvar imap-calculate-literal-size-first nil) -(defvar imap-state 'closed - "IMAP state. -Valid states are `closed', `initial', `nonauth', `auth', `selected' -and `examine'.") - -(defvar imap-server-eol "\r\n" - "The EOL string sent from the server.") - -(defvar imap-client-eol "\r\n" - "The EOL string we send to the server.") - -(defvar imap-current-mailbox nil - "Current mailbox name.") - -(defvar imap-current-target-mailbox nil - "Current target mailbox for COPY and APPEND commands.") - -(defvar imap-mailbox-data nil - "Obarray with mailbox data.") - -(defvar imap-mailbox-prime 997 - "Length of imap-mailbox-data.") - -(defvar imap-current-message nil - "Current message number.") - -(defvar imap-message-data nil - "Obarray with message data.") - -(defvar imap-message-prime 997 - "Length of imap-message-data.") - -(defvar imap-capability nil - "Capability for server.") - -(defvar imap-namespace nil - "Namespace for current server.") - -(defvar imap-reached-tag 0 - "Lower limit on command tags that have been parsed.") - -(defvar imap-failed-tags nil - "Alist of tags that failed. -Each element is a list with four elements; tag (a integer), response -state (a symbol, `OK', `NO' or `BAD'), response code (a string), and -human readable response text (a string).") - -(defvar imap-tag 0 - "Command tag number.") - -(defvar imap-process nil - "Process.") - -(defvar imap-continuation nil - "Non-nil indicates that the server emitted a continuation request. -The actually value is really the text on the continuation line.") - -(defvar imap-log nil - "Name of buffer for imap session trace. -For example: (setq imap-log \"*imap-log*\")") - -(defvar imap-debug nil ;"*imap-debug*" - "Name of buffer for random debug spew. -For example: (setq imap-debug \"*imap-debug*\")") - - -;; Utility functions: - -(defun imap-read-passwd (prompt &rest args) - "Read a password using PROMPT. -If ARGS, PROMPT is used as an argument to `format'." - (let ((prompt (if args - (apply 'format prompt args) - prompt))) - (funcall (if (or (fboundp 'read-passwd) - (and (load "subr" t) - (fboundp 'read-passwd)) - (and (load "passwd" t) - (fboundp 'read-passwd))) - 'read-passwd - (autoload 'ange-ftp-read-passwd "ange-ftp") - 'ange-ftp-read-passwd) - prompt))) - -(defsubst imap-utf7-encode (string) - (if imap-use-utf7 - (and string - (condition-case () - (utf7-encode string t) - (error (message - "imap: Could not UTF7 encode `%s', using it unencoded..." - string) - string))) - string)) - -(defsubst imap-utf7-decode (string) - (if imap-use-utf7 - (and string - (condition-case () - (utf7-decode string t) - (error (message - "imap: Could not UTF7 decode `%s', using it undecoded..." - string) - string))) - string)) - -(defsubst imap-ok-p (status) - (if (eq status 'OK) - t - (setq imap-error status) - nil)) - -(defun imap-error-text (&optional buffer) - (with-current-buffer (or buffer (current-buffer)) - (nth 3 (car imap-failed-tags)))) - - -;; Server functions; stream stuff: - -(defun imap-kerberos4-stream-p (buffer) - (imap-capability 'AUTH=KERBEROS_V4 buffer)) - -(defun imap-kerberos4-open (name buffer server port) - (let ((cmds imap-kerberos4-program) - cmd done) - (while (and (not done) (setq cmd (pop cmds))) - (message "Opening Kerberos 4 IMAP connection with `%s'..." cmd) - (erase-buffer) - (let* ((port (or port imap-default-port)) - (process-connection-type imap-process-connection-type) - (process (as-binary-process - (start-process - name buffer shell-file-name shell-command-switch - (format-spec - cmd - (format-spec-make - ?s server - ?p (number-to-string port) - ?l imap-default-user))))) - response) - (when process - (with-current-buffer buffer - (setq imap-client-eol "\n" - imap-calculate-literal-size-first t) - (while (and (memq (process-status process) '(open run)) - (set-buffer buffer) ;; XXX "blue moon" nntp.el bug - (goto-char (point-min)) - ;; cyrus 1.6.x (13? < x <= 22) queries capabilities - (or (while (looking-at "^C:") - (forward-line)) - t) - ;; cyrus 1.6 imtest print "S: " before server greeting - (or (not (looking-at "S: ")) - (forward-char 3) - t) - (not (and (imap-parse-greeting) - ;; success in imtest < 1.6: - (or (re-search-forward - "^__\\(.*\\)__\n" nil t) - ;; success in imtest 1.6: - (re-search-forward - "^\\(Authenticat.*\\)" nil t)) - (setq response (match-string 1))))) - (accept-process-output process 1) - (sit-for 1)) - (and imap-log - (with-current-buffer (get-buffer-create imap-log) - (buffer-disable-undo) - (goto-char (point-max)) - (insert-buffer-substring buffer))) - (erase-buffer) - (message "Opening Kerberos 4 IMAP connection with `%s'...%s" cmd - (if response (concat "done, " response) "failed")) - (if (and response (let ((case-fold-search nil)) - (not (string-match "failed" response)))) - (setq done process) - (if (memq (process-status process) '(open run)) - (imap-send-command-wait "LOGOUT")) - (delete-process process) - nil))))) - done)) - -(defun imap-gssapi-stream-p (buffer) - (imap-capability 'AUTH=GSSAPI buffer)) - -(defun imap-gssapi-open (name buffer server port) - (let ((cmds imap-gssapi-program) - cmd done) - (while (and (not done) (setq cmd (pop cmds))) - (message "Opening GSSAPI IMAP connection with `%s'..." cmd) - (let* ((port (or port imap-default-port)) - (process-connection-type imap-process-connection-type) - (process (as-binary-process - (start-process - name buffer shell-file-name shell-command-switch - (format-spec - cmd - (format-spec-make - ?s server - ?p (number-to-string port) - ?l imap-default-user))))) - response) - (when process - (with-current-buffer buffer - (setq imap-client-eol "\n" - imap-calculate-literal-size-first t) - (while (and (memq (process-status process) '(open run)) - (set-buffer buffer) ;; XXX "blue moon" nntp.el bug - (goto-char (point-min)) - ;; cyrus 1.6.x (13? < x <= 22) queries capabilities - (or (while (looking-at "^C:") - (forward-line)) - t) - ;; cyrus 1.6 imtest print "S: " before server greeting - (or (not (looking-at "S: ")) - (forward-char 3) - t) - (not (and (imap-parse-greeting) - ;; success in imtest 1.6: - (re-search-forward - "^\\(Authenticat.*\\)" nil t) - (setq response (match-string 1))))) - (accept-process-output process 1) - (sit-for 1)) - (and imap-log - (with-current-buffer (get-buffer-create imap-log) - (buffer-disable-undo) - (goto-char (point-max)) - (insert-buffer-substring buffer))) - (erase-buffer) - (message "GSSAPI IMAP connection: %s" (or response "failed")) - (if (and response (let ((case-fold-search nil)) - (not (string-match "failed" response)))) - (setq done process) - (if (memq (process-status process) '(open run)) - (imap-send-command-wait "LOGOUT")) - (delete-process process) - nil))))) - done)) - -(defun imap-ssl-p (buffer) - nil) - -(defun imap-ssl-open (name buffer server port) - "Open a SSL connection to server." - (let ((cmds (if (listp imap-ssl-program) imap-ssl-program - (list imap-ssl-program))) - cmd done) - (ignore-errors (require 'ssl)) - (while (and (not done) (setq cmd (pop cmds))) - (message "imap: Opening SSL connection with `%s'..." cmd) - (let* ((port (or port imap-default-ssl-port)) - (ssl-program-name shell-file-name) - (ssl-program-arguments - (list shell-command-switch - (format-spec cmd (format-spec-make - ?s server - ?p (number-to-string port))))) - process) - (when (setq process - (ignore-errors - (cond ((eq system-type 'windows-nt) - (let (selective-display - (coding-system-for-write 'binary) - (coding-system-for-read 'raw-text-dos) - (output-coding-system 'binary) - (input-coding-system 'raw-text-dos)) - (open-ssl-stream name buffer server port))) - (t - (as-binary-process - (open-ssl-stream name buffer server port)))))) - (with-current-buffer buffer - (goto-char (point-min)) - (while (and (memq (process-status process) '(open run)) - (set-buffer buffer) ;; XXX "blue moon" nntp.el bug - (goto-char (point-max)) - (forward-line -1) - (not (imap-parse-greeting))) - (accept-process-output process 1) - (sit-for 1)) - (and imap-log - (with-current-buffer (get-buffer-create imap-log) - (buffer-disable-undo) - (goto-char (point-max)) - (insert-buffer-substring buffer))) - (erase-buffer) - (when (memq (process-status process) '(open run)) - (setq done process)))))) - (if done - (progn - (message "imap: Opening SSL connection with `%s'...done" cmd) - done) - (message "imap: Opening SSL connection with `%s'...failed" cmd) - nil))) - -(defun imap-network-p (buffer) - t) - -(defun imap-network-open (name buffer server port) - (let* ((port (or port imap-default-port)) - (process (open-network-stream-as-binary name buffer server port))) - (when process - (while (and (memq (process-status process) '(open run)) - (set-buffer buffer) ;; XXX "blue moon" nntp.el bug - (goto-char (point-min)) - (not (imap-parse-greeting))) - (accept-process-output process 1) - (sit-for 1)) - (and imap-log - (with-current-buffer (get-buffer-create imap-log) - (buffer-disable-undo) - (goto-char (point-max)) - (insert-buffer-substring buffer))) - (when (memq (process-status process) '(open run)) - process)))) - -(defun imap-shell-p (buffer) - nil) - -(defun imap-shell-open (name buffer server port) - (let ((cmds imap-shell-program) - cmd done) - (while (and (not done) (setq cmd (pop cmds))) - (message "imap: Opening IMAP connection with `%s'..." cmd) - (setq imap-client-eol "\n") - (let* ((port (or port imap-default-port)) - (process (as-binary-process - (start-process - name buffer shell-file-name shell-command-switch - (format-spec - cmd - (format-spec-make - ?s server - ?g imap-shell-host - ?p (number-to-string port) - ?l imap-default-user)))))) - (when process - (while (and (memq (process-status process) '(open run)) - (set-buffer buffer) ;; XXX "blue moon" nntp.el bug - (goto-char (point-min)) - (not (imap-parse-greeting))) - (accept-process-output process 1) - (sit-for 1)) - (and imap-log - (with-current-buffer (get-buffer-create imap-log) - (buffer-disable-undo) - (goto-char (point-max)) - (insert-buffer-substring buffer))) - (erase-buffer) - (when (memq (process-status process) '(open run)) - (setq done process))))) - (if done - (progn - (message "imap: Opening IMAP connection with `%s'...done" cmd) - done) - (message "imap: Opening IMAP connection with `%s'...failed" cmd) - nil))) - -(defun imap-starttls-p (buffer) - (and (imap-capability 'STARTTLS buffer) - (condition-case () - (progn - (require 'starttls) - (call-process "starttls")) - (error nil)))) - -(defun imap-starttls-open (name buffer server port) - (let* ((port (or port imap-default-port)) - (process (as-binary-process - (starttls-open-stream name buffer server port))) - done) - (message "imap: Connecting with STARTTLS...") - (when process - (while (and (memq (process-status process) '(open run)) - (set-buffer buffer) ;; XXX "blue moon" nntp.el bug - (goto-char (point-min)) - (not (imap-parse-greeting))) - (accept-process-output process 1) - (sit-for 1)) - (and imap-log - (with-current-buffer (get-buffer-create imap-log) - (buffer-disable-undo) - (goto-char (point-max)) - (insert-buffer-substring buffer))) - (let ((imap-process process)) - (unwind-protect - (progn - (set-process-filter imap-process 'imap-arrival-filter) - (when (and (eq imap-stream 'starttls) - (imap-ok-p (imap-send-command-wait "STARTTLS"))) - (starttls-negotiate imap-process))) - (set-process-filter imap-process nil))) - (when (memq (process-status process) '(open run)) - (setq done process))) - (if done - (progn - (message "imap: Connecting with STARTTLS...done") - done) - (message "imap: Connecting with STARTTLS...failed") - nil))) - -;; Server functions; authenticator stuff: - -(defun imap-interactive-login (buffer loginfunc) - "Login to server in BUFFER. -LOGINFUNC is passed a username and a password, it should return t if -it where sucessful authenticating itself to the server, nil otherwise. -Returns t if login was successful, nil otherwise." - (with-current-buffer buffer - (make-local-variable 'imap-username) - (make-local-variable 'imap-password) - (let (user passwd ret) - ;; (condition-case () - (while (or (not user) (not passwd)) - (setq user (or imap-username - (read-from-minibuffer - (concat "IMAP username for " imap-server ": ") - (or user imap-default-user)))) - (setq passwd (or imap-password - (imap-read-passwd - (concat "IMAP password for " user "@" - imap-server ": ")))) - (when (and user passwd) - (if (funcall loginfunc user passwd) - (progn - (setq ret t - imap-username user) - (if (and (not imap-password) - (y-or-n-p "Store password for this session? ")) - (setq imap-password passwd))) - (message "Login failed...") - (setq passwd nil) - (sit-for 1)))) - ;; (quit (with-current-buffer buffer - ;; (setq user nil - ;; passwd nil))) - ;; (error (with-current-buffer buffer - ;; (setq user nil - ;; passwd nil)))) - ret))) - -(defun imap-gssapi-auth-p (buffer) - (and (imap-capability 'AUTH=GSSAPI buffer) - (catch 'imtest-found - (let (prg (prgs imap-gssapi-program)) - (while (setq prg (pop prgs)) - (condition-case () - (and (call-process (substring prg 0 (string-match " " prg))) - (throw 'imtest-found t)) - (error nil))))))) - -(defun imap-gssapi-auth (buffer) - (message "imap: Authenticating using GSSAPI...%s" - (if (eq imap-stream 'gssapi) "done" "failed")) - (eq imap-stream 'gssapi)) - -(defun imap-kerberos4-auth-p (buffer) - (and (imap-capability 'AUTH=KERBEROS_V4 buffer) - (catch 'imtest-found - (let (prg (prgs imap-kerberos4-program)) - (while (setq prg (pop prgs)) - (condition-case () - (and (call-process (substring prg 0 (string-match " " prg))) - (throw 'imtest-found t)) - (error nil))))))) - -(defun imap-kerberos4-auth (buffer) - (message "imap: Authenticating using Kerberos 4...%s" - (if (eq imap-stream 'kerberos4) "done" "failed")) - (eq imap-stream 'kerberos4)) - -(defun imap-cram-md5-p (buffer) - (imap-capability 'AUTH=CRAM-MD5 buffer)) - -(defun imap-cram-md5-auth (buffer) - "Login to server using the AUTH CRAM-MD5 method." - (message "imap: Authenticating using CRAM-MD5...") - (let ((done (imap-interactive-login - buffer - (lambda (user passwd) - (imap-ok-p - (imap-send-command-wait - (list - "AUTHENTICATE CRAM-MD5" - (lambda (challenge) - (let* ((decoded (base64-decode-string challenge)) - (hash-function - (if (and (featurep 'xemacs) - (>= (function-max-args 'md5) 4)) - (lambda (object &optional start end) - (md5 object start end 'binary)) - 'md5)) - (hash (rfc2104-hash hash-function 64 16 - passwd decoded)) - (response (concat user " " hash)) - (encoded (base64-encode-string response))) - encoded))))))))) - (if done - (message "imap: Authenticating using CRAM-MD5...done") - (message "imap: Authenticating using CRAM-MD5...failed")))) - -(defun imap-login-p (buffer) - (and (not (imap-capability 'LOGINDISABLED buffer)) - (not (imap-capability 'X-LOGIN-CMD-DISABLED buffer)))) - -(defun imap-login-auth (buffer) - "Login to server using the LOGIN command." - (message "imap: Plaintext authentication...") - (imap-interactive-login buffer - (lambda (user passwd) - (imap-ok-p (imap-send-command-wait - (concat "LOGIN \"" user "\" \"" - passwd "\"")))))) - -(defun imap-anonymous-p (buffer) - t) - -(defun imap-anonymous-auth (buffer) - (message "imap: Loging in anonymously...") - (with-current-buffer buffer - (imap-ok-p (imap-send-command-wait - (concat "LOGIN anonymous \"" (concat (user-login-name) "@" - (system-name)) "\""))))) - -(defun imap-digest-md5-p (buffer) - (and (imap-capability 'AUTH=DIGEST-MD5 buffer) - (condition-case () - (require 'digest-md5) - (error nil)))) - -(defun imap-digest-md5-auth (buffer) - "Login to server using the AUTH DIGEST-MD5 method." - (message "imap: Authenticating using DIGEST-MD5...") - (imap-interactive-login - buffer - (lambda (user passwd) - (let ((tag - (imap-send-command - (list - "AUTHENTICATE DIGEST-MD5" - (lambda (challenge) - (base64-encode-string - (sasl-digest-md5-digest-response - (base64-decode-string challenge) - user passwd "imap" imap-server) - 'no-line-break)))))) - (if (not (eq (imap-wait-for-tag tag) 'INCOMPLETE)) - nil - (setq imap-continuation nil) - (imap-send-command-1 "") - (imap-ok-p (imap-wait-for-tag tag))))))) - -;; Server functions: - -(defun imap-open-1 (buffer) - (with-current-buffer buffer - (erase-buffer) - (setq imap-current-mailbox nil - imap-current-message nil - imap-state 'initial - imap-process (condition-case () - (funcall (nth 2 (assq imap-stream - imap-stream-alist)) - "imap" buffer imap-server imap-port) - ((error quit) nil))) - (when imap-process - (set-process-filter imap-process 'imap-arrival-filter) - (set-process-sentinel imap-process 'imap-sentinel) - (while (and (eq imap-state 'initial) - (memq (process-status imap-process) '(open run))) - (message "Waiting for response from %s..." imap-server) - (accept-process-output imap-process 1)) - (message "Waiting for response from %s...done" imap-server) - (and (memq (process-status imap-process) '(open run)) - imap-process)))) - -(defun imap-open (server &optional port stream auth buffer) - "Open a IMAP connection to host SERVER at PORT returning a buffer. -If PORT is unspecified, a default value is used (143 except -for SSL which use 993). -STREAM indicates the stream to use, see `imap-streams' for available -streams. If nil, it choices the best stream the server is capable of. -AUTH indicates authenticator to use, see `imap-authenticators' for -available authenticators. If nil, it choices the best stream the -server is capable of. -BUFFER can be a buffer or a name of a buffer, which is created if -necessery. If nil, the buffer name is generated." - (setq buffer (or buffer (format " *imap* %s:%d" server (or port 0)))) - (with-current-buffer (get-buffer-create buffer) - (if (imap-opened buffer) - (imap-close buffer)) - (mapcar 'make-local-variable imap-local-variables) - (set-buffer-multibyte nil) - (buffer-disable-undo) - (setq imap-server (or server imap-server)) - (setq imap-port (or port imap-port)) - (setq imap-auth (or auth imap-auth)) - (setq imap-stream (or stream imap-stream)) - (message "imap: Connecting to %s..." imap-server) - (if (let ((imap-stream (or imap-stream imap-default-stream))) - (imap-open-1 buffer)) - ;; Choose stream. - (let (stream-changed) - (message "imap: Connecting to %s...done" imap-server) - (when (null imap-stream) - (let ((streams imap-streams)) - (while (setq stream (pop streams)) - (if (funcall (nth 1 (assq stream imap-stream-alist)) buffer) - (setq stream-changed (not (eq (or imap-stream - imap-default-stream) - stream)) - imap-stream stream - streams nil))) - (unless imap-stream - (error "Couldn't figure out a stream for server")))) - (when stream-changed - (message "imap: Reconnecting with stream `%s'..." imap-stream) - (imap-close buffer) - (if (imap-open-1 buffer) - (message "imap: Reconnecting with stream `%s'...done" - imap-stream) - (message "imap: Reconnecting with stream `%s'...failed" - imap-stream)) - (setq imap-capability nil)) - (if (imap-opened buffer) - ;; Choose authenticator - (when (and (null imap-auth) (not (eq imap-state 'auth))) - (let ((auths imap-authenticators)) - (while (setq auth (pop auths)) - (if (funcall (nth 1 (assq auth imap-authenticator-alist)) - buffer) - (setq imap-auth auth - auths nil))) - (unless imap-auth - (error "Couldn't figure out authenticator for server")))))) - (message "imap: Connecting to %s...failed" imap-server)) - (when (imap-opened buffer) - (setq imap-mailbox-data (make-vector imap-mailbox-prime 0)) - buffer))) - -(defun imap-opened (&optional buffer) - "Return non-nil if connection to imap server in BUFFER is open. -If BUFFER is nil then the current buffer is used." - (and (setq buffer (get-buffer (or buffer (current-buffer)))) - (buffer-live-p buffer) - (with-current-buffer buffer - (and imap-process - (memq (process-status imap-process) '(open run)))))) - -(defun imap-authenticate (&optional user passwd buffer) - "Authenticate to server in BUFFER, using current buffer if nil. -It uses the authenticator specified when opening the server. If the -authenticator requires username/passwords, they are queried from the -user and optionally stored in the buffer. If USER and/or PASSWD is -specified, the user will not be questioned and the username and/or -password is remembered in the buffer." - (with-current-buffer (or buffer (current-buffer)) - (if (not (eq imap-state 'nonauth)) - (or (eq imap-state 'auth) - (eq imap-state 'select) - (eq imap-state 'examine)) - (make-local-variable 'imap-username) - (make-local-variable 'imap-password) - (if user (setq imap-username user)) - (if passwd (setq imap-password passwd)) - (if (funcall (nth 2 (assq imap-auth imap-authenticator-alist)) buffer) - (setq imap-state 'auth))))) - -(defun imap-close (&optional buffer) - "Close connection to server in BUFFER. -If BUFFER is nil, the current buffer is used." - (with-current-buffer (or buffer (current-buffer)) - (and (imap-opened) - (not (imap-ok-p (imap-send-command-wait "LOGOUT"))) - (message "Server %s didn't let me log out" imap-server)) - (when (and imap-process - (memq (process-status imap-process) '(open run))) - (delete-process imap-process)) - (setq imap-current-mailbox nil - imap-current-message nil - imap-process nil) - (erase-buffer) - t)) - -(defun imap-capability (&optional identifier buffer) - "Return a list of identifiers which server in BUFFER support. -If IDENTIFIER, return non-nil if it's among the servers capabilities. -If BUFFER is nil, the current buffer is assumed." - (with-current-buffer (or buffer (current-buffer)) - (unless imap-capability - (unless (imap-ok-p (imap-send-command-wait "CAPABILITY")) - (setq imap-capability '(IMAP2)))) - (if identifier - (memq (intern (upcase (symbol-name identifier))) imap-capability) - imap-capability))) - -(defun imap-namespace (&optional buffer) - "Return a namespace hierarchy at server in BUFFER. -If BUFFER is nil, the current buffer is assumed." - (with-current-buffer (or buffer (current-buffer)) - (unless imap-namespace - (when (imap-capability 'NAMESPACE) - (imap-send-command-wait "NAMESPACE"))) - imap-namespace)) - -(defun imap-send-command-wait (command &optional buffer) - (imap-wait-for-tag (imap-send-command command buffer) buffer)) - - -;; Mailbox functions: - -(defun imap-mailbox-put (propname value &optional mailbox buffer) - (with-current-buffer (or buffer (current-buffer)) - (if imap-mailbox-data - (put (intern (or mailbox imap-current-mailbox) imap-mailbox-data) - propname value) - (error "Imap-mailbox-data is nil, prop %s value %s mailbox %s buffer %s" - propname value mailbox (current-buffer))) - t)) - -(defsubst imap-mailbox-get-1 (propname &optional mailbox) - (get (intern-soft (or mailbox imap-current-mailbox) imap-mailbox-data) - propname)) - -(defun imap-mailbox-get (propname &optional mailbox buffer) - (let ((mailbox (imap-utf7-encode mailbox))) - (with-current-buffer (or buffer (current-buffer)) - (imap-mailbox-get-1 propname (or mailbox imap-current-mailbox))))) - -(defun imap-mailbox-map-1 (func &optional mailbox-decoder buffer) - (with-current-buffer (or buffer (current-buffer)) - (let (result) - (mapatoms - (lambda (s) - (push (funcall func (if mailbox-decoder - (funcall mailbox-decoder (symbol-name s)) - (symbol-name s))) result)) - imap-mailbox-data) - result))) - -(defun imap-mailbox-map (func &optional buffer) - "Map a function across each mailbox in `imap-mailbox-data', returning a list. -Function should take a mailbox name (a string) as -the only argument." - (imap-mailbox-map-1 func 'imap-utf7-decode buffer)) - -(defun imap-current-mailbox (&optional buffer) - (with-current-buffer (or buffer (current-buffer)) - (imap-utf7-decode imap-current-mailbox))) - -(defun imap-current-mailbox-p-1 (mailbox &optional examine) - (and (string= mailbox imap-current-mailbox) - (or (and examine - (eq imap-state 'examine)) - (and (not examine) - (eq imap-state 'selected))))) - -(defun imap-current-mailbox-p (mailbox &optional examine buffer) - (with-current-buffer (or buffer (current-buffer)) - (imap-current-mailbox-p-1 (imap-utf7-encode mailbox) examine))) - -(defun imap-mailbox-select-1 (mailbox &optional examine) - "Select MAILBOX on server in BUFFER. -If EXAMINE is non-nil, do a read-only select." - (if (imap-current-mailbox-p-1 mailbox examine) - imap-current-mailbox - (setq imap-current-mailbox mailbox) - (if (imap-ok-p (imap-send-command-wait - (concat (if examine "EXAMINE" "SELECT") " \"" - mailbox "\""))) - (progn - (setq imap-message-data (make-vector imap-message-prime 0) - imap-state (if examine 'examine 'selected)) - imap-current-mailbox) - ;; Failed SELECT/EXAMINE unselects current mailbox - (setq imap-current-mailbox nil)))) - -(defun imap-mailbox-select (mailbox &optional examine buffer) - (with-current-buffer (or buffer (current-buffer)) - (imap-utf7-decode - (imap-mailbox-select-1 (imap-utf7-encode mailbox) examine)))) - -(defun imap-mailbox-examine-1 (mailbox &optional buffer) - (with-current-buffer (or buffer (current-buffer)) - (imap-mailbox-select-1 mailbox 'examine))) - -(defun imap-mailbox-examine (mailbox &optional buffer) - "Examine MAILBOX on server in BUFFER." - (imap-mailbox-select mailbox 'examine buffer)) - -(defun imap-mailbox-unselect (&optional buffer) - "Close current folder in BUFFER, without expunging articles." - (with-current-buffer (or buffer (current-buffer)) - (when (or (eq imap-state 'auth) - (and (imap-capability 'UNSELECT) - (imap-ok-p (imap-send-command-wait "UNSELECT"))) - (and (imap-ok-p - (imap-send-command-wait (concat "EXAMINE \"" - imap-current-mailbox - "\""))) - (imap-ok-p (imap-send-command-wait "CLOSE")))) - (setq imap-current-mailbox nil - imap-message-data nil - imap-state 'auth) - t))) - -(defun imap-mailbox-expunge (&optional buffer) - "Expunge articles in current folder in BUFFER. -If BUFFER is nil the current buffer is assumed." - (with-current-buffer (or buffer (current-buffer)) - (when (and imap-current-mailbox (not (eq imap-state 'examine))) - (imap-ok-p (imap-send-command-wait "EXPUNGE"))))) - -(defun imap-mailbox-close (&optional buffer) - "Expunge articles and close current folder in BUFFER. -If BUFFER is nil the current buffer is assumed." - (with-current-buffer (or buffer (current-buffer)) - (when (and imap-current-mailbox - (imap-ok-p (imap-send-command-wait "CLOSE"))) - (setq imap-current-mailbox nil - imap-message-data nil - imap-state 'auth) - t))) - -(defun imap-mailbox-create-1 (mailbox) - (imap-ok-p (imap-send-command-wait (list "CREATE \"" mailbox "\"")))) - -(defun imap-mailbox-create (mailbox &optional buffer) - "Create MAILBOX on server in BUFFER. -If BUFFER is nil the current buffer is assumed." - (with-current-buffer (or buffer (current-buffer)) - (imap-mailbox-create-1 (imap-utf7-encode mailbox)))) - -(defun imap-mailbox-delete (mailbox &optional buffer) - "Delete MAILBOX on server in BUFFER. -If BUFFER is nil the current buffer is assumed." - (let ((mailbox (imap-utf7-encode mailbox))) - (with-current-buffer (or buffer (current-buffer)) - (imap-ok-p - (imap-send-command-wait (list "DELETE \"" mailbox "\"")))))) - -(defun imap-mailbox-rename (oldname newname &optional buffer) - "Rename mailbox OLDNAME to NEWNAME on server in BUFFER. -If BUFFER is nil the current buffer is assumed." - (let ((oldname (imap-utf7-encode oldname)) - (newname (imap-utf7-encode newname))) - (with-current-buffer (or buffer (current-buffer)) - (imap-ok-p - (imap-send-command-wait (list "RENAME \"" oldname "\" " - "\"" newname "\"")))))) - -(defun imap-mailbox-lsub (&optional root reference add-delimiter buffer) - "Return a list of subscribed mailboxes on server in BUFFER. -If ROOT is non-nil, only list matching mailboxes. If ADD-DELIMITER is -non-nil, a hierarchy delimiter is added to root. REFERENCE is a -implementation-specific string that has to be passed to lsub command." - (with-current-buffer (or buffer (current-buffer)) - ;; Make sure we know the hierarchy separator for root's hierarchy - (when (and add-delimiter (null (imap-mailbox-get-1 'delimiter root))) - (imap-send-command-wait (concat "LIST \"" reference "\" \"" - (imap-utf7-encode root) "\""))) - ;; clear list data (NB not delimiter and other stuff) - (imap-mailbox-map-1 (lambda (mailbox) - (imap-mailbox-put 'lsub nil mailbox))) - (when (imap-ok-p - (imap-send-command-wait - (concat "LSUB \"" reference "\" \"" (imap-utf7-encode root) - (and add-delimiter (imap-mailbox-get-1 'delimiter root)) - "%\""))) - (let (out) - (imap-mailbox-map-1 (lambda (mailbox) - (when (imap-mailbox-get-1 'lsub mailbox) - (push (imap-utf7-decode mailbox) out)))) - (nreverse out))))) - -(defun imap-mailbox-list (root &optional reference add-delimiter buffer) - "Return a list of mailboxes matching ROOT on server in BUFFER. -If ADD-DELIMITER is non-nil, a hierarchy delimiter is added to -root. REFERENCE is a implementation-specific string that has to be -passed to list command." - (with-current-buffer (or buffer (current-buffer)) - ;; Make sure we know the hierarchy separator for root's hierarchy - (when (and add-delimiter (null (imap-mailbox-get-1 'delimiter root))) - (imap-send-command-wait (concat "LIST \"" reference "\" \"" - (imap-utf7-encode root) "\""))) - ;; clear list data (NB not delimiter and other stuff) - (imap-mailbox-map-1 (lambda (mailbox) - (imap-mailbox-put 'list nil mailbox))) - (when (imap-ok-p - (imap-send-command-wait - (concat "LIST \"" reference "\" \"" (imap-utf7-encode root) - (and add-delimiter (imap-mailbox-get-1 'delimiter root)) - "%\""))) - (let (out) - (imap-mailbox-map-1 (lambda (mailbox) - (when (imap-mailbox-get-1 'list mailbox) - (push (imap-utf7-decode mailbox) out)))) - (nreverse out))))) - -(defun imap-mailbox-subscribe (mailbox &optional buffer) - "Send the SUBSCRIBE command on the mailbox to server in BUFFER. -Returns non-nil if successful." - (with-current-buffer (or buffer (current-buffer)) - (imap-ok-p (imap-send-command-wait (concat "SUBSCRIBE \"" - (imap-utf7-encode mailbox) - "\""))))) - -(defun imap-mailbox-unsubscribe (mailbox &optional buffer) - "Send the SUBSCRIBE command on the mailbox to server in BUFFER. -Returns non-nil if successful." - (with-current-buffer (or buffer (current-buffer)) - (imap-ok-p (imap-send-command-wait (concat "UNSUBSCRIBE " - (imap-utf7-encode mailbox) - "\""))))) - -(defun imap-mailbox-status (mailbox items &optional buffer) - "Get status items ITEM in MAILBOX from server in BUFFER. -ITEMS can be a symbol or a list of symbols, valid symbols are one of -the STATUS data items -- ie 'messages, 'recent, 'uidnext, 'uidvalidity -or 'unseen. If ITEMS is a list of symbols, a list of values is -returned, if ITEMS is a symbol only it's value is returned." - (with-current-buffer (or buffer (current-buffer)) - (when (imap-ok-p - (imap-send-command-wait (list "STATUS \"" - (imap-utf7-encode mailbox) - "\" " - (format "%s" - (if (listp items) - items - (list items)))))) - (if (listp items) - (mapcar (lambda (item) - (imap-mailbox-get item mailbox)) - items) - (imap-mailbox-get items mailbox))))) - -(defun imap-mailbox-acl-get (&optional mailbox buffer) - "Get ACL on mailbox from server in BUFFER." - (let ((mailbox (imap-utf7-encode mailbox))) - (with-current-buffer (or buffer (current-buffer)) - (when (imap-ok-p - (imap-send-command-wait (list "GETACL \"" - (or mailbox imap-current-mailbox) - "\""))) - (imap-mailbox-get-1 'acl (or mailbox imap-current-mailbox)))))) - -(defun imap-mailbox-acl-set (identifier rights &optional mailbox buffer) - "Change/set ACL for IDENTIFIER to RIGHTS in MAILBOX from server in BUFFER." - (let ((mailbox (imap-utf7-encode mailbox))) - (with-current-buffer (or buffer (current-buffer)) - (imap-ok-p - (imap-send-command-wait (list "SETACL \"" - (or mailbox imap-current-mailbox) - "\" " - identifier - " " - rights)))))) - -(defun imap-mailbox-acl-delete (identifier &optional mailbox buffer) - "Removes any pair for IDENTIFIER in MAILBOX from server in BUFFER." - (let ((mailbox (imap-utf7-encode mailbox))) - (with-current-buffer (or buffer (current-buffer)) - (imap-ok-p - (imap-send-command-wait (list "DELETEACL \"" - (or mailbox imap-current-mailbox) - "\" " - identifier)))))) - - -;; Message functions: - -(defun imap-current-message (&optional buffer) - (with-current-buffer (or buffer (current-buffer)) - imap-current-message)) - -(defun imap-list-to-message-set (list) - (mapconcat (lambda (item) - (number-to-string item)) - (if (listp list) - list - (list list)) - ",")) - -(defun imap-range-to-message-set (range) - (mapconcat - (lambda (item) - (if (consp item) - (format "%d:%d" - (car item) (cdr item)) - (format "%d" item))) - (if (and (listp range) (not (listp (cdr range)))) - (list range) ;; make (1 . 2) into ((1 . 2)) - range) - ",")) - -(defun imap-fetch-asynch (uids props &optional nouidfetch buffer) - (with-current-buffer (or buffer (current-buffer)) - (imap-send-command (format "%sFETCH %s %s" (if nouidfetch "" "UID ") - (if (listp uids) - (imap-list-to-message-set uids) - uids) - props)))) - -(defun imap-fetch (uids props &optional receive nouidfetch buffer) - "Fetch properties PROPS from message set UIDS from server in BUFFER. -UIDS can be a string, number or a list of numbers. If RECEIVE -is non-nil return theese properties." - (with-current-buffer (or buffer (current-buffer)) - (when (imap-ok-p (imap-send-command-wait - (format "%sFETCH %s %s" (if nouidfetch "" "UID ") - (if (listp uids) - (imap-list-to-message-set uids) - uids) - props))) - (if (or (null receive) (stringp uids)) - t - (if (listp uids) - (mapcar (lambda (uid) - (if (listp receive) - (mapcar (lambda (prop) - (imap-message-get uid prop)) - receive) - (imap-message-get uid receive))) - uids) - (imap-message-get uids receive)))))) - -(defun imap-message-put (uid propname value &optional buffer) - (with-current-buffer (or buffer (current-buffer)) - (if imap-message-data - (put (intern (number-to-string uid) imap-message-data) - propname value) - (error "Imap-message-data is nil, uid %s prop %s value %s buffer %s" - uid propname value (current-buffer))) - t)) - -(defun imap-message-get (uid propname &optional buffer) - (with-current-buffer (or buffer (current-buffer)) - (get (intern-soft (number-to-string uid) imap-message-data) - propname))) - -(defun imap-message-map (func propname &optional buffer) - "Map a function across each mailbox in `imap-message-data', returning a list." - (with-current-buffer (or buffer (current-buffer)) - (let (result) - (mapatoms - (lambda (s) - (push (funcall func (get s 'UID) (get s propname)) result)) - imap-message-data) - result))) - -(defmacro imap-message-envelope-date (uid &optional buffer) - `(with-current-buffer (or ,buffer (current-buffer)) - (elt (imap-message-get ,uid 'ENVELOPE) 0))) - -(defmacro imap-message-envelope-subject (uid &optional buffer) - `(with-current-buffer (or ,buffer (current-buffer)) - (elt (imap-message-get ,uid 'ENVELOPE) 1))) - -(defmacro imap-message-envelope-from (uid &optional buffer) - `(with-current-buffer (or ,buffer (current-buffer)) - (elt (imap-message-get ,uid 'ENVELOPE) 2))) - -(defmacro imap-message-envelope-sender (uid &optional buffer) - `(with-current-buffer (or ,buffer (current-buffer)) - (elt (imap-message-get ,uid 'ENVELOPE) 3))) - -(defmacro imap-message-envelope-reply-to (uid &optional buffer) - `(with-current-buffer (or ,buffer (current-buffer)) - (elt (imap-message-get ,uid 'ENVELOPE) 4))) - -(defmacro imap-message-envelope-to (uid &optional buffer) - `(with-current-buffer (or ,buffer (current-buffer)) - (elt (imap-message-get ,uid 'ENVELOPE) 5))) - -(defmacro imap-message-envelope-cc (uid &optional buffer) - `(with-current-buffer (or ,buffer (current-buffer)) - (elt (imap-message-get ,uid 'ENVELOPE) 6))) - -(defmacro imap-message-envelope-bcc (uid &optional buffer) - `(with-current-buffer (or ,buffer (current-buffer)) - (elt (imap-message-get ,uid 'ENVELOPE) 7))) - -(defmacro imap-message-envelope-in-reply-to (uid &optional buffer) - `(with-current-buffer (or ,buffer (current-buffer)) - (elt (imap-message-get ,uid 'ENVELOPE) 8))) - -(defmacro imap-message-envelope-message-id (uid &optional buffer) - `(with-current-buffer (or ,buffer (current-buffer)) - (elt (imap-message-get ,uid 'ENVELOPE) 9))) - -(defmacro imap-message-body (uid &optional buffer) - `(with-current-buffer (or ,buffer (current-buffer)) - (imap-message-get ,uid 'BODY))) - -(defun imap-search (predicate &optional buffer) - (with-current-buffer (or buffer (current-buffer)) - (imap-mailbox-put 'search 'dummy) - (when (imap-ok-p (imap-send-command-wait (concat "UID SEARCH " predicate))) - (if (eq (imap-mailbox-get-1 'search imap-current-mailbox) 'dummy) - (error "Missing SEARCH response to a SEARCH command") - (imap-mailbox-get-1 'search imap-current-mailbox))))) - -(defun imap-message-flag-permanent-p (flag &optional mailbox buffer) - "Return t iff FLAG can be permanently (between IMAP sessions) saved on articles, in MAILBOX on server in BUFFER." - (with-current-buffer (or buffer (current-buffer)) - (or (member "\\*" (imap-mailbox-get 'permanentflags mailbox)) - (member flag (imap-mailbox-get 'permanentflags mailbox))))) - -(defun imap-message-flags-set (articles flags &optional silent buffer) - (when (and articles flags) - (with-current-buffer (or buffer (current-buffer)) - (imap-ok-p (imap-send-command-wait - (concat "UID STORE " articles - " FLAGS" (if silent ".SILENT") " (" flags ")")))))) - -(defun imap-message-flags-del (articles flags &optional silent buffer) - (when (and articles flags) - (with-current-buffer (or buffer (current-buffer)) - (imap-ok-p (imap-send-command-wait - (concat "UID STORE " articles - " -FLAGS" (if silent ".SILENT") " (" flags ")")))))) - -(defun imap-message-flags-add (articles flags &optional silent buffer) - (when (and articles flags) - (with-current-buffer (or buffer (current-buffer)) - (imap-ok-p (imap-send-command-wait - (concat "UID STORE " articles - " +FLAGS" (if silent ".SILENT") " (" flags ")")))))) - -(defun imap-message-copyuid-1 (mailbox) - (if (imap-capability 'UIDPLUS) - (list (nth 0 (imap-mailbox-get-1 'copyuid mailbox)) - (string-to-number (nth 2 (imap-mailbox-get-1 'copyuid mailbox)))) - (let ((old-mailbox imap-current-mailbox) - (state imap-state) - (imap-message-data (make-vector 2 0))) - (when (imap-mailbox-examine-1 mailbox) - (prog1 - (and (imap-fetch "*" "UID") - (list (imap-mailbox-get-1 'uidvalidity mailbox) - (apply 'max (imap-message-map - (lambda (uid prop) uid) 'UID)))) - (if old-mailbox - (imap-mailbox-select old-mailbox (eq state 'examine)) - (imap-mailbox-unselect))))))) - -(defun imap-message-copyuid (mailbox &optional buffer) - (with-current-buffer (or buffer (current-buffer)) - (imap-message-copyuid-1 (imap-utf7-decode mailbox)))) - -(defun imap-message-copy (articles mailbox - &optional dont-create no-copyuid buffer) - "Copy ARTICLES (a string message set) to MAILBOX on server in -BUFFER, creating mailbox if it doesn't exist. If dont-create is -non-nil, it will not create a mailbox. On success, return a list with -the UIDVALIDITY of the mailbox the article(s) was copied to as the -first element, rest of list contain the saved articles' UIDs." - (when articles - (with-current-buffer (or buffer (current-buffer)) - (let ((mailbox (imap-utf7-encode mailbox))) - (if (let ((cmd (concat "UID COPY " articles " \"" mailbox "\"")) - (imap-current-target-mailbox mailbox)) - (if (imap-ok-p (imap-send-command-wait cmd)) - t - (when (and (not dont-create) - ;; removed because of buggy Oracle server - ;; that doesn't send TRYCREATE tags (which - ;; is a MUST according to specifications): - ;;(imap-mailbox-get-1 'trycreate mailbox) - (imap-mailbox-create-1 mailbox)) - (imap-ok-p (imap-send-command-wait cmd))))) - (or no-copyuid - (imap-message-copyuid-1 mailbox))))))) - -(defun imap-message-appenduid-1 (mailbox) - (if (imap-capability 'UIDPLUS) - (imap-mailbox-get-1 'appenduid mailbox) - (let ((old-mailbox imap-current-mailbox) - (state imap-state) - (imap-message-data (make-vector 2 0))) - (when (imap-mailbox-examine-1 mailbox) - (prog1 - (and (imap-fetch "*" "UID") - (list (imap-mailbox-get-1 'uidvalidity mailbox) - (apply 'max (imap-message-map - (lambda (uid prop) uid) 'UID)))) - (if old-mailbox - (imap-mailbox-select old-mailbox (eq state 'examine)) - (imap-mailbox-unselect))))))) - -(defun imap-message-appenduid (mailbox &optional buffer) - (with-current-buffer (or buffer (current-buffer)) - (imap-message-appenduid-1 (imap-utf7-encode mailbox)))) - -(defun imap-message-append (mailbox article &optional flags date-time buffer) - "Append ARTICLE (a buffer) to MAILBOX on server in BUFFER. -FLAGS and DATE-TIME is currently not used. Return a cons holding -uidvalidity of MAILBOX and UID the newly created article got, or nil -on failure." - (let ((mailbox (imap-utf7-encode mailbox))) - (with-current-buffer (or buffer (current-buffer)) - (and (let ((imap-current-target-mailbox mailbox)) - (imap-ok-p - (imap-send-command-wait - (list "APPEND \"" mailbox "\" " article)))) - (imap-message-appenduid-1 mailbox))))) - -(defun imap-body-lines (body) - "Return number of lines in article by looking at the mime bodystructure BODY." - (if (listp body) - (if (stringp (car body)) - (cond ((and (string= (upcase (car body)) "TEXT") - (numberp (nth 7 body))) - (nth 7 body)) - ((and (string= (upcase (car body)) "MESSAGE") - (numberp (nth 9 body))) - (nth 9 body)) - (t 0)) - (apply '+ (mapcar 'imap-body-lines body))) - 0)) - -(defun imap-envelope-from (from) - "Return a from string line." - (and from - (concat (aref from 0) - (if (aref from 0) " <") - (aref from 2) - "@" - (aref from 3) - (if (aref from 0) ">")))) - - -;; Internal functions. - -(defun imap-send-command-1 (cmdstr) - (setq cmdstr (concat cmdstr imap-client-eol)) - (and imap-log - (with-current-buffer (get-buffer-create imap-log) - (buffer-disable-undo) - (goto-char (point-max)) - (insert cmdstr))) - (process-send-string imap-process cmdstr)) - -(defun imap-send-command (command &optional buffer) - (with-current-buffer (or buffer (current-buffer)) - (if (not (listp command)) (setq command (list command))) - (let ((tag (setq imap-tag (1+ imap-tag))) - cmd cmdstr) - (setq cmdstr (concat (number-to-string imap-tag) " ")) - (while (setq cmd (pop command)) - (cond ((stringp cmd) - (setq cmdstr (concat cmdstr cmd))) - ((bufferp cmd) - (let ((eol imap-client-eol) - (calcfirst imap-calculate-literal-size-first) - size) - (with-current-buffer cmd - (if calcfirst - (setq size (buffer-size))) - (when (not (equal eol "\r\n")) - ;; XXX modifies buffer! - (goto-char (point-min)) - (while (search-forward "\r\n" nil t) - (replace-match eol))) - (if (not calcfirst) - (setq size (buffer-size)))) - (setq cmdstr - (concat cmdstr (format "{%d}" size)))) - (unwind-protect - (progn - (imap-send-command-1 cmdstr) - (setq cmdstr nil) - (if (not (eq (imap-wait-for-tag tag) 'INCOMPLETE)) - (setq command nil);; abort command if no cont-req - (let ((process imap-process) - (stream imap-stream) - (eol imap-client-eol)) - (with-current-buffer cmd - (and imap-log - (with-current-buffer (get-buffer-create - imap-log) - (buffer-disable-undo) - (goto-char (point-max)) - (insert-buffer-substring cmd))) - (process-send-region process (point-min) - (point-max))) - (process-send-string process imap-client-eol)))) - (setq imap-continuation nil))) - ((functionp cmd) - (imap-send-command-1 cmdstr) - (setq cmdstr nil) - (unwind-protect - (if (not (eq (imap-wait-for-tag tag) 'INCOMPLETE)) - (setq command nil);; abort command if no cont-req - (setq command (cons (funcall cmd imap-continuation) - command))) - (setq imap-continuation nil))) - (t - (error "Unknown command type")))) - (if cmdstr - (imap-send-command-1 cmdstr)) - tag))) - -(defun imap-wait-for-tag (tag &optional buffer) - (with-current-buffer (or buffer (current-buffer)) - (while (and (null imap-continuation) - (memq (process-status imap-process) '(open run)) - (< imap-reached-tag tag)) - (let ((len (/ (point-max) 1024)) - message-log-max) - (unless (< len 10) - (message "imap read: %dk" len)) - (accept-process-output imap-process 1))) - (message "") - (and (memq (process-status imap-process) '(open run)) - (or (assq tag imap-failed-tags) - (if imap-continuation - 'INCOMPLETE - 'OK))))) - -(defun imap-sentinel (process string) - (delete-process process)) - -(defun imap-find-next-line () - "Return point at end of current line, taking into account literals. -Return nil if no complete line has arrived." - (when (re-search-forward (concat imap-server-eol "\\|{\\([0-9]+\\)}" - imap-server-eol) - nil t) - (if (match-string 1) - (if (< (point-max) (+ (point) (string-to-number (match-string 1)))) - nil - (goto-char (+ (point) (string-to-number (match-string 1)))) - (imap-find-next-line)) - (point)))) - -(defun imap-arrival-filter (proc string) - "IMAP process filter." - (with-current-buffer (process-buffer proc) - (goto-char (point-max)) - (insert string) - (and imap-log - (with-current-buffer (get-buffer-create imap-log) - (buffer-disable-undo) - (goto-char (point-max)) - (insert string))) - (let (end) - (goto-char (point-min)) - (while (setq end (imap-find-next-line)) - (save-restriction - (narrow-to-region (point-min) end) - (delete-backward-char (length imap-server-eol)) - (goto-char (point-min)) - (unwind-protect - (cond ((eq imap-state 'initial) - (imap-parse-greeting)) - ((or (eq imap-state 'auth) - (eq imap-state 'nonauth) - (eq imap-state 'selected) - (eq imap-state 'examine)) - (imap-parse-response)) - (t - (message "Unknown state %s in arrival filter" - imap-state))) - (delete-region (point-min) (point-max)))))))) - - -;; Imap parser. - -(defsubst imap-forward () - (or (eobp) (forward-char))) - -;; number = 1*DIGIT -;; ; Unsigned 32-bit integer -;; ; (0 <= n < 4,294,967,296) - -(defsubst imap-parse-number () - (when (looking-at "[0-9]+") - (prog1 - (string-to-number (match-string 0)) - (goto-char (match-end 0))))) - -;; literal = "{" number "}" CRLF *CHAR8 -;; ; Number represents the number of CHAR8s - -(defsubst imap-parse-literal () - (when (looking-at "{\\([0-9]+\\)}\r\n") - (let ((pos (match-end 0)) - (len (string-to-number (match-string 1)))) - (if (< (point-max) (+ pos len)) - nil - (goto-char (+ pos len)) - (buffer-substring pos (+ pos len)))))) - -;; string = quoted / literal -;; -;; quoted = DQUOTE *QUOTED-CHAR DQUOTE -;; -;; QUOTED-CHAR = / -;; "\" quoted-specials -;; -;; quoted-specials = DQUOTE / "\" -;; -;; TEXT-CHAR = - -(defsubst imap-parse-string () - (cond ((eq (char-after) ?\") - (forward-char 1) - (let ((p (point)) (name "")) - (skip-chars-forward "^\"\\\\") - (setq name (buffer-substring p (point))) - (while (eq (char-after) ?\\) - (setq p (1+ (point))) - (forward-char 2) - (skip-chars-forward "^\"\\\\") - (setq name (concat name (buffer-substring p (point))))) - (forward-char 1) - name)) - ((eq (char-after) ?{) - (imap-parse-literal)))) - -;; nil = "NIL" - -(defsubst imap-parse-nil () - (if (looking-at "NIL") - (goto-char (match-end 0)))) - -;; nstring = string / nil - -(defsubst imap-parse-nstring () - (or (imap-parse-string) - (and (imap-parse-nil) - nil))) - -;; astring = atom / string -;; -;; atom = 1*ATOM-CHAR -;; -;; ATOM-CHAR = -;; -;; atom-specials = "(" / ")" / "{" / SP / CTL / list-wildcards / -;; quoted-specials -;; -;; list-wildcards = "%" / "*" -;; -;; quoted-specials = DQUOTE / "\" - -(defsubst imap-parse-astring () - (or (imap-parse-string) - (buffer-substring (point) - (if (re-search-forward "[(){ \r\n%*\"\\]" nil t) - (goto-char (1- (match-end 0))) - (end-of-line) - (point))))) - -;; address = "(" addr-name SP addr-adl SP addr-mailbox SP -;; addr-host ")" -;; -;; addr-adl = nstring -;; ; Holds route from [RFC-822] route-addr if -;; ; non-NIL -;; -;; addr-host = nstring -;; ; NIL indicates [RFC-822] group syntax. -;; ; Otherwise, holds [RFC-822] domain name -;; -;; addr-mailbox = nstring -;; ; NIL indicates end of [RFC-822] group; if -;; ; non-NIL and addr-host is NIL, holds -;; ; [RFC-822] group name. -;; ; Otherwise, holds [RFC-822] local-part -;; ; after removing [RFC-822] quoting -;; -;; addr-name = nstring -;; ; If non-NIL, holds phrase from [RFC-822] -;; ; mailbox after removing [RFC-822] quoting -;; - -(defsubst imap-parse-address () - (let (address) - (when (eq (char-after) ?\() - (imap-forward) - (setq address (vector (prog1 (imap-parse-nstring) - (imap-forward)) - (prog1 (imap-parse-nstring) - (imap-forward)) - (prog1 (imap-parse-nstring) - (imap-forward)) - (imap-parse-nstring))) - (when (eq (char-after) ?\)) - (imap-forward) - address)))) - -;; address-list = "(" 1*address ")" / nil -;; -;; nil = "NIL" - -(defsubst imap-parse-address-list () - (if (eq (char-after) ?\() - (let (address addresses) - (imap-forward) - (while (and (not (eq (char-after) ?\))) - ;; next line for MS Exchange bug - (progn (and (eq (char-after) ? ) (imap-forward)) t) - (setq address (imap-parse-address))) - (setq addresses (cons address addresses))) - (when (eq (char-after) ?\)) - (imap-forward) - (nreverse addresses))) - (assert (imap-parse-nil) t "In imap-parse-address-list"))) - -;; mailbox = "INBOX" / astring -;; ; INBOX is case-insensitive. All case variants of -;; ; INBOX (e.g. "iNbOx") MUST be interpreted as INBOX -;; ; not as an astring. An astring which consists of -;; ; the case-insensitive sequence "I" "N" "B" "O" "X" -;; ; is considered to be INBOX and not an astring. -;; ; Refer to section 5.1 for further -;; ; semantic details of mailbox names. - -(defsubst imap-parse-mailbox () - (let ((mailbox (imap-parse-astring))) - (if (string-equal "INBOX" (upcase mailbox)) - "INBOX" - mailbox))) - -;; greeting = "*" SP (resp-cond-auth / resp-cond-bye) CRLF -;; -;; resp-cond-auth = ("OK" / "PREAUTH") SP resp-text -;; ; Authentication condition -;; -;; resp-cond-bye = "BYE" SP resp-text - -(defun imap-parse-greeting () - "Parse a IMAP greeting." - (cond ((looking-at "\\* OK ") - (setq imap-state 'nonauth)) - ((looking-at "\\* PREAUTH ") - (setq imap-state 'auth)) - ((looking-at "\\* BYE ") - (setq imap-state 'closed)))) - -;; response = *(continue-req / response-data) response-done -;; -;; continue-req = "+" SP (resp-text / base64) CRLF -;; -;; response-data = "*" SP (resp-cond-state / resp-cond-bye / -;; mailbox-data / message-data / capability-data) CRLF -;; -;; response-done = response-tagged / response-fatal -;; -;; response-fatal = "*" SP resp-cond-bye CRLF -;; ; Server closes connection immediately -;; -;; response-tagged = tag SP resp-cond-state CRLF -;; -;; resp-cond-state = ("OK" / "NO" / "BAD") SP resp-text -;; ; Status condition -;; -;; resp-cond-bye = "BYE" SP resp-text -;; -;; mailbox-data = "FLAGS" SP flag-list / -;; "LIST" SP mailbox-list / -;; "LSUB" SP mailbox-list / -;; "SEARCH" *(SP nz-number) / -;; "STATUS" SP mailbox SP "(" -;; [status-att SP number *(SP status-att SP number)] ")" / -;; number SP "EXISTS" / -;; number SP "RECENT" -;; -;; message-data = nz-number SP ("EXPUNGE" / ("FETCH" SP msg-att)) -;; -;; capability-data = "CAPABILITY" *(SP capability) SP "IMAP4rev1" -;; *(SP capability) -;; ; IMAP4rev1 servers which offer RFC 1730 -;; ; compatibility MUST list "IMAP4" as the first -;; ; capability. - -(defun imap-parse-response () - "Parse a IMAP command response." - (let (token) - (case (setq token (read (current-buffer))) - (+ (setq imap-continuation - (or (buffer-substring (min (point-max) (1+ (point))) - (point-max)) - t))) - (* (case (prog1 (setq token (read (current-buffer))) - (imap-forward)) - (OK (imap-parse-resp-text)) - (NO (imap-parse-resp-text)) - (BAD (imap-parse-resp-text)) - (BYE (imap-parse-resp-text)) - (FLAGS (imap-mailbox-put 'flags (imap-parse-flag-list))) - (LIST (imap-parse-data-list 'list)) - (LSUB (imap-parse-data-list 'lsub)) - (SEARCH (imap-mailbox-put - 'search - (read (concat "(" (buffer-substring (point) (point-max)) ")")))) - (STATUS (imap-parse-status)) - (CAPABILITY (setq imap-capability - (read (concat "(" (upcase (buffer-substring - (point) (point-max))) - ")")))) - (ACL (imap-parse-acl)) - (t (case (prog1 (read (current-buffer)) - (imap-forward)) - (EXISTS (imap-mailbox-put 'exists token)) - (RECENT (imap-mailbox-put 'recent token)) - (EXPUNGE t) - (FETCH (imap-parse-fetch token)) - (t (message "Garbage: %s" (buffer-string))))))) - (t (let (status) - (if (not (integerp token)) - (message "Garbage: %s" (buffer-string)) - (case (prog1 (setq status (read (current-buffer))) - (imap-forward)) - (OK (progn - (setq imap-reached-tag (max imap-reached-tag token)) - (imap-parse-resp-text))) - (NO (progn - (setq imap-reached-tag (max imap-reached-tag token)) - (save-excursion - (imap-parse-resp-text)) - (let (code text) - (when (eq (char-after) ?\[) - (setq code (buffer-substring (point) - (search-forward "]"))) - (imap-forward)) - (setq text (buffer-substring (point) (point-max))) - (push (list token status code text) - imap-failed-tags)))) - (BAD (progn - (setq imap-reached-tag (max imap-reached-tag token)) - (save-excursion - (imap-parse-resp-text)) - (let (code text) - (when (eq (char-after) ?\[) - (setq code (buffer-substring (point) - (search-forward "]"))) - (imap-forward)) - (setq text (buffer-substring (point) (point-max))) - (push (list token status code text) imap-failed-tags) - (error "Internal error, tag %s status %s code %s text %s" - token status code text)))) - (t (message "Garbage: %s" (buffer-string)))))))))) - -;; resp-text = ["[" resp-text-code "]" SP] text -;; -;; text = 1*TEXT-CHAR -;; -;; TEXT-CHAR = - -(defun imap-parse-resp-text () - (imap-parse-resp-text-code)) - -;; resp-text-code = "ALERT" / -;; "BADCHARSET [SP "(" astring *(SP astring) ")" ] / -;; "NEWNAME" SP string SP string / -;; "PARSE" / -;; "PERMANENTFLAGS" SP "(" -;; [flag-perm *(SP flag-perm)] ")" / -;; "READ-ONLY" / -;; "READ-WRITE" / -;; "TRYCREATE" / -;; "UIDNEXT" SP nz-number / -;; "UIDVALIDITY" SP nz-number / -;; "UNSEEN" SP nz-number / -;; resp-text-atom [SP 1*] -;; -;; resp_code_apnd = "APPENDUID" SPACE nz_number SPACE uniqueid -;; -;; resp_code_copy = "COPYUID" SPACE nz_number SPACE set SPACE set -;; -;; set = sequence-num / (sequence-num ":" sequence-num) / -;; (set "," set) -;; ; Identifies a set of messages. For message -;; ; sequence numbers, these are consecutive -;; ; numbers from 1 to the number of messages in -;; ; the mailbox -;; ; Comma delimits individual numbers, colon -;; ; delimits between two numbers inclusive. -;; ; Example: 2,4:7,9,12:* is 2,4,5,6,7,9,12,13, -;; ; 14,15 for a mailbox with 15 messages. -;; -;; sequence-num = nz-number / "*" -;; ; * is the largest number in use. For message -;; ; sequence numbers, it is the number of messages -;; ; in the mailbox. For unique identifiers, it is -;; ; the unique identifier of the last message in -;; ; the mailbox. -;; -;; flag-perm = flag / "\*" -;; -;; flag = "\Answered" / "\Flagged" / "\Deleted" / -;; "\Seen" / "\Draft" / flag-keyword / flag-extension -;; ; Does not include "\Recent" -;; -;; flag-extension = "\" atom -;; ; Future expansion. Client implementations -;; ; MUST accept flag-extension flags. Server -;; ; implementations MUST NOT generate -;; ; flag-extension flags except as defined by -;; ; future standard or standards-track -;; ; revisions of this specification. -;; -;; flag-keyword = atom -;; -;; resp-text-atom = 1* - -(defun imap-parse-resp-text-code () - ;; xxx next line for stalker communigate pro 3.3.1 bug - (when (looking-at " \\[") - (imap-forward)) - (when (eq (char-after) ?\[) - (imap-forward) - (cond ((search-forward "PERMANENTFLAGS " nil t) - (imap-mailbox-put 'permanentflags (imap-parse-flag-list))) - ((search-forward "UIDNEXT " nil t) - (imap-mailbox-put 'uidnext (read (current-buffer)))) - ((search-forward "UNSEEN " nil t) - (imap-mailbox-put 'unseen (read (current-buffer)))) - ((looking-at "UIDVALIDITY \\([0-9]+\\)") - (imap-mailbox-put 'uidvalidity (match-string 1))) - ((search-forward "READ-ONLY" nil t) - (imap-mailbox-put 'read-only t)) - ((search-forward "NEWNAME " nil t) - (let (oldname newname) - (setq oldname (imap-parse-string)) - (imap-forward) - (setq newname (imap-parse-string)) - (imap-mailbox-put 'newname newname oldname))) - ((search-forward "TRYCREATE" nil t) - (imap-mailbox-put 'trycreate t imap-current-target-mailbox)) - ((looking-at "APPENDUID \\([0-9]+\\) \\([0-9]+\\)") - (imap-mailbox-put 'appenduid - (list (match-string 1) - (string-to-number (match-string 2))) - imap-current-target-mailbox)) - ((looking-at "COPYUID \\([0-9]+\\) \\([0-9,:]+\\) \\([0-9,:]+\\)") - (imap-mailbox-put 'copyuid (list (match-string 1) - (match-string 2) - (match-string 3)) - imap-current-target-mailbox)) - ((search-forward "ALERT] " nil t) - (message "Imap server %s information: %s" imap-server - (buffer-substring (point) (point-max))))))) - -;; mailbox-list = "(" [mbx-list-flags] ")" SP -;; (DQUOTE QUOTED-CHAR DQUOTE / nil) SP mailbox -;; -;; mbx-list-flags = *(mbx-list-oflag SP) mbx-list-sflag -;; *(SP mbx-list-oflag) / -;; mbx-list-oflag *(SP mbx-list-oflag) -;; -;; mbx-list-oflag = "\Noinferiors" / flag-extension -;; ; Other flags; multiple possible per LIST response -;; -;; mbx-list-sflag = "\Noselect" / "\Marked" / "\Unmarked" -;; ; Selectability flags; only one per LIST response -;; -;; QUOTED-CHAR = / -;; "\" quoted-specials -;; -;; quoted-specials = DQUOTE / "\" - -(defun imap-parse-data-list (type) - (let (flags delimiter mailbox) - (setq flags (imap-parse-flag-list)) - (when (looking-at " NIL\\| \"\\\\?\\(.\\)\"") - (setq delimiter (match-string 1)) - (goto-char (1+ (match-end 0))) - (when (setq mailbox (imap-parse-mailbox)) - (imap-mailbox-put type t mailbox) - (imap-mailbox-put 'list-flags flags mailbox) - (imap-mailbox-put 'delimiter delimiter mailbox))))) - -;; msg_att ::= "(" 1#("ENVELOPE" SPACE envelope / -;; "FLAGS" SPACE "(" #(flag / "\Recent") ")" / -;; "INTERNALDATE" SPACE date_time / -;; "RFC822" [".HEADER" / ".TEXT"] SPACE nstring / -;; "RFC822.SIZE" SPACE number / -;; "BODY" ["STRUCTURE"] SPACE body / -;; "BODY" section ["<" number ">"] SPACE nstring / -;; "UID" SPACE uniqueid) ")" -;; -;; date_time ::= <"> date_day_fixed "-" date_month "-" date_year -;; SPACE time SPACE zone <"> -;; -;; section ::= "[" [section_text / (nz_number *["." nz_number] -;; ["." (section_text / "MIME")])] "]" -;; -;; section_text ::= "HEADER" / "HEADER.FIELDS" [".NOT"] -;; SPACE header_list / "TEXT" -;; -;; header_fld_name ::= astring -;; -;; header_list ::= "(" 1#header_fld_name ")" - -(defsubst imap-parse-header-list () - (when (eq (char-after) ?\() - (let (strlist) - (while (not (eq (char-after) ?\))) - (imap-forward) - (push (imap-parse-astring) strlist)) - (imap-forward) - (nreverse strlist)))) - -(defsubst imap-parse-fetch-body-section () - (let ((section - (buffer-substring (point) (1- (re-search-forward "[] ]" nil t))))) - (if (eq (char-before) ? ) - (prog1 - (mapconcat 'identity (cons section (imap-parse-header-list)) " ") - (search-forward "]" nil t)) - section))) - -(defun imap-parse-fetch (response) - (when (eq (char-after) ?\() - (let (uid flags envelope internaldate rfc822 rfc822header rfc822text - rfc822size body bodydetail bodystructure) - (while (not (eq (char-after) ?\))) - (imap-forward) - (let ((token (read (current-buffer)))) - (imap-forward) - (cond ((eq token 'UID) - (setq uid (ignore-errors (read (current-buffer))))) - ((eq token 'FLAGS) - (setq flags (imap-parse-flag-list))) - ((eq token 'ENVELOPE) - (setq envelope (imap-parse-envelope))) - ((eq token 'INTERNALDATE) - (setq internaldate (imap-parse-string))) - ((eq token 'RFC822) - (setq rfc822 (imap-parse-nstring))) - ((eq token 'RFC822.HEADER) - (setq rfc822header (imap-parse-nstring))) - ((eq token 'RFC822.TEXT) - (setq rfc822text (imap-parse-nstring))) - ((eq token 'RFC822.SIZE) - (setq rfc822size (read (current-buffer)))) - ((eq token 'BODY) - (if (eq (char-before) ?\[) - (push (list - (upcase (imap-parse-fetch-body-section)) - (and (eq (char-after) ?<) - (buffer-substring (1+ (point)) - (search-forward ">" nil t))) - (progn (imap-forward) - (imap-parse-nstring))) - bodydetail) - (setq body (imap-parse-body)))) - ((eq token 'BODYSTRUCTURE) - (setq bodystructure (imap-parse-body)))))) - (when uid - (setq imap-current-message uid) - (imap-message-put uid 'UID uid) - (and flags (imap-message-put uid 'FLAGS flags)) - (and envelope (imap-message-put uid 'ENVELOPE envelope)) - (and internaldate (imap-message-put uid 'INTERNALDATE internaldate)) - (and rfc822 (imap-message-put uid 'RFC822 rfc822)) - (and rfc822header (imap-message-put uid 'RFC822.HEADER rfc822header)) - (and rfc822text (imap-message-put uid 'RFC822.TEXT rfc822text)) - (and rfc822size (imap-message-put uid 'RFC822.SIZE rfc822size)) - (and body (imap-message-put uid 'BODY body)) - (and bodydetail (imap-message-put uid 'BODYDETAIL bodydetail)) - (and bodystructure (imap-message-put uid 'BODYSTRUCTURE bodystructure)) - (run-hooks 'imap-fetch-data-hook))))) - -;; mailbox-data = ... -;; "STATUS" SP mailbox SP "(" -;; [status-att SP number -;; *(SP status-att SP number)] ")" -;; ... -;; -;; status-att = "MESSAGES" / "RECENT" / "UIDNEXT" / "UIDVALIDITY" / -;; "UNSEEN" - -(defun imap-parse-status () - (let ((mailbox (imap-parse-mailbox))) - (when (and mailbox (search-forward "(" nil t)) - (while (not (eq (char-after) ?\))) - (let ((token (read (current-buffer)))) - (cond ((eq token 'MESSAGES) - (imap-mailbox-put 'messages (read (current-buffer)) mailbox)) - ((eq token 'RECENT) - (imap-mailbox-put 'recent (read (current-buffer)) mailbox)) - ((eq token 'UIDNEXT) - (imap-mailbox-put 'uidnext (read (current-buffer)) mailbox)) - ((eq token 'UIDVALIDITY) - (and (looking-at " \\([0-9]+\\)") - (imap-mailbox-put 'uidvalidity (match-string 1) mailbox) - (goto-char (match-end 1)))) - ((eq token 'UNSEEN) - (imap-mailbox-put 'unseen (read (current-buffer)) mailbox)) - (t - (message "Unknown status data %s in mailbox %s ignored" - token mailbox)))))))) - -;; acl_data ::= "ACL" SPACE mailbox *(SPACE identifier SPACE -;; rights) -;; -;; identifier ::= astring -;; -;; rights ::= astring - -(defun imap-parse-acl () - (let ((mailbox (imap-parse-mailbox)) - identifier rights acl) - (while (eq (char-after) ?\ ) - (imap-forward) - (setq identifier (imap-parse-astring)) - (imap-forward) - (setq rights (imap-parse-astring)) - (setq acl (append acl (list (cons identifier rights))))) - (imap-mailbox-put 'acl acl mailbox))) - -;; flag-list = "(" [flag *(SP flag)] ")" -;; -;; flag = "\Answered" / "\Flagged" / "\Deleted" / -;; "\Seen" / "\Draft" / flag-keyword / flag-extension -;; ; Does not include "\Recent" -;; -;; flag-keyword = atom -;; -;; flag-extension = "\" atom -;; ; Future expansion. Client implementations -;; ; MUST accept flag-extension flags. Server -;; ; implementations MUST NOT generate -;; ; flag-extension flags except as defined by -;; ; future standard or standards-track -;; ; revisions of this specification. - -(defun imap-parse-flag-list () - (let (flag-list start) - (assert (eq (char-after) ?\() t "In imap-parse-flag-list") - (while (and (not (eq (char-after) ?\))) - (setq start (progn - (imap-forward) - ;; next line for Courier IMAP bug. - (skip-chars-forward " ") - (point))) - (> (skip-chars-forward "^ )" (imap-point-at-eol)) 0)) - (push (buffer-substring start (point)) flag-list)) - (assert (eq (char-after) ?\)) t "In imap-parse-flag-list") - (imap-forward) - (nreverse flag-list))) - -;; envelope = "(" env-date SP env-subject SP env-from SP env-sender SP -;; env-reply-to SP env-to SP env-cc SP env-bcc SP -;; env-in-reply-to SP env-message-id ")" -;; -;; env-bcc = "(" 1*address ")" / nil -;; -;; env-cc = "(" 1*address ")" / nil -;; -;; env-date = nstring -;; -;; env-from = "(" 1*address ")" / nil -;; -;; env-in-reply-to = nstring -;; -;; env-message-id = nstring -;; -;; env-reply-to = "(" 1*address ")" / nil -;; -;; env-sender = "(" 1*address ")" / nil -;; -;; env-subject = nstring -;; -;; env-to = "(" 1*address ")" / nil - -(defun imap-parse-envelope () - (when (eq (char-after) ?\() - (imap-forward) - (vector (prog1 (imap-parse-nstring);; date - (imap-forward)) - (prog1 (imap-parse-nstring);; subject - (imap-forward)) - (prog1 (imap-parse-address-list);; from - (imap-forward)) - (prog1 (imap-parse-address-list);; sender - (imap-forward)) - (prog1 (imap-parse-address-list);; reply-to - (imap-forward)) - (prog1 (imap-parse-address-list);; to - (imap-forward)) - (prog1 (imap-parse-address-list);; cc - (imap-forward)) - (prog1 (imap-parse-address-list);; bcc - (imap-forward)) - (prog1 (imap-parse-nstring);; in-reply-to - (imap-forward)) - (prog1 (imap-parse-nstring);; message-id - (imap-forward))))) - -;; body-fld-param = "(" string SP string *(SP string SP string) ")" / nil - -(defsubst imap-parse-string-list () - (cond ((eq (char-after) ?\();; body-fld-param - (let (strlist str) - (imap-forward) - (while (setq str (imap-parse-string)) - (push str strlist) - ;; buggy stalker communigate pro 3.0 doesn't print SPC - ;; between body-fld-param's sometimes - (or (eq (char-after) ?\") - (imap-forward))) - (nreverse strlist))) - ((imap-parse-nil) - nil))) - -;; body-extension = nstring / number / -;; "(" body-extension *(SP body-extension) ")" -;; ; Future expansion. Client implementations -;; ; MUST accept body-extension fields. Server -;; ; implementations MUST NOT generate -;; ; body-extension fields except as defined by -;; ; future standard or standards-track -;; ; revisions of this specification. - -(defun imap-parse-body-extension () - (if (eq (char-after) ?\() - (let (b-e) - (imap-forward) - (push (imap-parse-body-extension) b-e) - (while (eq (char-after) ?\ ) - (imap-forward) - (push (imap-parse-body-extension) b-e)) - (assert (eq (char-after) ?\)) t "In imap-parse-body-extension") - (imap-forward) - (nreverse b-e)) - (or (imap-parse-number) - (imap-parse-nstring)))) - -;; body-ext-1part = body-fld-md5 [SP body-fld-dsp [SP body-fld-lang -;; *(SP body-extension)]] -;; ; MUST NOT be returned on non-extensible -;; ; "BODY" fetch -;; -;; body-ext-mpart = body-fld-param [SP body-fld-dsp [SP body-fld-lang -;; *(SP body-extension)]] -;; ; MUST NOT be returned on non-extensible -;; ; "BODY" fetch - -(defsubst imap-parse-body-ext () - (let (ext) - (when (eq (char-after) ?\ );; body-fld-dsp - (imap-forward) - (let (dsp) - (if (eq (char-after) ?\() - (progn - (imap-forward) - (push (imap-parse-string) dsp) - (imap-forward) - (push (imap-parse-string-list) dsp) - (imap-forward)) - (assert (imap-parse-nil) t "In imap-parse-body-ext")) - (push (nreverse dsp) ext)) - (when (eq (char-after) ?\ );; body-fld-lang - (imap-forward) - (if (eq (char-after) ?\() - (push (imap-parse-string-list) ext) - (push (imap-parse-nstring) ext)) - (while (eq (char-after) ?\ );; body-extension - (imap-forward) - (setq ext (append (imap-parse-body-extension) ext))))) - ext)) - -;; body = "(" body-type-1part / body-type-mpart ")" -;; -;; body-ext-1part = body-fld-md5 [SP body-fld-dsp [SP body-fld-lang -;; *(SP body-extension)]] -;; ; MUST NOT be returned on non-extensible -;; ; "BODY" fetch -;; -;; body-ext-mpart = body-fld-param [SP body-fld-dsp [SP body-fld-lang -;; *(SP body-extension)]] -;; ; MUST NOT be returned on non-extensible -;; ; "BODY" fetch -;; -;; body-fields = body-fld-param SP body-fld-id SP body-fld-desc SP -;; body-fld-enc SP body-fld-octets -;; -;; body-fld-desc = nstring -;; -;; body-fld-dsp = "(" string SP body-fld-param ")" / nil -;; -;; body-fld-enc = (DQUOTE ("7BIT" / "8BIT" / "BINARY" / "BASE64"/ -;; "QUOTED-PRINTABLE") DQUOTE) / string -;; -;; body-fld-id = nstring -;; -;; body-fld-lang = nstring / "(" string *(SP string) ")" -;; -;; body-fld-lines = number -;; -;; body-fld-md5 = nstring -;; -;; body-fld-octets = number -;; -;; body-fld-param = "(" string SP string *(SP string SP string) ")" / nil -;; -;; body-type-1part = (body-type-basic / body-type-msg / body-type-text) -;; [SP body-ext-1part] -;; -;; body-type-basic = media-basic SP body-fields -;; ; MESSAGE subtype MUST NOT be "RFC822" -;; -;; body-type-msg = media-message SP body-fields SP envelope -;; SP body SP body-fld-lines -;; -;; body-type-text = media-text SP body-fields SP body-fld-lines -;; -;; body-type-mpart = 1*body SP media-subtype -;; [SP body-ext-mpart] -;; -;; media-basic = ((DQUOTE ("APPLICATION" / "AUDIO" / "IMAGE" / -;; "MESSAGE" / "VIDEO") DQUOTE) / string) SP media-subtype -;; ; Defined in [MIME-IMT] -;; -;; media-message = DQUOTE "MESSAGE" DQUOTE SP DQUOTE "RFC822" DQUOTE -;; ; Defined in [MIME-IMT] -;; -;; media-subtype = string -;; ; Defined in [MIME-IMT] -;; -;; media-text = DQUOTE "TEXT" DQUOTE SP media-subtype -;; ; Defined in [MIME-IMT] - -(defun imap-parse-body () - (let (body) - (when (eq (char-after) ?\() - (imap-forward) - (if (eq (char-after) ?\() - (let (subbody) - (while (and (eq (char-after) ?\() - (setq subbody (imap-parse-body))) - ;; buggy stalker communigate pro 3.0 insert a SPC between - ;; parts in multiparts - (when (and (eq (char-after) ?\ ) - (eq (char-after (1+ (point))) ?\()) - (imap-forward)) - (push subbody body)) - (imap-forward) - (push (imap-parse-string) body);; media-subtype - (when (eq (char-after) ?\ );; body-ext-mpart: - (imap-forward) - (if (eq (char-after) ?\();; body-fld-param - (push (imap-parse-string-list) body) - (push (and (imap-parse-nil) nil) body)) - (setq body - (append (imap-parse-body-ext) body)));; body-ext-... - (assert (eq (char-after) ?\)) t "In imap-parse-body") - (imap-forward) - (nreverse body)) - - (push (imap-parse-string) body);; media-type - (imap-forward) - (push (imap-parse-string) body);; media-subtype - (imap-forward) - ;; next line for Sun SIMS bug - (and (eq (char-after) ? ) (imap-forward)) - (if (eq (char-after) ?\();; body-fld-param - (push (imap-parse-string-list) body) - (push (and (imap-parse-nil) nil) body)) - (imap-forward) - (push (imap-parse-nstring) body);; body-fld-id - (imap-forward) - (push (imap-parse-nstring) body);; body-fld-desc - (imap-forward) - ;; next `or' for Sun SIMS bug, it regard body-fld-enc as a - ;; nstring and return NIL instead of defaulting back to 7BIT - ;; as the standard says. - (push (or (imap-parse-nstring) "7BIT") body);; body-fld-enc - (imap-forward) - (push (imap-parse-number) body);; body-fld-octets - - ;; ok, we're done parsing the required parts, what comes now is one - ;; of three things: - ;; - ;; envelope (then we're parsing body-type-msg) - ;; body-fld-lines (then we're parsing body-type-text) - ;; body-ext-1part (then we're parsing body-type-basic) - ;; - ;; the problem is that the two first are in turn optionally followed - ;; by the third. So we parse the first two here (if there are any)... - - (when (eq (char-after) ?\ ) - (imap-forward) - (let (lines) - (cond ((eq (char-after) ?\();; body-type-msg: - (push (imap-parse-envelope) body);; envelope - (imap-forward) - (push (imap-parse-body) body);; body - ;; buggy stalker communigate pro 3.0 doesn't print - ;; number of lines in message/rfc822 attachment - (if (eq (char-after) ?\)) - (push 0 body) - (imap-forward) - (push (imap-parse-number) body))) ;; body-fld-lines - ((setq lines (imap-parse-number)) ;; body-type-text: - (push lines body)) ;; body-fld-lines - (t - (backward-char))))) ;; no match... - - ;; ...and then parse the third one here... - - (when (eq (char-after) ?\ );; body-ext-1part: - (imap-forward) - (push (imap-parse-nstring) body);; body-fld-md5 - (setq body (append (imap-parse-body-ext) body)));; body-ext-1part.. - - (assert (eq (char-after) ?\)) t "In imap-parse-body 2") - (imap-forward) - (nreverse body))))) - -(when imap-debug ; (untrace-all) - (require 'trace) - (buffer-disable-undo (get-buffer-create imap-debug)) - (mapcar (lambda (f) (trace-function-background f imap-debug)) - '( - imap-read-passwd - imap-utf7-encode - imap-utf7-decode - imap-error-text - imap-kerberos4s-p - imap-kerberos4-open - imap-ssl-p - imap-ssl-open - imap-network-p - imap-network-open - imap-interactive-login - imap-kerberos4a-p - imap-kerberos4-auth - imap-cram-md5-p - imap-cram-md5-auth - imap-login-p - imap-login-auth - imap-anonymous-p - imap-anonymous-auth - imap-open-1 - imap-open - imap-opened - imap-authenticate - imap-close - imap-capability - imap-namespace - imap-send-command-wait - imap-mailbox-put - imap-mailbox-get - imap-mailbox-map-1 - imap-mailbox-map - imap-current-mailbox - imap-current-mailbox-p-1 - imap-current-mailbox-p - imap-mailbox-select-1 - imap-mailbox-select - imap-mailbox-examine-1 - imap-mailbox-examine - imap-mailbox-unselect - imap-mailbox-expunge - imap-mailbox-close - imap-mailbox-create-1 - imap-mailbox-create - imap-mailbox-delete - imap-mailbox-rename - imap-mailbox-lsub - imap-mailbox-list - imap-mailbox-subscribe - imap-mailbox-unsubscribe - imap-mailbox-status - imap-mailbox-acl-get - imap-mailbox-acl-set - imap-mailbox-acl-delete - imap-current-message - imap-list-to-message-set - imap-fetch-asynch - imap-fetch - imap-message-put - imap-message-get - imap-message-map - imap-search - imap-message-flag-permanent-p - imap-message-flags-set - imap-message-flags-del - imap-message-flags-add - imap-message-copyuid-1 - imap-message-copyuid - imap-message-copy - imap-message-appenduid-1 - imap-message-appenduid - imap-message-append - imap-body-lines - imap-envelope-from - imap-send-command-1 - imap-send-command - imap-wait-for-tag - imap-sentinel - imap-find-next-line - imap-arrival-filter - imap-parse-greeting - imap-parse-response - imap-parse-resp-text - imap-parse-resp-text-code - imap-parse-data-list - imap-parse-fetch - imap-parse-status - imap-parse-acl - imap-parse-flag-list - imap-parse-envelope - imap-parse-body-extension - imap-parse-body - ))) - -(provide 'imap) - -;;; imap.el ends here diff --git a/lisp/lpath.el b/lisp/lpath.el deleted file mode 100644 index bc7257b..0000000 --- a/lisp/lpath.el +++ /dev/null @@ -1,130 +0,0 @@ -;; Shut up. - -(defvar byte-compile-default-warnings) - -(defun maybe-fbind (args) - (while args - (or (fboundp (car args)) - (defalias (car args) 'ignore)) - (setq args (cdr args)))) - -(defun maybe-bind (args) - (mapcar (lambda (var) (unless (boundp var) (set var nil))) args)) - -(maybe-fbind '(babel-fetch - babel-wash create-image decode-coding-string display-graphic-p - bbdb-complete-name - display-time-event-handler - find-image font-create-object gnus-mule-get-coding-system - font-lock-set-defaults - image-size image-type-available-p insert-image - make-temp-file message-xmas-redefine - mail-aliases-setup mm-copy-tree - mule-write-region-no-coding-system put-image - ring-elements - charsetp - coding-system-p - propertize make-mode-line-mouse2-map - make-mode-line-mouse-map - rmail-select-summary rmail-summary-exists rmail-update-summary - sc-cite-regexp set-font-family set-font-size temp-directory - string-as-multibyte - tool-bar-add-item tool-bar-add-item-from-menu - url-view-url vcard-pretty-print - url-insert-file-contents - w3-coding-system-for-mime-charset w3-prepare-buffer w3-region - widget-make-intangible x-defined-colors)) - -(maybe-bind '(adaptive-fill-first-line-regexp - adaptive-fill-regexp babel-history babel-translations - default-enable-multibyte-characters - enable-multibyte-characters - display-time-mail-function imap-password mail-mode-hook - filladapt-mode - mc-pgp-always-sign - gpg-unabbrev-trust-alist - nnoo-definition-alist - current-language-environment - language-info-alist - url-current-callback-func url-be-asynchronous - url-current-callback-data url-working-buffer - url-current-mime-headers w3-meta-charset-content-type-regexp - w3-meta-content-type-charset-regexp)) - -(if (featurep 'xemacs) - (progn - (defvar track-mouse nil) - (maybe-fbind '(char-charset - coding-system-get compute-motion coordinates-in-window-p - delete-overlay easy-menu-create-keymaps - error-message-string event-click-count event-end - event-start facemenu-add-new-face facemenu-get-face - find-charset-region find-coding-systems-for-charsets - find-coding-systems-region find-non-ascii-charset-region - frame-face-alist get-charset-property internal-find-face - internal-next-face-id mail-abbrevs-setup make-char-table - make-face-internal make-face-x-resource-internal - make-overlay mouse-minibuffer-check mouse-movement-p - mouse-scroll-subr overlay-buffer overlay-end - overlay-get overlay-lists overlay-put - overlay-start posn-point posn-window - read-event read-event run-with-idle-timer - set-buffer-multibyte set-char-table-range - set-face-stipple set-frame-face-alist track-mouse - url-retrieve w3-form-encode-xwfu window-at - window-edges x-color-values x-popup-menu browse-url - frame-char-height frame-char-width - xml-parse-region)) - (maybe-bind '(buffer-display-table - buffer-file-coding-system font-lock-defaults - global-face-data gnus-article-x-face-too-ugly - gnus-newsgroup-charset gnus-newsgroup-emphasis-alist - gnus-newsgroup-name mark-active - mouse-selection-click-count - mouse-selection-click-count-buffer - temporary-file-directory transient-mark-mode - url-current-mime-type - user-full-name user-login-name - w3-image-mappings))) - (maybe-bind '(browse-url-browser-function - enable-multibyte-characters help-echo-owns-message)) - (maybe-fbind '(Info-goto-node - add-submenu annotation-glyph annotationp babel-as-string - button-press-event-p characterp color-instance-name - color-instance-rgb-components color-name delete-annotation - device-class device-on-window-system-p device-type - display-error event-glyph event-object event-point - events-to-keys face-doc-string find-face frame-device - frame-property get-popup-menu-response glyph-height - glyph-property glyph-width glyphp make-annotation - make-event - make-color-instance make-extent make-glyph make-gui-button - make-image-specifier map-extents next-command-event - pp-to-string read-color set-extent-property - set-face-doc-string set-glyph-image set-glyph-property - specifier-instance url-generic-parse-url - valid-image-instantiator-format-p w3-do-setup - window-pixel-height window-pixel-width - xml-parse-region))) - -;; T-gnus. -(let ((functions-variables - (cond - ((featurep 'xemacs) - nil) - ((>= emacs-major-version 21) - '((function-max-args smiley-encode-buffer))) - ((boundp 'MULE) - '((coding-system-get - compose-mail file-name-extension find-coding-systems-region - function-max-args get-charset-property shell-command-to-string - smiley-encode-buffer))) - (t - '((function-max-args smiley-encode-buffer)))))) - (maybe-fbind (car functions-variables)) - (maybe-bind (car (cdr functions-variables)))) - -(defun nnkiboze-score-file (a) - ) - -(provide 'lpath) diff --git a/lisp/mail-parse.el b/lisp/mail-parse.el deleted file mode 100644 index 95a3359..0000000 --- a/lisp/mail-parse.el +++ /dev/null @@ -1,71 +0,0 @@ -;;; mail-parse.el --- Interface functions for parsing mail -;; Copyright (C) 1998, 1999, 2000 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;; This file contains wrapper functions for a wide range of mail -;; parsing functions. The idea is that there are low-level libraries -;; that impement according to various specs (RFC2231, DRUMS, USEFOR), -;; but that programmers that want to parse some header (say, -;; Content-Type) will want to use the latest spec. -;; -;; So while each low-level library (rfc2231.el, for instance) decodes -;; faithfully according to that (proposed) standard, this library is -;; the interface library. If some later RFC supersedes RFC2231, one -;; would just have to write a new low-level library, adjust the -;; aliases in this library, and the users and programmers won't notice -;; any changes. - -;;; Code: - -(require 'mail-prsvr) -(require 'ietf-drums) -(require 'rfc2231) -(require 'rfc2047) -(require 'rfc2045) - -(defalias 'mail-header-parse-content-type 'rfc2231-parse-qp-string) -(defalias 'mail-header-parse-content-disposition 'rfc2231-parse-qp-string) -(defalias 'mail-content-type-get 'rfc2231-get-value) -;(defalias 'mail-header-encode-parameter 'rfc2045-encode-string) -(defalias 'mail-header-encode-parameter 'rfc2231-encode-string) - -(defalias 'mail-header-remove-comments 'ietf-drums-remove-comments) -(defalias 'mail-header-remove-whitespace 'ietf-drums-remove-whitespace) -(defalias 'mail-header-strip 'ietf-drums-strip) -(defalias 'mail-header-get-comment 'ietf-drums-get-comment) -(defalias 'mail-header-parse-address 'ietf-drums-parse-address) -(defalias 'mail-header-parse-addresses 'ietf-drums-parse-addresses) -(defalias 'mail-header-parse-date 'ietf-drums-parse-date) -(defalias 'mail-narrow-to-head 'ietf-drums-narrow-to-header) -(defalias 'mail-quote-string 'ietf-drums-quote-string) - -(defalias 'mail-header-narrow-to-field 'rfc2047-narrow-to-field) -(defalias 'mail-encode-encoded-word-region 'rfc2047-encode-region) -(defalias 'mail-encode-encoded-word-buffer 'rfc2047-encode-message-header) -(defalias 'mail-encode-encoded-word-string 'rfc2047-encode-string) -(defalias 'mail-decode-encoded-word-region 'rfc2047-decode-region) -(defalias 'mail-decode-encoded-word-string 'rfc2047-decode-string) - -(provide 'mail-parse) - -;;; mail-parse.el ends here diff --git a/lisp/mail-prsvr.el b/lisp/mail-prsvr.el deleted file mode 100644 index 2566abc..0000000 --- a/lisp/mail-prsvr.el +++ /dev/null @@ -1,44 +0,0 @@ -;;; mail-prsvr.el --- Interface variables for parsing mail -;; Copyright (C) 1999, 2000 Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; Code: - -(defvar mail-parse-charset nil - "Default charset used by low-level libraries. -This variable should never be set. Instead, it should be bound by -functions that wish to call mail-parse functions and let them know -what the desired charset is to be.") - -(defvar mail-parse-mule-charset nil - "Default MULE charset used by low-level libraries. -This variable should never be set.") - -(defvar mail-parse-ignored-charsets nil - "Ignored charsets used by low-level libraries. -This variable should never be set. Instead, it should be bound by -functions that wish to call mail-parse functions and let them know -what the desired charsets is to be ignored.") - -(provide 'mail-prsvr) - -;;; mail-prsvr.el ends here diff --git a/lisp/mail-source.el b/lisp/mail-source.el deleted file mode 100644 index 136704c..0000000 --- a/lisp/mail-source.el +++ /dev/null @@ -1,970 +0,0 @@ -;;; mail-source.el --- functions for fetching mail -;; Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Keywords: news, mail - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; Code: - -(eval-when-compile - (require 'cl) - (require 'imap) - (eval-when-compile (defvar display-time-mail-function))) -(eval-and-compile - (defvar pop3-leave-mail-on-server) - (autoload 'pop3-movemail "pop3") - (autoload 'pop3-get-message-count "pop3") - (autoload 'nnheader-cancel-timer "nnheader") - (autoload 'nnheader-run-at-time "nnheader")) -(require 'format-spec) -(require 'message) ;; for `message-directory' - -(defgroup mail-source nil - "The mail-fetching library." - :version "21.1" - :group 'gnus) - -;; Define these at compile time to avoid dragging in imap always. -(defconst mail-source-imap-authenticators - (eval-when-compile - (mapcar (lambda (a) - (list 'const (car a))) - imap-authenticator-alist))) -(defconst mail-source-imap-streams - (eval-when-compile - (mapcar (lambda (a) - (list 'const (car a))) - imap-stream-alist))) - -(defcustom mail-sources nil - "*Where the mail backends will look for incoming mail. -This variable is a list of mail source specifiers. -See Info node `(gnus)Mail Source Specifiers'." - :group 'mail-source - :type `(repeat - (choice :format "%[Value Menu%] %v" - :value (file) - (cons :tag "Spool file" - (const :format "" file) - (checklist :tag "Options" :greedy t - (group :inline t - (const :format "" :value :path) - file))) - (cons :tag "Several files in a directory" - (const :format "" directory) - (checklist :tag "Options" :greedy t - (group :inline t - (const :format "" :value :path) - (directory :tag "Path")) - (group :inline t - (const :format "" :value :suffix) - (string :tag "Suffix")) - (group :inline t - (const :format "" :value :predicate) - (function :tag "Predicate")) - (group :inline t - (const :format "" :value :prescript) - (string :tag "Prescript")) - (group :inline t - (const :format "" :value :postscript) - (string :tag "Postscript")) - (group :inline t - (const :format "" :value :plugged) - (boolean :tag "Plugged")))) - (cons :tag "POP3 server" - (const :format "" pop) - (checklist :tag "Options" :greedy t - (group :inline t - (const :format "" :value :server) - (string :tag "Server")) - (group :inline t - (const :format "" :value :port) - (choice :tag "Port" - :value "pop3" - (number :format "%v") - (string :format "%v"))) - (group :inline t - (const :format "" :value :user) - (string :tag "User")) - (group :inline t - (const :format "" :value :password) - (string :tag "Password")) - (group :inline t - (const :format "" :value :program) - (string :tag "Program")) - (group :inline t - (const :format "" :value :prescript) - (string :tag "Prescript")) - (group :inline t - (const :format "" :value :postscript) - (string :tag "Postscript")) - (group :inline t - (const :format "" :value :function) - (function :tag "Function")) - (group :inline t - (const :format "" - :value :authentication) - (choice :tag "Authentication" - :value apop - (const password) - (const apop))) - (group :inline t - (const :format "" :value :plugged) - (boolean :tag "Plugged")))) - (cons :tag "Maildir (qmail, postfix...)" - (const :format "" maildir) - (checklist :tag "Options" :greedy t - (group :inline t - (const :format "" :value :path) - (directory :tag "Path")) - (group :inline t - (const :format "" :value :plugged) - (boolean :tag "Plugged")))) - (cons :tag "IMAP server" - (const :format "" imap) - (checklist :tag "Options" :greedy t - (group :inline t - (const :format "" :value :server) - (string :tag "Server")) - (group :inline t - (const :format "" :value :port) - (choice :tag "Port" - :value 143 - number string)) - (group :inline t - (const :format "" :value :user) - (string :tag "User")) - (group :inline t - (const :format "" :value :password) - (string :tag "Password")) - (group :inline t - (const :format "" :value :stream) - (choice :tag "Stream" - :value network - ,@mail-source-imap-streams)) - (group :inline t - (const :format "" :value :program) - (string :tag "Program")) - (group :inline t - (const :format "" - :value :authenticator) - (choice :tag "Authenticator" - :value login - ,@mail-source-imap-authenticators)) - (group :inline t - (const :format "" :value :mailbox) - (string :tag "Mailbox" - :value "INBOX")) - (group :inline t - (const :format "" :value :predicate) - (string :tag "Predicate" - :value "UNSEEN UNDELETED")) - (group :inline t - (const :format "" :value :fetchflag) - (string :tag "Fetchflag" - :value "\\Deleted")) - (group :inline t - (const :format "" - :value :dontexpunge) - (boolean :tag "Dontexpunge")) - (group :inline t - (const :format "" :value :plugged) - (boolean :tag "Plugged")))) - (cons :tag "Webmail server" - (const :format "" webmail) - (checklist :tag "Options" :greedy t - (group :inline t - (const :format "" :value :subtype) - ;; Should be generated from - ;; `webmail-type-definition', but we - ;; can't require webmail without W3. - (choice :tag "Subtype" - :value hotmail - (const hotmail) - (const yahoo) - (const netaddress) - (const netscape) - (const my-deja))) - (group :inline t - (const :format "" :value :user) - (string :tag "User")) - (group :inline t - (const :format "" :value :password) - (string :tag "Password")) - (group :inline t - (const :format "" - :value :dontexpunge) - (boolean :tag "Dontexpunge")) - (group :inline t - (const :format "" :value :plugged) - (boolean :tag "Plugged"))))))) - -(defcustom mail-source-primary-source nil - "*Primary source for incoming mail. -If non-nil, this maildrop will be checked periodically for new mail." - :group 'mail-source - :type 'sexp) - -(defcustom mail-source-flash t - "*If non-nil, flash periodically when mail is available." - :group 'mail-source - :type 'boolean) - -(defcustom mail-source-crash-box "~/.emacs-mail-crash-box" - "File where mail will be stored while processing it." - :group 'mail-source - :type 'file) - -(defcustom mail-source-directory message-directory - "Directory where files (if any) will be stored." - :group 'mail-source - :type 'directory) - -(defcustom mail-source-default-file-modes 384 - "Set the mode bits of all new mail files to this integer." - :group 'mail-source - :type 'integer) - -(defcustom mail-source-delete-incoming nil - "*If non-nil, delete incoming files after handling." - :group 'mail-source - :type 'boolean) - -(defcustom mail-source-incoming-file-prefix "Incoming" - "Prefix for file name for storing incoming mail" - :group 'mail-source - :type 'string) - -(defcustom mail-source-report-new-mail-interval 5 - "Interval in minutes between checks for new mail." - :group 'mail-source - :type 'number) - -(defcustom mail-source-idle-time-delay 5 - "Number of idle seconds to wait before checking for new mail." - :group 'mail-source - :type 'number) - -;;; Internal variables. - -(defvar mail-source-string "" - "A dynamically bound string that says what the current mail source is.") - -(defvar mail-source-new-mail-available nil - "Flag indicating when new mail is available.") - -(eval-and-compile - (defvar mail-source-common-keyword-map - '((:plugged)) - "Mapping from keywords to default values. -Common keywords should be listed here.") - - (defvar mail-source-keyword-map - '((file - (:prescript) - (:prescript-delay) - (:postscript) - (:path (or (getenv "MAIL") - (expand-file-name (user-login-name) rmail-spool-directory)))) - (directory - (:path) - (:suffix ".spool") - (:predicate identity)) - (pop - (:prescript) - (:prescript-delay) - (:postscript) - (:server (getenv "MAILHOST")) - (:port 110) - (:user (or (user-login-name) (getenv "LOGNAME") (getenv "USER"))) - (:program) - (:function) - (:password) - (:connection) - (:authentication password) - (:leave)) - (maildir - (:path (or (getenv "MAILDIR") "~/Maildir/")) - (:subdirs ("new" "cur")) - (:function)) - (imap - (:server (getenv "MAILHOST")) - (:port) - (:stream) - (:program) - (:authentication) - (:user (or (user-login-name) (getenv "LOGNAME") (getenv "USER"))) - (:password) - (:mailbox "INBOX") - (:predicate "UNSEEN UNDELETED") - (:fetchflag "\\Deleted") - (:dontexpunge)) - (webmail - (:subtype hotmail) - (:user (or (user-login-name) (getenv "LOGNAME") (getenv "USER"))) - (:password) - (:dontexpunge) - (:authentication password))) - "Mapping from keywords to default values. -All keywords that can be used must be listed here.")) - -(defvar mail-source-fetcher-alist - '((file mail-source-fetch-file) - (directory mail-source-fetch-directory) - (pop mail-source-fetch-pop) - (maildir mail-source-fetch-maildir) - (imap mail-source-fetch-imap) - (webmail mail-source-fetch-webmail)) - "A mapping from source type to fetcher function.") - -(defvar mail-source-password-cache nil) - -(defvar mail-source-plugged t) - -;;; Functions - -(eval-and-compile - (defun mail-source-strip-keyword (keyword) - "Strip the leading colon off the KEYWORD." - (intern (substring (symbol-name keyword) 1)))) - -(eval-and-compile - (defun mail-source-bind-1 (type) - (let* ((defaults (cdr (assq type mail-source-keyword-map))) - default bind) - (while (setq default (pop defaults)) - (push (list (mail-source-strip-keyword (car default)) - nil) - bind)) - bind))) - -(defmacro mail-source-bind (type-source &rest body) - "Return a `let' form that binds all variables in source TYPE. -TYPE-SOURCE is a list where the first element is the TYPE, and -the second variable is the SOURCE. -At run time, the mail source specifier SOURCE will be inspected, -and the variables will be set according to it. Variables not -specified will be given default values. - -After this is done, BODY will be executed in the scope -of the `let' form. - -The variables bound and their default values are described by -the `mail-source-keyword-map' variable." - `(let ,(mail-source-bind-1 (car type-source)) - (mail-source-set-1 ,(cadr type-source)) - ,@body)) - -(put 'mail-source-bind 'lisp-indent-function 1) -(put 'mail-source-bind 'edebug-form-spec '(form body)) - -(defun mail-source-set-1 (source) - (let* ((type (pop source)) - (defaults (cdr (assq type mail-source-keyword-map))) - default value keyword) - (while (setq default (pop defaults)) - (set (mail-source-strip-keyword (setq keyword (car default))) - (if (setq value (plist-get source keyword)) - (mail-source-value value) - (mail-source-value (cadr default))))))) - -(eval-and-compile - (defun mail-source-bind-common-1 () - (let* ((defaults mail-source-common-keyword-map) - default bind) - (while (setq default (pop defaults)) - (push (list (mail-source-strip-keyword (car default)) - nil) - bind)) - bind))) - -(defun mail-source-set-common-1 (source) - (let* ((type (pop source)) - (defaults mail-source-common-keyword-map) - (defaults-1 (cdr (assq type mail-source-keyword-map))) - default value keyword) - (while (setq default (pop defaults)) - (set (mail-source-strip-keyword (setq keyword (car default))) - (if (setq value (plist-get source keyword)) - (mail-source-value value) - (if (setq value (assq keyword defaults-1)) - (mail-source-value (cadr value)) - (mail-source-value (cadr default)))))))) - -(defmacro mail-source-bind-common (source &rest body) - "Return a `let' form that binds all common variables. -See `mail-source-bind'." - `(let ,(mail-source-bind-common-1) - (mail-source-set-common-1 source) - ,@body)) - -(put 'mail-source-bind-common 'lisp-indent-function 1) -(put 'mail-source-bind-common 'edebug-form-spec '(form body)) - -(defun mail-source-value (value) - "Return the value of VALUE." - (cond - ;; String - ((stringp value) - value) - ;; Function - ((and (listp value) - (functionp (car value))) - (eval value)) - ;; Just return the value. - (t - value))) - -(defun mail-source-fetch (source callback) - "Fetch mail from SOURCE and call CALLBACK zero or more times. -CALLBACK will be called with the name of the file where (some of) -the mail from SOURCE is put. -Return the number of files that were found." - (mail-source-bind-common source - (if (or mail-source-plugged plugged) - (save-excursion - (let ((function (cadr (assq (car source) mail-source-fetcher-alist))) - (found 0)) - (unless function - (error "%S is an invalid mail source specification" source)) - ;; If there's anything in the crash box, we do it first. - (when (file-exists-p mail-source-crash-box) - (message "Processing mail from %s..." mail-source-crash-box) - (setq found (mail-source-callback - callback mail-source-crash-box))) - (+ found - (condition-case err - (funcall function source callback) - (error - (unless (yes-or-no-p - (format "Mail source error (%s). Continue? " err)) - (error "Cannot get new mail")) - 0)))))))) - -(defun mail-source-make-complex-temp-name (prefix) - (let ((newname (make-temp-name prefix)) - (newprefix prefix)) - (while (file-exists-p newname) - (setq newprefix (concat newprefix "x")) - (setq newname (make-temp-name newprefix))) - newname)) - -(defun mail-source-callback (callback info) - "Call CALLBACK on the mail file, and then remove the mail file. -Pass INFO on to CALLBACK." - (if (or (not (file-exists-p mail-source-crash-box)) - (zerop (nth 7 (file-attributes mail-source-crash-box)))) - (progn - (when (file-exists-p mail-source-crash-box) - (delete-file mail-source-crash-box)) - 0) - (prog1 - (funcall callback mail-source-crash-box info) - (when (file-exists-p mail-source-crash-box) - ;; Delete or move the incoming mail out of the way. - (if mail-source-delete-incoming - (delete-file mail-source-crash-box) - (let ((incoming - (mail-source-make-complex-temp-name - (expand-file-name - mail-source-incoming-file-prefix - mail-source-directory)))) - (unless (file-exists-p (file-name-directory incoming)) - (make-directory (file-name-directory incoming) t)) - (rename-file mail-source-crash-box incoming t))))))) - -(defun mail-source-movemail (from to) - "Move FROM to TO using movemail." - (if (not (file-writable-p to)) - (error "Can't write to crash box %s. Not moving mail" to) - (let ((to (file-truename (expand-file-name to))) - errors result) - (setq to (file-truename to) - from (file-truename from)) - ;; Set TO if have not already done so, and rename or copy - ;; the file FROM to TO if and as appropriate. - (cond - ((file-exists-p to) - ;; The crash box exists already. - t) - ((not (file-exists-p from)) - ;; There is no inbox. - (setq to nil)) - ((zerop (nth 7 (file-attributes from))) - ;; Empty file. - (setq to nil)) - (t - ;; If getting from mail spool directory, use movemail to move - ;; rather than just renaming, so as to interlock with the - ;; mailer. - (unwind-protect - (save-excursion - (setq errors (generate-new-buffer " *mail source loss*")) - (let ((default-directory "/")) - (setq result - (apply - 'call-process - (append - (list - (expand-file-name "movemail" exec-directory) - nil errors nil from to))))) - (when (file-exists-p to) - (set-file-modes to mail-source-default-file-modes)) - (if (and (or (not (buffer-modified-p errors)) - (zerop (buffer-size errors))) - (zerop result)) - ;; No output => movemail won. - t - (set-buffer errors) - ;; There may be a warning about older revisions. We - ;; ignore that. - (goto-char (point-min)) - (if (search-forward "older revision" nil t) - t - ;; Probably a real error. - (subst-char-in-region (point-min) (point-max) ?\n ?\ ) - (goto-char (point-max)) - (skip-chars-backward " \t") - (delete-region (point) (point-max)) - (goto-char (point-min)) - (when (looking-at "movemail: ") - (delete-region (point-min) (match-end 0))) - ;; Result may be a signal description string. - (unless (yes-or-no-p - (format "movemail: %s (%s return). Continue? " - (buffer-string) result)) - (error "%s" (buffer-string))) - (setq to nil))))))) - (when (and errors - (buffer-name errors)) - (kill-buffer errors)) - ;; Return whether we moved successfully or not. - to))) - -(defun mail-source-movemail-and-remove (from to) - "Move FROM to TO using movemail, then remove FROM if empty." - (or (not (mail-source-movemail from to)) - (not (zerop (nth 7 (file-attributes from)))) - (delete-file from))) - -(defvar mail-source-read-passwd nil) -(defun mail-source-read-passwd (prompt &rest args) - "Read a password using PROMPT. -If ARGS, PROMPT is used as an argument to `format'." - (let ((prompt - (if args - (apply 'format prompt args) - prompt))) - (unless mail-source-read-passwd - (if (or (fboundp 'read-passwd) (load "passwd" t)) - (setq mail-source-read-passwd 'read-passwd) - (unless (fboundp 'ange-ftp-read-passwd) - (autoload 'ange-ftp-read-passwd "ange-ftp")) - (setq mail-source-read-passwd 'ange-ftp-read-passwd))) - (funcall mail-source-read-passwd prompt))) - -(defun mail-source-fetch-with-program (program) - (zerop (call-process shell-file-name nil nil nil - shell-command-switch program))) - -(defun mail-source-run-script (script spec &optional delay) - (when script - (if (and (symbolp script) (fboundp script)) - (funcall script) - (mail-source-call-script - (format-spec script spec)))) - (when delay - (sleep-for delay))) - -(defun mail-source-call-script (script) - (let ((background nil)) - (when (string-match "& *$" script) - (setq script (substring script 0 (match-beginning 0)) - background 0)) - (call-process shell-file-name nil background nil - shell-command-switch script))) - -;;; -;;; Different fetchers -;;; - -(defun mail-source-fetch-file (source callback) - "Fetcher for single-file sources." - (mail-source-bind (file source) - (mail-source-run-script - prescript (format-spec-make ?t mail-source-crash-box) - prescript-delay) - (let ((mail-source-string (format "file:%s" path))) - (if (mail-source-movemail path mail-source-crash-box) - (prog1 - (mail-source-callback callback path) - (mail-source-run-script - postscript (format-spec-make ?t mail-source-crash-box))) - 0)))) - -(defun mail-source-fetch-directory (source callback) - "Fetcher for directory sources." - (mail-source-bind (directory source) - (let ((found 0) - (mail-source-string (format "directory:%s" path))) - (dolist (file (directory-files - path t (concat (regexp-quote suffix) "$"))) - (when (and (file-regular-p file) - (funcall predicate file) - (mail-source-movemail file mail-source-crash-box)) - (incf found (mail-source-callback callback file)))) - found))) - -(defun mail-source-fetch-pop (source callback) - "Fetcher for single-file sources." - (mail-source-bind (pop source) - (mail-source-run-script - prescript - (format-spec-make ?p password ?t mail-source-crash-box - ?s server ?P port ?u user) - prescript-delay) - (let ((from (format "%s:%s:%s" server user port)) - (mail-source-string (format "pop:%s@%s" user server)) - result) - (when (eq authentication 'password) - (setq password - (or password - (cdr (assoc from mail-source-password-cache)) - (mail-source-read-passwd - (format "Password for %s at %s: " user server))))) - (when server - (setenv "MAILHOST" server)) - (setq result - (cond - (program - (mail-source-fetch-with-program - (format-spec - program - (format-spec-make ?p password ?t mail-source-crash-box - ?s server ?P port ?u user)))) - (function - (funcall function mail-source-crash-box)) - ;; The default is to use pop3.el. - (t - (let ((pop3-password password) - (pop3-maildrop user) - (pop3-mailhost server) - (pop3-port port) - (pop3-authentication-scheme - (if (eq authentication 'apop) 'apop 'pass)) - (pop3-connection-type connection) - (pop3-leave-mail-on-server - (or leave - (and (boundp 'pop3-leave-mail-on-server) - pop3-leave-mail-on-server)))) - (condition-case err - (save-excursion (pop3-movemail mail-source-crash-box)) - (error - ;; We nix out the password in case the error - ;; was because of a wrong password being given. - (setq mail-source-password-cache - (delq (assoc from mail-source-password-cache) - mail-source-password-cache)) - (signal (car err) (cdr err)))))))) - (if result - (progn - (when (eq authentication 'password) - (unless (assoc from mail-source-password-cache) - (push (cons from password) mail-source-password-cache))) - (prog1 - (mail-source-callback callback server) - ;; Update display-time's mail flag, if relevant. - (if (equal source mail-source-primary-source) - (setq mail-source-new-mail-available nil)) - (mail-source-run-script - postscript - (format-spec-make ?p password ?t mail-source-crash-box - ?s server ?P port ?u user)))) - ;; We nix out the password in case the error - ;; was because of a wrong password being given. - (setq mail-source-password-cache - (delq (assoc from mail-source-password-cache) - mail-source-password-cache)) - 0)))) - -(defun mail-source-check-pop (source) - "Check whether there is new mail." - (mail-source-bind (pop source) - (let ((from (format "%s:%s:%s" server user port)) - (mail-source-string (format "pop:%s@%s" user server)) - result) - (when (eq authentication 'password) - (setq password - (or password - (cdr (assoc from mail-source-password-cache)) - (mail-source-read-passwd - (format "Password for %s at %s: " user server)))) - (unless (assoc from mail-source-password-cache) - (push (cons from password) mail-source-password-cache))) - (when server - (setenv "MAILHOST" server)) - (setq result - (cond - ;; No easy way to check whether mail is waiting for these. - (program) - (function) - ;; The default is to use pop3.el. - (t - (let ((pop3-password password) - (pop3-maildrop user) - (pop3-mailhost server) - (pop3-port port) - (pop3-authentication-scheme - (if (eq authentication 'apop) 'apop 'pass))) - (condition-case err - (save-excursion (pop3-get-message-count)) - (error - ;; We nix out the password in case the error - ;; was because of a wrong password being given. - (setq mail-source-password-cache - (delq (assoc from mail-source-password-cache) - mail-source-password-cache)) - (signal (car err) (cdr err)))))))) - (if result - ;; Inform display-time that we have new mail. - (setq mail-source-new-mail-available (> result 0)) - ;; We nix out the password in case the error - ;; was because of a wrong password being given. - (setq mail-source-password-cache - (delq (assoc from mail-source-password-cache) - mail-source-password-cache))) - result))) - -(defun mail-source-new-mail-p () - "Handler for `display-time' to indicate when new mail is available." - ;; Flash (ie. ring the visible bell) if mail is available. - (if (and mail-source-flash mail-source-new-mail-available) - (let ((visible-bell t)) - (ding))) - ;; Only report flag setting; flag is updated on a different schedule. - mail-source-new-mail-available) - - -(defvar mail-source-report-new-mail nil) -(defvar mail-source-report-new-mail-timer nil) -(defvar mail-source-report-new-mail-idle-timer nil) - -(eval-when-compile - (if (featurep 'xemacs) - (require 'itimer) - (require 'timer))) - -(defun mail-source-start-idle-timer () - ;; Start our idle timer if necessary, so we delay the check until the - ;; user isn't typing. - (unless mail-source-report-new-mail-idle-timer - (setq mail-source-report-new-mail-idle-timer - (run-with-idle-timer - mail-source-idle-time-delay - nil - (lambda () - (unwind-protect - (mail-source-check-pop mail-source-primary-source) - (setq mail-source-report-new-mail-idle-timer nil))))) - ;; Since idle timers created when Emacs is already in the idle - ;; state don't get activated until Emacs _next_ becomes idle, we - ;; need to force our timer to be considered active now. We do - ;; this by being naughty and poking the timer internals directly - ;; (element 0 of the vector is nil if the timer is active). - (aset mail-source-report-new-mail-idle-timer 0 nil))) - -(defun mail-source-report-new-mail (arg) - "Toggle whether to report when new mail is available. -This only works when `display-time' is enabled." - (interactive "P") - (if (not mail-source-primary-source) - (error "Need to set `mail-source-primary-source' to check for new mail")) - (let ((on (if (null arg) - (not mail-source-report-new-mail) - (> (prefix-numeric-value arg) 0)))) - (setq mail-source-report-new-mail on) - (and mail-source-report-new-mail-timer - (nnheader-cancel-timer mail-source-report-new-mail-timer)) - (and mail-source-report-new-mail-idle-timer - (nnheader-cancel-timer mail-source-report-new-mail-idle-timer)) - (setq mail-source-report-new-mail-timer nil) - (setq mail-source-report-new-mail-idle-timer nil) - (if on - (progn - (require 'time) - ;; display-time-mail-function is an Emacs 21 feature. - (setq display-time-mail-function #'mail-source-new-mail-p) - ;; Set up the main timer. - (setq mail-source-report-new-mail-timer - (nnheader-run-at-time - (* 60 mail-source-report-new-mail-interval) - (* 60 mail-source-report-new-mail-interval) - #'mail-source-start-idle-timer)) - ;; When you get new mail, clear "Mail" from the mode line. - (add-hook 'nnmail-post-get-new-mail-hook - 'display-time-event-handler) - (message "Mail check enabled")) - (setq display-time-mail-function nil) - (remove-hook 'nnmail-post-get-new-mail-hook - 'display-time-event-handler) - (message "Mail check disabled")))) - -(defun mail-source-fetch-maildir (source callback) - "Fetcher for maildir sources." - (mail-source-bind (maildir source) - (let ((found 0) - mail-source-string) - (unless (string-match "/$" path) - (setq path (concat path "/"))) - (dolist (subdir subdirs) - (when (file-directory-p (concat path subdir)) - (setq mail-source-string (format "maildir:%s%s" path subdir)) - (dolist (file (directory-files (concat path subdir) t)) - (when (and (not (file-directory-p file)) - (not (if function - (funcall function file mail-source-crash-box) - (let ((coding-system-for-write - nnheader-text-coding-system) - (coding-system-for-read - nnheader-text-coding-system) - (output-coding-system - nnheader-text-coding-system) - (input-coding-system - nnheader-text-coding-system)) - (with-temp-file mail-source-crash-box - (insert-file-contents file) - (goto-char (point-min)) -;;; ;; Unix mail format -;;; (unless (looking-at "\n*From ") -;;; (insert "From maildir " -;;; (current-time-string) "\n")) -;;; (while (re-search-forward "^From " nil t) -;;; (replace-match ">From ")) -;;; (goto-char (point-max)) -;;; (insert "\n\n") - ;; MMDF mail format - (insert "\001\001\001\001\n")) - (delete-file file))))) - (incf found (mail-source-callback callback file)))))) - found))) - -(eval-and-compile - (autoload 'imap-open "imap") - (autoload 'imap-authenticate "imap") - (autoload 'imap-mailbox-select "imap") - (autoload 'imap-mailbox-unselect "imap") - (autoload 'imap-mailbox-close "imap") - (autoload 'imap-search "imap") - (autoload 'imap-fetch "imap") - (autoload 'imap-close "imap") - (autoload 'imap-error-text "imap") - (autoload 'imap-message-flags-add "imap") - (autoload 'imap-list-to-message-set "imap") - (autoload 'imap-range-to-message-set "imap")) - -(defvar mail-source-imap-file-coding-system 'binary - "Coding system for the crashbox made by `mail-source-fetch-imap'.") - -(defun mail-source-fetch-imap (source callback) - "Fetcher for imap sources." - (mail-source-bind (imap source) - (let ((from (format "%s:%s:%s" server user port)) - (found 0) - (buf (get-buffer-create - (format " *imap source %s:%s:%s *" server user mailbox))) - (mail-source-string (format "imap:%s:%s" server mailbox)) - (imap-shell-program (or (list program) imap-shell-program)) - remove) - (if (and (imap-open server port stream authentication buf) - (imap-authenticate - user (or (cdr (assoc from mail-source-password-cache)) - password) buf) - (imap-mailbox-select mailbox nil buf)) - (let ((coding-system-for-write mail-source-imap-file-coding-system) - (output-coding-system mail-source-imap-file-coding-system) - str) - (with-temp-file mail-source-crash-box - ;; Avoid converting 8-bit chars from inserted strings to - ;; multibyte. - (set-buffer-multibyte nil) - ;; remember password - (with-current-buffer buf - (when (or imap-password - (assoc from mail-source-password-cache)) - (push (cons from imap-password) mail-source-password-cache))) - ;; if predicate is nil, use all uids - (dolist (uid (imap-search (or predicate "1:*") buf)) - (when (setq str (imap-fetch uid "RFC822.PEEK" 'RFC822 nil buf)) - (push uid remove) - (insert "From imap " (current-time-string) "\n") - (save-excursion - (insert str "\n\n")) - (while (re-search-forward "^From " nil t) - (replace-match ">From ")) - (goto-char (point-max)))) - (nnheader-ms-strip-cr)) - (incf found (mail-source-callback callback server)) - (when (and remove fetchflag) - (imap-message-flags-add - (imap-range-to-message-set (gnus-compress-sequence remove)) - fetchflag nil buf)) - (if dontexpunge - (imap-mailbox-unselect buf) - (imap-mailbox-close buf)) - (imap-close buf)) - (imap-close buf) - ;; We nix out the password in case the error - ;; was because of a wrong password being given. - (setq mail-source-password-cache - (delq (assoc from mail-source-password-cache) - mail-source-password-cache)) - (error (imap-error-text buf))) - (kill-buffer buf) - found))) - -(eval-and-compile - (autoload 'webmail-fetch "webmail")) - -(defun mail-source-fetch-webmail (source callback) - "Fetch for webmail source." - (mail-source-bind (webmail source) - (let ((mail-source-string (format "webmail:%s:%s" subtype user)) - (webmail-newmail-only dontexpunge) - (webmail-move-to-trash-can (not dontexpunge))) - (when (eq authentication 'password) - (setq password - (or password - (cdr (assoc (format "webmail:%s:%s" subtype user) - mail-source-password-cache)) - (mail-source-read-passwd - (format "Password for %s at %s: " user subtype)))) - (when (and password - (not (assoc (format "webmail:%s:%s" subtype user) - mail-source-password-cache))) - (push (cons (format "webmail:%s:%s" subtype user) password) - mail-source-password-cache))) - (webmail-fetch mail-source-crash-box subtype user password) - (mail-source-callback callback (symbol-name subtype))))) - -(provide 'mail-source) - -;;; mail-source.el ends here diff --git a/lisp/mailheader.el b/lisp/mailheader.el deleted file mode 100644 index 796ae75..0000000 --- a/lisp/mailheader.el +++ /dev/null @@ -1,182 +0,0 @@ -;;; mail-header.el --- Mail header parsing, merging, formatting - -;; Copyright (C) 1996 by Free Software Foundation, Inc. - -;; Author: Erik Naggum -;; Keywords: tools, mail, news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;; This package provides an abstraction to RFC822-style messages, used in -;; mail news, and some other systems. The simple syntactic rules for such -;; headers, such as quoting and line folding, are routinely reimplemented -;; in many individual packages. This package removes the need for this -;; redundancy by representing message headers as association lists, -;; offering functions to extract the set of headers from a message, to -;; parse individual headers, to merge sets of headers, and to format a set -;; of headers. - -;; The car of each element in the message-header alist is a symbol whose -;; print name is the name of the header, in all lower-case. The cdr of an -;; element depends on the operation. After extracting headers from a -;; message, it is a string, the value of the header. An extracted set of -;; headers may be parsed further, which may turn it into a list, whose car -;; is the original value and whose subsequent elements depend on the -;; header. For formatting, it is evaluated to obtain the strings to be -;; inserted. For merging, one set of headers consists of strings, while -;; the other set will be evaluated with the symbols in the first set of -;; headers bound to their respective values. - -;;; Code: - -(eval-when-compile (require 'cl)) - -;; Make the byte-compiler shut up. -(defvar headers) - -(defun mail-header-extract () - "Extract headers from current buffer after point. -Returns a header alist, where each element is a cons cell (name . value), -where NAME is a symbol, and VALUE is the string value of the header having -that name." - (let ((message-headers ()) (top (point)) - start end) - (while (and (setq start (point)) - (> (skip-chars-forward "^\0- :") 0) - (eq (char-after) ?:) - (setq end (point)) - (progn (forward-char) - (> (skip-chars-forward " \t") 0))) - (let ((header (intern (downcase (buffer-substring start end)))) - (value (list (buffer-substring - (point) (progn (end-of-line) (point)))))) - (while (progn (forward-char) (> (skip-chars-forward " \t") 0)) - (push (buffer-substring (point) (progn (end-of-line) (point))) - value)) - (push (if (cdr value) - (cons header (mapconcat #'identity (nreverse value) " ")) - (cons header (car value))) - message-headers))) - (goto-char top) - (nreverse message-headers))) - -(defun mail-header-extract-no-properties () - "Extract headers from current buffer after point, without properties. -Returns a header alist, where each element is a cons cell (name . value), -where NAME is a symbol, and VALUE is the string value of the header having -that name." - (mapcar - (lambda (elt) - (set-text-properties 0 (length (cdr elt)) nil (cdr elt)) - elt) - (mail-header-extract))) - -(defun mail-header-parse (parsing-rules headers) - "Apply PARSING-RULES to HEADERS. -PARSING-RULES is an alist whose keys are header names (symbols) and whose -value is a parsing function. The function takes one argument, a string, -and return a list of values, which will destructively replace the value -associated with the key in HEADERS, after being prepended with the original -value." - (dolist (rule parsing-rules) - (let ((header (assq (car rule) headers))) - (when header - (if (consp (cdr header)) - (setf (cddr header) (funcall (cdr rule) (cadr header))) - (setf (cdr header) - (cons (cdr header) (funcall (cdr rule) (cdr header)))))))) - headers) - -(defsubst mail-header (header &optional header-alist) - "Return the value associated with header HEADER in HEADER-ALIST. -If the value is a string, it is the original value of the header. If the -value is a list, its first element is the original value of the header, -with any subsequent elements being the result of parsing the value. -If HEADER-ALIST is nil, the dynamically bound variable `headers' is used." - (cdr (assq header (or header-alist headers)))) - -(defun mail-header-set (header value &optional header-alist) - "Set the value associated with header HEADER to VALUE in HEADER-ALIST. -HEADER-ALIST defaults to the dynamically bound variable `headers' if nil. -See `mail-header' for the semantics of VALUE." - (let* ((alist (or header-alist headers)) - (entry (assq header alist))) - (if entry - (setf (cdr entry) value) - (nconc alist (list (cons header value))))) - value) - -(defsetf mail-header (header &optional header-alist) (value) - `(mail-header-set ,header ,value ,header-alist)) - -(defun mail-header-merge (merge-rules headers) - "Return a new header alist with MERGE-RULES applied to HEADERS. -MERGE-RULES is an alist whose keys are header names (symbols) and whose -values are forms to evaluate, the results of which are the new headers. It -should be a string or a list of string. The first element may be nil to -denote that the formatting functions must use the remaining elements, or -skip the header altogether if there are no other elements. - The macro `mail-header' can be used to access headers in HEADERS." - (mapcar - (lambda (rule) - (cons (car rule) (eval (cdr rule)))) - merge-rules)) - -(defvar mail-header-format-function - (lambda (header value) - "Function to format headers without a specified formatting function." - (insert (capitalize (symbol-name header)) - ": " - (if (consp value) (car value) value) - "\n"))) - -(defun mail-header-format (format-rules headers) - "Use FORMAT-RULES to format HEADERS and insert into current buffer. -FORMAT-RULES is an alist whose keys are header names (symbols), and whose -values are functions that format the header, the results of which are -inserted, unless it is nil. The function takes two arguments, the header -symbol, and the value of that header. If the function itself is nil, the -default action is to insert the value of the header, unless it is nil. -The headers are inserted in the order of the FORMAT-RULES. -A key of t represents any otherwise unmentioned headers. -A key of nil has as its value a list of defaulted headers to ignore." - (let ((ignore (append (cdr (assq nil format-rules)) - (mapcar #'car format-rules)))) - (dolist (rule format-rules) - (let* ((header (car rule)) - (value (mail-header header))) - (cond ((null header) 'ignore) - ((eq header t) - (dolist (defaulted headers) - (unless (memq (car defaulted) ignore) - (let* ((header (car defaulted)) - (value (cdr defaulted))) - (if (cdr rule) - (funcall (cdr rule) header value) - (funcall mail-header-format-function header value)))))) - (value - (if (cdr rule) - (funcall (cdr rule) header value) - (funcall mail-header-format-function header value)))))) - (insert "\n"))) - -(provide 'mailheader) - -;;; mail-header.el ends here diff --git a/lisp/md5.el b/lisp/md5.el deleted file mode 100644 index 2f85d70..0000000 --- a/lisp/md5.el +++ /dev/null @@ -1,413 +0,0 @@ -;;; md5.el -- MD5 Message Digest Algorithm -;;; Gareth Rees - -;; LCD Archive Entry: -;; md5|Gareth Rees|gdr11@cl.cam.ac.uk| -;; MD5 cryptographic message digest algorithm| -;; 13-Nov-95|1.0|~/misc/md5.el.Z| - -;;; Details: ------------------------------------------------------------------ - -;; This is a direct translation into Emacs LISP of the reference C -;; implementation of the MD5 Message-Digest Algorithm written by RSA -;; Data Security, Inc. -;; -;; The algorithm takes a message (that is, a string of bytes) and -;; computes a 16-byte checksum or "digest" for the message. This digest -;; is supposed to be cryptographically strong in the sense that if you -;; are given a 16-byte digest D, then there is no easier way to -;; construct a message whose digest is D than to exhaustively search the -;; space of messages. However, the robustness of the algorithm has not -;; been proven, and a similar algorithm (MD4) was shown to be unsound, -;; so treat with caution! -;; -;; The C algorithm uses 32-bit integers; because GNU Emacs -;; implementations provide 28-bit integers (with 24-bit integers on -;; versions prior to 19.29), the code represents a 32-bit integer as the -;; cons of two 16-bit integers. The most significant word is stored in -;; the car and the least significant in the cdr. The algorithm requires -;; at least 17 bits of integer representation in order to represent the -;; carry from a 16-bit addition. - -;;; Usage: -------------------------------------------------------------------- - -;; To compute the MD5 Message Digest for a message M (represented as a -;; string or as a vector of bytes), call -;; -;; (md5-encode M) -;; -;; which returns the message digest as a vector of 16 bytes. If you -;; need to supply the message in pieces M1, M2, ... Mn, then call -;; -;; (md5-init) -;; (md5-update M1) -;; (md5-update M2) -;; ... -;; (md5-update Mn) -;; (md5-final) - -;;; Copyright and licence: ---------------------------------------------------- - -;; Copyright (C) 1995 by Gareth Rees -;; Derived from the RSA Data Security, Inc. MD5 Message-Digest Algorithm -;; -;; md5.el 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. -;; -;; md5.el 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. -;; -;; The original copyright notice is given below, as required by the -;; licence for the original code. This code is distributed under *both* -;; RSA's original licence and the GNU General Public Licence. (There -;; should be no problems, as the former is more liberal than the -;; latter). - -;;; Original copyright notice: ------------------------------------------------ - -;; Copyright (C) 1990, RSA Data Security, Inc. All rights reserved. -;; -;; License to copy and use this software is granted provided that it is -;; identified as the "RSA Data Security, Inc. MD5 Message- Digest -;; Algorithm" in all material mentioning or referencing this software or -;; this function. -;; -;; License is also granted to make and use derivative works provided -;; that such works are identified as "derived from the RSA Data -;; Security, Inc. MD5 Message-Digest Algorithm" in all material -;; mentioning or referencing the derived work. -;; -;; RSA Data Security, Inc. makes no representations concerning either -;; the merchantability of this software or the suitability of this -;; software for any particular purpose. It is provided "as is" without -;; express or implied warranty of any kind. -;; -;; These notices must be retained in any copies of any part of this -;; documentation and/or software. - -;;; Code: --------------------------------------------------------------------- - -(defvar md5-program "md5sum" - "*Program that reads a message on its standard input and writes an -MD5 digest on its output.") - -(defvar md5-maximum-internal-length 4096 - "*The maximum size of a piece of data that should use the MD5 routines -written in lisp. If a message exceeds this, it will be run through an -external filter for processing. Also see the `md5-program' variable. -This variable has no effect if you call the md5-init|update|final -functions - only used by the `md5' function's simpler interface.") - -(defvar md5-bits (make-vector 4 0) - "Number of bits handled, modulo 2^64. -Represented as four 16-bit numbers, least significant first.") -(defvar md5-buffer (make-vector 4 '(0 . 0)) - "Scratch buffer (four 32-bit integers).") -(defvar md5-input (make-vector 64 0) - "Input buffer (64 bytes).") - -(defun md5-unhex (x) - (if (> x ?9) - (if (>= x ?a) - (+ 10 (- x ?a)) - (+ 10 (- x ?A))) - (- x ?0))) - -(defun md5-encode (message) - "Encodes MESSAGE using the MD5 message digest algorithm. -MESSAGE must be a string or an array of bytes. -Returns a vector of 16 bytes containing the message digest." - (if (<= (length message) md5-maximum-internal-length) - (progn - (md5-init) - (md5-update message) - (md5-final)) - (save-excursion - (set-buffer (get-buffer-create " *md5-work*")) - (erase-buffer) - (insert message) - (call-process-region (point-min) (point-max) - (or shell-file-name "/bin/sh") - t (current-buffer) nil - "-c" md5-program) - ;; MD5 digest is 32 chars long - ;; mddriver adds a newline to make neaten output for tty - ;; viewing, make sure we leave it behind. - (let ((data (buffer-substring (point-min) (+ (point-min) 32))) - (vec (make-vector 16 0)) - (ctr 0)) - (while (< ctr 16) - (aset vec ctr (+ (* 16 (md5-unhex (aref data (* ctr 2)))) - (md5-unhex (aref data (1+ (* ctr 2)))))) - (setq ctr (1+ ctr))))))) - -(defsubst md5-add (x y) - "Return 32-bit sum of 32-bit integers X and Y." - (let ((m (+ (car x) (car y))) - (l (+ (cdr x) (cdr y)))) - (cons (logand 65535 (+ m (lsh l -16))) (logand l 65535)))) - -;; FF, GG, HH and II are basic MD5 functions, providing transformations -;; for rounds 1, 2, 3 and 4 respectively. Each function follows this -;; pattern of computation (where ROTATE(x,y) means rotate 32-bit value x -;; by y bits to the left): -;; -;; FF(a,b,c,d,x,s,ac) = ROTATE(a + F(b,c,d) + x + ac,s) + b -;; -;; so we use the macro `md5-make-step' to construct each one. The -;; helper functions F, G, H and I operate on 16-bit numbers; the full -;; operation splits its inputs, operates on the halves separately and -;; then puts the results together. - -(defsubst md5-F (x y z) (logior (logand x y) (logand (lognot x) z))) -(defsubst md5-G (x y z) (logior (logand x z) (logand y (lognot z)))) -(defsubst md5-H (x y z) (logxor x y z)) -(defsubst md5-I (x y z) (logxor y (logior x (logand 65535 (lognot z))))) - -(defmacro md5-make-step (name func) - (` - (defun (, name) (a b c d x s ac) - (let* - ((m1 (+ (car a) ((, func) (car b) (car c) (car d)) (car x) (car ac))) - (l1 (+ (cdr a) ((, func) (cdr b) (cdr c) (cdr d)) (cdr x) (cdr ac))) - (m2 (logand 65535 (+ m1 (lsh l1 -16)))) - (l2 (logand 65535 l1)) - (m3 (logand 65535 (if (> s 15) - (+ (lsh m2 (- s 32)) (lsh l2 (- s 16))) - (+ (lsh m2 s) (lsh l2 (- s 16)))))) - (l3 (logand 65535 (if (> s 15) - (+ (lsh l2 (- s 32)) (lsh m2 (- s 16))) - (+ (lsh l2 s) (lsh m2 (- s 16))))))) - (md5-add (cons m3 l3) b))))) - -(md5-make-step md5-FF md5-F) -(md5-make-step md5-GG md5-G) -(md5-make-step md5-HH md5-H) -(md5-make-step md5-II md5-I) - -(defun md5-init () - "Initialise the state of the message-digest routines." - (aset md5-bits 0 0) - (aset md5-bits 1 0) - (aset md5-bits 2 0) - (aset md5-bits 3 0) - (aset md5-buffer 0 '(26437 . 8961)) - (aset md5-buffer 1 '(61389 . 43913)) - (aset md5-buffer 2 '(39098 . 56574)) - (aset md5-buffer 3 '( 4146 . 21622))) - -(defun md5-update (string) - "Update the current MD5 state with STRING (an array of bytes)." - (let ((len (length string)) - (i 0) - (j 0)) - (while (< i len) - ;; Compute number of bytes modulo 64 - (setq j (% (/ (aref md5-bits 0) 8) 64)) - - ;; Store this byte (truncating to 8 bits to be sure) - (aset md5-input j (logand 255 (aref string i))) - - ;; Update number of bits by 8 (modulo 2^64) - (let ((c 8) (k 0)) - (while (and (> c 0) (< k 4)) - (let ((b (aref md5-bits k))) - (aset md5-bits k (logand 65535 (+ b c))) - (setq c (if (> b (- 65535 c)) 1 0) - k (1+ k))))) - - ;; Increment number of bytes processed - (setq i (1+ i)) - - ;; When 64 bytes accumulated, pack them into sixteen 32-bit - ;; integers in the array `in' and then tranform them. - (if (= j 63) - (let ((in (make-vector 16 (cons 0 0))) - (k 0) - (kk 0)) - (while (< k 16) - (aset in k (md5-pack md5-input kk)) - (setq k (+ k 1) kk (+ kk 4))) - (md5-transform in)))))) - -(defun md5-pack (array i) - "Pack the four bytes at ARRAY reference I to I+3 into a 32-bit integer." - (cons (+ (lsh (aref array (+ i 3)) 8) (aref array (+ i 2))) - (+ (lsh (aref array (+ i 1)) 8) (aref array (+ i 0))))) - -(defun md5-byte (array n b) - "Unpack byte B (0 to 3) from Nth member of ARRAY of 32-bit integers." - (let ((e (aref array n))) - (cond ((eq b 0) (logand 255 (cdr e))) - ((eq b 1) (lsh (cdr e) -8)) - ((eq b 2) (logand 255 (car e))) - ((eq b 3) (lsh (car e) -8))))) - -(defun md5-final () - (let ((in (make-vector 16 (cons 0 0))) - (j 0) - (digest (make-vector 16 0)) - (padding)) - - ;; Save the number of bits in the message - (aset in 14 (cons (aref md5-bits 1) (aref md5-bits 0))) - (aset in 15 (cons (aref md5-bits 3) (aref md5-bits 2))) - - ;; Compute number of bytes modulo 64 - (setq j (% (/ (aref md5-bits 0) 8) 64)) - - ;; Pad out computation to 56 bytes modulo 64 - (setq padding (make-vector (if (< j 56) (- 56 j) (- 120 j)) 0)) - (aset padding 0 128) - (md5-update padding) - - ;; Append length in bits and transform - (let ((k 0) (kk 0)) - (while (< k 14) - (aset in k (md5-pack md5-input kk)) - (setq k (+ k 1) kk (+ kk 4)))) - (md5-transform in) - - ;; Store the results in the digest - (let ((k 0) (kk 0)) - (while (< k 4) - (aset digest (+ kk 0) (md5-byte md5-buffer k 0)) - (aset digest (+ kk 1) (md5-byte md5-buffer k 1)) - (aset digest (+ kk 2) (md5-byte md5-buffer k 2)) - (aset digest (+ kk 3) (md5-byte md5-buffer k 3)) - (setq k (+ k 1) kk (+ kk 4)))) - - ;; Return digest - digest)) - -;; It says in the RSA source, "Note that if the Mysterious Constants are -;; arranged backwards in little-endian order and decrypted with the DES -;; they produce OCCULT MESSAGES!" Security through obscurity? - -(defun md5-transform (in) - "Basic MD5 step. Transform md5-buffer based on array IN." - (let ((a (aref md5-buffer 0)) - (b (aref md5-buffer 1)) - (c (aref md5-buffer 2)) - (d (aref md5-buffer 3))) - (setq - a (md5-FF a b c d (aref in 0) 7 '(55146 . 42104)) - d (md5-FF d a b c (aref in 1) 12 '(59591 . 46934)) - c (md5-FF c d a b (aref in 2) 17 '( 9248 . 28891)) - b (md5-FF b c d a (aref in 3) 22 '(49597 . 52974)) - a (md5-FF a b c d (aref in 4) 7 '(62844 . 4015)) - d (md5-FF d a b c (aref in 5) 12 '(18311 . 50730)) - c (md5-FF c d a b (aref in 6) 17 '(43056 . 17939)) - b (md5-FF b c d a (aref in 7) 22 '(64838 . 38145)) - a (md5-FF a b c d (aref in 8) 7 '(27008 . 39128)) - d (md5-FF d a b c (aref in 9) 12 '(35652 . 63407)) - c (md5-FF c d a b (aref in 10) 17 '(65535 . 23473)) - b (md5-FF b c d a (aref in 11) 22 '(35164 . 55230)) - a (md5-FF a b c d (aref in 12) 7 '(27536 . 4386)) - d (md5-FF d a b c (aref in 13) 12 '(64920 . 29075)) - c (md5-FF c d a b (aref in 14) 17 '(42617 . 17294)) - b (md5-FF b c d a (aref in 15) 22 '(18868 . 2081)) - a (md5-GG a b c d (aref in 1) 5 '(63006 . 9570)) - d (md5-GG d a b c (aref in 6) 9 '(49216 . 45888)) - c (md5-GG c d a b (aref in 11) 14 '( 9822 . 23121)) - b (md5-GG b c d a (aref in 0) 20 '(59830 . 51114)) - a (md5-GG a b c d (aref in 5) 5 '(54831 . 4189)) - d (md5-GG d a b c (aref in 10) 9 '( 580 . 5203)) - c (md5-GG c d a b (aref in 15) 14 '(55457 . 59009)) - b (md5-GG b c d a (aref in 4) 20 '(59347 . 64456)) - a (md5-GG a b c d (aref in 9) 5 '( 8673 . 52710)) - d (md5-GG d a b c (aref in 14) 9 '(49975 . 2006)) - c (md5-GG c d a b (aref in 3) 14 '(62677 . 3463)) - b (md5-GG b c d a (aref in 8) 20 '(17754 . 5357)) - a (md5-GG a b c d (aref in 13) 5 '(43491 . 59653)) - d (md5-GG d a b c (aref in 2) 9 '(64751 . 41976)) - c (md5-GG c d a b (aref in 7) 14 '(26479 . 729)) - b (md5-GG b c d a (aref in 12) 20 '(36138 . 19594)) - a (md5-HH a b c d (aref in 5) 4 '(65530 . 14658)) - d (md5-HH d a b c (aref in 8) 11 '(34673 . 63105)) - c (md5-HH c d a b (aref in 11) 16 '(28061 . 24866)) - b (md5-HH b c d a (aref in 14) 23 '(64997 . 14348)) - a (md5-HH a b c d (aref in 1) 4 '(42174 . 59972)) - d (md5-HH d a b c (aref in 4) 11 '(19422 . 53161)) - c (md5-HH c d a b (aref in 7) 16 '(63163 . 19296)) - b (md5-HH b c d a (aref in 10) 23 '(48831 . 48240)) - a (md5-HH a b c d (aref in 13) 4 '(10395 . 32454)) - d (md5-HH d a b c (aref in 0) 11 '(60065 . 10234)) - c (md5-HH c d a b (aref in 3) 16 '(54511 . 12421)) - b (md5-HH b c d a (aref in 6) 23 '( 1160 . 7429)) - a (md5-HH a b c d (aref in 9) 4 '(55764 . 53305)) - d (md5-HH d a b c (aref in 12) 11 '(59099 . 39397)) - c (md5-HH c d a b (aref in 15) 16 '( 8098 . 31992)) - b (md5-HH b c d a (aref in 2) 23 '(50348 . 22117)) - a (md5-II a b c d (aref in 0) 6 '(62505 . 8772)) - d (md5-II d a b c (aref in 7) 10 '(17194 . 65431)) - c (md5-II c d a b (aref in 14) 15 '(43924 . 9127)) - b (md5-II b c d a (aref in 5) 21 '(64659 . 41017)) - a (md5-II a b c d (aref in 12) 6 '(25947 . 22979)) - d (md5-II d a b c (aref in 3) 10 '(36620 . 52370)) - c (md5-II c d a b (aref in 10) 15 '(65519 . 62589)) - b (md5-II b c d a (aref in 1) 21 '(34180 . 24017)) - a (md5-II a b c d (aref in 8) 6 '(28584 . 32335)) - d (md5-II d a b c (aref in 15) 10 '(65068 . 59104)) - c (md5-II c d a b (aref in 6) 15 '(41729 . 17172)) - b (md5-II b c d a (aref in 13) 21 '(19976 . 4513)) - a (md5-II a b c d (aref in 4) 6 '(63315 . 32386)) - d (md5-II d a b c (aref in 11) 10 '(48442 . 62005)) - c (md5-II c d a b (aref in 2) 15 '(10967 . 53947)) - b (md5-II b c d a (aref in 9) 21 '(60294 . 54161))) - - (aset md5-buffer 0 (md5-add (aref md5-buffer 0) a)) - (aset md5-buffer 1 (md5-add (aref md5-buffer 1) b)) - (aset md5-buffer 2 (md5-add (aref md5-buffer 2) c)) - (aset md5-buffer 3 (md5-add (aref md5-buffer 3) d)))) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; Here begins the merger with the XEmacs API and the md5.el from the URL -;;; package. Courtesy wmperry@spry.com -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(defun md5 (object &optional start end coding noerror) - "Return the MD5 (a secure message digest algorithm) of an object. -OBJECT is either a string or a buffer. -Optional arguments START and END denote buffer positions for computing the -hash of a portion of OBJECT. - -The optional CODING and NOERROR arguments are ignored. They are no -more than placeholders to ensure the compatibility with XEmacsen with -file-coding or Mule support." - (let ((buffer nil)) - (unwind-protect - (save-excursion - (setq buffer (generate-new-buffer " *md5-work*")) - (set-buffer buffer) - (cond - ((bufferp object) - (insert-buffer-substring object start end)) - ((stringp object) - (insert (if (or start end) - (substring object start end) - object))) - (t nil)) - (prog1 - (if (<= (point-max) md5-maximum-internal-length) - (mapconcat - (function (lambda (node) (format "%02x" node))) - (md5-encode (buffer-string)) - "") - (call-process-region (point-min) (point-max) - (or shell-file-name "/bin/sh") - t buffer nil - "-c" md5-program) - ;; MD5 digest is 32 chars long - ;; mddriver adds a newline to make neaten output for tty - ;; viewing, make sure we leave it behind. - (buffer-substring (point-min) (+ (point-min) 32))) - (kill-buffer buffer))) - (and buffer (kill-buffer buffer) nil)))) - -(provide 'md5) - -;;; md5.el ends here diff --git a/lisp/message.el b/lisp/message.el deleted file mode 100644 index a710df2..0000000 --- a/lisp/message.el +++ /dev/null @@ -1,5910 +0,0 @@ -;;; message.el --- composing mail and news messages -*- coding: iso-latin-1 -*- -;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; MORIOKA Tomohiko -;; Shuhei KOBAYASHI -;; Keiichi Suzuki -;; Tatsuya Ichikawa -;; Katsumi Yamaoka -;; Kiyokazu SUTO -;; Keywords: mail, news, MIME - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;; This mode provides mail-sending facilities from within Emacs. It -;; consists mainly of large chunks of code from the sendmail.el, -;; gnus-msg.el and rnewspost.el files. - -;;; Code: - -(eval-when-compile - (require 'cl) - (require 'smtp) - (defvar gnus-list-identifiers)) ; gnus-sum is required where necessary -(require 'mailheader) -(require 'nnheader) -;; This is apparently necessary even though things are autoloaded: -(if (featurep 'xemacs) - (require 'mail-abbrevs)) -(require 'mime-edit) -(eval-when-compile (require 'static)) - -;; Avoid byte-compile warnings. -(eval-when-compile - (require 'mail-parse) - (require 'mml)) - -(require 'rfc822) - -(defgroup message '((user-mail-address custom-variable) - (user-full-name custom-variable)) - "Mail and news message composing." - :link '(custom-manual "(message)Top") - :group 'mail - :group 'news) - -(put 'user-mail-address 'custom-type 'string) -(put 'user-full-name 'custom-type 'string) - -(defgroup message-various nil - "Various Message Variables" - :link '(custom-manual "(message)Various Message Variables") - :group 'message) - -(defgroup message-buffers nil - "Message Buffers" - :link '(custom-manual "(message)Message Buffers") - :group 'message) - -(defgroup message-sending nil - "Message Sending" - :link '(custom-manual "(message)Sending Variables") - :group 'message) - -(defgroup message-interface nil - "Message Interface" - :link '(custom-manual "(message)Interface") - :group 'message) - -(defgroup message-forwarding nil - "Message Forwarding" - :link '(custom-manual "(message)Forwarding") - :group 'message-interface) - -(defgroup message-insertion nil - "Message Insertion" - :link '(custom-manual "(message)Insertion") - :group 'message) - -(defgroup message-headers nil - "Message Headers" - :link '(custom-manual "(message)Message Headers") - :group 'message) - -(defgroup message-news nil - "Composing News Messages" - :group 'message) - -(defgroup message-mail nil - "Composing Mail Messages" - :group 'message) - -(defgroup message-faces nil - "Faces used for message composing." - :group 'message - :group 'faces) - -(defgroup message-frames nil - "Message frames" - :group 'message) - -(defcustom message-directory "~/Mail/" - "*Directory from which all other mail file variables are derived." - :group 'message-various - :type 'directory) - -(defcustom message-max-buffers 10 - "*How many buffers to keep before starting to kill them off." - :group 'message-buffers - :type 'integer) - -(defcustom message-send-rename-function nil - "Function called to rename the buffer after sending it." - :group 'message-buffers - :type '(choice function (const nil))) - -(defcustom message-fcc-handler-function 'message-output - "*A function called to save outgoing articles. -This function will be called with the name of the file to store the -article in. The default function is `message-output' which saves in Unix -mailbox format." - :type '(radio (function-item message-output) - (function :tag "Other")) - :group 'message-sending) - -(defcustom message-encode-function 'message-maybe-encode - "*A function called to encode messages." - :group 'message-sending - :type 'function) - -(defcustom message-8bit-encoding-list '(8bit binary) - "*8bit encoding type in Content-Transfer-Encoding field." - :group 'message-sending - :type '(repeat (symbol :tag "Type"))) - -(defcustom message-courtesy-message - "The following message is a courtesy copy of an article\nthat has been posted to %s as well.\n\n" - "*This is inserted at the start of a mailed copy of a posted message. -If the string contains the format spec \"%s\", the Newsgroups -the article has been posted to will be inserted there. -If this variable is nil, no such courtesy message will be added." - :group 'message-sending - :type 'string) - -(defcustom message-ignored-bounced-headers "^\\(Received\\|Return-Path\\):" - "*Regexp that matches headers to be removed in resent bounced mail." - :group 'message-interface - :type 'regexp) - -(defcustom message-bounce-setup-function 'message-bounce-setup-for-mime-edit - "Function to setup a re-sending bounced message." - :group 'message-sending - :type 'function) - -;;;###autoload -(defcustom message-from-style 'default - "*Specifies how \"From\" headers look. - -If nil, they contain just the return address like: - king@grassland.com -If `parens', they look like: - king@grassland.com (Elvis Parsley) -If `angles', they look like: - Elvis Parsley - -Otherwise, most addresses look like `angles', but they look like -`parens' if `angles' would need quoting and `parens' would not." - :type '(choice (const :tag "simple" nil) - (const parens) - (const angles) - (const default)) - :group 'message-headers) - -(defcustom message-syntax-checks nil - ;; Guess this one shouldn't be easy to customize... - "*Controls what syntax checks should not be performed on outgoing posts. -To disable checking of long signatures, for instance, add - `(signature . disabled)' to this list. - -Don't touch this variable unless you really know what you're doing. - -Checks include `subject-cmsg', `multiple-headers', `sendsys', -`message-id', `from', `long-lines', `control-chars', `size', -`new-text', `quoting-style', `redirected-followup', `signature', -`approved', `sender', `empty', `empty-headers', `message-id', `from', -`subject', `shorten-followup-to', `existing-newsgroups', -`buffer-file-name', `unchanged', `newsgroups', `reply-to'." - :group 'message-news - :type '(repeat sexp)) ; Fixme: improve this - -(defcustom message-required-news-headers - '(From Newsgroups Subject Date Message-ID - (optional . Organization) Lines - (optional . User-Agent)) - "*Headers to be generated or prompted for when posting an article. -RFC977 and RFC1036 require From, Date, Newsgroups, Subject, -Message-ID. Organization, Lines, In-Reply-To, Expires, and -User-Agent are optional. If don't you want message to insert some -header, remove it from this list." - :group 'message-news - :group 'message-headers - :type '(repeat sexp)) - -(defcustom message-required-mail-headers - '(From Subject Date (optional . In-Reply-To) Message-ID Lines - (optional . User-Agent)) - "*Headers to be generated or prompted for when mailing a message. -It is recommended that From, Date, To, Subject and Message-ID be -included. Organization, Lines and User-Agent are optional." - :group 'message-mail - :group 'message-headers - :type '(repeat sexp)) - -(defcustom message-deletable-headers '(Message-ID Date Lines) - "Headers to be deleted if they already exist and were generated by message previously." - :group 'message-headers - :type 'sexp) - -(defcustom message-ignored-news-headers - "^NNTP-Posting-Host:\\|^Xref:\\|^[BGF]cc:\\|^Resent-Fcc:\\|^X-Draft-From:" - "*Regexp of headers to be removed unconditionally before posting." - :group 'message-news - :group 'message-headers - :type 'regexp) - -(defcustom message-ignored-mail-headers - "^[GF]cc:\\|^Resent-Fcc:\\|^Xref:\\|^X-Draft-From:" - "*Regexp of headers to be removed unconditionally before mailing." - :group 'message-mail - :group 'message-headers - :type 'regexp) - -(defcustom message-ignored-supersedes-headers "^Path:\\|^Date\\|^NNTP-Posting-Host:\\|^Xref:\\|^Lines:\\|^Received:\\|^X-From-Line:\\|^X-Trace:\\|^X-Complaints-To:\\|Return-Path:\\|^Supersedes:\\|^NNTP-Posting-Date:\\|^X-Trace:\\|^X-Complaints-To:" - "*Header lines matching this regexp will be deleted before posting. -It's best to delete old Path and Date headers before posting to avoid -any confusion." - :group 'message-interface - :type 'regexp) - -(defcustom message-supersede-setup-function - 'message-supersede-setup-for-mime-edit - "Function to setup a supersede message." - :group 'message-sending - :type 'function) - -(defcustom message-subject-re-regexp "^[ \t]*\\([Rr][Ee]:[ \t]*\\)*[ \t]*" - "*Regexp matching \"Re: \" in the subject line." - :group 'message-various - :type 'regexp) - -;;; Some sender agents encode the whole subject including leading "Re: ". -;;; And if followup agent does not decode it for some reason (e.g. unknown -;;; charset) and just add a new "Re: " in front of the encoded-word, the -;;; result will contain multiple "Re: "'s. -(defcustom message-subject-encoded-re-regexp - (concat - "^[ \t]*" - (regexp-quote "=?") - "[-!#$%&'*+0-9A-Z^_`a-z{|}~]+" ; charset - (regexp-quote "?") - "\\(" - "[Bb]" (regexp-quote "?") ; B encoding - "\\(\\(CQk\\|CSA\\|IAk\\|ICA\\)[Jg]\\)*" ; \([ \t][ \t][ \t]\)* - "\\(" - "[Uc][km]U6" ; [Rr][Ee]: - "\\|" - "\\(C[VX]\\|I[FH]\\)J[Fl]O[g-v]" ; [ \t][Rr][Ee]: - "\\|" - "\\(CQl\\|CSB\\|IAl\\|ICB\\)[Sy][RZ]T[o-r]" ; [ \t][ \t][Rr][Ee]: - "\\)" - "\\|" - "[Qb]" (regexp-quote "?") ; Q encoding - "\\(_\\|=09\\|=20\\)*" - "\\([Rr]\\|=[57]2\\)\\([Ee]\\|=[46]5\\)\\(:\\|=3[Aa]\\)" - "\\)" - ) - "*Regexp matching \"Re: \" in the subject line. -Unlike `message-subject-re-regexp', this regexp matches \"Re: \" within -an encoded-word." - :group 'message-various - :type 'regexp) - -(defcustom message-use-subject-re t - "*If t, remove any (buggy) \"Re: \"'s from the subject of the precursor -and add a new \"Re: \". If it is nil, use the subject \"as-is\". If it -is the symbol `guess', try to detect \"Re: \" within an encoded-word." - :group 'message-various - :type '(choice (const :tag "off" nil) - (const :tag "on" t) - (const guess))) - -;;;###autoload -(defcustom message-signature-separator "^-- *$" - "Regexp matching the signature separator." - :type 'regexp - :group 'message-various) - -(defcustom message-signature-separator-for-insertion "-- \n" - "*Signature separator. This value will be inserted as signature separator -when composing message. Default value is \"-- \\n\". Notice: Changing this -value may go against RFC-1036 and draft-ietf-usefor-article-05.txt. " - :type 'string - :group 'message-insertion) - -(defcustom message-elide-ellipsis "\n[...]\n\n" - "*The string which is inserted for elided text." - :type 'string - :group 'message-various) - -(defcustom message-interactive nil - "Non-nil means when sending a message wait for and display errors. -nil means let mailer mail back a message to report errors." - :group 'message-sending - :group 'message-mail - :type 'boolean) - -(defcustom message-generate-new-buffers 'unique - "*Non-nil means create a new message buffer whenever `message-setup' is called. -If this is a function, call that function with three parameters: The type, -the to address and the group name. (Any of these may be nil.) The function -should return the new buffer name." - :group 'message-buffers - :type '(choice (const :tag "off" nil) - (const :tag "unique" unique) - (const :tag "unsent" unsent) - (function fun))) - -(defcustom message-kill-buffer-on-exit nil - "*Non-nil means that the message buffer will be killed after sending a message." - :group 'message-buffers - :type 'boolean) - -(defcustom message-kill-buffer-query-function 'yes-or-no-p - "*A function called to query the user whether to kill buffer anyway or not. -If it is t, the buffer will be killed peremptorily." - :type '(radio (function-item yes-or-no-p) - (function-item y-or-n-p) - (function-item nnheader-Y-or-n-p) - (function :tag "Other" t)) - :group 'message-buffers) - -(eval-when-compile - (defvar gnus-local-organization)) -(defcustom message-user-organization - (or (and (boundp 'gnus-local-organization) - (stringp gnus-local-organization) - gnus-local-organization) - (getenv "ORGANIZATION") - t) - "*String to be used as an Organization header. -If t, use `message-user-organization-file'." - :group 'message-headers - :type '(choice string - (const :tag "consult file" t))) - -;;;###autoload -(defcustom message-user-organization-file "/usr/lib/news/organization" - "*Local news organization file." - :type 'file - :group 'message-headers) - -(defcustom message-forward-start-separator - (concat (mime-make-tag "message" "rfc822") "\n") - "*Delimiter inserted before forwarded messages." - :group 'message-forwarding - :type 'string) - -(defcustom message-forward-end-separator - (concat (mime-make-tag "text" "plain") "\n") - "*Delimiter inserted after forwarded messages." - :group 'message-forwarding - :type 'string) - -(defcustom message-included-forward-headers - "^From:\\|^Newsgroups:\\|^Subject:\\|^Date:\\|^\\(Mail-\\)?Followup-To:\\|^\\(Mail-\\)?Reply-To:\\|^Mail-Copies-To:\\|^Organization:\\|^Summary:\\|^Keywords:\\|^To:\\|^Cc:\\|^Posted-To:\\|^Apparently-To:\\|^Gnus-Warning:\\|^Resent-\\|^Message-ID:\\|^References:\\|^Content-\\|^MIME-Version:" - "*Regexp matching headers to be included in forwarded messages." - :group 'message-forwarding - :type 'regexp) - -(defcustom message-make-forward-subject-function - 'message-forward-subject-author-subject - "*List of functions called to generate subject headers for forwarded messages. -The subject generated by the previous function is passed into each -successive function. - -The provided functions are: - -* `message-forward-subject-author-subject' (Source of article (author or - newsgroup)), in brackets followed by the subject -* `message-forward-subject-fwd' (Subject of article with 'Fwd:' prepended - to it." - :group 'message-forwarding - :type '(radio (function-item message-forward-subject-author-subject) - (function-item message-forward-subject-fwd) - (repeat :tag "List of functions" function))) - -(defcustom message-forward-as-mime t - "*If non-nil, forward messages as an inline/rfc822 MIME section. Otherwise, directly inline the old message in the forwarded message." - :version "21.1" - :group 'message-forwarding - :type 'boolean) - -(defcustom message-forward-show-mml t - "*If non-nil, forward messages are shown as mml. Otherwise, forward messages are unchanged." - :version "21.1" - :group 'message-forwarding - :type 'boolean) - -(defcustom message-forward-before-signature t - "*If non-nil, put forwarded message before signature, else after." - :group 'message-forwarding - :type 'boolean) - -(defcustom message-wash-forwarded-subjects nil - "*If non-nil, try to remove as much old cruft as possible from the subject of messages before generating the new subject of a forward." - :group 'message-forwarding - :type 'boolean) - -(defcustom message-ignored-resent-headers "^Return-receipt\\|^X-Gnus\\|^Gnus-Warning:" - "*All headers that match this regexp will be deleted when resending a message." - :group 'message-interface - :type 'regexp) - -(defcustom message-forward-ignored-headers "^Content-Transfer-Encoding:\\|^X-Gnus" - "*All headers that match this regexp will be deleted when forwarding a message." - :version "21.1" - :group 'message-forwarding - :type '(choice (const :tag "None" nil) - regexp)) - -(defcustom message-ignored-cited-headers "." - "*Delete these headers from the messages you yank." - :group 'message-insertion - :type 'regexp) - -(defcustom message-cite-prefix-regexp - (if (string-match "[[:digit:]]" "1") ;; support POSIX? - "\\([ \t]*[-_.[:word:]]+>+\\|[ \t]*[]>»|:}+]\\)+" - ;; ?-, ?_ or ?. MUST NOT be in syntax entry w. - "\\([ \t]*\\(\\w\\|[-_.]\\)+>+\\|[ \t]*[]>»|:}+]\\)+") - "*Regexp matching the longest possible citation prefix on a line." - :group 'message-insertion - :type 'regexp) - -(defcustom message-cancel-message "I am canceling my own article.\n" - "Message to be inserted in the cancel message." - :group 'message-interface - :type 'string) - -;; Useful to set in site-init.el -;;;###autoload -(defcustom message-send-mail-function 'message-send-mail-with-sendmail - "Function to call to send the current buffer as mail. -The headers should be delimited by a line whose contents match the -variable `mail-header-separator'. - -Valid values include `message-send-mail-with-sendmail' (the default), -`message-send-mail-with-mh', `message-send-mail-with-qmail', -`message-send-mail-with-smtp', `smtpmail-send-it' and `feedmail-send-it'. - -See also `send-mail-function'." - :type '(radio (function-item message-send-mail-with-sendmail) - (function-item message-send-mail-with-mh) - (function-item message-send-mail-with-qmail) - (function-item message-send-mail-with-smtp) - (function-item smtpmail-send-it) - (function-item feedmail-send-it) - (function :tag "Other")) - :group 'message-sending - :group 'message-mail) - -;; 1997-09-29 by MORIOKA Tomohiko -(defcustom message-send-news-function 'message-send-news-with-gnus - "Function to call to send the current buffer as news. -The headers should be delimited by a line whose contents match the -variable `mail-header-separator'." - :group 'message-sending - :group 'message-news - :type 'function) - -(defcustom message-reply-to-function nil - "If non-nil, function that should return a list of headers. -This function should pick out addresses from the To, Cc, and From headers -and respond with new To and Cc headers." - :group 'message-interface - :type '(choice function (const nil))) - -(defcustom message-wide-reply-to-function nil - "If non-nil, function that should return a list of headers. -This function should pick out addresses from the To, Cc, and From headers -and respond with new To and Cc headers." - :group 'message-interface - :type '(choice function (const nil))) - -(defcustom message-followup-to-function nil - "If non-nil, function that should return a list of headers. -This function should pick out addresses from the To, Cc, and From headers -and respond with new To and Cc headers." - :group 'message-interface - :type '(choice function (const nil))) - -(defcustom message-use-followup-to 'ask - "*Specifies what to do with Followup-To header. -If nil, always ignore the header. If it is t, use its value, but -query before using the \"poster\" value. If it is the symbol `ask', -always query the user whether to use the value. If it is the symbol -`use', always use the value." - :group 'message-interface - :type '(choice (const :tag "ignore" nil) - (const :tag "use & query" t) - (const :tag "maybe" t) - (const :tag "always" use) - (const :tag "ask" ask))) - -(defcustom message-use-mail-copies-to 'ask - "*Specifies what to do with Mail-Copies-To header. -If nil, always ignore the header. If it is t, use its value, but -query before using the value other than \"always\" or \"never\". -If it is the symbol `ask', always query the user whether to use -the value. If it is the symbol `use', always use the value." - :group 'message-interface - :type '(choice (const :tag "ignore" nil) - (const :tag "maybe" t) - (const :tag "always" use) - (const :tag "ask" ask))) - -;;; XXX: 'ask and 'use are not implemented yet. -(defcustom message-use-mail-reply-to 'ask - "*Specifies what to do with Mail-Reply-To/Reply-To header. -If nil, always ignore the header. If it is t or the symbol `use', use -its value. If it is the symbol `ask', always query the user whether to -use the value. Note that if \"Reply-To\" is marked as \"broken\", its value -is never used." - :group 'message-interface - :type '(choice (const :tag "ignore" nil) - (const :tag "maybe" t) - (const :tag "always" use) - (const :tag "ask" ask))) - -(defcustom message-use-mail-followup-to 'use - "*Specifies what to do with Mail-Followup-To header. -If nil, always ignore the header. If it is the symbol `ask', always -query the user whether to use the value. If it is t or the symbol -`use', always use the value." - :group 'message-interface - :type '(choice (const :tag "ignore" nil) - (const :tag "maybe" t) - (const :tag "always" use) - (const :tag "ask" ask))) - -(defcustom message-sendmail-f-is-evil nil - "*Non-nil means don't add \"-f username\" to the sendmail command line. -Doing so would be even more evil than leaving it out." - :group 'message-sending - :type 'boolean) - -;; qmail-related stuff -(defcustom message-qmail-inject-program "/var/qmail/bin/qmail-inject" - "Location of the qmail-inject program." - :group 'message-sending - :type 'file) - -(defcustom message-qmail-inject-args nil - "Arguments passed to qmail-inject programs. -This should be a list of strings, one string for each argument. - -For e.g., if you wish to set the envelope sender address so that bounces -go to the right place or to deal with listserv's usage of that address, you -might set this variable to '(\"-f\" \"you@some.where\")." - :group 'message-sending - :type '(repeat string)) - -(defvar message-cater-to-broken-inn t - "Non-nil means Gnus should not fold the `References' header. -Folding `References' makes ancient versions of INN create incorrect -NOV lines.") - -(eval-when-compile - (defvar gnus-post-method) - (defvar gnus-select-method)) -(defcustom message-post-method - (cond ((and (boundp 'gnus-post-method) - (listp gnus-post-method) - gnus-post-method) - gnus-post-method) - ((boundp 'gnus-select-method) - gnus-select-method) - (t '(nnspool ""))) - "*Method used to post news. -Note that when posting from inside Gnus, for instance, this -variable isn't used." - :group 'message-news - :group 'message-sending - ;; This should be the `gnus-select-method' widget, but that might - ;; create a dependence to `gnus.el'. - :type 'sexp) - -(defcustom message-generate-headers-first nil - "*If non-nil, generate all required headers before composing. -The variables `message-required-news-headers' and -`message-required-mail-headers' specify which headers to generate. - -Note that the variable `message-deletable-headers' specifies headers which -are to be deleted and then re-generated before sending, so this variable -will not have a visible effect for those headers." - :group 'message-headers - :type 'boolean) - -(defcustom message-setup-hook '(turn-on-mime-edit) - "Normal hook, run each time a new outgoing message is initialized. -The function `message-setup' runs this hook." - :group 'message-various - :type 'hook) - -(defcustom message-cancel-hook nil - "Hook run when cancelling articles." - :group 'message-various - :type 'hook) - -(defcustom message-signature-setup-hook nil - "Normal hook, run each time a new outgoing message is initialized. -It is run after the headers have been inserted and before -the signature is inserted." - :group 'message-various - :type 'hook) - -(defcustom message-bounce-setup-hook nil - "Normal hook, run each time a re-sending bounced message is initialized. -The function `message-bounce' runs this hook." - :group 'message-various - :type 'hook) - -(defcustom message-supersede-setup-hook nil - "Normal hook, run each time a supersede message is initialized. -The function `message-supersede' runs this hook." - :group 'message-various - :type 'hook) - -(defcustom message-mode-hook nil - "Hook run in message mode buffers." - :group 'message-various - :type 'hook) - -(defcustom message-header-hook '((lambda () (eword-encode-header t))) - "Hook run in a message mode buffer narrowed to the headers." - :group 'message-various - :type 'hook) - -(defcustom message-header-setup-hook nil - "Hook called narrowed to the headers when setting up a message buffer." - :group 'message-various - :type 'hook) - -(defcustom message-minibuffer-local-map - (let ((map (make-sparse-keymap 'message-minibuffer-local-map))) - (set-keymap-parent map minibuffer-local-map) - map) - "Keymap for `message-read-from-minibuffer'.") - -;;;###autoload -(defcustom message-citation-line-function 'message-insert-citation-line - "*Function called to insert the \"Whomever writes:\" line. - -Note that Gnus provides a feature where the reader can click on -`writes:' to hide the cited text. If you change this line too much, -people who read your message will have to change their Gnus -configuration. See the variable `gnus-cite-attribution-suffix'." - :type 'function - :group 'message-insertion) - -;;;###autoload -(defcustom message-yank-prefix "> " - "*Prefix inserted on the lines of yanked messages. -Fix `message-cite-prefix-regexp' if it is set to an abnormal value. -See also `message-yank-cited-prefix'." - :type 'string - :group 'message-insertion) - -(defcustom message-yank-add-new-references t - "Non-nil means new IDs will be added to \"References\" field when an -article is yanked by the command `message-yank-original' interactively. -If it is a symbol `message-id-only', only an ID from \"Message-ID\" field -is used, otherwise IDs extracted from \"References\", \"In-Reply-To\" and -\"Message-ID\" fields are used." - :type '(radio (const :tag "Do not add anything" nil) - (const :tag "From Message-Id, References and In-Reply-To fields" t) - (const :tag "From only Message-Id field." message-id-only)) - :group 'message-insertion) - -(defcustom message-list-references-add-position nil - "Integer value means position for adding to \"References\" field when -an article is yanked by the command `message-yank-original' interactively." - :type '(radio (const :tag "Add to last" nil) - (integer :tag "Position from last ID")) - :group 'message-insertion) - -(defcustom message-yank-cited-prefix ">" - "*Prefix inserted on cited or empty lines of yanked messages. -Fix `message-cite-prefix-regexp' if it is set to an abnormal value. -See also `message-yank-prefix'." - :type 'string - :group 'message-insertion) - -(defcustom message-indentation-spaces 3 - "*Number of spaces to insert at the beginning of each cited line. -Used by `message-yank-original' via `message-yank-cite'." - :group 'message-insertion - :type 'integer) - -;;;###autoload -(defcustom message-cite-function 'message-cite-original - "*Function for citing an original message. -Predefined functions include `message-cite-original' and -`message-cite-original-without-signature'. -Note that `message-cite-original' uses `mail-citation-hook' if that is non-nil." - :type '(radio (function-item message-cite-original) - (function-item message-cite-original-without-signature) - (function-item mu-cite-original) - (function-item sc-cite-original) - (function :tag "Other")) - :group 'message-insertion) - -;;;###autoload -(defcustom message-suspend-font-lock-when-citing nil - "Non-nil means suspend font-lock'ing while citing an original message. -Some lazy demand-driven fontification tools (or Emacs itself) have a -bug that they often miss a buffer to be fontified. It will mostly -occur when Emacs prompts user for any inputs in the minibuffer. -Setting this option to non-nil may help you to avoid unpleasant errors -even if it is an add-hoc expedient." - :type 'boolean - :group 'message-insertion) - -;;;###autoload -(defcustom message-indent-citation-function 'message-indent-citation - "*Function for modifying a citation just inserted in the mail buffer. -This can also be a list of functions. Each function can find the -citation between (point) and (mark t). And each function should leave -point and mark around the citation text as modified." - :type 'function - :group 'message-insertion) - -(defvar message-abbrevs-loaded nil) - -;;;###autoload -(defcustom message-signature t - "*String to be inserted at the end of the message buffer. -If t, the `message-signature-file' file will be inserted instead. -If a function, the result from the function will be used instead. -If a form, the result from the form will be used instead." - :type 'sexp - :group 'message-insertion) - -;;;###autoload -(defcustom message-signature-file "~/.signature" - "*Name of file containing the text inserted at end of message buffer. -Ignored if the named file doesn't exist. -If nil, don't insert a signature." - :type '(choice file (const :tags "None" nil)) - :group 'message-insertion) - -(defcustom message-distribution-function nil - "*Function called to return a Distribution header." - :group 'message-news - :group 'message-headers - :type '(choice function (const nil))) - -(defcustom message-expires 14 - "Number of days before your article expires." - :group 'message-news - :group 'message-headers - :link '(custom-manual "(message)News Headers") - :type 'integer) - -(defcustom message-user-path nil - "If nil, use the NNTP server name in the Path header. -If stringp, use this; if non-nil, use no host name (user name only)." - :group 'message-news - :group 'message-headers - :link '(custom-manual "(message)News Headers") - :type '(choice (const :tag "nntp" nil) - (string :tag "name") - (sexp :tag "none" :format "%t" t))) - -(defvar message-reply-buffer nil) -(defvar message-reply-headers nil) -(defvar message-sent-message-via nil) -(defvar message-checksum nil) -(defvar message-send-actions nil - "A list of actions to be performed upon successful sending of a message.") -(defvar message-exit-actions nil - "A list of actions to be performed upon exiting after sending a message.") -(defvar message-kill-actions nil - "A list of actions to be performed before killing a message buffer.") -(defvar message-postpone-actions nil - "A list of actions to be performed after postponing a message.") -(defvar message-original-frame nil) -(defvar message-parameter-alist nil) -(defvar message-startup-parameter-alist nil) - -(define-widget 'message-header-lines 'text - "All header lines must be LFD terminated." - :format "%{%t%}:%n%v" - :valid-regexp "^\\'" - :error "All header lines must be newline terminated") - -(defcustom message-default-headers "" - "*A string containing header lines to be inserted in outgoing messages. -It is inserted before you edit the message, so you can edit or delete -these lines." - :group 'message-headers - :type 'message-header-lines) - -(defcustom message-default-mail-headers "" - "*A string of header lines to be inserted in outgoing mails." - :group 'message-headers - :group 'message-mail - :type 'message-header-lines) - -(defcustom message-default-news-headers "" - "*A string of header lines to be inserted in outgoing news articles." - :group 'message-headers - :group 'message-news - :type 'message-header-lines) - -;; Note: could use /usr/ucb/mail instead of sendmail; -;; options -t, and -v if not interactive. -(defcustom message-mailer-swallows-blank-line - (if (and (string-match "sparc-sun-sunos\\(\\'\\|[^5]\\)" - system-configuration) - (file-readable-p "/etc/sendmail.cf") - (let ((buffer (get-buffer-create " *temp*"))) - (unwind-protect - (save-excursion - (set-buffer buffer) - (insert-file-contents "/etc/sendmail.cf") - (goto-char (point-min)) - (let ((case-fold-search nil)) - (re-search-forward "^OR\\>" nil t))) - (kill-buffer buffer)))) - ;; According to RFC822, "The field-name must be composed of printable - ;; ASCII characters (i. e., characters that have decimal values between - ;; 33 and 126, except colon)", i. e., any chars except ctl chars, - ;; space, or colon. - '(looking-at "[ \t]\\|[][!\"#$%&'()*+,-./0-9;<=>?@A-Z\\\\^_`a-z{|}~]+:")) - "*Set this non-nil if the system's mailer runs the header and body together. -\(This problem exists on Sunos 4 when sendmail is run in remote mode.) -The value should be an expression to test whether the problem will -actually occur." - :group 'message-sending - :type 'sexp) - -;;; XXX: This symbol is overloaded! See below. -(defvar message-user-agent nil - "String of the form of PRODUCT/VERSION. Used for User-Agent header field.") - -(static-when (boundp 'MULE) - (require 'reporter));; `define-mail-user-agent' is here. - -;;;###autoload -(define-mail-user-agent 'message-user-agent - 'message-mail 'message-send-and-exit - 'message-kill-buffer 'message-send-hook) - -(defvar message-mh-deletable-headers '(Message-ID Date Lines Sender) - "If non-nil, delete the deletable headers before feeding to mh.") - -(defvar message-send-method-alist - '((news message-news-p message-send-via-news) - (mail message-mail-p message-send-via-mail)) - "Alist of ways to send outgoing messages. -Each element has the form - - \(TYPE PREDICATE FUNCTION) - -where TYPE is a symbol that names the method; PREDICATE is a function -called without any parameters to determine whether the message is -a message of type TYPE; and FUNCTION is a function to be called if -PREDICATE returns non-nil. FUNCTION is called with one parameter -- -the prefix.") - -(defcustom message-mail-alias-type 'abbrev - "*What alias expansion type to use in Message buffers. -The default is `abbrev', which uses mailabbrev. nil switches -mail aliases off." - :group 'message - :link '(custom-manual "(message)Mail Aliases") - :type '(choice (const :tag "Use Mailabbrev" abbrev) - (const :tag "No expansion" nil))) - -(defcustom message-auto-save-directory - (file-name-as-directory (nnheader-concat message-directory "drafts")) - "*Directory where Message auto-saves buffers if Gnus isn't running. -If nil, Message won't auto-save." - :group 'message-buffers - :type '(choice directory (const :tag "Don't auto-save" nil))) - -(defcustom message-buffer-naming-style 'unique - "*The way new message buffers are named. -Valid valued are `unique' and `unsent'." - :version "21.1" - :group 'message-buffers - :type '(choice (const :tag "unique" unique) - (const :tag "unsent" unsent))) - -(defcustom message-default-charset - (and (featurep 'xemacs) (not (featurep 'mule)) 'iso-8859-1) - "Default charset used in non-MULE XEmacsen." - :version "21.1" - :group 'message - :type 'symbol) - -(defcustom message-dont-reply-to-names - (and (boundp 'rmail-dont-reply-to-names) rmail-dont-reply-to-names) - "*A regexp specifying addresses to prune when doing wide replies. -A value of nil means exclude your own user name only." - :version "21.1" - :group 'message - :type '(choice (const :tag "Yourself" nil) - regexp)) - -(defvar message-shoot-gnksa-feet nil - "*A list of GNKSA feet you are allowed to shoot. -Gnus gives you all the opportunity you could possibly want for -shooting yourself in the foot. Also, Gnus allows you to shoot the -feet of Good Net-Keeping Seal of Approval. The following are foot -candidates: -`empty-article' Allow you to post an empty article; -`quoted-text-only' Allow you to post quoted text only; -`multiple-copies' Allow you to post multiple copies.") -;; `cancel-messages' Allow you to cancel or supersede others' messages. - -(defsubst message-gnksa-enable-p (feature) - (or (not (listp message-shoot-gnksa-feet)) - (memq feature message-shoot-gnksa-feet))) - -;;; Internal variables. -;;; Well, not really internal. - -(defvar message-mode-syntax-table - (let ((table (copy-syntax-table text-mode-syntax-table))) - (modify-syntax-entry ?% ". " table) - (modify-syntax-entry ?> ". " table) - (modify-syntax-entry ?< ". " table) - table) - "Syntax table used while in Message mode.") - -(defface message-header-to-face - '((((class color) - (background dark)) - (:foreground "green2" :bold t)) - (((class color) - (background light)) - (:foreground "MidnightBlue" :bold t)) - (t - (:bold t :italic t))) - "Face used for displaying From headers." - :group 'message-faces) - -(defface message-header-cc-face - '((((class color) - (background dark)) - (:foreground "green4" :bold t)) - (((class color) - (background light)) - (:foreground "MidnightBlue")) - (t - (:bold t))) - "Face used for displaying Cc headers." - :group 'message-faces) - -(defface message-header-subject-face - '((((class color) - (background dark)) - (:foreground "green3")) - (((class color) - (background light)) - (:foreground "navy blue" :bold t)) - (t - (:bold t))) - "Face used for displaying subject headers." - :group 'message-faces) - -(defface message-header-newsgroups-face - '((((class color) - (background dark)) - (:foreground "yellow" :bold t :italic t)) - (((class color) - (background light)) - (:foreground "blue4" :bold t :italic t)) - (t - (:bold t :italic t))) - "Face used for displaying newsgroups headers." - :group 'message-faces) - -(defface message-header-other-face - '((((class color) - (background dark)) - (:foreground "#b00000")) - (((class color) - (background light)) - (:foreground "steel blue")) - (t - (:bold t :italic t))) - "Face used for displaying newsgroups headers." - :group 'message-faces) - -(defface message-header-name-face - '((((class color) - (background dark)) - (:foreground "DarkGreen")) - (((class color) - (background light)) - (:foreground "cornflower blue")) - (t - (:bold t))) - "Face used for displaying header names." - :group 'message-faces) - -(defface message-header-xheader-face - '((((class color) - (background dark)) - (:foreground "blue")) - (((class color) - (background light)) - (:foreground "blue")) - (t - (:bold t))) - "Face used for displaying X-Header headers." - :group 'message-faces) - -(defface message-separator-face - '((((class color) - (background dark)) - (:foreground "blue3")) - (((class color) - (background light)) - (:foreground "brown")) - (t - (:bold t))) - "Face used for displaying the separator." - :group 'message-faces) - -(defface message-cited-text-face - '((((class color) - (background dark)) - (:foreground "red")) - (((class color) - (background light)) - (:foreground "red")) - (t - (:bold t))) - "Face used for displaying cited text names." - :group 'message-faces) - -(defface message-mml-face - '((((class color) - (background dark)) - (:foreground "ForestGreen")) - (((class color) - (background light)) - (:foreground "ForestGreen")) - (t - (:bold t))) - "Face used for displaying MML." - :group 'message-faces) - -(defvar message-font-lock-keywords - (let ((content "[ \t]*\\(.+\\(\n[ \t].*\\)*\\)\n?")) - `((,(concat "^\\([Tt]o:\\)" content) - (1 'message-header-name-face) - (2 'message-header-to-face nil t)) - (,(concat "^\\([GBF]?[Cc][Cc]:\\|[Rr]eply-[Tt]o:\\|" - "[Mm]ail-[Cc]opies-[Tt]o:\\|" - "[Mm]ail-[Rr]eply-[Tt]o:\\|" - "[Mm]ail-[Ff]ollowup-[Tt]o:\\)" content) - (1 'message-header-name-face) - (2 'message-header-cc-face nil t)) - (,(concat "^\\([Ss]ubject:\\)" content) - (1 'message-header-name-face) - (2 'message-header-subject-face nil t)) - (,(concat "^\\([Nn]ewsgroups:\\|Followup-[Tt]o:\\)" content) - (1 'message-header-name-face) - (2 'message-header-newsgroups-face nil t)) - (,(concat "^\\([A-Z][^: \n\t]+:\\)" content) - (1 'message-header-name-face) - (2 'message-header-other-face nil t)) - (,(concat "^\\(X-[A-Za-z0-9-]+\\|In-Reply-To\\):" content) - (1 'message-header-name-face) - (2 'message-header-name-face)) - ,@(if (and mail-header-separator - (not (equal mail-header-separator ""))) - `((,(concat "^\\(" (regexp-quote mail-header-separator) "\\)$") - 1 'message-separator-face)) - nil) - (,(concat "^\\(" message-cite-prefix-regexp "\\).*") - (0 'message-cited-text-face)) - (,mime-edit-tag-regexp - (0 'message-mml-face)))) - "Additional expressions to highlight in Message mode.") - -;; XEmacs does it like this. For Emacs, we have to set the -;; `font-lock-defaults' buffer-local variable. -(put 'message-mode 'font-lock-defaults '(message-font-lock-keywords t)) - -(defvar message-face-alist - '((bold . bold-region) - (underline . underline-region) - (default . (lambda (b e) - (unbold-region b e) - (ununderline-region b e)))) - "Alist of mail and news faces for facemenu. -The cdr of ech entry is a function for applying the face to a region.") - -(defcustom message-send-hook nil - "Hook run before sending messages." - :group 'message-various - :options '(ispell-message) - :type 'hook) - -(defcustom message-send-mail-hook nil - "Hook run before sending mail messages." - :group 'message-various - :type 'hook) - -(defcustom message-send-news-hook nil - "Hook run before sending news messages." - :group 'message-various - :type 'hook) - -(defcustom message-sent-hook nil - "Hook run after sending messages." - :group 'message-various - :type 'hook) - -(defcustom message-use-multi-frames nil - "Make new frame when sending messages." - :group 'message-frames - :type 'boolean) - -(defcustom message-delete-frame-on-exit nil - "Delete frame after sending messages." - :group 'message-frames - :type '(choice (const :tag "off" nil) - (const :tag "always" t) - (const :tag "ask" ask))) - -(defvar message-draft-coding-system - (cond - ((boundp 'MULE) '*junet*) - ((not (fboundp 'find-coding-system)) nil) - ((find-coding-system 'emacs-mule) - (if (memq system-type '(windows-nt ms-dos ms-windows)) - 'emacs-mule-dos 'emacs-mule)) - ((find-coding-system 'escape-quoted) 'escape-quoted) - ((find-coding-system 'no-conversion) 'no-conversion) - (t nil)) - "Coding system to compose mail.") - -(defcustom message-send-mail-partially-limit 1000000 - "The limitation of messages sent as message/partial. -The lower bound of message size in characters, beyond which the message -should be sent in several parts. If it is nil, the size is unlimited." - :version "21.1" - :group 'message-buffers - :type '(choice (const :tag "unlimited" nil) - (integer 1000000))) - -(defcustom message-alternative-emails nil - "A regexp to match the alternative email addresses. -The first matched address (not primary one) is used in the From field." - :group 'message-headers - :type '(choice (const :tag "Always use primary" nil) - regexp)) - -(defcustom message-mail-user-agent nil - "Like `mail-user-agent'. -Except if it is nil, use Gnus native MUA; if it is t, use -`mail-user-agent'." - :type '(radio (const :tag "Gnus native" - :format "%t\n" - nil) - (const :tag "`mail-user-agent'" - :format "%t\n" - t) - (function-item :tag "Default Emacs mail" - :format "%t\n" - sendmail-user-agent) - (function-item :tag "Emacs interface to MH" - :format "%t\n" - mh-e-user-agent) - (function :tag "Other")) - :version "21.1" - :group 'message) - -(defcustom message-wide-reply-confirm-recipients nil - "Whether to confirm a wide reply to multiple email recipients. -If this variable is nil, don't ask whether to reply to all recipients. -If this variable is non-nil, pose the question \"Reply to all -recipients?\" before a wide reply to multiple recipients. If the user -answers yes, reply to all recipients as usual. If the user answers -no, only reply back to the author." - :group 'message-headers - :type 'boolean) - -;;; Internal variables. - -(defvar message-sending-message "Sending...") -(defvar message-buffer-list nil) -(defvar message-this-is-news nil) -(defvar message-this-is-mail nil) -(defvar message-draft-article nil) -(defvar message-mime-part nil) -(defvar message-posting-charset nil) - -;; Byte-compiler warning -(eval-when-compile - (defvar gnus-active-hashtb) - (defvar gnus-read-active-file)) - -;;; Regexp matching the delimiter of messages in UNIX mail format -;;; (UNIX From lines), minus the initial ^. It should be a copy -;;; of rmail.el's rmail-unix-mail-delimiter. -(defvar message-unix-mail-delimiter - (let ((time-zone-regexp - (concat "\\([A-Z]?[A-Z]?[A-Z][A-Z]\\( DST\\)?" - "\\|[-+]?[0-9][0-9][0-9][0-9]" - "\\|" - "\\) *"))) - (concat - "From " - - ;; Many things can happen to an RFC 822 mailbox before it is put into - ;; a `From' line. The leading phrase can be stripped, e.g. - ;; `Joe <@w.x:joe@y.z>' -> `<@w.x:joe@y.z>'. The <> can be stripped, e.g. - ;; `<@x.y:joe@y.z>' -> `@x.y:joe@y.z'. Everything starting with a CRLF - ;; can be removed, e.g. - ;; From: joe@y.z (Joe K - ;; User) - ;; can yield `From joe@y.z (Joe K Fri Mar 22 08:11:15 1996', and - ;; From: Joe User - ;; - ;; can yield `From Joe User Fri Mar 22 08:11:15 1996'. - ;; The mailbox can be removed or be replaced by white space, e.g. - ;; From: "Joe User"{space}{tab} - ;; - ;; can yield `From {space}{tab} Fri Mar 22 08:11:15 1996', - ;; where {space} and {tab} represent the Ascii space and tab characters. - ;; We want to match the results of any of these manglings. - ;; The following regexp rejects names whose first characters are - ;; obviously bogus, but after that anything goes. - "\\([^\0-\b\n-\r\^?].*\\)? " - - ;; The time the message was sent. - "\\([^\0-\r \^?]+\\) +" ; day of the week - "\\([^\0-\r \^?]+\\) +" ; month - "\\([0-3]?[0-9]\\) +" ; day of month - "\\([0-2][0-9]:[0-5][0-9]\\(:[0-6][0-9]\\)?\\) *" ; time of day - - ;; Perhaps a time zone, specified by an abbreviation, or by a - ;; numeric offset. - time-zone-regexp - - ;; The year. - " \\([0-9][0-9]+\\) *" - - ;; On some systems the time zone can appear after the year, too. - time-zone-regexp - - ;; Old uucp cruft. - "\\(remote from .*\\)?" - - "\n")) - "Regexp matching the delimiter of messages in UNIX mail format.") - -(defvar message-unsent-separator - (concat "^ *---+ +Unsent message follows +---+ *$\\|" - "^ *---+ +Returned message +---+ *$\\|" - "^Start of returned message$\\|" - "^ *---+ +Original message +---+ *$\\|" - "^ *--+ +begin message +--+ *$\\|" - "^ *---+ +Original message follows +---+ *$\\|" - "^ *---+ +Undelivered message follows +---+ *$\\|" - "^|? *---+ +Message text follows: +---+ *|?$") - "A regexp that matches the separator before the text of a failed message.") - -(defvar message-header-format-alist - `((Newsgroups) - (To . message-fill-address) - (Cc . message-fill-address) - (Subject) - (In-Reply-To) - (Fcc) - (Bcc) - (Date) - (Organization) - (Distribution) - (Lines) - (Expires) - (Message-ID) - (References . message-shorten-references) - (User-Agent)) - "Alist used for formatting headers.") - -(defvar message-options nil - "Some saved answers when sending message.") - -(defvar message-send-mail-real-function nil - "Internal send mail function.") - -(defvar message-bogus-system-names "^localhost\\." - "The regexp of bogus system names.") - -(eval-and-compile - (autoload 'message-setup-toolbar "messagexmas") - (autoload 'mh-new-draft-name "mh-comp") - (autoload 'mh-send-letter "mh-comp") - (autoload 'gnus-point-at-eol "gnus-util") - (autoload 'gnus-point-at-bol "gnus-util") - (autoload 'gnus-output-to-rmail "gnus-util") - (autoload 'gnus-output-to-mail "gnus-util") - (autoload 'mail-abbrev-in-expansion-header-p "mailabbrev") - (autoload 'nndraft-request-associate-buffer "nndraft") - (autoload 'nndraft-request-expire-articles "nndraft") - (autoload 'gnus-open-server "gnus-int") - (autoload 'gnus-request-post "gnus-int") - (autoload 'gnus-copy-article-buffer "gnus-msg") - (autoload 'gnus-alive-p "gnus-util") - (autoload 'gnus-server-string "gnus") - (autoload 'gnus-group-name-charset "gnus-group") - (autoload 'rmail-output "rmailout") - (autoload 'mu-cite-original "mu-cite")) - - - -;;; -;;; Utility functions. -;;; -(defun message-eval-parameter (parameter) - (condition-case () - (if (symbolp parameter) - (if (functionp parameter) - (funcall parameter) - (eval parameter)) - parameter) - (error nil))) - -(defsubst message-get-parameter (key &optional alist) - (unless alist - (setq alist message-parameter-alist)) - (cdr (assq key alist))) - -(defmacro message-get-parameter-with-eval (key &optional alist) - `(message-eval-parameter (message-get-parameter ,key ,alist))) - -(defmacro message-y-or-n-p (question show &rest text) - "Ask QUESTION, displaying remaining args in a temporary buffer if SHOW." - `(message-talkative-question 'y-or-n-p ,question ,show ,@text)) - -(defmacro message-delete-line (&optional n) - "Delete the current line (and the next N lines)." - `(delete-region (progn (beginning-of-line) (point)) - (progn (forward-line ,(or n 1)) (point)))) - -(defun message-unquote-tokens (elems) - "Remove double quotes (\") from strings in list ELEMS." - (mapcar (lambda (item) - (while (string-match "^\\(.*\\)\"\\(.*\\)$" item) - (setq item (concat (match-string 1 item) - (match-string 2 item)))) - item) - elems)) - -(defun message-tokenize-header (header &optional separator) - "Split HEADER into a list of header elements. -SEPARATOR is a string of characters to be used as separators. \",\" -is used by default." - (if (not header) - nil - (let ((regexp (format "[%s]+" (or separator ","))) - (beg 1) - (first t) - quoted elems paren) - (save-excursion - (message-set-work-buffer) - (insert header) - (goto-char (point-min)) - (while (not (eobp)) - (if first - (setq first nil) - (forward-char 1)) - (cond ((and (> (point) beg) - (or (eobp) - (and (looking-at regexp) - (not quoted) - (not paren)))) - (push (buffer-substring beg (point)) elems) - (setq beg (match-end 0))) - ((eq (char-after) ?\") - (setq quoted (not quoted))) - ((and (eq (char-after) ?\() - (not quoted)) - (setq paren t)) - ((and (eq (char-after) ?\)) - (not quoted)) - (setq paren nil)))) - (nreverse elems))))) - -(defun message-mail-file-mbox-p (file) - "Say whether FILE looks like a Unix mbox file." - (when (and (file-exists-p file) - (file-readable-p file) - (file-regular-p file)) - (with-temp-buffer - (nnheader-insert-file-contents file) - (goto-char (point-min)) - (looking-at message-unix-mail-delimiter)))) - -(defun message-fetch-field (header &optional not-all) - "The same as `mail-fetch-field', only remove all newlines." - (let* ((inhibit-point-motion-hooks t) - (case-fold-search t) - (value (mail-fetch-field header nil (not not-all)))) - (when value - (while (string-match "\n[\t ]+" value) - (setq value (replace-match " " t t value))) - (set-text-properties 0 (length value) nil value) - value))) - -(defun message-narrow-to-field () - "Narrow the buffer to the header on the current line." - (beginning-of-line) - (narrow-to-region - (point) - (progn - (forward-line 1) - (if (re-search-forward "^[^ \n\t]" nil t) - (progn - (beginning-of-line) - (point)) - (point-max)))) - (goto-char (point-min))) - -(defun message-add-header (&rest headers) - "Add the HEADERS to the message header, skipping those already present." - (while headers - (let (hclean) - (unless (string-match "^\\([^:]+\\):[ \t]*[^ \t]" (car headers)) - (error "Invalid header `%s'" (car headers))) - (setq hclean (match-string 1 (car headers))) - (save-restriction - (message-narrow-to-headers) - (unless (re-search-forward (concat "^" (regexp-quote hclean) ":") nil t) - (goto-char (point-max)) - (if (string-match "\n$" (car headers)) - (insert (car headers)) - (insert (car headers) ?\n))))) - (setq headers (cdr headers)))) - - -(defun message-fetch-reply-field (header) - "Fetch field HEADER from the message we're replying to." - (let ((buffer (message-eval-parameter message-reply-buffer))) - (when (and buffer - (buffer-name buffer)) - (save-excursion - (set-buffer buffer) - (message-fetch-field header))))) - -(defun message-set-work-buffer () - (if (get-buffer " *message work*") - (progn - (set-buffer " *message work*") - (erase-buffer)) - (set-buffer (get-buffer-create " *message work*")) - (kill-all-local-variables))) - -(defun message-functionp (form) - "Return non-nil if FORM is funcallable." - (or (and (symbolp form) (fboundp form)) - (and (listp form) (eq (car form) 'lambda)) - (byte-code-function-p form))) - -(defun message-strip-list-identifiers (subject) - "Remove list identifiers in `gnus-list-identifiers' from string SUBJECT." - (require 'gnus-sum) ; for gnus-list-identifiers - (let ((regexp (if (stringp gnus-list-identifiers) - gnus-list-identifiers - (mapconcat 'identity gnus-list-identifiers " *\\|")))) - (if (string-match (concat "\\(\\(\\(Re: +\\)?\\(" regexp - " *\\)\\)+\\(Re: +\\)?\\)") subject) - (concat (substring subject 0 (match-beginning 1)) - (or (match-string 3 subject) - (match-string 5 subject)) - (substring subject - (match-end 1))) - subject))) - -(defun message-strip-subject-re (subject) - "Remove \"Re:\" from subject lines in string SUBJECT." - (if (string-match message-subject-re-regexp subject) - (substring subject (match-end 0)) - subject)) - -(defun message-remove-header (header &optional is-regexp first reverse) - "Remove HEADER in the narrowed buffer. -If IS-REGEXP, HEADER is a regular expression. -If FIRST, only remove the first instance of the header. -Return the number of headers removed." - (goto-char (point-min)) - (let ((regexp (if is-regexp header (concat "^" (regexp-quote header) ":"))) - (number 0) - (case-fold-search t) - last) - (while (and (not (eobp)) - (not last)) - (if (if reverse - (not (looking-at regexp)) - (looking-at regexp)) - (progn - (incf number) - (when first - (setq last t)) - (delete-region - (point) - ;; There might be a continuation header, so we have to search - ;; until we find a new non-continuation line. - (progn - (forward-line 1) - (if (re-search-forward "^[^ \t]" nil t) - (goto-char (match-beginning 0)) - (point-max))))) - (forward-line 1) - (if (re-search-forward "^[^ \t]" nil t) - (goto-char (match-beginning 0)) - (goto-char (point-max))))) - number)) - -(defun message-remove-first-header (header) - "Remove the first instance of HEADER if there is more than one." - (let ((count 0) - (regexp (concat "^" (regexp-quote header) ":"))) - (save-excursion - (goto-char (point-min)) - (while (re-search-forward regexp nil t) - (incf count))) - (while (> count 1) - (message-remove-header header nil t) - (decf count)))) - -(defun message-narrow-to-headers () - "Narrow the buffer to the head of the message." - (widen) - (narrow-to-region - (goto-char (point-min)) - (if (re-search-forward - (concat "^" (regexp-quote mail-header-separator) "\n") nil t) - (match-beginning 0) - (point-max))) - (goto-char (point-min))) - -(defun message-narrow-to-head-1 () - "Like `message-narrow-to-head'. Don't widen." - (narrow-to-region - (goto-char (point-min)) - (if (search-forward "\n\n" nil 1) - (1- (point)) - (point-max))) - (goto-char (point-min))) - -(defun message-narrow-to-head () - "Narrow the buffer to the head of the message. -Point is left at the beginning of the narrowed-to region." - (widen) - (message-narrow-to-head-1)) - -(defun message-narrow-to-headers-or-head () - "Narrow the buffer to the head of the message." - (widen) - (narrow-to-region - (goto-char (point-min)) - (cond - ((re-search-forward - (concat "^" (regexp-quote mail-header-separator) "\n") nil t) - (match-beginning 0)) - ((search-forward "\n\n" nil t) - (1- (point))) - (t - (point-max)))) - (goto-char (point-min))) - -(defun message-news-p () - "Say whether the current buffer contains a news message." - (and (not message-this-is-mail) - (or message-this-is-news - (save-excursion - (save-restriction - (message-narrow-to-headers) - (and (message-fetch-field "newsgroups") - (not (message-fetch-field "posted-to")))))))) - -(defun message-mail-p () - "Say whether the current buffer contains a mail message." - (and (not message-this-is-news) - (or message-this-is-mail - (save-excursion - (save-restriction - (message-narrow-to-headers) - (or (message-fetch-field "to") - (message-fetch-field "cc") - (message-fetch-field "bcc"))))))) - -(defun message-next-header () - "Go to the beginning of the next header." - (beginning-of-line) - (or (eobp) (forward-char 1)) - (not (if (re-search-forward "^[^ \t]" nil t) - (beginning-of-line) - (goto-char (point-max))))) - -(defun message-sort-headers-1 () - "Sort the buffer as headers using `message-rank' text props." - (goto-char (point-min)) - (require 'sort) - (sort-subr - nil 'message-next-header - (lambda () - (message-next-header) - (unless (bobp) - (forward-char -1))) - (lambda () - (or (get-text-property (point) 'message-rank) - 10000)))) - -(defun message-sort-headers () - "Sort the headers of the current message according to `message-header-format-alist'." - (interactive) - (save-excursion - (save-restriction - (let ((max (1+ (length message-header-format-alist))) - rank) - (message-narrow-to-headers) - (while (re-search-forward "^[^ \n]+:" nil t) - (put-text-property - (match-beginning 0) (1+ (match-beginning 0)) - 'message-rank - (if (setq rank (length (memq (assq (intern (buffer-substring - (match-beginning 0) - (1- (match-end 0)))) - message-header-format-alist) - message-header-format-alist))) - (- max rank) - (1+ max))))) - (message-sort-headers-1)))) - - - -;;; -;;; Message mode -;;; - -;;; Set up keymap. - -(defvar message-mode-map nil) - -(unless message-mode-map - (setq message-mode-map (make-keymap)) - (set-keymap-parent message-mode-map text-mode-map) - (define-key message-mode-map "\C-c?" 'describe-mode) - - (define-key message-mode-map "\C-c\C-f\C-t" 'message-goto-to) - (define-key message-mode-map "\C-c\C-f\C-b" 'message-goto-bcc) - (define-key message-mode-map "\C-c\C-f\C-w" 'message-goto-fcc) - (define-key message-mode-map "\C-c\C-f\C-c" 'message-goto-cc) - (define-key message-mode-map "\C-c\C-f\C-s" 'message-goto-subject) - ;; (define-key message-mode-map "\C-c\C-f\C-r" 'message-goto-reply-to) - (define-key message-mode-map "\C-c\C-f\C-r" 'message-goto-mail-reply-to) - (define-key message-mode-map "\C-c\C-f\C-m" 'message-goto-mail-followup-to) - (define-key message-mode-map "\C-c\C-f\C-n" 'message-goto-newsgroups) - (define-key message-mode-map "\C-c\C-f\C-d" 'message-goto-distribution) - (define-key message-mode-map "\C-c\C-f\C-f" 'message-goto-followup-to) - (define-key message-mode-map "\C-c\C-f\C-k" 'message-goto-keywords) - (define-key message-mode-map "\C-c\C-f\C-u" 'message-goto-summary) - (define-key message-mode-map "\C-c\C-b" 'message-goto-body) - (define-key message-mode-map "\C-c\C-i" 'message-goto-signature) - (define-key message-mode-map "\C-c\C-fc" 'message-goto-mail-copies-to) - - (define-key message-mode-map "\C-c\C-t" 'message-insert-to) - (define-key message-mode-map "\C-c\C-n" 'message-insert-newsgroups) - - (define-key message-mode-map "\C-c\C-y" 'message-yank-original) - (define-key message-mode-map "\C-c\M-\C-y" 'message-yank-buffer) - (define-key message-mode-map "\C-c\C-q" 'message-fill-yanked-message) - (define-key message-mode-map "\C-c\C-w" 'message-insert-signature) - (define-key message-mode-map "\C-c\M-h" 'message-insert-headers) - (define-key message-mode-map "\C-c\C-r" 'message-caesar-buffer-body) - (define-key message-mode-map "\C-c\C-o" 'message-sort-headers) - (define-key message-mode-map "\C-c\M-r" 'message-rename-buffer) - - (define-key message-mode-map "\C-c\C-c" 'message-send-and-exit) - (define-key message-mode-map "\C-c\C-s" 'message-send) - (define-key message-mode-map "\C-c\C-k" 'message-kill-buffer) - (define-key message-mode-map "\C-c\C-d" 'message-dont-send) - - (define-key message-mode-map "\C-c\C-e" 'message-elide-region) - (define-key message-mode-map "\C-c\C-v" 'message-delete-not-region) - (define-key message-mode-map "\C-c\C-z" 'message-kill-to-signature) - (define-key message-mode-map "\M-\r" 'message-newline-and-reformat) - ;;(define-key message-mode-map "\M-q" 'message-fill-paragraph) - - (define-key message-mode-map "\t" 'message-tab) - (define-key message-mode-map "\M-;" 'comment-region) - - (define-key message-mode-map "\C-x\C-s" 'message-save-drafts) - (define-key message-mode-map "\C-xk" 'message-mimic-kill-buffer)) - -(easy-menu-define - message-mode-menu message-mode-map "Message Menu." - `("Message" - ["Sort Headers" message-sort-headers t] - ["Yank Original" message-yank-original t] - ["Fill Yanked Message" message-fill-yanked-message t] - ["Insert Signature" message-insert-signature t] - ["Caesar (rot13) Message" message-caesar-buffer-body t] - ["Caesar (rot13) Region" message-caesar-region (mark t)] - ["Elide Region" message-elide-region (mark t)] - ["Delete Outside Region" message-delete-not-region (mark t)] - ["Kill To Signature" message-kill-to-signature t] - ["Newline and Reformat" message-newline-and-reformat t] - ["Rename buffer" message-rename-buffer t] - ["Spellcheck" ispell-message - ,@(if (featurep 'xemacs) '(t) - '(:help "Spellcheck this message"))] - ["Attach file as MIME" mime-edit-insert-file - ,@(if (featurep 'xemacs) '(t) - '(:help "Attach a file at point"))] - "----" - ["Send Message" message-send-and-exit - ,@(if (featurep 'xemacs) '(t) - '(:help "Send this message"))] - ["Postpone Message" message-dont-send - ,@(if (featurep 'xemacs) '(t) - '(:help "File this draft message and exit"))] - ["Kill Message" message-kill-buffer - ,@(if (featurep 'xemacs) '(t) - '(:help "Delete this message without sending"))])) - -(easy-menu-define - message-mode-field-menu message-mode-map "" - '("Field" - ["Fetch To" message-insert-to t] - ["Fetch Newsgroups" message-insert-newsgroups t] - "----" - ["To" message-goto-to t] - ["Subject" message-goto-subject t] - ["Cc" message-goto-cc t] - ["Reply-To" message-goto-reply-to t] - ["Mail-Reply-To" message-goto-mail-reply-to t] - ["Mail-Followup-To" message-goto-mail-followup-to t] - ["Mail-Copies-To" message-goto-mail-copies-to t] - ["Summary" message-goto-summary t] - ["Keywords" message-goto-keywords t] - ["Newsgroups" message-goto-newsgroups t] - ["Followup-To" message-goto-followup-to t] - ["Distribution" message-goto-distribution t] - ["Body" message-goto-body t] - ["Signature" message-goto-signature t])) - -(defvar message-tool-bar-map nil) - -(eval-when-compile - (defvar facemenu-add-face-function) - (defvar facemenu-remove-face-function)) - -;;;###autoload -(define-derived-mode message-mode text-mode "Message" - "Major mode for editing mail and news to be sent. -Like Text Mode but with these additional commands:\\ -C-c C-s `message-send' (send the message) C-c C-c `message-send-and-exit' -C-c C-d Postpone sending the message C-c C-k Kill the message -C-c C-f move to a header field (and create it if there isn't): - C-c C-f C-t move to To C-c C-f C-s move to Subject - C-c C-f C-c move to Cc C-c C-f C-b move to Bcc - C-c C-f C-w move to Fcc C-c C-f C-r move to Reply-To - C-c C-f C-u move to Summary C-c C-f C-n move to Newsgroups - C-c C-f C-k move to Keywords C-c C-f C-d move to Distribution - C-c C-f C-m move to Mail-Followup-To - C-c C-f C-f move to Followup-To - C-c C-f c move to Mail-Copies-To -C-c C-t `message-insert-to' (add a To header to a news followup) -C-c C-n `message-insert-newsgroups' (add a Newsgroup header to a news reply) -C-c C-b `message-goto-body' (move to beginning of message text). -C-c C-i `message-goto-signature' (move to the beginning of the signature). -C-c C-w `message-insert-signature' (insert `message-signature-file' file). -C-c C-y `message-yank-original' (insert current message, if any). -C-c C-q `message-fill-yanked-message' (fill what was yanked). -C-c C-e `message-elide-region' (elide the text between point and mark). -C-c C-v `message-delete-not-region' (remove the text outside the region). -C-c C-z `message-kill-to-signature' (kill the text up to the signature). -C-c C-r `message-caesar-buffer-body' (rot13 the message body). -M-RET `message-newline-and-reformat' (break the line and reformat)." - (set (make-local-variable 'message-reply-buffer) nil) - (make-local-variable 'message-send-actions) - (make-local-variable 'message-exit-actions) - (make-local-variable 'message-kill-actions) - (make-local-variable 'message-postpone-actions) - (make-local-variable 'message-draft-article) - (setq buffer-offer-save t) - (set (make-local-variable 'facemenu-add-face-function) - (lambda (face end) - (let ((face-fun (cdr (assq face message-face-alist)))) - (if face-fun - (funcall face-fun (point) end) - (error "Face %s not configured for %s mode" face mode-name))) - "")) - (set (make-local-variable 'facemenu-remove-face-function) t) - (set (make-local-variable 'message-reply-headers) nil) - (make-local-variable 'message-user-agent) - (make-local-variable 'message-post-method) - (set (make-local-variable 'message-sent-message-via) nil) - (set (make-local-variable 'message-checksum) nil) - (make-local-variable 'message-parameter-alist) - (setq message-parameter-alist - (copy-sequence message-startup-parameter-alist)) - (message-setup-fill-variables) - ;; Allow using comment commands to add/remove quoting. - (set (make-local-variable 'comment-start) message-yank-prefix) - (if (featurep 'xemacs) - (message-setup-toolbar) - (set (make-local-variable 'font-lock-defaults) - '(message-font-lock-keywords t)) - (if (boundp 'tool-bar-map) - (set (make-local-variable 'tool-bar-map) (message-tool-bar-map)))) - (easy-menu-add message-mode-menu message-mode-map) - (easy-menu-add message-mode-field-menu message-mode-map) - ;; Allow mail alias things. - (when (eq message-mail-alias-type 'abbrev) - (if (fboundp 'mail-abbrevs-setup) - (mail-abbrevs-setup) - (mail-aliases-setup))) - (message-set-auto-save-file-name) - (set (make-local-variable 'indent-tabs-mode) nil)) ;No tabs for indentation. - -(defun message-setup-fill-variables () - "Setup message fill variables." - (set (make-local-variable 'fill-paragraph-function) - 'message-fill-paragraph) - (make-local-variable 'paragraph-separate) - (make-local-variable 'paragraph-start) - (make-local-variable 'adaptive-fill-regexp) - (unless (boundp 'adaptive-fill-first-line-regexp) - (setq adaptive-fill-first-line-regexp nil)) - (make-local-variable 'adaptive-fill-first-line-regexp) - (make-local-variable 'auto-fill-inhibit-regexp) - (let ((quote-prefix-regexp - ;; User should change message-cite-prefix-regexp if - ;; message-yank-prefix is set to an abnormal value. - (concat "\\(" message-cite-prefix-regexp "\\)[ \t]*"))) - (setq paragraph-start - (concat - (regexp-quote mail-header-separator) "$\\|" - "[ \t]*$\\|" ; blank lines - "-- $\\|" ; signature delimiter - "---+$\\|" ; delimiters for forwarded messages - page-delimiter "$\\|" ; spoiler warnings - ".*wrote:$\\|" ; attribution lines - quote-prefix-regexp "$")) ; empty lines in quoted text - (setq paragraph-separate paragraph-start) - (setq adaptive-fill-regexp - (concat quote-prefix-regexp "\\|" adaptive-fill-regexp)) - (setq adaptive-fill-first-line-regexp - (concat quote-prefix-regexp "\\|" - adaptive-fill-first-line-regexp)) - (setq auto-fill-inhibit-regexp "^[A-Z][^: \n\t]+:"))) - - - -;;; -;;; Message mode commands -;;; - -;;; Movement commands - -(defun message-goto-to () - "Move point to the To header." - (interactive) - (message-position-on-field "To")) - -(defun message-goto-subject () - "Move point to the Subject header." - (interactive) - (message-position-on-field "Subject")) - -(defun message-goto-cc () - "Move point to the Cc header." - (interactive) - (message-position-on-field "Cc" "To")) - -(defun message-goto-bcc () - "Move point to the Bcc header." - (interactive) - (message-position-on-field "Bcc" "Cc" "To")) - -(defun message-goto-fcc () - "Move point to the Fcc header." - (interactive) - (message-position-on-field "Fcc" "To" "Newsgroups")) - -(defun message-goto-reply-to () - "Move point to the Reply-To header." - (interactive) - (message-position-on-field "Reply-To" "Subject")) - -(defun message-goto-mail-reply-to () - "Move point to the Mail-Reply-To header." - (interactive) - (message-position-on-field "Mail-Reply-To" "Subject")) - -(defun message-goto-mail-followup-to () - "Move point to the Mail-Followup-To header. If the header is newly created -and To field contains only one address, the address is inserted in default." - (interactive) - (unless (message-position-on-field "Mail-Followup-To" "Subject") - (let ((start (point)) - addresses) - (save-restriction - (message-narrow-to-headers) - (setq addresses (split-string (mail-strip-quoted-names - (or (std11-fetch-field "to") "")) - "[ \f\t\n\r\v,]+")) - (when (eq 1 (length addresses)) - (goto-char start) - (insert (car addresses)) - (goto-char start)))))) - -(defun message-goto-mail-copies-to () - "Move point to the Mail-Copies-To header. If the header is newly created, -a string \"never\" is inserted in default." - (interactive) - (unless (message-position-on-field "Mail-Copies-To" "Subject") - (insert "never") - (backward-char 5))) - -(defun message-goto-newsgroups () - "Move point to the Newsgroups header." - (interactive) - (message-position-on-field "Newsgroups")) - -(defun message-goto-distribution () - "Move point to the Distribution header." - (interactive) - (message-position-on-field "Distribution")) - -(defun message-goto-followup-to () - "Move point to the Followup-To header." - (interactive) - (message-position-on-field "Followup-To" "Newsgroups")) - -(defun message-goto-keywords () - "Move point to the Keywords header." - (interactive) - (message-position-on-field "Keywords" "Subject")) - -(defun message-goto-summary () - "Move point to the Summary header." - (interactive) - (message-position-on-field "Summary" "Subject")) - -(defun message-goto-body (&optional interactivep) - "Move point to the beginning of the message body." - (interactive (list t)) - (when (and interactivep - (looking-at "[ \t]*\n")) - (expand-abbrev)) - (goto-char (point-min)) - (or (search-forward (concat "\n" mail-header-separator "\n") nil t) - (search-forward-regexp "[^:]+:\\([^\n]\\|\n[ \t]\\)+\n\n" nil t))) - -(defun message-goto-eoh () - "Move point to the end of the headers." - (interactive) - (message-goto-body) - (forward-line -1)) - -(defun message-goto-signature () - "Move point to the beginning of the message signature. -If there is no signature in the article, go to the end and -return nil." - (interactive) - (goto-char (point-min)) - (if (re-search-forward message-signature-separator nil t) - (forward-line 1) - (goto-char (point-max)) - nil)) - - - -(defun message-insert-to (&optional force) - "Insert a To header that points to the author of the article being replied to. -If the original author requested not to be sent mail, the function signals -an error. -With the prefix argument FORCE, insert the header anyway." - (interactive "P") - (let ((co (message-fetch-reply-field "mail-copies-to"))) - (when (and (null force) - co - (or (equal (downcase co) "never") - (equal (downcase co) "nobody"))) - (error "The user has requested not to have copies sent via mail"))) - (when (and (message-position-on-field "To") - (mail-fetch-field "to") - (not (string-match "\\` *\\'" (mail-fetch-field "to")))) - (insert ", ")) - (insert (or (message-fetch-reply-field "mail-reply-to") - (message-fetch-reply-field "reply-to") - (message-fetch-reply-field "from") ""))) - -(defun message-widen-reply () - "Widen the reply to include maximum recipients." - (interactive) - (let ((follow-to - (and message-reply-buffer - (buffer-name message-reply-buffer) - (save-excursion - (set-buffer message-reply-buffer) - (message-get-reply-headers t))))) - (save-excursion - (save-restriction - (message-narrow-to-headers) - (dolist (elem follow-to) - (message-remove-header (symbol-name (car elem))) - (goto-char (point-min)) - (insert (symbol-name (car elem)) ": " - (cdr elem) "\n")))))) - -(defun message-insert-newsgroups () - "Insert the Newsgroups header from the article being replied to." - (interactive) - (when (and (message-position-on-field "Newsgroups") - (mail-fetch-field "newsgroups") - (not (string-match "\\` *\\'" (mail-fetch-field "newsgroups")))) - (insert ",")) - (insert (or (message-fetch-reply-field "newsgroups") ""))) - - - -;;; Various commands - -(defun message-delete-not-region (beg end) - "Delete everything in the body of the current message outside of the region." - (interactive "r") - (let (citeprefix) - (save-excursion - (goto-char beg) - ;; snarf citation prefix, if appropriate - (unless (eq (point) (progn (beginning-of-line) (point))) - (when (looking-at message-cite-prefix-regexp) - (setq citeprefix (match-string 0)))) - (goto-char end) - (delete-region (point) (if (not (message-goto-signature)) - (point) - (forward-line -2) - (point))) - (insert "\n") - (goto-char beg) - (delete-region beg (progn (message-goto-body) - (forward-line 2) - (point))) - (when citeprefix - (insert citeprefix)))) - (when (message-goto-signature) - (forward-line -2))) - -(defun message-kill-to-signature () - "Deletes all text up to the signature." - (interactive) - (let ((point (point))) - (message-goto-signature) - (unless (eobp) - (forward-line -2)) - (kill-region point (point)) - (unless (bolp) - (insert "\n")))) - -(defun message-newline-and-reformat (&optional arg not-break) - "Insert four newlines, and then reformat if inside quoted text. -Prefix arg means justify as well." - (interactive (list (if current-prefix-arg 'full))) - (let (quoted point beg end leading-space bolp) - (setq point (point)) - (beginning-of-line) - (setq beg (point)) - (setq bolp (= beg point)) - ;; Find first line of the paragraph. - (if not-break - (while (and (not (eobp)) - (not (looking-at message-cite-prefix-regexp)) - (looking-at paragraph-start)) - (forward-line 1))) - ;; Find the prefix - (when (looking-at message-cite-prefix-regexp) - (setq quoted (match-string 0)) - (goto-char (match-end 0)) - (looking-at "[ \t]*") - (setq leading-space (match-string 0))) - (if (and quoted - (not not-break) - (not bolp) - (< (- point beg) (length quoted))) - ;; break inside the cite prefix. - (setq quoted nil - end nil)) - (if quoted - (progn - (forward-line 1) - (while (and (not (eobp)) - (not (looking-at paragraph-separate)) - (looking-at message-cite-prefix-regexp) - (equal quoted (match-string 0))) - (goto-char (match-end 0)) - (looking-at "[ \t]*") - (if (> (length leading-space) (length (match-string 0))) - (setq leading-space (match-string 0))) - (forward-line 1)) - (setq end (point)) - (goto-char beg) - (while (and (if (bobp) nil (forward-line -1) t) - (not (looking-at paragraph-start)) - (looking-at message-cite-prefix-regexp) - (equal quoted (match-string 0))) - (setq beg (point)) - (goto-char (match-end 0)) - (looking-at "[ \t]*") - (if (> (length leading-space) (length (match-string 0))) - (setq leading-space (match-string 0))))) - (while (and (not (eobp)) - (not (looking-at paragraph-separate)) - (not (looking-at message-cite-prefix-regexp))) - (forward-line 1)) - (setq end (point)) - (goto-char beg) - (while (and (if (bobp) nil (forward-line -1) t) - (not (looking-at paragraph-start)) - (not (looking-at message-cite-prefix-regexp))) - (setq beg (point)))) - (goto-char point) - (save-restriction - (narrow-to-region beg end) - (if not-break - (setq point nil) - (if bolp - (insert "\n") - (insert "\n\n")) - (setq point (point)) - (insert "\n\n") - (delete-region (point) (re-search-forward "[ \t]*")) - (when (and quoted (not bolp)) - (insert quoted leading-space))) - (if quoted - (let* ((adaptive-fill-regexp - (regexp-quote (concat quoted leading-space))) - (adaptive-fill-first-line-regexp - adaptive-fill-regexp )) - (fill-paragraph arg)) - (fill-paragraph arg)) - (if point (goto-char point))))) - -(defun message-fill-paragraph (&optional arg) - "Like `fill-paragraph'." - (interactive (list (if current-prefix-arg 'full))) - (if (and (boundp 'filladapt-mode) filladapt-mode) - nil - (message-newline-and-reformat arg t) - t)) - -(defun message-insert-signature (&optional force) - "Insert a signature. See documentation for variable `message-signature'." - (interactive (list 0)) - (let* ((signature - (cond - ((and (null message-signature) - (eq force 0)) - (save-excursion - (goto-char (point-max)) - (not (re-search-backward message-signature-separator nil t)))) - ((and (null message-signature) - force) - t) - ((message-functionp message-signature) - (funcall message-signature)) - ((listp message-signature) - (eval message-signature)) - (t message-signature))) - (signature - (cond ((stringp signature) - signature) - ((and (eq t signature) - message-signature-file - (file-exists-p message-signature-file)) - signature)))) - (when signature - (goto-char (point-max)) - ;; Insert the signature. - (unless (bolp) - (insert "\n")) - (insert "\n" message-signature-separator-for-insertion) - (unless (bolp) - (insert "\n")) - (if (eq signature t) - (insert-file-contents message-signature-file) - (insert signature)) - (goto-char (point-max)) - (or (bolp) (insert "\n"))))) - -(defun message-elide-region (b e) - "Elide the text in the region. -An ellipsis (from `message-elide-ellipsis') will be inserted where the -text was killed." - (interactive "r") - (kill-region b e) - (insert message-elide-ellipsis)) - -(defvar message-caesar-translation-table nil) - -(defun message-caesar-region (b e &optional n) - "Caesar rotate region B to E by N, default 13, for decrypting netnews." - (interactive - (list - (min (point) (or (mark t) (point))) - (max (point) (or (mark t) (point))) - (when current-prefix-arg - (prefix-numeric-value current-prefix-arg)))) - - (setq n (if (numberp n) (mod n 26) 13)) ;canonize N - (unless (or (zerop n) ; no action needed for a rot of 0 - (= b e)) ; no region to rotate - ;; We build the table, if necessary. - (when (or (not message-caesar-translation-table) - (/= (aref message-caesar-translation-table ?a) (+ ?a n))) - (setq message-caesar-translation-table - (message-make-caesar-translation-table n))) - (translate-region b e message-caesar-translation-table))) - -(defun message-make-caesar-translation-table (n) - "Create a rot table with offset N." - (let ((i -1) - (table (make-string 256 0))) - (while (< (incf i) 256) - (aset table i i)) - (concat - (substring table 0 ?A) - (substring table (+ ?A n) (+ ?A n (- 26 n))) - (substring table ?A (+ ?A n)) - (substring table (+ ?A 26) ?a) - (substring table (+ ?a n) (+ ?a n (- 26 n))) - (substring table ?a (+ ?a n)) - (substring table (+ ?a 26) 255)))) - -(defun message-caesar-buffer-body (&optional rotnum) - "Caesar rotate all letters in the current buffer by 13 places. -Used to encode/decode possibly offensive messages (commonly in rec.humor). -With prefix arg, specifies the number of places to rotate each letter forward. -Mail and USENET news headers are not rotated." - (interactive (if current-prefix-arg - (list (prefix-numeric-value current-prefix-arg)) - (list nil))) - (save-excursion - (save-restriction - (when (message-goto-body) - (narrow-to-region (point) (point-max))) - (message-caesar-region (point-min) (point-max) rotnum)))) - -(defun message-pipe-buffer-body (program) - "Pipe the message body in the current buffer through PROGRAM." - (save-excursion - (save-restriction - (when (message-goto-body) - (narrow-to-region (point) (point-max))) - (shell-command-on-region - (point-min) (point-max) program nil t)))) - -(defun message-rename-buffer (&optional enter-string) - "Rename the *message* buffer to \"*message* RECIPIENT\". -If the function is run with a prefix, it will ask for a new buffer -name, rather than giving an automatic name." - (interactive "Pbuffer name: ") - (save-excursion - (save-restriction - (goto-char (point-min)) - (narrow-to-region (point) - (search-forward mail-header-separator nil 'end)) - (let* ((mail-to (or - (if (message-news-p) (message-fetch-field "Newsgroups") - (message-fetch-field "To")) - "")) - (mail-trimmed-to - (if (string-match "," mail-to) - (concat (substring mail-to 0 (match-beginning 0)) ", ...") - mail-to)) - (name-default (concat "*message* " mail-trimmed-to)) - (name (if enter-string - (read-string "New buffer name: " name-default) - name-default))) - (rename-buffer name t))))) - -(defun message-fill-yanked-message (&optional justifyp) - "Fill the paragraphs of a message yanked into this one. -Numeric argument means justify as well." - (interactive "P") - (save-excursion - (goto-char (point-min)) - (search-forward (concat "\n" mail-header-separator "\n") nil t) - (let ((fill-prefix message-yank-prefix)) - (fill-individual-paragraphs (point) (point-max) justifyp)))) - -(defun message-indent-citation () - "Modify text just inserted from a message to be cited. -The inserted text should be the region. -When this function returns, the region is again around the modified text. - -Normally, indent each nonblank line `message-indentation-spaces' spaces. -However, if `message-yank-prefix' is non-nil, insert that prefix on each line." - (let ((start (point))) - ;; Remove unwanted headers. - (when message-ignored-cited-headers - (let (all-removed) - (save-restriction - (narrow-to-region - (goto-char start) - (if (search-forward "\n\n" nil t) - (1- (point)) - (point))) - (message-remove-header message-ignored-cited-headers t) - (when (= (point-min) (point-max)) - (setq all-removed t)) - (goto-char (point-max))) - (if all-removed - (goto-char start) - (forward-line 1)))) - ;; Delete blank lines at the start of the buffer. - (while (and (point-min) - (eolp) - (not (eobp))) - (message-delete-line)) - ;; Delete blank lines at the end of the buffer. - (goto-char (point-max)) - (unless (bolp) - (insert "\n")) - (while (and (zerop (forward-line -1)) - (looking-at "$")) - (message-delete-line)) - ;; Do the indentation. - (if (null message-yank-prefix) - (indent-rigidly start (mark t) message-indentation-spaces) - (save-excursion - (goto-char start) - (let (last-line) - ;; `last-line' describes the contents of the last line - ;; encountered in the loop below. nil means "empty line", - ;; spaces "line consisting entirely of whitespace", - ;; right-angle "line starts with >", quoted "quote character - ;; at the beginning of the line", text "the remaining cases". - (while (< (point) (mark t)) - (cond - ((eolp) - (insert message-yank-cited-prefix) - (setq last-line nil)) - ((looking-at ">") - (if (memq last-line '(nil spaces right-angle quoted)) - (progn - (insert message-yank-cited-prefix) - (setq last-line 'quoted)) - (insert message-yank-prefix) - (setq last-line 'right-angle))) - ((looking-at "\\s-+$") - (insert message-yank-prefix) - (setq last-line 'spaces)) - (t - (insert message-yank-prefix) - (setq last-line 'text))) - (forward-line 1))))) - (goto-char start))) - -(defun message-list-references (refs-list &rest refs-strs) - "Add `Message-ID's which appear in REFS-STRS but not in REFS-LIST, -to REFS-LIST." - (let (refs ref id saved-id) - (when (and refs-list - (integerp message-list-references-add-position)) - (let ((pos message-list-references-add-position)) - (while (and refs-list - (> pos 0)) - (push (pop refs-list) saved-id) - (setq pos (1- pos))))) - (while refs-strs - (when (setq refs (pop refs-strs)) - (setq refs (std11-parse-msg-ids (std11-lexical-analyze refs))) - (while refs - (when (eq (car (setq ref (pop refs))) 'msg-id) - (setq id (concat "<" (mapconcat 'cdr (cdr ref) "") ">")) - (or (member id refs-list) - (member id saved-id) - (push id refs-list)))))) - (while saved-id - (push (pop saved-id) refs-list)) - refs-list)) - -(defvar gnus-article-copy) -(defun message-yank-original (&optional arg) - "Insert the message being replied to, if any. -Puts point before the text and mark after. -Normally indents each nonblank line ARG spaces (default 3). However, -if `message-yank-prefix' is non-nil, insert that prefix on each line. - -This function uses `message-cite-function' to do the actual citing. - -Just \\[universal-argument] as argument means don't indent, insert no -prefix, and don't delete any headers. - -In addition, if `message-yank-add-new-references' is non-nil and this -command is called interactively, new IDs from the yanked article will -be added to \"References\" field. -\(See also `message-yank-add-new-references'.)" - (interactive "P") - (let ((modified (buffer-modified-p)) - (buffer (message-eval-parameter message-reply-buffer)) - start end refs) - (when (and buffer - message-cite-function) - (delete-windows-on buffer t) - (insert-buffer buffer) ; mark will be set at the end of article. - (setq start (point) - end (mark t)) - - ;; Add new IDs to References field. - (when (and message-yank-add-new-references (interactive-p)) - (save-excursion - (save-restriction - (message-narrow-to-headers) - (setq refs (message-list-references - nil - (message-fetch-field "References"))) - (widen) - (narrow-to-region start end) - (std11-narrow-to-header) - (when (setq refs (message-list-references - refs - (unless (eq message-yank-add-new-references - 'message-id-only) - (or (message-fetch-field "References") - (message-fetch-field "In-Reply-To"))) - (message-fetch-field "Message-ID"))) - (widen) - (message-narrow-to-headers) - (goto-char (point-min)) - (let ((case-fold-search t)) - (if (re-search-forward "^References:\\([\t ]+.+\n\\)+" nil t) - (replace-match "") - (goto-char (point-max)))) - (mail-header-format - (list (or (assq 'References message-header-format-alist) - '(References . message-fill-references))) - (list (cons 'References - (mapconcat 'identity (nreverse refs) " ")))) - (backward-delete-char 1))))) - - (unless arg - (if (and message-suspend-font-lock-when-citing - (boundp 'font-lock-mode) - (symbol-value 'font-lock-mode)) - (unwind-protect - (progn - (sit-for 0) - (font-lock-mode 0) - (funcall message-cite-function)) - (font-lock-mode 1)) - (funcall message-cite-function))) - (message-exchange-point-and-mark) - (unless (bolp) - (insert ?\n)) - (unless modified - (setq message-checksum (message-checksum)))))) - -(defun message-yank-buffer (buffer) - "Insert BUFFER into the current buffer and quote it." - (interactive "bYank buffer: ") - (let ((message-reply-buffer buffer)) - (save-window-excursion - (message-yank-original)))) - -(defun message-buffers () - "Return a list of active message buffers." - (let (buffers) - (save-excursion - (dolist (buffer (buffer-list t)) - (set-buffer buffer) - (when (and (eq major-mode 'message-mode) - (null message-sent-message-via)) - (push (buffer-name buffer) buffers)))) - (nreverse buffers))) - -(defun message-cite-original-without-signature () - "Cite function in the standard Message manner." - (let ((start (point)) - (end (mark t)) - (functions - (when message-indent-citation-function - (if (listp message-indent-citation-function) - message-indent-citation-function - (list message-indent-citation-function)))) - (message-reply-headers (or message-reply-headers - (make-mail-header)))) - (mail-header-set-from message-reply-headers - (save-restriction - (narrow-to-region - (point) - (if (search-forward "\n\n" nil t) - (1- (point)) - (point-max))) - (or (message-fetch-field "from") - "unknown sender"))) - ;; Allow undoing. - (undo-boundary) - (goto-char end) - (when (re-search-backward message-signature-separator start t) - ;; Also peel off any blank lines before the signature. - (forward-line -1) - (while (looking-at "^[ \t]*$") - (forward-line -1)) - (forward-line 1) - (delete-region (point) end) - (unless (search-backward "\n\n" start t) - ;; Insert a blank line if it is peeled off. - (insert "\n"))) - (goto-char start) - (while functions - (funcall (pop functions))) - (when message-citation-line-function - (unless (bolp) - (insert "\n")) - (funcall message-citation-line-function)))) - -(eval-when-compile (defvar mail-citation-hook)) ;Compiler directive -(defun message-cite-original () - "Cite function in the standard Message manner." - (if (and (boundp 'mail-citation-hook) - mail-citation-hook) - (run-hooks 'mail-citation-hook) - (let ((start (point)) - (end (mark t)) - (functions - (when message-indent-citation-function - (if (listp message-indent-citation-function) - message-indent-citation-function - (list message-indent-citation-function)))) - (message-reply-headers (or message-reply-headers - (make-mail-header)))) - (mail-header-set-from message-reply-headers - (save-restriction - (narrow-to-region - (point) - (if (search-forward "\n\n" nil t) - (1- (point)) - (point-max))) - (or (message-fetch-field "from") - "unknown sender"))) - (goto-char start) - (while functions - (funcall (pop functions))) - (when message-citation-line-function - (unless (bolp) - (insert "\n")) - (funcall message-citation-line-function))))) - -(defun message-insert-citation-line () - "Insert a simple citation line." - (when message-reply-headers - (insert (mail-header-from message-reply-headers) " writes:\n\n"))) - -(defun message-position-on-field (header &rest afters) - (let ((case-fold-search t)) - (save-restriction - (narrow-to-region - (goto-char (point-min)) - (progn - (re-search-forward - (concat "^" (regexp-quote mail-header-separator) "$")) - (match-beginning 0))) - (goto-char (point-min)) - (if (re-search-forward (concat "^" (regexp-quote header) ":") nil t) - (progn - (re-search-forward "^[^ \t]" nil 'move) - (beginning-of-line) - (skip-chars-backward "\n") - t) - (while (and afters - (not (re-search-forward - (concat "^" (regexp-quote (car afters)) ":") - nil t))) - (pop afters)) - (when afters - (re-search-forward "^[^ \t]" nil 'move) - (beginning-of-line)) - (insert header ": \n") - (forward-char -1) - nil)))) - -(defun message-remove-signature () - "Remove the signature from the text between point and mark. -The text will also be indented the normal way." - (save-excursion - (let ((start (point)) - mark) - (if (not (re-search-forward message-signature-separator (mark t) t)) - ;; No signature here, so we just indent the cited text. - (message-indent-citation) - ;; Find the last non-empty line. - (forward-line -1) - (while (looking-at "[ \t]*$") - (forward-line -1)) - (forward-line 1) - (setq mark (set-marker (make-marker) (point))) - (goto-char start) - (message-indent-citation) - ;; Enable undoing the deletion. - (undo-boundary) - (delete-region mark (mark t)) - (set-marker mark nil))))) - - - -;;; -;;; Sending messages -;;; - -;; Avoid byte-compile warning. -(defvar message-encoding-buffer nil) -(defvar message-edit-buffer nil) -(defvar message-mime-mode nil) - -(defun message-send-and-exit (&optional arg) - "Send message like `message-send', then, if no errors, exit from mail buffer." - (interactive "P") - (let ((buf (current-buffer)) - (actions message-exit-actions) - (frame (selected-frame)) - (org-frame message-original-frame)) - (when (and (message-send arg) - (buffer-name buf)) - (if message-kill-buffer-on-exit - (kill-buffer buf) - (bury-buffer buf) - (when (eq buf (current-buffer)) - (message-bury buf))) - (message-do-actions actions) - (message-delete-frame frame org-frame) - t))) - -(defun message-dont-send () - "Don't send the message you have been editing." - (interactive) - (message-save-drafts) - (let ((actions message-postpone-actions) - (frame (selected-frame)) - (org-frame message-original-frame)) - (message-bury (current-buffer)) - (message-do-actions actions) - (message-delete-frame frame org-frame))) - -(defun message-kill-buffer () - "Kill the current buffer." - (interactive) - (when (or (not (buffer-modified-p)) - (eq t message-kill-buffer-query-function) - (funcall message-kill-buffer-query-function - "The buffer modified; kill anyway? ")) - (let ((actions message-kill-actions) - (frame (selected-frame)) - (org-frame message-original-frame)) - (setq buffer-file-name nil) - (kill-buffer (current-buffer)) - (message-do-actions actions) - (message-delete-frame frame org-frame))) - (message "")) - -(defun message-mimic-kill-buffer () - "Kill the current buffer with query." - (interactive) - (unless (eq 'message-mode major-mode) - (error "%s must be invoked from a message buffer." this-command)) - (let ((command this-command) - (bufname (read-buffer (format "Kill buffer: (default %s) " - (buffer-name))))) - (if (or (not bufname) - (string-equal bufname "") - (string-equal bufname (buffer-name))) - (message-kill-buffer) - (message "%s must be invoked only for the current buffer." command)))) - -(defun message-delete-frame (frame org-frame) - "Delete frame for editing message." - (when (and (or (static-if (featurep 'xemacs) - (device-on-window-system-p) - window-system) - (>= emacs-major-version 20)) - (or (and (eq message-delete-frame-on-exit t) - (select-frame frame) - (or (eq frame org-frame) - (prog1 - (y-or-n-p "Delete this frame?") - (message "")))) - (and (eq message-delete-frame-on-exit 'ask) - (select-frame frame) - (prog1 - (y-or-n-p "Delete this frame?") - (message ""))))) - (delete-frame frame))) - -(defun message-bury (buffer) - "Bury this mail BUFFER." - (let ((newbuf (other-buffer buffer))) - (bury-buffer buffer) - (if (and (fboundp 'frame-parameters) - (cdr (assq 'dedicated (frame-parameters))) - (not (null (delq (selected-frame) (visible-frame-list))))) - (delete-frame (selected-frame)) - (switch-to-buffer newbuf)))) - -(defun message-send (&optional arg) - "Send the message in the current buffer. -If `message-interactive' is non-nil, wait for success indication or -error messages, and inform user. -Otherwise any failure is reported in a message back to the user from -the mailer. -The usage of ARG is defined by the instance that called Message. -It should typically alter the sending method in some way or other." - (interactive "P") - ;; Disabled test. - (when (or (buffer-modified-p) - (message-check-element 'unchanged) - (y-or-n-p "No changes in the buffer; really send? ")) - ;; Make it possible to undo the coming changes. - (undo-boundary) - (let ((inhibit-read-only t)) - (put-text-property (point-min) (point-max) 'read-only nil)) - (run-hooks 'message-send-hook) - (message-fix-before-sending) - (message message-sending-message) - (let ((message-encoding-buffer - (message-generate-new-buffer-clone-locals " message encoding")) - (message-edit-buffer (current-buffer)) - (message-mime-mode mime-edit-mode-flag) - (alist message-send-method-alist) - (success t) - elem sent - (message-options message-options)) - (message-options-set-recipient) - (save-excursion - (set-buffer message-encoding-buffer) - (erase-buffer) - ;; Avoid copying text props. - (let (message-invisibles) - (insert - (with-current-buffer message-edit-buffer - (setq message-invisibles (message-find-invisible-regions)) - (buffer-substring-no-properties (point-min) (point-max)))) - ;; Inherit the invisible property of texts to make MIME-Edit - ;; find the MIME part boundaries. - (dolist (region message-invisibles) - (put-text-property (car region) (cdr region) 'invisible t))) - (funcall message-encode-function) - (while (and success - (setq elem (pop alist))) - (when (funcall (cadr elem)) - (when (and (or (not (memq (car elem) - message-sent-message-via)) - (if (or (message-gnksa-enable-p 'multiple-copies) - (not (eq (car elem) 'news))) - (y-or-n-p - (format - "Already sent message via %s; resend? " - (car elem))) - (error "Denied posting -- multiple copies"))) - (setq success (funcall (caddr elem) arg))) - (setq sent t))))) - (unless (or sent (not success)) - (error "No methods specified to send by")) - (prog1 - (when (and success sent) - (message-do-fcc) - (save-excursion - (run-hooks 'message-sent-hook)) - (message "Sending...done") - ;; Mark the buffer as unmodified and delete auto-save. - (set-buffer-modified-p nil) - (delete-auto-save-file-if-necessary t) - (message-disassociate-draft) - ;; Delete other mail buffers and stuff. - (message-do-send-housekeeping) - (message-do-actions message-send-actions) - ;; Return success. - t) - (kill-buffer message-encoding-buffer))))) - -(defun message-send-via-mail (arg) - "Send the current message via mail." - (message-send-mail arg)) - -(defun message-send-via-news (arg) - "Send the current message via news." - (message-send-news arg)) - -(defmacro message-check (type &rest forms) - "Eval FORMS if TYPE is to be checked." - `(or (message-check-element ,type) - (save-excursion - ,@forms))) - -(put 'message-check 'lisp-indent-function 1) -(put 'message-check 'edebug-form-spec '(form body)) - -;; This function will be used by MIME-Edit when inserting invisible parts. -(defun message-invisible-region (start end) - (if (featurep 'xemacs) - (if (save-excursion - (goto-char start) - (eq (following-char) ?\n)) - (setq start (1+ start))) - (if (save-excursion - (goto-char (1- end)) - (eq (following-char) ?\n)) - (setq end (1- end)))) - (put-text-property start end 'invisible t) - (if (eq 'message-mode major-mode) - (put-text-property start end 'message-invisible t))) - -(eval-after-load "invisible" - '(defalias 'invisible-region 'message-invisible-region)) - -(defun message-find-invisible-regions () - "Find invisible texts with the property `message-invisible' and -return a list of points." - (let (from - (to (point-min)) - regions) - (while (setq from (text-property-any to (point-max) - 'message-invisible t)) - (setq to (or (text-property-not-all from (point-max) - 'message-invisible t) - (point-max))) - (push (cons from to) regions)) - regions)) - -(defun message-fix-before-sending () - "Do various things to make the message nice before sending it." - ;; Make sure there's a newline at the end of the message. - (widen) - (goto-char (point-max)) - (unless (bolp) - (insert "\n")) - ;; Expose all invisible text with the property `message-invisible'. - ;; We should believe that the things might be created by MIME-Edit. - (let ((message-invisibles (message-find-invisible-regions))) - (dolist (region message-invisibles) - (put-text-property (car region) (cdr region) 'invisible nil)) - ;; Expose all invisible text. - (message-check 'invisible-text - (when (text-property-any (point-min) (point-max) 'invisible t) - (put-text-property (point-min) (point-max) 'invisible nil) - (unless (yes-or-no-p - "Invisible text found and made visible; continue posting? ") - (error "Invisible text found and made visible")))) - ;; Hide again all text with the property `message-invisible'. - ;; It is needed to make MIME-Edit find the MIME part boundaries. - (dolist (region message-invisibles) - (put-text-property (car region) (cdr region) 'invisible t)))) - -(defun message-add-action (action &rest types) - "Add ACTION to be performed when doing an exit of type TYPES." - (let (var) - (while types - (set (setq var (intern (format "message-%s-actions" (pop types)))) - (nconc (symbol-value var) (list action)))))) - -(defun message-do-actions (actions) - "Perform all actions in ACTIONS." - ;; Now perform actions on successful sending. - (while actions - (ignore-errors - (cond - ;; A simple function. - ((message-functionp (car actions)) - (funcall (car actions))) - ;; Something to be evaled. - (t - (eval (car actions))))) - (pop actions))) - -(defsubst message-maybe-split-and-send-mail () - "Split a message if necessary, and send it via mail. -Returns nil if sending succeeded, returns any string if sending failed. -This sub function is for exclusive use of `message-send-mail'." - (let ((mime-edit-split-ignored-field-regexp - mime-edit-split-ignored-field-regexp) - (case-fold-search t) - failure) - (while (string-match "Message-ID" mime-edit-split-ignored-field-regexp) - (setq mime-edit-split-ignored-field-regexp - (concat (substring mime-edit-split-ignored-field-regexp - 0 (match-beginning 0)) - "Hey_MIME-Edit,_there_is_an_inviolable_Message_ID" - "_so_don't_rape_it!" - (substring mime-edit-split-ignored-field-regexp - (match-end 0))))) - (setq failure - (or - (catch 'message-sending-mail-failure - (mime-edit-maybe-split-and-send - (function - (lambda () - (interactive) - (save-restriction - (std11-narrow-to-header mail-header-separator) - (goto-char (point-min)) - (when (re-search-forward "^Message-ID:" nil t) - (delete-region (match-end 0) (std11-field-end)) - (insert " " (message-make-message-id)))) - (condition-case err - (funcall (or message-send-mail-real-function - message-send-mail-function)) - (error - (throw 'message-sending-mail-failure err)))))) - nil) - (condition-case err - (progn - (funcall (or message-send-mail-real-function - message-send-mail-function)) - nil) - (error err)))) - (when failure - (if (eq 'error (car failure)) - (cadr failure) - (prin1-to-string failure))))) - -(defun message-send-mail-partially () - "Send mail as message/partial." - ;; replace the header delimiter with a blank line - (goto-char (point-min)) - (re-search-forward - (concat "^" (regexp-quote mail-header-separator) "\n")) - (replace-match "\n") - (run-hooks 'message-send-mail-hook) - (let ((p (goto-char (point-min))) - (tembuf (message-generate-new-buffer-clone-locals " message temp")) - (curbuf (current-buffer)) - (id (message-make-message-id)) (n 1) - plist total header required-mail-headers) - (while (not (eobp)) - (if (< (point-max) (+ p message-send-mail-partially-limit)) - (goto-char (point-max)) - (goto-char (+ p message-send-mail-partially-limit)) - (beginning-of-line) - (if (<= (point) p) (forward-line 1))) ;; In case of bad message. - (push p plist) - (setq p (point))) - (setq total (length plist)) - (push (point-max) plist) - (setq plist (nreverse plist)) - (unwind-protect - (save-excursion - (setq p (pop plist)) - (while plist - (set-buffer curbuf) - (copy-to-buffer tembuf p (car plist)) - (set-buffer tembuf) - (goto-char (point-min)) - (if header - (progn - (goto-char (point-min)) - (narrow-to-region (point) (point)) - (insert header)) - (message-goto-eoh) - (setq header (buffer-substring (point-min) (point))) - (goto-char (point-min)) - (narrow-to-region (point) (point)) - (insert header) - (message-remove-header "Mime-Version") - (message-remove-header "Content-Type") - (message-remove-header "Content-Transfer-Encoding") - (message-remove-header "Message-ID") - (message-remove-header "Lines") - (goto-char (point-max)) - (insert "Mime-Version: 1.0\n") - (setq header (buffer-substring (point-min) (point-max)))) - (goto-char (point-max)) - (insert (format "Content-Type: message/partial; id=\"%s\"; number=%d; total=%d\n" - id n total)) - (let ((mail-header-separator "")) - (when (memq 'Message-ID message-required-mail-headers) - (insert "Message-ID: " (message-make-message-id) "\n")) - (when (memq 'Lines message-required-mail-headers) - (let ((mail-header-separator "")) - (insert "Lines: " (message-make-lines) "\n"))) - (message-goto-subject) - (end-of-line) - (insert (format " (%d/%d)" n total)) - (goto-char (point-max)) - (insert "\n") - (widen) - (mm-with-unibyte-current-buffer - (funcall (or message-send-mail-real-function - message-send-mail-function)))) - (setq n (+ n 1)) - (setq p (pop plist)) - (erase-buffer))) - (kill-buffer tembuf)))) - -(defun message-send-mail (&optional arg) - (require 'mail-utils) - (let* ((tembuf (message-generate-new-buffer-clone-locals " message temp")) - (case-fold-search nil) - (news (message-news-p)) - (message-this-is-mail t) - failure) - (save-restriction - (message-narrow-to-headers) - ;; Insert some headers. - (let ((message-deletable-headers - (if news nil message-deletable-headers))) - (message-generate-headers message-required-mail-headers)) - ;; Let the user do all of the above. - (run-hooks 'message-header-hook)) - (if (not (message-check-mail-syntax)) - (progn - (message "") - nil) - (unwind-protect - (save-excursion - (set-buffer tembuf) - (erase-buffer) - (insert-buffer message-encoding-buffer) - ;; Remove some headers. - (save-restriction - (message-narrow-to-headers) -;; We Semi-gnus people have no use for it. -;; ;; We (re)generate the Lines header. -;; (when (memq 'Lines message-required-mail-headers) -;; (message-generate-headers '(Lines))) - ;; Remove some headers. - (message-remove-header message-ignored-mail-headers t)) - (goto-char (point-max)) - ;; require one newline at the end. - (or (= (preceding-char) ?\n) - (insert ?\n)) - (when - (save-restriction - (message-narrow-to-headers) - (and news - (or (message-fetch-field "cc") - (message-fetch-field "to")) - (let ((ct (mime-read-Content-Type))) - (or (not ct) - (and (eq 'text (cdr (assq 'type ct))) - (eq 'plain (cdr (assq 'subtype ct)))))))) - (message-insert-courtesy-copy)) - (setq failure (message-maybe-split-and-send-mail))) - (kill-buffer tembuf)) - (set-buffer message-edit-buffer) - (if failure - (progn - (message "Couldn't send message via mail: %s" failure) - nil) - (push 'mail message-sent-message-via))))) - -(defun message-send-mail-with-sendmail () - "Send off the prepared buffer with sendmail." - (let ((errbuf (if message-interactive - (message-generate-new-buffer-clone-locals - " sendmail errors") - 0)) - resend-to-addresses delimline) - (let ((case-fold-search t)) - (save-restriction - (message-narrow-to-headers) - (setq resend-to-addresses (message-fetch-field "resent-to"))) - ;; Change header-delimiter to be what sendmail expects. - (goto-char (point-min)) - (re-search-forward - (concat "^" (regexp-quote mail-header-separator) "\n")) - (replace-match "\n") - (backward-char 1) - (setq delimline (point-marker)) - (run-hooks 'message-send-mail-hook) - ;; Insert an extra newline if we need it to work around - ;; Sun's bug that swallows newlines. - (goto-char (1+ delimline)) - (when (eval message-mailer-swallows-blank-line) - (newline)) - (when message-interactive - (save-excursion - (set-buffer errbuf) - (erase-buffer)))) - (let ((default-directory "/")) - (as-binary-process - (apply 'call-process-region - (append (list (point-min) (point-max) - (if (boundp 'sendmail-program) - sendmail-program - "/usr/lib/sendmail") - nil errbuf nil "-oi") - ;; Always specify who from, - ;; since some systems have broken sendmails. - ;; But some systems are more broken with -f, so - ;; we'll let users override this. - (if (null message-sendmail-f-is-evil) - (list "-f" (message-make-address))) - ;; These mean "report errors by mail" - ;; and "deliver in background". - (if (null message-interactive) '("-oem" "-odb")) - ;; Get the addresses from the message - ;; unless this is a resend. - ;; We must not do that for a resend - ;; because we would find the original addresses. - ;; For a resend, include the specific addresses. - (if resend-to-addresses - (list resend-to-addresses) - '("-t")))))) - (when message-interactive - (save-excursion - (set-buffer errbuf) - (goto-char (point-min)) - (while (re-search-forward "\n\n* *" nil t) - (replace-match "; ")) - (if (not (zerop (buffer-size))) - (error "Sending...failed to %s" - (buffer-substring (point-min) (point-max))))) - (when (bufferp errbuf) - (kill-buffer errbuf))))) - -(defun message-send-mail-with-qmail () - "Pass the prepared message buffer to qmail-inject. -Refer to the documentation for the variable `message-send-mail-function' -to find out how to use this." - ;; replace the header delimiter with a blank line - (goto-char (point-min)) - (re-search-forward - (concat "^" (regexp-quote mail-header-separator) "\n")) - (replace-match "\n") - (backward-char 1) - (run-hooks 'message-send-mail-hook) - ;; send the message - (case - (as-binary-process - (apply - 'call-process-region 1 (point-max) message-qmail-inject-program - nil nil nil - ;; qmail-inject's default behaviour is to look for addresses on the - ;; command line; if there're none, it scans the headers. - ;; yes, it does The Right Thing w.r.t. Resent-To and it's kin. - ;; - ;; in general, ALL of qmail-inject's defaults are perfect for simply - ;; reading a formatted (i. e., at least a To: or Resent-To header) - ;; message from stdin. - ;; - ;; qmail also has the advantage of not having been raped by - ;; various vendors, so we don't have to allow for that, either -- - ;; compare this with message-send-mail-with-sendmail and weep - ;; for sendmail's lost innocence. - ;; - ;; all this is way cool coz it lets us keep the arguments entirely - ;; free for -inject-arguments -- a big win for the user and for us - ;; since we don't have to play that double-guessing game and the user - ;; gets full control (no gestapo'ish -f's, for instance). --sj - message-qmail-inject-args)) - ;; qmail-inject doesn't say anything on it's stdout/stderr, - ;; we have to look at the retval instead - (0 nil) - (100 (error "qmail-inject reported permanent failure")) - (111 (error "qmail-inject reported transient failure")) - ;; should never happen - (t (error "qmail-inject reported unknown failure")))) - -(defun message-send-mail-with-mh () - "Send the prepared message buffer with mh." - (let ((mh-previous-window-config nil) - (name (mh-new-draft-name))) - (setq buffer-file-name name) - ;; MH wants to generate these headers itself. - (when message-mh-deletable-headers - (let ((headers message-mh-deletable-headers)) - (while headers - (goto-char (point-min)) - (and (re-search-forward - (concat "^" (symbol-name (car headers)) ": *") nil t) - (message-delete-line)) - (pop headers)))) - (run-hooks 'message-send-mail-hook) - ;; Pass it on to mh. - (mh-send-letter))) - -(defun message-send-mail-with-smtp () - "Send off the prepared buffer with SMTP." - (require 'smtp) ; XXX - (let ((case-fold-search t) - recipients) - (save-restriction - (message-narrow-to-headers) - (setq recipients - ;; XXX: Should be replaced by better one. - (smtp-deduce-address-list (current-buffer) - (point-min) (point-max))) - ;; Remove BCC lines. - (message-remove-header "bcc")) - ;; replace the header delimiter with a blank line. - (goto-char (point-min)) - (re-search-forward - (concat "^" (regexp-quote mail-header-separator) "\n")) - (replace-match "\n") - (backward-char 1) - (run-hooks 'message-send-mail-hook) - (if recipients - (static-if (fboundp 'smtp-send-buffer) - (smtp-send-buffer user-mail-address recipients - (current-buffer)) - (let ((result (smtp-via-smtp user-mail-address recipients - (current-buffer)))) - (unless (eq result t) - (error "Sending failed; %s" result)))) - (error "Sending failed; no recipients")))) - -(defsubst message-maybe-split-and-send-news (method) - "Split a message if necessary, and send it via news. -Returns nil if sending succeeded, returns t if sending failed. -This sub function is for exclusive use of `message-send-news'." - (let ((mime-edit-split-ignored-field-regexp - mime-edit-split-ignored-field-regexp) - (case-fold-search t)) - (while (string-match "Message-ID" mime-edit-split-ignored-field-regexp) - (setq mime-edit-split-ignored-field-regexp - (concat (substring mime-edit-split-ignored-field-regexp - 0 (match-beginning 0)) - "Hey_MIME-Edit,_there_is_an_inviolable_Message_ID" - "_so_don't_rape_it!" - (substring mime-edit-split-ignored-field-regexp - (match-end 0))))) - (or - (catch 'message-sending-news-failure - (mime-edit-maybe-split-and-send - (function - (lambda () - (interactive) - (save-restriction - (std11-narrow-to-header mail-header-separator) - (goto-char (point-min)) - (when (re-search-forward "^Message-ID:" nil t) - (delete-region (match-end 0) (std11-field-end)) - (insert " " (message-make-message-id)))) - (unless (funcall message-send-news-function method) - (throw 'message-sending-news-failure t))))) - nil) - (not (funcall message-send-news-function method))))) - -(defun message-send-news (&optional arg) - (let* ((tembuf (message-generate-new-buffer-clone-locals " *message temp*")) - (case-fold-search nil) - (method (if (message-functionp message-post-method) - (funcall message-post-method arg) - message-post-method)) - (group-name-charset (gnus-group-name-charset method "")) - (message-syntax-checks - (if arg - (cons '(existing-newsgroups . disabled) - message-syntax-checks) - message-syntax-checks)) - (message-this-is-news t) - result) - (save-restriction - (message-narrow-to-headers) - ;; Insert some headers. - (message-generate-headers message-required-news-headers) - ;; Let the user do all of the above. - (run-hooks 'message-header-hook)) - (when group-name-charset - (setq message-syntax-checks - (cons '(valid-newsgroups . disabled) - message-syntax-checks))) - (message-cleanup-headers) - (if (not (let ((message-post-method method)) - (message-check-news-syntax))) - nil - (unwind-protect - (save-excursion - (set-buffer tembuf) - (buffer-disable-undo) - (erase-buffer) - (insert-buffer message-encoding-buffer) - ;; Remove some headers. - (save-restriction - (message-narrow-to-headers) -;; We Semi-gnus people have no use for it. -;; ;; We (re)generate the Lines header. -;; (when (memq 'Lines message-required-mail-headers) -;; (message-generate-headers '(Lines))) - ;; Remove some headers. - (message-remove-header message-ignored-news-headers t)) - (goto-char (point-max)) - ;; require one newline at the end. - (or (= (preceding-char) ?\n) - (insert ?\n)) - (setq result (message-maybe-split-and-send-news method))) - (kill-buffer tembuf)) - (set-buffer message-edit-buffer) - (if result - (progn - (message "Couldn't send message via news: %s" - (nnheader-get-report (car method))) - nil) - (push 'news message-sent-message-via))))) - -;; 1997-09-29 by MORIOKA Tomohiko -(defun message-send-news-with-gnus (method) - (let ((case-fold-search t)) - ;; Remove the delimiter. - (goto-char (point-min)) - (re-search-forward - (concat "^" (regexp-quote mail-header-separator) "\n")) - (replace-match "\n") - (backward-char 1) - (run-hooks 'message-send-news-hook) - (gnus-open-server method) - (message "Sending news with %s..." (gnus-server-string method)) - (gnus-request-post method) - )) - -;;; -;;; Header generation & syntax checking. -;;; - -(defun message-check-element (type) - "Return non-nil if this TYPE is not to be checked." - (if (eq message-syntax-checks 'dont-check-for-anything-just-trust-me) - t - (let ((able (assq type message-syntax-checks))) - (and (consp able) - (eq (cdr able) 'disabled))))) - -(defun message-check-news-syntax () - "Check the syntax of the message." - (save-excursion - (save-restriction - (widen) - (and - ;; We narrow to the headers and check them first. - (save-excursion - (save-restriction - (message-narrow-to-headers) - (message-check-news-header-syntax))) - ;; Check the body. - (save-excursion - (set-buffer message-edit-buffer) - (message-check-news-body-syntax)))))) - -(defun message-check-news-header-syntax () - (and - ;; Check Newsgroups header. - (message-check 'newsgroups - (let ((group (message-fetch-field "newsgroups"))) - (or - (and group - (not (string-match "\\`[ \t]*\\'" group))) - (ignore - (message - "The newsgroups field is empty or missing. Posting is denied."))))) - ;; Check the Subject header. - (message-check 'subject - (let* ((case-fold-search t) - (subject (message-fetch-field "subject"))) - (or - (and subject - (not (string-match "\\`[ \t]*\\'" subject))) - (ignore - (message - "The subject field is empty or missing. Posting is denied."))))) - ;; Check for commands in Subject. - (message-check 'subject-cmsg - (if (string-match "^cmsg " (message-fetch-field "subject")) - (y-or-n-p - "The control code \"cmsg\" is in the subject. Really post? ") - t)) - ;; Check for multiple identical headers. - (message-check 'multiple-headers - (let (found) - (while (and (not found) - (re-search-forward "^[^ \t:]+: " nil t)) - (save-excursion - (or (re-search-forward - (concat "^" - (regexp-quote - (setq found - (buffer-substring - (match-beginning 0) (- (match-end 0) 2)))) - ":") - nil t) - (setq found nil)))) - (if found - (y-or-n-p (format "Multiple %s headers. Really post? " found)) - t))) - ;; Check for Version and Sendsys. - (message-check 'sendsys - (if (re-search-forward "^Sendsys:\\|^Version:" nil t) - (y-or-n-p - (format "The article contains a %s command. Really post? " - (buffer-substring (match-beginning 0) - (1- (match-end 0))))) - t)) - ;; See whether we can shorten Followup-To. - (message-check 'shorten-followup-to - (let ((newsgroups (message-fetch-field "newsgroups")) - (followup-to (message-fetch-field "followup-to")) - to) - (when (and newsgroups - (string-match "," newsgroups) - (not followup-to) - (not - (zerop - (length - (setq to (completing-read - "Followups to: (default all groups) " - (mapcar (lambda (g) (list g)) - (cons "poster" - (message-tokenize-header - newsgroups))))))))) - (goto-char (point-min)) - (insert "Followup-To: " to "\n")) - t)) - ;; Check "Shoot me". - (message-check 'shoot - (if (re-search-forward - "Message-ID.*.i-did-not-set--mail-host-address--so-shoot-me" nil t) - (y-or-n-p "You appear to have a misconfigured system. Really post? ") - t)) - ;; Check for Approved. - (message-check 'approved - (if (re-search-forward "^Approved:" nil t) - (y-or-n-p "The article contains an Approved header. Really post? ") - t)) - ;; Check the Message-ID header. - (message-check 'message-id - (let* ((case-fold-search t) - (message-id (message-fetch-field "message-id" t))) - (or (not message-id) - ;; Is there an @ in the ID? - (and (string-match "@" message-id) - ;; Is there a dot in the ID? - (string-match "@[^.]*\\." message-id) - ;; Does the ID end with a dot? - (not (string-match "\\.>" message-id))) - (y-or-n-p - (format "The Message-ID looks strange: \"%s\". Really post? " - message-id))))) - ;; Check the Newsgroups & Followup-To headers. - (message-check 'existing-newsgroups - (let* ((case-fold-search t) - (newsgroups (message-fetch-field "newsgroups")) - (followup-to (message-fetch-field "followup-to")) - (groups (message-tokenize-header - (if followup-to - (concat newsgroups "," followup-to) - newsgroups))) - (known-groups - (mapcar (lambda (n) (gnus-group-real-name n)) - (gnus-groups-from-server - (if (message-functionp message-post-method) - (funcall message-post-method) - message-post-method)))) - errors) - (while groups - (unless (or (equal (car groups) "poster") - (member (car groups) known-groups)) - (push (car groups) errors)) - (pop groups)) - (cond - ;; Gnus is not running. - ((or (not (and (boundp 'gnus-active-hashtb) - gnus-active-hashtb)) - (not (boundp 'gnus-read-active-file))) - t) - ;; We don't have all the group names. - ((and (or (not gnus-read-active-file) - (eq gnus-read-active-file 'some)) - errors) - (y-or-n-p - (format - "Really post to %s possibly unknown group%s: %s? " - (if (= (length errors) 1) "this" "these") - (if (= (length errors) 1) "" "s") - (mapconcat 'identity errors ", ")))) - ;; There were no errors. - ((not errors) - t) - ;; There are unknown groups. - (t - (y-or-n-p - (format - "Really post to %s unknown group%s: %s? " - (if (= (length errors) 1) "this" "these") - (if (= (length errors) 1) "" "s") - (mapconcat 'identity errors ", "))))))) - ;; Check the Newsgroups & Followup-To headers for syntax errors. - (message-check 'valid-newsgroups - (let ((case-fold-search t) - (headers '("Newsgroups" "Followup-To")) - header error) - (while (and headers (not error)) - (when (setq header (mail-fetch-field (car headers))) - (if (or - (not - (string-match - "\\`\\([-+_&.a-zA-Z0-9]+\\)?\\(,[-+_&.a-zA-Z0-9]+\\)*\\'" - header)) - (memq - nil (mapcar - (lambda (g) - (not (string-match "\\.\\'\\|\\.\\." g))) - (message-tokenize-header header ",")))) - (setq error t))) - (unless error - (pop headers))) - (if (not error) - t - (y-or-n-p - (format "The %s header looks odd: \"%s\". Really post? " - (car headers) header))))) - (message-check 'repeated-newsgroups - (let ((case-fold-search t) - (headers '("Newsgroups" "Followup-To")) - header error groups group) - (while (and headers - (not error)) - (when (setq header (mail-fetch-field (pop headers))) - (setq groups (message-tokenize-header header ",")) - (while (setq group (pop groups)) - (when (member group groups) - (setq error group - groups nil))))) - (if (not error) - t - (y-or-n-p - (format "Group %s is repeated in headers. Really post? " error))))) - ;; Check the From header. - (message-check 'from - (let* ((case-fold-search t) - (from (message-fetch-field "from")) - ad) - (cond - ((not from) - (message "There is no From line. Posting is denied.") - nil) - ((or (not (string-match - "@[^\\.]*\\." - (setq ad (nth 1 (mail-extract-address-components - from))))) ;larsi@ifi - (string-match "\\.\\." ad) ;larsi@ifi..uio - (string-match "@\\." ad) ;larsi@.ifi.uio - (string-match "\\.$" ad) ;larsi@ifi.uio. - (not (string-match "^[^@]+@[^@]+$" ad)) ;larsi.ifi.uio - (string-match "(.*).*(.*)" from)) ;(lars) (lars) - (message - "Denied posting -- the From looks strange: \"%s\"." from) - nil) - ((let ((addresses (rfc822-addresses from))) - (while (and addresses - (not (eq (string-to-char (car addresses)) ?\())) - (setq addresses (cdr addresses))) - addresses) - (message - "Denied posting -- bad From address: \"%s\"." from) - nil) - (t t)))) - ;; Check the Reply-To header. - (message-check 'reply-to - (let* ((case-fold-search t) - (reply-to (message-fetch-field "reply-to")) - ad) - (cond - ((not reply-to) - t) - ((string-match "," reply-to) - (y-or-n-p - (format "Multiple Reply-To addresses: \"%s\". Really post? " - reply-to))) - ((or (not (string-match - "@[^\\.]*\\." - (setq ad (nth 1 (mail-extract-address-components - reply-to))))) ;larsi@ifi - (string-match "\\.\\." ad) ;larsi@ifi..uio - (string-match "@\\." ad) ;larsi@.ifi.uio - (string-match "\\.$" ad) ;larsi@ifi.uio. - (not (string-match "^[^@]+@[^@]+$" ad)) ;larsi.ifi.uio - (string-match "(.*).*(.*)" reply-to)) ;(lars) (lars) - (y-or-n-p - (format - "The Reply-To looks strange: \"%s\". Really post? " - reply-to))) - (t t)))))) - -(defun message-check-news-body-syntax () - (and - ;; Check for long lines. - (message-check 'long-lines - (goto-char (point-min)) - (re-search-forward - (concat "^" (regexp-quote mail-header-separator) "$")) - (forward-line 1) - (while (and - (or (looking-at - mime-edit-tag-regexp) - (let ((p (point))) - (end-of-line) - (< (- (point) p) 80))) - (zerop (forward-line 1)))) - (or (bolp) - (eobp) - (y-or-n-p - "You have lines longer than 79 characters. Really post? "))) - ;; Check whether the article is empty. - (message-check 'empty - (goto-char (point-min)) - (re-search-forward - (concat "^" (regexp-quote mail-header-separator) "$")) - (forward-line 1) - (let ((b (point))) - (goto-char (point-max)) - (re-search-backward message-signature-separator nil t) - (beginning-of-line) - (or (re-search-backward "[^ \n\t]" b t) - (if (message-gnksa-enable-p 'empty-article) - (y-or-n-p "Empty article. Really post? ") - (message "Denied posting -- Empty article.") - nil)))) - ;; Check for control characters. - (message-check 'control-chars - (if (re-search-forward "[\000-\007\013\015-\032\034-\037\200-\237]" nil t) - (y-or-n-p - "The article contains control characters. Really post? ") - t)) - ;; Check 8bit characters. - (message-check '8bit - (message-check-8bit)) - ;; Check excessive size. - (message-check 'size - (if (> (buffer-size) 60000) - (y-or-n-p - (format "The article is %d octets long. Really post? " - (buffer-size))) - t)) - ;; Check whether any new text has been added. - (message-check 'new-text - (or - (not message-checksum) - (not (eq (message-checksum) message-checksum)) - (if (message-gnksa-enable-p 'quoted-text-only) - (y-or-n-p - "It looks like no new text has been added. Really post? ") - (message "Denied posting -- no new text has been added.") - nil))) - ;; Check the length of the signature. - (message-check 'signature - (goto-char (point-max)) - (if (> (count-lines (point) (point-max)) 5) - (y-or-n-p - (format - "Your .sig is %d lines; it should be max 4. Really post? " - (1- (count-lines (point) (point-max))))) - t)) - ;; Ensure that text follows last quoted portion. - (message-check 'quoting-style - (goto-char (point-max)) - (let ((no-problem t)) - (when (search-backward-regexp "^>[^\n]*\n" nil t) - (setq no-problem (search-forward-regexp "^[ \t]*[^>\n]" nil t))) - (if no-problem - t - (if (message-gnksa-enable-p 'quoted-text-only) - (y-or-n-p "Your text should follow quoted text. Really post? ") - ;; Ensure that - (goto-char (point-min)) - (re-search-forward - (concat "^" (regexp-quote mail-header-separator) "$")) - (if (search-forward-regexp "^[ \t]*[^>\n]" nil t) - (y-or-n-p "Your text should follow quoted text. Really post? ") - (message "Denied posting -- only quoted text.") - nil))))))) - -(defun message-check-mail-syntax () - "Check the syntax of the message." - (save-excursion - (save-restriction - (widen) - (and - ;; We narrow to the headers and check them first. - (save-excursion - (save-restriction - (message-narrow-to-headers) - (message-check-mail-header-syntax))) - ;; Check the body. - (save-excursion - (set-buffer message-edit-buffer) - (message-check-mail-body-syntax)))))) - -(defun message-check-mail-header-syntax () - t) - -(defun message-check-mail-body-syntax () - (and - ;; Check 8bit characters. - (message-check '8bit - (message-check-8bit) - ))) - -(defun message-check-8bit () - "Check the article contains 8bit characters." - (save-excursion - (set-buffer message-encoding-buffer) - (message-narrow-to-headers) - (let* ((case-fold-search t) - (field-value (message-fetch-field "content-transfer-encoding"))) - (if (and field-value - (member (downcase field-value) message-8bit-encoding-list)) - t - (widen) - (set-buffer (get-buffer-create " message syntax")) - (erase-buffer) - (goto-char (point-min)) - (set-buffer-multibyte nil) - (insert-buffer message-encoding-buffer) - (goto-char (point-min)) - (if (re-search-forward "[^\x00-\x7f]" nil t) - (y-or-n-p - "The article contains 8bit characters. Really post? ") - t))))) - -(defun message-checksum () - "Return a \"checksum\" for the current buffer." - (let ((sum 0)) - (save-excursion - (goto-char (point-min)) - (re-search-forward - (concat "^" (regexp-quote mail-header-separator) "$")) - (while (not (eobp)) - (when (not (looking-at "[ \t\n]")) - (setq sum (logxor (ash sum 1) (if (natnump sum) 0 1) - (char-after)))) - (forward-char 1))) - sum)) - -(defun message-do-fcc () - "Process Fcc headers in the current buffer." - (let ((case-fold-search t) - (coding-system-for-write 'raw-text) - (output-coding-system 'raw-text) - list file) - (save-excursion - (save-restriction - (message-narrow-to-headers) - (setq file (message-fetch-field "fcc" t))) - (when file - (set-buffer (get-buffer-create " *message temp*")) - (erase-buffer) - (insert-buffer-substring message-encoding-buffer) - (save-restriction - (message-narrow-to-headers) - (while (setq file (message-fetch-field "fcc")) - (push file list) - (message-remove-header "fcc" nil t))) - (goto-char (point-min)) - (when (re-search-forward - (concat "^" (regexp-quote mail-header-separator) "$") - nil t) - (replace-match "" t t)) - ;; Process FCC operations. - (while list - (setq file (pop list)) - (if (string-match "^[ \t]*|[ \t]*\\(.*\\)[ \t]*$" file) - ;; Pipe the article to the program in question. - (call-process-region (point-min) (point-max) shell-file-name - nil nil nil shell-command-switch - (match-string 1 file)) - ;; Save the article. - (setq file (expand-file-name file)) - (unless (file-exists-p (file-name-directory file)) - (make-directory (file-name-directory file) t)) - (if (and message-fcc-handler-function - (not (eq message-fcc-handler-function 'rmail-output))) - (funcall message-fcc-handler-function file) - (if (and (file-readable-p file) (mail-file-babyl-p file)) - (rmail-output file 1 nil t) - (let ((mail-use-rfc822 t)) - (rmail-output file 1 t t)))))) - (kill-buffer (current-buffer)))))) - -(defun message-output (filename) - "Append this article to Unix/babyl mail file FILENAME." - (if (and (file-readable-p filename) - (mail-file-babyl-p filename)) - (gnus-output-to-rmail filename t) - (gnus-output-to-mail filename t))) - -(defun message-cleanup-headers () - "Do various automatic cleanups of the headers." - ;; Remove empty lines in the header. - (save-restriction - (message-narrow-to-headers) - ;; Remove blank lines. - (while (re-search-forward "^[ \t]*\n" nil t) - (replace-match "" t t)) - - ;; Correct Newsgroups and Followup-To headers: Change sequence of - ;; spaces to comma and eliminate spaces around commas. Eliminate - ;; embedded line breaks. - (goto-char (point-min)) - (while (re-search-forward "^\\(Newsgroups\\|Followup-To\\): +" nil t) - (save-restriction - (narrow-to-region - (point) - (if (re-search-forward "^[^ \t]" nil t) - (match-beginning 0) - (forward-line 1) - (point))) - (goto-char (point-min)) - (while (re-search-forward "\n[ \t]+" nil t) - (replace-match " " t t)) ;No line breaks (too confusing) - (goto-char (point-min)) - (while (re-search-forward "[ \t\n]*,[ \t\n]*\\|[ \t]+" nil t) - (replace-match "," t t)) - (goto-char (point-min)) - ;; Remove trailing commas. - (when (re-search-forward ",+$" nil t) - (replace-match "" t t)))))) - -(defun message-make-date (&optional now) - "Make a valid data header. -If NOW, use that time instead." - (let* ((now (or now (current-time))) - (zone (nth 8 (decode-time now))) - (sign "+")) - (when (< zone 0) - (setq sign "-") - (setq zone (- zone))) - (concat - ;; The day name of the %a spec is locale-specific. Pfff. - (format "%s, " (capitalize (car (rassoc (nth 6 (decode-time now)) - parse-time-weekdays)))) - (format-time-string "%d" now) - ;; The month name of the %b spec is locale-specific. Pfff. - (format " %s " - (capitalize (car (rassoc (nth 4 (decode-time now)) - parse-time-months)))) - (format-time-string "%Y %H:%M:%S " now) - ;; We do all of this because XEmacs doesn't have the %z spec. - (format "%s%02d%02d" sign (/ zone 3600) (/ (% zone 3600) 60))))) - -(defun message-make-followup-subject (subject) - "Make a followup Subject." - (cond - ((and (eq message-use-subject-re 'guess) - (string-match message-subject-encoded-re-regexp subject)) - subject) - (message-use-subject-re - (concat "Re: " (message-strip-subject-re subject))) - (t subject))) - -(defun message-make-message-id () - "Make a unique Message-ID." - (concat "<" (message-unique-id) - (let ((psubject (save-excursion (message-fetch-field "subject"))) - (psupersedes - (save-excursion (message-fetch-field "supersedes")))) - (if (or - (and message-reply-headers - (mail-header-references message-reply-headers) - (mail-header-subject message-reply-headers) - psubject - (not (string= - (message-strip-subject-re - (mail-header-subject message-reply-headers)) - (message-strip-subject-re psubject)))) - (and psupersedes - (string-match "_-_@" psupersedes))) - "_-_" "")) - "@" (message-make-fqdn) ">")) - -(defvar message-unique-id-char nil) - -;; If you ever change this function, make sure the new version -;; cannot generate IDs that the old version could. -;; You might for example insert a "." somewhere (not next to another dot -;; or string boundary), or modify the "fsf" string. -(defun message-unique-id () - ;; Don't use microseconds from (current-time), they may be unsupported. - ;; Instead we use this randomly inited counter. - (setq message-unique-id-char - (% (1+ (or message-unique-id-char (logand (random t) (1- (lsh 1 20))))) - ;; (current-time) returns 16-bit ints, - ;; and 2^16*25 just fits into 4 digits i base 36. - (* 25 25))) - (let ((tm (current-time))) - (concat - (if (memq system-type '(ms-dos emx vax-vms)) - (let ((user (downcase (user-login-name)))) - (while (string-match "[^a-z0-9_]" user) - (aset user (match-beginning 0) ?_)) - user) - (message-number-base36 (user-uid) -1)) - (message-number-base36 (+ (car tm) - (lsh (% message-unique-id-char 25) 16)) 4) - (message-number-base36 (+ (nth 1 tm) - (lsh (/ message-unique-id-char 25) 16)) 4) - ;; Append the newsreader name, because while the generated - ;; ID is unique to this newsreader, other newsreaders might - ;; otherwise generate the same ID via another algorithm. - ".fsf"))) - -(defun message-number-base36 (num len) - (if (if (< len 0) - (<= num 0) - (= len 0)) - "" - (concat (message-number-base36 (/ num 36) (1- len)) - (char-to-string (aref "zyxwvutsrqponmlkjihgfedcba9876543210" - (% num 36)))))) - -(defun message-make-organization () - "Make an Organization header." - (let* ((organization - (when message-user-organization - (if (message-functionp message-user-organization) - (funcall message-user-organization) - message-user-organization)))) - (save-excursion - (message-set-work-buffer) - (cond ((stringp organization) - (insert organization)) - ((and (eq t organization) - message-user-organization-file - (file-exists-p message-user-organization-file)) - (insert-file-contents message-user-organization-file))) - (goto-char (point-min)) - (while (re-search-forward "[\t\n]+" nil t) - (replace-match "" t t)) - (unless (zerop (buffer-size)) - (buffer-string))))) - -(defun message-make-lines () - "Count the number of lines and return numeric string." - (save-excursion - (save-restriction - (widen) - (message-goto-body) - (int-to-string (count-lines (point) (point-max)))))) - -(defun message-make-in-reply-to () - "Return the In-Reply-To header for this message." - (when message-reply-headers - (let ((from (mail-header-from message-reply-headers)) - (date (mail-header-date message-reply-headers)) - (msg-id (mail-header-message-id message-reply-headers))) - (when msg-id - (concat msg-id - (when from - (let ((pair (std11-extract-address-components from))) - (concat "\n (" - (or (car pair) (cadr pair)) - "'s message of \"" - (if (or (not date) (string= date "")) - "(unknown date)" date) - "\")")))))))) - -(defun message-make-distribution () - "Make a Distribution header." - (let ((orig-distribution (message-fetch-reply-field "distribution"))) - (cond ((message-functionp message-distribution-function) - (funcall message-distribution-function)) - (t orig-distribution)))) - -(defun message-make-expires () - "Return an Expires header based on `message-expires'." - (let ((current (current-time)) - (future (* 1.0 message-expires 60 60 24))) - ;; Add the future to current. - (setcar current (+ (car current) (round (/ future (expt 2 16))))) - (setcar (cdr current) (+ (nth 1 current) (% (round future) (expt 2 16)))) - (message-make-date current))) - -(defun message-make-path () - "Return uucp path." - (let ((login-name (user-login-name))) - (cond ((null message-user-path) - (concat (system-name) "!" login-name)) - ((stringp message-user-path) - ;; Support GENERICPATH. Suggested by vixie@decwrl.dec.com. - (concat message-user-path "!" login-name)) - (t login-name)))) - -(defun message-make-from () - "Make a From header." - (let* ((style message-from-style) - (login (message-make-address)) - (fullname - (or (and (boundp 'user-full-name) - user-full-name) - (user-full-name)))) - (when (string= fullname "&") - (setq fullname (user-login-name))) - (save-excursion - (message-set-work-buffer) - (cond - ((or (null style) - (equal fullname "")) - (insert login)) - ((or (eq style 'angles) - (and (not (eq style 'parens)) - ;; Use angles if no quoting is needed, or if parens would - ;; need quoting too. - (or (not (string-match "[^- !#-'*+/-9=?A-Z^-~]" fullname)) - (let ((tmp (concat fullname nil))) - (while (string-match "([^()]*)" tmp) - (aset tmp (match-beginning 0) ?-) - (aset tmp (1- (match-end 0)) ?-)) - (string-match "[\\()]" tmp))))) - (insert fullname) - (goto-char (point-min)) - ;; Look for a character that cannot appear unquoted - ;; according to RFC 822. - (when (re-search-forward "[^- !#-'*+/-9=?A-Z^-~]" nil 1) - ;; Quote fullname, escaping specials. - (goto-char (point-min)) - (insert "\"") - (while (re-search-forward "[\"\\]" nil 1) - (replace-match "\\\\\\&" t)) - (insert "\"")) - (insert " <" login ">")) - (t ; 'parens or default - (insert login " (") - (let ((fullname-start (point))) - (insert fullname) - (goto-char fullname-start) - ;; RFC 822 says \ and nonmatching parentheses - ;; must be escaped in comments. - ;; Escape every instance of ()\ ... - (while (re-search-forward "[()\\]" nil 1) - (replace-match "\\\\\\&" t)) - ;; ... then undo escaping of matching parentheses, - ;; including matching nested parentheses. - (goto-char fullname-start) - (while (re-search-forward - "\\(\\=\\|[^\\]\\(\\\\\\\\\\)*\\)\\\\(\\(\\([^\\]\\|\\\\\\\\\\)*\\)\\\\)" - nil 1) - (replace-match "\\1(\\3)" t) - (goto-char fullname-start))) - (insert ")"))) - (buffer-string)))) - -(defun message-make-sender () - "Return the \"real\" user address. -This function tries to ignore all user modifications, and -give as trustworthy answer as possible." - (concat (user-login-name) "@" (system-name))) - -(defun message-make-address () - "Make the address of the user." - (or (message-user-mail-address) - (concat (user-login-name) "@" (message-make-domain)))) - -(defun message-user-mail-address () - "Return the pertinent part of `user-mail-address'." - (when user-mail-address - (if (string-match " " user-mail-address) - (nth 1 (std11-extract-address-components user-mail-address)) - user-mail-address))) - -(defun message-make-fqdn () - "Return user's fully qualified domain name." - (let ((system-name (system-name)) - (user-mail (message-user-mail-address))) - (cond - ((and (string-match "[^.]\\.[^.]" system-name) - (not (string-match message-bogus-system-names system-name))) - ;; `system-name' returned the right result. - system-name) - ;; Try `mail-host-address'. - ((and (boundp 'mail-host-address) - (stringp mail-host-address) - (string-match "\\." mail-host-address)) - mail-host-address) - ;; We try `user-mail-address' as a backup. - ((and user-mail - (string-match "\\." user-mail) - (string-match "@\\(.*\\)\\'" user-mail)) - (match-string 1 user-mail)) - ;; Default to this bogus thing. - (t - (concat system-name ".i-did-not-set--mail-host-address--so-shoot-me"))))) - -(defun message-make-host-name () - "Return the name of the host." - (let ((fqdn (message-make-fqdn))) - (string-match "^[^.]+\\." fqdn) - (substring fqdn 0 (1- (match-end 0))))) - -(defun message-make-domain () - "Return the domain name." - (or mail-host-address - (message-make-fqdn))) - -;; Dummy to avoid byte-compile warning. -(defvar mule-version) -(defvar emacs-beta-version) -(defvar xemacs-codename) -(defvar gnus-inviolable-extended-version) - -(defun message-make-user-agent () - "Return user-agent info if the value `message-user-agent' is non-nil. If the -\"User-Agent\" field has already exist, it's value will be added in the return -string." - (when message-user-agent - (save-excursion - (goto-char (point-min)) - (let ((case-fold-search t) - user-agent start p end) - (if (re-search-forward "^User-Agent:[\t ]*" nil t) - (progn - (setq start (match-beginning 0) - p (match-end 0) - end (std11-field-end) - user-agent (buffer-substring-no-properties p end)) - (delete-region start (1+ end)) - (concat message-user-agent " " user-agent)) - message-user-agent))))) - -(defun message-generate-headers (headers) - "Prepare article HEADERS. -Headers already prepared in the buffer are not modified." - (save-restriction - (message-narrow-to-headers) - (let* ((Date (message-make-date)) - (Message-ID (message-make-message-id)) - (Organization (message-make-organization)) - (From (message-make-from)) - (Path (message-make-path)) - (Subject nil) - (Newsgroups nil) - (In-Reply-To (message-make-in-reply-to)) - (To nil) - (Distribution (message-make-distribution)) - (Lines (message-make-lines)) - (User-Agent (message-make-user-agent)) - (Expires (message-make-expires)) - (case-fold-search t) - header value elem) - ;; First we remove any old generated headers. - (let ((headers message-deletable-headers)) - (unless (buffer-modified-p) - (setq headers (delq 'Message-ID (copy-sequence headers)))) - (while headers - (goto-char (point-min)) - (and (re-search-forward - (concat "^" (symbol-name (car headers)) ": *") nil t) - (get-text-property (1+ (match-beginning 0)) 'message-deletable) - (message-delete-line)) - (pop headers))) - ;; Go through all the required headers and see if they are in the - ;; articles already. If they are not, or are empty, they are - ;; inserted automatically - except for Subject, Newsgroups and - ;; Distribution. - (while headers - (goto-char (point-min)) - (setq elem (pop headers)) - (if (consp elem) - (if (eq (car elem) 'optional) - (setq header (cdr elem)) - (setq header (car elem))) - (setq header elem)) - (when (or (not (re-search-forward - (concat "^" - (regexp-quote - (downcase - (if (stringp header) - header - (symbol-name header)))) - ":") - nil t)) - (progn - ;; The header was found. We insert a space after the - ;; colon, if there is none. - (if (/= (char-after) ? ) (insert " ") (forward-char 1)) - ;; Find out whether the header is empty... - (looking-at "[ \t]*\n[^ \t]"))) - ;; So we find out what value we should insert. - (setq value - (cond - ((and (consp elem) (eq (car elem) 'optional)) - ;; This is an optional header. If the cdr of this - ;; is something that is nil, then we do not insert - ;; this header. - (setq header (cdr elem)) - (or (and (fboundp (cdr elem)) (funcall (cdr elem))) - (and (boundp (cdr elem)) (symbol-value (cdr elem))))) - ((consp elem) - ;; The element is a cons. Either the cdr is a - ;; string to be inserted verbatim, or it is a - ;; function, and we insert the value returned from - ;; this function. - (or (and (stringp (cdr elem)) (cdr elem)) - (and (fboundp (cdr elem)) (funcall (cdr elem))))) - ((and (boundp header) (symbol-value header)) - ;; The element is a symbol. We insert the value - ;; of this symbol, if any. - (symbol-value header)) - ((not (message-check-element header)) - ;; We couldn't generate a value for this header, - ;; so we just ask the user. - (read-from-minibuffer - (format "Empty header for %s; enter value: " header))))) - ;; Finally insert the header. - (when (and value - (not (equal value ""))) - (save-excursion - (if (bolp) - (progn - ;; This header didn't exist, so we insert it. - (goto-char (point-max)) - (insert (if (stringp header) header (symbol-name header)) - ": " value) - (unless (bolp) - (insert "\n")) - (forward-line -1)) - ;; The value of this header was empty, so we clear - ;; totally and insert the new value. - (delete-region (point) (gnus-point-at-eol)) - (insert value) - (when (bolp) - (delete-char -1))) - ;; Add the deletable property to the headers that require it. - (and (memq header message-deletable-headers) - (progn (beginning-of-line) (looking-at "[^:]+: ")) - (add-text-properties - (point) (match-end 0) - '(message-deletable t face italic) (current-buffer))))))) - ;; Insert new Sender if the From is strange. - (let ((from (message-fetch-field "from")) - (sender (message-fetch-field "sender")) - (secure-sender (message-make-sender))) - (when (and from - (not (message-check-element 'sender)) - (not (string= - (downcase - (cadr (std11-extract-address-components from))) - (downcase secure-sender))) - (or (null sender) - (not - (string= - (downcase - (cadr (std11-extract-address-components sender))) - (downcase secure-sender))))) - (goto-char (point-min)) - ;; Rename any old Sender headers to Original-Sender. - (when (re-search-forward "^\\(Original-\\)*Sender:" nil t) - (beginning-of-line) - (insert "Original-") - (beginning-of-line)) - (when (or (message-news-p) - (string-match "@.+\\.." secure-sender)) - (insert "Sender: " secure-sender "\n"))))))) - -(defun message-insert-courtesy-copy () - "Insert a courtesy message in mail copies of combined messages." - (let (newsgroups) - (save-excursion - (save-restriction - (message-narrow-to-headers) - (when (setq newsgroups (message-fetch-field "newsgroups")) - (goto-char (point-max)) - (insert "Posted-To: " newsgroups "\n"))) - (forward-line 1) - (when message-courtesy-message - (cond - ((string-match "%s" message-courtesy-message) - (insert (format message-courtesy-message newsgroups))) - (t - (insert message-courtesy-message))))))) - -;;; -;;; Setting up a message buffer -;;; - -(defun message-fill-address (header value) - (save-restriction - (narrow-to-region (point) (point)) - (insert (capitalize (symbol-name header)) - ": " - (if (consp value) (car value) value) - "\n") - (narrow-to-region (point-min) (1- (point-max))) - (let (quoted last) - (goto-char (point-min)) - (while (not (eobp)) - (skip-chars-forward "^,\"" (point-max)) - (if (or (eq (char-after) ?,) - (eobp)) - (when (not quoted) - (if (and (> (current-column) 78) - last) - (save-excursion - (goto-char last) - (looking-at "[ \t]*") - (replace-match "\n " t t))) - (setq last (1+ (point)))) - (setq quoted (not quoted))) - (unless (eobp) - (forward-char 1)))) - (goto-char (point-max)) - (widen) - (forward-line 1))) - -(defun message-fill-references (header value) - (insert (capitalize (symbol-name header)) - ": " - (std11-fill-msg-id-list-string - (if (consp value) (car value) value)) - "\n")) - -(defun message-fill-header (header value) - (let ((begin (point)) - (fill-column 78) - (fill-prefix " ")) - (insert (capitalize (symbol-name header)) - ": " - (if (consp value) (car value) value) - "\n") - (save-restriction - (narrow-to-region begin (point)) - (fill-region-as-paragraph begin (point)) - ;; Tapdance around looong Message-IDs. - (forward-line -1) - (when (looking-at "[ \t]*$") - (message-delete-line)) - (goto-char begin) - (re-search-forward ":" nil t) - (when (looking-at "\n[ \t]+") - (replace-match " " t t)) - (goto-char (point-max))))) - -(defun message-shorten-1 (list cut surplus) - "Cut SURPLUS elements out of LIST, beginning with CUTth one." - (setcdr (nthcdr (- cut 2) list) - (nthcdr (+ (- cut 2) surplus 1) list))) - -(defun message-shorten-references (header references) - "Trim REFERENCES to be 21 Message-ID long or less, and fold them. -If folding is disallowed, also check that the REFERENCES are less -than 988 characters long, and if they are not, trim them until they are." - (let ((maxcount 21) - (count 0) - (cut 2) - refs) - (with-temp-buffer - (insert references) - (goto-char (point-min)) - ;; Cons a list of valid references. - (while (re-search-forward "<[^>]+>" nil t) - (push (match-string 0) refs)) - (setq refs (nreverse refs) - count (length refs))) - - ;; If the list has more than MAXCOUNT elements, trim it by - ;; removing the CUTth element and the required number of - ;; elements that follow. - (when (> count maxcount) - (let ((surplus (- count maxcount))) - (message-shorten-1 refs cut surplus) - (decf count surplus))) - - ;; If folding is disallowed, make sure the total length (including - ;; the spaces between) will be less than MAXSIZE characters. - ;; - ;; Only disallow folding for News messages. At this point the headers - ;; have not been generated, thus we use message-this-is-news directly. - (when (and message-this-is-news message-cater-to-broken-inn) - (let ((maxsize 988) - (totalsize (+ (apply #'+ (mapcar #'length refs)) - (1- count))) - (surplus 0) - (ptr (nthcdr (1- cut) refs))) - ;; Decide how many elements to cut off... - (while (> totalsize maxsize) - (decf totalsize (1+ (length (car ptr)))) - (incf surplus) - (setq ptr (cdr ptr))) - ;; ...and do it. - (when (> surplus 0) - (message-shorten-1 refs cut surplus)))) - - ;; Finally, collect the references back into a string and insert - ;; it into the buffer. - (let ((refstring (mapconcat #'identity refs " "))) - (if (and message-this-is-news message-cater-to-broken-inn) - (insert (capitalize (symbol-name header)) ": " - refstring "\n") - (message-fill-header header refstring))))) - -(defun message-position-point () - "Move point to where the user probably wants to find it." - (message-narrow-to-headers) - (cond - ((re-search-forward "^[^:]+:[ \t]*$" nil t) - (search-backward ":" ) - (widen) - (forward-char 1) - (if (eq (char-after) ? ) - (forward-char 1) - (insert " "))) - (t - (goto-char (point-max)) - (widen) - (forward-line 1) - (unless (looking-at "$") - (forward-line 2))) - (sit-for 0))) - -(defun message-buffer-name (type &optional to group) - "Return a new (unique) buffer name based on TYPE and TO." - (cond - ;; Generate a new buffer name The Message Way. - ((eq message-generate-new-buffers 'unique) - (generate-new-buffer-name - (concat "*" type - (if to - (concat " to " - (or (car (std11-extract-address-components to)) - to) "") - "") - (if (and group (not (string= group ""))) (concat " on " group) "") - "*"))) - ;; Check whether `message-generate-new-buffers' is a function, - ;; and if so, call it. - ((message-functionp message-generate-new-buffers) - (funcall message-generate-new-buffers type to group)) - ((eq message-generate-new-buffers 'unsent) - (generate-new-buffer-name - (concat "*unsent " type - (if to - (concat " to " - (or (car (mail-extract-address-components to)) - to) "") - "") - (if (and group (not (string= group ""))) (concat " on " group) "") - "*"))) - ;; Use standard name. - (t - (format "*%s message*" type)))) - -(defmacro message-pop-to-buffer-1 (buffer) - `(if pop-up-frames - (let (special-display-buffer-names - special-display-regexps - same-window-buffer-names - same-window-regexps) - (pop-to-buffer ,buffer)) - (pop-to-buffer ,buffer))) - -(defun message-pop-to-buffer (name) - "Pop to buffer NAME, and warn if it already exists and is modified." - (let ((buffer (get-buffer name)) - (pop-up-frames (and (or (static-if (featurep 'xemacs) - (device-on-window-system-p) - window-system) - (>= emacs-major-version 20)) - message-use-multi-frames))) - (if (and buffer - (buffer-name buffer)) - (progn - (message-pop-to-buffer-1 buffer) - (when (and (buffer-modified-p) - (not (y-or-n-p - "Message already being composed; erase? "))) - (error "Message being composed"))) - (message-pop-to-buffer-1 name)) - (erase-buffer) - (message-mode) - (when pop-up-frames - (set (make-local-variable 'message-original-frame) (selected-frame))))) - -(defun message-do-send-housekeeping () - "Kill old message buffers." - ;; We might have sent this buffer already. Delete it from the - ;; list of buffers. - (setq message-buffer-list (delq (current-buffer) message-buffer-list)) - (while (and message-max-buffers - message-buffer-list - (>= (length message-buffer-list) message-max-buffers)) - ;; Kill the oldest buffer -- unless it has been changed. - (let ((buffer (pop message-buffer-list))) - (when (and (buffer-name buffer) - (not (buffer-modified-p buffer))) - (kill-buffer buffer)))) - ;; Rename the buffer. - (if message-send-rename-function - (funcall message-send-rename-function) - ;; Note: mail-abbrevs of XEmacs renames buffer name behind Gnus. - (when (string-match - "\\`\\*\\(sent \\|unsent \\)?\\(.+\\)\\*[^\\*]*\\|\\`mail to " - (buffer-name)) - (let ((name (match-string 2 (buffer-name))) - to group) - (if (not (or (null name) - (string-equal name "mail") - (string-equal name "news"))) - (setq name (concat "*sent " name "*")) - (message-narrow-to-headers) - (setq to (message-fetch-field "to")) - (setq group (message-fetch-field "newsgroups")) - (widen) - (setq name - (cond - (to (concat "*sent mail to " - (or (car (mail-extract-address-components to)) - to) "*")) - ((and group (not (string= group ""))) - (concat "*sent news on " group "*")) - (t "*sent mail*")))) - (unless (string-equal name (buffer-name)) - (rename-buffer name t))))) - ;; Push the current buffer onto the list. - (when message-max-buffers - (setq message-buffer-list - (nconc message-buffer-list (list (current-buffer)))))) - -(defun message-mail-user-agent () - (let ((mua (cond - ((not message-mail-user-agent) nil) - ((eq message-mail-user-agent t) mail-user-agent) - (t message-mail-user-agent)))) - (if (memq mua '(message-user-agent gnus-user-agent)) - nil - mua))) - -(defun message-setup (headers &optional replybuffer actions switch-function) - (let ((mua (message-mail-user-agent)) - subject to field yank-action) - (if (not (and message-this-is-mail mua)) - (message-setup-1 headers replybuffer actions) - (if replybuffer - (setq yank-action (list 'insert-buffer replybuffer))) - (setq headers (copy-sequence headers)) - (setq field (assq 'Subject headers)) - (when field - (setq subject (cdr field)) - (setq headers (delq field headers))) - (setq field (assq 'To headers)) - (when field - (setq to (cdr field)) - (setq headers (delq field headers))) - (let ((mail-user-agent mua)) - (compose-mail to subject - (mapcar (lambda (item) - (cons - (format "%s" (car item)) - (cdr item))) - headers) - nil switch-function yank-action actions))))) - -;;;(defvar mc-modes-alist) -(defun message-setup-1 (headers &optional replybuffer actions) -;;; (when (and (boundp 'mc-modes-alist) -;;; (not (assq 'message-mode mc-modes-alist))) -;;; (push '(message-mode (encrypt . mc-encrypt-message) -;;; (sign . mc-sign-message)) -;;; mc-modes-alist)) - (when actions - (setq message-send-actions actions)) - (setq message-reply-buffer - (or (message-get-parameter 'reply-buffer) - replybuffer)) - (goto-char (point-min)) - ;; Insert all the headers. - (mail-header-format - (let ((h headers) - (alist message-header-format-alist)) - (while h - (unless (assq (caar h) message-header-format-alist) - (push (list (caar h)) alist)) - (pop h)) - alist) - headers) - (delete-region (point) (progn (forward-line -1) (point))) - (when message-default-headers - (insert message-default-headers) - (or (bolp) (insert ?\n))) - (put-text-property - (point) - (progn - (insert mail-header-separator "\n") - (1- (point))) - 'read-only nil) - (forward-line -1) - (when (message-news-p) - (when message-default-news-headers - (insert message-default-news-headers) - (or (bolp) (insert ?\n))) - (when message-generate-headers-first - (message-generate-headers - (delq 'Lines - (delq 'Subject - (copy-sequence message-required-news-headers)))))) - (when (message-mail-p) - (when message-default-mail-headers - (insert message-default-mail-headers) - (or (bolp) (insert ?\n))) - (when message-generate-headers-first - (message-generate-headers - (delq 'Lines - (delq 'Subject - (copy-sequence message-required-mail-headers)))))) - (run-hooks 'message-signature-setup-hook) - (message-insert-signature) - (save-restriction - (message-narrow-to-headers) - (if message-alternative-emails - (message-use-alternative-email-as-from)) - (run-hooks 'message-header-setup-hook)) - (set-buffer-modified-p nil) - (setq buffer-undo-list nil) - (run-hooks 'message-setup-hook) - (message-position-point) - (undo-boundary)) - -(defun message-set-auto-save-file-name () - "Associate the message buffer with a file in the drafts directory." - (when message-auto-save-directory - (unless (file-directory-p - (directory-file-name message-auto-save-directory)) - (gnus-make-directory message-auto-save-directory)) - (if (gnus-alive-p) - (setq message-draft-article - (nndraft-request-associate-buffer "drafts")) - (setq buffer-file-name (expand-file-name - (if (memq system-type - '(ms-dos ms-windows windows-nt - cygwin32 win32 w32 - mswindows)) - "message" - "*message*") - message-auto-save-directory)) - (setq buffer-auto-save-file-name (make-auto-save-file-name))) - (clear-visited-file-modtime) - (static-if (boundp 'MULE) - (set-file-coding-system message-draft-coding-system) - (setq buffer-file-coding-system message-draft-coding-system)))) - -(defun message-disassociate-draft () - "Disassociate the message buffer from the drafts directory." - (when message-draft-article - (nndraft-request-expire-articles - (list message-draft-article) "drafts" nil t))) - -(defun message-insert-headers () - "Generate the headers for the article." - (interactive) - (save-excursion - (save-restriction - (message-narrow-to-headers) - (when (message-news-p) - (message-generate-headers - (delq 'Lines - (delq 'Subject - (copy-sequence message-required-news-headers))))) - (when (message-mail-p) - (message-generate-headers - (delq 'Lines - (delq 'Subject - (copy-sequence message-required-mail-headers)))))))) - - - -;;; -;;; Commands for interfacing with message -;;; - -;;;###autoload -(defun message-mail (&optional to subject - other-headers continue switch-function - yank-action send-actions) - "Start editing a mail message to be sent. -OTHER-HEADERS is an alist of header/value pairs." - (interactive) - (let ((message-this-is-mail t) replybuffer) - (unless (message-mail-user-agent) - (message-pop-to-buffer (message-buffer-name "mail" to))) - ;; FIXME: message-mail should do something if YANK-ACTION is not - ;; insert-buffer. - (and (consp yank-action) (eq (car yank-action) 'insert-buffer) - (setq replybuffer (nth 1 yank-action))) - (message-setup - (nconc - `((To . ,(or to "")) (Subject . ,(or subject ""))) - (when other-headers other-headers)) - replybuffer send-actions) - ;; FIXME: Should return nil if failure. - t)) - -;;;###autoload -(defun message-news (&optional newsgroups subject) - "Start editing a news article to be sent." - (interactive) - (let ((message-this-is-news t)) - (message-pop-to-buffer (message-buffer-name "news" nil newsgroups)) - (message-setup `((Newsgroups . ,(or newsgroups "")) - (Subject . ,(or subject "")))))) - -(defun message-get-reply-headers (wide &optional to-address) - (let (follow-to mct never-mct from to cc reply-to mrt mft) - ;; Find all relevant headers we need. - (setq from (message-fetch-field "from") - to (message-fetch-field "to") - cc (message-fetch-field "cc") - mct (when message-use-mail-copies-to - (message-fetch-field "mail-copies-to")) - reply-to (message-fetch-field "reply-to") - mrt (when message-use-mail-reply-to - (message-fetch-field "mail-reply-to")) - mft (when (and (not (or to-address mrt reply-to)) - message-use-mail-followup-to) - (message-fetch-field "mail-followup-to"))) - - ;; Handle special values of Mail-Copies-To. - (when mct - (cond - ((and (or (equal (downcase mct) "never") - (equal (downcase mct) "nobody"))) - (when (or (not (eq message-use-mail-copies-to 'ask)) - (message-y-or-n-p - (concat "Obey Mail-Copies-To: never? ") t "\ -You should normally obey the Mail-Copies-To: header. - - `Mail-Copies-To: " mct "' -directs you not to send your response to the author.")) - (setq never-mct t)) - (setq mct nil)) - ((and (or (equal (downcase mct) "always") - (equal (downcase mct) "poster"))) - (if (or (not (eq message-use-mail-copies-to 'ask)) - (message-y-or-n-p - (concat "Obey Mail-Copies-To: always? ") t "\ -You should normally obey the Mail-Copies-To: header. - - `Mail-Copies-To: " mct "' -sends a copy of your response to the author.")) - (setq mct (or mrt reply-to from)) - (setq mct nil))) - ((and (eq message-use-mail-copies-to 'ask) - (not (message-y-or-n-p - (concat "Obey Mail-Copies-To: " mct " ? ") t "\ -You should normally obey the Mail-Copies-To: header. - - `Mail-Copies-To: " mct "' -sends a copy of your response to " (if (string-match "," mct) - "the specified addresses" - "that address") "."))) - (setq mct nil)))) - - ;; Handle Mail-Followup-To. - (when (and mft - (eq message-use-mail-followup-to 'ask) - (not (message-y-or-n-p - (concat "Obey Mail-Followup-To: " mft "? ") t "\ -You should normally obey the Mail-Followup-To: header. - - `Mail-Followup-To: " mft "' -directs your response to " (if (string-match "," mft) - "the specified addresses" - "that address only") ". - -A typical situation where Mail-Followup-To is used is when the author thinks -that further discussion should take place only in " - (if (string-match "," mft) - "the specified mailing lists" - "that mailing list") "."))) - (setq mft nil)) - - (if (and (not mft) - (or (not wide) - to-address)) - (progn - (setq follow-to (list (cons 'To - (or to-address mrt reply-to mft from)))) - (when (and wide mct - (not (member (cons 'To mct) follow-to))) - (push (cons 'Cc mct) follow-to))) - (let (ccalist) - (save-excursion - (message-set-work-buffer) - (if (and mft - wide - (or (not (eq message-use-mail-followup-to 'ask)) - (message-y-or-n-p "Obey Mail-Followup-To? " t "\ -You should normally obey the Mail-Followup-To: header. In this -article, it has the value of - -" mft " - -which directs your response to " (if (string-match "," mft) - "the specified addresses" - "that address only") ". - -Most commonly, Mail-Followup-To is used by a mailing list poster to -express that responses should be sent to just the list, and not the -poster as well. - -If a message is posted to several mailing lists, Mail-Followup-To may -also be used to direct the following discussion to one list only, -because discussions that are spread over several lists tend to be -fragmented and very difficult to follow. - -Also, some source/announcement lists are not intended for discussion; -responses here are directed to other addresses."))) - (insert mft) - (unless never-mct - (insert (or mrt reply-to from ""))) - (insert (if to (concat (if (bolp) "" ", ") to) "")) - (insert (if mct (concat (if (bolp) "" ", ") mct) "")) - (insert (if cc (concat (if (bolp) "" ", ") cc) ""))) - (goto-char (point-min)) - (while (re-search-forward "[ \t]+" nil t) - (replace-match " " t t)) - ;; Remove addresses that match `rmail-dont-reply-to-names'. - (let ((rmail-dont-reply-to-names message-dont-reply-to-names)) - (insert (prog1 (rmail-dont-reply-to (buffer-string)) - (erase-buffer)))) - (goto-char (point-min)) - ;; Perhaps "Mail-Copies-To: never" removed the only address? - (when (eobp) - (insert (or mrt reply-to from ""))) - (setq ccalist - (mapcar - (lambda (addr) - (cons (mail-strip-quoted-names addr) addr)) - (message-tokenize-header (buffer-string)))) - (let ((s ccalist)) - (while s - (setq ccalist (delq (assoc (car (pop s)) s) ccalist))))) - (setq follow-to (list (cons 'To (cdr (pop ccalist))))) - (when ccalist - (let ((ccs (cons 'Cc (mapconcat - (lambda (addr) (cdr addr)) ccalist ", ")))) - (when (string-match "^ +" (cdr ccs)) - (setcdr ccs (substring (cdr ccs) (match-end 0)))) - (push ccs follow-to))) - ;; Allow the user to be asked whether or not to reply to all - ;; recipients in a wide reply. - (if (and ccalist wide message-wide-reply-confirm-recipients - (not (y-or-n-p "Reply to all recipients? "))) - (setq follow-to (delq (assoc 'Cc follow-to) follow-to))))) - follow-to)) - -;;;###autoload -(defun message-reply (&optional to-address wide) - "Start editing a reply to the article in the current buffer." - (interactive) - (require 'gnus-sum) ; for gnus-list-identifiers - (let ((cur (current-buffer)) - from subject date - references message-id follow-to - (inhibit-point-motion-hooks t) - (message-this-is-mail t) - gnus-warning in-reply-to) - (save-restriction - (message-narrow-to-head-1) - ;; Allow customizations to have their say. - (if (not wide) - ;; This is a regular reply. - (when (message-functionp message-reply-to-function) - (save-excursion - (setq follow-to (funcall message-reply-to-function)))) - ;; This is a followup. - (when (message-functionp message-wide-reply-to-function) - (save-excursion - (setq follow-to - (funcall message-wide-reply-to-function))))) - (setq message-id (message-fetch-field "message-id" t) - references (message-fetch-field "references") - date (message-fetch-field "date") - from (message-fetch-field "from") - subject (or (message-fetch-field "subject") "none")) - (when gnus-list-identifiers - (setq subject (message-strip-list-identifiers subject))) - (setq subject (message-make-followup-subject subject)) - - (when (and (setq gnus-warning (message-fetch-field "gnus-warning")) - (string-match "<[^>]+>" gnus-warning)) - (setq message-id (match-string 0 gnus-warning))) - - (unless follow-to - (setq follow-to (message-get-reply-headers wide to-address))) - - ;; Get the references from "In-Reply-To" field if there were - ;; no references and "In-Reply-To" field looks promising. - (unless references - (when (and (setq in-reply-to (message-fetch-field "in-reply-to")) - (string-match "<[^>]+>" in-reply-to)) - (setq references (match-string 0 in-reply-to))))) - - (unless (message-mail-user-agent) - (message-pop-to-buffer - (message-buffer-name - (if wide "wide reply" "reply") from - (if wide to-address nil)))) - - (setq message-reply-headers - (make-full-mail-header-from-decoded-header - 0 subject from date message-id references 0 0 "")) - - (message-setup - `((Subject . ,subject) - ,@follow-to - ,@(if (or references message-id) - `((References . ,(concat (or references "") (and references " ") - (or message-id "")))) - nil)) - cur))) - -;;;###autoload -(defun message-wide-reply (&optional to-address) - "Make a \"wide\" reply to the message in the current buffer." - (interactive) - (message-reply to-address t)) - -;;;###autoload -(defun message-followup (&optional to-newsgroups) - "Follow up to the message in the current buffer. -If TO-NEWSGROUPS, use that as the new Newsgroups line." - (interactive) - (require 'gnus-sum) ; for gnus-list-identifiers - (let ((cur (current-buffer)) - from subject date reply-to mrt mct mft - references message-id follow-to - (inhibit-point-motion-hooks t) - (message-this-is-news t) - followup-to distribution newsgroups gnus-warning posted-to) - (save-restriction - (message-narrow-to-head) - (when (message-functionp message-followup-to-function) - (setq follow-to - (funcall message-followup-to-function))) - (setq from (message-fetch-field "from") - date (message-fetch-field "date") - subject (or (message-fetch-field "subject") "none") - references (message-fetch-field "references") - message-id (message-fetch-field "message-id" t) - followup-to (message-fetch-field "followup-to") - newsgroups (message-fetch-field "newsgroups") - posted-to (message-fetch-field "posted-to") - reply-to (message-fetch-field "reply-to") - mrt (when message-use-mail-reply-to - (message-fetch-field "mail-reply-to")) - distribution (message-fetch-field "distribution") - mct (when message-use-mail-copies-to - (message-fetch-field "mail-copies-to")) - mft (when message-use-mail-followup-to - (message-fetch-field "mail-followup-to"))) - (when (and (setq gnus-warning (message-fetch-field "gnus-warning")) - (string-match "<[^>]+>" gnus-warning)) - (setq message-id (match-string 0 gnus-warning))) - ;; Remove bogus distribution. - (when (and (stringp distribution) - (let ((case-fold-search t)) - (string-match "world" distribution))) - (setq distribution nil)) - (if gnus-list-identifiers - (setq subject (message-strip-list-identifiers subject))) - (setq subject (message-make-followup-subject subject)) - (widen)) - - ;; Handle special values of Mail-Copies-To. - (when mct - (cond - ((and (or (equal (downcase mct) "never") - (equal (downcase mct) "nobody"))) - (setq mct nil)) - ((and (or (equal (downcase mct) "always") - (equal (downcase mct) "poster"))) - (if (or (not (eq message-use-mail-copies-to 'ask)) - (message-y-or-n-p - (concat "Obey Mail-Copies-To: always? ") t "\ -You should normally obey the Mail-Copies-To: header. - - `Mail-Copies-To: " mct "' -sends a copy of your response to the author.")) - (setq mct (or mrt reply-to from)) - (setq mct nil))) - ((and (eq message-use-mail-copies-to 'ask) - (not - (message-y-or-n-p - (concat "Obey Mail-Copies-To: " mct " ? ") t "\ -You should normally obey the Mail-Copies-To: header. - - `Mail-Copies-To: " mct "' -sends a copy of your response to " (if (string-match "," mct) - "the specified addresses" - "that address") "."))) - (setq mct nil)))) - - (unless follow-to - (cond - (to-newsgroups (setq follow-to (list (cons 'Newsgroups to-newsgroups)))) - ;; Handle Followup-To. - (followup-to - (cond - ((equal (downcase followup-to) "poster") - (if (or (and followup-to (eq message-use-followup-to 'use)) - (message-y-or-n-p "Obey Followup-To: poster? " t "\ -You should normally obey the Followup-To: header. - - `Followup-To: poster' -sends your response via e-mail instead of news. - -A typical situation where `Followup-To: poster' is used is when the author -does not read the newsgroup, so he wouldn't see any replies sent to it.")) - (setq message-this-is-news nil - distribution nil - follow-to (list (cons 'To (or mrt reply-to from "")))) - (setq follow-to (list (cons 'Newsgroups newsgroups))))) - (t - (if (or (equal followup-to newsgroups) - (not (and followup-to (eq message-use-followup-to 'ask))) - (message-y-or-n-p - (concat "Obey Followup-To: " followup-to "? ") t "\ -You should normally obey the Followup-To: header. - - `Followup-To: " followup-to "' -directs your response to " (if (string-match "," followup-to) - "the specified newsgroups" - "that newsgroup only") ". - -If a message is posted to several newsgroups, Followup-To is often -used to direct the following discussion to one newsgroup only, -because discussions that are spread over several newsgroup tend to -be fragmented and very difficult to follow. - -Also, some source/announcement newsgroups are not intended for discussion; -responses here are directed to other newsgroups.")) - (setq follow-to (list (cons 'Newsgroups followup-to))) - (setq follow-to (list (cons 'Newsgroups newsgroups))))))) - ;; Handle Mail-Followup-To, followup via e-mail. - ((and mft - (or (not (eq message-use-mail-followup-to 'ask)) - (message-y-or-n-p - (concat "Obey Mail-Followup-To: " mft "? ") t "\ -You should normally obey the Mail-Followup-To: header. - - `Mail-Followup-To: " mft "' -directs your response to " (if (string-match "," mft) - "the specified addresses" - "that address only") " instead of news. - -A typical situation where Mail-Followup-To is used is when the author thinks -that further discussion should take place only in " - (if (string-match "," mft) - "the specified mailing lists" - "that mailing list") "."))) - (setq message-this-is-news nil - distribution nil - follow-to (list (cons 'To mft)))) - (posted-to (setq follow-to (list (cons 'Newsgroups posted-to)))) - (t - (setq follow-to (list (cons 'Newsgroups newsgroups)))))) - - (message-pop-to-buffer (message-buffer-name "followup" from newsgroups)) - - (message-setup - `((Subject . ,subject) - ,@follow-to - ,@(and mct (list (cons 'Cc mct))) - ,@(and distribution (list (cons 'Distribution distribution))) - ,@(if (or references message-id) - `((References . ,(concat (or references "") (and references " ") - (or message-id "")))))) - cur) - - (setq message-reply-headers - (make-full-mail-header-from-decoded-header - 0 subject from date message-id references 0 0 "")))) - -;;;###autoload -(defun message-cancel-news (&optional arg) - "Cancel an article you posted. -If ARG, allow editing of the cancellation message." - (interactive "P") - (unless (message-news-p) - (error "This is not a news article; canceling is impossible")) - (let (from newsgroups message-id distribution buf sender) - (save-excursion - ;; Get header info from original article. - (save-restriction - (message-narrow-to-head-1) - (setq from (message-fetch-field "from") - sender (message-fetch-field "sender") - newsgroups (message-fetch-field "newsgroups") - message-id (message-fetch-field "message-id" t) - distribution (message-fetch-field "distribution"))) - ;; Make sure that this article was written by the user. - (unless (or (message-gnksa-enable-p 'cancel-messages) - (and sender - (string-equal - (downcase sender) - (downcase (message-make-sender)))) - (string-equal - (downcase (cadr (std11-extract-address-components from))) - (downcase (cadr (std11-extract-address-components - (message-make-from)))))) - (error "This article is not yours")) - (when (yes-or-no-p "Do you really want to cancel this article? ") - ;; Make control message. - (if arg - (message-news) - (setq buf (set-buffer (get-buffer-create " *message cancel*")))) - (erase-buffer) - (insert "Newsgroups: " newsgroups "\n" - "From: " from "\n" - "Subject: cmsg cancel " message-id "\n" - "Control: cancel " message-id "\n" - (if distribution - (concat "Distribution: " distribution "\n") - "") - mail-header-separator "\n" - message-cancel-message) - (run-hooks 'message-cancel-hook) - (unless arg - (message "Canceling your article...") - (if (let ((message-syntax-checks - 'dont-check-for-anything-just-trust-me) - (message-encoding-buffer (current-buffer)) - (message-edit-buffer (current-buffer))) - (message-send-news)) - (message "Canceling your article...done")) - (kill-buffer buf)))))) - -(defun message-supersede-setup-for-mime-edit () - (set (make-local-variable 'message-setup-hook) nil) - (mime-edit-again)) - -;;;###autoload -(defun message-supersede () - "Start composing a message to supersede the current message. -This is done simply by taking the old article and adding a Supersedes -header line with the old Message-ID." - (interactive) - (let ((cur (current-buffer)) - (sender (message-fetch-field "sender")) - (from (message-fetch-field "from"))) - ;; Check whether the user owns the article that is to be superseded. - (unless (or (message-gnksa-enable-p 'cancel-messages) - (and sender - (string-equal - (downcase sender) - (downcase (message-make-sender)))) - (string-equal - (downcase (cadr (std11-extract-address-components from))) - (downcase (cadr (std11-extract-address-components - (message-make-from)))))) - (error "This article is not yours")) - ;; Get a normal message buffer. - (message-pop-to-buffer (message-buffer-name "supersede")) - (insert-buffer-substring cur) - (message-narrow-to-head-1) - ;; Remove unwanted headers. - (when message-ignored-supersedes-headers - (message-remove-header message-ignored-supersedes-headers t)) - (goto-char (point-min)) - (if (not (re-search-forward "^Message-ID: " nil t)) - (error "No Message-ID in this article") - (replace-match "Supersedes: " t t)) - (goto-char (point-max)) - (insert mail-header-separator) - (widen) - (when message-supersede-setup-function - (funcall message-supersede-setup-function)) - (run-hooks 'message-supersede-setup-hook) - (goto-char (point-min)) - (search-forward (concat "\n" mail-header-separator "\n") nil t))) - -;;;###autoload -(defun message-recover () - "Reread contents of current buffer from its last auto-save file." - (interactive) - (let ((file-name (make-auto-save-file-name))) - (cond ((save-window-excursion - (if (not (eq system-type 'vax-vms)) - (with-output-to-temp-buffer "*Directory*" - (with-current-buffer standard-output - (fundamental-mode)) ; for Emacs 20.4+ - (buffer-disable-undo standard-output) - (let ((default-directory "/")) - (call-process - "ls" nil standard-output nil "-l" file-name)))) - (yes-or-no-p (format "Recover auto save file %s? " file-name))) - (let ((buffer-read-only nil)) - (erase-buffer) - (insert-file-contents file-name nil))) - (t (error "message-recover cancelled"))))) - -;;; Washing Subject: - -(defun message-wash-subject (subject) - "Remove junk like \"Re:\", \"(fwd)\", etc. added to subject string SUBJECT. -Previous forwarders, replyers, etc. may add it." - (with-temp-buffer - (insert-string subject) - (goto-char (point-min)) - ;; strip Re/Fwd stuff off the beginning - (while (re-search-forward - "\\([Rr][Ee]:\\|[Ff][Ww][Dd]\\(\\[[0-9]*\\]\\)?:\\|[Ff][Ww]:\\)" nil t) - (replace-match "")) - - ;; and gnus-style forwards [foo@bar.com] subject - (goto-char (point-min)) - (while (re-search-forward "\\[[^ \t]*\\(@\\|\\.\\)[^ \t]*\\]" nil t) - (replace-match "")) - - ;; and off the end - (goto-char (point-max)) - (while (re-search-backward "([Ff][Ww][Dd])" nil t) - (replace-match "")) - - ;; and finally, any whitespace that was left-over - (goto-char (point-min)) - (while (re-search-forward "^[ \t]+" nil t) - (replace-match "")) - (goto-char (point-max)) - (while (re-search-backward "[ \t]+$" nil t) - (replace-match "")) - - (buffer-string))) - -;;; Forwarding messages. - -(defvar message-forward-decoded-p nil - "Non-nil means the original message is decoded.") - -(defun message-forward-subject-author-subject (subject) - "Generate a SUBJECT for a forwarded message. -The form is: [Source] Subject, where if the original message was mail, -Source is the sender, and if the original message was news, Source is -the list of newsgroups is was posted to." - (concat "[" - (if (message-news-p) - (or (message-fetch-field "newsgroups") - "(nowhere)") - (let ((from (message-fetch-field "from"))) - (if from - (nnheader-decode-from from) - "(nobody)"))) - "] " subject)) - -(defun message-forward-subject-fwd (subject) - "Generate a SUBJECT for a forwarded message. -The form is: Fwd: Subject, where Subject is the original subject of -the message." - (concat "Fwd: " subject)) - -(defun message-make-forward-subject () - "Return a Subject header suitable for the message in the current buffer." - (save-excursion - (save-restriction - (message-narrow-to-head-1) - (let ((funcs message-make-forward-subject-function) - (subject (message-fetch-field "Subject"))) - (setq subject - (if subject - (if message-forward-decoded-p - subject - (nnheader-decode-subject subject)) - "")) - (if message-wash-forwarded-subjects - (setq subject (message-wash-subject subject))) - ;; Make sure funcs is a list. - (and funcs - (not (listp funcs)) - (setq funcs (list funcs))) - ;; Apply funcs in order, passing subject generated by previous - ;; func to the next one. - (while funcs - (when (message-functionp (car funcs)) - (setq subject (funcall (car funcs) subject))) - (setq funcs (cdr funcs))) - subject)))) - -;;;###autoload -(defun message-forward (&optional news) - "Forward the current message via mail. -Optional NEWS will use news to forward instead of mail." - (interactive "P") - (let ((cur (current-buffer)) - (subject (message-make-forward-subject)) - art-beg) - (if news - (message-news nil subject) - (message-mail nil subject)) - ;; Put point where we want it before inserting the forwarded - ;; message. - (if message-forward-before-signature - (message-goto-body) - (goto-char (point-max))) - ;; Make sure we're at the start of the line. - (unless (bolp) - (insert "\n")) - ;; Narrow to the area we are to insert. - (narrow-to-region (point) (point)) - ;; Insert the separators and the forwarded buffer. - (insert message-forward-start-separator) - (setq art-beg (point)) - (insert-buffer-substring cur) - (goto-char (point-max)) - (insert message-forward-end-separator) - (set-text-properties (point-min) (point-max) nil) - ;; Remove all unwanted headers. - (goto-char art-beg) - (narrow-to-region (point) (if (search-forward "\n\n" nil t) - (1- (point)) - (point))) - (goto-char (point-min)) - (message-remove-header message-included-forward-headers t nil t) - (widen) - (message-position-point))) - -;;;###autoload -(defun message-resend (address) - "Resend the current article to ADDRESS." - (interactive - (list (message-read-from-minibuffer "Resend message to: "))) - (message "Resending message to %s..." address) - (save-excursion - (let ((cur (current-buffer)) - beg) - ;; We first set up a normal mail buffer. - (unless (message-mail-user-agent) - (set-buffer (get-buffer-create " *message resend*")) - (erase-buffer) - (let ((message-this-is-mail t) - ;; avoid to turn-on-mime-edit - message-setup-hook) - (message-setup `((To . ,address))))) - ;; Insert our usual headers. - (message-generate-headers '(From Date To)) - (message-narrow-to-headers) - ;; Rename them all to "Resent-*". - (while (re-search-forward "^[A-Za-z]" nil t) - (forward-char -1) - (insert "Resent-")) - (widen) - (forward-line) - (delete-region (point) (point-max)) - (setq beg (point)) - ;; Insert the message to be resent. - (insert-buffer-substring cur) - (goto-char (point-min)) - (search-forward "\n\n") - (forward-char -1) - (save-restriction - (narrow-to-region beg (point)) - (message-remove-header message-ignored-resent-headers t) - (goto-char (point-max))) - (insert mail-header-separator) - ;; Rename all old ("Also-")Resent headers. - (while (re-search-backward "^\\(Also-\\)*Resent-" beg t) - (beginning-of-line) - (insert "Also-")) - ;; Quote any "From " lines at the beginning. - (goto-char beg) - (when (looking-at "From ") - (replace-match "X-From-Line: ")) - ;; Send it. - (let ((message-encoding-buffer (current-buffer)) - (message-edit-buffer (current-buffer))) - (let (message-required-mail-headers) - (message-send-mail))) - (kill-buffer (current-buffer))) - (message "Resending message to %s...done" address))) - -(defun message-bounce-setup-for-mime-edit () - (set (make-local-variable 'message-setup-hook) nil) - (mime-edit-again)) - -;;;###autoload -(defun message-bounce () - "Re-mail the current message. -This only makes sense if the current message is a bounce message that -contains some mail you have written which has been bounced back to -you." - (interactive) - (let ((cur (current-buffer)) - boundary) - (message-pop-to-buffer (message-buffer-name "bounce")) - (insert-buffer-substring cur) - (undo-boundary) - (message-narrow-to-head) - (if (and (message-fetch-field "MIME-Version") - (setq boundary (message-fetch-field "Content-Type"))) - (if (string-match "boundary=\"\\([^\"]+\\)\"" boundary) - (setq boundary (concat (match-string 1 boundary) " *\n" - "Content-Type: message/rfc822")) - (setq boundary nil))) - (widen) - (goto-char (point-min)) - (search-forward "\n\n" nil t) - (if (or (and boundary - (re-search-forward boundary nil t) - (forward-line 2)) - (and (re-search-forward message-unsent-separator nil t) - (forward-line 1)) - (re-search-forward "^Return-Path:.*\n" nil t)) - ;; We remove everything before the bounced mail. - (delete-region - (point-min) - (if (re-search-forward "^[^ \n\t]+:" nil t) - (match-beginning 0) - (point))) - (when (re-search-backward "^.?From .*\n" nil t) - (delete-region (match-beginning 0) (match-end 0)))) - (save-restriction - (message-narrow-to-head-1) - (message-remove-header message-ignored-bounced-headers t) - (goto-char (point-max)) - (insert mail-header-separator)) - (when message-bounce-setup-function - (funcall message-bounce-setup-function)) - (run-hooks 'message-bounce-setup-hook) - (message-position-point))) - -;;; -;;; Interactive entry points for new message buffers. -;;; - -;;;###autoload -(defun message-mail-other-window (&optional to subject) - "Like `message-mail' command, but display mail buffer in another window." - (interactive) - (unless (message-mail-user-agent) - (let ((pop-up-windows t) - (special-display-buffer-names nil) - (special-display-regexps nil) - (same-window-buffer-names nil) - (same-window-regexps nil)) - (message-pop-to-buffer (message-buffer-name "mail" to)))) - (let ((message-this-is-mail t)) - (message-setup `((To . ,(or to "")) (Subject . ,(or subject ""))) - nil nil 'switch-to-buffer-other-window))) - -;;;###autoload -(defun message-mail-other-frame (&optional to subject) - "Like `message-mail' command, but display mail buffer in another frame." - (interactive) - (unless (message-mail-user-agent) - (let ((pop-up-frames t) - (special-display-buffer-names nil) - (special-display-regexps nil) - (same-window-buffer-names nil) - (same-window-regexps nil)) - (message-pop-to-buffer (message-buffer-name "mail" to)))) - (let ((message-this-is-mail t)) - (message-setup `((To . ,(or to "")) (Subject . ,(or subject ""))) - nil nil 'switch-to-buffer-other-frame))) - -;;;###autoload -(defun message-news-other-window (&optional newsgroups subject) - "Start editing a news article to be sent." - (interactive) - (let ((pop-up-windows t) - (special-display-buffer-names nil) - (special-display-regexps nil) - (same-window-buffer-names nil) - (same-window-regexps nil)) - (message-pop-to-buffer (message-buffer-name "news" nil newsgroups))) - (let ((message-this-is-news t)) - (message-setup `((Newsgroups . ,(or newsgroups "")) - (Subject . ,(or subject "")))))) - -;;;###autoload -(defun message-news-other-frame (&optional newsgroups subject) - "Start editing a news article to be sent." - (interactive) - (let ((pop-up-frames t) - (special-display-buffer-names nil) - (special-display-regexps nil) - (same-window-buffer-names nil) - (same-window-regexps nil)) - (message-pop-to-buffer (message-buffer-name "news" nil newsgroups))) - (let ((message-this-is-news t)) - (message-setup `((Newsgroups . ,(or newsgroups "")) - (Subject . ,(or subject "")))))) - -;;; underline.el - -;; This code should be moved to underline.el (from which it is stolen). - -;;;###autoload -(defun bold-region (start end) - "Bold all nonblank characters in the region. -Works by overstriking characters. -Called from program, takes two arguments START and END -which specify the range to operate on." - (interactive "r") - (save-excursion - (let ((end1 (make-marker))) - (move-marker end1 (max start end)) - (goto-char (min start end)) - (while (< (point) end1) - (or (looking-at "[_\^@- ]") - (insert (char-after) "\b")) - (forward-char 1))))) - -;;;###autoload -(defun unbold-region (start end) - "Remove all boldness (overstruck characters) in the region. -Called from program, takes two arguments START and END -which specify the range to operate on." - (interactive "r") - (save-excursion - (let ((end1 (make-marker))) - (move-marker end1 (max start end)) - (goto-char (min start end)) - (while (re-search-forward "\b" end1 t) - (if (eq (char-after) (char-after (- (point) 2))) - (delete-char -2)))))) - -(defalias 'message-exchange-point-and-mark 'exchange-point-and-mark) - -;; Support for toolbar -(eval-when-compile - (defvar tool-bar-map) - (defvar tool-bar-mode)) - -(defun message-tool-bar-map () - (or message-tool-bar-map - (setq message-tool-bar-map - (and (fboundp 'tool-bar-add-item-from-menu) - tool-bar-mode - (let ((tool-bar-map (copy-keymap tool-bar-map)) - (load-path (mm-image-load-path))) - ;; Zap some items which aren't so relevant and take - ;; up space. - (dolist (key '(print-buffer kill-buffer save-buffer - write-file dired open-file)) - (define-key tool-bar-map (vector key) nil)) - (tool-bar-add-item-from-menu - 'message-send-and-exit "mail_send" message-mode-map) - (tool-bar-add-item-from-menu - 'message-kill-buffer "close" message-mode-map) - (tool-bar-add-item-from-menu - 'message-dont-send "cancel" message-mode-map) - (tool-bar-add-item-from-menu - 'mml-attach-file "attach" message-mode-map) - (tool-bar-add-item-from-menu - 'ispell-message "spell" message-mode-map) - tool-bar-map))))) - -;;; Group name completion. - -(defvar message-newgroups-header-regexp - "^\\(Newsgroups\\|Followup-To\\|Posted-To\\|Gcc\\):" - "Regexp that match headers that lists groups.") - -(defvar message-completion-alist - (list (cons message-newgroups-header-regexp 'message-expand-group) - '("^\\(Resent-\\)?\\(To\\|B?Cc\\):" . message-expand-name)) - "Alist of (RE . FUN). Use FUN for completion on header lines matching RE.") - -(defun message-tab () - "Complete names according to `message-completion-alist'. -Do an `indent-relative' if not in those headers." - (interactive) - (let ((alist message-completion-alist)) - (while (and alist - (let ((mail-abbrev-mode-regexp (caar alist))) - (not (mail-abbrev-in-expansion-header-p)))) - (setq alist (cdr alist))) - (funcall (or (cdar alist) 'indent-relative)))) - -(defun message-expand-group () - "Expand the group name under point." - (let* ((b (save-excursion - (save-restriction - (narrow-to-region - (save-excursion - (beginning-of-line) - (skip-chars-forward "^:") - (1+ (point))) - (point)) - (skip-chars-backward "^, \t\n") (point)))) - (completion-ignore-case t) - (string (buffer-substring b (progn (skip-chars-forward "^,\t\n ") - (point)))) - (hashtb (and (boundp 'gnus-active-hashtb) gnus-active-hashtb)) - (completions (all-completions string hashtb)) - comp) - (delete-region b (point)) - (cond - ((= (length completions) 1) - (if (string= (car completions) string) - (progn - (insert string) - (message "Only matching group")) - (insert (car completions)))) - ((and (setq comp (try-completion string hashtb)) - (not (string= comp string))) - (insert comp)) - (t - (insert string) - (if (not comp) - (message "No matching groups") - (save-selected-window - (pop-to-buffer "*Completions*") - (buffer-disable-undo) - (let ((buffer-read-only nil)) - (erase-buffer) - (let ((standard-output (current-buffer))) - (display-completion-list (sort completions 'string<))) - (goto-char (point-min)) - (delete-region (point) (progn (forward-line 3) (point)))))))))) - -(defun message-expand-name () - (if (fboundp 'bbdb-complete-name) - (bbdb-complete-name) - (expand-abbrev))) - -;;; Help stuff. - -(defun message-talkative-question (ask question show &rest text) - "Call FUNCTION with argument QUESTION; optionally display TEXT... args. -If SHOW is non-nil, the arguments TEXT... are displayed in a temp buffer. -The following arguments may contain lists of values." - (if (and show - (setq text (message-flatten-list text))) - (save-window-excursion - (save-excursion - (with-output-to-temp-buffer " *MESSAGE information message*" - (set-buffer " *MESSAGE information message*") - (fundamental-mode) ; for Emacs 20.4+ - (mapcar 'princ text) - (goto-char (point-min)))) - (funcall ask question)) - (funcall ask question))) - -(defun message-flatten-list (list) - "Return a new, flat list that contains all elements of LIST. - -\(message-flatten-list '(1 (2 3 (4 5 (6))) 7)) -=> (1 2 3 4 5 6 7)" - (cond ((consp list) - (apply 'append (mapcar 'message-flatten-list list))) - (list - (list list)))) - -(defun message-generate-new-buffer-clone-locals (name &optional varstr) - "Create and return a buffer with name based on NAME using `generate-new-buffer.' -Then clone the local variables and values from the old buffer to the -new one, cloning only the locals having a substring matching the -regexp varstr." - (let ((oldbuf (current-buffer))) - (save-excursion - (set-buffer (generate-new-buffer name)) - (message-clone-locals oldbuf varstr) - (current-buffer)))) - -(defun message-clone-locals (buffer &optional varstr) - "Clone the local variables from BUFFER to the current buffer." - (let ((locals (save-excursion - (set-buffer buffer) - (buffer-local-variables))) - (regexp - "^\\(gnus\\|nn\\|message\\|user-\\(mail-address\\|full-name\\)\\)")) - (mapcar - (lambda (local) - (when (and (consp local) - (car local) - (string-match regexp (symbol-name (car local))) - (or (null varstr) - (string-match varstr (symbol-name (car local))))) - (ignore-errors - (set (make-local-variable (car local)) - (cdr local))))) - locals))) - - -;;; @ for MIME Edit mode -;;; - -(defun message-maybe-encode () - (when message-mime-mode - ;; Inherit the buffer local variable `mime-edit-pgp-processing'. - (let ((pgp-processing (with-current-buffer message-edit-buffer - mime-edit-pgp-processing))) - (setq mime-edit-pgp-processing pgp-processing)) - (run-hooks 'mime-edit-translate-hook) - (if (catch 'mime-edit-error - (save-excursion - (mime-edit-pgp-enclose-buffer) - (mime-edit-translate-body))) - (error "Translation error!")) - (run-hooks 'mime-edit-exit-hook))) - -(defun message-mime-insert-article (&optional full-headers) - (interactive "P") - (let ((message-cite-function 'mime-edit-inserted-message-filter) - (message-reply-buffer - (message-get-parameter-with-eval 'original-buffer)) - (start (point))) - (message-yank-original nil) - (save-excursion - (narrow-to-region (goto-char start) - (if (search-forward "\n\n" nil t) - (1- (point)) - (point-max))) - (goto-char (point-min)) - (let ((message-included-forward-headers - (if full-headers "" message-included-forward-headers))) - (message-remove-header message-included-forward-headers t nil t)) - (widen)))) - -(set-alist 'mime-edit-message-inserter-alist - 'message-mode (function message-mime-insert-article)) - -;;; Miscellaneous functions - -;; stolen (and renamed) from nnheader.el -(static-if (fboundp 'subst-char-in-string) - (defsubst message-replace-chars-in-string (string from to) - (subst-char-in-string from to string)) - (defun message-replace-chars-in-string (string from to) - "Replace characters in STRING from FROM to TO." - (let ((string (substring string 0)) ;Copy string. - (len (length string)) - (idx 0)) - ;; Replace all occurrences of FROM with TO. - (while (< idx len) - (when (= (aref string idx) from) - (aset string idx to)) - (setq idx (1+ idx))) - string))) - -;;; -;;; MIME functions -;;; - -(defvar message-inhibit-body-encoding t) - -(defun message-encode-message-body () - (unless message-inhibit-body-encoding - (let ((mail-parse-charset (or mail-parse-charset - message-default-charset)) - (case-fold-search t) - lines content-type-p) - (message-goto-body) - (save-restriction - (narrow-to-region (point) (point-max)) - (let ((new (mml-generate-mime))) - (when new - (delete-region (point-min) (point-max)) - (insert new) - (goto-char (point-min)) - (if (eq (aref new 0) ?\n) - (delete-char 1) - (search-forward "\n\n") - (setq lines (buffer-substring (point-min) (1- (point)))) - (delete-region (point-min) (point)))))) - (save-restriction - (message-narrow-to-headers-or-head) - (message-remove-header "Mime-Version") - (goto-char (point-max)) - (insert "MIME-Version: 1.0\n") - (when lines - (insert lines)) - (setq content-type-p - (or mml-boundary - (re-search-backward "^Content-Type:" nil t)))) - (save-restriction - (message-narrow-to-headers-or-head) - (message-remove-first-header "Content-Type") - (message-remove-first-header "Content-Transfer-Encoding")) - ;; We always make sure that the message has a Content-Type header. - ;; This is because some broken MTAs and MUAs get awfully confused - ;; when confronted with a message with a MIME-Version header and - ;; without a Content-Type header. For instance, Solaris' - ;; /usr/bin/mail. - (unless content-type-p - (goto-char (point-min)) - (re-search-forward "^MIME-Version:") - (forward-line 1) - (insert "Content-Type: text/plain; charset=us-ascii\n"))))) - -(defun message-read-from-minibuffer (prompt) - "Read from the minibuffer while providing abbrev expansion." - (if (fboundp 'mail-abbrevs-setup) - (let ((mail-abbrev-mode-regexp "") - (minibuffer-setup-hook 'mail-abbrevs-setup) - (minibuffer-local-map message-minibuffer-local-map)) - (read-from-minibuffer prompt)) - (let ((minibuffer-setup-hook 'mail-abbrev-minibuffer-setup-hook) - (minibuffer-local-map message-minibuffer-local-map)) - (read-string prompt)))) - -(defun message-use-alternative-email-as-from () - (require 'mail-utils) - (let* ((fields '("To" "Cc")) - (emails - (split-string - (mail-strip-quoted-names - (mapconcat 'message-fetch-reply-field fields ",")) - "[ \f\t\n\r\v,]+")) - email) - (while emails - (if (string-match message-alternative-emails (car emails)) - (setq email (car emails) - emails nil)) - (pop emails)) - (unless (or (not email) (equal email user-mail-address)) - (goto-char (point-max)) - (insert "From: " email "\n")))) - -(defun message-options-get (symbol) - (cdr (assq symbol message-options))) - -(defun message-options-set (symbol value) - (let ((the-cons (assq symbol message-options))) - (if the-cons - (if value - (setcdr the-cons value) - (setq message-options (delq the-cons message-options))) - (and value - (push (cons symbol value) message-options)))) - value) - -(defun message-options-set-recipient () - (save-restriction - (message-narrow-to-headers-or-head) - (message-options-set 'message-sender - (mail-strip-quoted-names - (message-fetch-field "from"))) - (message-options-set 'message-recipients - (mail-strip-quoted-names - (let ((to (message-fetch-field "to")) - (cc (message-fetch-field "cc")) - (bcc (message-fetch-field "bcc"))) - (concat - (or to "") - (if (and to cc) ", ") - (or cc "") - (if (and (or to cc) bcc) ", ") - (or bcc ""))))))) - -(when (featurep 'xemacs) - (require 'messagexmas) - (message-xmas-redefine)) - -(defun message-save-drafts () - "Postponing the message." - (interactive) - (message "Saving %s..." buffer-file-name) - (let ((reply-headers message-reply-headers) - (msg (buffer-substring-no-properties (point-min) (point-max))) - (message-invisibles (message-find-invisible-regions))) - (with-temp-file buffer-file-name - (insert msg) - ;; Inherit the invisible property of texts to make MIME-Edit - ;; find the MIME part boundaries. - (dolist (region message-invisibles) - (put-text-property (car region) (cdr region) 'invisible t)) - (setq message-reply-headers reply-headers) - (message-generate-headers '((optional . In-Reply-To))) - (mime-edit-translate-buffer)) - (set-buffer-modified-p nil)) - (message "Saving %s...done" buffer-file-name)) - -(provide 'message) - -(run-hooks 'message-load-hook) - -;; Local Variables: -;; coding: iso-8859-1 -;; End: - -;;; message.el ends here diff --git a/lisp/messagexmas.el b/lisp/messagexmas.el deleted file mode 100644 index a82b64e..0000000 --- a/lisp/messagexmas.el +++ /dev/null @@ -1,132 +0,0 @@ -;;; messagexmas.el --- XEmacs extensions to message - -;; Copyright (C) 1996, 1997, 1998, 1999, 2000 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Keywords: mail, news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) -(require 'nnheader) - -(defvar message-xmas-dont-activate-region t - "If t, don't activate region after yanking.") - -(defvar message-xmas-glyph-directory nil - "*Directory where Message logos and icons are located. -If this variable is nil, Message will try to locate the directory -automatically.") - -(defvar message-use-toolbar (if (featurep 'toolbar) - 'default-toolbar - nil) - "*If nil, do not use a toolbar. -If it is non-nil, it must be a toolbar. The five valid values are -`default-toolbar', `top-toolbar', `bottom-toolbar', -`right-toolbar', and `left-toolbar'.") - -(defvar message-toolbar - '([message-spell ispell-message t "Spell"] - [message-help (Info-goto-node "(Message)Top") t "Message help"]) - "The message buffer toolbar.") - -(defun message-xmas-find-glyph-directory (&optional package) - (setq package (or package "message")) - (let ((dir (symbol-value - (intern-soft (concat package "-xmas-glyph-directory"))))) - (if (and (stringp dir) (file-directory-p dir)) - dir - (nnheader-find-etc-directory package)))) - -(defun message-xmas-setup-toolbar (bar &optional force package) - (let ((dir (message-xmas-find-glyph-directory package)) - (xpm (if (featurep 'xpm) "xpm" "xbm")) - icon up down disabled name) - (unless package - (setq message-xmas-glyph-directory dir)) - (when dir - (while bar - (setq icon (aref (car bar) 0) - name (symbol-name icon) - bar (cdr bar)) - (when (or force - (not (boundp icon))) - (setq up (concat dir name "-up." xpm)) - (setq down (concat dir name "-down." xpm)) - (setq disabled (concat dir name "-disabled." xpm)) - (if (not (file-exists-p up)) - (setq bar nil - dir nil) - (set icon (toolbar-make-button-list - up (and (file-exists-p down) down) - (and (file-exists-p disabled) disabled))))))) - dir)) - -(defun message-setup-toolbar () - (and message-use-toolbar - (message-xmas-setup-toolbar message-toolbar) - (set-specifier (symbol-value message-use-toolbar) - (cons (current-buffer) message-toolbar)))) - -(defun message-xmas-exchange-point-and-mark () - "Exchange point and mark, but allow for XEmacs' optional argument." - (exchange-point-and-mark message-xmas-dont-activate-region)) - -(defun message-xmas-maybe-fontify () - (when (featurep 'font-lock) - (font-lock-set-defaults))) - -(defun message-xmas-make-caesar-translation-table (n) - "Create a rot table with offset N." - (let ((i -1) - (table (make-string 256 0)) - (a (char-int ?a)) - (A (char-int ?A))) - (while (< (incf i) 256) - (aset table i i)) - (concat - (substring table 0 A) - (substring table (+ A n) (+ A n (- 26 n))) - (substring table A (+ A n)) - (substring table (+ A 26) a) - (substring table (+ a n) (+ a n (- 26 n))) - (substring table a (+ a n)) - (substring table (+ a 26) 255)))) - -(add-hook 'message-mode-hook 'message-xmas-maybe-fontify) - -(defun message-xmas-redefine () - "Redefine message functions for XEmacs." - (defalias 'message-exchange-point-and-mark - 'message-xmas-exchange-point-and-mark) - - (when (>= emacs-major-version 20) - (defalias 'message-make-caesar-translation-table - 'message-xmas-make-caesar-translation-table))) - -(message-xmas-redefine) - -(provide 'messagexmas) - -;;; messagexmas.el ends here diff --git a/lisp/messcompat.el b/lisp/messcompat.el deleted file mode 100644 index e3021ce..0000000 --- a/lisp/messcompat.el +++ /dev/null @@ -1,94 +0,0 @@ -;;; messcompat.el --- making message mode compatible with mail mode - -;; Copyright (C) 1996, 1997, 1998, 1999, 2000 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Keywords: mail, news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;; This file tries to provide backward compatability with sendmail.el -;; for Message mode. It should be used by simply adding -;; -;; (require 'messcompat) -;; -;; to the .emacs file. Loading it after Message mode has been -;; loaded will have no effect. - -;;; Code: - -(require 'sendmail) - -(defvar message-from-style mail-from-style - "*Specifies how \"From\" headers look. - -If `nil', they contain just the return address like: - king@grassland.com -If `parens', they look like: - king@grassland.com (Elvis Parsley) -If `angles', they look like: - Elvis Parsley - -Otherwise, most addresses look like `angles', but they look like -`parens' if `angles' would need quoting and `parens' would not.") - -(defvar message-interactive mail-interactive - "Non-nil means when sending a message wait for and display errors. -nil means let mailer mail back a message to report errors.") - -(defvar message-setup-hook mail-setup-hook - "Normal hook, run each time a new outgoing message is initialized. -The function `message-setup' runs this hook.") - -(if (boundp 'mail-mode-hook) - (defvar message-mode-hook mail-mode-hook - "Hook run in message mode buffers.")) - -(defvar message-indentation-spaces mail-indentation-spaces - "*Number of spaces to insert at the beginning of each cited line. -Used by `message-yank-original' via `message-yank-cite'.") - -(defvar message-signature mail-signature - "*String to be inserted at the end of the message buffer. -If t, the `message-signature-file' file will be inserted instead. -If a function, the result from the function will be used instead. -If a form, the result from the form will be used instead.") - -;; Deleted the autoload cookie because this crashes in loaddefs.el. -(defvar message-signature-file mail-signature-file - "*File containing the text inserted at end of the message buffer.") - -(defvar message-default-headers mail-default-headers - "*A string containing header lines to be inserted in outgoing messages. -It is inserted before you edit the message, so you can edit or delete -these lines.") - -(defvar message-send-hook mail-send-hook - "Hook run before sending messages.") - -(defvar message-send-mail-function send-mail-function - "Function to call to send the current buffer as mail. -The headers should be delimited by a line whose contents match the -variable `mail-header-separator'.") - -(provide 'messcompat) - -;;; messcompat.el ends here diff --git a/lisp/mm-bodies.el b/lisp/mm-bodies.el deleted file mode 100644 index dacb792..0000000 --- a/lisp/mm-bodies.el +++ /dev/null @@ -1,292 +0,0 @@ -;;; mm-bodies.el --- Functions for decoding MIME things -;; Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; MORIOKA Tomohiko -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; Code: - -(eval-and-compile - (or (fboundp 'base64-decode-region) - (require 'base64))) - -(eval-when-compile - (defvar mm-uu-decode-function) - (defvar mm-uu-binhex-decode-function)) - -(require 'mm-util) -(require 'rfc2047) -(require 'mm-encode) - -;; 8bit treatment gets any char except: 0x32 - 0x7f, CR, LF, TAB, BEL, -;; BS, vertical TAB, form feed, and ^_ -(defvar mm-7bit-chars "\x20-\x7f\r\n\t\x7\x8\xb\xc\x1f") - -(defcustom mm-body-charset-encoding-alist - '((iso-2022-jp . 7bit) - (iso-2022-jp-2 . 7bit)) - "Alist of MIME charsets to encodings. -Valid encodings are `7bit', `8bit', `quoted-printable' and `base64'." - :type '(repeat (cons (symbol :tag "charset") - (choice :tag "encoding" - (const 7bit) - (const 8bit) - (const quoted-printable) - (const base64)))) - :group 'mime) - -(defun mm-encode-body (&optional charset) - "Encode a body. -Should be called narrowed to the body that is to be encoded. -If there is more than one non-ASCII MULE charset, then list of found -MULE charsets are returned. -If CHARSET is non-nil, it is used. -If successful, the MIME charset is returned. -If no encoding was done, nil is returned." - (if (not (mm-multibyte-p)) - ;; In the non-Mule case, we search for non-ASCII chars and - ;; return the value of `mail-parse-charset' if any are found. - (or charset - (save-excursion - (goto-char (point-min)) - (if (re-search-forward "[^\x0-\x7f]" nil t) - (or mail-parse-charset - (message-options-get 'mm-encody-body-charset) - (message-options-set - 'mm-encody-body-charset - (mm-read-charset "Charset used in the article: "))) - ;; The logic in `mml-generate-mime-1' confirms that it's OK - ;; to return nil here. - nil))) - (save-excursion - (if charset - (progn - (mm-encode-coding-region (point-min) (point-max) charset) - charset) - (goto-char (point-min)) - (let ((charsets (mm-find-mime-charset-region (point-min) (point-max))) - start) - (cond - ;; No encoding. - ((null charsets) - nil) - ;; Too many charsets. - ((> (length charsets) 1) - charsets) - ;; We encode. - (t - (setq charset (car charsets)) - (while (not (eobp)) - (if (eq (mm-charset-after) 'ascii) - (when start - (save-restriction - (narrow-to-region start (point)) - (mm-encode-coding-region - start (point) (mm-charset-to-coding-system charset)) - (goto-char (point-max))) - (setq start nil)) - (unless start - (setq start (point)))) - (forward-char 1)) - (when start - (mm-encode-coding-region start (point) - (mm-charset-to-coding-system charset)) - (setq start nil)) - charset))))))) - -(defun mm-long-lines-p (length) - "Say whether any of the lines in the buffer is longer than LINES." - (save-excursion - (goto-char (point-min)) - (end-of-line) - (while (and (not (eobp)) - (not (> (current-column) length))) - (forward-line 1) - (end-of-line)) - (and (> (current-column) length) - (current-column)))) - -(defvar message-posting-charset) - -(defun mm-body-encoding (charset &optional encoding) - "Do Content-Transfer-Encoding and return the encoding of the current buffer." - (let ((bits (mm-body-7-or-8)) - (longp (mm-long-lines-p 1000))) - (require 'message) - (cond - ((and (not mm-use-ultra-safe-encoding) - (not longp) - (eq bits '7bit)) - bits) - ((and (not mm-use-ultra-safe-encoding) - (not longp) - (or (eq t (cdr message-posting-charset)) - (memq charset (cdr message-posting-charset)) - (eq charset mail-parse-charset))) - bits) - (t - (let ((encoding (or encoding - (cdr (assq charset mm-body-charset-encoding-alist)) - (mm-qp-or-base64)))) - (when mm-use-ultra-safe-encoding - (setq encoding (mm-safer-encoding encoding))) - (mm-encode-content-transfer-encoding encoding "text/plain") - encoding))))) - -(defun mm-body-7-or-8 () - "Say whether the body is 7bit or 8bit." - (cond - ((not (featurep 'mule)) - (if (save-excursion - (goto-char (point-min)) - (skip-chars-forward mm-7bit-chars) - (eobp)) - '7bit - '8bit)) - (t - ;; Mule version - (if (and (null (delq 'ascii - (mm-find-charset-region (point-min) (point-max)))) - ;;!!!The following is necessary because the function - ;;!!!above seems to return the wrong result under - ;;!!!Emacs 20.3. Sometimes. - (save-excursion - (goto-char (point-min)) - (skip-chars-forward mm-7bit-chars) - (eobp))) - '7bit - '8bit)))) - -;;; -;;; Functions for decoding -;;; - -(defun mm-decode-content-transfer-encoding (encoding &optional type) - "Decodes buffer encoded with ENCODING, returning success status. -If TYPE is `text/plain' CRLF->LF translation may occur." - (prog1 - (condition-case error - (cond - ((eq encoding 'quoted-printable) - (quoted-printable-decode-region (point-min) (point-max)) - t) - ((eq encoding 'base64) - (base64-decode-region - (point-min) - ;; Some mailers insert whitespace - ;; junk at the end which - ;; base64-decode-region dislikes. - ;; Also remove possible junk which could - ;; have been added by mailing list software. - (save-excursion - (goto-char (point-min)) - (while (re-search-forward "^[\t ]*\r?\n" nil t) - (delete-region (match-beginning 0) (match-end 0))) - (goto-char (point-max)) - (when (re-search-backward "^[A-Za-z0-9+/]+=*[\t ]*$" nil t) - (forward-line)) - (point)))) - ((memq encoding '(7bit 8bit binary)) - ;; Do nothing. - t) - ((null encoding) - ;; Do nothing. - t) - ((memq encoding '(x-uuencode x-uue)) - (require 'mm-uu) - (funcall mm-uu-decode-function (point-min) (point-max)) - t) - ((eq encoding 'x-binhex) - (require 'mm-uu) - (funcall mm-uu-binhex-decode-function (point-min) (point-max)) - t) - ((functionp encoding) - (funcall encoding (point-min) (point-max)) - t) - (t - (message "Unknown encoding %s; defaulting to 8bit" encoding))) - (error - (message "Error while decoding: %s" error) - nil)) - (when (and - (memq encoding '(base64 x-uuencode x-uue x-binhex)) - (equal type "text/plain")) - (goto-char (point-min)) - (while (search-forward "\r\n" nil t) - (replace-match "\n" t t))))) - -(defun mm-decode-body (charset &optional encoding type) - "Decode the current article that has been encoded with ENCODING. -The characters in CHARSET should then be decoded." - (if (stringp charset) - (setq charset (intern (downcase charset)))) - (if (or (not charset) - (eq 'gnus-all mail-parse-ignored-charsets) - (memq 'gnus-all mail-parse-ignored-charsets) - (memq charset mail-parse-ignored-charsets)) - (setq charset mail-parse-charset)) - (save-excursion - (when encoding - (mm-decode-content-transfer-encoding encoding type)) - (when (featurep 'mule) - (let ((coding-system (mm-charset-to-coding-system charset))) - (if (and (not coding-system) - (listp mail-parse-ignored-charsets) - (memq 'gnus-unknown mail-parse-ignored-charsets)) - (setq coding-system - (mm-charset-to-coding-system mail-parse-charset))) - (when (and charset coding-system - ;; buffer-file-coding-system - ;;Article buffer is nil coding system - ;;in XEmacs - (mm-multibyte-p) - (or (not (eq coding-system 'ascii)) - (setq coding-system mail-parse-charset)) - (not (eq coding-system 'gnus-decoded))) - (mm-decode-coding-region (point-min) (point-max) coding-system)))))) - -(defun mm-decode-string (string charset) - "Decode STRING with CHARSET." - (when (stringp charset) - (setq charset (intern (downcase charset)))) - (when (or (not charset) - (eq 'gnus-all mail-parse-ignored-charsets) - (memq 'gnus-all mail-parse-ignored-charsets) - (memq charset mail-parse-ignored-charsets)) - (setq charset mail-parse-charset)) - (or - (when (featurep 'mule) - (let ((coding-system (mm-charset-to-coding-system charset))) - (if (and (not coding-system) - (listp mail-parse-ignored-charsets) - (memq 'gnus-unknown mail-parse-ignored-charsets)) - (setq coding-system - (mm-charset-to-coding-system mail-parse-charset))) - (when (and charset coding-system - (mm-multibyte-p) - (or (not (eq coding-system 'ascii)) - (setq coding-system mail-parse-charset))) - (mm-decode-coding-string string coding-system)))) - string)) - -(provide 'mm-bodies) - -;;; mm-bodies.el ends here diff --git a/lisp/mm-decode.el b/lisp/mm-decode.el deleted file mode 100644 index d300c6e..0000000 --- a/lisp/mm-decode.el +++ /dev/null @@ -1,1350 +0,0 @@ -;;; mm-decode.el --- Functions for decoding MIME things -;; Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; MORIOKA Tomohiko -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;; Jaap-Henk Hoepman (jhh@xs4all.nl): -;; -;; Added support for delayed destroy of external MIME viewers. All external -;; viewers for mime types in mm-keep-viewer-alive-types will remain active -;; after switching articles or groups, and will only be removed when exiting -;; gnus. -;; - -;;; Code: - -(require 'mail-parse) -(require 'gnus-mailcap) -(require 'mm-bodies) -(eval-when-compile (require 'cl) - (require 'term)) - -(eval-and-compile - (autoload 'mm-inline-partial "mm-partial") - (autoload 'mm-inline-external-body "mm-extern") - (autoload 'mm-insert-inline "mm-view")) - -(add-hook 'gnus-exit-gnus-hook 'mm-destroy-postponed-undisplay-list) - -(defgroup mime-display () - "Display of MIME in mail and news articles." - :link '(custom-manual "(emacs-mime)Customization") - :version "21.1" - :group 'mail - :group 'news - :group 'multimedia) - -(defgroup mime-security () - "MIME security in mail and news articles." - :link '(custom-manual "(emacs-mime)Customization") - :group 'mail - :group 'news - :group 'multimedia) - -;;; Convenience macros. - -(defmacro mm-handle-buffer (handle) - `(nth 0 ,handle)) -(defmacro mm-handle-type (handle) - `(nth 1 ,handle)) -(defsubst mm-handle-media-type (handle) - (if (stringp (car handle)) - (car handle) - (car (mm-handle-type handle)))) -(defsubst mm-handle-media-supertype (handle) - (car (split-string (mm-handle-media-type handle) "/"))) -(defsubst mm-handle-media-subtype (handle) - (cadr (split-string (mm-handle-media-type handle) "/"))) -(defmacro mm-handle-encoding (handle) - `(nth 2 ,handle)) -(defmacro mm-handle-undisplayer (handle) - `(nth 3 ,handle)) -(defmacro mm-handle-set-undisplayer (handle function) - `(setcar (nthcdr 3 ,handle) ,function)) -(defmacro mm-handle-disposition (handle) - `(nth 4 ,handle)) -(defmacro mm-handle-description (handle) - `(nth 5 ,handle)) -(defmacro mm-handle-cache (handle) - `(nth 6 ,handle)) -(defmacro mm-handle-set-cache (handle contents) - `(setcar (nthcdr 6 ,handle) ,contents)) -(defmacro mm-handle-id (handle) - `(nth 7 ,handle)) -(defmacro mm-handle-multipart-original-buffer (handle) - `(get-text-property 0 'buffer (car ,handle))) -(defmacro mm-handle-multipart-from (handle) - `(get-text-property 0 'from (car ,handle))) -(defmacro mm-handle-multipart-ctl-parameter (handle parameter) - `(get-text-property 0 ,parameter (car ,handle))) - -(defmacro mm-make-handle (&optional buffer type encoding undisplayer - disposition description cache - id) - `(list ,buffer ,type ,encoding ,undisplayer - ,disposition ,description ,cache ,id)) - -(defcustom mm-inline-media-tests - '(("image/jpeg" - mm-inline-image - (lambda (handle) - (mm-valid-and-fit-image-p 'jpeg handle))) - ("image/png" - mm-inline-image - (lambda (handle) - (mm-valid-and-fit-image-p 'png handle))) - ("image/gif" - mm-inline-image - (lambda (handle) - (mm-valid-and-fit-image-p 'gif handle))) - ("image/tiff" - mm-inline-image - (lambda (handle) - (mm-valid-and-fit-image-p 'tiff handle)) ) - ("image/xbm" - mm-inline-image - (lambda (handle) - (mm-valid-and-fit-image-p 'xbm handle))) - ("image/x-xbitmap" - mm-inline-image - (lambda (handle) - (mm-valid-and-fit-image-p 'xbm handle))) - ("image/xpm" - mm-inline-image - (lambda (handle) - (mm-valid-and-fit-image-p 'xpm handle))) - ("image/x-pixmap" - mm-inline-image - (lambda (handle) - (mm-valid-and-fit-image-p 'xpm handle))) - ("image/bmp" - mm-inline-image - (lambda (handle) - (mm-valid-and-fit-image-p 'bmp handle))) - ("image/x-portable-bitmap" - mm-inline-image - (lambda (handle) - (mm-valid-and-fit-image-p 'pbm handle))) - ("text/plain" mm-inline-text identity) - ("text/enriched" mm-inline-text identity) - ("text/richtext" mm-inline-text identity) - ("text/x-patch" mm-display-patch-inline - (lambda (handle) - (locate-library "diff-mode"))) - ("application/emacs-lisp" mm-display-elisp-inline identity) - ("text/html" - mm-inline-text - (lambda (handle) - (locate-library "w3"))) - ("text/x-vcard" - mm-inline-text - (lambda (handle) - (or (featurep 'vcard) - (locate-library "vcard")))) - ("message/delivery-status" mm-inline-text identity) - ("message/rfc822" mm-inline-message identity) - ("message/partial" mm-inline-partial identity) - ("message/external-body" mm-inline-external-body identity) - ("text/.*" mm-inline-text identity) - ("audio/wav" mm-inline-audio - (lambda (handle) - (and (or (featurep 'nas-sound) (featurep 'native-sound)) - (device-sound-enabled-p)))) - ("audio/au" - mm-inline-audio - (lambda (handle) - (and (or (featurep 'nas-sound) (featurep 'native-sound)) - (device-sound-enabled-p)))) - ("application/pgp-signature" ignore identity) - ("application/x-pkcs7-signature" ignore identity) - ("application/pkcs7-signature" ignore identity) - ("application/x-pkcs7-mime" ignore identity) - ("application/pkcs7-mime" ignore identity) - ("multipart/alternative" ignore identity) - ("multipart/mixed" ignore identity) - ("multipart/related" ignore identity) - ;; Disable audio and image - ("audio/.*" ignore ignore) - ("image/.*" ignore ignore) - ;; Default to displaying as text - (".*" mm-inline-text mm-readable-p)) - "Alist of media types/tests saying whether types can be displayed inline." - :type '(repeat (list (string :tag "MIME type") - (function :tag "Display function") - (function :tag "Display test"))) - :group 'mime-display) - -(defcustom mm-inlined-types - '("image/.*" "text/.*" "message/delivery-status" "message/rfc822" - "message/partial" "message/external-body" "application/emacs-lisp" - "application/pgp-signature" "application/x-pkcs7-signature" - "application/pkcs7-signature" "application/x-pkcs7-mime" - "application/pkcs7-mime") - "List of media types that are to be displayed inline. -See also `mm-inline-media-tests', which says how to display a media -type inline." - :type '(repeat string) - :group 'mime-display) - -(defcustom mm-keep-viewer-alive-types - '("application/postscript" "application/msword" "application/vnd.ms-excel" - "application/pdf" "application/x-dvi") - "List of media types for which the external viewer will not be killed -when selecting a different article." - :type '(repeat string) - :group 'mime-display) - -(defcustom mm-automatic-display - '("text/plain" "text/enriched" "text/richtext" "text/html" - "text/x-vcard" "image/.*" "message/delivery-status" "multipart/.*" - "message/rfc822" "text/x-patch" "application/pgp-signature" - "application/emacs-lisp" "application/x-pkcs7-signature" - "application/pkcs7-signature" "application/x-pkcs7-mime" - "application/pkcs7-mime") - "A list of MIME types to be displayed automatically." - :type '(repeat string) - :group 'mime-display) - -(defcustom mm-attachment-override-types '("text/x-vcard" - "application/pkcs7-mime" - "application/x-pkcs7-mime") - "Types to have \"attachment\" ignored if they can be displayed inline." - :type '(repeat string) - :group 'mime-display) - -(defcustom mm-inline-override-types nil - "Types to be treated as attachments even if they can be displayed inline." - :type '(repeat string) - :group 'mime-display) - -(defcustom mm-automatic-external-display nil - "List of MIME type regexps that will be displayed externally automatically." - :type '(repeat string) - :group 'mime-display) - -(defcustom mm-discouraged-alternatives nil - "List of MIME types that are discouraged when viewing multipart/alternative. -Viewing agents are supposed to view the last possible part of a message, -as that is supposed to be the richest. However, users may prefer other -types instead, and this list says what types are most unwanted. If, -for instance, text/html parts are very unwanted, and text/richtext are -somewhat unwanted, then the value of this variable should be set -to: - - (\"text/html\" \"text/richtext\")" - :type '(repeat string) - :group 'mime-display) - -(defcustom mm-tmp-directory - (cond ((fboundp 'temp-directory) (temp-directory)) - ((boundp 'temporary-file-directory) temporary-file-directory) - ("/tmp/")) - "Where mm will store its temporary files." - :type 'directory - :group 'mime-display) - -(defcustom mm-inline-large-images nil - "If non-nil, then all images fit in the buffer." - :type 'boolean - :group 'mime-display) - -(defvar mm-file-name-rewrite-functions nil - "*List of functions used for rewriting file names of MIME parts. -Each function takes a file name as input and returns a file name. - -Ready-made functions include -`mm-file-name-delete-whitespace', -`mm-file-name-trim-whitespace', -`mm-file-name-collapse-whitespace', -`mm-file-name-replace-whitespace', -`capitalize', `downcase', `upcase', and -`upcase-initials'.") - -(defvar mm-path-name-rewrite-functions nil - "*List of functions used for rewriting path names of MIME parts. -This is used when viewing parts externally , and is meant for -transforming the path name so that non-compliant programs can -find the file where it's saved. - -Each function takes a file name as input and returns a file name.") - -(defvar mm-file-name-replace-whitespace nil - "String used for replacing whitespace characters; default is `\"_\"'.") - -(defcustom mm-default-directory nil - "The default directory where mm will save files. -If not set, `default-directory' will be used." - :type 'directory - :group 'mime-display) - -(defcustom mm-external-terminal-program "xterm" - "The program to start an external terminal." - :type 'string - :group 'mime-display) - -;;; Internal variables. - -(defvar mm-dissection-list nil) -(defvar mm-last-shell-command "") -(defvar mm-content-id-alist nil) -(defvar mm-postponed-undisplay-list nil) - -;; According to RFC2046, in particular, in a digest, the default -;; Content-Type value for a body part is changed from "text/plain" to -;; "message/rfc822". -(defvar mm-dissect-default-type "text/plain") - -(autoload 'mml2015-verify "mml2015") -(autoload 'mml2015-verify-test "mml2015") -(autoload 'mml-smime-verify "mml-smime") -(autoload 'mml-smime-verify-test "mml-smime") - -(defvar mm-verify-function-alist - '(("application/pgp-signature" mml2015-verify "PGP" mml2015-verify-test) - ("application/x-gnus-pgp-signature" mm-uu-pgp-signed-extract-1 "PGP" - mm-uu-pgp-signed-test) - ("application/pkcs7-signature" mml-smime-verify "S/MIME" - mml-smime-verify-test) - ("application/x-pkcs7-signature" mml-smime-verify "S/MIME" - mml-smime-verify-test))) - -(defcustom mm-verify-option 'never - "Option of verifying signed parts. -`never', not verify; `always', always verify; -`known', only verify known protocols. Otherwise, ask user." - :type '(choice (item always) - (item never) - (item :tag "only known protocols" known) - (item :tag "ask" nil)) - :group 'mime-security) - -(autoload 'mml2015-decrypt "mml2015") -(autoload 'mml2015-decrypt-test "mml2015") - -(defvar mm-decrypt-function-alist - '(("application/pgp-encrypted" mml2015-decrypt "PGP" mml2015-decrypt-test) - ("application/x-gnus-pgp-encrypted" mm-uu-pgp-encrypted-extract-1 "PGP" - mm-uu-pgp-encrypted-test))) - -(defcustom mm-decrypt-option nil - "Option of decrypting encrypted parts. -`never', not decrypt; `always', always decrypt; -`known', only decrypt known protocols. Otherwise, ask user." - :type '(choice (item always) - (item never) - (item :tag "only known protocols" known) - (item :tag "ask" nil)) - :group 'mime-security) - -(defvar mm-viewer-completion-map - (let ((map (make-sparse-keymap 'mm-viewer-completion-map))) - (set-keymap-parent map minibuffer-local-completion-map) - map) - "Keymap for input viewer with completion.") - -;; Should we bind other key to minibuffer-complete-word? -(define-key mm-viewer-completion-map " " 'self-insert-command) - -(defvar mm-viewer-completion-map - (let ((map (make-sparse-keymap 'mm-viewer-completion-map))) - (set-keymap-parent map minibuffer-local-completion-map) - map) - "Keymap for input viewer with completion.") - -;; Should we bind other key to minibuffer-complete-word? -(define-key mm-viewer-completion-map " " 'self-insert-command) - -;;; The functions. - -(defun mm-alist-to-plist (alist) - "Convert association list ALIST into the equivalent property-list form. -The plist is returned. This converts from - -\((a . 1) (b . 2) (c . 3)) - -into - -\(a 1 b 2 c 3) - -The original alist is not modified. See also `destructive-alist-to-plist'." - (let (plist) - (while alist - (let ((el (car alist))) - (setq plist (cons (cdr el) (cons (car el) plist)))) - (setq alist (cdr alist))) - (nreverse plist))) - -(defun mm-keep-viewer-alive-p (handle) - "Say whether external viewer for HANDLE should stay alive." - (let ((types mm-keep-viewer-alive-types) - (type (mm-handle-media-type handle)) - ty) - (catch 'found - (while (setq ty (pop types)) - (when (string-match ty type) - (throw 'found t)))))) - -(defun mm-handle-set-external-undisplayer (handle function) - "Set the undisplayer for this handle; postpone undisplaying of viewers -for types in mm-keep-viewer-alive-types." - (if (mm-keep-viewer-alive-p handle) - (let ((new-handle (copy-sequence handle))) - (mm-handle-set-undisplayer new-handle function) - (mm-handle-set-undisplayer handle nil) - (push new-handle mm-postponed-undisplay-list)) - (mm-handle-set-undisplayer handle function))) - -(defun mm-destroy-postponed-undisplay-list () - (when mm-postponed-undisplay-list - (message "Destroying external MIME viewers") - (mm-destroy-parts mm-postponed-undisplay-list))) - -(defun mm-dissect-buffer (&optional no-strict-mime) - "Dissect the current buffer and return a list of MIME handles." - (save-excursion - (let (ct ctl type subtype cte cd description id result from) - (save-restriction - (mail-narrow-to-head) - (when (or no-strict-mime - (mail-fetch-field "mime-version")) - (setq ct (mail-fetch-field "content-type") - ctl (ignore-errors (mail-header-parse-content-type ct)) - cte (mail-fetch-field "content-transfer-encoding") - cd (mail-fetch-field "content-disposition") - description (mail-fetch-field "content-description") - from (mail-fetch-field "from") - id (mail-fetch-field "content-id")) - ;; FIXME: In some circumstances, this code is running within - ;; an unibyte macro. mail-extract-address-components - ;; creates unibyte buffers. This `if', though not a perfect - ;; solution, avoids most of them. - (if from - (setq from (cadr (mail-extract-address-components from)))))) - (when cte - (setq cte (mail-header-strip cte))) - (if (or (not ctl) - (not (string-match "/" (car ctl)))) - (mm-dissect-singlepart - (list mm-dissect-default-type) - (and cte (intern (downcase (mail-header-remove-whitespace - (mail-header-remove-comments - cte))))) - no-strict-mime - (and cd (ignore-errors (mail-header-parse-content-disposition cd))) - description) - (setq type (split-string (car ctl) "/")) - (setq subtype (cadr type) - type (pop type)) - (setq - result - (cond - ((equal type "multipart") - (let ((mm-dissect-default-type (if (equal subtype "digest") - "message/rfc822" - "text/plain"))) - (add-text-properties 0 (length (car ctl)) - (mm-alist-to-plist (cdr ctl)) (car ctl)) - - ;; what really needs to be done here is a way to link a - ;; MIME handle back to it's parent MIME handle (in a multilevel - ;; MIME article). That would probably require changing - ;; the mm-handle API so we simply store the multipart buffert - ;; name as a text property of the "multipart/whatever" string. - (add-text-properties 0 (length (car ctl)) - (list 'buffer (mm-copy-to-buffer)) - (car ctl)) - (add-text-properties 0 (length (car ctl)) - (list 'from from) - (car ctl)) - (cons (car ctl) (mm-dissect-multipart ctl)))) - (t - (mm-possibly-verify-or-decrypt - (mm-dissect-singlepart - ctl - (and cte (intern (downcase (mail-header-remove-whitespace - (mail-header-remove-comments - cte))))) - no-strict-mime - (and cd (ignore-errors - (mail-header-parse-content-disposition cd))) - description id) - ctl)))) - (when id - (when (string-match " *<\\(.*\\)> *" id) - (setq id (match-string 1 id))) - (push (cons id result) mm-content-id-alist)) - result)))) - -(defun mm-dissect-singlepart (ctl cte &optional force cdl description id) - (when (or force - (if (equal "text/plain" (car ctl)) - (assoc 'format ctl) - t)) - (let ((res (mm-make-handle - (mm-copy-to-buffer) ctl cte nil cdl description nil id))) - (push (car res) mm-dissection-list) - res))) - -(defun mm-remove-all-parts () - "Remove all MIME handles." - (interactive) - (mapcar 'mm-remove-part mm-dissection-list) - (setq mm-dissection-list nil)) - -(defun mm-dissect-multipart (ctl) - (goto-char (point-min)) - (let* ((boundary (concat "\n--" (mail-content-type-get ctl 'boundary))) - (close-delimiter (concat (regexp-quote boundary) "--[ \t]*$")) - start parts - (end (save-excursion - (goto-char (point-max)) - (if (re-search-backward close-delimiter nil t) - (match-beginning 0) - (point-max))))) - (setq boundary (concat (regexp-quote boundary) "[ \t]*$")) - (while (and (< (point) end) (re-search-forward boundary end t)) - (goto-char (match-beginning 0)) - (when start - (save-excursion - (save-restriction - (narrow-to-region start (point)) - (setq parts (nconc (list (mm-dissect-buffer t)) parts))))) - (forward-line 2) - (setq start (point))) - (when (and start (< start end)) - (save-excursion - (save-restriction - (narrow-to-region start end) - (setq parts (nconc (list (mm-dissect-buffer t)) parts))))) - (mm-possibly-verify-or-decrypt (nreverse parts) ctl))) - -(defun mm-copy-to-buffer () - "Copy the contents of the current buffer to a fresh buffer." - (save-excursion - (let ((flag enable-multibyte-characters) - (new-buffer (generate-new-buffer " *mm*"))) - (goto-char (point-min)) - (search-forward-regexp "^\n" nil t) - (save-restriction - (narrow-to-region (point) (point-max)) - (when flag - (set-buffer-multibyte nil)) - (copy-to-buffer new-buffer (point-min) (point-max)) - (when flag - (set-buffer-multibyte t))) - new-buffer))) - -(defun mm-display-parts (handle &optional no-default) - (if (stringp (car handle)) - (mapcar 'mm-display-parts (cdr handle)) - (if (bufferp (car handle)) - (save-restriction - (narrow-to-region (point) (point)) - (mm-display-part handle) - (goto-char (point-max))) - (mapcar 'mm-display-parts handle)))) - -(defun mm-display-part (handle &optional no-default) - "Display the MIME part represented by HANDLE. -Returns nil if the part is removed; inline if displayed inline; -external if displayed external." - (save-excursion - (mailcap-parse-mailcaps) - (if (mm-handle-displayed-p handle) - (mm-remove-part handle) - (let* ((type (mm-handle-media-type handle)) - (method (mailcap-mime-info type))) - (if (and (mm-inlinable-p handle) - (mm-inlined-p handle)) - (progn - (forward-line 1) - (mm-display-inline handle) - 'inline) - (when (or method - (not no-default)) - (if (and (not method) - (equal "text" (car (split-string type)))) - (progn - (forward-line 1) - (mm-insert-inline handle (mm-get-part handle)) - 'inline) - (mm-display-external - handle (or method 'mailcap-save-binary-file))))))))) - -(defun mm-display-external (handle method) - "Display HANDLE using METHOD." - (let ((outbuf (current-buffer))) - (mm-with-unibyte-buffer - (if (functionp method) - (let ((cur (current-buffer))) - (if (eq method 'mailcap-save-binary-file) - (progn - (set-buffer (generate-new-buffer " *mm*")) - (setq method nil)) - (mm-insert-part handle) - (let ((win (get-buffer-window cur t))) - (when win - (select-window win))) - (switch-to-buffer (generate-new-buffer " *mm*"))) - (buffer-disable-undo) - (mm-set-buffer-file-coding-system mm-binary-coding-system) - (insert-buffer-substring cur) - (goto-char (point-min)) - (message "Viewing with %s" method) - (let ((mm (current-buffer)) - (non-viewer (assq 'non-viewer - (mailcap-mime-info - (mm-handle-media-type handle) t)))) - (unwind-protect - (if method - (funcall method) - (mm-save-part handle)) - (when (and (not non-viewer) - method) - (mm-handle-set-undisplayer handle mm))))) - ;; The function is a string to be executed. - (mm-insert-part handle) - (let* ((dir (make-temp-name - (expand-file-name "emm." mm-tmp-directory))) - (filename (or - (mail-content-type-get - (mm-handle-disposition handle) 'filename) - (mail-content-type-get - (mm-handle-type handle) 'name))) - (mime-info (mailcap-mime-info - (mm-handle-media-type handle) t)) - (needsterm (or (assoc "needsterm" mime-info) - (assoc "needsterminal" mime-info))) - (copiousoutput (assoc "copiousoutput" mime-info)) - file buffer) - ;; We create a private sub-directory where we store our files. - (make-directory dir) - (set-file-modes dir 448) - (if filename - (setq file (expand-file-name (file-name-nondirectory filename) - dir)) - (setq file (make-temp-name (expand-file-name "mm." dir)))) - (let ((coding-system-for-write mm-binary-coding-system)) - (write-region (point-min) (point-max) file nil 'nomesg)) - (message "Viewing with %s" method) - (cond - (needsterm - (unwind-protect - (if window-system - (start-process "*display*" nil - mm-external-terminal-program - "-e" shell-file-name - shell-command-switch - (mm-mailcap-command - method file (mm-handle-type handle))) - (require 'term) - (require 'gnus-win) - (set-buffer - (setq buffer - (make-term "display" - shell-file-name - nil - shell-command-switch - (mm-mailcap-command - method file - (mm-handle-type handle))))) - (term-mode) - (term-char-mode) - (set-process-sentinel - (get-buffer-process buffer) - `(lambda (process state) - (if (eq 'exit (process-status process)) - (gnus-configure-windows - ',gnus-current-window-configuration)))) - (gnus-configure-windows 'display-term)) - (mm-handle-set-external-undisplayer handle (cons file buffer))) - (message "Displaying %s..." (format method file)) - 'external) - (copiousoutput - (with-current-buffer outbuf - (forward-line 1) - (mm-insert-inline - handle - (unwind-protect - (progn - (call-process shell-file-name nil - (setq buffer - (generate-new-buffer " *mm*")) - nil - shell-command-switch - (mm-mailcap-command - method file (mm-handle-type handle))) - (if (buffer-live-p buffer) - (save-excursion - (set-buffer buffer) - (buffer-string)))) - (progn - (ignore-errors (delete-file file)) - (ignore-errors (delete-directory - (file-name-directory file))) - (ignore-errors (kill-buffer buffer)))))) - 'inline) - (t - (unwind-protect - (start-process "*display*" - (setq buffer - (generate-new-buffer " *mm*")) - shell-file-name - shell-command-switch - (mm-mailcap-command - method file (mm-handle-type handle))) - (mm-handle-set-external-undisplayer - handle (cons file buffer))) - (message "Displaying %s..." (format method file)) - 'external))))))) - -(defun mm-mailcap-command (method file type-list) - (let ((ctl (cdr type-list)) - (beg 0) - (uses-stdin t) - out sub total) - (while (string-match "%{\\([^}]+\\)}\\|%s\\|%t\\|%%" method beg) - (push (substring method beg (match-beginning 0)) out) - (setq beg (match-end 0) - total (match-string 0 method) - sub (match-string 1 method)) - (cond - ((string= total "%%") - (push "%" out)) - ((string= total "%s") - (setq uses-stdin nil) - (push (mm-quote-arg - (gnus-map-function mm-path-name-rewrite-functions file)) out)) - ((string= total "%t") - (push (mm-quote-arg (car type-list)) out)) - (t - (push (mm-quote-arg (or (cdr (assq (intern sub) ctl)) "")) out)))) - (push (substring method beg (length method)) out) - (when uses-stdin - (push "<" out) - (push (mm-quote-arg - (gnus-map-function mm-path-name-rewrite-functions file)) - out)) - (mapconcat 'identity (nreverse out) ""))) - -(defun mm-remove-parts (handles) - "Remove the displayed MIME parts represented by HANDLES." - (if (and (listp handles) - (bufferp (car handles))) - (mm-remove-part handles) - (let (handle) - (while (setq handle (pop handles)) - (cond - ((stringp handle) - (when (buffer-live-p (get-text-property 0 'buffer handle)) - (kill-buffer (get-text-property 0 'buffer handle)))) - ((and (listp handle) - (stringp (car handle))) - (mm-remove-parts (cdr handle))) - (t - (mm-remove-part handle))))))) - -(defun mm-destroy-parts (handles) - "Remove the displayed MIME parts represented by HANDLES." - (if (and (listp handles) - (bufferp (car handles))) - (mm-destroy-part handles) - (let (handle) - (while (setq handle (pop handles)) - (cond - ((stringp handle) - (when (buffer-live-p (get-text-property 0 'buffer handle)) - (kill-buffer (get-text-property 0 'buffer handle)))) - ((and (listp handle) - (stringp (car handle))) - (mm-destroy-parts handle)) - (t - (mm-destroy-part handle))))))) - -(defun mm-remove-part (handle) - "Remove the displayed MIME part represented by HANDLE." - (when (listp handle) - (let ((object (mm-handle-undisplayer handle))) - (ignore-errors - (cond - ;; Internally displayed part. - ((mm-annotationp object) - (delete-annotation object)) - ((or (functionp object) - (and (listp object) - (eq (car object) 'lambda))) - (funcall object)) - ;; Externally displayed part. - ((consp object) - (ignore-errors (delete-file (car object))) - (ignore-errors (delete-directory (file-name-directory (car object)))) - (ignore-errors (and (cdr object) (kill-buffer (cdr object))))) - ((bufferp object) - (when (buffer-live-p object) - (kill-buffer object))))) - (mm-handle-set-undisplayer handle nil)))) - -(defun mm-display-inline (handle) - (let* ((type (mm-handle-media-type handle)) - (function (cadr (mm-assoc-string-match mm-inline-media-tests type)))) - (funcall function handle) - (goto-char (point-min)))) - -(defun mm-assoc-string-match (alist type) - (dolist (elem alist) - (when (string-match (car elem) type) - (return elem)))) - -(defun mm-automatic-display-p (handle) - "Say whether the user wants HANDLE to be displayed automatically." - (let ((methods mm-automatic-display) - (type (mm-handle-media-type handle)) - method result) - (while (setq method (pop methods)) - (when (and (not (mm-inline-override-p handle)) - (string-match method type)) - (setq result t - methods nil))) - result)) - -(defun mm-inlinable-p (handle) - "Say whether HANDLE can be displayed inline." - (let ((alist mm-inline-media-tests) - (type (mm-handle-media-type handle)) - test) - (while alist - (when (string-match (caar alist) type) - (setq test (caddar alist) - alist nil) - (setq test (funcall test handle))) - (pop alist)) - test)) - -(defun mm-inlined-p (handle) - "Say whether the user wants HANDLE to be displayed inline." - (let ((methods mm-inlined-types) - (type (mm-handle-media-type handle)) - method result) - (while (setq method (pop methods)) - (when (and (not (mm-inline-override-p handle)) - (string-match method type)) - (setq result t - methods nil))) - result)) - -(defun mm-attachment-override-p (handle) - "Say whether HANDLE should have attachment behavior overridden." - (let ((types mm-attachment-override-types) - (type (mm-handle-media-type handle)) - ty) - (catch 'found - (while (setq ty (pop types)) - (when (and (string-match ty type) - (mm-inlinable-p handle)) - (throw 'found t)))))) - -(defun mm-inline-override-p (handle) - "Say whether HANDLE should have inline behavior overridden." - (let ((types mm-inline-override-types) - (type (mm-handle-media-type handle)) - ty) - (catch 'found - (while (setq ty (pop types)) - (when (string-match ty type) - (throw 'found t)))))) - -(defun mm-automatic-external-display-p (type) - "Return the user-defined method for TYPE." - (let ((methods mm-automatic-external-display) - method result) - (while (setq method (pop methods)) - (when (string-match method type) - (setq result t - methods nil))) - result)) - -(defun mm-destroy-part (handle) - "Destroy the data structures connected to HANDLE." - (when (listp handle) - (mm-remove-part handle) - (when (buffer-live-p (mm-handle-buffer handle)) - (kill-buffer (mm-handle-buffer handle))))) - -(defun mm-handle-displayed-p (handle) - "Say whether HANDLE is displayed or not." - (mm-handle-undisplayer handle)) - -;;; -;;; Functions for outputting parts -;;; - -(defun mm-get-part (handle) - "Return the contents of HANDLE as a string." - (mm-with-unibyte-buffer - (insert (with-current-buffer (mm-handle-buffer handle) - (mm-with-unibyte-current-buffer-mule4 - (buffer-string)))) - (mm-decode-content-transfer-encoding - (mm-handle-encoding handle) - (mm-handle-media-type handle)) - (buffer-string))) - -(defun mm-insert-part (handle) - "Insert the contents of HANDLE in the current buffer." - (let ((cur (current-buffer))) - (save-excursion - (if (member (mm-handle-media-supertype handle) '("text" "message")) - (with-temp-buffer - (insert-buffer-substring (mm-handle-buffer handle)) - (prog1 - (mm-decode-content-transfer-encoding - (mm-handle-encoding handle) - (mm-handle-media-type handle)) - (let ((temp (current-buffer))) - (set-buffer cur) - (insert-buffer-substring temp)))) - (mm-with-unibyte-buffer - (insert-buffer-substring (mm-handle-buffer handle)) - (prog1 - (mm-decode-content-transfer-encoding - (mm-handle-encoding handle) - (mm-handle-media-type handle)) - (let ((temp (current-buffer))) - (set-buffer cur) - (insert-buffer-substring temp)))))))) - -(defun mm-file-name-delete-whitespace (file-name) - "Remove all whitespace characters from FILE-NAME." - (while (string-match "\\s-+" file-name) - (setq file-name (replace-match "" t t file-name))) - file-name) - -(defun mm-file-name-trim-whitespace (file-name) - "Remove leading and trailing whitespace characters from FILE-NAME." - (when (string-match "\\`\\s-+" file-name) - (setq file-name (substring file-name (match-end 0)))) - (when (string-match "\\s-+\\'" file-name) - (setq file-name (substring file-name 0 (match-beginning 0)))) - file-name) - -(defun mm-file-name-collapse-whitespace (file-name) - "Collapse multiple whitespace characters in FILE-NAME." - (while (string-match "\\s-\\s-+" file-name) - (setq file-name (replace-match " " t t file-name))) - file-name) - -(defun mm-file-name-replace-whitespace (file-name) - "Replace whitespace characters in FILE-NAME with underscores. -Set `mm-file-name-replace-whitespace' to any other string if you do not -like underscores." - (let ((s (or mm-file-name-replace-whitespace "_"))) - (while (string-match "\\s-" file-name) - (setq file-name (replace-match s t t file-name)))) - file-name) - -(defun mm-save-part (handle) - "Write HANDLE to a file." - (let* ((name (mail-content-type-get (mm-handle-type handle) 'name)) - (filename (mail-content-type-get - (mm-handle-disposition handle) 'filename)) - file) - (when filename - (setq filename (gnus-map-function mm-file-name-rewrite-functions - (file-name-nondirectory filename)))) - (setq file - (read-file-name "Save MIME part to: " - (expand-file-name - (or filename name "") - (or mm-default-directory default-directory)))) - (setq mm-default-directory (file-name-directory file)) - (and (or (not (file-exists-p file)) - (yes-or-no-p (format "File %s already exists; overwrite? " - file))) - (progn - (mm-save-part-to-file handle file) - file)))) - -(defun mm-save-part-to-file (handle file) - (mm-with-unibyte-buffer - (mm-insert-part handle) - (let ((coding-system-for-write 'binary) - ;; Don't re-compress .gz & al. Arguably we should make - ;; `file-name-handler-alist' nil, but that would chop - ;; ange-ftp, which is reasonable to use here. - (inhibit-file-name-operation 'write-region) - (inhibit-file-name-handlers - (cons 'jka-compr-handler inhibit-file-name-handlers))) - (write-region (point-min) (point-max) file)))) - -(defun mm-pipe-part (handle) - "Pipe HANDLE to a process." - (let* ((name (mail-content-type-get (mm-handle-type handle) 'name)) - (command - (read-string "Shell command on MIME part: " mm-last-shell-command))) - (mm-with-unibyte-buffer - (mm-insert-part handle) - (let ((coding-system-for-write 'binary)) - (shell-command-on-region (point-min) (point-max) command nil))))) - -(defun mm-interactively-view-part (handle) - "Display HANDLE using METHOD." - (let* ((type (mm-handle-media-type handle)) - (methods - (mapcar (lambda (i) (list (cdr (assoc 'viewer i)))) - (mailcap-mime-info type 'all))) - (method (let ((minibuffer-local-completion-map - mm-viewer-completion-map)) - (completing-read "Viewer: " methods)))) - (when (string= method "") - (error "No method given")) - (if (string-match "^[^% \t]+$" method) - (setq method (concat method " %s"))) - (mm-display-external handle method))) - -(defun mm-preferred-alternative (handles &optional preferred) - "Say which of HANDLES are preferred." - (let ((prec (if preferred (list preferred) - (mm-preferred-alternative-precedence handles))) - p h result type handle) - (while (setq p (pop prec)) - (setq h handles) - (while h - (setq handle (car h)) - (setq type (mm-handle-media-type handle)) - (when (and (equal p type) - (mm-automatic-display-p handle) - (or (stringp (car handle)) - (not (mm-handle-disposition handle)) - (equal (car (mm-handle-disposition handle)) - "inline"))) - (setq result handle - h nil - prec nil)) - (pop h))) - result)) - -(defun mm-preferred-alternative-precedence (handles) - "Return the precedence based on HANDLES and `mm-discouraged-alternatives'." - (let ((seq (nreverse (mapcar #'mm-handle-media-type - handles)))) - (dolist (disc (reverse mm-discouraged-alternatives)) - (dolist (elem (copy-sequence seq)) - (when (string-match disc elem) - (setq seq (nconc (delete elem seq) (list elem)))))) - seq)) - -(defun mm-get-content-id (id) - "Return the handle(s) referred to by ID." - (cdr (assoc id mm-content-id-alist))) - -(defconst mm-image-type-regexps - '(("/\\*.*XPM.\\*/" . xpm) - ("P[1-6]" . pbm) - ("GIF8" . gif) - ("\377\330" . jpeg) - ("\211PNG\r\n" . png) - ("#define" . xbm) - ("\\(MM\0\\*\\)\\|\\(II\\*\0\\)" . tiff) - ("%!PS" . postscript)) - "Alist of (REGEXP . IMAGE-TYPE) pairs used to auto-detect image types. -When the first bytes of an image file match REGEXP, it is assumed to -be of image type IMAGE-TYPE.") - -;; Steal from image.el. image-type-from-data suffers multi-line matching bug. -(defun mm-image-type-from-buffer () - "Determine the image type from data in the current buffer. -Value is a symbol specifying the image type or nil if type cannot -be determined." - (let ((types mm-image-type-regexps) - type) - (goto-char (point-min)) - (while (and types (null type)) - (let ((regexp (car (car types))) - (image-type (cdr (car types)))) - (when (looking-at regexp) - (setq type image-type)) - (setq types (cdr types)))) - type)) - -(defun mm-get-image (handle) - "Return an image instance based on HANDLE." - (let ((type (mm-handle-media-subtype handle)) - spec) - ;; Allow some common translations. - (setq type - (cond - ((equal type "x-pixmap") - "xpm") - ((equal type "x-xbitmap") - "xbm") - ((equal type "x-portable-bitmap") - "pbm") - (t type))) - (or (mm-handle-cache handle) - (mm-with-unibyte-buffer - (mm-insert-part handle) - (prog1 - (setq spec - (ignore-errors - ;; Avoid testing `make-glyph' since W3 may define - ;; a bogus version of it. - (if (fboundp 'create-image) - (create-image (buffer-string) - (or (mm-image-type-from-buffer) - (intern type)) - 'data-p) - (cond - ((equal type "xbm") - ;; xbm images require special handling, since - ;; the only way to create glyphs from these - ;; (without a ton of work) is to write them - ;; out to a file, and then create a file - ;; specifier. - (let ((file (make-temp-name - (expand-file-name "emm.xbm" - mm-tmp-directory)))) - (unwind-protect - (progn - (write-region (point-min) (point-max) file) - (make-glyph (list (cons 'x file)))) - (ignore-errors - (delete-file file))))) - (t - (make-glyph - (vector - (or (mm-image-type-from-buffer) - (intern type)) - :data (buffer-string)))))))) - (mm-handle-set-cache handle spec)))))) - -(defun mm-image-fit-p (handle) - "Say whether the image in HANDLE will fit the current window." - (let ((image (mm-get-image handle))) - (if (fboundp 'glyph-width) - ;; XEmacs' glyphs can actually tell us about their width, so - ;; lets be nice and smart about them. - (or mm-inline-large-images - (and (< (glyph-width image) (window-pixel-width)) - (< (glyph-height image) (window-pixel-height)))) - (let* ((size (image-size image)) - (w (car size)) - (h (cdr size))) - (or mm-inline-large-images - (and (< h (1- (window-height))) ; Don't include mode line. - (< w (window-width)))))))) - -(defun mm-valid-image-format-p (format) - "Say whether FORMAT can be displayed natively by Emacs." - (cond - ;; Handle XEmacs - ((fboundp 'valid-image-instantiator-format-p) - (valid-image-instantiator-format-p format)) - ;; Handle Emacs 21 - ((fboundp 'image-type-available-p) - (and (display-graphic-p) - (image-type-available-p format))) - ;; Nobody else can do images yet. - (t - nil))) - -(defun mm-valid-and-fit-image-p (format handle) - "Say whether FORMAT can be displayed natively and HANDLE fits the window." - (and (mm-valid-image-format-p format) - (mm-image-fit-p handle))) - -(defun mm-find-part-by-type (handles type &optional notp recursive) - "Search in HANDLES for part with TYPE. -If NOTP, returns first non-matching part. -If RECURSIVE, search recursively." - (let (handle) - (while handles - (if (and recursive (stringp (caar handles))) - (if (setq handle (mm-find-part-by-type (cdar handles) type - notp recursive)) - (setq handles nil)) - (if (if notp - (not (equal (mm-handle-media-type (car handles)) type)) - (equal (mm-handle-media-type (car handles)) type)) - (setq handle (car handles) - handles nil))) - (setq handles (cdr handles))) - handle)) - -(defun mm-find-raw-part-by-type (ctl type &optional notp) - (goto-char (point-min)) - (let* ((boundary (concat "--" (mm-handle-multipart-ctl-parameter ctl - 'boundary))) - (close-delimiter (concat "^" (regexp-quote boundary) "--[ \t]*$")) - start - (end (save-excursion - (goto-char (point-max)) - (if (re-search-backward close-delimiter nil t) - (match-beginning 0) - (point-max)))) - result) - (setq boundary (concat "^" (regexp-quote boundary) "[ \t]*$")) - (while (and (not result) - (re-search-forward boundary end t)) - (goto-char (match-beginning 0)) - (when start - (save-excursion - (save-restriction - (narrow-to-region start (1- (point))) - (when (let ((ctl (ignore-errors - (mail-header-parse-content-type - (mail-fetch-field "content-type"))))) - (if notp - (not (equal (car ctl) type)) - (equal (car ctl) type))) - (setq result (buffer-substring (point-min) (point-max))))))) - (forward-line 1) - (setq start (point))) - (when (and (not result) start) - (save-excursion - (save-restriction - (narrow-to-region start end) - (when (let ((ctl (ignore-errors - (mail-header-parse-content-type - (mail-fetch-field "content-type"))))) - (if notp - (not (equal (car ctl) type)) - (equal (car ctl) type))) - (setq result (buffer-substring (point-min) (point-max))))))) - result)) - -(defvar mm-security-handle nil) - -(defsubst mm-set-handle-multipart-parameter (handle parameter value) - ;; HANDLE could be a CTL. - (if handle - (put-text-property 0 (length (car handle)) parameter value - (car handle)))) - -(defun mm-possibly-verify-or-decrypt (parts ctl) - (let ((type (car ctl)) - (subtype (cadr (split-string (car ctl) "/"))) - (mm-security-handle ctl) ;; (car CTL) is the type. - protocol func functest) - (cond - ((or (equal type "application/x-pkcs7-mime") - (equal type "application/pkcs7-mime")) - (with-temp-buffer - (when (and (cond - ((eq mm-decrypt-option 'never) nil) - ((eq mm-decrypt-option 'always) t) - ((eq mm-decrypt-option 'known) t) - (t (y-or-n-p - (format "Decrypt (S/MIME) part? ")))) - (mm-view-pkcs7 parts)) - (setq parts (mm-dissect-buffer t))))) - ((equal subtype "signed") - (unless (and (setq protocol - (mm-handle-multipart-ctl-parameter ctl 'protocol)) - (not (equal protocol "multipart/mixed"))) - ;; The message is broken or draft-ietf-openpgp-multsig-01. - (let ((protocols mm-verify-function-alist)) - (while protocols - (if (and (or (not (setq functest (nth 3 (car protocols)))) - (funcall functest parts ctl)) - (mm-find-part-by-type parts (caar protocols) nil t)) - (setq protocol (caar protocols) - protocols nil) - (setq protocols (cdr protocols)))))) - (setq func (nth 1 (assoc protocol mm-verify-function-alist))) - (if (cond - ((eq mm-verify-option 'never) nil) - ((eq mm-verify-option 'always) t) - ((eq mm-verify-option 'known) - (and func - (or (not (setq functest - (nth 3 (assoc protocol - mm-verify-function-alist)))) - (funcall functest parts ctl)))) - (t (y-or-n-p - (format "Verify signed (%s) part? " - (or (nth 2 (assoc protocol mm-verify-function-alist)) - (format "protocol=%s" protocol)))))) - (save-excursion - (if func - (funcall func parts ctl) - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-details - (format "Unknown sign protocol (%s)" protocol)))))) - ((equal subtype "encrypted") - (unless (setq protocol - (mm-handle-multipart-ctl-parameter ctl 'protocol)) - ;; The message is broken. - (let ((parts parts)) - (while parts - (if (assoc (mm-handle-media-type (car parts)) - mm-decrypt-function-alist) - (setq protocol (mm-handle-media-type (car parts)) - parts nil) - (setq parts (cdr parts)))))) - (setq func (nth 1 (assoc protocol mm-decrypt-function-alist))) - (if (cond - ((eq mm-decrypt-option 'never) nil) - ((eq mm-decrypt-option 'always) t) - ((eq mm-decrypt-option 'known) - (and func - (or (not (setq functest - (nth 3 (assoc protocol - mm-decrypt-function-alist)))) - (funcall functest parts ctl)))) - (t (y-or-n-p - (format "Decrypt (%s) part? " - (or (nth 2 (assoc protocol mm-decrypt-function-alist)) - (format "protocol=%s" protocol)))))) - (save-excursion - (if func - (setq parts (funcall func parts ctl)) - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-details - (format "Unknown encrypt protocol (%s)" protocol)))))) - (t nil)) - parts)) - -(defun mm-multiple-handles (handles) - (and (listp (car handles)) - (> (length handles) 1))) - -(defun mm-merge-handles (handles1 handles2) - (append - (if (listp (car handles1)) - handles1 - (list handles1)) - (if (listp (car handles2)) - handles2 - (list handles2)))) - -(defun mm-readable-p (handle) - "Say whether the content of HANDLE is readable." - (and (< (with-current-buffer (mm-handle-buffer handle) - (buffer-size)) 10000) - (mm-with-unibyte-buffer - (mm-insert-part handle) - (and (eq (mm-body-7-or-8) '7bit) - (not (mm-long-lines-p 76)))))) - -(provide 'mm-decode) - -;;; mm-decode.el ends here diff --git a/lisp/mm-encode.el b/lisp/mm-encode.el deleted file mode 100644 index b56c569..0000000 --- a/lisp/mm-encode.el +++ /dev/null @@ -1,176 +0,0 @@ -;;; mm-encode.el --- Functions for encoding MIME things -;; Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; MORIOKA Tomohiko -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) -(require 'mail-parse) -(require 'gnus-mailcap) -(eval-and-compile - (autoload 'mm-body-7-or-8 "mm-bodies")) - -(defvar mm-content-transfer-encoding-defaults - '(("text/x-patch" 8bit) - ("text/.*" qp-or-base64) - ("message/rfc822" 8bit) - ("application/emacs-lisp" 8bit) - ("application/x-patch" 8bit) - (".*" base64)) - "Alist of regexps that match MIME types and their encodings. -If the encoding is `qp-or-base64', then either quoted-printable -or base64 will be used, depending on what is more efficient.") - -(defvar mm-use-ultra-safe-encoding nil - "If non-nil, use encodings aimed at Procrustean bed survival. - -This means that textual parts are encoded as quoted-printable if they -contain lines longer than 76 characters or starting with \"From \" in -the body. Non-7bit encodings (8bit, binary) are generally disallowed. -This is to reduce the probability that a broken MTA or MDA changes the -message. - -This variable should never be set directly, but bound before a call to -`mml-generate-mime' or similar functions.") - -(defun mm-insert-rfc822-headers (charset encoding) - "Insert text/plain headers with CHARSET and ENCODING." - (insert "MIME-Version: 1.0\n") - (insert "Content-Type: text/plain; charset=" - (mail-quote-string (downcase (symbol-name charset))) "\n") - (insert "Content-Transfer-Encoding: " - (downcase (symbol-name encoding)) "\n")) - -(defun mm-insert-multipart-headers () - "Insert multipart/mixed headers." - (let ((boundary "=-=-=")) - (insert "MIME-Version: 1.0\n") - (insert "Content-Type: multipart/mixed; boundary=\"" boundary "\"\n") - boundary)) - -(defun mm-default-file-encoding (file) - "Return a default encoding for FILE." - (if (not (string-match "\\.[^.]+$" file)) - "application/octet-stream" - (mailcap-extension-to-mime (match-string 0 file)))) - -(defun mm-safer-encoding (encoding) - "Return a safer but similar encoding." - (cond - ((memq encoding '(7bit 8bit quoted-printable)) 'quoted-printable) - ;; The remaing encodings are binary and base64 (and perhaps some - ;; non-standard ones), which are both turned into base64. - (t 'base64))) - -(defun mm-encode-content-transfer-encoding (encoding &optional type) - (cond - ((eq encoding 'quoted-printable) - (mm-with-unibyte-current-buffer-mule4 - (quoted-printable-encode-region (point-min) (point-max) t))) - ((eq encoding 'base64) - (when (equal type "text/plain") - (goto-char (point-min)) - (while (search-forward "\n" nil t) - (replace-match "\r\n" t t))) - (condition-case error - (base64-encode-region (point-min) (point-max)) - (error - (message "Error while decoding: %s" error) - nil))) - ((memq encoding '(7bit 8bit binary)) - ;; Do nothing. - ) - ((null encoding) - ;; Do nothing. - ) - ((functionp encoding) - (ignore-errors (funcall encoding (point-min) (point-max)))) - (t - (message "Unknown encoding %s; defaulting to 8bit" encoding)))) - -(defun mm-encode-buffer (type) - "Encode the buffer which contains data of TYPE. -The encoding used is returned." - (let* ((mime-type (if (stringp type) type (car type))) - (encoding - (or (and (listp type) - (cadr (assq 'encoding type))) - (mm-content-transfer-encoding mime-type))) - (bits (mm-body-7-or-8))) - ;; We force buffers that are 7bit to be unencoded, no matter - ;; what the preferred encoding is. - ;; Only if the buffers don't contain lone lines. - (when (and (eq bits '7bit) (not (mm-long-lines-p 76))) - (setq encoding bits)) - (mm-encode-content-transfer-encoding encoding mime-type) - encoding)) - -(defun mm-insert-headers (type encoding &optional file) - "Insert headers for TYPE." - (insert "Content-Type: " type) - (when file - (insert ";\n\tname=\"" (file-name-nondirectory file) "\"")) - (insert "\n") - (insert (format "Content-Transfer-Encoding: %s\n" encoding)) - (insert "Content-Disposition: inline") - (when file - (insert ";\n\tfilename=\"" (file-name-nondirectory file) "\"")) - (insert "\n") - (insert "\n")) - -(defun mm-content-transfer-encoding (type) - "Return a CTE suitable for TYPE to encode the current buffer." - (let ((rules mm-content-transfer-encoding-defaults)) - (catch 'found - (while rules - (when (string-match (caar rules) type) - (throw 'found - (let ((encoding - (if (eq (cadr (car rules)) 'qp-or-base64) - (mm-qp-or-base64) - (cadr (car rules))))) - (if mm-use-ultra-safe-encoding - (mm-safer-encoding encoding) - encoding)))) - (pop rules))))) - -(defun mm-qp-or-base64 () - (save-excursion - (let ((limit (min (point-max) (+ 2000 (point-min)))) - (n8bit 0)) - (goto-char (point-min)) - (skip-chars-forward "\x20-\x7f\r\n\t" limit) - (while (< (point) limit) - (incf n8bit) - (forward-char 1) - (skip-chars-forward "\x20-\x7f\r\n\t" limit)) - (if (or (< (* 6 n8bit) (- limit (point-min))) - ;; Don't base64, say, a short line with a single - ;; non-ASCII char when splitting parts by charset. - (= n8bit 1)) - 'quoted-printable - 'base64)))) - -(provide 'mm-encode) - -;;; mm-encode.el ends here diff --git a/lisp/mm-extern.el b/lisp/mm-extern.el deleted file mode 100644 index 4a18d0e..0000000 --- a/lisp/mm-extern.el +++ /dev/null @@ -1,166 +0,0 @@ -;;; mm-extern.el --- showing message/external-body -;; Copyright (C) 2000, 2001 Free Software Foundation, Inc. - -;; Author: Shenghuo Zhu -;; Keywords: message external-body - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) - -(require 'mm-util) -(require 'mm-decode) - -(defvar mm-extern-function-alist - '((local-file . mm-extern-local-file) - (url . mm-extern-url) - (anon-ftp . mm-extern-anon-ftp) - (ftp . mm-extern-ftp) -;;; (tftp . mm-extern-tftp) - (mail-server . mm-extern-mail-server) -;;; (afs . mm-extern-afs)) - )) - -(defvar mm-extern-anonymous "anonymous") - -(defun mm-extern-local-file (handle) - (erase-buffer) - (let ((name (cdr (assq 'name (cdr (mm-handle-type handle))))) - (coding-system-for-read mm-binary-coding-system)) - (unless name - (error "The filename is not specified")) - (mm-disable-multibyte-mule4) - (if (file-exists-p name) - (mm-insert-file-contents name nil nil nil nil t) - (error (format "File %s is gone" name))))) - -(defun mm-extern-url (handle) - (erase-buffer) - (require 'url) - (let ((url (cdr (assq 'url (cdr (mm-handle-type handle))))) - (name buffer-file-name) - (coding-system-for-read mm-binary-coding-system)) - (unless url - (error "URL is not specified")) - (mm-with-unibyte-current-buffer-mule4 - (url-insert-file-contents url)) - (mm-disable-multibyte-mule4) - (setq buffer-file-name name))) - -(defun mm-extern-anon-ftp (handle) - (erase-buffer) - (let* ((params (cdr (mm-handle-type handle))) - (name (cdr (assq 'name params))) - (site (cdr (assq 'site params))) - (directory (cdr (assq 'directory params))) - (mode (cdr (assq 'mode params))) - (path (concat "/" (or mm-extern-anonymous - (read-string (format "ID for %s: " site))) - "@" site ":" directory "/" name)) - (coding-system-for-read mm-binary-coding-system)) - (unless name - (error "The filename is not specified")) - (mm-disable-multibyte-mule4) - (mm-insert-file-contents path nil nil nil nil t))) - -(defun mm-extern-ftp (handle) - (let (mm-extern-anonymous) - (mm-extern-anon-ftp handle))) - -(defun mm-extern-mail-server (handle) - (require 'message) - (let* ((params (cdr (mm-handle-type handle))) - (server (cdr (assq 'server params))) - (subject (or (cdr (assq 'subject params)) "none")) - (buf (current-buffer)) - info) - (if (y-or-n-p (format "Send a request message to %s?" server)) - (save-window-excursion - (message-mail server subject) - (message-goto-body) - (delete-region (point) (point-max)) - (insert-buffer buf) - (message "Requesting external body...") - (message-send-and-exit) - (setq info "Request is sent.") - (message info)) - (setq info "Request is not sent.")) - (goto-char (point-min)) - (insert "[" info "]\n\n"))) - -;;;###autoload -(defun mm-inline-external-body (handle &optional no-display) - "Show the external-body part of HANDLE. -This function replaces the buffer of HANDLE with a buffer contains -the entire message. -If NO-DISPLAY is nil, display it. Otherwise, do nothing after replacing." - (let* ((access-type (cdr (assq 'access-type - (cdr (mm-handle-type handle))))) - (func (cdr (assq (intern - (downcase - (or access-type - (error "Couldn't find access type")))) - mm-extern-function-alist))) - gnus-displaying-mime buf - handles) - (unless (mm-handle-cache handle) - (unless func - (error (format "Access type (%s) is not supported" access-type))) - (with-temp-buffer - (mm-insert-part handle) - (goto-char (point-max)) - (insert "\n\n") - (setq handles (mm-dissect-buffer t))) - (unless (bufferp (car handles)) - (mm-destroy-parts handles) - (error "Multipart external body is not supported")) - (save-excursion ;; single part - (set-buffer (setq buf (mm-handle-buffer handles))) - (let (good) - (unwind-protect - (progn - (funcall func handle) - (setq good t)) - (unless good - (mm-destroy-parts handles)))) - (mm-handle-set-cache handle handles)) - (setq gnus-article-mime-handles - (mm-merge-handles gnus-article-mime-handles handles))) - (unless no-display - (save-excursion - (save-restriction - (narrow-to-region (point) (point)) - (gnus-display-mime (mm-handle-cache handle)) - (mm-handle-set-undisplayer - handle - `(lambda () - (let (buffer-read-only) - (condition-case nil - ;; This is only valid on XEmacs. - (mapcar (lambda (prop) - (remove-specifier - (face-property 'default prop) (current-buffer))) - '(background background-pixmap foreground)) - (error nil)) - (delete-region ,(point-min-marker) ,(point-max-marker)))))))))) - -;;; mm-extern.el ends here diff --git a/lisp/mm-partial.el b/lisp/mm-partial.el deleted file mode 100644 index d3346ba..0000000 --- a/lisp/mm-partial.el +++ /dev/null @@ -1,151 +0,0 @@ -;;; mm-partial.el --- showing message/partial -;; Copyright (C) 2000, 2001 Free Software Foundation, Inc. - -;; Author: Shenghuo Zhu -;; Keywords: message partial - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) - -(require 'gnus-sum) -(require 'mm-util) -(require 'mm-decode) - -(defun mm-partial-find-parts (id &optional art) - (let ((headers (save-excursion - (set-buffer gnus-summary-buffer) - gnus-newsgroup-headers)) - phandles header) - (while (setq header (pop headers)) - (unless (eq (aref header 0) art) - (mm-with-unibyte-buffer - (gnus-request-article-this-buffer (aref header 0) - gnus-newsgroup-name) - (when (search-forward id nil t) - (let ((nhandles (mm-dissect-buffer)) nid) - (if (consp (car nhandles)) - (mm-destroy-parts nhandles) - (setq nid (cdr (assq 'id - (cdr (mm-handle-type nhandles))))) - (if (not (equal id nid)) - (mm-destroy-parts nhandles) - (push nhandles phandles)))))))) - phandles)) - -;;;###autoload -(defun mm-inline-partial (handle &optional no-display) - "Show the partial part of HANDLE. -This function replaces the buffer of HANDLE with a buffer contains -the entire message. -If NO-DISPLAY is nil, display it. Otherwise, do nothing after replacing." - (let ((id (cdr (assq 'id (cdr (mm-handle-type handle))))) - phandles - (b (point)) (n 1) total - phandle nn ntotal - gnus-displaying-mime handles buffer) - (unless (mm-handle-cache handle) - (unless id - (error "Can not find message/partial id")) - (setq phandles - (sort (cons handle - (mm-partial-find-parts - id - (save-excursion - (set-buffer gnus-summary-buffer) - (gnus-summary-article-number)))) - #'(lambda (a b) - (let ((anumber (string-to-number - (cdr (assq 'number - (cdr (mm-handle-type a)))))) - (bnumber (string-to-number - (cdr (assq 'number - (cdr (mm-handle-type b))))))) - (< anumber bnumber))))) - (setq gnus-article-mime-handles - (mm-merge-handles gnus-article-mime-handles phandles)) - (save-excursion - (set-buffer (generate-new-buffer " *mm*")) - (while (setq phandle (pop phandles)) - (setq nn (string-to-number - (cdr (assq 'number - (cdr (mm-handle-type phandle)))))) - (setq ntotal (string-to-number - (cdr (assq 'total - (cdr (mm-handle-type phandle)))))) - (if ntotal - (if total - (unless (eq total ntotal) - (error "The numbers of total are different")) - (setq total ntotal))) - (unless (< nn n) - (unless (eq nn n) - (error "Missing part %d" n)) - (mm-insert-part phandle) - (goto-char (point-max)) - (when (not (eq 0 (skip-chars-backward "\r\n"))) - ;; remove tail blank spaces except one - (if (looking-at "\r?\n") - (goto-char (match-end 0))) - (delete-region (point) (point-max))) - (setq n (+ n 1)))) - (unless total - (error "Don't known the total number of")) - (if (<= n total) - (error "Missing part %d" n)) - (kill-buffer (mm-handle-buffer handle)) - (goto-char (point-min)) - (let ((point (if (search-forward "\n\n" nil t) - (1- (point)) - (point-max)))) - (goto-char (point-min)) - (unless (re-search-forward "^mime-version:" point t) - (insert "MIME-Version: 1.0\n"))) - (setcar handle (current-buffer)) - (mm-handle-set-cache handle t))) - (unless no-display - (save-excursion - (save-restriction - (narrow-to-region b b) - (mm-insert-part handle) - (let (gnus-article-mime-handles) - (run-hooks 'gnus-article-decode-hook) - (gnus-article-prepare-display) - (setq handles gnus-article-mime-handles)) - (when handles - ;; It is in article buffer. - (setq gnus-article-mime-handles - (mm-merge-handles gnus-article-mime-handles handles))) - (mm-handle-set-undisplayer - handle - `(lambda () - (let (buffer-read-only) - (condition-case nil - ;; This is only valid on XEmacs. - (mapcar (lambda (prop) - (remove-specifier - (face-property 'default prop) (current-buffer))) - '(background background-pixmap foreground)) - (error nil)) - (delete-region ,(point-min-marker) ,(point-max-marker)))))))))) - -;;; mm-partial.el ends here diff --git a/lisp/mm-util.el b/lisp/mm-util.el deleted file mode 100644 index 50899a3..0000000 --- a/lisp/mm-util.el +++ /dev/null @@ -1,573 +0,0 @@ -;;; mm-util.el --- Utility functions for Mule and low level things -;; Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; MORIOKA Tomohiko -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) -(eval-when-compile (require 'gnus-clfns)) -(eval-when-compile (require 'static)) - -(require 'mail-prsvr) - -(defvar mm-mime-mule-charset-alist - `((us-ascii ascii) - (iso-8859-1 latin-iso8859-1) - (iso-8859-2 latin-iso8859-2) - (iso-8859-3 latin-iso8859-3) - (iso-8859-4 latin-iso8859-4) - (iso-8859-5 cyrillic-iso8859-5) - ;; Non-mule (X)Emacs uses the last mule-charset for 8bit characters. - ;; The fake mule-charset, gnus-koi8-r, tells Gnus that the default - ;; charset is koi8-r, not iso-8859-5. - (koi8-r cyrillic-iso8859-5 gnus-koi8-r) - (iso-8859-6 arabic-iso8859-6) - (iso-8859-7 greek-iso8859-7) - (iso-8859-8 hebrew-iso8859-8) - (iso-8859-9 latin-iso8859-9) - (iso-8859-14 latin-iso8859-14) - (iso-8859-15 latin-iso8859-15) - (viscii vietnamese-viscii-lower) - (iso-2022-jp latin-jisx0201 japanese-jisx0208 japanese-jisx0208-1978) - (euc-kr korean-ksc5601) - (gb2312 chinese-gb2312) - (big5 chinese-big5-1 chinese-big5-2) - (tibetan tibetan) - (thai-tis620 thai-tis620) - (iso-2022-7bit ethiopic arabic-1-column arabic-2-column) - (iso-2022-jp-2 latin-iso8859-1 greek-iso8859-7 - latin-jisx0201 japanese-jisx0208-1978 - chinese-gb2312 japanese-jisx0208 - korean-ksc5601 japanese-jisx0212 - katakana-jisx0201) - (iso-2022-int-1 latin-iso8859-1 greek-iso8859-7 - latin-jisx0201 japanese-jisx0208-1978 - chinese-gb2312 japanese-jisx0208 - korean-ksc5601 japanese-jisx0212 - chinese-cns11643-1 chinese-cns11643-2) - (iso-2022-int-1 latin-iso8859-1 latin-iso8859-2 - cyrillic-iso8859-5 greek-iso8859-7 - latin-jisx0201 japanese-jisx0208-1978 - chinese-gb2312 japanese-jisx0208 - korean-ksc5601 japanese-jisx0212 - chinese-cns11643-1 chinese-cns11643-2 - chinese-cns11643-3 chinese-cns11643-4 - chinese-cns11643-5 chinese-cns11643-6 - chinese-cns11643-7) - ,(if (or (not (fboundp 'charsetp)) ;; non-Mule case - (not (fboundp 'coding-system-p)) - (charsetp 'unicode-a) - (not (coding-system-p 'mule-utf-8))) - '(utf-8 unicode-a unicode-b unicode-c unicode-d unicode-e) - ;; If we have utf-8 we're in Mule 5+. - (delete 'ascii (coding-system-get 'mule-utf-8 'safe-charsets)))) - "Alist of MIME-charset/MULE-charsets.") - -(eval-and-compile - (mapcar - (lambda (elem) - (let ((nfunc (intern (format "mm-%s" (car elem))))) - (if (fboundp (car elem)) - (defalias nfunc (car elem)) - (defalias nfunc (cdr elem))))) - '((decode-coding-string . (lambda (s a) s)) - (encode-coding-string . (lambda (s a) s)) - (encode-coding-region . ignore) - (coding-system-list . ignore) - (decode-coding-region . ignore) - (char-int . identity) - (device-type . ignore) - (coding-system-equal . equal) - (annotationp . ignore) - (set-buffer-file-coding-system . ignore) - (make-char - . (lambda (charset int) - (int-to-char int))) - (read-charset - . (lambda (prompt) - "Return a charset." - (intern - (completing-read - prompt - (mapcar (lambda (e) (list (symbol-name (car e)))) - mm-mime-mule-charset-alist) - nil t)))) - (subst-char-in-string - . (lambda (from to string) ;; stolen (and renamed) from nnheader.el - "Replace characters in STRING from FROM to TO." - (let ((string (substring string 0)) ;Copy string. - (len (length string)) - (idx 0)) - ;; Replace all occurrences of FROM with TO. - (while (< idx len) - (when (= (aref string idx) from) - (aset string idx to)) - (setq idx (1+ idx))) - string))) - (string-as-unibyte . identity) - (string-as-multibyte . identity) - (multibyte-string-p . ignore)))) - -(eval-and-compile - (defalias 'mm-char-or-char-int-p - (cond - ((fboundp 'char-or-char-int-p) 'char-or-char-int-p) - ((fboundp 'char-valid-p) 'char-valid-p) - (t 'identity)))) - -(eval-and-compile - (defalias 'mm-read-coding-system - (cond - ((fboundp 'read-coding-system) - (if (and (featurep 'xemacs) - (<= (string-to-number emacs-version) 21.1)) - (lambda (prompt &optional default-coding-system) - (read-coding-system prompt)) - 'read-coding-system)) - (t (lambda (prompt &optional default-coding-system) - "Prompt the user for a coding system." - (completing-read - prompt (mapcar (lambda (s) (list (symbol-name (car s)))) - mm-mime-mule-charset-alist))))))) - -(defvar mm-coding-system-list nil) -(defun mm-get-coding-system-list () - "Get the coding system list." - (or mm-coding-system-list - (setq mm-coding-system-list (mm-coding-system-list)))) - -(defun mm-coding-system-p (sym) - "Return non-nil if SYM is a coding system." - (or (and (fboundp 'coding-system-p) (coding-system-p sym)) - (memq sym (mm-get-coding-system-list)))) - -(defvar mm-charset-synonym-alist - `((big5 . cn-big5) - (gb2312 . cn-gb-2312) - (cn-gb . cn-gb-2312) - ;; Windows-1252 is actually a superset of Latin-1. See also - ;; `gnus-article-dumbquotes-map'. - ,(unless (mm-coding-system-p 'windows-1252) ; should be defined eventually - '(windows-1252 . iso-8859-1)) - (x-ctext . ctext)) - "A mapping from invalid charset names to the real charset names.") - -(defvar mm-binary-coding-system - (cond - ((mm-coding-system-p 'binary) 'binary) - ((mm-coding-system-p 'no-conversion) 'no-conversion) - (t nil)) - "100% binary coding system.") - -(defvar mm-text-coding-system - (or (if (memq system-type '(windows-nt ms-dos ms-windows)) - (and (mm-coding-system-p 'raw-text-dos) 'raw-text-dos) - (and (mm-coding-system-p 'raw-text) 'raw-text)) - mm-binary-coding-system) - "Text-safe coding system (For removing ^M).") - -(defvar mm-text-coding-system-for-write nil - "Text coding system for write.") - -(defvar mm-auto-save-coding-system - (cond - ((mm-coding-system-p 'emacs-mule) - (if (memq system-type '(windows-nt ms-dos ms-windows)) - (if (mm-coding-system-p 'emacs-mule-dos) - 'emacs-mule-dos mm-binary-coding-system) - 'emacs-mule)) - ((mm-coding-system-p 'escape-quoted) 'escape-quoted) - (t mm-binary-coding-system)) - "Coding system of auto save file.") - -(defvar mm-universal-coding-system mm-auto-save-coding-system - "The universal Coding system.") - -;;; Internal variables: - -;;; Functions: - -(defun mm-mule-charset-to-mime-charset (charset) - "Return the MIME charset corresponding to the given Mule CHARSET." - (let ((alist mm-mime-mule-charset-alist) - out) - (while alist - (when (memq charset (cdar alist)) - (setq out (caar alist) - alist nil)) - (pop alist)) - out)) - -(defun mm-charset-to-coding-system (charset &optional lbt) - "Return coding-system corresponding to CHARSET. -CHARSET is a symbol naming a MIME charset. -If optional argument LBT (`unix', `dos' or `mac') is specified, it is -used as the line break code type of the coding system." - (when (stringp charset) - (setq charset (intern (downcase charset)))) - (setq charset - (or (cdr (assq charset mm-charset-synonym-alist)) - charset)) - (when lbt - (setq charset (intern (format "%s-%s" charset lbt)))) - (cond - ;; Running in a non-MULE environment. - ((null (mm-get-coding-system-list)) - charset) - ;; ascii - ((eq charset 'us-ascii) - 'ascii) - ;; Check to see whether we can handle this charset. (This depends - ;; on there being some coding system matching each `mime-charset' - ;; coding sysytem property defined, as there should be.) - ((memq charset (mm-get-coding-system-list)) - charset) - ;; Nope. - (t - nil))) - -(defsubst mm-replace-chars-in-string (string from to) - (mm-subst-char-in-string from to string)) - -(defsubst mm-enable-multibyte () - "Set the multibyte flag of the current buffer. -Only do this if the default value of `enable-multibyte-characters' is -non-nil. This is a no-op in XEmacs." - (when (and (not (featurep 'xemacs)) - (boundp 'default-enable-multibyte-characters) - default-enable-multibyte-characters - (fboundp 'set-buffer-multibyte)) - (set-buffer-multibyte t))) - -(defsubst mm-disable-multibyte () - "Unset the multibyte flag of in the current buffer. -This is a no-op in XEmacs." - (when (and (not (featurep 'xemacs)) - (fboundp 'set-buffer-multibyte)) - (set-buffer-multibyte nil))) - -(defsubst mm-enable-multibyte-mule4 () - "Enable multibyte in the current buffer. -Only used in Emacs Mule 4." - (when (and (not (featurep 'xemacs)) - (boundp 'default-enable-multibyte-characters) - default-enable-multibyte-characters - (fboundp 'set-buffer-multibyte) - (fboundp 'charsetp) - (not (charsetp 'eight-bit-control))) - (set-buffer-multibyte t))) - -(defsubst mm-disable-multibyte-mule4 () - "Disable multibyte in the current buffer. -Only used in Emacs Mule 4." - (when (and (not (featurep 'xemacs)) - (fboundp 'set-buffer-multibyte) - (fboundp 'charsetp) - (not (charsetp 'eight-bit-control))) - (set-buffer-multibyte nil))) - -(defun mm-preferred-coding-system (charset) - ;; A typo in some Emacs versions. - (or (get-charset-property charset 'prefered-coding-system) - (get-charset-property charset 'preferred-coding-system))) - -(defun mm-charset-after (&optional pos) - "Return charset of a character in current buffer at position POS. -If POS is nil, it defauls to the current point. -If POS is out of range, the value is nil. -If the charset is `composition', return the actual one." - (let ((char (char-after pos)) charset) - (if (< (mm-char-int char) 128) - (setq charset 'ascii) - ;; charset-after is fake in some Emacsen. - (setq charset (and (fboundp 'char-charset) (char-charset char))) - (if (eq charset 'composition) - (let ((p (or pos (point)))) - (cadr (find-charset-region p (1+ p)))) - (if (and charset (not (memq charset '(ascii eight-bit-control - eight-bit-graphic)))) - charset - (or - mail-parse-mule-charset ;; cached mule-charset - (progn - (setq mail-parse-mule-charset - (and (boundp 'current-language-environment) - (car (last - (assq 'charset - (assoc current-language-environment - language-info-alist)))))) - (if (or (not mail-parse-mule-charset) - (eq mail-parse-mule-charset 'ascii)) - (setq mail-parse-mule-charset - (or (car (last (assq mail-parse-charset - mm-mime-mule-charset-alist))) - ;; Fixme: don't fix that! - 'latin-iso8859-1))) - mail-parse-mule-charset))))))) - -(defun mm-mime-charset (charset) - "Return the MIME charset corresponding to the MULE CHARSET." - (if (eq charset 'unknown) - (error "The message contains non-printable characters, please use attachment")) - (if (and (fboundp 'coding-system-get) (fboundp 'get-charset-property)) - ;; This exists in Emacs 20. - (or - (and (mm-preferred-coding-system charset) - (coding-system-get - (mm-preferred-coding-system charset) 'mime-charset)) - (and (eq charset 'ascii) - 'us-ascii) - (mm-preferred-coding-system charset) - (mm-mule-charset-to-mime-charset charset)) - ;; This is for XEmacs. - (mm-mule-charset-to-mime-charset charset))) - -(defun mm-delete-duplicates (list) - "Simple substitute for CL `delete-duplicates', testing with `equal'." - (let (result head) - (while list - (setq head (car list)) - (setq list (delete head list)) - (setq result (cons head result))) - (nreverse result))) - -(defun mm-find-mime-charset-region (b e) - "Return the MIME charsets needed to encode the region between B and E." - (let ((charsets (mapcar 'mm-mime-charset - (delq 'ascii - (mm-find-charset-region b e))))) - (when (memq 'iso-2022-jp-2 charsets) - (setq charsets (delq 'iso-2022-jp charsets))) - (setq charsets (mm-delete-duplicates charsets)) - (if (and (> (length charsets) 1) - (fboundp 'find-coding-systems-region) - (let ((cs (find-coding-systems-region b e))) - (or (memq 'utf-8 cs) (memq 'mule-utf-8 cs)))) - '(utf-8) - charsets))) - -(defsubst mm-multibyte-p () - "Say whether multibyte is enabled." - (if (and (not (featurep 'xemacs)) - (boundp 'enable-multibyte-characters)) - enable-multibyte-characters - (featurep 'mule))) - -(defmacro mm-with-unibyte-buffer (&rest forms) - "Create a temporary buffer, and evaluate FORMS there like `progn'. -Use unibyte mode for this." - `(let (default-enable-multibyte-characters) - (with-temp-buffer ,@forms))) -(put 'mm-with-unibyte-buffer 'lisp-indent-function 0) -(put 'mm-with-unibyte-buffer 'edebug-form-spec '(body)) - -(defmacro mm-with-unibyte-current-buffer (&rest forms) - "Evaluate FORMS with current current buffer temporarily made unibyte. -Also bind `default-enable-multibyte-characters' to nil. -Equivalent to `progn' in XEmacs" - (let ((buffer (make-symbol "buffer"))) - `(if (and (not (featurep 'xemacs)) - (boundp 'enable-multibyte-characters) - enable-multibyte-characters - (fboundp 'set-buffer-multibyte)) - (let ((,buffer (current-buffer))) - (unwind-protect - (let (default-enable-multibyte-characters) - (set-buffer-multibyte nil) - ,@forms) - (set-buffer ,buffer) - (set-buffer-multibyte t))) - (let (default-enable-multibyte-characters) - ,@forms)))) -(put 'mm-with-unibyte-current-buffer 'lisp-indent-function 0) -(put 'mm-with-unibyte-current-buffer 'edebug-form-spec '(body)) - -(defmacro mm-with-unibyte-current-buffer-mule4 (&rest forms) - "Evaluate FORMS there like `progn' in current buffer. -Mule4 only." - (let ((buffer (make-symbol "buffer"))) - `(if (and (not (featurep 'xemacs)) - (boundp 'enable-multibyte-characters) - enable-multibyte-characters - (fboundp 'set-buffer-multibyte) - (fboundp 'charsetp) - (not (charsetp 'eight-bit-control))) ;; For Emacs Mule 4 only. - (let ((,buffer (current-buffer))) - (unwind-protect - (let (default-enable-multibyte-characters) - (set-buffer-multibyte nil) - ,@forms) - (set-buffer ,buffer) - (set-buffer-multibyte t))) - (let (default-enable-multibyte-characters) - ,@forms)))) -(put 'mm-with-unibyte-current-buffer-mule4 'lisp-indent-function 0) -(put 'mm-with-unibyte-current-buffer-mule4 'edebug-form-spec '(body)) - -(defmacro mm-with-unibyte (&rest forms) - "Eval the FORMS with the default value of `enable-multibyte-characters' nil, ." - `(let (default-enable-multibyte-characters) - ,@forms)) -(put 'mm-with-unibyte 'lisp-indent-function 0) -(put 'mm-with-unibyte 'edebug-form-spec '(body)) - -(defun mm-find-charset-region (b e) - "Return a list of Emacs charsets in the region B to E." - (cond - ((and (mm-multibyte-p) - (fboundp 'find-charset-region)) - ;; Remove composition since the base charsets have been included. - ;; Remove eight-bit-*, treat them as ascii. - (let ((css (find-charset-region b e))) - (mapcar (lambda (cs) (setq css (delq cs css))) - '(composition eight-bit-control eight-bit-graphic - control-1)) - css)) - (t - ;; We are in a unibyte buffer or XEmacs non-mule, so we futz around a bit. - (save-excursion - (save-restriction - (narrow-to-region b e) - (goto-char (point-min)) - (skip-chars-forward "\0-\177") - (if (eobp) - '(ascii) - (let (charset) - (setq charset - (and (boundp 'current-language-environment) - (car (last (assq 'charset - (assoc current-language-environment - language-info-alist)))))) - (if (eq charset 'ascii) (setq charset nil)) - (or charset - (setq charset - (car (last (assq mail-parse-charset - mm-mime-mule-charset-alist))))) - (list 'ascii (or charset 'latin-iso8859-1))))))))) - -(static-if (fboundp 'shell-quote-argument) - (defalias 'mm-quote-arg 'shell-quote-argument) - (defun mm-quote-arg (arg) - "Return a version of ARG that is safe to evaluate in a shell." - (let ((pos 0) new-pos accum) - ;; *** bug: we don't handle newline characters properly - (while (setq new-pos (string-match "[]*[;!'`\"$\\& \t{} |()<>]" arg pos)) - (push (substring arg pos new-pos) accum) - (push "\\" accum) - (push (list (aref arg new-pos)) accum) - (setq pos (1+ new-pos))) - (if (= pos 0) - arg - (apply 'concat (nconc (nreverse accum) (list (substring arg pos)))))))) - -(defun mm-auto-mode-alist () - "Return an `auto-mode-alist' with only the .gz (etc) thingies." - (let ((alist auto-mode-alist) - out) - (while alist - (when (listp (cdar alist)) - (push (car alist) out)) - (pop alist)) - (nreverse out))) - -(defvar mm-inhibit-file-name-handlers - '(jka-compr-handler image-file-handler) - "A list of handlers doing (un)compression (etc) thingies.") - -(defun mm-insert-file-contents (filename &optional visit beg end replace - inhibit) - "Like `insert-file-contents', q.v., but only reads in the file. -A buffer may be modified in several ways after reading into the buffer due -to advanced Emacs features, such as file-name-handlers, format decoding, -find-file-hooks, etc. -If INHIBIT is non-nil, inhibit mm-inhibit-file-name-handlers. - This function ensures that none of these modifications will take place." - (let ((format-alist nil) - (auto-mode-alist (if inhibit nil (mm-auto-mode-alist))) - (default-major-mode 'fundamental-mode) - (enable-local-variables nil) - (after-insert-file-functions nil) - (enable-local-eval nil) - (find-file-hooks nil) - (inhibit-file-name-operation (if inhibit - 'insert-file-contents - inhibit-file-name-operation)) - (inhibit-file-name-handlers - (if inhibit - (append mm-inhibit-file-name-handlers - inhibit-file-name-handlers) - inhibit-file-name-handlers))) - (insert-file-contents filename visit beg end replace))) - -(defun mm-append-to-file (start end filename &optional codesys inhibit) - "Append the contents of the region to the end of file FILENAME. -When called from a function, expects three arguments, -START, END and FILENAME. START and END are buffer positions -saying what text to write. -Optional fourth argument specifies the coding system to use when -encoding the file. -If INHIBIT is non-nil, inhibit mm-inhibit-file-name-handlers." - (let ((coding-system-for-write - (or codesys mm-text-coding-system-for-write - mm-text-coding-system)) - (inhibit-file-name-operation (if inhibit - 'append-to-file - inhibit-file-name-operation)) - (inhibit-file-name-handlers - (if inhibit - (append mm-inhibit-file-name-handlers - inhibit-file-name-handlers) - inhibit-file-name-handlers))) - (append-to-file start end filename))) - -(defun mm-write-region (start end filename &optional append visit lockname - coding-system inhibit) - - "Like `write-region'. -If INHIBIT is non-nil, inhibit mm-inhibit-file-name-handlers." - (let ((coding-system-for-write - (or coding-system mm-text-coding-system-for-write - mm-text-coding-system)) - (inhibit-file-name-operation (if inhibit - 'write-region - inhibit-file-name-operation)) - (inhibit-file-name-handlers - (if inhibit - (append mm-inhibit-file-name-handlers - inhibit-file-name-handlers) - inhibit-file-name-handlers))) - (write-region start end filename append visit lockname))) - -(defun mm-image-load-path (&optional package) - (let (dir result) - (dolist (path load-path (nreverse result)) - (if (file-directory-p - (setq dir (concat (file-name-directory - (directory-file-name path)) - "etc/" (or package "gnus/")))) - (push dir result)) - (push path result)))) - -(provide 'mm-util) - -;;; mm-util.el ends here diff --git a/lisp/mm-uu.el b/lisp/mm-uu.el deleted file mode 100644 index 7c90203..0000000 --- a/lisp/mm-uu.el +++ /dev/null @@ -1,440 +0,0 @@ -;;; mm-uu.el --- Return uu stuff as mm handles -;; Copyright (c) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. - -;; Author: Shenghuo Zhu -;; Keywords: postscript uudecode binhex shar forward gnatsweb pgp - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. -;; -;; GNU Emacs 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. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) -(require 'mail-parse) -(require 'nnheader) -(require 'mm-decode) -(require 'gnus-mailcap) -(require 'mml2015) -(require 'uudecode) -(require 'binhex) - -;; This is not the right place for this. uudecode.el should decide -;; whether or not to use a program with a single interface, but I -;; guess it's too late now. Also the default should depend on a test -;; for the program. -- fx -(defcustom mm-uu-decode-function 'uudecode-decode-region - "*Function to uudecode. -Internal function is done in Lisp by default, therefore decoding may -appear to be horribly slow. You can make Gnus use an external -decoder, such as uudecode." - :type '(choice - (function-item :tag "Internal" uudecode-decode-region) - (function-item :tag "External" uudecode-decode-region-external)) - :group 'gnus-article-mime) - -(defcustom mm-uu-binhex-decode-function 'binhex-decode-region - "*Function to binhex decode. -Internal function is done in elisp by default, therefore decoding may -appear to be horribly slow . You can make Gnus use the external Unix -decoder, such as hexbin." - :type '(choice (item :tag "internal" binhex-decode-region) - (item :tag "external" binhex-decode-region-external)) - :group 'gnus-article-mime) - -(defvar mm-uu-pgp-beginning-signature - "^-----BEGIN PGP SIGNATURE-----") - -(defvar mm-uu-beginning-regexp nil) - -(defvar mm-dissect-disposition "inline" - "The default disposition of uu parts. -This can be either \"inline\" or \"attachment\".") - -(defvar mm-uu-emacs-sources-regexp "gnu\\.emacs\\.sources" - "The regexp of emacs sources groups.") - -(defvar mm-uu-type-alist - '((postscript - "^%!PS-" - "^%%EOF$" - mm-uu-postscript-extract - nil) - (uu - "^begin[ \t]+[0-7][0-7][0-7][ \t]+" - "^end[ \t]*$" - mm-uu-uu-extract - mm-uu-uu-filename) - (binhex - "^:...............................................................$" - ":$" - mm-uu-binhex-extract - nil - mm-uu-binhex-filename) - (shar - "^#! */bin/sh" - "^exit 0$" - mm-uu-shar-extract) - (forward -;;; Thanks to Edward J. Sabol and -;;; Peter von der Ah\'e - "^-+ \\(Start of \\)?Forwarded message" - "^-+ End \\(of \\)?forwarded message" - mm-uu-forward-extract - nil - mm-uu-forward-test) - (gnatsweb - "^----gnatsweb-attachment----" - nil - mm-uu-gnatsweb-extract) - (pgp-signed - "^-----BEGIN PGP SIGNED MESSAGE-----" - "^-----END PGP SIGNATURE-----" - mm-uu-pgp-signed-extract - nil - nil) - (pgp-encrypted - "^-----BEGIN PGP MESSAGE-----" - "^-----END PGP MESSAGE-----" - mm-uu-pgp-encrypted-extract - nil - nil) - (pgp-key - "^-----BEGIN PGP PUBLIC KEY BLOCK-----" - "^-----END PGP PUBLIC KEY BLOCK-----" - mm-uu-pgp-key-extract - mm-uu-gpg-key-skip-to-last - nil) - (emacs-sources - "^;;;?[ \t]*[^ \t]+\\.el[ \t]*--" - "^;;;?[ \t]*\\([^ \t]+\\.el\\)[ \t]+ends here" - mm-uu-emacs-sources-extract - nil - mm-uu-emacs-sources-test))) - -(defcustom mm-uu-configure-list nil - "A list of mm-uu configuration. -To disable dissecting shar codes, for instance, add -`(shar . disabled)' to this list." - :type 'alist - :options (mapcar (lambda (entry) - (list (car entry) '(const disabled))) - mm-uu-type-alist) - :group 'gnus-article-mime) - -;; functions - -(defsubst mm-uu-type (entry) - (car entry)) - -(defsubst mm-uu-beginning-regexp (entry) - (nth 1 entry)) - -(defsubst mm-uu-end-regexp (entry) - (nth 2 entry)) - -(defsubst mm-uu-function-extract (entry) - (nth 3 entry)) - -(defsubst mm-uu-function-1 (entry) - (nth 4 entry)) - -(defsubst mm-uu-function-2 (entry) - (nth 5 entry)) - -(defun mm-uu-copy-to-buffer (&optional from to) - "Copy the contents of the current buffer to a fresh buffer. -Return that buffer." - (save-excursion - (let ((obuf (current-buffer))) - (set-buffer (generate-new-buffer " *mm-uu*")) - (insert-buffer-substring obuf from to) - (current-buffer)))) - -(defun mm-uu-configure-p (key val) - (member (cons key val) mm-uu-configure-list)) - -(defun mm-uu-configure (&optional symbol value) - (if symbol (set-default symbol value)) - (setq mm-uu-beginning-regexp nil) - (mapcar (lambda (entry) - (if (mm-uu-configure-p (mm-uu-type entry) 'disabled) - nil - (setq mm-uu-beginning-regexp - (concat mm-uu-beginning-regexp - (if mm-uu-beginning-regexp "\\|") - (mm-uu-beginning-regexp entry))))) - mm-uu-type-alist)) - -(mm-uu-configure) - -(eval-when-compile - (defvar file-name) - (defvar start-point) - (defvar end-point) - (defvar entry)) - -(defun mm-uu-uu-filename () - (if (looking-at ".+") - (setq file-name - (let ((nnheader-file-name-translation-alist - '((?/ . ?,) (? . ?_) (?* . ?_) (?$ . ?_)))) - (nnheader-translate-file-chars (match-string 0)))))) - -(defun mm-uu-binhex-filename () - (setq file-name - (ignore-errors - (binhex-decode-region start-point end-point t)))) - -(defun mm-uu-forward-test () - (save-excursion - (goto-char start-point) - (forward-line) - (looking-at "[\r\n]*[a-zA-Z][a-zA-Z0-9-]*:"))) - -(defun mm-uu-postscript-extract () - (mm-make-handle (mm-uu-copy-to-buffer start-point end-point) - '("application/postscript"))) - -(defun mm-uu-emacs-sources-extract () - (mm-make-handle (mm-uu-copy-to-buffer start-point end-point) - '("application/emacs-lisp") - nil nil - (list mm-dissect-disposition - (cons 'filename file-name)))) - -(eval-when-compile - (defvar gnus-newsgroup-name)) - -(defun mm-uu-emacs-sources-test () - (setq file-name (match-string 1)) - (and gnus-newsgroup-name - mm-uu-emacs-sources-regexp - (string-match mm-uu-emacs-sources-regexp gnus-newsgroup-name))) - -(defun mm-uu-forward-extract () - (mm-make-handle (mm-uu-copy-to-buffer - (progn (goto-char start-point) (forward-line) (point)) - (progn (goto-char end-point) (forward-line -1) (point))) - '("message/rfc822" (charset . gnus-decoded)))) - -(defun mm-uu-uu-extract () - (mm-make-handle (mm-uu-copy-to-buffer start-point end-point) - (list (or (and file-name - (string-match "\\.[^\\.]+$" - file-name) - (mailcap-extension-to-mime - (match-string 0 file-name))) - "application/octet-stream")) - 'x-uuencode nil - (if (and file-name (not (equal file-name ""))) - (list mm-dissect-disposition - (cons 'filename file-name))))) - -(defun mm-uu-binhex-extract () - (mm-make-handle (mm-uu-copy-to-buffer start-point end-point) - (list (or (and file-name - (string-match "\\.[^\\.]+$" file-name) - (mailcap-extension-to-mime - (match-string 0 file-name))) - "application/octet-stream")) - 'x-binhex nil - (if (and file-name (not (equal file-name ""))) - (list mm-dissect-disposition - (cons 'filename file-name))))) - -(defun mm-uu-shar-extract () - (mm-make-handle (mm-uu-copy-to-buffer start-point end-point) - '("application/x-shar"))) - -(defun mm-uu-gnatsweb-extract () - (save-restriction - (goto-char start-point) - (forward-line) - (narrow-to-region (point) end-point) - (mm-dissect-buffer t))) - -(defun mm-uu-pgp-signed-test (&rest rest) - (and - mml2015-use - (mml2015-clear-verify-function) - (cond - ((eq mm-verify-option 'never) nil) - ((eq mm-verify-option 'always) t) - ((eq mm-verify-option 'known) t) - (t (y-or-n-p "Verify pgp signed part?"))))) - -(eval-when-compile - (defvar gnus-newsgroup-charset)) - -(defun mm-uu-pgp-signed-extract-1 (handles ctl) - (let ((buf (mm-uu-copy-to-buffer (point-min) (point-max)))) - (with-current-buffer buf - (if (mm-uu-pgp-signed-test) - (progn - (mml2015-clean-buffer) - (let ((coding-system-for-write (or gnus-newsgroup-charset - 'iso-8859-1))) - (funcall (mml2015-clear-verify-function)))) - (when (and mml2015-use (null (mml2015-clear-verify-function))) - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-details - (format "Clear verification not supported by `%s'.\n" mml2015-use)))) - (goto-char (point-min)) - (if (search-forward "\n\n" nil t) - (delete-region (point-min) (point))) - (if (re-search-forward mm-uu-pgp-beginning-signature nil t) - (delete-region (match-beginning 0) (point-max))) - (goto-char (point-min)) - (while (re-search-forward "^- " nil t) - (replace-match "" t t) - (forward-line 1))) - (list (mm-make-handle buf '("text/plain" (charset . gnus-decoded)))))) - -(defun mm-uu-pgp-signed-extract () - (let ((mm-security-handle (list (format "multipart/signed")))) - (mm-set-handle-multipart-parameter - mm-security-handle 'protocol "application/x-gnus-pgp-signature") - (save-restriction - (narrow-to-region start-point end-point) - (add-text-properties 0 (length (car mm-security-handle)) - (list 'buffer (mm-uu-copy-to-buffer)) - (car mm-security-handle)) - (setcdr mm-security-handle - (mm-uu-pgp-signed-extract-1 nil - mm-security-handle))) - mm-security-handle)) - -(defun mm-uu-pgp-encrypted-test (&rest rest) - (and - mml2015-use - (mml2015-clear-decrypt-function) - (cond - ((eq mm-decrypt-option 'never) nil) - ((eq mm-decrypt-option 'always) t) - ((eq mm-decrypt-option 'known) t) - (t (y-or-n-p "Decrypt pgp encrypted part?"))))) - -(defun mm-uu-pgp-encrypted-extract-1 (handles ctl) - (let ((buf (mm-uu-copy-to-buffer (point-min) (point-max)))) - (if (mm-uu-pgp-encrypted-test) - (with-current-buffer buf - (mml2015-clean-buffer) - (funcall (mml2015-clear-decrypt-function)))) - (list - (mm-make-handle buf - '("text/plain" (charset . gnus-decoded)))))) - -(defun mm-uu-pgp-encrypted-extract () - (let ((mm-security-handle (list (format "multipart/encrypted")))) - (mm-set-handle-multipart-parameter - mm-security-handle 'protocol "application/x-gnus-pgp-encrypted") - (save-restriction - (narrow-to-region start-point end-point) - (add-text-properties 0 (length (car mm-security-handle)) - (list 'buffer (mm-uu-copy-to-buffer)) - (car mm-security-handle)) - (setcdr mm-security-handle - (mm-uu-pgp-encrypted-extract-1 nil - mm-security-handle))) - mm-security-handle)) - -(defun mm-uu-gpg-key-skip-to-last () - (let ((point (point)) - (end-regexp (mm-uu-end-regexp entry)) - (beginning-regexp (mm-uu-beginning-regexp entry))) - (when (and end-regexp - (not (mm-uu-configure-p (mm-uu-type entry) 'disabled))) - (while (re-search-forward end-regexp nil t) - (skip-chars-forward " \t\n\r") - (if (looking-at beginning-regexp) - (setq point (match-end 0))))) - (goto-char point))) - -(defun mm-uu-pgp-key-extract () - (let ((buf (mm-uu-copy-to-buffer start-point end-point))) - (mm-make-handle buf - '("application/pgp-keys")))) - -;;;###autoload -(defun mm-uu-dissect () - "Dissect the current buffer and return a list of uu handles." - (let ((case-fold-search t) - text-start start-point end-point file-name result - text-plain-type entry func) - (save-excursion - (goto-char (point-min)) - (cond - ((looking-at "\n") - (forward-line)) - ((search-forward "\n\n" nil t) - t) - (t (goto-char (point-max)))) - ;;; gnus-decoded is a fake charset, which means no further - ;;; decoding. - (setq text-start (point) - text-plain-type '("text/plain" (charset . gnus-decoded))) - (while (re-search-forward mm-uu-beginning-regexp nil t) - (setq start-point (match-beginning 0)) - (let ((alist mm-uu-type-alist) - (beginning-regexp (match-string 0))) - (while (not entry) - (if (string-match (mm-uu-beginning-regexp (car alist)) - beginning-regexp) - (setq entry (car alist)) - (pop alist)))) - (if (setq func (mm-uu-function-1 entry)) - (funcall func)) - (forward-line);; in case of failure - (when (and (not (mm-uu-configure-p (mm-uu-type entry) 'disabled)) - (let ((end-regexp (mm-uu-end-regexp entry))) - (if (not end-regexp) - (or (setq end-point (point-max)) t) - (prog1 - (re-search-forward end-regexp nil t) - (forward-line) - (setq end-point (point))))) - (or (not (setq func (mm-uu-function-2 entry))) - (funcall func))) - (if (and (> start-point text-start) - (progn - (goto-char text-start) - (re-search-forward "." start-point t))) - (push - (mm-make-handle (mm-uu-copy-to-buffer text-start start-point) - text-plain-type) - result)) - (push - (funcall (mm-uu-function-extract entry)) - result) - (goto-char (setq text-start end-point)))) - (when result - (if (and (> (point-max) (1+ text-start)) - (save-excursion - (goto-char text-start) - (re-search-forward "." nil t))) - (push - (mm-make-handle (mm-uu-copy-to-buffer text-start (point-max)) - text-plain-type) - result)) - (setq result (cons "multipart/mixed" (nreverse result)))) - result))) - -(provide 'mm-uu) - -;;; mm-uu.el ends here diff --git a/lisp/mm-view.el b/lisp/mm-view.el deleted file mode 100644 index 82f116c..0000000 --- a/lisp/mm-view.el +++ /dev/null @@ -1,378 +0,0 @@ -;;; mm-view.el --- Functions for viewing MIME objects -;; Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) -(require 'mail-parse) -(require 'mailcap) -(require 'mm-bodies) -(require 'mm-decode) - -(eval-and-compile - (autoload 'gnus-article-prepare-display "gnus-art") - (autoload 'vcard-parse-string "vcard") - (autoload 'vcard-format-string "vcard") - (autoload 'fill-flowed "flow-fill") - (unless (fboundp 'diff-mode) - (autoload 'diff-mode "diff-mode" "" t nil))) - -;;; -;;; Functions for displaying various formats inline -;;; -(defun mm-inline-image-emacs (handle) - (let ((b (point-marker)) - buffer-read-only) - (insert "\n") - (put-image (mm-get-image handle) b) - (mm-handle-set-undisplayer - handle - `(lambda () (remove-images ,b (1+ ,b)))))) - -(defun mm-inline-image-xemacs (handle) - (insert "\n") - (forward-char -1) - (let ((b (point)) - (annot (make-annotation (mm-get-image handle) nil 'text)) - buffer-read-only) - (mm-handle-set-undisplayer - handle - `(lambda () - (let (buffer-read-only) - (delete-annotation ,annot) - (delete-region ,(set-marker (make-marker) b) - ,(set-marker (make-marker) (point)))))) - (set-extent-property annot 'mm t) - (set-extent-property annot 'duplicable t))) - -(eval-and-compile - (if (featurep 'xemacs) - (defalias 'mm-inline-image 'mm-inline-image-xemacs) - (defalias 'mm-inline-image 'mm-inline-image-emacs))) - -(defvar mm-w3-setup nil) -(defun mm-setup-w3 () - (unless mm-w3-setup - (require 'w3) - (w3-do-setup) - (require 'url) - (require 'w3-vars) - (require 'url-vars) - (setq mm-w3-setup t))) - -(defun mm-inline-text (handle) - (let ((type (mm-handle-media-subtype handle)) - text buffer-read-only) - (cond - ((equal type "html") - (mm-setup-w3) - (setq text (mm-get-part handle)) - (let ((b (point)) - (url-standalone-mode t) - (url-current-object - (url-generic-parse-url (format "cid:%s" (mm-handle-id handle)))) - (width (window-width)) - (charset (mail-content-type-get - (mm-handle-type handle) 'charset))) - (save-excursion - (insert text) - (save-restriction - (narrow-to-region b (point)) - (goto-char (point-min)) - (if (or (and (boundp 'w3-meta-content-type-charset-regexp) - (re-search-forward - w3-meta-content-type-charset-regexp nil t)) - (and (boundp 'w3-meta-charset-content-type-regexp) - (re-search-forward - w3-meta-charset-content-type-regexp nil t))) - (setq charset - (or (let ((bsubstr (buffer-substring-no-properties - (match-beginning 2) - (match-end 2)))) - (if (fboundp 'w3-coding-system-for-mime-charset) - (w3-coding-system-for-mime-charset bsubstr) - (mm-charset-to-coding-system bsubstr))) - charset))) - (delete-region (point-min) (point-max)) - (insert (mm-decode-string text charset)) - (save-window-excursion - (save-restriction - (let ((w3-strict-width width) - ;; Don't let w3 set the global version of - ;; this variable. - (fill-column fill-column) - (url-standalone-mode t)) - (condition-case var - (w3-region (point-min) (point-max)) - (error - (delete-region (point-min) (point-max)) - (let ((b (point)) - (charset (mail-content-type-get - (mm-handle-type handle) 'charset))) - (if (or (eq charset 'gnus-decoded) - (eq mail-parse-charset 'gnus-decoded)) - (save-restriction - (narrow-to-region (point) (point)) - (mm-insert-part handle) - (goto-char (point-max))) - (insert (mm-decode-string (mm-get-part handle) - charset)))) - (message - "Error while rendering html; showing as text/plain")))))) - (mm-handle-set-undisplayer - handle - `(lambda () - (let (buffer-read-only) - (if (functionp 'remove-specifier) - (mapcar (lambda (prop) - (remove-specifier - (face-property 'default prop) - (current-buffer))) - '(background background-pixmap foreground))) - (delete-region ,(point-min-marker) - ,(point-max-marker))))))))) - ((or (equal type "enriched") - (equal type "richtext")) - (save-excursion - (mm-with-unibyte-buffer - (mm-insert-part handle) - (save-window-excursion - (enriched-decode (point-min) (point-max)) - (setq text (buffer-string))))) - (mm-insert-inline handle text)) - ((equal type "x-vcard") - (mm-insert-inline - handle - (concat "\n-- \n" - (ignore-errors - (if (fboundp 'vcard-pretty-print) - (vcard-pretty-print (mm-get-part handle)) - (vcard-format-string - (vcard-parse-string (mm-get-part handle) - 'vcard-standard-filter))))))) - (t - (let ((b (point)) - (charset (mail-content-type-get - (mm-handle-type handle) 'charset))) - (if (or (eq charset 'gnus-decoded) - ;; This is probably not entirely correct, but - ;; makes rfc822 parts with embedded multiparts work. - (eq mail-parse-charset 'gnus-decoded)) - (save-restriction - (narrow-to-region (point) (point)) - (mm-insert-part handle) - (goto-char (point-max))) - (insert (mm-decode-string (mm-get-part handle) charset))) - (when (and (equal type "plain") - (equal (cdr (assoc 'format (mm-handle-type handle))) - "flowed")) - (save-restriction - (narrow-to-region b (point)) - (goto-char b) - (fill-flowed) - (goto-char (point-max)))) - (save-restriction - (narrow-to-region b (point)) - (set-text-properties (point-min) (point-max) nil) - (mm-handle-set-undisplayer - handle - `(lambda () - (let (buffer-read-only) - (delete-region ,(point-min-marker) - ,(point-max-marker))))))))))) - -(defun mm-insert-inline (handle text) - "Insert TEXT inline from HANDLE." - (let ((b (point))) - (insert text) - (mm-handle-set-undisplayer - handle - `(lambda () - (let (buffer-read-only) - (delete-region ,(set-marker (make-marker) b) - ,(set-marker (make-marker) (point)))))))) - -(defun mm-inline-audio (handle) - (message "Not implemented")) - -(defun mm-view-sound-file () - (message "Not implemented")) - -(defun mm-w3-prepare-buffer () - (require 'w3) - (let ((url-standalone-mode t)) - (w3-prepare-buffer))) - -(defun mm-view-message () - (mm-enable-multibyte) - (let (handles) - (let (gnus-article-mime-handles) - ;; Double decode problem may happen. See mm-inline-message. - (run-hooks 'gnus-article-decode-hook) - (gnus-article-prepare-display) - (setq handles gnus-article-mime-handles)) - (when handles - (setq gnus-article-mime-handles - (mm-merge-handles gnus-article-mime-handles handles)))) - (fundamental-mode) - (goto-char (point-min))) - -(defun mm-inline-message (handle) - (let ((b (point)) - (bolp (bolp)) - (charset (mail-content-type-get - (mm-handle-type handle) 'charset)) - gnus-displaying-mime handles) - (when (and charset - (stringp charset)) - (setq charset (intern (downcase charset))) - (when (eq charset 'us-ascii) - (setq charset nil))) - (save-excursion - (save-restriction - (narrow-to-region b b) - (mm-insert-part handle) - (let (gnus-article-mime-handles - ;; disable prepare hook - gnus-article-prepare-hook - (gnus-newsgroup-charset - (or charset gnus-newsgroup-charset))) - (run-hooks 'gnus-article-decode-hook) - (gnus-article-prepare-display) - (setq handles gnus-article-mime-handles)) - (goto-char (point-min)) - (unless bolp - (insert "\n")) - (goto-char (point-max)) - (unless (bolp) - (insert "\n")) - (insert "----------\n\n") - (when handles - (setq gnus-article-mime-handles - (mm-merge-handles gnus-article-mime-handles handles))) - (mm-handle-set-undisplayer - handle - `(lambda () - (let (buffer-read-only) - (if (fboundp 'remove-specifier) - ;; This is only valid on XEmacs. - (mapcar (lambda (prop) - (remove-specifier - (face-property 'default prop) (current-buffer))) - '(background background-pixmap foreground))) - (delete-region ,(point-min-marker) ,(point-max-marker))))))))) - -(defun mm-display-inline-fontify (handle mode) - (let (text) - ;; XEmacs @#$@ version of font-lock refuses to fully turn itself - ;; on for buffers whose name begins with " ". That's why we use - ;; save-current-buffer/get-buffer-create rather than - ;; with-temp-buffer. - (save-current-buffer - (set-buffer (generate-new-buffer "*fontification*")) - (unwind-protect - (progn - (buffer-disable-undo) - (mm-insert-part handle) - (funcall mode) - (let ((font-lock-verbose nil)) - ;; I find font-lock a bit too verbose. - (font-lock-fontify-buffer)) - ;; By default, XEmacs font-lock uses non-duplicable text - ;; properties. This code forces all the text properties - ;; to be copied along with the text. - (when (fboundp 'extent-list) - (map-extents (lambda (ext ignored) - (set-extent-property ext 'duplicable t) - nil) - nil nil nil nil nil 'text-prop)) - (setq text (buffer-string))) - (kill-buffer (current-buffer)))) - (mm-insert-inline handle text))) - -;; Shouldn't these functions check whether the user even wants to use -;; font-lock? At least under XEmacs, this fontification is pretty -;; much unconditional. Also, it would be nice to change for the size -;; of the fontified region. - -(defun mm-display-patch-inline (handle) - (mm-display-inline-fontify handle 'diff-mode)) - -(defun mm-display-elisp-inline (handle) - (mm-display-inline-fontify handle 'emacs-lisp-mode)) - -;; id-signedData OBJECT IDENTIFIER ::= { iso(1) member-body(2) -;; us(840) rsadsi(113549) pkcs(1) pkcs7(7) 2 } -(defvar mm-pkcs7-signed-magic - (mm-string-as-unibyte - (apply 'concat - (mapcar 'char-to-string - (list ?\x30 ?\x5c ?\x28 ?\x80 ?\x5c ?\x7c ?\x81 ?\x2e ?\x5c - ?\x7c ?\x82 ?\x2e ?\x2e ?\x5c ?\x7c ?\x83 ?\x2e ?\x2e - ?\x2e ?\x5c ?\x29 ?\x06 ?\x09 ?\x5c ?\x2a ?\x86 ?\x48 - ?\x86 ?\xf7 ?\x0d ?\x01 ?\x07 ?\x02))))) - -;; id-envelopedData OBJECT IDENTIFIER ::= { iso(1) member-body(2) -;; us(840) rsadsi(113549) pkcs(1) pkcs7(7) 3 } -(defvar mm-pkcs7-enveloped-magic - (mm-string-as-unibyte - (apply 'concat - (mapcar 'char-to-string - (list ?\x30 ?\x5c ?\x28 ?\x80 ?\x5c ?\x7c ?\x81 ?\x2e ?\x5c - ?\x7c ?\x82 ?\x2e ?\x2e ?\x5c ?\x7c ?\x83 ?\x2e ?\x2e - ?\x2e ?\x5c ?\x29 ?\x06 ?\x09 ?\x5c ?\x2a ?\x86 ?\x48 - ?\x86 ?\xf7 ?\x0d ?\x01 ?\x07 ?\x03))))) - -(defun mm-view-pkcs7-get-type (handle) - (mm-with-unibyte-buffer - (mm-insert-part handle) - (cond ((looking-at mm-pkcs7-enveloped-magic) - 'enveloped) - ((looking-at mm-pkcs7-signed-magic) - 'signed) - (t - (error "Could not identify PKCS#7 type"))))) - -(defun mm-view-pkcs7 (handle) - (case (mm-view-pkcs7-get-type handle) - (enveloped (mm-view-pkcs7-decrypt handle)) - (otherwise (error "Unknown or unimplemented PKCS#7 type")))) - -(defun mm-view-pkcs7-decrypt (handle) - (insert-buffer (mm-handle-buffer handle)) - (goto-char (point-min)) - (insert "MIME-Version: 1.0\n") - (mm-insert-headers "application/pkcs7-mime" "base64" "smime.p7m") - (smime-decrypt-region - (point-min) (point-max) - (if (= (length smime-keys) 1) - (cadar smime-keys) - (smime-get-key-by-email - (completing-read "Decrypt this part with which key? " - smime-keys nil nil - (and (listp (car-safe smime-keys)) - (caar smime-keys))))))) - -(provide 'mm-view) - -;;; mm-view.el ends here diff --git a/lisp/mmgnus.el b/lisp/mmgnus.el deleted file mode 100644 index 3493ee1..0000000 --- a/lisp/mmgnus.el +++ /dev/null @@ -1,92 +0,0 @@ -;;; mmgnus.el --- MIME entity implementation for gnus-article - -;; Copyright (C) 1998 Free Software Foundation, Inc. - -;; Author: MORIOKA Tomohiko -;; Keywords: MIME, multimedia, mail, news - -;; This file is part of Chao-gnus. - -;; This program 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 program 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. - -;;; Code: - -(require 'mmbuffer) - -(luna-define-class mime-gnus-entity (mime-buffer-entity) - (number - subject from date id references chars lines xref extra)) - -(luna-define-internal-accessors 'mime-gnus-entity) - -(luna-define-method initialize-instance ((entity mime-gnus-entity) - &rest init-args) - (apply (car (luna-class-find-functions - (luna-find-class 'standard-object) - 'initialize-instance)) - entity init-args) - ) - -;; (luna-define-method mime-entity-fetch-field ((entity mime-gnus-entity) -;; field-name) -;; (or (funcall (car (luna-class-find-functions -;; (luna-find-class 'mime-entity) -;; 'mime-entity-fetch-field)) -;; entity field-name) -;; (with-current-buffer gnus-original-article-buffer -;; (let ((ret (std11-field-body field-name))) -;; (when ret -;; (or (symbolp field-name) -;; (setq field-name -;; (intern (capitalize (capitalize field-name))))) -;; (mime-entity-set-original-header-internal -;; entity -;; (put-alist field-name ret -;; (mime-entity-original-header-internal entity))) -;; ret))))) - -;; (luna-define-method mime-entity-buffer ((entity mime-gnus-entity)) -;; ;; (if (with-current-buffer gnus-summary-buffer -;; ;; (eq gnus-current-article (mail-header-number entity))) -;; ;; ...) -;; (unless (mime-buffer-entity-header-end-internal entity) -;; (set-buffer gnus-original-article-buffer) -;; (mime-buffer-entity-set-header-start-internal entity (point-min)) -;; (mime-buffer-entity-set-body-end-internal entity (point-max)) -;; (goto-char (point-min)) -;; (if (re-search-forward "^$" nil t) -;; (progn -;; (mime-buffer-entity-set-header-end-internal entity (match-end 0)) -;; (mime-buffer-entity-set-body-start-internal -;; entity -;; (if (= (mime-buffer-entity-header-end-internal entity) -;; (mime-buffer-entity-body-end-internal entity)) -;; (mime-buffer-entity-body-end-internal entity) -;; (1+ (mime-buffer-entity-header-end-internal entity)) -;; )) -;; ) -;; (mime-buffer-entity-set-header-end-internal entity (point-min)) -;; (mime-buffer-entity-set-body-start-internal entity (point-min)) -;; )) -;; gnus-original-article-buffer) - - -;;; @ end -;;; - -(provide 'mmgnus) - -;;; mmgnus.el ends here diff --git a/lisp/mml-sec.el b/lisp/mml-sec.el deleted file mode 100644 index fbd92c7..0000000 --- a/lisp/mml-sec.el +++ /dev/null @@ -1,112 +0,0 @@ -;;; mml-sec.el --- A package with security functions for MML documents -;; Copyright (C) 2000 Free Software Foundation, Inc. - -;; Author: Simon Josefsson -;; This file is not part of GNU Emacs, but the same permissions apply. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; Code: - -(require 'smime) -(require 'mml2015) -(require 'mml-smime) -(eval-when-compile (require 'cl)) - -(defvar mml-sign-alist - '(("smime" mml-smime-sign-buffer mml-smime-sign-query) - ("pgpmime" mml-pgpmime-sign-buffer list)) - "Alist of MIME signer functions.") - -(defvar mml-default-sign-method (caar mml-sign-alist) - "Default sign method.") - -(defvar mml-encrypt-alist - '(("smime" mml-smime-encrypt-buffer mml-smime-encrypt-query) - ("pgpmime" mml-pgpmime-encrypt-buffer list)) - "Alist of MIME encryption functions.") - -(defvar mml-default-encrypt-method (caar mml-encrypt-alist) - "Default encryption method.") - -;;; Security functions - -(defun mml-smime-sign-buffer (cont) - (or (mml-smime-sign cont) - (error "Signing failed... inspect message logs for errors"))) - -(defun mml-smime-encrypt-buffer (cont) - (or (mml-smime-encrypt cont) - (error "Encryption failed... inspect message logs for errors"))) - -(defun mml-pgpmime-sign-buffer (cont) - (or (mml2015-sign cont) - (error "Signing failed... inspect message logs for errors"))) - -(defun mml-pgpmime-encrypt-buffer (cont) - (or (mml2015-encrypt cont) - (error "Encryption failed... inspect message logs for errors"))) - -(defun mml-secure-part (method &optional sign) - (save-excursion - (let ((tags (funcall (nth 2 (assoc method (if sign mml-sign-alist - mml-encrypt-alist)))))) - (cond ((re-search-backward - "<#\\(multipart\\|part\\|external\\|mml\\)" nil t) - (goto-char (match-end 0)) - (insert (if sign " sign=" " encrypt=") method) - (while tags - (let ((key (pop tags)) - (value (pop tags))) - (when value - ;; Quote VALUE if it contains suspicious characters. - (when (string-match "[\"'\\~/*;() \t\n]" value) - (setq value (prin1-to-string value))) - (insert (format " %s=%s" key value)))))) - ((or (re-search-backward - (concat "^" (regexp-quote mail-header-separator) "\n") nil t) - (re-search-forward - (concat "^" (regexp-quote mail-header-separator) "\n") nil t)) - (goto-char (match-end 0)) - (apply 'mml-insert-tag 'part (cons (if sign 'sign 'encrypt) - (cons method tags)))) - (t (error "The message is corrupted. No mail header separator")))))) - -(defun mml-secure-sign-pgpmime () - "Add MML tags to PGP/MIME sign this MML part." - (interactive) - (mml-secure-part "pgpmime" 'sign)) - -(defun mml-secure-sign-smime () - "Add MML tags to S/MIME sign this MML part." - (interactive) - (mml-secure-part "smime" 'sign)) - -(defun mml-secure-encrypt-pgpmime () - "Add MML tags to PGP/MIME encrypt this MML part." - (interactive) - (mml-secure-part "pgpmime")) - -(defun mml-secure-encrypt-smime () - "Add MML tags to S/MIME encrypt this MML part." - (interactive) - (mml-secure-part "smime")) - -(provide 'mml-sec) - -;;; mml-sec.el ends here diff --git a/lisp/mml-smime.el b/lisp/mml-smime.el deleted file mode 100644 index ac87492..0000000 --- a/lisp/mml-smime.el +++ /dev/null @@ -1,194 +0,0 @@ -;;; mml-smime.el --- S/MIME support for MML -;; Copyright (c) 2000, 2001 Free Software Foundation, Inc. - -;; Author: Simon Josefsson -;; Keywords: Gnus, MIME, S/MIME, MML - -;; This file is a part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; Code: - -(require 'smime) -(require 'mm-decode) - -(defun mml-smime-sign (cont) - (when (null smime-keys) - (customize-variable 'smime-keys) - (error "No S/MIME keys configured, use customize to add your key")) - (smime-sign-buffer (cdr (assq 'keyfile cont))) - (goto-char (point-max))) - -(defun mml-smime-encrypt (cont) - (let (certnames certfiles tmp file tmpfiles) - ;; xxx tmp files are always an security issue - (while (setq tmp (pop cont)) - (if (and (consp tmp) (eq (car tmp) 'certfile)) - (push (cdr tmp) certnames))) - (while (setq tmp (pop certnames)) - (if (not (and (not (file-exists-p tmp)) - (get-buffer tmp))) - (push tmp certfiles) - (setq file (make-temp-name mm-tmp-directory)) - (with-current-buffer tmp - (write-region (point-min) (point-max) file)) - (push file certfiles) - (push file tmpfiles))) - (if (smime-encrypt-buffer certfiles) - (progn - (while (setq tmp (pop tmpfiles)) - (delete-file tmp)) - t) - (while (setq tmp (pop tmpfiles)) - (delete-file tmp)) - nil)) - (goto-char (point-max))) - -(defun mml-smime-sign-query () - ;; query information (what certificate) from user when MML tag is - ;; added, for use later by the signing process - (when (null smime-keys) - (customize-variable 'smime-keys) - (error "No S/MIME keys configured, use customize to add your key")) - (list 'keyfile - (if (= (length smime-keys) 1) - (cadar smime-keys) - (or (let ((from (cadr (funcall gnus-extract-address-components - (or (save-excursion - (save-restriction - (message-narrow-to-headers) - (message-fetch-field "from"))) - ""))))) - (and from (smime-get-key-by-email from))) - (smime-get-key-by-email - (completing-read "Sign this part with what signature? " - smime-keys nil nil - (and (listp (car-safe smime-keys)) - (caar smime-keys)))))))) - -(defun mml-smime-get-file-cert () - (ignore-errors - (list 'certfile (read-file-name - "File with recipient's S/MIME certificate: " - smime-certificate-directory nil t "")))) - -(defun mml-smime-get-dns-cert () - ;; todo: deal with comma separated multiple recipients - (let (result who bad cert) - (condition-case () - (while (not result) - (setq who (read-from-minibuffer - (format "%sLookup certificate for: " (or bad "")) - (cadr (funcall gnus-extract-address-components - (or (save-excursion - (save-restriction - (message-narrow-to-headers) - (message-fetch-field "to"))) - ""))))) - (if (setq cert (smime-cert-by-dns who)) - (setq result (list 'certfile (buffer-name cert))) - (setq bad (format "`%s' not found. " who)))) - (quit)) - result)) - -(defun mml-smime-encrypt-query () - ;; todo: add ldap support (xemacs ldap api?) - ;; todo: try dns/ldap automatically first, before prompting user - (let (certs done) - (while (not done) - (ecase (read (gnus-completing-read "dns" "Fetch certificate from" - '(("dns") ("file")) nil t)) - (dns (setq certs (append certs - (mml-smime-get-dns-cert)))) - (file (setq certs (append certs - (mml-smime-get-file-cert))))) - (setq done (not (y-or-n-p "Add more recipients? ")))) - certs)) - -(defun mml-smime-verify (handle ctl) - (with-temp-buffer - (insert-buffer (mm-handle-multipart-original-buffer ctl)) - (goto-char (point-min)) - (insert (format "Content-Type: %s; " (mm-handle-media-type ctl))) - (insert (format "protocol=\"%s\"; " - (mm-handle-multipart-ctl-parameter ctl 'protocol))) - (insert (format "micalg=\"%s\"; " - (mm-handle-multipart-ctl-parameter ctl 'micalg))) - (insert (format "boundary=\"%s\"\n\n" - (mm-handle-multipart-ctl-parameter ctl 'boundary))) - (when (get-buffer smime-details-buffer) - (kill-buffer smime-details-buffer)) - (let ((buf (current-buffer)) - (good-signature (smime-noverify-buffer)) - (good-certificate (and (or smime-CA-file smime-CA-directory) - (smime-verify-buffer))) - addresses openssl-output) - (setq openssl-output (with-current-buffer smime-details-buffer - (buffer-string))) - (if (not good-signature) - (progn - ;; we couldn't verify message, fail with openssl output as message - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-info "Failed") - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-details - (concat "OpenSSL failed to verify message integrity:\n" - "-------------------------------------------\n" - openssl-output))) - ;; verify mail addresses in mail against those in certificate - (when (and (smime-pkcs7-region (point-min) (point-max)) - (smime-pkcs7-certificates-region (point-min) (point-max))) - (with-temp-buffer - (insert-buffer-substring buf) - (goto-char (point-min)) - (while (re-search-forward "-----END CERTIFICATE-----" nil t) - (when (smime-pkcs7-email-region (point-min) (point)) - (setq addresses (append (smime-buffer-as-string-region - (point-min) (point)) addresses))) - (delete-region (point-min) (point))) - (setq addresses (mapcar 'downcase addresses)))) - (if (not (member (downcase (or (mm-handle-multipart-from ctl) "")) addresses)) - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-info "Sender address forged") - (if good-certificate - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-info "Ok (sender authenticated)") - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-info "Ok (sender not trusted)"))) - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-details - (concat "Sender claimed to be: " (mm-handle-multipart-from ctl) "\n" - (if addresses - (concat "Addresses in certificate: " - (mapconcat 'identity addresses ", ")) - "No addresses found in certificate. (Requires OpenSSL 0.9.6 or later.)") - "\n" "\n" - "OpenSSL output:\n" - "---------------\n" openssl-output "\n" - "Certificate(s) inside S/MIME signature:\n" - "---------------------------------------\n" - (buffer-string) "\n"))))) - handle) - -(defun mml-smime-verify-test (handle ctl) - smime-openssl-program) - -(provide 'mml-smime) - -;;; mml-smime.el ends here diff --git a/lisp/mml.el b/lisp/mml.el deleted file mode 100644 index 2826144..0000000 --- a/lisp/mml.el +++ /dev/null @@ -1,952 +0,0 @@ -;;; mml.el --- A package for parsing and validating MML documents -;; Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; Code: - -(require 'mm-util) -(require 'mm-bodies) -(require 'mm-encode) -(require 'mm-decode) -(require 'mml-sec) -(eval-when-compile (require 'cl)) - -(eval-and-compile - (autoload 'message-make-message-id "message") - (autoload 'gnus-setup-posting-charset "gnus-msg") - (autoload 'gnus-add-minor-mode "gnus-ems") - (autoload 'message-fetch-field "message") - (autoload 'message-posting-charset "message")) - -(defcustom mml-content-type-parameters - '(name access-type expiration size permission format) - "*A list of acceptable parameters in MML tag. -These parameters are generated in Content-Type header if exists." - :type '(repeat (symbol :tag "Parameter")) - :group 'message) - -(defcustom mml-content-disposition-parameters - '(filename creation-date modification-date read-date) - "*A list of acceptable parameters in MML tag. -These parameters are generated in Content-Disposition header if exists." - :type '(repeat (symbol :tag "Parameter")) - :group 'message) - -(defvar mml-tweak-type-alist nil - "A list of (TYPE . FUNCTION) for tweaking MML parts. -TYPE is a string containing a regexp to match the MIME type. FUNCTION -is a Lisp function which is called with the MML handle to tweak the -part. This variable is used only when no TWEAK parameter exists in -the MML handle.") - -(defvar mml-tweak-function-alist nil - "A list of (NAME . FUNCTION) for tweaking MML parts. -NAME is a string containing the name of the TWEAK parameter in the MML -handle. FUNCTION is a Lisp function which is called with the MML -handle to tweak the part.") - -(defvar mml-generate-multipart-alist nil - "*Alist of multipart generation functions. -Each entry has the form (NAME . FUNCTION), where -NAME is a string containing the name of the part (without the -leading \"/multipart/\"), -FUNCTION is a Lisp function which is called to generate the part. - -The Lisp function has to supply the appropriate MIME headers and the -contents of this part.") - -(defvar mml-syntax-table - (let ((table (copy-syntax-table emacs-lisp-mode-syntax-table))) - (modify-syntax-entry ?\\ "/" table) - (modify-syntax-entry ?< "(" table) - (modify-syntax-entry ?> ")" table) - (modify-syntax-entry ?@ "w" table) - (modify-syntax-entry ?/ "w" table) - (modify-syntax-entry ?= " " table) - (modify-syntax-entry ?* " " table) - (modify-syntax-entry ?\; " " table) - (modify-syntax-entry ?\' " " table) - table)) - -(defvar mml-boundary-function 'mml-make-boundary - "A function called to suggest a boundary. -The function may be called several times, and should try to make a new -suggestion each time. The function is called with one parameter, -which is a number that says how many times the function has been -called for this message.") - -(defvar mml-confirmation-set nil - "A list of symbols, each of which disables some warning. -`unknown-encoding': always send messages contain characters with -unknown encoding; `use-ascii': always use ASCII for those characters -with unknown encoding; `multipart': always send messages with more than -one charsets.") - -(defvar mml-generate-default-type "text/plain") - -(defvar mml-buffer-list nil) - -(defun mml-generate-new-buffer (name) - (let ((buf (generate-new-buffer name))) - (push buf mml-buffer-list) - buf)) - -(defun mml-destroy-buffers () - (let (kill-buffer-hook) - (mapcar 'kill-buffer mml-buffer-list) - (setq mml-buffer-list nil))) - -(defun mml-parse () - "Parse the current buffer as an MML document." - (save-excursion - (goto-char (point-min)) - (let ((table (syntax-table))) - (unwind-protect - (progn - (set-syntax-table mml-syntax-table) - (mml-parse-1)) - (set-syntax-table table))))) - -(defun mml-parse-1 () - "Parse the current buffer as an MML document." - (let (struct tag point contents charsets warn use-ascii no-markup-p raw) - (while (and (not (eobp)) - (not (looking-at "<#/multipart"))) - (cond - ((looking-at "<#multipart") - (push (nconc (mml-read-tag) (mml-parse-1)) struct)) - ((looking-at "<#external") - (push (nconc (mml-read-tag) (list (cons 'contents (mml-read-part)))) - struct)) - (t - (if (or (looking-at "<#part") (looking-at "<#mml")) - (setq tag (mml-read-tag) - no-markup-p nil - warn nil) - (setq tag (list 'part '(type . "text/plain")) - no-markup-p t - warn t)) - (setq raw (cdr (assq 'raw tag)) - point (point) - contents (mml-read-part (eq 'mml (car tag))) - charsets (cond - (raw nil) - ((assq 'charset tag) - (list - (intern (downcase (cdr (assq 'charset tag)))))) - (t - (mm-find-mime-charset-region point (point))))) - (when (and (not raw) (memq nil charsets)) - (if (or (memq 'unknown-encoding mml-confirmation-set) - (message-options-get 'unknown-encoding) - (and (y-or-n-p "\ -Message contains characters with unknown encoding. Really send?") - (message-options-set 'unknown-encoding t))) - (if (setq use-ascii - (or (memq 'use-ascii mml-confirmation-set) - (message-options-get 'use-ascii) - (and (y-or-n-p "Use ASCII as charset?") - (message-options-set 'use-ascii t)))) - (setq charsets (delq nil charsets)) - (setq warn nil)) - (error "Edit your message to remove those characters"))) - (if (or raw - (eq 'mml (car tag)) - (< (length charsets) 2)) - (if (or (not no-markup-p) - (string-match "[^ \t\r\n]" contents)) - ;; Don't create blank parts. - (push (nconc tag (list (cons 'contents contents))) - struct)) - (let ((nstruct (mml-parse-singlepart-with-multiple-charsets - tag point (point) use-ascii))) - (when (and warn - (not (memq 'multipart mml-confirmation-set)) - (not (message-options-get 'multipart)) - (not (and (y-or-n-p (format "\ -A message part needs to be split into %d charset parts. Really send? " - (length nstruct))) - (message-options-set 'multipart t)))) - (error "Edit your message to use only one charset")) - (setq struct (nconc nstruct struct))))))) - (unless (eobp) - (forward-line 1)) - (nreverse struct))) - -(defun mml-parse-singlepart-with-multiple-charsets - (orig-tag beg end &optional use-ascii) - (save-excursion - (save-restriction - (narrow-to-region beg end) - (goto-char (point-min)) - (let ((current (or (mm-mime-charset (mm-charset-after)) - (and use-ascii 'us-ascii))) - charset struct space newline paragraph) - (while (not (eobp)) - (setq charset (mm-mime-charset (mm-charset-after))) - (cond - ;; The charset remains the same. - ((eq charset 'us-ascii)) - ((or (and use-ascii (not charset)) - (eq charset current)) - (setq space nil - newline nil - paragraph nil)) - ;; The initial charset was ascii. - ((eq current 'us-ascii) - (setq current charset - space nil - newline nil - paragraph nil)) - ;; We have a change in charsets. - (t - (push (append - orig-tag - (list (cons 'contents - (buffer-substring-no-properties - beg (or paragraph newline space (point)))))) - struct) - (setq beg (or paragraph newline space (point)) - current charset - space nil - newline nil - paragraph nil))) - ;; Compute places where it might be nice to break the part. - (cond - ((memq (following-char) '(? ?\t)) - (setq space (1+ (point)))) - ((and (eq (following-char) ?\n) - (not (bobp)) - (eq (char-after (1- (point))) ?\n)) - (setq paragraph (point))) - ((eq (following-char) ?\n) - (setq newline (1+ (point))))) - (forward-char 1)) - ;; Do the final part. - (unless (= beg (point)) - (push (append orig-tag - (list (cons 'contents - (buffer-substring-no-properties - beg (point))))) - struct)) - struct)))) - -(defun mml-read-tag () - "Read a tag and return the contents." - (let ((orig-point (point)) - contents name elem val) - (forward-char 2) - (setq name (buffer-substring-no-properties - (point) (progn (forward-sexp 1) (point)))) - (skip-chars-forward " \t\n") - (while (not (looking-at ">[ \t]*\n?")) - (setq elem (buffer-substring-no-properties - (point) (progn (forward-sexp 1) (point)))) - (skip-chars-forward "= \t\n") - (setq val (buffer-substring-no-properties - (point) (progn (forward-sexp 1) (point)))) - (when (string-match "^\"\\(.*\\)\"$" val) - (setq val (match-string 1 val))) - (push (cons (intern elem) val) contents) - (skip-chars-forward " \t\n")) - (goto-char (match-end 0)) - ;; Don't skip the leading space. - ;;(skip-chars-forward " \t\n") - ;; Put the tag location into the returned contents - (setq contents (append (list (cons 'tag-location orig-point)) contents)) - (cons (intern name) (nreverse contents)))) - -(defun mml-read-part (&optional mml) - "Return the buffer up till the next part, multipart or closing part or multipart. -If MML is non-nil, return the buffer up till the correspondent mml tag." - (let ((beg (point)) (count 1)) - ;; If the tag ended at the end of the line, we go to the next line. - (when (looking-at "[ \t]*\n") - (forward-line 1)) - (if mml - (progn - (while (and (> count 0) (not (eobp))) - (if (re-search-forward "<#\\(/\\)?mml." nil t) - (setq count (+ count (if (match-beginning 1) -1 1))) - (goto-char (point-max)))) - (buffer-substring-no-properties beg (if (> count 0) - (point) - (match-beginning 0)))) - (if (re-search-forward - "<#\\(/\\)?\\(multipart\\|part\\|external\\|mml\\)." nil t) - (prog1 - (buffer-substring-no-properties beg (match-beginning 0)) - (if (or (not (match-beginning 1)) - (equal (match-string 2) "multipart")) - (goto-char (match-beginning 0)) - (when (looking-at "[ \t]*\n") - (forward-line 1)))) - (buffer-substring-no-properties beg (goto-char (point-max))))))) - -(defvar mml-boundary nil) -(defvar mml-base-boundary "-=-=") -(defvar mml-multipart-number 0) - -(defun mml-generate-mime () - "Generate a MIME message based on the current MML document." - (let ((cont (mml-parse)) - (mml-multipart-number mml-multipart-number)) - (if (not cont) - nil - (with-temp-buffer - (if (and (consp (car cont)) - (= (length cont) 1)) - (mml-generate-mime-1 (car cont)) - (mml-generate-mime-1 (nconc (list 'multipart '(type . "mixed")) - cont))) - (buffer-string))))) - -(defun mml-generate-mime-1 (cont) - (let ((mm-use-ultra-safe-encoding - (or mm-use-ultra-safe-encoding (assq 'sign cont)))) - (save-restriction - (narrow-to-region (point) (point)) - (mml-tweak-part cont) - (cond - ((or (eq (car cont) 'part) (eq (car cont) 'mml)) - (let ((raw (cdr (assq 'raw cont))) - coded encoding charset filename type) - (setq type (or (cdr (assq 'type cont)) "text/plain")) - (if (and (not raw) - (member (car (split-string type "/")) '("text" "message"))) - (with-temp-buffer - (setq charset (mm-charset-to-coding-system - (cdr (assq 'charset cont)))) - (when (eq charset 'ascii) - (setq charset nil)) - (cond - ((cdr (assq 'buffer cont)) - (insert-buffer-substring (cdr (assq 'buffer cont)))) - ((and (setq filename (cdr (assq 'filename cont))) - (not (equal (cdr (assq 'nofile cont)) "yes"))) - (let ((coding-system-for-read charset)) - (mm-insert-file-contents filename))) - ((eq 'mml (car cont)) - (insert (cdr (assq 'contents cont)))) - (t - (save-restriction - (narrow-to-region (point) (point)) - (insert (cdr (assq 'contents cont))) - ;; Remove quotes from quoted tags. - (goto-char (point-min)) - (while (re-search-forward - "<#!+/?\\(part\\|multipart\\|external\\|mml\\)" - nil t) - (delete-region (+ (match-beginning 0) 2) - (+ (match-beginning 0) 3)))))) - (cond - ((eq (car cont) 'mml) - (let ((mml-boundary (funcall mml-boundary-function - (incf mml-multipart-number))) - (mml-generate-default-type "text/plain")) - (mml-to-mime)) - (let ((mm-7bit-chars (concat mm-7bit-chars "\x1b"))) - ;; ignore 0x1b, it is part of iso-2022-jp - (setq encoding (mm-body-7-or-8)))) - ((string= (car (split-string type "/")) "message") - (let ((mm-7bit-chars (concat mm-7bit-chars "\x1b"))) - ;; ignore 0x1b, it is part of iso-2022-jp - (setq encoding (mm-body-7-or-8)))) - (t - (setq charset (mm-encode-body charset)) - (setq encoding (mm-body-encoding - charset (cdr (assq 'encoding cont)))))) - (setq coded (buffer-string))) - (mm-with-unibyte-buffer - (cond - ((cdr (assq 'buffer cont)) - (insert-buffer-substring (cdr (assq 'buffer cont)))) - ((and (setq filename (cdr (assq 'filename cont))) - (not (equal (cdr (assq 'nofile cont)) "yes"))) - (let ((coding-system-for-read mm-binary-coding-system)) - (mm-insert-file-contents filename nil nil nil nil t))) - (t - (insert (cdr (assq 'contents cont))))) - (setq encoding (mm-encode-buffer type) - coded (mm-string-as-multibyte (buffer-string))))) - (mml-insert-mime-headers cont type charset encoding) - (insert "\n") - (insert coded))) - ((eq (car cont) 'external) - (insert "Content-Type: message/external-body") - (let ((parameters (mml-parameter-string - cont '(expiration size permission))) - (name (cdr (assq 'name cont))) - (url (cdr (assq 'url cont)))) - (when name - (setq name (mml-parse-file-name name)) - (if (stringp name) - (mml-insert-parameter - (mail-header-encode-parameter "name" name) - "access-type=local-file") - (mml-insert-parameter - (mail-header-encode-parameter - "name" (file-name-nondirectory (nth 2 name))) - (mail-header-encode-parameter "site" (nth 1 name)) - (mail-header-encode-parameter - "directory" (file-name-directory (nth 2 name)))) - (mml-insert-parameter - (concat "access-type=" - (if (member (nth 0 name) '("ftp@" "anonymous@")) - "anon-ftp" - "ftp"))))) - (when url - (mml-insert-parameter - (mail-header-encode-parameter "url" url) - "access-type=url")) - (when parameters - (mml-insert-parameter-string - cont '(expiration size permission)))) - (insert "\n\n") - (insert "Content-Type: " (cdr (assq 'type cont)) "\n") - (insert "Content-ID: " (message-make-message-id) "\n") - (insert "Content-Transfer-Encoding: " - (or (cdr (assq 'encoding cont)) "binary")) - (insert "\n\n") - (insert (or (cdr (assq 'contents cont)))) - (insert "\n")) - ((eq (car cont) 'multipart) - (let* ((type (or (cdr (assq 'type cont)) "mixed")) - (mml-generate-default-type (if (equal type "digest") - "message/rfc822" - "text/plain")) - (handler (assoc type mml-generate-multipart-alist))) - (if handler - (funcall (cdr handler) cont) - ;; No specific handler. Use default one. - (let ((mml-boundary (mml-compute-boundary cont))) - (insert (format "Content-Type: multipart/%s; boundary=\"%s\"\n" - type mml-boundary)) - (let ((cont cont) part) - (while (setq part (pop cont)) - ;; Skip `multipart' and attributes. - (when (and (consp part) (consp (cdr part))) - (insert "\n--" mml-boundary "\n") - (mml-generate-mime-1 part)))) - (insert "\n--" mml-boundary "--\n"))))) - (t - (error "Invalid element: %S" cont))) - (let ((item (assoc (cdr (assq 'sign cont)) mml-sign-alist)) - sender recipients) - (when item - (if (setq sender (cdr (assq 'sender cont))) - (message-options-set 'message-sender sender)) - (if (setq recipients (cdr (assq 'recipients cont))) - (message-options-set 'message-sender recipients)) - (funcall (nth 1 item) cont))) - (let ((item (assoc (cdr (assq 'encrypt cont)) mml-encrypt-alist)) - sender recipients) - (when item - (if (setq sender (cdr (assq 'sender cont))) - (message-options-set 'message-sender sender)) - (if (setq recipients (cdr (assq 'recipients cont))) - (message-options-set 'message-sender recipients)) - (funcall (nth 1 item) cont)))))) - -(defun mml-compute-boundary (cont) - "Return a unique boundary that does not exist in CONT." - (let ((mml-boundary (funcall mml-boundary-function - (incf mml-multipart-number)))) - ;; This function tries again and again until it has found - ;; a unique boundary. - (while (not (catch 'not-unique - (mml-compute-boundary-1 cont)))) - mml-boundary)) - -(defun mml-compute-boundary-1 (cont) - (let (filename) - (cond - ((eq (car cont) 'part) - (with-temp-buffer - (cond - ((cdr (assq 'buffer cont)) - (insert-buffer-substring (cdr (assq 'buffer cont)))) - ((and (setq filename (cdr (assq 'filename cont))) - (not (equal (cdr (assq 'nofile cont)) "yes"))) - (mm-insert-file-contents filename)) - (t - (insert (cdr (assq 'contents cont))))) - (goto-char (point-min)) - (when (re-search-forward (concat "^--" (regexp-quote mml-boundary)) - nil t) - (setq mml-boundary (funcall mml-boundary-function - (incf mml-multipart-number))) - (throw 'not-unique nil)))) - ((eq (car cont) 'multipart) - (mapcar 'mml-compute-boundary-1 (cddr cont)))) - t)) - -(defun mml-make-boundary (number) - (concat (make-string (% number 60) ?=) - (if (> number 17) - (format "%x" number) - "") - mml-base-boundary)) - -(defun mml-insert-mime-headers (cont type charset encoding) - (let (parameters disposition description) - (setq parameters - (mml-parameter-string - cont mml-content-type-parameters)) - (when (or charset - parameters - (not (equal type mml-generate-default-type))) - (when (consp charset) - (error - "Can't encode a part with several charsets.")) - (insert "Content-Type: " type) - (when charset - (insert "; " (mail-header-encode-parameter - "charset" (symbol-name charset)))) - (when parameters - (mml-insert-parameter-string - cont mml-content-type-parameters)) - (insert "\n")) - (setq parameters - (mml-parameter-string - cont mml-content-disposition-parameters)) - (when (or (setq disposition (cdr (assq 'disposition cont))) - parameters) - (insert "Content-Disposition: " (or disposition "inline")) - (when parameters - (mml-insert-parameter-string - cont mml-content-disposition-parameters)) - (insert "\n")) - (unless (eq encoding '7bit) - (insert (format "Content-Transfer-Encoding: %s\n" encoding))) - (when (setq description (cdr (assq 'description cont))) - (insert "Content-Description: " - (mail-encode-encoded-word-string description) "\n")))) - -(defun mml-parameter-string (cont types) - (let ((string "") - value type) - (while (setq type (pop types)) - (when (setq value (cdr (assq type cont))) - ;; Strip directory component from the filename parameter. - (when (eq type 'filename) - (setq value (file-name-nondirectory value))) - (setq string (concat string "; " - (mail-header-encode-parameter - (symbol-name type) value))))) - (when (not (zerop (length string))) - string))) - -(defun mml-insert-parameter-string (cont types) - (let (value type) - (while (setq type (pop types)) - (when (setq value (cdr (assq type cont))) - ;; Strip directory component from the filename parameter. - (when (eq type 'filename) - (setq value (file-name-nondirectory value))) - (mml-insert-parameter - (mail-header-encode-parameter - (symbol-name type) value)))))) - -(eval-when-compile - (defvar ange-ftp-name-format) - (defvar efs-path-regexp)) -(defun mml-parse-file-name (path) - (if (if (boundp 'efs-path-regexp) - (string-match efs-path-regexp path) - (if (boundp 'ange-ftp-name-format) - (string-match (car ange-ftp-name-format) path))) - (list (match-string 1 path) (match-string 2 path) - (substring path (1+ (match-end 2)))) - path)) - -(defun mml-insert-buffer (buffer) - "Insert BUFFER at point and quote any MML markup." - (save-restriction - (narrow-to-region (point) (point)) - (insert-buffer-substring buffer) - (mml-quote-region (point-min) (point-max)) - (goto-char (point-max)))) - -;;; -;;; Transforming MIME to MML -;;; - -(defun mime-to-mml (&optional handles) - "Translate the current buffer (which should be a message) into MML. -If HANDLES is non-nil, use it instead reparsing the buffer." - ;; First decode the head. - (save-restriction - (message-narrow-to-head) - (mail-decode-encoded-word-region (point-min) (point-max))) - (unless handles - (setq handles (mm-dissect-buffer t))) - (goto-char (point-min)) - (search-forward "\n\n" nil t) - (delete-region (point) (point-max)) - (if (stringp (car handles)) - (mml-insert-mime handles) - (mml-insert-mime handles t)) - (mm-destroy-parts handles) - (save-restriction - (message-narrow-to-head) - ;; Remove them, they are confusing. - (message-remove-header "Content-Type") - (message-remove-header "MIME-Version") - (message-remove-header "Content-Transfer-Encoding"))) - -(defun mml-to-mime () - "Translate the current buffer from MML to MIME." - (message-encode-message-body) - (save-restriction - (message-narrow-to-headers-or-head) - (let ((mail-parse-charset message-default-charset)) - (mail-encode-encoded-word-buffer)))) - -(defun mml-insert-mime (handle &optional no-markup) - (let (textp buffer mmlp) - ;; Determine type and stuff. - (unless (stringp (car handle)) - (unless (setq textp (equal (mm-handle-media-supertype handle) "text")) - (save-excursion - (set-buffer (setq buffer (mml-generate-new-buffer " *mml*"))) - (mm-insert-part handle) - (if (setq mmlp (equal (mm-handle-media-type handle) - "message/rfc822")) - (mime-to-mml))))) - (if mmlp - (mml-insert-mml-markup handle nil t t) - (unless (and no-markup - (equal (mm-handle-media-type handle) "text/plain")) - (mml-insert-mml-markup handle buffer textp))) - (cond - (mmlp - (insert-buffer buffer) - (goto-char (point-max)) - (insert "<#/mml>\n")) - ((stringp (car handle)) - (mapcar 'mml-insert-mime (cdr handle)) - (insert "<#/multipart>\n")) - (textp - (let ((charset (mail-content-type-get - (mm-handle-type handle) 'charset))) - (if (eq charset 'gnus-decoded) - (mm-insert-part handle) - (insert (mm-decode-string (mm-get-part handle) charset)))) - (goto-char (point-max))) - (t - (insert "<#/part>\n"))))) - -(defun mml-insert-mml-markup (handle &optional buffer nofile mmlp) - "Take a MIME handle and insert an MML tag." - (if (stringp (car handle)) - (insert "<#multipart type=" (mm-handle-media-subtype handle) - ">\n") - (if mmlp - (insert "<#mml type=" (mm-handle-media-type handle)) - (insert "<#part type=" (mm-handle-media-type handle))) - (dolist (elem (append (cdr (mm-handle-type handle)) - (cdr (mm-handle-disposition handle)))) - (unless (symbolp (cdr elem)) - (insert " " (symbol-name (car elem)) "=\"" (cdr elem) "\""))) - (when (mm-handle-disposition handle) - (insert " disposition=" (car (mm-handle-disposition handle)))) - (when buffer - (insert " buffer=\"" (buffer-name buffer) "\"")) - (when nofile - (insert " nofile=yes")) - (when (mm-handle-description handle) - (insert " description=\"" (mm-handle-description handle) "\"")) - (insert ">\n"))) - -(defun mml-insert-parameter (&rest parameters) - "Insert PARAMETERS in a nice way." - (dolist (param parameters) - (insert ";") - (let ((point (point))) - (insert " " param) - (when (> (current-column) 71) - (goto-char point) - (insert "\n ") - (end-of-line))))) - -;;; -;;; Mode for inserting and editing MML forms -;;; - -(defvar mml-mode-map - (let ((sign (make-sparse-keymap)) - (encrypt (make-sparse-keymap)) - (map (make-sparse-keymap)) - (main (make-sparse-keymap))) - (define-key sign "p" 'mml-secure-sign-pgpmime) - (define-key sign "s" 'mml-secure-sign-smime) - (define-key encrypt "p" 'mml-secure-encrypt-pgpmime) - (define-key encrypt "s" 'mml-secure-encrypt-smime) - (define-key map "f" 'mml-attach-file) - (define-key map "b" 'mml-attach-buffer) - (define-key map "e" 'mml-attach-external) - (define-key map "q" 'mml-quote-region) - (define-key map "m" 'mml-insert-multipart) - (define-key map "p" 'mml-insert-part) - (define-key map "v" 'mml-validate) - (define-key map "P" 'mml-preview) - (define-key map "s" sign) - (define-key map "c" encrypt) - ;;(define-key map "n" 'mml-narrow-to-part) - ;; `M-m' conflicts with `back-to-indentation'. - ;; (define-key main "\M-m" map) - (define-key main "\C-c\C-m" map) - main)) - -(easy-menu-define - mml-menu mml-mode-map "" - '("Attachments" - ["Attach File" mml-attach-file t] - ["Attach Buffer" mml-attach-buffer t] - ["Attach External" mml-attach-external t] - ["Insert Part" mml-insert-part t] - ["Insert Multipart" mml-insert-multipart t] - ["PGP/MIME Sign" mml-secure-sign-pgpmime t] - ["PGP/MIME Encrypt" mml-secure-encrypt-pgpmime t] - ["S/MIME Sign" mml-secure-sign-smime t] - ["S/MIME Encrypt" mml-secure-encrypt-smime t] - ;;["Narrow" mml-narrow-to-part t] - ["Quote MML" mml-quote-region t] - ["Validate MML" mml-validate t] - ["Preview" mml-preview t])) - -(defvar mml-mode nil - "Minor mode for editing MML.") - -(defun mml-mode (&optional arg) - "Minor mode for editing MML. - -\\{mml-mode-map}" - (interactive "P") - (when (set (make-local-variable 'mml-mode) - (if (null arg) (not mml-mode) - (> (prefix-numeric-value arg) 0))) - (gnus-add-minor-mode 'mml-mode " MML" mml-mode-map) - (easy-menu-add mml-menu mml-mode-map) - (run-hooks 'mml-mode-hook))) - -;;; -;;; Helper functions for reading MIME stuff from the minibuffer and -;;; inserting stuff to the buffer. -;;; - -(defun mml-minibuffer-read-file (prompt) - (let ((file (read-file-name prompt nil nil t))) - ;; Prevent some common errors. This is inspired by similar code in - ;; VM. - (when (file-directory-p file) - (error "%s is a directory, cannot attach" file)) - (unless (file-exists-p file) - (error "No such file: %s" file)) - (unless (file-readable-p file) - (error "Permission denied: %s" file)) - file)) - -(defun mml-minibuffer-read-type (name &optional default) - (mailcap-parse-mimetypes) - (let* ((default (or default - (mm-default-file-encoding name) - ;; Perhaps here we should check what the file - ;; looks like, and offer text/plain if it looks - ;; like text/plain. - "application/octet-stream")) - (string (completing-read - (format "Content type (default %s): " default) - (mapcar 'list (mailcap-mime-types))))) - (if (not (equal string "")) - string - default))) - -(defun mml-minibuffer-read-description () - (let ((description (read-string "One line description: "))) - (when (string-match "\\`[ \t]*\\'" description) - (setq description nil)) - description)) - -(defun mml-quote-region (beg end) - "Quote the MML tags in the region." - (interactive "r") - (save-excursion - (save-restriction - ;; Temporarily narrow the region to defend from changes - ;; invalidating END. - (narrow-to-region beg end) - (goto-char (point-min)) - ;; Quote parts. - (while (re-search-forward - "<#!*/?\\(multipart\\|part\\|external\\|mml\\)" nil t) - ;; Insert ! after the #. - (goto-char (+ (match-beginning 0) 2)) - (insert "!"))))) - -(defun mml-insert-tag (name &rest plist) - "Insert an MML tag described by NAME and PLIST." - (when (symbolp name) - (setq name (symbol-name name))) - (insert "<#" name) - (while plist - (let ((key (pop plist)) - (value (pop plist))) - (when value - ;; Quote VALUE if it contains suspicious characters. - (when (string-match "[\"'\\~/*;() \t\n]" value) - (setq value (prin1-to-string value))) - (insert (format " %s=%s" key value))))) - (insert ">\n")) - -(defun mml-insert-empty-tag (name &rest plist) - "Insert an empty MML tag described by NAME and PLIST." - (when (symbolp name) - (setq name (symbol-name name))) - (apply #'mml-insert-tag name plist) - (insert "<#/" name ">\n")) - -;;; Attachment functions. - -(defun mml-attach-file (file &optional type description) - "Attach a file to the outgoing MIME message. -The file is not inserted or encoded until you send the message with -`\\[message-send-and-exit]' or `\\[message-send]'. - -FILE is the name of the file to attach. TYPE is its content-type, a -string of the form \"type/subtype\". DESCRIPTION is a one-line -description of the attachment." - (interactive - (let* ((file (mml-minibuffer-read-file "Attach file: ")) - (type (mml-minibuffer-read-type file)) - (description (mml-minibuffer-read-description))) - (list file type description))) - (mml-insert-empty-tag 'part 'type type 'filename file - 'disposition "attachment" 'description description)) - -(defun mml-attach-buffer (buffer &optional type description) - "Attach a buffer to the outgoing MIME message. -See `mml-attach-file' for details of operation." - (interactive - (let* ((buffer (read-buffer "Attach buffer: ")) - (type (mml-minibuffer-read-type buffer "text/plain")) - (description (mml-minibuffer-read-description))) - (list buffer type description))) - (mml-insert-empty-tag 'part 'type type 'buffer buffer - 'disposition "attachment" 'description description)) - -(defun mml-attach-external (file &optional type description) - "Attach an external file into the buffer. -FILE is an ange-ftp/efs specification of the part location. -TYPE is the MIME type to use." - (interactive - (let* ((file (mml-minibuffer-read-file "Attach external file: ")) - (type (mml-minibuffer-read-type file)) - (description (mml-minibuffer-read-description))) - (list file type description))) - (mml-insert-empty-tag 'external 'type type 'name file - 'disposition "attachment" 'description description)) - -(defun mml-insert-multipart (&optional type) - (interactive (list (completing-read "Multipart type (default mixed): " - '(("mixed") ("alternative") ("digest") ("parallel") - ("signed") ("encrypted")) - nil nil "mixed"))) - (or type - (setq type "mixed")) - (mml-insert-empty-tag "multipart" 'type type) - (forward-line -1)) - -(defun mml-insert-part (&optional type) - (interactive - (list (mml-minibuffer-read-type ""))) - (mml-insert-tag 'part 'type type 'disposition "inline") - (forward-line -1)) - -(defun mml-preview (&optional raw) - "Display current buffer with Gnus, in a new buffer. -If RAW, don't highlight the article." - (interactive "P") - (let ((buf (current-buffer)) - (message-options message-options) - (message-posting-charset (or (gnus-setup-posting-charset - (save-restriction - (message-narrow-to-headers-or-head) - (message-fetch-field "Newsgroups"))) - message-posting-charset))) - (message-options-set-recipient) - (switch-to-buffer (generate-new-buffer - (concat (if raw "*Raw MIME preview of " - "*MIME preview of ") (buffer-name)))) - (erase-buffer) - (insert-buffer buf) - (if (re-search-forward - (concat "^" (regexp-quote mail-header-separator) "\n") nil t) - (replace-match "\n")) - (mml-to-mime) - (if raw - (when (fboundp 'set-buffer-multibyte) - (let ((s (buffer-string))) - ;; Insert the content into unibyte buffer. - (erase-buffer) - (mm-disable-multibyte) - (insert s))) - (let ((gnus-newsgroup-charset (car message-posting-charset))) - (run-hooks 'gnus-article-decode-hook) - (let ((gnus-newsgroup-name "dummy")) - (gnus-article-prepare-display)))) - ;; Disable article-mode-map. - (use-local-map nil) - (setq buffer-read-only t) - (local-set-key "q" (lambda () (interactive) (kill-buffer nil))) - (goto-char (point-min)))) - -(defun mml-validate () - "Validate the current MML document." - (interactive) - (mml-parse)) - -(defun mml-tweak-part (cont) - "Tweak a MML part." - (let ((tweak (cdr (assq 'tweak cont))) - func) - (cond - (tweak - (setq func - (or (cdr (assoc tweak mml-tweak-function-alist)) - (intern tweak)))) - (mml-tweak-type-alist - (let ((alist mml-tweak-type-alist) - (type (or (cdr (assq 'type cont)) "text/plain"))) - (while alist - (if (string-match (caar alist) type) - (setq func (cdar alist) - alist nil) - (setq alist (cdr alist))))))) - (if func - (funcall func cont) - cont))) - -(provide 'mml) - -;;; mml.el ends here diff --git a/lisp/mml2015.el b/lisp/mml2015.el deleted file mode 100644 index a16a4e5..0000000 --- a/lisp/mml2015.el +++ /dev/null @@ -1,643 +0,0 @@ -;;; mml2015.el --- MIME Security with Pretty Good Privacy (PGP) -;; Copyright (C) 2000, 2001 Free Software Foundation, Inc. - -;; Author: Shenghuo Zhu -;; Keywords: PGP MIME MML - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) -(eval-when-compile (require 'gnus-clfns)) -(require 'mm-decode) - -(defvar mml2015-use (or - (progn - (ignore-errors - (require 'gpg)) - (and (fboundp 'gpg-sign-detached) - 'gpg)) - (progn (ignore-errors - (load "mc-toplev")) - (and (fboundp 'mc-encrypt-generic) - (fboundp 'mc-sign-generic) - (fboundp 'mc-cleanup-recipient-headers) - 'mailcrypt))) - "The package used for PGP/MIME.") - -;; Something is not RFC2015. -(defvar mml2015-function-alist - '((mailcrypt mml2015-mailcrypt-sign - mml2015-mailcrypt-encrypt - mml2015-mailcrypt-verify - mml2015-mailcrypt-decrypt - mml2015-mailcrypt-clear-verify - mml2015-mailcrypt-clear-decrypt) - (gpg mml2015-gpg-sign - mml2015-gpg-encrypt - mml2015-gpg-verify - mml2015-gpg-decrypt - mml2015-gpg-clear-verify - mml2015-gpg-clear-decrypt)) - "Alist of PGP/MIME functions.") - -(defvar mml2015-result-buffer nil) - -(defvar mml2015-trust-boundaries-alist - '((trust-undefined . nil) - (trust-none . nil) - (trust-marginal . t) - (trust-full . t) - (trust-ultimate . t)) - "Trust boundaries for a signer's GnuPG key. -This alist contains pairs of the form (trust-symbol . boolean), with -symbols that are contained in `gpg-unabbrev-trust-alist'. The boolean -specifies whether the given trust value is good enough to be trusted -by you.") - -;;; mailcrypt wrapper - -(eval-and-compile - (autoload 'mailcrypt-decrypt "mailcrypt") - (autoload 'mailcrypt-verify "mailcrypt") - (autoload 'mc-pgp-always-sign "mailcrypt") - (autoload 'mc-encrypt-generic "mc-toplev") - (autoload 'mc-cleanup-recipient-headers "mc-toplev") - (autoload 'mc-sign-generic "mc-toplev")) - -(eval-when-compile - (defvar mc-default-scheme) - (defvar mc-schemes)) - -(defvar mml2015-decrypt-function 'mailcrypt-decrypt) -(defvar mml2015-verify-function 'mailcrypt-verify) - -(defun mml2015-format-error (err) - (if (stringp (cadr err)) - (cadr err) - (format "%S" (cdr err)))) - -(defun mml2015-mailcrypt-decrypt (handle ctl) - (catch 'error - (let (child handles result) - (unless (setq child (mm-find-part-by-type - (cdr handle) - "application/octet-stream" nil t)) - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-info "Corrupted") - (throw 'error handle)) - (with-temp-buffer - (mm-insert-part child) - (setq result - (condition-case err - (funcall mml2015-decrypt-function) - (error - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-details (mml2015-format-error err)) - nil) - (quit - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-details "Quit.") - nil))) - (unless (car result) - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-info "Failed") - (throw 'error handle)) - (setq handles (mm-dissect-buffer t))) - (mm-destroy-parts handle) - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-info "OK") - (if (listp (car handles)) - handles - (list handles))))) - -(defun mml2015-mailcrypt-clear-decrypt () - (let (result) - (setq result - (condition-case err - (funcall mml2015-decrypt-function) - (error - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-details (mml2015-format-error err)) - nil) - (quit - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-details "Quit.") - nil))) - (if (car result) - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-info "OK") - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-info "Failed")))) - -(defun mml2015-fix-micalg (alg) - (and alg - (upcase (if (string-match "^pgp-" alg) - (substring alg (match-end 0)) - alg)))) - -(defun mml2015-mailcrypt-verify (handle ctl) - (catch 'error - (let (part) - (unless (setq part (mm-find-raw-part-by-type - ctl (or (mm-handle-multipart-ctl-parameter - ctl 'protocol) - "application/pgp-signature") - t)) - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-info "Corrupted") - (throw 'error handle)) - (with-temp-buffer - (insert "-----BEGIN PGP SIGNED MESSAGE-----\n") - (insert (format "Hash: %s\n\n" - (or (mml2015-fix-micalg - (mm-handle-multipart-ctl-parameter - ctl 'micalg)) - "SHA1"))) - (save-restriction - (narrow-to-region (point) (point)) - (insert part "\n") - (goto-char (point-min)) - (while (not (eobp)) - (if (looking-at "^-") - (insert "- ")) - (forward-line))) - (unless (setq part (mm-find-part-by-type - (cdr handle) "application/pgp-signature" nil t)) - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-info "Corrupted") - (throw 'error handle)) - (save-restriction - (narrow-to-region (point) (point)) - (mm-insert-part part) - (goto-char (point-min)) - (if (re-search-forward "^-----BEGIN PGP [^-]+-----\r?$" nil t) - (replace-match "-----BEGIN PGP SIGNATURE-----" t t)) - (if (re-search-forward "^-----END PGP [^-]+-----\r?$" nil t) - (replace-match "-----END PGP SIGNATURE-----" t t))) - (let ((mc-gpg-debug-buffer (get-buffer-create " *gnus gpg debug*"))) - (unless (condition-case err - (prog1 - (funcall mml2015-verify-function) - (if (get-buffer " *mailcrypt stderr temp") - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-details - (with-current-buffer " *mailcrypt stderr temp" - (buffer-string)))) - (if (get-buffer " *mailcrypt stdout temp") - (kill-buffer " *mailcrypt stdout temp")) - (if (get-buffer " *mailcrypt stderr temp") - (kill-buffer " *mailcrypt stderr temp")) - (if (get-buffer " *mailcrypt status temp") - (kill-buffer " *mailcrypt status temp")) - (if (get-buffer mc-gpg-debug-buffer) - (kill-buffer mc-gpg-debug-buffer))) - (error - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-details (mml2015-format-error err)) - nil) - (quit - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-details "Quit.") - nil)) - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-info "Failed") - (throw 'error handle)))) - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-info "OK") - handle))) - -(defun mml2015-mailcrypt-clear-verify () - (let ((mc-gpg-debug-buffer (get-buffer-create " *gnus gpg debug*"))) - (if (condition-case err - (prog1 - (funcall mml2015-verify-function) - (if (get-buffer " *mailcrypt stderr temp") - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-details - (with-current-buffer " *mailcrypt stderr temp" - (buffer-string)))) - (if (get-buffer " *mailcrypt stdout temp") - (kill-buffer " *mailcrypt stdout temp")) - (if (get-buffer " *mailcrypt stderr temp") - (kill-buffer " *mailcrypt stderr temp")) - (if (get-buffer " *mailcrypt status temp") - (kill-buffer " *mailcrypt status temp")) - (if (get-buffer mc-gpg-debug-buffer) - (kill-buffer mc-gpg-debug-buffer))) - (error - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-details (mml2015-format-error err)) - nil) - (quit - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-details "Quit.") - nil)) - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-info "OK") - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-info "Failed")))) - -(defun mml2015-mailcrypt-sign (cont) - (mc-sign-generic (message-options-get 'message-sender) - nil nil nil nil) - (let ((boundary - (funcall mml-boundary-function (incf mml-multipart-number))) - hash point) - (goto-char (point-min)) - (unless (re-search-forward "^-----BEGIN PGP SIGNED MESSAGE-----\r?$" nil t) - (error "Cannot find signed begin line")) - (goto-char (match-beginning 0)) - (forward-line 1) - (unless (looking-at "Hash:[ \t]*\\([a-zA-Z0-9]+\\)") - (error "Cannot not find PGP hash")) - (setq hash (match-string 1)) - (unless (re-search-forward "^$" nil t) - (error "Cannot not find PGP message")) - (forward-line 1) - (delete-region (point-min) (point)) - (insert (format "Content-Type: multipart/signed; boundary=\"%s\";\n" - boundary)) - (insert (format "\tmicalg=pgp-%s; protocol=\"application/pgp-signature\"\n" - (downcase hash))) - (insert (format "\n--%s\n" boundary)) - (setq point (point)) - (goto-char (point-max)) - (unless (re-search-backward "^-----END PGP SIGNATURE-----\r?$" nil t) - (error "Cannot find signature part")) - (replace-match "-----END PGP MESSAGE-----" t t) - (goto-char (match-beginning 0)) - (unless (re-search-backward "^-----BEGIN PGP SIGNATURE-----\r?$" - nil t) - (error "Cannot find signature part")) - (replace-match "-----BEGIN PGP MESSAGE-----" t t) - (goto-char (match-beginning 0)) - (save-restriction - (narrow-to-region point (point)) - (goto-char point) - (while (re-search-forward "^- -" nil t) - (replace-match "-" t t)) - (goto-char (point-max))) - (insert (format "--%s\n" boundary)) - (insert "Content-Type: application/pgp-signature\n\n") - (goto-char (point-max)) - (insert (format "--%s--\n" boundary)) - (goto-char (point-max)))) - -(defun mml2015-mailcrypt-encrypt (cont) - (let ((mc-pgp-always-sign - (or mc-pgp-always-sign - (eq t (or (message-options-get 'message-sign-encrypt) - (message-options-set - 'message-sign-encrypt - (or (y-or-n-p "Sign the message? ") - 'not)))) - 'never))) - (mm-with-unibyte-current-buffer-mule4 - (mc-encrypt-generic - (or (message-options-get 'message-recipients) - (message-options-set 'message-recipients - (mc-cleanup-recipient-headers - (read-string "Recipients: ")))) - nil nil nil - (message-options-get 'message-sender)))) - (goto-char (point-min)) - (unless (looking-at "-----BEGIN PGP MESSAGE-----") - (error "Fail to encrypt the message")) - (let ((boundary - (funcall mml-boundary-function (incf mml-multipart-number)))) - (insert (format "Content-Type: multipart/encrypted; boundary=\"%s\";\n" - boundary)) - (insert "\tprotocol=\"application/pgp-encrypted\"\n\n") - (insert (format "--%s\n" boundary)) - (insert "Content-Type: application/pgp-encrypted\n\n") - (insert "Version: 1\n\n") - (insert (format "--%s\n" boundary)) - (insert "Content-Type: application/octet-stream\n\n") - (goto-char (point-max)) - (insert (format "--%s--\n" boundary)) - (goto-char (point-max)))) - -;;; gpg wrapper - -(eval-and-compile - (autoload 'gpg-decrypt "gpg") - (autoload 'gpg-verify "gpg") - (autoload 'gpg-verify-cleartext "gpg") - (autoload 'gpg-sign-detached "gpg") - (autoload 'gpg-sign-encrypt "gpg") - (autoload 'gpg-passphrase-read "gpg")) - -(defun mml2015-gpg-passphrase () - (or (message-options-get 'gpg-passphrase) - (message-options-set 'gpg-passphrase (gpg-passphrase-read)))) - -(defun mml2015-gpg-decrypt-1 () - (let ((cipher (current-buffer)) plain result) - (if (with-temp-buffer - (prog1 - (gpg-decrypt cipher (setq plain (current-buffer)) - mml2015-result-buffer nil) - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-details - (with-current-buffer mml2015-result-buffer - (buffer-string))) - (set-buffer cipher) - (erase-buffer) - (insert-buffer plain))) - '(t) - ;; Some wrong with the return value, check plain text buffer. - (if (> (point-max) (point-min)) - '(t) - nil)))) - -(defun mml2015-gpg-decrypt (handle ctl) - (let ((mml2015-decrypt-function 'mml2015-gpg-decrypt-1)) - (mml2015-mailcrypt-decrypt handle ctl))) - -(defun mml2015-gpg-clear-decrypt () - (let (result) - (setq result (mml2015-gpg-decrypt-1)) - (if (car result) - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-info "OK") - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-info "Failed")))) - -(defun mml2015-gpg-pretty-print-fpr (fingerprint) - (let* ((result "") - (fpr-length (string-width fingerprint)) - (n-slice 0) - slice) - (setq fingerprint (string-to-list fingerprint)) - (while fingerprint - (setq fpr-length (- fpr-length 4)) - (setq slice (butlast fingerprint fpr-length)) - (setq fingerprint (nthcdr 4 fingerprint)) - (setq n-slice (1+ n-slice)) - (setq result - (concat - result - (case n-slice - (1 slice) - (otherwise (concat " " slice)))))) - result)) - -(defun mml2015-gpg-extract-signature-details () - (goto-char (point-min)) - (if (boundp 'gpg-unabbrev-trust-alist) - (let* ((signer (and (re-search-forward - "^\\[GNUPG:\\] GOODSIG [0-9A-Za-z]* \\(.*\\)$" - nil t) - (match-string 1))) - (fprint (and (re-search-forward - "^\\[GNUPG:\\] VALIDSIG \\([0-9a-zA-Z]*\\) " - nil t) - (match-string 1))) - (trust (and (re-search-forward "^\\[GNUPG:\\] \\(TRUST_.*\\)$" nil t) - (match-string 1))) - (trust-good-enough-p - (cdr (assoc (cdr (assoc trust gpg-unabbrev-trust-alist)) - mml2015-trust-boundaries-alist)))) - (if (and signer trust fprint) - (concat signer - (unless trust-good-enough-p - (concat "\nUntrusted, Fingerprint: " - (mml2015-gpg-pretty-print-fpr fprint)))) - "From unknown user")) - (if (re-search-forward "^gpg: Good signature from \"\\(.*\\)\"$" nil t) - (match-string 1) - "From unknown user"))) - -(defun mml2015-gpg-verify (handle ctl) - (catch 'error - (let (part message signature info-is-set-p) - (unless (setq part (mm-find-raw-part-by-type - ctl (or (mm-handle-multipart-ctl-parameter - ctl 'protocol) - "application/pgp-signature") - t)) - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-info "Corrupted") - (throw 'error handle)) - (with-temp-buffer - (setq message (current-buffer)) - (insert part) - (with-temp-buffer - (setq signature (current-buffer)) - (unless (setq part (mm-find-part-by-type - (cdr handle) "application/pgp-signature" nil t)) - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-info "Corrupted") - (throw 'error handle)) - (mm-insert-part part) - (unless (condition-case err - (prog1 - (gpg-verify message signature mml2015-result-buffer) - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-details - (with-current-buffer mml2015-result-buffer - (buffer-string)))) - (error - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-details (mml2015-format-error err)) - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-info "Error.") - (setq info-is-set-p t) - nil) - (quit - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-details "Quit.") - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-info "Quit.") - (setq info-is-set-p t) - nil)) - (unless info-is-set-p - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-info "Failed")) - (throw 'error handle))) - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-info - (with-current-buffer mml2015-result-buffer - (mml2015-gpg-extract-signature-details)))) - handle))) - -(defun mml2015-gpg-clear-verify () - (if (condition-case err - (prog1 - (gpg-verify-cleartext (current-buffer) mml2015-result-buffer) - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-details - (with-current-buffer mml2015-result-buffer - (buffer-string)))) - (error - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-details (mml2015-format-error err)) - nil) - (quit - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-details "Quit.") - nil)) - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-info - (with-current-buffer mml2015-result-buffer - (mml2015-gpg-extract-signature-details))) - (mm-set-handle-multipart-parameter - mm-security-handle 'gnus-info "Failed"))) - -(defun mml2015-gpg-sign (cont) - (let ((boundary - (funcall mml-boundary-function (incf mml-multipart-number))) - (text (current-buffer)) signature) - (goto-char (point-max)) - (unless (bolp) - (insert "\n")) - (with-temp-buffer - (unless (gpg-sign-detached text (setq signature (current-buffer)) - mml2015-result-buffer - nil - (message-options-get 'message-sender) - t t) ; armor & textmode - (unless (> (point-max) (point-min)) - (pop-to-buffer mml2015-result-buffer) - (error "Sign error"))) - (goto-char (point-min)) - (while (re-search-forward "\r+$" nil t) - (replace-match "" t t)) - (set-buffer text) - (goto-char (point-min)) - (insert (format "Content-Type: multipart/signed; boundary=\"%s\";\n" - boundary)) - ;;; FIXME: what is the micalg? - (insert "\tmicalg=pgp-sha1; protocol=\"application/pgp-signature\"\n") - (insert (format "\n--%s\n" boundary)) - (goto-char (point-max)) - (insert (format "\n--%s\n" boundary)) - (insert "Content-Type: application/pgp-signature\n\n") - (insert-buffer signature) - (goto-char (point-max)) - (insert (format "--%s--\n" boundary)) - (goto-char (point-max))))) - -(defun mml2015-gpg-encrypt (cont) - (let ((boundary - (funcall mml-boundary-function (incf mml-multipart-number))) - (text (current-buffer)) - cipher) - (mm-with-unibyte-current-buffer-mule4 - (with-temp-buffer - (unless (gpg-sign-encrypt - text (setq cipher (current-buffer)) - mml2015-result-buffer - (split-string - (or - (message-options-get 'message-recipients) - (message-options-set 'message-recipients - (read-string "Recipients: "))) - "[ \f\t\n\r\v,]+") - nil - (message-options-get 'message-sender) - t t) ; armor & textmode - (unless (> (point-max) (point-min)) - (pop-to-buffer mml2015-result-buffer) - (error "Encrypt error"))) - (goto-char (point-min)) - (while (re-search-forward "\r+$" nil t) - (replace-match "" t t)) - (set-buffer text) - (delete-region (point-min) (point-max)) - (insert (format "Content-Type: multipart/encrypted; boundary=\"%s\";\n" - boundary)) - (insert "\tprotocol=\"application/pgp-encrypted\"\n\n") - (insert (format "--%s\n" boundary)) - (insert "Content-Type: application/pgp-encrypted\n\n") - (insert "Version: 1\n\n") - (insert (format "--%s\n" boundary)) - (insert "Content-Type: application/octet-stream\n\n") - (insert-buffer cipher) - (goto-char (point-max)) - (insert (format "--%s--\n" boundary)) - (goto-char (point-max)))))) - -;;; General wrapper - -(defun mml2015-clean-buffer () - (if (gnus-buffer-live-p mml2015-result-buffer) - (with-current-buffer mml2015-result-buffer - (erase-buffer) - t) - (setq mml2015-result-buffer - (gnus-get-buffer-create "*MML2015 Result*")) - nil)) - -(defsubst mml2015-clear-decrypt-function () - (nth 6 (assq mml2015-use mml2015-function-alist))) - -(defsubst mml2015-clear-verify-function () - (nth 5 (assq mml2015-use mml2015-function-alist))) - -;;;###autoload -(defun mml2015-decrypt (handle ctl) - (mml2015-clean-buffer) - (let ((func (nth 4 (assq mml2015-use mml2015-function-alist)))) - (if func - (funcall func handle ctl) - handle))) - -;;;###autoload -(defun mml2015-decrypt-test (handle ctl) - mml2015-use) - -;;;###autoload -(defun mml2015-verify (handle ctl) - (mml2015-clean-buffer) - (let ((func (nth 3 (assq mml2015-use mml2015-function-alist)))) - (if func - (funcall func handle ctl) - handle))) - -;;;###autoload -(defun mml2015-verify-test (handle ctl) - mml2015-use) - -;;;###autoload -(defun mml2015-encrypt (cont) - (mml2015-clean-buffer) - (let ((func (nth 2 (assq mml2015-use mml2015-function-alist)))) - (if func - (funcall func cont) - (error "Cannot find encrypt function")))) - -;;;###autoload -(defun mml2015-sign (cont) - (mml2015-clean-buffer) - (let ((func (nth 1 (assq mml2015-use mml2015-function-alist)))) - (if func - (funcall func cont) - (error "Cannot find sign function")))) - -;;;###autoload -(defun mml2015-self-encrypt () - (mml2015-encrypt nil)) - -(provide 'mml2015) - -;;; mml2015.el ends here diff --git a/lisp/nnagent.el b/lisp/nnagent.el deleted file mode 100644 index 60c26cc..0000000 --- a/lisp/nnagent.el +++ /dev/null @@ -1,208 +0,0 @@ -;;; nnagent.el --- offline backend for Gnus -;; Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Keywords: news, mail - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; Code: - -(require 'nnheader) -(require 'nnoo) -(eval-when-compile (require 'cl)) -(require 'gnus-agent) -(require 'nnml) - -(nnoo-declare nnagent - nnml) - - - -(defconst nnagent-version "nnagent 1.0") - -(defvoo nnagent-directory nil - "Internal variable." - nnml-directory) - -(defvoo nnagent-active-file nil - "Internal variable." - nnml-active-file) - -(defvoo nnagent-newsgroups-file nil - "Internal variable." - nnml-newsgroups-file) - -(defvoo nnagent-get-new-mail nil - "Internal variable." - nnml-get-new-mail) - -;;; Interface functions. - -(nnoo-define-basics nnagent) - -(defun nnagent-server (server) - (and server (format "%s+%s" (car gnus-command-method) server))) - -(deffoo nnagent-open-server (server &optional defs) - (setq defs - `((nnagent-directory ,(gnus-agent-directory)) - (nnagent-active-file ,(gnus-agent-lib-file "active")) - (nnagent-newsgroups-file ,(gnus-agent-lib-file "newsgroups")) - (nnagent-get-new-mail nil))) - (nnoo-change-server 'nnagent - (nnagent-server server) - defs) - (let ((dir (gnus-agent-directory)) - err) - (cond - ((not (condition-case arg - (file-exists-p dir) - (ftp-error (setq err (format "%s" arg))))) - (nnagent-close-server) - (nnheader-report - 'nnagent (or err - (format "No such file or directory: %s" dir)))) - ((not (file-directory-p (file-truename dir))) - (nnagent-close-server) - (nnheader-report 'nnagent "Not a directory: %s" dir)) - (t - (nnheader-report 'nnagent "Opened server %s using directory %s" - server dir) - t)))) - -(deffoo nnagent-retrieve-groups (groups &optional server) - (save-excursion - (cond - ((file-exists-p (gnus-agent-lib-file "groups")) - (nnmail-find-file (gnus-agent-lib-file "groups")) - 'groups) - ((file-exists-p (gnus-agent-lib-file "active")) - (nnmail-find-file (gnus-agent-lib-file "active")) - 'active) - (t nil)))) - -(defun nnagent-request-type (group article) - (unless (stringp article) - (let ((gnus-plugged t)) - (if (not (gnus-check-backend-function - 'request-type (car gnus-command-method))) - 'unknown - (funcall (gnus-get-function gnus-command-method 'request-type) - (gnus-group-real-name group) article))))) - -(deffoo nnagent-request-newgroups (date server) - nil) - -(deffoo nnagent-request-update-info (group info &optional server) - nil) - -(deffoo nnagent-request-post (&optional server) - (gnus-agent-insert-meta-information 'news gnus-command-method) - (gnus-request-accept-article "nndraft:queue" nil t t)) - -(deffoo nnagent-request-set-mark (group action server) - (with-temp-buffer - (insert (format "(%s-request-set-mark \"%s\" '%s \"%s\")\n" - (nth 0 gnus-command-method) group action - (or server (nth 1 gnus-command-method)))) - (append-to-file (point-min) (point-max) (gnus-agent-lib-file "flags"))) - nil) - -(deffoo nnagent-request-group (group &optional server dont-check) - (nnoo-parent-function 'nnagent 'nnml-request-group - (list group (nnagent-server server) dont-check))) - -(deffoo nnagent-close-group (group &optional server) - (nnoo-parent-function 'nnagent 'nnml-close-group - (list group (nnagent-server server)))) - -(deffoo nnagent-request-accept-article (group &optional server last) - (nnoo-parent-function 'nnagent 'nnml-request-accept-article - (list group (nnagent-server server) last))) - -(deffoo nnagent-request-article (id &optional group server buffer) - (nnoo-parent-function 'nnagent 'nnml-request-article - (list id group (nnagent-server server) buffer))) - -(deffoo nnagent-request-create-group (group &optional server args) - (nnoo-parent-function 'nnagent 'nnml-request-create-group - (list group (nnagent-server server) args))) - -(deffoo nnagent-request-delete-group (group &optional force server) - (nnoo-parent-function 'nnagent 'nnml-request-delete-group - (list group force (nnagent-server server)))) - -(deffoo nnagent-request-expire-articles (articles group &optional server force) - (nnoo-parent-function 'nnagent 'nnml-request-expire-articles - (list articles group (nnagent-server server) force))) - -(deffoo nnagent-request-list (&optional server) - (nnoo-parent-function 'nnagent 'nnml-request-list - (list (nnagent-server server)))) - -(deffoo nnagent-request-list-newsgroups (&optional server) - (nnoo-parent-function 'nnagent 'nnml-request-list-newsgroups - (list (nnagent-server server)))) - -(deffoo nnagent-request-move-article - (article group server accept-form &optional last) - (nnoo-parent-function 'nnagent 'nnml-request-move-article - (list article group (nnagent-server server) - accept-form last))) - -(deffoo nnagent-request-rename-group (group new-name &optional server) - (nnoo-parent-function 'nnagent 'nnml-request-rename-group - (list group new-name (nnagent-server server)))) - -(deffoo nnagent-request-scan (&optional group server) - (nnoo-parent-function 'nnagent 'nnml-request-scan - (list group (nnagent-server server)))) - -(deffoo nnagent-retrieve-headers (sequence &optional group server fetch-old) - (nnoo-parent-function 'nnagent 'nnml-retrieve-headers - (list sequence group (nnagent-server server) fetch-old))) - -(deffoo nnagent-set-status (article name value &optional group server) - (nnoo-parent-function 'nnagent 'nnml-set-status - (list article name value group (nnagent-server server)))) - -(deffoo nnagent-server-opened (&optional server) - (nnoo-parent-function 'nnagent 'nnml-server-opened - (list (nnagent-server server)))) - -(deffoo nnagent-status-message (&optional server) - (nnoo-parent-function 'nnagent 'nnml-status-message - (list (nnagent-server server)))) - -(deffoo nnagent-request-regenerate (server) - (nnoo-parent-function 'nnagent 'nnml-request-regenerate - (list (nnagent-server server)))) - -;; Use nnml functions for just about everything. -(nnoo-import nnagent - (nnml)) - - -;;; Internal functions. - -(provide 'nnagent) - -;;; nnagent.el ends here diff --git a/lisp/nnbabyl.el b/lisp/nnbabyl.el deleted file mode 100644 index 6e4f883..0000000 --- a/lisp/nnbabyl.el +++ /dev/null @@ -1,673 +0,0 @@ -;;; nnbabyl.el --- rmail mbox access for Gnus - -;; Copyright (C) 1995, 1996, 1997, 1998, 1099, 2000 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Masanobu UMEDA -;; Keywords: news, mail - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;; For an overview of what the interface functions do, please see the -;; Gnus sources. - -;;; Code: - -(eval-when-compile (require 'cl)) - -(require 'nnheader) -(condition-case nil - (require 'rmail) - (t (nnheader-message - 5 "Ignore rmail errors from this file, you don't have rmail"))) -(require 'nnmail) -(require 'nnoo) - -(nnoo-declare nnbabyl) - -(defvoo nnbabyl-mbox-file (expand-file-name "~/RMAIL") - "The name of the rmail box file in the users home directory. - -This variable is a virtual server slot. See the Gnus manual for details.") - -(defvoo nnbabyl-active-file (expand-file-name "~/.rmail-active") - "The name of the active file for the rmail box. - -This variable is a virtual server slot. See the Gnus manual for details.") - -(defvoo nnbabyl-get-new-mail t - "If non-nil, nnbabyl will check the incoming mail file and split the mail. - -This variable is a virtual server slot. See the Gnus manual for details.") - - -(defvoo nnbabyl-prepare-save-mail-hook nil - "Hook run narrowed to an article before saving. - -This variable is a virtual server slot. See the Gnus manual for details.") - - - -(defvar nnbabyl-mail-delimiter "\^_") - -(defconst nnbabyl-version "nnbabyl 1.0" - "nnbabyl version.") - -(defvoo nnbabyl-mbox-buffer nil) -(defvoo nnbabyl-current-group nil) -(defvoo nnbabyl-status-string "") -(defvoo nnbabyl-group-alist nil) -(defvoo nnbabyl-active-timestamp nil) - -(defvoo nnbabyl-previous-buffer-mode nil) - -(eval-and-compile - (autoload 'gnus-set-text-properties "gnus-ems")) - - - -;;; Interface functions - -(nnoo-define-basics nnbabyl) - -(deffoo nnbabyl-retrieve-headers (articles &optional group server fetch-old) - (save-excursion - (set-buffer nntp-server-buffer) - (erase-buffer) - (let ((number (length articles)) - (count 0) - (delim (concat "^" nnbabyl-mail-delimiter)) - article art-string start stop) - (nnbabyl-possibly-change-newsgroup group server) - (while (setq article (pop articles)) - (setq art-string (nnbabyl-article-string article)) - (set-buffer nnbabyl-mbox-buffer) - (end-of-line) - (when (or (search-forward art-string nil t) - (search-backward art-string nil t)) - (unless (re-search-backward delim nil t) - (goto-char (point-min))) - (while (and (not (looking-at ".+:")) - (zerop (forward-line 1)))) - (setq start (point)) - (search-forward "\n\n" nil t) - (setq stop (1- (point))) - (set-buffer nntp-server-buffer) - (insert "221 ") - (princ article (current-buffer)) - (insert " Article retrieved.\n") - (insert-buffer-substring nnbabyl-mbox-buffer start stop) - (goto-char (point-max)) - (insert ".\n")) - (and (numberp nnmail-large-newsgroup) - (> number nnmail-large-newsgroup) - (zerop (% (incf count) 20)) - (nnheader-message 5 "nnbabyl: Receiving headers... %d%%" - (/ (* count 100) number)))) - - (and (numberp nnmail-large-newsgroup) - (> number nnmail-large-newsgroup) - (nnheader-message 5 "nnbabyl: Receiving headers...done")) - - (set-buffer nntp-server-buffer) - (nnheader-fold-continuation-lines) - 'headers))) - -(deffoo nnbabyl-open-server (server &optional defs) - (nnoo-change-server 'nnbabyl server defs) - (nnbabyl-create-mbox) - (cond - ((not (file-exists-p nnbabyl-mbox-file)) - (nnbabyl-close-server) - (nnheader-report 'nnbabyl "No such file: %s" nnbabyl-mbox-file)) - ((file-directory-p nnbabyl-mbox-file) - (nnbabyl-close-server) - (nnheader-report 'nnbabyl "Not a regular file: %s" nnbabyl-mbox-file)) - (t - (nnheader-report 'nnbabyl "Opened server %s using mbox %s" server - nnbabyl-mbox-file) - t))) - -(deffoo nnbabyl-close-server (&optional server) - ;; Restore buffer mode. - (when (and (nnbabyl-server-opened) - nnbabyl-previous-buffer-mode) - (save-excursion - (set-buffer nnbabyl-mbox-buffer) - (narrow-to-region - (caar nnbabyl-previous-buffer-mode) - (cdar nnbabyl-previous-buffer-mode)) - (funcall (cdr nnbabyl-previous-buffer-mode)))) - (nnoo-close-server 'nnbabyl server) - (setq nnbabyl-mbox-buffer nil) - t) - -(deffoo nnbabyl-server-opened (&optional server) - (and (nnoo-current-server-p 'nnbabyl server) - nnbabyl-mbox-buffer - (buffer-name nnbabyl-mbox-buffer) - nntp-server-buffer - (buffer-name nntp-server-buffer))) - -(deffoo nnbabyl-request-article (article &optional newsgroup server buffer) - (nnbabyl-possibly-change-newsgroup newsgroup server) - (save-excursion - (set-buffer nnbabyl-mbox-buffer) - (goto-char (point-min)) - (when (search-forward (nnbabyl-article-string article) nil t) - (let (start stop summary-line) - (unless (re-search-backward (concat "^" nnbabyl-mail-delimiter) nil t) - (goto-char (point-min)) - (end-of-line)) - (while (and (not (looking-at ".+:")) - (zerop (forward-line 1)))) - (setq start (point)) - (or (when (re-search-forward - (concat "^" nnbabyl-mail-delimiter) nil t) - (beginning-of-line) - t) - (goto-char (point-max))) - (setq stop (point)) - (let ((nntp-server-buffer (or buffer nntp-server-buffer))) - (set-buffer nntp-server-buffer) - (erase-buffer) - (insert-buffer-substring nnbabyl-mbox-buffer start stop) - (goto-char (point-min)) - ;; If there is an EOOH header, then we have to remove some - ;; duplicated headers. - (setq summary-line (looking-at "Summary-line:")) - (when (search-forward "\n*** EOOH ***" nil t) - (if summary-line - ;; The headers to be deleted are located before the - ;; EOOH line... - (delete-region (point-min) (progn (forward-line 1) - (point))) - ;; ...or after. - (delete-region (progn (beginning-of-line) (point)) - (or (search-forward "\n\n" nil t) - (point))))) - (if (numberp article) - (cons nnbabyl-current-group article) - (nnbabyl-article-group-number))))))) - -(deffoo nnbabyl-request-group (group &optional server dont-check) - (let ((active (cadr (assoc group nnbabyl-group-alist)))) - (save-excursion - (cond - ((or (null active) - (null (nnbabyl-possibly-change-newsgroup group server))) - (nnheader-report 'nnbabyl "No such group: %s" group)) - (dont-check - (nnheader-report 'nnbabyl "Selected group %s" group) - (nnheader-insert "")) - (t - (nnheader-report 'nnbabyl "Selected group %s" group) - (nnheader-insert "211 %d %d %d %s\n" - (1+ (- (cdr active) (car active))) - (car active) (cdr active) group)))))) - -(deffoo nnbabyl-request-scan (&optional group server) - (nnbabyl-possibly-change-newsgroup group server) - (nnbabyl-read-mbox) - (nnmail-get-new-mail - 'nnbabyl - (lambda () - (save-excursion - (set-buffer nnbabyl-mbox-buffer) - (save-buffer))) - (file-name-directory nnbabyl-mbox-file) - group - (lambda () - (save-excursion - (let ((in-buf (current-buffer))) - (goto-char (point-min)) - (while (search-forward "\n\^_\n" nil t) - (delete-char -1)) - (set-buffer nnbabyl-mbox-buffer) - (goto-char (point-max)) - (search-backward "\n\^_" nil t) - (goto-char (match-end 0)) - (insert-buffer-substring in-buf))) - (nnmail-save-active nnbabyl-group-alist nnbabyl-active-file)))) - -(deffoo nnbabyl-close-group (group &optional server) - t) - -(deffoo nnbabyl-request-create-group (group &optional server args) - (nnmail-activate 'nnbabyl) - (unless (assoc group nnbabyl-group-alist) - (push (list group (cons 1 0)) - nnbabyl-group-alist) - (nnmail-save-active nnbabyl-group-alist nnbabyl-active-file)) - t) - -(deffoo nnbabyl-request-list (&optional server) - (save-excursion - (nnmail-find-file nnbabyl-active-file) - (setq nnbabyl-group-alist (nnmail-get-active)) - t)) - -(deffoo nnbabyl-request-newgroups (date &optional server) - (nnbabyl-request-list server)) - -(deffoo nnbabyl-request-list-newsgroups (&optional server) - (nnheader-report 'nnbabyl "nnbabyl: LIST NEWSGROUPS is not implemented.")) - -(deffoo nnbabyl-request-expire-articles - (articles newsgroup &optional server force) - (nnbabyl-possibly-change-newsgroup newsgroup server) - (let* ((is-old t) - rest) - (nnmail-activate 'nnbabyl) - - (save-excursion - (set-buffer nnbabyl-mbox-buffer) - (gnus-set-text-properties (point-min) (point-max) nil) - (while (and articles is-old) - (goto-char (point-min)) - (when (search-forward (nnbabyl-article-string (car articles)) nil t) - (if (setq is-old - (nnmail-expired-article-p - newsgroup - (buffer-substring - (point) (progn (end-of-line) (point))) force)) - (progn - (unless (eq nnmail-expiry-target 'delete) - (with-temp-buffer - (nnbabyl-request-article (car articles) - newsgroup server - (current-buffer)) - (let ((nnml-current-directory nil)) - (nnmail-expiry-target-group - nnmail-expiry-target newsgroup)))) - (nnheader-message 5 "Deleting article %d in %s..." - (car articles) newsgroup) - (nnbabyl-delete-mail)) - (push (car articles) rest))) - (setq articles (cdr articles))) - (save-buffer) - ;; Find the lowest active article in this group. - (let ((active (nth 1 (assoc newsgroup nnbabyl-group-alist)))) - (goto-char (point-min)) - (while (and (not (search-forward - (nnbabyl-article-string (car active)) nil t)) - (<= (car active) (cdr active))) - (setcar active (1+ (car active))) - (goto-char (point-min)))) - (nnmail-save-active nnbabyl-group-alist nnbabyl-active-file) - (nconc rest articles)))) - -(deffoo nnbabyl-request-move-article - (article group server accept-form &optional last) - (let ((buf (get-buffer-create " *nnbabyl move*")) - result) - (and - (nnbabyl-request-article article group server) - (save-excursion - (set-buffer buf) - (insert-buffer-substring nntp-server-buffer) - (goto-char (point-min)) - (while (re-search-forward - "^X-Gnus-Newsgroup:" - (save-excursion (search-forward "\n\n" nil t) (point)) t) - (delete-region (progn (beginning-of-line) (point)) - (progn (forward-line 1) (point)))) - (setq result (eval accept-form)) - (kill-buffer (current-buffer)) - result) - (save-excursion - (nnbabyl-possibly-change-newsgroup group server) - (set-buffer nnbabyl-mbox-buffer) - (goto-char (point-min)) - (if (search-forward (nnbabyl-article-string article) nil t) - (nnbabyl-delete-mail)) - (and last (save-buffer)))) - result)) - -(deffoo nnbabyl-request-accept-article (group &optional server last) - (nnbabyl-possibly-change-newsgroup group server) - (nnmail-check-syntax) - (let ((buf (current-buffer)) - result beg) - (and - (nnmail-activate 'nnbabyl) - (save-excursion - (goto-char (point-min)) - (search-forward "\n\n" nil t) - (forward-line -1) - (save-excursion - (while (re-search-backward "^X-Gnus-Newsgroup: " beg t) - (delete-region (point) (progn (forward-line 1) (point))))) - (when nnmail-cache-accepted-message-ids - (nnmail-cache-insert (nnmail-fetch-field "message-id"))) - (setq result - (if (stringp group) - (list (cons group (nnbabyl-active-number group))) - (nnmail-article-group 'nnbabyl-active-number))) - (if (and (null result) - (yes-or-no-p "Moved to `junk' group; delete article? ")) - (setq result 'junk) - (setq result (car (nnbabyl-save-mail result)))) - (set-buffer nnbabyl-mbox-buffer) - (goto-char (point-max)) - (search-backward "\n\^_") - (goto-char (match-end 0)) - (insert-buffer-substring buf) - (when last - (when nnmail-cache-accepted-message-ids - (nnmail-cache-insert (nnmail-fetch-field "message-id"))) - (save-buffer) - (nnmail-save-active nnbabyl-group-alist nnbabyl-active-file)) - result)))) - -(deffoo nnbabyl-request-replace-article (article group buffer) - (nnbabyl-possibly-change-newsgroup group) - (save-excursion - (set-buffer nnbabyl-mbox-buffer) - (goto-char (point-min)) - (if (not (search-forward (nnbabyl-article-string article) nil t)) - nil - (nnbabyl-delete-mail t t) - (insert-buffer-substring buffer) - (save-buffer) - t))) - -(deffoo nnbabyl-request-delete-group (group &optional force server) - (nnbabyl-possibly-change-newsgroup group server) - ;; Delete all articles in GROUP. - (if (not force) - () ; Don't delete the articles. - (save-excursion - (set-buffer nnbabyl-mbox-buffer) - (goto-char (point-min)) - ;; Delete all articles in this group. - (let ((ident (concat "\nX-Gnus-Newsgroup: " nnbabyl-current-group ":")) - found) - (while (search-forward ident nil t) - (setq found t) - (nnbabyl-delete-mail)) - (when found - (save-buffer))))) - ;; Remove the group from all structures. - (setq nnbabyl-group-alist - (delq (assoc group nnbabyl-group-alist) nnbabyl-group-alist) - nnbabyl-current-group nil) - ;; Save the active file. - (nnmail-save-active nnbabyl-group-alist nnbabyl-active-file) - t) - -(deffoo nnbabyl-request-rename-group (group new-name &optional server) - (nnbabyl-possibly-change-newsgroup group server) - (save-excursion - (set-buffer nnbabyl-mbox-buffer) - (goto-char (point-min)) - (let ((ident (concat "\nX-Gnus-Newsgroup: " nnbabyl-current-group ":")) - (new-ident (concat "\nX-Gnus-Newsgroup: " new-name ":")) - found) - (while (search-forward ident nil t) - (replace-match new-ident t t) - (setq found t)) - (when found - (save-buffer)))) - (let ((entry (assoc group nnbabyl-group-alist))) - (and entry (setcar entry new-name)) - (setq nnbabyl-current-group nil) - ;; Save the new group alist. - (nnmail-save-active nnbabyl-group-alist nnbabyl-active-file) - t)) - - -;;; Internal functions. - -;; If FORCE, delete article no matter how many X-Gnus-Newsgroup -;; headers there are. If LEAVE-DELIM, don't delete the Unix mbox -;; delimiter line. -(defun nnbabyl-delete-mail (&optional force leave-delim) - ;; Delete the current X-Gnus-Newsgroup line. - (unless force - (delete-region - (progn (beginning-of-line) (point)) - (progn (forward-line 1) (point)))) - ;; Beginning of the article. - (save-excursion - (save-restriction - (widen) - (narrow-to-region - (save-excursion - (unless (re-search-backward (concat "^" nnbabyl-mail-delimiter) nil t) - (goto-char (point-min)) - (end-of-line)) - (if leave-delim (progn (forward-line 1) (point)) - (match-beginning 0))) - (progn - (forward-line 1) - (or (and (re-search-forward (concat "^" nnbabyl-mail-delimiter) - nil t) - (match-beginning 0)) - (point-max)))) - (goto-char (point-min)) - ;; Only delete the article if no other groups owns it as well. - (when (or force (not (re-search-forward "^X-Gnus-Newsgroup: " nil t))) - (delete-region (point-min) (point-max)))))) - -(defun nnbabyl-possibly-change-newsgroup (newsgroup &optional server) - (when (and server - (not (nnbabyl-server-opened server))) - (nnbabyl-open-server server)) - (when (or (not nnbabyl-mbox-buffer) - (not (buffer-name nnbabyl-mbox-buffer))) - (save-excursion (nnbabyl-read-mbox))) - (unless nnbabyl-group-alist - (nnmail-activate 'nnbabyl)) - (if newsgroup - (if (assoc newsgroup nnbabyl-group-alist) - (setq nnbabyl-current-group newsgroup) - (nnheader-report 'nnbabyl "No such group in file")) - t)) - -(defun nnbabyl-article-string (article) - (if (numberp article) - (concat "\nX-Gnus-Newsgroup: " nnbabyl-current-group ":" - (int-to-string article) " ") - (concat "\nMessage-ID: " article))) - -(defun nnbabyl-article-group-number () - (save-excursion - (goto-char (point-min)) - (when (re-search-forward "^X-Gnus-Newsgroup: +\\([^:]+\\):\\([0-9]+\\) " - nil t) - (cons (buffer-substring (match-beginning 1) (match-end 1)) - (string-to-int - (buffer-substring (match-beginning 2) (match-end 2))))))) - -(defun nnbabyl-insert-lines () - "Insert how many lines and chars there are in the body of the mail." - (let (lines chars) - (save-excursion - (goto-char (point-min)) - (when (search-forward "\n\n" nil t) - ;; There may be an EOOH line here... - (when (looking-at "\\*\\*\\* EOOH \\*\\*\\*") - (search-forward "\n\n" nil t)) - (setq chars (- (point-max) (point)) - lines (max (- (count-lines (point) (point-max)) 1) 0)) - ;; Move back to the end of the headers. - (goto-char (point-min)) - (search-forward "\n\n" nil t) - (forward-char -1) - (save-excursion - (when (re-search-backward "^Lines: " nil t) - (delete-region (point) (progn (forward-line 1) (point))))) - (insert (format "Lines: %d\n" lines)) - chars)))) - -(defun nnbabyl-save-mail (group-art) - ;; Called narrowed to an article. - (nnbabyl-insert-lines) - (nnmail-insert-xref group-art) - (nnbabyl-insert-newsgroup-line group-art) - (run-hooks 'nnbabyl-prepare-save-mail-hook) - group-art) - -(defun nnbabyl-insert-newsgroup-line (group-art) - (save-excursion - (goto-char (point-min)) - (while (looking-at "From ") - (replace-match "Mail-from: From " t t) - (forward-line 1)) - ;; If there is a C-l at the beginning of the narrowed region, this - ;; isn't really a "save", but rather a "scan". - (goto-char (point-min)) - (unless (looking-at "\^L") - (save-excursion - (insert "\^L\n0, unseen,,\n*** EOOH ***\n") - (goto-char (point-max)) - (insert "\^_\n"))) - (when (search-forward "\n\n" nil t) - (forward-char -1) - (while group-art - (insert (format "X-Gnus-Newsgroup: %s:%d %s\n" - (caar group-art) (cdar group-art) - (current-time-string))) - (setq group-art (cdr group-art)))) - t)) - -(defun nnbabyl-active-number (group) - ;; Find the next article number in GROUP. - (let ((active (cadr (assoc group nnbabyl-group-alist)))) - (if active - (setcdr active (1+ (cdr active))) - ;; This group is new, so we create a new entry for it. - ;; This might be a bit naughty... creating groups on the drop of - ;; a hat, but I don't know... - (push (list group (setq active (cons 1 1))) - nnbabyl-group-alist)) - (cdr active))) - -(defun nnbabyl-create-mbox () - (unless (file-exists-p nnbabyl-mbox-file) - ;; Create a new, empty RMAIL mbox file. - (save-excursion - (set-buffer (setq nnbabyl-mbox-buffer - (create-file-buffer nnbabyl-mbox-file))) - (setq buffer-file-name nnbabyl-mbox-file) - (insert "BABYL OPTIONS:\n\n\^_") - (nnmail-write-region - (point-min) (point-max) nnbabyl-mbox-file t 'nomesg)))) - -(defun nnbabyl-read-mbox () - (nnmail-activate 'nnbabyl) - (nnbabyl-create-mbox) - - (unless (and nnbabyl-mbox-buffer - (buffer-name nnbabyl-mbox-buffer) - (save-excursion - (set-buffer nnbabyl-mbox-buffer) - (= (buffer-size) (nnheader-file-size nnbabyl-mbox-file)))) - ;; This buffer has changed since we read it last. Possibly. - (save-excursion - (let ((delim (concat "^" nnbabyl-mail-delimiter)) - (alist nnbabyl-group-alist) - start end number) - (set-buffer (setq nnbabyl-mbox-buffer - (nnheader-find-file-noselect - nnbabyl-mbox-file nil t))) - ;; Save previous buffer mode. - (setq nnbabyl-previous-buffer-mode - (cons (cons (point-min) (point-max)) - major-mode)) - - (buffer-disable-undo) - (widen) - (setq buffer-read-only nil) - (fundamental-mode) - - ;; Go through the group alist and compare against - ;; the rmail file. - (while alist - (goto-char (point-max)) - (when (and (re-search-backward - (format "^X-Gnus-Newsgroup: %s:\\([0-9]+\\) " - (caar alist)) - nil t) - (> (setq number - (string-to-number - (buffer-substring - (match-beginning 1) (match-end 1)))) - (cdadar alist))) - (setcdr (cadar alist) number)) - (setq alist (cdr alist))) - - ;; We go through the mbox and make sure that each and - ;; every mail belongs to some group or other. - (goto-char (point-min)) - (if (looking-at "\^L") - (setq start (point)) - (re-search-forward delim nil t) - (setq start (match-end 0))) - (while (re-search-forward delim nil t) - (setq end (match-end 0)) - (unless (search-backward "\nX-Gnus-Newsgroup: " start t) - (goto-char end) - (save-excursion - (save-restriction - (narrow-to-region (goto-char start) end) - (nnbabyl-save-mail - (nnmail-article-group 'nnbabyl-active-number)) - (setq end (point-max))))) - (goto-char (setq start end))) - (when (buffer-modified-p (current-buffer)) - (save-buffer)) - (nnmail-save-active nnbabyl-group-alist nnbabyl-active-file))))) - -(defun nnbabyl-remove-incoming-delims () - (goto-char (point-min)) - (while (search-forward "\^_" nil t) - (replace-match "?" t t))) - -(defun nnbabyl-check-mbox () - "Go through the nnbabyl mbox and make sure that no article numbers are reused." - (interactive) - (let ((idents (make-vector 1000 0)) - id) - (save-excursion - (when (or (not nnbabyl-mbox-buffer) - (not (buffer-name nnbabyl-mbox-buffer))) - (nnbabyl-read-mbox)) - (set-buffer nnbabyl-mbox-buffer) - (goto-char (point-min)) - (while (re-search-forward "^X-Gnus-Newsgroup: \\([^ ]+\\) " nil t) - (if (intern-soft (setq id (match-string 1)) idents) - (progn - (delete-region (progn (beginning-of-line) (point)) - (progn (forward-line 1) (point))) - (nnheader-message 7 "Moving %s..." id) - (nnbabyl-save-mail - (nnmail-article-group 'nnbabyl-active-number))) - (intern id idents))) - (when (buffer-modified-p (current-buffer)) - (save-buffer)) - (nnmail-save-active nnbabyl-group-alist nnbabyl-active-file) - (nnheader-message 5 "")))) - -(provide 'nnbabyl) - -;;; nnbabyl.el ends here diff --git a/lisp/nndb.el b/lisp/nndb.el deleted file mode 100644 index d8fb469..0000000 --- a/lisp/nndb.el +++ /dev/null @@ -1,324 +0,0 @@ -;;; nndb.el --- nndb access for Gnus - -;; Copyright (C) 1997, 1998, 2000 Free Software Foundation, Inc. - -;; Author: Masanobu UMEDA -;; Kai Grossjohann -;; Joe Hildebrand -;; David Blacka -;; Keywords: news - -;; This file is NOT part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; This was based upon Kai Grossjohan's shamessly snarfed code and -;;; further modified by Joe Hildebrand. It has been updated for Red -;;; Gnus. - -;; TODO: -;; -;; * Fix bug where server connection can be lost and impossible to regain -;; This hasn't happened to me in a while; think it was fixed in Rgnus -;; -;; * make it handle different nndb servers seemlessly -;; -;; * Optimize expire if FORCE -;; -;; * Optimize move (only expire once) -;; -;; * Deal with add/deletion of groups -;; -;; * make the backend TOUCH an article when marked as expireable (will -;; make article expire 'expiry' days after that moment). - -;;- -;; Register nndb with known select methods. - -(gnus-declare-backend "nndb" 'mail 'respool 'address 'prompt-address) - -;;; Code: - -(require 'nnmail) -(require 'nnheader) -(require 'nntp) -(eval-when-compile (require 'cl)) - -(eval-and-compile - (autoload 'news-setup "rnewspost") - (autoload 'news-reply-mode "rnewspost") - (autoload 'cancel-timer "timer") - (autoload 'telnet "telnet" nil t) - (autoload 'telnet-send-input "telnet" nil t) - (autoload 'gnus-declare-backend "gnus-start")) - -;; Declare nndb as derived from nntp - -(nnoo-declare nndb nntp) - -;; Variables specific to nndb - -;;- currently not used but just in case... -(defvoo nndb-deliver-program "nndel" - "*The program used to put a message in an NNDB group.") - -(defvoo nndb-server-side-expiry nil - "If t, expiry calculation will occur on the server side.") - -(defvoo nndb-set-expire-date-on-mark nil - "If t, the expiry date for a given article will be set to the time -it was marked as expireable; otherwise the date will be the time the -article was posted to nndb") - -;; Variables copied from nntp - -(defvoo nndb-server-opened-hook '(nntp-send-authinfo-from-file) - "Like nntp-server-opened-hook." - nntp-server-opened-hook) - -(defvoo nndb-address "localhost" - "*The name of the NNDB server." - nntp-address) - -(defvoo nndb-port-number 9000 - "*Port number to connect to." - nntp-port-number) - -;; change to 'news if you are actually using nndb for news -(defvoo nndb-article-type 'mail) - -(defvoo nndb-status-string nil "" nntp-status-string) - - - -(defconst nndb-version "nndb 0.7" - "Version numbers of this version of NNDB.") - - -;;; Interface functions. - -(nnoo-define-basics nndb) - -;;------------------------------------------------------------------ - -;; this function turns the lisp list into a string list. There is -;; probably a more efficient way to do this. -(defun nndb-build-article-string (articles) - (let (art-string art) - (while articles - (setq art (pop articles)) - (setq art-string (concat art-string art " "))) - art-string)) - -(defun nndb-build-expire-rest-list (total expire) - (let (art rest) - (while total - (setq art (pop total)) - (if (memq art expire) - () - (push art rest))) - rest)) - - -;; -(deffoo nndb-request-type (group &optional article) - nndb-article-type) - -;; nndb-request-update-info does not exist and is not needed - -;; nndb-request-update-mark does not exist; it should be used to TOUCH -;; articles as they are marked exipirable -(defun nndb-touch-article (group article) - (nntp-send-command nil "X-TOUCH" article)) - -(deffoo nndb-request-update-mark - (group article mark) - "Sets the expiry date for ARTICLE in GROUP to now, if the mark is 'E'" - (if (and nndb-set-expire-date-on-mark (string-equal mark "E")) - (nndb-touch-article group article)) - mark) - -;; nndb-request-create-group -- currently this isn't necessary; nndb -;; creates groups on demand. - -;; todo -- use some other time than the creation time of the article -;; best is time since article has been marked as expirable - -(defun nndb-request-expire-articles-local - (articles &optional group server force) - "Let gnus do the date check and issue the delete commands." - (let (msg art delete-list (num-delete 0) rest) - (nntp-possibly-change-group group server) - (while articles - (setq art (pop articles)) - (nntp-send-command "^\\([23]\\|^423\\).*\n" "X-DATE" art) - (setq msg (nndb-status-message)) - (if (string-match "^423" msg) - () - (or (string-match "'\\(.+\\)'" msg) - (error "Not a valid response for X-DATE command: %s" - msg)) - (if (nnmail-expired-article-p - group - (date-to-time (substring msg (match-beginning 1) (match-end 1))) - force) - (progn - (setq delete-list (concat delete-list " " (int-to-string art))) - (setq num-delete (1+ num-delete))) - (push art rest)))) - (if (> (length delete-list) 0) - (progn - (nnheader-message 5 "Deleting %s article(s) from %s" - (int-to-string num-delete) group) - (nntp-send-command "^[23].*\n" "X-DELETE" delete-list)) - ) - - (nnheader-message 5 "") - (nconc rest articles))) - -(defun nndb-get-remote-expire-response () - (let (list) - (set-buffer nntp-server-buffer) - (goto-char (point-min)) - (if (looking-at "^[34]") - ;; x-expire returned error--presume no articles were expirable) - (setq list nil) - ;; otherwise, pull all of the following numbers into the list - (re-search-forward "follows\r?\n?" nil t) - (while (re-search-forward "^[0-9]+$" nil t) - (push (string-to-int (match-string 0)) list))) - list)) - -(defun nndb-request-expire-articles-remote - (articles &optional group server force) - "Let the nndb backend expire articles" - (let (days art-string delete-list (num-delete 0)) - (nntp-possibly-change-group group server) - - ;; first calculate the wait period in days - (setq days (or (and nnmail-expiry-wait-function - (funcall nnmail-expiry-wait-function group)) - nnmail-expiry-wait)) - ;; now handle the special cases - (cond (force - (setq days 0)) - ((eq days 'never) - ;; This isn't an expirable group. - (setq days -1)) - ((eq days 'immediate) - (setq days 0))) - - - ;; build article string - (setq art-string (concat days " " (nndb-build-article-string articles))) - (nntp-send-command "^\.\r?\n\\|^[345].*\n" "X-EXPIRE" art-string) - - (setq delete-list (nndb-get-remote-expire-response)) - (setq num-delete (length delete-list)) - (if (> num-delete 0) - (nnheader-message 5 "Deleting %s article(s) from %s" - (int-to-string num-delete) group)) - - (nndb-build-expire-rest-list articles delete-list))) - -(deffoo nndb-request-expire-articles - (articles &optional group server force) - "Expires ARTICLES from GROUP on SERVER. -If FORCE, delete regardless of exiration date, otherwise use normal -expiry mechanism." - (if nndb-server-side-expiry - (nndb-request-expire-articles-remote articles group server force) - (nndb-request-expire-articles-local articles group server force))) - -(deffoo nndb-request-move-article - (article group server accept-form &optional last) - "Move ARTICLE (a number) from GROUP on SERVER. -Evals ACCEPT-FORM in current buffer, where the article is. -Optional LAST is ignored." - ;; we guess that the second arg in accept-form is the new group, - ;; which it will be for nndb, which is all that matters anyway - (let ((new-group (nth 1 accept-form)) result) - (nntp-possibly-change-group group server) - - ;; use the move command for nndb-to-nndb moves - (if (string-match "^nndb" new-group) - (let ((new-group-name (gnus-group-real-name new-group))) - (nntp-send-command "^[23].*\n" "X-MOVE" article new-group-name) - (cons new-group article)) - ;; else move normally - (let ((artbuf (get-buffer-create " *nndb move*"))) - (and - (nndb-request-article article group server artbuf) - (save-excursion - (set-buffer artbuf) - (insert-buffer-substring nntp-server-buffer) - (setq result (eval accept-form)) - (kill-buffer (current-buffer)) - result) - (nndb-request-expire-articles (list article) - group - server - t)) - result) - ))) - -(deffoo nndb-request-accept-article (group server &optional last) - "The article in the current buffer is put into GROUP." - (nntp-possibly-change-group group server) - (let (art msg) - (when (nntp-send-command "^[23].*\r?\n" "ACCEPT" group) - (nnheader-insert "") - (nntp-send-buffer "^[23].*\n")) - - (set-buffer nntp-server-buffer) - (setq msg (buffer-substring (point-min) (point-max))) - (or (string-match "^\\([0-9]+\\)" msg) - (error "nndb: %s" msg)) - (setq art (substring msg (match-beginning 1) (match-end 1))) - (nnheader-message 5 "nndb: accepted %s" art) - (list art))) - -(deffoo nndb-request-replace-article (article group buffer) - "ARTICLE is the number of the article in GROUP to be replaced with the contents of the BUFFER." - (set-buffer buffer) - (when (nntp-send-command "^[23].*\r?\n" "X-REPLACE" (int-to-string article)) - (nnheader-insert "") - (nntp-send-buffer "^[23.*\n") - (list (int-to-string article)))) - -; nndb-request-delete-group does not exist -; todo -- maybe later - -; nndb-request-rename-group does not exist -; todo -- maybe later - -;; -- standard compatability functions - -(deffoo nndb-status-message (&optional server) - "Return server status as a string." - (set-buffer nntp-server-buffer) - (buffer-substring (point-min) (point-max))) - -;; Import stuff from nntp - -(nnoo-import nndb - (nntp)) - -(provide 'nndb) - -;;; nndb.el ends here diff --git a/lisp/nndir.el b/lisp/nndir.el deleted file mode 100644 index f1a6635..0000000 --- a/lisp/nndir.el +++ /dev/null @@ -1,101 +0,0 @@ -;;; nndir.el --- single directory newsgroup access for Gnus - -;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; Code: - -(require 'nnheader) -(require 'nnmh) -(require 'nnml) -(require 'nnoo) -(eval-when-compile (require 'cl)) - -(nnoo-declare nndir - nnml nnmh) - -(defvoo nndir-directory nil - "Where nndir will look for groups." - nnml-current-directory nnmh-current-directory) - -(defvoo nndir-nov-is-evil nil - "*Non-nil means that nndir will never retrieve NOV headers." - nnml-nov-is-evil) - - - -(defvoo nndir-current-group "" nil nnml-current-group nnmh-current-group) -(defvoo nndir-top-directory nil nil nnml-directory nnmh-directory) -(defvoo nndir-get-new-mail nil nil nnml-get-new-mail nnmh-get-new-mail) - -(defvoo nndir-status-string "" nil nnmh-status-string) -(defconst nndir-version "nndir 1.0") - - - -;;; Interface functions. - -(nnoo-define-basics nndir) - -(deffoo nndir-open-server (server &optional defs) - (setq nndir-directory - (or (cadr (assq 'nndir-directory defs)) - server)) - (unless (assq 'nndir-directory defs) - (push `(nndir-directory ,server) defs)) - (push `(nndir-current-group - ,(file-name-nondirectory (directory-file-name nndir-directory))) - defs) - (push `(nndir-top-directory - ,(file-name-directory (directory-file-name nndir-directory))) - defs) - (nnoo-change-server 'nndir server defs) - (let (err) - (cond - ((not (condition-case arg - (file-exists-p nndir-directory) - (ftp-error (setq err (format "%s" arg))))) - (nndir-close-server) - (nnheader-report - 'nndir (or err "No such file or directory: %s" nndir-directory))) - ((not (file-directory-p (file-truename nndir-directory))) - (nndir-close-server) - (nnheader-report 'nndir "Not a directory: %s" nndir-directory)) - (t - (nnheader-report 'nndir "Opened server %s using directory %s" - server nndir-directory) - t)))) - -(nnoo-map-functions nndir - (nnml-retrieve-headers 0 nndir-current-group 0 0) - (nnml-request-article 0 nndir-current-group 0 0) - (nnmh-request-group nndir-current-group 0 0) - (nnml-close-group nndir-current-group 0) - (nnml-request-list (nnoo-current-server 'nndir) nndir-directory) - (nnml-request-newsgroups (nnoo-current-server 'nndir) nndir-directory)) - -(provide 'nndir) - -;;; nndir.el ends here diff --git a/lisp/nndoc.el b/lisp/nndoc.el deleted file mode 100644 index 5c115b7..0000000 --- a/lisp/nndoc.el +++ /dev/null @@ -1,922 +0,0 @@ -;;; nndoc.el --- single file access for Gnus -;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Masanobu UMEDA -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;; For Outlook mail boxes format, see http://mbx2mbox.sourceforge.net/ - -;;; Code: - -(eval-when-compile (require 'cl)) - -(require 'nnheader) -(require 'message) -(require 'nnmail) -(require 'nnoo) -(require 'gnus-util) - -(nnoo-declare nndoc) - -(defvoo nndoc-article-type 'guess - "*Type of the file. -One of `mbox', `babyl', `digest', `news', `rnews', `mmdf', `forward', -`rfc934', `rfc822-forward', `mime-parts', `standard-digest', -`slack-digest', `clari-briefs', `nsmail', `outlook', `oe-dbx' or -`guess'.") - -(defvoo nndoc-post-type 'mail - "*Whether the nndoc group is `mail' or `post'.") - -(defvoo nndoc-open-document-hook 'nnheader-ms-strip-cr - "Hook run after opening a document. -The default function removes all trailing carriage returns -from the document.") - -(defvar nndoc-type-alist - `((mmdf - (article-begin . "^\^A\^A\^A\^A\n") - (body-end . "^\^A\^A\^A\^A\n")) - (nsmail - (article-begin . "^From - ")) - (news - (article-begin . "^Path:")) - (rnews - (article-begin . "^#! *rnews +\\([0-9]+\\) *\n") - (body-end-function . nndoc-rnews-body-end)) - (mbox - (article-begin-function . nndoc-mbox-article-begin) - (body-end-function . nndoc-mbox-body-end)) - (babyl - (article-begin . "\^_\^L *\n") - (body-end . "\^_") - (body-begin-function . nndoc-babyl-body-begin) - (head-begin-function . nndoc-babyl-head-begin)) - (forward - (article-begin . "^-+ \\(Start of \\)?forwarded message.*\n+") - (body-end . "^-+ End \\(of \\)?forwarded message.*$") - (prepare-body-function . nndoc-unquote-dashes)) - (rfc934 - (article-begin . "^--.*\n+") - (body-end . "^--.*$") - (prepare-body-function . nndoc-unquote-dashes)) - (clari-briefs - (article-begin . "^ \\*") - (body-end . "^\t------*[ \t]^*\n^ \\*") - (body-begin . "^\t") - (head-end . "^\t") - (generate-head-function . nndoc-generate-clari-briefs-head) - (article-transform-function . nndoc-transform-clari-briefs)) - (mime-digest - (article-begin . "") - (head-begin . "^ ?\n") - (head-end . "^ ?$") - (body-end . "") - (file-end . "") - (subtype digest guess)) - (mime-parts - (generate-head-function . nndoc-generate-mime-parts-head) - (article-transform-function . nndoc-transform-mime-parts)) - (standard-digest - (first-article . ,(concat "^" (make-string 70 ?-) "\n *\n+")) - (article-begin . ,(concat "^\n" (make-string 30 ?-) "\n *\n+")) - (prepare-body-function . nndoc-unquote-dashes) - (body-end-function . nndoc-digest-body-end) - (head-end . "^ *$") - (body-begin . "^ *\n") - (file-end . "^End of .*digest.*[0-9].*\n\\*\\*\\|^End of.*Digest *$") - (subtype digest guess)) - (slack-digest - (article-begin . "^------------------------------*[\n \t]+") - (head-end . "^ ?$") - (body-end-function . nndoc-digest-body-end) - (body-begin . "^ ?$") - (file-end . "^End of") - (prepare-body-function . nndoc-unquote-dashes) - (subtype digest guess)) - (lanl-gov-announce - (article-begin . "^\\\\\\\\\n") - (head-begin . "^Paper.*:") - (head-end . "\\(^\\\\\\\\.*\n\\|-----------------\\)") - (body-begin . "") - (body-end . "-------------------------------------------------") - (file-end . "^Title: Recent Seminal") - (generate-head-function . nndoc-generate-lanl-gov-head) - (article-transform-function . nndoc-transform-lanl-gov-announce) - (subtype preprints guess)) - (rfc822-forward - (article-begin . "^\n") - (body-end-function . nndoc-rfc822-forward-body-end-function)) - (outlook - (article-begin-function . nndoc-outlook-article-begin) - (body-end . "\0")) - (oe-dbx ;; Outlook Express DBX format - (dissection-function . nndoc-oe-dbx-dissection) - (generate-head-function . nndoc-oe-dbx-generate-head) - (generate-article-function . nndoc-oe-dbx-generate-article)) - (guess - (guess . t) - (subtype nil)) - (digest - (guess . t) - (subtype nil)) - (preprints - (guess . t) - (subtype nil)))) - -(defvar nndoc-binary-file-names ".[Dd][Bb][Xx]$" - "Regexp for binary nndoc file names.") - - -(defvoo nndoc-file-begin nil) -(defvoo nndoc-first-article nil) -(defvoo nndoc-article-begin nil) -(defvoo nndoc-head-begin nil) -(defvoo nndoc-head-end nil) -(defvoo nndoc-file-end nil) -(defvoo nndoc-body-begin nil) -(defvoo nndoc-body-end-function nil) -(defvoo nndoc-body-begin-function nil) -(defvoo nndoc-head-begin-function nil) -(defvoo nndoc-body-end nil) -;; nndoc-dissection-alist is a list of sublists. Each sublist holds the -;; following items. ARTICLE acts as the association key and is an ordinal -;; starting at 1. HEAD-BEGIN [0], HEAD-END [1], BODY-BEGIN [2] and BODY-END -;; [3] are positions in the `nndoc' buffer. LINE-COUNT [4] is a count of -;; lines in the body. For MIME dissections only, ARTICLE-INSERT [5] and -;; SUMMARY-INSERT [6] give headers to insert for full article or summary line -;; generation, respectively. Other headers usually follow directly from the -;; buffer. Value `nil' means no insert. -(defvoo nndoc-dissection-alist nil) -(defvoo nndoc-prepare-body-function nil) -(defvoo nndoc-generate-head-function nil) -(defvoo nndoc-article-transform-function nil) -(defvoo nndoc-article-begin-function nil) -(defvoo nndoc-generate-article-function nil) -(defvoo nndoc-dissection-function nil) - -(defvoo nndoc-status-string "") -(defvoo nndoc-group-alist nil) -(defvoo nndoc-current-buffer nil - "Current nndoc news buffer.") -(defvoo nndoc-address nil) - -(defconst nndoc-version "nndoc 1.0" - "nndoc version.") - - - -;;; Interface functions - -(nnoo-define-basics nndoc) - -(deffoo nndoc-retrieve-headers (articles &optional newsgroup server fetch-old) - (when (nndoc-possibly-change-buffer newsgroup server) - (save-excursion - (set-buffer nntp-server-buffer) - (erase-buffer) - (let (article entry) - (if (stringp (car articles)) - 'headers - (while articles - (when (setq entry (cdr (assq (setq article (pop articles)) - nndoc-dissection-alist))) - (insert (format "221 %d Article retrieved.\n" article)) - (if nndoc-generate-head-function - (funcall nndoc-generate-head-function article) - (insert-buffer-substring - nndoc-current-buffer (car entry) (nth 1 entry))) - (goto-char (point-max)) - (unless (eq (char-after (1- (point))) ?\n) - (insert "\n")) - (insert (format "Lines: %d\n" (nth 4 entry))) - (insert ".\n"))) - - (nnheader-fold-continuation-lines) - 'headers))))) - -(deffoo nndoc-request-article (article &optional newsgroup server buffer) - (nndoc-possibly-change-buffer newsgroup server) - (save-excursion - (let ((buffer (or buffer nntp-server-buffer)) - (entry (cdr (assq article nndoc-dissection-alist))) - beg) - (set-buffer buffer) - (erase-buffer) - (when entry - (cond - ((stringp article) nil) - (nndoc-generate-article-function - (funcall nndoc-generate-article-function article)) - (t - (insert-buffer-substring - nndoc-current-buffer (car entry) (nth 1 entry)) - (insert "\n") - (setq beg (point)) - (insert-buffer-substring - nndoc-current-buffer (nth 2 entry) (nth 3 entry)) - (goto-char beg) - (when nndoc-prepare-body-function - (funcall nndoc-prepare-body-function)) - (when nndoc-article-transform-function - (funcall nndoc-article-transform-function article)) - t)))))) - -(deffoo nndoc-request-group (group &optional server dont-check) - "Select news GROUP." - (let (number) - (cond - ((not (nndoc-possibly-change-buffer group server)) - (nnheader-report 'nndoc "No such file or buffer: %s" - nndoc-address)) - (dont-check - (nnheader-report 'nndoc "Selected group %s" group) - t) - ((zerop (setq number (length nndoc-dissection-alist))) - (nndoc-close-group group) - (nnheader-report 'nndoc "No articles in group %s" group)) - (t - (nnheader-insert "211 %d %d %d %s\n" number 1 number group))))) - -(deffoo nndoc-request-type (group &optional article) - (cond ((not article) 'unknown) - (nndoc-post-type nndoc-post-type) - (t 'unknown))) - -(deffoo nndoc-close-group (group &optional server) - (nndoc-possibly-change-buffer group server) - (and nndoc-current-buffer - (buffer-name nndoc-current-buffer) - (kill-buffer nndoc-current-buffer)) - (setq nndoc-group-alist (delq (assoc group nndoc-group-alist) - nndoc-group-alist)) - (setq nndoc-current-buffer nil) - (nnoo-close-server 'nndoc server) - (setq nndoc-dissection-alist nil) - t) - -(deffoo nndoc-request-list (&optional server) - nil) - -(deffoo nndoc-request-newgroups (date &optional server) - nil) - -(deffoo nndoc-request-list-newsgroups (&optional server) - nil) - - -;;; Internal functions. - -(defun nndoc-possibly-change-buffer (group source) - (let (buf) - (cond - ;; The current buffer is this group's buffer. - ((and nndoc-current-buffer - (buffer-name nndoc-current-buffer) - (eq nndoc-current-buffer - (setq buf (cdr (assoc group nndoc-group-alist)))))) - ;; We change buffers by taking an old from the group alist. - ;; `source' is either a string (a file name) or a buffer object. - (buf - (setq nndoc-current-buffer buf)) - ;; It's a totally new group. - ((or (and (bufferp nndoc-address) - (buffer-name nndoc-address)) - (and (stringp nndoc-address) - (file-exists-p nndoc-address) - (not (file-directory-p nndoc-address)))) - (push (cons group (setq nndoc-current-buffer - (get-buffer-create - (concat " *nndoc " group "*")))) - nndoc-group-alist) - (setq nndoc-dissection-alist nil) - (save-excursion - (set-buffer nndoc-current-buffer) - (erase-buffer) - (if (and (stringp nndoc-address) - (string-match nndoc-binary-file-names nndoc-address)) - (let ((coding-system-for-read 'binary)) - (mm-insert-file-contents nndoc-address)) - (if (stringp nndoc-address) - (nnheader-insert-file-contents nndoc-address) - (insert-buffer-substring nndoc-address)) - (run-hooks 'nndoc-open-document-hook))))) - ;; Initialize the nndoc structures according to this new document. - (when (and nndoc-current-buffer - (not nndoc-dissection-alist)) - (save-excursion - (set-buffer nndoc-current-buffer) - (nndoc-set-delims) - (if (eq nndoc-article-type 'mime-parts) - (nndoc-dissect-mime-parts) - (nndoc-dissect-buffer)))) - (unless nndoc-current-buffer - (nndoc-close-server)) - ;; Return whether we managed to select a file. - nndoc-current-buffer)) - -;;; -;;; Deciding what document type we have -;;; - -(defun nndoc-set-delims () - "Set the nndoc delimiter variables according to the type of the document." - (let ((vars '(nndoc-file-begin - nndoc-first-article - nndoc-article-begin-function - nndoc-head-begin nndoc-head-end - nndoc-file-end nndoc-article-begin - nndoc-body-begin nndoc-body-end-function nndoc-body-end - nndoc-prepare-body-function nndoc-article-transform-function - nndoc-generate-head-function nndoc-body-begin-function - nndoc-head-begin-function - nndoc-generate-article-function - nndoc-dissection-function))) - (while vars - (set (pop vars) nil))) - (let (defs) - ;; Guess away until we find the real file type. - (while (assq 'guess (setq defs (cdr (assq nndoc-article-type - nndoc-type-alist)))) - (setq nndoc-article-type (nndoc-guess-type nndoc-article-type))) - ;; Set the nndoc variables. - (while defs - (set (intern (format "nndoc-%s" (caar defs))) - (cdr (pop defs)))))) - -(defun nndoc-guess-type (subtype) - (let ((alist nndoc-type-alist) - results result entry) - (while (and (not result) - (setq entry (pop alist))) - (when (memq subtype (or (cdr (assq 'subtype entry)) '(guess))) - (goto-char (point-min)) - ;; Remove blank lines. - (while (eq (following-char) ?\n) - (delete-char 1)) - (when (numberp (setq result (funcall (intern - (format "nndoc-%s-type-p" - (car entry)))))) - (push (cons result entry) results) - (setq result nil)))) - (unless (or result results) - (error "Document is not of any recognized type")) - (if result - (car entry) - (cadar (sort results 'car-less-than-car))))) - -;;; -;;; Built-in type predicates and functions -;;; - -(defun nndoc-mbox-type-p () - (when (looking-at message-unix-mail-delimiter) - t)) - -(defun nndoc-mbox-article-begin () - (when (re-search-forward (concat "^" message-unix-mail-delimiter) nil t) - (goto-char (match-beginning 0)))) - -(defun nndoc-mbox-body-end () - (let ((beg (point)) - len end) - (when - (save-excursion - (and (re-search-backward - (concat "^" message-unix-mail-delimiter) nil t) - (setq end (point)) - (search-forward "\n\n" beg t) - (re-search-backward - "^Content-Length:[ \t]*\\([0-9]+\\) *$" end t) - (setq len (string-to-int (match-string 1))) - (search-forward "\n\n" beg t) - (unless (= (setq len (+ (point) len)) (point-max)) - (and (< len (point-max)) - (goto-char len) - (looking-at message-unix-mail-delimiter))))) - (goto-char len)))) - -(defun nndoc-mmdf-type-p () - (when (looking-at "\^A\^A\^A\^A$") - t)) - -(defun nndoc-news-type-p () - (when (looking-at "^Path:.*\n") - t)) - -(defun nndoc-rnews-type-p () - (when (looking-at "#! *rnews") - t)) - -(defun nndoc-rnews-body-end () - (and (re-search-backward nndoc-article-begin nil t) - (forward-line 1) - (goto-char (+ (point) (string-to-int (match-string 1)))))) - -(defun nndoc-babyl-type-p () - (when (re-search-forward "\^_\^L *\n" nil t) - t)) - -(defun nndoc-babyl-body-begin () - (re-search-forward "^\n" nil t) - (when (looking-at "\\*\\*\\* EOOH \\*\\*\\*") - (let ((next (or (save-excursion - (re-search-forward nndoc-article-begin nil t)) - (point-max)))) - (unless (re-search-forward "^\n" next t) - (goto-char next) - (forward-line -1) - (insert "\n") - (forward-line -1))))) - -(defun nndoc-babyl-head-begin () - (when (re-search-forward "^[0-9].*\n" nil t) - (when (looking-at "\\*\\*\\* EOOH \\*\\*\\*") - (forward-line 1)) - t)) - -(defun nndoc-forward-type-p () - (when (and (re-search-forward "^-+ \\(Start of \\)?forwarded message.*\n+" - nil t) - (looking-at "[\r\n]*[a-zA-Z][a-zA-Z0-9-]*:")) - t)) - -(defun nndoc-rfc934-type-p () - (when (and (re-search-forward "^-+ Start of forwarded.*\n+" nil t) - (not (re-search-forward "^Subject:.*digest" nil t)) - (not (re-search-backward "^From:" nil t 2)) - (not (re-search-forward "^From:" nil t 2))) - t)) - -(defun nndoc-rfc822-forward-type-p () - (save-restriction - (message-narrow-to-head) - (when (re-search-forward "^Content-Type: *message/rfc822" nil t) - t))) - -(defun nndoc-rfc822-forward-body-end-function () - (goto-char (point-max))) - -(defun nndoc-mime-parts-type-p () - (let ((case-fold-search t) - (limit (search-forward "\n\n" nil t))) - (goto-char (point-min)) - (when (and limit - (re-search-forward - (concat "\ -^Content-Type:[ \t]*multipart/[a-z]+ *; *\\(\\(\n[ \t]\\)?.*;\\)*" - "\\(\n[ \t]\\)?[ \t]*boundary=\"?[^\"\n]*[^\" \t\n]") - limit t)) - t))) - -(defun nndoc-transform-mime-parts (article) - (let* ((entry (cdr (assq article nndoc-dissection-alist))) - (headers (nth 5 entry))) - (when headers - (goto-char (point-min)) - (insert headers)))) - -(defun nndoc-generate-mime-parts-head (article) - (let* ((entry (cdr (assq article nndoc-dissection-alist))) - (headers (nth 6 entry))) - (save-restriction - (narrow-to-region (point) (point)) - (insert-buffer-substring - nndoc-current-buffer (car entry) (nth 1 entry)) - (goto-char (point-max))) - (when headers - (insert headers)))) - -(defun nndoc-clari-briefs-type-p () - (when (let ((case-fold-search nil)) - (re-search-forward "^\t[^a-z]+ ([^a-z]+) --" nil t)) - t)) - -(defun nndoc-transform-clari-briefs (article) - (goto-char (point-min)) - (when (looking-at " *\\*\\(.*\\)\n") - (replace-match "" t t)) - (nndoc-generate-clari-briefs-head article)) - -(defun nndoc-generate-clari-briefs-head (article) - (let ((entry (cdr (assq article nndoc-dissection-alist))) - subject from) - (save-excursion - (set-buffer nndoc-current-buffer) - (save-restriction - (narrow-to-region (car entry) (nth 3 entry)) - (goto-char (point-min)) - (when (looking-at " *\\*\\(.*\\)$") - (setq subject (match-string 1)) - (when (string-match "[ \t]+$" subject) - (setq subject (substring subject 0 (match-beginning 0))))) - (when - (let ((case-fold-search nil)) - (re-search-forward - "^\t\\([^a-z]+\\(,[^(]+\\)? ([^a-z]+)\\) --" nil t)) - (setq from (match-string 1))))) - (insert "From: " "clari@clari.net (" (or from "unknown") ")" - "\nSubject: " (or subject "(no subject)") "\n"))) - - -(defun nndoc-mime-digest-type-p () - (let ((case-fold-search t) - boundary-id b-delimiter entry) - (when (and - (re-search-forward - (concat "^Content-Type: *multipart/digest;[ \t\n]*[ \t]" - "boundary=\"?\\([^\"\n]*[^\" \t\n]\\)") - nil t) - (match-beginning 1)) - (setq boundary-id (match-string 1) - b-delimiter (concat "\n--" boundary-id "[ \t]*$")) - (setq entry (assq 'mime-digest nndoc-type-alist)) - (setcdr entry - (list - (cons 'head-begin "^ ?\n") - (cons 'head-end "^ ?$") - (cons 'body-begin "^ ?\n") - (cons 'article-begin b-delimiter) - (cons 'body-end-function 'nndoc-digest-body-end) - (cons 'file-end (concat "\n--" boundary-id "--[ \t]*$")))) - t))) - -(defun nndoc-standard-digest-type-p () - (when (and (re-search-forward (concat "^" (make-string 70 ?-) "\n\n") nil t) - (re-search-forward - (concat "\n\n" (make-string 30 ?-) "\n\n") nil t)) - t)) - -(defun nndoc-digest-body-end () - (and (re-search-forward nndoc-article-begin nil t) - (goto-char (match-beginning 0)))) - -(defun nndoc-slack-digest-type-p () - 0) - -(defun nndoc-lanl-gov-announce-type-p () - (when (let ((case-fold-search nil)) - (re-search-forward "^\\\\\\\\\nPaper: [a-z-]+/[0-9]+" nil t)) - t)) - -(defun nndoc-transform-lanl-gov-announce (article) - (goto-char (point-max)) - (when (re-search-backward "^\\\\\\\\ +(\\([^ ]*\\) , *\\([^ ]*\\))" nil t) - (replace-match "\n\nGet it at \\1 (\\2)" t nil))) - -(defun nndoc-generate-lanl-gov-head (article) - (let ((entry (cdr (assq article nndoc-dissection-alist))) - (e-mail "no address given") - subject from) - (save-excursion - (set-buffer nndoc-current-buffer) - (save-restriction - (narrow-to-region (car entry) (nth 1 entry)) - (goto-char (point-min)) - (when (looking-at "^Paper.*: \\([a-z-]+/[0-9]+\\)") - (setq subject (concat " (" (match-string 1) ")")) - (when (re-search-forward "^From: \\([^ ]+\\)" nil t) - (setq e-mail (match-string 1))) - (when (re-search-forward "^Title: \\([^\f]*\\)\nAuthors?: \\(.*\\)" - nil t) - (setq subject (concat (match-string 1) subject)) - (setq from (concat (match-string 2) " <" e-mail ">")))))) - (while (and from (string-match "(\[^)\]*)" from)) - (setq from (replace-match "" t t from))) - (insert "From: " (or from "unknown") - "\nSubject: " (or subject "(no subject)") "\n"))) - -(defun nndoc-nsmail-type-p () - (when (looking-at "From - ") - t)) - -(defun nndoc-outlook-article-begin () - (prog1 (re-search-forward "From:\\|Received:" nil t) - (goto-char (match-beginning 0)))) - -(defun nndoc-outlook-type-p () - ;; FIXME: Is JMF the magic of outlook mailbox? -- ShengHuo. - (looking-at "JMF")) - -(defun nndoc-oe-dbx-type-p () - (looking-at (mm-string-as-multibyte "\317\255\022\376"))) - -(defun nndoc-read-little-endian () - (+ (prog1 (char-after) (forward-char 1)) - (lsh (prog1 (char-after) (forward-char 1)) 8) - (lsh (prog1 (char-after) (forward-char 1)) 16) - (lsh (prog1 (char-after) (forward-char 1)) 24))) - -(defun nndoc-oe-dbx-decode-block () - (list - (nndoc-read-little-endian) ;; this address - (nndoc-read-little-endian) ;; next address offset - (nndoc-read-little-endian) ;; blocksize - (nndoc-read-little-endian))) ;; next address - -(defun nndoc-oe-dbx-dissection () - (let ((i 0) blk p tp) - (goto-char 60117) ;; 0x0000EAD4+1 - (setq p (point)) - (unless (eobp) - (setq blk (nndoc-oe-dbx-decode-block))) - (while (and blk (> (car blk) 0) (or (zerop (nth 3 blk)) - (> (nth 3 blk) p))) - (push (list (incf i) p nil nil nil 0) nndoc-dissection-alist) - (while (and (> (car blk) 0) (> (nth 3 blk) p)) - (goto-char (1+ (nth 3 blk))) - (setq blk (nndoc-oe-dbx-decode-block))) - (if (or (<= (car blk) p) - (<= (nth 1 blk) 0) - (not (zerop (nth 3 blk)))) - (setq blk nil) - (setq tp (+ (car blk) (nth 1 blk) 17)) - (if (or (<= tp p) (>= tp (point-max))) - (setq blk nil) - (goto-char tp) - (setq p tp - blk (nndoc-oe-dbx-decode-block))))))) - -(defun nndoc-oe-dbx-generate-article (article &optional head) - (let ((entry (cdr (assq article nndoc-dissection-alist))) - (cur (current-buffer)) - (begin (point)) - blk p) - (with-current-buffer nndoc-current-buffer - (setq p (car entry)) - (while (> p (point-min)) - (goto-char p) - (setq blk (nndoc-oe-dbx-decode-block)) - (setq p (point)) - (with-current-buffer cur - (insert-buffer-substring nndoc-current-buffer p (+ p (nth 2 blk)))) - (setq p (1+ (nth 3 blk))))) - (goto-char begin) - (while (re-search-forward "\r$" nil t) - (delete-backward-char 1)) - (when head - (goto-char begin) - (when (search-forward "\n\n" nil t) - (setcar (cddddr entry) (count-lines (point) (point-max))) - (delete-region (1- (point)) (point-max)))) - t)) - -(defun nndoc-oe-dbx-generate-head (article) - (nndoc-oe-dbx-generate-article article 'head)) - -(deffoo nndoc-request-accept-article (group &optional server last) - nil) - -;;; -;;; Functions for dissecting the documents -;;; - -(defun nndoc-search (regexp) - (prog1 - (re-search-forward regexp nil t) - (beginning-of-line))) - -(defun nndoc-dissect-buffer () - "Go through the document and partition it into heads/bodies/articles." - (let ((i 0) - (first t) - head-begin head-end body-begin body-end) - (setq nndoc-dissection-alist nil) - (save-excursion - (set-buffer nndoc-current-buffer) - (goto-char (point-min)) - ;; Remove blank lines. - (while (eq (following-char) ?\n) - (delete-char 1)) - (if nndoc-dissection-function - (funcall nndoc-dissection-function) - ;; Find the beginning of the file. - (when nndoc-file-begin - (nndoc-search nndoc-file-begin)) - ;; Go through the file. - (while (if (and first nndoc-first-article) - (nndoc-search nndoc-first-article) - (nndoc-article-begin)) - (setq first nil) - (cond (nndoc-head-begin-function - (funcall nndoc-head-begin-function)) - (nndoc-head-begin - (nndoc-search nndoc-head-begin))) - (if (or (eobp) - (and nndoc-file-end - (looking-at nndoc-file-end))) - (goto-char (point-max)) - (setq head-begin (point)) - (nndoc-search (or nndoc-head-end "^$")) - (setq head-end (point)) - (if nndoc-body-begin-function - (funcall nndoc-body-begin-function) - (nndoc-search (or nndoc-body-begin "^\n"))) - (setq body-begin (point)) - (or (and nndoc-body-end-function - (funcall nndoc-body-end-function)) - (and nndoc-body-end - (nndoc-search nndoc-body-end)) - (nndoc-article-begin) - (progn - (goto-char (point-max)) - (when nndoc-file-end - (and (re-search-backward nndoc-file-end nil t) - (beginning-of-line))))) - (setq body-end (point)) - (push (list (incf i) head-begin head-end body-begin body-end - (count-lines body-begin body-end)) - nndoc-dissection-alist))))))) - -(defun nndoc-article-begin () - (if nndoc-article-begin-function - (funcall nndoc-article-begin-function) - (ignore-errors - (nndoc-search nndoc-article-begin)))) - -(defun nndoc-unquote-dashes () - "Unquote quoted non-separators in digests." - (while (re-search-forward "^- -"nil t) - (replace-match "-" t t))) - -;; Against compiler warnings. -(defvar nndoc-mime-split-ordinal) - -(defun nndoc-dissect-mime-parts () - "Go through a MIME composite article and partition it into sub-articles. -When a MIME entity contains sub-entities, dissection produces one article for -the header of this entity, and one article per sub-entity." - (setq nndoc-dissection-alist nil - nndoc-mime-split-ordinal 0) - (save-excursion - (set-buffer nndoc-current-buffer) - (nndoc-dissect-mime-parts-sub (point-min) (point-max) nil nil nil))) - -(defun nndoc-dissect-mime-parts-sub (head-begin body-end article-insert - position parent) - "Dissect an entity, within a composite MIME message. -The complete message or MIME entity extends from HEAD-BEGIN to BODY-END. -ARTICLE-INSERT should be added at beginning for generating a full article. -The string POSITION holds a dotted decimal representation of the article -position in the hierarchical structure, it is nil for the outer entity. -PARENT is the message-ID of the parent summary line, or nil for none." - (let ((case-fold-search t) - (message-id (nnmail-message-id)) - head-end body-begin summary-insert message-rfc822 multipart-any - subject content-type type subtype boundary-regexp) - ;; Gracefully handle a missing body. - (goto-char head-begin) - (if (or (and (eq (char-after) ?\n) (or (forward-char 1) t)) - (search-forward "\n\n" body-end t)) - (setq head-end (1- (point)) - body-begin (point)) - (setq head-end body-end - body-begin body-end)) - (narrow-to-region head-begin head-end) - ;; Save MIME attributes. - (goto-char head-begin) - (setq content-type (message-fetch-field "Content-Type")) - (when content-type - (when (string-match - "^ *\\([^ \t\n/;]+\\)/\\([^ \t\n/;]+\\)" content-type) - (setq type (downcase (match-string 1 content-type)) - subtype (downcase (match-string 2 content-type)) - message-rfc822 (and (string= type "message") - (string= subtype "rfc822")) - multipart-any (string= type "multipart"))) - (when (string-match ";[ \t\n]*name=\\([^ \t\n;]+\\)" content-type) - (setq subject (match-string 1 content-type))) - (when (string-match "boundary=\"?\\([^\"\n]*[^\" \t\n]\\)" content-type) - (setq boundary-regexp (concat "^--" - (regexp-quote - (match-string 1 content-type)) - "\\(--\\)?[ \t]*\n")))) - (unless subject - (when (or multipart-any (not article-insert)) - (setq subject (message-fetch-field "Subject")))) - (unless type - (setq type "text" - subtype "plain")) - ;; Prepare the article and summary inserts. - (unless article-insert - (setq article-insert (buffer-substring (point-min) (point-max)) - head-end head-begin)) - (setq summary-insert article-insert) - ;; - summary Subject. - (setq summary-insert - (let ((line (concat "Subject: <" position - (and position multipart-any ".") - (and multipart-any "*") - (and (or position multipart-any) " ") - (cond ((string= subtype "plain") type) - ((string= subtype "basic") type) - (t subtype)) - ">" - (and subject " ") - subject - "\n"))) - (if (string-match "Subject:.*\n\\([ \t].*\n\\)*" summary-insert) - (replace-match line t t summary-insert) - (concat summary-insert line)))) - ;; - summary Message-ID. - (setq summary-insert - (let ((line (concat "Message-ID: " message-id "\n"))) - (if (string-match "Message-ID:.*\n\\([ \t].*\n\\)*" summary-insert) - (replace-match line t t summary-insert) - (concat summary-insert line)))) - ;; - summary References. - (when parent - (setq summary-insert - (let ((line (concat "References: " parent "\n"))) - (if (string-match "References:.*\n\\([ \t].*\n\\)*" - summary-insert) - (replace-match line t t summary-insert) - (concat summary-insert line))))) - ;; Generate dissection information for this entity. - (push (list (incf nndoc-mime-split-ordinal) - head-begin head-end body-begin body-end - (count-lines body-begin body-end) - article-insert summary-insert) - nndoc-dissection-alist) - ;; Recurse for all sub-entities, if any. - (widen) - (cond - (message-rfc822 - (save-excursion - (nndoc-dissect-mime-parts-sub body-begin body-end nil - position message-id))) - ((and multipart-any boundary-regexp) - (let ((part-counter 0) - part-begin part-end eof-flag) - (while (string-match "\ -^\\(Lines\\|Content-\\(Type\\|Transfer-Encoding\\|Disposition\\)\\):.*\n\\([ \t].*\n\\)*" - article-insert) - (setq article-insert (replace-match "" t t article-insert))) - (let ((case-fold-search nil)) - (goto-char body-begin) - (setq eof-flag (not (re-search-forward boundary-regexp body-end t))) - (while (not eof-flag) - (setq part-begin (point)) - (cond ((re-search-forward boundary-regexp body-end t) - (or (not (match-string 1)) - (string= (match-string 1) "") - (setq eof-flag t)) - (forward-line -1) - (setq part-end (point)) - (forward-line 1)) - (t (setq part-end body-end - eof-flag t))) - (save-excursion - (nndoc-dissect-mime-parts-sub - part-begin part-end article-insert - (concat position - (and position ".") - (format "%d" (incf part-counter))) - message-id))))))))) - -;;;###autoload -(defun nndoc-add-type (definition &optional position) - "Add document DEFINITION to the list of nndoc document definitions. -If POSITION is nil or `last', the definition will be added -as the last checked definition, if t or `first', add as the -first definition, and if any other symbol, add after that -symbol in the alist." - ;; First remove any old instances. - (gnus-pull (car definition) nndoc-type-alist) - ;; Then enter the new definition in the proper place. - (cond - ((or (null position) (eq position 'last)) - (setq nndoc-type-alist (nconc nndoc-type-alist (list definition)))) - ((or (eq position t) (eq position 'first)) - (push definition nndoc-type-alist)) - (t - (let ((list (memq (assq position nndoc-type-alist) - nndoc-type-alist))) - (unless list - (error "No such position: %s" position)) - (setcdr list (cons definition (cdr list))))))) - -(provide 'nndoc) - -;;; nndoc.el ends here diff --git a/lisp/nndraft.el b/lisp/nndraft.el deleted file mode 100644 index e1302a7..0000000 --- a/lisp/nndraft.el +++ /dev/null @@ -1,276 +0,0 @@ -;;; nndraft.el --- draft article access for Gnus -;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) - -(require 'nnheader) -(require 'nnmail) -(require 'gnus-start) -(require 'nnmh) -(require 'nnoo) - -(nnoo-declare nndraft - nnmh) - -(defvoo nndraft-directory (nnheader-concat gnus-directory "drafts/") - "Where nndraft will store its files." - nnmh-directory) - - - -(defvoo nndraft-current-group "" nil nnmh-current-group) -(defvoo nndraft-get-new-mail nil nil nnmh-get-new-mail) -(defvoo nndraft-current-directory nil nil nnmh-current-directory) - -(defconst nndraft-version "nndraft 1.0") -(defvoo nndraft-status-string "" nil nnmh-status-string) - - - -;;; Interface functions. - -(nnoo-define-basics nndraft) - -(deffoo nndraft-open-server (server &optional defs) - (nnoo-change-server 'nndraft server defs) - (cond - ((not (file-exists-p nndraft-directory)) - (nndraft-close-server) - (nnheader-report 'nndraft "No such file or directory: %s" - nndraft-directory)) - ((not (file-directory-p (file-truename nndraft-directory))) - (nndraft-close-server) - (nnheader-report 'nndraft "Not a directory: %s" nndraft-directory)) - (t - (nnheader-report 'nndraft "Opened server %s using directory %s" - server nndraft-directory) - t))) - -(deffoo nndraft-retrieve-headers (articles &optional group server fetch-old) - (nndraft-possibly-change-group group) - (save-excursion - (set-buffer nntp-server-buffer) - (erase-buffer) - (let* (article) - ;; We don't support fetching by Message-ID. - (if (stringp (car articles)) - 'headers - (while articles - (narrow-to-region (point) (point)) - (when (nndraft-request-article - (setq article (pop articles)) group server (current-buffer)) - (goto-char (point-min)) - (if (search-forward "\n\n" nil t) - (forward-line -1) - (goto-char (point-max))) - (delete-region (point) (point-max)) - (goto-char (point-min)) - (insert (format "221 %d Article retrieved.\n" article)) - (widen) - (goto-char (point-max)) - (insert ".\n"))) - - (nnheader-fold-continuation-lines) - 'headers)))) - -(deffoo nndraft-request-article (id &optional group server buffer) - (nndraft-possibly-change-group group) - (when (numberp id) - ;; We get the newest file of the auto-saved file and the - ;; "real" file. - (let* ((file (nndraft-article-filename id)) - (auto (nndraft-auto-save-file-name file)) - (newest (if (file-newer-than-file-p file auto) file auto)) - (nntp-server-buffer (or buffer nntp-server-buffer))) - (when (and (file-exists-p newest) - (let ((nnmail-file-coding-system nnheader-text-coding-system)) - (nnmail-find-file newest))) - (save-excursion - (set-buffer nntp-server-buffer) - (goto-char (point-min)) - ;; If there's a mail header separator in this file, - ;; we remove it. - (when (re-search-forward - (concat "^" mail-header-separator "$") nil t) - (replace-match "" t t))) - t)))) - -(deffoo nndraft-request-restore-buffer (article &optional group server) - "Request a new buffer that is restored to the state of ARTICLE." - (nndraft-possibly-change-group group) - (when (nndraft-request-article article group server (current-buffer)) - (message-remove-header "xref") - (message-remove-header "lines") - ;; Articles in nndraft:queue are considered as sent messages. The - ;; Date field should be the time when they are sent. - ;;(message-remove-header "date") - t)) - -(deffoo nndraft-request-update-info (group info &optional server) - (nndraft-possibly-change-group group) - (gnus-info-set-read - info - (gnus-update-read-articles (gnus-group-prefixed-name group '(nndraft "")) - (nndraft-articles) t)) - (let ((marks (nth 3 info))) - (when marks - ;; Nix out all marks except the `unsend'-able article marks. - (setcar (nthcdr 3 info) - (if (assq 'unsend marks) - (list (assq 'unsend marks)) - nil)))) - t) - -(deffoo nndraft-request-associate-buffer (group) - "Associate the current buffer with some article in the draft group." - (nndraft-open-server "") - (nndraft-request-group group) - (nndraft-possibly-change-group group) - (let ((gnus-verbose-backends nil) - (buf (current-buffer)) - article file) - (with-temp-buffer - (insert-buffer-substring buf) - (setq article (nndraft-request-accept-article - group (nnoo-current-server 'nndraft) t 'noinsert) - file (nndraft-article-filename article))) - (setq buffer-file-name (expand-file-name file) - buffer-auto-save-file-name (make-auto-save-file-name)) - (clear-visited-file-modtime) - article)) - -(deffoo nndraft-request-group (group &optional server dont-check) - (nndraft-possibly-change-group group) - (unless dont-check - (let* ((pathname (nnmail-group-pathname group nndraft-directory)) - (file-name-coding-system nnmail-pathname-coding-system) - dir file) - (nnheader-re-read-dir pathname) - (setq dir (mapcar (lambda (name) (string-to-int (substring name 1))) - (directory-files pathname nil "^#[0-9]+#$" t))) - (dolist (n dir) - (unless (file-exists-p - (setq file (expand-file-name (int-to-string n) pathname))) - (rename-file (nndraft-auto-save-file-name file) file))))) - (nnoo-parent-function 'nndraft - 'nnmh-request-group - (list group server dont-check))) - -(deffoo nndraft-request-expire-articles (articles group &optional server force) - (nndraft-possibly-change-group group) - (let* ((nnmh-allow-delete-final t) - (res (nnoo-parent-function 'nndraft - 'nnmh-request-expire-articles - (list articles group server force))) - article) - ;; Delete all the "state" files of articles that have been expired. - (while articles - (unless (memq (setq article (pop articles)) res) - (let ((auto (nndraft-auto-save-file-name - (nndraft-article-filename article)))) - (when (file-exists-p auto) - (funcall nnmail-delete-file-function auto))) - (dolist (backup - (let ((kept-new-versions 1) - (kept-old-versions 0)) - (find-backup-file-name - (nndraft-article-filename article)))) - (when (file-exists-p backup) - (funcall nnmail-delete-file-function backup))))) - res)) - -(deffoo nndraft-request-accept-article (group &optional server last noinsert) - (nndraft-possibly-change-group group) - (let ((gnus-verbose-backends nil)) - (nnoo-parent-function 'nndraft 'nnmh-request-accept-article - (list group server last noinsert)))) - -(deffoo nndraft-request-replace-article (article group buffer) - (nndraft-possibly-change-group group) - (let ((nnmail-file-coding-system nnheader-text-coding-system)) - (nnoo-parent-function 'nndraft 'nnmh-request-replace-article - (list article group buffer)))) - -(deffoo nndraft-request-create-group (group &optional server args) - (nndraft-possibly-change-group group) - (if (file-exists-p nndraft-current-directory) - (if (file-directory-p nndraft-current-directory) - t - nil) - (condition-case () - (progn - (gnus-make-directory nndraft-current-directory) - t) - (file-error nil)))) - - -;;; Low-Level Interface - -(defun nndraft-possibly-change-group (group) - (when (and group - (not (equal group nndraft-current-group))) - (nndraft-open-server "") - (setq nndraft-current-group group) - (setq nndraft-current-directory - (nnheader-concat nndraft-directory group)))) - -(defun nndraft-article-filename (article &rest args) - (apply 'concat - (file-name-as-directory nndraft-current-directory) - (int-to-string article) - args)) - -(defun nndraft-auto-save-file-name (file) - (save-excursion - (prog1 - (progn - (set-buffer (get-buffer-create " *draft tmp*")) - (setq buffer-file-name file) - (make-auto-save-file-name)) - (kill-buffer (current-buffer))))) - -(defun nndraft-articles () - "Return the list of messages in the group." - (gnus-make-directory nndraft-current-directory) - (sort - (mapcar 'string-to-int - (directory-files nndraft-current-directory nil "\\`[0-9]+\\'" t)) - '<)) - -(nnoo-import nndraft - (nnmh - nnmh-retrieve-headers - nnmh-request-group - nnmh-close-group - nnmh-request-list - nnmh-request-newsgroups - nnmh-request-move-article)) - -(provide 'nndraft) - -;;; nndraft.el ends here diff --git a/lisp/nneething.el b/lisp/nneething.el deleted file mode 100644 index 7b713c4..0000000 --- a/lisp/nneething.el +++ /dev/null @@ -1,377 +0,0 @@ -;;; nneething.el --- arbitrary file access for Gnus - -;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Masanobu UMEDA -;; Keywords: news, mail - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) - -(require 'nnheader) -(require 'nnmail) -(require 'nnoo) -(require 'gnus-util) - -(nnoo-declare nneething) - -(defvoo nneething-map-file-directory "~/.nneething/" - "Where nneething stores the map files.") - -(defvoo nneething-map-file ".nneething" - "Name of the map files.") - -(defvoo nneething-exclude-files nil - "Regexp saying what files to exclude from the group. -If this variable is nil, no files will be excluded.") - -(defvoo nneething-include-files nil - "Regexp saying what files to include in the group. -If this variable is non-nil, only files matching this regexp will be -included.") - - - -;;; Internal variables. - -(defconst nneething-version "nneething 1.0" - "nneething version.") - -(defvoo nneething-current-directory nil - "Current news group directory.") - -(defvoo nneething-status-string "") - -(defvoo nneething-message-id-number 0) -(defvoo nneething-work-buffer " *nneething work*") - -(defvoo nneething-group nil) -(defvoo nneething-map nil) -(defvoo nneething-read-only nil) -(defvoo nneething-active nil) -(defvoo nneething-address nil) - - - -;;; Interface functions. - -(nnoo-define-basics nneething) - -(deffoo nneething-retrieve-headers (articles &optional group server fetch-old) - (nneething-possibly-change-directory group) - - (save-excursion - (set-buffer nntp-server-buffer) - (erase-buffer) - (let* ((number (length articles)) - (count 0) - (large (and (numberp nnmail-large-newsgroup) - (> number nnmail-large-newsgroup))) - article file) - - (if (stringp (car articles)) - 'headers - - (while (setq article (pop articles)) - (setq file (nneething-file-name article)) - - (when (and (file-exists-p file) - (or (file-directory-p file) - (not (zerop (nnheader-file-size file))))) - (insert (format "221 %d Article retrieved.\n" article)) - (nneething-insert-head file) - (insert ".\n")) - - (incf count) - - (and large - (zerop (% count 20)) - (nnheader-message 5 "nneething: Receiving headers... %d%%" - (/ (* count 100) number)))) - - (when large - (nnheader-message 5 "nneething: Receiving headers...done")) - - (nnheader-fold-continuation-lines) - 'headers)))) - -(deffoo nneething-request-article (id &optional group server buffer) - (nneething-possibly-change-directory group) - (let ((file (unless (stringp id) - (nneething-file-name id))) - (nntp-server-buffer (or buffer nntp-server-buffer))) - (and (stringp file) ; We did not request by Message-ID. - (file-exists-p file) ; The file exists. - (not (file-directory-p file)) ; It's not a dir. - (save-excursion - (nnmail-find-file file) ; Insert the file in the nntp buf. - (unless (nnheader-article-p) ; Either it's a real article... - (goto-char (point-min)) - (nneething-make-head - file (current-buffer)) ; ... or we fake some headers. - (insert "\n")) - t)))) - -(deffoo nneething-request-group (group &optional server dont-check) - (nneething-possibly-change-directory group server) - (unless dont-check - (nneething-create-mapping) - (if (> (car nneething-active) (cdr nneething-active)) - (nnheader-insert "211 0 1 0 %s\n" group) - (nnheader-insert - "211 %d %d %d %s\n" - (- (1+ (cdr nneething-active)) (car nneething-active)) - (car nneething-active) (cdr nneething-active) - group))) - t) - -(deffoo nneething-request-list (&optional server dir) - (nnheader-report 'nneething "LIST is not implemented.")) - -(deffoo nneething-request-newgroups (date &optional server) - (nnheader-report 'nneething "NEWSGROUPS is not implemented.")) - -(deffoo nneething-request-type (group &optional article) - 'unknown) - -(deffoo nneething-close-group (group &optional server) - (setq nneething-current-directory nil) - t) - -(deffoo nneething-open-server (server &optional defs) - (nnheader-init-server-buffer) - (if (nneething-server-opened server) - t - (unless (assq 'nneething-address defs) - (setq defs (append defs (list (list 'nneething-address server))))) - (nnoo-change-server 'nneething server defs))) - - -;;; Internal functions. - -(defun nneething-possibly-change-directory (group &optional server) - (when (and server - (not (nneething-server-opened server))) - (nneething-open-server server)) - (when (and group - (not (equal nneething-group group))) - (setq nneething-group group) - (setq nneething-map nil) - (setq nneething-active (cons 1 0)) - (nneething-create-mapping))) - -(defun nneething-map-file () - ;; We make sure that the .nneething directory exists. - (gnus-make-directory nneething-map-file-directory) - ;; We store it in a special directory under the user's home dir. - (concat (file-name-as-directory nneething-map-file-directory) - nneething-group nneething-map-file)) - -(defun nneething-create-mapping () - ;; Read nneething-active and nneething-map. - (when (file-exists-p nneething-address) - (let ((map-file (nneething-map-file)) - (files (directory-files nneething-address)) - touched map-files) - (when (file-exists-p map-file) - (ignore-errors - (load map-file nil t t))) - (unless nneething-active - (setq nneething-active (cons 1 0))) - ;; Old nneething had a different map format. - (when (and (cdar nneething-map) - (atom (cdar nneething-map))) - (setq nneething-map - (mapcar (lambda (n) - (list (cdr n) (car n) - (nth 5 (file-attributes - (nneething-file-name (car n)))))) - nneething-map))) - ;; Remove files matching the exclusion regexp. - (when nneething-exclude-files - (let ((f files) - prev) - (while f - (if (string-match nneething-exclude-files (car f)) - (if prev (setcdr prev (cdr f)) - (setq files (cdr files))) - (setq prev f)) - (setq f (cdr f))))) - ;; Remove files not matching the inclusion regexp. - (when nneething-include-files - (let ((f files) - prev) - (while f - (if (not (string-match nneething-include-files (car f))) - (if prev (setcdr prev (cdr f)) - (setq files (cdr files))) - (setq prev f)) - (setq f (cdr f))))) - ;; Remove deleted files from the map. - (let ((map nneething-map) - prev) - (while map - (if (and (member (cadr (car map)) files) - ;; We also remove files that have changed mod times. - (equal (nth 5 (file-attributes - (nneething-file-name (cadr (car map))))) - (cadr (cdar map)))) - (progn - (push (cadr (car map)) map-files) - (setq prev map)) - (setq touched t) - (if prev - (setcdr prev (cdr map)) - (setq nneething-map (cdr nneething-map)))) - (setq map (cdr map)))) - ;; Find all new files and enter them into the map. - (while files - (unless (member (car files) map-files) - ;; This file is not in the map, so we enter it. - (setq touched t) - (setcdr nneething-active (1+ (cdr nneething-active))) - (push (list (cdr nneething-active) (car files) - (nth 5 (file-attributes - (nneething-file-name (car files))))) - nneething-map)) - (setq files (cdr files))) - (when (and touched - (not nneething-read-only)) - (with-temp-file map-file - (insert "(setq nneething-map '") - (gnus-prin1 nneething-map) - (insert ")\n(setq nneething-active '") - (gnus-prin1 nneething-active) - (insert ")\n")))))) - -(defun nneething-insert-head (file) - "Insert the head of FILE." - (when (nneething-get-head file) - (insert-buffer-substring nneething-work-buffer) - (goto-char (point-max)))) - -(defun nneething-make-head (file &optional buffer extra-msg) - "Create a head by looking at the file attributes of FILE." - (let ((atts (file-attributes file))) - (insert - "Subject: " (file-name-nondirectory file) (or extra-msg "") "\n" - "Message-ID: \n" - (if (equal '(0 0) (nth 5 atts)) "" - (concat "Date: " (current-time-string (nth 5 atts)) "\n")) - (or (when buffer - (save-excursion - (set-buffer buffer) - (when (re-search-forward "<[a-zA-Z0-9_]@[-a-zA-Z0-9_]>" 1000 t) - (concat "From: " (match-string 0) "\n")))) - (nneething-from-line (nth 2 atts) file)) - (if (> (string-to-int (int-to-string (nth 7 atts))) 0) - (concat "Chars: " (int-to-string (nth 7 atts)) "\n") - "") - (if buffer - (save-excursion - (set-buffer buffer) - (concat "Lines: " (int-to-string - (count-lines (point-min) (point-max))) - "\n")) - "")))) - -(defun nneething-from-line (uid &optional file) - "Return a From header based of UID." - (let* ((login (condition-case nil - (user-login-name uid) - (error - (cond ((= uid (user-uid)) (user-login-name)) - ((zerop uid) "root") - (t (int-to-string uid)))))) - (name (condition-case nil - (user-full-name uid) - (error - (cond ((= uid (user-uid)) (user-full-name)) - ((zerop uid) "Ms. Root"))))) - (host (if (string-match "\\`/[^/@]*@\\([^:/]+\\):" file) - (prog1 - (substring file - (match-beginning 1) - (match-end 1)) - (when (string-match - "/\\(users\\|home\\)/\\([^/]+\\)/" file) - (setq login (substring file - (match-beginning 2) - (match-end 2)) - name nil))) - (system-name)))) - (concat "From: " login "@" host - (if name (concat " (" name ")") "") "\n"))) - -(defun nneething-get-head (file) - "Either find the head in FILE or make a head for FILE." - (save-excursion - (set-buffer (get-buffer-create nneething-work-buffer)) - (setq case-fold-search nil) - (buffer-disable-undo) - (erase-buffer) - (cond - ((not (file-exists-p file)) - ;; The file do not exist. - nil) - ((or (file-directory-p file) - (file-symlink-p file)) - ;; It's a dir, so we fudge a head. - (nneething-make-head file) t) - (t - ;; We examine the file. - (condition-case () - (progn - (nnheader-insert-head file) - (if (nnheader-article-p) - (delete-region - (progn - (goto-char (point-min)) - (or (and (search-forward "\n\n" nil t) - (1- (point))) - (point-max))) - (point-max)) - (goto-char (point-min)) - (nneething-make-head file (current-buffer)) - (delete-region (point) (point-max)))) - (file-error - (nneething-make-head file (current-buffer) " (unreadable)"))) - t)))) - -(defun nneething-file-name (article) - "Return the file name of ARTICLE." - (let ((dir (file-name-as-directory nneething-address)) - fname) - (if (numberp article) - (if (setq fname (cadr (assq article nneething-map))) - (expand-file-name fname dir) - (make-temp-name (expand-file-name "nneething" dir))) - (expand-file-name article dir)))) - -(provide 'nneething) - -;;; nneething.el ends here diff --git a/lisp/nnfolder.el b/lisp/nnfolder.el deleted file mode 100644 index 3f31789..0000000 --- a/lisp/nnfolder.el +++ /dev/null @@ -1,1235 +0,0 @@ -;;; nnfolder.el --- mail folder access for Gnus -;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001 -;; Free Software Foundation, Inc. - -;; Author: Simon Josefsson (adding MARKS) -;; ShengHuo Zhu (adding NOV) -;; Scott Byer -;; Lars Magne Ingebrigtsen -;; Masanobu UMEDA -;; Keywords: mail - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) -(eval-when-compile (require 'gnus-clfns)) - -(require 'nnheader) -(require 'message) -(require 'nnmail) -(require 'nnoo) -(require 'gnus) -(require 'gnus-util) -(require 'gnus-range) - -(eval-and-compile - (autoload 'gnus-intersection "gnus-range")) - -(nnoo-declare nnfolder) - -(defvoo nnfolder-directory (expand-file-name message-directory) - "The name of the nnfolder directory. - -This variable is a virtual server slot. See the Gnus manual for details.") - -(defvoo nnfolder-nov-directory nil - "The name of the nnfolder NOV directory. -If nil, `nnfolder-directory' is used.") - -(defvoo nnfolder-marks-directory nil - "The name of the nnfolder MARKS directory. -If nil, `nnfolder-directory' is used.") - -(defvoo nnfolder-active-file - (nnheader-concat nnfolder-directory "active") - "The name of the active file. - -This variable is a virtual server slot. See the Gnus manual for details.") - -;; I renamed this variable to something more in keeping with the general GNU -;; style. -SLB - -(defvoo nnfolder-ignore-active-file nil - "If non-nil, the active file is ignored. -This causes nnfolder to do some extra work in order to determine the -true active ranges of an mbox file. Note that the active file is -still saved, but its values are not used. This costs some extra time -when scanning an mbox when opening it.") - -(defvoo nnfolder-distrust-mbox nil - "If non-nil, the folder will be distrusted. -This means that nnfolder will not trust the user with respect to -inserting unaccounted for mail in the middle of an mbox file. This -can greatly slow down scans, which now must scan the entire file for -unmarked messages. When nil, scans occur forward from the last marked -message, a huge time saver for large mailboxes.") - -(defvoo nnfolder-newsgroups-file - (concat (file-name-as-directory nnfolder-directory) "newsgroups") - "Mail newsgroups description file. - -This variable is a virtual server slot. See the Gnus manual for details.") - -(defvoo nnfolder-get-new-mail t - "If non-nil, nnfolder will check the incoming mail file and split the mail. - -This variable is a virtual server slot. See the Gnus manual for details.") - -(defvoo nnfolder-prepare-save-mail-hook nil - "Hook run narrowed to an article before saving.") - -(defvoo nnfolder-save-buffer-hook nil - "Hook run before saving the nnfolder mbox buffer. - -This variable is a virtual server slot. See the Gnus manual for details.") - - -(defvoo nnfolder-inhibit-expiry nil - "If non-nil, inhibit expiry. - -This variable is a virtual server slot. See the Gnus manual for details.") - - - -(defconst nnfolder-version "nnfolder 2.0" - "nnfolder version.") - -(defconst nnfolder-article-marker "X-Gnus-Article-Number: " - "String used to demarcate what the article number for a message is.") - -(defvoo nnfolder-current-group nil) -(defvoo nnfolder-current-buffer nil) -(defvoo nnfolder-status-string "") -(defvoo nnfolder-group-alist nil) -(defvoo nnfolder-buffer-alist nil) -(defvoo nnfolder-scantime-alist nil) -(defvoo nnfolder-active-timestamp nil) -(defvoo nnfolder-active-file-coding-system nnheader-text-coding-system) -(defvoo nnfolder-active-file-coding-system-for-write - nnmail-active-file-coding-system) -(defvoo nnfolder-file-coding-system nnheader-text-coding-system) -(defvoo nnfolder-file-coding-system-for-write nnheader-file-coding-system - "Coding system for save nnfolder file. -If NIL, NNFOLDER-FILE-CODING-SYSTEM is used.") - -(defvoo nnfolder-nov-is-evil nil - "If non-nil, Gnus will never generate and use nov databases for mail groups. -Using nov databases will speed up header fetching considerably. -This variable shouldn't be flipped much. If you have, for some reason, -set this to t, and want to set it to nil again, you should always run -the `nnfolder-generate-active-file' command. The function will go -through all nnfolder directories and generate nov databases for them -all. This may very well take some time. - -This variable is a virtual server slot. See the Gnus manual for details.") - -(defvoo nnfolder-nov-file-suffix ".nov") - -(defvoo nnfolder-nov-buffer-alist nil) - -(defvar nnfolder-nov-buffer-file-name nil) - -(defvoo nnfolder-marks-is-evil nil - "If non-nil, Gnus will never generate and use marks file for mail groups. -Using marks files makes it possible to backup and restore mail groups -separately from `.newsrc.eld'. If you have, for some reason, set -this to t, and want to set it to nil again, you should always remove -the corresponding marks file (usually base nnfolder file name -concatenated with `.mrk', but see `nnfolder-marks-file-suffix') for -the group. Then the marks file will be regenerated properly by Gnus. - -This variable is a virtual server slot. See the Gnus manual for details.") - -(defvoo nnfolder-marks nil) - -(defvoo nnfolder-marks-file-suffix ".mrk") - - - -;;; Interface functions - -(nnoo-define-basics nnfolder) - -(deffoo nnfolder-retrieve-headers (articles &optional group server fetch-old) - (save-excursion - (set-buffer nntp-server-buffer) - (erase-buffer) - (let (article start stop) - (nnfolder-possibly-change-group group server) - (when nnfolder-current-buffer - (set-buffer nnfolder-current-buffer) - (goto-char (point-min)) - (if (stringp (car articles)) - 'headers - (if (nnfolder-retrieve-headers-with-nov articles fetch-old) - 'nov - (setq articles (gnus-sorted-intersection - ;; Is ARTICLES sorted? - (sort articles '<) - (nnfolder-existing-articles))) - (while (setq article (pop articles)) - (set-buffer nnfolder-current-buffer) - (when (nnfolder-goto-article article) - (setq start (point)) - (setq stop (if (search-forward "\n\n" nil t) - (1- (point)) - (point-max))) - (set-buffer nntp-server-buffer) - (insert (format "221 %d Article retrieved.\n" article)) - (insert-buffer-substring nnfolder-current-buffer start stop) - (goto-char (point-max)) - (insert ".\n"))) - (set-buffer nntp-server-buffer) - (nnheader-fold-continuation-lines) - 'headers)))))) - -(deffoo nnfolder-open-server (server &optional defs) - (nnoo-change-server 'nnfolder server defs) - (nnmail-activate 'nnfolder t) - (gnus-make-directory nnfolder-directory) - (unless (or gnus-nov-is-evil nnfolder-nov-is-evil) - (and nnfolder-nov-directory - (gnus-make-directory nnfolder-nov-directory))) - (unless nnfolder-marks-is-evil - (and nnfolder-marks-directory - (gnus-make-directory nnfolder-marks-directory))) - (cond - ((not (file-exists-p nnfolder-directory)) - (nnfolder-close-server) - (nnheader-report 'nnfolder "Couldn't create directory: %s" - nnfolder-directory)) - ((not (file-directory-p (file-truename nnfolder-directory))) - (nnfolder-close-server) - (nnheader-report 'nnfolder "Not a directory: %s" nnfolder-directory)) - (t - (nnmail-activate 'nnfolder) - (nnheader-report 'nnfolder "Opened server %s using directory %s" - server nnfolder-directory) - t))) - -(deffoo nnfolder-request-close () - (let ((alist nnfolder-buffer-alist)) - (while alist - (nnfolder-close-group (caar alist) nil t) - (setq alist (cdr alist)))) - (nnoo-close-server 'nnfolder) - (setq nnfolder-buffer-alist nil - nnfolder-group-alist nil)) - -(deffoo nnfolder-request-article (article &optional group server buffer) - (nnfolder-possibly-change-group group server) - (save-excursion - (set-buffer nnfolder-current-buffer) - (goto-char (point-min)) - (when (nnfolder-goto-article article) - (let (start stop) - (setq start (point)) - (forward-line 1) - (unless (and (nnmail-search-unix-mail-delim) - (forward-line -1)) - (goto-char (point-max))) - (setq stop (point)) - (let ((nntp-server-buffer (or buffer nntp-server-buffer))) - (set-buffer nntp-server-buffer) - (erase-buffer) - (insert-buffer-substring nnfolder-current-buffer start stop) - (goto-char (point-min)) - (while (looking-at "From ") - (delete-char 5) - (insert "X-From-Line: ") - (forward-line 1)) - (if (numberp article) - (cons nnfolder-current-group article) - (goto-char (point-min)) - (cons nnfolder-current-group - (if (search-forward (concat "\n" nnfolder-article-marker) - nil t) - (string-to-int - (buffer-substring - (point) (progn (end-of-line) (point)))) - -1)))))))) - -(deffoo nnfolder-request-group (group &optional server dont-check) - (nnfolder-possibly-change-group group server t) - (save-excursion - (if (not (assoc group nnfolder-group-alist)) - (nnheader-report 'nnfolder "No such group: %s" group) - (if dont-check - (progn - (nnheader-report 'nnfolder "Selected group %s" group) - t) - (let* ((active (assoc group nnfolder-group-alist)) - (group (car active)) - (range (cadr active))) - (cond - ((null active) - (nnheader-report 'nnfolder "No such group: %s" group)) - ((null nnfolder-current-group) - (nnheader-report 'nnfolder "Empty group: %s" group)) - (t - (nnheader-report 'nnfolder "Selected group %s" group) - (nnheader-insert "211 %d %d %d %s\n" - (1+ (- (cdr range) (car range))) - (car range) (cdr range) group)))))))) - -(deffoo nnfolder-request-scan (&optional group server) - (nnfolder-possibly-change-group nil server) - (when nnfolder-get-new-mail - (nnfolder-possibly-change-group group server) - (nnmail-get-new-mail - 'nnfolder - (lambda () - (let ((bufs nnfolder-buffer-alist)) - (save-excursion - (while bufs - (if (not (gnus-buffer-live-p (nth 1 (car bufs)))) - (setq nnfolder-buffer-alist - (delq (car bufs) nnfolder-buffer-alist)) - (set-buffer (nth 1 (car bufs))) - (nnfolder-save-buffer) - (kill-buffer (current-buffer))) - (setq bufs (cdr bufs)))))) - nnfolder-directory - group))) - -;; Don't close the buffer if we're not shutting down the server. This way, -;; we can keep the buffer in the group buffer cache, and not have to grovel -;; over the buffer again unless we add new mail to it or modify it in some -;; way. - -(deffoo nnfolder-close-group (group &optional server force) - ;; Make sure we _had_ the group open. - (when (or (assoc group nnfolder-buffer-alist) - (equal group nnfolder-current-group)) - (let ((inf (assoc group nnfolder-buffer-alist))) - (when inf - (when (and nnfolder-current-group - nnfolder-current-buffer) - (push (list nnfolder-current-group nnfolder-current-buffer) - nnfolder-buffer-alist)) - (setq nnfolder-buffer-alist - (delq inf nnfolder-buffer-alist)) - (setq nnfolder-current-buffer (cadr inf) - nnfolder-current-group (car inf)))) - (when (and nnfolder-current-buffer - (buffer-name nnfolder-current-buffer)) - (save-excursion - (set-buffer nnfolder-current-buffer) - ;; If the buffer was modified, write the file out now. - (nnfolder-save-buffer) - ;; If we're shutting the server down, we need to kill the - ;; buffer and remove it from the open buffer list. Or, of - ;; course, if we're trying to minimize our space impact. - (kill-buffer (current-buffer)) - (setq nnfolder-buffer-alist (delq (assoc group nnfolder-buffer-alist) - nnfolder-buffer-alist))))) - (setq nnfolder-current-group nil - nnfolder-current-buffer nil) - t) - -(deffoo nnfolder-request-create-group (group &optional server args) - (nnfolder-possibly-change-group nil server) - (nnmail-activate 'nnfolder) - (when group - (unless (assoc group nnfolder-group-alist) - (push (list group (cons 1 0)) nnfolder-group-alist) - (nnfolder-save-active nnfolder-group-alist nnfolder-active-file) - (nnfolder-read-folder group))) - t) - -(deffoo nnfolder-request-list (&optional server) - (nnfolder-possibly-change-group nil server) - (save-excursion - (let ((nnmail-file-coding-system nnfolder-active-file-coding-system)) - (nnmail-find-file nnfolder-active-file) - (setq nnfolder-group-alist (nnmail-get-active))) - t)) - -(deffoo nnfolder-request-newgroups (date &optional server) - (nnfolder-possibly-change-group nil server) - (nnfolder-request-list server)) - -(deffoo nnfolder-request-list-newsgroups (&optional server) - (nnfolder-possibly-change-group nil server) - (save-excursion - (let ((nnmail-file-coding-system nnfolder-file-coding-system)) - (nnmail-find-file nnfolder-newsgroups-file)))) - -;; Return a list consisting of all article numbers existing in the -;; current folder. - -(defun nnfolder-existing-articles () - (save-excursion - (when nnfolder-current-buffer - (set-buffer nnfolder-current-buffer) - (goto-char (point-min)) - (let ((marker (concat "\n" nnfolder-article-marker)) - (number "[0-9]+") - numbers) - (while (and (search-forward marker nil t) - (re-search-forward number nil t)) - (let ((newnum (string-to-number (match-string 0)))) - (if (nnmail-within-headers-p) - (push newnum numbers)))) - ;; The article numbers are increasing, so this result is sorted. - (nreverse numbers))))) - -(deffoo nnfolder-request-expire-articles - (articles newsgroup &optional server force) - (nnfolder-possibly-change-group newsgroup server) - (let* ((is-old t) - ;; The articles we have deleted so far. - (deleted-articles nil) - ;; The articles that really exist and will - ;; be expired if they are old enough. - (maybe-expirable - (gnus-sorted-intersection articles (nnfolder-existing-articles)))) - (nnmail-activate 'nnfolder) - - (save-excursion - (set-buffer nnfolder-current-buffer) - ;; Since messages are sorted in arrival order and expired in the - ;; same order, we can stop as soon as we find a message that is - ;; too old. - (while (and maybe-expirable is-old) - (goto-char (point-min)) - (when (and (nnfolder-goto-article (car maybe-expirable)) - (search-forward (concat "\n" nnfolder-article-marker) - nil t)) - (forward-sexp) - (when (setq is-old - (nnmail-expired-article-p - newsgroup - (buffer-substring - (point) (progn (end-of-line) (point))) - force nnfolder-inhibit-expiry)) - (unless (eq nnmail-expiry-target 'delete) - (with-temp-buffer - (nnfolder-request-article (car maybe-expirable) - newsgroup server (current-buffer)) - (let ((nnml-current-directory nil)) - (nnmail-expiry-target-group - nnmail-expiry-target newsgroup)))) - (nnheader-message 5 "Deleting article %d in %s..." - (car maybe-expirable) newsgroup) - (nnfolder-delete-mail) - (unless (or gnus-nov-is-evil nnfolder-nov-is-evil) - (nnfolder-nov-delete-article newsgroup (car maybe-expirable))) - ;; Must remember which articles were actually deleted - (push (car maybe-expirable) deleted-articles))) - (setq maybe-expirable (cdr maybe-expirable))) - (unless nnfolder-inhibit-expiry - (nnheader-message 5 "Deleting articles...done")) - (nnfolder-save-buffer) - (nnfolder-adjust-min-active newsgroup) - (nnfolder-save-active nnfolder-group-alist nnfolder-active-file) - (gnus-sorted-complement articles (nreverse deleted-articles))))) - -(deffoo nnfolder-request-move-article (article group server - accept-form &optional last) - (save-excursion - (let ((buf (get-buffer-create " *nnfolder move*")) - result) - (and - (nnfolder-request-article article group server) - (save-excursion - (set-buffer buf) - (erase-buffer) - (insert-buffer-substring nntp-server-buffer) - (goto-char (point-min)) - (while (re-search-forward - (concat "^" nnfolder-article-marker) - (save-excursion (and (search-forward "\n\n" nil t) (point))) - t) - (delete-region (progn (beginning-of-line) (point)) - (progn (forward-line 1) (point)))) - (setq result (eval accept-form)) - (kill-buffer buf) - result) - (save-excursion - (nnfolder-possibly-change-group group server) - (set-buffer nnfolder-current-buffer) - (goto-char (point-min)) - (when (nnfolder-goto-article article) - (nnfolder-delete-mail)) - (unless (or gnus-nov-is-evil nnfolder-nov-is-evil) - (nnfolder-nov-delete-article group article)) - (when last - (nnfolder-save-buffer) - (nnfolder-adjust-min-active group) - (nnfolder-save-active nnfolder-group-alist nnfolder-active-file)))) - result))) - -(deffoo nnfolder-request-accept-article (group &optional server last) - (save-excursion - (nnfolder-possibly-change-group group server) - (nnmail-check-syntax) - (let ((buf (current-buffer)) - result art-group) - (goto-char (point-min)) - (when (looking-at "X-From-Line: ") - (replace-match "From ")) - (with-temp-buffer - (let ((nnmail-file-coding-system nnfolder-active-file-coding-system) - (nntp-server-buffer (current-buffer))) - (nnmail-find-file nnfolder-active-file) - (setq nnfolder-group-alist (nnmail-parse-active)))) - (save-excursion - (goto-char (point-min)) - (if (search-forward "\n\n" nil t) - (forward-line -1) - (goto-char (point-max))) - (while (re-search-backward (concat "^" nnfolder-article-marker) nil t) - (delete-region (point) (progn (forward-line 1) (point)))) - (when nnmail-cache-accepted-message-ids - (nnmail-cache-insert (nnmail-fetch-field "message-id"))) - (setq result (if (stringp group) - (list (cons group (nnfolder-active-number group))) - (setq art-group - (nnmail-article-group 'nnfolder-active-number)))) - (if (and (null result) - (yes-or-no-p "Moved to `junk' group; delete article? ")) - (setq result 'junk) - (setq result - (car (nnfolder-save-mail result))))) - (when last - (save-excursion - (nnfolder-possibly-change-folder (or (caar art-group) group)) - (nnfolder-save-buffer) - (when nnmail-cache-accepted-message-ids - (nnmail-cache-close)))) - (nnfolder-save-active nnfolder-group-alist nnfolder-active-file) - (unless result - (nnheader-report 'nnfolder "Couldn't store article")) - result))) - -(deffoo nnfolder-request-replace-article (article group buffer) - (nnfolder-possibly-change-group group) - (save-excursion - (set-buffer buffer) - (goto-char (point-min)) - (let (xfrom) - (while (re-search-forward "^X-From-Line: \\(.*\\)$" nil t) - (setq xfrom (match-string 1)) - (gnus-delete-line)) - (goto-char (point-min)) - (if xfrom - (insert "From " xfrom "\n") - (unless (looking-at "From ") - (insert "From nobody " (current-time-string) "\n")))) - (nnfolder-normalize-buffer) - (set-buffer nnfolder-current-buffer) - (goto-char (point-min)) - (if (not (nnfolder-goto-article article)) - nil - (nnfolder-delete-mail) - (insert-buffer-substring buffer) - (unless (or gnus-nov-is-evil nnfolder-nov-is-evil) - (save-excursion - (set-buffer buffer) - (let ((headers (nnfolder-parse-head article - (point-min) (point-max)))) - (with-current-buffer (nnfolder-open-nov group) - (if (nnheader-find-nov-line article) - (delete-region (point) (progn (forward-line 1) (point)))) - (nnheader-insert-nov headers))))) - (nnfolder-save-buffer) - t))) - -(deffoo nnfolder-request-delete-group (group &optional force server) - (nnfolder-close-group group server t) - ;; Delete all articles in GROUP. - (if (not force) - () ; Don't delete the articles. - ;; Delete the file that holds the group. - (ignore-errors - (delete-file (nnfolder-group-pathname group)) - (when (file-exists-p (nnfolder-group-nov-pathname group)) - (delete-file (nnfolder-group-nov-pathname group))) - (when (file-exists-p (nnfolder-group-marks-pathname group)) - (delete-file (nnfolder-group-marks-pathname group))))) - ;; Remove the group from all structures. - (setq nnfolder-group-alist - (delq (assoc group nnfolder-group-alist) nnfolder-group-alist) - nnfolder-current-group nil - nnfolder-current-buffer nil) - ;; Save the active file. - (nnfolder-save-active nnfolder-group-alist nnfolder-active-file) - t) - -(deffoo nnfolder-request-rename-group (group new-name &optional server) - (nnfolder-possibly-change-group group server) - (save-excursion - (set-buffer nnfolder-current-buffer) - (and (file-writable-p buffer-file-name) - (ignore-errors - (let ((new-file (nnfolder-group-pathname new-name))) - (gnus-make-directory (file-name-directory new-file)) - (rename-file buffer-file-name new-file) - (when (file-exists-p (nnfolder-group-nov-pathname group)) - (setq new-file (nnfolder-group-nov-pathname new-name)) - (gnus-make-directory (file-name-directory new-file)) - (rename-file (nnfolder-group-nov-pathname group) new-file)) - (when (file-exists-p (nnfolder-group-marks-pathname group)) - (setq new-file (nnfolder-group-marks-pathname new-name)) - (gnus-make-directory (file-name-directory new-file)) - (rename-file (nnfolder-group-marks-pathname group) new-file))) - t) - ;; That went ok, so we change the internal structures. - (let ((entry (assoc group nnfolder-group-alist))) - (and entry (setcar entry new-name)) - (setq nnfolder-current-buffer nil - nnfolder-current-group nil) - ;; Save the new group alist. - (nnfolder-save-active nnfolder-group-alist nnfolder-active-file) - ;; We kill the buffer instead of renaming it and stuff. - (kill-buffer (current-buffer)) - t)))) - -(deffoo nnfolder-request-regenerate (server) - (nnfolder-possibly-change-group nil server) - (nnfolder-generate-active-file) - t) - - -;;; Internal functions. - -(defun nnfolder-adjust-min-active (group) - ;; Find the lowest active article in this group. - (let* ((active (cadr (assoc group nnfolder-group-alist))) - (marker (concat "\n" nnfolder-article-marker)) - (number "[0-9]+") - (activemin (cdr active))) - (save-excursion - (set-buffer nnfolder-current-buffer) - (goto-char (point-min)) - (while (and (search-forward marker nil t) - (re-search-forward number nil t)) - (let ((newnum (string-to-number (match-string 0)))) - (if (nnmail-within-headers-p) - (setq activemin (min activemin newnum))))) - (setcar active activemin)))) - -(defun nnfolder-article-string (article) - (if (numberp article) - (concat "\n" nnfolder-article-marker (int-to-string article) " ") - (concat "\nMessage-ID: " article))) - -(defun nnfolder-goto-article (article) - "Place point at the start of the headers of ARTICLE. -ARTICLE can be an article number or a Message-ID. -Returns t if successful, nil otherwise." - (let ((art-string (nnfolder-article-string article)) - start found) - ;; It is likely that we are at or before the delimiter line. - ;; We therefore go to the end of the previous line, and start - ;; searching from there. - (beginning-of-line) - (unless (bobp) - (forward-char -1)) - (setq start (point)) - ;; First search forward. - (while (and (setq found (search-forward art-string nil t)) - (not (nnmail-within-headers-p)))) - ;; If unsuccessful, search backward from where we started, - (unless found - (goto-char start) - (while (and (setq found (search-backward art-string nil t)) - (not (nnmail-within-headers-p))))) - (when found - (nnmail-search-unix-mail-delim-backward)))) - -(defun nnfolder-delete-mail (&optional leave-delim) - "Delete the message that point is in. -If optional argument LEAVE-DELIM is t, then mailbox delimiter is not -deleted. Point is left where the deleted region was." - (save-restriction - (narrow-to-region - (save-excursion - ;; In case point is at the beginning of the message already. - (forward-line 1) - (nnmail-search-unix-mail-delim-backward) - (if leave-delim (progn (forward-line 1) (point)) - (point))) - (progn - (forward-line 1) - (if (nnmail-search-unix-mail-delim) - (point) - (point-max)))) - (run-hooks 'nnfolder-delete-mail-hook) - (delete-region (point-min) (point-max)))) - -(defun nnfolder-possibly-change-group (group &optional server dont-check) - ;; Change servers. - (when (and server - (not (nnfolder-server-opened server))) - (nnfolder-open-server server)) - (unless (gnus-buffer-live-p nnfolder-current-buffer) - (setq nnfolder-current-buffer nil - nnfolder-current-group nil)) - ;; Change group. - (let ((file-name-coding-system nnmail-pathname-coding-system) - (pathname-coding-system nnmail-pathname-coding-system)) - (when (and group - (not (equal group nnfolder-current-group)) - (progn - (nnmail-activate 'nnfolder) - (and (assoc group nnfolder-group-alist) - (file-exists-p (nnfolder-group-pathname group))))) - (if dont-check - (setq nnfolder-current-group group - nnfolder-current-buffer nil) - (let (inf file) - ;; If we have to change groups, see if we don't already have the - ;; folder in memory. If we do, verify the modtime and destroy - ;; the folder if needed so we can rescan it. - (setq nnfolder-current-buffer - (nth 1 (assoc group nnfolder-buffer-alist))) - - ;; If the buffer is not live, make sure it isn't in the alist. If it - ;; is live, verify that nobody else has touched the file since last - ;; time. - (when (and nnfolder-current-buffer - (not (gnus-buffer-live-p nnfolder-current-buffer))) - (setq nnfolder-buffer-alist (delq inf nnfolder-buffer-alist) - nnfolder-current-buffer nil)) - - (setq nnfolder-current-group group) - - (when (or (not nnfolder-current-buffer) - (not (verify-visited-file-modtime - nnfolder-current-buffer))) - (save-excursion - (setq file (nnfolder-group-pathname group)) - ;; See whether we need to create the new file. - (unless (file-exists-p file) - (gnus-make-directory (file-name-directory file)) - (let ((nnmail-file-coding-system - (or nnfolder-file-coding-system-for-write - nnfolder-file-coding-system-for-write))) - (nnmail-write-region 1 1 file t 'nomesg))) - (when (setq nnfolder-current-buffer (nnfolder-read-folder group)) - (set-buffer nnfolder-current-buffer) - (push (list group nnfolder-current-buffer) - nnfolder-buffer-alist))))))))) - -(defun nnfolder-save-mail (group-art-list) - "Called narrowed to an article." - (let* (save-list group-art) - (goto-char (point-min)) - ;; The From line may have been quoted by movemail. - (when (looking-at ">From") - (delete-char 1)) - ;; This might come from somewhere else. - (unless (looking-at "From ") - (insert "From nobody " (current-time-string) "\n") - (goto-char (point-min))) - ;; Quote all "From " lines in the article. - (forward-line 1) - (let (case-fold-search) - (while (re-search-forward "^From " nil t) - (beginning-of-line) - (insert "> "))) - (setq save-list group-art-list) - (nnmail-insert-lines) - (nnmail-insert-xref group-art-list) - (run-hooks 'nnmail-prepare-save-mail-hook) - (run-hooks 'nnfolder-prepare-save-mail-hook) - - ;; Insert the mail into each of the destination groups. - (while (setq group-art (pop group-art-list)) - ;; Kill any previous newsgroup markers. - (goto-char (point-min)) - (if (search-forward "\n\n" nil t) - (forward-line -1) - (goto-char (point-max))) - (while (search-backward (concat "\n" nnfolder-article-marker) nil t) - (delete-region (1+ (point)) (progn (forward-line 2) (point)))) - - ;; Insert the new newsgroup marker. - (nnfolder-insert-newsgroup-line group-art) - - (save-excursion - (let ((beg (point-min)) - (end (point-max)) - (obuf (current-buffer))) - (nnfolder-possibly-change-folder (car group-art)) - (let ((buffer-read-only nil)) - (nnfolder-normalize-buffer) - (insert-buffer-substring obuf beg end)) - (unless (or gnus-nov-is-evil nnfolder-nov-is-evil) - (set-buffer obuf) - (nnfolder-add-nov (car group-art) (cdr group-art) - (nnfolder-parse-head nil beg end)))))) - - ;; Did we save it anywhere? - save-list)) - -(defun nnfolder-normalize-buffer () - "Make sure there are two newlines at the end of the buffer." - (goto-char (point-max)) - (skip-chars-backward "\n") - (delete-region (point) (point-max)) - (insert "\n\n")) - -(defun nnfolder-insert-newsgroup-line (group-art) - (save-excursion - (goto-char (point-min)) - (unless (search-forward "\n\n" nil t) - (goto-char (point-max)) - (insert "\n")) - (forward-char -1) - (insert (format (concat nnfolder-article-marker "%d %s\n") - (cdr group-art) (current-time-string))))) - -(defun nnfolder-active-number (group) - ;; Find the next article number in GROUP. - (let ((active (cadr (assoc group nnfolder-group-alist)))) - (if active - (setcdr active (1+ (cdr active))) - ;; This group is new, so we create a new entry for it. - ;; This might be a bit naughty... creating groups on the drop of - ;; a hat, but I don't know... - (push (list group (setq active (cons 1 1))) - nnfolder-group-alist)) - (cdr active))) - -(defun nnfolder-possibly-change-folder (group) - (let ((inf (assoc group nnfolder-buffer-alist))) - (if (and inf - (gnus-buffer-live-p (cadr inf))) - (set-buffer (cadr inf)) - (when inf - (setq nnfolder-buffer-alist (delq inf nnfolder-buffer-alist))) - (when nnfolder-group-alist - (nnfolder-save-active nnfolder-group-alist nnfolder-active-file)) - (push (list group (nnfolder-read-folder group)) - nnfolder-buffer-alist)))) - -;; This method has a problem if you've accidentally let the active -;; list get out of sync with the files. This could happen, say, if -;; you've accidentally gotten new mail with something other than Gnus -;; (but why would _that_ ever happen? :-). In that case, we will be -;; in the middle of processing the file, ready to add new X-Gnus -;; article number markers, and we'll run across a message with no ID -;; yet - the active list _may_not_ be ready for us yet. - -;; To handle this, I'm modifying this routine to maintain the maximum -;; ID seen so far, and when we hit a message with no ID, we will -;; _manually_ scan the rest of the message looking for any more, -;; possibly higher IDs. We'll assume the maximum that we find is the -;; highest active. Note that this shouldn't cost us much extra time -;; at all, but will be a lot less vulnerable to glitches between the -;; mbox and the active file. - -(defun nnfolder-read-folder (group) - (let* ((file (nnfolder-group-pathname group)) - (nov (nnfolder-group-nov-pathname group)) - (buffer (set-buffer - (let ((nnheader-file-coding-system - nnfolder-file-coding-system)) - (nnheader-find-file-noselect file))))) - (if (equal (cadr (assoc group nnfolder-scantime-alist)) - (nth 5 (file-attributes file))) - ;; This looks up-to-date, so we don't do any scanning. - (if (file-exists-p file) - buffer - (push (list group buffer) nnfolder-buffer-alist) - (set-buffer-modified-p t) - (nnfolder-save-buffer)) - ;; Parse the damn thing. - (save-excursion - (goto-char (point-min)) - ;; Remove any blank lines at the start. - (while (eq (following-char) ?\n) - (delete-char 1)) - (nnmail-activate 'nnfolder) - ;; Read in the file. - (let ((delim "^From ") - (marker (concat "\n" nnfolder-article-marker)) - (number "[0-9]+") - (active (or (cadr (assoc group nnfolder-group-alist)) - (cons 1 0))) - (scantime (assoc group nnfolder-scantime-alist)) - (minid (lsh -1 -1)) - maxid start end newscantime - novbuf articles newnum - buffer-read-only) - (buffer-disable-undo) - (setq maxid (cdr active)) - - (unless (or gnus-nov-is-evil nnfolder-nov-is-evil - (and (file-exists-p nov) - (file-newer-than-file-p nov file))) - (unless (file-exists-p nov) - (gnus-make-directory (file-name-directory nov))) - (with-current-buffer - (setq novbuf (nnfolder-open-nov group)) - (goto-char (point-min)) - (while (not (eobp)) - (push (read novbuf) articles) - (forward-line 1)) - (setq articles (nreverse articles)))) - (goto-char (point-min)) - - ;; Anytime the active number is 1 or 0, it is suspect. In that - ;; case, search the file manually to find the active number. Or, - ;; of course, if we're being paranoid. (This would also be the - ;; place to build other lists from the header markers, such as - ;; expunge lists, etc., if we ever desired to abandon the active - ;; file entirely for mboxes.) - (when (or nnfolder-ignore-active-file - novbuf - (< maxid 2)) - (while (and (search-forward marker nil t) - (looking-at number)) - (setq newnum (string-to-number (match-string 0))) - (when (nnmail-within-headers-p) - (setq maxid (max maxid newnum) - minid (min minid newnum)) - (when novbuf - (if (memq newnum articles) - (setq articles (delq newnum articles)) - (let ((headers (nnfolder-parse-head newnum))) - (with-current-buffer novbuf - (nnheader-find-nov-line newnum) - (nnheader-insert-nov headers))))))) - (when (and novbuf articles) - (with-current-buffer novbuf - (dolist (article articles) - (when (nnheader-find-nov-line article) - (delete-region (point) - (progn (forward-line 1) (point))))))) - (setcar active (max 1 (min minid maxid))) - (setcdr active (max maxid (cdr active))) - (goto-char (point-min))) - - ;; As long as we trust that the user will only insert unmarked mail - ;; at the end, go to the end and search backwards for the last - ;; marker. Find the start of that message, and begin to search for - ;; unmarked messages from there. - (when (not (or nnfolder-distrust-mbox - (< maxid 2))) - (goto-char (point-max)) - (unless (re-search-backward marker nil t) - (goto-char (point-min))) - ;;(when (nnmail-search-unix-mail-delim) - ;; (goto-char (point-min))) - ) - - ;; Keep track of the active number on our own, and insert it back - ;; into the active list when we're done. Also, prime the pump to - ;; cut down on the number of searches we do. - (unless (nnmail-search-unix-mail-delim) - (goto-char (point-max))) - (setq end (point-marker)) - (while (not (= end (point-max))) - (setq start (marker-position end)) - (goto-char end) - ;; There may be more than one "From " line, so we skip past - ;; them. - (while (looking-at delim) - (forward-line 1)) - (set-marker end (if (nnmail-search-unix-mail-delim) - (point) - (point-max))) - (goto-char start) - (when (not (search-forward marker end t)) - (narrow-to-region start end) - (nnmail-insert-lines) - (nnfolder-insert-newsgroup-line - (cons nil - (setq newnum - (nnfolder-active-number nnfolder-current-group)))) - (when novbuf - (let ((headers (nnfolder-parse-head newnum (point-min) - (point-max)))) - (with-current-buffer novbuf - (goto-char (point-max)) - (nnheader-insert-nov headers)))) - (widen))) - - (set-marker end nil) - ;; Make absolutely sure that the active list reflects reality! - (nnfolder-save-active nnfolder-group-alist nnfolder-active-file) - - ;; Set the scantime for this group. - (setq newscantime (visited-file-modtime)) - (if scantime - (setcdr scantime (list newscantime)) - (push (list nnfolder-current-group newscantime) - nnfolder-scantime-alist)) - ;; Save nov. - (when novbuf - (nnfolder-save-nov)) - (current-buffer)))))) - -;;;###autoload -(defun nnfolder-generate-active-file () - "Look for mbox folders in the nnfolder directory and make them into groups. -This command does not work if you use short group names." - (interactive) - (nnmail-activate 'nnfolder) - (unless (or gnus-nov-is-evil nnfolder-nov-is-evil) - (dolist (file (directory-files (or nnfolder-nov-directory - nnfolder-directory) - t - (concat - (regexp-quote nnfolder-nov-file-suffix) - "$"))) - (when (not (message-mail-file-mbox-p file)) - (ignore-errors - (delete-file file))))) - (let ((files (directory-files nnfolder-directory)) - file) - (while (setq file (pop files)) - (when (and (not (backup-file-name-p file)) - (message-mail-file-mbox-p - (nnheader-concat nnfolder-directory file))) - (let ((oldgroup (assoc file nnfolder-group-alist))) - (if oldgroup - (nnheader-message 5 "Refreshing group %s..." file) - (nnheader-message 5 "Adding group %s..." file)) - (if oldgroup - (setq nnfolder-group-alist - (delq oldgroup (copy-sequence nnfolder-group-alist)))) - (push (list file (cons 1 0)) nnfolder-group-alist) - (nnfolder-possibly-change-folder file) - (nnfolder-possibly-change-group file) - (nnfolder-close-group file)))) - (nnheader-message 5 ""))) - -(defun nnfolder-group-pathname (group) - "Make pathname for GROUP." - (setq group - (encode-coding-string group nnmail-pathname-coding-system)) - (let ((dir (file-name-as-directory (expand-file-name nnfolder-directory)))) - ;; If this file exists, we use it directly. - (if (or nnmail-use-long-file-names - (file-exists-p (concat dir group))) - (concat dir group) - ;; If not, we translate dots into slashes. - (concat dir (nnheader-replace-chars-in-string group ?. ?/))))) - -(defun nnfolder-group-nov-pathname (group) - "Make pathname for GROUP NOV." - (let ((nnfolder-directory - (or nnfolder-nov-directory nnfolder-directory))) - (concat (nnfolder-group-pathname group) nnfolder-nov-file-suffix))) - -(defun nnfolder-save-buffer () - "Save the buffer." - (when (buffer-modified-p) - (run-hooks 'nnfolder-save-buffer-hook) - (gnus-make-directory (file-name-directory (buffer-file-name))) - (let* ((coding-system-for-write - (or nnfolder-file-coding-system-for-write - nnfolder-file-coding-system)) - (output-coding-system coding-system-for-write)) - (save-buffer))) - (unless (or gnus-nov-is-evil nnfolder-nov-is-evil) - (nnfolder-save-nov))) - -(defun nnfolder-save-active (group-alist active-file) - (let ((nnmail-active-file-coding-system - (or nnfolder-active-file-coding-system-for-write - nnfolder-active-file-coding-system))) - (nnmail-save-active group-alist active-file))) - -(defun nnfolder-open-nov (group) - (or (cdr (assoc group nnfolder-nov-buffer-alist)) - (let ((buffer (get-buffer-create (format " *nnfolder overview %s*" group)))) - (save-excursion - (set-buffer buffer) - (set (make-local-variable 'nnfolder-nov-buffer-file-name) - (nnfolder-group-nov-pathname group)) - (erase-buffer) - (when (file-exists-p nnfolder-nov-buffer-file-name) - (nnheader-insert-file-contents nnfolder-nov-buffer-file-name))) - (push (cons group buffer) nnfolder-nov-buffer-alist) - buffer))) - -(defun nnfolder-save-nov () - (save-excursion - (while nnfolder-nov-buffer-alist - (when (buffer-name (cdar nnfolder-nov-buffer-alist)) - (set-buffer (cdar nnfolder-nov-buffer-alist)) - (when (buffer-modified-p) - (gnus-make-directory (file-name-directory - nnfolder-nov-buffer-file-name)) - (nnmail-write-region 1 (point-max) nnfolder-nov-buffer-file-name - nil 'nomesg)) - (set-buffer-modified-p nil) - (kill-buffer (current-buffer))) - (setq nnfolder-nov-buffer-alist (cdr nnfolder-nov-buffer-alist))))) - -(defun nnfolder-nov-delete-article (group article) - (save-excursion - (set-buffer (nnfolder-open-nov group)) - (when (nnheader-find-nov-line article) - (delete-region (point) (progn (forward-line 1) (point)))) - t)) - -(defun nnfolder-retrieve-headers-with-nov (articles &optional fetch-old) - (if (or gnus-nov-is-evil nnfolder-nov-is-evil) - nil - (let ((nov (nnfolder-group-nov-pathname nnfolder-current-group))) - (when (file-exists-p nov) - (save-excursion - (set-buffer nntp-server-buffer) - (erase-buffer) - (nnheader-insert-file-contents nov) - (if (and fetch-old - (not (numberp fetch-old))) - t ; Don't remove anything. - (nnheader-nov-delete-outside-range - (if fetch-old (max 1 (- (car articles) fetch-old)) - (car articles)) - (car (last articles))) - t)))))) - -(defun nnfolder-parse-head (&optional number b e) - "Parse the head of the current buffer." - (let ((buf (current-buffer)) - chars) - (save-excursion - (unless b - (setq b (if (nnmail-search-unix-mail-delim-backward) - (point) (point-min))) - (forward-line 1) - (setq e (if (nnmail-search-unix-mail-delim) - (point) (point-max)))) - (setq chars (- e b)) - (unless (zerop chars) - (goto-char b) - (if (search-forward "\n\n" e t) (setq e (1- (point))))) - (with-temp-buffer - (insert-buffer-substring buf b e) - ;; Fold continuation lines. - (goto-char (point-min)) - (while (re-search-forward "\\(\r?\n[ \t]+\\)+" nil t) - (replace-match " " t t)) - ;; Remove any tabs; they are too confusing. - (subst-char-in-region (point-min) (point-max) ?\t ? ) - (let ((headers (nnheader-parse-head t))) - (mail-header-set-chars headers chars) - (mail-header-set-number headers number) - headers))))) - -(defun nnfolder-add-nov (group article headers) - "Add a nov line for the GROUP base." - (save-excursion - (set-buffer (nnfolder-open-nov group)) - (goto-char (point-max)) - (mail-header-set-number headers article) - (nnheader-insert-nov headers))) - -(deffoo nnfolder-request-set-mark (group actions &optional server) - (when (and server - (not (nnfolder-server-opened server))) - (nnfolder-open-server server)) - (unless nnfolder-marks-is-evil - (nnfolder-open-marks group server) - (dolist (action actions) - (let ((range (nth 0 action)) - (what (nth 1 action)) - (marks (nth 2 action))) - (assert (or (eq what 'add) (eq what 'del)) t - "Unknown request-set-mark action: %s" what) - (dolist (mark marks) - (setq nnfolder-marks (gnus-update-alist-soft - mark - (funcall (if (eq what 'add) 'gnus-range-add - 'gnus-remove-from-range) - (cdr (assoc mark nnfolder-marks)) range) - nnfolder-marks))))) - (nnfolder-save-marks group server)) - nil) - -(deffoo nnfolder-request-update-info (group info &optional server) - ;; Change servers. - (when (and server - (not (nnfolder-server-opened server))) - (nnfolder-open-server server)) - (unless nnfolder-marks-is-evil - (nnheader-message 8 "Updating marks for %s..." group) - (nnfolder-open-marks group server) - ;; Update info using `nnfolder-marks'. - (mapcar (lambda (pred) - (gnus-info-set-marks - info - (gnus-update-alist-soft - (cdr pred) - (cdr (assq (cdr pred) nnfolder-marks)) - (gnus-info-marks info)) - t)) - gnus-article-mark-lists) - (let ((seen (cdr (assq 'read nnfolder-marks)))) - (gnus-info-set-read info - (if (and (integerp (car seen)) - (null (cdr seen))) - (list (cons (car seen) (car seen))) - seen))) - (nnheader-message 8 "Updating marks for %s...done" group)) - info) - -(defun nnfolder-group-marks-pathname (group) - "Make pathname for GROUP NOV." - (let ((nnfolder-directory (or nnfolder-marks-directory nnfolder-directory))) - (concat (nnfolder-group-pathname group) nnfolder-marks-file-suffix))) - -(defun nnfolder-save-marks (group server) - (let ((file-name-coding-system nnmail-pathname-coding-system) - (file (nnfolder-group-marks-pathname group))) - (condition-case err - (with-temp-file file - (erase-buffer) - (princ nnfolder-marks (current-buffer)) - (insert "\n")) - (error (or (gnus-yes-or-no-p - (format "Could not write to %s (%s). Continue? " file err)) - (error "Cannot write to %s (%s)" err)))))) - -(defun nnfolder-open-marks (group server) - (let ((file (nnfolder-group-marks-pathname group))) - (if (file-exists-p file) - (setq nnfolder-marks (condition-case err - (with-temp-buffer - (nnheader-insert-file-contents file) - (read (current-buffer))) - (error (or (gnus-yes-or-no-p - (format "Error reading nnfolder marks file %s (%s). Continuing will use marks from .newsrc.eld. Continue? " file err)) - (error "Cannot read nnfolder marks file %s (%s)" file err))))) - ;; User didn't have a .marks file. Probably first time - ;; user of the .marks stuff. Bootstrap it from .newsrc.eld. - (let ((info (gnus-get-info - (gnus-group-prefixed-name - group - (gnus-server-to-method (format "nnfolder:%s" server)))))) - (nnheader-message 7 "Bootstrapping marks for %s..." group) - (setq nnfolder-marks (gnus-info-marks info)) - (push (cons 'read (gnus-info-read info)) nnfolder-marks) - (nnfolder-save-marks group server))))) - -(provide 'nnfolder) - -;;; nnfolder.el ends here diff --git a/lisp/nngateway.el b/lisp/nngateway.el deleted file mode 100644 index b1d3b92..0000000 --- a/lisp/nngateway.el +++ /dev/null @@ -1,94 +0,0 @@ -;;; nngateway.el --- posting news via mail gateways - -;; Copyright (C) 1996, 1997, 1998, 1999, 2000 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Keywords: news, mail - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) -(require 'nnoo) -(require 'message) - -(nnoo-declare nngateway) - -(defvoo nngateway-address nil - "Address of the mail-to-news gateway.") - -(defvoo nngateway-header-transformation 'nngateway-simple-header-transformation - "Function to be called to rewrite the news headers into mail headers. -It is called narrowed to the headers to be transformed with one -parameter -- the gateway address.") - -;;; Interface functions - -(nnoo-define-basics nngateway) - -(deffoo nngateway-open-server (server &optional defs) - (if (nngateway-server-opened server) - t - (unless (assq 'nngateway-address defs) - (setq defs (append defs (list (list 'nngateway-address server))))) - (nnoo-change-server 'nngateway server defs))) - -(deffoo nngateway-request-post (&optional server) - (when (or (nngateway-server-opened server) - (nngateway-open-server server)) - ;; Rewrite the header. - (let ((buf (current-buffer))) - (with-temp-buffer - (insert-buffer-substring buf) - (message-narrow-to-head) - (funcall nngateway-header-transformation nngateway-address) - (goto-char (point-max)) - (insert mail-header-separator "\n") - (widen) - (let (message-required-mail-headers) - (funcall (or message-send-mail-real-function - message-send-mail-function))) - t)))) - -;;; Internal functions - -(defun nngateway-simple-header-transformation (gateway) - "Transform the headers to use GATEWAY." - (let ((newsgroups (mail-fetch-field "newsgroups"))) - (message-remove-header "to") - (message-remove-header "cc") - (goto-char (point-min)) - (insert "To: " (nnheader-replace-chars-in-string newsgroups ?. ?-) - "@" gateway "\n"))) - -(defun nngateway-mail2news-header-transformation (gateway) - "Transform the headers for sending to a mail2news gateway." - (message-remove-header "to") - (message-remove-header "cc") - (goto-char (point-min)) - (insert "To: " gateway "\n")) - -(nnoo-define-skeleton nngateway) - -(provide 'nngateway) - -;;; nngateway.el ends here diff --git a/lisp/nnheader.el b/lisp/nnheader.el deleted file mode 100644 index 466d701..0000000 --- a/lisp/nnheader.el +++ /dev/null @@ -1,1202 +0,0 @@ -;;; nnheader.el --- header access macros for Semi-gnus and its backends - -;; Copyright (C) 1987, 1988, 1989, 1990, 1993, 1994, 1995, 1996, -;; 1997, 1998, 2000, 2001 -;; Free Software Foundation, Inc. - -;; Author: Masanobu UMEDA -;; Lars Magne Ingebrigtsen -;; MORIOKA Tomohiko -;; Katsumi Yamaoka -;; Keywords: mail, news, MIME - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) -(eval-when-compile (require 'static)) - -;; Requiring `gnus-util' at compile time creates a circular -;; dependency between nnheader.el and gnus-util.el. -;(eval-when-compile (require 'gnus-util)) - -(require 'mail-utils) - -;; Reduce the required value of `recursive-load-depth-limit' for Emacs 21. -(require 'pces) -(require 'poem) -(require 'std11) - -(require 'mime) -(eval-and-compile - (autoload 'gnus-sorted-intersection "gnus-range") - (autoload 'gnus-intersection "gnus-range") - (autoload 'gnus-sorted-complement "gnus-range")) - -(defvar nnheader-max-head-length 4096 - "*Max length of the head of articles. - -Value is an integer, nil, or t. Nil means read in chunks of a file -indefinitely until a complete head is found\; t means always read the -entire file immediately, disregarding `nnheader-head-chop-length'. - -Integer values will in effect be rounded up to the nearest multiple of -`nnheader-head-chop-length'.") - -(defvar nnheader-head-chop-length 2048 - "*Length of each read operation when trying to fetch HEAD headers.") - -(defvar nnheader-file-name-translation-alist nil - "*Alist that says how to translate characters in file names. -For instance, if \":\" is invalid as a file character in file names -on your system, you could say something like: - -\(setq nnheader-file-name-translation-alist '((?: . ?_)))") - -(defvar nnheader-text-coding-system - (if (memq system-type '(windows-nt ms-dos ms-windows)) - 'raw-text-dos - 'raw-text) - "Text-safe coding system (For removing ^M). -This variable is a substitute for `mm-text-coding-system'.") - -(defvar nnheader-text-coding-system-for-write nil - "Text coding system for write. -This variable is a substitute for `mm-text-coding-system-for-write'.") - -(eval-and-compile - (autoload 'nnmail-message-id "nnmail") - (autoload 'mail-position-on-field "sendmail") - (autoload 'message-remove-header "message") - (autoload 'gnus-point-at-eol "gnus-util") - (autoload 'gnus-delete-line "gnus-util" nil nil 'macro) - (autoload 'gnus-buffer-live-p "gnus-util")) - -;;; Header access macros. - -;; These macros may look very much like the ones in GNUS 4.1. They -;; are, in a way, but you should note that the indices they use have -;; been changed from the internal GNUS format to the NOV format. The -;; makes it possible to read headers from XOVER much faster. -;; -;; The format of a header is now: -;; [number subject from date id references chars lines xref extra] -;; -;; (That next-to-last entry is defined as "misc" in the NOV format, -;; but Gnus uses it for xrefs.) - -(require 'mmgnus) - -(defmacro mail-header-number (header) - "Return article number in HEADER." - `(mime-entity-location-internal ,header)) - -(defmacro mail-header-set-number (header number) - "Set article number of HEADER to NUMBER." - `(mime-entity-set-location-internal ,header ,number)) - -(defalias 'mail-header-subject 'mime-gnus-entity-subject-internal) -(defalias 'mail-header-set-subject 'mime-gnus-entity-set-subject-internal) - -(defalias 'mail-header-from 'mime-gnus-entity-from-internal) -(defalias 'mail-header-set-from 'mime-gnus-entity-set-from-internal) - -(defalias 'mail-header-date 'mime-gnus-entity-date-internal) -(defalias 'mail-header-set-date 'mime-gnus-entity-set-date-internal) - -(defalias 'mail-header-message-id 'mime-gnus-entity-id-internal) -(defalias 'mail-header-id 'mime-gnus-entity-id-internal) -(defalias 'mail-header-set-message-id 'mime-gnus-entity-set-id-internal) -(defalias 'mail-header-set-id 'mime-gnus-entity-set-id-internal) - -(defalias 'mail-header-references 'mime-gnus-entity-references-internal) -(defalias 'mail-header-set-references - 'mime-gnus-entity-set-references-internal) - -(defalias 'mail-header-chars 'mime-gnus-entity-chars-internal) -(defalias 'mail-header-set-chars 'mime-gnus-entity-set-chars-internal) - -(defalias 'mail-header-lines 'mime-gnus-entity-lines-internal) -(defalias 'mail-header-set-lines 'mime-gnus-entity-set-lines-internal) - -(defalias 'mail-header-xref 'mime-gnus-entity-xref-internal) -(defalias 'mail-header-set-xref 'mime-gnus-entity-set-xref-internal) - -(defalias 'nnheader-decode-subject - (mime-find-field-decoder 'Subject 'nov)) -(defalias 'nnheader-decode-from - (mime-find-field-decoder 'From 'nov)) - -(defalias 'mail-header-extra 'mime-gnus-entity-extra-internal) -(defalias 'mail-header-set-extra 'mime-gnus-entity-set-extra-internal) - -(defun nnheader-decode-field-body (field-body field-name - &optional mode max-column) - (mime-decode-field-body field-body - (if (stringp field-name) - (intern (capitalize field-name)) - field-name) - mode max-column)) - -(defsubst make-full-mail-header (&optional number subject from date id - references chars lines xref - extra) - "Create a new mail header structure initialized with the parameters given." - (luna-make-entity (mm-expand-class-name 'gnus) - :location number - :subject (if subject - (nnheader-decode-subject subject)) - :from (if from - (nnheader-decode-from from)) - :date date - :id id - :references references - :chars chars - :lines lines - :xref xref - :original-header (list (cons 'Subject subject) - (cons 'From from)) - :extra extra)) - -(defsubst make-full-mail-header-from-decoded-header - (&optional number subject from date id references chars lines xref extra) - "Create a new mail header structure initialized with the parameters given." - (luna-make-entity (mm-expand-class-name 'gnus) - :location number - :subject subject - :from from - :date date - :id id - :references references - :chars chars - :lines lines - :xref xref - :extra extra)) - -(defsubst make-mail-header (&optional init) - "Create a new mail header structure initialized with INIT." - (make-full-mail-header init init init init init - init init init init init)) - -;; fake message-ids: generation and detection - -(defvar nnheader-fake-message-id 1) - -(defsubst nnheader-generate-fake-message-id () - (concat "fake+none+" (int-to-string (incf nnheader-fake-message-id)))) - -(defsubst nnheader-fake-message-id-p (id) - (save-match-data ; regular message-id's are <.*> - (string-match "\\`fake\\+none\\+[0-9]+\\'" id))) - -;; Parsing headers and NOV lines. - -(defsubst nnheader-header-value () - (let ((pt (point))) - (prog2 - (skip-chars-forward " \t") - (buffer-substring (point) (std11-field-end)) - (goto-char pt)))) - -(defun nnheader-parse-head (&optional naked) - (let ((case-fold-search t) - (cur (current-buffer)) - (buffer-read-only nil) - in-reply-to lines p ref) - (goto-char (point-min)) - (when naked - (insert "\n")) - ;; Search to the beginning of the next header. Error messages - ;; do not begin with 2 or 3. - (prog1 - (when (or naked (re-search-forward "^[23][0-9]+ " nil t)) - ;; This implementation of this function, with nine - ;; search-forwards instead of the one re-search-forward and - ;; a case (which basically was the old function) is actually - ;; about twice as fast, even though it looks messier. You - ;; can't have everything, I guess. Speed and elegance - ;; don't always go hand in hand. - (make-full-mail-header - ;; Number. - (if naked - (progn - (setq p (point-min)) - 0) - (prog1 - (read cur) - (end-of-line) - (setq p (point)) - (narrow-to-region (point) - (or (and (search-forward "\n.\n" nil t) - (- (point) 2)) - (point))))) - ;; Subject. - (progn - (goto-char p) - (if (search-forward "\nsubject:" nil t) - (nnheader-header-value) "(none)")) - ;; From. - (progn - (goto-char p) - (if (search-forward "\nfrom:" nil t) - (nnheader-header-value) "(nobody)")) - ;; Date. - (progn - (goto-char p) - (if (search-forward "\ndate:" nil t) - (nnheader-header-value) "")) - ;; Message-ID. - (progn - (goto-char p) - (if (search-forward "\nmessage-id:" nil t) - (buffer-substring - (1- (or (search-forward "<" (gnus-point-at-eol) t) - (point))) - (or (search-forward ">" (gnus-point-at-eol) t) (point))) - ;; If there was no message-id, we just fake one to make - ;; subsequent routines simpler. - (nnheader-generate-fake-message-id))) - ;; References. - (progn - (goto-char p) - (if (search-forward "\nreferences:" nil t) - (nnheader-header-value) - ;; Get the references from the in-reply-to header if there - ;; were no references and the in-reply-to header looks - ;; promising. - (if (and (search-forward "\nin-reply-to:" nil t) - (setq in-reply-to (nnheader-header-value)) - (string-match "<[^\n>]+>" in-reply-to)) - (let (ref2) - (setq ref (substring in-reply-to (match-beginning 0) - (match-end 0))) - (while (string-match "<[^\n>]+>" - in-reply-to (match-end 0)) - (setq ref2 (substring in-reply-to (match-beginning 0) - (match-end 0))) - (when (> (length ref2) (length ref)) - (setq ref ref2))) - ref) - nil))) - ;; Chars. - 0 - ;; Lines. - (progn - (goto-char p) - (if (search-forward "\nlines: " nil t) - (if (numberp (setq lines (read cur))) - lines 0) - 0)) - ;; Xref. - (progn - (goto-char p) - (and (search-forward "\nxref:" nil t) - (nnheader-header-value))) - - ;; Extra. - (when nnmail-extra-headers - (let ((extra nnmail-extra-headers) - out) - (while extra - (goto-char p) - (when (search-forward - (concat "\n" (symbol-name (car extra)) ":") nil t) - (push (cons (car extra) (nnheader-header-value)) - out)) - (pop extra)) - out)))) - (when naked - (goto-char (point-min)) - (delete-char 1))))) - -(defmacro nnheader-nov-skip-field () - '(search-forward "\t" eol 'move)) - -(defmacro nnheader-nov-field () - '(buffer-substring (point) (if (nnheader-nov-skip-field) (1- (point)) eol))) - -(defmacro nnheader-nov-read-integer () - '(prog1 - (if (eq (char-after) ?\t) - 0 - (let ((num (condition-case nil - (read (current-buffer)) - (error nil)))) - (if (numberp num) num 0))) - (unless (eobp) - (search-forward "\t" eol 'move)))) - -(defmacro nnheader-nov-parse-extra () - '(let (out string) - (while (not (memq (char-after) '(?\n nil))) - (setq string (nnheader-nov-field)) - (when (string-match "^\\([^ :]+\\): " string) - (push (cons (intern (match-string 1 string)) - (substring string (match-end 0))) - out))) - out)) - -(defmacro nnheader-nov-read-message-id () - '(let ((id (nnheader-nov-field))) - (if (string-match "^<[^>]+>$" id) - id - (nnheader-generate-fake-message-id)))) - -(defun nnheader-parse-nov () - (let ((eol (gnus-point-at-eol))) - (make-full-mail-header - (nnheader-nov-read-integer) ; number - (nnheader-nov-field) ; subject - (nnheader-nov-field) ; from - (nnheader-nov-field) ; date - (nnheader-nov-read-message-id) ; id - (nnheader-nov-field) ; refs - (nnheader-nov-read-integer) ; chars - (nnheader-nov-read-integer) ; lines - (if (eq (char-after) ?\n) - nil - (if (looking-at "Xref: ") - (goto-char (match-end 0))) - (nnheader-nov-field)) ; Xref - (nnheader-nov-parse-extra)))) ; extra - -(defun nnheader-insert-nov (header) - (princ (mail-header-number header) (current-buffer)) - (let ((p (point))) - (insert - "\t" - (or (mime-entity-fetch-field header 'Subject) "(none)") "\t" - (or (mime-entity-fetch-field header 'From) "(nobody)") "\t" - (or (mail-header-date header) "") "\t" - (or (mail-header-id header) - (nnmail-message-id)) - "\t" - (or (mail-header-references header) "") "\t") - (princ (or (mail-header-chars header) 0) (current-buffer)) - (insert "\t") - (princ (or (mail-header-lines header) 0) (current-buffer)) - (insert "\t") - (when (mail-header-xref header) - (insert "Xref: " (mail-header-xref header))) - (when (or (mail-header-xref header) - (mail-header-extra header)) - (insert "\t")) - (when (mail-header-extra header) - (let ((extra (mail-header-extra header))) - (while extra - (insert (symbol-name (caar extra)) - ": " (cdar extra) "\t") - (pop extra)))) - (insert "\n") - (backward-char 1) - (while (search-backward "\n" p t) - (delete-char 1)) - (forward-line 1))) - -(defun nnheader-insert-header (header) - (insert - "Subject: " (or (mail-header-subject header) "(none)") "\n" - "From: " (or (mail-header-from header) "(nobody)") "\n" - "Date: " (or (mail-header-date header) "") "\n" - "Message-ID: " (or (mail-header-id header) (nnmail-message-id)) "\n" - "References: " (or (mail-header-references header) "") "\n" - "Lines: ") - (princ (or (mail-header-lines header) 0) (current-buffer)) - (insert "\n\n")) - -(defun nnheader-insert-article-line (article) - (goto-char (point-min)) - (insert "220 ") - (princ article (current-buffer)) - (insert " Article retrieved.\n") - (search-forward "\n\n" nil 'move) - (delete-region (point) (point-max)) - (forward-char -1) - (insert ".")) - -(defun nnheader-nov-delete-outside-range (beg end) - "Delete all NOV lines that lie outside the BEG to END range." - ;; First we find the first wanted line. - (nnheader-find-nov-line beg) - (delete-region (point-min) (point)) - ;; Then we find the last wanted line. - (when (nnheader-find-nov-line end) - (forward-line 1)) - (delete-region (point) (point-max))) - -(defun nnheader-find-nov-line (article) - "Put point at the NOV line that start with ARTICLE. -If ARTICLE doesn't exist, put point where that line -would have been. The function will return non-nil if -the line could be found." - ;; This function basically does a binary search. - (let ((max (point-max)) - (min (goto-char (point-min))) - (cur (current-buffer)) - (prev (point-min)) - num found) - (while (not found) - (goto-char (/ (+ max min) 2)) - (beginning-of-line) - (if (or (= (point) prev) - (eobp)) - (setq found t) - (setq prev (point)) - (while (and (not (numberp (setq num (read cur)))) - (not (eobp))) - (gnus-delete-line)) - (cond ((> num article) - (setq max (point))) - ((< num article) - (setq min (point))) - (t - (setq found 'yes))))) - ;; We may be at the first line. - (when (and (not num) - (not (eobp))) - (setq num (read cur))) - ;; Now we may have found the article we're looking for, or we - ;; may be somewhere near it. - (when (and (not (eq found 'yes)) - (not (eq num article))) - (setq found (point)) - (while (and (< (point) max) - (or (not (numberp num)) - (< num article))) - (forward-line 1) - (setq found (point)) - (or (eobp) - (= (setq num (read cur)) article))) - (unless (eq num article) - (goto-char found))) - (beginning-of-line) - (eq num article))) - -(defun nnheader-retrieve-headers-from-directory* (articles - directory dependencies - &optional - fetch-old force-new large - backend) - (with-temp-buffer - (let* ((file nil) - (number (length articles)) - (count 0) - (file-name-coding-system 'binary) - (pathname-coding-system 'binary) - (case-fold-search t) - (cur (current-buffer)) - article - headers header id end ref in-reply-to lines chars ctype) - ;; We don't support fetching by Message-ID. - (if (stringp (car articles)) - 'headers - (while articles - (when (and (file-exists-p - (setq file (expand-file-name - (int-to-string - (setq article (pop articles))) - directory))) - (not (file-directory-p file))) - (erase-buffer) - (nnheader-insert-head file) - (save-restriction - (std11-narrow-to-header) - (setq - header - (make-full-mail-header - ;; Number. - article - ;; Subject. - (or (std11-fetch-field "Subject") - "(none)") - ;; From. - (or (std11-fetch-field "From") - "(nobody)") - ;; Date. - (or (std11-fetch-field "Date") - "") - ;; Message-ID. - (progn - (goto-char (point-min)) - (setq id (if (re-search-forward - "^Message-ID: *\\(<[^\n\t> ]+>\\)" nil t) - ;; We do it this way to make sure the Message-ID - ;; is (somewhat) syntactically valid. - (buffer-substring (match-beginning 1) - (match-end 1)) - ;; If there was no message-id, we just fake one - ;; to make subsequent routines simpler. - (nnheader-generate-fake-message-id)))) - ;; References. - (progn - (goto-char (point-min)) - (if (search-forward "\nReferences: " nil t) - (progn - (setq end (point)) - (prog1 - (buffer-substring (match-end 0) (std11-field-end)) - (setq ref - (buffer-substring - (progn - ;; (end-of-line) - (search-backward ">" end t) - (1+ (point))) - (progn - (search-backward "<" end t) - (point)))))) - ;; Get the references from the in-reply-to header if there - ;; were no references and the in-reply-to header looks - ;; promising. - (if (and (search-forward "\nIn-Reply-To: " nil t) - (setq in-reply-to - (buffer-substring (match-end 0) - (std11-field-end))) - (string-match "<[^>]+>" in-reply-to)) - (let (ref2) - (setq ref (substring in-reply-to (match-beginning 0) - (match-end 0))) - (while (string-match "<[^>]+>" - in-reply-to (match-end 0)) - (setq ref2 - (substring in-reply-to (match-beginning 0) - (match-end 0))) - (when (> (length ref2) (length ref)) - (setq ref ref2))) - ref) - (setq ref nil)))) - ;; Chars. - (progn - (goto-char (point-min)) - (if (search-forward "\nChars: " nil t) - (if (numberp (setq chars (ignore-errors (read cur)))) - chars 0) - 0)) - ;; Lines. - (progn - (goto-char (point-min)) - (if (search-forward "\nLines: " nil t) - (if (numberp (setq lines (ignore-errors (read cur)))) - lines 0) - 0)) - ;; Xref. - (std11-fetch-field "Xref") - )) - (goto-char (point-min)) - (if (setq ctype (std11-fetch-field "Content-Type")) - (mime-entity-set-content-type-internal - header (mime-parse-Content-Type ctype))) - ) - (when (setq header - (gnus-dependencies-add-header - header dependencies force-new)) - (push header headers)) - ) - (setq count (1+ count)) - - (and large - (zerop (% count 20)) - (nnheader-message 5 "%s: Receiving headers... %d%%" - backend - (/ (* count 100) number)))) - - (when large - (nnheader-message 5 "%s: Receiving headers...done" backend)) - - headers)))) - -(defun nnheader-retrieve-headers-from-directory (articles - directory dependencies - &optional - fetch-old force-new large - backend) - (cons 'header - (nreverse (nnheader-retrieve-headers-from-directory* - articles directory dependencies - fetch-old force-new large backend)))) - -(defun nnheader-get-newsgroup-headers-xover* (sequence - &optional - force-new dependencies - group) - "Parse the news overview data in the server buffer, and return a -list of headers that match SEQUENCE (see `nntp-retrieve-headers')." - ;; Get the Xref when the users reads the articles since most/some - ;; NNTP servers do not include Xrefs when using XOVER. - ;; (setq gnus-article-internal-prepare-hook '(gnus-article-get-xrefs)) - (let ((cur nntp-server-buffer) - number headers header) - (save-excursion - (set-buffer nntp-server-buffer) - ;; Allow the user to mangle the headers before parsing them. - (gnus-run-hooks 'gnus-parse-headers-hook) - (goto-char (point-min)) - (while (not (eobp)) - (condition-case () - (while (and sequence (not (eobp))) - (setq number (read cur)) - (while (and sequence - (< (car sequence) number)) - (setq sequence (cdr sequence))) - (and sequence - (eq number (car sequence)) - (progn - (setq sequence (cdr sequence)) - (setq header (inline - (gnus-nov-parse-line - number dependencies force-new)))) - (push header headers)) - (forward-line 1)) - (error - (gnus-error 4 "Strange nov line (%d)" - (count-lines (point-min) (point))))) - (forward-line 1)) - ;; A common bug in inn is that if you have posted an article and - ;; then retrieves the active file, it will answer correctly -- - ;; the new article is included. However, a NOV entry for the - ;; article may not have been generated yet, so this may fail. - ;; We work around this problem by retrieving the last few - ;; headers using HEAD. - headers))) - -;; Various cruft the backends and Gnus need to communicate. - -(defvar nntp-server-buffer nil) -(defvar nntp-process-response nil) -(defvar gnus-verbose-backends 7 - "*A number that says how talkative the Gnus backends should be.") -(defvar gnus-nov-is-evil nil - "If non-nil, Gnus backends will never output headers in the NOV format.") -(defvar news-reply-yank-from nil) -(defvar news-reply-yank-message-id nil) - -(defvar nnheader-callback-function nil) - -(defun nnheader-init-server-buffer () - "Initialize the Gnus-backend communication buffer." - (save-excursion - (unless (gnus-buffer-live-p nntp-server-buffer) - (setq nntp-server-buffer (get-buffer-create " *nntpd*"))) - (set-buffer nntp-server-buffer) - (erase-buffer) - (kill-all-local-variables) - (setq case-fold-search t) ;Should ignore case. - (set (make-local-variable 'nntp-process-response) nil) - t)) - -;;; Various functions the backends use. - -(defun nnheader-file-error (file) - "Return a string that says what is wrong with FILE." - (format - (cond - ((not (file-exists-p file)) - "%s does not exist") - ((file-directory-p file) - "%s is a directory") - ((not (file-readable-p file)) - "%s is not readable")) - file)) - -(defun nnheader-insert-head (file) - "Insert the head of the article." - (when (file-exists-p file) - (if (eq nnheader-max-head-length t) - ;; Just read the entire file. - (nnheader-insert-file-contents file) - ;; Read 1K blocks until we find a separator. - (let ((beg 0) - format-alist) - (while (and (eq nnheader-head-chop-length - (nth 1 (nnheader-insert-file-contents - file nil beg - (incf beg nnheader-head-chop-length)))) - (prog1 (not (search-forward "\n\n" nil t)) - (goto-char (point-max))) - (or (null nnheader-max-head-length) - (< beg nnheader-max-head-length)))))) - t)) - -(defun nnheader-article-p () - "Say whether the current buffer looks like an article." - (goto-char (point-min)) - (if (not (search-forward "\n\n" nil t)) - nil - (narrow-to-region (point-min) (1- (point))) - (goto-char (point-min)) - (while (looking-at "[a-zA-Z][^ \t]+:.*\n\\([ \t].*\n\\)*\\|From .*\n") - (goto-char (match-end 0))) - (prog1 - (eobp) - (widen)))) - -(defun nnheader-insert-references (references message-id) - "Insert a References header based on REFERENCES and MESSAGE-ID." - (if (and (not references) (not message-id)) - ;; This is invalid, but not all articles have Message-IDs. - () - (mail-position-on-field "References") - (let ((begin (save-excursion (beginning-of-line) (point))) - (fill-column 78) - (fill-prefix "\t")) - (when references - (insert references)) - (when (and references message-id) - (insert " ")) - (when message-id - (insert message-id)) - ;; Fold long References lines to conform to RFC1036 (sort of). - ;; The region must end with a newline to fill the region - ;; without inserting extra newline. - (fill-region-as-paragraph begin (1+ (point)))))) - -(defun nnheader-replace-header (header new-value) - "Remove HEADER and insert the NEW-VALUE." - (save-excursion - (save-restriction - (nnheader-narrow-to-headers) - (prog1 - (message-remove-header header) - (goto-char (point-max)) - (insert header ": " new-value "\n"))))) - -(defun nnheader-narrow-to-headers () - "Narrow to the head of an article." - (widen) - (narrow-to-region - (goto-char (point-min)) - (if (search-forward "\n\n" nil t) - (1- (point)) - (point-max))) - (goto-char (point-min))) - -(defun nnheader-set-temp-buffer (name &optional noerase) - "Set-buffer to an empty (possibly new) buffer called NAME with undo disabled." - (set-buffer (get-buffer-create name)) - (buffer-disable-undo) - (unless noerase - (erase-buffer)) - (current-buffer)) - -(eval-when-compile (defvar jka-compr-compression-info-list)) -(defvar nnheader-numerical-files - (if (boundp 'jka-compr-compression-info-list) - (concat "\\([0-9]+\\)\\(" - (mapconcat (lambda (i) (aref i 0)) - jka-compr-compression-info-list "\\|") - "\\)?") - "[0-9]+$") - "Regexp that match numerical files.") - -(defvar nnheader-numerical-short-files (concat "^" nnheader-numerical-files) - "Regexp that matches numerical file names.") - -(defvar nnheader-numerical-full-files (concat "/" nnheader-numerical-files) - "Regexp that matches numerical full file paths.") - -(defsubst nnheader-file-to-number (file) - "Take a FILE name and return the article number." - (if (string= nnheader-numerical-short-files "^[0-9]+$") - (string-to-int file) - (string-match nnheader-numerical-short-files file) - (string-to-int (match-string 0 file)))) - -(defvar nnheader-directory-files-is-safe - (or (eq system-type 'windows-nt) - (and (not (featurep 'xemacs)) - (> emacs-major-version 20))) - "If non-nil, Gnus believes `directory-files' is safe. -It has been reported numerous times that `directory-files' fails with -an alarming frequency on NFS mounted file systems. If it is nil, -`nnheader-directory-files-safe' is used.") - -(defun nnheader-directory-files-safe (&rest args) - "Execute `directory-files' twice and returns the longer result." - (let ((first (apply 'directory-files args)) - (second (apply 'directory-files args))) - (if (> (length first) (length second)) - first - second))) - -(defun nnheader-directory-articles (dir) - "Return a list of all article files in directory DIR." - (mapcar 'nnheader-file-to-number - (if nnheader-directory-files-is-safe - (directory-files - dir nil nnheader-numerical-short-files t) - (nnheader-directory-files-safe - dir nil nnheader-numerical-short-files t)))) - -(defun nnheader-article-to-file-alist (dir) - "Return an alist of article/file pairs in DIR." - (mapcar (lambda (file) (cons (nnheader-file-to-number file) file)) - (if nnheader-directory-files-is-safe - (directory-files - dir nil nnheader-numerical-short-files t) - (nnheader-directory-files-safe - dir nil nnheader-numerical-short-files t)))) - -(defun nnheader-fold-continuation-lines () - "Fold continuation lines in the current buffer." - (nnheader-replace-regexp "\\(\r?\n[ \t]+\\)+" " ")) - -(defun nnheader-translate-file-chars (file &optional full) - "Translate FILE into something that can be a file name. -If FULL, translate everything." - (if (null nnheader-file-name-translation-alist) - ;; No translation is necessary. - file - (let* ((i 0) - trans leaf path len) - (if full - ;; Do complete translation. - (setq leaf (copy-sequence file) - path "" - i (if (and (< 1 (length leaf)) (eq ?: (aref leaf 1))) - 2 0)) - ;; We translate -- but only the file name. We leave the directory - ;; alone. - (if (and (featurep 'xemacs) - (memq system-type '(cygwin32 win32 w32 mswindows windows-nt))) - ;; This is needed on NT and stuff, because - ;; file-name-nondirectory is not enough to split - ;; file names, containing ':', e.g. - ;; "d:\\Work\\News\\nntp+news.fido7.ru:fido7.ru.gnu.SCORE" - ;; - ;; we are trying to correctly split such names: - ;; "d:file.name" -> "a:" "file.name" - ;; "aaa:bbb.ccc" -> "" "aaa:bbb.ccc" - ;; "d:aaa\\bbb:ccc" -> "d:aaa\\" "bbb:ccc" - ;; etc. - ;; to translate then only the file name part. - (progn - (setq leaf file - path "") - (if (string-match "\\(^\\w:\\|[/\\]\\)\\([^/\\]+\\)$" file) - (setq leaf (substring file (match-beginning 2)) - path (substring file 0 (match-beginning 2))))) - ;; Emacs DTRT, says andrewi. - (setq leaf (file-name-nondirectory file) - path (file-name-directory file)))) - (setq len (length leaf)) - (while (< i len) - (when (setq trans (cdr (assq (aref leaf i) - nnheader-file-name-translation-alist))) - (aset leaf i trans)) - (incf i)) - (concat path leaf)))) - -(defun nnheader-report (backend &rest args) - "Report an error from the BACKEND. -The first string in ARGS can be a format string." - (set (intern (format "%s-status-string" backend)) - (if (< (length args) 2) - (car args) - (apply 'format args))) - nil) - -(defun nnheader-get-report (backend) - "Get the most recent report from BACKEND." - (condition-case () - (nnheader-message 5 "%s" (symbol-value (intern (format "%s-status-string" - backend)))) - (error (nnheader-message 5 "")))) - -(defun nnheader-insert (format &rest args) - "Clear the communication buffer and insert FORMAT and ARGS into the buffer. -If FORMAT isn't a format string, it and all ARGS will be inserted -without formatting." - (save-excursion - (set-buffer nntp-server-buffer) - (erase-buffer) - (if (string-match "%" format) - (insert (apply 'format format args)) - (apply 'insert format args)) - t)) - -(static-if (fboundp 'subst-char-in-string) - (defsubst nnheader-replace-chars-in-string (string from to) - (subst-char-in-string from to string)) - (defun nnheader-replace-chars-in-string (string from to) - "Replace characters in STRING from FROM to TO." - (let ((string (substring string 0)) ;Copy string. - (len (length string)) - (idx 0)) - ;; Replace all occurrences of FROM with TO. - (while (< idx len) - (when (= (aref string idx) from) - (aset string idx to)) - (setq idx (1+ idx))) - string))) - -(defun nnheader-replace-duplicate-chars-in-string (string from to) - "Replace characters in STRING from FROM to TO." - (let ((string (substring string 0)) ;Copy string. - (len (length string)) - (idx 0) prev i) - ;; Replace all occurrences of FROM with TO. - (while (< idx len) - (setq i (aref string idx)) - (when (and (eq prev from) (= i from)) - (aset string (1- idx) to) - (aset string idx to)) - (setq prev i) - (setq idx (1+ idx))) - string)) - -(defun nnheader-file-to-group (file &optional top) - "Return a group name based on FILE and TOP." - (nnheader-replace-chars-in-string - (if (not top) - file - (condition-case () - (substring (expand-file-name file) - (length - (expand-file-name - (file-name-as-directory top)))) - (error ""))) - ?/ ?.)) - -(defun nnheader-message (level &rest args) - "Message if the Gnus backends are talkative." - (if (or (not (numberp gnus-verbose-backends)) - (<= level gnus-verbose-backends)) - (apply 'message args) - (apply 'format args))) - -(defun nnheader-be-verbose (level) - "Return whether the backends should be verbose on LEVEL." - (or (not (numberp gnus-verbose-backends)) - (<= level gnus-verbose-backends))) - -(defvar nnheader-pathname-coding-system 'binary - "*Coding system for pathname.") - -(defun nnheader-group-pathname (group dir &optional file) - "Make pathname for GROUP." - (concat - (let ((dir (file-name-as-directory (expand-file-name dir)))) - ;; If this directory exists, we use it directly. - (file-name-as-directory - (if (file-directory-p (concat dir group)) - (expand-file-name group dir) - ;; If not, we translate dots into slashes. - (expand-file-name (encode-coding-string - (nnheader-replace-chars-in-string group ?. ?/) - nnheader-pathname-coding-system) - dir)))) - (cond ((null file) "") - ((numberp file) (int-to-string file)) - (t file)))) - -(defun nnheader-functionp (form) - "Return non-nil if FORM is funcallable." - (or (and (symbolp form) (fboundp form)) - (and (listp form) (eq (car form) 'lambda)))) - -(defun nnheader-concat (dir &rest files) - "Concat DIR as directory to FILES." - (apply 'concat (file-name-as-directory dir) files)) - -(defun nnheader-ms-strip-cr () - "Strip ^M from the end of all lines." - (save-excursion - (goto-char (point-min)) - (while (re-search-forward "\r$" nil t) - (delete-backward-char 1)))) - -(defun nnheader-file-size (file) - "Return the file size of FILE or 0." - (or (nth 7 (file-attributes file)) 0)) - -(defun nnheader-find-etc-directory (package &optional file) - "Go through the path and find the \".../etc/PACKAGE\" directory. -If FILE, find the \".../etc/PACKAGE\" file instead." - (let ((path load-path) - dir result) - ;; We try to find the dir by looking at the load path, - ;; stripping away the last component and adding "etc/". - (while path - (if (and (car path) - (file-exists-p - (setq dir (concat - (file-name-directory - (directory-file-name (car path))) - "etc/" package - (if file "" "/")))) - (or file (file-directory-p dir))) - (setq result dir - path nil) - (setq path (cdr path)))) - result)) - -(eval-when-compile - (defvar ange-ftp-path-format) - (defvar efs-path-regexp)) -(defun nnheader-re-read-dir (path) - "Re-read directory PATH if PATH is on a remote system." - (if (and (fboundp 'efs-re-read-dir) (boundp 'efs-path-regexp)) - (when (string-match efs-path-regexp path) - (efs-re-read-dir path)) - (when (and (fboundp 'ange-ftp-re-read-dir) (boundp 'ange-ftp-path-format)) - (when (string-match (car ange-ftp-path-format) path) - (ange-ftp-re-read-dir path))))) - -(defvar nnheader-file-coding-system 'raw-text - "Coding system used in file backends of Gnus.") - -(defun nnheader-insert-file-contents (filename &optional visit beg end replace) - "Like `insert-file-contents', q.v., but only reads in the file. -A buffer may be modified in several ways after reading into the buffer due -to advanced Emacs features, such as file-name-handlers, format decoding, -find-file-hooks, etc. - This function ensures that none of these modifications will take place." - (let ((format-alist nil) - (auto-mode-alist (nnheader-auto-mode-alist)) - (default-major-mode 'fundamental-mode) - (enable-local-variables nil) - (after-insert-file-functions nil) - (enable-local-eval nil) - (find-file-hooks nil)) - (insert-file-contents-as-coding-system - nnheader-file-coding-system filename visit beg end replace))) - -(defun nnheader-find-file-noselect (&rest args) - (let ((format-alist nil) - (auto-mode-alist (nnheader-auto-mode-alist)) - (default-major-mode 'fundamental-mode) - (enable-local-variables nil) - (after-insert-file-functions nil) - (enable-local-eval nil) - (find-file-hooks nil)) - (apply 'find-file-noselect-as-coding-system - nnheader-file-coding-system args))) - -(defun nnheader-auto-mode-alist () - "Return an `auto-mode-alist' with only the .gz (etc) thingies." - (let ((alist auto-mode-alist) - out) - (while alist - (when (listp (cdar alist)) - (push (car alist) out)) - (pop alist)) - (nreverse out))) - -(defun nnheader-directory-regular-files (dir) - "Return a list of all regular files in DIR." - (let ((files (directory-files dir t)) - out) - (while files - (when (file-regular-p (car files)) - (push (car files) out)) - (pop files)) - (nreverse out))) - -(defun nnheader-directory-files (&rest args) - "Same as `directory-files', but prune \".\" and \"..\"." - (let ((files (apply 'directory-files args)) - out) - (while files - (unless (member (file-name-nondirectory (car files)) '("." "..")) - (push (car files) out)) - (pop files)) - (nreverse out))) - -(defmacro nnheader-skeleton-replace (from &optional to regexp) - `(let ((new (generate-new-buffer " *nnheader replace*")) - (cur (current-buffer)) - (start (point-min))) - (set-buffer cur) - (goto-char (point-min)) - (while (,(if regexp 're-search-forward 'search-forward) - ,from nil t) - (insert-buffer-substring - cur start (prog1 (match-beginning 0) (set-buffer new))) - (goto-char (point-max)) - ,(when to `(insert ,to)) - (set-buffer cur) - (setq start (point))) - (insert-buffer-substring - cur start (prog1 (point-max) (set-buffer new))) - (copy-to-buffer cur (point-min) (point-max)) - (kill-buffer (current-buffer)) - (set-buffer cur))) - -(defun nnheader-replace-string (from to) - "Do a fast replacement of FROM to TO from point to `point-max'." - (nnheader-skeleton-replace from to)) - -(defun nnheader-replace-regexp (from to) - "Do a fast regexp replacement of FROM to TO from point to `point-max'." - (nnheader-skeleton-replace from to t)) - -(defun nnheader-strip-cr () - "Strip all \r's from the current buffer." - (nnheader-skeleton-replace "\r")) - -(defalias 'nnheader-run-at-time 'run-at-time) -(defalias 'nnheader-cancel-timer 'cancel-timer) -(defalias 'nnheader-cancel-function-timers 'cancel-function-timers) -(defalias 'nnheader-string-as-multibyte 'string-as-multibyte) - -(defun nnheader-Y-or-n-p (prompt) - "Ask user a \"Y/n\" question. Return t if answer is neither \"n\", \"N\" nor \"C-g\"." - (let ((cursor-in-echo-area t) - (echo-keystrokes 0) - (inhibit-quit t) - ans) - (let (message-log-max) - (while (not (memq ans '(?\ ?N ?Y ?\C-g ?\e ?\n ?\r ?n ?y))) - (message "%s(Y/n) " prompt) - (setq ans (read-char-exclusive)))) - (if (memq ans '(?\C-g ?N ?n)) - (progn - (message "%s(Y/n) No" prompt) - nil) - (message "%s(Y/n) Yes" prompt) - t))) - -(defun nnheader-image-load-path (&optional package) - (let (dir result) - (dolist (path load-path (nreverse result)) - (if (file-directory-p - (setq dir (concat (file-name-directory - (directory-file-name path)) - "etc/" (or package "gnus/")))) - (push dir result)) - (push path result)))) -(defalias 'mm-image-load-path 'nnheader-image-load-path) - -(defalias 'mm-read-coding-system - (if (or (and (featurep 'xemacs) - (<= (string-to-number emacs-version) 21.1)) - (boundp 'MULE)) - (lambda (prompt &optional default-coding-system) - (read-coding-system prompt)) - 'read-coding-system)) - -(when (featurep 'xemacs) - (require 'nnheaderxm)) - -(run-hooks 'nnheader-load-hook) - -(provide 'nnheader) - -;;; nnheader.el ends here diff --git a/lisp/nnheaderxm.el b/lisp/nnheaderxm.el deleted file mode 100644 index 06bce72..0000000 --- a/lisp/nnheaderxm.el +++ /dev/null @@ -1,66 +0,0 @@ -;;; nnheaderxm.el --- making Gnus backends work under XEmacs - -;; Copyright (C) 1996, 1997, 1998, 1999, 2000 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Katsumi Yamaoka -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; Code: - -(defun nnheader-xmas-run-at-time (time repeat function &rest args) - (start-itimer - "nnheader-run-at-time" - `(lambda () - (,function ,@args)) - time repeat)) - -(defun nnheader-xmas-Y-or-n-p (prompt) - "Ask user a \"Y/n\" question. Return t if answer is neither \"n\", \"N\" nor \"C-g\"." - (if (should-use-dialog-box-p) - (yes-or-no-p-dialog-box prompt) - (let ((cursor-in-echo-area t) - (echo-keystrokes 0) - (inhibit-quit t) - event) - (message "%s(Y/n) " prompt) - (while (or (not (key-press-event-p (setq event (next-command-event)))) - (not (or (eq (event-key event) 'escape) - (memq (event-to-character event) - '(?\ ?N ?Y ?\C-g ?\e ?\n ?\r ?n ?y)))))) - (if (memq (event-key event) '(?\C-g ?N ?n)) - (progn - (message "%s(Y/n) No" prompt) - nil) - (message "%s(Y/n) Yes" prompt) - t)))) - -(defalias 'nnheader-run-at-time 'nnheader-xmas-run-at-time) -(defalias 'nnheader-cancel-timer 'delete-itimer) -(defalias 'nnheader-cancel-function-timers 'ignore) -(defalias 'nnheader-string-as-multibyte 'identity) -(defalias 'nnheader-Y-or-n-p 'nnheader-xmas-Y-or-n-p) - -(provide 'nnheaderxm) - -;;; nnheaderxm.el ends here diff --git a/lisp/nnimap.el b/lisp/nnimap.el deleted file mode 100644 index 2dfcedf..0000000 --- a/lisp/nnimap.el +++ /dev/null @@ -1,1421 +0,0 @@ -;;; nnimap.el --- imap backend for Gnus -;; Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. - -;; Author: Simon Josefsson -;; Jim Radford -;; Keywords: mail - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;; Todo, major things: -;; -;; o Fix Gnus to view correct number of unread/total articles in group buffer -;; o Fix Gnus to handle leading '.' in group names (fixed?) -;; o Finish disconnected mode (moving articles between mailboxes unplugged) -;; o Sieve -;; o MIME (partial article fetches) -;; o Split to other backends, different split rules for different -;; servers/inboxes -;; -;; Todo, minor things: -;; -;; o Don't require half of Gnus -- backends should be standalone -;; o Verify that we don't use IMAP4rev1 specific things (RFC2060 App B) -;; o Dont uid fetch 1,* in nnimap-retrive-groups (slow) -;; o Split up big fetches (1,* header especially) in smaller chunks -;; o What do I do with gnus-newsgroup-*? -;; o Tell Gnus about new groups (how can we tell?) -;; o Respooling (fix Gnus?) (unnecessery?) -;; o Add support for the following: (if applicable) -;; request-list-newsgroups, request-regenerate -;; list-active-group, -;; request-associate-buffer, request-restore-buffer, -;; o Do The Right Thing when UIDVALIDITY changes (what's the right thing?) -;; o Support RFC2221 (Login referrals) -;; o IMAP2BIS compatibility? (RFC2061) -;; o ACAP stuff (perhaps a different project, would be nice to ACAPify -;; .newsrc.eld) -;; o What about Gnus's article editing, can we support it? NO! -;; o Use \Draft to support the draft group?? -;; o Duplicate suppression - -;;; Code: - -(eval-when-compile (require 'cl)) -(eval-when-compile (require 'gnus-clfns)) -(eval-and-compile (require 'imap)) - -(require 'nnoo) -(require 'nnmail) -(require 'nnheader) -(require 'gnus) -(require 'gnus-range) -(require 'gnus-start) -(require 'gnus-int) - -(nnoo-declare nnimap) - -(defconst nnimap-version "nnimap 1.0") - -(defvoo nnimap-address nil - "Address of physical IMAP server. If nil, use the virtual server's name.") - -(defvoo nnimap-server-port nil - "Port number on physical IMAP server. -If nil, defaults to 993 for SSL connections and 143 otherwise.") - -;; Splitting variables - -(defvar nnimap-split-crosspost t - "If non-nil, do crossposting if several split methods match the mail. -If nil, the first match found will be used.") - -(defvar nnimap-split-inbox nil - "*Name of mailbox to split mail from. - -Mail is read from this mailbox and split according to rules in -`nnimap-split-rule'. - -This can be a string or a list of strings.") - -(defvar nnimap-split-rule nil - "*Mail will be split according to theese rules. - -Mail is read from mailbox(es) specified in `nnimap-split-inbox'. - -If you'd like, for instance, one mail group for mail from the -\"gnus-imap\" mailing list, one group for junk mail and leave -everything else in the incoming mailbox, you could do something like -this: - -(setq nnimap-split-rule '((\"INBOX.gnus-imap\" \"From:.*gnus-imap\") - (\"INBOX.junk\" \"Subject:.*buy\"))) - -As you can see, `nnimap-split-rule' is a list of lists, where the first -element in each \"rule\" is the name of the IMAP mailbox, and the -second is a regexp that nnimap will try to match on the header to find -a fit. - -The second element can also be a function. In that case, it will be -called narrowed to the headers with the first element of the rule as -the argument. It should return a non-nil value if it thinks that the -mail belongs in that group. - -This variable can also have a function as its value, the function will -be called with the headers narrowed and should return a group where it -thinks the article should be splitted to. See `nnimap-split-fancy'. - -To allow for different split rules on different virtual servers, and -even different split rules in different inboxes on the same server, -the syntax of this variable have been extended along the lines of: - -(setq nnimap-split-rule - '((\"my1server\" (\".*\" ((\"ding\" \"ding@gnus.org\") - (\"junk\" \"From:.*Simon\"))) - (\"my2server\" (\"INBOX\" nnimap-split-fancy)) - (\"my[34]server\" (\".*\" ((\"private\" \"To:.*Simon\") - (\"junk\" my-junk-func))))) - -The virtual server name is in fact a regexp, so that the same rules -may apply to several servers. In the example, the servers -\"my3server\" and \"my4server\" both use the same rules. Similarly, -the inbox string is also a regexp. The actual splitting rules are as -before, either a function, or a list with group/regexp or -group/function elements.") - -(defvar nnimap-split-predicate "UNSEEN UNDELETED" - "The predicate used to find articles to split. -If you use another IMAP client to peek on articles but always would -like nnimap to split them once it's started, you could change this to -\"UNDELETED\". Other available predicates are available in -RFC2060 section 6.4.4.") - -(defvar nnimap-split-fancy nil - "Like `nnmail-split-fancy', which see.") - -;; Authorization / Privacy variables - -(defvoo nnimap-auth-method nil - "Obsolete.") - -(defvoo nnimap-stream nil - "How nnimap will connect to the server. - -The default, nil, will try to use the \"best\" method the server can -handle. - -Change this if - -1) you want to connect with SSL. The SSL integration with IMAP is - brain-dead so you'll have to tell it specifically. - -2) your server is more capable than your environment -- i.e. your - server accept Kerberos login's but you haven't installed the - `imtest' program or your machine isn't configured for Kerberos. - -Possible choices: kerberos4, ssl, network") - -(defvoo nnimap-authenticator nil - "How nnimap authenticate itself to the server. - -The default, nil, will try to use the \"best\" method the server can -handle. - -There is only one reason for fiddling with this variable, and that is -if your server is more capable than your environment -- i.e. you -connect to a server that accept Kerberos login's but you haven't -installed the `imtest' program or your machine isn't configured for -Kerberos. - -Possible choices: kerberos4, cram-md5, login, anonymous.") - -(defvoo nnimap-directory (nnheader-concat gnus-directory "overview/") - "Directory to keep NOV cache files for nnimap groups. -See also `nnimap-nov-file-name'.") - -(defvoo nnimap-nov-file-name "nnimap." - "NOV cache base filename. -The group name and `nnimap-nov-file-name-suffix' will be appended. A -typical complete file name would be -~/News/overview/nnimap.pdc.INBOX.ding.nov, or -~/News/overview/nnimap/pdc/INBOX/ding/nov if -`nnmail-use-long-file-names' is nil") - -(defvoo nnimap-nov-file-name-suffix ".novcache" - "Suffix for NOV cache base filename.") - -(defvoo nnimap-nov-is-evil nil - "If non-nil, nnimap will never generate or use a local nov database for this backend. -Using nov databases will speed up header fetching considerably. -Unlike other backends, you do not need to take special care if you -flip this variable.") - -(defvoo nnimap-expunge-on-close 'always ; 'ask, 'never - "Whether to expunge a group when it is closed. -When a IMAP group with articles marked for deletion is closed, this -variable determine if nnimap should actually remove the articles or -not. - -If always, nnimap always perform a expunge when closing the group. -If never, nnimap never expunges articles marked for deletion. -If ask, nnimap will ask you if you wish to expunge marked articles. - -When setting this variable to `never', you can only expunge articles -by using `G x' (gnus-group-nnimap-expunge) from the Group buffer.") - -(defvoo nnimap-list-pattern "*" - "A string LIMIT or list of strings with mailbox wildcards used to limit available groups. -See below for available wildcards. - -The LIMIT string can be a cons cell (REFERENCE . LIMIT), where -REFERENCE will be passed as the first parameter to LIST/LSUB. The -semantics of this are server specific, on the University of Washington -server you can specify a directory. - -Example: - '(\"INBOX\" \"mail/*\" (\"~friend/mail/\" . \"list/*\")) - -There are two wildcards * and %. * matches everything, % matches -everything in the current hierarchy.") - -(defvoo nnimap-news-groups nil - "IMAP support a news-like mode, also known as bulletin board mode, -where replies is sent via IMAP instead of SMTP. - -This variable should contain a regexp matching groups where you wish -replies to be stored to the mailbox directly. - -Example: - '(\"^[^I][^N][^B][^O][^X].*$\") - -This will match all groups not beginning with \"INBOX\". - -Note that there is nothing technically different between mail-like and -news-like mailboxes. If you wish to have a group with todo items or -similar which you wouldn't want to set up a mailing list for, you can -use this to make replies go directly to the group.") - -(defvoo nnimap-expunge-search-string "UID %s NOT SINCE %s" - "*IMAP search command to use for articles that are to be expired. -The first %s is replaced by a UID set of articles to search on, -and the second %s is replaced by a date criterium. - -One useful (and perhaps the only useful) value to change this to would -be `UID %s NOT SENTSINCE %s' to make nnimap use the Date: header -instead of the internal date of messages. See section 6.4.4 of RFC -2060 for more information on valid strings.") - -(defvoo nnimap-importantize-dormant t - "*If non-nil, mark \"dormant\" articles as \"ticked\" for other IMAP clients. -Note that within Gnus, dormant articles will still (only) be -marked as ticked. This is to make \"dormant\" articles stand out, -just like \"ticked\" articles, in other IMAP clients.") - -(defvoo nnimap-server-address nil - "Obsolete. Use `nnimap-address'.") - -(defcustom nnimap-authinfo-file "~/.authinfo" - "Authorization information for IMAP servers. In .netrc format." - :type - '(choice file - (repeat :tag "Entries" - :menu-tag "Inline" - (list :format "%v" - :value ("" ("login" . "") ("password" . "")) - (string :tag "Host") - (checklist :inline t - (cons :format "%v" - (const :format "" "login") - (string :format "Login: %v")) - (cons :format "%v" - (const :format "" "password") - (string :format "Password: %v"))))))) - -(defcustom nnimap-prune-cache t - "If non-nil, nnimap check whether articles still exist on server before using data stored in NOV cache." - :type 'boolean) - -(defvar nnimap-request-list-method 'imap-mailbox-list - "Method to use to request a list of all folders from the server. -If this is 'imap-mailbox-lsub, then use a server-side subscription list to -restrict visible folders.") - -;; Internal variables: - -(defvar nnimap-debug nil - "Name of buffer to record debugging info. -For example: (setq nnimap-debug \"*nnimap-debug*\")") -(defvar nnimap-current-move-server nil) -(defvar nnimap-current-move-group nil) -(defvar nnimap-current-move-article nil) -(defvar nnimap-length) -(defvar nnimap-progress-chars '(?| ?/ ?- ?\\)) -(defvar nnimap-progress-how-often 20) -(defvar nnimap-counter) -(defvar nnimap-callback-callback-function nil - "Gnus callback the nnimap asynchronous callback should call.") -(defvar nnimap-callback-buffer nil - "Which buffer the asynchronous article prefetch callback should work in.") -(defvar nnimap-server-buffer-alist nil) ;; Map server name to buffers. -(defvar nnimap-current-server nil) ;; Current server -(defvar nnimap-server-buffer nil) ;; Current servers' buffer - - - -(nnoo-define-basics nnimap) - -;; Utility functions: - -(defsubst nnimap-get-server-buffer (server) - "Return buffer for SERVER, if nil use current server." - (cadr (assoc (or server nnimap-current-server) nnimap-server-buffer-alist))) - -(defun nnimap-possibly-change-server (server) - "Return buffer for SERVER, changing the current server as a side-effect. -If SERVER is nil, uses the current server." - (setq nnimap-current-server (or server nnimap-current-server) - nnimap-server-buffer (nnimap-get-server-buffer nnimap-current-server))) - -(defun nnimap-verify-uidvalidity (group server) - "Verify stored uidvalidity match current one in GROUP on SERVER." - (let* ((gnusgroup (gnus-group-prefixed-name - group (gnus-server-to-method - (format "nnimap:%s" server)))) - (new-uidvalidity (imap-mailbox-get 'uidvalidity)) - (old-uidvalidity (gnus-group-get-parameter gnusgroup 'uidvalidity)) - (dir (file-name-as-directory (expand-file-name nnimap-directory))) - (nameuid (nnheader-translate-file-chars - (concat nnimap-nov-file-name - (if (equal server "") - "unnamed" - server) "." group "." old-uidvalidity - nnimap-nov-file-name-suffix) t)) - (file (if (or nnmail-use-long-file-names - (file-exists-p (expand-file-name nameuid dir))) - (expand-file-name nameuid dir) - (expand-file-name - (encode-coding-string - (nnheader-replace-chars-in-string nameuid ?. ?/) - nnmail-pathname-coding-system) - dir)))) - (if old-uidvalidity - (if (not (equal old-uidvalidity new-uidvalidity)) - ;; uidvalidity clash - (gnus-delete-file file) - (gnus-group-set-parameter gnusgroup 'uidvalidity new-uidvalidity) - t) - (gnus-group-add-parameter gnusgroup (cons 'uidvalidity new-uidvalidity)) - t))) - -(defun nnimap-before-find-minmax-bugworkaround () - "Function called before iterating through mailboxes with -`nnimap-find-minmax-uid'." - ;; XXX this is for UoW imapd problem, it doesn't notice new mail in - ;; currently selected mailbox without a re-select/examine. - (or (null (imap-current-mailbox nnimap-server-buffer)) - (imap-mailbox-unselect nnimap-server-buffer))) - -(defun nnimap-find-minmax-uid (group &optional examine) - "Find lowest and highest active article nummber in GROUP. -If EXAMINE is non-nil the group is selected read-only." - (with-current-buffer nnimap-server-buffer - (when (imap-mailbox-select group examine) - (let (minuid maxuid) - (when (> (imap-mailbox-get 'exists) 0) - (imap-fetch "1,*" "UID" nil 'nouidfetch) - (imap-message-map (lambda (uid Uid) - (setq minuid (if minuid (min minuid uid) uid) - maxuid (if maxuid (max maxuid uid) uid))) - 'UID)) - (list (imap-mailbox-get 'exists) minuid maxuid))))) - -(defun nnimap-possibly-change-group (group &optional server) - "Make GROUP the current group, and SERVER the current server." - (when (nnimap-possibly-change-server server) - (with-current-buffer nnimap-server-buffer - (if (or (null group) (imap-current-mailbox-p group)) - imap-current-mailbox - (if (imap-mailbox-select group) - (if (or (nnimap-verify-uidvalidity - group (or server nnimap-current-server)) - (zerop (imap-mailbox-get 'exists group)) - t ;; for OGnus to see if ignoring uidvalidity - ;; changes has any bad effects. - (yes-or-no-p - (format - "nnimap: Group %s is not uidvalid. Continue? " group))) - imap-current-mailbox - (imap-mailbox-unselect) - (error "nnimap: Group %s is not uid-valid" group)) - (nnheader-report 'nnimap (imap-error-text))))))) - -(defun nnimap-replace-whitespace (string) - "Return STRING with all whitespace replaced with space." - (when string - (while (string-match "[\r\n\t]+" string) - (setq string (replace-match " " t t string))) - string)) - -;; Required backend functions - -(defun nnimap-retrieve-headers-progress () - "Hook to insert NOV line for current article into `nntp-server-buffer'." - (and (numberp nnmail-large-newsgroup) - (zerop (% (incf nnimap-counter) nnimap-progress-how-often)) - (> nnimap-length nnmail-large-newsgroup) - (nnheader-message 6 "nnimap: Retrieving headers... %c" - (nth (/ (% nnimap-counter - (* (length nnimap-progress-chars) - nnimap-progress-how-often)) - nnimap-progress-how-often) - nnimap-progress-chars))) - (with-current-buffer nntp-server-buffer - (let (headers lines chars uid mbx) - (with-current-buffer nnimap-server-buffer - (setq uid imap-current-message - mbx imap-current-mailbox - headers (nnimap-demule - (if (imap-capability 'IMAP4rev1) - ;; xxx don't just use car? alist doesn't contain - ;; anything else now, but it might... - (nth 2 (car (imap-message-get uid 'BODYDETAIL))) - (imap-message-get uid 'RFC822.HEADER))) - lines (imap-body-lines (imap-message-body imap-current-message)) - chars (imap-message-get imap-current-message 'RFC822.SIZE))) - (nnheader-insert-nov - (with-temp-buffer - (buffer-disable-undo) - (insert headers) - (nnheader-fold-continuation-lines) - (subst-char-in-region (point-min) (point-max) ?\t ? ) - (nnheader-ms-strip-cr) - (nnheader-fold-continuation-lines) - (subst-char-in-region (point-min) (point-max) ?\t ? ) - (let ((head (nnheader-parse-head 'naked))) - (mail-header-set-number head uid) - (mail-header-set-chars head chars) - (mail-header-set-lines head lines) - (mail-header-set-xref - head (format "%s %s:%d" (system-name) mbx uid)) - head)))))) - -(defun nnimap-retrieve-which-headers (articles fetch-old) - "Get a range of articles to fetch based on ARTICLES and FETCH-OLD." - (with-current-buffer nnimap-server-buffer - (if (numberp (car-safe articles)) - (imap-search - (concat "UID " - (imap-range-to-message-set - (gnus-compress-sequence - (append (gnus-uncompress-sequence - (and fetch-old - (cons (if (numberp fetch-old) - (max 1 (- (car articles) fetch-old)) - 1) - (1- (car articles))))) - articles))))) - (mapcar (lambda (msgid) - (imap-search - (format "HEADER Message-Id \"%s\"" msgid))) - articles)))) - -(defun nnimap-group-overview-filename (group server) - "Make pathname for GROUP on SERVER." - (let* ((dir (file-name-as-directory (expand-file-name nnimap-directory))) - (uidvalidity (gnus-group-get-parameter - (gnus-group-prefixed-name - group (gnus-server-to-method - (format "nnimap:%s" server))) - 'uidvalidity)) - (name (nnheader-translate-file-chars - (concat nnimap-nov-file-name - (if (equal server "") - "unnamed" - server) "." group nnimap-nov-file-name-suffix) t)) - (nameuid (nnheader-translate-file-chars - (concat nnimap-nov-file-name - (if (equal server "") - "unnamed" - server) "." group "." uidvalidity - nnimap-nov-file-name-suffix) t)) - (oldfile (if (or nnmail-use-long-file-names - (file-exists-p (expand-file-name name dir))) - (expand-file-name name dir) - (expand-file-name - (encode-coding-string - (nnheader-replace-chars-in-string name ?. ?/) - nnmail-pathname-coding-system) - dir))) - (newfile (if (or nnmail-use-long-file-names - (file-exists-p (expand-file-name nameuid dir))) - (expand-file-name nameuid dir) - (expand-file-name - (encode-coding-string - (nnheader-replace-chars-in-string nameuid ?. ?/) - nnmail-pathname-coding-system) - dir)))) - (when (and (file-exists-p oldfile) (not (file-exists-p newfile))) - (message "nnimap: Upgrading novcache filename...") - (sit-for 1) - (gnus-make-directory (file-name-directory newfile)) - (unless (ignore-errors (rename-file oldfile newfile) t) - (if (ignore-errors (copy-file oldfile newfile) t) - (delete-file oldfile) - (error "Can't rename `%s' to `%s'" oldfile newfile)))) - newfile)) - -(defun nnimap-retrieve-headers-from-file (group server) - (with-current-buffer nntp-server-buffer - (let ((nov (nnimap-group-overview-filename group server))) - (when (file-exists-p nov) - (nnheader-insert-file-contents nov) - (set-buffer-modified-p nil) - (let ((min (ignore-errors (goto-char (point-min)) - (read (current-buffer)))) - (max (ignore-errors (goto-char (point-max)) - (forward-line -1) - (read (current-buffer))))) - (if (and (numberp min) (numberp max)) - (cons min max) - ;; junk, remove it, it's saved later - (erase-buffer) - nil)))))) - -(defun nnimap-retrieve-headers-from-server (articles group server) - (with-current-buffer nnimap-server-buffer - (let ((imap-fetch-data-hook '(nnimap-retrieve-headers-progress)) - (nnimap-length (gnus-range-length articles)) - (nnimap-counter 0)) - (imap-fetch (imap-range-to-message-set articles) - (concat "(UID RFC822.SIZE BODY " - (let ((headers - (append '(Subject From Date Message-Id - References In-Reply-To Xref) - (copy-sequence - nnmail-extra-headers)))) - (if (imap-capability 'IMAP4rev1) - (format "BODY.PEEK[HEADER.FIELDS %s])" headers) - (format "RFC822.HEADER.LINES %s)" headers))))) - (and (numberp nnmail-large-newsgroup) - (> nnimap-length nnmail-large-newsgroup) - (nnheader-message 6 "nnimap: Retrieving headers...done"))))) - -(defun nnimap-dont-use-nov-p (group server) - (or gnus-nov-is-evil nnimap-nov-is-evil - (unless (and (gnus-make-directory - (file-name-directory - (nnimap-group-overview-filename group server))) - (file-writable-p - (nnimap-group-overview-filename group server))) - (message "nnimap: Nov cache not writable, %s" - (nnimap-group-overview-filename group server))))) - -(deffoo nnimap-retrieve-headers (articles &optional group server fetch-old) - (when (nnimap-possibly-change-group group server) - (with-current-buffer nntp-server-buffer - (erase-buffer) - (if (nnimap-dont-use-nov-p group server) - (nnimap-retrieve-headers-from-server - (gnus-compress-sequence articles) group server) - (let (uids cached low high) - (when (setq uids (nnimap-retrieve-which-headers articles fetch-old) - low (car uids) - high (car (last uids))) - (if (setq cached (nnimap-retrieve-headers-from-file group server)) - (progn - ;; fetch articles with uids before cache block - (when (< low (car cached)) - (goto-char (point-min)) - (nnimap-retrieve-headers-from-server - (cons low (1- (car cached))) group server)) - ;; fetch articles with uids after cache block - (when (> high (cdr cached)) - (goto-char (point-max)) - (nnimap-retrieve-headers-from-server - (cons (1+ (cdr cached)) high) group server)) - (when nnimap-prune-cache - ;; remove nov's for articles which has expired on server - (goto-char (point-min)) - (dolist (uid (gnus-set-difference articles uids)) - (when (re-search-forward (format "^%d\t" uid) nil t) - (gnus-delete-line))))) - ;; nothing cached, fetch whole range from server - (nnimap-retrieve-headers-from-server - (cons low high) group server)) - (when (buffer-modified-p) - (nnmail-write-region - 1 (point-max) (nnimap-group-overview-filename group server) - nil 'nomesg)) - (nnheader-nov-delete-outside-range low high)))) - 'nov))) - -(defun nnimap-open-connection (server) - (if (not (imap-open nnimap-address nnimap-server-port nnimap-stream - nnimap-authenticator nnimap-server-buffer)) - (nnheader-report 'nnimap "Can't open connection to server %s" server) - (unless (or (imap-capability 'IMAP4 nnimap-server-buffer) - (imap-capability 'IMAP4rev1 nnimap-server-buffer)) - (imap-close nnimap-server-buffer) - (nnheader-report 'nnimap "Server %s is not IMAP4 compliant" server)) - (let* ((list (gnus-parse-netrc nnimap-authinfo-file)) - (port (if nnimap-server-port - (int-to-string nnimap-server-port) - "imap")) - (alist (gnus-netrc-machine list (or nnimap-server-address - nnimap-address server) - port "imap")) - (user (gnus-netrc-get alist "login")) - (passwd (gnus-netrc-get alist "password"))) - (if (imap-authenticate user passwd nnimap-server-buffer) - (prog1 - (push (list server nnimap-server-buffer) - nnimap-server-buffer-alist) - (nnimap-possibly-change-server server)) - (imap-close nnimap-server-buffer) - (kill-buffer nnimap-server-buffer) - (nnheader-report 'nnimap "Could not authenticate to %s" server))))) - -(deffoo nnimap-open-server (server &optional defs) - (nnheader-init-server-buffer) - (if (nnimap-server-opened server) - t - (unless (assq 'nnimap-server-buffer defs) - (push (list 'nnimap-server-buffer (concat " *nnimap* " server)) defs)) - ;; translate `nnimap-server-address' to `nnimap-address' in defs - ;; for people that configured nnimap with a very old version - (unless (assq 'nnimap-address defs) - (if (assq 'nnimap-server-address defs) - (push (list 'nnimap-address - (cadr (assq 'nnimap-server-address defs))) defs) - (push (list 'nnimap-address server) defs))) - (nnoo-change-server 'nnimap server defs) - (or nnimap-server-buffer - (setq nnimap-server-buffer (cadr (assq 'nnimap-server-buffer defs)))) - (with-current-buffer (get-buffer-create nnimap-server-buffer) - (nnoo-change-server 'nnimap server defs)) - (or (and nnimap-server-buffer - (imap-opened nnimap-server-buffer)) - (nnimap-open-connection server)))) - -(deffoo nnimap-server-opened (&optional server) - "Whether SERVER is opened. -If SERVER is the current virtual server, and the connection to the -physical server is alive, this function return a non-nil value. If -SERVER is nil, it is treated as the current server." - ;; clean up autologouts?? - (and (or server nnimap-current-server) - (nnoo-server-opened 'nnimap (or server nnimap-current-server)) - (imap-opened (nnimap-get-server-buffer server)))) - -(deffoo nnimap-close-server (&optional server) - "Close connection to server and free all resources connected to it. -Return nil if the server couldn't be closed for some reason." - (let ((server (or server nnimap-current-server))) - (when (or (nnimap-server-opened server) - (imap-opened (nnimap-get-server-buffer server))) - (imap-close (nnimap-get-server-buffer server)) - (kill-buffer (nnimap-get-server-buffer server)) - (setq nnimap-server-buffer nil - nnimap-current-server nil - nnimap-server-buffer-alist - (delq server nnimap-server-buffer-alist))) - (nnoo-close-server 'nnimap server))) - -(deffoo nnimap-request-close () - "Close connection to all servers and free all resources that the backend have reserved. -All buffers that have been created by that -backend should be killed. (Not the nntp-server-buffer, though.) This -function is generally only called when Gnus is shutting down." - (mapcar (lambda (server) (nnimap-close-server (car server))) - nnimap-server-buffer-alist) - (setq nnimap-server-buffer-alist nil)) - -(deffoo nnimap-status-message (&optional server) - "This function returns the last error message from server." - (when (nnimap-possibly-change-server server) - (nnoo-status-message 'nnimap server))) - -(defun nnimap-demule (string) - (funcall (if (and (fboundp 'string-as-multibyte) - (subrp (symbol-function 'string-as-multibyte))) - 'string-as-multibyte - 'identity) - (or string ""))) - -(defun nnimap-callback () - (remove-hook 'imap-fetch-data-hook 'nnimap-callback) - (with-current-buffer nnimap-callback-buffer - (insert - (with-current-buffer nnimap-server-buffer - (if (imap-capability 'IMAP4rev1) - ;; xxx don't just use car? alist doesn't contain - ;; anything else now, but it might... - (nth 2 (car (imap-message-get (imap-current-message) 'BODYDETAIL))) - (imap-message-get (imap-current-message) 'RFC822)))) - (nnheader-ms-strip-cr) - (funcall nnimap-callback-callback-function t))) - -(defun nnimap-request-article-part (article part prop &optional - group server to-buffer detail) - (when (nnimap-possibly-change-group group server) - (let ((article (if (stringp article) - (car-safe (imap-search - (format "HEADER Message-Id \"%s\"" article) - nnimap-server-buffer)) - article))) - (when article - (gnus-message 10 "nnimap: Fetching (part of) article %d..." article) - (if (not nnheader-callback-function) - (with-current-buffer (or to-buffer nntp-server-buffer) - (erase-buffer) - (let ((data (imap-fetch article part prop nil - nnimap-server-buffer))) - (when data - (insert (if detail (nth 2 (car data)) data)) - (nnheader-ms-strip-cr) - (gnus-message 10 - "nnimap: Fetching (part of) article %d...done" - article) - (if (bobp) - (nnheader-report 'nnimap "No such article: %s" - (imap-error-text nnimap-server-buffer)) - (cons group article))))) - (add-hook 'imap-fetch-data-hook 'nnimap-callback) - (setq nnimap-callback-callback-function nnheader-callback-function - nnimap-callback-buffer nntp-server-buffer) - (imap-fetch-asynch article part nil nnimap-server-buffer) - (cons group article)))))) - -(deffoo nnimap-asynchronous-p () - t) - -(deffoo nnimap-request-article (article &optional group server to-buffer) - (if (imap-capability 'IMAP4rev1 nnimap-server-buffer) - (nnimap-request-article-part - article "BODY.PEEK[]" 'BODYDETAIL group server to-buffer 'detail) - (nnimap-request-article-part - article "RFC822.PEEK" 'RFC822 group server to-buffer))) - -(deffoo nnimap-request-head (article &optional group server to-buffer) - (if (imap-capability 'IMAP4rev1 nnimap-server-buffer) - (nnimap-request-article-part - article "BODY.PEEK[HEADER]" 'BODYDETAIL group server to-buffer 'detail) - (nnimap-request-article-part - article "RFC822.HEADER" 'RFC822.HEADER group server to-buffer))) - -(deffoo nnimap-request-body (article &optional group server to-buffer) - (if (imap-capability 'IMAP4rev1 nnimap-server-buffer) - (nnimap-request-article-part - article "BODY.PEEK[TEXT]" 'BODYDETAIL group server to-buffer 'detail) - (nnimap-request-article-part - article "RFC822.TEXT.PEEK" 'RFC822.TEXT group server to-buffer))) - -(deffoo nnimap-request-group (group &optional server fast) - (nnimap-request-update-info-internal - group - (gnus-get-info (gnus-group-prefixed-name - group (gnus-server-to-method (format "nnimap:%s" server)))) - server) - (when (nnimap-possibly-change-group group server) - (nnimap-before-find-minmax-bugworkaround) - (let (info) - (cond (fast group) - ((null (setq info (nnimap-find-minmax-uid group t))) - (nnheader-report 'nnimap "Could not get active info for %s" - group)) - (t - (nnheader-insert "211 %d %d %d %s\n" (or (nth 0 info) 0) - (max 1 (or (nth 1 info) 1)) - (or (nth 2 info) 0) group) - (nnheader-report 'nnimap "Group %s selected" group) - t))))) - -(defun nnimap-close-group (group &optional server) - (with-current-buffer nnimap-server-buffer - (when (and (imap-opened) - (nnimap-possibly-change-group group server)) - (case nnimap-expunge-on-close - ('always (imap-mailbox-expunge) - (imap-mailbox-close)) - ('ask (if (and (imap-search "DELETED") - (gnus-y-or-n-p (format - "Expunge articles in group `%s'? " - imap-current-mailbox))) - (progn (imap-mailbox-expunge) - (imap-mailbox-close)) - (imap-mailbox-unselect))) - (t (imap-mailbox-unselect))) - (not imap-current-mailbox)))) - -(defun nnimap-pattern-to-list-arguments (pattern) - (mapcar (lambda (p) - (cons (car-safe p) (or (cdr-safe p) p))) - (if (and (listp pattern) - (listp (cdr pattern))) - pattern - (list pattern)))) - -(deffoo nnimap-request-list (&optional server) - (when (nnimap-possibly-change-server server) - (with-current-buffer nntp-server-buffer - (erase-buffer)) - (gnus-message 5 "nnimap: Generating active list%s..." - (if (> (length server) 0) (concat " for " server) "")) - (nnimap-before-find-minmax-bugworkaround) - (with-current-buffer nnimap-server-buffer - (dolist (pattern (nnimap-pattern-to-list-arguments nnimap-list-pattern)) - (dolist (mbx (funcall nnimap-request-list-method - (cdr pattern) (car pattern))) - (or (member "\\NoSelect" (imap-mailbox-get 'list-flags mbx)) - (let ((info (nnimap-find-minmax-uid mbx 'examine))) - (when info - (with-current-buffer nntp-server-buffer - (insert (format "\"%s\" %d %d y\n" - mbx (or (nth 2 info) 0) - (max 1 (or (nth 1 info) 1))))))))))) - (gnus-message 5 "nnimap: Generating active list%s...done" - (if (> (length server) 0) (concat " for " server) "")) - t)) - -(deffoo nnimap-request-post (&optional server) - (let ((success t)) - (dolist (mbx (message-unquote-tokens - (message-tokenize-header - (message-fetch-field "Newsgroups") ", ")) success) - (let ((to-newsgroup (gnus-group-prefixed-name mbx gnus-command-method))) - (or (gnus-active to-newsgroup) - (gnus-activate-group to-newsgroup) - (if (gnus-y-or-n-p (format "No such group: %s. Create it? " - to-newsgroup)) - (or (and (gnus-request-create-group - to-newsgroup gnus-command-method) - (gnus-activate-group to-newsgroup nil nil - gnus-command-method)) - (error "Couldn't create group %s" to-newsgroup))) - (error "No such group: %s" to-newsgroup)) - (unless (nnimap-request-accept-article mbx (nth 1 gnus-command-method)) - (setq success nil)))))) - -;; Optional backend functions - -(deffoo nnimap-retrieve-groups (groups &optional server) - (when (nnimap-possibly-change-server server) - (gnus-message 5 "nnimap: Checking mailboxes...") - (with-current-buffer nntp-server-buffer - (erase-buffer) - (nnimap-before-find-minmax-bugworkaround) - (dolist (group groups) - (gnus-message 7 "nnimap: Checking mailbox %s" group) - (or (member "\\NoSelect" - (imap-mailbox-get 'list-flags group nnimap-server-buffer)) - (let ((info (nnimap-find-minmax-uid group 'examine))) - (when (> (or (imap-mailbox-get 'recent group - nnimap-server-buffer) 0) - 0) - (push (list (cons group 0)) nnmail-split-history)) - (insert (format "\"%s\" %d %d y\n" group - (or (nth 2 info) 0) - (max 1 (or (nth 1 info) 1)))))))) - (gnus-message 5 "nnimap: Checking mailboxes...done") - 'active)) - -(deffoo nnimap-request-update-info-internal (group info &optional server) - (when (nnimap-possibly-change-group group server) - (when info;; xxx what does this mean? should we create a info? - (with-current-buffer nnimap-server-buffer - (gnus-message 5 "nnimap: Updating info for %s..." - (gnus-info-group info)) - - (when (nnimap-mark-permanent-p 'read) - (let (seen unseen) - ;; read info could contain articles marked unread by other - ;; imap clients! we correct this - (setq seen (gnus-uncompress-range (gnus-info-read info)) - unseen (imap-search "UNSEEN UNDELETED") - seen (gnus-set-difference seen unseen) - ;; seen might lack articles marked as read by other - ;; imap clients! we correct this - seen (append seen (imap-search "SEEN")) - ;; remove dupes - seen (sort seen '<) - seen (gnus-compress-sequence seen t) - ;; we can't return '(1) since this isn't a "list of ranges", - ;; and we can't return '((1)) since g-list-of-unread-articles - ;; is buggy so we return '((1 . 1)). - seen (if (and (integerp (car seen)) - (null (cdr seen))) - (list (cons (car seen) (car seen))) - seen)) - (gnus-info-set-read info seen))) - - (mapcar (lambda (pred) - (when (or (eq (cdr pred) 'recent) - (and (nnimap-mark-permanent-p (cdr pred)) - (member (nnimap-mark-to-flag (cdr pred)) - (imap-mailbox-get 'flags)))) - (gnus-info-set-marks - info - (gnus-update-alist-soft - (cdr pred) - (gnus-compress-sequence - (imap-search (nnimap-mark-to-predicate (cdr pred)))) - (gnus-info-marks info)) - t))) - gnus-article-mark-lists) - - (when nnimap-importantize-dormant - ;; nnimap mark dormant article as ticked too (for other clients) - ;; so we remove that mark for gnus since we support dormant - (gnus-info-set-marks - info - (gnus-update-alist-soft - 'tick - (gnus-remove-from-range - (cdr-safe (assoc 'tick (gnus-info-marks info))) - (cdr-safe (assoc 'dormant (gnus-info-marks info)))) - (gnus-info-marks info)) - t)) - - (gnus-message 5 "nnimap: Updating info for %s...done" - (gnus-info-group info)) - - info)))) - -(deffoo nnimap-request-type (group &optional article) - (if (and nnimap-news-groups (string-match nnimap-news-groups group)) - 'news - 'mail)) - -(deffoo nnimap-request-set-mark (group actions &optional server) - (when (nnimap-possibly-change-group group server) - (with-current-buffer nnimap-server-buffer - (let (action) - (gnus-message 7 "nnimap: Setting marks in %s..." group) - (while (setq action (pop actions)) - (let ((range (nth 0 action)) - (what (nth 1 action)) - (cmdmarks (nth 2 action)) - marks) - ;; cache flags are pointless on the server - (setq cmdmarks (delq 'cache cmdmarks)) - ;; seen flags are local to each gnus - (setq cmdmarks (delq 'seen cmdmarks)) - ;; recent marks can't be set - (setq cmdmarks (delq 'recent cmdmarks)) - (when nnimap-importantize-dormant - ;; flag dormant articles as ticked - (if (memq 'dormant cmdmarks) - (setq cmdmarks (cons 'tick cmdmarks)))) - ;; remove stuff we are forbidden to store - (mapcar (lambda (mark) - (if (imap-message-flag-permanent-p - (nnimap-mark-to-flag mark)) - (setq marks (cons mark marks)))) - cmdmarks) - (when (and range marks) - (cond ((eq what 'del) - (imap-message-flags-del - (imap-range-to-message-set range) - (nnimap-mark-to-flag marks nil t))) - ((eq what 'add) - (imap-message-flags-add - (imap-range-to-message-set range) - (nnimap-mark-to-flag marks nil t))) - ((eq what 'set) - (imap-message-flags-set - (imap-range-to-message-set range) - (nnimap-mark-to-flag marks nil t))))))) - (gnus-message 7 "nnimap: Setting marks in %s...done" group)))) - nil) - -(defun nnimap-split-fancy () - "Like nnmail-split-fancy, but uses nnimap-split-fancy." - (let ((nnmail-split-fancy nnimap-split-fancy)) - (nnmail-split-fancy))) - -(defun nnimap-split-to-groups (rules) - ;; tries to match all rules in nnimap-split-rule against content of - ;; nntp-server-buffer, returns a list of groups that matched. - (with-current-buffer nntp-server-buffer - ;; Fold continuation lines. - (goto-char (point-min)) - (while (re-search-forward "\\(\r?\n[ \t]+\\)+" nil t) - (replace-match " " t t)) - (if (functionp rules) - (funcall rules) - (let (to-groups regrepp) - (catch 'split-done - (dolist (rule rules to-groups) - (let ((group (car rule)) - (regexp (cadr rule))) - (goto-char (point-min)) - (when (and (if (stringp regexp) - (progn - (setq regrepp (string-match "\\\\[0-9&]" group)) - (re-search-forward regexp nil t)) - (funcall regexp group)) - ;; Don't enter the article into the same group twice. - (not (assoc group to-groups))) - (push (if regrepp - (nnmail-expand-newtext group) - group) - to-groups) - (or nnimap-split-crosspost - (throw 'split-done to-groups)))))))))) - -(defun nnimap-assoc-match (key alist) - (let (element) - (while (and alist (not element)) - (if (string-match (car (car alist)) key) - (setq element (car alist))) - (setq alist (cdr alist))) - element)) - -(defun nnimap-split-find-rule (server inbox) - (if (and (listp nnimap-split-rule) (listp (car nnimap-split-rule)) - (list (cdar nnimap-split-rule)) (listp (cadar nnimap-split-rule))) - ;; extended format - (cadr (nnimap-assoc-match inbox (cdr (nnimap-assoc-match - server nnimap-split-rule)))) - nnimap-split-rule)) - -(defun nnimap-split-find-inbox (server) - (if (listp nnimap-split-inbox) - nnimap-split-inbox - (list nnimap-split-inbox))) - -(defun nnimap-split-articles (&optional group server) - (when (nnimap-possibly-change-server server) - (with-current-buffer nnimap-server-buffer - (let (rule inbox removeorig (inboxes (nnimap-split-find-inbox server))) - ;; iterate over inboxes - (while (and (setq inbox (pop inboxes)) - (nnimap-possibly-change-group inbox));; SELECT - ;; find split rule for this server / inbox - (when (setq rule (nnimap-split-find-rule server inbox)) - ;; iterate over articles - (dolist (article (imap-search nnimap-split-predicate)) - (when (nnimap-request-head article) - ;; copy article to right group(s) - (setq removeorig nil) - (dolist (to-group (nnimap-split-to-groups rule)) - (cond ((eq to-group 'junk) - (message "IMAP split removed %s:%s:%d" server inbox - article) - (setq removeorig t)) - ((imap-message-copy (number-to-string article) - to-group nil 'nocopyuid) - (message "IMAP split moved %s:%s:%d to %s" server - inbox article to-group) - (setq removeorig t) - ;; Add the group-art list to the history list. - (push (list (cons to-group 0)) nnmail-split-history)) - (t - (message "IMAP split failed to move %s:%s:%d to %s" - server inbox article to-group)))) - ;; remove article if it was successfully copied somewhere - (and removeorig - (imap-message-flags-add (format "%d" article) - "\\Seen \\Deleted"))))) - (when (imap-mailbox-select inbox);; just in case - ;; todo: UID EXPUNGE (if available) to remove splitted articles - (imap-mailbox-expunge) - (imap-mailbox-close))) - t)))) - -(deffoo nnimap-request-scan (&optional group server) - (nnimap-split-articles group server)) - -(deffoo nnimap-request-newgroups (date &optional server) - (when (nnimap-possibly-change-server server) - (with-current-buffer nntp-server-buffer - (gnus-message 5 "nnimap: Listing subscribed mailboxes%s%s..." - (if (> (length server) 0) " on " "") server) - (erase-buffer) - (nnimap-before-find-minmax-bugworkaround) - (dolist (pattern (nnimap-pattern-to-list-arguments - nnimap-list-pattern)) - (dolist (mbx (imap-mailbox-lsub "*" (car pattern) nil - nnimap-server-buffer)) - (or (catch 'found - (dolist (mailbox (imap-mailbox-get 'list-flags mbx - nnimap-server-buffer)) - (if (string= (downcase mailbox) "\\noselect") - (throw 'found t))) - nil) - (let ((info (nnimap-find-minmax-uid mbx 'examine))) - (when info - (insert (format "\"%s\" %d %d y\n" - mbx (or (nth 2 info) 0) - (max 1 (or (nth 1 info) 1))))))))) - (gnus-message 5 "nnimap: Listing subscribed mailboxes%s%s...done" - (if (> (length server) 0) " on " "") server)) - t)) - -(deffoo nnimap-request-create-group (group &optional server args) - (when (nnimap-possibly-change-server server) - (or (imap-mailbox-status group 'uidvalidity nnimap-server-buffer) - (imap-mailbox-create group nnimap-server-buffer)))) - -(defun nnimap-time-substract (time1 time2) - "Return TIME for TIME1 - TIME2." - (let* ((ms (- (car time1) (car time2))) - (ls (- (nth 1 time1) (nth 1 time2)))) - (if (< ls 0) - (list (- ms 1) (+ (expt 2 16) ls)) - (list ms ls)))) - -(defun nnimap-date-days-ago (daysago) - "Return date, in format \"3-Aug-1998\", for DAYSAGO days ago." - (let* ((time (nnimap-time-substract (current-time) (days-to-time daysago))) - (date (format-time-string - (format "%%d-%s-%%Y" - (capitalize (car (rassoc (nth 4 (decode-time time)) - parse-time-months)))) - time))) - (if (eq ?0 (string-to-char date)) - (substring date 1) - date))) - -(defun nnimap-request-expire-articles-progress () - (gnus-message 5 "nnimap: Marking article %d for deletion..." - imap-current-message)) - - -(defun nnimap-expiry-target (arts group server) - (unless (eq nnmail-expiry-target 'delete) - (with-current-buffer nntp-server-buffer - (dolist (art (gnus-uncompress-sequence arts)) - (nnimap-request-article art group server) - ;; hints for optimization in `nnimap-request-accept-article' - (let ((nnimap-current-move-article art) - (nnimap-current-move-group group) - (nnimap-current-move-server server)) - (nnmail-expiry-target-group nnmail-expiry-target group)))))) - -;; Notice that we don't actually delete anything, we just mark them deleted. -(deffoo nnimap-request-expire-articles (articles group &optional server force) - (let ((artseq (gnus-compress-sequence articles))) - (when (and artseq (nnimap-possibly-change-group group server)) - (with-current-buffer nnimap-server-buffer - (if force - (progn - (nnimap-expiry-target artseq group server) - (when (imap-message-flags-add (imap-range-to-message-set artseq) - "\\Deleted") - (setq articles nil))) - (let ((days (or (and nnmail-expiry-wait-function - (funcall nnmail-expiry-wait-function group)) - nnmail-expiry-wait))) - (cond ((eq days 'immediate) - (nnimap-expiry-target artseq group server) - (when (imap-message-flags-add - (imap-range-to-message-set artseq) "\\Deleted") - (setq articles nil))) - ((numberp days) - (let ((oldarts (imap-search - (format nnimap-expunge-search-string - (imap-range-to-message-set artseq) - (nnimap-date-days-ago days)))) - (imap-fetch-data-hook - '(nnimap-request-expire-articles-progress))) - (nnimap-expiry-target oldarts group server) - (and oldarts - (imap-message-flags-add - (imap-range-to-message-set - (gnus-compress-sequence oldarts)) - "\\Deleted") - (setq articles (gnus-set-difference - articles oldarts))))))))))) - ;; return articles not deleted - articles) - -(deffoo nnimap-request-move-article (article group server - accept-form &optional last) - (when (nnimap-possibly-change-server server) - (save-excursion - (let ((buf (get-buffer-create " *nnimap move*")) - (nnimap-current-move-article article) - (nnimap-current-move-group group) - (nnimap-current-move-server nnimap-current-server) - result) - (and (nnimap-request-article article group server) - (save-excursion - (set-buffer buf) - (buffer-disable-undo (current-buffer)) - (insert-buffer-substring nntp-server-buffer) - (setq result (eval accept-form)) - (kill-buffer buf) - result) - (nnimap-request-expire-articles (list article) group server t)) - result)))) - -(deffoo nnimap-request-accept-article (group &optional server last) - (when (nnimap-possibly-change-server server) - (let (uid) - (if (setq uid - (if (string= nnimap-current-server nnimap-current-move-server) - ;; moving article within same server, speed it up... - (and (nnimap-possibly-change-group - nnimap-current-move-group) - (imap-message-copy (number-to-string - nnimap-current-move-article) - group 'dontcreate nil - nnimap-server-buffer)) - (with-current-buffer (current-buffer) - (goto-char (point-min)) - ;; remove any 'From blabla' lines, some IMAP servers - ;; reject the entire message otherwise. - (when (looking-at "^From[^:]") - (kill-region (point) (progn (forward-line) (point)))) - ;; turn into rfc822 format (\r\n eol's) - (while (search-forward "\n" nil t) - (replace-match "\r\n"))) - ;; this 'or' is for Cyrus server bug - (or (null (imap-current-mailbox nnimap-server-buffer)) - (imap-mailbox-unselect nnimap-server-buffer)) - (imap-message-append group (current-buffer) nil nil - nnimap-server-buffer))) - (cons group (nth 1 uid)) - (nnheader-report 'nnimap (imap-error-text nnimap-server-buffer)))))) - -(deffoo nnimap-request-delete-group (group force &optional server) - (when (nnimap-possibly-change-server server) - (with-current-buffer nnimap-server-buffer - (if force - (or (null (imap-mailbox-status group 'uidvalidity)) - (imap-mailbox-delete group)) - ;; UNSUBSCRIBE? - t)))) - -(deffoo nnimap-request-rename-group (group new-name &optional server) - (when (nnimap-possibly-change-server server) - (imap-mailbox-rename group new-name nnimap-server-buffer))) - -(defun nnimap-expunge (mailbox server) - (when (nnimap-possibly-change-group mailbox server) - (imap-mailbox-expunge nnimap-server-buffer))) - -(defun nnimap-acl-get (mailbox server) - (when (nnimap-possibly-change-server server) - (and (imap-capability 'ACL nnimap-server-buffer) - (imap-mailbox-acl-get mailbox nnimap-server-buffer)))) - -(defun nnimap-acl-edit (mailbox method old-acls new-acls) - (when (nnimap-possibly-change-server (cadr method)) - (unless (imap-capability 'ACL nnimap-server-buffer) - (error "Your server does not support ACL editing")) - (with-current-buffer nnimap-server-buffer - ;; delete all removed identifiers - (mapcar (lambda (old-acl) - (unless (assoc (car old-acl) new-acls) - (or (imap-mailbox-acl-delete (car old-acl) mailbox) - (error "Can't delete ACL for %s" (car old-acl))))) - old-acls) - ;; set all changed acl's - (mapcar (lambda (new-acl) - (let ((new-rights (cdr new-acl)) - (old-rights (cdr (assoc (car new-acl) old-acls)))) - (unless (and old-rights new-rights - (string= old-rights new-rights)) - (or (imap-mailbox-acl-set (car new-acl) new-rights mailbox) - (error "Can't set ACL for %s to %s" (car new-acl) - new-rights))))) - new-acls) - t))) - - -;;; Internal functions - -;; -;; This is confusing. -;; -;; mark => read, tick, draft, reply etc -;; flag => "\\Seen", "\\Flagged", "\\Draft", "gnus-expire" etc -;; predicate => "SEEN", "FLAGGED", "DRAFT", "KEYWORD gnus-expire" etc -;; -;; Mark should not really contain 'read since it's not a "mark" in the Gnus -;; world, but we cheat. Mark == gnus-article-mark-lists + '(read . read). -;; - -(defconst nnimap-mark-to-predicate-alist - (mapcar - (lambda (pair) ; cdr is the mark - (or (assoc (cdr pair) - '((read . "SEEN") - (tick . "FLAGGED") - (draft . "DRAFT") - (recent . "RECENT") - (reply . "ANSWERED"))) - (cons (cdr pair) - (format "KEYWORD gnus-%s" (symbol-name (cdr pair)))))) - (cons '(read . read) gnus-article-mark-lists))) - -(defun nnimap-mark-to-predicate (pred) - "Convert a Gnus mark (a symbol such as read, tick, expire) to a IMAP predicate. -This is a string such as \"SEEN\", \"FLAGGED\", \"KEYWORD gnus-expire\", -to be used within a IMAP SEARCH query." - (cdr (assq pred nnimap-mark-to-predicate-alist))) - -(defconst nnimap-mark-to-flag-alist - (mapcar - (lambda (pair) - (or (assoc (cdr pair) - '((read . "\\Seen") - (tick . "\\Flagged") - (draft . "\\Draft") - (recent . "\\Recent") - (reply . "\\Answered"))) - (cons (cdr pair) - (format "gnus-%s" (symbol-name (cdr pair)))))) - (cons '(read . read) gnus-article-mark-lists))) - -(defun nnimap-mark-to-flag-1 (preds) - (if (and (not (null preds)) (listp preds)) - (cons (nnimap-mark-to-flag (car preds)) - (nnimap-mark-to-flag (cdr preds))) - (cdr (assoc preds nnimap-mark-to-flag-alist)))) - -(defun nnimap-mark-to-flag (preds &optional always-list make-string) - "Convert a Gnus mark (a symbol such as read, tick, expire) to a IMAP flag. -This is a string such as \"\\Seen\", \"\\Flagged\", \"gnus-expire\", to -be used in a STORE FLAGS command." - (let ((result (nnimap-mark-to-flag-1 preds))) - (setq result (if (and (or make-string always-list) - (not (listp result))) - (list result) - result)) - (if make-string - (mapconcat (lambda (flag) - (if (listp flag) - (mapconcat 'identity flag " ") - flag)) - result " ") - result))) - -(defun nnimap-mark-permanent-p (mark &optional group) - "Return t iff MARK can be permanently (between IMAP sessions) saved on articles, in GROUP." - (imap-message-flag-permanent-p (nnimap-mark-to-flag mark))) - -(when nnimap-debug - (require 'trace) - (buffer-disable-undo (get-buffer-create nnimap-debug)) - (mapcar (lambda (f) (trace-function-background f nnimap-debug)) - '( - nnimap-possibly-change-server - nnimap-verify-uidvalidity - nnimap-find-minmax-uid - nnimap-before-find-minmax-bugworkaround - nnimap-possibly-change-group - ;;nnimap-replace-whitespace - nnimap-retrieve-headers-progress - nnimap-retrieve-which-headers - nnimap-group-overview-filename - nnimap-retrieve-headers-from-file - nnimap-retrieve-headers-from-server - nnimap-retrieve-headers - nnimap-open-connection - nnimap-open-server - nnimap-server-opened - nnimap-close-server - nnimap-request-close - nnimap-status-message - ;;nnimap-demule - nnimap-request-article-part - nnimap-request-article - nnimap-request-head - nnimap-request-body - nnimap-request-group - nnimap-close-group - nnimap-pattern-to-list-arguments - nnimap-request-list - nnimap-request-post - nnimap-retrieve-groups - nnimap-request-update-info-internal - nnimap-request-type - nnimap-request-set-mark - nnimap-split-to-groups - nnimap-split-find-rule - nnimap-split-find-inbox - nnimap-split-articles - nnimap-request-scan - nnimap-request-newgroups - nnimap-request-create-group - nnimap-time-substract - nnimap-date-days-ago - nnimap-request-expire-articles-progress - nnimap-request-expire-articles - nnimap-request-move-article - nnimap-request-accept-article - nnimap-request-delete-group - nnimap-request-rename-group - gnus-group-nnimap-expunge - gnus-group-nnimap-edit-acl - gnus-group-nnimap-edit-acl-done - nnimap-group-mode-hook - nnimap-mark-to-predicate - nnimap-mark-to-flag-1 - nnimap-mark-to-flag - nnimap-mark-permanent-p - ))) - -(provide 'nnimap) - -;;; nnimap.el ends here diff --git a/lisp/nnkiboze.el b/lisp/nnkiboze.el deleted file mode 100644 index b705d2e..0000000 --- a/lisp/nnkiboze.el +++ /dev/null @@ -1,393 +0,0 @@ -;;; nnkiboze.el --- select virtual news access for Gnus - -;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;; The other access methods (nntp, nnspool, etc) are general news -;; access methods. This module relies on Gnus and can't be used -;; separately. - -;;; Code: - -(eval-when-compile (require 'cl)) -(eval-when-compile (require 'gnus-clfns)) - -(require 'nntp) -(require 'nnheader) -(require 'gnus) -(require 'gnus-score) -(require 'nnoo) - -(nnoo-declare nnkiboze) -(defvoo nnkiboze-directory (nnheader-concat gnus-directory "kiboze/") - "nnkiboze will put its files in this directory.") - -(defvoo nnkiboze-level 9 - "The maximum level to be searched for articles.") - -(defvoo nnkiboze-remove-read-articles t - "If non-nil, nnkiboze will remove read articles from the kiboze group.") - -(defvoo nnkiboze-ephemeral nil - "If non-nil, don't store any data anywhere.") - -(defvoo nnkiboze-scores nil - "Score rules for generating the nnkiboze group.") - -(defvoo nnkiboze-regexp nil - "Regexp for matching component groups.") - -(defvoo nnkiboze-file-coding-system nnheader-text-coding-system - "Coding system for nnkiboze files.") - - - -(defconst nnkiboze-version "nnkiboze 1.0") - -(defvoo nnkiboze-current-group nil) -(defvoo nnkiboze-status-string "") - -(defvoo nnkiboze-headers nil) - - - -;;; Interface functions. - -(nnoo-define-basics nnkiboze) - -(deffoo nnkiboze-retrieve-headers (articles &optional group server fetch-old) - (nnkiboze-possibly-change-group group) - (unless gnus-nov-is-evil - (if (stringp (car articles)) - 'headers - (let ((nov (nnkiboze-nov-file-name))) - (when (file-exists-p nov) - (save-excursion - (set-buffer nntp-server-buffer) - (erase-buffer) - (let ((nnheader-file-coding-system nnkiboze-file-coding-system)) - (nnheader-insert-file-contents nov)) - (nnheader-nov-delete-outside-range - (car articles) (car (last articles))) - 'nov)))))) - -(deffoo nnkiboze-request-article (article &optional newsgroup server buffer) - (nnkiboze-possibly-change-group newsgroup) - (if (not (numberp article)) - ;; This is a real kludge. It might not work at times, but it - ;; does no harm I think. The only alternative is to offer no - ;; article fetching by message-id at all. - (nntp-request-article article newsgroup gnus-nntp-server buffer) - (let* ((header (gnus-summary-article-header article)) - (xref (mail-header-xref header)) - num group) - (unless xref - (error "nnkiboze: No xref")) - (unless (string-match " \\([^ ]+\\):\\([0-9]+\\)" xref) - (error "nnkiboze: Malformed xref")) - (setq num (string-to-int (match-string 2 xref)) - group (match-string 1 xref)) - (or (with-current-buffer buffer - (gnus-cache-request-article num group)) - (gnus-request-article num group buffer))))) - -(deffoo nnkiboze-request-scan (&optional group server) - (nnkiboze-generate-group (concat "nnkiboze:" group))) - -(deffoo nnkiboze-request-group (group &optional server dont-check) - "Make GROUP the current newsgroup." - (nnkiboze-possibly-change-group group) - (if dont-check - t - (let ((nov-file (nnkiboze-nov-file-name)) - beg end total) - (save-excursion - (set-buffer nntp-server-buffer) - (erase-buffer) - (unless (file-exists-p nov-file) - (nnkiboze-request-scan group)) - (if (not (file-exists-p nov-file)) - (nnheader-report 'nnkiboze "Can't select group %s" group) - (let ((nnheader-file-coding-system nnkiboze-file-coding-system)) - (nnheader-insert-file-contents nov-file)) - (if (zerop (buffer-size)) - (nnheader-insert "211 0 0 0 %s\n" group) - (goto-char (point-min)) - (when (looking-at "[0-9]+") - (setq beg (read (current-buffer)))) - (goto-char (point-max)) - (when (re-search-backward "^[0-9]" nil t) - (setq end (read (current-buffer)))) - (setq total (count-lines (point-min) (point-max))) - (nnheader-insert "211 %d %d %d %s\n" total beg end group))))))) - -(deffoo nnkiboze-close-group (group &optional server) - (nnkiboze-possibly-change-group group) - ;; Remove NOV lines of articles that are marked as read. - (when (and (file-exists-p (nnkiboze-nov-file-name)) - nnkiboze-remove-read-articles) - (let ((coding-system-for-write nnkiboze-file-coding-system) - (output-coding-system nnkiboze-file-coding-system)) - (with-temp-file (nnkiboze-nov-file-name) - (let ((cur (current-buffer)) - (nnheader-file-coding-system nnkiboze-file-coding-system)) - (nnheader-insert-file-contents (nnkiboze-nov-file-name)) - (goto-char (point-min)) - (while (not (eobp)) - (if (not (gnus-article-read-p (read cur))) - (forward-line 1) - (gnus-delete-line)))))) - (setq nnkiboze-current-group nil))) - -(deffoo nnkiboze-open-server (server &optional defs) - (unless (assq 'nnkiboze-regexp defs) - (push `(nnkiboze-regexp ,server) - defs)) - (nnoo-change-server 'nnkiboze server defs)) - -(deffoo nnkiboze-request-delete-group (group &optional force server) - (nnkiboze-possibly-change-group group) - (when force - (let ((files (nconc - (nnkiboze-score-file group) - (list (nnkiboze-nov-file-name) - (nnkiboze-nov-file-name ".newsrc"))))) - (while files - (and (file-exists-p (car files)) - (file-writable-p (car files)) - (delete-file (car files))) - (setq files (cdr files))))) - (setq nnkiboze-current-group nil) - t) - -(nnoo-define-skeleton nnkiboze) - - -;;; Internal functions. - -(defun nnkiboze-possibly-change-group (group) - (setq nnkiboze-current-group group)) - -(defun nnkiboze-prefixed-name (group) - (gnus-group-prefixed-name group '(nnkiboze ""))) - -;;;###autoload -(defun nnkiboze-generate-groups () - "\"Usage: emacs -batch -l nnkiboze -f nnkiboze-generate-groups\". -Finds out what articles are to be part of the nnkiboze groups." - (interactive) - (let ((nnmail-spool-file nil) - (mail-sources nil) - (gnus-use-dribble-file nil) - (gnus-read-active-file t) - (gnus-expert-user t)) - (gnus)) - (let* ((gnus-newsrc-alist (gnus-copy-sequence gnus-newsrc-alist)) - (newsrc (cdr gnus-newsrc-alist)) - gnus-newsrc-hashtb info) - (gnus-make-hashtable-from-newsrc-alist) - ;; We have copied all the newsrc alist info over to local copies - ;; so that we can mess all we want with these lists. - (while (setq info (pop newsrc)) - (when (string-match "nnkiboze" (gnus-info-group info)) - ;; For each kiboze group, we call this function to generate - ;; it. - (nnkiboze-generate-group (gnus-info-group info) t)))) - (save-excursion - (set-buffer gnus-group-buffer) - (gnus-group-list-groups))) - -(defun nnkiboze-score-file (group) - (list (expand-file-name - (concat (file-name-as-directory gnus-kill-files-directory) - (nnheader-translate-file-chars - (concat (nnkiboze-prefixed-name nnkiboze-current-group) - "." gnus-score-file-suffix)))))) - -(defun nnkiboze-generate-group (group &optional inhibit-list-groups) - (let* ((info (nth 2 (gnus-gethash group gnus-newsrc-hashtb))) - (newsrc-file (concat nnkiboze-directory - (nnheader-translate-file-chars - (concat group ".newsrc")))) - (nov-file (concat nnkiboze-directory - (nnheader-translate-file-chars - (concat group ".nov")))) - method nnkiboze-newsrc gname newsrc active - ginfo lowest glevel orig-info nov-buffer - ;; Bind various things to nil to make group entry faster. - (gnus-expert-user t) - (gnus-large-newsgroup nil) - (gnus-score-find-score-files-function 'nnkiboze-score-file) - ;; Use only nnkiboze-score-file! - (gnus-score-use-all-scores nil) - (gnus-use-scoring t) - (gnus-verbose (min gnus-verbose 3)) - gnus-select-group-hook gnus-summary-prepare-hook - gnus-thread-sort-functions gnus-show-threads - gnus-visual gnus-suppress-duplicates num-unread) - (unless info - (error "No such group: %s" group)) - ;; Load the kiboze newsrc file for this group. - (when (file-exists-p newsrc-file) - (load newsrc-file)) - (let ((coding-system-for-write nnkiboze-file-coding-system) - (output-coding-system nnkiboze-file-coding-system)) - (with-temp-file nov-file - (when (file-exists-p nov-file) - (nnheader-insert-file-contents nov-file)) - (setq nov-buffer (current-buffer)) - ;; Go through the active hashtb and add new all groups that match the - ;; kiboze regexp. - (mapatoms - (lambda (group) - (and (string-match nnkiboze-regexp - (setq gname (symbol-name group))) ; Match - (not (assoc gname nnkiboze-newsrc)) ; It isn't registered - (numberp (car (symbol-value group))) ; It is active - (or (> nnkiboze-level 7) - (and (setq glevel (nth 1 (nth 2 (gnus-gethash - gname gnus-newsrc-hashtb)))) - (>= nnkiboze-level glevel))) - (not (string-match "^nnkiboze:" gname)) ; Exclude kibozes - (push (cons gname (1- (car (symbol-value group)))) - nnkiboze-newsrc))) - gnus-active-hashtb) - ;; `newsrc' is set to the list of groups that possibly are - ;; component groups to this kiboze group. This list has elements - ;; on the form `(GROUP . NUMBER)', where NUMBER is the highest - ;; number that has been kibozed in GROUP in this kiboze group. - (setq newsrc nnkiboze-newsrc) - (while newsrc - (if (not (setq active (gnus-gethash - (caar newsrc) gnus-active-hashtb))) - ;; This group isn't active after all, so we remove it from - ;; the list of component groups. - (setq nnkiboze-newsrc (delq (car newsrc) nnkiboze-newsrc)) - (setq lowest (cdar newsrc)) - ;; Ok, we have a valid component group, so we jump to it. - (switch-to-buffer gnus-group-buffer) - (gnus-group-jump-to-group (caar newsrc)) - (gnus-message 3 "nnkiboze: Checking %s..." (caar newsrc)) - (setq ginfo (gnus-get-info (gnus-group-group-name)) - orig-info (gnus-copy-sequence ginfo) - num-unread (car (gnus-gethash (caar newsrc) - gnus-newsrc-hashtb))) - (unwind-protect - (progn - ;; We set all list of article marks to nil. Since we operate - ;; on copies of the real lists, we can destroy anything we - ;; want here. - (when (nth 3 ginfo) - (setcar (nthcdr 3 ginfo) nil)) - ;; We set the list of read articles to be what we expect for - ;; this kiboze group -- either nil or `(1 . LOWEST)'. - (when ginfo - (setcar (nthcdr 2 ginfo) - (and (not (= lowest 1)) (cons 1 lowest)))) - (when (and (or (not ginfo) - (> (length (gnus-list-of-unread-articles - (car ginfo))) - 0)) - (progn - (ignore-errors - (gnus-group-select-group nil)) - (eq major-mode 'gnus-summary-mode))) - ;; We are now in the group where we want to be. - (setq method (gnus-find-method-for-group - gnus-newsgroup-name)) - (when (eq method gnus-select-method) - (setq method nil)) - ;; We go through the list of scored articles. - (while gnus-newsgroup-scored - (when (> (caar gnus-newsgroup-scored) lowest) - ;; If it has a good score, then we enter this article - ;; into the kiboze group. - (nnkiboze-enter-nov - nov-buffer - (gnus-summary-article-header - (caar gnus-newsgroup-scored)) - gnus-newsgroup-name)) - (setq gnus-newsgroup-scored (cdr gnus-newsgroup-scored))) - ;; That's it. We exit this group. - (when (eq major-mode 'gnus-summary-mode) - (kill-buffer (current-buffer))))) - ;; Restore the proper info. - (when ginfo - (setcdr ginfo (cdr orig-info))) - (setcar (gnus-gethash (caar newsrc) gnus-newsrc-hashtb) - num-unread))) - (setcdr (car newsrc) (car active)) - (gnus-message 3 "nnkiboze: Checking %s...done" (caar newsrc)) - (setq newsrc (cdr newsrc))))) - ;; We save the kiboze newsrc for this group. - (with-temp-file newsrc-file - (insert "(setq nnkiboze-newsrc '") - (gnus-prin1 nnkiboze-newsrc) - (insert ")\n"))) - (unless inhibit-list-groups - (save-excursion - (set-buffer gnus-group-buffer) - (gnus-group-list-groups))) - t) - -(defun nnkiboze-enter-nov (buffer header group) - (save-excursion - (set-buffer buffer) - (goto-char (point-max)) - (let ((prefix (gnus-group-real-prefix group)) - (oheader (copy-sequence header)) - article) - (if (zerop (forward-line -1)) - (progn - (setq article (1+ (read (current-buffer)))) - (forward-line 1)) - (setq article 1)) - (mail-header-set-number oheader article) - (with-temp-buffer - (insert (or (mail-header-xref oheader) "")) - (goto-char (point-min)) - (if (re-search-forward " [^ ]+:[0-9]+" nil t) - (goto-char (match-beginning 0)) - (or (eobp) (forward-char 1))) - ;; The first Xref has to be the group this article - ;; really came for - this is the article nnkiboze - ;; will request when it is asked for the article. - (insert " " group ":" - (int-to-string (mail-header-number header)) " ") - (while (re-search-forward " [^ ]+:[0-9]+" nil t) - (goto-char (1+ (match-beginning 0))) - (insert prefix)) - (mail-header-set-xref oheader (buffer-string))) - (nnheader-insert-nov oheader)))) - -(defun nnkiboze-nov-file-name (&optional suffix) - (concat (file-name-as-directory nnkiboze-directory) - (nnheader-translate-file-chars - (concat (nnkiboze-prefixed-name nnkiboze-current-group) - (or suffix ".nov"))))) - -(provide 'nnkiboze) - -;;; nnkiboze.el ends here diff --git a/lisp/nnlistserv.el b/lisp/nnlistserv.el deleted file mode 100644 index bcbbf80..0000000 --- a/lisp/nnlistserv.el +++ /dev/null @@ -1,157 +0,0 @@ -;;; nnlistserv.el --- retrieving articles via web mailing list archives - -;; Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Keywords: news, mail - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;; Note: You need to have `url' and `w3' installed for this -;; backend to work. - -;;; Code: - -(eval-when-compile (require 'cl)) - -(require 'nnoo) -(eval-when-compile - (ignore-errors - (require 'nnweb)) ; requires W3 - (autoload 'url-insert-file-contents "nnweb")) - -(nnoo-declare nnlistserv - nnweb) - -(defvoo nnlistserv-directory (nnheader-concat gnus-directory "nnlistserv/") - "Where nnlistserv will save its files." - nnweb-directory) - -(defvoo nnlistserv-name 'kk - "What search engine type is being used." - nnweb-type) - -(defvoo nnlistserv-type-definition - '((kk - (article . nnlistserv-kk-wash-article) - (map . nnlistserv-kk-create-mapping) - (search . nnlistserv-kk-search) - (address . "http://www.itk.ntnu.no/ansatte/Andresen_Trond/kk-f/%s/") - (pages "fra160396" "fra160796" "fra061196" "fra160197" - "fra090997" "fra040797" "fra130397" "nye") - (index . "date.html") - (identifier . nnlistserv-kk-identity))) - "Type-definition alist." - nnweb-type-definition) - -(defvoo nnlistserv-search nil - "Search string to feed to DejaNews." - nnweb-search) - -(defvoo nnlistserv-ephemeral-p nil - "Whether this nnlistserv server is ephemeral." - nnweb-ephemeral-p) - -;;; Internal variables - -;;; Interface functions - -(nnoo-define-basics nnlistserv) - -(nnoo-import nnlistserv - (nnweb)) - -;;; Internal functions - -;;; -;;; KK functions. -;;; - -(defun nnlistserv-kk-create-mapping () - "Perform the search and create an number-to-url alist." - (save-excursion - (set-buffer nnweb-buffer) - (let ((case-fold-search t) - (active (or (cadr (assoc nnweb-group nnweb-group-alist)) - (cons 1 0))) - (pages (nnweb-definition 'pages)) - map url page subject from ) - (while (setq page (pop pages)) - (erase-buffer) - (when (funcall (nnweb-definition 'search) page) - ;; Go through all the article hits on this page. - (goto-char (point-min)) - (nnweb-decode-entities) - (goto-char (point-min)) - (while (re-search-forward "^
  • *\\([^\\>]+\\) *<[^>]+>\\([^>]+\\)<" nil t) - (setq url (match-string 1) - subject (match-string 2) - from (match-string 3)) - (setq url (concat (format (nnweb-definition 'address) page) url)) - (unless (nnweb-get-hashtb url) - (push - (list - (incf (cdr active)) - (make-full-mail-header - (cdr active) subject from "" - (concat "<" (nnweb-identifier url) "@kk>") - nil 0 0 url)) - map) - (nnweb-set-hashtb (cadar map) (car map)) - (nnheader-message 5 "%s %s %s" (cdr active) (point) pages))))) - ;; Return the articles in the right order. - (setq nnweb-articles - (sort (nconc nnweb-articles map) 'car-less-than-car))))) - -(defun nnlistserv-kk-wash-article () - (let ((case-fold-search t) - (headers '(sent name email subject id)) - sent name email subject id) - (nnweb-decode-entities) - (while headers - (goto-char (point-min)) - (re-search-forward (format "" nil t) - (replace-match "")) - (setq from - (or (mail-fetch-field "from") - (nnwarchive-from-r13 - (mail-fetch-field "from-r13")))) - (setq date (mail-fetch-field "date")) - (setq id (mail-fetch-field "message-id")) - (setq subject (mail-fetch-field "subject")) - (goto-char (point-max)) - (widen)) - (when (search-forward "
      " nil t) - (forward-line) - (delete-region (point-min) (point)) - (search-forward "
    " nil t) - (end-of-line) - (narrow-to-region (point-min) (point)) - (nnweb-remove-markup) - (nnweb-decode-entities) - (goto-char (point-min)) - (delete-blank-lines) - (when from - (message-remove-header "from") - (goto-char (point-max)) - (insert "From: " from "\n")) - (when subject - (message-remove-header "subject") - (goto-char (point-max)) - (insert "Subject: " subject "\n")) - (when id - (goto-char (point-max)) - (insert "X-Message-ID: <" id ">\n")) - (when date - (message-remove-header "date") - (goto-char (point-max)) - (insert "Date: " date "\n")) - (goto-char (point-max)) - (widen) - (insert "\n")) - (setq p (point)) - (when (search-forward "X-Body-of-Message" nil t) - (forward-line) - (delete-region p (point)) - (search-forward "X-Body-of-Message-End" nil t) - (beginning-of-line) - (save-restriction - (narrow-to-region p (point)) - (goto-char (point-min)) - (if (> (skip-chars-forward "\040\n\r\t") 0) - (delete-region (point-min) (point))) - (while (not (eobp)) - (cond - ((looking-at "
    \r?\n?")
    -	      (delete-region (match-beginning 0) (match-end 0))
    -	      (setq p (point))
    -	      (when (search-forward "
    " nil t) - (delete-region (match-beginning 0) (match-end 0)) - (save-restriction - (narrow-to-region p (point)) - (nnweb-remove-markup) - (nnweb-decode-entities) - (goto-char (point-max))))) - ((looking-at "

    \n" - "<#/external>") - (setq mime t)) - (t - (setq p (point)) - (insert "<#part type=\"text/html\" disposition=inline>") - (goto-char - (if (re-search-forward - "[\040\n\r\t]*

    \\|[\040\n\r\t]*

    ") - (setq mime t))) - (setq p (point)) - (if (> (skip-chars-forward "\040\n\r\t") 0) - (delete-region p (point)))) - (goto-char (point-max)))) - (setq p (point)) - (when (search-forward "X-References-End" nil t) - (setq e (point)) - (beginning-of-line) - (search-backward "X-References" p t) - (while (re-search-forward "msg\\([0-9]+\\)\\.html" e t) - (push (concat "<" (match-string 1) "%" group ">") refs))) - (delete-region p (point-max)) - (goto-char (point-min)) - (insert (format "Message-ID: <%05d%%%s>\n" (1- article) group)) - (when refs - (insert "References:") - (while refs - (insert " " (pop refs))) - (insert "\n")) - (when mime - (unless (looking-at "$") - (search-forward "\n\n" nil t) - (forward-line -1)) - (narrow-to-region (point) (point-max)) - (insert "MIME-Version: 1.0\n" - (prog1 - (mml-generate-mime) - (delete-region (point-min) (point-max)))) - (widen))) - (buffer-string))) - -(provide 'nnwarchive) - -;;; nnwarchive.el ends here diff --git a/lisp/nnweb.el b/lisp/nnweb.el deleted file mode 100644 index 760ef75..0000000 --- a/lisp/nnweb.el +++ /dev/null @@ -1,985 +0,0 @@ -;;; nnweb.el --- retrieving articles via web search engines -;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 -;; Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;; Note: You need to have `url' and `w3' installed for this -;; backend to work. - -;;; Code: - -(eval-when-compile (require 'cl)) -(eval-when-compile (require 'gnus-clfns)) - -(require 'nnoo) -(require 'message) -(require 'gnus-util) -(require 'gnus) -(require 'nnmail) -(eval-when-compile - (ignore-errors - (require 'w3) - (require 'url) - (require 'w3-forms))) - -;; Report failure to find w3 at load time if appropriate. -(unless noninteractive - (eval '(progn - (require 'w3) - (require 'url) - (require 'w3-forms)))) - -(nnoo-declare nnweb) - -(defvoo nnweb-directory (nnheader-concat gnus-directory "nnweb/") - "Where nnweb will save its files.") - -(defvoo nnweb-type 'dejanews - "What search engine type is being used. -Valid types include `dejanews', `dejanewsold', `reference', -and `altavista'.") - -(defvar nnweb-type-definition - '( - (dejanews ;; bought by google.com - ;;(article . nnweb-google-wash-article) - ;;(id . "http://groups.google.com/groups?as_umsgid=%s") - (article . ignore) - (id . "http://groups.google.com/groups?selm=%s&output=gplain") - ;;(reference . nnweb-google-reference) - (reference . identity) - (map . nnweb-google-create-mapping) - (search . nnweb-google-search) - (address . "http://groups.google.com/groups") - (identifier . nnweb-google-identity)) -;;; (dejanews -;;; (article . ignore) -;;; (id . "http://search.dejanews.com/msgid.xp?MID=%s&fmt=text") -;;; (map . nnweb-dejanews-create-mapping) -;;; (search . nnweb-dejanews-search) -;;; (address . "http://www.deja.com/=dnc/qs.xp") -;;; (identifier . nnweb-dejanews-identity)) -;;; (dejanewsold -;;; (article . ignore) -;;; (map . nnweb-dejanews-create-mapping) -;;; (search . nnweb-dejanewsold-search) -;;; (address . "http://www.deja.com/dnquery.xp") -;;; (identifier . nnweb-dejanews-identity)) - (reference - (article . nnweb-reference-wash-article) - (map . nnweb-reference-create-mapping) - (search . nnweb-reference-search) - (address . "http://www.reference.com/cgi-bin/pn/go") - (identifier . identity)) - (altavista - (article . nnweb-altavista-wash-article) - (map . nnweb-altavista-create-mapping) - (search . nnweb-altavista-search) - (address . "http://www.altavista.digital.com/cgi-bin/query") - (id . "/cgi-bin/news?id@%s") - (identifier . identity))) - "Type-definition alist.") - -(defvoo nnweb-search nil - "Search string to feed to DejaNews.") - -(defvoo nnweb-max-hits 999 - "Maximum number of hits to display.") - -(defvoo nnweb-ephemeral-p nil - "Whether this nnweb server is ephemeral.") - -;;; Internal variables - -(defvoo nnweb-articles nil) -(defvoo nnweb-buffer nil) -(defvoo nnweb-group-alist nil) -(defvoo nnweb-group nil) -(defvoo nnweb-hashtb nil) - -;;; Interface functions - -(nnoo-define-basics nnweb) - -(deffoo nnweb-retrieve-headers (articles &optional group server fetch-old) - (nnweb-possibly-change-server group server) - (save-excursion - (set-buffer nntp-server-buffer) - (erase-buffer) - (let (article header) - (mm-with-unibyte-current-buffer - (while (setq article (pop articles)) - (when (setq header (cadr (assq article nnweb-articles))) - (nnheader-insert-nov header)))) - 'nov))) - -(deffoo nnweb-request-scan (&optional group server) - (nnweb-possibly-change-server group server) - (funcall (nnweb-definition 'map)) - (unless nnweb-ephemeral-p - (nnweb-write-active) - (nnweb-write-overview group))) - -(deffoo nnweb-request-group (group &optional server dont-check) - (nnweb-possibly-change-server nil server) - (when (and group - (not (equal group nnweb-group)) - (not nnweb-ephemeral-p)) - (setq nnweb-group group - nnweb-articles nil) - (let ((info (assoc group nnweb-group-alist))) - (when info - (setq nnweb-type (nth 2 info)) - (setq nnweb-search (nth 3 info)) - (unless dont-check - (nnweb-read-overview group))))) - (cond - ((not nnweb-articles) - (nnheader-report 'nnweb "No matching articles")) - (t - (let ((active (if nnweb-ephemeral-p - (cons (caar nnweb-articles) - (caar (last nnweb-articles))) - (cadr (assoc group nnweb-group-alist))))) - (nnheader-report 'nnweb "Opened group %s" group) - (nnheader-insert - "211 %d %d %d %s\n" (length nnweb-articles) - (car active) (cdr active) group))))) - -(deffoo nnweb-close-group (group &optional server) - (nnweb-possibly-change-server group server) - (when (gnus-buffer-live-p nnweb-buffer) - (save-excursion - (set-buffer nnweb-buffer) - (set-buffer-modified-p nil) - (kill-buffer nnweb-buffer))) - t) - -(deffoo nnweb-request-article (article &optional group server buffer) - (nnweb-possibly-change-server group server) - (save-excursion - (set-buffer (or buffer nntp-server-buffer)) - (let* ((header (cadr (assq article nnweb-articles))) - (url (and header (mail-header-xref header)))) - (when (or (and url - (mm-with-unibyte-current-buffer - (nnweb-fetch-url url))) - (and (stringp article) - (nnweb-definition 'id t) - (let ((fetch (nnweb-definition 'id)) - art active) - (when (string-match "^<\\(.*\\)>$" article) - (setq art (match-string 1 article))) - (when (and fetch art) - (setq url (format fetch art)) - (mm-with-unibyte-current-buffer - (nnweb-fetch-url url)) - (if (nnweb-definition 'reference t) - (setq article - (funcall (nnweb-definition - 'reference) article))))))) - (unless nnheader-callback-function - (funcall (nnweb-definition 'article))) - (nnheader-report 'nnweb "Fetched article %s" article) - (cons group (and (numberp article) article)))))) - -(deffoo nnweb-close-server (&optional server) - (when (and (nnweb-server-opened server) - (gnus-buffer-live-p nnweb-buffer)) - (save-excursion - (set-buffer nnweb-buffer) - (set-buffer-modified-p nil) - (kill-buffer nnweb-buffer))) - (nnoo-close-server 'nnweb server)) - -(deffoo nnweb-request-list (&optional server) - (nnweb-possibly-change-server nil server) - (save-excursion - (set-buffer nntp-server-buffer) - (nnmail-generate-active nnweb-group-alist) - t)) - -(deffoo nnweb-request-update-info (group info &optional server) - (nnweb-possibly-change-server group server)) - -(deffoo nnweb-asynchronous-p () - t) - -(deffoo nnweb-request-create-group (group &optional server args) - (nnweb-possibly-change-server nil server) - (nnweb-request-delete-group group) - (push `(,group ,(cons 1 0) ,@args) nnweb-group-alist) - (nnweb-write-active) - t) - -(deffoo nnweb-request-delete-group (group &optional force server) - (nnweb-possibly-change-server group server) - (gnus-pull group nnweb-group-alist t) - (nnweb-write-active) - (gnus-delete-file (nnweb-overview-file group)) - t) - -(nnoo-define-skeleton nnweb) - -;;; Internal functions - -(defun nnweb-read-overview (group) - "Read the overview of GROUP and build the map." - (when (file-exists-p (nnweb-overview-file group)) - (mm-with-unibyte-buffer - (nnheader-insert-file-contents (nnweb-overview-file group)) - (goto-char (point-min)) - (let (header) - (while (not (eobp)) - (setq header (nnheader-parse-nov)) - (forward-line 1) - (push (list (mail-header-number header) - header (mail-header-xref header)) - nnweb-articles) - (nnweb-set-hashtb header (car nnweb-articles))))))) - -(defun nnweb-write-overview (group) - "Write the overview file for GROUP." - (with-temp-file (nnweb-overview-file group) - (let ((articles nnweb-articles)) - (while articles - (nnheader-insert-nov (cadr (pop articles))))))) - -(defun nnweb-set-hashtb (header data) - (gnus-sethash (nnweb-identifier (mail-header-xref header)) - data nnweb-hashtb)) - -(defun nnweb-get-hashtb (url) - (gnus-gethash (nnweb-identifier url) nnweb-hashtb)) - -(defun nnweb-identifier (ident) - (funcall (nnweb-definition 'identifier) ident)) - -(defun nnweb-overview-file (group) - "Return the name of the overview file of GROUP." - (nnheader-concat nnweb-directory group ".overview")) - -(defun nnweb-write-active () - "Save the active file." - (gnus-make-directory nnweb-directory) - (with-temp-file (nnheader-concat nnweb-directory "active") - (prin1 `(setq nnweb-group-alist ',nnweb-group-alist) (current-buffer)))) - -(defun nnweb-read-active () - "Read the active file." - (load (nnheader-concat nnweb-directory "active") t t t)) - -(defun nnweb-definition (type &optional noerror) - "Return the definition of TYPE." - (let ((def (cdr (assq type (assq nnweb-type nnweb-type-definition))))) - (when (and (not def) - (not noerror)) - (error "Undefined definition %s" type)) - def)) - -(defun nnweb-possibly-change-server (&optional group server) - (nnweb-init server) - (when server - (unless (nnweb-server-opened server) - (nnweb-open-server server))) - (unless nnweb-group-alist - (nnweb-read-active)) - (when group - (when (and (not nnweb-ephemeral-p) - (not (equal group nnweb-group))) - (setq nnweb-hashtb (gnus-make-hashtable 4095)) - (nnweb-request-group group nil t)))) - -(defun nnweb-init (server) - "Initialize buffers and such." - (unless (gnus-buffer-live-p nnweb-buffer) - (setq nnweb-buffer - (save-excursion - (mm-with-unibyte - (nnheader-set-temp-buffer - (format " *nnweb %s %s %s*" - nnweb-type nnweb-search server)) - (current-buffer)))))) - -(defun nnweb-fetch-url (url) - (let (buf) - (save-excursion - (if (not nnheader-callback-function) - (progn - (with-temp-buffer - (mm-enable-multibyte) - (let ((coding-system-for-read 'binary) - (coding-system-for-write 'binary) - (input-coding-system 'binary) - (output-coding-system 'binary) - (default-process-coding-system 'binary)) - (nnweb-insert url)) - (setq buf (buffer-string))) - (erase-buffer) - (insert buf) - t) - (nnweb-url-retrieve-asynch - url 'nnweb-callback (current-buffer) nnheader-callback-function) - t)))) - -(defun nnweb-callback (buffer callback) - (when (gnus-buffer-live-p url-working-buffer) - (save-excursion - (set-buffer url-working-buffer) - (funcall (nnweb-definition 'article)) - (nnweb-decode-entities) - (set-buffer buffer) - (goto-char (point-max)) - (insert-buffer-substring url-working-buffer)) - (funcall callback t) - (gnus-kill-buffer url-working-buffer))) - -(defun nnweb-url-retrieve-asynch (url callback &rest data) - (let ((url-request-method "GET") - (old-asynch url-be-asynchronous) - (url-request-data nil) - (url-request-extra-headers nil) - (url-working-buffer (generate-new-buffer-name " *nnweb*"))) - (setq-default url-be-asynchronous t) - (save-excursion - (set-buffer (get-buffer-create url-working-buffer)) - (setq url-current-callback-data data - url-be-asynchronous t - url-current-callback-func callback) - (url-retrieve url nil)) - (setq-default url-be-asynchronous old-asynch))) - -(if (fboundp 'url-retrieve-synchronously) - (defun nnweb-url-retrieve-asynch (url callback &rest data) - (url-retrieve url callback data))) - -;;; -;;; DejaNews functions. -;;; - -(defun nnweb-dejanews-create-mapping () - "Perform the search and create an number-to-url alist." - (save-excursion - (set-buffer nnweb-buffer) - (erase-buffer) - (when (funcall (nnweb-definition 'search) nnweb-search) - (let ((i 0) - (more t) - (case-fold-search t) - (active (or (cadr (assoc nnweb-group nnweb-group-alist)) - (cons 1 0))) - subject date from - map url parse a table group text) - (while more - ;; Go through all the article hits on this page. - (goto-char (point-min)) - (setq parse (w3-parse-buffer (current-buffer)) - table (nth 1 (nnweb-parse-find-all 'table parse))) - (dolist (row (nth 2 (car (nth 2 table)))) - (setq a (nnweb-parse-find 'a row) - url (cdr (assq 'href (nth 1 a))) - text (nreverse (nnweb-text row))) - (when a - (setq subject (nth 4 text) - group (nth 2 text) - date (nth 1 text) - from (nth 0 text)) - (if (string-match "\\([0-9]+\\)/\\([0-9]+\\)/\\([0-9]+\\)" date) - (setq date (format "%s %s 00:00:00 %s" - (car (rassq (string-to-number - (match-string 2 date)) - parse-time-months)) - (match-string 3 date) - (match-string 1 date))) - (setq date "Jan 1 00:00:00 0000")) - (incf i) - (setq url (concat url "&fmt=text")) - (when (string-match "&context=[^&]+" url) - (setq url (replace-match "" t t url))) - (unless (nnweb-get-hashtb url) - (push - (list - (incf (cdr active)) - (make-full-mail-header - (cdr active) (concat subject " (" group ")") from date - (concat "<" (nnweb-identifier url) "@dejanews>") - nil 0 0 url)) - map) - (nnweb-set-hashtb (cadar map) (car map))))) - ;; See whether there is a "Get next 20 hits" button here. - (goto-char (point-min)) - (if (or (not (re-search-forward - "HREF=\"\\([^\"]+\\)\"[<>b]+Next result" nil t)) - (>= i nnweb-max-hits)) - (setq more nil) - ;; Yup -- fetch it. - (setq more (match-string 1)) - (erase-buffer) - (url-insert-file-contents more))) - ;; Return the articles in the right order. - (setq nnweb-articles - (sort (nconc nnweb-articles map) 'car-less-than-car)))))) - -(defun nnweb-dejanews-search (search) - (nnweb-insert - (concat - (nnweb-definition 'address) - "?" - (nnweb-encode-www-form-urlencoded - `(("ST" . "PS") - ("svcclass" . "dnyr") - ("QRY" . ,search) - ("defaultOp" . "AND") - ("DBS" . "1") - ("OP" . "dnquery.xp") - ("LNG" . "ALL") - ("maxhits" . "100") - ("threaded" . "0") - ("format" . "verbose2") - ("showsort" . "date") - ("agesign" . "1") - ("ageweight" . "1"))))) - t) - -(defun nnweb-dejanewsold-search (search) - (nnweb-fetch-form - (nnweb-definition 'address) - `(("query" . ,search) - ("defaultOp" . "AND") - ("svcclass" . "dnold") - ("maxhits" . "100") - ("format" . "verbose2") - ("threaded" . "0") - ("showsort" . "date") - ("agesign" . "1") - ("ageweight" . "1"))) - t) - -(defun nnweb-dejanews-identity (url) - "Return an unique identifier based on URL." - (if (string-match "AN=\\([0-9]+\\)" url) - (match-string 1 url) - url)) - -;;; -;;; InReference -;;; - -(defun nnweb-reference-create-mapping () - "Perform the search and create an number-to-url alist." - (save-excursion - (set-buffer nnweb-buffer) - (erase-buffer) - (when (funcall (nnweb-definition 'search) nnweb-search) - (let ((i 0) - (more t) - (case-fold-search t) - (active (or (cadr (assoc nnweb-group nnweb-group-alist)) - (cons 1 0))) - Subject Score Date Newsgroups From Message-ID - map url) - (while more - ;; Go through all the article hits on this page. - (goto-char (point-min)) - (search-forward "


    " nil t) - (delete-region (point-min) (point)) - (goto-char (point-min)) - (while (re-search-forward "^ +[0-9]+\\." nil t) - (narrow-to-region - (point) - (if (re-search-forward "^$" nil t) - (match-beginning 0) - (point-max))) - (goto-char (point-min)) - (when (looking-at ".*href=\"\\([^\"]+\\)\"") - (setq url (match-string 1))) - (nnweb-remove-markup) - (goto-char (point-min)) - (while (search-forward "\t" nil t) - (replace-match " ")) - (goto-char (point-min)) - (while (re-search-forward "^\\([^:]+\\): \\(.*\\)$" nil t) - (set (intern (match-string 1)) (match-string 2))) - (widen) - (search-forward "" nil t) - (incf i) - (unless (nnweb-get-hashtb url) - (push - (list - (incf (cdr active)) - (make-full-mail-header - (cdr active) (concat "(" Newsgroups ") " Subject) From Date - Message-ID - nil 0 (string-to-int Score) url)) - map) - (nnweb-set-hashtb (cadar map) (car map)))) - (setq more nil)) - ;; Return the articles in the right order. - (setq nnweb-articles - (sort (nconc nnweb-articles map) 'car-less-than-car)))))) - -(defun nnweb-reference-wash-article () - (let ((case-fold-search t)) - (goto-char (point-min)) - (re-search-forward "^
    " nil t) - (delete-region (point-min) (point)) - (search-forward "
    " nil t)
    -    (forward-line -1)
    -    (let ((body (point-marker)))
    -      (search-forward "
    " nil t) - (delete-region (point) (point-max)) - (nnweb-remove-markup) - (goto-char (point-min)) - (while (looking-at " *$") - (gnus-delete-line)) - (narrow-to-region (point-min) body) - (while (and (re-search-forward "^$" nil t) - (not (eobp))) - (gnus-delete-line)) - (goto-char (point-min)) - (while (looking-at "\\(^[^ ]+:\\) *") - (replace-match "\\1 " t) - (forward-line 1)) - (goto-char (point-min)) - (when (re-search-forward "^References:" nil t) - (narrow-to-region - (point) (if (re-search-forward "^$\\|^[^:]+:" nil t) - (match-beginning 0) - (point-max))) - (goto-char (point-min)) - (while (not (eobp)) - (unless (looking-at "References") - (insert "\t") - (forward-line 1))) - (goto-char (point-min)) - (while (search-forward "," nil t) - (replace-match " " t t))) - (widen) - (nnweb-decode-entities) - (set-marker body nil)))) - -(defun nnweb-reference-search (search) - (url-insert-file-contents - (concat - (nnweb-definition 'address) - "?" - (nnweb-encode-www-form-urlencoded - `(("search" . "advanced") - ("querytext" . ,search) - ("subj" . "") - ("name" . "") - ("login" . "") - ("host" . "") - ("organization" . "") - ("groups" . "") - ("keywords" . "") - ("choice" . "Search") - ("startmonth" . "Jul") - ("startday" . "25") - ("startyear" . "1996") - ("endmonth" . "Aug") - ("endday" . "24") - ("endyear" . "1996") - ("mode" . "Quick") - ("verbosity" . "Verbose") - ("ranking" . "Relevance") - ("first" . "1") - ("last" . "25") - ("score" . "50"))))) - (setq buffer-file-name nil) - t) - -;;; -;;; Alta Vista -;;; - -(defun nnweb-altavista-create-mapping () - "Perform the search and create an number-to-url alist." - (save-excursion - (set-buffer nnweb-buffer) - (erase-buffer) - (let ((part 0)) - (when (funcall (nnweb-definition 'search) nnweb-search part) - (let ((i 0) - (more t) - (case-fold-search t) - (active (or (cadr (assoc nnweb-group nnweb-group-alist)) - (cons 1 0))) - subject date from id group - map url) - (while more - ;; Go through all the article hits on this page. - (goto-char (point-min)) - (search-forward "
    " nil t) - (delete-region (point-min) (match-beginning 0)) - (goto-char (point-min)) - (while (search-forward "
    " nil t) - (replace-match "\n")) - (nnweb-decode-entities) - (goto-char (point-min)) - (while (re-search-forward ".*href=\"\\([^\"]+\\)\">\\([^>]*\\)
    \\([^-]+\\)- \\([^<]+\\)<.*href=\"news:\\([^\"]+\\)\">.*\">\\(.+\\)

    " - nil t) - (setq url (match-string 1) - subject (match-string 2) - date (match-string 3) - group (match-string 4) - id (concat "<" (match-string 5) ">") - from (match-string 6)) - (incf i) - (unless (nnweb-get-hashtb url) - (push - (list - (incf (cdr active)) - (make-full-mail-header - (cdr active) (concat "(" group ") " subject) from date - id nil 0 0 url)) - map) - (nnweb-set-hashtb (cadar map) (car map)))) - ;; See if we want more. - (when (or (not nnweb-articles) - (>= i nnweb-max-hits) - (not (funcall (nnweb-definition 'search) - nnweb-search (incf part)))) - (setq more nil))) - ;; Return the articles in the right order. - (setq nnweb-articles - (sort (nconc nnweb-articles map) 'car-less-than-car))))))) - -(defun nnweb-altavista-wash-article () - (goto-char (point-min)) - (let ((case-fold-search t)) - (when (re-search-forward "^" nil t) - (delete-region (point-min) (match-beginning 0))) - (goto-char (point-min)) - (while (looking-at "\\([^ ]+\\) + +\\(.*\\)$") - (replace-match "\\1: \\2" t) - (forward-line 1)) - (when (re-search-backward "^References:" nil t) - (narrow-to-region (point) (progn (forward-line 1) (point))) - (goto-char (point-min)) - (while (re-search-forward "[0-9]+" nil t) - (replace-match "<\\1> " t))) - (widen) - (nnweb-remove-markup) - (nnweb-decode-entities))) - -(defun nnweb-altavista-search (search &optional part) - (url-insert-file-contents - (concat - (nnweb-definition 'address) - "?" - (nnweb-encode-www-form-urlencoded - `(("pg" . "aq") - ("what" . "news") - ,@(when part `(("stq" . ,(int-to-string (* part 30))))) - ("fmt" . "d") - ("q" . ,search) - ("r" . "") - ("d0" . "") - ("d1" . ""))))) - (setq buffer-file-name nil) - t) - -;;; -;;; Deja bought by google.com -;;; - -(defun nnweb-google-wash-article () - (let ((case-fold-search t) url) - (goto-char (point-min)) - (re-search-forward "^

    " nil t)
    -    (narrow-to-region (point-min) (point))
    -    (search-backward "" nil t)
    -      (replace-match "\n"))
    -    (nnweb-remove-markup)
    -    (goto-char (point-min))
    -    (while (re-search-forward "^[ \t]*\n" nil t)
    -      (replace-match ""))
    -    (goto-char (point-max))
    -    (insert "\n")
    -    (widen)
    -    (narrow-to-region (point) (point-max))
    -    (search-forward "" nil t)
    -    (delete-region (point) (point-max))
    -    (nnweb-remove-markup)
    -    (widen)))
    -
    -(defun nnweb-google-parse-1 (&optional Message-ID)
    -  (let ((i 0)
    -	(case-fold-search t)
    -	(active (cadr (assoc nnweb-group nnweb-group-alist)))
    -	Subject Score Date Newsgroups From
    -	map url mid)
    -    (unless active
    -      (push (list nnweb-group (setq active (cons 1 0))
    -		  nnweb-type nnweb-search)
    -	    nnweb-group-alist))
    -    ;; Go through all the article hits on this page.
    -    (goto-char (point-min))
    -    (while (re-search-forward
    -	    "a href=/groups\\(\\?[^ \">]*selm=\\([^ &\">]+\\)\\)" nil t)
    -      (setq mid (match-string 2)
    -	    url (format 
    -		 "http://groups.google.com/groups?selm=%s&output=gplain" mid))
    -      (narrow-to-region (search-forward ">" nil t)
    -			(search-forward "" nil t))
    -      (nnweb-remove-markup)
    -      (nnweb-decode-entities)
    -      (setq Subject (buffer-string))
    -      (goto-char (point-max))
    -      (widen)
    -      (forward-line 2)
    -      (when (looking-at "
    ]+>") - (goto-char (match-end 0))) - (if (not (looking-at "]+>")) - (skip-chars-forward " \t") - (narrow-to-region (point) - (search-forward "" nil t)) - (nnweb-remove-markup) - (nnweb-decode-entities) - (setq Newsgroups (buffer-string)) - (goto-char (point-max)) - (widen) - (skip-chars-forward "- \t")) - (when (looking-at - "\\([0-9]+[/ ][A-Za-z]+[/ ][0-9]+\\)[ \t]*by[ \t]*\\([^<]*\\) - ]+\\)" url) - (match-string 1 url) - url)) - -;;; -;;; General web/w3 interface utility functions -;;; - -(defun nnweb-insert-html (parse) - "Insert HTML based on a w3 parse tree." - (if (stringp parse) - (insert (nnheader-string-as-multibyte parse)) - (insert "<" (symbol-name (car parse)) " ") - (insert (mapconcat - (lambda (param) - (concat (symbol-name (car param)) "=" - (prin1-to-string - (if (consp (cdr param)) - (cadr param) - (cdr param))))) - (nth 1 parse) - " ")) - (insert ">\n") - (mapcar 'nnweb-insert-html (nth 2 parse)) - (insert "\n"))) - -(defun nnweb-encode-www-form-urlencoded (pairs) - "Return PAIRS encoded for forms." - (mapconcat - (function - (lambda (data) - (concat (w3-form-encode-xwfu (car data)) "=" - (w3-form-encode-xwfu (cdr data))))) - pairs "&")) - -(defun nnweb-fetch-form (url pairs) - "Fetch a form from URL with PAIRS as the data using the POST method." - (let ((url-request-data (nnweb-encode-www-form-urlencoded pairs)) - (url-request-method "POST") - (url-request-extra-headers - '(("Content-type" . "application/x-www-form-urlencoded")))) - (url-insert-file-contents url) - (setq buffer-file-name nil)) - t) - -(defun nnweb-decode-entities () - "Decode all HTML entities." - (goto-char (point-min)) - (while (re-search-forward "&\\(#[0-9]+\\|[a-z]+\\);" nil t) - (let ((elem (if (eq (aref (match-string 1) 0) ?\#) - (let ((c - (string-to-number (substring - (match-string 1) 1)))) - (if (mm-char-or-char-int-p c) c 32)) - (or (cdr (assq (intern (match-string 1)) - w3-html-entities)) - ?#)))) - (unless (stringp elem) - (setq elem (char-to-string elem))) - (replace-match elem t t)))) - -(defun nnweb-decode-entities-string (string) - (with-temp-buffer - (insert string) - (nnweb-decode-entities) - (buffer-substring (point-min) (point-max)))) - -(defun nnweb-remove-markup () - "Remove all HTML markup, leaving just plain text." - (goto-char (point-min)) - (while (search-forward "" nil t) - (point-max)))) - (goto-char (point-min)) - (while (re-search-forward "<[^>]+>" nil t) - (replace-match "" t t))) - -(defun nnweb-insert (url &optional follow-refresh) - "Insert the contents from an URL in the current buffer. -If FOLLOW-REFRESH is non-nil, redirect refresh url in META." - (let ((name buffer-file-name)) - (if follow-refresh - (save-restriction - (narrow-to-region (point) (point)) - (url-insert-file-contents url) - (goto-char (point-min)) - (when (re-search-forward - "]*URL=\\([^\"]+\\)\"" nil t) - (let ((url (match-string 1))) - (delete-region (point-min) (point-max)) - (nnweb-insert url t)))) - (url-insert-file-contents url)) - (setq buffer-file-name name))) - -(defun nnweb-parse-find (type parse &optional maxdepth) - "Find the element of TYPE in PARSE." - (catch 'found - (nnweb-parse-find-1 type parse maxdepth))) - -(defun nnweb-parse-find-1 (type contents maxdepth) - (when (or (null maxdepth) - (not (zerop maxdepth))) - (when (consp contents) - (when (eq (car contents) type) - (throw 'found contents)) - (when (listp (cdr contents)) - (dolist (element contents) - (when (consp element) - (nnweb-parse-find-1 type element - (and maxdepth (1- maxdepth))))))))) - -(defun nnweb-parse-find-all (type parse) - "Find all elements of TYPE in PARSE." - (catch 'found - (nnweb-parse-find-all-1 type parse))) - -(defun nnweb-parse-find-all-1 (type contents) - (let (result) - (when (consp contents) - (if (eq (car contents) type) - (push contents result) - (when (listp (cdr contents)) - (dolist (element contents) - (when (consp element) - (setq result - (nconc result (nnweb-parse-find-all-1 type element)))))))) - result)) - -(defvar nnweb-text) -(defun nnweb-text (parse) - "Return a list of text contents in PARSE." - (let ((nnweb-text nil)) - (nnweb-text-1 parse) - (nreverse nnweb-text))) - -(defun nnweb-text-1 (contents) - (dolist (element contents) - (if (stringp element) - (push element nnweb-text) - (when (and (consp element) - (listp (cdr element))) - (nnweb-text-1 element))))) - -(defun nnweb-replace-in-string (string match newtext) - (while (string-match match string) - (setq string (replace-match newtext t t string))) - string) - -(provide 'nnweb) - -;;; nnweb.el ends here diff --git a/lisp/nnwfm.el b/lisp/nnwfm.el deleted file mode 100644 index 2de45b7..0000000 --- a/lisp/nnwfm.el +++ /dev/null @@ -1,433 +0,0 @@ -;;; nnwfm.el --- interfacing with a web forum -;; Copyright (C) 2000 Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Keywords: news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;; Note: You need to have `url' and `w3' installed for this -;; backend to work. - -;;; Code: - -(eval-when-compile (require 'cl)) -(eval-when-compile (require 'gnus-clfns)) - -(require 'nnoo) -(require 'message) -(require 'gnus-util) -(require 'gnus) -(require 'nnmail) -(require 'mm-util) -(eval-when-compile - (ignore-errors - (require 'nnweb))) -;; Report failure to find w3 at load time if appropriate. -(eval '(require 'nnweb)) - -(nnoo-declare nnwfm) - -(defvoo nnwfm-directory (nnheader-concat gnus-directory "wfm/") - "Where nnwfm will save its files.") - -(defvoo nnwfm-address "" - "The address of the Ultimate bulletin board.") - -;;; Internal variables - -(defvar nnwfm-groups-alist nil) -(defvoo nnwfm-groups nil) -(defvoo nnwfm-headers nil) -(defvoo nnwfm-articles nil) -(defvar nnwfm-table-regexp - "postings.*editpost\\|forumdisplay\\|Forum[0-9]+/HTML\\|getbio") - -;;; Interface functions - -(nnoo-define-basics nnwfm) - -(deffoo nnwfm-retrieve-headers (articles &optional group server fetch-old) - (nnwfm-possibly-change-server group server) - (unless gnus-nov-is-evil - (let* ((last (car (last articles))) - (did nil) - (start 1) - (entry (assoc group nnwfm-groups)) - (sid (nth 2 entry)) - (topics (nth 4 entry)) - (mapping (nth 5 entry)) - (old-total (or (nth 6 entry) 1)) - (nnwfm-table-regexp "Thread.asp") - headers article subject score from date lines parent point - contents tinfo fetchers map elem a href garticles topic old-max - inc datel table string current-page total-contents pages - farticles forum-contents parse furl-fetched mmap farticle - thread-id tables hstuff bstuff time) - (setq map mapping) - (while (and (setq article (car articles)) - map) - (while (and map - (or (> article (caar map)) - (< (cadar map) (caar map)))) - (pop map)) - (when (setq mmap (car map)) - (setq farticle -1) - (while (and article - (<= article (nth 1 mmap))) - ;; Do we already have a fetcher for this topic? - (if (setq elem (assq (nth 2 mmap) fetchers)) - ;; Yes, so we just add the spec to the end. - (nconc elem (list (cons article - (+ (nth 3 mmap) (incf farticle))))) - ;; No, so we add a new one. - (push (list (nth 2 mmap) - (cons article - (+ (nth 3 mmap) (incf farticle)))) - fetchers)) - (pop articles) - (setq article (car articles))))) - ;; Now we have the mapping from/to Gnus/nnwfm article numbers, - ;; so we start fetching the topics that we need to satisfy the - ;; request. - (if (not fetchers) - (save-excursion - (set-buffer nntp-server-buffer) - (erase-buffer)) - (setq nnwfm-articles nil) - (mm-with-unibyte-buffer - (dolist (elem fetchers) - (erase-buffer) - (setq subject (nth 2 (assq (car elem) topics)) - thread-id (nth 0 (assq (car elem) topics))) - (nnweb-insert - (concat nnwfm-address - (format "Item.asp?GroupID=%d&ThreadID=%d" sid - thread-id))) - (goto-char (point-min)) - (setq tables (caddar - (caddar - (cdr (caddar - (caddar - (ignore-errors - (w3-parse-buffer (current-buffer))))))))) - (setq tables (cdr (caddar (memq (assq 'div tables) tables)))) - (setq contents nil) - (dolist (table tables) - (when (eq (car table) 'table) - (setq table (caddar (caddar (caddr table))) - hstuff (delete ":link" (nnweb-text (car table))) - bstuff (car (caddar (cdr table))) - from (car hstuff)) - (when (nth 2 hstuff) - (setq time (nnwfm-date-to-time (nth 2 hstuff))) - (push (list from time bstuff) contents)))) - (setq contents (nreverse contents)) - (dolist (art (cdr elem)) - (push (list (car art) - (nth (1- (cdr art)) contents) - subject) - nnwfm-articles)))) - (setq nnwfm-articles - (sort nnwfm-articles 'car-less-than-car)) - ;; Now we have all the articles, conveniently in an alist - ;; where the key is the Gnus article number. - (dolist (articlef nnwfm-articles) - (setq article (nth 0 articlef) - contents (nth 1 articlef) - subject (nth 2 articlef)) - (setq from (nth 0 contents) - date (message-make-date (nth 1 contents))) - (push - (cons - article - (make-full-mail-header - article subject - from (or date "") - (concat "<" (number-to-string sid) "%" - (number-to-string article) - "@wfm>") - "" 0 - (/ (length (mapconcat 'identity (nnweb-text (nth 2 contents)) "")) - 70) - nil nil)) - headers)) - (setq nnwfm-headers (sort headers 'car-less-than-car)) - (save-excursion - (set-buffer nntp-server-buffer) - (mm-with-unibyte-current-buffer - (erase-buffer) - (dolist (header nnwfm-headers) - (nnheader-insert-nov (cdr header)))))) - 'nov))) - -(deffoo nnwfm-request-group (group &optional server dont-check) - (nnwfm-possibly-change-server nil server) - (when (not nnwfm-groups) - (nnwfm-request-list)) - (unless dont-check - (nnwfm-create-mapping group)) - (let ((elem (assoc group nnwfm-groups))) - (cond - ((not elem) - (nnheader-report 'nnwfm "Group does not exist")) - (t - (nnheader-report 'nnwfm "Opened group %s" group) - (nnheader-insert - "211 %d %d %d %s\n" (cadr elem) 1 (cadr elem) - (prin1-to-string group)))))) - -(deffoo nnwfm-request-close () - (setq nnwfm-groups-alist nil - nnwfm-groups nil)) - -(deffoo nnwfm-request-article (article &optional group server buffer) - (nnwfm-possibly-change-server group server) - (let ((contents (cdr (assq article nnwfm-articles)))) - (when (setq contents (nth 2 (car contents))) - (save-excursion - (set-buffer (or buffer nntp-server-buffer)) - (erase-buffer) - (nnweb-insert-html contents) - (goto-char (point-min)) - (insert "Content-Type: text/html\nMIME-Version: 1.0\n") - (let ((header (cdr (assq article nnwfm-headers)))) - (mm-with-unibyte-current-buffer - (nnheader-insert-header header))) - (nnheader-report 'nnwfm "Fetched article %s" article) - (cons group article))))) - -(deffoo nnwfm-request-list (&optional server) - (nnwfm-possibly-change-server nil server) - (mm-with-unibyte-buffer - (nnweb-insert - (if (string-match "/$" nnwfm-address) - (concat nnwfm-address "Group.asp") - nnwfm-address)) - (let* ((nnwfm-table-regexp "Thread.asp") - (contents (w3-parse-buffer (current-buffer))) - sid elem description articles a href group forum - a1 a2) - (dolist (row (cdr (nth 2 (car (nth 2 (nnwfm-find-forum-table - contents)))))) - (setq row (nth 2 row)) - (when (setq a (nnweb-parse-find 'a row)) - (setq group (car (last (nnweb-text a))) - href (cdr (assq 'href (nth 1 a)))) - (setq description (car (last (nnweb-text (nth 1 row))))) - (setq articles - (string-to-number - (nnweb-replace-in-string - (car (last (nnweb-text (nth 3 row)))) "," ""))) - (when (and href - (string-match "GroupId=\\([0-9]+\\)" href)) - (setq forum (string-to-number (match-string 1 href))) - (if (setq elem (assoc group nnwfm-groups)) - (setcar (cdr elem) articles) - (push (list group articles forum description nil nil nil nil) - nnwfm-groups)))))) - (nnwfm-write-groups) - (nnwfm-generate-active) - t)) - -(deffoo nnwfm-request-newgroups (date &optional server) - (nnwfm-possibly-change-server nil server) - (nnwfm-generate-active) - t) - -(nnoo-define-skeleton nnwfm) - -;;; Internal functions - -(defun nnwfm-new-threads-p (group time) - "See whether we want to fetch the threads for GROUP written before TIME." - (let ((old-time (nth 7 (assoc group nnwfm-groups)))) - (or (null old-time) - (time-less-p old-time time)))) - -(defun nnwfm-create-mapping (group) - (let* ((entry (assoc group nnwfm-groups)) - (sid (nth 2 entry)) - (topics (nth 4 entry)) - (mapping (nth 5 entry)) - (old-total (or (nth 6 entry) 1)) - (current-time (current-time)) - (nnwfm-table-regexp "Thread.asp") - (furls (list (concat nnwfm-address - (format "Thread.asp?GroupId=%d" sid)))) - fetched-urls - contents forum-contents a subject href - garticles topic tinfo old-max inc parse elem date - url time) - (mm-with-unibyte-buffer - (while furls - (erase-buffer) - (push (car furls) fetched-urls) - (nnweb-insert (pop furls)) - (goto-char (point-min)) - (while (re-search-forward " wr(" nil t) - (forward-char -1) - (setq elem (message-tokenize-header - (nnweb-replace-in-string - (buffer-substring - (1+ (point)) - (progn - (forward-sexp 1) - (1- (point)))) - "\\\\[\"\\\\]" ""))) - (push (list - (string-to-number (nth 1 elem)) - (nnweb-replace-in-string (nth 2 elem) "\"" "") - (string-to-number (nth 5 elem))) - forum-contents)) - (when (re-search-forward "href=\"\\(Thread.*DateLast=\\([^\"]+\\)\\)" - nil t) - (setq url (match-string 1) - time (nnwfm-date-to-time (url-unhex-string (match-string 2)))) - (when (and (nnwfm-new-threads-p group time) - (not (member - (setq url (concat - nnwfm-address - (nnweb-decode-entities-string url))) - fetched-urls))) - (push url furls)))) - ;; The main idea here is to map Gnus article numbers to - ;; nnwfm article numbers. Say there are three topics in - ;; this forum, the first with 4 articles, the seconds with 2, - ;; and the third with 1. Then this will translate into 7 Gnus - ;; article numbers, where 1-4 comes from the first topic, 5-6 - ;; from the second and 7 from the third. Now, then next time - ;; the group is entered, there's 2 new articles in topic one - ;; and 1 in topic three. Then Gnus article number 8-9 be 5-6 - ;; in topic one and 10 will be the 2 in topic three. - (dolist (elem (nreverse forum-contents)) - (setq subject (nth 1 elem) - topic (nth 0 elem) - garticles (nth 2 elem)) - (if (setq tinfo (assq topic topics)) - (progn - (setq old-max (cadr tinfo)) - (setcar (cdr tinfo) garticles)) - (setq old-max 0) - (push (list topic garticles subject) topics) - (setcar (nthcdr 4 entry) topics)) - (when (not (= old-max garticles)) - (setq inc (- garticles old-max)) - (setq mapping (nconc mapping - (list - (list - old-total (1- (incf old-total inc)) - topic (1+ old-max))))) - (incf old-max inc) - (setcar (nthcdr 5 entry) mapping) - (setcar (nthcdr 6 entry) old-total)))) - (setcar (nthcdr 7 entry) current-time) - (setcar (nthcdr 1 entry) (1- old-total)) - (nnwfm-write-groups) - mapping)) - -(defun nnwfm-possibly-change-server (&optional group server) - (nnwfm-init server) - (when (and server - (not (nnwfm-server-opened server))) - (nnwfm-open-server server)) - (unless nnwfm-groups-alist - (nnwfm-read-groups) - (setq nnwfm-groups (cdr (assoc nnwfm-address - nnwfm-groups-alist))))) - -(deffoo nnwfm-open-server (server &optional defs connectionless) - (nnheader-init-server-buffer) - (if (nnwfm-server-opened server) - t - (unless (assq 'nnwfm-address defs) - (setq defs (append defs (list (list 'nnwfm-address server))))) - (nnoo-change-server 'nnwfm server defs))) - -(defun nnwfm-read-groups () - (setq nnwfm-groups-alist nil) - (let ((file (expand-file-name "groups" nnwfm-directory))) - (when (file-exists-p file) - (mm-with-unibyte-buffer - (insert-file-contents file) - (goto-char (point-min)) - (setq nnwfm-groups-alist (read (current-buffer))))))) - -(defun nnwfm-write-groups () - (setq nnwfm-groups-alist - (delq (assoc nnwfm-address nnwfm-groups-alist) - nnwfm-groups-alist)) - (push (cons nnwfm-address nnwfm-groups) - nnwfm-groups-alist) - (with-temp-file (expand-file-name "groups" nnwfm-directory) - (prin1 nnwfm-groups-alist (current-buffer)))) - -(defun nnwfm-init (server) - "Initialize buffers and such." - (unless (file-exists-p nnwfm-directory) - (gnus-make-directory nnwfm-directory))) - -(defun nnwfm-generate-active () - (save-excursion - (set-buffer nntp-server-buffer) - (erase-buffer) - (dolist (elem nnwfm-groups) - (insert (prin1-to-string (car elem)) - " " (number-to-string (cadr elem)) " 1 y\n")))) - -(defun nnwfm-find-forum-table (contents) - (catch 'found - (nnwfm-find-forum-table-1 contents))) - -(defun nnwfm-find-forum-table-1 (contents) - (dolist (element contents) - (unless (stringp element) - (when (and (eq (car element) 'table) - (nnwfm-forum-table-p element)) - (throw 'found element)) - (when (nth 2 element) - (nnwfm-find-forum-table-1 (nth 2 element)))))) - -(defun nnwfm-forum-table-p (parse) - (when (not (apply 'gnus-or - (mapcar - (lambda (p) - (nnweb-parse-find 'table p)) - (nth 2 parse)))) - (let ((href (cdr (assq 'href (nth 1 (nnweb-parse-find 'a parse 20))))) - case-fold-search) - (when (and href (string-match nnwfm-table-regexp href)) - t)))) - -(defun nnwfm-date-to-time (date) - (let ((time (mapcar #'string-to-number (split-string date "[\\.\\+ :]")))) - (encode-time 0 (nth 4 time) (nth 3 time) - (nth 0 time) (nth 1 time) - (if (< (nth 2 time) 70) - (+ 2000 (nth 2 time)) - (+ 1900 (nth 2 time)))))) - -(provide 'nnwfm) - -;; Local Variables: -;; coding: iso-8859-1 -;; End: - -;;; nnwfm.el ends here diff --git a/lisp/parse-time.el b/lisp/parse-time.el deleted file mode 100644 index d003251..0000000 --- a/lisp/parse-time.el +++ /dev/null @@ -1,214 +0,0 @@ -;;; parse-time.el --- Parsing time strings - -;; Copyright (C) 1996, 2000 by Free Software Foundation, Inc. - -;; Author: Erik Naggum -;; Keywords: util - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;; With the introduction of the `encode-time', `decode-time', and -;; `format-time-string' functions, dealing with time became simpler in -;; Emacs. However, parsing time strings is still largely a matter of -;; heuristics and no common interface has been designed. - -;; `parse-time-string' parses a time in a string and returns a list of 9 -;; values, just like `decode-time', where unspecified elements in the -;; string are returned as nil. `encode-time' may be applied on these -;; valuse to obtain an internal time value. - -;;; Code: - -(eval-when-compile (require 'cl)) ;and ah ain't kiddin' 'bout it - -(defvar parse-time-syntax (make-vector 256 nil)) -(defvar parse-time-digits (make-vector 256 nil)) - -;; Byte-compiler warnings -(defvar elt) -(defvar val) - -(unless (aref parse-time-digits ?0) - (loop for i from ?0 to ?9 - do (aset parse-time-digits i (- i ?0)))) - -(unless (aref parse-time-syntax ?0) - (loop for i from ?0 to ?9 - do (aset parse-time-syntax i ?0)) - (loop for i from ?A to ?Z - do (aset parse-time-syntax i ?A)) - (loop for i from ?a to ?z - do (aset parse-time-syntax i ?a)) - (aset parse-time-syntax ?+ 1) - (aset parse-time-syntax ?- -1) - (aset parse-time-syntax ?: ?d) - ) - -(defsubst digit-char-p (char) - (aref parse-time-digits char)) - -(defsubst parse-time-string-chars (char) - (aref parse-time-syntax char)) - -(put 'parse-error 'error-conditions '(parse-error error)) -(put 'parse-error 'error-message "Parsing error") - -(defsubst parse-integer (string &optional start end) - "[CL] Parse and return the integer in STRING, or nil if none." - (let ((integer 0) - (digit 0) - (index (or start 0)) - (end (or end (length string)))) - (when (< index end) - (let ((sign (aref string index))) - (if (or (eq sign ?+) (eq sign ?-)) - (setq sign (parse-time-string-chars sign) - index (1+ index)) - (setq sign 1)) - (while (and (< index end) - (setq digit (digit-char-p (aref string index)))) - (setq integer (+ (* integer 10) digit) - index (1+ index))) - (if (/= index end) - (signal 'parse-error `("not an integer" - ,(substring string (or start 0) end))) - (* sign integer)))))) - -(defun parse-time-tokenize (string) - "Tokenize STRING into substrings." - (let ((start nil) - (end (length string)) - (all-digits nil) - (list ()) - (index 0) - (c nil)) - (while (< index end) - (while (and (< index end) ;skip invalid characters - (not (setq c (parse-time-string-chars (aref string index))))) - (incf index)) - (setq start index all-digits (eq c ?0)) - (while (and (< (incf index) end) ;scan valid characters - (setq c (parse-time-string-chars (aref string index)))) - (setq all-digits (and all-digits (eq c ?0)))) - (if (<= index end) - (push (if all-digits (parse-integer string start index) - (substring string start index)) - list))) - (nreverse list))) - -(defvar parse-time-months '(("jan" . 1) ("feb" . 2) ("mar" . 3) - ("apr" . 4) ("may" . 5) ("jun" . 6) - ("jul" . 7) ("aug" . 8) ("sep" . 9) - ("oct" . 10) ("nov" . 11) ("dec" . 12))) -(defvar parse-time-weekdays '(("sun" . 0) ("mon" . 1) ("tue" . 2) - ("wed" . 3) ("thu" . 4) ("fri" . 5) ("sat" . 6))) -(defvar parse-time-zoneinfo `(("z" 0) ("ut" 0) ("gmt" 0) - ("pst" ,(* -8 3600)) ("pdt" ,(* -7 3600) t) - ("mst" ,(* -7 3600)) ("mdt" ,(* -6 3600) t) - ("cst" ,(* -6 3600)) ("cdt" ,(* -5 3600) t) - ("est" ,(* -5 3600)) ("edt" ,(* -4 3600) t)) - "(zoneinfo seconds-off daylight-savings-time-p)") - -(defvar parse-time-rules - `(((6) parse-time-weekdays) - ((3) (1 31)) - ((4) parse-time-months) - ((5) (100 4038)) - ((2 1 0) - ,#'(lambda () (and (stringp elt) - (= (length elt) 8) - (= (aref elt 2) ?:) - (= (aref elt 5) ?:))) - [0 2] [3 5] [6 8]) - ((8 7) parse-time-zoneinfo - ,#'(lambda () (car val)) - ,#'(lambda () (cadr val))) - ((8) - ,#'(lambda () - (and (stringp elt) - (= 5 (length elt)) - (or (= (aref elt 0) ?+) (= (aref elt 0) ?-)))) - ,#'(lambda () (* 60 (+ (parse-integer elt 3 5) - (* 60 (parse-integer elt 1 3))) - (if (= (aref elt 0) ?-) -1 1)))) - ((5 4 3) - ,#'(lambda () (and (stringp elt) - (= (length elt) 10) - (= (aref elt 4) ?-) - (= (aref elt 7) ?-))) - [0 4] [5 7] [8 10]) - ((2 1 0) - ,#'(lambda () (and (stringp elt) (= (length elt) 5) (= (aref elt 2) ?:))) - [0 2] [3 5] ,#'(lambda () 0)) - ((2 1 0) - ,#'(lambda () (and (stringp elt) - (= (length elt) 4) - (= (aref elt 1) ?:))) - [0 1] [2 4] ,#'(lambda () 0)) - ((2 1 0) - ,#'(lambda () (and (stringp elt) - (= (length elt) 7) - (= (aref elt 1) ?:))) - [0 1] [2 4] [5 7]) - ((5) (50 110) ,#'(lambda () (+ 1900 elt))) - ((5) (0 49) ,#'(lambda () (+ 2000 elt)))) - "(slots predicate extractor...)") - -(defun parse-time-string (string) - "Parse the time-string STRING into (SEC MIN HOUR DAY MON YEAR DOW DST TZ). -The values are identical to those of `decode-time', but any values that are -unknown are returned as nil." - (let ((time (list nil nil nil nil nil nil nil nil nil)) - (temp (parse-time-tokenize (downcase string)))) - (while temp - (let ((elt (pop temp)) - (rules parse-time-rules) - (exit nil)) - (while (and (not (null rules)) (not exit)) - (let* ((rule (pop rules)) - (slots (pop rule)) - (predicate (pop rule)) - (val)) - (when (and (not (nth (car slots) time)) ;not already set - (setq val (cond ((and (consp predicate) - (not (eq (car predicate) - 'lambda))) - (and (numberp elt) - (<= (car predicate) elt) - (<= elt (cadr predicate)) - elt)) - ((symbolp predicate) - (cdr (assoc elt - (symbol-value predicate)))) - ((funcall predicate))))) - (setq exit t) - (while slots - (let ((new-val (and rule - (let ((this (pop rule))) - (if (vectorp this) - (parse-integer - elt (aref this 0) (aref this 1)) - (funcall this)))))) - (rplaca (nthcdr (pop slots) time) (or new-val val))))))))) - time)) - -(provide 'parse-time) - -;;; parse-time.el ends here diff --git a/lisp/pop3.el b/lisp/pop3.el deleted file mode 100644 index 86f045b..0000000 --- a/lisp/pop3.el +++ /dev/null @@ -1,800 +0,0 @@ -;;; pop3.el --- Post Office Protocol (RFC 1460) interface - -;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 -;; Free Software Foundation, Inc. - -;; Author: Richard L. Pieri -;; Daiki Ueno -;; Maintainer: FSF -;; Keywords: mail - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;; Most of the standard Post Office Protocol version 3 (RFC 1460) commands -;; are implemented. The LIST command has not been implemented due to lack -;; of actual usefulness. -;; The optional POP3 command TOP has not been implemented. - -;; This program was inspired by Kyle E. Jones's vm-pop program. - -;;; Code: - -(eval-when-compile (require 'cl)) -(eval-when-compile (require 'static)) - -(require 'mail-utils) - -(defvar pop3-maildrop (or (user-login-name) (getenv "LOGNAME") (getenv "USER") nil) - "*POP3 maildrop.") -(defvar pop3-mailhost (or (getenv "MAILHOST") nil) - "*POP3 mailhost.") -(defvar pop3-port 110 - "*POP3 port.") -(defvar pop3-connection-type nil - "*POP3 connection type.") - -(defvar pop3-password-required t - "*Non-nil if a password is required when connecting to POP server.") -(defvar pop3-password nil - "*Password to use when connecting to POP server.") - -(defvar pop3-authentication-scheme 'pass - "*POP3 authentication scheme. -Defaults to 'pass, for the standard USER/PASS authentication. Other valid -values are 'apop.") - -(defvar pop3-timestamp nil - "Timestamp returned when initially connected to the POP server. -Used for APOP authentication.") - -(defvar pop3-leave-mail-on-server nil - "Non-nil if mail is to be left on the server and UIDL used for message retrieval.") - -(defvar pop3-maximum-message-size nil - "If non-nil only download messages smaller than this.") - -(defvar pop3-except-header-regexp nil - "If non-nil we do not retrieve messages whose headers are matching this regexp.") - -(defvar pop3-uidl-file-name "~/.uidls" - "File in which to store the UIDL of processed messages.") - -(defvar pop3-uidl-support 'dont-know - "Whether the server supports UIDL. -Nil means no, t means yes, not-nil-or-t means yet to be determined.") - -(defvar pop3-uidl-obarray (make-vector 31 0) - "Uidl hash table.") - -(defvar pop3-read-point nil) -(defvar pop3-debug nil) - -(eval-and-compile - (autoload 'open-ssl-stream "ssl") - (autoload 'starttls-open-stream "starttls") - (autoload 'starttls-negotiate "starttls")) - -(defvar pop3-ssl-program-name - (if (exec-installed-p "openssl") - "openssl" - "ssleay") - "The program to run in a subprocess to open an SSL connection.") - -(defvar pop3-ssl-program-arguments - '("s_client" "-quiet") - "Arguments to be passed to the program `pop3-ssl-program-name'.") - -(defun pop3-progress-message (format percent &rest args) - (apply (function message) format args)) - -(defun pop3-movemail (&optional crashbox) - "Transfer contents of a maildrop to the specified CRASHBOX." - (or crashbox (setq crashbox (expand-file-name "~/.crashbox"))) - (let* ((process (pop3-open-server pop3-mailhost pop3-port)) - (crashbuf (get-buffer-create " *pop3-retr*")) - (n 1) - message-count - (pop3-password pop3-password) - (pop3-uidl-file-name (convert-standard-filename - (concat pop3-uidl-file-name "-" - pop3-mailhost))) - retrieved-messages messages) - ;; for debugging only - (if pop3-debug (switch-to-buffer (process-buffer process))) - ;; query for password - (if (and pop3-password-required (not pop3-password)) - (setq pop3-password - (pop3-read-passwd (format "Password for %s: " pop3-maildrop)))) - (cond ((equal 'apop pop3-authentication-scheme) - (pop3-apop process pop3-maildrop)) - ((equal 'pass pop3-authentication-scheme) - (pop3-user process pop3-maildrop) - (pop3-pass process)) - (t (error "Invalid POP3 authentication scheme"))) - ;; get messages that are suitable for download - (message "Retrieving message list...") - (setq messages (pop3-get-message-numbers process) - message-count (length (cdr messages))) - (message "Retrieving message list...%d of %d unread" - message-count (pop messages)) - (unwind-protect - (unless (not (stringp crashbox)) - (while messages - (pop3-progress-message - "Retrieving message %d of %d (%d octets) from %s..." - (floor (* (/ (float n) message-count) 100)) - n message-count (cdar messages) pop3-mailhost) - (pop3-retr process (caar messages) crashbuf) - (push (caar messages) retrieved-messages) - (setq messages (cdr messages) - n (1+ n))) - (with-current-buffer crashbuf - (write-region-as-binary (point-min) (point-max) - crashbox 'append 'nomesg)) - ;; mark messages as read - (when pop3-leave-mail-on-server - (pop3-save-uidls)) - ;; now delete the messages we have retrieved - (unless pop3-leave-mail-on-server - (dolist (n retrieved-messages) - (message "Deleting message %d of %d from %s..." - n message-count pop3-mailhost) - (pop3-dele process n))) - ) - (pop3-quit process)) - (kill-buffer crashbuf) - message-count)) - -(defun pop3-get-message-count () - "Return the number of messages in the maildrop." - (let* ((process (pop3-open-server pop3-mailhost pop3-port)) - message-count - (pop3-password pop3-password) - ) - ;; for debugging only - (if pop3-debug (switch-to-buffer (process-buffer process))) - ;; query for password - (if (and pop3-password-required (not pop3-password)) - (setq pop3-password - (pop3-read-passwd (format "Password for %s: " pop3-maildrop)))) - (cond ((equal 'apop pop3-authentication-scheme) - (pop3-apop process pop3-maildrop)) - ((equal 'pass pop3-authentication-scheme) - (pop3-user process pop3-maildrop) - (pop3-pass process)) - (t (error "Invalid POP3 authentication scheme"))) - (setq message-count (car (pop3-stat process))) - (pop3-quit process) - message-count)) - -(defun pop3-open-server (mailhost port) - "Open TCP connection to MAILHOST on PORT. -Returns the process associated with the connection. -Argument PORT specifies connecting port." - (let (process) - (save-excursion - (set-buffer (get-buffer-create (concat " trace of POP session to " - mailhost))) - (erase-buffer) - (setq pop3-read-point (point-min)) - (setq - process - (cond - ((eq pop3-connection-type 'ssl) - (pop3-open-ssl-stream "POP" (current-buffer) mailhost port)) - ((eq pop3-connection-type 'tls) - (pop3-open-tls-stream "POP" (current-buffer) mailhost port)) - (t - (open-network-stream-as-binary "POP" (current-buffer) - mailhost port)))) - (let ((response (pop3-read-response process t))) - (setq pop3-timestamp - (substring response (or (string-match "<" response) 0) - (+ 1 (or (string-match ">" response) -1))))) - process))) - -(defun pop3-open-ssl-stream-1 (name buffer host service extra-arg) - (require 'path-util) - (let* ((ssl-program-name - pop3-ssl-program-name) - (ssl-program-arguments - `(,@pop3-ssl-program-arguments - ,extra-arg - "-connect" ,(format "%s:%d" host service))) - (process (open-ssl-stream name buffer host service))) - (when process - (with-current-buffer buffer - (goto-char (point-min)) - (while (and (memq (process-status process) '(open run)) - (goto-char (point-max)) - (forward-line -1) - (not (looking-at "+OK"))) - (accept-process-output process 1) - (sit-for 1)) - (delete-region (point-min) (point))) - (and process (memq (process-status process) '(open run)) - process)))) - -(defun pop3-open-ssl-stream (name buffer host service) - "Open a SSL connection for a service to a host. -Returns a subprocess-object to represent the connection. -Args are NAME BUFFER HOST SERVICE." - (cond ((eq system-type 'windows-nt) - (let (selective-display - (coding-system-for-write 'binary) - (coding-system-for-read 'raw-text-dos)) - (or (pop3-open-ssl-stream-1 name buffer host service "-ssl3") - (pop3-open-ssl-stream-1 name buffer host service "-ssl2")))) - (t - (as-binary-process - (or (pop3-open-ssl-stream-1 name buffer host service "-ssl3") - (pop3-open-ssl-stream-1 name buffer host service "-ssl2")))))) - -(defun pop3-open-tls-stream (name buffer host service) - "Open a TLSv1 connection for a service to a host. -Returns a subprocess-object to represent the connection. -Args are NAME BUFFER HOST SERVICE." - (let ((process - (as-binary-process (starttls-open-stream - name buffer host service)))) - (pop3-stls process) - (starttls-negotiate process) - process)) - -;; Support functions - -(defun pop3-process-filter (process output) - (save-excursion - (set-buffer (process-buffer process)) - (goto-char (point-max)) - (insert output))) - -(defun pop3-send-command (process command) - (set-buffer (process-buffer process)) - (goto-char (point-max)) -;; (if (= (aref command 0) ?P) -;; (insert "PASS \r\n") -;; (insert command "\r\n")) - (setq pop3-read-point (point)) - (goto-char (point-max)) - (process-send-string process (concat command "\r\n")) - ) - -(defun pop3-read-response (process &optional return) - "Read the response from the server PROCESS. -Return the response string if optional second argument RETURN is non-nil." - (let ((case-fold-search nil) - match-end) - (save-excursion - (set-buffer (process-buffer process)) - (goto-char pop3-read-point) - (while (not (search-forward "\r\n" nil t)) - (accept-process-output process 3) - (goto-char pop3-read-point)) - (setq match-end (point)) - (goto-char pop3-read-point) - (if (looking-at "-ERR") - (error (buffer-substring (point) (- match-end 2))) - (if (not (looking-at "+OK")) - (progn (setq pop3-read-point match-end) nil) - (setq pop3-read-point match-end) - (if return - (buffer-substring (point) match-end) - t) - ))))) - -(defvar pop3-read-passwd nil) -(defun pop3-read-passwd (prompt) - (if (not pop3-read-passwd) - (if (fboundp 'read-passwd) - (setq pop3-read-passwd 'read-passwd) - (if (load "passwd" t) - (setq pop3-read-passwd 'read-passwd) - (autoload 'ange-ftp-read-passwd "ange-ftp") - (setq pop3-read-passwd 'ange-ftp-read-passwd)))) - (funcall pop3-read-passwd prompt)) - -(defun pop3-clean-region (start end) - (setq end (set-marker (make-marker) end)) - (save-excursion - (goto-char start) - (while (and (< (point) end) (search-forward "\r\n" end t)) - (replace-match "\n" t t)) - (goto-char start) - (while (re-search-forward "\n\n\\(From \\)" end t) - (replace-match "\n\n>\\1" t nil)) - (goto-char start) - (while (and (< (point) end) (re-search-forward "^\\." end t)) - (replace-match "" t t) - (forward-char))) - (set-marker end nil)) - -(eval-when-compile (defvar parse-time-months)) - -;; Copied from message-make-date. -(defun pop3-make-date (&optional now) - "Make a valid date header. -If NOW, use that time instead." - (require 'parse-time) - (let* ((now (or now (current-time))) - (zone (nth 8 (decode-time now))) - (sign "+")) - (when (< zone 0) - (setq sign "-") - (setq zone (- zone))) - (concat - (format-time-string "%d" now) - ;; The month name of the %b spec is locale-specific. Pfff. - (format " %s " - (capitalize (car (rassoc (nth 4 (decode-time now)) - parse-time-months)))) - (format-time-string "%Y %H:%M:%S " now) - ;; We do all of this because XEmacs doesn't have the %z spec. - (format "%s%02d%02d" sign (/ zone 3600) (/ (% zone 3600) 60))))) - -(defun pop3-munge-message-separator (start end) - "Check to see if a message separator exists. If not, generate one." - (save-excursion - (save-restriction - (narrow-to-region start end) - (goto-char (point-min)) - (if (not (or (looking-at "From .?") ; Unix mail - (looking-at "\001\001\001\001\n") ; MMDF - (looking-at "BABYL OPTIONS:") ; Babyl - )) - (let ((from (mail-strip-quoted-names (mail-fetch-field "From"))) - (date (split-string (or (mail-fetch-field "Date") - (pop3-make-date)) - " ")) - (From_)) - ;; sample date formats I have seen - ;; Date: Tue, 9 Jul 1996 09:04:21 -0400 (EDT) - ;; Date: 08 Jul 1996 23:22:24 -0400 - ;; should be - ;; Tue Jul 9 09:04:21 1996 - (setq date - (cond ((string-match "[A-Z]" (nth 0 date)) - (format "%s %s %s %s %s" - (nth 0 date) (nth 2 date) (nth 1 date) - (nth 4 date) (nth 3 date))) - (t - ;; this really needs to be better but I don't feel - ;; like writing a date to day converter. - (format "Sun %s %s %s %s" - (nth 1 date) (nth 0 date) - (nth 3 date) (nth 2 date))) - )) - (setq From_ (format "\nFrom %s %s\n" from date)) - (while (string-match "," From_) - (setq From_ (concat (substring From_ 0 (match-beginning 0)) - (substring From_ (match-end 0))))) - (goto-char (point-min)) - (insert From_) - (if (search-forward "\n\n" nil t) - nil - (goto-char (point-max)) - (insert "\n")) - (narrow-to-region (point) (point-max)) - (let ((size (- (point-max) (point-min)))) - (goto-char (point-min)) - (widen) - (forward-line -1) - (insert (format "Content-Length: %s\n" size))) - ))))) - -;; UIDL support - -(defun pop3-get-message-numbers (process) - "Get the list of message numbers and lengths to retrieve via PROCESS." - ;; we use the LIST comand first anyway to get the message lengths. - ;; then if we're leaving mail on the server, see if the UIDL command - ;; is implemented. if so, we use it to get the message number list. - (let* ((messages (pop3-list process)) - (total (or (pop messages) 0)) - (uidl (if pop3-leave-mail-on-server - (pop3-get-uidl process))) - out) - (while messages - ;; only retrieve messages matching our regexp or in the uidl list - (when (and - ;; remove elements not in the uidl, this assumes the uidl is short - (or (not (eq pop3-uidl-support t)) - (memq (caar messages) uidl)) - (caar messages) - ;; don't download messages that are too large - (not (and pop3-maximum-message-size - (> (cdar messages) pop3-maximum-message-size))) - (not (and pop3-except-header-regexp - (string-match pop3-except-header-regexp - (pop3-top process (caar messages) 0))))) - (push (car messages) out)) - (setq messages (cdr messages))) - (cons total (reverse out)))) - -(defun pop3-get-uidl (process) - "Use PROCESS to get a list of unread message numbers." - (let ((messages (pop3-uidl process)) uidl) - (if (or (null messages) (null pop3-uidl-support)) - (setq pop3-uidl-support nil) - (setq pop3-uidl-support t) - (save-excursion - (with-temp-buffer - (when (file-readable-p pop3-uidl-file-name) - (insert-file-contents pop3-uidl-file-name)) - (goto-char (point-min)) - (while (looking-at "\\([^ \n\t]+\\)") - (set (intern (match-string 1) pop3-uidl-obarray) - (cons nil t)) - (forward-line 1)) - )) - (dolist (message (cdr messages)) - (if (setq uidl (intern-soft (cdr message) pop3-uidl-obarray)) - (setcar (symbol-value uidl) (car message)) - (set (intern (cdr message) pop3-uidl-obarray) - (cons (car message) nil)))) - (pop3-get-unread-message-numbers)) - )) - -(defun pop3-get-unread-message-numbers () - "Return a sorted list of unread msg numbers to retrieve." - (let (nums) - (mapatoms (lambda (atom) - (if (not (cdr (symbol-value atom))) - (push (car (symbol-value atom)) nums))) - pop3-uidl-obarray) - (sort nums '<))) - -(defun pop3-save-uidls () - "Save the updated UIDLs to disk for use next time." - (when (and pop3-leave-mail-on-server - ;; UIDL hash table is non-empty - (let ((len (length pop3-uidl-obarray))) - (while (< 0 len) - (setq len (if (symbolp (aref pop3-uidl-obarray (1- len))) - -1 (1- len)))) - (minusp len))) - (when (file-readable-p pop3-uidl-file-name) - (copy-file pop3-uidl-file-name - (concat pop3-uidl-file-name ".old") - 'overwrite 'keeptime)) - (save-excursion - (with-temp-file pop3-uidl-file-name - (mapatoms - (lambda (atom) - (when (car (symbol-value atom)) - (insert (format "%s\n" atom)))) - pop3-uidl-obarray))) - (fillarray pop3-uidl-obarray 0))) - - -;; The Command Set - -;; AUTHORIZATION STATE - -(defun pop3-user (process user) - "Send USER information to POP3 server." - (pop3-send-command process (format "USER %s" user)) - (let ((response (pop3-read-response process t))) - (if (not (and response (string-match "+OK" response))) - (error (format "USER %s not valid" user))))) - -(defun pop3-pass (process) - "Send authentication information to the server." - (pop3-send-command process (format "PASS %s" pop3-password)) - (let ((response (pop3-read-response process t))) - (if (not (and response (string-match "+OK" response))) - (pop3-quit process)))) - -(static-unless (and (fboundp 'md5) (subrp (symbol-function 'md5))) - (eval-and-compile - (require 'path-util) - (if (module-installed-p 'md5) - (progn - (autoload 'md5 "md5") - (fset 'pop3-md5 'md5)) - - (defvar pop3-md5-program "md5" - "*Program to encode its input in MD5.") - - (defun pop3-md5 (string) - (with-temp-buffer - (insert string) - (call-process-region (point-min) (point-max) - (or shell-file-name "/bin/sh") - t (current-buffer) nil - "-c" pop3-md5-program) - ;; The meaningful output is the first 32 characters. - ;; Don't return the newline that follows them! - (buffer-substring (point-min) (+ (point-min) 32)))) - ))) - -(defun pop3-apop (process user) - "Send alternate authentication information to the server." - (let ((pass pop3-password)) - (if (and pop3-password-required (not pass)) - (setq pass - (pop3-read-passwd (format "Password for %s: " pop3-maildrop)))) - (if pass - (let ((hash (static-if (and (fboundp 'md5) - (subrp (symbol-function 'md5))) - (md5 (concat pop3-timestamp pass)) - (pop3-md5 (concat pop3-timestamp pass))))) - (pop3-send-command process (format "APOP %s %s" user hash)) - (let ((response (pop3-read-response process t))) - (if (not (and response (string-match "+OK" response))) - (pop3-quit process))))) - )) - -(defun pop3-stls (process) - "Query whether TLS extension is supported" - (pop3-send-command process "STLS") - (let ((response (pop3-read-response process t))) - (if (not (and response (string-match "+OK" response))) - (pop3-quit process)))) - -;; TRANSACTION STATE - -(defun pop3-stat (process) - "Return the number of messages in the maildrop and the maildrop's size." - (pop3-send-command process "STAT") - (let ((response (pop3-read-response process t))) - (list (string-to-int (nth 1 (split-string response " "))) - (string-to-int (nth 2 (split-string response " ")))) - )) - -(defun pop3-retr (process msg crashbuf) - "Retrieve message-id MSG to buffer CRASHBUF." - (pop3-send-command process (format "RETR %s" msg)) - (pop3-read-response process) - (save-excursion - (let ((region (pop3-get-extended-response process))) - (pop3-munge-message-separator (car region) (cadr region)) - (append-to-buffer crashbuf (car region) (cadr region)) - (delete-region (car region) (cadr region)) - ))) - -(defun pop3-dele (process msg) - "Mark message-id MSG as deleted." - (pop3-send-command process (format "DELE %s" msg)) - (pop3-read-response process)) - -(defun pop3-noop (process msg) - "No-operation." - (pop3-send-command process "NOOP") - (pop3-read-response process)) - -(defun pop3-last (process) - "Return highest accessed message-id number for the session." - (pop3-send-command process "LAST") - (let ((response (pop3-read-response process t))) - (string-to-int (nth 1 (split-string response " "))) - )) - -(defun pop3-rset (process) - "Remove all delete marks from current maildrop." - (pop3-send-command process "RSET") - (pop3-read-response process)) - -;; UPDATE - -(defun pop3-quit (process) - "Close connection to POP3 server. -Tell server to remove all messages marked as deleted, unlock the maildrop, -and close the connection." - (pop3-send-command process "QUIT") - (pop3-read-response process t) - (when process - (save-excursion - (set-buffer (process-buffer process)) - (goto-char (point-max)) - (delete-process process)))) - -(defun pop3-uidl (process &optional msgno) - "Return the results of a UIDL command in PROCESS for optional MSGNO. -If UIDL is unsupported on this mail server or if msgno is invalid, return nil. -Otherwise, return a list in the form - - (N (1 UIDL-1) (2 UIDL-2) ... (N UIDL-N)) - -where - - N is an integer for the number of UIDLs returned (could be 0) - UIDL-n is a string." - - (if msgno - (pop3-send-command process (format "UIDL %d" msgno)) - (pop3-send-command process "UIDL")) - - (if (null (pop3-read-response process t)) - nil ;; UIDL is not supported on this server - (let (pairs uidl) - (save-excursion - (save-restriction - (apply 'narrow-to-region (pop3-get-extended-response process)) - (goto-char (point-min)) - (while (looking-at "\\([^ \n\t]*\\) \\([^ \n\t]*\\)") - (setq msgno (string-to-int (match-string 1)) - uidl (match-string 2)) - (push (cons msgno uidl) pairs) - (beginning-of-line 2)) - (cons (length pairs) (nreverse pairs)) - ))))) - -(defun pop3-list (process &optional msgno) - "Return the results of a LIST command for PROCESS and optional MSGNO. -If (optional) msgno is invalid, return nil. Otherwise, return a list -in the form - - (N (1 LEN-1) (2 LEN-2) ... (N LEN-N)) - -where - - N is an integer for the number of msg/len pairs (could be 0) - LEN-n is an integer." - (if msgno - (pop3-send-command process (format "LIST %d" msgno)) - (pop3-send-command process "LIST")) - - (if (null (pop3-read-response process t)) - nil ;; MSGNO is not valid number - (let (pairs len) - (save-excursion - (save-restriction - (apply 'narrow-to-region (pop3-get-extended-response process)) - (goto-char (point-min)) - (while (looking-at "\\([^ \n\t]*\\) \\([^ \n\t]*\\)") - (setq msgno (string-to-int (match-string 1)) - len (string-to-int (match-string 2))) - (push (cons msgno len) pairs) - (beginning-of-line 2)) - (cons (length pairs) (nreverse pairs)) - ))))) - -(defun pop3-top (process msgno &optional lines) - "Return the top LINES of messages for PROCESS and MSGNO. -If msgno is invalid, return nil. Otherwise, return a string." - (pop3-send-command process (format "TOP %d %d" msgno (or lines 1))) - (if (pop3-read-response process t) - nil ;; MSGNO is not valid number - (save-excursion - (apply 'buffer-substring (pop3-get-extended-response process))) - )) - -;;; Utility code - -(defun pop3-get-extended-response (process) - "Get the extended pop3 response in the PROCESS buffer." - (let ((start pop3-read-point) end) - (set-buffer (process-buffer process)) - (goto-char start) - (while (not (re-search-forward "^\\.\r\n" nil t)) - (accept-process-output process 3) - (goto-char start)) - (setq pop3-read-point (point-marker)) - (goto-char (match-beginning 0)) - (setq end (point-marker)) - (pop3-clean-region start end) - (list start end))) - - -;; Summary of POP3 (Post Office Protocol version 3) commands and responses - -;;; AUTHORIZATION STATE - -;; Initial TCP connection -;; Arguments: none -;; Restrictions: none -;; Possible responses: -;; +OK [POP3 server ready] - -;; USER name -;; Arguments: a server specific user-id (required) -;; Restrictions: authorization state [after unsuccessful USER or PASS -;; Possible responses: -;; +OK [valid user-id] -;; -ERR [invalid user-id] - -;; PASS string -;; Arguments: a server/user-id specific password (required) -;; Restrictions: authorization state, after successful USER -;; Possible responses: -;; +OK [maildrop locked and ready] -;; -ERR [invalid password] -;; -ERR [unable to lock maildrop] - -;; STLS -;; Arguments: none -;; Restrictions: authorization state -;; Possible responses: -;; +OK [negotiation is ready] -;; -ERR [security layer is already active] - -;;; TRANSACTION STATE - -;; STAT -;; Arguments: none -;; Restrictions: transaction state -;; Possible responses: -;; +OK nn mm [# of messages, size of maildrop] - -;; LIST [msg] -;; Arguments: a message-id (optional) -;; Restrictions: transaction state; msg must not be deleted -;; Possible responses: -;; +OK [scan listing follows] -;; -ERR [no such message] - -;; TOP msg [lines] -;; Arguments: a message-id (required), number of lines (optional) -;; Restrictions: transaction state; msg must not be deleted -;; Possible responses: -;; +OK [partial message listing follows] -;; -ERR [no such message] - -;; UIDL [msg] -;; Arguments: a message-id (optional) -;; Restrictions: transaction state; msg must not be deleted -;; Possible responses: -;; +OK [uidl listing follows] -;; -ERR [no such message] - -;; RETR msg -;; Arguments: a message-id (required) -;; Restrictions: transaction state; msg must not be deleted -;; Possible responses: -;; +OK [message contents follow] -;; -ERR [no such message] - -;; DELE msg -;; Arguments: a message-id (required) -;; Restrictions: transaction state; msg must not be deleted -;; Possible responses: -;; +OK [message deleted] -;; -ERR [no such message] - -;; NOOP -;; Arguments: none -;; Restrictions: transaction state -;; Possible responses: -;; +OK - -;; LAST -;; Arguments: none -;; Restrictions: transaction state -;; Possible responses: -;; +OK nn [highest numbered message accessed] - -;; RSET -;; Arguments: none -;; Restrictions: transaction state -;; Possible responses: -;; +OK [all delete marks removed] - -;;; UPDATE STATE - -;; QUIT -;; Arguments: none -;; Restrictions: none -;; Possible responses: -;; +OK [TCP connection closed] - -(provide 'pop3) - -;;; pop3.el ends here diff --git a/lisp/qp.el b/lisp/qp.el deleted file mode 100644 index 75d6779..0000000 --- a/lisp/qp.el +++ /dev/null @@ -1,161 +0,0 @@ -;;; qp.el --- Quoted-Printable functions - -;; Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Keywords: mail, extensions - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;; Functions for encoding and decoding quoted-printable text as -;; defined in RFC 2045. - -;;; Code: - -(require 'mm-util) -(eval-when-compile (defvar mm-use-ultra-safe-encoding)) - -(defun quoted-printable-decode-region (from to &optional coding-system) - "Decode quoted-printable in the region between FROM and TO, per RFC 2045. -If CODING-SYSTEM is non-nil, decode bytes into characters with that -coding-system." - (interactive - ;; Let the user determine the coding system with "C-x RET c". - (list (region-beginning) (region-end) coding-system-for-read)) - (unless (mm-coding-system-p coding-system) ; e.g. `ascii' from Gnus - (setq coding-system nil)) - (save-excursion - (save-restriction - ;; RFC 2045: ``An "=" followed by two hexadecimal digits, one - ;; or both of which are lowercase letters in "abcdef", is - ;; formally illegal. A robust implementation might choose to - ;; recognize them as the corresponding uppercase letters.'' - (let ((case-fold-search t)) - (narrow-to-region from to) - ;; Do this in case we're called from Gnus, say, in a buffer - ;; which already contains non-ASCII characters which would - ;; then get doubly-decoded below. - (if coding-system - (mm-encode-coding-region (point-min) (point-max) coding-system)) - (goto-char (point-min)) - (while (and (skip-chars-forward "^=") - (not (eobp))) - (cond ((eq (char-after (1+ (point))) ?\n) - (delete-char 2)) - ((looking-at "=[0-9A-F][0-9A-F]") - (let ((byte (string-to-int (buffer-substring (1+ (point)) - (+ 3 (point))) - 16))) - (insert byte) - (delete-char 3) - ;; Why backward-char??? - ;;(unless (eq byte 61) ;; 61 is not ?= in XEmacs - ;; (backward-char)) - )) - (t - (message "Malformed quoted-printable text") - (forward-char))))) - (if coding-system - (mm-decode-coding-region (point-min) (point-max) coding-system))))) - -(defun quoted-printable-decode-string (string &optional coding-system) - "Decode the quoted-printable encoded STRING and return the result. -If CODING-SYSTEM is non-nil, decode the region with coding-system." - (with-temp-buffer - (insert string) - (quoted-printable-decode-region (point-min) (point-max) coding-system) - (buffer-string))) - -(defun quoted-printable-encode-region (from to &optional fold class) - "Quoted-printable encode the region between FROM and TO per RFC 2045. - -If FOLD, fold long lines at 76 characters (as required by the RFC). -If CLASS is non-nil, translate the characters not matched by that -regexp class, which is in the form expected by `skip-chars-forward'. -You should probably avoid non-ASCII characters in this arg. - -If `mm-use-ultra-safe-encoding' is set, fold lines unconditionally and -encode lines starting with \"From\"." - (interactive "r") - (unless class - ;; Avoid using 8bit characters. = is \075. - ;; Equivalent to "^\000-\007\013\015-\037\200-\377=" - (setq class "\010-\012\014\040-\074\076-\177")) - (save-excursion - (save-restriction - (narrow-to-region from to) - ;; We can live with characters between 00-FF. - (goto-char (point-min)) - (while (not (eobp)) - (if (>= (char-after) 256) - (error "Multibyte character in QP encoding region")) - (forward-char)) - ;; Encode all the non-ascii and control characters. - (goto-char (point-min)) - (while (and (skip-chars-forward class) - (not (eobp))) - (insert - (prog1 - (format "=%02X" (char-after)) - (delete-char 1)))) - ;; Encode white space at the end of lines. - (goto-char (point-min)) - (while (re-search-forward "[ \t]+$" nil t) - (goto-char (match-beginning 0)) - (while (not (eolp)) - (insert - (prog1 - (format "=%02X" (char-after)) - (delete-char 1))))) - (let ((mm-use-ultra-safe-encoding - (and (boundp 'mm-use-ultra-safe-encoding) - mm-use-ultra-safe-encoding))) - (when (or fold mm-use-ultra-safe-encoding) - (let ((tab-width 1)) ; HTAB is one character. - (goto-char (point-min)) - (while (not (eobp)) - ;; In ultra-safe mode, encode "From " at the beginning - ;; of a line. - (when mm-use-ultra-safe-encoding - (if (looking-at "From ") - (replace-match "From=20" nil t) - (if (looking-at "-") - (replace-match "=2D" nil t)))) - (end-of-line) - ;; Fold long lines. - (while (> (current-column) 76) ; tab-width must be 1. - (beginning-of-line) - (forward-char 75) ; 75 chars plus an "=" - (search-backward "=" (- (point) 2) t) - (insert "=\n") - (end-of-line)) - (forward-line)))))))) - -(defun quoted-printable-encode-string (string) - "Encode the STRING as quoted-printable and return the result." - (let ((default-enable-multibyte-characters (mm-multibyte-string-p string))) - (with-temp-buffer - (insert string) - (quoted-printable-encode-region (point-min) (point-max)) - (buffer-string)))) - -(provide 'qp) - -;;; qp.el ends here diff --git a/lisp/read-passwd.el b/lisp/read-passwd.el deleted file mode 100644 index 4542604..0000000 --- a/lisp/read-passwd.el +++ /dev/null @@ -1,113 +0,0 @@ -;; read-passwd.el.el --- Read password function for Pterodactyl Gnus. -;; Copyright (C) 1996,97,98 Free Software Foundation, Inc. , Tatsuya Ichikawa -;; Author: Tatsuya Ichikawa -;; Version: 0.01 -;; Keywords: mail , gnus , pop3 , password -;; -;; SPECIAL THANKS -;; Katsumi Yamaoka -;; -;; This file is part of Semi-gnus. - -;; GNU Emacs 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. - -;; GNU Emacs 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. -;; -;; -(require 'mail-source) -(provide 'read-passwd) - -(defun read-pw-read-passwd (prompt) - (read-pw-read-noecho prompt t)) -;; -(defmacro read-pw-read-char-exclusive () - (cond ((featurep 'xemacs) - '(let ((table (quote ((backspace . ?\C-h) (delete . ?\C-?) - (left . ?\C-h)))) - event key) - (while (not - (and - (key-press-event-p (setq event (next-command-event))) - (setq key (or (event-to-character event) - (cdr (assq (event-key event) table))))))) - key)) - ((fboundp 'read-char-exclusive) - '(read-char-exclusive)) - (t - '(read-char)))) -;; -(defun read-pw-read-noecho (prompt &optional stars) - "Read a single line of text from user without echoing, and return it. -Argument PROMPT ." - (let ((ans "") - (c 0) - (echo-keystrokes 0) - (cursor-in-echo-area t) - (log-message-max-size 0) - message-log-max done msg truncate) - (while (not done) - (if (or (not stars) (string-equal "" ans)) - (setq msg prompt) - (setq msg (concat prompt (make-string (length ans) ?*))) - (setq truncate - (1+ (- (length msg) (window-width (minibuffer-window))))) - (and (> truncate 0) - (setq msg (concat "$" (substring msg (1+ truncate)))))) - (message "%s" msg) - (setq c (read-pw-read-char-exclusive)) - (cond ((eq ?\C-g c) - (setq quit-flag t - done t)) - ((memq c '(?\r ?\n ?\e)) - (setq done t)) - ((eq ?\C-u c) - (setq ans "")) - ((and (/= ?\b c) (/= ?\177 c)) - (setq ans (concat ans (char-to-string c)))) - ((> (length ans) 0) - (setq ans (substring ans 0 -1))))) - (if quit-flag - (prog1 - (setq quit-flag nil) - (message "Quit") - (beep t)) - (message "") - ans))) -;; -(defvar pw nil) -(defun read-pw-set-mail-source-passwd-cache () - (if (not mail-source-password-cache) - (car (mapcar - (lambda (x) - (when (eq 'pop (car x)) - (mail-source-bind (pop x) - (let ((from (format "%s:%s:%s" server user port)) - (mail-source-string - (format "pop:%s@%s" user server))) - (setq pw (read-pw-return-passwd-string user server)) - (unless (assoc user mail-source-password-cache) - (set-alist 'mail-source-password-cache - (format "%s:%s:%s" server user port) - pw)) - (cdr (assoc from mail-source-password-cache)))))) - mail-sources)))) -;; -;; -(defvar passwd nil) -(defun read-pw-return-passwd-string (user server) - (setq passwd (read-pw-read-passwd - (message "POP Password for %s at %s : " user server))) - passwd) -;; -;; read-passwd.el ends here. diff --git a/lisp/rfc1843.el b/lisp/rfc1843.el deleted file mode 100644 index ca0c3ea..0000000 --- a/lisp/rfc1843.el +++ /dev/null @@ -1,185 +0,0 @@ -;;; rfc1843.el --- HZ (rfc1843) decoding -;; Copyright (c) 1998, 1999, 2000 Free Software Foundation, Inc. - -;; Author: Shenghuo Zhu -;; Keywords: news HZ HZ+ mail i18n - -;; This file is a part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;; Usage: -;; (require 'rfc1843) -;; (rfc1843-gnus-setup) -;; -;; Test: -;; (rfc1843-decode-string "~{<:Ky2;S{#,NpJ)l6HK!#~}") - -;;; Code: - -(eval-when-compile (require 'cl)) -(require 'mm-util) - -(defvar rfc1843-word-regexp - "~\\({\\([\041-\167][\041-\176]\\| \\)+\\)\\(~}\\|$\\)") - -(defvar rfc1843-word-regexp-strictly - "~\\({\\([\041-\167][\041-\176]\\)+\\)\\(~}\\|$\\)") - -(defvar rfc1843-hzp-word-regexp - "~\\({\\([\041-\167][\041-\176]\\| \\)+\\|\ -[<>]\\([\041-\175][\041-\176]\\| \\)+\\)\\(~}\\|$\\)") - -(defvar rfc1843-hzp-word-regexp-strictly - "~\\({\\([\041-\167][\041-\176]\\)+\\|\ -[<>]\\([\041-\175][\041-\176]\\)+\\)\\(~}\\|$\\)") - -(defcustom rfc1843-decode-loosely nil - "Loosely check HZ encoding if non-nil. -When it is set non-nil, only buffers or strings with strictly -HZ-encoded are decoded." - :type 'boolean - :group 'gnus) - -(defcustom rfc1843-decode-hzp t - "HZ+ decoding support if non-nil. -HZ+ specification (also known as HZP) is to provide a standardized -7-bit representation of mixed Big5, GB, and ASCII text for convenient -e-mail transmission, news posting, etc. -The document of HZ+ 0.78 specification can be found at -ftp://ftp.math.psu.edu/pub/simpson/chinese/hzp/hzp.doc" - :type 'boolean - :group 'gnus) - -(defcustom rfc1843-newsgroups-regexp "chinese\\|hz" - "Regexp of newsgroups in which might be HZ encoded." - :type 'string - :group 'gnus) - -(defun rfc1843-decode-region (from to) - "Decode HZ in the region between FROM and TO." - (interactive "r") - (let (str firstc) - (save-excursion - (goto-char from) - (if (or rfc1843-decode-loosely - (re-search-forward (if rfc1843-decode-hzp - rfc1843-hzp-word-regexp-strictly - rfc1843-word-regexp-strictly) to t)) - (save-restriction - (narrow-to-region from to) - (goto-char (point-min)) - (while (re-search-forward (if rfc1843-decode-hzp - rfc1843-hzp-word-regexp - rfc1843-word-regexp) (point-max) t) - ;;; Text with extents may cause XEmacs crash - (setq str (buffer-substring-no-properties - (match-beginning 1) - (match-end 1))) - (setq firstc (aref str 0)) - (insert (mm-decode-coding-string - (rfc1843-decode - (prog1 - (substring str 1) - (delete-region (match-beginning 0) (match-end 0))) - firstc) - (if (eq firstc ?{) 'cn-gb-2312 'cn-big5)))) - (goto-char (point-min)) - (while (search-forward "~" (point-max) t) - (cond ((eq (char-after) ?\n) - (delete-char -1) - (delete-char 1)) - ((eq (char-after) ?~) - (delete-char 1))))))))) - -(defun rfc1843-decode-string (string) - "Decode HZ STRING and return the results." - (let ((m (mm-multibyte-p))) - (with-temp-buffer - (when m - (mm-enable-multibyte)) - (insert string) - (inline - (rfc1843-decode-region (point-min) (point-max))) - (buffer-string)))) - -(defun rfc1843-decode (word &optional firstc) - "Decode HZ WORD and return it." - (let ((i -1) (s (substring word 0)) v) - (if (or (not firstc) (eq firstc ?{)) - (while (< (incf i) (length s)) - (if (eq (setq v (aref s i)) ? ) nil - (aset s i (+ 128 v)))) - (while (< (incf i) (length s)) - (if (eq (setq v (aref s i)) ? ) nil - (setq v (+ (* 94 v) (aref s (1+ i)) -3135)) - (aset s i (+ (/ v 157) (if (eq firstc ?<) 201 161))) - (setq v (% v 157)) - (aset s (incf i) (+ v (if (< v 63) 64 98)))))) - s)) - -(defun rfc1843-decode-article-body () - "Decode HZ encoded text in the article body." - (if (string-match (concat "\\<\\(" rfc1843-newsgroups-regexp "\\)\\>") - (or gnus-newsgroup-name "")) - (save-excursion - (save-restriction - (message-narrow-to-head) - (let* ((inhibit-point-motion-hooks t) - (case-fold-search t) - (ct (message-fetch-field "Content-Type" t)) - (ctl (and ct (ignore-errors - (mail-header-parse-content-type ct))))) - (if (and ctl (not (string-match "/" (car ctl)))) - (setq ctl nil)) - (goto-char (point-max)) - (widen) - (forward-line 1) - (narrow-to-region (point) (point-max)) - (when (or (not ctl) - (equal (car ctl) "text/plain")) - (rfc1843-decode-region (point) (point-max)))))))) - -(defvar rfc1843-old-gnus-decode-header-function nil) -(defvar gnus-decode-header-methods) -(defvar gnus-decode-encoded-word-methods) -(defvar gnus-decode-encoded-word-function) - -(defun rfc1843-gnus-setup () - "Setup HZ decoding for Gnus." - (require 'gnus-art) - (require 'gnus-sum) - (add-hook 'gnus-article-decode-hook 'rfc1843-decode-article-body t) - (setq gnus-decode-encoded-word-function - 'gnus-multi-decode-encoded-word-string - gnus-decode-header-function - 'gnus-multi-decode-header - gnus-decode-encoded-word-methods - (nconc gnus-decode-encoded-word-methods - (list - (cons (concat "\\<\\(" rfc1843-newsgroups-regexp "\\)\\>") - 'rfc1843-decode-string))) - gnus-decode-header-methods - (nconc gnus-decode-header-methods - (list - (cons (concat "\\<\\(" rfc1843-newsgroups-regexp "\\)\\>") - 'rfc1843-decode-region))))) - -(provide 'rfc1843) - -;;; rfc1843.el ends here diff --git a/lisp/rfc2045.el b/lisp/rfc2045.el deleted file mode 100644 index ba3116b..0000000 --- a/lisp/rfc2045.el +++ /dev/null @@ -1,43 +0,0 @@ -;;; rfc2045.el --- Functions for decoding rfc2045 headers - -;; Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;; RFC 2045 is: "Multipurpose Internet Mail Extensions (MIME) Part -;; One: Format of Internet Message Bodies". - -;;; Commentary: - -;;; Code: - -(require 'ietf-drums) - -(defun rfc2045-encode-string (param value) - "Return and PARAM=VALUE string encoded according to RFC2045." - (if (or (string-match (concat "[" ietf-drums-no-ws-ctl-token "]") value) - (string-match (concat "[" ietf-drums-tspecials "]") value) - (string-match "[ \n\t]" value) - (not (string-match (concat "[" ietf-drums-text-token "]") value))) - (concat param "=" (format "%S" value)) - (concat param "=" value))) - -(provide 'rfc2045) - -;;; rfc2045.el ends here diff --git a/lisp/rfc2047.el b/lisp/rfc2047.el deleted file mode 100644 index 71ac476..0000000 --- a/lisp/rfc2047.el +++ /dev/null @@ -1,562 +0,0 @@ -;;; rfc2047.el --- Functions for encoding and decoding rfc2047 messages -;; Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; MORIOKA Tomohiko -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;; RFC 2047 is "MIME (Multipurpose Internet Mail Extensions) Part -;; Three: Message Header Extensions for Non-ASCII Text". - -;;; Code: - -(eval-when-compile (require 'cl)) - -(require 'qp) -(require 'mm-util) -(require 'ietf-drums) -(require 'mail-prsvr) -(require 'base64) -;; Fixme: Avoid this (for gnus-point-at-...) mm dependence on gnus. -(require 'gnus-util) -(autoload 'mm-body-7-or-8 "mm-bodies") - -(defvar rfc2047-header-encoding-alist - '(("Newsgroups" . nil) - ("Message-ID" . nil) - ("\\(Resent-\\)?\\(From\\|Cc\\|To\\|Bcc\\|Reply-To\\|Sender\\)" . - "-A-Za-z0-9!*+/=_") - (t . mime)) - "*Header/encoding method alist. -The list is traversed sequentially. The keys can either be -header regexps or t. - -The values can be: - -1) nil, in which case no encoding is done; -2) `mime', in which case the header will be encoded according to RFC2047; -3) a charset, in which case it will be encoded as that charset; -4) `default', in which case the field will be encoded as the rest - of the article. -5) a string, like `mime', expect for using it as word-chars.") - -(defvar rfc2047-charset-encoding-alist - '((us-ascii . nil) - (iso-8859-1 . Q) - (iso-8859-2 . Q) - (iso-8859-3 . Q) - (iso-8859-4 . Q) - (iso-8859-5 . B) - (koi8-r . B) - (iso-8859-7 . Q) - (iso-8859-8 . Q) - (iso-8859-9 . Q) - (iso-8859-14 . Q) - (iso-8859-15 . Q) - (iso-2022-jp . B) - (iso-2022-kr . B) - (gb2312 . B) - (big5 . B) - (cn-big5 . B) - (cn-gb . B) - (cn-gb-2312 . B) - (euc-kr . B) - (iso-2022-jp-2 . B) - (iso-2022-int-1 . B)) - "Alist of MIME charsets to RFC2047 encodings. -Valid encodings are nil, `Q' and `B'.") - -(defvar rfc2047-encoding-function-alist - '((Q . rfc2047-q-encode-region) - (B . rfc2047-b-encode-region) - (nil . ignore)) - "Alist of RFC2047 encodings to encoding functions.") - -(defvar rfc2047-q-encoding-alist - '(("\\(Resent-\\)?\\(From\\|Cc\\|To\\|Bcc\\|Reply-To\\|Sender\\):" - . "-A-Za-z0-9!*+/" ) - ;; = (\075), _ (\137), ? (\077) are used in the encoded word. - ;; Avoid using 8bit characters. - ;; Equivalent to "^\000-\007\011\013\015-\037\200-\377=_?" - ("." . "\010\012\014\040-\074\076\100-\136\140-\177")) - "Alist of header regexps and valid Q characters.") - -;;; -;;; Functions for encoding RFC2047 messages -;;; - -(defun rfc2047-narrow-to-field () - "Narrow the buffer to the header on the current line." - (beginning-of-line) - (narrow-to-region - (point) - (progn - (forward-line 1) - (if (re-search-forward "^[^ \n\t]" nil t) - (progn - (beginning-of-line) - (point)) - (point-max)))) - (goto-char (point-min))) - -(defun rfc2047-encode-message-header () - "Encode the message header according to `rfc2047-header-encoding-alist'. -Should be called narrowed to the head of the message." - (interactive "*") - (save-excursion - (goto-char (point-min)) - (let (alist elem method) - (while (not (eobp)) - (save-restriction - (rfc2047-narrow-to-field) - (if (not (rfc2047-encodable-p)) - (prog1 - (if (and (eq (mm-body-7-or-8) '8bit) - (mm-multibyte-p) - (mm-coding-system-p - (car message-posting-charset))) - ;; 8 bit must be decoded. - ;; Is message-posting-charset a coding system? - (mm-encode-coding-region - (point-min) (point-max) - (car message-posting-charset))) - ;; No encoding necessary, but folding is nice - (rfc2047-fold-region (save-excursion - (goto-char (point-min)) - (skip-chars-forward "^:") - (and (looking-at ": ") - (forward-char 2)) - (point)) (point-max))) - ;; We found something that may perhaps be encoded. - (setq method nil - alist rfc2047-header-encoding-alist) - (while (setq elem (pop alist)) - (when (or (and (stringp (car elem)) - (looking-at (car elem))) - (eq (car elem) t)) - (setq alist nil - method (cdr elem)))) - (cond - ((stringp method) - (rfc2047-encode-region (point-min) (point-max) method)) - ((eq method 'mime) - (rfc2047-encode-region (point-min) (point-max))) - ((eq method 'default) - (if (and (featurep 'mule) - (if (boundp 'default-enable-multibyte-characters) - default-enable-multibyte-characters) - mail-parse-charset) - (mm-encode-coding-region (point-min) (point-max) - mail-parse-charset))) - ((null method) - (and (delq 'ascii - (mm-find-charset-region (point-min) - (point-max))) - (if (or (message-options-get - 'rfc2047-encode-message-header-encode-any) - (message-options-set - 'rfc2047-encode-message-header-encode-any - (y-or-n-p - "Some texts are not encoded. Encode anyway?"))) - (rfc2047-encode-region (point-min) (point-max)) - (error "Cannot send unencoded text")))) - ((mm-coding-system-p method) - (if (and (featurep 'mule) - (if (boundp 'default-enable-multibyte-characters) - default-enable-multibyte-characters)) - (mm-encode-coding-region (point-min) (point-max) method))) - ;; Hm. - (t))) - (goto-char (point-max))))))) - -;; Fixme: This, and the require below may not be the Right Thing, but -;; should be safe just before release. -- fx 2001-02-08 -(eval-when-compile (defvar message-posting-charset)) - -(defun rfc2047-encodable-p () - "Return non-nil if any characters in current buffer need encoding in headers. -The buffer may be narrowed." - (require 'message) ; for message-posting-charset - (let ((charsets - (mapcar - 'mm-mime-charset - (mm-find-charset-region (point-min) (point-max)))) - (cs (list 'us-ascii (car message-posting-charset))) - found) - (while charsets - (unless (memq (pop charsets) cs) - (setq found t))) - found)) - -(defun rfc2047-dissect-region (b e &optional word-chars) - "Dissect the region between B and E into words." - (unless word-chars - ;; Anything except most CTLs, WSP - (setq word-chars "\010\012\014\041-\177")) - (let (mail-parse-mule-charset - words point current - result word) - (save-restriction - (narrow-to-region b e) - (goto-char (point-min)) - (skip-chars-forward "\000-\177") - (while (not (eobp)) - (setq point (point)) - (skip-chars-backward word-chars b) - (unless (eq b (point)) - (push (cons (buffer-substring b (point)) nil) words)) - (setq b (point)) - (goto-char point) - (setq current (mm-charset-after)) - (forward-char 1) - (skip-chars-forward word-chars) - (while (and (not (eobp)) - (eq (mm-charset-after) current)) - (forward-char 1) - (skip-chars-forward word-chars)) - (unless (eq b (point)) - (push (cons (buffer-substring b (point)) current) words)) - (setq b (point)) - (skip-chars-forward "\000-\177")) - (unless (eq b (point)) - (push (cons (buffer-substring b (point)) nil) words))) - ;; merge adjacent words - (setq word (pop words)) - (while word - (if (and (cdr word) - (caar words) - (not (cdar words)) - (not (string-match "[^ \t]" (caar words)))) - (if (eq (cdr (nth 1 words)) (cdr word)) - (progn - (setq word (cons (concat - (car (nth 1 words)) (caar words) - (car word)) - (cdr word))) - (pop words) - (pop words)) - (push (cons (concat (caar words) (car word)) (cdr word)) - result) - (pop words) - (setq word (pop words))) - (push word result) - (setq word (pop words)))) - result)) - -(defun rfc2047-encode-region (b e &optional word-chars) - "Encode all encodable words in region B to E." - (let ((words (rfc2047-dissect-region b e word-chars)) word) - (save-restriction - (narrow-to-region b e) - (delete-region (point-min) (point-max)) - (while (setq word (pop words)) - (if (not (cdr word)) - (insert (car word)) - (rfc2047-fold-region (gnus-point-at-bol) (point)) - (goto-char (point-max)) - (if (> (- (point) (save-restriction - (widen) - (gnus-point-at-bol))) 76) - (insert "\n ")) - ;; Insert blank between encoded words - (if (eq (char-before) ?=) (insert " ")) - (rfc2047-encode (point) - (progn (insert (car word)) (point)) - (cdr word)))) - (rfc2047-fold-region (point-min) (point-max))))) - -(defun rfc2047-encode-string (string &optional word-chars) - "Encode words in STRING." - (with-temp-buffer - (insert string) - (rfc2047-encode-region (point-min) (point-max) word-chars) - (buffer-string))) - -(defun rfc2047-encode (b e charset) - "Encode the word in the region B to E with CHARSET." - (let* ((mime-charset (mm-mime-charset charset)) - (cs (mm-charset-to-coding-system mime-charset)) - (encoding (or (cdr (assq mime-charset - rfc2047-charset-encoding-alist)) - 'B)) - (start (concat - "=?" (downcase (symbol-name mime-charset)) "?" - (downcase (symbol-name encoding)) "?")) - (first t)) - (save-restriction - (narrow-to-region b e) - (when (eq encoding 'B) - ;; break into lines before encoding - (goto-char (point-min)) - (while (not (eobp)) - (goto-char (min (point-max) (+ 15 (point)))) - (unless (eobp) - (insert "\n")))) - (if (and (mm-multibyte-p) - (mm-coding-system-p cs)) - (mm-encode-coding-region (point-min) (point-max) cs)) - (funcall (cdr (assq encoding rfc2047-encoding-function-alist)) - (point-min) (point-max)) - (goto-char (point-min)) - (while (not (eobp)) - (unless first - (insert " ")) - (setq first nil) - (insert start) - (end-of-line) - (insert "?=") - (forward-line 1))))) - -(defun rfc2047-fold-region (b e) - "Fold long lines in region B to E." - (save-restriction - (narrow-to-region b e) - (goto-char (point-min)) - (let ((break nil) - (qword-break nil) - (bol (save-restriction - (widen) - (gnus-point-at-bol)))) - (while (not (eobp)) - (when (and (or break qword-break) (> (- (point) bol) 76)) - (goto-char (or break qword-break)) - (setq break nil - qword-break nil) - (if (looking-at "[ \t]") - (insert "\n") - (insert "\n ")) - (setq bol (1- (point))) - ;; Don't break before the first non-LWSP characters. - (skip-chars-forward " \t") - (unless (eobp) (forward-char 1))) - (cond - ((eq (char-after) ?\n) - (forward-char 1) - (setq bol (point) - break nil - qword-break nil) - (skip-chars-forward " \t") - (unless (or (eobp) (eq (char-after) ?\n)) - (forward-char 1))) - ((eq (char-after) ?\r) - (forward-char 1)) - ((memq (char-after) '(? ?\t)) - (skip-chars-forward " \t") - (setq break (1- (point)))) - ((not break) - (if (not (looking-at "=\\?[^=]")) - (if (eq (char-after) ?=) - (forward-char 1) - (skip-chars-forward "^ \t\n\r=")) - (setq qword-break (point)) - (skip-chars-forward "^ \t\n\r"))) - (t - (skip-chars-forward "^ \t\n\r")))) - (when (and (or break qword-break) (> (- (point) bol) 76)) - (goto-char (or break qword-break)) - (setq break nil - qword-break nil) - (if (looking-at "[ \t]") - (insert "\n") - (insert "\n ")) - (setq bol (1- (point))) - ;; Don't break before the first non-LWSP characters. - (skip-chars-forward " \t") - (unless (eobp) (forward-char 1)))))) - -(defun rfc2047-unfold-region (b e) - "Unfold lines in region B to E." - (save-restriction - (narrow-to-region b e) - (goto-char (point-min)) - (let ((bol (save-restriction - (widen) - (gnus-point-at-bol))) - (eol (gnus-point-at-eol)) - leading) - (forward-line 1) - (while (not (eobp)) - (looking-at "[ \t]*") - (setq leading (- (match-end 0) (match-beginning 0))) - (if (< (- (gnus-point-at-eol) bol leading) 76) - (progn - (goto-char eol) - (delete-region eol (progn - (skip-chars-forward " \t\n\r") - (1- (point))))) - (setq bol (gnus-point-at-bol))) - (setq eol (gnus-point-at-eol)) - (forward-line 1))))) - -(defun rfc2047-b-encode-region (b e) - "Base64-encode the header contained in region B to E." - (save-restriction - (narrow-to-region (goto-char b) e) - (while (not (eobp)) - (base64-encode-region (point) (progn (end-of-line) (point)) t) - (if (and (bolp) (eolp)) - (delete-backward-char 1)) - (forward-line)))) - -(defun rfc2047-q-encode-region (b e) - "Quoted-printable-encode the header in region B to E." - (save-excursion - (save-restriction - (narrow-to-region (goto-char b) e) - (let ((alist rfc2047-q-encoding-alist) - (bol (save-restriction - (widen) - (gnus-point-at-bol)))) - (while alist - (when (looking-at (caar alist)) - (mm-with-unibyte-current-buffer-mule4 - (quoted-printable-encode-region - (point-min) (point-max) nil (cdar alist))) - (subst-char-in-region (point-min) (point-max) ? ?_) - (setq alist nil)) - (pop alist)) - ;; The size of QP encapsulation is about 20, so set limit to - ;; 56=76-20. - (unless (< (- (point-max) (point-min)) 56) - ;; Don't break if it could fit in one line. - ;; Let rfc2047-encode-region break it later. - (goto-char (1+ (point-min))) - (while (and (not (bobp)) (not (eobp))) - (goto-char (min (point-max) (+ 56 bol))) - (search-backward "=" (- (point) 2) t) - (unless (or (bobp) (eobp)) - (insert "\n") - (setq bol (point))))))))) - -;;; -;;; Functions for decoding RFC2047 messages -;;; - -(defvar rfc2047-encoded-word-regexp - "=\\?\\([^][\000-\040()<>@,\;:\\\"/?.=]+\\)\\?\\(B\\|Q\\)\\?\\([!->@-~ +]*\\)\\?=") - -(defun rfc2047-decode-region (start end) - "Decode MIME-encoded words in region between START and END." - (interactive "r") - (let ((case-fold-search t) - b e) - (save-excursion - (save-restriction - (narrow-to-region start end) - (goto-char (point-min)) - ;; Remove whitespace between encoded words. - (while (re-search-forward - (concat "\\(" rfc2047-encoded-word-regexp "\\)" - "\\(\n?[ \t]\\)+" - "\\(" rfc2047-encoded-word-regexp "\\)") - nil t) - (delete-region (goto-char (match-end 1)) (match-beginning 6))) - ;; Decode the encoded words. - (setq b (goto-char (point-min))) - (while (re-search-forward rfc2047-encoded-word-regexp nil t) - (setq e (match-beginning 0)) - (insert (rfc2047-parse-and-decode - (prog1 - (match-string 0) - (delete-region (match-beginning 0) (match-end 0))))) - (when (and (mm-multibyte-p) - mail-parse-charset - (not (eq mail-parse-charset 'gnus-decoded))) - (mm-decode-coding-region b e mail-parse-charset)) - (setq b (point))) - (when (and (mm-multibyte-p) - mail-parse-charset - (not (eq mail-parse-charset 'us-ascii)) - (not (eq mail-parse-charset 'gnus-decoded))) - (mm-decode-coding-region b (point-max) mail-parse-charset)) - (rfc2047-unfold-region (point-min) (point-max)))))) - -(defun rfc2047-decode-string (string) - "Decode the quoted-printable-encoded STRING and return the results." - (let ((m (mm-multibyte-p))) - (with-temp-buffer - (when m - (mm-enable-multibyte)) - (insert string) - (inline - (rfc2047-decode-region (point-min) (point-max))) - (buffer-string)))) - -(defun rfc2047-parse-and-decode (word) - "Decode WORD and return it if it is an encoded word. -Return WORD if not." - (if (not (string-match rfc2047-encoded-word-regexp word)) - word - (or - (condition-case nil - (rfc2047-decode - (match-string 1 word) - (upcase (match-string 2 word)) - (match-string 3 word)) - (error word)) - word))) - -(defun rfc2047-pad-base64 (string) - "Pad STRING to quartets." - ;; Be more liberal to accept buggy base64 strings. If - ;; base64-decode-string accepts buggy strings, this function could - ;; be aliased to identity. - (case (mod (length string) 4) - (0 string) - (1 string) ;; Error, don't pad it. - (2 (concat string "==")) - (3 (concat string "=")))) - -(defun rfc2047-decode (charset encoding string) - "Decode STRING from the given MIME CHARSET in the given ENCODING. -Valid ENCODINGs are \"B\" and \"Q\". -If your Emacs implementation can't decode CHARSET, return nil." - (if (stringp charset) - (setq charset (intern (downcase charset)))) - (if (or (not charset) - (eq 'gnus-all mail-parse-ignored-charsets) - (memq 'gnus-all mail-parse-ignored-charsets) - (memq charset mail-parse-ignored-charsets)) - (setq charset mail-parse-charset)) - (let ((cs (mm-charset-to-coding-system charset))) - (if (and (not cs) charset - (listp mail-parse-ignored-charsets) - (memq 'gnus-unknown mail-parse-ignored-charsets)) - (setq cs (mm-charset-to-coding-system mail-parse-charset))) - (when cs - (when (and (eq cs 'ascii) - mail-parse-charset) - (setq cs mail-parse-charset)) - (mm-with-unibyte-current-buffer-mule4 - ;; In Emacs Mule 4, decoding UTF-8 should be in unibyte mode. - (mm-decode-coding-string - (cond - ((equal "B" encoding) - (base64-decode-string - (rfc2047-pad-base64 string))) - ((equal "Q" encoding) - (quoted-printable-decode-string - (mm-replace-chars-in-string string ?_ ? ))) - (t (error "Invalid encoding: %s" encoding))) - cs))))) - -(provide 'rfc2047) - -;;; rfc2047.el ends here diff --git a/lisp/rfc2104.el b/lisp/rfc2104.el deleted file mode 100644 index 5496a4f..0000000 --- a/lisp/rfc2104.el +++ /dev/null @@ -1,117 +0,0 @@ -;;; rfc2104.el --- RFC2104 Hashed Message Authentication Codes -;; Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. - -;; Author: Simon Josefsson -;; Keywords: mail - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; This is a quick'n'dirty, low performance, implementation of RFC2104. -;;; -;;; Example: -;;; -;;; (require 'md5) -;;; (rfc2104-hash 'md5 64 16 "Jefe" "what do ya want for nothing?") -;;; "750c783e6ab0b503eaa86e310a5db738" -;;; -;;; (require 'sha-1) -;;; (rfc2104-hash 'sha1-encode 64 20 "Jefe" "what do ya want for nothing?") -;;; "effcdf6ae5eb2fa2d27416d5f184df9c259a7c79" -;;; -;;; 64 is block length of hash function (64 for MD5 and SHA), 16 is -;;; resulting hash length (16 for MD5, 20 for SHA). -;;; -;;; Tested with Emacs 20.2 and XEmacs 20.3. -;;; -;;; Test case reference: RFC 2202. - -;;; Release history: -;;; -;;; 1998-08-16 initial release posted to gnu.emacs.sources -;;; 1998-08-17 use append instead of char-list-to-string -;;; 1998-08-26 don't require hexl -;;; 1998-09-25 renamed from hmac.el to rfc2104.el, also renamed functions -;;; 1999-10-23 included in pgnus -;;; 2000-08-15 `rfc2104-hexstring-to-bitstring' -;;; 2000-05-12 added sha-1 example, added test case reference - -;;; Code: - -(eval-when-compile (require 'cl)) - -;; Magic character for inner HMAC round. 0x36 == 54 == '6' -(defconst rfc2104-ipad ?\x36) - -;; Magic character for outer HMAC round. 0x5C == 92 == '\' -(defconst rfc2104-opad ?\x5C) - -;; Not so magic character for padding the key. 0x00 -(defconst rfc2104-zero ?\x00) - -;; Alist for converting hex to decimal. -(defconst rfc2104-hex-alist - '((?0 . 0) (?a . 10) (?A . 10) - (?1 . 1) (?b . 11) (?B . 11) - (?2 . 2) (?c . 12) (?C . 12) - (?3 . 3) (?d . 13) (?D . 13) - (?4 . 4) (?e . 14) (?E . 14) - (?5 . 5) (?f . 15) (?F . 15) - (?6 . 6) - (?7 . 7) - (?8 . 8) - (?9 . 9))) - -(defun rfc2104-hex-to-int (str) - (if str - (if (listp str) - (+ (* 16 (rfc2104-hex-to-int (cdr str))) - (cdr (assoc (car str) rfc2104-hex-alist))) - (rfc2104-hex-to-int (reverse (append str nil)))) - 0)) - -(defun rfc2104-hexstring-to-bitstring (str) - (let (out) - (while (< 0 (length str)) - (push (rfc2104-hex-to-int (substring str -2)) out) - (setq str (substring str 0 -2))) - (concat out))) - -(defun rfc2104-hash (hash block-length hash-length key text) - (let* (;; if key is longer than B, reset it to HASH(key) - (key (if (> (length key) block-length) - (funcall hash key) key)) - (k_ipad (append key nil)) - (k_opad (append key nil))) - ;; zero pad k_ipad/k_opad - (while (< (length k_ipad) block-length) - (setq k_ipad (append k_ipad (list rfc2104-zero)))) - (while (< (length k_opad) block-length) - (setq k_opad (append k_opad (list rfc2104-zero)))) - ;; XOR key with ipad/opad into k_ipad/k_opad - (setq k_ipad (mapcar (lambda (c) (logxor c rfc2104-ipad)) k_ipad)) - (setq k_opad (mapcar (lambda (c) (logxor c rfc2104-opad)) k_opad)) - ;; perform outer hash - (funcall hash (concat k_opad (rfc2104-hexstring-to-bitstring - ;; perform inner hash - (funcall hash (concat k_ipad text))))))) - -(provide 'rfc2104) - -;;; rfc2104.el ends here diff --git a/lisp/rfc2231.el b/lisp/rfc2231.el deleted file mode 100644 index 2fcf7e2..0000000 --- a/lisp/rfc2231.el +++ /dev/null @@ -1,222 +0,0 @@ -;;; rfc2231.el --- Functions for decoding rfc2231 headers - -;; Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) -(eval-when-compile (require 'gnus-clfns)) - -(eval-when-compile (require 'cl)) -(require 'ietf-drums) -(require 'rfc2047) - -(defun rfc2231-get-value (ct attribute) - "Return the value of ATTRIBUTE from CT." - (cdr (assq attribute (cdr ct)))) - -(defun rfc2231-parse-qp-string (string) - "Parse QP-encoded string using `rfc2231-parse-string'. -N.B. This is in violation with RFC2047, but it seem to be in common use." - (rfc2231-parse-string (rfc2047-decode-string string))) - -(defun rfc2231-parse-string (string) - "Parse STRING and return a list. -The list will be on the form - `(name (attribute . value) (attribute . value)...)" - (with-temp-buffer - (let ((ttoken (ietf-drums-token-to-list ietf-drums-text-token)) - (stoken (ietf-drums-token-to-list ietf-drums-tspecials)) - (ntoken (ietf-drums-token-to-list "0-9")) - (prev-value "") - display-name mailbox c display-string parameters - attribute value type subtype number encoded - prev-attribute) - (ietf-drums-init (mail-header-remove-whitespace - (mail-header-remove-comments string))) - (let ((table (copy-syntax-table ietf-drums-syntax-table))) - (modify-syntax-entry ?\' "w" table) - ;; The following isn't valid, but one should be liberal - ;; in what one receives. - (modify-syntax-entry ?\: "w" table) - (set-syntax-table table)) - (setq c (char-after)) - (when (and (memq c ttoken) - (not (memq c stoken))) - (setq type (downcase (buffer-substring - (point) (progn (forward-sexp 1) (point))))) - ;; Do the params - (while (not (eobp)) - (setq c (char-after)) - (unless (eq c ?\;) - (error "Invalid header: %s" string)) - (forward-char 1) - ;; If c in nil, then this is an invalid header, but - ;; since elm generates invalid headers on this form, - ;; we allow it. - (when (setq c (char-after)) - (if (and (memq c ttoken) - (not (memq c stoken))) - (setq attribute - (intern - (downcase - (buffer-substring - (point) (progn (forward-sexp 1) (point)))))) - (error "Invalid header: %s" string)) - (setq c (char-after)) - (setq encoded nil) - (when (eq c ?*) - (forward-char 1) - (setq c (char-after)) - (if (not (memq c ntoken)) - (setq encoded t - number nil) - (setq number - (string-to-number - (buffer-substring - (point) (progn (forward-sexp 1) (point))))) - (setq c (char-after)) - (when (eq c ?*) - (setq encoded t) - (forward-char 1) - (setq c (char-after))))) - ;; See if we have any previous continuations. - (when (and prev-attribute - (not (eq prev-attribute attribute))) - (push (cons prev-attribute prev-value) parameters) - (setq prev-attribute nil - prev-value "")) - (unless (eq c ?=) - (error "Invalid header: %s" string)) - (forward-char 1) - (setq c (char-after)) - (cond - ((eq c ?\") - (setq value - (buffer-substring (1+ (point)) - (progn (forward-sexp 1) (1- (point)))))) - ((and (memq c ttoken) - (not (memq c stoken))) - (setq value (buffer-substring - (point) (progn (forward-sexp 1) (point))))) - (t - (error "Invalid header: %s" string))) - (when encoded - (setq value (rfc2231-decode-encoded-string value))) - (if number - (setq prev-attribute attribute - prev-value (concat prev-value value)) - (push (cons attribute value) parameters)))) - - ;; Take care of any final continuations. - (when prev-attribute - (push (cons prev-attribute prev-value) parameters)) - - (when type - `(,type ,@(nreverse parameters))))))) - -(defun rfc2231-decode-encoded-string (string) - "Decode an RFC2231-encoded string. -These look like \"us-ascii'en-us'This%20is%20%2A%2A%2Afun%2A%2A%2A\"." - (with-temp-buffer - (let ((elems (split-string string "'"))) - ;; The encoded string may contain zero to two single-quote - ;; marks. This should give us the encoded word stripped - ;; of any preceding values. - (insert (car (last elems))) - (goto-char (point-min)) - (while (search-forward "%" nil t) - (insert - (prog1 - (string-to-number (buffer-substring (point) (+ (point) 2)) 16) - (delete-region (1- (point)) (+ (point) 2))))) - ;; Encode using the charset, if any. - (when (and (mm-multibyte-p) - (> (length elems) 1) - (not (equal (intern (car elems)) 'us-ascii))) - (mm-decode-coding-region (point-min) (point-max) - (intern (car elems)))) - (buffer-string)))) - -(defun rfc2231-encode-string (param value) - "Return and PARAM=VALUE string encoded according to RFC2231." - (let ((control (ietf-drums-token-to-list ietf-drums-no-ws-ctl-token)) - (tspecial (ietf-drums-token-to-list ietf-drums-tspecials)) - (special (ietf-drums-token-to-list "*'%\n\t")) - (ascii (ietf-drums-token-to-list ietf-drums-text-token)) - (num -1) - spacep encodep charsetp charset broken) - (with-temp-buffer - (insert value) - (goto-char (point-min)) - (while (not (eobp)) - (cond - ((or (memq (following-char) control) - (memq (following-char) tspecial) - (memq (following-char) special)) - (setq encodep t)) - ((eq (following-char) ? ) - (setq spacep t)) - ((not (memq (following-char) ascii)) - (setq charsetp t))) - (forward-char 1)) - (when charsetp - (setq charset (mm-encode-body))) - (cond - ((or encodep charsetp) - (goto-char (point-min)) - (while (not (eobp)) - (when (> (current-column) 60) - (insert ";\n") - (setq broken t)) - (if (or (not (memq (following-char) ascii)) - (memq (following-char) control) - (memq (following-char) tspecial) - (memq (following-char) special) - (eq (following-char) ? )) - (progn - (insert "%" (format "%02x" (following-char))) - (delete-char 1)) - (forward-char 1))) - (goto-char (point-min)) - (insert (symbol-name (or charset 'us-ascii)) "''") - (goto-char (point-min)) - (if (not broken) - (insert param "*=") - (while (not (eobp)) - (insert (if (>= num 0) " " "\n ") - param "*" (format "%d" (incf num)) "*=") - (forward-line 1)))) - (spacep - (goto-char (point-min)) - (insert param "=\"") - (goto-char (point-max)) - (insert "\"")) - (t - (goto-char (point-min)) - (insert param "="))) - (buffer-string)))) - -(provide 'rfc2231) - -;;; rfc2231.el ends here diff --git a/lisp/score-mode.el b/lisp/score-mode.el deleted file mode 100644 index 1555df9..0000000 --- a/lisp/score-mode.el +++ /dev/null @@ -1,115 +0,0 @@ -;;; score-mode.el --- mode for editing Gnus score files -;; Copyright (C) 1996 Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Keywords: news, mail - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) -(eval-when-compile (require 'static)) - -(defvar gnus-score-mode-hook nil - "*Hook run in score mode buffers.") - -(defvar gnus-score-menu-hook nil - "*Hook run after creating the score mode menu.") - -(defvar gnus-score-edit-exit-function nil - "Function run on exit from the score buffer.") - -(defvar gnus-score-mode-map nil) -(unless gnus-score-mode-map - (setq gnus-score-mode-map (make-sparse-keymap)) - (set-keymap-parent gnus-score-mode-map emacs-lisp-mode-map) - (define-key gnus-score-mode-map "\C-c\C-c" 'gnus-score-edit-exit) - (define-key gnus-score-mode-map "\C-c\C-d" 'gnus-score-edit-insert-date) - (define-key gnus-score-mode-map "\C-c\C-p" 'gnus-score-pretty-print)) - -(defvar score-mode-syntax-table - (let ((table (copy-syntax-table lisp-mode-syntax-table))) - (modify-syntax-entry ?| "w" table) - table) - "Syntax table used in score-mode buffers.") - -(defvar score-mode-coding-system (static-if (boundp 'MULE) - '*ctext* - 'ctext)) - -;;;###autoload -(defun gnus-score-mode () - "Mode for editing Gnus score files. -This mode is an extended emacs-lisp mode. - -\\{gnus-score-mode-map}" - (interactive) - (kill-all-local-variables) - (use-local-map gnus-score-mode-map) - (gnus-score-make-menu-bar) - (set-syntax-table score-mode-syntax-table) - (setq major-mode 'gnus-score-mode) - (setq mode-name "Score") - (lisp-mode-variables nil) - (make-local-variable 'gnus-score-edit-exit-function) - (run-hooks 'emacs-lisp-mode-hook 'gnus-score-mode-hook)) - -(defun gnus-score-make-menu-bar () - (unless (boundp 'gnus-score-menu) - (easy-menu-define - gnus-score-menu gnus-score-mode-map "" - '("Score" - ["Exit" gnus-score-edit-exit t] - ["Insert date" gnus-score-edit-insert-date t] - ["Format" gnus-score-pretty-print t])) - (run-hooks 'gnus-score-menu-hook))) - -(defun gnus-score-edit-insert-date () - "Insert date in numerical format." - (interactive) - (princ (time-to-days (current-time)) (current-buffer))) - -(defun gnus-score-pretty-print () - "Format the current score file." - (interactive) - (goto-char (point-min)) - (let ((form (read (current-buffer)))) - (erase-buffer) - (let ((emacs-lisp-mode-syntax-table score-mode-syntax-table)) - (pp form (current-buffer)))) - (goto-char (point-min))) - -(defun gnus-score-edit-exit () - "Stop editing the score file." - (interactive) - (unless (file-exists-p (file-name-directory (buffer-file-name))) - (make-directory (file-name-directory (buffer-file-name)) t)) - (save-buffer-as-coding-system score-mode-coding-system) - (bury-buffer (current-buffer)) - (let ((buf (current-buffer))) - (when gnus-score-edit-exit-function - (funcall gnus-score-edit-exit-function)) - (when (eq buf (current-buffer)) - (switch-to-buffer (other-buffer (current-buffer)))))) - -(provide 'score-mode) - -;;; score-mode.el ends here diff --git a/lisp/smiley-ems.el b/lisp/smiley-ems.el deleted file mode 100644 index f2c28f0..0000000 --- a/lisp/smiley-ems.el +++ /dev/null @@ -1,157 +0,0 @@ -;;; smiley-ems.el --- displaying smiley faces - -;; Copyright (C) 2000 Free Software Foundation, Inc. - -;; Author: Dave Love -;; Keywords: news mail multimedia - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;; A re-written, simplified version of Wes Hardaker's XEmacs smiley.el -;; which might be merged back to smiley.el if we get an assignment for -;; that. We don't have assignments for the images smiley.el uses, but -;; I'm not sure we need that degree of rococoness and defaults like a -;; yellow background. Also, using PBM means we can display the images -;; more generally. -- fx - -;;; Test smileys: :-) :-\ :-( :-/ - -;;; Code: - -(eval-when-compile (require 'cl)) -(require 'nnheader) - -(defgroup smiley nil - "Turn :-)'s into real images." - :group 'gnus-visual) - -;; Maybe this should go. -(defcustom smiley-data-directory (nnheader-find-etc-directory "smilies") - "*Location of the smiley faces files." - :type 'directory - :group 'smiley) - -;; The XEmacs version has a baroque, if not rococo, set of these. -(defcustom smiley-regexp-alist - ;; Perhaps :-) should be distinct -- it does appear in the Jargon File. - '(("\\([:;]-?)\\)\\W" 1 "smile.pbm") - ("\\(:-[/\\]\\)\\W" 1 "wry.pbm") - ("\\(:-[({]\\)\\W" 1 "frown.pbm")) - "*A list of regexps to map smilies to images. -The elements are (REGEXP MATCH FILE), where MATCH is the submatch in -rgexp to replace with IMAGE. IMAGE is the name of a PBM file in -`smiley-data-directory'." - :type '(repeat (list regexp - (integer :tag "Regexp match number") - (string :tag "Image name"))) - :set (lambda (symbol value) - (set-default symbol value) - (smiley-update-cache)) - :initialize 'custom-initialize-default - :group 'smiley) - -(defvar smiley-cached-regexp-alist nil) - -(defun smiley-update-cache () - (dolist (elt (if (symbolp smiley-regexp-alist) - (symbol-value smiley-regexp-alist) - smiley-regexp-alist)) - (let* ((data-directory smiley-data-directory) - (image (find-image (list (list :type 'pbm - :file (nth 2 elt) - :ascent 'center))))) - (if image - (push (list (car elt) (cadr elt) image) - smiley-cached-regexp-alist))))) - -(defvar smiley-active nil - "Non-nil means smilies in the buffer will be displayed.") -(make-variable-buffer-local 'smiley-active) - -(defvar smiley-mouse-map - (let ((map (make-sparse-keymap))) - (define-key map [down-mouse-2] 'ignore) ; override widget - (define-key map [mouse-2] - 'smiley-mouse-toggle-buffer) - map)) - -(defun smiley-region (start end) - "Replace in the region `smiley-regexp-alist' matches with corresponding images." - (interactive "r") - (when (and (fboundp 'display-graphic-p) - (display-graphic-p)) - (mapcar (lambda (o) - (if (eq 'smiley (overlay-get o 'smiley)) - (delete-overlay o))) - (overlays-in start end)) - (unless smiley-cached-regexp-alist - (smiley-update-cache)) - (save-excursion - (let ((beg (or start (point-min))) - group overlay image) - (dolist (entry smiley-cached-regexp-alist) - (setq group (nth 1 entry) - image (nth 2 entry)) - (goto-char beg) - (while (re-search-forward (car entry) end t) - (when image - (setq overlay (make-overlay (match-beginning group) - (match-end group))) - (overlay-put overlay - 'display `(when smiley-active ,@image)) - (overlay-put overlay 'mouse-face 'highlight) - (overlay-put overlay 'smiley t) - (overlay-put overlay - 'help-echo "mouse-2: toggle smilies in buffer") - (overlay-put overlay 'keymap smiley-mouse-map)))))) - (setq smiley-active t))) - -(defun smiley-toggle-buffer (&optional arg) - "Toggle displaying smiley faces. -With arg, turn displaying on if and only if arg is positive." - (interactive "P") - (if (numberp arg) - (setq smiley-active (> arg 0)) - (setq smiley-active (not smiley-active)))) - -(defun smiley-mouse-toggle-buffer (event) - "Toggle displaying smiley faces. -With arg, turn displaying on if and only if arg is positive." - (interactive "e") - (save-excursion - (save-window-excursion - (mouse-set-point event) - (smiley-toggle-buffer)))) - -(eval-when-compile (defvar gnus-article-buffer)) - -(defun gnus-smiley-display (&optional arg) - "Display textual emoticaons (\"smilies\") as small graphical icons. -With arg, turn displaying on if and only if arg is positive." - (interactive "P") - (save-excursion - (article-goto-body) - (smiley-region (point) (point-max)) - (if (and (numberp arg) (<= arg 0)) - (smiley-toggle-buffer arg)))) - -(provide 'smiley) - -;;; smiley-ems.el ends here diff --git a/lisp/smiley.el b/lisp/smiley.el deleted file mode 100644 index ad255e6..0000000 --- a/lisp/smiley.el +++ /dev/null @@ -1,441 +0,0 @@ -;;; smiley.el --- displaying smiley faces -;; Copyright (C) 1996, 1997, 1998, 1999, 2000 -;; Free Software Foundation, Inc. - -;; Author: Wes Hardaker -;; Keywords: fun - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;; -;; comments go here. -;; - -;;; Test smileys: :-] :-o :-) ;-) :-\ :-| :-d :-P 8-| :-( - -;; To use: -;; (require 'smiley) -;; (setq gnus-treat-display-smileys t) - -;; The smilies were drawn by Joe Reiss . - -;;; Code: - -(eval-when-compile (require 'cl)) -(require 'custom) - -(eval-and-compile - (when (featurep 'xemacs) - (require 'annotations) - (require 'messagexmas))) - -(defgroup smiley nil - "Turn :-)'s into real images." - :group 'gnus-visual) - -;; FIXME: Where is the directory when using Emacs? -(defcustom smiley-data-directory - (if (featurep 'xemacs) - (message-xmas-find-glyph-directory "smilies") - "/usr/local/lib/xemacs/xemacs-packages/etc/smilies") - "*Location of the smiley faces files." - :type 'directory - :group 'smiley) - -;; Notice the subtle differences in the regular expressions in the -;; two alists below. - -(defcustom smiley-deformed-regexp-alist - '(("\\(\\^_?\\^;;;\\)\\W" 1 "WideFaceAse3.xbm") - ("\\(\\^_?\\^;;\\)\\W" 1 "WideFaceAse2.xbm") - ("\\(\\^_?\\^;\\)\\W" 1 "WideFaceAse1.xbm") - ("\\(\\^_?\\^\\)\\W" 1 "WideFaceSmile.xbm") - ("\\(;_;\\)\\W" 1 "WideFaceWeep.xbm") - ("\\(T_T\\)\\W" 1 "WideFaceWeep.xbm") - ("\\(:-*[<(I+(B]+\\)\\W" 1 "FaceAngry.xpm") - ("\\(:-+\\]+\\)\\W" 1 "FaceGoofy.xpm") - ("\\(:-*D\\)\\W" 1 "FaceGrinning.xpm") - ("\\(:-*[)>}(I;(B]+\\)\\W" 1 "FaceHappy.xpm") - ("\\(=[)>(I;(B]+\\)\\W" 1 "FaceHappy.xpm") - ("\\(:-*[/\\\"]\\)[^/]\\W" 1 "FaceIronic.xpm") - ("[^.0-9]\\([8|]-*[|Oo%]\\)\\W" 1 "FaceKOed.xpm") - ("\\([:|]-*#+\\)\\W" 1 "FaceNyah.xpm") - ("\\(:-*[({]+\\)\\W" 1 "FaceSad.xpm") - ("\\(=[({]+\\)\\W" 1 "FaceSad.xpm") - ("\\(:-*[Oo\*]\\)\\W" 1 "FaceStartled.xpm") - ("\\(:-*|\\)\\W" 1 "FaceStraight.xpm") - ("\\(:-*p\\)\\W" 1 "FaceTalking.xpm") - ("\\(:-*d\\)\\W" 1 "FaceTasty.xpm") - ("[^^;_]\\(;-*[>)}(I;(B]+\\)\\W" 1 "FaceWinking.xpm") - ("\\(:-*[Vv(I5(B]\\)\\W" 1 "FaceWry.xpm") - ("\\([:|]-*P\\)\\W" 1 "FaceYukky.xpm")) - "*Normal and deformed faces for smilies." - :type '(repeat (list regexp - (integer :tag "Match") - (string :tag "Image"))) - :group 'smiley) - -(defcustom smiley-nosey-regexp-alist - '(("\\(:-+[<(I+(B]+\\)\\W" 1 "FaceAngry.xpm") - ("\\(:-+\\]+\\)\\W" 1 "FaceGoofy.xpm") - ("\\(:-+D\\)\\W" 1 "FaceGrinning.xpm") - ("\\(:-+[}(I;(B]+\\)\\W" 1 "FaceHappy.xpm") - ("\\(:-*)+\\)\\W" 1 "FaceHappy.xpm") - ("\\(=[)]+\\)\\W" 1 "FaceHappy.xpm") - ("\\(:-+[/\\\"]+\\)\\W" 1 "FaceIronic.xpm") - ("\\([8|]-+[|Oo%]\\)\\W" 1 "FaceKOed.xpm") - ("\\([:|]-+#+\\)\\W" 1 "FaceNyah.xpm") - ("\\(:-+[({]+\\)\\W" 1 "FaceSad.xpm") - ("\\(=[({]+\\)\\W" 1 "FaceSad.xpm") - ("\\(:-+[Oo\*]\\)\\W" 1 "FaceStartled.xpm") - ("\\(:-+|\\)\\W" 1 "FaceStraight.xpm") - ("\\(:-+p\\)\\W" 1 "FaceTalking.xpm") - ("\\(:-+d\\)\\W" 1 "FaceTasty.xpm") - ("\\(;-+[>)}(I;(B]+\\)\\W" 1 "FaceWinking.xpm") - ("\\(:-+[Vv(I5(B]\\)\\W" 1 "FaceWry.xpm") - ("\\(][:8B]-[)>]\\)\\W" 1 "FaceDevilish.xpm") - ("\\([:|]-+P\\)\\W" 1 "FaceYukky.xpm")) - "*Smileys with noses. These get less false matches." - :type '(repeat (list regexp - (integer :tag "Match") - (string :tag "Image"))) - :group 'smiley) - -(defcustom smiley-regexp-alist smiley-deformed-regexp-alist - "*A list of regexps to map smilies to real images. -Defaults to the contents of `smiley-deformed-regexp-alist'. -An alternative is `smiley-nosey-regexp-alist' that matches less -aggressively. -If this is a symbol, take its value." - :type '(radio (variable-item smiley-deformed-regexp-alist) - (variable-item smiley-nosey-regexp-alist) - symbol - (repeat (list regexp - (integer :tag "Match") - (string :tag "Image")))) - :group 'smiley) - -(defcustom smiley-flesh-color "yellow" - "*Flesh color." - :type 'string - :group 'smiley) - -(defcustom smiley-features-color "black" - "*Features color." - :type 'string - :group 'smiley) - -(defcustom smiley-tongue-color "red" - "*Tongue color." - :type 'string - :group 'smiley) - -(defcustom smiley-circle-color "black" - "*Circle color." - :type 'string - :group 'smiley) - -(defcustom smiley-mouse-face 'highlight - "*Face used for mouse highlighting in the smiley buffer. - -Smiley buttons will be displayed in this face when the cursor is -above them." - :type 'face - :group 'smiley) - -(defvar smiley-glyph-cache nil) - -(defvar smiley-map (make-sparse-keymap "smiley-keys") - "Keymap to toggle smiley states.") - -(define-key smiley-map [(button2)] 'smiley-toggle-extent) -(define-key smiley-map [(button3)] 'smiley-popup-menu) - -(defun smiley-popup-menu (e) - (interactive "e") - (popup-menu - `("Smilies" - ["Toggle This Smiley" (smiley-toggle-extent ,e) t] - ["Toggle All Smilies" (smiley-toggle-extents ,e) t]))) - -(defun smiley-create-glyph (smiley pixmap) - (or - (cdr-safe (assoc pixmap smiley-glyph-cache)) - (let* ((xpm-color-symbols - (and (featurep 'xpm) - (append `(("flesh" ,smiley-flesh-color) - ("features" ,smiley-features-color) - ("tongue" ,smiley-tongue-color)) - xpm-color-symbols))) - (glyph (make-glyph - (list - (cons (if (featurep 'gtk) 'gtk 'x) - (expand-file-name pixmap smiley-data-directory)) - (cons 'mswindows - (expand-file-name pixmap smiley-data-directory)) - (cons 'tty smiley))))) - (setq smiley-glyph-cache (cons (cons pixmap glyph) smiley-glyph-cache)) - (set-glyph-face glyph 'default) - glyph))) - -(defun smiley-create-glyph-ems (smiley pixmap) - (condition-case e - (create-image (expand-file-name pixmap smiley-data-directory)) - (error nil))) - - -;;;###autoload -(defun smiley-region (beg end) - "Smilify the region between point and mark." - (interactive "r") - (smiley-buffer (current-buffer) beg end)) - -(defun smiley-toggle-extent (event) - "Toggle smiley at given point." - (interactive "e") - (let* ((ant (event-glyph-extent event)) - (pt (event-closest-point event)) - ext) - (if (annotationp ant) - (when (extentp (setq ext (extent-property ant 'smiley-extent))) - (set-extent-property ext 'invisible nil) - (hide-annotation ant)) - (when pt - (while (setq ext (extent-at pt (event-buffer event) nil ext 'at)) - (when (annotationp (setq ant - (extent-property ext 'smiley-annotation))) - (reveal-annotation ant) - (set-extent-property ext 'invisible t))))))) - -;; FIXME:: -(defun smiley-toggle-extent-ems (event) - "Toggle smiley at given point. -Note -- this function hasn't been implemented yet." - (interactive "e") - (error "This function hasn't been implemented yet")) - -(defun smiley-toggle-extents (e) - (interactive "e") - (map-extents - (lambda (e void) - (let (ant) - (if (annotationp (setq ant (extent-property e 'smiley-annotation))) - (if (eq (extent-property e 'invisible) nil) - (progn - (reveal-annotation ant) - (set-extent-property e 'invisible t) - ) - (hide-annotation ant) - (set-extent-property e 'invisible nil))) - nil)) - (event-buffer e))) - -;; FIXME:: -(defun smiley-toggle-extents-ems (e) - (interactive "e") - (error "This function hasn't been implemented yet")) - -;;;###autoload -(defun smiley-buffer (&optional buffer st nd) - (interactive) - (when (featurep '(or x gtk mswindows)) - (save-excursion - (when buffer - (set-buffer buffer)) - (let ((buffer-read-only nil) - (alist (if (symbolp smiley-regexp-alist) - (symbol-value smiley-regexp-alist) - smiley-regexp-alist)) - (case-fold-search nil) - entry regexp beg group file) - (map-extents - (lambda (e void) - (when (or (extent-property e 'smiley-extent) - (extent-property e 'smiley-annotation)) - (delete-extent e))) - buffer st nd) - (goto-char (or st (point-min))) - (setq beg (point)) - ;; loop through alist - (while (setq entry (pop alist)) - (setq regexp (car entry) - group (cadr entry) - file (caddr entry)) - (goto-char beg) - (while (re-search-forward regexp nd t) - (let* ((start (match-beginning group)) - (end (match-end group)) - (glyph (smiley-create-glyph (buffer-substring start end) - file))) - (when glyph - (mapcar 'delete-annotation (annotations-at end)) - (let ((ext (make-extent start end)) - (ant (make-annotation glyph end 'text))) - ;; set text extent params - (set-extent-property ext 'end-open t) - (set-extent-property ext 'start-open t) - (set-extent-property ext 'invisible t) - (set-extent-property ext 'keymap smiley-map) - (set-extent-property ext 'mouse-face smiley-mouse-face) - (set-extent-property ext 'intangible t) - ;; set annotation params - (set-extent-property ant 'mouse-face smiley-mouse-face) - (set-extent-property ant 'keymap smiley-map) - ;; remember each other - (set-extent-property ant 'smiley-extent ext) - (set-extent-property ext 'smiley-annotation ant) - ;; Help - (set-extent-property - ext 'help-echo - "button2 toggles smiley, button3 pops up menu") - (set-extent-property - ant 'help-echo - "button2 toggles smiley, button3 pops up menu") - (set-extent-property ext 'balloon-help - "Mouse button2 - toggle smiley -Mouse button3 - menu") - (set-extent-property ant 'balloon-help - "Mouse button2 - toggle smiley -Mouse button3 - menu")) - (when (smiley-end-paren-p start end) - (make-annotation ")" end 'text)) - (goto-char end))))))))) - -;; FIXME: No popup menu, no customized color -(defun smiley-buffer-ems (&optional buffer st nd) - (interactive) - (when window-system - (save-excursion - (when buffer - (set-buffer buffer)) - (let ((buffer-read-only nil) - (alist (if (symbolp smiley-regexp-alist) - (symbol-value smiley-regexp-alist) - smiley-regexp-alist)) - (case-fold-search nil) - entry regexp beg group file) - (dolist (overlay (overlays-in (or st (point-min)) - (or nd (point-max)))) - (when (overlay-get overlay 'smiley) - (remove-text-properties (overlay-start overlay) - (overlay-end overlay) '(display)) - (delete-overlay overlay))) - (goto-char (or st (point-min))) - (setq beg (point)) - ;; loop through alist - (while (setq entry (pop alist)) - (setq regexp (car entry) - group (cadr entry) - file (caddr entry)) - (goto-char beg) - (while (re-search-forward regexp nd t) - (let* ((start (match-beginning group)) - (end (match-end group)) - (glyph (smiley-create-glyph nil file)) - (overlay (make-overlay start end))) - (when glyph - (add-text-properties start end - `(display ,glyph)) - (overlay-put overlay 'smiley glyph) - (goto-char end))))))))) - -(defun smiley-end-paren-p (start end) - "Try to guess whether the current smiley is an end-paren smiley." - (save-excursion - (goto-char start) - (when (and (re-search-backward "[()]" nil t) - (eq (char-after) ?\() - (goto-char end) - (or (not (re-search-forward "[()]" nil t)) - (eq (char-after (1- (point))) ?\())) - t))) - -(defun smiley-toggle-buffer (&optional arg buffer st nd) - "Toggle displaying smiley faces. -With arg, turn displaying on if and only if arg is positive." - (interactive "P") - (let (on off) - (map-extents - (lambda (e void) - (let (ant) - (if (annotationp (setq ant (extent-property e 'smiley-annotation))) - (if (eq (extent-property e 'invisible) nil) - (setq off (cons (cons ant e) off)) - (setq on (cons (cons ant e) on))))) - nil) - buffer st nd) - (if (and (not (and (numberp arg) (< arg 0))) - (or (and (numberp arg) (> arg 0)) - (null on))) - (if off - (while off - (reveal-annotation (caar off)) - (set-extent-property (cdar off) 'invisible t) - (setq off (cdr off))) - (smiley-buffer)) - (while on - (hide-annotation (caar on)) - (set-extent-property (cdar on) 'invisible nil) - (setq on (cdr on)))))) - -;; Simply removing all smiley if existing. -;; FIXME: make it work as the one in XEmacs. -(defun smiley-toggle-buffer-ems (&optional arg buffer st nd) - "Toggle displaying smiley faces. -With arg, turn displaying on if and only if arg is positive." - (interactive "P") - (save-excursion - (when buffer - (set-buffer buffer)) - (let (found) - (dolist (overlay (overlays-in (or st (point-min)) - (or nd (point-max)))) - (when (overlay-get overlay 'smiley) - (remove-text-properties (overlay-start overlay) - (overlay-end overlay) '(display)) - (setq found t))) - (unless found - (smiley-buffer buffer st nd))))) - -(unless (featurep 'xemacs) - (defalias 'smiley-create-glyph 'smiley-create-glyph-ems) - (defalias 'smiley-toggle-extent 'smiley-toggle-extent-ems) - (defalias 'smiley-toggle-extents 'smiley-toggle-extents-ems) - (defalias 'smiley-buffer 'smiley-buffer-ems) - (defalias 'smiley-toggle-buffer 'smiley-toggle-buffer-ems)) - -(defvar gnus-article-buffer) -;;;###autoload -(defun gnus-smiley-display (&optional arg) - "Display \"smileys\" as small graphical icons. -With arg, turn displaying on if and only if arg is positive." - (interactive "P") - (save-excursion - (article-goto-body) - (let (buffer-read-only) - (smiley-toggle-buffer arg (current-buffer) (point) (point-max))))) - -(provide 'smiley) - -;; Local Variables: -;; coding: iso-8859-1 -;; End: - -;;; smiley.el ends here diff --git a/lisp/smime.el b/lisp/smime.el deleted file mode 100644 index 9146963..0000000 --- a/lisp/smime.el +++ /dev/null @@ -1,597 +0,0 @@ -;;; smime.el --- S/MIME support library -;; Copyright (c) 2000, 2001 Free Software Foundation, Inc. - -;; Author: Simon Josefsson -;; Keywords: SMIME X.509 PEM OpenSSL - -;; This file is not a part of GNU Emacs, but the same permissions apply. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;; This library perform S/MIME operations from within Emacs. -;; -;; Functions for fetching certificates from public repositories are -;; provided, currently only from DNS. LDAP support (via EUDC) is planned. -;; -;; It uses OpenSSL (tested with version 0.9.5a and 0.9.6) for signing, -;; encryption and decryption. -;; -;; Some general knowledge of S/MIME, X.509, PKCS#12, PEM etc is -;; probably required to use this library in any useful way. -;; Especially, don't expect this library to buy security for you. If -;; you don't understand what you are doing, you're as likely to lose -;; security than gain any by using this library. -;; -;; This library is not intended to provide a "raw" API for S/MIME, -;; PKCSx or similar, it's intended to perform common operations -;; done on messages encoded in these formats. The terminology chosen -;; reflect this. - -;;; Quick introduction: - -;; Get your S/MIME certificate from VeriSign or someplace. I used -;; Netscape to generate the key and certificate request and stuff, and -;; Netscape can export the key into PKCS#12 format. -;; -;; Enter OpenSSL. To be able to use this library, it need to have the -;; SMIME key readable in PEM format. OpenSSL is used to convert the -;; key: -;; -;; $ openssl pkcs12 -in mykey.p12 -clcerts -nodes > mykey.pem -;; ... -;; -;; Now, use M-x customize-variable smime-keys and add mykey.pem as -;; a key. -;; -;; Now you should be able to sign messages! Create a buffer and write -;; something and run M-x smime-sign-buffer RET RET and you should see -;; your message MIME armoured and a signature. Encryption, M-x -;; smime-encrypt-buffer, should also work. -;; -;; To be able to verify messages you need to build up trust with -;; someone. Perhaps you trust the CA that issued your certificate, at -;; least I did, so I export it's certificates from my PKCS#12 -;; certificate with: -;; -;; $ openssl pkcs12 -in mykey.p12 -cacerts -nodes > cacert.pem -;; ... -;; -;; Now, use M-x customize-variable smime-CAs and add cacert.pem as a -;; CA certificate. -;; -;; You should now be able to sign messages, and even verify messages -;; sent by others that use the same CA as you. - -;; Bugs: -;; -;; Don't complain that this package doesn't do encrypted PEM files, -;; submit a patch instead. I store my keys in a safe place, so I -;; didn't need the encryption. Also, programming was made easier by -;; that decision. One might think that this even influenced were I -;; store my keys, and one would probably be right. :-) -;; -;; Update: Mathias Herberts sent the patch. However, it uses -;; environment variables to pass the password to OpenSSL, which is -;; slightly insecure. Hence a new todo: use a better -passin method. -;; -;; Cache password for e.g. 1h -;; -;; Suggestions and comments are appreciated, mail me at simon@josefsson.org. - -;; -;; -;; I would include pointers to introductory text on concepts used in -;; this library here, but the material I've read are so horrible I -;; don't want to recomend them. -;; -;; Why can't someone write a simple introduction to all this stuff? -;; Until then, much of this resemble security by obscurity. -;; -;; Also, I'm not going to mention anything about the wonders of -;; cryptopolitics. Oops, I just did. -;; -;; - -;;; Revision history: - -;; version 0 not released - -;;; Code: - -(require 'dig) -(require 'comint) -(eval-when-compile (require 'cl)) - -(defgroup smime nil - "S/MIME configuration.") - -(defcustom smime-keys nil - "*Map mail addresses to a file containing Certificate (and private key). -The file is assumed to be in PEM format. You can also associate additional -certificates to be sent with every message to each address." - :type '(repeat (list (string :tag "Mail address") - (file :tag "File name") - (repeat :tag "Additional certificate files" - (file :tag "File name")))) - :group 'smime) - -(defcustom smime-CA-directory nil - "*Directory containing certificates for CAs you trust. -Directory should contain files (in PEM format) named to the X.509 -hash of the certificate. This can be done using OpenSSL such as: - -$ ln -s ca.pem `openssl x509 -noout -hash -in ca.pem` - -where `ca.pem' is the file containing a PEM encoded X.509 CA -certificate." - :type '(choice (const :tag "none" nil) - directory) - :group 'smime) - -(defcustom smime-CA-file nil - "*Files containing certificates for CAs you trust. -File should contain certificates in PEM format." - :type '(choice (const :tag "none" nil) - file) - :group 'smime) - -(defcustom smime-certificate-directory "~/Mail/certs/" - "*Directory containing other people's certificates. -It should contain files named to the X.509 hash of the certificate, -and the files themself should be in PEM format." -;The S/MIME library provide simple functionality for fetching -;certificates into this directory, so there is no need to populate it -;manually. - :type 'directory - :group 'smime) - -(defcustom smime-openssl-program - (and (condition-case () - (eq 0 (call-process "openssl" nil nil nil "version")) - (error nil)) - "openssl") - "*Name of OpenSSL binary." - :type 'string - :group 'smime) - -;; OpenSSL option to select the encryption cipher - -(defcustom smime-encrypt-cipher "-des3" - "*Cipher algorithm used for encryption." - :type '(choice (const :tag "Triple DES" "-des3") - (const :tag "DES" "-des") - (const :tag "RC2 40 bits" "-rc2-40") - (const :tag "RC2 64 bits" "-rc2-64") - (const :tag "RC2 128 bits" "-rc2-128")) - :group 'smime) - -(defcustom smime-dns-server nil - "*DNS server to query certificates from. -If nil, use system defaults." - :type '(choice (const :tag "System defaults") - string) - :group 'smime) - -(defvar smime-details-buffer "*OpenSSL output*") - -(eval-and-compile - (defalias 'smime-make-temp-file - (if (fboundp 'make-temp-file) - 'make-temp-file - (lambda (prefix &optional dir-flag) ;; Simple implementation - (expand-file-name - (make-temp-name prefix) - temporary-file-directory))))) - -;; Password dialog function - -(defun smime-ask-passphrase () - "Asks the passphrase to unlock the secret key." - (let ((passphrase - (comint-read-noecho - "Passphrase for secret key (RET for no passphrase): " t))) - (if (string= passphrase "") - nil - passphrase))) - -;; OpenSSL wrappers. - -(defun smime-call-openssl-region (b e buf &rest args) - (case (apply 'call-process-region b e smime-openssl-program nil buf nil args) - (0 t) - (1 (message "OpenSSL: An error occurred parsing the command options.") nil) - (2 (message "OpenSSL: One of the input files could not be read.") nil) - (3 (message "OpenSSL: An error occurred creating the PKCS#7 file or when reading the MIME message.") nil) - (4 (message "OpenSSL: An error occurred decrypting or verifying the message.") nil) - (t (error "Unknown OpenSSL exitcode") nil))) - -(defun smime-make-certfiles (certfiles) - (if certfiles - (append (list "-certfile" (expand-file-name (car certfiles))) - (smime-make-certfiles (cdr certfiles))))) - -;; Sign+encrypt region - -(defun smime-sign-region (b e keyfiles) - "Sign region with certified key in KEYFILES. -If signing fails, the buffer is not modified. Region is assumed to -have proper MIME tags. KEYFILES is expected to contain a PEM encoded -private key and certificate as its car, and a list of additional certificates -to include in its caar." - (smime-new-details-buffer) - (let ((keyfile (car keyfiles)) - (certfiles (and (cdr keyfiles) (cadr keyfiles))) - (buffer (generate-new-buffer (generate-new-buffer-name " *smime*"))) - (passphrase (smime-ask-passphrase)) - (tmpfile (smime-make-temp-file "smime"))) - (if passphrase - (setenv "GNUS_SMIME_PASSPHRASE" passphrase)) - (prog1 - (when (prog1 - (apply 'smime-call-openssl-region b e (list buffer tmpfile) - "smime" "-sign" "-signer" (expand-file-name keyfile) - (append - (smime-make-certfiles certfiles) - (if passphrase - (list "-passin" "env:GNUS_SMIME_PASSPHRASE")))) - (if passphrase - (setenv "GNUS_SMIME_PASSPHRASE" "" t)) - (with-current-buffer smime-details-buffer - (insert-file-contents tmpfile) - (delete-file tmpfile))) - (delete-region b e) - (insert-buffer-substring buffer) - (goto-char b) - (when (looking-at "^MIME-Version: 1.0$") - (delete-region (point) (progn (forward-line 1) (point)))) - t) - (with-current-buffer smime-details-buffer - (goto-char (point-max)) - (insert-buffer-substring buffer)) - (kill-buffer buffer)))) - -(defun smime-encrypt-region (b e certfiles) - "Encrypt region for recipients specified in CERTFILES. -If encryption fails, the buffer is not modified. Region is assumed to -have proper MIME tags. CERTFILES is a list of filenames, each file -is expected to contain of a PEM encoded certificate." - (smime-new-details-buffer) - (let ((buffer (generate-new-buffer (generate-new-buffer-name " *smime*"))) - (tmpfile (smime-make-temp-file "smime"))) - (prog1 - (when (prog1 - (apply 'smime-call-openssl-region b e (list buffer tmpfile) - "smime" "-encrypt" smime-encrypt-cipher - (mapcar 'expand-file-name certfiles)) - (with-current-buffer smime-details-buffer - (insert-file-contents tmpfile) - (delete-file tmpfile))) - (delete-region b e) - (insert-buffer-substring buffer) - (goto-char b) - (when (looking-at "^MIME-Version: 1.0$") - (delete-region (point) (progn (forward-line 1) (point)))) - t) - (with-current-buffer smime-details-buffer - (goto-char (point-max)) - (insert-buffer-substring buffer)) - (kill-buffer buffer)))) - -;; Sign+encrypt buffer - -(defun smime-sign-buffer (&optional keyfile buffer) - "S/MIME sign BUFFER with key in KEYFILE. -KEYFILE should contain a PEM encoded key and certificate." - (interactive) - (with-current-buffer (or buffer (current-buffer)) - (smime-sign-region - (point-min) (point-max) - (if keyfile - (list keyfile (smime-get-certfiles keyfile smime-keys)) - (smime-get-key-by-email - (completing-read "Sign using which signature? " smime-keys nil nil - (and (listp (car-safe smime-keys)) - (cdr smime-keys)))))))) - -(defun smime-encrypt-buffer (&optional certfiles buffer) - "S/MIME encrypt BUFFER for recipients specified in CERTFILES. -CERTFILES is a list of filenames, each file is expected to consist of -a PEM encoded key and certificate. Uses current buffer if BUFFER is -nil." - (interactive) - (with-current-buffer (or buffer (current-buffer)) - (smime-encrypt-region - (point-min) (point-max) - (or certfiles - (list (read-file-name "Recipient's S/MIME certificate: " - smime-certificate-directory nil)))))) - -;; Verify+decrypt region - -(defun smime-verify-region (b e) - "Verify S/MIME message in region between B and E. -Returns non-nil on success. -Any details (stdout and stderr) are left in the buffer specified by -`smime-details-buffer'." - (smime-new-details-buffer) - (let ((CAs (append (if smime-CA-file - (list "-CAfile" - (expand-file-name smime-CA-file))) - (if smime-CA-directory - (list "-CApath" - (expand-file-name smime-CA-directory)))))) - (unless CAs - (error "No CA configured")) - (if (apply 'smime-call-openssl-region b e (list smime-details-buffer t) - "smime" "-verify" "-out" "/dev/null" CAs) - t - (insert-buffer-substring smime-details-buffer) - nil))) - -(defun smime-noverify-region (b e) - "Verify integrity of S/MIME message in region between B and E. -Returns non-nil on success. -Any details (stdout and stderr) are left in the buffer specified by -`smime-details-buffer'." - (smime-new-details-buffer) - (if (apply 'smime-call-openssl-region b e (list smime-details-buffer t) - "smime" "-verify" "-noverify" "-out" '("/dev/null")) - t - (insert-buffer-substring smime-details-buffer) - nil)) - -(defun smime-decrypt-region (b e keyfile) - "Decrypt S/MIME message in region between B and E with key in KEYFILE. -On success, replaces region with decrypted data and return non-nil. -Any details (stderr on success, stdout and stderr on error) are left -in the buffer specified by `smime-details-buffer'." - (smime-new-details-buffer) - (let ((buffer (generate-new-buffer (generate-new-buffer-name " *smime*"))) - CAs (passphrase (smime-ask-passphrase)) - (tmpfile (smime-make-temp-file "smime"))) - (if passphrase - (setenv "GNUS_SMIME_PASSPHRASE" passphrase)) - (if (prog1 - (apply 'smime-call-openssl-region b e - (list buffer tmpfile) - "smime" "-decrypt" "-recip" (expand-file-name keyfile) - (if passphrase - (list "-passin" "env:GNUS_SMIME_PASSPHRASE"))) - (if passphrase - (setenv "GNUS_SMIME_PASSPHRASE" "" t)) - (with-current-buffer smime-details-buffer - (insert-file-contents tmpfile) - (delete-file tmpfile))) - (progn - (delete-region b e) - (insert-buffer-substring buffer) - (kill-buffer buffer) - t) - (with-current-buffer smime-details-buffer - (insert-buffer-substring buffer)) - (kill-buffer buffer) - (delete-region b e) - (insert-buffer-substring smime-details-buffer) - nil))) - -;; Verify+Decrypt buffer - -(defun smime-verify-buffer (&optional buffer) - "Verify integrity of S/MIME message in BUFFER. -Uses current buffer if BUFFER is nil. Returns non-nil on success. -Any details (stdout and stderr) are left in the buffer specified by -`smime-details-buffer'." - (interactive) - (with-current-buffer (or buffer (current-buffer)) - (smime-verify-region (point-min) (point-max)))) - -(defun smime-noverify-buffer (&optional buffer) - "Verify integrity of S/MIME message in BUFFER. -Does NOT verify validity of certificate (only message integrity). -Uses current buffer if BUFFER is nil. Returns non-nil on success. -Any details (stdout and stderr) are left in the buffer specified by -`smime-details-buffer'." - (interactive) - (with-current-buffer (or buffer (current-buffer)) - (smime-noverify-region (point-min) (point-max)))) - -(defun smime-decrypt-buffer (&optional buffer keyfile) - "Decrypt S/MIME message in BUFFER using KEYFILE. -Uses current buffer if BUFFER is nil, and query user of KEYFILE if it's nil. -On success, replaces data in buffer and return non-nil. -Any details (stderr on success, stdout and stderr on error) are left -in the buffer specified by `smime-details-buffer'." - (interactive) - (with-current-buffer (or buffer (current-buffer)) - (smime-decrypt-region - (point-min) (point-max) - (expand-file-name - (or keyfile - (smime-get-key-by-email - (completing-read "Decrypt with which key? " smime-keys nil nil - (and (listp (car-safe smime-keys)) - (caar smime-keys))))))))) - -;; Various operations - -(defun smime-new-details-buffer () - (with-current-buffer (get-buffer-create smime-details-buffer) - (erase-buffer))) - -(defun smime-pkcs7-region (b e) - "Convert S/MIME message between points B and E into a PKCS7 message." - (smime-new-details-buffer) - (when (smime-call-openssl-region b e smime-details-buffer "smime" "-pk7out") - (delete-region b e) - (insert-buffer-substring smime-details-buffer) - t)) - -(defun smime-pkcs7-certificates-region (b e) - "Extract any certificates enclosed in PKCS7 message between points B and E." - (smime-new-details-buffer) - (when (smime-call-openssl-region - b e smime-details-buffer "pkcs7" "-print_certs" "-text") - (delete-region b e) - (insert-buffer-substring smime-details-buffer) - t)) - -(defun smime-pkcs7-email-region (b e) - "Get email addresses contained in certificate between points B and E. -A string or a list of strings is returned." - (smime-new-details-buffer) - (when (smime-call-openssl-region - b e smime-details-buffer "x509" "-email" "-noout") - (delete-region b e) - (insert-buffer-substring smime-details-buffer) - t)) - -;; Utility functions - -(defun smime-get-certfiles (keyfile keys) - (if keys - (let ((curkey (car keys)) - (otherkeys (cdr keys))) - (if (string= keyfile (cadr curkey)) - (caddr curkey) - (smime-get-certfiles keyfile otherkeys))))) - -(eval-and-compile - (defalias 'smime-point-at-eol - (if (fboundp 'point-at-eol) - 'point-at-eol - 'line-end-position))) - -(defun smime-buffer-as-string-region (b e) - "Return each line in region between B and E as a list of strings." - (save-excursion - (goto-char b) - (let (res) - (while (< (point) e) - (let ((str (buffer-substring (point) (smime-point-at-eol)))) - (unless (string= "" str) - (push str res))) - (forward-line)) - res))) - -;; Find certificates - -(defun smime-mail-to-domain (mailaddr) - (if (string-match "@" mailaddr) - (replace-match "." 'fixedcase 'literal mailaddr) - mailaddr)) - -(defun smime-cert-by-dns (mail) - (let* ((dig-dns-server smime-dns-server) - (digbuf (dig-invoke (smime-mail-to-domain mail) "cert" nil nil "+vc")) - (retbuf (generate-new-buffer (format "*certificate for %s*" mail))) - (certrr (with-current-buffer digbuf - (dig-extract-rr (smime-mail-to-domain mail) "cert"))) - (cert (and certrr (dig-rr-get-pkix-cert certrr)))) - (if cert - (with-current-buffer retbuf - (insert "-----BEGIN CERTIFICATE-----\n") - (let ((i 0) (len (length cert))) - (while (> (- len 64) i) - (insert (substring cert i (+ i 64)) "\n") - (setq i (+ i 64))) - (insert (substring cert i len) "\n")) - (insert "-----END CERTIFICATE-----\n")) - (kill-buffer retbuf) - (setq retbuf nil)) - (kill-buffer digbuf) - retbuf)) - -;; User interface. - -(defvar smime-buffer "*SMIME*") - -(defvar smime-mode-map nil) -(put 'smime-mode 'mode-class 'special) - -(unless smime-mode-map - (setq smime-mode-map (make-sparse-keymap)) - (suppress-keymap smime-mode-map) - - (define-key smime-mode-map "q" 'smime-exit) - (define-key smime-mode-map "f" 'smime-certificate-info)) - -(defun smime-mode () - "Major mode for browsing, viewing and fetching certificates. - -All normal editing commands are switched off. -\\ - -The following commands are available: - -\\{smime-mode-map}" - (interactive) - (kill-all-local-variables) - (setq major-mode 'smime-mode) - (setq mode-name "SMIME") - (setq mode-line-process nil) - (use-local-map smime-mode-map) - (buffer-disable-undo) - (setq truncate-lines t) - (setq buffer-read-only t)) - -(defun smime-certificate-info (certfile) - (interactive "fCertificate file: ") - (let ((buffer (get-buffer-create (format "*certificate %s*" certfile)))) - (switch-to-buffer buffer) - (erase-buffer) - (call-process smime-openssl-program nil buffer 'display - "x509" "-in" (expand-file-name certfile) "-text") - (fundamental-mode) - (set-buffer-modified-p nil) - (toggle-read-only t) - (goto-char (point-min)))) - -(defun smime-draw-buffer () - (with-current-buffer smime-buffer - (let (buffer-read-only) - (erase-buffer) - (insert "\nYour keys:\n") - (dolist (key smime-keys) - (insert - (format "\t\t%s: %s\n" (car key) (cadr key)))) - (insert "\nTrusted Certificate Authoritys:\n") - (insert "\nKnown Certificates:\n")))) - -(defun smime () - "Go to the SMIME buffer." - (interactive) - (unless (get-buffer smime-buffer) - (save-excursion - (set-buffer (get-buffer-create smime-buffer)) - (smime-mode))) - (smime-draw-buffer) - (switch-to-buffer smime-buffer)) - -(defun smime-exit () - "Quit the S/MIME buffer." - (interactive) - (kill-buffer (current-buffer))) - -;; Other functions - -(defun smime-get-key-by-email (email) - (cadr (assoc email smime-keys))) - -(provide 'smime) - -;;; smime.el ends here diff --git a/lisp/starttls.el b/lisp/starttls.el deleted file mode 100644 index 3c65e5d..0000000 --- a/lisp/starttls.el +++ /dev/null @@ -1,82 +0,0 @@ -;;; starttls.el --- STARTTLS functions - -;; Copyright (C) 1999, 2000 Free Software Foundation, Inc. - -;; Author: Daiki Ueno -;; Created: 1999/11/20 -;; Keywords: TLS, SSL, OpenSSL, mail, news - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;; This module defines some utility functions for STARTTLS profiles. - -;; [RFC 2595] "Using TLS with IMAP, POP3 and ACAP" -;; by Chris Newman (1999/06) - -;;; Code: - -(defgroup starttls nil - "Support for `Transport Layer Security' protocol." - :version "21.1" - :group 'mail) - -(defcustom starttls-program "starttls" - "The program to run in a subprocess to open an TLSv1 connection." - :type 'string - :group 'starttls) - -(defcustom starttls-extra-args nil - "Extra arguments to `starttls-program'." - :type '(repeat string) - :group 'starttls) - -(defun starttls-negotiate (process) - (signal-process (process-id process) 'SIGALRM)) - -(defun starttls-open-stream (name buffer host service) - "Open a TLS connection for a service to a host. -Returns a subprocess-object to represent the connection. -Input and output work as for subprocesses; `delete-process' closes it. -Args are NAME BUFFER HOST SERVICE. -NAME is name for process. It is modified if necessary to make it unique. -BUFFER is the buffer (or `buffer-name') to associate with the process. - Process output goes at end of that buffer, unless you specify - an output stream or filter function to handle the output. - BUFFER may be also nil, meaning that this process is not associated - with any buffer -Third arg is name of the host to connect to, or its IP address. -Fourth arg SERVICE is name of the service desired, or an integer -specifying a port number to connect to." - (let* ((process-connection-type nil) - (process (apply #'start-process - name buffer starttls-program - host (format "%s" service) - starttls-extra-args))) - (process-kill-without-query process) - process)) - -(defun starttls-open-ssl-stream (name buffer host service) - (let* ((starttls-extra-args - (cons "--force" starttls-extra-args))) - (starttls-open-stream name buffer host service))) - -(provide 'starttls) - -;;; starttls.el ends here diff --git a/lisp/time-date.el b/lisp/time-date.el deleted file mode 100644 index 771d3b5..0000000 --- a/lisp/time-date.el +++ /dev/null @@ -1,149 +0,0 @@ -;;; time-date.el --- Date and time handling functions -;; Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. - -;; Author: Lars Magne Ingebrigtsen -;; Masanobu Umeda -;; Keywords: mail news util - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; Code: - -(eval-when-compile (require 'cl)) - -(require 'parse-time) - -(autoload 'timezone-make-date-arpa-standard "timezone") - -;;;###autoload -(defun date-to-time (date) - "Convert DATE into time." - (condition-case () - (apply 'encode-time - (parse-time-string - ;; `parse-time-string' isn't sufficiently general or - ;; robust. It fails to grok some of the formats that - ;; timzeone does (e.g. dodgy post-2000 stuff from some - ;; Elms) and either fails or returns bogus values. Lars - ;; reverted this change, but that loses non-trivially - ;; often for me. -- fx - (timezone-make-date-arpa-standard date))) - (error (error "Invalid date: %s" date)))) - -(defun time-to-seconds (time) - "Convert TIME to a floating point number." - (+ (* (car time) 65536.0) - (cadr time) - (/ (or (nth 2 time) 0) 1000000.0))) - -(defun seconds-to-time (seconds) - "Convert SECONDS (a floating point number) to an Emacs time structure." - (list (floor seconds 65536) - (floor (mod seconds 65536)) - (floor (* (- seconds (ffloor seconds)) 1000000)))) - -(defun time-less-p (t1 t2) - "Say whether time T1 is less than time T2." - (or (< (car t1) (car t2)) - (and (= (car t1) (car t2)) - (< (nth 1 t1) (nth 1 t2))))) - -(defun days-to-time (days) - "Convert DAYS into time." - (let* ((seconds (* 1.0 days 60 60 24)) - (rest (expt 2 16)) - (ms (condition-case nil (floor (/ seconds rest)) - (range-error (expt 2 16))))) - (list ms (condition-case nil (round (- seconds (* ms rest))) - (range-error (expt 2 16)))))) - -(defun time-since (time) - "Return the time since TIME, which is either an internal time or a date." - (when (stringp time) - ;; Convert date strings to internal time. - (setq time (date-to-time time))) - (let* ((current (current-time)) - (rest (when (< (nth 1 current) (nth 1 time)) - (expt 2 16)))) - (list (- (+ (car current) (if rest -1 0)) (car time)) - (- (+ (or rest 0) (nth 1 current)) (nth 1 time))))) - -(defun subtract-time (t1 t2) - "Subtract two internal times." - (let ((borrow (< (cadr t1) (cadr t2)))) - (list (- (car t1) (car t2) (if borrow 1 0)) - (- (+ (if borrow 65536 0) (cadr t1)) (cadr t2))))) - -(defun date-to-day (date) - "Return the number of days between year 1 and DATE." - (time-to-days (date-to-time date))) - -(defun days-between (date1 date2) - "Return the number of days between DATE1 and DATE2." - (- (date-to-day date1) (date-to-day date2))) - -(defun date-leap-year-p (year) - "Return t if YEAR is a leap year." - (or (and (zerop (% year 4)) - (not (zerop (% year 100)))) - (zerop (% year 400)))) - -(defun time-to-day-in-year (time) - "Return the day number within the year of the date month/day/year." - (let* ((tim (decode-time time)) - (month (nth 4 tim)) - (day (nth 3 tim)) - (year (nth 5 tim)) - (day-of-year (+ day (* 31 (1- month))))) - (when (> month 2) - (setq day-of-year (- day-of-year (/ (+ 23 (* 4 month)) 10))) - (when (date-leap-year-p year) - (setq day-of-year (1+ day-of-year)))) - day-of-year)) - -(defun time-to-days (time) - "The number of days between the Gregorian date 0001-12-31bce and TIME. -The Gregorian date Sunday, December 31, 1bce is imaginary." - (let* ((tim (decode-time time)) - (month (nth 4 tim)) - (day (nth 3 tim)) - (year (nth 5 tim))) - (+ (time-to-day-in-year time) ; Days this year - (* 365 (1- year)) ; + Days in prior years - (/ (1- year) 4) ; + Julian leap years - (- (/ (1- year) 100)) ; - century years - (/ (1- year) 400)))) ; + Gregorian leap years - -(defun time-to-number-of-days (time) - "Return the number of days represented by TIME. -The number of days will be returned as a floating point number." - (/ (+ (* 1.0 65536 (car time)) (cadr time)) (* 60 60 24))) - -;;;###autoload -(defun safe-date-to-time (date) - "Parse DATE and return a time structure. -If DATE is malformed, a zero time will be returned." - (condition-case () - (date-to-time date) - (error '(0 0)))) - -(provide 'time-date) - -;;; time-date.el ends here diff --git a/lisp/utf7.el b/lisp/utf7.el deleted file mode 100644 index eea6afe..0000000 --- a/lisp/utf7.el +++ /dev/null @@ -1,180 +0,0 @@ -;;; utf7.el --- UTF-7 encoding/decoding for Emacs -;; Copyright (C) 1999, 2000 Free Software Foundation, Inc. - -;; Author: Jon K Hellan -;; Keywords: mail - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: -;;; UTF-7 - A Mail-Safe Transformation Format of Unicode - RFC 2152 -;;; This is a transformation format of Unicode that contains only 7-bit -;;; ASCII octets and is intended to be readable by humans in the limiting -;;; case that the document consists of characters from the US-ASCII -;;; repertoire. -;;; In short, runs of characters outside US-ASCII are encoded as base64 -;;; inside delimiters. -;;; A variation of UTF-7 is specified in IMAP 4rev1 (RFC 2060) as the way -;;; to represent characters outside US-ASCII in mailbox names in IMAP. -;;; This library supports both variants, but the IMAP variation was the -;;; reason I wrote it. -;;; The routines convert UTF-7 -> UTF-16 (16 bit encoding of Unicode) -;;; -> current character set, and vice versa. -;;; However, until Emacs supports Unicode, the only Emacs character set -;;; supported here is ISO-8859.1, which can trivially be converted to/from -;;; Unicode. -;;; When decoding results in a character outside the Emacs character set, -;;; an error is thrown. It is up to the application to recover. - -;;; Code: - -(require 'base64) -(eval-when-compile (require 'cl)) - -(defvar utf7-direct-encoding-chars " -%'-*,-[]-}" - "Character ranges which do not need escaping in UTF-7.") - -(defvar utf7-imap-direct-encoding-chars - (concat utf7-direct-encoding-chars "+\\~") - "Character ranges which do not need escaping in the IMAP variant of UTF-7.") - -(defsubst utf7-imap-get-pad-length (len modulus) - "Return required length of padding for IMAP modified base64 fragment." - (mod (- len) modulus)) - -(defun utf7-encode-internal (&optional for-imap) - "Encode text in (temporary) buffer as UTF-7. -Use IMAP modification if FOR-IMAP is non-nil." - (let ((start (point-min)) - (end (point-max))) - (narrow-to-region start end) - (goto-char start) - (let ((esc-char (if for-imap ?& ?+)) - (direct-encoding-chars - (if for-imap utf7-imap-direct-encoding-chars - utf7-direct-encoding-chars))) - (while (not (eobp)) - (skip-chars-forward direct-encoding-chars) - (unless (eobp) - (insert esc-char) - (let ((p (point)) - (fc (following-char)) - (run-length - (skip-chars-forward (concat "^" direct-encoding-chars)))) - (if (and (= fc esc-char) - (= run-length 1)) ; Lone esc-char? - (delete-backward-char 1) ; Now there's one too many - (utf7-fragment-encode p (point) for-imap)) - (insert "-"))))))) - -(defun utf7-fragment-encode (start end &optional for-imap) - "Encode text from START to END in buffer as UTF-7 escape fragment. -Use IMAP modification if FOR-IMAP is non-nil." - (save-restriction - (narrow-to-region start end) - (funcall (utf7-get-u16char-converter 'to-utf-16)) - (base64-encode-region start (point-max)) - (goto-char start) - (let ((pm (point-max))) - (when for-imap - (while (search-forward "/" nil t) - (replace-match ","))) - (skip-chars-forward "^= \t\n" pm) - (delete-region (point) pm)))) - -(defun utf7-decode-internal (&optional for-imap) - "Decode UTF-7 text in (temporary) buffer. -Use IMAP modification if FOR-IMAP is non-nil." - (let ((start (point-min)) - (end (point-max))) - (goto-char start) - (let* ((esc-pattern (concat "^" (char-to-string (if for-imap ?& ?+)))) - (base64-chars (concat "A-Za-z0-9+" - (char-to-string (if for-imap ?, ?/))))) - (while (not (eobp)) - (skip-chars-forward esc-pattern) - (unless (eobp) - (forward-char) - (let ((p (point)) - (run-length (skip-chars-forward base64-chars))) - (when (and (not (eobp)) (= (following-char) ?-)) - (delete-char 1)) - (unless (= run-length 0) ; Encoded lone esc-char? - (save-excursion - (utf7-fragment-decode p (point) for-imap) - (goto-char p) - (delete-backward-char 1))))))))) - -(defun utf7-fragment-decode (start end &optional for-imap) - "Decode base64 encoded fragment from START to END of UTF-7 text in buffer. -Use IMAP modification if FOR-IMAP is non-nil." - (save-restriction - (narrow-to-region start end) - (when for-imap - (goto-char start) - (while (search-forward "," nil 'move-to-end) (replace-match "/"))) - (let ((pl (utf7-imap-get-pad-length (- end start) 4))) - (insert (make-string pl ?=)) - (base64-decode-region start (+ end pl))) - (funcall (utf7-get-u16char-converter 'from-utf-16)))) - -(defun utf7-get-u16char-converter (which-way) - "Return a function to convert between UTF-16 and current character set." - ;; Add test to check if we are really Latin-1. - ;; Support other character sets once Emacs groks Unicode. - (if (eq which-way 'to-utf-16) - 'utf7-latin1-u16-char-converter - 'utf7-u16-latin1-char-converter)) - -(defun utf7-latin1-u16-char-converter () - "Convert latin 1 (ISO-8859.1) characters to 16 bit Unicode. -Characters are converted to raw byte pairs in narrowed buffer." - (goto-char (point-min)) - (while (not (eobp)) - (insert 0) - (forward-char))) - -(defun utf7-u16-latin1-char-converter () - "Convert 16 bit Unicode characters to latin 1 (ISO-8859.1). -Characters are in raw byte pairs in narrowed buffer." - (goto-char (point-min)) - (while (not (eobp)) - (if (= 0 (following-char)) - (delete-char 1) - (error "Unable to convert from Unicode")) - (forward-char))) - -(defun utf7-encode (string &optional for-imap) - "Encode UTF-7 STRING. Use IMAP modification if FOR-IMAP is non-nil." - (let ((default-enable-multibyte-characters nil)) - (with-temp-buffer - (insert string) - (utf7-encode-internal for-imap) - (buffer-string)))) - -(defun utf7-decode (string &optional for-imap) - "Decode UTF-7 STRING. Use IMAP modification if FOR-IMAP is non-nil." - (let ((default-enable-multibyte-characters nil)) - (with-temp-buffer - (insert string) - (utf7-decode-internal for-imap) - (buffer-string)))) - -(provide 'utf7) - -;;; utf7.el ends here diff --git a/lisp/uudecode.el b/lisp/uudecode.el deleted file mode 100644 index efd4166..0000000 --- a/lisp/uudecode.el +++ /dev/null @@ -1,221 +0,0 @@ -;;; uudecode.el -- elisp native uudecode - -;; Copyright (c) 1998, 1999, 2000 Free Software Foundation, Inc. - -;; Author: Shenghuo Zhu -;; Keywords: uudecode news - -;; This file is a part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;; Lots of codes are stolen from mm-decode.el, gnus-uu.el and -;; base64.el - -;; This looks as though it could be made rather more efficient for -;; internal working. Encoding could use a lookup table and decoding -;; should presumably use a vector or list buffer for partial results -;; rather than with-current-buffer. -- fx - -;; Only `uudecode-decode-region' should be advertised, and whether or -;; not that uses a program should be customizable, but I guess it's -;; too late now. -- fx - -;;; Code: - -(eval-when-compile (require 'cl)) - -(eval-and-compile - (defalias 'uudecode-char-int - (if (fboundp 'char-int) - 'char-int - 'identity)) - - (if (featurep 'xemacs) - (defalias 'uudecode-insert-char 'insert-char) - (defun uudecode-insert-char (char &optional count ignored buffer) - (if (or (null buffer) (eq buffer (current-buffer))) - (insert-char char count) - (with-current-buffer buffer - (insert-char char count)))))) - -(defcustom uudecode-decoder-program "uudecode" - "*Non-nil value should be a string that names a uu decoder. -The program should expect to read uu data on its standard -input and write the converted data to its standard output." - :type 'string - :group 'gnus-extract) - -(defcustom uudecode-decoder-switches nil - "*List of command line flags passed to `uudecode-decoder-program'." - :group 'gnus-extract - :type '(repeat string)) - -(defconst uudecode-alphabet "\040-\140") - -(defconst uudecode-begin-line "^begin[ \t]+[0-7][0-7][0-7][ \t]+\\(.*\\)$") -(defconst uudecode-end-line "^end[ \t]*$") - -(defconst uudecode-body-line - (let ((i 61) (str "^M")) - (while (> (setq i (1- i)) 0) - (setq str (concat str "[^a-z]"))) - (concat str ".?$"))) - -(defvar uudecode-temporary-file-directory - (cond ((fboundp 'temp-directory) (temp-directory)) - ((boundp 'temporary-file-directory) temporary-file-directory) - ("/tmp"))) - -;;;###autoload -(defun uudecode-decode-region-external (start end &optional file-name) - "Uudecode region between START and END using external program. -If FILE-NAME is non-nil, save the result to FILE-NAME. The program -used is specified by `uudecode-decoder-program'." - (interactive "r\nP") - (let ((cbuf (current-buffer)) tempfile firstline status) - (save-excursion - (goto-char start) - (when (re-search-forward uudecode-begin-line nil t) - (forward-line 1) - (setq firstline (point)) - (cond ((null file-name)) - ((stringp file-name)) - (t - (setq file-name (read-file-name "File to Name:" - nil nil nil - (match-string 1))))) - (setq tempfile (if file-name - (expand-file-name file-name) - (if (fboundp 'make-temp-file) - (let ((temporary-file-directory - uudecode-temporary-file-directory)) - (make-temp-file "uu")) - (expand-file-name - (make-temp-name "uu") - uudecode-temporary-file-directory)))) - (let ((cdir default-directory) - default-process-coding-system) - (unwind-protect - (with-temp-buffer - (insert "begin 600 " (file-name-nondirectory tempfile) "\n") - (insert-buffer-substring cbuf firstline end) - (cd (file-name-directory tempfile)) - (apply 'call-process-region - (point-min) - (point-max) - uudecode-decoder-program - nil - nil - nil - uudecode-decoder-switches)) - (cd cdir) (set-buffer cbuf))) - (if (file-exists-p tempfile) - (unless file-name - (goto-char start) - (delete-region start end) - (let (format-alist) - (insert-file-contents-literally tempfile))) - (message "Can not uudecode"))) - (ignore-errors (or file-name (delete-file tempfile)))))) - -;;;###autoload -(defun uudecode-decode-region (start end &optional file-name) - "Uudecode region between START and END without using an external program. -If FILE-NAME is non-nil, save the result to FILE-NAME." - (interactive "r\nP") - (let ((work-buffer nil) - (done nil) - (counter 0) - (remain 0) - (bits 0) - (lim 0) inputpos - (non-data-chars (concat "^" uudecode-alphabet))) - (unwind-protect - (save-excursion - (goto-char start) - (when (re-search-forward uudecode-begin-line nil t) - (cond ((null file-name)) - ((stringp file-name)) - (t - (setq file-name (expand-file-name - (read-file-name "File to Name:" - nil nil nil - (match-string 1)))))) - (setq work-buffer (generate-new-buffer " *uudecode-work*")) - (forward-line 1) - (skip-chars-forward non-data-chars end) - (while (not done) - (setq inputpos (point)) - (setq remain 0 bits 0 counter 0) - (cond - ((> (skip-chars-forward uudecode-alphabet end) 0) - (setq lim (point)) - (setq remain - (logand (- (uudecode-char-int (char-after inputpos)) 32) - 63)) - (setq inputpos (1+ inputpos)) - (if (= remain 0) (setq done t)) - (while (and (< inputpos lim) (> remain 0)) - (setq bits (+ bits - (logand - (- - (uudecode-char-int (char-after inputpos)) 32) - 63))) - (if (/= counter 0) (setq remain (1- remain))) - (setq counter (1+ counter) - inputpos (1+ inputpos)) - (cond ((= counter 4) - (uudecode-insert-char - (lsh bits -16) 1 nil work-buffer) - (uudecode-insert-char - (logand (lsh bits -8) 255) 1 nil work-buffer) - (uudecode-insert-char (logand bits 255) 1 nil - work-buffer) - (setq bits 0 counter 0)) - (t (setq bits (lsh bits 6))))))) - (cond - (done) - ((> 0 remain) - (error "uucode line ends unexpectly") - (setq done t)) - ((and (= (point) end) (not done)) - ;;(error "uucode ends unexpectly") - (setq done t)) - ((= counter 3) - (uudecode-insert-char (logand (lsh bits -16) 255) 1 nil - work-buffer) - (uudecode-insert-char (logand (lsh bits -8) 255) 1 nil - work-buffer)) - ((= counter 2) - (uudecode-insert-char (logand (lsh bits -10) 255) 1 nil - work-buffer))) - (skip-chars-forward non-data-chars end)) - (if file-name - (save-excursion - (set-buffer work-buffer) - (write-file file-name)) - (or (markerp end) (setq end (set-marker (make-marker) end))) - (goto-char start) - (insert-buffer-substring work-buffer) - (delete-region (point) end)))) - (and work-buffer (kill-buffer work-buffer))))) - -(provide 'uudecode) - -;;; uudecode.el ends here diff --git a/lisp/webmail.el b/lisp/webmail.el deleted file mode 100644 index 0bd06e6..0000000 --- a/lisp/webmail.el +++ /dev/null @@ -1,1192 +0,0 @@ -;;; webmail.el --- interface of web mail -;; Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc. - -;; Author: Shenghuo Zhu -;; Keywords: hotmail netaddress my-deja netscape - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;; Note: Now mail.yahoo.com provides POP3 service, the webmail -;; fetching is not going to be supported. - -;; Note: You need to have `url' and `w3' installed for this backend to -;; work. `w3' must be 4.0pre46+one-line-cookie patch or standalone -;; `url'. - -;; Todo: To support more web mail servers. - -;; Known bugs: -;; 1. Net@ddress may corrupt `X-Face'. - -;; Warning: -;; Webmail is an experimental function, which means NO WARRANTY. - -;;; Code: - -(eval-when-compile (require 'cl)) - -(require 'nnoo) -(require 'message) -(require 'gnus-util) -(require 'gnus) -(require 'nnmail) -(require 'mm-util) -(require 'mml) -(eval-when-compile - (ignore-errors - (require 'w3) - (require 'url) - (require 'url-cookie) - (require 'w3-forms) - (require 'nnweb))) -;; Report failure to find w3 at load time if appropriate. -(eval '(progn - (require 'w3) - (require 'url) - (require 'url-cookie) - (require 'w3-forms) - (require 'nnweb))) - -;;; - -(defvar webmail-type-definition - '((hotmail - ;; Hotmail hate other HTTP user agents and use one line cookie - (paranoid agent cookie post) - (address . "www.hotmail.com") - (open-url "http://www.hotmail.com/") - (open-snarf . webmail-hotmail-open) - ;; W3 hate redirect POST - (login-url - "http://%s/cgi-bin/dologin?login=%s&passwd=%s&enter=Sign+in&sec=no&curmbox=ACTIVE&_lang=&js=yes&id=2&tw=-10000&beta=" - webmail-aux user password) - ;;(login-snarf . webmail-hotmail-login) - ;;(list-url "%s" webmail-aux) - (list-snarf . webmail-hotmail-list) - (article-snarf . webmail-hotmail-article) - (trash-url - "%s&login=%s&f=33792&curmbox=ACTIVE&_lang=&foo=inbox&js=&page=&%s=on&_HMaction=MoveTo&tobox=trAsH&nullbox=" - webmail-aux user id)) - (yahoo - (paranoid agent cookie post) - (address . "mail.yahoo.com") - (open-url "http://mail.yahoo.com/") - (open-snarf . webmail-yahoo-open) - (login-url;; yahoo will not accept GET - content - ("%s" webmail-aux) - ".tries=&.src=ym&.last=&promo=&.intl=&.bypass=&.partner=&.chkP=Y&.done=&login=%s&passwd=%s" - user password) - (login-snarf . webmail-yahoo-login) - (list-url "%s&rb=Inbox&YN=1" webmail-aux) - (list-snarf . webmail-yahoo-list) - (article-snarf . webmail-yahoo-article) - (trash-url - "%s/ym/ShowFolder?YY=52107&inc=50&order=down&sort=date&pos=0&box=Inbox&DEL=Delete&destBox=&Mid=%s&destBox2=" - webmail-aux id)) - (netaddress - (paranoid cookie post) - (address . "www.netaddress.com") - (open-url "http://www.netaddress.com/") - (open-snarf . webmail-netaddress-open) - (login-url - content - ("%s" webmail-aux) - "LoginState=2&SuccessfulLogin=%%2Ftpl&NewServerName=www.netaddress.com&JavaScript=JavaScript1.2&DomainID=4&Domain=usa.net&NA31site=classic.netaddress.com&NA31port=80&UserID=%s&passwd=%s" - user password) - (login-snarf . webmail-netaddress-login) - (list-url - "http://www.netaddress.com/tpl/Mail/%s/List?FolderID=-4&SortUseCase=True" - webmail-session) - (list-snarf . webmail-netaddress-list) - (article-url "http://www.netaddress.com/") - (article-snarf . webmail-netaddress-article) - (trash-url - "http://www.netaddress.com/tpl/Message/%s/Move?FolderID=-4&Q=%s&N=&Sort=Date&F=-1" - webmail-session id)) - (netscape - (paranoid cookie post agent) - (address . "webmail.netscape.com") - (open-url "http://ureg.netscape.com/iiop/UReg2/login/login?U2_LA=en&U2_BACK_FROM_CJ=true&U2_CS=iso-8859-1&U2_ENDURL=http://webmail.netscape.com/tpl/Subscribe/Step1&U2_NEW_ENDURL=http://webmail.netscape.com/tpl/Subscribe/Step1&U2_EXITURL=http://home.netscape.com/&U2_SOURCE=Webmail") - (open-snarf . webmail-netscape-open) - (login-url - content - ("http://ureg.netscape.com/iiop/UReg2/login/loginform") - "U2_USERNAME=%s&U2_PASSWORD=%s%s" - user password webmail-aux) - (login-snarf . webmail-netaddress-login) - (list-url - "http://webmail.netscape.com/tpl/Mail/%s/List?FolderID=-4&SortUseCase=True" - webmail-session) - (list-snarf . webmail-netaddress-list) - (article-url "http://webmail.netscape.com/") - (article-snarf . webmail-netscape-article) - (trash-url - "http://webmail.netscape.com/tpl/Message/%s/Move?FolderID=-4&Q=%s&N=&Sort=Date&F=-1" - webmail-session id)) - (my-deja - (paranoid cookie post) - (address . "www.my-deja.com") - ;;(open-snarf . webmail-my-deja-open) - (login-url - content - ("http://mydeja.google.com/cgi-bin/deja/maillogin.py") - "userid=%s&password=%s" - user password) - (list-snarf . webmail-my-deja-list) - (article-snarf . webmail-my-deja-article) - (trash-url webmail-aux id)))) - -(defvar webmail-variables - '(address article-snarf article-url list-snarf list-url - login-url login-snarf open-url open-snarf site articles - post-process paranoid trash-url)) - -(defconst webmail-version "webmail 1.0") - -(defvar webmail-newmail-only nil - "Only fetch new mails.") - -(defvar webmail-move-to-trash-can t - "Move mail to trash can after fetch it.") - -;;; Internal variables - -(defvar webmail-address nil) -(defvar webmail-paranoid nil) -(defvar webmail-aux nil) -(defvar webmail-session nil) -(defvar webmail-article-snarf nil) -(defvar webmail-article-url nil) -(defvar webmail-list-snarf nil) -(defvar webmail-list-url nil) -(defvar webmail-login-url nil) -(defvar webmail-login-snarf nil) -(defvar webmail-open-snarf nil) -(defvar webmail-open-url nil) -(defvar webmail-trash-url nil) -(defvar webmail-articles nil) -(defvar webmail-post-process nil) - -(defvar webmail-buffer nil) -(defvar webmail-buffer-list nil) - -(defvar webmail-type nil) - -(defvar webmail-error-function nil) - -(defvar webmail-debug-file "~/.emacs-webmail-debug") - -;;; Interface functions - -(defun webmail-debug (str) - (with-temp-buffer - (insert "\n---------------- A bug at " str " ------------------\n") - (mapcar #'(lambda (sym) - (if (boundp sym) - (pp `(setq ,sym ',(eval sym)) (current-buffer)))) - '(webmail-type user)) - (insert "---------------- webmail buffer ------------------\n\n") - (insert-buffer-substring webmail-buffer) - (insert "\n---------------- end of buffer ------------------\n\n") - (append-to-file (point-min) (point-max) webmail-debug-file))) - -(defun webmail-error (str) - (if webmail-error-function - (funcall webmail-error-function str)) - (message "%s HTML has changed or your w3 package is too old.(%s)" - webmail-type str) - (error "%s HTML has changed or your w3 package is too old.(%s)" - webmail-type str)) - -(defun webmail-setdefault (type) - (let ((type-def (cdr (assq type webmail-type-definition))) - (vars webmail-variables) - pair) - (setq webmail-type type) - (dolist (var vars) - (if (setq pair (assq var type-def)) - (set (intern (concat "webmail-" (symbol-name var))) (cdr pair)) - (set (intern (concat "webmail-" (symbol-name var))) nil))))) - -(defun webmail-encode-www-form-urlencoded (pairs) - "Return PAIRS encoded for forms." - (mapconcat - (function - (lambda (data) - (concat (w3-form-encode-xwfu (car data)) "=" - (w3-form-encode-xwfu (cdr data))))) - pairs "&")) - -(defun webmail-fetch-simple (url content) - (let ((url-request-data content) - (url-request-method "POST") - (url-request-extra-headers - '(("Content-type" . "application/x-www-form-urlencoded")))) - (nnweb-insert url)) - t) - -(defun webmail-fetch-form (url pairs) - (let ((url-request-data (webmail-encode-www-form-urlencoded pairs)) - (url-request-method "POST") - (url-request-extra-headers - '(("Content-type" . "application/x-www-form-urlencoded")))) - (nnweb-insert url)) - t) - -(defun webmail-eval (expr) - (cond - ((consp expr) - (cons (webmail-eval (car expr)) (webmail-eval (cdr expr)))) - ((symbolp expr) - (eval expr)) - (t - expr))) - -(defun webmail-url (xurl) - (mm-with-unibyte-current-buffer - (cond - ((eq (car xurl) 'content) - (pop xurl) - (webmail-fetch-simple (if (stringp (car xurl)) - (car xurl) - (apply 'format (webmail-eval (car xurl)))) - (apply 'format (webmail-eval (cdr xurl))))) - ((eq (car xurl) 'post) - (pop xurl) - (webmail-fetch-form (car xurl) (webmail-eval (cdr xurl)))) - (t - (nnweb-insert (apply 'format (webmail-eval xurl))))))) - -(defun webmail-init () - "Initialize buffers and such." - (if (gnus-buffer-live-p webmail-buffer) - (set-buffer webmail-buffer) - (setq webmail-buffer - (nnheader-set-temp-buffer " *webmail*")) - (mm-disable-multibyte))) - -(defvar url-package-name) -(defvar url-package-version) -(defvar url-cookie-multiple-line) -(defvar url-confirmation-func) - -;; Hack W3 POST redirect. See `url-parse-mime-headers'. -;; -;; Netscape uses "GET" as redirect method when orignal method is POST -;; and status is 302, .i.e no security risks by default without -;; confirmation. -;; -;; Some web servers (at least Apache used by yahoo) return status 302 -;; instead of 303, though they mean 303. - -(defun webmail-url-confirmation-func (prompt) - (cond - ((equal prompt (concat "Honor redirection with non-GET method " - "(possible security risks)? ")) - nil) - ((equal prompt "Continue (with method of GET)? ") - t) - (t (error prompt)))) - -(defun webmail-refresh-redirect () - "Redirect refresh url in META." - (goto-char (point-min)) - (while (re-search-forward - "]*URL=\\([^\"]+\\)\"" - nil t) - (let ((url (match-string 1))) - (erase-buffer) - (mm-with-unibyte-current-buffer - (nnweb-insert url))) - (goto-char (point-min)))) - -(defun webmail-fetch (file subtype user password) - (save-excursion - (webmail-setdefault subtype) - (let ((url-package-name (if (memq 'agent webmail-paranoid) - "Mozilla" - url-package-name)) - (url-package-version (if (memq 'agent webmail-paranoid) - "4.0" - url-package-version)) - (url-cookie-multiple-line (if (memq 'cookie webmail-paranoid) - nil - url-cookie-multiple-line)) - (url-confirmation-func (if (memq 'post webmail-paranoid) - 'webmail-url-confirmation-func - url-confirmation-func)) - (url-http-silence-on-insecure-redirection t) - url-cookie-storage url-cookie-secure-storage - url-cookie-confirmation - item id (n 0)) - (webmail-init) - (setq webmail-articles nil) - (when webmail-open-url - (erase-buffer) - (webmail-url webmail-open-url)) - (if webmail-open-snarf (funcall webmail-open-snarf)) - (when webmail-login-url - (erase-buffer) - (webmail-url webmail-login-url)) - (if webmail-login-snarf - (funcall webmail-login-snarf)) - (when webmail-list-url - (erase-buffer) - (webmail-url webmail-list-url)) - (if webmail-list-snarf - (funcall webmail-list-snarf)) - (while (setq item (pop webmail-articles)) - (message "Fetching mail #%d..." (setq n (1+ n))) - (erase-buffer) - (mm-with-unibyte-current-buffer - (nnweb-insert (cdr item))) - (setq id (car item)) - (if webmail-article-snarf - (funcall webmail-article-snarf file id)) - (when (and webmail-trash-url webmail-move-to-trash-can) - (message "Move mail #%d to trash can..." n) - (condition-case err - (progn - (webmail-url webmail-trash-url) - (let (buf) - (while (setq buf (pop webmail-buffer-list)) - (kill-buffer buf)))) - (error - (let (buf) - (while (setq buf (pop webmail-buffer-list)) - (kill-buffer buf))) - (error err)))))) - (if webmail-post-process - (funcall webmail-post-process)))) - -(defun webmail-encode-8bit () - (goto-char (point-min)) - (skip-chars-forward "^\200-\377") - (while (not (eobp)) - (insert (format "&%d;" (mm-char-int (char-after)))) - (delete-char 1) - (skip-chars-forward "^\200-\377"))) - -;;; hotmail - -(defun webmail-hotmail-open () - (goto-char (point-min)) - (if (re-search-forward - "action=\"https?://\\([^/]+\\)/cgi-bin/dologin" nil t) - (setq webmail-aux (match-string 1)) - (webmail-error "open@1"))) - -(defun webmail-hotmail-login () - (let (site) - (goto-char (point-min)) - (if (re-search-forward - "https?://\\([^/]+hotmail\\.msn\\.com\\)/cgi-bin/" nil t) - (setq site (match-string 1)) - (webmail-error "login@1")) - (goto-char (point-min)) - (if (re-search-forward - "\\(/cgi-bin/HoTMaiL\\?[^\"]*a=b[^\"]*\\)" nil t) - (setq webmail-aux (concat "http://" site (match-string 1))) - (webmail-error "login@2")))) - -(defun webmail-hotmail-list () - (goto-char (point-min)) - (skip-chars-forward " \t\n\r") - (let (site url newp (total "0")) - (if (eobp) - (setq total "0") - (if (re-search-forward "\\([0-9]+\\) *(\\([0-9]+\\) new)" nil t) - (message "Found %s (%s new)" (setq total (match-string 1)) - (match-string 2)) - (if (re-search-forward "\\([0-9]+\\) new" nil t) - (message "Found %s new" (setq total (match-string 1))) - (webmail-error "list@0")))) - (unless (equal total "0") - (goto-char (point-min)) - (if (re-search-forward - "https?://\\([^/]+hotmail\\.msn\\.com\\)/cgi-bin/" nil t) - (setq site (match-string 1)) - (webmail-error "list@1")) - (goto-char (point-min)) - (if (re-search-forward "disk=\\([^&]*\\)&" nil t) - (setq webmail-aux - (concat "http://" site "/cgi-bin/HoTMaiL?disk=" - (match-string 1))) - (webmail-error "list@2")) - (goto-char (point-max)) - (while (re-search-backward - "newmail\\.gif\\|href=\"\\(/cgi-bin/getmsg\\?[^\"]+\\)\"" - nil t) - (if (setq url (match-string 1)) - (progn - (if (or newp (not webmail-newmail-only)) - (let (id) - (if (string-match "msg=\\([^&]+\\)" url) - (setq id (match-string 1 url))) - (push (cons id (concat "http://" site url "&raw=0")) - webmail-articles))) - (setq newp nil)) - (setq newp t)))))) - -;; Thank victor@idaccr.org (Victor S. Miller) for raw=0 - -(defun webmail-hotmail-article (file id) - (goto-char (point-min)) - (skip-chars-forward " \t\n\r") - (unless (eobp) - (if (not (search-forward "
    " nil t))
    -	(webmail-error "article@3"))
    -    (skip-chars-forward "\n\r\t ")
    -    (delete-region (point-min) (point))
    -    (if (not (search-forward "
    " nil t)) - (webmail-error "article@3.1")) - (delete-region (match-beginning 0) (point-max)) - (nnweb-remove-markup) - (let ((w3-html-entities (cons '(nbsp . 32) w3-html-entities))) - (nnweb-decode-entities)) - (goto-char (point-min)) - (while (re-search-forward "\r\n?" nil t) - (replace-match "\n")) - (goto-char (point-min)) - (insert "\n\n") - (if (not (looking-at "\n*From ")) - (insert "From nobody " (current-time-string) "\n") - (forward-line)) - (insert "X-Gnus-Webmail: " (symbol-value 'user) - "@" (symbol-name webmail-type) "\n") - (mm-append-to-file (point-min) (point-max) file))) - -(defun webmail-hotmail-article-old (file id) - (let (p attachment count mime hotmail-direct) - (save-restriction - (webmail-encode-8bit) - (goto-char (point-min)) - (if (not (search-forward "
    " nil t)) - (if (not (search-forward "Reply All" nil t)) - (webmail-error "article@1") - (setq hotmail-direct t)) - (goto-char (match-beginning 0))) - (narrow-to-region (point-min) (point)) - (if (not (search-backward "" nil t) - (delete-region p (match-end 0))) - (nnweb-remove-markup) - (let ((w3-html-entities (cons '(nbsp . 32) w3-html-entities))) - (nnweb-decode-entities)) - (goto-char (point-min)) - (delete-blank-lines) - (goto-char (point-min)) - (when (search-forward "\n\n" nil t) - (backward-char) - (delete-region (point) (point-max))) - (goto-char (point-max)) - (widen) - (insert "\n") - (setq p (point)) - (while (re-search-forward - "\\|
    \\|\\(http://[^/]+/cgi-bin/getmsg/\\([^\?]+\\)\?[^\"]*\\)\"" - nil t) - (if (setq attachment (match-string 1)) - (let ((filename (match-string 2)) - bufname);; Attachment - (delete-region p (match-end 0)) - (save-excursion - (set-buffer (generate-new-buffer " *webmail-att*")) - (nnweb-insert attachment) - (push (current-buffer) webmail-buffer-list) - (setq bufname (buffer-name))) - (setq mime t) - (insert "<#part type=" - (or (and filename - (string-match "\\.[^\\.]+$" filename) - (mailcap-extension-to-mime - (match-string 0 filename))) - "application/octet-stream")) - (insert " buffer=\"" bufname "\"") - (insert " filename=\"" filename "\"") - (insert " disposition=\"inline\"") - (insert "><#/part>\n") - (setq p (point))) - (delete-region p (match-end 0)) - (if hotmail-direct - (if (not (search-forward "" nil t)) - (webmail-error "article@1.2") - (delete-region (match-beginning 0) (match-end 0))) - (setq count 1) - (while (and (> count 0) - (re-search-forward "
    \\|\\(
    \\)" nil t)) - (if (match-string 1) - (setq count (1+ count)) - (if (= (setq count (1- count)) 0) - (delete-region (match-beginning 0) - (match-end 0)))))) - (narrow-to-region p (point)) - (goto-char (point-min)) - (cond - ((looking-at "
    ")
    -	    (goto-char (match-end 0))
    -	    (if (looking-at "$") (forward-char))
    -	    (delete-region (point-min) (point))
    -	    (nnweb-remove-markup)
    -	    (let ((w3-html-entities (cons '(nbsp . 32) w3-html-entities)))
    -	      (nnweb-decode-entities))
    -	    nil)
    -	   (t
    -	    (setq mime t)
    -	    (insert "<#part type=\"text/html\" disposition=inline>")
    -	    (goto-char (point-max))
    -	    (insert "<#/part>")))
    -	  (goto-char (point-max))
    -	  (setq p (point))
    -	  (widen)))
    -      (delete-region p (point-max))
    -      (goto-char (point-min))
    -      ;; Some blank line to seperate mails.
    -      (insert "\n\nFrom nobody " (current-time-string) "\n")
    -      (insert "X-Gnus-Webmail: " (symbol-value 'user)
    -	      "@" (symbol-name webmail-type) "\n")
    -      (if id
    -	  (insert (format "X-Message-ID: <%s@hotmail.com>\n" id)))
    -      (unless (looking-at "$")
    -	(if (search-forward "\n\n" nil t)
    -	    (forward-line -1)
    -	  (webmail-error "article@2")))
    -      (narrow-to-region (point) (point-max))
    -      (if mime
    -	  (insert "MIME-Version: 1.0\n"
    -		  (prog1
    -		      (mml-generate-mime)
    -		    (delete-region (point-min) (point-max)))))
    -      (goto-char (point-min))
    -      (widen)
    -      (let (case-fold-search)
    -	(while (re-search-forward "^From " nil t)
    -	  (beginning-of-line)
    -	  (insert ">"))))
    -    (mm-append-to-file (point-min) (point-max) file)))
    -
    -;;; yahoo
    -
    -(defun webmail-yahoo-open ()
    -  (goto-char (point-min))
    -  (if (re-search-forward "action=\"\\([^\"]+\\)\"" nil t)
    -      (setq webmail-aux (match-string 1))
    -    (webmail-error "open@1")))
    -
    -(defun webmail-yahoo-login ()
    -  (goto-char (point-min))
    -  (if (re-search-forward "http://[^/]+[0-9]\\.mail\\.yahoo\\.com/" nil t)
    -      (setq webmail-aux (match-string 0))
    -    (webmail-error "login@1"))
    -  (if (re-search-forward "YY=[0-9]+" nil t)
    -      (setq webmail-aux (concat webmail-aux "ym/ShowFolder?"
    -				(match-string 0)))
    -    (webmail-error "login@2")))
    -
    -(defun webmail-yahoo-list ()
    -  (let (url (newp t) (tofetch 0))
    -    (goto-char (point-min))
    -    (when (re-search-forward
    -	   "showing [0-9]+-\\([0-9]+\\) of \\([0-9]+\\)" nil t)
    -      ;;(setq listed (match-string 1))
    -      (message "Found %s mail(s)" (match-string 2)))
    -    (if (string-match "http://[^/]+" webmail-aux)
    -	(setq webmail-aux (match-string 0 webmail-aux))
    -      (webmail-error "list@1"))
    -    (goto-char (point-min))
    -    (while (re-search-forward
    -	    "bgcolor=\"#eeeeee\"\\|href=\"\\(/ym/ShowLetter\\?MsgId=\\([^&]+\\)&[^\"]*\\)\""
    -	    nil t)
    -      (if (setq url (match-string 1))
    -	  (progn
    -	    (when (or newp (not webmail-newmail-only))
    -	      (push (cons (match-string 2) (concat webmail-aux url "&toc=1"))
    -		    webmail-articles)
    -	      (setq tofetch (1+ tofetch)))
    -	    (setq newp t))
    -	(setq newp nil)))
    -    (setq webmail-articles (nreverse webmail-articles))
    -    (message "Fetching %d mail(s)" tofetch)))
    -
    -(defun webmail-yahoo-article (file id)
    -  (let (p attachment)
    -    (save-restriction
    -      (goto-char (point-min))
    -      (if (not (search-forward "value=\"Done\"" nil t))
    -	  (webmail-error "article@1"))
    -      (if (not (search-forward "" nil t))
    -	  (webmail-error "article@3"))
    -      (narrow-to-region (point-min) (match-end 0))
    -      (while (search-forward "" nil t)
    -	(delete-region p (match-end 0)))
    -      (nnweb-remove-markup)
    -      (let ((w3-html-entities (cons '(nbsp . 32) w3-html-entities)))
    -	(nnweb-decode-entities))
    -      (goto-char (point-min))
    -      (delete-blank-lines)
    -      (goto-char (point-max))
    -      (widen)
    -      (insert "\n")
    -      (setq p (point))
    -      (while (re-search-forward "[^\"]*/ShowLetter/[^\?]+\?[^\"]*" nil t)
    -	(setq attachment (match-string 0))
    -	(let (bufname ct ctl cd description)
    -	  (if (not (search-forward "" nil t))
    -	      (webmail-error "article@5"))
    -	  (narrow-to-region p (match-end 0))
    -	  (nnweb-remove-markup)
    -	  (let ((w3-html-entities (cons '(nbsp . 32) w3-html-entities)))
    -	    (nnweb-decode-entities))
    -	  (goto-char (point-min))
    -	  (delete-blank-lines)
    -	  (setq ct (mail-fetch-field "content-type")
    -		ctl (ignore-errors (mail-header-parse-content-type ct))
    -		;;cte (mail-fetch-field "content-transfer-encoding")
    -		cd (mail-fetch-field "content-disposition")
    -		description (mail-fetch-field "content-description")
    -		id (mail-fetch-field "content-id"))
    -	  (delete-region (point-min) (point-max))
    -	  (widen)
    -	  (save-excursion
    -	    (set-buffer (generate-new-buffer " *webmail-att*"))
    -	    (nnweb-insert (concat webmail-aux attachment))
    -	    (push (current-buffer) webmail-buffer-list)
    -	    (setq bufname (buffer-name)))
    -	  (insert "<#part")
    -	  (if (and ctl (not (equal (car ctl) "text/")))
    -	      (insert " type=\"" (car ctl) "\""))
    -	  (insert " buffer=\"" bufname "\"")
    -	  (if cd
    -	      (insert " disposition=\"" cd "\""))
    -	  (if description
    -	      (insert " description=\"" description "\""))
    -	  (insert "><#/part>\n")
    -	  (setq p (point))))
    -      (delete-region p (point-max))
    -      (goto-char (point-min))
    -      ;; Some blank line to seperate mails.
    -      (insert "\n\nFrom nobody " (current-time-string) "\n")
    -      (insert "X-Gnus-Webmail: " (symbol-value 'user)
    -	      "@" (symbol-name webmail-type) "\n")
    -      (if id
    -	  (insert (format "X-Message-ID: <%s@yahoo.com>\n" id)))
    -      (unless (looking-at "$")
    -	(if (search-forward "\n\n" nil t)
    -	    (forward-line -1)
    -	  (webmail-error "article@2")))
    -      (narrow-to-region (point) (point-max))
    -      (insert "MIME-Version: 1.0\n"
    -	      (prog1
    -		  (mml-generate-mime)
    -		(delete-region (point-min) (point-max))))
    -      (goto-char (point-min))
    -      (widen)
    -      (let (case-fold-search)
    -	(while (re-search-forward "^From " nil t)
    -	  (beginning-of-line)
    -	  (insert ">"))))
    -    (mm-append-to-file (point-min) (point-max) file)))
    -
    -;;; netaddress
    -
    -(defun webmail-netscape-open ()
    -  (goto-char (point-min))
    -  (setq webmail-aux "")
    -  (while (re-search-forward
    -	  "TYPE=hidden *NAME=\\([^ ]+\\) *VALUE=\"\\([^\"]+\\)"
    -	  nil t)
    -    (setq webmail-aux (concat webmail-aux "&" (match-string 1) "="
    -			      (match-string 2)))))
    -
    -(defun webmail-netaddress-open ()
    -  (goto-char (point-min))
    -  (if (re-search-forward "action=\"\\([^\"]+\\)\"" nil t)
    -      (setq webmail-aux (concat (car webmail-open-url) (match-string 1)))
    -    (webmail-error "open@1")))
    -
    -(defun webmail-netaddress-login ()
    -  (webmail-refresh-redirect)
    -  (goto-char (point-min))
    -  (if (re-search-forward  "tpl/[^/]+/\\([^/]+\\)" nil t)
    -      (setq webmail-session (match-string 1))
    -    (webmail-error "login@1")))
    -
    -(defun webmail-netaddress-list ()
    -  (webmail-refresh-redirect)
    -  (let (item id)
    -    (goto-char (point-min))
    -    (when (re-search-forward
    -	   "(\\([0-9]+\\) unread, \\([0-9]+\\) total)" nil t)
    -      (message "Found %s mail(s), %s unread"
    -	       (match-string 2) (match-string 1)))
    -    (goto-char (point-min))
    -    (while (re-search-forward
    -	    "MR\\[i\\]\\.R='\\([^']*\\)'\\|MR\\[i\\]\\.Q='\\([^']+\\)'" nil t)
    -      (if (setq id (match-string 2))
    -	  (setq item
    -		(cons id
    -		      (format "%s/tpl/Message/%s/Read?Q=%s&FolderID=-4&SortUseCase=True&Sort=Date&Headers=True"
    -			      (car webmail-article-url)
    -			      webmail-session id)))
    -	(if (or (not webmail-newmail-only)
    -		(equal (match-string 1) "True"))
    -	    (push item webmail-articles))))
    -    (setq webmail-articles (nreverse webmail-articles))))
    -
    -(defun webmail-netaddress-single-part ()
    -  (goto-char (point-min))
    -  (cond
    -   ((looking-at "[\t\040\r\n]*]+>[\t\040\r\n]*")
    -    ;; text/plain
    -    (replace-match "")
    -    (while (re-search-forward "[\t\040\r\n]+" nil t)
    -      (replace-match " "))
    -    (goto-char (point-min))
    -    (while (re-search-forward "
    " nil t) - (replace-match "\n")) - (nnweb-remove-markup) - (let ((w3-html-entities (cons '(nbsp . 32) w3-html-entities))) - (nnweb-decode-entities)) - nil) - (t - (insert "<#part type=\"text/html\" disposition=inline>") - (goto-char (point-max)) - (insert "<#/part>") - t))) - -(defun webmail-netaddress-article (file id) - (webmail-refresh-redirect) - (let (p p1 attachment count mime type) - (save-restriction - (webmail-encode-8bit) - (goto-char (point-min)) - (if (not (search-forward "Trash" nil t)) - (webmail-error "article@1")) - (if (not (search-forward "
    " nil t)) - (webmail-error "article@2")) - (delete-region (point-min) (match-beginning 0)) - (if (not (search-forward "" nil t)) - (webmail-error "article@3")) - (narrow-to-region (point-min) (match-end 0)) - (goto-char (point-min)) - (while (re-search-forward "[\040\t\r\n]+" nil t) - (replace-match " ")) - (goto-char (point-min)) - (while (search-forward "" nil t) - (replace-match "\n")) - (nnweb-remove-markup) - (let ((w3-html-entities (cons '(nbsp . 32) w3-html-entities))) - (nnweb-decode-entities)) - (goto-char (point-min)) - (delete-blank-lines) - (goto-char (point-min)) - (while (re-search-forward "^\040+\\|\040+$" nil t) - (replace-match "")) - (goto-char (point-min)) - (while (re-search-forward "\040+" nil t) - (replace-match " ")) - (goto-char (point-max)) - (widen) - (insert "\n\n") - (setq p (point)) - (unless (search-forward "" nil t) - (webmail-error "article@4")) - (forward-line 14) - (delete-region p (point)) - (goto-char (point-max)) - (unless (re-search-backward - "[\040\t]*
    [\040\t\r\n]*
    [\040\t\r\n]*" - nil t 2) - (setq mime t) - (unless (search-forward "
    " nil t) - (webmail-error "article@6")) - (setq p1 (point)) - (if (search-backward "" nil t) - (webmail-error "article@8")) - (delete-region p (point)) - (let (bufname);; Attachment - (save-excursion - (set-buffer (generate-new-buffer " *webmail-att*")) - (nnweb-insert (concat (car webmail-open-url) attachment)) - (push (current-buffer) webmail-buffer-list) - (setq bufname (buffer-name))) - (insert "<#part type=" type) - (insert " buffer=\"" bufname "\"") - (insert " disposition=\"inline\"") - (insert "><#/part>\n") - (setq p (point)))) - (delete-region p p1) - (narrow-to-region - p - (if (search-forward - "" - nil t) - (match-beginning 0) - (point-max))) - (webmail-netaddress-single-part) - (goto-char (point-max)) - (setq p (point)) - (widen))) - (unless mime - (narrow-to-region p (point-max)) - (setq mime (webmail-netaddress-single-part)) - (widen)) - (goto-char (point-min)) - ;; Some blank line to seperate mails. - (insert "\n\nFrom nobody " (current-time-string) "\n") - (insert "X-Gnus-Webmail: " (symbol-value 'user) - "@" (symbol-name webmail-type) "\n") - (if id - (insert (format "X-Message-ID: <%s@%s>\n" id webmail-address))) - (unless (looking-at "$") - (if (search-forward "\n\n" nil t) - (forward-line -1) - (webmail-error "article@2"))) - (when mime - (narrow-to-region (point-min) (point)) - (goto-char (point-min)) - (while (not (eobp)) - (if (looking-at "MIME-Version\\|Content-Type") - (delete-region (point) - (progn - (forward-line 1) - (if (re-search-forward "^[^ \t]" nil t) - (goto-char (match-beginning 0)) - (point-max)))) - (forward-line 1))) - (goto-char (point-max)) - (widen) - (narrow-to-region (point) (point-max)) - (insert "MIME-Version: 1.0\n" - (prog1 - (mml-generate-mime) - (delete-region (point-min) (point-max)))) - (goto-char (point-min)) - (widen)) - (let (case-fold-search) - (while (re-search-forward "^From " nil t) - (beginning-of-line) - (insert ">")))) - (mm-append-to-file (point-min) (point-max) file))) - -(defun webmail-netscape-article (file id) - (let (p p1 attachment count mime type) - (save-restriction - (webmail-encode-8bit) - (goto-char (point-min)) - (if (not (search-forward "Trash" nil t)) - (webmail-error "article@1")) - (if (not (search-forward "" nil t)) - (webmail-error "article@2")) - (delete-region (point-min) (match-beginning 0)) - (if (not (search-forward "" nil t)) - (webmail-error "article@3")) - (narrow-to-region (point-min) (match-end 0)) - (goto-char (point-min)) - (while (re-search-forward "[\040\t\r\n]+" nil t) - (replace-match " ")) - (goto-char (point-min)) - (while (re-search-forward "]*>[^<]*" nil t) - (replace-match "")) - (goto-char (point-min)) - (while (search-forward "" nil t) - (replace-match "\n")) - (nnweb-remove-markup) - (let ((w3-html-entities (cons '(nbsp . 32) w3-html-entities))) - (nnweb-decode-entities)) - (goto-char (point-min)) - (delete-blank-lines) - (goto-char (point-min)) - (while (re-search-forward "^\040+\\|\040+$" nil t) - (replace-match "")) - (goto-char (point-min)) - (while (re-search-forward "\040+" nil t) - (replace-match " ")) - (goto-char (point-max)) - (widen) - (insert "\n\n") - (setq p (point)) - (unless (search-forward "" nil t) - (webmail-error "article@4")) - (forward-line 14) - (delete-region p (point)) - (goto-char (point-max)) - (unless (re-search-backward - "
    " - nil t 2) - (setq mime t) - (unless (search-forward "
    " nil t) - (webmail-error "article@6")) - (setq p1 (point)) - (if (search-backward "" nil t) - (webmail-error "article@8")) - (delete-region p (point)) - (let (bufname);; Attachment - (save-excursion - (set-buffer (generate-new-buffer " *webmail-att*")) - (nnweb-insert (concat (car webmail-open-url) attachment)) - (push (current-buffer) webmail-buffer-list) - (setq bufname (buffer-name))) - (insert "<#part type=" type) - (insert " buffer=\"" bufname "\"") - (insert " disposition=\"inline\"") - (insert "><#/part>\n") - (setq p (point)))) - (delete-region p p1) - (narrow-to-region - p - (if (search-forward - "" - nil t) - (match-beginning 0) - (point-max))) - (webmail-netaddress-single-part) - (goto-char (point-max)) - (setq p (point)) - (widen))) - (unless mime - (narrow-to-region p (point-max)) - (setq mime (webmail-netaddress-single-part)) - (widen)) - (goto-char (point-min)) - ;; Some blank line to seperate mails. - (insert "\n\nFrom nobody " (current-time-string) "\n") - (insert "X-Gnus-Webmail: " (symbol-value 'user) - "@" (symbol-name webmail-type) "\n") - (if id - (insert (format "X-Message-ID: <%s@%s>\n" id webmail-address))) - (unless (looking-at "$") - (if (search-forward "\n\n" nil t) - (forward-line -1) - (webmail-error "article@2"))) - (when mime - (narrow-to-region (point-min) (point)) - (goto-char (point-min)) - (while (not (eobp)) - (if (looking-at "MIME-Version\\|Content-Type") - (delete-region (point) - (progn - (forward-line 1) - (if (re-search-forward "^[^ \t]" nil t) - (goto-char (match-beginning 0)) - (point-max)))) - (forward-line 1))) - (goto-char (point-max)) - (widen) - (narrow-to-region (point) (point-max)) - (insert "MIME-Version: 1.0\n" - (prog1 - (mml-generate-mime) - (delete-region (point-min) (point-max)))) - (goto-char (point-min)) - (widen)) - (let (case-fold-search) - (while (re-search-forward "^From " nil t) - (beginning-of-line) - (insert ">")))) - (mm-append-to-file (point-min) (point-max) file))) - -;;; my-deja - -(defun webmail-my-deja-open () - (webmail-refresh-redirect) - (goto-char (point-min)) - (if (re-search-forward "action=\"\\([^\"]+maillogin\\.py[^\"]*\\)\"" - nil t) - (setq webmail-aux (match-string 1)) - (webmail-error "open@1"))) - -(defun webmail-my-deja-list () - (let (item id newp base) - (goto-char (point-min)) - (when (re-search-forward "href=\"\\(\\([^\"]*\\)/mailnf\\.[^\"]*\\)\"" - nil t) - (let ((url (match-string 1))) - (setq base (match-string 2)) - (erase-buffer) - (nnweb-insert url))) - (goto-char (point-min)) - (when (re-search-forward - "(\\([0-9]+\\) Message.?-[^>]*\\([0-9]+\\) New" - nil t) - (message "Found %s mail(s), %s unread" - (match-string 1) (match-string 2))) - (goto-char (point-min)) - (while (re-search-forward - "newmail\\.gif\\|href=\"[^\"]*\\(mailnf\\.[^\"]+act=view[^\"]+mid=\\([^\"&]+\\)[^\"]+\\)\"" - nil t) - (if (setq id (match-string 2)) - (when (and (or newp (not webmail-newmail-only)) - (not (assoc id webmail-articles))) - (push (cons id (setq webmail-aux - (concat base "/" (match-string 1)))) - webmail-articles) - (setq newp nil)) - (setq newp t))) - (setq webmail-articles (nreverse webmail-articles)))) - -(defun webmail-my-deja-article-part (base) - (let (p) - (cond - ((looking-at "[\t\040\r\n]* - mail-source-delete-incoming. Suggested by Karl Kleinpaste - . - -2000-10-18 Dave Love - - * gnus.texi (NoCeM): Update. - -2000-10-17 Simon Josefsson - - * gnus.texi (IMAP): Add. - -2000-10-05 Kai Gro,A_(Bjohann - - * gnus.texi (Windows Configuration): add examples; first example - suggested by Stein A. Str,Ax(Bmme . (The actual - Lisp code is also from him.) - -2000-10-07 Dave Love - - * doclicense.texi: New file. - -2000-10-07 16:50:14 ShengHuo ZHU - - * Makefile.in: Use install-info. - -2000-10-06 14:38:27 ShengHuo ZHU - - * message.texi (Message Headers): Add. - -2000-10-04 09:23:49 ShengHuo ZHU - - * gnus.texi (Article Hiding): Add. - (Using MIME): Add. - -2000-09-30 Simon Josefsson - - * gnus.texi (Agent and IMAP): Add. - (Splitting in IMAP): Fix. - -2000-09-29 Simon Josefsson - - * gnus.texi (Converting Kill Files): Fix URL. - (Posting Styles): Fix regexp. - (Mail Source Specifiers): Fix. - -2000-09-29 12:53:27 ShengHuo ZHU - - * Makefile.in: A workaround for @ifnottex. - -2000-09-29 12:36:13 ShengHuo ZHU - - * gnus.texi: Remove @c lines in the directory due to a bug in - makeinfo 1.68 (GNU texinfo 3.12). - -2000-09-22 Dave Love - - * message.texi, gnus.texi, emacs-mime.texi: Convert to GFDL. - -2000-09-20 John H. Palmieri - - * gnus.texi (Mail Source Customization): Document of - mail-source-incoming-file-prefix. - -2000-09-20 Simon Josefsson - - * gnus.texi (IMAP): Add examples. - -2000-09-19 Kai Gro,A_(Bjohann - - * gnus.texi (IMAP): Add pointer to description of ~/.authinfo file - format. - -2000-09-17 Felix Natter - - * gnusref.tex: New version. - - * refcard.tex: New version. - -2000-09-17 18:03:52 ShengHuo ZHU - - * gnus.texi (Article Hiding): Doc fix as suggested by Felix Natter - . - -2000-06-22 Michael Totschnig - - * gnus.texi (Agent Basics): Doc fix. - -2000-09-14 Jason R. Mastaler - - * gnus.texi (Mail Source Specifiers): Use $HOME. - -2000-08-14 Kai Grossjohann - - * gnus.texi (Mail Source Specifiers): Replace `@paragraph' with - `@subsubheading'. - -2000-08-14 Kai Grossjohann - - * gnus.texi (Mail Source Specifiers): Try to document the - interface to the functions called via (among others) the - `:function' keyword. - -2000-08-13 20:00:35 ShengHuo ZHU - - * gnus.texi (Topic Commands): Fix typo. - -2000-08-13 20:20:56 Lars Magne Ingebrigtsen - - * gnus.texi (Topic Commands): Addition. - -2000-08-11 Kai Grossjohann - - * gnus.texi (Expiring Mail): Extend documentation of variable - `nnmail-expiry-target' and of group parameter `expiry-target'. - Explain interaction between these. Add Lisp example for setting - `nnmail-expiry-target'. - -2000-08-04 Andreas Oeldenberger - - * message.texi (Forwarding): Fix. - -2000-07-15 Simon Josefsson - - * gnus.texi (nnimap-authinfo-file): - (gnus-invalid-group-regexp): Add. - (Mail Source Specifiers): Fix. - (IMAP): Fix. - (Agent Basics): Fix. - -2000-07-12 19:37:19 ShengHuo ZHU - - * gnus.texi (Article Washing): Add keystroke `t'. - -2000-07-12 15:49:34 ShengHuo ZHU - - * Makefile.in: Add EMACS. Test -x "$(MAKEINFO)" does not work. - Use sed instead of perl (suggested by Nick V. Pakoulin). - -2000-07-03 00:24:55 Lars Magne Ingebrigtsen - - * gnus.texi (Splitting Mail): Mention gnus-summary-respool-trace. - (Searching for Articles): Fix. - (Newest Features): Fix. - -2000-06-28 Simon Josefsson - - * gnus.texi (Splitting in IMAP): Update. - -2000-05-19 15:18:32 Dmitry Yaitskov - - * message.texi (Reply): Doc fix. - -2000-05-17 00:50:29 Shenghuo ZHU - - * gnus.texi (Listing Groups): Addition. - -2000-05-16 21:46:40 Shenghuo ZHU - - * gnus.texi (Misc Group Stuff): Addition. - (Article Washing): Ditto. - -2000-05-15 10:16:29 Shenghuo ZHU - - * gnus.texi (Mail Source Specifiers): Update maildir. - -2000-05-07 Pavel Janik - - * gnus.texi: direntry added. - - * message.texi: direntry added. - - * emacs-mime.texi: direntry added. - -2000-05-02 Pavel Janik - - * gnus.texi (MIME comands): Spelling fix. - -2000-05-03 21:12:05 Shenghuo ZHU - - * gnus.texi (Summary Mail Commands): Addition. - (Summary Post Commands): Ditto. - -2000-04-27 Dave Love - - * gnus.texi (Article Washing): Update x-face bit. - -2000-04-26 Florian Weimer - - * message.texi (Various Message Variables): Document - message-default-charset. - - * emacs-mime.texi (Charset Translation): New section. - -2000-04-26 02:30:06 Shenghuo ZHU - - * gnus.texi (Posting Styles): Addition. - -2000-04-24 17:09:17 Felix Natter - - * gnusref.tex: New version. - - * refcard.tex: New version. - -2000-04-23 00:32:23 Lars Magne Ingebrigtsen - - * gnus.texi (Thread Commands): Add keystrokes. - (Various Summary Stuff): Addition. - -2000-04-22 21:12:25 Alan Shutko - - * Makefile.in: Add pdf support. - -2000-04-21 12:07:20 Shenghuo ZHU - - * gnus.texi (Listing Groups): Addition. - -2000-04-21 13:45:52 Pavel Janik - - * gnus.texi (Mail Source Specifiers): Example for :plugged. - -2000-04-20 20:37:48 Pavel Janik - - * gnus.texi (Limiting): Fix. - -2000-04-20 20:32:40 Dmitry Yaitskov - - * gnus.texi (Charsets): Typo fix. - -2000-03-19 Simon Josefsson - - * gnus.texi (IMAP): Addition. - -2000-03-13 17:44:59 Lars Magne Ingebrigtsen - - * gnus.texi (Process/Prefix): Addition. - -2000-02-04 Simon Josefsson - - * gnus.texi (IMAP): Fix. - -2000-01-27 18:06:35 Lars Magne Ingebrigtsen - - * gnus.texi (Remember): Addition. - -2000-01-21 Simon Josefsson - - * gnus.texi (Splitting in IMAP): Addition. - (Mail Source Specifiers): Add fetchflag setting in example. - -2000-01-08 08:10:04 Martin Bialasinski - - * gnus.texi (Mail and Post): Example. - -2000-01-08 07:46:13 Lars Magne Ingebrigtsen - - * gnus.texi (Customizing w3): New. - -2000-01-08 07:46:06 Hamish Macdonald - - * gnus.texi (Customizing w3): Example. - -2000-01-06 17:55:28 Lars Magne Ingebrigtsen - - * gnus.texi (Charsets): Addition. - -2000-01-05 15:58:48 Lars Magne Ingebrigtsen - - * gnus.texi (Mail Group Commands): Addition. - (Top): Added detailmenu. - -2000-01-03 01:31:02 Lars Magne Ingebrigtsen - - * gnus.texi (MIME Commands): Fix. - -2000-01-03 Karl Kleinpaste - - * gnus.texi (Splitting in IMAP): Add '.' after @xref. - -2000-01-02 08:39:18 Lars Magne Ingebrigtsen - - * gnus.texi: Closing paren. - Doc fix. - -1999-12-28 Simon Josefsson - - * gnus.texi (Article Hiding): Addition. - (Splitting in IMAP): Addition. - -1999-12-17 12:12:41 Shenghuo ZHU - - * gnus.texi (Mail Source Specifiers): Addition. - -1999-12-13 23:47:50 Shenghuo ZHU - - * gnus.texi (Mail Source Specifiers): Addition. - -1999-12-07 00:19:31 Shenghuo ZHU - - * gnus.texi (Web Archive): Addition. - -1999-12-06 05:17:15 Lars Magne Ingebrigtsen - - * gnus.texi (Slashdot): Addition. - -1999-12-05 00:54:28 Lars Magne Ingebrigtsen - - * gnus.texi (Mail Source Specifiers): Removed backslashes. - -1999-12-04 07:35:51 Lars Magne Ingebrigtsen - - * gnus.texi (Setting Process Marks): Addition. - -1999-12-04 05:09:46 Manoj Srivastava - - * gnus.texi: Use defface instead of face-spec-set. - -1999-12-04 02:31:25 Lars Magne Ingebrigtsen - - * gnus.texi (extension): Posting server fix. - Url update. - -1999-12-04 01:16:52 Yoshiki Hayashi - - * gnus.texi (group-buffer): Fix "theese". - -1999-12-04 01:13:51 Thomas Gellekum - - * gnus.texi (Height): Typo fix. - -1999-11-13 Adrian Aichner - - * xemacs.mak: New NMAKE file to support build and install of info - documentation on Windows NT, requiring the `texinfo' XEmacs - package. - -1999-12-03 00:02:11 Lars Magne Ingebrigtsen - - * gnus.texi (Other Gnus Versions): New. - (Gnus Versions): Made into own node. - -1999-12-02 00:00:00 Lars Magne Ingebrigtsen - - * gnus.texi (Paging the Article): Addition. - (History): Addition. - -1999-11-24 Carsten Leonhardt - - * gnus.texi (Mail Source Specifiers): Mention maildir in the - overview and the possibility to use remote maildirs. - -1999-12-01 14:21:19 Lars Magne Ingebrigtsen - - * gnus.texi (Topic Parameters): Addition. - (Summary Message Commands): New. - (Canceling and Superseding): Made into subsection. - (Charsets): Addition. - -1999-11-30 10:54:31 Shenghuo ZHU - - * gnus.texi (Mail Source Specifiers): Add a note. - -1999-11-27 17:15:00 Lars Magne Ingebrigtsen - - * gnus.texi: Typo fixes and @sc. - -1999-11-26 16:59:29 Lars Magne Ingebrigtsen - - * gnus.texi (On Writing Manuals): New. - -1999-11-23 17:23:37 Shenghuo ZHU - - * gnus.texi (Mail Source Specifiers): Update. - -1999-11-23 05:07:59 Shenghuo ZHU - - * gnus.texi (Web Archive): Add nnwarchive. - -1999-11-23 03:05:32 Shenghuo ZHU - - * gnus.texi (Mail Source Specifiers): Add webmail. - -1999-11-19 12:15:23 Lars Magne Ingebrigtsen - - * gnus.texi (Slashdot): Addition. - -1999-11-17 Per Abrahamsen - - * gnus.texi (Finding the Parent): Fix example. - -1999-11-16 10:09:44 Lars Magne Ingebrigtsen - - * gnus.texi: Addition. - (present): Addition. - -1999-11-13 Simon Josefsson - - * gnus.texi (Mail Source Specifiers): Fix. Added documentation for - IMAP mail-source keywords `fetchflag' and `dontexpunge'. - -1999-11-12 18:00:56 Eli Zaretskii - - * gnus.texi (Fancy Mail Splitting): Fix @vars. - -1999-11-12 17:08:35 Gunnar Evermann - - * gnus.texi (Splitting in IMAP): @@ fix. - -1999-11-12 08:17:49 Lars Magne Ingebrigtsen - - * gnus.texi (Mail Source Specifiers): Addition. - -1999-11-12 08:17:44 Ulf Betlehem - - * gnus.texi (Mail Source Specifiers): Example. - -1999-11-12 05:26:22 Lars Magne Ingebrigtsen - - * gnus.texi (Slashdot): Addition. - -1999-11-11 04:32:57 Lars Magne Ingebrigtsen - - * message.texi (News Headers): Fix. - - * gnus.texi (Browsing the Web): New. - (Slashdot): New. - (Ultimate): New. - -1999-11-10 11:32:00 Lars Magne Ingebrigtsen - - * gnus.texi (Archived Messages): Fix. - -1999-11-07 01:28:07 Lars Magne Ingebrigtsen - - * gnus.texi (MIME Commands): Addition. - -1999-11-06 23:09:31 Lars Magne Ingebrigtsen - - * gnus.texi (Customizing Articles): Fix. - -1999-11-05 22:34:23 Lars Magne Ingebrigtsen - - * gnus.texi (Posting Styles): Addition. - -1999-10-23 Simon Josefsson - - * gnus.texi (Mail Source Specifiers): Add imap mail-source. - (IMAP): New subsection. - (SOUP): Typo. - -1999-09-27 16:07:31 Lars Magne Ingebrigtsen - - * emacs-mime.texi (New Viewers): Fix. - -1999-10-29 David S. Goldberg - - * emacs-mime.texi (Customization): Document mm-inline-override-types - -1999-09-25 10:58:17 Lars Magne Ingebrigtsen - - * message.texi (Forwarding): Updated. - - * emacs-mime.texi (New Viewers): New. - -1999-09-24 18:52:34 Lars Magne Ingebrigtsen - - * gnus.texi (Group Line Specification): Doc fix. - -1999-09-24 18:06:33 Bill White - - * gnus.texi (Article Washing): Fix. - -1999-08-27 20:47:39 Lars Magne Ingebrigtsen - - * gnus.texi (Posting Styles): Doc fix. - -1999-08-27 18:51:42 Robin S. Socha - - * gnus.texi: Typo fix. - -1999-08-27 15:09:01 Jim Meyering - - * gnus.texi (The Active File): Typo fix. - -1999-08-27 15:00:23 Yoshiki Hayashi - - * gnus.texi (Generic Marking Commands): Typo fixes. - -1999-08-27 14:46:21 Lee Willis - - * gnus.texi (Customizing Articles): More explanation. - -1999-07-10 Mike McEwan - - * gnus.texi (More Threading): Document new variable - `gnus-sort-gathered-threads-function'. - -1999-07-30 Simon Josefsson - - * gnus.texi: Added `gnus-list-identifiers' stuff. - -1999-07-09 19:41:34 Lars Magne Ingebrigtsen - - * gnus.texi (Using MIME): Addition. - (Topic Commands): Addition. - -1999-07-06 05:37:46 Alexandre Oliva - - * gnus.texi (Fancy Mail Splitting): Document RESTRICT. - -1999-07-07 10:26:59 Robin S. Socha - - * gnus.texi (Scoring Tips): Typo. - -1999-07-06 11:41:59 Lars Magne Ingebrigtsen - - * gnus.texi (Mail Source Specifiers): Fix. - (Mail Source Customization): Deleted obsolete vars. - -1999-07-05 05:16:55 Laura Conrad - - * gnus.texi (Mail in a Newsreader): Rewrite. - -1999-07-04 04:33:50 Lars Magne Ingebrigtsen - - * gnus.texi (Posting Styles): Fix. - (Mail in a Newsreader): New. - -1999-06-13 02:29:22 Lars Magne Ingebrigtsen - - * gnus.texi (MIME Commands): Addition. - (Article Miscellania): New. - (Customizing Articles): Addition. - -1999-06-12 00:13:25 Lars Magne Ingebrigtsen - - * gnus.texi (Comparing Mail Backends): Slight edits. - -1999-06-12 00:13:20 Karl Kleinpaste - - * gnus.texi (Comparing Mail Backends): New. - -1999-06-11 21:47:22 Lars Magne Ingebrigtsen - - * gnus.texi (Group Score): Doc fix. - (The Active File): Addition. - (Document Groups): Addition. - -1999-04-18 Didier Verna - - * gnus.texi (Article treatment): document the new variable - `gnus-article-date-lapsed-new-header'. - -1999-04-26 Robert Bihlmeyer - - * gnus.texi (Posting Styles): Typo. - -1999-04-18 12:46:33 Lars Magne Ingebrigtsen - - * gnus.texi (Summary Score Commands): Typo. - (Choosing a Mail Backend): Addition. - -1999-04-18 09:24:51 Yoshiki Hayashi - - * gnus.texi (Startup Variables): Fix. - -1999-04-18 09:12:28 Starback - - * gnus.texi (Subscription Methods): Typo. - -1999-04-18 08:22:27 Lars Magne Ingebrigtsen - - * gnus.texi (Little Disk Space): Addition. - -1999-03-25 Erik Toubro Nielsen - - * gnus.texi (gnus-thread-sort-functions). 'reverse' => 'not' - -1999-04-17 10:21:01 Jack Twilley - - * gnus.texi (Fancy Mail Splitting): Addition. - -1999-04-07 06:13:08 Lars Magne Ingebrigtsen - - * gnus.texi (Gnus Development): New. - -1999-03-06 20:12:50 Lars Magne Ingebrigtsen - - * gnus.texi (Generic Marking Commands): New. - -1999-03-01 16:41:42 Rob Browning - - * gnus.texi (Score Variables): Clarify. - -1999-02-26 Andreas Jaeger - - * gnus.texi: Add ',' after @xrefs. - -1999-02-26 20:54:34 Jason R. Mastaler - - * gnus.texi (Article Date): Added joke by Colin Rafferty - (colin@xemacs.org). - -1999-02-26 08:26:10 Lars Magne Ingebrigtsen - - * gnus.texi (Mail Source Specifiers): Fix. - -Thu Feb 25 00:28:49 1999 Shenghuo ZHU - - * gnus.texi (Category Syntax): Typo fix. - -1999-02-21 11:42:54 Vladimir Volovich - - * Makefile.in (.texi): Fix check for MAKEINFO. - -1999-02-20 17:33:55 Lars Magne Ingebrigtsen - - * gnus.texi (Mail Source Specifiers): Addition. - -1999-02-11 19:19:02 Carsten Leonhardt - - * gnus.texi (Mail Source Specifiers): Document maildir. - -1999-02-09 16:21:35 Lars Magne Ingebrigtsen - - * gnus.texi (Charsets): New. - -1999-02-04 03:45:15 Lars Magne Ingebrigtsen - - * emacs-mime.texi (Conversion): New. - -1999-02-03 03:04:18 Miguel de Icaza - - * gnus.texi (Fetching Mail): Typo fix. - -1999-02-02 22:28:42 Lars Magne Ingebrigtsen - - * gnus.texi (Mail Source Specifiers): Addition. - -1999-02-01 21:05:18 Lars Magne Ingebrigtsen - - * gnus.texi (Article Hiding): Addition. - -1999-01-28 08:08:28 Lars Magne Ingebrigtsen - - * gnus.texi (Washing Mail): Addition. - -1999-01-27 14:30:39 Lars Magne Ingebrigtsen - - * gnus.texi (Article Washing): Addition. - -1999-01-25 04:24:01 Lars Magne Ingebrigtsen - - * message.texi (MIME): New. - - * gnus.texi (Mail Sources): New. - (Mail Source Specifiers): New. - (Mail Source Customization): New. - (Fetching Mail): New. - -1999-01-23 09:47:16 Lars Magne Ingebrigtsen - - * gnus.texi (Article Washing): Removed. - (Customizing Articles): Addition. - -1999-01-16 20:36:48 Lars Magne Ingebrigtsen - - * gnus.texi (Customizing Articles): Rewrite. - Remove mention of gnus-article-display-hook. - -1999-01-12 07:14:12 Lars Magne Ingebrigtsen - - * gnus.texi (To From Newsgroups): Addition. - -1999-01-03 13:54:51 Lars Magne Ingebrigtsen - - * gnus.texi (Group Agent Commands): Addition. - -1998-12-19 23:29:50 Lars Magne Ingebrigtsen - - * gnus.texi (Splitting Mail): Addition. - -1998-12-13 08:54:07 Lars Magne Ingebrigtsen - - * message.texi (Insertion): Add. - -1998-12-03 13:34:48 James Troup - - * gnus.texi (MIME Commands): Typo fix. - -1998-12-03 Didier Verna - - * gnus.texi (Group Parameters): update for the posting-style group - parameter. - -1998-12-02 01:04:22 Lars Magne Ingebrigtsen - - * gnus.texi (Emacsen): Addition. - (Picon Useless Configuration): Addition. - -1998-12-01 00:27:04 Lars Magne Ingebrigtsen - - * emacs-mime.texi (rfc2045): New. - -1998-11-29 00:03:43 Lars Magne Ingebrigtsen - - * emacs-mime.texi (Composing): New chapter. - -1998-11-25 Karl Eichwalder - - * Makefile.in (install): Remove emacs-info, add emacs-mime. - -1998-11-25 10:56:08 Lars Magne Ingebrigtsen - - * gnus.texi (To From Newsgroups): Addition. - (Anything Groups): Addition. - (Article Washing): Addition. - (MIME Commands): Addition. - -1998-11-19 04:05:15 Lars Magne Ingebrigtsen - - * gnus.texi (Really Various Summary Commands): Addition. - -1998-11-18 00:52:46 Lars Magne Ingebrigtsen - - * gnus.texi (MIME Commands): Addition. - (Expiring Mail): Addition. - -1998-11-07 17:18:07 Lars Magne Ingebrigtsen - - * gnus.texi (Gnus Reference Guide): Renamed. - -1998-10-26 22:03:08 Lars Magne Ingebrigtsen - - * gnus.texi (Article Washing): Fix. - (MIME Commands): Change. - -1998-10-25 01:51:56 Lars Magne Ingebrigtsen - - * gnus.texi (Headers): Addition. - -1998-10-24 08:37:12 Lars Magne Ingebrigtsen - - * gnus.texi (Summary Buffer Lines): Addition. - (To): New. - (To): Addition. - -1998-10-15 18:15:34 Simon Josefsson - - * gnus.texi (Group Info): Must be list of ranges. - -1998-10-19 01:27:26 Lars Magne Ingebrigtsen - - * gnus.texi (Article Washing): Addition. - -1998-10-18 00:20:58 Lars Magne Ingebrigtsen - - * gnus.texi (Changing Servers): Addition. - -1998-10-17 21:34:57 Lars Magne Ingebrigtsen - - * gnus.texi (Windows Configuration): Addition. - -1998-10-01 07:55:35 Lars Magne Ingebrigtsen - - * gnus.texi (Splitting Mail): Fix. - (Washing Mail): Fix. - -1998-09-30 05:54:45 Lars Magne Ingebrigtsen - - * gnus.texi (Selecting a Group): Addition. - -1998-09-13 08:58:56 Lars Magne Ingebrigtsen - - * dir (File): Updated. - -1998-09-12 08:53:05 Lars Magne Ingebrigtsen - - * emacs-mime.texi: New file. - - * gnus.texi (Misc Article): Addition. - -1998-09-11 08:52:50 Lars Magne Ingebrigtsen - - * gnus.texi (Group Score Commands): Fix. - (Saving Articles): Fix. - (Agent Expiry): Fix. - (Using MIME): Change. - -1998-09-10 03:19:14 Lars Magne Ingebrigtsen - - * gnus.texi (Windows Configuration): Addition. - -1998-09-06 Mike McEwan - - * gnus.texi (Category Syntax): Added doc about agent categories - and download scoring. - -1998-09-05 17:36:14 Lars Magne Ingebrigtsen - - * gnus.texi (Sorting Groups): Change. - (Various Summary Stuff): Addition. - -1998-09-04 00:40:07 David S. Goldberg - - * gnus.texi (Article Hiding): Verify. - -1998-08-31 11:46:57 Lars Magne Ingebrigtsen - - * gnus.texi (Mail Folders): Addition. - (Group Parameters): Addition. - (MIME Commands): New. - -1998-08-27 07:29:17 Lars Magne Ingebrigtsen - - * gnus.texi (Mail Folders): Addition. - -;; Local Variables: -;; coding: iso-2022-7bit -;; End: diff --git a/texi/Makefile.in b/texi/Makefile.in deleted file mode 100644 index 0e42c1b..0000000 --- a/texi/Makefile.in +++ /dev/null @@ -1,260 +0,0 @@ -infodir = @infodir@ -prefix = @prefix@ -srcdir = @srcdir@ -subdir = texi -top_srcdir = @top_srcdir@ - -@SET_MAKE@ -VPATH=$(srcdir) -TEXI2DVI=texi2dvi -TEXI2PDF=texi2pdf -MAKEINFO=@MAKEINFO@ -EMACS=@EMACS@ -EMACSCOMP=$(EMACS) -batch -q -no-site-file -EMACSINFO=$(EMACSCOMP) -l $(srcdir)/infohack.el -f batch-makeinfo -PDFLATEX=pdflatex -LATEX=latex -DVIPS=dvips -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -SHELL = /bin/sh -PAPERTYPE=a4 -INFO_DEPS=gnus message emacs-mime -INFO_DEPS_JA=gnus-ja message-ja -INFO_DEPS_INFO=gnus.info message.info emacs-mime.info -INFO_DEPS_JA_INFO=gnus-ja.info message-ja.info - -all: $(INFO_DEPS) -all-info: $(INFO_DEPS_INFO) - -gnus.info: gnus.texi gnus-faq.texi -message.info: message.texi -emacs-mime.info: emacs-mime.texi - -ja: $(INFO_DEPS_JA) -ja-info: $(INFO_DEPS_JA_INFO) - -gnus-ja.info: gnus-ja.texi gnus-faq-ja.texi -message-ja.info: message-ja.texi - -most: texi2latex.elc latex latexps - -%-ja: %-ja.texi - $(EMACSINFO) $< - -%-ja.info: %-ja.texi - $(EMACSINFO) $< t - -%.info: %.texi - if test "x$(MAKEINFO)" = "xno" \ - -o "$<" = "gnus-ja.texi" \ - -o "$<" = "message-ja.texi"; then \ - $(EMACSINFO) $< t; \ - else \ - $(MAKEINFO) -I $(srcdir) -o $@ $<; \ - fi - -.SUFFIXES: .texi .dvi .ps .pdf - -.texi: - if test "x$(MAKEINFO)" = "xno" \ - -o "$<" = "gnus-ja.texi" \ - -o "$<" = "message-ja.texi"; then \ - $(EMACSINFO) $<; \ - else \ - $(MAKEINFO) -I $(srcdir) -o $* $<; \ - fi - -dvi: gnus.dvi message.dvi refcard.dvi emacs-mime.dvi - -pdf: gnus.pdf message.pdf refcard.pdf emacs-mime.pdf - -.texi.dvi : - sed -e '/@iflatex/,/@end iflatex/d' $< > gnustmp.texi - $(TEXI2DVI) -I $(srcdir) gnustmp.texi - cp gnustmp.dvi $*.dvi - rm gnustmp.* - -.texi.pdf : - sed -e '/@iflatex/,/@end iflatex/d' $< > gnustmp.texi - $(TEXI2PDF) -I $(srcdir) gnustmp.texi - cp gnustmp.pdf $*.pdf - rm gnustmp.* - -refcard.dvi: refcard.tex gnuslogo.refcard gnusref.tex - TEXINPUTS=$(srcdir):$$TEXINPUTS $(LATEX) refcard.tex - - -refcard.pdf: refcard.tex gnuslogo.refcard gnusref.tex - epstopdf $(srcdir)/gnuslogo.refcard --outfile=gnuslogo.refcard.pdf - TEXINPUTS=$(srcdir):$$TEXINPUTS $(PDFLATEX) refcard.tex - -clean: - rm -f *.orig *.rej *.elc *~ gnus-[0-9] gnus-[0-9][0-9] - rm -f message-[0-9] - rm -f $(INFO_DEPS) - rm -f gnus-ja-[0-9] gnus-ja-[0-9][0-9] - rm -f message-ja-[0-9] - rm -f $(INFO_DEPS_JA) - rm -f gnus.info-[0-9] gnus.info-[0-9][0-9] - rm -f message.info-[0-9] - rm -f $(INFO_DEPS_INFO) - rm -f gnus-ja.info-[0-9] gnus-ja.info-[0-9][0-9] - rm -f message-ja.info-[0-9] - rm -f $(INFO_DEPS_JA_INFO) - -makeinfo: - makeinfo -o gnus gnus.texi - makeinfo -o message message.texi - -texi2latex.elc: texi2latex.el - srcdir=$(srcdir)/../lisp $(EMACSCOMP) -l $(srcdir)/../lisp/dgnushack.el --eval '(byte-compile-file "$(srcdir)/texi2latex.el")' - -latex gnus.latexi gnus-faq.latexi: $(srcdir)/gnus.texi $(srcdir)/gnus-faq.texi texi2latex.elc - srcdir=$(srcdir) $(EMACSCOMP) -l ./texi2latex.elc -f latexi-translate - -latexps: gnus.latexi tmps - $(MAKE) texi2latex.elc - rm -f gnus.aux - egrep -v "label.*Index|chapter.*Index" gnus.latexi > gnus.tmplatexi1 - TEXINPUTS=$(srcdir):$$TEXINPUTS $(LATEX) gnus.tmplatexi1 - ./splitindex - makeindex -o gnus.kind gnus.kidx - makeindex -o gnus.cind gnus.cidx - makeindex -o gnus.gind gnus.gidx - sed 's/\\char 5E\\relax {}/\\symbol{"5E}/' < gnus.kind > gnus.tmpkind - mv gnus.tmpkind gnus.kind - egrep -v "end\{document\}" gnus.tmplatexi1 > gnus.tmplatexi - cat postamble.tex >> gnus.tmplatexi - $(LATEX) gnus.tmplatexi - $(LATEX) gnus.tmplatexi - $(DVIPS) -t $(PAPERTYPE) -f gnus.dvi > gnus.ps - -pss: - $(MAKE) latex - $(MAKE) latexps - -psout: tmps - $(MAKE) latex - $(MAKE) latexboth - $(MAKE) out - -latexboth: - rm -f gnus-manual-a4.ps.gz gnus-manual-standard.ps.gz - $(MAKE) latexps - mv gnus.ps gnus-manual-a4.ps - gzip gnus-manual-a4.ps - sed 's/,a4paper/,letterpaper/' gnus.latexi > gnus-standard.latexi - mv gnus-standard.latexi gnus.latexi - $(MAKE) latexps PAPERTYPE=letter - mv gnus.ps gnus-manual-standard.ps - gzip gnus-manual-standard.ps - -out: - cp gnus-manual-standard.ps.gz \ - gnus-manual-a4.ps.gz \ - /local/ftp/pub/emacs/gnus/manual - mv gnus-manual-standard.ps.gz \ - gnus-manual-a4.ps.gz \ - /hom/larsi/www_docs/www.gnus.org/documents - -veryclean: clean - rm -f gnus.dvi gnus.ps texi2latex.elc - -distclean: clean - rm -f Makefile - -install: $(INFO_DEPS) - $(SHELL) $(top_srcdir)/mkinstalldirs $(infodir) - @list='$(INFO_DEPS)'; \ - for file in $$list; do \ - for ifile in `echo $$file $$file-[0-9] $$file-[0-9][0-9]`; do \ - if test -f $$ifile; then \ - echo " $(INSTALL_DATA) $$ifile $(infodir)/$$ifile"; \ - $(INSTALL_DATA) $$ifile $(infodir)/$$ifile; \ - else : ; fi; \ - done; \ - done - @if $(SHELL) -c 'install-info --version | sed 1q | fgrep -s -v -i debian' >/dev/null 2>&1; then \ - list='$(INFO_DEPS)'; \ - for file in $$list; do \ - echo " install-info --info-dir=$(infodir) $(infodir)/$$file";\ - install-info --info-dir=$(infodir) $(infodir)/$$file || :;\ - done; \ - else : ; fi - -install-ja: $(INFO_DEPS_JA) - $(MAKE) INFO_DEPS='$(INFO_DEPS_JA)' EMACS="$(EMACS)" \ - infodir="$(infodir)" install - -install-info: $(INFO_DEPS_INFO) - $(MAKE) INFO_DEPS='$(INFO_DEPS_INFO)' EMACS="$(EMACS)" \ - infodir="$(infodir)" install - -install-ja-info: $(INFO_DEPS_JA_INFO) - $(MAKE) INFO_DEPS='$(INFO_DEPS_JA_INFO)' EMACS="$(EMACS)" \ - infodir="$(infodir)" install - -tmps: - if [ ! -e tmp ]; then mkdir tmp; fi - $(MAKE) screens - $(MAKE) herdss - $(MAKE) etcs - $(MAKE) piconss - $(MAKE) xfaces - $(MAKE) smiley - $(MAKE) miscs - -herdss: - cd herds ; for i in new-herd-[0-9]*.gif; do echo $$i; giftopnm $$i | pnmcrop -white | pnmmargin -white 9 | pnmscale 2 | pnmconvol convol5.pnm | ppmtopgm | pnmdepth 255 | pnmtops -width 100 -height 100 -noturn > ../tmp/`basename $$i .gif`.ps; done - cd herds ; giftopnm new-herd-section.gif | pnmscale 4 | pnmconvol convol11.pnm | ppmtopgm | pnmdepth 255 | pnmtops -noturn -width 100 -height 100 > ../tmp/new-herd-section.ps - - -screens: - cd screen ; for i in *.gif; do echo $$i; giftopnm $$i | pnmmargin -black 1 | ppmtopgm | pnmtops -width 100 -height 100 -noturn > ../tmp/`basename $$i .gif`.ps; done - -miscs: - giftopnm misc/larsi.gif | ppmtopgm | pnmtops -noturn > tmp/larsi.ps - tifftopnm misc/eseptember.tif | pnmscale 4 | ppmtopgm | pnmtops -noturn -width 100 -height 100 > tmp/september.ps - tifftopnm misc/fseptember.tif | pnmscale 2 | ppmtopgm | pnmtops -noturn -width 100 -height 100 > tmp/fseptember.ps - tifftopnm misc/fred.tif | pnmscale 2 | ppmtopgm | pnmtops -noturn -width 100 -height 100 > tmp/fred.ps - tifftopnm misc/ered.tif | pnmscale 2 | ppmtopgm | pnmtops -noturn -width 100 -height 100 > tmp/red.ps - -etcs: - cd etc; for i in gnus-*.xpm; do echo $$i; xpmtoppm $$i | ppmtopgm | pnmdepth 255 | pnmtops -noturn > ../tmp/`basename $$i .xpm`.ps; done - -piconss: - cd picons; for i in *.xbm; do echo $$i; xbmtopbm $$i | pnmtops -noturn > ../tmp/picons-`basename $$i .xbm`.ps; done - cd picons; for i in *.gif; do echo $$i; giftopnm $$i | ppmtopgm | pnmtops -noturn > ../tmp/picons-`basename $$i .gif`.ps; done - for i in tmp/picons-*.ps; do echo "\\gnuspicon{$$i}"; done > picons.tex - -xfaces: - cd xface; for i in *.gif; do echo $$i; giftopnm $$i | ppmtopgm | pnmtops -noturn > ../tmp/xface-`basename $$i .gif`.ps; done - for i in tmp/xface-*.ps; do \ - if [ -n "$$a" ]; then a=""; echo "{$$i}"; else \ - a="h"; echo -n "\\gnusxface{$$i}"; fi done > xface.tex; \ - if [ -n "$$a" ]; then echo "{$$i}" >> xface.tex; fi - -smiley: - cd smilies; tifftopnm BigFace.tif | ppmtopgm | pnmtops > ../tmp/BigFace.ps - cd smilies; for i in *.xpm; do echo $$i; sed "s/none/#FFFFFF/" $$i | xpmtoppm | ppmtopgm | pnmdepth 255 | pnmtops > ../tmp/smiley-`basename $$i .xpm`.ps; done - for i in tmp/smiley-*.ps; do \ - if [ -n "$$a" ]; then a=""; echo "{$$i}"; else \ - a="h"; echo -n "\\gnussmiley{$$i}"; fi done > smiley.tex; \ - if [ -n "$$a" ]; then echo "{$$i}" >> smiley.tex; fi - -pspackage: - tar czvf pspackage.tar.gz gnus-faq.texi gnus.texi herds misc pagestyle.sty picons pixidx.sty postamble.tex ps screen smilies splitindex texi2latex.el xface Makefile README etc - -complete: - $(MAKE) texi2latex.elc - $(MAKE) tmps - $(MAKE) pss - -Makefile: $(srcdir)/Makefile.in ../config.status - cd .. \ - && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/texi/TRANSLATION.ja b/texi/TRANSLATION.ja deleted file mode 100644 index 5e0f759..0000000 --- a/texi/TRANSLATION.ja +++ /dev/null @@ -1,27 +0,0 @@ -This file documents about translation policy. -There is an ongoing project to make gnus-ja.texi. -Any volunteers are welcomed. - -$BF|K\8lLu$K4X$9$kN.57$r@bL@$9$k%U%!%$%k$G$9!#(B -gnus-ja.texi $B$r:n@.$9$k%W%m%8%'%/%H$,?J9TCf$G$9!#(B -$B%W%m%8%'%/%H;22C $B$NK]Lu$K4X$9$k5,B'(B -$B$G$9!#$3$N5,B'$O$h$jNI$$$H;W$o$l$k$b$N$,8+$D$+$C$?>l9g$K$OJQ99$5$l$k2D(B -$BG=@-$,$"$j$^$9!#$^$?!"$h$jNI$$0F$d!"B>$N5,B'$rIU$12C$($?$$>l9g$O!"(B -semi-gnus-ja $B%a!<%j%s%0%j%9%H$K$=$N0F$r=q$/$+!"(Bjaist $B$N(B Open CVS $B$K=q(B -$B$-9~$_8"8B$r;}$C$F$$$kJ}$OD>@\=q$-9~$_$r$7$F$/$@$5$$!#(B(CVS $B$N>l9g$G$b!"(B -semi-gnus-ja $B$GJQ99$N9pCN$r$9$k;v$,K>$^$7$$$G$9!#(B) semi-gnus-ja $B%a!<%j(B -$B%s%0%j%9%H$N2CF~$N;EJ}$KIU$$$F$b!">e5-$N(B URI $B$r;2>H$7$F$/$@$5$$!#(B - -1. $B$J$k$Y$/%+%?%+%J$O;H$o$J$$$h$&$K$9$k!#(B - ($BF|K\8l$K$G$-$k$H$3$m$O$J$k$Y$/F|K\8l$K$9$k!#(B - $B>l9g$K$h$C$F$O?7$7$$8l$rDj5A$9$k;v$b$"$k!#(B) - -2. $B1Q8l$rIU2C$7$?J}$,J,$+$j$d$9$$$H;W$o$l$k8l6g$O!"(B - $BF|K\8l$ND>8e$K3g8L$NCf$KF~$l$k!#(B - diff --git a/texi/bembo.sty b/texi/bembo.sty deleted file mode 100644 index e676c3e..0000000 --- a/texi/bembo.sty +++ /dev/null @@ -1,32 +0,0 @@ -% ----------------------------------------------------------------- -% Filename: bembo.sty ( Aldine 401 ) -% Created by: tex bbb -% Created using fontinst v1.335 -% Created for [4allTeX postscript font setup] -% Created on [1996/04/26] -% Use phbfonti.sty file (in 4allTeX package) -% Based on PSNFSS 2.4.1 and 3.x by S. Rahtz -% Put this file in a TEXINPUT directory. -% ----------------------------------------------------------------- -% Can be processed by LaTeX209 and LaTeX2e -\def\fileversion{3q} -\def\filedate{94/10/22} -\def\docdate{94/10/22} -\ifx\ProvidesPackage\undefined -\immediate\write\sixt@@n{File: bembo.sty NFSS1 fontinst (PhB)} -\ifx\selectfont\undefined -\@latexerr{No NFSS1 detected...}\@eha\endinput\fi - -\ifx\declare@font\undefined\input{psnfss.sup}\fi -\def\load@bbb{\postscript@fontdef{Aldine 401 }{bbb}% - {bbbr}{bbbri}{bbbb}{bbbbi}{bbbrc}{bbbro}} -\late@extra@def{bbb}{}{} -\load@bbb -\else -\immediate\write\sixt@@n{File: bembo.sty LaTeX2e fontinst (PhB)} -\ProvidesPackage{bembo}[\filedate\space\fileversion\space - LaTeX2e fontinst (PhB)]\fi - -\def\rmdefault{bbb} -\def\switchfont{} -\endinput diff --git a/texi/dir b/texi/dir deleted file mode 100644 index 08eb94d..0000000 --- a/texi/dir +++ /dev/null @@ -1,10 +0,0 @@ --*- Text -*- -The Gnus-related top node. - -File: dir Node: Top This is the Gnus Info tree - -* Menu: - -* Gnus: (gnus). The news reader Gnus. -* Message: (message). The Message sending thingamabob. -* Emacs MIME: (emacs-mime). Libraries for handling MIME. diff --git a/texi/doclicense.texi b/texi/doclicense.texi deleted file mode 100644 index d580caf..0000000 --- a/texi/doclicense.texi +++ /dev/null @@ -1,368 +0,0 @@ -@c -*-texinfo-*- -@node GNU Free Documentation License, Intro, Copying, Top - -@appendix GNU Free Documentation License -@center Version 1.1, March 2000 - -@display -Copyright (C) 2000 Free Software Foundation, Inc. -59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -Everyone is permitted to copy and distribute verbatim copies -of this license document, but changing it is not allowed. -@end display -@sp 1 -@enumerate 0 -@item -PREAMBLE - -The purpose of this License is to make a manual, textbook, or other -written document ``free'' in the sense of freedom: to assure everyone -the effective freedom to copy and redistribute it, with or without -modifying it, either commercially or noncommercially. Secondarily, -this License preserves for the author and publisher a way to get -credit for their work, while not being considered responsible for -modifications made by others. - -This License is a kind of ``copyleft'', which means that derivative -works of the document must themselves be free in the same sense. It -complements the GNU General Public License, which is a copyleft -license designed for free software. - -We have designed this License in order to use it for manuals for free -software, because free software needs free documentation: a free -program should come with manuals providing the same freedoms that the -software does. But this License is not limited to software manuals; -it can be used for any textual work, regardless of subject matter or -whether it is published as a printed book. We recommend this License -principally for works whose purpose is instruction or reference. - -@sp 1 -@item -APPLICABILITY AND DEFINITIONS - -This License applies to any manual or other work that contains a -notice placed by the copyright holder saying it can be distributed -under the terms of this License. The ``Document'', below, refers to any -such manual or work. Any member of the public is a licensee, and is -addressed as ``you''. - -A ``Modified Version'' of the Document means any work containing the -Document or a portion of it, either copied verbatim, or with -modifications and/or translated into another language. - -A ``Secondary Section'' is a named appendix or a front-matter section of -the Document that deals exclusively with the relationship of the -publishers or authors of the Document to the Document's overall subject -(or to related matters) and contains nothing that could fall directly -within that overall subject. (For example, if the Document is in part a -textbook of mathematics, a Secondary Section may not explain any -mathematics.) The relationship could be a matter of historical -connection with the subject or with related matters, or of legal, -commercial, philosophical, ethical or political position regarding -them. - -The ``Invariant Sections'' are certain Secondary Sections whose titles -are designated, as being those of Invariant Sections, in the notice -that says that the Document is released under this License. - -The ``Cover Texts'' are certain short passages of text that are listed, -as Front-Cover Texts or Back-Cover Texts, in the notice that says that -the Document is released under this License. - -A ``Transparent'' copy of the Document means a machine-readable copy, -represented in a format whose specification is available to the -general public, whose contents can be viewed and edited directly and -straightforwardly with generic text editors or (for images composed of -pixels) generic paint programs or (for drawings) some widely available -drawing editor, and that is suitable for input to text formatters or -for automatic translation to a variety of formats suitable for input -to text formatters. A copy made in an otherwise Transparent file -format whose markup has been designed to thwart or discourage -subsequent modification by readers is not Transparent. A copy that is -not ``Transparent'' is called ``Opaque''. - -Examples of suitable formats for Transparent copies include plain -ASCII without markup, Texinfo input format, LaTeX input format, SGML -or XML using a publicly available DTD, and standard-conforming simple -HTML designed for human modification. Opaque formats include -PostScript, PDF, proprietary formats that can be read and edited only -by proprietary word processors, SGML or XML for which the DTD and/or -processing tools are not generally available, and the -machine-generated HTML produced by some word processors for output -purposes only. - -The ``Title Page'' means, for a printed book, the title page itself, -plus such following pages as are needed to hold, legibly, the material -this License requires to appear in the title page. For works in -formats which do not have any title page as such, ``Title Page'' means -the text near the most prominent appearance of the work's title, -preceding the beginning of the body of the text. -@sp 1 -@item -VERBATIM COPYING - -You may copy and distribute the Document in any medium, either -commercially or noncommercially, provided that this License, the -copyright notices, and the license notice saying this License applies -to the Document are reproduced in all copies, and that you add no other -conditions whatsoever to those of this License. You may not use -technical measures to obstruct or control the reading or further -copying of the copies you make or distribute. However, you may accept -compensation in exchange for copies. If you distribute a large enough -number of copies you must also follow the conditions in section 3. - -You may also lend copies, under the same conditions stated above, and -you may publicly display copies. -@sp 1 -@item -COPYING IN QUANTITY - -If you publish printed copies of the Document numbering more than 100, -and the Document's license notice requires Cover Texts, you must enclose -the copies in covers that carry, clearly and legibly, all these Cover -Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on -the back cover. Both covers must also clearly and legibly identify -you as the publisher of these copies. The front cover must present -the full title with all words of the title equally prominent and -visible. You may add other material on the covers in addition. -Copying with changes limited to the covers, as long as they preserve -the title of the Document and satisfy these conditions, can be treated -as verbatim copying in other respects. - -If the required texts for either cover are too voluminous to fit -legibly, you should put the first ones listed (as many as fit -reasonably) on the actual cover, and continue the rest onto adjacent -pages. - -If you publish or distribute Opaque copies of the Document numbering -more than 100, you must either include a machine-readable Transparent -copy along with each Opaque copy, or state in or with each Opaque copy -a publicly-accessible computer-network location containing a complete -Transparent copy of the Document, free of added material, which the -general network-using public has access to download anonymously at no -charge using public-standard network protocols. If you use the latter -option, you must take reasonably prudent steps, when you begin -distribution of Opaque copies in quantity, to ensure that this -Transparent copy will remain thus accessible at the stated location -until at least one year after the last time you distribute an Opaque -copy (directly or through your agents or retailers) of that edition to -the public. - -It is requested, but not required, that you contact the authors of the -Document well before redistributing any large number of copies, to give -them a chance to provide you with an updated version of the Document. -@sp 1 -@item -MODIFICATIONS - -You may copy and distribute a Modified Version of the Document under -the conditions of sections 2 and 3 above, provided that you release -the Modified Version under precisely this License, with the Modified -Version filling the role of the Document, thus licensing distribution -and modification of the Modified Version to whoever possesses a copy -of it. In addition, you must do these things in the Modified Version: - -A. Use in the Title Page (and on the covers, if any) a title distinct - from that of the Document, and from those of previous versions - (which should, if there were any, be listed in the History section - of the Document). You may use the same title as a previous version - if the original publisher of that version gives permission.@* -B. List on the Title Page, as authors, one or more persons or entities - responsible for authorship of the modifications in the Modified - Version, together with at least five of the principal authors of the - Document (all of its principal authors, if it has less than five).@* -C. State on the Title page the name of the publisher of the - Modified Version, as the publisher.@* -D. Preserve all the copyright notices of the Document.@* -E. Add an appropriate copyright notice for your modifications - adjacent to the other copyright notices.@* -F. Include, immediately after the copyright notices, a license notice - giving the public permission to use the Modified Version under the - terms of this License, in the form shown in the Addendum below.@* -G. Preserve in that license notice the full lists of Invariant Sections - and required Cover Texts given in the Document's license notice.@* -H. Include an unaltered copy of this License.@* -I. Preserve the section entitled ``History'', and its title, and add to - it an item stating at least the title, year, new authors, and - publisher of the Modified Version as given on the Title Page. If - there is no section entitled ``History'' in the Document, create one - stating the title, year, authors, and publisher of the Document as - given on its Title Page, then add an item describing the Modified - Version as stated in the previous sentence.@* -J. Preserve the network location, if any, given in the Document for - public access to a Transparent copy of the Document, and likewise - the network locations given in the Document for previous versions - it was based on. These may be placed in the ``History'' section. - You may omit a network location for a work that was published at - least four years before the Document itself, or if the original - publisher of the version it refers to gives permission.@* -K. In any section entitled ``Acknowledgements'' or ``Dedications'', - preserve the section's title, and preserve in the section all the - substance and tone of each of the contributor acknowledgements - and/or dedications given therein.@* -L. Preserve all the Invariant Sections of the Document, - unaltered in their text and in their titles. Section numbers - or the equivalent are not considered part of the section titles.@* -M. Delete any section entitled ``Endorsements''. Such a section - may not be included in the Modified Version.@* -N. Do not retitle any existing section as ``Endorsements'' - or to conflict in title with any Invariant Section.@* -@sp 1 -If the Modified Version includes new front-matter sections or -appendices that qualify as Secondary Sections and contain no material -copied from the Document, you may at your option designate some or all -of these sections as invariant. To do this, add their titles to the -list of Invariant Sections in the Modified Version's license notice. -These titles must be distinct from any other section titles. - -You may add a section entitled ``Endorsements'', provided it contains -nothing but endorsements of your Modified Version by various -parties--for example, statements of peer review or that the text has -been approved by an organization as the authoritative definition of a -standard. - -You may add a passage of up to five words as a Front-Cover Text, and a -passage of up to 25 words as a Back-Cover Text, to the end of the list -of Cover Texts in the Modified Version. Only one passage of -Front-Cover Text and one of Back-Cover Text may be added by (or -through arrangements made by) any one entity. If the Document already -includes a cover text for the same cover, previously added by you or -by arrangement made by the same entity you are acting on behalf of, -you may not add another; but you may replace the old one, on explicit -permission from the previous publisher that added the old one. - -The author(s) and publisher(s) of the Document do not by this License -give permission to use their names for publicity for or to assert or -imply endorsement of any Modified Version. -@sp 1 -@item -COMBINING DOCUMENTS - -You may combine the Document with other documents released under this -License, under the terms defined in section 4 above for modified -versions, provided that you include in the combination all of the -Invariant Sections of all of the original documents, unmodified, and -list them all as Invariant Sections of your combined work in its -license notice. - -The combined work need only contain one copy of this License, and -multiple identical Invariant Sections may be replaced with a single -copy. If there are multiple Invariant Sections with the same name but -different contents, make the title of each such section unique by -adding at the end of it, in parentheses, the name of the original -author or publisher of that section if known, or else a unique number. -Make the same adjustment to the section titles in the list of -Invariant Sections in the license notice of the combined work. - -In the combination, you must combine any sections entitled ``History'' -in the various original documents, forming one section entitled -``History''; likewise combine any sections entitled ``Acknowledgements'', -and any sections entitled ``Dedications''. You must delete all sections -entitled ``Endorsements.'' -@sp 1 -@item -COLLECTIONS OF DOCUMENTS - -You may make a collection consisting of the Document and other documents -released under this License, and replace the individual copies of this -License in the various documents with a single copy that is included in -the collection, provided that you follow the rules of this License for -verbatim copying of each of the documents in all other respects. - -You may extract a single document from such a collection, and distribute -it individually under this License, provided you insert a copy of this -License into the extracted document, and follow this License in all -other respects regarding verbatim copying of that document. -@sp 1 -@item -AGGREGATION WITH INDEPENDENT WORKS - -A compilation of the Document or its derivatives with other separate -and independent documents or works, in or on a volume of a storage or -distribution medium, does not as a whole count as a Modified Version -of the Document, provided no compilation copyright is claimed for the -compilation. Such a compilation is called an ``aggregate'', and this -License does not apply to the other self-contained works thus compiled -with the Document, on account of their being thus compiled, if they -are not themselves derivative works of the Document. - -If the Cover Text requirement of section 3 is applicable to these -copies of the Document, then if the Document is less than one quarter -of the entire aggregate, the Document's Cover Texts may be placed on -covers that surround only the Document within the aggregate. -Otherwise they must appear on covers around the whole aggregate. -@sp 1 -@item -TRANSLATION - -Translation is considered a kind of modification, so you may -distribute translations of the Document under the terms of section 4. -Replacing Invariant Sections with translations requires special -permission from their copyright holders, but you may include -translations of some or all Invariant Sections in addition to the -original versions of these Invariant Sections. You may include a -translation of this License provided that you also include the -original English version of this License. In case of a disagreement -between the translation and the original English version of this -License, the original English version will prevail. -@sp 1 -@item -TERMINATION - -You may not copy, modify, sublicense, or distribute the Document except -as expressly provided for under this License. Any other attempt to -copy, modify, sublicense or distribute the Document is void, and will -automatically terminate your rights under this License. However, -parties who have received copies, or rights, from you under this -License will not have their licenses terminated so long as such -parties remain in full compliance. -@sp 1 -@item -FUTURE REVISIONS OF THIS LICENSE - -The Free Software Foundation may publish new, revised versions -of the GNU Free Documentation License from time to time. Such new -versions will be similar in spirit to the present version, but may -differ in detail to address new problems or concerns. See -http://www.gnu.org/copyleft/. - -Each version of the License is given a distinguishing version number. -If the Document specifies that a particular numbered version of this -License ``or any later version'' applies to it, you have the option of -following the terms and conditions either of that specified version or -of any later version that has been published (not as a draft) by the -Free Software Foundation. If the Document does not specify a version -number of this License, you may choose any version ever published (not -as a draft) by the Free Software Foundation. - -@end enumerate - -@unnumberedsec ADDENDUM: How to use this License for your documents - -To use this License in a document you have written, include a copy of -the License in the document and put the following copyright and -license notices just after the title page: - -@smallexample -@group - - Copyright (C) @var{year} @var{your name}. - Permission is granted to copy, distribute and/or modify this document - under the terms of the GNU Free Documentation License, Version 1.1 - or any later version published by the Free Software Foundation; - with the Invariant Sections being @var{list their titles}, with the - Front-Cover Texts being @var{list}, and with the Back-Cover Texts being @var{list}. - A copy of the license is included in the section entitled ``GNU - Free Documentation License''. -@end group -@end smallexample -If you have no Invariant Sections, write ``with no Invariant Sections'' -instead of saying which ones are invariant. If you have no -Front-Cover Texts, write ``no Front-Cover Texts'' instead of -``Front-Cover Texts being @var{list}''; likewise for Back-Cover Texts. - -If your document contains nontrivial examples of program code, we -recommend releasing these examples in parallel under your choice of -free software license, such as the GNU General Public License, -to permit their use in free software. diff --git a/texi/emacs-mime.texi b/texi/emacs-mime.texi deleted file mode 100644 index 778229c..0000000 --- a/texi/emacs-mime.texi +++ /dev/null @@ -1,1479 +0,0 @@ -\input texinfo @c -*-texinfo-*- - -@setfilename emacs-mime -@settitle Emacs MIME Manual -@synindex fn cp -@synindex vr cp -@synindex pg cp -@dircategory Emacs -@direntry -* Emacs MIME: (emacs-mime). The MIME de/composition library. -@end direntry -@iftex -@finalout -@end iftex -@setchapternewpage odd - -@ifnottex - -This file documents the Emacs MIME interface functionality. - -Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. - -Permission is granted to copy, distribute and/or modify this document -under the terms of the GNU Free Documentation License, Version 1.1 or -any later version published by the Free Software Foundation; with no -Invariant Sections, with the Front-Cover texts being ``A GNU -Manual'', and with the Back-Cover Texts as in (a) below. A copy of the -license is included in the section entitled ``GNU Free Documentation -License'' in the Emacs manual. - -(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify -this GNU Manual, like GNU software. Copies published by the Free -Software Foundation raise funds for GNU development.'' - -This document is part of a collection distributed under the GNU Free -Documentation License. If you want to distribute this document -separately from the collection, you can do so by adding a copy of the -license to the document, as described in section 6 of the license. -@end ifnottex - -@tex - -@titlepage -@title Emacs MIME Manual - -@author by Lars Magne Ingebrigtsen -@page - -@vskip 0pt plus 1filll -Copyright @copyright{} 1998, 1999, 2000 Free Software Foundation, Inc. - -Permission is granted to copy, distribute and/or modify this document -under the terms of the GNU Free Documentation License, Version 1.1 or -any later version published by the Free Software Foundation; with the -Invariant Sections being none, with the Front-Cover texts being ``A GNU -Manual'', and with the Back-Cover Texts as in (a) below. A copy of the -license is included in the section entitled ``GNU Free Documentation -License'' in the Emacs manual. - -(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify -this GNU Manual, like GNU software. Copies published by the Free -Software Foundation raise funds for GNU development.'' - -This document is part of a collection distributed under the GNU Free -Documentation License. If you want to distribute this document -separately from the collection, you can do so by adding a copy of the -license to the document, as described in section 6 of the license. -@end titlepage -@page - -@end tex - -@node Top -@top Emacs MIME - -This manual documents the libraries used to compose and display -@sc{mime} messages. - -This is not a manual meant for users; it's a manual directed at people -who want to write functions and commands that manipulate @sc{mime} -elements. - -@sc{mime} is short for @dfn{Multipurpose Internet Mail Extensions}. -This standard is documented in a number of RFCs; mainly RFC2045 (Format -of Internet Message Bodies), RFC2046 (Media Types), RFC2047 (Message -Header Extensions for Non-ASCII Text), RFC2048 (Registration -Procedures), RFC2049 (Conformance Criteria and Examples). It is highly -recommended that anyone who intends writing @sc{mime}-compliant software -read at least RFC2045 and RFC2047. - -@menu -* Interface Functions:: An abstraction over the basic functions. -* Basic Functions:: Utility and basic parsing functions. -* Decoding and Viewing:: A framework for decoding and viewing. -* Composing:: MML; a language for describing MIME parts. -* Standards:: A summary of RFCs and working documents used. -* Index:: Function and variable index. -@end menu - - -@node Interface Functions -@chapter Interface Functions -@cindex interface functions -@cindex mail-parse - -The @code{mail-parse} library is an abstraction over the actual -low-level libraries that are described in the next chapter. - -Standards change, and so programs have to change to fit in the new -mold. For instance, RFC2045 describes a syntax for the -@code{Content-Type} header that only allows ASCII characters in the -parameter list. RFC2231 expands on RFC2045 syntax to provide a scheme -for continuation headers and non-ASCII characters. - -The traditional way to deal with this is just to update the library -functions to parse the new syntax. However, this is sometimes the wrong -thing to do. In some instances it may be vital to be able to understand -both the old syntax as well as the new syntax, and if there is only one -library, one must choose between the old version of the library and the -new version of the library. - -The Emacs MIME library takes a different tack. It defines a series of -low-level libraries (@file{rfc2047.el}, @file{rfc2231.el} and so on) -that parses strictly according to the corresponding standard. However, -normal programs would not use the functions provided by these libraries -directly, but instead use the functions provided by the -@code{mail-parse} library. The functions in this library are just -aliases to the corresponding functions in the latest low-level -libraries. Using this scheme, programs get a consistent interface they -can use, and library developers are free to create write code that -handles new standards. - -The following functions are defined by this library: - -@table @code -@item mail-header-parse-content-type -@findex mail-header-parse-content-type -Parse a @code{Content-Type} header and return a list on the following -format: - -@lisp -("type/subtype" - (attribute1 . value1) - (attribute2 . value2) - ...) -@end lisp - -Here's an example: - -@example -(mail-header-parse-content-type - "image/gif; name=\"b980912.gif\"") -@result{} ("image/gif" (name . "b980912.gif")) -@end example - -@item mail-header-parse-content-disposition -@findex mail-header-parse-content-disposition -Parse a @code{Content-Disposition} header and return a list on the same -format as the function above. - -@item mail-content-type-get -@findex mail-content-type-get -Takes two parameters---a list on the format above, and an attribute. -Returns the value of the attribute. - -@example -(mail-content-type-get - '("image/gif" (name . "b980912.gif")) 'name) -@result{} "b980912.gif" -@end example - -@item mail-header-encode-parameter -@findex mail-header-encode-parameter -Takes a parameter string and returns an encoded version of the string. -This is used for parameters in headers like @code{Content-Type} and -@code{Content-Disposition}. - -@item mail-header-remove-comments -@findex mail-header-remove-comments -Return a comment-free version of a header. - -@example -(mail-header-remove-comments - "Gnus/5.070027 (Pterodactyl Gnus v0.27) (Finnish Landrace)") -@result{} "Gnus/5.070027 " -@end example - -@item mail-header-remove-whitespace -@findex mail-header-remove-whitespace -Remove linear white space from a header. Space inside quoted strings -and comments is preserved. - -@example -(mail-header-remove-whitespace - "image/gif; name=\"Name with spaces\"") -@result{} "image/gif;name=\"Name with spaces\"" -@end example - -@item mail-header-get-comment -@findex mail-header-get-comment -Return the last comment in a header. - -@example -(mail-header-get-comment - "Gnus/5.070027 (Pterodactyl Gnus v0.27) (Finnish Landrace)") -@result{} "Finnish Landrace" -@end example - -@item mail-header-parse-address -@findex mail-header-parse-address -Parse an address and return a list containing the mailbox and the -plaintext name. - -@example -(mail-header-parse-address - "Hrvoje Niksic ") -@result{} ("hniksic@@srce.hr" . "Hrvoje Niksic") -@end example - -@item mail-header-parse-addresses -@findex mail-header-parse-addresses -Parse a string with list of addresses and return a list of elements like -the one described above. - -@example -(mail-header-parse-addresses - "Hrvoje Niksic , Steinar Bang ") -@result{} (("hniksic@@srce.hr" . "Hrvoje Niksic") - ("sb@@metis.no" . "Steinar Bang")) -@end example - -@item mail-header-parse-date -@findex mail-header-parse-date -Parse a date string and return an Emacs time structure. - -@item mail-narrow-to-head -@findex mail-narrow-to-head -Narrow the buffer to the header section of the buffer. Point is placed -at the beginning of the narrowed buffer. - -@item mail-header-narrow-to-field -@findex mail-header-narrow-to-field -Narrow the buffer to the header under point. - -@item mail-encode-encoded-word-region -@findex mail-encode-encoded-word-region -Encode the non-ASCII words in the region. For instance, -@samp{Naïve} is encoded as @samp{=?iso-8859-1?q?Na=EFve?=}. - -@item mail-encode-encoded-word-buffer -@findex mail-encode-encoded-word-buffer -Encode the non-ASCII words in the current buffer. This function is -meant to be called narrowed to the headers of a message. - -@item mail-encode-encoded-word-string -@findex mail-encode-encoded-word-string -Encode the words that need encoding in a string, and return the result. - -@example -(mail-encode-encoded-word-string - "This is naïve, baby") -@result{} "This is =?iso-8859-1?q?na=EFve,?= baby" -@end example - -@item mail-decode-encoded-word-region -@findex mail-decode-encoded-word-region -Decode the encoded words in the region. - -@item mail-decode-encoded-word-string -@findex mail-decode-encoded-word-string -Decode the encoded words in the string and return the result. - -@example -(mail-decode-encoded-word-string - "This is =?iso-8859-1?q?na=EFve,?= baby") -@result{} "This is naïve, baby" -@end example - -@end table - -Currently, @code{mail-parse} is an abstraction over @code{ietf-drums}, -@code{rfc2047}, @code{rfc2045} and @code{rfc2231}. These are documented -in the subsequent sections. - - - -@node Basic Functions -@chapter Basic Functions - -This chapter describes the basic, ground-level functions for parsing and -handling. Covered here is parsing @code{From} lines, removing comments -from header lines, decoding encoded words, parsing date headers and so -on. High-level functionality is dealt with in the next chapter -(@pxref{Decoding and Viewing}). - -@menu -* rfc2045:: Encoding @code{Content-Type} headers. -* rfc2231:: Parsing @code{Content-Type} headers. -* ietf-drums:: Handling mail headers defined by RFC822bis. -* rfc2047:: En/decoding encoded words in headers. -* time-date:: Functions for parsing dates and manipulating time. -* qp:: Quoted-Printable en/decoding. -* base64:: Base64 en/decoding. -* binhex:: Binhex decoding. -* uudecode:: Uuencode decoding. -* rfc1843:: Decoding HZ-encoded text. -* mailcap:: How parts are displayed is specified by the @file{.mailcap} file -@end menu - - -@node rfc2045 -@section rfc2045 - -RFC2045 is the ``main'' @sc{mime} document, and as such, one would -imagine that there would be a lot to implement. But there isn't, since -most of the implementation details are delegated to the subsequent -RFCs. - -So @file{rfc2045.el} has only a single function: - -@table @code -@item rfc2045-encode-string -@findex rfc2045-encode-string -Takes a parameter and a value and returns a @samp{PARAM=VALUE} string. -@var{value} will be quoted if there are non-safe characters in it. -@end table - - -@node rfc2231 -@section rfc2231 - -RFC2231 defines a syntax for the @code{Content-Type} and -@code{Content-Disposition} headers. Its snappy name is @dfn{MIME -Parameter Value and Encoded Word Extensions: Character Sets, Languages, -and Continuations}. - -In short, these headers look something like this: - -@example -Content-Type: application/x-stuff; - title*0*=us-ascii'en'This%20is%20even%20more%20; - title*1*=%2A%2A%2Afun%2A%2A%2A%20; - title*2="isn't it!" -@end example - -They usually aren't this bad, though. - -The following functions are defined by this library: - -@table @code -@item rfc2231-parse-string -@findex rfc2231-parse-string -Parse a @code{Content-Type} header and return a list describing its -elements. - -@example -(rfc2231-parse-string - "application/x-stuff; - title*0*=us-ascii'en'This%20is%20even%20more%20; - title*1*=%2A%2A%2Afun%2A%2A%2A%20; - title*2=\"isn't it!\"") -@result{} ("application/x-stuff" - (title . "This is even more ***fun*** isn't it!")) -@end example - -@item rfc2231-get-value -@findex rfc2231-get-value -Takes one of the lists on the format above and returns -the value of the specified attribute. - -@item rfc2231-encode-string -@findex rfc2231-encode-string -Encode a parameter in headers likes @code{Content-Type} and -@code{Content-Disposition}. - -@end table - - -@node ietf-drums -@section ietf-drums - -@dfn{drums} is an IETF working group that is working on the replacement -for RFC822. - -The functions provided by this library include: - -@table @code -@item ietf-drums-remove-comments -@findex ietf-drums-remove-comments -Remove the comments from the argument and return the results. - -@item ietf-drums-remove-whitespace -@findex ietf-drums-remove-whitespace -Remove linear white space from the string and return the results. -Spaces inside quoted strings and comments are left untouched. - -@item ietf-drums-get-comment -@findex ietf-drums-get-comment -Return the last most comment from the string. - -@item ietf-drums-parse-address -@findex ietf-drums-parse-address -Parse an address string and return a list that contains the mailbox and -the plain text name. - -@item ietf-drums-parse-addresses -@findex ietf-drums-parse-addresses -Parse a string that contains any number of comma-separated addresses and -return a list that contains mailbox/plain text pairs. - -@item ietf-drums-parse-date -@findex ietf-drums-parse-date -Parse a date string and return an Emacs time structure. - -@item ietf-drums-narrow-to-header -@findex ietf-drums-narrow-to-header -Narrow the buffer to the header section of the current buffer. - -@end table - - -@node rfc2047 -@section rfc2047 - -RFC2047 (Message Header Extensions for Non-ASCII Text) specifies how -non-ASCII text in headers are to be encoded. This is actually rather -complicated, so a number of variables are necessary to tweak what this -library does. - -The following variables are tweakable: - -@table @code -@item rfc2047-default-charset -@vindex rfc2047-default-charset -Characters in this charset should not be decoded by this library. -This defaults to @code{iso-8859-1}. - -@item rfc2047-header-encoding-list -@vindex rfc2047-header-encoding-list -This is an alist of header / encoding-type pairs. Its main purpose is -to prevent encoding of certain headers. - -The keys can either be header regexps, or @code{t}. - -The values can be either @code{nil}, in which case the header(s) in -question won't be encoded, or @code{mime}, which means that they will be -encoded. - -@item rfc2047-charset-encoding-alist -@vindex rfc2047-charset-encoding-alist -RFC2047 specifies two forms of encoding---@code{Q} (a -Quoted-Printable-like encoding) and @code{B} (base64). This alist -specifies which charset should use which encoding. - -@item rfc2047-encoding-function-alist -@vindex rfc2047-encoding-function-alist -This is an alist of encoding / function pairs. The encodings are -@code{Q}, @code{B} and @code{nil}. - -@item rfc2047-q-encoding-alist -@vindex rfc2047-q-encoding-alist -The @code{Q} encoding isn't quite the same for all headers. Some -headers allow a narrower range of characters, and that is what this -variable is for. It's an alist of header regexps / allowable character -ranges. - -@item rfc2047-encoded-word-regexp -@vindex rfc2047-encoded-word-regexp -When decoding words, this library looks for matches to this regexp. - -@end table - -Those were the variables, and these are this functions: - -@table @code -@item rfc2047-narrow-to-field -@findex rfc2047-narrow-to-field -Narrow the buffer to the header on the current line. - -@item rfc2047-encode-message-header -@findex rfc2047-encode-message-header -Should be called narrowed to the header of a message. Encodes according -to @code{rfc2047-header-encoding-alist}. - -@item rfc2047-encode-region -@findex rfc2047-encode-region -Encodes all encodable words in the region specified. - -@item rfc2047-encode-string -@findex rfc2047-encode-string -Encode a string and return the results. - -@item rfc2047-decode-region -@findex rfc2047-decode-region -Decode the encoded words in the region. - -@item rfc2047-decode-string -@findex rfc2047-decode-string -Decode a string and return the results. - -@end table - - -@node time-date -@section time-date - -While not really a part of the @sc{mime} library, it is convenient to -document this library here. It deals with parsing @code{Date} headers -and manipulating time. (Not by using tesseracts, though, I'm sorry to -say.) - -These functions convert between five formats: A date string, an Emacs -time structure, a decoded time list, a second number, and a day number. - -Here's a bunch of time/date/second/day examples: - -@example -(parse-time-string "Sat Sep 12 12:21:54 1998 +0200") -@result{} (54 21 12 12 9 1998 6 nil 7200) - -(date-to-time "Sat Sep 12 12:21:54 1998 +0200") -@result{} (13818 19266) - -(time-to-seconds '(13818 19266)) -@result{} 905595714.0 - -(seconds-to-time 905595714.0) -@result{} (13818 19266 0) - -(time-to-days '(13818 19266)) -@result{} 729644 - -(days-to-time 729644) -@result{} (961933 65536) - -(time-since '(13818 19266)) -@result{} (0 430) - -(time-less-p '(13818 19266) '(13818 19145)) -@result{} nil - -(subtract-time '(13818 19266) '(13818 19145)) -@result{} (0 121) - -(days-between "Sat Sep 12 12:21:54 1998 +0200" - "Sat Sep 07 12:21:54 1998 +0200") -@result{} 5 - -(date-leap-year-p 2000) -@result{} t - -(time-to-day-in-year '(13818 19266)) -@result{} 255 - -(time-to-number-of-days - (time-since - (date-to-time "Mon, 01 Jan 2001 02:22:26 GMT"))) -@result{} 4.146122685185185 -@end example - -And finally, we have @code{safe-date-to-time}, which does the same as -@code{date-to-time}, but returns a zero time if the date is -syntactically malformed. - -The five data representations used are the following: - -@table @var -@item date -An RFC822 (or similar) date string. For instance: @code{"Sat Sep 12 -12:21:54 1998 +0200"}. - -@item time -An internal Emacs time. For instance: @code{(13818 26466)}. - -@item seconds -A floating point representation of the internal Emacs time. For -instance: @code{905595714.0}. - -@item days -An integer number representing the number of days since 00000101. For -instance: @code{729644}. - -@item decoded time -A list of decoded time. For instance: @code{(54 21 12 12 9 1998 6 t -7200)}. -@end table - -All the examples above represent the same moment. - -These are the functions available: - -@table @code -@item date-to-time -Take a date and return a time. - -@item time-to-seconds -Take a time and return seconds. - -@item seconds-to-time -Take seconds and return a time. - -@item time-to-days -Take a time and return days. - -@item days-to-time -Take days and return a time. - -@item date-to-day -Take a date and return days. - -@item time-to-number-of-days -Take a time and return the number of days that represents. - -@item safe-date-to-time -Take a date and return a time. If the date is not syntactically valid, -return a "zero" date. - -@item time-less-p -Take two times and say whether the first time is less (i. e., earlier) -than the second time. - -@item time-since -Take a time and return a time saying how long it was since that time. - -@item subtract-time -Take two times and subtract the second from the first. I. e., return -the time between the two times. - -@item days-between -Take two days and return the number of days between those two days. - -@item date-leap-year-p -Take a year number and say whether it's a leap year. - -@item time-to-day-in-year -Take a time and return the day number within the year that the time is -in. - -@end table - - -@node qp -@section qp - -This library deals with decoding and encoding Quoted-Printable text. - -Very briefly explained, qp encoding means translating all 8-bit -characters (and lots of control characters) into things that look like -@samp{=EF}; that is, an equal sign followed by the byte encoded as a hex -string. - -The following functions are defined by the library: - -@table @code -@item quoted-printable-decode-region -@findex quoted-printable-decode-region -QP-decode all the encoded text in the specified region. - -@item quoted-printable-decode-string -@findex quoted-printable-decode-string -Decode the QP-encoded text in a string and return the results. - -@item quoted-printable-encode-region -@findex quoted-printable-encode-region -QP-encode all the encodable characters in the specified region. The third -optional parameter @var{fold} specifies whether to fold long lines. -(Long here means 72.) - -@item quoted-printable-encode-string -@findex quoted-printable-encode-string -QP-encode all the encodable characters in a string and return the -results. - -@end table - - -@node base64 -@section base64 -@cindex base64 - -Base64 is an encoding that encodes three bytes into four characters, -thereby increasing the size by about 33%. The alphabet used for -encoding is very resistant to mangling during transit. - -The following functions are defined by this library: - -@table @code -@item base64-encode-region -@findex base64-encode-region -base64 encode the selected region. Return the length of the encoded -text. Optional third argument @var{no-line-break} means do not break -long lines into shorter lines. - -@item base64-encode-string -@findex base64-encode-string -base64 encode a string and return the result. - -@item base64-decode-region -@findex base64-decode-region -base64 decode the selected region. Return the length of the decoded -text. If the region can't be decoded, return @code{nil} and don't -modify the buffer. - -@item base64-decode-string -@findex base64-decode-string -base64 decode a string and return the result. If the string can't be -decoded, @code{nil} is returned. - -@end table - - -@node binhex -@section binhex -@cindex binhex -@cindex Apple -@cindex Macintosh - -@code{binhex} is an encoding that originated in Macintosh environments. -The following function is supplied to deal with these: - -@table @code -@item binhex-decode-region -@findex binhex-decode-region -Decode the encoded text in the region. If given a third parameter, only -decode the @code{binhex} header and return the filename. - -@end table - - -@node uudecode -@section uudecode -@cindex uuencode -@cindex uudecode - -@code{uuencode} is probably still the most popular encoding of binaries -used on Usenet, although @code{base64} rules the mail world. - -The following function is supplied by this package: - -@table @code -@item uudecode-decode-region -@findex uudecode-decode-region -Decode the text in the region. -@end table - - -@node rfc1843 -@section rfc1843 -@cindex rfc1843 -@cindex HZ -@cindex Chinese - -RFC1843 deals with mixing Chinese and ASCII characters in messages. In -essence, RFC1843 switches between ASCII and Chinese by doing this: - -@example -This sentence is in ASCII. -The next sentence is in GB.~@{<:Ky2;S@{#,NpJ)l6HK!#~@}Bye. -@end example - -Simple enough, and widely used in China. - -The following functions are available to handle this encoding: - -@table @code -@item rfc1843-decode-region -Decode HZ-encoded text in the region. - -@item rfc1843-decode-string -Decode a HZ-encoded string and return the result. - -@end table - - -@node mailcap -@section mailcap - -The @file{~/.mailcap} file is parsed by most @sc{mime}-aware message -handlers and describes how elements are supposed to be displayed. -Here's an example file: - -@example -image/*; gimp -8 %s -audio/wav; wavplayer %s -@end example - -This says that all image files should be displayed with @code{gimp}, and -that realaudio files should be played by @code{rvplayer}. - -The @code{mailcap} library parses this file, and provides functions for -matching types. - -@table @code -@item mailcap-mime-data -@vindex mailcap-mime-data -This variable is an alist of alists containing backup viewing rules. - -@end table - -Interface functions: - -@table @code -@item mailcap-parse-mailcaps -@findex mailcap-parse-mailcaps -Parse the @code{~/.mailcap} file. - -@item mailcap-mime-info -Takes a @sc{mime} type as its argument and returns the matching viewer. - -@end table - - - - -@node Decoding and Viewing -@chapter Decoding and Viewing - -This chapter deals with decoding and viewing @sc{mime} messages on a -higher level. - -The main idea is to first analyze a @sc{mime} article, and then allow -other programs to do things based on the list of @dfn{handles} that are -returned as a result of this analysis. - -@menu -* Dissection:: Analyzing a @sc{mime} message. -* Non-MIME:: Analyzing a non-@sc{mime} message. -* Handles:: Handle manipulations. -* Display:: Displaying handles. -* Customization:: Variables that affect display. -* New Viewers:: How to write your own viewers. -@end menu - - -@node Dissection -@section Dissection - -The @code{mm-dissect-buffer} is the function responsible for dissecting -a @sc{mime} article. If given a multipart message, it will recursively -descend the message, following the structure, and return a tree of -@sc{mime} handles that describes the structure of the message. - -@node Non-MIME -@section Non-MIME - -Gnus also understands some non-MIME attachments, such as postscript, -uuencode, binhex, shar, forward, gnatsweb, pgp. Each of these features -can be disabled by add an item into @code{mm-uu-configure-list}. -For example, - -@lisp -(require 'mm-uu) -(add-to-list 'mm-uu-configure-list '(pgp-signed . disabled)) -@end lisp - -@table @code -@item postscript -@findex postscript -Postscript file. - -@item uu -@findex uu -Uuencoded file. - -@item binhex -@findex binhex -Binhex encoded file. - -@item shar -@findex shar -Shar archive file. - -@item forward -@findex forward -Non-@sc{mime} forwarded message. - -@item gnatsweb -@findex gnatsweb -Gnatsweb attachment. - -@item pgp-signed -@findex pgp-signed -PGP signed clear text. - -@item pgp-encrypted -@findex pgp-encrypted -PGP encrypted clear text. - -@item pgp-key -@findex pgp-key -PGP public keys. - -@item emacs-sources -@findex emacs-sources -Emacs source code. This item works only in the groups matching -@code{mm-uu-emacs-sources-regexp}. - -@end table - -@node Handles -@section Handles - -A @sc{mime} handle is a list that fully describes a @sc{mime} -component. - -The following macros can be used to access elements in a handle: - -@table @code -@item mm-handle-buffer -@findex mm-handle-buffer -Return the buffer that holds the contents of the undecoded @sc{mime} -part. - -@item mm-handle-type -@findex mm-handle-type -Return the parsed @code{Content-Type} of the part. - -@item mm-handle-encoding -@findex mm-handle-encoding -Return the @code{Content-Transfer-Encoding} of the part. - -@item mm-handle-undisplayer -@findex mm-handle-undisplayer -Return the object that can be used to remove the displayed part (if it -has been displayed). - -@item mm-handle-set-undisplayer -@findex mm-handle-set-undisplayer -Set the undisplayer object. - -@item mm-handle-disposition -@findex mm-handle-disposition -Return the parsed @code{Content-Disposition} of the part. - -@item mm-handle-disposition -@findex mm-handle-disposition -Return the description of the part. - -@item mm-get-content-id -Returns the handle(s) referred to by @code{Content-ID}. - -@end table - - -@node Display -@section Display - -Functions for displaying, removing and saving. - -@table @code -@item mm-display-part -@findex mm-display-part -Display the part. - -@item mm-remove-part -@findex mm-remove-part -Remove the part (if it has been displayed). - -@item mm-inlinable-p -@findex mm-inlinable-p -Say whether a @sc{mime} type can be displayed inline. - -@item mm-automatic-display-p -@findex mm-automatic-display-p -Say whether a @sc{mime} type should be displayed automatically. - -@item mm-destroy-part -@findex mm-destroy-part -Free all resources occupied by a part. - -@item mm-save-part -@findex mm-save-part -Offer to save the part in a file. - -@item mm-pipe-part -@findex mm-pipe-part -Offer to pipe the part to some process. - -@item mm-interactively-view-part -@findex mm-interactively-view-part -Prompt for a mailcap method to use to view the part. - -@end table - - -@node Customization -@section Customization - -@table @code - -@item mm-inline-media-tests -This is an alist where the key is a @sc{mime} type, the second element -is a function to display the part @dfn{inline} (i.e., inside Emacs), and -the third element is a form to be @code{eval}ed to say whether the part -can be displayed inline. - -This variable specifies whether a part @emph{can} be displayed inline, -and, if so, how to do it. It does not say whether parts are -@emph{actually} displayed inline. - -@item mm-inlined-types -This, on the other hand, says what types are to be displayed inline, if -they satisfy the conditions set by the variable above. It's a list of -@sc{mime} media types. - -@item mm-automatic-display -This is a list of types that are to be displayed ``automatically'', but -only if the above variable allows it. That is, only inlinable parts can -be displayed automatically. - -@item mm-attachment-override-types -Some @sc{mime} agents create parts that have a content-disposition of -@samp{attachment}. This variable allows overriding that disposition and -displaying the part inline. (Note that the disposition is only -overridden if we are able to, and want to, display the part inline.) - -@item mm-discouraged-alternatives -List of @sc{mime} types that are discouraged when viewing -@samp{multipart/alternative}. Viewing agents are supposed to view the -last possible part of a message, as that is supposed to be the richest. -However, users may prefer other types instead, and this list says what -types are most unwanted. If, for instance, @samp{text/html} parts are -very unwanted, and @samp{text/richtech} parts are somewhat unwanted, -then the value of this variable should be set to: - -@lisp -("text/html" "text/richtext") -@end lisp - -@item mm-inline-large-images-p -When displaying inline images that are larger than the window, XEmacs -does not enable scrolling, which means that you cannot see the whole -image. To prevent this, the library tries to determine the image size -before displaying it inline, and if it doesn't fit the window, the -library will display it externally (e.g. with @samp{ImageMagick} or -@samp{xv}). Setting this variable to @code{t} disables this check and -makes the library display all inline images as inline, regardless of -their size. - -@item mm-inline-override-p -@code{mm-inlined-types} may include regular expressions, for example to -specify that all @samp{text/.*} parts be displayed inline. If a user -prefers to have a type that matches such a regular expression be treated -as an attachment, that can be accomplished by setting this variable to a -list containing that type. For example assuming @code{mm-inlined-types} -includes @samp{text/.*}, then including @samp{text/html} in this -variable will cause @samp{text/html} parts to be treated as attachments. - -@end table - - -@node New Viewers -@section New Viewers - -Here's an example viewer for displaying @code{text/enriched} inline: - -@lisp -(defun mm-display-enriched-inline (handle) - (let (text) - (with-temp-buffer - (mm-insert-part handle) - (save-window-excursion - (enriched-decode (point-min) (point-max)) - (setq text (buffer-string)))) - (mm-insert-inline handle text))) -@end lisp - -We see that the function takes a @sc{mime} handle as its parameter. It -then goes to a temporary buffer, inserts the text of the part, does some -work on the text, stores the result, goes back to the buffer it was -called from and inserts the result. - -The two important helper functions here are @code{mm-insert-part} and -@code{mm-insert-inline}. The first function inserts the text of the -handle in the current buffer. It handles charset and/or content -transfer decoding. The second function just inserts whatever text you -tell it to insert, but it also sets things up so that the text can be -``undisplayed' in a convenient manner. - - -@node Composing -@chapter Composing -@cindex Composing -@cindex MIME Composing -@cindex MML -@cindex MIME Meta Language - -Creating a @sc{mime} message is boring and non-trivial. Therefore, a -library called @code{mml} has been defined that parses a language called -MML (@sc{mime} Meta Language) and generates @sc{mime} messages. - -@findex mml-generate-mime -The main interface function is @code{mml-generate-mime}. It will -examine the contents of the current (narrowed-to) buffer and return a -string containing the @sc{mime} message. - -@menu -* Simple MML Example:: An example MML document. -* MML Definition:: All valid MML elements. -* Advanced MML Example:: Another example MML document. -* Charset Translation:: How charsets are mapped from @sc{mule} to MIME. -* Conversion:: Going from @sc{mime} to MML and vice versa. -@end menu - - -@node Simple MML Example -@section Simple MML Example - -Here's a simple @samp{multipart/alternative}: - -@example -<#multipart type=alternative> -This is a plain text part. -<#part type=text/enriched> -
    This is a centered enriched part
    -<#/multipart> -@end example - -After running this through @code{mml-generate-mime}, we get this: - -@example -Content-Type: multipart/alternative; boundary="=-=-=" - - ---=-=-= - - -This is a plain text part. - ---=-=-= -Content-Type: text/enriched - - -
    This is a centered enriched part
    - ---=-=-=-- -@end example - - -@node MML Definition -@section MML Definition - -The MML language is very simple. It looks a bit like an SGML -application, but it's not. - -The main concept of MML is the @dfn{part}. Each part can be of a -different type or use a different charset. The way to delineate a part -is with a @samp{<#part ...>} tag. Multipart parts can be introduced -with the @samp{<#multipart ...>} tag. Parts are ended by the -@samp{<#/part>} or @samp{<#/multipart>} tags. Parts started with the -@samp{<#part ...>} tags are also closed by the next open tag. - -There's also the @samp{<#external ...>} tag. These introduce -@samp{external/message-body} parts. - -Each tag can contain zero or more parameters on the form -@samp{parameter=value}. The values may be enclosed in quotation marks, -but that's not necessary unless the value contains white space. So -@samp{filename=/home/user/#hello$^yes} is perfectly valid. - -The following parameters have meaning in MML; parameters that have no -meaning are ignored. The MML parameter names are the same as the -@sc{mime} parameter names; the things in the parentheses say which -header it will be used in. - -@table @samp -@item type -The @sc{mime} type of the part (@code{Content-Type}). - -@item filename -Use the contents of the file in the body of the part -(@code{Content-Disposition}). - -@item charset -The contents of the body of the part are to be encoded in the character -set speficied (@code{Content-Type}). - -@item name -Might be used to suggest a file name if the part is to be saved -to a file (@code{Content-Type}). - -@item disposition -Valid values are @samp{inline} and @samp{attachment} -(@code{Content-Disposition}). - -@item encoding -Valid values are @samp{7bit}, @samp{8bit}, @samp{quoted-printable} and -@samp{base64} (@code{Content-Transfer-Encoding}). - -@item description -A description of the part (@code{Content-Description}). - -@item creation-date -RFC822 date when the part was created (@code{Content-Disposition}). - -@item modification-date -RFC822 date when the part was modified (@code{Content-Disposition}). - -@item read-date -RFC822 date when the part was read (@code{Content-Disposition}). - -@item size -The size (in octets) of the part (@code{Content-Disposition}). - -@item sign -What technology to sign this MML part with (@code{smime} or -@code{pgpmime}) - -@item encrypt -What technology to encrypt this MML part with (@code{smime} or -@code{pgpmime}) - -@end table - -Parameters for @samp{application/octet-stream}: - -@table @samp -@item type -Type of the part; informal---meant for human readers -(@code{Content-Type}). -@end table - -Parameters for @samp{message/external-body}: - -@table @samp -@item access-type -A word indicating the supported access mechanism by which the file may -be obtained. Values include @samp{ftp}, @samp{anon-ftp}, @samp{tftp}, -@samp{localfile}, and @samp{mailserver}. (@code{Content-Type}.) - -@item expiration -The RFC822 date after which the file may no longer be fetched. -(@code{Content-Type}.) - -@item size -The size (in octets) of the file. (@code{Content-Type}.) - -@item permission -Valid values are @samp{read} and @samp{read-write} -(@code{Content-Type}). - -@end table - -Parameters for @samp{sign=smime}: - -@table @samp - -@item keyfile -File containing key and certificate for signer. - -@end table - -Parameters for @samp{encrypt=smime}: - -@table @samp - -@item certfile -File containing certificate for recipient. - -@end table - - -@node Advanced MML Example -@section Advanced MML Example - -Here's a complex multipart message. It's a @samp{multipart/mixed} that -contains many parts, one of which is a @samp{multipart/alternative}. - -@example -<#multipart type=mixed> -<#part type=image/jpeg filename=~/rms.jpg disposition=inline> -<#multipart type=alternative> -This is a plain text part. -<#part type=text/enriched name=enriched.txt> -
    This is a centered enriched part
    -<#/multipart> -This is a new plain text part. -<#part disposition=attachment> -This plain text part is an attachment. -<#/multipart> -@end example - -And this is the resulting @sc{mime} message: - -@example -Content-Type: multipart/mixed; boundary="=-=-=" - - ---=-=-= - - - ---=-=-= -Content-Type: image/jpeg; - filename="~/rms.jpg" -Content-Disposition: inline; - filename="~/rms.jpg" -Content-Transfer-Encoding: base64 - -/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRof -Hh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/wAALCAAwADABAREA/8QAHwAA -AQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQR -BRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RF -RkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ip -qrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/9oACAEB -AAA/AO/rifFHjldNuGsrDa0qcSSHkA+gHrXKw+LtWLrMb+RgTyhbr+HSug07xNqV9fQtZrNI -AyiaE/NuBPOOOP0rvRNE880KOC8TbXXGCv1FPqjrF4LDR7u5L7SkTFT/ALWOP1xXgTuXfc7E -sx6nua6rwp4IvvEM8chCxWxOdzn7wz6V9AaB4S07w9p5itow0rDLSY5Pt9K43xO66P4xs71m -2QXiGCbA4yOVJ9+1aYORkdK434lyNH4ahCnG66VT9Nj15JFbPdX0MS43M4VQf5/yr2vSpLnw -5ZW8dlCZ8KFXjOPX0/mK6rSPEGt3Angu44fNEReHYNvIH3TzXDeKNO8RX+kSX2ouZkicTIOc -L+g7E810ulFjpVtv3bwgB3HJyK5L4quY/C9sVxk3ij/xx6850u7t1mtp/wDlpEw3An3Jr3Dw -34gsbWza4nBlhC5LDsaW6+IFgupQyCF3iHH7gA7c9R9ay7zx6t7aX9jHC4smhfBkGCvHGfrm -tLQ7hbnRrV1GPkAP1x1/Hr+Ncr8Vzjwrbf8AX6v/AKA9eQRyYlQk8Yx9K6XTNbkgia2ciSIn -7p5Ga9Atte0LTLKO6it4i7dVRFJDcZ4PvXN+JvEMF9bILVGXJLSZ4zkjivRPDaeX4b08HOTC -pOffmua+KkbS+GLVUGT9tT/0B68eeIpIFYjB70+OOVXyoOM9+M1eaWeCLzHPyHGO/NVWvJJm -jQ8KGH1NfQWhXSXmh2c8eArRLwO3HSv/2Q== - ---=-=-= -Content-Type: multipart/alternative; boundary="==-=-=" - - ---==-=-= - - -This is a plain text part. - ---==-=-= -Content-Type: text/enriched; - name="enriched.txt" - - -
    This is a centered enriched part
    - ---==-=-=-- - ---=-=-= - -This is a new plain text part. - ---=-=-= -Content-Disposition: attachment - - -This plain text part is an attachment. - ---=-=-=-- -@end example - -@node Charset Translation -@section Charset Translation -@cindex charsets - -During translation from MML to @sc{mime}, for each @sc{mime} part which -has been composed inside Emacs, an appropriate charset has to be chosen. - -@vindex mail-parse-charset -If you are running a non-@sc{mule} Emacs, this process is simple: If the -part contains any non-ASCII (8-bit) characters, the @sc{mime} charset -given by @code{mail-parse-charset} (a symbol) is used. (Never set this -variable directly, though. If you want to change the default charset, -please consult the documentation of the package which you use to process -@sc{mime} messages. -@xref{Various Message Variables, , Various Message Variables, message, - Message Manual}, for example.) -If there are only ASCII characters, the @sc{mime} charset US-ASCII is -used, of course. - -@cindex MULE -@cindex UTF-8 -@cindex Unicode -@vindex mm-mime-mule-charset-alist -Things are slightly more complicated when running Emacs with @sc{mule} -support. In this case, a list of the @sc{mule} charsets used in the -part is obtained, and the @sc{mule} charsets are translated to @sc{mime} -charsets by consulting the variable @code{mm-mime-mule-charset-alist}. -If this results in a single @sc{mime} charset, this is used to encode -the part. But if the resulting list of @sc{mime} charsets contains more -than one element, two things can happen: If it is possible to encode the -part via UTF-8, this charset is used. (For this, Emacs must support -the @code{utf-8} coding system, and the part must consist entirely of -characters which have Unicode counterparts.) If UTF-8 is not available -for some reason, the part is split into several ones, so that each one -can be encoded with a single @sc{mime} charset. The part can only be -split at line boundaries, though---if more than one @sc{mime} charset is -required to encode a single line, it is not possible to encode the part. - -@node Conversion -@section Conversion - -@findex mime-to-mml -A (multipart) @sc{mime} message can be converted to MML with the -@code{mime-to-mml} function. It works on the message in the current -buffer, and substitutes MML markup for @sc{mime} boundaries. -Non-textual parts do not have their contents in the buffer, but instead -have the contents in separate buffers that are referred to from the MML -tags. - -@findex mml-to-mime -An MML message can be converted back to @sc{mime} by the -@code{mml-to-mime} function. - -These functions are in certain senses ``lossy''---you will not get back -an identical message if you run @sc{mime-to-mml} and then -@sc{mml-to-mime}. Not only will trivial things like the order of the -headers differ, but the contents of the headers may also be different. -For instance, the original message may use base64 encoding on text, -while @sc{mml-to-mime} may decide to use quoted-printable encoding, and -so on. - -In essence, however, these two functions should be the inverse of each -other. The resulting contents of the message should remain equivalent, -if not identical. - - -@node Standards -@chapter Standards - -The Emacs @sc{mime} library implements handling of various elements -according to a (somewhat) large number of RFCs, drafts and standards -documents. This chapter lists the relevant ones. They can all be -fetched from @samp{http://quimby.gnus.org/notes/}. - -@table @dfn -@item RFC822 -@itemx STD11 -Standard for the Format of ARPA Internet Text Messages. - -@item RFC1036 -Standard for Interchange of USENET Messages - -@item RFC2045 -Format of Internet Message Bodies - -@item RFC2046 -Media Types - -@item RFC2047 -Message Header Extensions for Non-ASCII Text - -@item RFC2048 -Registration Procedures - -@item RFC2049 -Conformance Criteria and Examples - -@item RFC2231 -MIME Parameter Value and Encoded Word Extensions: Character Sets, -Languages, and Continuations - -@item RFC1843 -HZ - A Data Format for Exchanging Files of Arbitrarily Mixed Chinese and -ASCII characters - -@item draft-ietf-drums-msg-fmt-05.txt -Draft for the successor of RFC822 - -@item RFC2112 -The MIME Multipart/Related Content-type - -@item RFC1892 -The Multipart/Report Content Type for the Reporting of Mail System -Administrative Messages - -@item RFC2183 -Communicating Presentation Information in Internet Messages: The -Content-Disposition Header Field - -@end table - - -@node Index -@chapter Index -@printindex cp - -@summarycontents -@contents -@bye - -@c End: diff --git a/texi/gnus-faq-ja.texi b/texi/gnus-faq-ja.texi deleted file mode 100644 index 650ab7b..0000000 --- a/texi/gnus-faq-ja.texi +++ /dev/null @@ -1,441 +0,0 @@ -@c Insert "\input texinfo" at 1st line before texing this file alone. -@c -*-texinfo-*- -@c Copyright (C) 1998 Keiichi Suzuki -@setfilename gnus-faq-ja.info - -@node Frequently Asked Questions -@section $BIQHK$K?R$M$i$l$kR2p!#(B -* Installation FAQ:: Gnus $B$NF3F~!#(B -* Customization FAQ:: Gnus $B$N%+%9%?%^%$%:!#(B -* Reading News FAQ:: $B%K%e!<%9$rFI$`;v$K4X$9$kR2p(B -$B$3$NJ8=q$O(B T-gnus $B$KBP$9$k$h$/$"$ke$GF0:n$9$k%M%C%H%K%e!<%9!&%j!<%@!<(B / $BEE;R%a!<%k!&%f!<(B -$B%6!$=$&$H7h0U$7$^$7$?!#(B - -$B$7$+$7!"(B Gnus $BC1FH$G$O(B MIME $B2=$5$l$?5-;v!&%a!<%k$rFI$`$3$H$O$G$-$^$;$s!#(B -$B$=$3$G!"(B Emacs $B>e$G(B MIME $B%5%]!<%H$r$9$k$?$a$N%Q%C%1!<%8$G$"$k(B SEMI $B$r;H(B -$BMQ$7$F0lIt$N?M$?$A$,(B Gnus $B$r;HMQ$9$k$h$&$K$J$j$^$7$?!#$7$+$7!"$3$l$K$O(B -Gnus $B$K(B patch $B$r$"$F$kI,MW$,$"$k>e$K%*%j%8%J%k$N(B Gnus ($B$3$A$i$b(B -Quassia-Gnus $B$H8F$P$l3+H/ESCf$G$7$?(B)$B$NJQ99FbMF$K$h$C$F$O$=$N(B patch $B<+BN(B -$B$b:n$jD>$5$J$1$l$P$J$j$^$;$s$G$7$?!#$=$s$J(B 1997$BG/$N(B11$B7n!" $B$O<~0O(B($B9%$-/62I]$r46$8$k$+$bCN$l$^$;$s!"$7$+$7!"$"(B -$B$J$?$,$=$N5!G=$rI,MW$K$J$k$^$G$OJ#;($J5!G=$N$[$H$s$I$rL5;k$9$k$3$H$,$G$-(B -$B$^$9!#(B $B$b$7!"$"$J$?$,$^$"$^$"$NNL$N%a%$%k$ro$KN.NL$NB?$$%a!<%j%s%0%j%9%H$K;22C$7(B -$B$F$$$k$N$G$"$l$P!"$"$J$?$O(B T-gnus $B$G%a%$%k$rFI$`$?$a$ND4::$r$O$8$a$?$/$J(B -$B$k$G$7$g$&!#(B - -$B$3$N(B FAQ $B$O!"NkLZ7=0l$K$h$C$FJ]$NJ}K!(B($B%a%$%k!"%M%C%H%K%e!<%9Ey(B)$B$G>pJs$rF@$h$&$H$9$kA0$K!"$^$:$3$N(B FAQ -$B$r8+$F$_$F$/$@$5$$!#(B - -$B$3$N>pJs$O(B Semi-gnus (Ja) $B%a%$%j%s%0!&%j%9%H$N1g=u$re(B, SEMI ($B$^(B -$B$?$O(B WEMI) 1.13.5 $B0J>e$,I,MW$G$9!#(B $B$=$NB>!"(B APEL $B$,I,MW$K$J$j$^$9$,!"I,(B -$BMW$J%P!<%8%g%s$O(B FLIM / SEMI (WEMI) $B%Q%C%1!<%8Fb$N(B README $B$r;2>H$7$F$/$@(B -$B$5$$!#(B - -T-gnus $B$N%P!<%8%g%s$O!"I,MW$J(B SEMI (WEMI) $B$*$h$S(B FLIM $B$N%P!<%8%g%s$K?<$/(B -$B4X78$7$F$$$^$9!#(B $BI,$:!"(B T-gnus $B$N%P!<%8%g%s$K$"$C$?(B SEMI (WEMI) $B$*$h$S(B -FLIM $B$r;HMQ$7$F$/$@$5$$!#(B - -@item -Q1.2: $BF~l=j$+$il=j$+$ie$N(B Mule $B5!G=IU$-!#(B - -@item -XEmacs 21.1.1 $B0J>e$N(B Mule $B5!G=IU$-(B - -@item -Meadow 1.00 $B0J>e!#(B(Mule for Windows $B$G$OF0$-$^$;$s!#(B) - -@end itemize - -$B$H$O8@$&$b$N$N!"(BT-gnus $B$O%P!<%8%g%s(B 21.1.1 $BL$K~$N(B XEmacs, $BNc$($P(B 20.4 $B$G(B -$B$b;H$($k$+$b$7$l$^$;$s!#>\$7$$$3$H$O(B T-gnus $B$NG[I[$K4^$^$l$F$$$k(B README - $B%U%!%$%k$rFI$s$G2<$5$$!#(B - -@item -Q1.4: T-gnus $B$r(B GNU Emacs $B$H(B XEmacs $B$NN>J}$GF0$+$9$3$H$O$G$-$^$9$+(B? - -$B%=!<%9!&%l%Y%k(B( *.el )$B$G$O2DG=$G$9!#(B - -$B$7$+$7!"%P%$%H!&%3%s%Q%$%k$7$?%U%!%$%k(B ( *.elc ) $B$O6&M-$G$-$^$;$s$N$G!"(B -$B$=$l$>$l;HMQ$9$k(B emacs $B$G%P%$%H%3%s%Q%$%k$9$kI,MW$,$"$j$^$9!#(B - -@item -Q1.5: T-gnus $B$K$D$$$F$N>pJs8;$O(B? - -@table @var - -@item $B%K%e!<%9%0%k!<%W(B - -fj.news.reader.gnus $B$,$"$j$^$9$,!"(B T-gnus $B$K4X$7$F$N\$7$/$O!"(B@xref{Mailing list FAQ, $B%a!<%j%s%0%j%9%H(B}, $B$r;2>H$7$F$/$@$5$$!#(B - -$B8=:_!"$3$l$,$b$C$H$b3NpJs8;$G$7$g$&!#(B T-gnus $B$r;H$&$N$G$"$l$P!"@'Hs(B -$B;22C$9$k$3$H$r$*$9$9$a$7$^$9!#(B - -$B%@%$%8%'%9%HHG%5!<%S%9$O$"$j$^$;$s!#(B - -@item WWW - -$B8x<0$N(B Semi-gnus $B%[!<%`%Z!<%8$,$G$-$kM=Dj$G$9!#<9I.$J(B Jamie Zawinski $B$N:n$G!"(BGNU -Emacs $BMQ$N(Brolodex-like $B$J%G!<%?%Y!<%9%W%m%0%i%`$G$9!#(B Jamie $B$O(B BBDB $B$N(B -Web $B%Z!<%8$r;}$C$F$$$^$9!#(B @file{http://people.netscape.com/jwz/bbdb/}$B$3(B -$B$l$O!"l=j$K$"$j$^$9!#(B -@file{http://www.netcom.com/%7Esimmonmt/index.html} - -T-gnus $B$G;HMQ$9$k>l9g$K$O!"I,$:(B Q2.1 $B$r;2>H$7$F$/$@$5$$!#(B - -@item gnus-offline -gnus-offline $B$O!";T@nC#:H(B $B$N:n$G!"(B T-gnus $B$r(B -$B$$$o$f$k!V%*%U%i%$%s;HMQ!W(B($B%K%e!<%95-;v!"%a%$%k$NAwuBV$G9T$&(B)$B$9$k$3$H$rMF(B -$B0W$K$9$k$?$a$N%Q%C%1!<%8$G$9!#(BT-gnus (tag: t-gnus-6_14) $B$K$OI8=`$G4^$^$l(B -$B$F$$$^$9!#(B - -@end table - -@item -Q1.7: Draft $B$KJ]B8$7$?%a%C%;!<%8$r3+$/$HJ8;z$,2=$1$F$7$^$$$^$9!#(B - -gnus $B$,FI$_9~$_$K;HMQ$7$F$$$k$b$N$H0c$&%3!<%G%#%s%0%7%9%F%`$GJ]B8$5$l$F(B -$B$$$k;v$,860x$G$9!#0J2<$N@_Dj$G2r7h$9$k$O$:$G$9!#(B - -@lisp -(add-hook 'message-setup-hook - (lambda () - (set-buffer-file-coding-system 'iso-2022-7bit))) -@end lisp - -Q2.2 $B$b;2>H$7$F2<$5$$!#(B - -@item -Q1.8: T-gnus $B$N5/F0$rAa$/$9$k$K$O(B? - -$B9XFI$7$F$$$J$$%0%k!<%W$r(B ``kill'' (*Group* $B%P%C%U%!!<$G(B C-k) $B$7$F$"$k$3(B -$B$H$r3NG'$7$F$/$@$5$$!#$=$7$F!">o$K(B ``.newsrc'' $B$r>.$5$/J]$D$h$&$K$7$F$/(B -$B$@$5$$!#(B - -@end itemize - -@node Customization FAQ -@subsection $B%+%9%?%^%$%:$K4X$9$k(B FAQ - -@itemize @bullet -@item -Q2.1: T-gnus $B$N%P!<%8%g%s$r$"$2$?$i(B BBDB $B$,F0$+$J$/$J$C$F$7$^$$$^$7$?!#(B - -Semi-gnus 6.8 $B0J9_$N%P!<%8%g%s$G$O!"%*%j%8%J%k$N(B bbdb-gnus.el $B$OF0:n$7$^(B -$B$;$s!#(B $BH$9$k$h$&$K$9$k!#(B - -$B$b$7!"%*%j%8%J%k$N(B Gnus (September $B0J9_(B) $B$r;H$C$F$$$k$N$G$"$l$P!"$3$NJ}(B -$BK!$,NI$$$G$7$g$&!#(B - -$B$3$NJ}K!!"$*$h$S(B bbdb-user-mail-names $B$KBP1~$7$?(B BBDB 2.00.01 $B$KBP$9(B -$B$k(B patch $B!"4pK\E*$J@_DjNc$,!"(B -@file{http://www.mdcnet.co.jp/~keiichi/bbdb.shtml} $B$K$"$j$^$9!#(B - -@item -Q2.2: hook $B$r@_Dj$7$?$i(B T-gnus $B$NF0:n$,$*$+$7$/$J$C$?(B - -$BDL>o$NJQ?t$G$bF1MM$G$9$,!"(B T-gnus $B$G$OB?$/$N(B hook $B$K=i4|CM$,@_Dj$5$l$F$$(B -$B$^$9!#(B - -$B$3$NCM$rJQ99$7$h$&$H$7$F!"JQ?t$,Dj5A$5$l$F$$$k%U%!%$%k$r%m!<%I$9$kA0$K(B -setq / add-hook $BEy$r9T$&$H!"$3$l$i$N=i4|CM$,@_Dj$5$l$:!"(B T-gnus $B$,@5>o$K(B -$BF0:n$7$J$/$J$k>l9g$,$"$j$^$9!#(B($BFC$K(B T-gnus $B$N%P!<%8%g%s$,JQ$C$?>l9g(B) - -$B$3$l$rKI$0$?$a$K$b!"(B T-gnus $B$K4X$9$k@_Dj$O$G$-$k$@$1(B ~/.gnus.el $BFb$G9T$&(B -$B$h$&$K$7$F$/$@$5$$!#(B - -@item -Q2.3: $B08@h$K$h$C$F(B Signature $B$rJQ99$9$k$K$O(B? - -SEMI $B$K$O(B signature.el $B$H$$$&$3$N$?$a$N%D!<%k$,IUB0$7$F$$$^$9!#;HMQJ}K!(B -$B$O0J2<$N$H$*$j$G$9!#(B - -tm $B$N(B info $B$NFbMF$r(B SEMI $B$K9g$o$;$FJQ99$7$?$b$N$G$9!#(B - -SEMI $B$K$O(B *signature* $B$H$$$&(B signature $B$N<+F0@ZBX$((B tool $B$,ImB0$7$F$*$j!"(B -`semi-setup.el' $B$O$3$N@_Dj$b9T$J$$$^$9!#(Bmessage header $B$N(B field $B$K9g$o$;(B -$B$F(B signature $B$N<+F0@ZBX$r9T$J$$$?$$>l9g$O(B `~/.emacs' $B$K0J2<$N$h$&$J$b$N(B -$B$rF~$l$F2<$5$$!#!J>\$7$/$O(B signature.el $B$N@bL@=q$r;2>H$7$F2<$5$$!K(B - -@lisp -(setq signature-file-alist - '((("Newsgroups" . "jokes") . "~/.signature-jokes") - (("Newsgroups" . ("zxr" "nzr")) . "~/.signature-sun") - (("To" . ("ishimaru" "z-suzuki")) . "~/.signature-sun") - (("To" . "tea") . "~/.signature-jokes") - (("To" . ("sim" "oku" "takuo")) . "~/.signature-formal") - )) -@end lisp - -@defvar mime-setup-use-signature - -$B$3$NJQ?t$,(B @code{nil} $B0J30$N;~!"(B@file{signature.el} $B$r;H$$$^$9!#=i4|CM$O(B -@code{t} $B$G$9!#(B -@end defvar - -@defvar mime-setup-signature-key-alist - -$B3F(B major-mode $B$K$*$$$F(B signature $BA^F~L?Na$r@_Dj$9$Y$-(B key $B$r;XDj$7$^$9!#(B -$B=i4|CM$O(B - -@lisp - ((mail-mode . "\C-c\C-w")) -@end lisp - -$B$G$9!#(B - -$B$3$l$rJQ99$7$?$$>l9g$O!"4X?t(B set-alist $B$J$I$r;H$C$F$3$NJQ?t$r=q$-49$((B -$B$F2<$5$$!#(B - -@lisp -(set-alist 'mime-setup-signature-key-alist - 'news-reply-mode "\C-c\C-w") -@end lisp - -@end defvar - -@defvar mime-setup-default-signature-key - -$B$"$k(B major-mode $B$K$*$$$F(B signature $BA^F~L?Na$r@_Dj$9$Y$-(B key $B$,8+$D$+$i$J(B -$B$$>l9g!"$3$NJQ?t$K@_Dj$5$l$?(B key $B$,MQ$$$i$l$^$9!#=i4|CM$O!"(B -@code{"\C-c\C-s"} $B$G$9!#(B -@end defvar - -gnus-posting-style $B$r;HMQ$9$k;v$b$G$-$^$9!#(B - -@end itemize - -@node Reading News FAQ -@subsection $B%K%e!<%9$rFI$`(B - -@node Reading Mail FAQ -@subsection $B%a!<%k$rFI$`(B - -@node Mailing list FAQ -@subsection $B%a!<%j%s%0%j%9%H(B - -@itemize @bullet -@item -Q5.1: $B%a%$%j%s%0!&%j%9%H$+$iC&B`$9$k$K$O(B? - -@table @var -@item $BF|K\8lMQ(B -@file{semi-gnus-ja-unsubscribe@@meadowy.org} $B$K6u$N%a%$%k$rAw$C$F2<$5$$!#(B -(Subject $B$bITMW$G$9!#(B) - -@item $B1Q8lMQ(B -@file{semi-gnus-en-unsubscribe@@meadowy.org} $B$K6u$N%a%$%k$rAw$C$F2<$5$$!#(B -(Subject $B$bITMW$G$9!#(B) - -@end table - -@item -Q5.2: $B%a%$%j%s%0!&%j%9%H$K;22C$9$k$K$O(B? - -T-gnus $B$G$O!"MxMQMh$NB?$/$N%Q%C%1!<%8$G:NMQ$5$l$F$$$k(B -$B3+H/BN@)$O$C$F$/$/$@$5$$!#(B(Subject $B$bITMW$G$9!#(B) - -@item $B1Q8lMQ(B -@file{semi-gnus-en-help@@meadowy.org} $B$K6u$N%a!<%k$rAw$C$F!"Aw$i$l$F$/$k(B -$B%a!<%k$N;X<($K=>$C$F$/$@$5$$!#(B(Subject $B$bITMW$G$9!#(B) - -@end table - -@item -Q5.3: T-gnus $B$K4X$9$kJ}?K7hDj$O(B? - -T-gnus $B$N3+H/Ey$K4X$9$kJ}?K$N7hDj$OA4$F(B Semi-gnus-ja/en $B%a!<%j%s%0%j%9%H(B -$BFb$G9T$o$l$^$9!#(B $B3F%a%s%P!<$+$i$NDs0F$O%"%s%1!<%H$N7A$GDs0F$5$l7h5D$5$l(B -$B$^$9$,!"$=$NJ}K!$Ol9g$KE,MQ$5$l$k!#(B $B;dE*$J;^$dHG$K4X(B -$B$7$F$OE,MQ$5$l$J$$!#(B - -@item -$B8xE*$J0F7o$NDs0F$*$h$S5DO@$O(B semi-gnus-ja@@meadowy.org $B$b$7$/(B -$B$O(B semi-gnus-en@@meadowy.org $B$G9T$&!#(B - -@item -$B:G=*E*$JJ}?K$O%"%s%1!<%H7k2L$NB??t0U8+$r:NMQ$9$k!#(B - -@item -$BDs0Fe$G$J$1$l(B -$B$P$J$i$J$$!#(B - -@item -$BDs0Fl9g!"Ds0FF|$h$j#1=54V8e$r2s(B -$BEz4|8B$H$9$k!#(B - -@item -$BDs0F0J>e$N2sEz$,$"$C(B -$B$?;~E@$G%"%s%1!<%H$N=*N;$r@k8@$G$-$k!#(B $B$3$N>l9g!"%"%s%1!<%H$NB??t0U8+$r(B -$B7kO@$H$9$k!#(B - -@item -$B2sEz4|8B$,2a$.$F$b!"#5L>0J>e$N2sEz$,$J$$>l9g$O!"Ds0Fe$N;22Cl9g!"2sEz4|8B$O1dD9(B -$B$5$l$k!#(B -@end enumerate - -@end itemize diff --git a/texi/gnus-faq.texi b/texi/gnus-faq.texi deleted file mode 100644 index 611a50c..0000000 --- a/texi/gnus-faq.texi +++ /dev/null @@ -1,673 +0,0 @@ -@c Insert "\input texinfo" at 1st line before texing this file alone. -@c -*-texinfo-*- -@c Copyright (C) 1995 Free Software Foundation, Inc. -@setfilename gnus-faq.info - -@node Frequently Asked Questions -@section Frequently Asked Questions - -This is the Gnus Frequently Asked Questions list. -If you have a Web browser, the official hypertext version is at -@file{http://www.ccs.neu.edu/software/contrib/gnus/}, and has -probably been updated since you got this manual. - -@menu -* Installation FAQ:: Installation of Gnus. -* Customization FAQ:: Customizing Gnus. -* Reading News FAQ:: News Reading Questions. -* Reading Mail FAQ:: Mail Reading Questions. -@end menu - - -@node Installation FAQ -@subsection Installation - -@itemize @bullet -@item -Q1.1 What is the latest version of Gnus? - -The latest (and greatest) version is 5.0.10. You might also run -across something called @emph{September Gnus}. September Gnus -is the alpha version of the next major release of Gnus. It is currently -not stable enough to run unless you are prepared to debug lisp. - -@item -Q1.2 Where do I get Gnus? - -Any of the following locations: - -@itemize @minus -@item -@file{ftp://ftp.ifi.uio.no/pub/emacs/gnus/gnus.tar.gz} - -@item -@file{ftp://ftp.pilgrim.umass.edu/pub/misc/ding/} - -@item -@file{gopher://gopher.pilgrim.umass.edu/11/pub/misc/ding/} - -@item -@file{ftp://aphrodite.nectar.cs.cmu.edu/pub/ding-gnus/} - -@item -@file{ftp://ftp.solace.mh.se:/pub/gnu/elisp/} - -@end itemize - -@item -Q1.3 Which version of Emacs do I need? - -At least GNU Emacs 19.28, or XEmacs 19.12 is recommended. GNU Emacs -19.25 has been reported to work under certain circumstances, but it -doesn't @emph{officially} work on it. 19.27 has also been reported to -work. Gnus has been reported to work under OS/2 as well as Unix. - - -@item -Q1.4 Where is timezone.el? - -Upgrade to XEmacs 19.13. In earlier versions of XEmacs this file was -placed with Gnus 4.1.3, but that has been corrected. - - -@item -Q1.5 When I run Gnus on XEmacs 19.13 I get weird error messages. - -You're running an old version of Gnus. Upgrade to at least version -5.0.4. - - -@item -Q1.6 How do I unsubscribe from the Mailing List? - -Send an e-mail message to @file{ding-request@@ifi.uio.no} with the magic word -@emph{unsubscribe} somewhere in it, and you will be removed. - -If you are reading the digest version of the list, send an e-mail message -to @* -@file{ding-rn-digests-d-request@@moe.shore.net} -with @emph{unsubscribe} as the subject and you will be removed. - - -@item -Q1.7 How do I run Gnus on both Emacs and XEmacs? - -The basic answer is to byte-compile under XEmacs, and then you can -run under either Emacsen. There is, however, a potential version -problem with easymenu.el with Gnu Emacs prior to 19.29. - -Per Abrahamsen writes :@* -The internal easymenu.el interface changed between 19.28 and 19.29 in -order to make it possible to create byte compiled files that can be -shared between Gnu Emacs and XEmacs. The change is upward -compatible, but not downward compatible. -This gives the following compatibility table: - -@example -Compiled with: | Can be used with: -----------------+-------------------------------------- -19.28 | 19.28 19.29 -19.29 | 19.29 XEmacs -XEmacs | 19.29 XEmacs -@end example - -If you have Gnu Emacs 19.28 or earlier, or XEmacs 19.12 or earlier, get -a recent version of auc-menu.el from -@file{ftp://ftp.iesd.auc.dk/pub/emacs-lisp/auc-menu.el}, and install it -under the name easymenu.el somewhere early in your load path. - - -@item -Q1.8 What resources are available? - -There is the newsgroup Gnu.emacs.gnus. Discussion of Gnus 5.x is now -taking place there. There is also a mailing list, send mail to -@file{ding-request@@ifi.uio.no} with the magic word @emph{subscribe} -somewhere in it. - -@emph{NOTE:} the traffic on this list is heavy so you may not want to be -on it (unless you use Gnus as your mailer reader, that is). The mailing -list is mainly for developers and testers. - -Gnus has a home World Wide Web page at@* -@file{http://www.ifi.uio.no/~larsi/ding.html}. - -Gnus has a write up in the X Windows Applications FAQ at@* -@file{http://www.ee.ryerson.ca:8080/~elf/xapps/Q-III.html}. - -The Gnus manual is also available on the World Wide Web. The canonical -source is in Norway at@* -@file{http://www.ifi.uio.no/~larsi/ding-manual/gnus_toc.html}. - -There are three mirrors in the United States: -@enumerate -@item -@file{http://www.miranova.com/gnus-man/} - -@item -@file{http://www.pilgrim.umass.edu/pub/misc/ding/manual/gnus_toc.html} - -@item -@file{http://www.rtd.com/~woo/gnus/} - -@end enumerate - -PostScript copies of the Gnus Reference card are available from@* -@file{ftp://ftp.cs.ualberta.ca/pub/oolog/gnus/}. They are mirrored at@* -@file{ftp://ftp.pilgrim.umass.edu/pub/misc/ding/refcard/} in the -United States. And@* -@file{ftp://marvin.fkphy.uni-duesseldorf.de/pub/gnus/} -in Germany. - -An online version of the Gnus FAQ is available at@* -@file{http://www.miranova.com/~steve/gnus-faq.html}. Off-line formats -are also available:@* -ASCII: @file{ftp://ftp.miranova.com/pub/gnus/gnus-faq}@* -PostScript: @file{ftp://ftp.miranova.com/pub/gnus/gnus-faq.ps}. - - -@item -Q1.9 Gnus hangs on connecting to NNTP server - -I am running XEmacs on SunOS and Gnus prints a message about Connecting -to NNTP server and then just hangs. - -Ben Wing writes :@* -I wonder if you're hitting the infamous @emph{libresolv} problem. -The basic problem is that under SunOS you can compile either -with DNS or NIS name lookup libraries but not both. Try -substituting the IP address and see if that works; if so, you -need to download the sources and recompile. - - -@item -Q1.10 Mailcrypt 3.4 doesn't work - -This problem is verified to still exist in Gnus 5.0.9 and Mailcrypt 3.4. -The answer comes from Peter Arius -. - -I found out that mailcrypt uses -@code{gnus-eval-in-buffer-window}, which is a macro. -It seems as if you have -compiled mailcrypt with plain old GNUS in load path, and the XEmacs byte -compiler has inserted that macro definition into -@file{mc-toplev.elc}. -The solution is to recompile @file{mc-toplev.el} with Gnus 5 in -load-path, and it works fine. - -Steve Baur adds :@* -The problem also manifests itself if neither GNUS 4 nor Gnus 5 is in the -load-path. - - -@item -Q1.11 What other packages work with Gnus? - -@itemize @minus -@item -Mailcrypt. - -Mailcrypt is an Emacs interface to PGP. It works, it installs -without hassle, and integrates very easily. Mailcrypt can be -obtained from@* -@file{ftp://cag.lcs.mit.edu/pub/patl/mailcrypt-3.4.tar.gz}. - -@item -Tools for Mime. - -Tools for Mime is an Emacs MUA interface to MIME. Installation is -a two-step process unlike most other packages, so you should -be prepared to move the byte-compiled code somewhere. There -are currently two versions of this package available. It can -be obtained from@* -@file{ftp://ftp.m17n.org/pub/mule/}. -Be sure to apply the supplied patch. It works with Gnus through -version 5.0.9. In order for all dependencies to work correctly -the load sequence is as follows: -@lisp - (load "tm-setup") - (load "gnus") - (load "mime-compose") -@end lisp - -@emph{NOTE:} Loading the package disables citation highlighting by -default. To get the old behavior back, use the @kbd{M-t} command. - -@end itemize - -@end itemize - - -@node Customization FAQ -@subsection Customization - -@itemize @bullet -@item -Q2.1 Custom Edit does not work under XEmacs - -The custom package has not been ported to XEmacs. - - -@item -Q2.2 How do I quote messages? - -I see lots of messages with quoted material in them. I am wondering -how to have Gnus do it for me. - -This is Gnus, so there are a number of ways of doing this. You can use -the built-in commands to do this. There are the @kbd{F} and @kbd{R} -keys from the summary buffer which automatically include the article -being responded to. These commands are also selectable as @i{Followup -and Yank} and @i{Reply and Yank} in the Post menu. - -@kbd{C-c C-y} grabs the previous message and prefixes each line with -@code{ail-indentation-spaces} spaces or @code{mail-yank-prefix} if that is -non-nil, unless you have set your own @code{mail-citation-hook}, which will -be called to do the job. - -You might also consider the Supercite package, which allows for pretty -arbitrarily complex quoting styles. Some people love it, some people -hate it. - - -@item -Q2.3 How can I keep my nnvirtual:* groups sorted? - -How can I most efficiently arrange matters so as to keep my nnvirtual:* -(etc) groups at the top of my group selection buffer, whilst keeping -everything sorted in alphabetical order. - -If you don't subscribe often to new groups then the easiest way is to -first sort the groups and then manually kill and yank the virtuals -wherever you want them. - - -@item -Q2.4 Any good suggestions on stuff for an all.SCORE file? - -Here is a collection of suggestions from the Gnus mailing list. - -@enumerate -@item -From ``Dave Disser'' @* -I like blasting anything without lowercase letters. Weeds out most of -the make $$ fast, as well as the lame titles like ``IBM'' and ``HP-UX'' -with no further description. -@lisp - (("Subject" - ("^\\(Re: \\)?[^a-z]*$" -200 nil R))) -@end lisp - -@item -From ``Peter Arius'' @* -The most vital entries in my (still young) all.SCORE: -@lisp -(("xref" - ("alt.fan.oj-simpson" -1000 nil s)) - ("subject" - (concat "\\<\\(make\\|fast\\|big\\)\\s-*" - "\\(money\\|cash\\|bucks?\\)\\>" - -1000 nil r) - ("$$$$" -1000 nil s))) -@end lisp - -@item -From ``Per Abrahamsen'' @* -@lisp -(("subject" - ;; CAPS OF THE WORLD, UNITE - ("^..[^a-z]+$" -1 nil R) - ;; $$$ Make Money $$$ (Try work) - ("$" -1 nil s) - ;; I'm important! And I have exclamation marks to prove it! - ("!" -1 nil s))) -@end lisp - -@item -From ``heddy boubaker'' @* -I would like to contribute with mine. -@lisp -( - (read-only t) - ("subject" - ;; ALL CAPS SUBJECTS - ("^\\([Rr][Ee]: +\\)?[^a-z]+$" -1 nil R) - ;; $$$ Make Money $$$ - ("$$" -10 nil s) - ;; Empty subjects are worthless! - ("^ *\\([(<]none[>)]\\|(no subject\\( given\\)?)\\)? *$" - -10 nil r) - ;; Sometimes interesting announces occur! - ("ANN?OU?NC\\(E\\|ING\\)" +10 nil r) - ;; Some people think they're on mailing lists - ("\\(un\\)?sub?scribe" -100 nil r) - ;; Stop Micro$oft NOW!! - ;; ("concat" used to avoid overfull box.) - (concat "\\(m\\(icro\\)?[s$]\\(oft\\|lot\\)?-?\\)?" - "wind?\\(ows\\|aube\\|oze\\)?[- ]*" - "\\('?95\\|NT\\|3[.]1\\|32\\)" -1001 nil r) - ;; I've nothing to buy - ("\\(for\\|4\\)[- ]*sale" -100 nil r) - ;; SELF-DISCIPLINED people - ("\\[[^a-z0-9 \t\n][^a-z0-9 \t\n]\\]" +100 nil r) - ) - ("from" - ;; To keep track of posters from my site - (".dgac.fr" +1000 nil s)) - ("followup" - ;; Keep track of answers to my posts - ("boubaker" +1000 nil s)) - ("lines" - ;; Some people have really nothing to say!! - (1 -10 nil <=)) - (mark -100) - (expunge -1000) - ) -@end lisp - -@item -From ``Christopher Jones'' @* -The sample @file{all.SCORE} files from Per and boubaker could be -augmented with: -@lisp - (("subject" - ;; No junk mail please! - ("please ignore" -500 nil s) - ("test" -500 nil e)) - ) -@end lisp - -@item -From ``Brian Edmonds'' @* -Augment any of the above with a fast method of scoring down -excessively cross posted articles. -@lisp - ("xref" - ;; the more cross posting, the exponentially worse the article - ("^xref: \\S-+ \\S-+ \\S-+ \\S-+" -1 nil r) - ("^xref: \\S-+ \\S-+ \\S-+ \\S-+ \\S-+" -2 nil r) - ("^xref: \\S-+ \\S-+ \\S-+ \\S-+ \\S-+ \\S-+" -4 nil r) - ("^xref: \\S-+ \\S-+ \\S-+ \\S-+ \\S-+ \\S-+ \\S-+" -8 nil r) - ("^xref: \\S-+ \\S-+ \\S-+ \\S-+ \\S-+ \\S-+ \\S-+ \\S-+" - -16 nil r) - (concat "^xref: \\S-+ \\S-+ \\S-+ \\S-+ \\S-+ \\S-+ \\S-+" - " \\S-+ \\S-+" - -32 nil r) - (concat "^xref: \\S-+ \\S-+ \\S-+ \\S-+ \\S-+ \\S-+ \\S-+" - " \\S-+ \\S-+ \\S-+" -64 nil r) - (concat "^xref: \\S-+ \\S-+ \\S-+ \\S-+ \\S-+ \\S-+ \\S-+" - " \\S-+ \\S-+ \\S-+ \\S-+" -128 nil r) - (concat "^xref: \\S-+ \\S-+ \\S-+ \\S-+ \\S-+ \\S-+ \\S-+" - " \\S-+ \\S-+ \\S-+ \\S-+ \\S-+" -256 nil r) - (concat "^xref: \\S-+ \\S-+ \\S-+ \\S-+ \\S-+ \\S-+ \\S-+" - " \\S-+" \\S-+ \\S-+ \\S-+ \\S-+ \\S-+" -512 nil r)) -@end lisp - -@end enumerate - - -@item -Q2.5 What do I use to yank-through when replying? - -You should probably reply and followup with @kbd{R} and @kbd{F}, instead -of @kbd{r} and @kbd{f}, which solves your problem. But you could try -something like: - -@example -(defconst mail-yank-ignored-headers - "^.*:" - "Delete these headers from message when it's inserted in reply.") -@end example - - -@item -Q2.6 I don't like the default WWW browser - -Now when choosing an URL Gnus starts up a W3 buffer, I would like it -to always use Netscape (I don't browse in text-mode ;-). - -@enumerate -@item -Activate `Customize...' from the `Help' menu. - -@item -Scroll down to the `WWW Browser' field. - -@item -Click `mouse-2' on `WWW Browser'. - -@item -Select `Netscape' from the pop up menu. - -@item -Press `C-c C-c' - -@end enumerate - -If you are using XEmacs then to specify Netscape do -@lisp - (setq gnus-button-url 'gnus-netscape-open-url) -@end lisp - - -@item -Q2.7 What, if any, relation is between ``ask-server'' and ``(setq -gnus-read-active-file 'some)''? - -In order for Gnus to show you the complete list of newsgroups, it will -either have to either store the list locally, or ask the server to -transmit the list. You enable the first with - -@lisp - (setq gnus-save-killed-list t) -@end lisp - -and the second with - -@lisp - (setq gnus-read-active-file t) -@end lisp - -If both are disabled, Gnus will not know what newsgroups exists. There -is no option to get the list by casting a spell. - - -@item -Q2.8 Moving between groups is slow. - -Per Abrahamsen writes:@* - -Do you call @code{define-key} or something like that in one of the -summary mode hooks? This would force Emacs to recalculate the keyboard -shortcuts. Removing the call should speed up @kbd{M-x gnus-summary-mode -RET} by a couple of orders of magnitude. You can use - -@lisp -(define-key gnus-summary-mode-map KEY COMMAND) -@end lisp - -in your @file{.gnus} instead. - -@end itemize - - -@node Reading News FAQ -@subsection Reading News - -@itemize @bullet -@item -Q3.1 How do I convert my kill files to score files? - -@samp{ethanb@@ptolemy.astro.washington.edu, Ethan Bradford} write a -kill-to-score translator. It is available from@* -@file{http://baugi.ifi.uio.no/~larsi/ding-various/gnus-kill-to-score.el}. - - -@item -Q3.2 My news server has a lot of groups, and killing groups is painfully -slow. - -Don't do that then. The best way to get rid of groups that should be -dead is to edit your newsrc directly. This problem will be addressed -in the near future. - - -@item -Q3.3 How do I use an NNTP server with authentication? - -Put the following into your .gnus: -@lisp - (add-hook 'nntp-server-opened-hook 'nntp-send-authinfo) -@end lisp - - -@item -Q3.4 Not reading the first article. - -How do I avoid reading the first article when a group is selected? - -@enumerate -@item -Use @kbd{RET} to select the group instead of @kbd{SPC}. - -@item -@code{(setq gnus-auto-select first nil)} - -@item -Luis Fernandes writes:@* -This is what I use...customize as necessary... - -@lisp -;;; Don't auto-select first article if reading sources, or -;;; archives or jobs postings, etc. and just display the -;;; summary buffer -(add-hook 'gnus-select-group-hook - (function - (lambda () - (cond ((string-match "sources" gnus-newsgroup-name) - (setq gnus-auto-select-first nil)) - ((string-match "jobs" gnus-newsgroup-name) - (setq gnus-auto-select-first nil)) - ((string-match "comp\\.archives" gnus-newsgroup-name) - (setq gnus-auto-select-first nil)) - ((string-match "reviews" gnus-newsgroup-name) - (setq gnus-auto-select-first nil)) - ((string-match "announce" gnus-newsgroup-name) - (setq gnus-auto-select-first nil)) - ((string-match "binaries" gnus-newsgroup-name) - (setq gnus-auto-select-first nil)) - (t - (setq gnus-auto-select-first t)))))) -@end lisp - -@item -Per Abrahamsen writes:@* -Another possibility is to create an @file{all.binaries.all.SCORE} file -like this: - -@lisp -((local - (gnus-auto-select-first nil))) -@end lisp - -and insert -@lisp - (setq gnus-auto-select-first t) -@end lisp - -in your @file{.gnus}. - -@end enumerate - -@item -Q3.5 Why aren't BBDB known posters marked in the summary buffer? - -Brian Edmonds writes:@* -Due to changes in Gnus 5.0, @file{bbdb-gnus.el} no longer marks known -posters in the summary buffer. An updated version, @file{gnus-bbdb.el} -is available at the locations listed below. This package also supports -autofiling of incoming mail to folders specified in the BBDB. Extensive -instructions are included as comments in the file. - -Send mail to @file{majordomo@@edmonds.home.cs.ubc.ca} with the following -line in the body of the message: @emph{get misc gnus-bbdb.el}. - -Or get it from the World Wide Web:@* -@file{http://www.cs.ubc.ca/spider/edmonds/gnus-bbdb.el}. - -@end itemize - - -@node Reading Mail FAQ -@subsection Reading Mail - -@itemize @bullet -@item -Q4.1 What does the message ``Buffer has changed on disk'' mean in a mail -group? - -Your filter program should not deliver mail directly to your folders, -instead it should put the mail into spool files. Gnus will then move -the mail safely from the spool files into the folders. This will -eliminate the problem. Look it up in the manual, in the section -entitled ``Mail & Procmail''. - - -@item -Q4.2 How do you make articles un-expirable? - -I am using nnml to read news and have used -@code{gnus-auto-expirable-newsgroups} to automagically expire articles -in some groups (Gnus being one of them). Sometimes there are -interesting articles in these groups that I want to keep. Is there any -way of explicitly marking an article as un-expirable - that is mark it -as read but not expirable? - -Use @kbd{u}, @kbd{!}, @kbd{d} or @kbd{M-u} in the summary buffer. You -just remove the @kbd{E} mark by setting some other mark. It's not -necessary to tick the articles. - - -@item -Q4.3 How do I delete bogus nnml: groups? - -My problem is that I have various mail (nnml) groups generated while -experimenting with Gnus. How do I remove them now? Setting the level to -9 does not help. Also @code{gnus-group-check-bogus-groups} does not -recognize them. - -Removing mail groups is tricky at the moment. (It's on the to-do list, -though.) You basically have to kill the groups in Gnus, shut down Gnus, -edit the active file to exclude these groups, and probably remove the -nnml directories that contained these groups as well. Then start Gnus -back up again. - - -@item -Q4.4 What happened to my new mail groups? - -I got new mail, but I have -never seen the groups they should have been placed in. - -They are probably there, but as zombies. Press @kbd{A z} to list -zombie groups, and then subscribe to the groups you want with @kbd{u}. -This is all documented quite nicely in the user's manual. - - -@item -Q4.5 Not scoring mail groups - -How do you @emph{totally} turn off scoring in mail groups? - -Use an nnbabyl:all.SCORE (or nnmh, or nnml, or whatever) file containing: - -@example -((adapt ignore) - (local (gnus-use-scoring nil)) - (exclude-files "all.SCORE")) -@end example - -@end itemize - - diff --git a/texi/gnus-ja.texi b/texi/gnus-ja.texi deleted file mode 100644 index 3f4292f..0000000 --- a/texi/gnus-ja.texi +++ /dev/null @@ -1,22539 +0,0 @@ -@c \input texinfo @c -*- mode: texinfo; coding: iso-2022-7bit; -*- - -@setfilename gnus-ja -@settitle T-gnus 6.15 Manual -@synindex fn cp -@synindex vr cp -@synindex pg cp -@dircategory Emacs -@direntry -* Gnus-ja: (gnus-ja). The newsreader gnus (Japanese). -@end direntry -@iftex -@finalout -@end iftex -@setchapternewpage odd - -@iftex -@iflatex -\documentclass[twoside,a4paper,openright,11pt]{book} -\usepackage[latin1]{inputenc} -\usepackage{pagestyle} -\usepackage{epsfig} -\usepackage{bembo} -\usepackage{pixidx} - -\makeindex -\begin{document} - -\newcommand{\gnuschaptername}{} -\newcommand{\gnussectionname}{} - -\newcommand{\gnusbackslash}{/} - -\newcommand{\gnusref}[1]{``#1'' on page \pageref{#1}} -\newcommand{\gnusuref}[1]{\gnustt{#1}} -\newcommand{\gnusxref}[1]{See ``#1'' on page \pageref{#1}} -\newcommand{\gnuspxref}[1]{see ``#1'' on page \pageref{#1}} - -\newcommand{\gnuskindex}[1]{\index{#1}} -\newcommand{\gnusindex}[1]{\index{#1}} - -\newcommand{\gnustt}[1]{{\fontfamily{pfu}\fontsize{10pt}{10}\selectfont #1}} -\newcommand{\gnuscode}[1]{\gnustt{#1}} -\newcommand{\gnussamp}[1]{``{\fontencoding{OT1}\fontfamily{pfu}\fontsize{10pt}{10}\selectfont #1}''} -\newcommand{\gnuslisp}[1]{\gnustt{#1}} -\newcommand{\gnuskbd}[1]{`\gnustt{#1}'} -\newcommand{\gnusfile}[1]{`\gnustt{#1}'} -\newcommand{\gnusdfn}[1]{\textit{#1}} -\newcommand{\gnusi}[1]{\textit{#1}} -\newcommand{\gnusstrong}[1]{\textbf{#1}} -\newcommand{\gnusemph}[1]{\textit{#1}} -\newcommand{\gnusvar}[1]{{\fontsize{10pt}{10}\selectfont\textsl{\textsf{#1}}}} -\newcommand{\gnussc}[1]{\textsc{#1}} -\newcommand{\gnustitle}[1]{{\huge\textbf{#1}}} -\newcommand{\gnusauthor}[1]{{\large\textbf{#1}}} -\newcommand{\gnusresult}[1]{\gnustt{=> #1}} - -\newcommand{\gnusbullet}{{${\bullet}$}} -\newcommand{\gnusdollar}{\$} -\newcommand{\gnusampersand}{\&} -\newcommand{\gnuspercent}{\%} -\newcommand{\gnushash}{\#} -\newcommand{\gnushat}{\symbol{"5E}} -\newcommand{\gnusunderline}{\symbol{"5F}} -\newcommand{\gnusnot}{$\neg$} -\newcommand{\gnustilde}{\symbol{"7E}} -\newcommand{\gnusless}{{$<$}} -\newcommand{\gnusgreater}{{$>$}} -\newcommand{\gnusbraceleft}{{$>$}} -\newcommand{\gnusbraceright}{{$>$}} - -\newcommand{\gnushead}{\raisebox{-1cm}{\epsfig{figure=ps/gnus-head.eps,height=1cm}}} -\newcommand{\gnusinteresting}{ -\marginpar[\mbox{}\hfill\gnushead]{\gnushead} -} - -\newcommand{\gnuscleardoublepage}{\ifodd\count0\mbox{}\clearpage\thispagestyle{empty}\mbox{}\clearpage\else\clearpage\fi} - -\newcommand{\gnuspagechapter}[1]{ -{\mbox{}} -} - -\newdimen{\gnusdimen} -\gnusdimen 0pt - -\newcommand{\gnuschapter}[2]{ -\gnuscleardoublepage -\ifdim \gnusdimen = 0pt\setcounter{page}{1}\pagestyle{gnus}\pagenumbering{arabic} \gnusdimen 1pt\fi -\chapter{#2} -\renewcommand{\gnussectionname}{} -\renewcommand{\gnuschaptername}{#2} -\thispagestyle{empty} -\hspace*{-2cm} -\begin{picture}(500,500)(0,0) -\put(480,350){\makebox(0,0)[tr]{#1}} -\put(40,300){\makebox(500,50)[bl]{{\Huge\bf{#2}}}} -\end{picture} -\clearpage -} - -\newcommand{\gnusfigure}[3]{ -\begin{figure} -\mbox{}\ifodd\count0\hspace*{-0.8cm}\else\hspace*{-3cm}\fi\begin{picture}(440,#2) -#3 -\end{picture} -\caption{#1} -\end{figure} -} - -\newcommand{\gnusicon}[1]{ -\marginpar[\mbox{}\hfill\raisebox{-1.5cm}{\epsfig{figure=tmp/#1-up.ps,height=1.5cm}}]{\raisebox{-1cm}{\epsfig{figure=tmp/#1-up.ps,height=1cm}}} -} - -\newcommand{\gnuspicon}[1]{ -\margindex{\epsfig{figure=#1,width=2cm}} -} - -\newcommand{\gnusxface}[2]{ -\margindex{\epsfig{figure=#1,width=1cm}\epsfig{figure=#2,width=1cm}} -} - -\newcommand{\gnussmiley}[2]{ -\margindex{\makebox[2cm]{\hfill\epsfig{figure=#1,width=0.5cm}\hfill\epsfig{figure=#2,width=0.5cm}\hfill}} -} - -\newcommand{\gnusitemx}[1]{\mbox{}\vspace*{-\itemsep}\vspace*{-\parsep}\item#1} - -\newcommand{\gnussection}[1]{ -\renewcommand{\gnussectionname}{#1} -\section{#1} -} - -\newenvironment{codelist}% -{\begin{list}{}{ -} -}{\end{list}} - -\newenvironment{kbdlist}% -{\begin{list}{}{ -\labelwidth=0cm -} -}{\end{list}} - -\newenvironment{dfnlist}% -{\begin{list}{}{ -} -}{\end{list}} - -\newenvironment{stronglist}% -{\begin{list}{}{ -} -}{\end{list}} - -\newenvironment{samplist}% -{\begin{list}{}{ -} -}{\end{list}} - -\newenvironment{varlist}% -{\begin{list}{}{ -} -}{\end{list}} - -\newenvironment{emphlist}% -{\begin{list}{}{ -} -}{\end{list}} - -\newlength\gnusheadtextwidth -\setlength{\gnusheadtextwidth}{\headtextwidth} -\addtolength{\gnusheadtextwidth}{1cm} - -\newpagestyle{gnuspreamble}% -{ -{ -\ifodd\count0 -{ -\hspace*{-0.23cm}\underline{\makebox[\gnusheadtextwidth]{\mbox{}}\textbf{\hfill\roman{page}}} -} -\else -{ -\hspace*{-3.25cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\roman{page}\hfill\mbox{}}} -} -} -\fi -} -} -{ -\ifodd\count0 -\mbox{} \hfill -\raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo.eps,height=1cm}} -\else -\raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo.eps,height=1cm}} -\hfill \mbox{} -\fi -} - -\newpagestyle{gnusindex}% -{ -{ -\ifodd\count0 -{ -\hspace*{-0.23cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\gnuschaptername\hfill\arabic{page}}}} -} -\else -{ -\hspace*{-3.25cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\arabic{page}\hfill\gnuschaptername}}} -} -\fi -} -} -{ -\ifodd\count0 -\mbox{} \hfill -\raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo.eps,height=1cm}} -\else -\raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo.eps,height=1cm}} -\hfill \mbox{} -\fi -} - -\newpagestyle{gnus}% -{ -{ -\ifodd\count0 -{ -\makebox[12cm]{\hspace*{3.1cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\arabic{chapter}.\arabic{section}} \textbf{\gnussectionname\hfill\arabic{page}}}}} -} -\else -{ -\makebox[12cm]{\hspace*{-2.95cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\arabic{page}\hfill\gnuschaptername}}}} -} -\fi -} -} -{ -\ifodd\count0 -\mbox{} \hfill -\raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo.eps,height=1cm}} -\else -\raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo.eps,height=1cm}} -\hfill \mbox{} -\fi -} - -\pagenumbering{roman} -\pagestyle{gnuspreamble} - -@end iflatex -@end iftex - -@iftex -@iflatex -\begin{titlepage} -{ - -%\addtolength{\oddsidemargin}{-5cm} -%\addtolength{\evensidemargin}{-5cm} -\parindent=0cm -\addtolength{\textheight}{2cm} - -\gnustitle{\gnustitlename}\\ -\rule{15cm}{1mm}\\ -\vfill -\hspace*{0cm}\epsfig{figure=ps/gnus-big-logo.eps,height=15cm} -\vfill -\rule{15cm}{1mm}\\ -\gnusauthor{by Lars Magne Ingebrigtsen} -\newpage -} - -\mbox{} -\vfill - -\thispagestyle{empty} - -Copyright \copyright{} 1995, 1996, 1997, 1998, 1999, 2000 -Free Software Foundation, Inc. - - -Permission is granted to copy, distribute and/or modify this document -under the terms of the GNU Free Documentation License, Version 1.1 or -any later version published by the Free Software Foundation; with no -Invariant Sections, with the Front-Cover texts being ``A GNU -Manual'', and with the Back-Cover Texts as in (a) below. A copy of the -license is included in the section entitled ``GNU Free Documentation -License'' in the Emacs manual. - -$B$3$NJ8=q$r!"%U%j!<%=%U%H%&%'%":bCDH/9T$N(B GNU $B%U%j!r7o$N2<$GJ#@=!"G[I[!"$"$k$$$OJQ99$9(B -$B$k$3$H$r5v2D$7$^$9!#JQ99IT2DItJ,$O;XDj$7$^$;$s!#!V(BA GNU Manual$B!W$OI=I=;f(B -$B%F%-%9%H!"0J2<$N(B (a) $B$ON"I=;f%F%-%9%H$G$9!#$3$NMxMQ5vBz7@Ls=q$NJ#O$K4^$^$l$F$$$^(B -$B$9!#(B - -(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify -this GNU Manual, like GNU software. Copies published by the Free -Software Foundation raise funds for GNU development.'' - -(a) FSF $B$NN"I=;f%F%-%9%H(B:$B!V$"$J$?$K$O$3$N(B GNU Manual $B$r(B GNU $B%=%U%H%&%'%"(B -$B$N$h$&$KJ#@=$7$?$jJQ99$9$k<+M3$,$"$j$^$9!#J#@=$O%U%j!<%=%U%H%&%'%":bCD$K(B -$B$h$C$F=PHG$5$l$^$7$?!#(B($B%U%j!<%=%U%H%&%'%":bCD$O(B) GNU $B$N3+H/$N$?$a$KI,MW(B -$B$J;q6b$r=8$a$F$$$^$9!#!W(B - -This document is part of a collection distributed under the GNU Free -Documentation License. If you want to distribute this document -separately from the collection, you can do so by adding a copy of the -license to the document, as described in section 6 of the license. - -$B$3$NJ8=q$O!V(BGNU $B%U%j!r7o$N2<$GJ#@=!"G[I[!"$"$k$$$OJQ99$9(B -$B$k$3$H$r5v2D$7$^$9!#JQ99IT2DItJ,$O;XDj$7$^$;$s!#!V(BA GNU Manual$B!W$OI=I=;f(B -$B%F%-%9%H!"0J2<$N(B (a) $B$ON"I=;f%F%-%9%H$G$9!#$3$NMxMQ5vBz7@Ls=q$NJ#O$K4^$^$l$F$$$^(B -$B$9!#(B - -(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify -this GNU Manual, like GNU software. Copies published by the Free -Software Foundation raise funds for GNU development.'' - -(a) FSF $B$NN"I=;f%F%-%9%H(B:$B!V$"$J$?$K$O$3$N(B GNU Manual $B$r(B GNU $B%=%U%H%&%'%"(B -$B$N$h$&$KJ#@=$7$?$jJQ99$9$k<+M3$,$"$j$^$9!#J#@=$O%U%j!<%=%U%H%&%'%":bCD$K(B -$B$h$C$F=PHG$5$l$^$7$?!#(B($B%U%j!<%=%U%H%&%'%":bCD$O(B) GNU $B$N3+H/$N$?$a$KI,MW(B -$B$J;q6b$r=8$a$F$$$^$9!#!W(B - -This document is part of a collection distributed under the GNU Free -Documentation License. If you want to distribute this document -separately from the collection, you can do so by adding a copy of the -license to the document, as described in section 6 of the license. - -$B$3$NJ8=q$O!V(BGNU $B%U%j!r7o$N2<$GJ#@=!"G[I[!"$"$k$$$OJQ99$9(B -$B$k$3$H$r5v2D$7$^$9!#JQ99IT2DItJ,$O;XDj$7$^$;$s!#!V(BA GNU Manual$B!W$OI=I=;f(B -$B%F%-%9%H!"0J2<$N(B (a) $B$ON"I=;f%F%-%9%H$G$9!#$3$NMxMQ5vBz7@Ls=q$NJ#O$K4^$^$l$F$$$^(B -$B$9!#(B - -(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify -this GNU Manual, like GNU software. Copies published by the Free -Software Foundation raise funds for GNU development.'' - -(a) FSF $B$NN"I=;f%F%-%9%H(B:$B!V$"$J$?$K$O$3$N(B GNU Manual $B$r(B GNU $B%=%U%H%&%'%"(B -$B$N$h$&$KJ#@=$7$?$jJQ99$9$k<+M3$,$"$j$^$9!#J#@=$O%U%j!<%=%U%H%&%'%":bCD$K(B -$B$h$C$F=PHG$5$l$^$7$?!#(B($B%U%j!<%=%U%H%&%'%":bCD$O(B) GNU $B$N3+H/$N$?$a$KI,MW(B -$B$J;q6b$r=8$a$F$$$^$9!#!W(B - -This document is part of a collection distributed under the GNU Free -Documentation License. If you want to distribute this document -separately from the collection, you can do so by adding a copy of the -license to the document, as described in section 6 of the license. - -$B$3$NJ8=q$O!V(BGNU $B%U%j!l$G$9!#(BGnus $B$O$9$Y$F$r%K%e!<%9%0(B -$B%k!<%W$N$h$&$KI=<($7$^$9!#(BGnus $B$G%a!<%k$rFI$_!"%G%#%l%/%H%j!<$r%V%i%&%:(B -$B$7!"(B@code{ftp} $B$r$9$k$3$H$,$G$-$^$9!#$"$"!"$=$l$K!"%K%e!<%9$rFI$`$3$H$5(B -$B$($G$-$^$9(B! - -Emacs $B$,J8>O$rJT=8$9$k?M$KNO$rM?$($k$h$&$K!"(Bgnus $B$O%K%e!<%9$rFI$`?M$KNO(B -$B$rM?$($h$&$H$7$F$$$^$9!#(BGnus $B$OMxMQ$`F0:n$r$9$k$h$&$K(B gnus $B$r3HD%$9$k$3$H$r>)Ne$7$F$$$^$9!#(B -$B%W%m%0%i%`$,?M$rA`:n$9$k$Y$-$G$O$"$j$^$;$s!#?M$,%W%m%0%i%`$r;H$&(B ($B$b$7$/(B -$B$OMtMQ$9$k(B) $B$3$H$K$h$C$F!"$d$j$?$$$3$H$r$G$-$k$h$&$K$J$C$F$$$k$Y$-$J$N$G(B -$B$9!#(B - -@end iftex - -@menu -* Starting Up:: $B%K%e!<%9$r8+$D$1$k$N$K$O6lO+$,H<$&$+$bCN(B - $B$l$J$$(B -* Group Buffer:: $B%0%k!<%W$rA*Br$7!"9XFI$7!":o=|$9$k(B -* Summary Buffer:: $B5-;v$rFI$_!"J]B8$7!"Ej9F$9$k(B -* Article Buffer:: $B5-;v$rI=<($7!"07$&(B -* Composing Messages:: $B%a!<%k$H%K%e!<%9$rAw$k$?$a$N>pJs(B -* Select Methods:: Gnus $B$OA4$F$N%a%C%;!<%8$r$$$m$$$m$JA*Br(B - $BJ}K!$GFI$`(B -* Scoring:: $B5-;v$KCM$r$D$1$k(B -* Various:: $B0lHLE*$J@_Dj(B -* The End:: $B$5$i$P!"$=$7$F$5$h$&$J$i(B -* Appendices:: $BMQ8l!"(BEmacs $BF~Lg!"(BFAQ$B!"Nr;K!"FbIt9=B$(B -* Index:: $BJQ?t!"4X?t!"35G0$N:w0z(B -* Key Index:: $B%-!<:w0z(B - -@detailmenu - --- The Detailed Node Listing --- - -Starting Gnus - -* Finding the News:: $B%K%e!<%9$re$N(B gnus $B$r:nF0$5$;$k$3$H$,(B - $B$G$-$k(B -* Fetching a Group:: $B%0%k!<%W$rFI$`$?$a$@$1$K(B gnus $B$r5/F0$9$k(B -* New Groups:: Gnus $B$,?7$7$$%0%k!<%W$KBP$7$F2?$r$9$k$+(B -* Changing Servers:: $B$"$k%5!<%P$+$iJL$N%5!<%P$X0\$j$?$$$+$b$7(B - $B$l$J$$(B -* Startup Files:: $B$d$C$+$$$J%9%?!<%H%"%C%W%U%!%$%k(B -- - @file{.newsrc} -* Auto Save:: $B%/%i%C%7%e$+$i$N2sI|(B -* The Active File:: $BCY$$2s@~$+$i$N%U%!%$%k$NpJs$HJQ99$NJ}K!(B -* Group Maneuvering:: $B%0%k!<%W%P%C%U%!$r0\F0$9$k%3%^%s%I(B -* Selecting a Group:: $BC5n(B -* Group Data:: $B%0%k!<%W$N>pJs$rJQ99$9$k(B -* Group Levels:: $B%l%Y%k(B? $B$=$l$C$F2?(B? -* Group Score:: $B$"$J$?$N9%$-$J%0%k!<%W$r8+$D$1=P$9J}K!(B -* Marking Groups:: $B%0%k!<%W$K0u$r$D$1$F$*$$$F!"8e$G=hM}$G$-(B - $B$^$9(B -* Foreign Groups:: $B%0%k!<%W$N:n@.$H=$@5(B -* Group Parameters:: $B%0%k!<%WKh$K0c$C$?%Q%i%a!<%?$r;}$?$;$i$l(B - $B$^$9(B -* Listing Groups:: Gnus $B$O%0%k!<%W$r$$$m$$$m$JJ,$1J}$GI=<((B - $B$G$-$^$9(B -* Sorting Groups:: $B%0%k!<%W$N=gHV$NG[CVBX$((B -* Group Maintenance:: $B$-$l$$$J(B @file{.newsrc} $B$NJ]$AJ}(B -* Browse Foreign Server:: $B%5!<%P$r354Q$G$-$k!#2?$,FI$a$k$N$+8+$F$_(B - $B$h$&(B -* Exiting Gnus:: $B%K%e!<%9FI$`$N$r$d$a$F!";E;v$r$7$h$&(B -* Group Topics:: $B%0%k!<%W$r@Z$j:.$<$F!"%H%T%C%/$4$H$KJ,3d(B - $B$9$k(B -* Misc Group Stuff:: $BB>$K$G$-$k$3$H(B - -Group Buffer Format - -* Group Line Specification:: $B%0%k!<%W%P%C%U%!$N8+$(J}$r7h$a$k(B -* Group Modeline Specification:: $B%0%k!<%W%P%C%U%!$N%b!<%I9T(B -* Group Highlighting:: $B%0%k!<%W%P%C%U%!$K$-$l$$$K?'$r$D$1$k(B - -Group Topics - -* Topic Variables:: Lisp $B$G%H%T%C%/$r%+%9%?%^%$%:$9$kJ}K!(B -* Topic Commands:: $BD64JC1BPOC7?L?Na(B -* Topic Sorting:: $B%H%T%C%/KhJL!9$KJB$YBX$($k(B -* Topic Topology:: $BA4@$3&$NCO?^(B -* Topic Parameters:: $B$"$k%H%T%C%/$NA4$F$N%0%k!<%W$KE,MQ$5$l$k(B - $B%Q%i%a!<%?(B - -Misc Group Stuff - -* Scanning New Messages:: Gnus $B$K?7$7$$%a%C%;!<%8$,E~Ce$7$?$+$I$&(B - $B$+$rJ9$/(B -* Group Information:: $B%0%k!<%W$H(B gnus $B$K4X$9$k>pJs$H%X%k%W(B -* Group Timestamp:: Gnus $B$K:G8e$K$$$D%0%k!<%W$rFI$s$@$+$r5-(B - $BO?$5$;$k(B -* File Commands:: Gnus $B$N%U%!%$%k$NFI$_=q$-(B - -Summary Buffer - -* Summary Buffer Format:: $B35N,%P%C%U%!$N304Q$r7hDj$9$k(B -* Summary Maneuvering:: $B35N,%P%C%U%!$rF0$-2s$k(B -* Choosing Articles:: $B5-;v$rFI$`(B -* Paging the Article:: $BFI$s$G$$$k5-;v$r%9%/%m!<%k$9$k(B -* Reply Followup and Post:: $B5-;v$rEj9F$9$k(B -* Delayed Articles:: -* Marking Articles:: $B5-;v$K4{FI$d4|8B@Z$l:o=|2DG=Ey$N0u$rIU$1(B - $B$k(B -* Limiting:: $B35N,%P%C%U%!$K@)8B$r2C$($k$3$H$,$G$-$k(B -* Threading:: $B%9%l%C%I$,$I$N$h$&$K:n$i$l$k$+(B -* Sorting the Summary Buffer:: $B%9%l%C%I$H5-;v$,$I$N$h$&$KJB$S$+$($i$l$k(B - $B$+(B -* Asynchronous Fetching:: Gnus $B$O5-;v$r@h$KC5n$7$J$/$5$;$k(B -* Article Backlog:: $B4{$KFI$s$@5-;v$r;D$7$F$*$/(B -* Saving Articles:: $B5-;v$NJ]B8$r%+%9%?%^%$%:$9$kJ}K!(B -* Decoding Articles:: Gnus $B$O0lO"$N(B (uu)encode $B$5$l$?5-;v$r07(B - $B$($k(B -* Article Treatment:: $B5-;v%P%C%U%!$O$*K>$_$I$*$j$KL\Cc6lCc$K$G(B - $B$-$k(B -@c * MIME Commands:: Doing MIMEy things with the articles. -@c * Charsets:: Character set issues. -* Article Commands:: $B5-;v%P%C%U%!$G$$$m$$$m$J$3$H$r$9$k(B -* Summary Sorting:: $B$$$m$$$m$JJ}K!$G35N,%P%C%U%!$rJB$YBX$($k(B -* Finding the Parent:: $B;R5-;v$K1g=u$,L5$$$C$F(B? $B?F5-;v$r$N$I$N>l=j$K$b9g$o$J$+$C$?$b$N(B -* Exiting the Summary Buffer:: $B%0%k!<%W%P%C%U%!$KLa$k!"(B - $B$^$?$O8=:_$N%0%k!<%W$r:F$SA*Br$9$k(B -* Crosspost Handling:: $B%/%m%9%]%9%H$5$l$?5-;v$,$I$N$h$&$K07$o$l(B - $B$k$+(B -* Duplicate Suppression:: $B%/%m%9%]%9%H$N07$$$K<:GT$7$?$H$-$NBeBXA0$rI=<($7$J$$J}K!(B -* Summary Buffer Mode Line:: $B%b!<%I9T$N8+$(J}$r7h$a$i$l$k(B -* Summary Highlighting:: $B35N,%P%C%U%!$r$-$l$$$GAGE($K$9$k(B - -Choosing Articles - -* Choosing Commands:: $B5-;v$rA*Br$9$k$?$a$NL?Na(B -* Choosing Variables:: $B$3$l$i$NL?Na$K1F6A$r5Z$\$9JQ?t(B - -Reply, Followup and Post - -* Summary Mail Commands:: $B%a!<%k$rAw$k(B -* Summary Post Commands:: $B%K%e!<%9$rAw$k(B -* Summary Message Commands:: $BB>$N%a%C%;!<%84XO"$NL?Na(B -* Canceling and Superseding:: - -Marking Articles - -* Unread Articles:: $BL$FI5-;v$X$N0u(B -* Read Articles:: $B4{FI5-;v$X$N0u(B -* Other Marks:: $B9XFIEY$K1F6A$7$J$$0u(B - -Marking Articles - -* Setting Marks:: $B0u$NIU$1J}$H>C$7J}(B -* Generic Mark Commands:: $B0u$r$I$N$h$&$K%+%9%?%^%$%:$9$k$+(B -* Setting Process Marks:: $B8e$N$NI|9f2=$NJQ?t(B -* Uuencoding and Posting:: uuencode $B$9$k$N$r%+%9%?%^%$%:$9$kJQ?t(B - -Article Treatment - -* Article Highlighting:: $B5-;v$r2LJ*%5%i%@$N$h$&$K8+$($k$h$&$K$7$?(B - $B$$(B -* Article Fontisizing:: $B6/D4$5$l$?J8$rAGE($K$9$k(B -* Article Hiding:: $BFCDj$N>pJs$O>C$75n$j$?$$$H$b;W$&(B -* Article Washing:: $B?M@8$r$b$C$H$h$/$9$k$?$/$5$s$N5$$NMx$$$?(B - $B4X?t(B -* Article Buttons:: URL $B$d(B Message-ID $B$d(B $B%"%I%l%9$J$I$r%/%j%C(B - $B%/$9$k(B -* Article Date:: $B$0$:$0$:8@$&$J!"@$3&;~$@(B! -* Article Signature:: $B=pL>$C$F2?(B? -* Article Miscellania:: $BB>$N$$$m$$$m$J$b$N(B - -Alternative Approaches - -* Pick and Read:: $B$^$:!"5-;v$K0u$rIU$1$F!"$=$l$+$iFI$`(B -* Binary Groups:: $B$9$Y$F$N5-;v$r<+F0(B-$BI|9f2=$9$k(B - -Various Summary Stuff - -* Summary Group Information:: $B>pJs;X8~$NL?Na(B -* Searching for Articles:: $BJ#?t5-;vL?Na(B -* Summary Generation Commands:: -* Really Various Summary Commands:: $B$"$N$d$C$+$$$JB>$KE,9g$7$J$$L?Na(B - -Article Buffer - -* Hiding Headers:: $B$I$N%X%C%@!<$rI=<($9$k$+$r7h$a$k(B -* Using MIME:: @sc{mime} $B5-;v$H$7$F8+$;$k(B -* Customizing Articles:: $B5-;v$N8+1I$($r;EN)$F$k(B -* Article Keymap:: $B5-;v%P%C%U%!$G;H$($k%-!(B - -Composing Messages - -* Mail:: $B%a!<%k$HJVEz(B -* Posting Server:: $B$I$N%5!<%P!<$rDL$7$FEj9F$9$k$Y$-$+(B? -* Mail and Post:: $BF1;~$K%a!<%k$r=P$7JVEz$9$k(B -* Archived Messages:: $BAw$C$?%a%C%;!<%8$r(B gnus $B$,Cy$a$F$*$/$H$3(B - $B$m(B -* Posting Styles:: $B$"$J$?$,C/$G$"$k$+$r;XDj$9$k$h$j4JC1$JJ}(B - $BK!(B -* Drafts:: $B%a%C%;!<%8$N1d4|$H5qH]$5$l$?%a%C%;!<%8(B -* Rejected Articles:: $B%5!<%P!<$,$"$J$?$N5-;v$r9%$-$G$J$$$H$-$K(B - $B2?$,5/$3$k(B? -@c * Using GPG:: How to use GPG and MML to sign and encrypt messages - -Select Methods - -* Server Buffer:: $B;ve$N%5!<%P!<$r:n$C$FJT=8$9$k(B -* Getting News:: USENET $B%K%e!<%9$r(B gnus $B$GFI$`(B -* Getting Mail:: $B8D?ME*$J%a!<%k$r(B gnus $B$GFI$`(B -* Browsing the Web:: $B2a>j$J%&%'%V$N;q8;$+$i%a%C%;!<%8$r$rA*BrJ}K!$H$7$F;H$&;v$,$G$-$k(B -* Unavailable Servers:: $B@\B3$7$h$&$H;n$_$?%5!<%P!<$N$$$/$D$+$,Mn(B - $B$A$F$$$k$+$b$7$l$J$$(B - -Getting News - -* NNTP:: @sc{nntp} $B%5!<%P!<$+$i%K%e!<%9$rFI$`(B -* News Spool:: $B%m!<%+%k%9%W!<%k$+$i%K%e!<%9$rFI$`(B - -@sc{nntp} - -* Direct Functions:: $B%5!<%P!<$KD>@\@\B3$9$k(B -* Indirect Functions:: $B%5!<%P!<$K4V@\E*$K@\B3$9$k(B -* Common Variables:: $B$$$/$D$+$N@\B3MQ$N4X?t$,;2>H$9$kJQ?t(B - -Getting Mail - -* Mail in a Newsreader:: $B%K%e!<%9%j!<%@$G%a!<%k(B ($BBg;v$JA0CV$-(B) -* Getting Started Reading Mail:: $B4JC1$JNAM}K\$N$h$&$JNc(B -* Splitting Mail:: $B$I$N$h$&$K%a!<%k%0%k!<%W$r:n@.$9$k$+(B -* Mail Sources:: Gnus $B$K$I$3$+$i%a!<%k$r$N%U%!%$%k$rFI$`$?$a$K%a!<%k%P%C%/%((B - $B%s%I$r;H$&(B -* Choosing a Mail Backend:: Gnus $B$O?'!9$J%a!<%kMM<0$rFI$`;v$,$G$-$k(B -* Archiving Mail:: $B%a!<%k$r%P%C%/%"%C%W$9$k$K$O(B - -Mail Sources - -* Mail Source Specifiers:: $B%a!<%k$N85$,$I$3$+$r;XDj$9$k(B -* Mail Source Customization:: $B@$$NCf$K1F6A$9$k$$$/$D$+$NJQ?t(B -* Fetching Mail:: $B%a!<%k%=!<%9;X<(;R$r;HMQ$9$k(B - -Choosing a Mail Backend - -* Unix Mail Box:: ($B$H$F$b(B) $BI8=`E*$J(B Un*x mbox $B$r;H$&(B -* Rmail Babyl:: Emacs $B$N%W%m%0%i%`$O(B rmail $B$N(B babyl $B%U%)!<(B - $B%^%C%H$r;H$&(B -* Mail Spool:: $B$"$J$?$N%a!<%k$r;dE*$J%9%W!<%k$KN/$a$k(B? -* MH Spool:: mhspool $B$N$h$&$J%P%C%/%(%s%I(B -* Mail Folders:: $B$=$l$>$l$N%0%k!<%W$KBP$7$F0l$D$N%U%!%$%k(B - $B$r;}$D(B -* Comparing Mail Backends:: $BF@<:$N?<$$F6;!(B - -Browsing the Web - -* Web Searches:: $BJ8;zNs$K%^%C%A$9$k5-;v$+$i%0%k!<%W$r:n$k(B -* Slashdot:: Slashdot $B$N%3%a%s%H$rFI$`(B -* Ultimate:: Ultimate Bulletin Board $B%7%9%F%`(B -* Web Archive:: $B%&%'%V$KJ]4I$5$l$?%a!<%j%s%0%j%9%H$rFI$`(B -* Web Newspaper:: $B%&%'%V$KJ]4I$5$l$??7J9$rFI$`(B -* RSS:: RDF Site Summary $B$rFI$`(B -* Customizing w3:: Gnus $B$+$i(B Emacs/w3 $B$rA`:n$9$k(B - -Other Sources - -* Directory Groups:: $B%G%#%l%/%H%j!<$r%K%e!<%9%0%k!<%W$N$h$&$K(B - $BFI$`(B -* Anything Groups:: Dired? $BC/$,(B dired $B$J$s$F;H$&$N(B? -* Document Groups:: $B8DJL$N%U%!%$%k72$O%0%k!<%W$NAG(B -* SOUP:: @sc{soup} $B%Q%1%C%H$r(B ``$B%*%U%i%$%s(B'' $B$GFI$`(B -* Mail-To-News Gateways:: $B%a!<%k$+$i%K%e!<%9$X$N%2!<%H%&%'%$$rDL$7(B - $B$F5-;v$rEj9F$9$k(B -* IMAP:: Gnus $B$r(B IMAP $B$N%/%i%$%"%s%H$H$7$F;H$&(B - -Document Groups - -* Document Server Internals:: $B$"$J$?FH<+$NJ8=q$NMxMQC$9J}K!(B -* Agent and IMAP:: $B%(!<%8%'%s%H$r(B IMAP $B$G;H$&J}K!(B -* Outgoing Messages:: $BEj9F!"%a!<%k$r=P$9$H$-$K$J$K$,5/$3$k$N$+(B? -* Agent Variables:: $B%+%9%?%^%$%:$O3Z$7(B -* Example Setup:: $B%*%U%i%$%s?M4V$N$?$a$N(B @file{.gnus.el} $B$NNc(B -* Batching Agents:: @code{cron} $B%8%g%V$K$h$k%K%e!<%9C5n%U%!%$%k$r%9%3%"%U%!%$%k$KJQ49$9$k(B -* GroupLens:: $B$I$l$rFI$`$N$,9%$-$+$NM=8@$rF@$k(B -* Advanced Scoring:: $B%9%3%"$NK!B'$r:n$k$?$a$KO@M}I=8=$r;H$&(B -* Score Decays:: $B%9%3%"$r8O$l$F$$$+$;$k$N$OLr$KN)$D;v$b$"(B - $B$k(B - -GroupLens - -* Using GroupLens:: $B$I$N$h$&$K(B gnus $B$K(B GroupLens $B$r;H$o$;$k(B - $B$h$&$K$9$k$+(B -* Rating Articles:: GropLens $B$K$"$J$?$,$I$N$h$&$KCM$rIU$1$k(B - $B$+$rCN$i$;$k(B -* Displaying Predictions:: GropuLens $B$K$h$C$FM?$($i$l$?M=8@$rI=<($9(B - $B$k(B -* GroupLens Variables:: GoupLens $B$r%+%9%?%^%$%:$9$k(B - -Advanced Scoring - -* Advanced Scoring Syntax:: $BDj5A(B -* Advanced Scoring Examples:: $B$I$N$h$&$K8+$($k$+(B -* Advanced Scoring Tips:: $B$=$l$r:GBg8BMxMQ$9$k(B - -Various - -* Process/Prefix:: $BB?$/$N07$$L?Na$G;H$o$l$k=,47(B -* Interactive:: Gnus $B$KB?$/$Ne$2$k$+(B -* Mode Lines:: $B%b!<%I9T$K>pJs$rI=<($9$k(B -* Highlighting and Menus:: $B%P%C%U%!$rAGE($G?4CO$h$/8+$;$k(B -* Buttons:: $B4JC1$J==Jb$G%"%-%l%9g'$rF@$k(B -* Daemons:: Gnus $B$O$"$J$?$NN"$GJ*;v$r$NB@$j$d$9$$?);v$rHr$1$kJ}K!(B -* Undo:: $B$$$/$D$+$NF0:n$O85$KLa$9;v$,$G$-$k(B -* Moderation:: $B$"$J$?$,%b%G%l!<%?!<$@$C$?$i$I$&$9$k$+(B -* XEmacs Enhancements:: XEmacs $B$G$O$b$C$H3($d$=$NB>$N$b$N$,B8:_(B - $B$9$k(B -* Fuzzy Matching:: $BBg$-$JLJLS$C$F2?(B? -* Thwarting Email Spam:: $BM>7W$J>&6HE*EE;R%a!<%k$rHr$1$kJ}K!(B -* Various Various:: $BK\Ev$K$$$m$$$m$J$b$N(B - -Formatting Variables - -* Formatting Basics:: $B=qK!;EMMJQ?t$O4pK\E*$K=qK!;XDjJ8;zNs$G$"(B - $B$k(B -* Mode Line Formatting:: $B%b!<%I9T$N=qK!;EMMJQ?t$K4X$9$k$$$/$D$+$N(B - $B5,B'(B -* Advanced Formatting:: $B?'!9$JJ}K!$G=PNO$r=$@5$9$k(B -* User-Defined Specs:: Gnus $B$K$"$J$?<+?H$N4X?t$r8F$P$;$k(B -* Formatting Fonts:: $B;EMM$rB?:L$GAGE($K8+$;$k(B -* Positioning Point:: $BA`:n$N8e$G%]%$%s%H$r0\F0$9$k(B -* Tabulation:: $B=PNO$N@0Ns(B -* Wide Characters:: $BI}$,9-$$J8;z$r07$&(B - -XEmacs Enhancements - -* Picons:: $B$"$J$?$,FI$s$G$$$k$b$N$N3($rI=<($9$kJ}K!(B -* Smileys:: $BI=<($5$l$k$Y$/@8$^$l$?9,$;$=$&$J4i$rI=<((B - $B$9$kJ}K!(B -* Toolbar:: $B%/%j%C%/1n(B -* XVarious:: $B$=$NB>$N(B XEmacs $B$G(B Gnus $B$JJQ?t(B - -Picons - -* Picon Basics:: picon $B$H$O2?$G!"$I$&$d$C$F$N$V$C2u$7$?$j$R$M$C$?$j$$$8$C$?(B - $B$jM7$s$@$j$9$kJQ?t(B - -Appendices - -* History:: $B$I$&$d$C$F(B gnus $B$,:#F|$N$h$&$K$J$C$?$+(B -* On Writing Manuals:: $B$J$<$3$l$,=i?4e$N%P!<%8%g%s$N(B Gnus -* Why?:: Gnus $B$NL\E*$O2?(B? -* Compatibility:: Gnus $B$O(B @sc{gnus} $B$H$I$l$/$i$$8_49@-$,$"$k(B - $B$N(B? -* Conformity:: Gnus $B$OA4$F$NI8=`$rK~$?$=$&$H$9$k(B -* Emacsen:: Gnus $B$O$$$/$D$+$N8=BeE*$J(B Emacs $B4D6-$Ge$N$b$N(B---Gnus 5.4/5.5 -* Quassia Gnus:: 2 $B$+$1$k(B 2 $B$O(B 4$B!"$b$7$/$O(B Gnus 5.6/5.7 -* Pterodactyl Gnus:: $B8^HVL\!"(BP $B$G;O$^$k!"$b$7$/$O(B Gnus 5.8 - /5.9 $B$H$7$FCN$i$l$F$$$k$b$N(B - -Customization - -* Slow/Expensive Connection:: $B%m!<%+%k$N(B Emacs $B$rN)$A>e$2$F!"B>$N$H$3(B - $B$m$+$i%K%e!<%9$rF@$k;v$,$G$-$k(B -* Slow Terminal Connection:: $B1s3V(B Emacs $B$rpJs7A<0(B -* Extended Interactive:: $B5-9f@\F,<-$J$I(B -* Emacs/XEmacs Code:: Gnus $B$OA4$F$N6aBe(B Emacsen $B$GF0:n$9$k(B -* Various File Formats:: Gnus $B$N;HMQ$9$k%U%!%$%k$N7A<0(B - -Backend Interface - -* Required Backend Functions:: $BpJs(B -* Newsgroups File Format:: $B%0%k!<%W$N5-=R(B - -Emacs for Heathens - -* Keystrokes:: $BJ8>O$rF~NO$7$FL?Na$ro$K4JC1$G$9!#$=$&!"(BEmacs $B$G(B @kbd{M-x gnus} $B$HBG$D$@$1$G$9!#(B - -@findex gnus-other-frame -@kindex M-x gnus-other-frame -$BJL$N%U%l!<%`(B (frame) $B$G(B gnus $B$r5/F0$7$?$$$H$-$O!"L?(B -$BNa(B @kbd{M-x gnus-other-frame} $B$r;H$&$3$H$,$G$-$^$9!#(B - -$B3+;O;~$K2?$+$,$&$^$/$$$+$J$$$H$-$O(B @file{~/.gnus} $B%U%!%$%k$NCf$GJQ?t$r$$(B -$B$/$D$+$$$8$/$j$^$o$5$J$1$l$P$J$i$J$$$G$7$g$&!#$3$N%U%!%$%k(B -$B$O(B @file{~/.emacs} $B$H;w$F$$$^$9$,!"$3$A$i$O(B gnus $B$,5/F0$9$k$H$-$KFI$_9~(B -$B$^$l$^$9!#(B - -$B$3$N@bL@=q$G$h$/$o$+$i$J$$MQ8l$,$G$F$-$?$H$-$O!"MQ8l$N(B -$B9`(B (@pxref{Terminology}) $B$r;2>H$7$F$/$@$5$$!#(B - -@menu -* Finding the News:: $B%K%e!<%9$re$N(B gnus $B$r:nF0$5$;$k$3$H$,(B - $B$G$-$k(B -* Fetching a Group:: $B%0%k!<%W$rFI$`$?$a$@$1$K(B gnus $B$r5/F0$9$k(B -* New Groups:: Gnus $B$,?7$7$$%0%k!<%W$KBP$7$F2?$r$9$k$+(B -* Changing Servers:: $B$"$k%5!<%P$+$iJL$N%5!<%P$X0\$j$?$$$+$b$7(B - $B$l$J$$(B -* Startup Files:: $B$d$C$+$$$J%9%?!<%H%"%C%W%U%!%$%k(B -- - @file{.newsrc} -* Auto Save:: $B%/%i%C%7%e$+$i$N2sI|(B -* The Active File:: $BCY$$2s@~$+$i$N%U%!%$%k$Nl=j(B} $B$rI=$9%j%9%H$G$"$kI,MW$,$"$j$^$9!#$3$NJ}K!$O$"$J$?$N4pK\J}(B -$BK!(B (native method) $B$K$J$j$^$9!#$3$NJ}K!$Gl9g$O!"(B - -@lisp -(setq gnus-select-method '(nnspool "")) -@end lisp - -@noindent -$B$N$h$&$K$G$-$^$9!#(B - -$B%m!<%+%k$N%9%W!<%k$r;H$($k$N$G$"$l$P!"$+$J$j$N3NN($G$=$NJ}$,$:$C$HB.$$$G(B -$B$7$g$&$7!"$=$l$r;H$&$Y$-$G$7$g$&!#(B - -@vindex gnus-nntpserver-file -@cindex NNTPSERVER -@cindex @sc{nntp} server -$B$b$7$3$NJQ?t$,@_Dj$5$l$F$$$J$1$l$P!"(Bgnus $B$O(B @code{NNTPSERVER} $B4D6-JQ?t$r(B -$BFI$_$K$$$-$^$9!#$b$7$=$NJQ?t$,@_Dj$5$l$F$$$J$1$l$P!"(B -gnus $B$O(B @code{gnus-nntpserver-file} ($B@_Dj$5$l$F$$$J$$>l9g(B -$B$O(B @file{/etc/nntpserver}) $B$,$3$N7o$K4X$7$F2?$+$r8@$C$F$$$J$$$+$rD4$Y$^(B -$B$9!#$b$7$=$l$b<:GT$7$?$J$i!"(Bgnus $B$O(B Emacs $B$,F0:n$7$F$$$k%5!<%P!<(B -$B$r(B @sc{nntp} $B%5!<%P!<$H$7$F;H$*$&$H$7$^$9!#?oJ,$JEv$F?dNL$G$9$1$I$M!#(B - -@vindex gnus-nntp-server -@code{gnus-nntp-server} $B$,@_Dj$5$l$F$$$k$H!"$3$NJQ?t(B -$B$O(B @code{gnus-select-method} $B$r>e=q$-$7$^$9!#$G$9$+$i!"(B -@code{gnus-nntp-server} $B$O(B @code{nil} $B$K@_Dj$9$k$Y$-$G!"=i4|@_Dj$G$b$=$N(B -$B$h$&$K$J$C$F$$$^$9!#(B - -@vindex gnus-secondary-servers -@vindex gnus-nntp-server -Gnus $B$K(B @sc{nntp} $B%5!<%P!<$NL>A0$NF~NO$rBPOCE*$K;XDj$9$k$3$H$b$G$-$^$9!#(B -@code{gnus} $B$K?tCM$G$J$$@\F,0z?t$rEO$9$H(B ($BNc(B: @kbd{C-u M-x gnus})$B!"(B -gnus $B$O(B @code{gnus-secondary-servers} $B%j%9%H(B ($B$b$7B8:_$9$k$J$i$P(B) $B$+$i%5!<(B -$B%P!<$rA*$V$3$H$,$G$-$k$h$&$K$7$^$9!#$?$@C1$K@\B3$7$?$$$H;W$C$?%5!<%P!<$N(B -$BL>A0$rBG$D$3$H$b$G$-$^$9!#(B($B$3$l$O(B @code{gnus-nntp-server} $B$r@_Dj$7!"$3$l(B -$B$O8e$N(B Emacs $B$N%;%C%7%g%s$G(B @kbd{M-x gnus} $B$H$9$k$H!"(Bgnus $B$OF1$8%5!<%P!<(B -$B$K@\B3$7$h$&$H$9$k$H$$$&$3$H$G$9!#(B) - -@findex gnus-group-browse-foreign-server -@kindex B (Group) -$B$7$+$7!"IaCJF|>oE*$K$O0l$D$N(B @sc{nntp} $B%5!<%P$r;H$$!"0c$C$?%5!<%P!<$K$O(B -$B6=L#$N$"$k%0%k!<%W$,>/$7$7$+$J$$>l9g!"%0%k!<%W%P%C%U%!$G(B @kbd{B} $BL?Na$r(B -$B;H$&$3$H$NJ}$,NI$$$G$7$g$&!#$=$l$O!"A*Br2DG=$J%0%k!<%W$rI=<($7!"$=$NCf$+(B -$B$i$I$l$G$b9%$-$J$b$N$r9XFI$9$k$3$H$,$G$-$^$9!#$3$l$O!"(B@file{.newsrc} $B$N(B -$BJ];}$r$:$C$H$d$j$d$9$/$7$^$9!#(B@xref{Foreign Groups, $B30It%0%k!<%W(B}. - -@vindex gnus-secondary-select-methods -@c @head -$B30It%0%k!<%W$KBP$9$k>/$70c$C$?$d$jJ}$O!"JQ(B -$B?t(B @code{gnus-secondary-select-methods} $B$r@_Dj$9$kJ}K!$G$9!#$3$NJQ?t$KI=(B -$B$5$l$F$$$kA*BrJ}K!$O!"B?$/$NE@$G(B @code{gnus-select-method} $B%5!<%P!<$NBr(B -$BJ}K!$HF1$8$h$&$K07$o$l$^$9!#5/F0Cf$K%"%/%F%#%V%U%!%$%k$rC5$7$K$$$-(B ($B$b$7(B -$BMW5a$5$l$F$$$l$P(B)$B!"$3$l$i$N%5!<%P!<>e$K$G$-$??7$7$$%K%e!<%9%0%k!<%W$O85!9(B -$B$N%0%k!<%W$HF1$8$h$&$K9XFI(B ($B$b$7$/$OHs9XFI(B) $B$5$l$^$9!#(B - -$B$?$H$($P!"%a!<%k$rFI$`$?$a$K(B @code{nnmbox} $B%P%C%/%(%s%I(B (backend) $B$r;H$$(B -$B$?$$$H$-$O!"IaDL!"$3$NJQ?t$r!"(B - -@lisp -(setq gnus-secondary-select-methods '((nnmbox ""))) -@end lisp - -@noindent -$B$H@_Dj$7$^$9!#(B - -@node The First Time -@section $B0lHV=i$a(B -@cindex first time usage - -$B5/F0MQ%U%!%$%k$,B8:_$7$J$$$H$-$O!"(Bgnus $B$O%G%#%U%)%k%H$G$I$N%0%k!<%W$,9X(B -$BFI$5$l$F$$$k$Y$-$+$r7hDj$7$h$&$H$7$^$9!#(B - -@vindex gnus-default-subscribed-newsgroups -$BJQ?t(B @code{gnus-default-subscribed-newsgroups} $B$,@_Dj$5$l$F$$$k$H!"(B -gnus $B$O$=$N%j%9%H$NCf$N%0%k!<%W$r9XFI$7!";D$j$r:o=|$7$^$9!#%7%9%F%`4IM}(B -$B$^$l$^$9!#(B - -$B$=$&$G$J$$$H$-$O!"(Bgnus $B$O>/$7$NG$0U$N%0%k!<%W$r9XFI$7$^$9(B ($BNc(B: -@samp{*.newusers})$B!#(B(@dfn{$BG$0U(B}$B$O$3$3$G$O!"(B@dfn{Lars $B$5$s$,FI$`$Y$-$G$"(B -$B$k$H9M$($k$b$N(B}$B$H$$$&$h$&$KDj5A$5$l$F$$$^$9(B) - -$B$^$?!"$?$$$F$$$N6&DL$NLdBj$N2r7h$N$K$$$/$D$+%a!<%k$N%0(B -$B%k!<%W$,$"$l$P!"$=$l$K$b$+$+$o$i$:(B gnus $B$r5/F0$7$?$$$H;W$&$+$b$7$l$^$;$s!#(B - -Gnus $B$O!"?.Mj$G$-$k%W%m%0%i%`$N0l$D$H$7$F!"%5!<%P!<$H@\B3$G$-$J$$$H$-$O(B -$B4pK\A*BrJ}K!$J$7$GB3$1$k$+$I$&$+$r?R$M$^$9!#$3$l$Ol9g(B) $B$d%5!<%P!<$,2?$i$+$NM}M3$G0l(B -$B;~E*$KD4;R$,$*$+$7$/$J$C$F$$$k$H$-$K5/$3$j$^$9!#$b$7$=$N$^$^B39T$9$k$3$H(B -$B$K$7$F!"30It%0%k!<%W$,0l$D$bL5$$>l9g!"uBV$K$7$^$9(B ($B4pK\%0%k!<%W$G$J$$%0%k!<%W$O$=$NFs$D$N%l%Y%k(B -$B$K$7$F$*$/$N$,K>$^$7$$$G$7$g$&(B)$B!#(B@pxref{Group Levels} $B$b;2>H$7$F2<$5$$!#(B - -@node Slave Gnusae -@section gnus $B$r%9%l!<%V$K$9$k(B -@cindex slave - -$B$"$J$?$OFs$D0J>e$N(B Emacs $B$H!"Fs$D0J>e$N(B gnus $B$rF1;~$KF0$+$7$?$$$H;W$&$+(B -$B$b$7$l$^$;$s!#0c$C$?(B @file{.newsrc} $B%U%!%$%k$r;H$C$F$$$k$J$i(B ($BNc$($P!"(B -$BFs$D$N0c$C$?%5!<%P!<$+$iFI$_9~$`$?$a$K!"Fs$D$N0c$C$?(B gnus $B$rF0:n$5$;$F$$(B -$B$k>l9g(B)$B!"$^$C$?$/LdBj$O$"$j$^$;$s!#$=$l$r9T$($PNI$$$@$1$G$9!#(B - -$BLdBj$O!"F1$8(B @code{.newsrc} $B%U%!%$%k$r;H$&Fs$D$N(B gnus $B$rF0$+$=$&$H$7$?$H(B -$B$-$K5/$3$j$^$9!#(B - -$B$3$NLdBj$KBP=h$9$k$?$a$K!"(Bgnus $B%?%o!<$N%7%s%/%?%s%/$K$$$k2f!9$O?7$7$$35(B -$BG0$K$?$I$j$D$-$^$7$?!#(B@dfn{$B%^%9%?!<(B} $B$H(B @dfn{$B%9%l!<%V(B} $B$G$9!#(B($B2f!9$O$3$N(B -$B35G0$KFC5v$r?=@A$7$^$7$?!#$=$7$F!"$=$N8@MU$NCx:n8"$rF@$^$7$?!#$*8_$$$K4X(B -$BO"$7$F$3$l$i$N8@MU$r;H$$$?$$$J$i!"0l2s;H$&Kh$K!";d$K(B $1 $B$rAw$i$J$1$l$P$J(B -$B$j$^$;$s!#$b$C$A$m$s!"(B@dfn{$B%3%s%T%e!<%?!<%"%W%j%1!<%7%g%s$N%^%9%?!$l(B @kbd{M-x gnus-slave} $B$G5/F0(B -$B$7$^$9!#%9%l!<%V$OIaDL$N(B @file{.newsrc} $B$OJ]B8$7$^$;$s$,!"Be$o$j(B -$B$K(B @dfn{$B%9%l!<%V%U%!%$%k(B} $B$K%9%l!<%V$N5/F0Cf$K$I$N$h$&$J%0%k!<%W$,FI$^$l(B -$B$?$+$H$$$&>pJs$@$1$rJ]B8$7$^$9!#%^%9%?!<(B gnus $B$,5/F0$9$k$H$-!"$=$l$O$=$l(B -$B$i$N%9%l!<%V%U%!%$%k$rFI$_9~$_(B ($B$=$7$F>C$7(B)$B!"$=$l$i$+$i$9$Y$F$N>pJs$rpJs$OIaDL$N(B ($B$9$J$o$A!"%^%9%?!<$N(B) $B%U%!(B -$B%$%k$h$j$bM%@h$5$l$^$9!#(B - -@node Fetching a Group -@section $B%0%k!<%W$rA0$r0z?t$H$7$F$H$j$^$9!#(B - -@node New Groups -@section $B?7$7$$%0%k!<%W(B -@cindex new groups -@cindex subscription - -@vindex gnus-check-new-newsgroups -$B?7$7$$%K%e!<%9%0%k!<%W$rA4$/8+$J$$$GK~B-$G$"$k$J$i$P!"(B -@code{gnus-check-new-newsgroups} $B$r(B @code{nil} $B$K@_Dj$9$k$3$H$,$G$-$^$9!#(B -$B$3$l$r@_Dj$7$?>l9g!"5/F0$K$+$+$k;~4V$,C;$/$J$j$^$9!#$3$NJQ?t(B -$B$,(B @code{nil} $B$K@_Dj$5$l$F$$$F$b!"%0%k!<%W%P%C%U%!$G(B @kbd{U} $B$r2!$;$P$$(B -$B$D$G$b?7$7$$%0%k!<%W$r9XFI$9$k$3$H$,$G$-$^$9(B (@pxref{Group Maintenance})$B!#(B -$B=i4|@_Dj$G$O$3$NJQ?t$O(B @code{ask-server} $B$G$9!#$3$NJQ?t(B -$B$,(B @code{always} $B$K@_Dj$5$l$F$$$k$H!"L?Na(B @kbd{g} $B$re$,$j$G$9!#$3$l$K$h$j!":o=|$5$l$?%0%k!<%W$N%j%9(B -$B%H$rJ];}$7$F$*$/$3$H$+$i$+$i40A4$K3+J|$5$l$^$9!#$G$9$+$i!"(B -@code{gnus-save-killed-list} $B$r(B @code{nil} $B$K$9$k$3$H$,$G$-$k$G$7$g$&!#(B -$B$=$&$9$l$P!"5/F0!"=*N;$NN>J}!"$=$7$FA4BN$K$o$?$C$F;~4V$r@aLs$G$-$^$9!#%G%#(B -$B%9%/>CHqNL$b>/$J$/$J$j$^$9!#$=$l$J$i!"$I$&$7$F$3$l$,=i4|@_Dj$G$O$J$$$N$G(B -$B$7$g$&(B? $B;DG0$J$,$i!"$9$Y$F$N%5!<%P!<$,$3$NL?Na$rM}2r$9$k$o$1$G$O$J$$$N$G(B -$B$9!#(B - -$B;d$O:#$"$J$?$,2?$r9M$($F$$$k$+$rEv$F$i$l$^$9!#$I$&$9$l$P%5!<%P!<(B -$B$,(B @code{ask-server} $B$rM}2r$9$k$+$,$o$+$k$N$G$7$g$&(B? $B$(!"0c$&$N$G$9(B -$B$+(B? $B$"$!!"NI$+$C$?!#$H$$$&$N$O!"3N$NJ}K!$H$7$F$O!"%5!<%P!<(B -$B$K(B @code{telnet} $B$r$7$F!"(B@code{HELP} $B$HBG$A!"%5!<%P!<$,M}2r$9$k%3%^%s%I(B -$B$NCf$K(B @samp{NEWGROUPS} $B$,$"$k$+$I$&$+$rD4$Y$k$3$H$b$G$-$^$9!#$b$7$"$l$P!"(B -$B$*$=$i$/F0:n$9$k$G$7$g$&(B ($B$7$+$7!"E,@Z$K5!G=$rDs6!$9$k$3$H$J(B -$B$/(B @samp{NEWGROUPS} $B$r%j%9%H$K4^$a$k%5!<%P!<$b$"$j$^$9(B)$B!#(B - -$B$3$NJQ?t$O!"A*BrJ}K!$N%j%9%H$G$"$k$3$H$b$G$-$^$9!#$=$N$H$-$O!"(Bgnus $B$OL?(B -$BNa(B @code{ask-server} $B$r$=$l$>$l$NA*BrJ}K!$KBP$7$FA0(B -$B$rM#0l$N0z?t$H$7$F8F$P$l$^$9!#(B - -$B$$$/$D$+$N%s%S(B (zombie) $B$K$7$^$9!#$3$l$,=i4|@_Dj(B $B$K$J$C(B -$B$F$$$^$9!#8e$G%>%s%S$r(B (@kbd{A z} $B$K$h$C$F(B) $B354Q$7$?$j!"(B(@kbd{S z} $B$K$h$C(B -$B$F(B) $BE,@Z$KA4$F$r:o=|$7$?$j!"(B(@kbd{u} $B$K$h$C$F(B) $B9XFI$7$?$j$G$-$^$9!#(B - -@item gnus-subscribe-randomly -@vindex gnus-subscribe-randomly -$BG$0U$N=gHV$G$9$Y$F$N?7$7$$%0%k!<%W$r9XFI$7$^$9!#e!Y$K2C$($i$l$^$9!#(B - -@item gnus-subscribe-alphabetically -@vindex gnus-subscribe-alphabetically -$B$9$Y$F$N?7$7$$%0%k!<%W$r%"%k%U%!%Y%C%H=g$K9XFI$7$^$9!#(B - -@item gnus-subscribe-hierarchically -@vindex gnus-subscribe-hierarchically -$B$9$Y$F$N?7$7$$%0%k!<%W$r3,AXE*$K9XFI$7$^$9!#$3$N4X?t(B -$B$H(B @code{gnus-subscribe-alphabetically} $B$N0c$$$O>/$7$7$+$"$j$^$;$s!#(B -@code{gnus-subscribe-alphabetically} $B$O?7$7$$%0%k!<%W$r87L)$K%"%k%U%!%Y%C(B -$B%H=g$K$J$i$Y$^$9$,!"$3$N4X?t$O%0%k!<%W$r$=$N3,AX$NCf$KF~$l$^$9!#$G$9$+$i!"(B -@samp{rec} $B$N3,AX$r(B @samp{comp} $B$N3,AX$NA0$K;}$C$F$-$?$$>l9g!"$3$N4X?t$O(B -$B$=$NG[CV$r$0$A$c$0$A$c$K$O$7$^$;$s!#$b$7$/$O!"$=$N$h$&$J$b$N$G$9!#(B - -@item gnus-subscribe-interactively -@vindex gnus-subscribe-interactively -$B?7$7$$%0%k!<%W$rBPOCE*$K9XFI$7$^$9!#$3$l$O(B gnus $B$,(B @strong{$BA4$F(B} $B$N%0%k!<(B -$B%W$KBP$7$F?R$M$k$3$H$r0UL#$7$F$$$^$9!#9XFI$9$k%0%k!<%W$O3,AXE*$K9XFI$5$l(B -$B$^$9!#(B - -@item gnus-subscribe-killed -@vindex gnus-subscribe-killed -$B$9$Y$F$N?7$7$$%0%k!<%W$r:o=|$7$^$9!#(B - -@item gnus-subscribe-topics -@vindex gnus-subscribe-topics -$B%0%k!<%W$r9gCW$9$k(B @code{subscribe} $B%H%T%C%/%Q%i%a!<%?$N$"$k%0%k!<%W$KF~(B -$B$l$^$9(B (@pxref{Topc Parameters})$B!#Nc$($P!"0J2<$N$h$&(B -$B$J(B @code{subscribe} $B%Q%i%a!<%?(B - -@example -"nnslashdot" -@end example - -$B$O$=$N@55,I=8=$K9gCW$9$kA4$F$N%0%k!<%W$O$=$N%H%T%C%/$N2<$G9XFI$5$l$k$H$$(B -$B$&$3$H$G$9!#(B - -$B%0%k!<%W$K9gCW$9$k%H%T%C%/$,L5$$>l9g!"%0%k!<%W$O:G>e0L$N%H%T%C%/$G9XFI$5(B -$B$l$^$9!#(B -@end table - -@vindex gnus-subscribe-hierarchical-interactive -$B>e$NJQ?t$HNI$/4X78$7$?JQ?t$O!"(B -@code{gnus-subscribe-hierarchical-interactive} $B$G$9!#$3$NJQ?t(B -$B$,(B @code{nil} $B$G$J$$$H!"(Bgnus $B$O3,AXE*$JJ}K!$G?7$7$$%0%k!<%W$r9XFI$9$k$+(B -$B$I$&$+$r?R$M$^$9!#(Bgnus $B$O$=$l$>$l$N3,AX$G!"$=$l$r2<$K9_$j$k$+$I$&$+$r?R(B -$B$M$^$9!#(B - -$B$h$/$"$k4V0c$$$O!"?tCJMnA0$NJQ(B -$B?t(B (@code{gnus-subscribe-newsgroup-method}) $B$r(B @code{gnus-subscribe-herarchical-interactive} $B$K(B -$B@_Dj$9$k$3$H$G$9!#$3$l$O8m$j$G$9!#$3$l$OF0:n$7$^$;$s!#$3$l$O$*$a$G$?$$?M(B -$B$N$9$k$3$H$G$9!#$G$9$+$i!"@dBP$K$7$J$$$G$/$@$5$$!#(B - -@node Filtering New Groups -@subsection $B?7$7$$%0%k!<%W$rA*JL$9$k(B - -$B$I$N?7$7$$%0%k!<%W$,9XFI(B ($B$b$7$/$O!"L5;k(B) $B$5$l$k$Y$-$+$r4IM}$9$k2wE,$GA0$r;}$D%0%k!<%W$OA4$FL5;k$5$l!"(B@samp{sci} $B$G;O$^$kL>A0$r;}$D%0%k!<(B -$B%W$OA4$F9XFI$9$k!"$H$$$&$3$H$rI=$7$F$$$k$+$i$G$9!#(BGnus $B$O$3$l$i$N%0%k!<(B -$B%W$r9XFI$9$k$N$K!"IaDL$N9XFIJ}K!$rMQ$$$^$;$s!#Be$o$j$K!"(B -@code{gnus-subscribe-options-newsgroup-method} $B$,MQ$$$i$l$^$9!#$3$NJQ?t(B -$B$O=i4|@_Dj$G$O(B @code{gnus-subscribe-alphabetically} $B$G$9!#(B - -@vindex gnus-options-not-subscribe -@vindex gnus-options-subscribe -$B%U%!%$%k(B @file{.newsrc} $B$r$$$8$j$?$/$J$$>l9g$O!"(B -@code{gnus-options-subscribe} $B$H(B @code{gnus-options-not-subscribe} $B$NFs(B -$B$D$NJQ?t$@$1$r@_Dj$9$k$3$H$b$G$-$^$9!#$3$NFs$D$NJQ?t$O%U%!%$(B -$B%k(B @file{.newsrc} $B$N(B @samp{optinos -n} $B9T$HA4$/F1$8$3$H$r$7$^$9!#$I$A$i(B -$B$NJQ?t$b@55,I=8=$G!"?7$7$$%0%k!<%W$OA0r7o$K9XFI$5$l!"8e(B -$BJ,$J$b$N$G$9!#$7$+$7!";d$O$3$NFs$D$,$"$C$?J}$,NI$$$H;W$$$^$7$?!#$b$&0l(B -$BJ}$NJQ?t$O%f!<%6$,$$$8$/$k$N$K;H$o$l$k$N$KBP$7$F!"$3$NJQ?t$O$$$/$D$+$N4p(B -$BK\E*$J5,B'$r@_Dj$9$k$?$a$N$b$N$G$9!#=i4|@_Dj$G$O$3$NJQ?t$O%a!<%k%P%C%/%((B -$B%s%I(B (@code{nnml}, @code{nnbabyl}, @code{nnfolder}, @code{nnmbox}@ $B$H(B -@code{nnmh}) $B$+$i$G$-$kA4$F$N?7$7$$%0%k!<%W$r9XFI$9$k$h$&$K$J$C$F$$$^$9!#(B -$B$=$l$,7y$G$"$l$P!"$3$NJQ?t$r(B @code{nil} $B$K@_Dj$7$F$/$@$5$$!#(B - -$B$3$N@55,I=8=$K9gCW$9$k?7$7$$%0%k!<%W(B -$B$O(B @code{gnus-subscribe-options-newsgroup-method} $B$r;H$C$F9XFI$5$l$^$9!#(B - -@node Changing Servers -@section $B%5!<%P!<$r49$($k(B -@cindex changing servers - -$B$H$-$I$-!"$"$k(B @sc{nntp} $B%5!<%P!<$+$iJL$N%5!<%P!<$X0\F0$7$J$1$l$P$J$i$J(B -$B$$$3$H$,$"$j$^$9!#$3$N$h$&$J$3$H$O$a$C$?$K$*$-$^$;$s$,!"$*$=$i$/$"$J$?$,(B -$B;E;v$rJQ$($?$j!";H$C$F$$$k%5!<%P!<$,$H$F$bIT0BDj$G!"JL$N$b$N$K>h$j49$($?(B -$B$$$H$$$&$H$-$KI,MW$K$J$k$G$7$g$&!#(B - -$B%5!<%P!<$rJQ99$9$k$N$O$H$F$b4JC1$G$9$h$M(B? @code{gnus-select-method} $B$r?7(B -$B$7$$%5!<%P!<$r;X$7<($9$h$&$KJQ99$9$l$P$$$$$@$1$G$9$M(B? - -@emph{$B0c$$$^$9(B!} - -$B5-;v$NHV9f$O0c$C$?(B @sc{nntp} $B%5!<%P!<$G$b(B ($B$I$&$K$+$7$F(B) $BF1$8$K$7$F$"$k!"(B -$B$H$$$&$3$H$O$"$j$^$;$s!#$=$7$F!"(Bgnus $B$,$I$N5-;v$rFI$s$@$+$r5-O?$9$kM#0l(B -$B$NJ}K!$O!"5-;vHV9f$r5-O?$9$k$3$H$G$9!#$G$9$+$i!"(B -@code{gnus-select-method} $B$rJQ99$7$?$H$-$O!"%U%!%$%k(B @file{.newsrc} $B$O0U(B -$BL#$,$J$/$J$j$^$9!#(B - -Gnus $B$O%U%!%$%k(B @file{.newsrc} $B$r$"$k%5!<%P!J}$N%5!<%P!<$K@\B3$G$-$k$J$i!"(Bgnus $B$O$"$J$?$,FI$s$@5-;vA4$F$KBP$7(B -$B$F%X%C%@!<(B (headers) $B$rMW5a$7$F!"(B@code{Message-ID} $B$rHf3S$7!"FI$s$@5-;v(B -$B$H5-;v$N0u$r?7$7$/5-O?$7$^$9!#%3%^%s%I(B @kbd{M-x gnus-change-server} $B$O$3(B -$B$l$r$9$Y$F$N4pK\%0%k!<%W$KBP$7$F9T$$$^$9!#$=$N%3%^%s%I$O0\F0@h$NJ}K!$NF~(B -$BNO$rB%$7$^$9!#(B - -@kindex M-x gnus-group-move-group-to-server -@findex gnus-group-move-group-to-server -$B8D!9$N%0%k!<%W$rL?Na(B @kbd{M-x gnus-group-move-group-to-server} $B$G0\(B -$BF0$9$k$3$H$b$G$-$^$9!#$3$l$O$"$k%5!<%P!<$+$iJL$N%5!<%P!<$X0l$D(B -$B$N(B ($B30It(B) $B%0%k!<%W$r0\F0$7$?$$$H$-$KLr$KN)$A$^$9!#(B - -@kindex M-x gnus-group-clear-data-on-native-groups -@findex gnus-group-clear-data-on-native-groups -$B8E$$%5!<%P!<$H?7$7$$%5!<%P!<$NN>J}$K@\B3$9$k$3$H$,$G$-$J$$$H$-!"0u$HFI$s(B -$B$@HO0O$O$9$Y$F0UL#$,L5$/$J$j$^$9!#$=$N$h$&$J$H$-$O!"%3%^%s%I(B @kbd{M-x -gnus-group-clear-data-on-native-groups} $B$r;H$C$F!"4pK\%0%k!<%W$K4X$9$k%G!<(B -$B%?$r$9$Y$F>C5n$9$k$3$H$,$G$-$^$9!#$3$N%3%^%s%I$OCm0U$7$F;H$C$F$/$@$5$$!#(B - -$B%5!<%P!<$rJQ99$7$?8e$G!"%-%c%C%7%e3,AX$r0\F0$5$;$J$1$l$P(B@strong{$B$J$j$^$;(B -$B$s(B}$B!#$H$$$&$N$O!"%-%c%C%7%e5-;v$O4V0c$C$?5-;vHV9f$K$J$C$F$*$j!"$=$l(B -$B$O(B gnus $B$,$I$N5-;v$rFI$s$@$H$_$J$9$+$K1F6A$7$^$9!#(B - -@node Startup Files -@section $B5/F0%U%!%$%k(B -@cindex startup files -@cindex .newsrc -@cindex .newsrc.el -@cindex .newsrc.eld - -$B:#$d!"$"$J$?$O%U%!%$%k(B @file{.newsrc} $B$K$D$$$F$9$Y$FCN$C$F$$$^$9!#$9$Y$F(B -$B$N9XFI>pJs$OEAE}E*$K$3$N%U%!%$%k$KC_@Q$5$l$^$9!#(B - -@sc{gnus} $B$G$OJ*;v$,>/!9J#;($K$J$C$F$$$^$9!#%U%!%$%k(B @file{.newsrc} $B$r:G(B -$B?7$N$b$N$K$9$k$@$1$G$O$J$/!"%U%!%$%k(B @file{.newsrc} $B$K$O9g$o$J$$>pJs$rJ](B -$BB8$7$F$*$/$?$a$K(B @file{.newsrc.el} $B$H8F$P$l$k%U%!%$%k$r;H$$$^$9!#(B($BpJs$rJ#@=$7$FJ];}$7$F$$$^(B -$B$9!#(B) @sc{gnus}$B$O$3$l$i$NCf$G0lHV:G8e$KJ]B8$5$l$?$b$N$r;H$$$^$9!#$3$l$r(B -$B$9$k$3$H$K$h$j!"(B@sc{gnus} $B$HB>$N%K%e!<%9%j!<%@!<$r@Z$jBX$($F;H$&$3$H$,$G(B -$B$-$^$9!#(B - -$B$3$l$O$A$g$C$H$P$+$JJ}K!$J$N$G!"(Bgnus $B$O$b$C$HNI$$J}K!$rJT$_=P$7$^$7$?!#(B -@file{.newsrc} $B$H(B @file{.newsrc.el} $B%U%!%$%k$K2C$($F!"(B -gnus $B$O(B @file{.newsrc.eld} $B$H8F$P$l$k%U%!%$%k$b;}$C$F$$$^$9!#(BGnus $B$O$3$l(B -$B$i$NCf$G0lHV?7$7$$%U%!%$%k$rFI$_$^$9$,!"%U%!%$%k(B @file{.newsrc.el} $B$K=q(B -$B$-9~$`$3$H$O$"$j$^$;$s!#%U%!%$%k(B @file{.newsrc.eld} $B$O@dBP$K>C$9$Y$-$G$O(B -$B$"$j$^$;$s!#(B---$B$=$l$O%U%!%$%k(B @file{.newsrc} $B$K$O$J$$$?$/$5$s$N>pJs$rJ](B -$B;}$7$F$$$^$9!#(B - -@vindex gnus-save-newsrc-file -@vindex gnus-read-newsrc-file -@code{gnus-save-newsrc-file} $B$r(B @code{nil} $B$K$9$k$3$H$K$h$C$F%U%!%$(B -$B%k(B @file{.newsrc} $B$K=q$-9~$`$N$r;_$a$k$3$H$,$G$-$^$9!#$=$&$9$l$P!"$=$N%U%!(B -$B%$%k$r:o=|$9$k$3$H$,$G$-!"%G%#%9%/MFNL$r@aLs$9$k$3$H$,$G$-!"(Bgnus $B$N=*N;(B -$B$,B.$/$J$j$^$9!#$7$+$7!"$=$&$9$k$HB>$N%K%e!<%9%j!<%@!<$r;H$($J$/$J$j$^$9!#(B -$B$G$b!"$A$g$C$H!"C/$+$=$&$7$?$$?M$,$$$k$G$7$g$&$+!#F1$8$h$&(B -$B$K(B @code{gnus-read-newsrc-file} $B$r(B @code{nil} $B$K$9$k$3$H$K$h$C(B -$B$F(B @file{.newsrc} $B$H$9$Y$F$N(B @file{.newsrc-SERVER} $B$r:n$i$J$$$h$&$K$J$j(B -$B$^$9!#$b$7$"$J$?$,;~!9(B Netscape $B$r;H$&$N$J$i$P!"$3$&$9$k$N$,ET9g$,NI$$$G(B -$B$7$g$&!#(B - -@vindex gnus-save-killed-list -@code{gnus-save-killed-list} ($B=i4|@_Dj$G$O(B @code{t}) $B$,(B @code{nil} $B$G$"(B -$B$k$H!"(Bgnus $B$O:o=|$5$l$?%0%k!<%W$r5/F0%U%!%$%k$KJ]B8$7$^$;$s!#$3$l$O!"(B($B5/(B -$BF0;~$H=*N;;~$N(B) $B;~4V$H!"(B($B%G%#%9%/$N(B) $BMFNL$r@aLs$7$^$9!#$3$&$9$k$H!"(B -gnus $B$,$I$N%0%k!<%W$,?7$7$$$+$N5-O?$r;}$C$F$$$J$$$3$H$K$J$j$^$9$N$G!"?7(B -$B$7$$%0%k!<%W$N<+F09XFIJ}K!$O0UL#$,L5$/$J$j$^$9!#$3$NJQ?t$r(B @code{nil} $B$K(B -$B$7$?$H$-$O!"(B@code{gnus-check-new-newsgroups} $B$r>o(B -$B$K(B @code{nil} $B$+(B @code{ask-server} $B$K$7$F$*$/$Y$-$G$7$g(B -$B$&(B (@pxref{New Groups})$B!#$3$NJQ?t$O@55,I=8=$G$"$k$3$H$b$G$-$^$9!#$=$N$h(B -$B$&$J>l9g$O!"%U%!%$%k$rJ]B8$9$kD>A0$K$=$N@55,I=8=$K9gCW$7$J$$$9$Y$F$N%0%k!<(B -$B%W$r>C5n$7$^$9!#$3$l$O!"$9$Y$F$N%5!<%P!<$,(B @code{ask-server} $B$rM}2r$9$k(B -$B$o$1$G$O$J$$!"$H$$$C$?$h$&$J!"FCDj$N$"$$$^$$$J>u67$N$H$-$KLr$KN)$D$G$7$g(B -$B$&!#(B - -@vindex gnus-startup-file -$BJQ?t(B @code{gnus-startup-file} $B$O5/F0%U%!%$%k$,$I$3$K$"$k$+$r;XDj$7$^$9!#(B -$B=i4|CM$O(B @file{~/.newsrc} $B$G!"$=$l$,$I$N$h$&$J$b$N$G$"$l!"KvHx(B -$B$K(B @samp{.eld} $B$r$D$1$?$b$N$,(B gnus (El Dingo) $B$N5/F0%U%!%$%k$K$J$j$^$9!#(B - -@vindex gnus-save-newsrc-hook -@vindex gnus-save-quick-newsrc-hook -@vindex gnus-save-standard-newsrc-hook -@code{gnus-save-newsrc-hook} $B$O(B newsrc $B%U%!%$%k$NCf$N$I$l$+$rJ]B8$9$kA0(B -$B$KA0$N%U%!%$%k$rD4$Y$^$9$,!"@\Hx(B -$B8l(B @file{.elc} $B$H(B @file{.el} $B$,$D$$$F$$$k$b$N$bD4$Y$^$9!#8@$$49$($l$P!"(B -@code{gnus-init-file} $B$r(B @file{~/.gnus} $B$K@_Dj$9$k$H!"(Bgnus $B$O(B ($B$3$N=gHV(B -$B$K(B) @file{~/.gnus.elc}, @file{~/.gnus.el} $B$rC5$7!":G8e(B -$B$K(B @file{~/.gnus} $B$rC5$7$^$9!#(B - -@node Auto Save -@section $B<+F0J]B8(B -@cindex dribble file -@cindex auto-save - -$B2?$+(B gnus $B$N%G!<%?$rJQ99$9$k$3$H(B ($B5-;v$rFI$`!"0u$rIU$1$k!"%0%k!<%W$r:o=|(B -$B$^$?$O9XFI$9$k(B) $B$r$7$?$H$-!"JQ99$OFCJL$J(B@dfn{$B%I%j%V%k%P%C%U%!(B (dribble -buffer)} $B$K=q$-9~$^$l$^$9!#$3$N%P%C%U%!$O(BEmacs $B$,IaDL$9$k$h$&$K<+F0J]B8(B -$B$5$l$^$9!#%U%!%$%k(B @file{.newsrc} $B$rJ]B8$9$kA0$K(B Emacs$B$,Mn$A$?$H$-$O!"$9(B -$B$Y$F$NJQ99$r$3$N%U%!%$%k$+$i2sI|$9$k$3$H$,$G$-$k$G$7$g$&!#(B - -$B5/F0;~$K(B gnus $B$,$3$N%U%!%$%k$NB8:_$rH/8+$9$k$H!"(Bgnus $B$O$=$l$rFI$_9~$`$+(B -$B$I$&$+$rMxMQA0$r;}$D%0%k!<%W$rGS=|$9$k$?$a$K;H$o$l$F$-$^$7$?$,!"6=L#$NL5$$%0(B -$B%k!<%W$N3,AX$rL5;k$9$k$?$a$K;H$&$3$H$b$G$-$^$9!#$7$+$7!"$3$l$O$*4+$a$G$-(B -$B$^$;$s!#K\Ev$N$3$H$r8@$&$H!"A4$/;?@.$G$-$^$;$s!#Be$o$j$K!"$=$N$h$&$JMQES(B -$B$KMQ$$$i$l$kJQ?t$N35N,$rCN$k$?$a$K!"(B@pxref{New Groups} $B$r;2>H$7$F$/$@$5(B -$B$$!#(B - -@c This variable is -@c @code{nil} by default, and will slow down active file handling somewhat -@c if you set it to anything else. - -@vindex gnus-read-active-file -@c @head -$B%"%/%F%#%V%U%!%$%k$OHf3SE*Bg$-$/$J$k798~$,$"$k$N$G!"CY$$2s@~$r;H$C$F$$$k(B -$B$H$-$O!"%"%/%F%#%V%U%!%$%k$rFI$_9~$^$J$$$h$&(B -$B$K(B @code{gnus-read-active-file} $B$r(B @code{nil} $B$K@_Dj$9$k$3$H$,$G$-$^$9!#(B -$B$3$NJQ?t$O=i4|@_Dj$G$O(B @code{some} $B$G$9!#(B - -$B$=$N$h$&$J;~$O!"(Bgnus $B$OpJs$@$1$rF@(B -$B$F$d$C$F$$$3$&$H$7$^$9!#(B - -$B5$$rIU$1$F$[$7$$$N$O!"$"$J$?$,;3$[$I$N$?$/$5$s$N%0%k!<%W$r9XFI$7$F$$$k$H(B -$B$-$K$3$NJQ?t$r(B @code{nil} $B@_Dj$9$k$H!"(Bgnus $B$OB.$/$J$k$I$3$m$+!"CY$/$J$C(B -$B$F$7$^$&$H$$$&$3$H$G$9!#8=>u$G$O!"%K%e!<%9$r(B 2400bps $B0J>e$N%b%G%`$rDL$7(B -$B$FFI$s$G$$$k$N$G$J$$8B$j!"(Bgnus $B$NB.EY$O$+$J$jCY$/$J$k$G$7$g$&!#(B - -$B$3$NJQ?t$O(B @code{some} $B$H$$$&CM$bu$N>pJs$r9XFI$5$l$F$$$k%0%k!<%W$N$b$N$@$1$rF@$h$&$H$7$^$9!#$$$/$D$+$N%5!<(B -$B%P!<(B ($BL?Na(B @code{LIST ACTIVE group} $B$r;H$&$3$H$N$G$-$k!":G?71T$N(B INN $B%5!<(B -$B%P!<(B) $B$G$O!"Hs>o$KAa$/$J$k$G$7$g$&$,!"B>$N%5!<%P!<$G$OB.$/$O$"$j$^$;$s!#(B -$B$I$N$h$&$K$;$h!"CY$$2s@~$G$O(B @code{some} $B$O(B @code{nil} $B$h$j$bB.$/!"$=$l(B -$B$O$b$A$m$s(B@code{t} $B$h$j$bB.$/$J$j$^$9!#(B - -$B$$$/$D$+$N%K%e!<%9%5!<%P!<(B ($BNc$($P8E$$(B Leafnode $B$d8E$$(B INN) $B$K$OL?(B -$BNa(B @code{LIST ACTIVE group} $B$,$"$j$^$;$s!#$=$&$$$&%5!<%P!<$K(B -$B$O(B @code{nil} $B$r$3$NJQ?t$NCM$K@_Dj$9$k$N$,!"$*$=$i$/$b$C$H$bM-8z$G$7$g$&!#(B - -$B$b$7$3$NJQ?t$,(B @code{nil} $B$G$"$k$H!"(Bgnus $B$O40A4$K$,$s$8$,$i$a$NJ}K!$G%0(B -$B%k!<%W$N>pJs$rF@$h$&$H$7$^$9!#$=$7$F!"$3$l$O$"$^$jB.$/$"$j$^$;$s!#$b$7$=(B -$B$l$,(B @code{some} $B$G(B @sc{nntp} $B%5!<%P!<$r;H$C$F$$$k$H$-$O!"(Bgnus $B$O$G$-$k(B -$B$@$1B.$/L?Na$r=P$7!"0l7b$G$9$Y$F$NJVEz$rFI$_9~$_$^$9!#$3$NJ}$,IaDL$O$h$j(B -$BNI$$7k2L$r$b$?$i$7$^$9$,!"%5!<%P!<$,L?Na(B @code{LIST ACTIVE group} $B$rM}2r(B -$B$7$J$$$J$i!"%5!<%P!<$K$H$C$F$O$"$^$jNI$$$H$O8@$($^$;$s!#(B - -Gnus $B$N5/F0$K$"$^$j$K;~4V$,$+$+$k$H;W$C$?$J$i!"$3$NJQ?t$K$3$l$i$N;0$D$N(B -$B0c$C$?CM$r;n$7$F$_$F!"$I$l$,0lHVNI$$$+$rC5$7$F$/$@$5$$!#(B - -@code{some} $B$+(B @code{nil} $B$r;H$&$N$G$"$l$P!"$I$A$i$K$7$mB.EY$r>e$2$k$?$a(B -$B$K$9$Y$F$N6=L#$NL5$$%0%k!<%W$rI,$::o=|$9$k$Y$-$G$7$g$&!#(B - -$B$3$NJQ?t$OFse;J$K5$IU$+$l$K$/$/$J$k$G(B -$B$7$g$&!#$3$NJQ?t$O(B @file{.gnus.el} $B$,%m!<%I$5$l$kA0$K;H$o$l$^$9$N$G!"(B -@code{.emacs} $B$K@_Dj$9$k$Y$-$G$"$kE@$rCm0U$7$F$/$@$5$$!#(B - -@item gnus-no-groups-message -@vindex gnus-no-groups-message -$B%0%k!<%W$,0l$D$bB8:_$7$J$$$H$-$K(B gnus $B$,I=<($9$k%a%C%;!<%8$G$9!#(B - -@item gnus-play-startup-jingle -@vindex gnus-play-startup-jingle -$B$b$7(B @code{nil} $B$G$J$$$H!"5/F0;~$K(B gnus $B$NC;$$6J$r1iAU$7$^$9!#(B - -@item gnus-startup-jingle -@vindex gnus-startup-jingle -$B>e$NJQ?t$,(B @code{nil} $B$G$J$$$H$-$K1iAU$5$l$kC;$$6J$G$9!#=i4|CM(B -$B$O(B @samp{Tuxdemoon.Jingle4.au} $B$G$9!#(B -@end table - -@node Group Buffer -@chapter $B%0%k!<%W%P%C%U%!(B -@cindex group buffer - -$B%0%k!<%W%P%C%U%!(B (@dfn{group buffer}) $B$OM-8z$J%0%k!<%W$rA4It(B ($B$"$k$$$O0l(B -$BIt$r(B) $B0lMwI=<($7$^$9!#$3$l$O(B gnus $B$r5/F0$7$?$H$-$K:G=i$KI=<($5$l$k%P%C%U%!(B -$B$G!"(Bgnus $B$,@8$-$F$$$k8B$j7h$7$F>C$5$l$k$3$H$O$"$j$^$;$s!#(B - -@iftex -@iflatex -\gnusfigure{The Group Buffer}{320}{ -\put(75,50){\epsfig{figure=tmp/group.ps,height=9cm}} -\put(120,37){\makebox(0,0)[t]{Buffer name}} -\put(120,38){\vector(1,2){10}} -\put(40,60){\makebox(0,0)[r]{Mode line}} -\put(40,58){\vector(1,0){30}} -\put(200,28){\makebox(0,0)[t]{Native select method}} -\put(200,26){\vector(-1,2){15}} -} -@end iflatex -@end iftex - -@menu -* Group Buffer Format:: $BI=<($5$l$F$$$k>pJs$HJQ99$NJ}K!(B -* Group Maneuvering:: $B%0%k!<%W%P%C%U%!$r0\F0$9$k%3%^%s%I(B -* Selecting a Group:: $BC5n(B -* Group Data:: $B%0%k!<%W$N>pJs$rJQ99$9$k(B -* Group Levels:: $B%l%Y%k(B? $B$=$l$C$F2?(B? -* Group Score:: $B$"$J$?$N9%$-$J%0%k!<%W$r8+$D$1=P$9J}K!(B -* Marking Groups:: $B%0%k!<%W$K0u$r$D$1$F$*$$$F!"8e$G=hM}$G$-(B - $B$^$9(B -* Foreign Groups:: $B%0%k!<%W$N:n@.$H=$@5(B -* Group Parameters:: $B%0%k!<%WKh$K0c$C$?%Q%i%a!<%?$r;}$?$;$i$l(B - $B$^$9(B -* Listing Groups:: Gnus $B$O%0%k!<%W$r$$$m$$$m$JJ,$1J}$GI=<((B - $B$G$-$^$9(B -* Sorting Groups:: $B%0%k!<%W$N=gHV$NG[CVBX$((B -* Group Maintenance:: $B$-$l$$$J(B @file{.newsrc} $B$NJ]$AJ}(B -* Browse Foreign Server:: $B%5!<%P$r354Q$G$-$k!#2?$,FI$a$k$N$+8+$F$_(B - $B$h$&(B -* Exiting Gnus:: $B%K%e!<%9FI$`$N$r$d$a$F!";E;v$r$7$h$&(B -* Group Topics:: $B%0%k!<%W$r@Z$j:.$<$F!"%H%T%C%/$4$H$KJ,3d(B - $B$9$k(B -* Misc Group Stuff:: $BB>$K$G$-$k$3$H(B -@end menu - -@node Group Buffer Format -@section $B%0%k!<%W%P%C%U%!$N7A<0(B - -@menu -* Group Line Specification:: $B%0%k!<%W%P%C%U%!$N8+$(J}$r7h$a$k(B -* Group Modeline Specification:: $B%0%k!<%W%P%C%U%!$N%b!<%I9T(B -* Group Highlighting:: $B%0%k!<%W%P%C%U%!$K$-$l$$$K?'$r$D$1$k(B -@end menu - -@node Group Line Specification -@subsection $B%0%k!<%W9T$N;EMM(B -@cindex group buffer format - -$B%0%k!<%W%P%C%U%!$N=i4|@_Dj7A<0$O$-$l$$$G$D$^$s$J$$$1$I!"$3$l$O7/$N9%$-$J(B -$B$h$&$K!"%5%$%3!<$K%@%5$/$9$k$3$H$b$G$-$^$9!#(B - -$B$3$l$,%0%k!<%W9T$NNc$G$9!#(B - -@example - 25: news.announce.newusers - * 0: alt.fan.andrea-dworkin -@end example - -$B$H$C$F$b4JC1$G$7$g(B? - -@samp{news.announce.newusers} $B$K$O(B 25 $B$NL$FI5-;v$,$"$k$N$,$o$+$j$^$9!#(B -@samp{alt.fan.andrea-dworkin} $B$K$OL$FI5-;v$O$J$$$1$l$I$b!"0u$r$D$1$?5-;v(B -$B$,$$$/$D$+$"$j$^$9(B ($B9TF,$N$A$C$A$c$J%"%9%?%j%9%/$,8+$($k(B?)$B!#(B - -@vindex gnus-group-line-format -$B$3$N7A<0$O(B @code{gnus-group-line-format} $BJQ?t$r$$$8$k$3$H$G!"$I$s$JIw$K(B -$B$G$bJQ$($i$l$^$9!#$3$NJQ?t$O(B @code{format} $B$N;EMMIw$KF0:n$7$^$9!#$D$^(B -$B$j(B ($B$"$N%/%=(B) C $B8@8l$r;H$&?M$?$A$N$?$a!"(Bprintf $B$N;EMM$H$[$\F1$8$G$9!#(B -@xref{Formatting Variables} - -@samp{%M%S%5y: %(%g%)\n} $B$H$$$&CM$G>e5-$N9T$r@8@.$7$^$9!#(B - -$B%3%m%s$O!"$3$N9T$NCf$KI,$:L5$/$F$O$$$1$^$;$s!#%+!<%=%k$O!"2?$+$NA`:n$r$7(B -$B$?8e$O>o$K%3%m%s$N$H$3$m$K0\F0$9$k$+$i$G$9!#B>$K$O2?$bI,MW$G$O$"$j$^$;(B -$B$s!=!=%0%k!<%WL>$5$($b$G$9!#I=<($5$l$F$$$kJ8;z$OA4$F$?$@$N2hLL$N>~$j$G$"(B -$B$j!"(Bgnus $B$,$=$l$rD4$Y$k$3$H$O$"$j$^$;$s!#(BGnus $B$OI,MW$H$9$kA4$F$NpJs$r!"(B -$B%F%-%9%HB0@-$r;H$C$F21$($F$$$^$9!#(B - -($B$b$77/$,!"$9$4$/%X%s$J!"AG@2$i$7$$!"I=7W;;Iw$N%l%$%"%&%H$r:n$C$?$H$7$?(B -$B$i!"$_$s$J!"7/$O2q7W$N;E;v$,K;$7$/$C$F!"%K%e!<%9$rFI$s$G;~4V$rL5BL;H$$$7(B -$B$?$j$J$s$+$7$F$J$$!"$C$F?.$8$F$/$l$k$h!#(B) - -$B0J2<$,;HMQ$G$-$k%U%)!<%^%C%HJ8;z$N%j%9%H$G$9!#(B - -@table @samp -@item M -$B$=$N%0%k!<%W$,0u$N$D$$$?5-;v$@$1$N$H$-$O!"%"%9%?%j%9%/J8;z!#(B - -@item S -$B$=$N%0%k!<%W$,9XFI$5$l$F$$$k$+$I$&$+!#(B - -@item L -$B9XFIEY$N%l%Y%k!#(B - -@item N -$BL$FI5-;v$N?t!#(B - -@item I -$BJ]N15-;v$N?t!#(B - -@item T -$B0uIU$-5-;v$N?t!#(B - -@item R -$B4{FI5-;v$N?t!#(B - -@item t -$B?dDjA45-;v?t(B ($B$3$l$O(B Gnus $B%a!<%j%s%0%j%9%H$K(B -$BO"Mm$7$F2<$5$$!#(B - -@item y -$BL$FI$G$b!"0uIU$-$G$b!"J]N1$G$b$J$$5-;v$N?t!#(B - -@item i -$B0uIU$-5-;v$HJ]N15-;v$N?t!#(B - -@item g -$B%0%k!<%WL>$N%U%k%M!<%`!#(B - -@item G -$B%0%k!<%WL>!#(B - -@item D -$B%K%e!<%9%0%k!<%W$N@bL@!#(B - -@item o -$B;J2ql9g(B @samp{m}. - -@item O -$B;J2ql9g(B @samp{(m)}. - -@item s -$BA*BrJ}K!!#(B - -@item n -$B$I$3$+$i$NA*Br$+!#(B - -@item z -$B30ItA*BrJ}K!$,;H$o$l$F$$$k>l9g!"(B@samp{<%s:%n>} $B$HF1$8J8;zNs!#(B - -@item P -$B%H%T%C%/(B (@pxref{Group Topics}) $B$N%l%Y%k$K1~$8$?;z2<$2!#(B - -@item c -@vindex gnus-group-uncollapsed-levels -$BC;$$(B ($B>JN,$7$?(B) $B%0%k!<%WL>!#(B@code{gnus-group-uncollapsed-levels} $BJQ?t$O!"(B -$B$I$N%l%Y%k$^$G%0%k!<%WL>$rA4It;D$9$+$r<($7$^$9!#=i4|CM$O(B 1 $B$G$9!=!=$3(B -$B$N0UL#$O!"(B@samp{gnu.emacs.gnus} $B$N$h$&$J%0%k!<%WL>(B -$B$r(B @samp{g.e.gnus} $B$KC;=L$9$k$H$$$&$3$H$G$9!#(B - -@item m -@vindex gnus-new-mail-mark -@cindex % -$B$=$N%0%k!<%W$K:G6a?7Ce%a!<%k$,FO$$$F$$$k>l9g(B -$B$O(B @samp{%} (@code{gnus-new-mail-mark})$B!#(B - -@item p -@samp{#} (@code{gnus-process-mark}) $B$G!"$=$N%0%k!<%W$K%W%m%;%9%^!<%/$,IU(B -$B$$$F$$$k$3$H$r<($7$^$9!#(B - -@item d -$B:G8e$K$$$D$3$N%0%k!<%W$rFI$s$@$+$r<($9J8;zNs(B (@pxref{Group Timestamp})$B!#(B - -@item u -$BMxMQ$N3F;XDjJ8;z$N>pJs$HF1MM$K!"(B -$B%P%C%U%!$KA^F~$5$l$kJ8;zNs$rJV$5$J$1$l$P$J$j$^$;$s!#(B -@end table - -@cindex * -$BA4$F$N!V!A$N?t!W$N;XDj$G!"$b$7$=$N>pJs$,MxMQ$G$-$J$$>l9g$K$O%"%9%?%j%9(B -$B%/(B (@samp{*}) $B$,Kd$a$i$l$^$9!=!=Nc$($P!"5/F0$5$l$F$$$J$$30It%0%k!<%W$d!"(B -$BIT@5$J4pK\%0%k!<%W$N>l9g$G$9!#(B - -@node Group Modeline Specification -@subsection $B%0%k!<%W%b!<%I9T$N;EMM(B -@cindex group modeline - -@vindex gnus-group-mode-line-format -$B%b!<%I9T(B -$B$O(B @code{gnus-group-mode-line-format} (@pxref{Mode Line Formatting}) $B$r(B -$B@_Dj$9$k$3$H$GJQ99$G$-$^$9!#$3$$$D$O;XDjJ8;z$r$"$s$^$j$?$/$5$sCN$C$F$^$;(B -$B$s!#(B - -@table @samp -@item S -$B4pK\%K%e!<%9%5!<%P!2A$5$l$k(B -$B$b$N$J$i!"$=$N9T$KBP$7$F(B @var{face} $B$,;HMQ$5$l$^$9!#(B - -$B0J2<$,$3$NJQ?t$NCM$NNc$G$9!#$3$l$OGX7J$,0E$$@_Dj$G$O$-$l$$$K8+$($k$+$bCN(B -$B$l$^$;$s!#(B - -@lisp -(cond (window-system - (setq custom-background-mode 'light) - (defface my-group-face-1 - '((t (:foreground "Red" :bold t))) "First group face") - (defface my-group-face-2 - '((t (:foreground "DarkSeaGreen4" :bold t))) "Second group face") - (defface my-group-face-3 - '((t (:foreground "Green4" :bold t))) "Third group face") - (defface my-group-face-4 - '((t (:foreground "SteelBlue" :bold t))) "Fourth group face") - (defface my-group-face-5 - '((t (:foreground "Blue" :bold t))) "Fifth group face"))) - -(setq gnus-group-highlight - '(((> unread 200) . my-group-face-1) - ((and (< level 3) (zerop unread)) . my-group-face-2) - ((< level 3) . my-group-face-3) - ((zerop unread) . my-group-face-4) - (t . my-group-face-5))) -@end lisp - -@pxref{Faces and Fonts} $B$b;2>H$7$F$/$@$5$$!#(B - -$B$3$N(B form $B$,I>2A$5$l$k$H$-$KF0E*$KB+G{$5$l$F$$$kJQ?t$K$O0J2<$N$b$N$,$"$j(B -$B$^$9!#(B - -@table @code -@item group -$B%0%k!<%WL>!#(B -@item unread -$B$=$N%0%k!<%W$NL$FI5-;v$N?t!#(B -@item method -$BA*BrJ}K!!#(B -@item mailp -$B$=$N%0%k!<%W$,%a!<%k$N%0%k!<%W$+$I$&$+!#(B -@item level -$B$=$N%0%k!<%W$N%l%Y%k!#(B -@item score -$B$=$N%0%k!<%W$N%9%3%"!#(B -@item ticked -$B$=$N%0%k!<%WCf$N0u$NIU$$$?5-;v$N?t!#(B -@item total -$B$=$N%0%k!<%WCf$NA45-;v?t!#$b$C$H@53N$K8@$&$H!"(BMAX-NUMBER - MIN_NUMBER + -1. -@item topic -$B%H%T%C%/%^%$%J!<%b!<%I$r;HMQ$7$F$$$k;~!"$3$NJQ?t$OA^F~$5$l$F$$$k8=:_$N%H(B -$B%T%C%/$KB+G{$5$l$^$9!#(B -@end table - -$B$3$N(B form $B$,I>2A(B (@code{eval}) $B$5$l$k$H$-$O!"%]%$%s%H$OLdBj$N%0%k!<%W$N(B -$B9TF,$K$"$j$^$9!#=>$C$F!"DL>o$N(B gnus $B$N4X?t$N$[$H$s$I$r;H$C$F$=$N%0%k!<%W(B -$B$N>pJs$r.$5$$%l%Y%k(B) $B$NL$FI%0%k!<%W$K0\F0$7(B -$B$^$9(B (@code{gnus-group-prev-unread-group-same-level})$B!#(B - -@item M-p -@kindex M-p (Group) -@findex gnus-group-next-unread-group-same-level -$B.$5$$%l%Y%k(B)$B$NL$FI%0%k!<%W$K0\F0$7$^(B -$B$9(B (@code{gnus-group-next-unread-group-same-level})$B!#(B -@end table - -$B.$5$$%l%Y%k$NL$FI%0%k!<%W$K%8%c%s%W$7$^(B -$B$9(B (@code{gnus-group-best-unread-group})$B!#(B - -@item . -@kindex . (Group) -@findex gnus-group-first-unread-group -$B:G=i$NL$FI5-;v$N$"$k%0%k!<%W$K%8%c%s%W$7$^(B -$B$9(B (@code{gnus-group-first-unread-group})$B!#(B -@end table - -@vindex gnus-group-goto-unread -@code{gnus-group-goto-unread} $B$r(B @code{nil} $B$K$9$k$H!"A4$F$N0\F0%3%^%s%I(B -$B$O!"e5-$N%3%^%s%I$HF1$8F0:n$r$7$^$9$,!"!V%4%?%4%?!W$O:GDc8B$K$7$h$&$H(B -$B$7$^$9(B (@code{gnus-group-quick-select-group})$B!#%9%3%"!&(Bkill $B$N=hM}$O9T$o(B -$B$l$:!"%O%$%i%$%H$b5-;v>C5n$b$7$^$;$s!#$3$l$O!"$"$J$?$,K\Ev$K5^$$$G$$$F!"(B -$B$I$C$+$N$d$?$i$G$C$+$$%0%k!<%W$KF~$i$J$1$l$P$$$1$J$$$H$-$KLr$KN)$D$+$b$7(B -$B$l$^$;$s!#$^$?!"@\F,<-$K(B 0 $B$rM?$($l$P(B ($B$9$J$o$A(B @kbd{0 M-RET})$B!"(Bgnus $B$O(B -$B35N,%P%C%U%!$r:n$m$&$H$5$($7$^$;$s!#$3$l$O35N,%P%C%U%!$r:n$kA0$K%9%l%C%I(B -$BI=<($r@Z$jBX$($?$$$H$-Lr$KN)$A$^$9(B (@pxref{Summary Generation Commands})$B!#(B - -@item M-SPACE -@kindex M-SPACE (Group) -@findex gnus-group-visible-select-group -$B$3$l$O(B @kbd{RET} $B%3%^%s%I$HF1$8F0:n$r$9$k$5$i$K$b$&0l$D$N%3%^%s%I$G$9$,!"(B -$B$3$N%3%^%s%I$O5-;v>C5n$HJ]N15-;v$r1#$9=hM}$r9T$$$^$;(B -$B$s(B (@code{gnus-group-visible-select-group})$B!#(B - -@item M-C-RET -@kindex M-C-RET (Group) -@findex gnus-group-select-group-ephemerally -$B:G8e$K$3$N%3%^%s%I$O!"8=:_$N%0%k!<%W$r0lEY8B$j!"$=$NFbMF$K0l@Z$N=hM}$r$9(B -$B$k$3$H$N$J$$$h$&$KA*Br$7$^(B -$B$9(B (@code{gnus-group-select-group-ephemerally})$B!#%9%l%C%II=<($5$($b9T$o(B -$B$l$^$;$s!#$3$NJ}K!$GA*Br$7$?8e$K$3$N%0%k!<%W$KBP$7$F9T$C$?$3$H$OA4$F!"$=(B -$B$N8e$K1F6A$rM?$($k$3$H$O$"$j$^$;$s!#(B -@end table - -@vindex gnus-large-newsgroup -@code{gnus-large-newsgroup} $BJQ?t$O!"2?$rBg$-$J%0%k!<%W$H9M$($k$Y$-$+!"(B -$B$r(B gnus $B$KM?$($^$9!#$3$l$O=i4|@_Dj$G$O(B 200 $B$G$9!#%0%k!<%W$K(B ($BL$FI$H0uIU(B -$B$-$N(B) $B5-;v$,$3$N?t0J>e$"$l$P!"(Bgnus $B$O$=$N%0%k!<%W$KF~$kA0$KMxMQl9g$O!"$=$N4X?t$OI=Bj$N9T$K%]%$(B -$B%s%H$r0\F0$5$;$k$+!"$$$/$D$+$N5-;v$rA*Br$9$k$+$NN>J}$+!"8el9g$K$O!"9XFI$r;_$a$^$9(B (@code{gnus-group-unsubscribe-group})$B!#(B - -@item S k -@itemx C-k -@kindex S k (Group) -@kindex C-k (Group) -@findex gnus-group-kill-group -@c @icon{gnus-group-kill-group} -$B8=:_$N%0%k!<%W$r(B kill $B$7$^$9(B (@code{gnus-group-kill-group})$B!#(B - -@item S y -@itemx C-y -@kindex S y (Group) -@kindex C-y (Group) -@findex gnus-group-yank-group -$B:G8e$K(B kill $B$7$?%0%k!<%W$r(B yank $B$7$^$9(B (@code{gnus-group-yank-group})$B!#(B - -@item C-x C-t -@kindex C-x C-t (Group) -@findex gnus-group-transpose-groups -$BFs$D$N%0%k!<%W$N=g=x$rCV$-49$($^$9(B (@code{gnus-group-transpose-groups})$B!#(B -$B$3$l$O%[%s%H$O9XFI%3%^%s%I$G$O$"$j$^$;$s$,!"(Bkill $B$H(B yank $B$r2?EY$+B3$1$k(B -$BBe$o$j$K$3$N%3%^%s%I$,;H$($^$9!#(B - -@item S w -@itemx C-w -@kindex S w (Group) -@kindex C-w (Group) -@findex gnus-group-kill-region -$B%j!<%8%g%sFb$NA4$F$N%0%k!<%W$r(B kill $B$7$^(B -$B$9(B (@code{gnus-group-kill-region})$B!#(B - -@item S z -@kindex S z (Group) -@findex gnus-group-kill-all-zombies -$BA4$F$N%>%s%S%0%k!<%W$r(B kill $B$7$^$9(B (@code{gnus-group-kill-all-zombies})$B!#(B - -@item S C-k -@kindex S C-k (Group) -@findex gnus-group-kill-level -$B$"$k%l%Y%k$N%0%k!<%W$rA4$F(B kill $B$7$^$9(B (@code{gnus-group-kill-level})$B!#(B -kill $B$7$?8e!"$3$l$i$N%0%k!<%W$r(B yank $B$GLa$9$3$H$O$G$-$J$$$N$G!"$3$N%3%^(B -$B%s%I$O$$$/$i$+Cm0U$7$F;H$C$F$/$@$5$$!#$3$N%3%^%s%I$,K\Ev$KJXMx$K$J$k$N$O!"(B -@file{.newsrc} $B$KH$7$F$/$/$@$5$$!#(B - -@node Group Data -@section $B%0%k!<%W%G!<%?(B - -@table @kbd -@item c -@kindex c (Group) -@findex gnus-group-catchup-current -@vindex gnus-group-catchup-group-hook -@c @icon{gnus-group-catchup-current} -$B$=$N%0%k!<%WFb$NA4$F$NL50u$N5-;v$r4{FI$K$9(B -$B$k(B (@code{gnus-group-catchup-current})$B!#%0%k!<%W%P%C%U%!$+$i4{FI$K$7$?>l(B -$B9g$O(B @code{gnus-group-catchup-group-hook} $B$,8F$S=P$5$l$^$9!#(B - -@item C -@kindex C (Group) -@findex gnus-group-catchup-current-all -$B$=$N%0%k!<%W$NA45-;v$r!"0uIU$-$N5-;v$b4^$a$F4{FI$K$7$^(B -$B$9(B (@code{gnus-group-catchup-current-all})$B!#(B - -@item M-c -@kindex M-c (Group) -@findex gnus-group-clear-data -$B8=:_$N%0%k!<%W$NA4$F$N%G!<%?$r%/%j%"$7$^$9!=!=%^!<%/$H4{FI5-;v$N%j%9%H$r(B -$B>C$75n$j$^$9(B (@code{gnus-group-clear-data})$B!#(B - -@item M-x gnus-group-clear-data-on-native-groups -@kindex M-x gnus-group-clear-data-on-native-groups -@findex gnus-group-clear-data-on-native-groups -$B$b$7(B @sc{nntp} $B%5!<%P$rJL$N$b$N$K@Z$jBX$($?$H$9$k$H!"A4$F$N%^!<%/$H4{FI(B -$B>pJs$O$b$&Lr$K$ON)$A$^$;$s!#$3$N%3%^%s%I$r;H$C$F4pK\%0%k!<%W$NA4$F$N%G!<(B -$B%?$r%/%j%"$9$k$3$H$,$G$-$^$9!#Cm0U$7$F;H$C$F$M!#(B -@end table - -@node Group Levels -@section $B%0%k!<%W%l%Y%k(B -@cindex group level -@cindex level - -$BA4$F$N%0%k!<%W$O(B @dfn{$B9XFIEY(B} (@dfn{subscribedness}) $B$N%l%Y%k$r;}$A$^$9!#(B -$BNc$($P!"$"$k%0%k!<%W$,%l%Y%k(B 2 $B$@$H$9$l$P!"$=$l$O%l%Y%k(B 5 $B$N%0%k!<%W$h$j(B -$B$b!V$h$j9XFI$7$F$$$k!W$H$$$&$3$H$G$9!#(BGnus $B$KBP$7$F!"$"$k%l%Y%k$+$=$l$h(B -$B$j>.$5$$%l%Y%k$N%0%k!<%W$N$_0lMwI=<($9$k$h$&$KMj$`$3$H$b$G$-$k(B -$B$7(B (@pxref{Listing Groups})$B!"$"$k%l%Y%k$+$=$l$h$j>.$5$$%l%Y%k$N%0%k!<%W(B -$B$N?7Ce5-;v$N$_$r3NG'$9$k$3$H$b$G$-$^$9(B(@pxref{Scanning New Messages})$B!#(B - -$BK:$l$J$$$G(B: $B%0%k!<%W$N%l%Y%k$,Bg$-$$$[$I!"=EMWEY$ODc$/$J$k$H$$$&$3$H!#(B - -@table @kbd -@item S l -@kindex S l (Group) -@findex gnus-group-set-current-level -$B8=:_$N%0%k!<%W$N%l%Y%k$r@_Dj$9$k!#?t;z%W%l%U%#%C%/%9$,M?$($i$l$k$H!"$=$3(B -$B$+$i(B @var{n} $B8D$N%0%k!<%W$N%l%Y%k$,@_Dj$5$l$^$9!#%l%Y%k$rF~NO$9$k$?$a$N(B -$B%W%m%s%W%H$,=P$^$9!#(B -@end table - -@vindex gnus-level-killed -@vindex gnus-level-zombie -@vindex gnus-level-unsubscribed -@vindex gnus-level-subscribed -Gnus $B$O%l%Y%k(B 1 $B$+$i(B @code{gnus-level-subscribed} ($B$3$NCM$r4^$`(B) ($B=i4|CM(B -$B$O(B 5) $B$^$G$N%0%k!<%W$r9XFI!"(B@code{gnus-level-subscribed} ($B$3$NCM$r4^$^$J(B -$B$$(B) $B$+$i(B@code{gnus-level-unsubscribed} ($B$3$NCM$r4^$`(B) ($B=i4|CM$O(B 7) $B$^$G(B -$B$N%0%k!<%W$rHs9XFI!"(B@code{gnus-level-zombie} $B$r%>%s%S(B ($BJb$/;S(B) ($B=i4|CM(B -$B$O(B 8)$B!"(B@code{gnus-level-killed} $B$r(B kill $B$5$l$F$$$k(B ($B40A4$K;`$s$G(B -$B$k(B) ($B=i4|CM$O(B 9) $B$HH=CG$7$^$9!#(BGnus $B$O9XFI$HHs9XFI$N%0%k!<%W$OA4$/F1MM$K(B -$B07$$$^$9$,!"%>%s%S$H(B kill $B%0%k!<%W$O!"$I$N5-;v$rFI$s$@$+!"B8:_$9$k$+$J$I(B -$B$N>pJs$r0l@Z;}$A$^$;$s!#$3$N;`$s$G$k%0%k!<%W$H@8$-$F$k%0%k!<%W$N6hJL$O!"(B -$BJL$K$=$l$,$-$l$$$@$+$i$H$+8-$$$+$i$H$$$&$o$1$G$O$J$/!"=c?h$K8zN(E*$JM}M3(B -$B$N$?$a$G$9!#(B - -$B%a!<%kMQ$N%0%k!<%W$O(B ($B$b$7$"$l$P(B) $BHs>o$K>.$5$$%l%Y%k(B ($BNc$($P(B 1 $B$+(B 2) $B$K(B -$B$7$F$*$/$3$H$r$*4+$a$7$^$9!#(B - -$B%s%S$H(B kill $B%0%k!<%W$O!"%G%#%U%)%k%H$G$O1#$5$l$F$$$kE@$GHs9VFI$N%0%k!<(B -$B%W$K;w$F$$$^$9!#$7$+$7!"(Bgnus $B$,%K%e!<%9%5!<%P!<$KBP$7$F%>%s%S$H(B kill $B%0(B -$B%k!<%W$K4X$9$k>pJs(B ($B5-;v?t!"L$FI5-;v?t(B) $B$NLd$$9g$o$;$r$7$J$$E@$G!"9XFI$*(B -$B$h$SHs9XFI$N%0%k!<%W$H$O0c$C$F$$$^$9!#$U$D$&!"$"$J$?$O6=L#$NL5$$%0%k!<%W(B -$B$r(B @kbd{C-k} $B$G(B kill $B$7$^$9$h$M!#$b$7!"$[$H$s$I$N%0%k!<%W$,(B kill $B$5$l$F(B -$B$$$k$H!"(Bgnus $B$OB.$/$J$j$^$9!#(B - -$B$J$<(B gnus $B$O%>%s%S$H(B kill $B%0%k!<%W$r6hJL$9$k$N$G$7$g$&(B? $B$($($H!"%5!<%P!<(B -$B$K?7$7$$%0%k!<%W$,$G$-$k$H!"(Bgnus $B$O%G%#%U%)%k%H$G$=$l$r%>%s%S$K$7$^$9!#(B -$B$3$l$O!"$"$J$?$,$U$D$&$O?7$7$$%0%k!<%W$KHQ$o$5$l$J$$$3$H$r0UL#$7$^$9$,!"(B -$B$"$J$?$O(B @kbd{A z} $B$G?7$7$$%0%k!<%W$N%j%9%H$rF@$k$3$H$,$G$-$^$9!#$"$J$?(B -$B$O9%$_$N$b$N$r9VFI$7!"MW$i$J$$$b$N$O(B kill $B$9$l$PNI$$$N$G$9!#(B -(@kbd{A k} $B$G(B kill $B$5$l$?%0%k!<%W$N%j%9%H$rI=<($7$^$9!#(B) - -$B$b$7%l%Y%kJQ?t$GM7$S$?$$$N$G$"$l$P!"B?>/Cm0U$r$7$F$^$o$kI,MW$,$"$j$^$9!#(B -$B0lC6$=$l$r@_Dj$7$?$i!"FsEY$H$=$l$K?($i$J$$$G$/$@$5$$!#$5$i$K8@$($P!"<+J,(B -$B$G2?$r$d$C$F$$$k$+$r@53N$KM}2r$7$F$$$J$$8B$j!"0l@Z?($i$J$$$G$/$@$5$$!#(B - -@vindex gnus-level-default-unsubscribed -@vindex gnus-level-default-subscribed -$B?H6a$K4X78$9$kFs$D$NJQ?t$O(B @code{gnus-level-default-subscribed} ($B=i4|CM(B -$B$O(B 3) $B$H(B @code{gnus-level-default-unsubscribed} ($B=i4|CM$O(B 6) $B$G$9!#$3$l(B -$B$i$O?7$7$$%0%k!<%W$,(B ($BHs(B) $B9XFI$5$l$?$H$-$N%l%Y%k$G$9!#$b$A$m$s!"$3$l(B -$B$iFs$D$NJQ?t$NCM$O!"0UL#$N$"$k@5$7$$HO0O$G$J$/$F$O$J$j$^$;$s!#(B - -@vindex gnus-keep-same-level -@code{gnus-keep-same-level} $B$,(B @code{nil} $B0J30$G$"$l$P!"0\F0%3%^%s%I$N$$(B -$B$/$D$+$OF10l(B ($B$"$k$$$O$=$l$h$j>.$5$$(B) $B%l%Y%k$N%0%k!<%W$N$_$N0\F0$K$J$j$^(B -$B$9!#FC$K!"$"$k%0%k!<%W$N:G8e$N5-;v$+$i.$5$$(B) $B%l%Y%k$N%0%k!<%W$K0\F0$7$^$9!#$3$l$O;D$j$N%0(B -$B%k!<%W$rFI$`$h$j@h$K!"$h$j=EMW$J%0%k!<%W$rFI$s$G$*$-$?$$$H$-$K$OJXMx$+$b(B -$B$7$l$^$;$s!#(B - -$B$b$7$3$NCM$,(B @code{best} $B$@$C$?$i!":G$b=EMW$J(B ($B:G$b%l%Y%k$NCM$,>.$5(B -$B$$(B) $B%0%k!<%W$K0\F0$7$^$9!#(B - -@vindex gnus-group-default-list-level -$B=i4|@_Dj$G$O(B @code{gnus-group-default-list-level} $B$HF1$8$+$=$l$h$j>.$5$$(B -$B%l%Y%k$N%0%k!<%W$,!"%0%k!<%W%P%C%U%!$K0lMwI=<($5$l$^$9!#(B - -@vindex gnus-group-list-inactive-groups -@code{gnus-group-list-inactive-groups} $B$,(B @code{nil} $B0J30$G$"$l$P!"L$FI(B -$B$N%0%k!<%W$K0l=o$K%"%/%F%#%V$G$J$$%0%k!<%W$bI=<($7$^$9!#$3$NJQ?t$O=i4|@_(B -$BDj$G$O(B @code{t} $B$G$9!#$b$7$3$l$,(B @code{nil} $B$G$"$l$P!"%"%/%F%#%V$G$J$$%0(B -$B%k!<%W$OI=<($5$l$^$;$s!#(B - -@vindex gnus-group-use-permanent-levels -@code{gnus-group-use-permanent-levels} $B$,(B @code{nil} $B0J30$G$"$l$P!"0lC6(B -$B%l%Y%k$r(B @kbd{g} $B$d(B @kbd{l} $B$N%W%l%U%#%C%/%9$KM?$($k$H!"$=$N8e$NA4$F$N%3(B -$B%^%s%I$K$*$$$F$=$N%l%Y%k$,!V:nMQ$9$k!W%l%Y%k$K$J$j$^$9!#(B - -@vindex gnus-activate-level -Gnus $B$ODL>o!"(B@code{gnus-activate-level} $B$+$=$l$h$j>.$5$$%l%Y%k$N%0%k!<%W(B -$B$N$_$r5/F0$7$^$9(B ($B$D$^$j%5!<%P$KLd$$9g$o$;$r$9$k(B)$B!#9XFI$7$F$$$J$$%0%k!<(B -$B%W$r5/F0$7$?$/$J$1$l$P!"$3$NJQ?t$rNc$($P(B 5 $B$K@_Dj$9$k$H$h$$$+$b$7$l$^$;(B -$B$s!#%G%#%U%)%k%H$O(B 6 $B$G$9!#(B - -@node Group Score -@section $B%0%k!<%W$N%9%3%"(B -@cindex group score -@cindex group rank -@cindex rank - -$BIaDL$O=EMW$J%0%k!<%W$O9b%l%Y%k$K$7$F$*$/$G$7$g$&$1$l$I$b!"$3$NJ}K!$G$O>/!9(B -$B@)8B$,$-$D$$$G$9$h$M!#$R$g$C$H$7$?$i!"%0%k!<%W$r$I$l$/$i$$IQHK$KFI$`$+$K(B -$B$h$C$F%0%k!<%W%P%C%U%!$r%=!<%H$7$?$$$J$"!"$J$s$F;W$o$J$$(B? $BM}$K$+$J$C$F$k(B -$B$G$7$g(B? - -@dfn{$B%0%k!<%W%9%3%"(B} (@dfn{group score}) $B$O$=$N$?$a$N$b$N$G$9!#(BGnus $B$K0J(B -$B2<$G@bL@$5$l$F$$$k5!9=$G!"$=$l$>$l$N%0%k!<%W$KBP$7$F%9%3%"$r;XDj$5$;$k$3(B -$B$H$,$G$-$^$9!#$=$7$F%0%k!<%W%P%C%U%!$r$3$N%9%3%"$r4p$K%=!<%H$9$k$3$H$,$G(B -$B$-$^$9!#$"$k$$$O!"%9%3%"=g$G%=!<%H$7$F$=$N8e%l%Y%k$G%=!<%H$9$k$3$H$b$G$-(B -$B$^$9!#(B($B%l%Y%k$H%9%3%"$r$R$H$^$H$a$K$7$F!"%0%k!<%W(B -$B$N(B @dfn{$B%i%s%/(B} (@dfn{rank}) $B$H8F$S$^$9!#%l%Y%k$,(B 4 $B$G%9%3%"$,(B 1 $B$N%0%k!<(B -$B%W$O!"%l%Y%k$,(B 5 $B$G%9%3%"$,(B 300 $B$N%0%k!<%W$h$j$b9b$$%i%s%/$H$J$j$^$9!#(B -($B%l%Y%k$NJ}$,=EMWEY$,9b$/!"%9%3%"$NJ}$O=EMWEY$,Dc$/$J$j$^$9!#(B)) - -@findex gnus-summary-bubble-group -$BIQHK$KFI$`%0%k!<%W$K!"$a$C$?$KFI$^$J$$%0%k!<%W$h$j$b9b$$%9%3%"$rM?$($?$$(B -$B$H$-$O!"(B@code{gnus-summary-exit-hook} $B%U%C%/(B -$B$K(B @code{gnus-summary-bubble-group} $B4X?t$rDI2C$9$k$3$H$,$G$-$^$9!#$3$l$G(B -$B%P%V%k%=!<%H$Nl9g$G!"$=$l$i$,%0(B -$B%k!<%W%P%C%U%!$KO"B3$7$F$"$k>l9g$K$O!"DL>oDL$jL?Na$KBP$7$F?t;z@\F,<-$rM?(B -$B$($k$@$1$G$9!#$=$&$9$l$P$[$H$s$I$N%0%k!<%WL?Na$O!"$3$l$i$N%0%k!<%W$KBP$7(B -$B$F$"$J$?$NL?Na$K=>$$$^$9!#(B - -$B$7$+$7$=$l$i$N%0%k!<%W$,=gHV$KJB$s$G$$$J$$>l9g$K$*$$$F$b!"$$$/$D$+$N%0%k!<(B -$B%W$KBP$7$FL?Na$rH$7$F$/$@$5$$!#(B - -@findex gnus-group-universal-argument -$B%W%m%;%90u$,IU$1$i$l$F$$$kA4$F$N%0%k!<%W$KBP$7$F2?$+$NL?Na$rR2p$7$^$9!#$3$l(B -$B$i$NL?Na$OA4$F!"?75,$K:n@.$7$?%0%k!<%W$r%]%$%s%H0LCV$KA^F~$7$^(B -$B$9!=!=(B@code{gnus-subscribe-newsgroup-method} $B$O;2>H$5$l$^$;$s!#(B - -@table @kbd -@item G m -@kindex G m (Group) -@findex gnus-group-make-group -@cindex making groups -$B?7$7$$%0%k!<%W$r:n@.$7$^$9(B (@code{gnus-group-make-group})$B!#(BGnus $B$O%W%m%s(B -$B%W%H$rI=<($7$F!"L>A0$HJ}K!$H!">l9g$K$h$C$F$O(B @dfn{address} $B$NF~NO$r5a$a(B -$B$F$-$^$9!#$h$j4JC1$K(B @sc{nntp} $B%0%k!<%W$r9XFI$9$kJ}K!$O!"(B -@pxref{Browse Foreign Server}$B!#(B - -@item G r -@kindex G r (Group) -@findex gnus-group-rename-group -@cindex renaming groups -$B8=:_$N%0%k!<%W$NL>A0$r!"2?$+JL$N$b$N$KJQ99$7$^(B -$B$9(B (@code{gnus-group-rename-group})$B!#$3$l$O$"$ko(B -$B$KCY$$$3$H$bM-$jF@$^$9!#(B - -@item G c -@kindex G c (Group) -@cindex customizing -@findex gnus-group-customize -$B%0%k!<%W%Q%i%a!<%?$r%+%9%?%^%$%:$9$k(B (@code{gnus-group-customize})$B!#(B - -@item G e -@kindex G e (Group) -@findex gnus-group-edit-group-method -@cindex renaming groups -$B8=:_$N%0%k!<%W$NA*BrJ}K!$r=$@5$9$k$?$a$N%P%C%U%!$K0\F0$7$^(B -$B$9(B (@code{gnus-group-edit-group-method})$B!#(B - -@item G p -@kindex G p (Group) -@findex gnus-group-edit-group-parameters -$B%0%k!<%W%Q%i%a!<%?$r=$@5$9$k$?$a$N%P%C%U%!$K0\F0$7$^(B -$B$9(B (@code{gnus-group-edit-group-parameters})$B!#(B - -@item G E -@kindex G E (Group) -@findex gnus-group-edit-group -$B%0%k!<%W>pJs$r=$@5$9$k$?$a$N%P%C%U%!$K0\F0$7$^(B -$B$9(B (@code{gnus-group-edit-group})$B!#(B - -@item G d -@kindex G d (Group) -@findex gnus-group-make-directory-group -@cindex nndir -$B%G%#%l%/%H%j%0%k!<%W$r:n@.$7$^$9(B (@pxref{Directory Groups})$B!#%G%#%l%/%H(B -$B%jL>$r%W%m%s%W%H$GF~NO$7$^$9(B (@code{gnus-group-make-directory-group})$B!#(B - -@item G h -@kindex G h (Group) -@cindex help group -@findex gnus-group-make-help-group - -Gnus $B%X%k%W%0%k!<%W$r:n@.$7$^$9(B (@code{gnus-group-make-help-group})$B!#(B - -@item G a -@kindex G a (Group) -@cindex (ding) archive -@cindex archive group -@findex gnus-group-make-archive-group -@vindex gnus-group-archive-directory -@vindex gnus-group-recent-archive-directory -Gnus $B%"!<%+%$%V%0%k!<%W$r:n@.$7$^(B -$B$9(B (@code{gnus-group-make-archive-group})$B!#=i4|@_Dj$G$O:G$b:G6a$N5-;v$r(B -$B;X$7$F$$$k%0%k!<%W$,:n@.$5$l$^$9(B -$B$,(B (@code{gnus-group-recent-archive-directory})$B!"@\F,0z?t$rM?$($k$HA4$F(B -$B$N5-;v$r4^$`%0%k!<%W$,(B @code{gnus-group-archive-directory} $B$r4p$K:n@.$5(B -$B$l$^$9!#(B - -@item G k -@kindex G k (Group) -@findex gnus-group-make-kiboze-group -@cindex nnkiboze -kiboze $B%0%k!<%W$r:n@.$7$^$9!#%W%m%s%W%H$GL>A0$H!"(Bkiboze $B%0%k!<%W$K!V4^$a(B -$B$?$$!W%0%k!<%W$K9g$&@55,I=8=$H!"%X%C%@!<$K9g$&J8;zNs$NAH$rF~NO$7$^(B -$B$9(B (@code{gnus-group-make-kiboze-group})$B!#(B@xref{Kibozed Groups}. - -@item G D -@kindex G D (Group) -@findex gnus-group-enter-directory -@cindex nneething -$BG$0U$N%G%#%l%/%H%j$r(B @code{nneething} $B%P%C%/%(%s%I%K%e!<%9%0%k!<%W$G$"$k(B -$B$+$N$h$&$KFI$_9~$_$^$9(B (@code{gnus-group-enter-directory})$B!#(B -@xref{Anything Groups}. - -@item G f -@kindex G f (Group) -@findex gnus-group-make-doc-group -@cindex ClariNet Briefs -@cindex nndoc -$B%U%!%$%k$J$I$r$b$H$K%0%k!<%W$r:n@.$7$^(B -$B$9(B (@code{gnus-group-make-doc-group})$B!#$3$N%3%^%s%I$K@\F,<-$rM?$($?>l9g!"(B -$B%U%!%$%kL>$H%U%!%$%k%?%$%W$r%W%m%s%W%H$GF~NO$7$^$9!#8=:_%5%]!<%H$5$l$F$$(B -$B$k%U%!%$%k%?%$%W$O!"(B -@code{babyl}, @code{mbox}, @code{digest}, @code{mmdf}, @code{news}, @code{rnews}, @code{clari-briefs}, @code{rfc934}, @code{rfc822-forward}, @code{nsmail}, @code{forward} $B$G(B -$B$9!#@\F,<-$J$7$G$3$N%3%^%s%I$rl9g$K$O!"(B -@samp{~g alt.sysadmin.recovery shaving} $B$N$h$&$J9gCW$9$kJ8;zNs$rMQ$$$k$3(B -$B$H$K$h$C$F!"8!:wBP>]$rFCDj$N%0%k!<%W$K8BDj$9$k$3$H$,2DG=$G$9!#(B - -@item G DEL -@kindex G DEL (Group) -@findex gnus-group-delete-group -$B$3$N4X?t$O8=:_$N%0%k!<%W$r:o=|$7$^$9(B (@code{gnus-group-delete-group})$B!#(B -$B@\F,<-$,M?$($i$l$k$H!"$3$N4X?t$O$=$N%0%k!<%WFb$NA45-;v$rK\Ev$K:o=|$7!"%0(B -$B%k!<%W<+?H$r$3$N@$$+$i6/@)E*$KKu;&$7$F$7$^$$$^$9!#@\F,<-$O!"$"$J$?$,2?$r(B -$B$d$m$&$H$7$F$$$k$+!"K\Ev$K<+?.$,$"$k$H$-$K$N$_;H$C$F$/$@$5$$!#$^$"!"$3$N(B -$B%3%^%s%I$O(B (@code{nntp} $B%0%k!<%W$N$h$&$J(B) $BFI$_=P$7@lMQ%0%k!<%W$K$O;H$($^(B -$B$;$s$1$I!#(B - -@item G V -@kindex G V (Group) -@findex gnus-group-make-empty-virtual -$B?7$7$$!"?7A/$J!"6u$N(B @code{nnvirtual} $B%0%k!<%W$r:n@.$7$^(B -$B$9(B (@code{gnus-group-make-empty-virtual})$B!#(B@xref{Virtual Groups}. - -@item G v -@kindex G v (Group) -@findex gnus-group-add-to-virtual -$B8=:_$N%0%k!<%W$r(B @code{nnvirtual} $B%0%k!<%W$KDI2C$7$^(B -$B$9(B (@code{gnus-group-add-to-virtual})$B!#$3$l$O%W%m%;%90u(B/$B@\F,0z?t$N=,47$K(B -$B=>$$$^$9!#(B -@end table - -$B$5$^$6$^$JA*BrJ}K!$K4X$9$k$5$i$J$k>pJs$O(B @xref{Select Methods} $B$r;2>H$7(B -$B$F$/$@$5$$!#(B - -@vindex gnus-activate-foreign-newsgroups -$B$b$7(B @code{gnus-activate-foreign-newsgroups} $B$,@5$N?t$G$"$l$P!"(Bgnus $B$O5/(B -$BF0;~$K!"$3$N?t$+$=$l$h$j$b>.$5$$%l%Y%k$N30It%0%k!<%W$rA4$F%A%'%C%/$7$^$9!#(B -$B$3$l$OFC$K0c$C$?(B @sc{nntp} $B%5!<%P$+$i$?$/$5$s$N%0%k!<%W$r9XFI$7$F$$$k>l(B -$B9g$J$I!"$7$P$i$/;~4V$,$+$+$k$+$b$7$l$^$;$s!#(B@pxref{Group Levels} $B$b;2>H(B -$B$7$F2<$5$$!#(B@code{gnus-activate-level} $B$b30It%K%e!<%9%0%k!<%W$N3hF02=$K(B -$B1F6A$r5Z$\$7$^$9!#(B - -@node Group Parameters -@section $B%0%k!<%W%Q%i%a!<%?(B -@cindex group parameters - -$B%0%k!<%W%Q%i%a!<%?$O!"$"$kFCDj$N%0%k!<%W$K8GM-$J>pJs$r3JG<$7$^$9!#0J2<$O(B -$B%0%k!<%W%Q%i%a!<%?%j%9%H$NNc$G$9(B: - -@example -((to-address . "ding@@gnus.org") - (auto-expire . t)) -@end example - -$B$=$l$>$l$NMWAG$O!XE@BP!Y(B(dotted pair)$B!=!=$D$^$jE@(B (dot) $B$NA0$K80!"E@$N8e(B -$B$m$KCM$,$"$k$b$N!"$G9=@.$5$l$^$9!#A4$F$N%Q%i%a!<%?$O$3$N7A<0$ro$N%j%9%H$K$J$j$^$9!#(B - -$B$$$/$D$+$N%Q%i%a!<%?$OBP1~$9$k%+%9%?%^%$%:2DG=$JJQ?t$r;}$C$F$$$^$9!#$=$l(B -$B$i$O@55,I=8=$HCM$NO"A[%j%9%H$G$9!#(B - -$B0J2<$OMxMQ2DG=$J%0%k!<%W%Q%i%a!<%?$G$9(B: - -@table @code -@item to-address -@cindex to-address -$B%U%)%m!<%"%C%W$H%K%e!<%9$X$NEj9F$r$9$k$H$-$K;HMQ$5$l$k%"%I%l%9!#(B - -@example -(to-address . "some@@where.com") -@end example - -$B$3$l$OZ$5$l$k$N$G!";22Ce$K$"$C$?$H$7$^$7$g$&!#$3$l$OK\Ev$N%K%e!<%9%0%k!<%W$G$9$,!"%5!<%P$O%a!<(B -$B%k%K%e!<%9%2!<%H%&%'%$$rDL$7$F5-;v$r@\Ej9F$9$k$3$H$OIT2DG=$G!"Be$o$j$K$=$N%a!<%j%s%0%j%9%H$K%a!<%k$rAw(B -$B?.$7$J$1$l$P$J$j$^$;$s!#(B - -@code{gnus-parameter-to-address-alist} $B$b;2>H$7$F2<$5$$!#(B - -@item to-list -@cindex to-list -$B$=$N%0%k!<%W$G(B @kbd{a} $B$r2!$7$?$H$-$K;HMQ$5$l$k%"%I%l%9!#(B - -@example -(to-list . "some@@where.com") -@end example - -$B$3$l$O%U%)%m!<%"%C%W$r$7$?$H$-$O40A4$KL5;k$5$l$^$9!=!=Nc30$O$=$l$,%K%e!<(B -$B%9%0%k!<%W$rI=$o$7$F$$$k$H$-$O!"(B@kbd{f} $B$r2!$7$?$H$-$K%a!<%k%0%k!<%W$N%k!<(B -$B%k$,E,MQ$5$l$k$H$$$&$3$H$G$9!#(B - -$B$b$7(B @kbd{a} $B%3%^%s%I$r%a!<%k%0%k!<%W$GH$7$F2<$5$$!#(B - -@item visible -@cindex visible -$B%0%k!<%W%Q%i%a!<%?$N%j%9%HCf$K(B @code{(visible . t)} $B$H$$$&MWAG$,$"$l$P!"(B -$B$=$N%0%k!<%W$O%0%k!<%W%P%C%U%!$K$*$$$F!"L$FI5-;v$,$"$k$+$I$&$+$K4X$o$i$:!"(B -$B>o$KI=<($5$l$^$9!#(B - -@item broken-reply-to -@cindex broken-reply-to -@code{(broken-reply-to . t)} $B$H$$$&MWAG$,$"$l$P!"$=$N%0%k!<%W$G(B -$B$O(B @code{Reply-To} $B$OL5;k$5$l$k!"$H$$$&0UL#$G$9!#$3$l$O$"$k(B listserv $B$K(B -$B$h$k%a!<%j%s%0%j%9%H$r9XFI$7$F$$$F!"$=$l$,(B @code{Reply-To} $BMs(B -$B$r(B listserv $B<+?H$KJV$9$h$&$K$D$1$i$l$F$$$k>l9g$KM-8z$G$7$g$&!#$3$l$O$*$+(B -$B$7$J?6$kIq$$$G$9!#$@$+$i$3$l$,MW$k$s$G$9(B! - -@item to-group -@cindex to-group -@code{(to-group . "some.group.name")} $B$H$$$&MWAG$O!"$=$N%0%k!<%W$X$NEj9F(B -$B$OA4$F(B @code{some.group.name} $B$KAw$i$l$k!"$H$$$&0UL#$G$9!#(B - -@item newsgroup -@cindex newsgroup -$B%0%k!<%W%Q%i%a!<%?%j%9%H$K(B @code{(newsgroup . t)} $B$,$"$l$P!"(Bgnus $B$OA4$F(B -$B$N1~Ez$r%K%e!<%95-;v$KBP$9$k1~Ez$G$"$k$+$N$h$&$K07$$$^$9!#$3$l$OC5n$5$l$k$h$&$K0u$rIU$1$i$l$^$9!#B>$NJ}K!$O!"(B -@pxref{Expiring Mail}$B!#(B - -@code{gnus-auto-expirable-newsgroups} $B$b;2>H$7$F2<$5$$!#(B - -@item total-expire -@cindex total-expire -$B%0%k!<%W%Q%i%a!<%?$K(B @code{(total-expire . t)} $B$N$h$&$JMWAG$,$"$l$P!"4{(B -$BFI5-;v$O!";~8B>C5n$N0u$,$D$$$F$$$J$/$H$bA4$F;~8B>C5n=hM}$r;\$5$l$^$9!#Cm(B -$B0U$7$F;HMQ$7$F$/$@$5$$!#L$FI5-;v!"0uIU$-5-;v!"J]N15-;v$O;~8B>C5n$5$l$^$;(B -$B$s!#(B - -@code{gnus-total-expirable-newsgroups} $B$b;2>H$7$F2<$5$$!#(B - -@item expiry-wait -@cindex expiry-wait -@vindex nnmail-expiry-wait-function -$B%0%k!<%W%Q%i%a!<%?$K(B @code{(expiry-wait . 10)} $B$N$h$&$JMWAG$,$"$l$P!"$3(B -$B$NCM$O5-;v$r;~8B>C5n$9$k$H$-(B -$B$K(B @code{nnmail-expiry-wait} $B$H(B @code{nnmail-expiry-wait-function} $B$N@_(B -$BDj$h$j$bM%@h$5$l$^$9!#$3$NCM$O;~8B>C5n$NF|?t(B ($B@0?t$G$"$kI,MW$O$J$$(B) $B$+$b(B -$B$7$/$O(B @code{never} $B$+(B @code{immediate} $B$N%7%s%\%k$r;XDj$G$-$^$9!#(B - -@item score-file -@cindex score file group parameter -@code{(score-file . "file")} $B$N$h$&$JMWAG$O!"(B@file{file} $B$r8=:_$N%0%k!<(B -$B%W$KE,MQ$5$l$k%9%3%"%U%!%$%k$K$7$^$9!#E,MQ$5$l$k%9%3%"EPO?$OA4$F$3$N%U%!(B -$B%$%k$KF~$j$^$9!#(B - -@item adapt-file -@cindex adapt file group parameter -@code{(adapt-file . "file")} $B$N$h$&$JMWAG$O!"(B@file{file} $B$r8=:_$N%0%k!<(B -$B%W$NE,1~%U%!%$%k$K$7$^$9!#A4$F$NE,1~%9%3%"EPO?$O$3$N%U%!%$%k$KF~$j$^$9!#(B - -@item admin-address -@cindex admin-address -$B%a!<%j%s%0%j%9%H$+$iC&2q$9$k$H$-$O!"C&2qDLCN%a!<%k$r$=$N%a!<%j%s%0%j%9%H(B -$B<+?H$KAw?.$7$F$O$$$1$^$;$s!#Be$o$j$K4IM}MQ%"%I%l%9$K%a%C%;!<%8$rAw?.$7$^(B -$B$9!#$3$N%Q%i%a!<%?$K$O$I$3$+JXMx$J4IM}MQ%"%I%l%9$r=q$$$F$*$/$3$H$,$G$-$^(B -$B$9!#(B - -@item display -@cindex display -@code{(display . MODE)} $B$N$h$&$JMWAG$O!"%0%k!<%W$KF~$k$H$-$K$I$N5-;v$rI=(B -$B<($9$k$+$r;XDj$7$^$9!#M-8z$JCM$O!"(B - -@table @code -@item all -$BL$FI!"4{FI5-;v$NN>J}$rA4$FI=<($7$^$9!#(B - -@item default -$B=i4|@_Dj$G$NI=<(5-;v$rI=<($7$^$9!#$3$l$ODL>o$OL$FI5-;v$H0uIU$-5-;v$G$9!#(B - -@item $BG[Ns(B -$B=R8l$rK~B-$9$k$h$&$K5-;v$rI=<($7$^$9!#(B - -$B$$$/$D$+Nc$r5s$2$^$9(B: - -@table @code -@item [read] -$B4{FI$N5-;v$@$1$rI=<($7$^$9!#(B - -@item [not expire] -$B4|8B@Z$l>C5n2DG=$J5-;v0J30$N$9$Y$F$rI=<($7$^$9!#(B - -@item [and (not reply) (not expire)] -$B4|8B@Z$l>C5n2DG=$H$9$G$KJV?.$7$?5-;v0J30$N$9$Y$F$rI=<($7$^$9!#(B -@end table - -$BMxMQ$G$-$k1i;;;R$O(B @code{not}$B!"(B@code{and} $B$*$h$S(B @code{or} $B$G$9!#=R8l(B -$B$O(B @code{read}$B!"(B@code{dormant}$B!"(B@code{expire}$B!"(B@code{reply}$B!"(B -@code{killed}$B!"(B@code{bookmark}$B!"(B@code{score}$B!"(B@code{save}$B!"(B@code{cache}$B!"(B -@code{forward}$B!"(B@code{seen} $B$*$h$S(B @code{recent} $B$r4^$_$^$9!#(B -@end table - -@code{display} $B%Q%i%a!<%?$O!"35N,%P%C%U%!$r;XDj$7$?0lIt$NAH$@$1$K@)8B$9(B -$B$k$h$&$KF/$-$^$9!#@)8B$r%9%?%C%/$+$ipJs$r3JG<$9$k>l=j$rDs6!$7$^$9!#(B - -@ignore -@item charset -@cindex charset -Elements that look like @code{(charset . iso-8859-1)} will make -@code{iso-8859-1} the default charset; that is, the charset that will be -used for all articles that do not specify a charset. - -See also @code{gnus-group-charset-alist}. - -@item ignored-charsets -@cindex ignored-charsets -Elements that look like @code{(ignored-charsets x-unknown iso-8859-1)} -will make @code{iso-8859-1} and @code{x-unknown} ignored; that is, the -default charset will be used for decoding articles. - -See also @code{gnus-group-ignored-charsets-alist}. -@end ignore -@item posting-style -@cindex posting-style -$B$3$N%0%k!<%W$NDI2C$NEj9FMM<0$r$3$3$N$_$KJ]B8$9$k$3$H$,$G$-$^(B -$B$9(B (@pxref{Posting Styles})$B!#=q<0$O(B @code{gnus-posting-style} $BO"A[%j%9%H(B -$B$HF1$8$G$9$,!"$3$3$K$O%0%k!<%WL>$K9gCW$9$k@55,I=8=$O$"$j$^$;$s(B ($BEvA3$G(B -$B$9(B)$B!#$3$N%0%k!<%W$NMM<0$NMWAG$O(B @code{gnus-posting-styles} $B$G8+$D$+$C$?(B -$B$b$N$h$j$bM%@h$5$l$^$9!#(B - -$BNc$($P!"$3$N%0%k!<%W$N$_!"$+$C$3$$$$L>A0$H=pL>$K$7$?$$$J$i!"(B -@code{gnus-posting-styles} $B$r$$$8$i$:$K!"$3$N$h$&$J$b$N$r%0%k!<%W%Q%i%a!<(B -$B%?$KF~$l$k$3$H$,$G$-$^$9(B: - -@example -(posting-style - (name "Funky Name") - (signature "Funky Signature")) -@end example - -@item post-method -@cindex post-method -$B$b$7$3$l$,@_Dj$5$l$F$$$k$H!"%a%C%;!<%8$rAw?.$9$k$?$a$NA*BrJ}K!$H$7(B -$B$F(B @code{gnus-post-method} $B$NBe$o$j$K;H$o$l$^$9!#(B - -@item banner -@cindex banner -@code{(banner . "regex")} $B$N$h$&$J9`L\$O!"5-;v$N$9$Y$F$N>l=j$G@55,I=(B -$B8=(B "regex" $B$K%^%C%A$9$k$b$N$r:o=|$7$^$9!#(B"regex" $B$NBe$o$j$K%7%s%\(B -$B%k(B @code{signature} ($B:G8e$N=pL>$r:o(B -$B=|(B) $B$dO"A[%j%9%H(B @code{gnus-article-banner-alist} $B$N3FMWAG$r;H$&$3$H$b$G(B -$B$-$^$9!#(B - -@item (@var{variable} @var{form}) -$B%0%k!<%W$KF~$k$H$-$K!"$=$N%0%k!<%W%m!<%+%k$NJQ?t$r@_Dj$9$k%0%k!<%W%Q%i%a!<(B -$B%?$r;HMQ$9$k$3$H$,$G$-$^$9!#(B@samp{news.answers} $B$K$*$$$F%9%l%C%II=<($r9T(B -$B$$$?$/$J$$$H$-$O!"$=$N%0%k!<%W$K%0%k!<%W%Q%i%a!<%?(B -$B$K(B @code{(gnus-show-threads nil)} $B$H=q$1$^$9!#(B -@code{gnus-show-threads} $B$O!"$=$N35N,%P%C%U%!$NCf$N%m!<%+%kJQ?t$K$J$j!"(B -form $B$N(B @code{nil} $B$O$=$3$GI>2A$5$l$^$9!#(B - -$B$3$l$O$b$7I,MW$G$"$l$P!"%0%k!<%WKh$N%U%C%/4X?t$H$7$F$b;HMQ$G$-$^$9!#$b$7(B -$B$"$k%0%k!<%W$KF~$C$?$H$-$K%S!<%W2;$rLD$i$7$?$1$l$P!"$=$N%0%k!<%W$N%Q%i%a!<(B -$B%?$K(B @code{(dummy-variable (ding))} $B$_$?$$$J$b$N$r=q$$$F$*$/$3$H$b$G$-$^(B -$B$9!#(B@code{dummy-variable} $B$H$$$&JQ?t$K(B @code{(ding)} $B$NI>2A7k2L$,@_Dj$5(B -$B$l$^$9$,!"$^$"!"C/$b5$$K$7$J$$$G$7$g(B? -@end table - -$B%0%k!<%W%Q%i%a!<%?$N=$@5$K$O(B @kbd{G p} $B$+(B @kbd{G c} $BL?Na$r;H$C$F$/$@$5(B -$B$$(B (@kbd{G p} $B$O(B Lisp $B%Y!<%9$N!"(B@kbd{G c} $B$O(B Custom $B$U$&$N%$%s%?!<%U%'!<(B -$B%9$rDs6!$7$^$9(B)$B!#%H%T%C%/%Q%i%a!<%?$K$D$$$FFI$s$G$_$k$3$H$bLLGr$$$G$7$g(B -$B$&(B (@pxref{Topic Parameters})$B!#(B - -$B%0%k!<%W%Q%i%a!<%?$O(B @code{gnus-parameters} $BJQ?t$r2p:_$7$F@_Dj$9$k$3$H$b(B -$B$G$-$^$9!#$G$b$$$/$D$+$N%Q%i%a!<%?!"Nc$($P(B @code{visible} $B$O8zNO$rH/4x$7(B -$B$^$;$s!#Nc$G$9!#(B - -@example -(setq gnus-parameters - '(("mail\\..*" - (gnus-show-threads nil) - (gnus-use-scoring nil) - (gnus-summary-line-format - "%U%R%z%I%(%[%d:%ub%-23,23f%]%) %s\n") - (gcc-self . t) - (display . all)) - - ("^nnimap:\\(foo.bar\\)$" - (to-group . "\\1")) - - ("mail\\.me" - (gnus-use-scoring t)) - - ("list\\..*" - (total-expire . t) - (broken-reply-to . t)))) -@end example - -$BJ8;zNs$NCM$O!"(B@code{to-group} $B$NNc$,<($9$h$&$K!"@55,I=8=$K$h$kCV$-49$($r(B -$B.$5$$%l%Y%k$N%0(B -$B%k!<%W$N$_$rI=<($7$^$9!#=i4|@_Dj$G$O!"$3$l$O%l%Y%k(B 5 ($B$D$^(B -$B$j(B @code{gnus-group-default-list-level}) $B$+$=$l$h$j>.$5$$%l%Y%k(B ($B$9$J$o(B -$B$A9XFI$7$F$$$k%0%k!<%W$N$_(B) $B$rI=<($7$^$9!#(B - -@item L -@itemx A u -@kindex A u (Group) -@kindex L (Group) -@findex gnus-group-list-all-groups -$BL$FI5-;v$N$"$k$J$7$K4X$o$i$:!"A4$F$N%0%k!<%W$rI=<($7$^(B -$B$9(B (@code{gnus-group-list-all-groups})$B!#?t;z@\F,0z?t$r;HMQ$9$k$H!"$3$N%3(B -$B%^%s%I$O0z?t$N?t$+$=$l$h$j$b>.$5$$%l%Y%k$N%0%k!<%W$N$_$rI=<($7$^$9!#=i4|(B -$B@_Dj$G$O(B 7 $B$+$=$l$h$j$b>.$5$$%l%Y%k$N%0%k!<%W(B ($B$9$J$o$A9XFI!"Hs9XFI$N%0(B -$B%k!<%W$N$_(B) $B$,I=<($5$l$^$9!#(B - -@item A l -@kindex A l (Group) -@findex gnus-group-list-level -$B$"$kFCDj$N%l%Y%k$NL$FI5-;v$N$"$k%0%k!<%W$rI=<($7$^(B -$B$9(B (@code{gnus-group-list-level})$B!#@\F,<-$rM?$($k$H!"L$FI5-;v$N$J$$%0%k!<(B -$B%W$b4^$a$FI=<($7$^$9!#(B - -@item A k -@kindex A k (Group) -@findex gnus-group-list-killed -kill $B$5$l$?%0%k!<%W$rA4$FI=<($7$^$9(B (@code{gnus-group-list-killed})$B!#@\(B -$BF,0z?t$rM?$($k$H!"8=:_9XFI!"Hs9XFI$H$J$C$F$$$J$$A4$F$NMxMQ2DG=$J%0%k!<%W(B -$B$rI=<($7$^$9!#$3$l$O%5!<%P$+$i%"%/%F%#%V%U%!%$%k$rFI$`$3$H$K$J$k$G$7$g$&!#(B - -@item A z -@kindex A z (Group) -@findex gnus-group-list-zombies -$BA4$F$N%>%s%S%0%k!<%W$rI=<($7$^$9(B (@code{gnus-group-list-zombies})$B!#(B - -@item A m -@kindex A m (Group) -@findex gnus-group-list-matching -$B@55,I=8=$K9gCW$9$kL>A0$r;}$D%0%k!<%W$G!"L$FI5-;v$N$"$k9XFI%0%k!<%W$rA4$F(B -$BI=<($7$^$9(B (@code{gnus-group-list-matching})$B!#(B - -@item A M -@kindex A M (Group) -@findex gnus-group-list-all-matching -$B@55,I=8=$K9gCW$9$k%0%k!<%W$rI=<($9(B -$B$k(B (@code{gnus-group-list-all-matching})$B!#(B - -@item A A -@kindex A A (Group) -@findex gnus-group-list-active -$B:#@\B3$7$F$$$k%5!<%P$N%"%/%F%#%V%U%!%$%k$K$"$k%0%k!<%W$r!"K\Ev$KA4ItI=<((B -$B$7$^$9(B (@code{gnus-group-list-active})$B!#$3$l$O$7$P$i$/;~4V$,$+$+$k$3$H$b(B -$BM-$jF@$^$9!#$?$V$s(B @kbd{A M} $B$r/3d$j0z$$$FA0$r;}$D%0%k!<%W$rA4$FI=<($9(B -$B$k(B (@code{gnus-group-apropos})$B!#(B - -@item A d -@kindex A d (Group) -@findex gnus-group-description-apropos -$B@55,I=8=$K9gCW$9$kL>A0$+@bL@J8$r;}$D%0%k!<%W$rA4$FI=<($9(B -$B$k(B (@code{gnus-group-description-apropos})$B!#(B - -@item A c -@kindex A c (Group) -@findex gnus-group-list-cached -$B%-%c%C%7%e5-;v$r;}$D%0%k!<%W$rA4$FI=<($9(B -$B$k(B (@code{gnus-group-list-cached})$B!#(B - -@item A ? -@kindex A ? (Group) -@findex gnus-group-list-dormant -$BJ]N15-;v$r;}$D%0%k!<%W$rA4$FI=<($9$k(B (@code{gnus-group-list-dormant})$B!#(B - -@item A / -@kindex A / (Group) -@findex gnus-group-list-limit -$B8=:_$NA*Br$5$l$?HO0O$K8BDj$7$?%0%k!<%W$rI=<($9(B -$B$k(B (@code{gnus-group-list-limit})$B!#(B - -@item A f -@kindex A f (Group) -@findex gnus-group-list-flush -$B8=:_$NA*Br$5$l$?%0%k!<%W$r=q$-=P$9(B (@code{gnus-group-list-flush})$B!#(B - -@item A p -@kindex A p (Group) -@findex gnus-group-list-plus -$B8=:_$NA*Br$5$l$?%0%k!<%W$r2C$($?%0%k!<%W$rI=<($9(B -$B$k(B (@code{gnus-group-list-plus})$B!#(B -@end table - -@vindex gnus-permanently-visible-groups -@cindex visible group parameter -@code{gnus-permanently-visible-groups} $B@55,I=8=$K9gCW$9$k%0%k!<%W$O!"L$(B -$BFI5-;v$,$"$k$+$J$$$+$K4X$o$i$:>o$KI=<($5$l$^$9!#$"$k$$$O%0%k!<%W%Q%i%a!<(B -$B%?$K$*$$$F(B @code{visible} $BMWAG$rDI2C$9$k$3$H$G$bF1MM$N8z2L$rF@$k$3$H$,$G(B -$B$-$^$9!#(B - -@vindex gnus-list-groups-with-ticked-articles -$B0uIU$-$N5-;v$N$_$r;}$D%0%k!<%W$ODL>o%0%k!<%W%P%C%U%!$KI=<($5$l$^$9!#$b(B -$B$7(B @code{gnus-list-groups-with-ticked-articles} $B$,(B @code{nil} $B$G$"$l$P!"(B -$B$=$N%0%k!<%W$O40A4$K6u$N%0%k!<%W$G$"$k$+$N$h$&$K07$o$l$^$9!#=i4|CM(B -$B$O(B @code{t} $B$G$9!#(B - -@node Sorting Groups -@section $B%0%k!<%W$N%=!<%H(B -@cindex sorting groups - -@kindex C-c C-s (Group) -@findex gnus-group-sort-groups -@vindex gnus-group-sort-function -@kbd{C-c C-s} (@code{gnus-group-sort-groups}) $BL?Na$O!"%0%k!<%W%P%C%U%!(B -$B$r(B @code{gnus-group-sort-function} $BJQ?t$GM?$($i$l$k4X?t$K=>$C$FJB$YBX$((B -$B$^$9!#MxMQ2DG=$JJB$YBX$(4X?t(B (sorting function) $B$K$O0J2<$N$b$N$,$"$j$^(B -$B$9(B: - -@table @code -@item gnus-group-sort-by-alphabet -@findex gnus-group-sort-by-alphabet -$B%0%k!<%WL>$G%"%k%U%!%Y%C%H=g$KJB$YBX$($^$9!#$3$l$,=i4|@_Dj$G$9!#(B - -@item gnus-group-sort-by-real-name -@findex gnus-group-sort-by-real-name -$B%0%k!<%W$rK\Ev$N(B ($BA0$K2?$b$D$$$F$$$J$$(B) $B%0%k!<%WL>$G%"%k%U%!%Y%C%H=g$KJB(B -$B$YJQ$($^$9!#(B - -@item gnus-group-sort-by-level -@findex gnus-group-sort-by-level -$B%0%k!<%W%l%Y%k$GJB$YBX$($^$9!#(B - -@item gnus-group-sort-by-score -@findex gnus-group-sort-by-score -$B%0%k!<%W$N%9%3%"$GJB$YBX$($^$9!#(B@xref{Group Score}. - -@item gnus-group-sort-by-rank -@findex gnus-group-sort-by-rank -$B%0%k!<%W$N%9%3%"$GJB$YBX$(!"$N%"%k%U%!%Y%C%H=g$GJB$YBX$($^$9!#(B -@end table - -@code{gnus-group-sort-function} $B$OJB$YBX$(4X?t$N%j%9%H$G$"$C$F$b9=$$$^$;(B -$B$s!#$3$N>l9g!"$b$C$H$b=EMW$JJB$YBX$($N80$r;}$D4X?t$O:G8e$G$J$/$F$O$J$j$^(B -$B$;$s!#(B - -$B$"$k@\JB$YBX$($kL?Na$b$$$/$D$+$"$j$^$9!#(B - -@table @kbd -@item G S a -@kindex G S a (Group) -@findex gnus-group-sort-groups-by-alphabet -$B%0%k!<%W%P%C%U%!$r%0%k!<%WL>$N%"%k%U%!%Y%C%H=g$GJB$YBX$($^(B -$B$9(B (@code{gnus-group-sort-groups-by-alphabet})$B!#(B - -@item G S u -@kindex G S u (Group) -@findex gnus-group-sort-groups-by-unread -$B%0%k!<%W%P%C%U%!$rL$FI5-;v$N?t$GJB$YBX$($^(B -$B$9(B (@code{gnus-group-sort-groups-by-unread})$B!#(B - -@item G S l -@kindex G S l (Group) -@findex gnus-group-sort-groups-by-level -$B%0%k!<%W%P%C%U%!$r%0%k!<%W%l%Y%k$GJB$YBX$($^(B -$B$9(B (@code{gnus-group-sort-groups-by-level})$B!#(B - -@item G S v -@kindex G S v (Group) -@findex gnus-group-sort-groups-by-score -$B%0%k!<%W%P%C%U%!$r%0%k!<%W$N%9%3%"$GJB$YBX$($^(B -$B$9(B (@code{gnus-group-sort-groups-by-score})$B!#(B@xref{Group Score}. - -@item G S r -@kindex G S r (Group) -@findex gnus-group-sort-groups-by-rank -$B%0%k!<%W%P%C%U%!$r%0%k!<%W$N%i%s%/$GJB$YBX$($^(B -$B$9(B (@code{gnus-group-sort-groups-by-rank})$B!#(B@xref{Group Score}. - -@item G S m -@kindex G S m (Group) -@findex gnus-group-sort-groups-by-method -$B%0%k!<%W%P%C%U%!$r%P%C%/%(%s%I$NL>A0$G%"%k%U%!%Y%C%H=g$KJB$YBX$($^(B -$B$9(B (@code{gnus-group-sort-groups-by-method})$B!#(B -@end table - -$B0J2<$NA4$F$NL?Na$O%W%m%;%9(B/$B@\F,<-$N=,47$K=>$$$^(B -$B$9(B (@pxref{Process/Prefix})$B!#(B - -$B%7%s%\%k@\F,<-(B (@pxref{Symbolic Prefixes}) $B$,M?$($i$l$?$H$-$O!"$3$l$iA4(B -$B$F$NL?Na$O5U=g$GJB$S49$($^$9!#(B - -$B$^$?!"%0%k!<%W$N0lIt$rJB$YBX$($k$3$H$b$G$-$^$9!#(B - -@table @kbd -@item G P a -@kindex G P a (Group) -@findex gnus-group-sort-selected-groups-by-alphabet -$B%0%k!<%W$r!"%0%k!<%WL>$N%"%k%U%!%Y%C%H=g$GJB$YBX$($^(B -$B$9(B (@code{gnus-group-sort-selected-groups-by-alphabet})$B!#(B - -@item G P u -@kindex G P u (Group) -@findex gnus-group-sort-selected-groups-by-unread -$B%0%k!<%W$r!"L$FI5-;v$N?t$GJB$YBX$($^(B -$B$9(B (@code{gnus-group-sort-selected-groups-by-unread})$B!#(B - -@item G P l -@kindex G P l (Group) -@findex gnus-group-sort-selected-groups-by-level -$B%0%k!<%W$r!"%0%k!<%W%l%Y%k$GJB$YBX$($^(B -$B$9(B (@code{gnus-group-sort-selected-groups-by-level})$B!#(B - -@item G P v -@kindex G P v (Group) -@findex gnus-group-sort-selected-groups-by-score -$B%0%k!<%W$r!"%0%k!<%W$N%9%3%"$GJB$YBX$($^(B -$B$9(B (@code{gnus-group-sort-selected-groups-by-score})$B!#(B -@xref{Group Score}. - -@item G P r -@kindex G P r (Group) -@findex gnus-group-sort-selected-groups-by-rank -$B%0%k!<%W$r!"%0%k!<%W$N%i%s%/$GJB$YBX$($^(B -$B$9(B (@code{gnus-group-sort-selected-groups-by-rank})$B!#(B@xref{Group Score}. - -@item G P m -@kindex G P m (Group) -@findex gnus-group-sort-selected-groups-by-method -$B%0%k!<%W$r!"%P%C%/%(%s%I$NL>A0$G%"%k%U%!%Y%C%H=g$KJB$YBX$($^(B -$B$9(B (@code{gnus-group-sort-selected-groups-by-method})$B!#(B -@end table - -$B:G8e$K!"(B@kbd{C-k} $B$H(B @kbd{C-y} $B$r;H$C$F!"%s%S$H$7$F(B -$B9XFI$7$^$9!#(B - -@item C-c C-x -@kindex C-c C-x (Group) -@findex gnus-group-expire-articles -$B8=:_$N%0%k!<%W$N%(%/%9%Q%$%"5-;v$KBP$7$F(B ($B$b$7$"$l$P(B) $BA4$F%(%/%9%Q%$%"=h(B -$BM}$r9T$$$^$9(B (@code{gnus-group-expire-articles})$B!#$3$l$O!"$=$N%0%k!<%W$K(B -$B$7$P$i$/B8:_$7$F$$$?4|8B@Z$l:o=|2DG=$J$9$Y$F$N5-;v$r>C5n$9$k$H$$$&$3$H$G(B -$B$9!#(B(@pxref{Expiring Mail})$B!#(B - -@item C-c M-C-x -@kindex C-c M-C-x (Group) -@findex gnus-group-expire-all-groups -$BA4$F$N%0%k!<%W$NA4$F$N4|8B@Z$l:o=|2DG=$J5-;v$KBP$7$F!"%(%/%9%Q%$%"=hM}$r(B -$B9T$$$^$9!#(B(@code{gnus-group-expire-all-groups})$B!#(B -@end table - -@node Browse Foreign Server -@section $B30It%5!<%P$N1\Mw(B -@cindex foreign servers -@cindex browsing servers - -@table @kbd -@item B -@kindex B (Group) -@findex gnus-group-browse-foreign-server -$BA*BrJ}K!$H%5!<%PL>$rJ9$+$l$^$9!#(BGnus $B$O$3$N%5!<%P$K@\B3$7!"$=$3$K$"$k(B -$B%0%k!<%W$r1\Mw$7$h$&$H$7$^$9(B (@code{gnus-group-browse-foreign-server})$B!#(B -@end table - -@findex gnus-browse-mode -$BMxMQ2DG=$J%0%k!<%W$N%j%9%H$r;}$C$??7$7$$%P%C%U%!$,8=$l$^$9!#$3$N%P%C%U%!(B -$B$O(B @code{gnus-browse-mode} $B$r;HMQ$7$^$9!#$3$N%P%C%U%!$ODL>o$N%0%k!<%W%P%C(B -$B%U%!$K$A$g$C$H(B ($B$H$$$&$+!"$H$C$F$b(B) $B;w$F$$$^$9!#(B - -$B0J2<$,1\Mw%b!<%I(B (browse mode) $B$G;HMQ$G$-$k%-!l9g$O9XFI$9$k$3$H$K$J$k$N$@$1$l(B -$B$I(B (@code{gnus-browse-unsubscribe-current-group})$B!#(B - -@item l -@itemx q -@kindex q (Browse) -@kindex l (Browse) -@findex gnus-browse-exit -$B1\Mw%b!<%I(B (browse mode) $B$r=*N;$7$^$9(B (@code{gnus-browse-exit})$B!#(B - -@item ? -@kindex ? (Browse) -@findex gnus-browse-describe-briefly -$B1\Mw%b!<%I(B (browse mode) $B$r4JC1$K@bL@$7$^$9(B ($B$^$"!"Bg$7$F@bL@$9$k$3$H$b(B -$B$J$$$s$@$1$I$5(B) (@code{gnus-browse-describe-briefly})$B!#(B -@end table - -@node Exiting gnus -@section Gnus $B$N=*N;(B -@cindex exiting gnus - -$B$=$&!"(Bgnus $B$O:G8e(B ($B%5%$%3!<(B) $B$G$9(B ($BLuCm(B: $B$/!"6l$7$$!#(B -$B86J8$O(B ``Yes, gnus is ex(c)iting.'')$B!#(B - -@table @kbd -@item z -@kindex z (Group) -@findex gnus-group-suspend -Gnus $B$rCfCG$7$^$9(B (@code{gnus-group-suspend})$B!#$3$l$O(B gnus $B$rC$9$@$1$G$9!#KM$O$3$l$N(B -$B$&$l$7$5$,$h$/$o$+$s$J$$$s$@$1$I!"C/$+J,$+$k?M$$$k(B? - -@item q -@kindex q (Group) -@findex gnus-group-exit -@c @icon{gnus-group-exit} -Gnus $B$r=*N;$7$^$9(B(@code{gnus-group-exit})$B!#(B - -@item Q -@kindex Q (Group) -@findex gnus-group-quit -@file{.newsrc} $B%U%!%$%k$r%;!<%V$;$:$K(B gnus $B$r=*N;$7$^(B -$B$9(B (@code{gnus-group-quit})$B!#%I%j%V%k%U%!%$%k$O%;!<%V$5$l$^$9$1(B -$B$I(B (@pxref{Auto Save})$B!#(B -@end table - -@vindex gnus-exit-gnus-hook -@vindex gnus-suspend-gnus-hook -Gnus $B$rCfCG$9$k$H$-$O(B @code{gnus-suspend-gnus-hook} $B$,8F$S=P$5$l$^$9!#(B -Gnus$B$r=*N;$9$k$H$-$O(B @code{gnus-exit-gnus-hook} $B$,8F$S=P$5$l!"$5$i(B -$B$K(B gnus $B$r=*N;$9$k$H$-$N:G8e$H$7(B -$B$F(B @code{gnus-after-exiting-gnus-hook} $B$,8F$S=P$5$l$^$9!#(B - -@findex gnus-unload -@cindex unloading -$B$b$7(B gnus $B$H$=$l$K4XO"$9$k$b$N$r40A4$K=hJ,$7$?$$$N$G$"$l$P!"(B -@code{gnus-unload} $B%3%^%s%I$,;H$($^$9!#$3$N%3%^%s%I$O!"%a%?JQ?t$r%+%9%?(B -$B%^%$%:$7$h$&$H$7$F$$$k$H$-$K$bJXMx$G$9!#(B - -Note: - -@quotation -$B%_%9(B Lisa Cannifax $B$O1Q8l$N/G/$,H`=w$N%W%i%9%F%#%C(B -$B%/$N0X;R$NGX1[$7$K!"1tI.$G7+$jJV$7@~$rIA$/$N$K$D$i$l$F!"B-$,$7$S$l$F=E$/(B -$B$J$j!"0U<1$,[/[0$H$7$F$-$^$7$?!#(B -@end quotation - -@node Group Topics -@section Group Topics -@cindex topics - -$B$b$7$"$J$?$,$?!<$/$5$s$N%0%k!<%W$rFI$s$G$$$k$N$G$"$l$P!"%0%k!<%W$r%H%T%C(B -$B%/Kh$K3,AXJ,$1$G$-$k$HJXMx$G$7$g$&!#(BEmacs $B$N%0%k!<%W$r$3$C$A$X!"%;%C%/%9(B -$B$N%0%k!<%W$r$"$C$A$X!"$G!";D$j$r(B ($B$((B? $B%0%k!<%W$,Fs(B $B$D$/$i$$$7$+$J$$(B -$B$N(B?) $B$N%;%/%7%g%s$KF~$l$^$7$g$&!#$"$k$$(B -$B$O(B Emacs $B%;%C%/%9$N%0%k!<%W$r(B Emacs $B%0%k!<%W!"%;%C%/%9%0%k!<%W$N$I$A$i$+(B -$B$NI{%H%T%C%/$H$9$k$3$H$5$($b$G$-$^$9!=!=$"$k$$$ON>J}$K(B! $B$9$s$4$$$G$7$g$&(B! - -@iftex -@iflatex -\gnusfigure{Group Topics}{400}{ -\put(75,50){\epsfig{figure=tmp/group-topic.ps,height=9cm}} -} -@end iflatex -@end iftex - -$B$3$l$,Nc$G$9(B: - -@example -Gnus - Emacs -- $B$3$$$D$O$9$2!<$<(B! - 3: comp.emacs - 2: alt.religion.emacs - $B$($C$A$J(B Emacs - 452: alt.sex.emacs - 0: comp.talk.emacs.recovery - $B$=$NB>(B - 8: comp.binaries.fractals - 13: comp.sources.unix -@end example - -@findex gnus-topic-mode -@kindex t (Group) -$B$3$N(B@emph{$BAG@2$i$7$$(B}$B5!G=$r;H$&$K$O!"(B@code{gnus-topic} $B%^%$%J!<%b!<%I(B -$B$r(B ($B2?$H(B!) $BC1$K%9%$%C%A%*%s$9$k$@$1!=!=%0%k!<%W%P%C%U%!$G!"(B@kbd{t} $B$r2!(B -$B$7$F$/$@$5$$(B ($B$3$l$O%H%0%k%3%^%s%I$G$9(B)$B!#(B - -$B$5$"$d$C$F$_$h$&!#$H$K$+$/;n$7$F$_$F!#7/$,La$C$F$/$k$^$G!"KM$O$3$3$GBT$C(B -$B$F$k$+$i$5!#%i%i!"%?%i%i%s!D$s!"$$$$6J$@$M!"$3$l!D%i!"%i!"%i!D$((B? $BLa$C$F(B -$B$-$?(B? $B$h$7!"$8$cv$^$l$^$9!#$3$l!"$H$C$F$b%9%F%-$@(B -$B$H;W$&$s$@$1$I!#(B - -@vindex gnus-topic-line-format -$B%H%T%C%/9T$O!"(B@code{gnus-topic-line-format} $BJQ?t$NCM$K=>$C$F:n@.$5$l$^(B -$B$9(B (@pxref{Formatting Variables})$B!#M-8z$JMWAG$O!"(B - -@table @samp -@item i -$B;z2<$2!#(B -@item n -$B%H%T%C%/L>!#(B -@item v -$B8+$($k$+$I$&$+!#(B -@item l -$B%l%Y%k!#(B -@item g -$B%H%T%C%/Cf$N%0%k!<%W$N?t!#(B -@item a -$B%H%T%C%/Cf$NL$FI5-;v$N?t!#(B -@item A -$B%H%T%C%/$HA4$F$NI{%H%T%C%/$NL$FI5-;v$N?t!#(B -@end table - -@vindex gnus-topic-indent-level -$B3FI{%H%T%C%/(B ($B$HI{%H%T%C%/Fb$N%0%k!<%W(B) $B$O!"%H%T%C%/%l%Y%k?t(B -$B$N(B @code{gnus-topic-indent-level} $BG\$N6uGrJ,$N;z2<$2$,9T$o$l$^$9!#=i4|CM(B -$B$O(B 2 $B$G$9!#(B - -@vindex gnus-topic-mode-hook -@code{gnus-topic-mode-hook} $B$O%H%T%C%/%^%$%J!<%b!<%I%P%C%U%!$G8F$S=P$5$l(B -$B$^$9!#(B - -@vindex gnus-topic-display-empty-topics -@code{gnus-topic-display-empty-topics} $B$O%H%T%C%/$NCf$KL$FI5-;v$,L5$$>l(B -$B9g$G$b$=$N%H%T%C%/$rI=<($9$k$h$&$K$7$^$9!#=i4|CM$O(B @code{t} $B$G$9!#(B - -@node Topic Commands -@subsection $B%H%T%C%/L?Na(B -@cindex topic commands - -$B%H%T%C%/%^%$%J!<%b!<%I$,M-8z$G$"$k$H$-$O!"(B@kbd{T} $B%5%V%^%C%W$,?7$7$/MxMQ(B -$B$G$-$k$h$&$K$J$j$^$9!#$5$i$KI8=`%-!<$NCf$G$b!"Dj5A$,$A$g$C$HJQ$o$k$b$N$,(B -$B>/$7$"$j$^$9!#(B - -@table @kbd -@item T n -@kindex T n (Topic) -@findex gnus-topic-create-topic -$B?7$7$$%H%T%C%/$NL>A0$r%W%m%s%W%HF~NO$7!"$=$l$r:n@.$7$^(B -$B$9(B (@code{gnus-topic-create-topic})$B!#(B - -@item T m -@kindex T m (Topic) -@findex gnus-topic-move-group -$B8=:_$N%0%k!<%W$r!"$I$3$+B>$N%H%T%C%/$K0\F0$5$;$^(B -$B$9(B (@code{gnus-topic-move-group})$B!#$3$N%3%^%s%I$O%W%m%;%9%^!<%/!&%W%l%U%#%C(B -$B%/%9%k!<%k$K=>$$$^$9(B (@pxref{Process/Prefix})$B!#(B - -@item T j -@kindex T j (Topic) -@findex gnus-topic-jump-to-topic -$B%H%T%C%/$K%8%c%s%W$7$^$9(B (@code{gnus-topic-jump-to-topic})$B!#(B - -@item T c -@kindex T c (Topic) -@findex gnus-topic-copy-group -$B8=:_$N%0%k!<%W$r!"$I$3$+B>$N%H%T%C%/$K%3%T!<$7$^(B -$B$9(B (@code{gnus-topic-copy-group})$B!#$3$N%3%^%s%I$O%W%m%;%9%^!<%/!&%W%l%U%#%C(B -$B%/%9%k!<%k$K=>$$$^$9(B (@pxref{Process/Prefix})$B!#(B - -@item T h -@kindex T h (Topic) -@findex gnus-topic-hide-topic -$B8=:_$N%H%T%C%/$r1#$7$^$9!#$b$7%W%l%U%#%C%/%9$,M?$($i$l$?$J$i!"$=$N%H%T%C(B -$B%/$r1J5W$K1#$7$^$9!#(B - -@item T s -@kindex T s (Topic) -@findex gnus-topic-show-topic -$B8=:_$N%H%T%C%/$rI=<($7$^$9!#$b$7%W%l%U%#%C%/%9$,M?$($i$l$?$J$i!"$=$N%H%T%C(B -$B%/$r1J5W$KI=<($7$^$9!#(B - -@item T D -@kindex T D (Topic) -@findex gnus-topic-remove-group -$B%0%k!<%W$r8=:_$N%H%T%C%/$+$i:o=|$7$^$9(B (@code{gnus-topic-remove-group})$B!#(B -$B$3$NL?Na$Ol9g$O!"(Bgnus $B$O$"$J$?$,$$$^$9(B (@pxref{Process/Prefix})$B!#(B - -@item T M -@kindex T M (Topic) -@findex gnus-topic-move-matching -$B@55,I=8=$K%^%C%A$9$kA4$F$N%0%k!<%W$r!"$"$k%H%T%C%/$K0\F0$5$;$^(B -$B$9(B (@code{gnus-topic-move-matching})$B!#(B - -@item T C -@kindex T C (Topic) -@findex gnus-topic-copy-matching -$B@55,I=8=$K%^%C%A$9$kA4$F$N%0%k!<%W$r!"$"$k%H%T%C%/$K%3%T!<$7$^(B -$B$9(B (@code{gnus-topic-copy-matching})$B!#(B - -@item T h -@kindex T h (Topic) -@findex gnus-topic-toggle-display-empty-topics -$B6u$N%H%T%C%/$NI=<(!&HsI=<($r@Z$jBX$($^(B -$B$9(B (@code{gnus-topic-toggle-display-empty-topics})$B!#(B - -@item T # -@kindex T # (Topic) -@findex gnus-topic-mark-topic -$B8=:_$N%H%T%C%/$K$"$k%0%k!<%WA4$F$K%W%m%;%9%^!<%/$r$D$1$^(B -$B$9(B (@code{gnus-topic-mark-topic})$B!#(B - -@item T M-# -@kindex T M-# (Topic) -@findex gnus-topic-unmark-topic -$B8=:_$N%H%T%C%/$K$"$kA4$F$N%0%k!<%W$+$i%W%m%;%9%^!<%/$r>C$7$^(B -$B$9(B (@code{gnus-topic-unmark-topic})$B!#(B - -@item T TAB -@itemx TAB -@kindex T TAB (Topic) -@kindex TAB (Topic) -@findex gnus-topic-indent -$B8=:_$N%H%T%C%/$N(B ``$B;z2<$2(B'' $B$r9T$$!"$=$NA0$N%H%T%C%/$NI{%H%T%C%/$K$7$^(B -$B$9(B (@code{gnus-topic-indent})$B!#@\F,0z?t$rM?$($k$H!"H?BP$K$=$N%H%T%C%/$N(B -$B;z2<$2$rLa$7$^$9!#(B - -@item M-TAB -@kindex M-TAB (Topic) -@findex gnus-topic-unindent -$B8=:_$N%H%T%C%/$N(B ``$B;z2<$22sI|(B'' (un-indent) $B$r9T$$!"$=$l$,8=:_$N?F$N?F$N(B -$BI{%H%T%C%/$K$J$k$h$&$K$7$^$9(B (@code{gnus-topic-unindent})$B!#(B - -@item RET -@kindex RET (Topic) -@findex gnus-topic-select-group -@itemx SPACE -$B%0%k!<%W$rA*Br$9$k$+!"$"$k$$$O%H%T%C%/$r@^$j$?$?$_$^(B -$B$9(B (@code{gnus-topic-select-group})$B!#%0%k!<%W$N>e$G$3$N%3%^%s%I$roDL$j$=$N%0%k!<%W$KF~$j$^$9!#%H%T%C%/9T$N>e$G9T$&$H!"$=$N%H%T%C(B -$B%/$O(B ($B4{$KI=<($5$l$F$$$k$H$-$O(B) $B@^$j$?$?$^$l$k$+!"(B($B4{$K@^$j$?$?$^$l$F$$(B -$B$k$H$-$O(B) $BE83+$5$l$^$9!#$D$^$j%H%T%C%/$KBP$7$F$O$3$l$O%H%0%k%3%^%s%I$G$9!#(B -$B$5$i$K!"?t;z%W%l%U%#%C%/%9$rM?$($k$H!"$=$N%l%Y%k(B ($B$H$=$l$h$j$b>.$5$$%l%Y(B -$B%k(B) $B$N%0%k!<%W$,I=<($5$l$^$9!#(B - -@item C-c C-x -@kindex C-c C-x (Topic) -@findex gnus-topic-expire-articles -($B$b$7$"$l$P(B) $B8=:_$N%0%k!<%W$+%H%T%C%/$+$NA4$F$N;~8B>C5n2DG=5-;v$r;~8B>C(B -$B5n$7$^$9(B (@code{gnus-topic-expire-articles})$B!#(B(@pxref{Expiring Mail})$B!#(B - -@item C-k -@kindex C-k (Topic) -@findex gnus-topic-kill-group -$B%0%k!<%W$"$k$$$O%H%T%C%/$r(B kill $B$7$^$9(B (@code{gnus-topic-kill-group})$B!#(B -$B%H%T%C%/Fb$K$"$C$?%0%k!<%W$bA4$F!"%H%T%C%/$H0l=o$K:o=|$5$l$^$9!#(B - -@item C-y -@kindex C-y (Topic) -@findex gnus-topic-yank-group -$BD>A0$N(B kill $B$5$l$?%0%k!<%W$"$k$$$O%H%T%C%/$r(B yank $B$7$^(B -$B$9(B (@code{gnus-topic-yank-group})$B!#A4$F$N%H%T%C%/$O!"A4$F$N%0%k!<%W$NA0(B -$B$K(B yank $B$5$l$k$3$H$K5$$r$D$1$F$/$@$5$$!#(B - -@item T r -@kindex T r (Topic) -@findex gnus-topic-rename -$B%H%T%C%/$NL>A0$rJQ99$9$k(B (@code{gnus-topic-rename})$B!#(B - -@item T DEL -@kindex T DEL (Topic) -@findex gnus-topic-delete -$B6u$N%H%T%C%/$r:o=|$9$k(B (@code{gnus-topic-delete})$B!#(B - -@item A T -@kindex A T (Topic) -@findex gnus-topic-list-active -Gnus $B$,CN$C$F$$$k%H%T%C%/2=$5$l$?%0%k!<%W$rA4$FI=<($7$^(B -$B$9(B (@code{gnus-topic-list-active})$B!#(B - -@item G p -@kindex G p (Topic) -@findex gnus-topic-edit-parameters -@cindex group parameters -@cindex topic parameters -@cindex parameters -$B%H%T%C%/%Q%i%a!<%?$r=$@5$7$^$9(B (@code{gnus-topic-edit-parameters})$B!#(B -@xref{Topic Parameters}. -@end table - -@node Topic Sorting -@subsection $B%H%T%C%/$NJB$YBX$((B -@cindex topic sorting - -$B0J2<$K<($9L?Na$G!"3F%H%T%C%/Kh$KJL!9$K%0%k!<%W$rJB$YBX$($k$3$H$,$G$-$^$9(B: - -@table @kbd -@item T S a -@kindex T S a (Topic) -@findex gnus-topic-sort-groups-by-alphabet -$B8=:_$N%H%T%C%/$r%0%k!<%WL>$N%"%k%U%!%Y%C%H=g$KJB$YBX$($^(B -$B$9(B (@code{gnus-topic-sort-groups-by-alphabet})$B!#(B - -@item T S u -@kindex T S u (Topic) -@findex gnus-topic-sort-groups-by-unread -$B8=:_$N%H%T%C%/$rL$FI5-;v$N?t$GJB$YBX$($^(B -$B$9(B (@code{gnus-topic-sort-groups-by-unread})$B!#(B - -@item T S l -@kindex T S l (Topic) -@findex gnus-topic-sort-groups-by-level -$B8=:_$N%H%T%C%/$r%0%k!<%W$N%l%Y%k$GJB$YBX$($^(B -$B$9(B (@code{gnus-topic-sort-groups-by-level})$B!#(B - -@item T S v -@kindex T S v (Topic) -@findex gnus-topic-sort-groups-by-score -$B8=:_$N%H%T%C%/$r%0%k!<%W$N%9%3%"$GJB$YBX$($^(B -$B$9(B (@code{gnus-topic-sort-groups-by-score})$B!#(B@xref{Group Score}. - -@item T S r -@kindex T S r (Topic) -@findex gnus-topic-sort-groups-by-rank -$B8=:_$N%H%T%C%/$r%0%k!<%W$N%i%s%/$GJB$YBX$($^(B -$B$9(B (@code{gnus-topic-sort-groups-by-rank})$B!#(B@xref{Group Score}. - -@item T S m -@kindex T S m (Topic) -@findex gnus-topic-sort-groups-by-method -$B8=:_$N%H%T%C%/$r%P%C%/%(%s%I$NL>A0$G%"%k%U%!%Y%C%H=g$KJB$YBX$($^(B -$B$9(B (@code{gnus-topic-sort-groups-by-method})$B!#(B -@end table - -$B%0%k!<%W$N%=!<%H$K$D$$$F$N$5$i$J$k>pJs$O(B @xref{Sorting Groups} $B$r;2>H$7(B -$B$F$/$@$5$$!#(B - -@node Topic Topology -@subsection $B%H%T%C%/$N0LAj9=B$(B -@cindex topic topology -@cindex topology - -$B$=$l$G$O!"%0%k!<%W%P%C%U%!$NNc$r8+$F$$$-$^$7$g$&!#(B - -@example -Gnus - Emacs -- $B$3$$$D$O$9$2!<$<(B! - 3: comp.emacs - 2: alt.religion.emacs - $B$($C$A$J(B Emacs - 452: alt.sex.emacs - 0: comp.talk.emacs.recovery - $B$=$NB>(B - 8: comp.binaries.fractals - 13: comp.sources.unix -@end example - -$B$D$^$j!"$3$3$G$O0l$D$N%H%C%W%l%Y%k$N%H%T%C%/(B (@samp{Gnus}) $B$,$"$j!"$=$N(B -$B2<$KFs$D$N%H%T%C%/$,$"$j!"$=$N$&$A$N0lJ}$NI{%H%T%C%/Cf$K0l$DI{%H%T%C%/$,(B -$B$"$j$^$9(B ($B%H%C%W%l%Y%k%H%T%C%/$O>o$K0l$D$7$+$"$j$^$;$s(B)$B!#$3$N9=B$$O!"0J(B -$B2<$N$h$&$KI=8=$G$-$^$9(B: - -@lisp -(("Gnus" visible) - (("Emacs -- $B$3$$$D$O$9$2!<$<(B!" visible) - (("$B$($C$A$J(B Emacs" visible))) - (("$B$=$NB>(B" visible))) -@end lisp - -@vindex gnus-topic-topology -$B$3$l$Oe5-$NI=<($r9T$&$?$a$N!"JQ?t(B @code{gnus-topic-topology} $B$NCM(B -$B$=$N$b$N$J$N$G$9!#$3$NJQ?t$O(B @file{.newsrc.eld} $B%U%!%$%k$KJ]B8$5$l!"$N%9%?!<%H%"%C(B -$B%W%U%!%$%k$N@_Dj$K$OA4$/1F6A$rM?$($^$;$s!#(B - -$B$3$N9=B$$O!"$I$N%H%T%C%/$,$I$N%H%T%C%/$NI{%H%T%C%/$G$"$k$+$H!"$I$N%H%T%C(B -$B%/$,I=<($5$l$F$$$k$+$r<($7$F$$$^$9!#8=:_$OFs$D$N@_Dj(B -$BCM!=!=(B@code{visible} $B$H(B @code{invisible} $B$,5v$5$l$F$$$^$9!#(B - -@node Topic Parameters -@subsection $B%H%T%C%/%Q%i%a!<%?(B -@cindex topic parameters - -$B%H%T%C%/Fb$NA4$F$N%0%k!<%W$O%0%k!<%W%Q%i%a!<%?$r!"$=$N?F(B ($B$H@hAD(B) $B$N%H%T%C(B -$B%/%Q%i%a!<%?$+$i7Q>5$7$^$9!#%0%k!<%W%Q%i%a!<%?$H$7$F@5$7$$$b$N$OA4$F!"%H(B -$B%T%C%/%Q%i%a!<%?$H$7$F$b@5$7$$$b$N$G$9(B(@pxref{Group Parameters})$B!#(B - -$B$5$i$K!"0J2<$N%Q%i%a!<%?$O%H%T%C%/%Q%i%a!<%?$H$7$F$N$_M-8z$G$9(B: - -@table @code -@item subscribe -$B%H%T%C%/$G?7$7$$%0%k!<%W$r9XFI$7$F$$$k>l(B -$B9g(B (@pxref{Subscription Methods}), @code{subscribe} $B%H%T%C%/%Q%i%a!<%?$O(B -$B$I$N%0%k!<%W$,$I$N%H%T%C%/$K9T$/$+$r;XDj$7$^$9!#CM$O$=$N%H%T%C%/$K9T$/%0(B -$B%k!<%W$K9gCW$9$k@55,I=8=$G$"$kI,MW$,$"$j$^$9!#(B -@end table - -$B%0%k!<%W%Q%i%a!<%?$O(B ($B$b$A$m$s(B) $B%H%T%C%/%Q%i%a!<%?$h$j$bM%@h$5$l!"I{%H%T%C(B -$B%/$N%H%T%C%/%Q%i%a!<%?$O?F%H%T%C%/$N%H%T%C%/%Q%i%a!<%?$h$j$bM%@h$5$l$^$9!#(B -$BJ,$+$k$h$M!#$4$/IaDL$N7Q>5%k!<%k$G$9(B ($B%k!<%k(B (@dfn{Rules}) $B$O$3$3$G$OL>(B -$B;l$G$"$C$F!"F0;l$N!V@~$r0z$/!W$G$O$"$j$^$;$s!#$3$N%k!<%k$K$OH?BP$7$?$/$J(B -$B$k$+$bCN$l$J$$$1$I!"$=$l$O$4<+M3$K(B)$B!#(B - -@example -Gnus - Emacs - 3: comp.emacs - 2: alt.religion.emacs - 452: alt.sex.emacs - $BB)H4$-(B - 452: alt.sex.emacs - 0: comp.talk.emacs.recovery - $B$=$NB>(B - 8: comp.binaries.fractals - 13: comp.sources.unix - 452: alt.sex.emacs -@end example - -@samp{Emacs} $B%H%T%C%/$O%H%T%C%/%Q%i%a!<(B -$B%?(B @code{(score-file . "emacs.SCORE")} $B$r;}$C$F$$$^$9!#(B -@samp{$BB)H4$-(B} $B%H%T%C%/$O%H%T%C%/%Q%i%a!<(B -$B%?(B @code{(score-file . "relief.SCORE")} $B$r;}$A!"(B -@samp{$B$=$NB>(B} $B%H%T%C%/$O%H%T%C%/%Q%i%a!<(B -$B%?(B @code{(score-file . "emacs.SCORE")} $B$r;}$C$F$$$^$9!#(B -$B$5$i$K!"(B@samp{alt.religion.emacs} $B$O%0%k!<%W%Q%i%a!<(B -$B%?(B @code{(score-file . "religion.SCORE")} $B$r;}$C$F$$$^$9!#(B - -$B$5$F!"$3$3$G(B @samp{$BB)H4$-(B} $B%H%T%C%/$N(B @samp{alt.sex.emacs} $B%0%k!<%W$KF~$C(B -$B$?$H$-!"(B@file{relief.SCORE} $B$,4pK\%9%3%"%U%!%$%k$H$J$j$^$9!#$b(B -$B$7(B @samp{Emacs} $B%H%T%C%/$NF1$8%0%k!<%W$KF~$k$H!"(B@file{emacs.SCORE} $B$,4p(B -$BK\%9%3%"%U%!%$%k$K$J$k$G$7$g$&!#(B -@samp{alt.religion.emacs} $B%0%k!<%W$KF~$l$P!"(B@file{religion.SCORE} $B$,4pK\(B -$B%9%3%"%U%!%$%k$K$J$k$G$7$g$&!#(B - -$B$3$l$C$F$H$C$F$b4JC1$G<+L@$N$3$H$N$h$&$K8+$($k$G$7$g(B? $B$^$"!"$=$NDL$j$G$9!#(B -$B$G$9$,LdBj$,$"$k>l9g$b$"$j$^$9!#FC$K(B@code{total-expiry} $B%Q%i%a!<%?$K4X$7(B -$B$F$G$9!#Nc$($P$"$k%a!<%k%0%k!<%W$rFs$D$N%H%T%C%/$NCf$K!"0lJ}(B -$B$O(B @code{total-expiry} $B$"$j$G!"$b$&0lJ}$O$=$l$J$7$G;}$C$F$$$k$H$7$^$7$g(B -$B$&!#$3$3$G(B @kbd{M-x gnus-expire-all-expirable-groups} $B$rl9g$K$O==J,Cm0U$7$J$1$l$P$J$j$^$;$s!#(B - -@node Misc Group Stuff -@section $B$=$NB>$N%0%k!<%W4XO"(B - -@menu -* Scanning New Messages:: Gnus $B$K?7$7$$%a%C%;!<%8$,E~Ce$7$?$+$I$&(B - $B$+$rJ9$/(B -* Group Information:: $B%0%k!<%W$H(B gnus $B$K4X$9$k>pJs$H%X%k%W(B -* Group Timestamp:: Gnus $B$K:G8e$K$$$D%0%k!<%W$rFI$s$@$+$r5-(B - $BO?$5$;$k(B -* File Commands:: Gnus $B$N%U%!%$%k$NFI$_=q$-(B -@end menu - -@table @kbd -@item ^ -@kindex ^ (Group) -@findex gnus-group-enter-server-mode -$B%5!<%P%P%C%U%!%b!<%I$KF~$k(B (@code{gnus-group-enter-server-mode})$B!#(B -@xref{Server Buffer}$B!#(B - -@item a -@kindex a (Group) -@findex gnus-group-post-news -$B$"$k%0%k!<%W$K5-;v$rEj9F$9$k(B (@code{gnus-group-post-news})$B!#%W%l%U%#%C%/(B -$B%9$rM?$($k$H!"8=:_$N%0%k!<%WL>$,=i4|CM$H$7$F;HMQ$5$l$^$9!#(B - -@item m -@kindex m (Group) -@findex gnus-group-mail -$B%a!<%k$r$I$3$+$KAw$k(B (@code{gnus-group-mail})$B!#(B -@end table - -$B0J2<$O%0%k!<%W%P%C%U%!$N$?$a$NJQ?t$G$9(B: - -@table @code -@item gnus-group-mode-hook -@vindex gnus-group-mode-hook -$B%0%k!<%W%P%C%U%!$,:n@.$5$l$?;~$K8F$S=P$5$l$^$9!#(B - -@item gnus-group-prepare-hook -@vindex gnus-group-prepare-hook -$B%0%k!<%W%P%C%U%!$,@8@.$5$l$?$"$H$K8F$S=P$5$l$^$9!#$3$l$O%P%C%U%!$r2?$+JQ(B -$B$J!"<+A3$8$c$J$$J}K!$G=$@5$7$?$$$H$-$K;H$o$l$k$+$b$7$l$^$;$s!#(B - -@item gnus-group-prepared-hook -@vindex gnus-group-prepare-hook -$B%0%k!<%W%P%C%U%!$,@8@.$5$l$?8e$N0lHV:G8e$K8F$S=P$5$l$^$9!#Nc$($P%]%$%s%H(B -$B$r$I$3$+$K0\F0$5$;$?$$$H$-$J$I$K;H$($^$9!#(B - -@item gnus-permanently-visible-groups -@vindex gnus-permanently-visible-groups -$B$3$N@55,I=8=$K%^%C%A$9$k%0%k!<%W$O!"$=$l$,6u$G$"$k$+$I$&$+$K4X$o$i$:!">o(B -$B$K%0%k!<%W%P%C%U%!$KI=<($5$l$^$9!#(B - -@item gnus-group-name-charset-method-alist -@vindex gnus-group-name-charset-method-alist -$B%0%k!<%WL>MQ$NA*BrJ}K!$HJ8;z=89g$NO"A[%j%9%H$G$9!#$3$l$O1Q;z$G$O$J$$%0%k!<(B -$B%WL>$rI=<($9$k$?$a$K;H$$$^$9!#(B - -$BNc(B: -@lisp -(setq gnus-group-name-charset-method-alist - '(((nntp "news.com.cn") . cn-gb-2312))) -@end lisp - -@item gnus-group-name-charset-group-alist -@vindex gnus-group-name-charset-group-alist -$B%0%k!<%WL>MQ$N%0%k!<%WL>$N@55,I=8=$HJ8;z=89g$NO"A[%j%9%H$G$9!#$3$l$O1Q;z(B -$B$G$O$J$$%0%k!<%WL>$rI=<($9$k$?$a$K;H$$$^$9!#(B - -$BNc(B: -@lisp -(setq gnus-group-name-charset-group-alist - '(("\\.com\\.cn:" . cn-gb-2312))) -@end lisp -@end table - -@node Scanning New Messages -@subsection $B?7Ce%a%C%;!<%8$rC5$9(B -@cindex new messages -@cindex scanning new news - -@table @kbd -@item g -@kindex g (Group) -@findex gnus-group-get-new-news -@c @icon{gnus-group-get-new-news} -$B%5!<%P$N?7Ce5-;v$r%A%'%C%/$7$^$9!#?t;z%W%l%U%#%C%/%9$r;HMQ$9$k$H!"$3$NL?(B -$BNa$O0z?t(B @var{arg} $B$+$=$l$h$j>.$5$$%l%Y%k$N%0%k!<%W$N$_$r%A%'%C%/$7$^(B -$B$9(B (@code{gnus-group-get-new-news})$B!#?t;z0J30$N%W%l%U%#%C%/%9$rM?$($k$H!"(B -$B$3$NL?Na$O$=$N%P%C%/%(%s%I$+$i%"%/%F%#%V%U%!%$%k$r6/@)E*$KA4ItFI$_D>$7$^(B -$B$9!#(B - -@item M-g -@kindex M-g (Group) -@findex gnus-group-get-new-news-this-group -@vindex gnus-goto-next-group-when-activating -@c @icon{gnus-group-get-new-news-this-group} -$B8=:_$N%0%k!<%W$K?7Ce5-;v$,$"$k$+$I$&$+$r%A%'%C%/$7$^(B -$B$9(B (@code{gnus-group-get-new-news-this-group})$B!#(B -@code{gnus-goto-next-group-when-activating} $B$O$3$NL?Na$,r7o$KA4$F$N%0%k!<%W$r5/F0$7$^$9(B (@code{gnus-activate-all-groups})$B!#(B - -@item R -@kindex R (Group) -@cindex restarting -@findex gnus-group-restart -Gnus $B$r%j%9%?!<%H$7$^$9(B (@code{gnus-group-restart})$B!#$3$l(B -$B$O(B @file{.newsrc} $B%U%!%$%k$r%;!<%V$7!"A4$F$N%5!<%P$N@\B3$rJD$8!"A4$F(B -$B$N(B gnus $B%i%s%?%$%`JQ?t$r%/%j%"$7$?8e!"(Bgnus $B$r$b$&0lEY:G=i$+$i3+;O$7$^$9!#(B -@end table - -@vindex gnus-get-new-news-hook -@code{gnus-get-new-news-hook} $B$O?7Ce%K%e!<%9$r%A%'%C%/$9$kD>A0$KpJs(B -@cindex group information -@cindex information on groups - -@table @kbd -@item H f -@kindex H f (Group) -@findex gnus-group-fetch-faq -@vindex gnus-group-faq-directory -@cindex FAQ -@cindex ange-ftp -$B8=:_$N%0%k!<%W$N(B FAQ $B$ro%j%b!<%H%^%7%s>e$N%G%#%l%/%H%j$G$9!#$3$NJQ?t$O%G%#%l%/%H%j$N%j%9(B -$B%H$G$"$C$F$b9=$$$^$;$s!#$3$N>l9g!"$3$N%3%^%s%I$K%W%l%U%#%C%/%9$rM?$($k$3(B -$B$H$G$$$/$D$+$N%5%$%H$NCf$+$iA*$V$3$H$,$G$-$^$9!#%U%!%$%k$Nl9g!"(B -gnus $B$O(B @code{gnus-group-faq-directory} $B$NCM$rA4$F!"0l$D0l$D%*!<%W%s$7$F(B -$B$_$h$&$H$7$^$9!#(B - -@item H d -@itemx C-c C-d -@c @icon{gnus-group-describe-group} -@kindex H d (Group) -@kindex C-c C-d (Group) -@cindex describing groups -@cindex group description -@findex gnus-group-describe-group -$B8=:_$N%0%k!<%W$N@bL@$rI=<($9$k(B (@code{gnus-group-describe-group})$B!#%W%l(B -$B%U%#%C%/%9$rM?$($k$H!"@bL@J8$r%5!<%P$+$i6/@)E*$K:FFI$_9~$_$7$^$9!#(B - -@item M-d -@kindex M-d (Group) -@findex gnus-group-describe-all-groups -$BA4$F$N%0%k!<%W$N@bL@$rI=<($7$^(B -$B$9(B (@code{gnus-group-describe-all-groups})$B!#%W%l%U%#%C%/%9$rM?$($k$H!"@b(B -$BL@J8%U%!%$%k$r%5!<%P$+$i6/@)E*$K:FFI$_9~$_$7$^$9!#(B - -@item H v -@itemx V -@kindex V (Group) -@kindex H v (Group) -@cindex version -@findex gnus-version -$B8=:_$N(B gnus $B$N%P!<%8%g%sHV9f$rI=<($7$^$9(B (@code{gnus-version})$B!#(B - -@item ? -@kindex ? (Group) -@findex gnus-group-describe-briefly -$B$H$F$bC;$$%X%k%W%a%C%;!<%8$rM?$($^(B -$B$9(B (@code{gnus-group-describe-briefly})$B!#(B - -@item C-c C-i -@kindex C-c C-i (Group) -@cindex info -@cindex manual -@findex gnus-info-find-node -Gnus $B$N(B info $B%N!<%I$K0\F0$7$^$9(B (@code{gnus-info-find-node})$B!#(B -@end table - -@node Group Timestamp -@subsection $B%0%k!<%W$NF|IU(B -@cindex timestamps -@cindex group timestamps - -Gnus $B$K!"$"$J$?$,:G8e$K$$$D%0%k!<%W$rFI$s$@$+$r5-O?$5$;$k$HJXMx$+$b$7$l(B -$B$^$;$s!#$3$N3hF0$r;O$a$5$;$k$K$O!"(B -@code{gnus-group-set-timestamp} $B$r(B @code{gnus-select-group-hook} $B$KDI2C(B -$B$7$F$/$@$5$$!#(B - -@lisp -(add-hook 'gnus-select-group-hook 'gnus-group-set-timestamp) -@end lisp - -$B$3$l$r9T$C$?8e!"$"$J$?$,%0%k!<%W$KF~$k$?$S$K$=$l$,5-O?$5$l$^$9!#(B - -$B$3$N>pJs$O$5$^$6$^$JJ}K!$GI=<($G$-$^$9!=!=$b$C$H$b4JC1$J$N$O!"%0%k!<%W9T(B -$B%U%)!<%^%C%H$G(B @samp{%d} $B;XDj$r;H$&J}K!$G$9(B: - -@lisp -(setq gnus-group-line-format - "%M\%S\%p\%P\%5y: %(%-40,40g%) %d\n") -@end lisp - -$B$3$N7k2L$H$7$F!"3F9T$O0J2<$N$h$&$KI=<($5$l$^$9(B: - -@example -* 0: mail.ding 19961002T012943 - 0: custom 19961002T012713 -@end example - -$B8+$FJ,$+$k$H$*$j!"F|IU$O%3%s%Q%/%H$J(B ISO 8601 $B7A<0$GI=<($5$l$^$9!#(B -$B$3$l$G$O$A$g$C$H$"$s$^$j$J$N$G!"0J2<$N$h$&$J46$8$K$9$k$HF|IU$@$1(B -$B$rI=<($G$-$^$9!#(B - -@lisp -(setq gnus-group-line-format - "%M\%S\%p\%P\%5y: %(%-40,40g%) %6,6~(cut 2)d\n") -@end lisp - -@node File Commands -@subsection $B%U%!%$%kL?Na(B -@cindex file commands - -@table @kbd -@item r -@kindex r (Group) -@findex gnus-group-read-init-file -@vindex gnus-init-file -@cindex reading init file -$B=i4|2=%U%!%$%k$N:FFI$_9~$_$r9T$&(B (@code{gnus-init-file}$B!"$3$N%G(B -$B%U%)%k%H$O(B @file{~/.gnus}) (@code{gnus-group-read-init-file})$B!#(B - -@item s -@kindex s (Group) -@findex gnus-group-save-newsrc -@cindex saving .newsrc -@file{.newsrc.eld} $B%U%!%$%k(B ($B$H!"$b$7$=$&$7$?$1$l$P(B @file{.newsrc} $B%U%!(B -$B%$%k(B) $B$r%;!<%V$9$k(B (@code{gnus-group-save-newsrc})$B!#(B - -@c @item Z -@c @kindex Z (Group) -@c @findex gnus-group-clear-dribble -@c $B%I%j%V%k%U%!%$%k$r%/%j%"$9$k(B -@c (@code{gnus-group-clear-dribble})$B!#(B -@end table - -@node Summary Buffer -@chapter $B35N,%P%C%U%!(B -@cindex summary buffer - -$B35N,%P%C%U%!(B (summary buffer) $B$G$O$=$l$>$l$N5-;v$,0l9T$GI=<($5$l$^$9!#$=(B -$B$NCf$rF0$-2s$j!"5-;v$rFI$_!"Ej9F$7!"JVEz$r$9$k$3$H$,$G$-$^$9!#(B - -$B35N,%P%C%U%!$K0\$k0lHVIaDL$NJ}K!$O!"%0%k!<%W%P%C%U%!$G%0%k!<%W$rA*Br$9$k(B -$B$3$H$G$9(B (@pxref{Selecting a Group})$B!#(B - -$B35N,%P%C%U%!$OK>$`$@$1$?$/$5$s3+$$$?>uBV$K$7$F$*$/$3$H$,$G$-$^$9!#(B - -@menu -* Summary Buffer Format:: $B35N,%P%C%U%!$N304Q$r7hDj$9$k(B -* Summary Maneuvering:: $B35N,%P%C%U%!$rF0$-2s$k(B -* Choosing Articles:: $B5-;v$rFI$`(B -* Paging the Article:: $BFI$s$G$$$k5-;v$r%9%/%m!<%k$9$k(B -* Reply Followup and Post:: $B5-;v$rEj9F$9$k(B -* Delayed Articles:: -* Marking Articles:: $B5-;v$K4{FI$d4|8B@Z$l:o=|2DG=Ey$N0u$rIU$1(B - $B$k(B -* Limiting:: $B35N,%P%C%U%!$K@)8B$r2C$($k$3$H$,$G$-$k(B -* Threading:: $B%9%l%C%I$,$I$N$h$&$K:n$i$l$k$+(B -* Sorting the Summary Buffer:: $B%9%l%C%I$H5-;v$,$I$N$h$&$KJB$S$+$($i$l$k(B - $B$+(B -* Asynchronous Fetching:: Gnus $B$O5-;v$r@h$KC5n$7$J$/$5$;$k(B -* Article Backlog:: $B4{$KFI$s$@5-;v$r;D$7$F$*$/(B -* Saving Articles:: $B5-;v$NJ]B8$r%+%9%?%^%$%:$9$kJ}K!(B -* Decoding Articles:: Gnus $B$O0lO"$N(B (uu)encode $B$5$l$?5-;v$r07(B - $B$($k(B -* Article Treatment:: $B5-;v%P%C%U%!$O$*K>$_$I$*$j$KL\Cc6lCc$K$G(B - $B$-$k(B -@c * MIME Commands:: Doing MIMEy things with the articles. -@c * Charsets:: Character set issues. -* Article Commands:: $B5-;v%P%C%U%!$G$$$m$$$m$J$3$H$r$9$k(B -* Summary Sorting:: $B$$$m$$$m$JJ}K!$G35N,%P%C%U%!$rJB$YBX$($k(B -* Finding the Parent:: $B;R5-;v$K1g=u$,L5$$$C$F(B? $B?F5-;v$r$N$I$N>l=j$K$b9g$o$J$+$C$?$b$N(B -* Exiting the Summary Buffer:: $B%0%k!<%W%P%C%U%!$KLa$k!"(B - $B$^$?$O8=:_$N%0%k!<%W$r:F$SA*Br$9$k(B -* Crosspost Handling:: $B%/%m%9%]%9%H$5$l$?5-;v$,$I$N$h$&$K07$o$l(B - $B$k$+(B -* Duplicate Suppression:: $B%/%m%9%]%9%H$N07$$$K<:GT$7$?$H$-$NBeBXA0$rI=<($7$J$$J}K!(B -* Summary Buffer Mode Line:: $B%b!<%I9T$N8+$(J}$r7h$a$i$l$k(B -* Summary Highlighting:: $B35N,%P%C%U%!$r$-$l$$$GAGE($K$9$k(B -@end menu - -@findex std11-extract-address-components -@findex mail-extract-address-components -@findex gnus-extract-address-components -@vindex gnus-extract-address-components -Gnus $B$OJQ?t(B @code{gnus-extract-address-components} $B$NCM$r(B @code{From} $B%X%C(B -$B%@!<$NL>A0$H%"%I%l%9$NItJ,$ro$KB.$/F0:n$7$^$9!#(B -@code{mail-extract-address-components} $B$ONI$/F0:n$7$^$9$,!"$d$dCY$/$J$j(B -$B$^$9!#$=$7$F!"(B@code{std11-extract-address-components} $B$O$H$F$bNI$/F0:n$7(B -$B$^$9$,!"CY$/$J$j$^$9!#%G%#%U%)%k%H$N4X?t$O(B 5% $B$N3d9g$G4V0c$C$FEz$($^$9!#(B -$B$b$7$3$l$K2fK}$J$i$J$$$N$G$"$l$P!"B>$N4X?t$rBe$o$j$K;H$&$3$H$,$G$-$^$9(B: - -@lisp -(setq gnus-extract-address-components - 'mail-extract-address-components) -@end lisp - -@vindex gnus-summary-same-subject -@code{gnus-summary-same-subject} $B$O:#FI$s$G$$$k5-;v$,!"$=$NA0$N5-;v$HF1(B -$B$8I=Bj(B (subject) $B$G$"$k$3$H$r<($9J8;zNs$G$9!#$3$NJ8;zNs$O;EMM$,$3$l$rMW(B -$B5a$9$k$H$-$K;H$o$l$^$9!#=i4|@_Dj$G$O(B @code{""} $B$G$9!#(B - -@node Summary Buffer Lines -@subsection $B35N,%P%C%U%!$N9T(B - -@vindex gnus-summary-line-format -$BJQ?t(B @code{gnus-summary-line-format} $B$NCM$rJQ$($k$3$H$K$h$C$F!"35N,%P%C(B -$B%U%!$G$N9T$NMM<0(B (format) $B$rJQ99$9$k$3$H$,$G$-$^$9!#$$$/$D$+$N3H(B -$BD%(B (@pxref{Formatting Variables}) $B$r=|$$$F!"IaDL$N(B @code{format} $BJ8;zNs(B -$B$HF1$8$h$&$KF0:n$7$^$9!#(B - -$B9T$K$O>o$K%3%m%s$+%]%$%s%H0LCV$N%^!<%+!<$,B8:_$7$F$$$J$1$l$P$J$j$^$;$s!#(B -$BA`:n$7$?8e$K!"%+!<%=%k$O$$$D$b%3%m%s$+%]%$%s%H0LCV$N%^!<%+!<$N>l=j$K0\F0(B -$B$7$^$9!#(B($B$b$A$m$s!"$3$NF0:n$rJQ$($k$3$H$,$G$-$J$$$H$7$?$i(B Gnus $B$K$O$"$k(B -$B$^$8$-$3$H$G$9!#4X?t(B @code{gnus-goto-colon} $B$r!"$"$J$?$,9%$-$J%+!<%=%k$N(B -$BF0$-$K$J$k$h$&$K!"?7$?$K=q$1$PNI$$$N$G$9!#(B) - -$B=i4|CM$NJ8;zNs$O(B @samp{%U%R%z%I%(%[%4L: %-23,23n%]%) %s\n} $B$G$9!#(B - -$B0J2<$NMM<0;X<(J8;z$r;H$&$3$H$,$G$-$^$9(B: - -@table @samp -@item N -$B5-;v?t!#(B -@item S -$BI=Bj$NJ8;zNs!#(B@code{gnus-list-identifiers} $B$N@_Dj$K$h$C$F%a!<%j%s%0%j%9(B -$B%H$NI8<1$,:o=|$5$l$^$9!#(B@xref{Article Hiding}$B!#(B -@item s -$B%9%l%C%I(B (thread) $B$N4p5-;v$G$"$k$H$-$+D>A0$N5-;v$,0c$&I=Bj$N$H$-$O$=$NBj(B -$BL>$G!"$=$l0J30$O(B @code{gnus-summary-same-subject}$B!#(B -(@code{gnus-summary-same-subject} $B$N=i4|CM$O(B @code{""}$B!#(B) -@item F -$B40A4$J(B @code{From} $BMs!#(B -@item n -$BL>A0(B (@code{From} $BMs$h$j(B)$B!#(B -@item f -$BL>A0!"(B@code{To} $B%X%C%@!<$+(B @code{Newsgroups} $B%X%C%@!<$G(B -$B$9(B (@pxref{To From Newsgroups})$B!#(B -@item a -$BL>A0(B (@code{From} $BMs$h$j(B)$B!#$3$l$H(B @code{n} $B$H$N0c$$$O!"$3$l$OJQ(B -$B?t(B @code{gnus-extract-address-components} $B$G;XDj$5$l$F$$$k4X?t$r;H$C$FL>(B -$BA0$rA0(B (@code{From} $BMs$h$j(B)$B!#$3$l$O(B @code{a} $B$HF1$8$h$&$KF0:n$7$^$9!#(B -@item L -$B5-;v$N9T?t!#(B -@item c -$B5-;v$NJ8;z?t!#$3$NL>A0;XDj;R$O(B (nnfolder $B$N$h$&$J(B) $B$$$/$D$+$NA*BrJ}K!$r(B -$B%5%]!<%H$7$^$;$s!#(B -@item I -$B%9%l%C%I$N%l%Y%k$K$h$k;z2<$2(B (@pxref{Customizing Threading})$B!#(B -@item B -$BJ#;($J(B trn $BMM<0$N%9%l%C%ILZ(B (tree)$B!#$I$N$h$&$J1~Ez$,9T$J$o$l$?$+$N5-O?$r(B -$BI=<($7$^$9!#(B -@item T -$B5-;v$,K\5-;v$G$"$l$P2?$bI=<($;$:!"$=$&$G$J$$>l9g$O$?$/$5$s$N6uGr$G$9(B ($B8e(B -$B$N$b$N$r$9$Y$F2hLL$N30$KDI$$=P$7$F$7$^$$$^$9(B)$B!#(B -@item [ -$B3+$-3g8L!#IaDL$O(B @samp{[} $B$G$9$,!"M\;R5-;v$K$O(B @samp{<} $B$K$9$k$3$H$,$G$-(B -$B$^$9(B (@pxref{Customizing Threading})$B!#(B -@item ] -$BJD$83g8L!#IaDL$O(B @samp{[} $B$G$9$,!"M\;R5-;v$K$O(B @samp{<} $B$K$9$k$3$H$,$G$-(B -$B$^$9!#(B -@item > -$B$=$l$>$l$N%9%l%C%I$N%l%Y%k$KBP$7$F0l$D$N6uGr!#(B -@item < -$BFs==0z$/%9%l%C%I%l%Y%k$N6uGr!#(B -@item U -$BL$FI!#(B - -@item R -$B$3$NJ6$i$o$7$$L>A0;XDj;R$O(B @dfn{secondary mark} $B$K$h$C$FDj5A$5$l$^$9!#$3(B -$B$N%^!<%/$O5-;v$,4{$KJVEz:Q$_$N$b$N$+!"%-%c%C%7%e$5$l$?$b$N$+!"$"$k$$$OJ](B -$BB8$5$l$?$b$N$+$rI=$7$^$9!#(B - -@item i -$B?t;z$H$7$F$N%9%3%"(B (@pxref{Scoring})$B!#(B -@item z -@vindex gnus-summary-zcore-fuzz -$B$3$l$O!"(Bzcore $B$G=i4|@_Dj$N%l%Y%k$h$j$b>e$G$"$l$P(B @samp{+} $B$G!"=i4|@_Dj$N(B -$B%l%Y%k$h$j$b2<$G$"$l$P(B @samp{-} $B$G$9!#(B -@code{gnus-summary-default-score} $B$H$N:9(B -$B$,(B @code{gnus-summary-zcore-fuzz} $B$h$j$b>.$5$$$H!"$3$N;EMM$O;H$o$l$^$;$s!#(B -@item V -$B%9%l%C%IA4BN$N%9%3%"!#(B -@item x -@code{Xref}. -@item D -@code{$BF|IU(B} (@code{Date})$B!#(B -@item d -@code{DD-MM}$BMM<0$K$h$k(B@code{$BF|IU(B}$B!#(B -@item o -@var{YYYYMMDD}@code{T}@var{HHMMSS}$BMM<0$K$h$k(B@code{$BF|IU(B}$B!#(B -@item M -@code{Message-ID}. -@item r -@code{References}. -@item t -$B8=:_$NI{%9%l%C%I$N5-;v$N?t!#$3$N;EMM$r;H$&$H35N,%P%C%U%!$N@8@.$,4vJ,CY$/(B -$B$J$j$^$9!#(B -@item e -$B5-;v$K;R5-;v$,$"$k$H!"(B@samp{=} (@code{gnus-not-empty-thread-mark}) $B$,I=(B -$B<($5$l$^$9!#(B -@item P -$B9T?t!#(B -@item O -$B%@%&%s%m!<%I$N0u!#(B -@item u -$BMxMQ$N35N,;XDj$HF1MM$K35N,$KA^F~(B -$B$5$l$^$9!#(B -@end table - -@samp{%U} ($B>uBV(B), @samp{%R} ($BJVEz:Q$_(B), @samp{%z} (zcore) $B$N07$$$K$O5$$r(B -$BIU$1$kI,MW$,$"$j$^$9!#8zN($N$?$a$K!"(Bgnus $B$O$3$l$i$NJ8;z$,$I$N7e$K8=$l$k(B -$B$+$r7W;;$7!"!X%O!<%I!&%3!<%I!Y$7$^$9!#$3$l$O!"2DJQD9$N;EMM$N8e$G$O!"$3$l(B -$B$i$O0UL#$r;}$?$J$$$H$$$&$3$H$G$9!#$^$!!"$5$9$,$KBaJa$O$5$l$J$$$G$7$g$&$,!"(B -$B35N,%P%C%U%!$OJQ$K$J$j$^$9!#$=$l$G$b==J,Ha$7$$$G$7$g$&$1$I!#(B - -$B8-$$A*Br$O$3$l$i$N;XDj$r$G$-$k$@$1:8$K;}$C$F$/$k$3$H$G$9!#(B($B$G$b!"$=$&$$(B -$B$&$3$H$O$9$Y$F$KEv$F$O$^$k$N$G$O$J$$$G$7$g$&$+!#4WOC5YBj!#(B) - -$B$3$N@)8B$O>-Mh$NHG$G$OL5$/$J$k$+$bCN$l$^$;$s!#(B - -@node To From Newsgroups -@subsection To From Newsgroups -@cindex To -@cindex Newsgroups - -$B$$$/$D$+$N%0%k!<%W$G$O(B ($BFC$K%"!<%+%$%V%0%k!<%W(B), @code{From} $B%X%C%@!<$O(B -$B$"$^$j6=L#$r0z$-$^$;$s!#$=$3$NA4$F$N5-;v$O$"$J$?$K$h$C$F=q$+$l$?$b$N$G$9(B -$B$+$i!#Be$o$j$K!"(B@code{To} $B$d(B @code{Newsgroups} $B%X%C%@!<$N>pJs$rI=<($9$k(B -$B$?$a$K$O!";0$D$N$3$H$r7h$a$kI,MW$,$"$j$^$9(B: $B$I$N>pJs$r=8$a$k$+(B, $B$I$3$KI=(B -$B<($9$k$+(B, $B$$$DI=<($9$k$+!#(B - -@enumerate -@item -@vindex gnus-extra-headers -$BDI2C$N%X%C%@!<$N>pJs$O(B @code{gnus-extra-headers} $B$K$h$j@)8f$5$l$^$9!#$3(B -$B$l$O%X%C%@!<$N%7%s%\%k$N%j%9%H$G$9!#Nc$($P(B: - -@lisp -(setq gnus-extra-headers - '(To Newsgroups X-Newsreader)) -@end lisp - -$B$3$l$O!"(Bgnus $B$,$3$l$i$N;0$D$N%X%C%@!<$rl9gLrN)$A$^$9!#$7$+$7!"0J2<$N$b$N$r(B @file{overview.fmt} $B%U%!%$(B -$B%k$N:G8e$KDI2C$9$k$h$&$K(B nntp $B4IM}$l$NMWAG$G$9(B: - -@table @samp -@item G -$B%0%k!<%WL>!#(B -@item p -$B@\F,8l$rA0!#(B -@item A -$B8=:_$N5-;vHV9f!#(B -@item z -$B8=:_$N5-;v%9%3%"!#(B -@item V -Gnus $B%P!<%8%g%s!#(B -@item U -$B$=$N%0%k!<%W$G$NL$FI5-;v$N?t!#(B -@item e -$B35N,%P%C%U%!$KI=<($5$l$F$$$J$$L$FI5-;v$N?t!#(B -@item Z -$BL$FI$HL$A*Br$N5-;v$N?t$H$H$b$KI=$5$l$kJ8;zNs$G!"L$FI$+$DL$A*Br$N5-;v$,$"(B -$B$k>l9g$O(B @samp{<%U(+%e) more>} $B$G!"L$FI5-;v$N$_$N>l9g(B -$B$O(B @samp{<%U more>} $B$G$9!#(B -@item g -$BC;=L%0%k!<%WL>!#Nc$($P!"(B@samp{rec.arts.anime} $B$O(B @samp{r.a.anime} $B$KC;=L(B -$B$5$l$^$9!#(B -@item S -$B8=:_$N5-;v$NI=Bj!#(B -@item u -$BMxMQA0(B (@pxref{Scoring})$B!#(B -@item d -$BJ]N15-;v$N?t(B (@pxref{Unread Articles})$B!#(B -@item t -$B2D;k0uIU$-5-;v$N?t(B (@pxref{Unread Articles})$B!#(B -@item r -$B$=$N0lO"$NF0:n$N4V$K4{FI$H$7$F0u$,$D$$$?5-;v$N?t!#(B -@item E -$B%9%3%"%U%!%$%k$K$h$C$FKu>C$5$l$?5-;v$N?t!#(B -@end table - -@node Summary Highlighting -@subsection $B35N,$N%O%$%i%$%H(B - -@table @code -@item gnus-visual-mark-article-hook -@vindex gnus-visual-mark-article-hook -$B$3$N%U%C%/$O5-;v$rA*Br$7$?8e$Kl9g$Ol9g$O score default) . bold)) -@end lisp - -$B$4A[A|$N$H$*$j!"$b$7(B @var{form} $B$,(B @code{nil} $B$G$J$$CM$rJV$9$H!"(B -@var{face} $B$,$=$N9T$KE,MQ$5$l$^$9!#(B -@end table - -@node Summary Maneuvering -@section $B35N,4V$N0\F0(B -@cindex summary movement - -$B$9$Y$F$ND>@\0\F0L?Na$O?tCM@\F,0z?t$r)$a$^$9!#$3$NJQ?t(B -$B$,(B @code{t} $B$Gl(B -$B9g$H$7$F!"$3$NJQ?t$,(B @code{quietly} $B$G$"$k$H!"(Bgnus $B$O3NG'$r$;$:$K!"H$7$F$/$@$5$$!#(B - -@item gnus-auto-select-same -@vindex gnus-auto-select-same -@code{nil} $B$G$J$$$H!"$9$Y$F$N0\F0L?Na$O8=:_$N5-;v$HF1$8I=Bj$N5-;v$K0\F0(B -$B$7$h$&$H$7$^$9!#(B(@dfn{$BF1$8(B} $B$O$3$3$G$O(B @dfn{$BBgBNF1$8(B} $B$H$$$&0UL#$+$bCN$l(B -$B$^$;$s!#>\:Y$O(B @code{gnus-summary-gather-subject-limit} $B$r8+$F$/$@$5(B -$B$$(B (@pxref{Customizing Threading} $B$b;2>H$7$F$/$@$5$$(B)$B!#(B) $BF1$8I=Bj$N5-;v(B -$B$,L5$$$H$-$O:G=i$NL$FI5-;v$K0\F0$7$^$9!#(B - -$B$3$NJQ?t$O!"%9%l%C%II=<($r9T$C$F$$$k$H$-$O$"$^$jLr$KN)$?$J$$$G$7$g$&!#(B - -@item gnus-summary-check-current -@vindex gnus-summary-check-current -@code{nil} $B$G$J$$$H!"$9$Y$F$N!XL$FI!Y0\F0L?Na$O!"o$K??Cf$KJ]$A$^$9!#(B -$B$3$l$r$9$k$H!"$H$F$b$3$.$l$$$K$J$j$^$9$,!"CY$$%M%C%H%o!<%/@\B3$G$"$C$?$j!"(B -$BC1$K$3$N(B Emacsism $B$G$J$$9T0Y$r9%$-$K$J$l$J$$$N$G$"$l$P!"IaDL$N(B Emacs $B$N(B -$B%9%/%m!<%k$K$9$k$?$a$K!"$3$NJQ?t$r(B @code{nil} $B$K$9$k$3$H$,$G$-$^$9!#$3$l(B -$B$O35N,%P%C%U%!$N?eJ?J}8~$N??Cf$X$N:F0\F0$b6X;_$7$^$9$N$G!"Hs>o$KD9$$%9%l%C(B -$B%I$rFI$`$H$-$OITJX$+$b$7$l$^$;$s!#(B -@end table - -@node Choosing Articles -@section $B5-;v$NA*Br(B -@cindex selecting articles - -@menu -* Choosing Commands:: $B5-;v$rA*Br$9$k$?$a$NL?Na(B -* Choosing Variables:: $B$3$l$i$NL?Na$K1F6A$r5Z$\$9JQ?t(B -@end menu - -@node Choosing Commands -@subsection $BL?Na$NA*Br(B - -$B0J2<$N0\F0%3%^%s%I$O$I$l$b?tCM@\F,0z?t$rH$7$F2<$5$$!#(B - -@table @kbd -@item SPACE -@kindex SPACE ($B35N,(B) -@findex gnus-summary-next-page -$B8=:_$N5-;v$+!"$=$l$,4{$KFI$^$l$F$$$k>l9g$OA0$N5-;v$K0\F0$7$^$9(B (@code{gnus-summary-goto-last-article})$B!#(B - -@item G o -@kindex G o ($B35N,(B) -@findex gnus-summary-pop-article -$B35N,$NMzNr(B (history) $B$+$i:G8e$N5-;v$r0l$De$NL?Na$H0c$&$N$O!"(B -@kbd{l} $B$,:G=*Fs$D$N5-;v$N4V$r0\F0$9$k$N$KBP$7$F!"$3$l$O9%$-$J$@$1A0$N5-(B -$B;v$rMzNr$+$iA*$S=P$9$3$H$,$G$-$kE@$G$9!#2?$i$+$N$3$l$K4X78$7$?$3$H(B -$B$O(B ($B$b$7$3$l$i$NL?Na$r$?$/$5$s;H$&$N$G$"$l$P(B)$B!"(B -@pxref{Article Backlog} $B$r;2>H$7$F$/$@$5$$!#(B - -@item G j -@item j -@kindex j ($B35N,(B) -@kindex G j ($B35N,(B) -@findex gnus-summary-goto-article -$B5-;vHV9f$+(B @code{Message-ID} $B$r?R$M!"$=$l$+$i$=$N5-;v$K9T$/!#(B -(@code{gnus-summary-goto-article})$B!#(B -@end table - -@node Choosing Variables -@subsection $BA*$V$?$a$NJQ?t(B - -$B5-;v$r0\F0$7!"A*Br$9$k$N$K4XO"$7$?$$$/$D$+$NJQ?t(B: - -@table @code -@item gnus-auto-extended-newsgroup -@vindex gnus-auto-extend-newsgroup -$B$3$NJQ?t$,(B @code{nil} $B$G$J$$$H!"$9$Y$F$N0\F0L?Na$O!"$b$7$=$N5-;v$,35N,%P%C(B -$B%U%!$KI=<($5$l$F$$$J$$>l9g$G$b!"A0(B ($B$b$7$/$Oo$K8F$P$l$^$9!#=i4|@_Dj$G$O!"A*Br$5$l(B -$B$?5-;v$N2<$K1#$l$F$$$k%9%l%C%I$r8+$;$k$h$&$K$J$C$F$$$^$9!#(B - -@item gnus-mark-article-hook -@vindex gnus-mark-article-hook -@findex gnus-summary-mark-unread-as-read -@findex gnus-summary-mark-read-and-unread-as-read -@findex gnus-unread-mark -$B$3$N%U%C%/$O5-;v$,A*Br$5$l$?$H$-$K>o$K8F$P$l$^$9!#$=$l$O5-;v$K4{FI$N0u$r(B -$BIU$1$k$?$a$K$"$j$^$9!#=i4|CM(B -$B$O(B @code{gnus-summary-mark-read-and-unread-as-read} $B$G!"$[$H$s$I$9$Y$F$N(B -$BFI$s$@5-;v$N0u$r(B @code{gnus-read-mark} $B$KJQ99$7$^$9!#$3$N4X?t$K1F6A$5$l(B -$B$J$$5-;v$O!"2D;k!"J]N1!"4|8B@Z$l:o=|2DG=5-;v$@$1$G$9!#$b$7!"L$FI$K4{FI$N(B -$B0u$rIU$1$?$$$@$1$G$"$l$P!"Be$o$j(B -$B$K(B @code{gnus-summary-mark-unread-as-read} $B$r;H$&$3$H$,$G$-$^$9!#$=$l$O!"(B -@code{gnus-low-score-mark} $B$d(B @code{gnus-del-mark} ($B$J$I$J$I(B) $B$N0u$r$=$N(B -$B$^$^;D$7$^$9!#(B -@end table - -@node Paging the Article -@section $B5-;v$N%9%/%m!<%k(B -@cindex article scrolling - -@table @kbd -@item SPACE -@kindex SPACE ($B35N,(B) -@findex gnus-summary-next-page -@kbd{SPACE} $B$O5-;v$r0l%Z!<%8@h$K%9%/%m!<%k$7$^$9!#5-;v$N:G8e$K$$$k>l9g$O(B -$B -@itemx > -@kindex > ($B35N,(B) -@kindex A > ($B35N,(B) -@findex gnus-summary-end-of-article -$B5-;v$N:G8e$^$G%9%/%m!<%k$7$^$9(B (@code{gnus-summary-end-of-article})$B!#(B - -@item A s -@itemx s -@kindex A s ($B35N,(B) -@kindex s ($B35N,(B) -@findex gnus-summary-isearch-article -$B5-;v%P%C%U%!$G%$%s%/%j%a%s%?%k%5!<%A(B (isearch) $B$r9T$$$^(B -$B$9(B (@code{gnus-summary-isearch-article})$B!#(B - -@item h -@kindex h ($B35N,(B) -@findex gnus-summary-select-article-buffer -$B5-;v%P%C%U%!$rA*Br$7$^$9(B (@code{gnus-summary-select-article-buffer})$B!#(B -@end table - -@node Reply Followup and Post -@section $BJVEz!"%U%)%m!<%"%C%W!"Ej9F(B - -@menu -* Summary Mail Commands:: $B%a!<%k$rAw$k(B -* Summary Post Commands:: $B%K%e!<%9$rAw$k(B -* Summary Message Commands:: $BB>$N%a%C%;!<%84XO"$NL?Na(B -* Canceling and Superseding:: -@end menu - -@node Summary Mail Commands -@subsection $B35N,$G$N%a!<%k$NL?Na(B -@cindex mail -@cindex composing mail - -$B%a!<%k%a%C%;!<%8$r:n@.$9$k$?$a$NL?Na(B: - -@table @kbd -@item S r -@item r -@kindex S r ($B35N,(B) -@kindex r ($B35N,(B) -@findex gnus-summary-reply -@c @icon{gnus-summary-mail-reply} -@c @icon{gnus-summary-reply} -$B8=:_$N5-;v$r=q$$$??M$KJVEz$N%a!<%k$rAw$j$^$9(B (@code{gnus-summary-reply})$B!#(B - -@item S R -@itemx R -@kindex R ($B35N,(B) -@kindex S R ($B35N,(B) -@findex gnus-summary-reply-with-original -@c @icon{gnus-summary-reply-with-original} -$B8=:_$N5-;v$r=q$$$??M$K!"K\5-;v$r4^$s$@JVEz$N%a!<%k$r=P$7$^(B -$B$9(B (@code{gnus-summary-reply-with-original})$B!#$3$NL?Na$O%W%m%;%9(B/$B@\F,0z(B -$B?t$N=,47$r;H$$$^$9!#(B - -@item S w -@kindex S w ($B35N,(B) -@findex gnus-summary-wide-reply -$B8=:_$N5-;v$r=q$$$??M$KBP$7$F!"9-$$JVEz(B (wide reply) $B$r$7$^(B -$B$9(B (@code{gnus-summary-wide-reply})$B!#(B@dfn{$B9-$$JVEz(B} $B$H$O%X%C%@!<(B -$B$N(B @code{To}, @code{From}, ($B$b$7$/$O(B @code{Reply-to}) $B$H(B @code{Cc}) $B$N$9(B -$B$Y$F$N?M$KJVEz$r$9$k$3$H$G$9!#(B - -@item S W -@kindex S W ($B35N,(B) -@findex gnus-summary-wide-reply-with-original -$B8=:_$N5-;v$KK\5-;v$r4^$s$@9-$$JVEz$N%a!<%k$rAw$j$^(B -$B$9(B (@code{gnus-summary-wide-reply-with-original})$B!#$3$NL?Na$O%W%m%;%9(B/$B@\(B -$BF,0z?t$N=,47$r;H$$$^$9!#(B - -@item S v -@kindex S v ($B35N,(B) -@findex gnus-summary-very-wide-reply -$B8=:_$N5-;v$r=q$$$??M$KBP$7$F!"Hs>o$K9-$$JVEz(B (very wide reply) $B$r$7$^(B -$B$9(B (@code{gnus-summary-very-wide-reply})$B!#(B@dfn{$BHs>o$K9-$$JVEz(B} $B$H$O!"%W(B -$B%m%;%9(B/$B@\F,0z?t$G;XDj$5$l$?$9$Y$F$N5-;v$N%X%C%@!<$N(B @code{To}, -@code{From}, ($B$b$7$/$O(B @code{Reply-to}) $B$H(B @code{Cc}) $B$N$9$Y$F$N?M$KJVEz(B -$B$r$9$k$3$H$G$9!#$3$NL?Na$O%W%m%;%9(B/$B@\F,0z?t$N=,47$r;H$$$^$9!#(B - -@item S V -@kindex S V ($B35N,(B) -@findex gnus-summary-very-wide-reply-with-original -$B8=:_$N5-;v$KK\5-;v$r4^$s$@Hs>o$K9-$$JVEz$N%a!<%k$rAw$j$^(B -$B$9(B (@code{gnus-summary-very-wide-reply-with-original})$B!#$3$NL?Na$O%W%m%;(B -$B%9(B/$B@\F,0z?t$N=,47$r;H$$$^$9!#(B - -@item S o m -@itemx C-c C-f -@kindex S o m ($B35N,(B) -@kindex C-c C-f ($B35N,(B) -@findex gnus-summary-mail-forward -@c @icon{gnus-summary-mail-forward} -$BC/$+B>$N?M$K8=:_$N5-;v$rE>Aw$7$^$9(B (@code{gnus-summary-mail-forward})$B!#(B -$B@\F,0z?t$,$"$k$H!"E>Aw5-;v$N40A4$J%X%C%@!<$r$N?M$K%a!<%k$rAw$j$^$9(B (@code{gnus-summary-mail-other-window})$B!#(B - -@item S D b -@kindex S D b ($B35N,(B) -@findex gnus-summary-resend-bounced-mail -@cindex bouncing mail -$B%a!<%k$rAw$C$?$N$K!"2?$i$+$NM}M3(B ($B%"%I%l%9$N4V0c$$!"E>Aw$NITD4(B) $B$GLa$C$F(B -$B$-$?$H$-$K!"$3$NL?Na$r;H$C$FLa$C$F$-$?%a!<%k$r$b$&0l2sAw$k$3$H$,$G$-$^(B -$B$9(B (@code{gnus-summary-resend-bonced-mail})$B!#$b$&0lEY%a!<%k$rAw$kA0$K%X%C(B -$B%@!<$rJT=8$G$-$k$h$&$K!"%a!<%k%P%C%U%!$K$=$N%a!<%k$,8=$l$k$G$7$g$&!#$3$N(B -$BL?Na$K@\F,0z?t$rM?$($F!"La$C$F$-$?%a!<%k$,C/$+$X$NJVEz$G$"$C$?>l9g!"(B -gnus $B$O$=$N%a!<%k$re$NL?Na$H:.F1$7$J$$$h$&$K!"(B@code{gnus-summary-resend-message} $B$O8=:_$N(B -$B%a%C%;!<%8$rAw$k@h$N%"%I%l%9$NF~NO$rB%$7!"$=$l$+$i$=$N>l=j$K%a!<%k$rAw$j(B -$B$^$9!#%a%C%;!<%8$N%X%C%@!<$OJQ99$5$l$^$;$s!=!=$7$+$7!"(B -@code{Resent-To}, @code{Resent-From} $BEy$N%X%C%@!<$,IU$12C$($i$l$^$9!#$3(B -$B$l$O!"(B($B$*$=$i$/(B) $B$"$J$?<+?H$r(B @code{To} $BMs$K=q$$$?K\?M$K$b%a!<%k$rAw$C$F(B -$B$7$^$&$H$$$&$3$H$G$9!#$3$l$O:.Mp$r>7$/$G$7$g$&!#$G$9$+$i!"$b$A$m$s!"K\Ev(B -$B$K(B $BAw$7$?$$$H$-$KMQ$$$i$l$^$9!#(B -($B$b$7$"$J$?$,!"(B@code{$B%k!<%H(B} (root) $B$G$"$j!"(B -@code{$B%]%9%H%^%9%?!<(B} (postmaster) $B$G$b$"$j!"(B@code{$B%k!<%H(B} $B$K(B @code{$B%]%9(B -$B%H%^%9%?!<(B} $B$X$N%a!<%k$rl9g$O!"$=$l(B -$B$r(B @code{$B%]%9%H%^%9%?!<(B} $B$K$b:FAw$7$?$$$H;W$&$G$7$g(B -$B$&!#(BOrdnung mu,A_(B sein!) - -$B$3$NL?Na$O%W%m%;%9(B/$B@\F,0z?t$N=,47$K=>$$$^$9(B (@pxref{Process/Prefix})$B!#(B - -@item S O m -@kindex S O m ($B35N,(B) -@findex gnus-summary-digest-mail-forward -$B8=:_$N0lO"$N5-;v(B (@pxref{Decoding Articles}) $B$NMWLs$r:n$j!"%a!<%k$G$=$N(B -$B7k2L$rAw$j$^$9(B (@code{gnus-summary-digest-mail-forward})$B!#$3$NL?Na$O%W%m(B -$B%;%9(B/$B@\F,0z?t$N=,47$K=>$$$^$9(B (@pxref{Process/Prefix})$B!#(B - -@item S M-c -@kindex S M-c ($B35N,(B) -@findex gnus-summary-mail-crosspost-complaint -@cindex crossposting -@cindex excessive crossposting -$B8=:_$N5-;v$N=q$-j%/%m%9%]%9%H$X$N6l>p$N%a!<%k$rAw$j$^(B -$B$9(B (@code{gnus-summary-mail-crosspost-complaint})$B!#(B - -@findex gnus-crosspost-complaint -$B$3$NL?Na$O!"8=:_(B Usenet $B$K2#9T$7$F$$$k!"%/%m%9%]%9%H$N@$3&E*N.9T$KBP$7$F(B -$BH?7b$r9T$&$$!"$=$l$>$l(B -$B$N%a!<%k$rAw$kA0$KAw?.$9$k$+$I$&$+$N3NG'$r$7$^$9!#(B -@end table - -$B$^$?(B @pxref{(message)Header Commands} $B$K$5$i$J$k>pJs$,$"$j$^$9!#(B - -@node Summary Post Commands -@subsection $B35N,$NEj9FL?Na(B -@cindex post -@cindex composing news - -$B%K%e!<%9$N5-;v$rEj9F$9$k$?$a$NL?Na(B: - -@table @kbd -@item S p -@itemx a -@kindex a ($B35N,(B) -@kindex S p ($B35N,(B) -@findex gnus-summary-post-news -@c @icon{gnus-summary-post-news} -$B8=:_$N%0%k!<%W$K5-;v$rEj9F$7$^$9(B (@code{gnus-summary-post-news})$B!#(B - -@item S f -@itemx f -@kindex f ($B35N,(B) -@kindex S f ($B35N,(B) -@findex gnus-summary-followup -@c @icon{gnus-summary-followup} -$B8=:_$N5-;v$N%U%)%m!<%"%C%W$rEj9F$7$^$9(B (@code{gnus-summary-followup})$B!#(B - -@item S F -@itemx F -@kindex S F ($B35N,(B) -@kindex F ($B35N,(B) -@c @icon{gnus-summary-followup-with-original} -@findex gnus-summary-followup-with-original -$BK\5-;v$rAw$7$^(B -$B$9(B (@code{gnus-summary-post-forward})$B!#@\F,0z?t$,M?$($i$l$?$H$-$O!"E>Aw(B -$B5-;v$N%X%C%@!<$r40A4$KpJs$,$"$j$^$9!#(B - -@c FIXME this is not implemented -@node Summary Message Commands -@subsection $B35N,%a%C%;!<%8L?Na(B - -@table @kbd -@item S y -@kindex S y ($B35N,(B) -@findex gnus-summary-yank-message -$B8=:_$N5-;v$r4{$KB8:_$9$k(B Message $B:n@.%P%C%U%!$KE=$jIU$1$^(B -$B$9(B (@code{gnus-summaryyank-message})$B!#$3$NL?Na$OE=$jIU$1$?$$%a%C%;!<%8%P%C(B -$B%U%!$NF~NO$rB%$7!"%W%m%;%9(B/$B@\F,<-$N=,47$rM}2r$7$^(B -$B$9(B (@pxref{Process/Prefix})$B!#(B -@end table - -@node Canceling and Superseding -@subsection $B5-;v$rC$9(B -@cindex canceling articles -@cindex superseding articles - -$B2?$+$r=q$$$?8e$G!"K\Ev$K!"K\Ev$K!"$[(B $B$s(B $B$H(B $B$&(B $B$K$=$l$rEj9F$7$F$$$J$1$l$P(B -$B$J$!$H;W$C$?$3$H$O$"$j$^$;$s$+!#(B - -$B$(!<$H!"%a!<%k$OC$9$3$H$O$G$-$J$$$N$G$9$,!"%K%e!<%9$NEj9F$OC$9(B -$B$3$H$,$G$-$^$9!#(B - -@findex gnus-summary-cancel-article -@kindex C ($B35N,(B) -@c @icon{gnus-summary-cancel-article} -$BC$7$?$$5-;v$r8+$D$1$F$/$@$5$$(B ($BC$9$3$H$,$G$-$k$N$O<+J,$N5-;v$@(B -$B$1$G$9!#JQ$J$3$H$O;n$5$J$$$G$/$@$5$$(B)$B!#$=$l$+$i!"(B -@kbd{C} $B$+(B @kbd{S c} $B$r2!$7$F$/$@$5(B -$B$$(B (@code{gnus-summary-cancel-article})$B!#$"$J$?$N5-;v$,C$5$l$^(B -$B$9!=!=@$3&Cf$N5!3#$,$"$J$?$N5-;v$rC$7$^$9!#$3$NL?Na$O%W%m%;%9(B/$B@\F,(B -$B0z?t$N=,47$rMQ$$$^$9(B (@pxref{Process/Prefix})$B!#(B - -$B$7$+$7!"Cm0U$7$F$[$7$$$N$O$9$Y$F$N%5%$%H(B (site) $B$,C$7$r07$C$F$$$k$o(B -$B$1$G$O$J$$$3$H$G$9!#$G$9$+$i!"$?$$$F$$$N%5%$%H$,LdBj$N5-;v$rC$7$F$b!"(B -$B$"$A$3$A$G$"$J$?$N5-;v$O@8$-;D$k$+$b$7$l$^$;$s!#(B - -Gnus $B$O!"C$9$H$-$K!X8=:_!Y$NA*BrJ}K!$r;H$$$^$9!#I8=`$NEj9FJ}K!$r;H(B -$B$$$?$$$N$G$"$l$P!"J8;z@\F,0z?t(B @samp{a} $B$r;H$C$F$/$@$5(B -$B$$(B (@pxref{Symbolic Prefixes})$B!#(B - -$B$b$72?$+4V0c$$$r$7$?$N$K5$IU$$$F!"D{@5$r$7$?$$$N$G$"$l$P!"(B -@dfn{$BBeBX(B} (@dfn{superseding}) $B5-;v$rEj9F$7$FK\5-;v$rCV$-49$($k$3$H$,$G(B -$B$-$^$9!#(B - -@findex gnus-summary-supersede-article -@kindex S ($B35N,(B) -$BK\5-;v$N$H$3$m$X0\F0$7$F!"(B@kbd{S s} $B$r2!$7$F$/$@$5(B -$B$$(B (@code{gnus-summary-supersede-article})$B!#IaDL$NJ}K!$G$=$l$rAw$kA0$K!"(B -$B5-;v$r9%$-$J$h$&$KJT=8$9$k$3$H$,$G$-$^$9!#BeBX$K4X$7$F$b!"C$7$HF1$8(B -$B$3$H$,Ev$F$O$^$j$^$9!#$3$A$i$NJ}$,$b$C$H$h$/Ev$F$O$^$k$+$b$7$l$^$;(B -$B$s(B: $B$$$/$D$+$N%5%$%H$OBeBX$rl9g!"5-;v$,:G=i$K$"(B -$B$J$?$N%5%$%H$K8=$l$kA0$KC$7(B/$BBeBX$r$9$k$?$a$N9*L/$JH$7$F2<$5$$!#(B - -@item -$B;~9o!#(Bam/pm $B$r4^$^$J$$(B 24 $B;~4V@)$N!"(B@code{hh:mm} $B$N7A<0$GM?$($^$9!#Aw?.(B -$B$5$l$k$N$O:#F|$N$=$N;~9o$G$9$,!"$9$G$K$=$N;~9o$r2a$.$F$7$^$C$F$$$?>l9g$O(B -$BMbF|$N$=$N;~9o$K$J$j$^$9!#$G$9$+$i!"D+$N(B 10 $B;~$K(B @code{11:15} $B$r;XDj$7$?(B -$B>l9g$O(B 1$B;~4V(B15$BJ,8e$KAw?.$5$l$k$3$H$K$J$j$^$9!#$7$+$7(B @code{9:20} $B$r;XDj(B -$B$7$?>l9g$OMbF|$N;~9o$r0UL#$7$^$9!#(B -@end itemize - -@code{gnus-delay-article} $B$NF0:n$O!"0J2<$N?t8D$NJQ?t$K1F6A$5$l$^$9(B: - -@table @code -@item gnus-delay-default-hour -@vindex gnus-delay-default-hour -$BFCDj$NF|IU$r;XDj$7$?>l9g$K!"%a%C%;!<%8$,$=$NF|$N2?;~$KAw?.$5$l$k$+$rM?$((B -$B$^$9!#2DG=$JCM$O(B 0 $B$+$i(B 23 $B$^$G$N@0?t$G$9!#(B - -@item gnus-delay-default-delay -@vindex gnus-delay-default-delay -$B%G%#%U%)%k%H$NCY1d$rM?$($kJ8;zNs$G$9!#A0=R$N$I$s$J7A<0$G$b2DG=$G$9!#(B - -@item gnus-delay-group -@vindex gnus-delay-group -$BCY1d5-;v$O!"%I%i%U%H%5!<%P!<$N$3$N%0%k!<%W$K4|8B$,Mh$k$^$GJ]4I$5$l$^$9!#(B -$B$?$V$s$"$J$?$O$3$l$rJQ99$9$kI,MW$OL5$$$G$7$g$&!#%G%#%U%)%k%H$NCM(B -$B$O(B @code{"delayed"} $B$G$9!#(B - -@item gnus-delay-header -@vindex gnus-delay-header -$B$=$l$>$l$N5-;v$,Aw?.$5$l$kF|;~$O%X%C%@!<$K5-O?$5$l$^$9!#$3$NJQ?t$O%X%C%@!<(B -$BL>$NJ8;zNs$G$9!#$?$V$s$"$J$?$O$3$l$rJQ99$9$kI,MW$OL5$$$G$7$g$&!#%G%#%U%)(B -$B%k%H$NCM$O(B @code{"X-Gnus-Delayed"} $B$G$9!#(B -@end table - -$BAw?.$N@h1d$P$7$O$3$s$J$U$&$K9T$J$o$l$^$9(B: - -@code{gnus-delay-article} $B%3%^%s%I$G!"$"$J$?$O$I$N$/$i$$CY$i$;$k$+$r;XDj(B -$B$7$^$9!#(Bgnus $B$O%a%C%;!<%8$rAw?.$9$kF|;~$r7W;;$7(B -$B$F(B @code{X-Gnus-Delayed} $B%X%C%@!<$K5-O?$7!"$=$N%a%C%;!<%8(B -$B$r(B @code{nndraft:delayed} $B%0%k!<%W$KG<$a$^$9!#(B - -$B$"$J$?$,?7Ce%K%e!<%9$rj$J$/$i$$$NL?Na$,$"$j$^$9(B: -@end ifinfo - -@menu -* Setting Marks:: $B0u$NIU$1J}$H>C$7J}(B -* Generic Mark Commands:: $B0u$r$I$N$h$&$K%+%9%?%^%$%:$9$k$+(B -* Setting Process Marks:: $B8e$No$K2D;k>uBV$G$"$k5-;v$N$3$H$G$9!#$*$b$7$m$$$H;W$&5-(B -$B;v$,$"$C$?>l9g$d!"C1$KFI$`$N$r@h$K1d$P$7$?$$$H$-$d!"8e$GJVEz$r$7$?$$$H$-(B -$B$K!"IaDL$O2D;k0u$rIU$1$^$9!#$7$+$7!"5-;v$O4|8B@Z$l>C5n$5$l$k$3$H$b$"$j$^(B -$B$9(B ($B%K%e!<%9%5!<%P!<$N%=%U%H%&%'%"$,%K%e!<%9%5!<%P!<>e$N5-;v$r>C5n!"(B -gnus $B<+BN$O2D;k5-;v$r4|8B@Z$l>C5n$7$^$;$s(B) $B$N$G!"1J1s$K5-;v$rJ]B8$7$F$*(B -$B$-$?$$>l9g$O!"$=$N5-;v$r1JB3$K$9$kI,MW$,$"$j$^(B -$B$9(B (@pxref{Persistent Articles})$B!#(B - -@item ? -@vindex gnus-dormant-mark -$BJ]N1$H$7$F0u$rIU$1$^$9(B (@code{gnus-dormant-mark})$B!#(B - -@dfn{$BJ]N15-;v(B}$B$O%U%)%m!<%"%C%W$,$"$C$?$H$-$K$@$135N,%P%C%U%!$K8=$l$^$9!#(B -$B%U%)%m!<%"%C%W$,L5$$$H$-$bI=<($5$;$?$$$H$-$O!"L?Na(B @kbd{/ D} $B$r;H$&$3$H(B -$B$,$G$-$^$9!#$=$l0J30$O(B ($B8+$($k$+$I$&$+$OJL$K$7$F(B)$B!"2D;k5-;v(B (Ticked) $B$H(B -$B;w$?$h$&$J$b$N$G$9!#(B - -@item SPACE -@vindex gnus-unread-mark -$BL$FI$H$7$F0u$rIU$1$^$9(B (@code{gnus-unread-mark})$B!#(B - -@dfn{$BL$FI5-;v(B}$B$O:#$^$GA4$/FI$^$l$F$$$J$$5-;v$N$3$H$G$9!#(B -@end table - -@node Read Articles -@subsection $B4{FI5-;v(B -@cindex expirable mark - -$B0J2<$N$9$Y$F$N0u$O5-;v$K4{FI$N0u$rIU$1$^$9!#(B - -@table @samp -@item r -@vindex gnus-del-mark -$BMxMQC$5$l$?5-;v(B (@code{gnus-canceled-mark})$B!#(B - -@item F -@vindex gnus-souped-mark -@sc{soup} $B$5$l$F$$$k5-;v(B (@code{gnus-souped-mark})$B!#(B@xref{SOUP}. - -@item Q -@vindex gnus-sparse-mark -$B$^$P$i$K;2>H$5$l$?5-;v(B (@code{gnus-sparse-mark})$B!#(B -@xref{Customizing Threading}. - -@item M -@vindex gnus-duplicate-mark -$B=EJ#M^@)$K$h$j4{FI$N0u$N$D$$$?5-;v(B (@code{gnus-duplicate-mark})$B!#(B -@xref{Duplicate Suppression}. -@end table - -$B$3$l$i$N$9$Y$F$N0u$O!"K\Ev$O$?$@5-;v$,4{FI$H$7$F0u$,$D$$$F$$$k$3$H$r0UL#(B -$B$9$k$@$1$G$9!#E,1~%9%3%"%j%s%0$r$7$?$H$-$K$O0c$C$?$h$&$K2r$N0u(B -@cindex process mark -@cindex bookmarks - -$B5-;v$,FI$^$l$?$+$I$&$+$K$O4X78$7$J$$0u$,$$$/$D$+$"$j$^$9!#(B - -@itemize @bullet - -@item -$B8=:_$N5-;v$K$7$*$j$r64$`$3$H$,$G$-$^$9!#$"$J$?$OG-$NG"$N=,47$K4X$9$kD9$$(B -$BO@J8$rFI$s$G$$$F!"$=$l$rFI$_=*$o$kA0$KMAw$7$?5-;v$O$9$Y$FFs7eL\$K(B @samp{F} $B$N0u$,$D$-$^(B -$B$9(B (@code{gnus-forwarded-mark})$B!#(B - -@vindex gnus-recent-mark -$B$=$N%0%k!<%W$G(B ``$B:G6a(B'' (``recently'') $BFO$$$?5-;v$OFs7eL\$K(B @samp{N} $B$N(B -$B$N0u$,$D$-$^$9(B (@code{gnus-recent-mark})$B!#$?$$$F$$$N%P%C%/%(%s%I$O$3$N0u(B -$B$r%5%]!<%H$;$:!"$=$N>l9g$OI=<($5$l$^$;$s!#(B - -@item -@vindex gnus-cached-mark -$B5-;v%-%c%C%7%e$KCy$a$i$l$F$$$k5-;v$OFs7eL\$K(B @samp{*} $B$N0u$,$D$-$^(B -$B$9(B (@code{gnus-replied-mark})$B!#(B@xref{Article Caching}. - -@item -@vindex gnus-saved-mark -($B2?$i$+$NJ}K!$K$h$C$F!(I,$:$7$b=!65E*$H$$$&$o$1$G$O$J$/(B) $B!XJ]B8$5$l$?!Y(B -$B5-;v$OFs7eL\$K(B @samp{S} $B$N0u$,$D$-$^$9(B (@code{gnus-saved-mark})$B!#(B - -@item -@vindex gnus-unseen-mark -$B$^$@FI$^$l$?$3$H$,$J$$5-;v$OFs7eL\$K(B @samp{.} $B$N0u$,$D$-$^(B -$B$9(B (@code{gnus-unseen-mark})$B!#(B - -@item -@vindex gnus-not-empty-thread-mark -@vindex gnus-empty-thread-mark -$B$b$7(B @samp{%e} $B$N;EMM$,;H$o$l$k$H!"%9%l%C%I$,$"$k$+$I$&$+$O!";07eL\(B -$B$K(B @code{gnus-not-empty-thread-mark} $B$H(B @code{gnus-empty-thread-mark} $B$N(B -$B$=$l$>$l$K$h$C$F0u$,$D$-$^$9!#(B - -@item -@vindex gnus-process-mark -$B:G8e$K(B @dfn{$B%W%m%;%90u(B} $B$,$"$j$^$9(B(@code{gnus-process-mark})$B!#$$$m$$$m$J(B -$Bl9g!"$I$N$h$&$K$J$k$N$G$7$g$&(B? - -$B$?$$$7$?$3$H$O$"$j$^$;$s!#M%@h=g0L$Ol9g!"%-%c%C%7%e0u$,$"$k$@$1$G!"JVEz:Q$_0u$O$"$j$^(B -$B$;$s!#(B - -@node Setting Marks -@subsection $B0u$rIU$1$k(B -@cindex setting marks - -$B$9$Y$F$N0u$D$1L?Na$O?tCM@\F,0z?t$rC5n$7$^(B -$B$9(B (@code{gnus-summary-clear-mark-forward})$B!#MW$9$k$K!"5-;v$KL$FI$N0u$r(B -$BIU$1$^$9!#(B - -@item M t -@itemx ! -@kindex ! ($B35N,(B) -@kindex M t ($B35N,(B) -@findex gnus-summary-tick-article-forward -$B8=:_$N5-;v$K2D;k5-;v0u$rIU$1$^(B -$B$9(B (@code{gnus-summary-tick-article-forward})$B!#(B@xref{Article Caching}. - -@item M ? -@itemx ? -@kindex ? ($B35N,(B) -@kindex M ? ($B35N,(B) -@findex gnus-summary-mark-as-dormant -$B8=:_$N5-;v$KJ]N15-;v0u$rIU$1$^(B -$B$9(B (@code{gnus-summary-mark-as-read-forward})$B!#(B@xref{Article Caching}. - -@item D -@kindex D ($B35N,(B) -@findex gnus-summary-mark-as-read-backward -$B8=:_$N5-;v$K4{FI$N0u$rIU$1!"A0$N9T$K%]%$%s%H$r0\F0$7$^(B -$B$9(B (@code{gnus-summary-mark-as-read-backward})$B!#(B - -@item M k -@itemx k -@kindex k ($B35N,(B) -@kindex M k ($B35N,(B) -@findex gnus-summary-kill-same-subject-and-select -$B8=:_$N5-;v$HF1$8I=Bj$r;}$D$9$Y$F$N5-;v$r4{FI$H$7$F0u$rIU$1!"C5n$7$^$9(B (@code{gnus-summary-clar-above})$B!#(B - -@item M V u -@kindex M V u ($B35N,(B) -@findex gnus-summary-tick-above -$B=i4|@_Dj$N%9%3%"(B ($B$b$7$/$O?tCM@\F,0z?t(B) $B$h$j$bBg$-$$%9%3%"$r;}$D$9$Y$F$N(B -$B5-;v$K2D;k0u$rIU$1$^$9(B (@code{gnus-summary-tick-above})$B!#(B - -@item M V m -@kindex M V m ($B35N,(B) -@findex gnus-summary-mark-above -$B0u$NF~NO$rB%$7!"=i4|@_Dj$N%9%3%"(B ($B$b$7$/$O?tCM@\F,0z?t(B) $B$h$j$bBg$-$J%9%3(B -$B%"$r;}$D$9$Y$F$N5-;v$K$=$N0u$rIU$1$^$9(B (@code{gnus-summary-mark-above})$B!#(B -@end table - -@vindex gnus-summary-goto-unread -$BJQ?t(B @code{gnus-summary-goto-unread} $B$O0u$,IU$1$i$l$?8e$K$I$N$h$&$JF0:n(B -$B$,$J$5$l$k$+$r7hDj$7$^$9!#$b$7(B @code{nil} $B$G$J$$$H!"%]%$%s%H$Oe$+2<$K9T$/(B -$B$@$1$G$9!#FCJL$J>l9g$H$7$F!"$3$NJQ?t$,(B @code{never} $B$G$"$k$H!"$9$Y$F$N0u(B -$B$rIU$1$kL?Na$H(B (@kbd{SPACE} $B$N$h$&$J(B) $BB>$NL?Na$O$N(B -$B8=:_$N5-;v$KN1$^$C$F$b$i$$$?$$?M$b$$$k$G$7$g$&!#$=$7$F!"$^$@A0$N(B ($BL$(B -$BFI(B) $B5-;v$K9T$C$F$[$7$$?M$,$$$k$H$OJ9$$$?$3$H$O$"$j$^$;$s$,!"$=$&$7$?$$$H(B -$B;W$&?M$b4V0c$$$J$/$$$k$H;W$$$^$9!#(B - -$B$3$N8^$D$NF0:n$r8^$D$N0c$C$?0uIU$1L?Na$H3]$1;;$9$k$H!"$I$NL?Na$,2?$r$9$Y(B -$B$-$+$NHs>o$KJ#;($JJQ?t$NAH$r$b$D$3$H$K$J$j$^$9!#(B - -$B$3$NHa7`$+$iF($l$k$?$a$K!"(Bgnus $B$O$3$l$i$9$Y$F$N0c$C$?$3$H$r$9$kL?Na$rDs(B -$B6!$7$^$9!#$3$l$i$O35N,%P%C%U%!$N(B @kbd{M M} $B%^%C%W$K$"$j$^$9!#A4$F$r$_$k(B -$B$?$a$K$O(B @kbd{M M C-h} $B$rF~NO$7$F$/$@$5$$(B---$B$3$N%^%K%e%"%k$G0lMw$r=P$9$K(B -$B$OB?2a$.$^$9!#(B - -$B$3$l$i$NL?Na$rD>@\;H$&$3$H$O$G$-$^$9$,!"$[$H$s$I$NMxMQl9g$O!"(B -$B$=$N5-;v$@$1$rL$A*Br$K$7$^$9!#$=$N9T$N%9%l%C%I$+5-;v$rL$A*Br$K$9$k$?$a$K(B -$B$3$N%-!<$K?tCM@\F,0z?t$rM?$($k;v$,$G$-$^$9!#(B - -@item M P u -@itemx M-# -@kindex M P u ($B35N,(B) -@kindex M-# ($B35N,(B) -$B$b$78=:_$N5-;v$K%W%m%;%90u$,$"$l$PH$7$F2<$5$$!#(B - -@node Limiting -@section $B@)8B$r$9$k(B -@cindex limiting - -$B35N,%P%C%U%!$,8=:_%0%k!<%W$K$"$k5-;v$N0lIt$@$1$rI=<($9$k$h$&$K@)8B$G$-$l(B -$B$PJXMx$J$3$H$,$"$j$^$9!#B?$/$N@)8BL?Na$,;}$D8z2L$O35N,%P%C%U%!$+$i>/(B -$B$7(B ($B$b$7$/$OB?$/(B) $B$N5-;v$r35N,%P%C%U%!$+$i:o=|$9$k$3$H$G$9!#(B - -$B$9$Y$F$N@)8BL?Na$O%5!<%P!<$+$i4{$K\:Y$O(B @pxref{Group Parameters} $B$r;2>H$7$F2<$5$$!#(B - -@item / E -@itemx M S -@kindex M S ($B35N,(B) -@kindex / E ($B35N,(B) -@findex gnus-summary-limit-include-expunged -$B$9$Y$F$N>C5n$5$l$?5-;v$rI=<($7$^(B -$B$9(B (@code{gnus-summary-limit-include-expunged})$B!#(B - -@item / D -@kindex / D ($B35N,(B) -@findex gnus-summary-limit-include-dormant -$B$9$Y$F$NJ]N15-;v$rI=<($7$^$9(B (@code{gnus-summary-limit-include-dormant})$B!#(B - -@item / * -@kindex / * ($B35N,(B) -@findex gnus-summary-limit-include-cached -$B$9$Y$F$N%-%c%C%7%e$KF~$C$F$$$k5-;v$rI=<($7$^(B -$B$9(B (@code{gnus-summary-limit-include-cached})$B!#(B - -@item / d -@kindex / d ($B35N,(B) -@findex gnus-summary-limit-exclude-dormant -$B$9$Y$F$NJ]N15-;v$r1#$7$^$9(B (@code{gnus-summary-limit-exclude-dormant})$B!#(B - -@item / M -@kindex / M ($B35N,(B) -@findex gnus-summary-limit-exclude-marks -$BA4$F$N0uIU$-5-;v$r=|30$7$^$9(B (@code{gnus-summary-limit-exclude-marks})$B!#(B - -@item / T -@kindex / T ($B35N,(B) -@findex gnus-summary-limit-include-thread -$B8=:_$N%9%l%C%I$N$9$Y$F$N5-;v$rI=<($7$^(B -$B$9(B (@code{gnus-summary-limit-include-thread})$B!#(B - -@item / c -@kindex / c ($B35N,(B) -@findex gnus-summary-limit-exclude-childless-dormant -$B;R5-;v$NL5$$$9$Y$F$NJ]N15-;v$r1#$7$^(B -$B$9(B (@code{gnus-summary-limit-exclude-childless-dormant})$B!#(B - -@item / C -@kindex / C ($B35N,(B) -@findex gnus-summary-limit-mark-excluded-as-read -$B$9$Y$F$NL$FI$N$_$N0u$N5-;v$r4{FI$H$7$F0u$rIU$1$^(B -$B$9(B (@code{gnus-summary-limit-mark-excluded-as-read})$B!#$b$7@\F,0z?t$,M?$((B -$B$i$l$l$P!"2D;k$HJ]N1$N$_$N0u$N5-;v$b4{FI$H$7$F0u$rIU$1$^$9!#(B -@end table - -@node Threading -@section $B%9%l%C%I(B -@cindex threading -@cindex article threading - -Gnus $B$O=i4|@_Dj$G5-;v$r%9%l%C%I$K$7$^$9!#(B@dfn{$B%9%l%C%I$K$9$k(B} $B$H$O!"$"$k(B -$B5-;v$X$N1~Ez$r1~Ez$7$?5-;v$ND>8e$KCV$/!=!=3,AXE*N.57$G(B $B$H$$$&$3$H$G$9!#(B - -$B%9%l%C%I$O5-;v$N(B @code{References} $BMs$rD4$Y$k$3$H$K$h$C$F9T$o$l$^$9!#40(B -$BA4$J@$3&$G$O!"$3$l$@$1$GNI$$LZ$r:n$j>e$2$k$N$K==J,$J$N$G$9$,!"IT1?$J$3$H(B -$B$K!"(B@code{References} $BMs$O$7$P$7$P2u$l$F$$$k$+!";~$K$OC1$K$J$$$H$$$&$3$H(B -$B$,$"$j$^$9!#IT;W5D$J%K%e!<%9$NA}?#$,LdBj$rA}$d$7$^$9$N$G!"4n$P$7$$7k2L$r(B -$BF@$k$?$a$K$OB>$NH/8+K!$r:NMQ$7$J$1$l$P$J$j$^$;$s!#2a>j$JBP:vK!$OB8:_$7$F(B -$B$$$F!"$=$N62$k$Y$->\:Y$O(B @pxref{Customizing Threading} $B$K>\$7$/=q$$$F$"(B -$B$j$^$9!#(B - -$B$^$:!"35G0$N354Q$G$9(B: - -@table @dfn -@item $B:,K\(B (root) -$B%9%l%C%I$G0lHVD:E@$K$"$k5-;v$G$9!(%9%l%C%I$N:G=i$N5-;v$G$9!#(B - -@item $B%9%l%C%I(B (thread) -$BLZ$N$h$&$J5-;v$N9=@.$G$9!#(B - -@item $BItJ,%9%l%C%I(B (sub-thread) -$BLZ$N$h$&$J9=B$$N(B ($B$h$j(B) $B>.$5$JItJ,$G$9!#(B - -@item $BL5B+G{%9%l%C%I(B (loose threads) -$B5-;v$N4|8B@Z$l:o=|$d!":,K\$,4{$KA02s$N%;%C%7%g%s$GFI$^$l$?$3$H$K$h$j35N,(B -$B%P%C%U%!$KI=<($5$l$J$$!"Ey$NM}M3$K$h$j!"%9%l%C%I$O$7$P$7$P:,K\$r<:$$$^$9!#(B -$B$=$N$h$&$J$H$-$K$O!"IaDL$OB?$/$NItJ,%9%l%C%I$,$"$C$F!"K\Ev$O0l$D$N%9%l%C(B -$B%I$KB0$7$F$$$k$N$G$9$,!":,K\$K$O$D$J$,$C$F$$$J$$!"$H$$$&$3$H$K$J$j$^$9!#(B -$B$3$&$$$&%9%l%C%I$,L5B+G{%9%l%C%I$H8F$P$l$F$$$^$9!#(B - -@item $B%9%l%C%I=8$a(B (thread gathering) -$B$^$P$i%9%l%C%I$rBg$-$J%9%l%C%I$K=8$a$h$&$H$9$k;n$_$G$9!#(B - -@item $B$^$P$i%9%l%C%I(B (sparse threads) -$BL5$$5-;v$,!X?dB,$5$l$?!Y%9%l%C%I$G!"35N,%P%C%U%!$K6u9T$GI=<($5$l$^$9!#(B -@end table - -@menu -* Customizing Threading:: $BJQ992DG=$J%9%l%C%I$K1F6A$9$kJQ?t(B -* Thread Commands:: $B35N,%P%C%U%!$G$N%9%l%C%I$K4p$E$$$?L?Na(B -@end menu - -@node Customizing Threading -@subsection $B%9%l%C%I$r%+%9%?%^%$%:$9$k(B -@cindex customizing threading - -@menu -* Loose Threads:: Gnus $B$,L5B+G{%9%l%C%I$r=8$a$FBg$-$J%9%l%C(B - $B%I$K$9$kJ}K!(B -* Filling In Threads:: $B%9%l%C%I$rKd$a$k(B -* More Threading:: $B%9%l%C%I$r$$$8$/$k$5$i$KB?$/$NJQ?t(B -* Low-Level Threading:: $B$3$l$G=*$o$C$?$H;W$C$?$G$7$g$&(B... $B$G$b$"(B - $B$J$?$O4V0c$C$F$$$?(B! -@end menu - -@node Loose Threads -@subsubsection $BL5B+G{%9%l%C%I(B -@cindex < -@cindex > -@cindex loose threads - -@table @code -@item gnus-summary-make-false-root -@vindex gnus-summary-make-false-root -$B$b$7(B @code{nil} $B$G$J$$$H!"(Bgnus $B$OA4$F$N$D$J$,$C$F$$$J$$ItJ,LZ$r0l$D$NBg(B -$B$-$JLZ$K$7$F!"D:>e$K$_$;$+$1$N:,K\$r:n$j$^$9!#(B($B$A$g$C$HBT$C$F$/$@$5$$!#(B -$BD:>e$K:,85(B (root) $B$G$9$C$F(B? $B$($(!"$=$&$J$N$G$9!#(B) $B$D$J$,$C$F$$$J$$ItJ,LZ(B -$B$OK\Ev$N:,K\$,4|8B@Z$l:o=|$5$l$?$+!"A02s$N%;%C%7%g%s$G:,K\$rFI$s$@$j:o=|(B -$B$7$?$H$-$K$G$-$^$9!#(B - -$BK\Ev$N%9%l%C%I$,L5$$$H$-$O!"(Bgnus $B$O2?$+$G$C$A>e$2$r$9$kI,MW$,$"$j$^$9!#(B -$B$3$NJQ?t$O(B gnus $B$,;H$&$Y$-$4$^$+$7$NJ}K!$r<($7$F$$$^$9!#CM$H$7$F$H$k$3$H(B -$B$,$G$-$k;M$D$N8uJd$,$"$j$^$9!#(B - -@iftex -@iflatex -\gnusfigure{The Summary Buffer}{390}{ -\put(0,0){\epsfig{figure=tmp/summary-adopt.ps,width=7.5cm}} -\put(445,0){\makebox(0,0)[br]{\epsfig{figure=tmp/summary-empty.ps,width=7.5cm}}} -\put(0,400){\makebox(0,0)[tl]{\epsfig{figure=tmp/summary-none.ps,width=7.5cm}}} -\put(445,400){\makebox(0,0)[tr]{\epsfig{figure=tmp/summary-dummy.ps,width=7.5cm}}} -} -@end iflatex -@end iftex - -@cindex adopting articles - -@table @code -@item $BM\;R(B (adopt) -Gnus $B$O:G=i$N8I;y$r?F$K$7$^$9!#$3$N?F$O$9$Y$F$NB>$N5-;v$rM\;R$K$7$^$9!#(B -$B$3$NM\;R5-;v$O!"I8=`$N3Q3g8L(B (@samp{[]}) $B$NBe$o$j$K!"@h$N@m$C$?3g(B -$B8L(B (@samp{<>}) $B$G0uIU$1$i$l$^$9!#$3$l$,=i4|@_Dj$NJ}K!$G$9!#(B - -@item $B$_$;$+$1(B (dummy) -@vindex gnus-summary-dummy-line-format -Gnus $B$O?F$N$U$j$r$9$k$_$;$+$1$N35N,9T$r$D$/$j$^$9!#$_$;$+$1$N9T$O$I$NK\(B -$BEv$N5-;v$K$bBP1~$7$^$;$s$N$G!"$=$l$rA*Br$9$k$3$H$O!"$_$;$+$1$N5-;v$N8e$N(B -$B:G=i$NK\Ev$N5-;v$rA*Br$r$9$k$@$1$K$J$j$^$9!#$_$;$+$1$N:,K\$NMM<0$r;XDj(B -$B$9$k$?$a$K!"(B@code{gnus-summary-dummy-line-format} $B$,;H$o$l$^$9!#$3$l$O$?$C(B -$B$?0l$D$@$1$N%U%)!<%^%C%H$N;EMM$r$N5-;v$r(B -$BI=<($9$k$@$1$G$9!#(B - -@item nil -$BL5B+G{%9%l%C%I$r=8$a$^$;$s!#(B -@end table - -@item gnus-summary-gather-subject-limit -@vindex gnus-summary-gather-subject-limit -$BL5B+G{%9%l%C%I$O5-;v$NI=Bj$rHf3S$9$k$3$H$K$h$C$F=8$a$i$l$^$9!#$b$7$3$NJQ(B -$B?t$,(B @code{nil} $B$G$"$k$H!"(Bgnus $B$OL5B+G{%9%l%C%I$r0l$D$NBg$-$JD6%9%l%C%I(B -$B$K=8$a$kA0$K!"L5B+G{%9%l%C%I$NI=Bj$,40A4$K0lCW$9$k$3$H$rMW5a$7$^$9!#$3$l(B -$B$O!"D9$$I=Bj$N9T$r@Z$jMn$H$7$F$7$^$&4VH4$1$J%K%e!<%9%j!<%@!<$,B8:_$9$k8=(B -$B:_$G$O!"$"$^$j$K87$7$$MW5a$+$bCN$l$^$;$s!#$b$7$=$&;W$&$N$J$i!"$3$NJQ?t$r(B -$BNc$($P(B 20 $B$K@_Dj$7$F!"I=Bj$N:G=i$N(B 20 $BJ8;z$@$1$,0lCW$9$k$3$H$rMW5a$9$k$h(B -$B$&$K$9$k$3$H$,$G$-$^$9!#$3$NJQ?t$rK\Ev$KDc$$?t;z$K@_Dj$9$k$H!"(Bgnus $B$,L\(B -$B$KF~$kA4$F$r0l$D$N%9%l%C%I$K=8$a$k$N$r8+$k$3$H$,$G$-$k$G$7$g$&!#$=$7$F!"(B -$B$=$l$O$"$^$jM-MQ$G$O$"$j$^$;$s!#(B - -@cindex fuzzy article gathering -$B$3$NJQ?t$rFCJL$JCM(B @code{fuzzy} $B$K@_Dj$9$l$P!"(Bgnus $B$OI=Bj$K$"$$$^$$$JJ8(B -$B;zNsHf3S%"%k%4%j%:%`$r;H$$$^$9(B (@pxref{Fuzzy Matching})$B!#(B - -@item gnus-simplify-subject-fuzzy-regexp -@vindex gnus-simplify-subject-fuzzy-regexp -$B$3$l$O@55,I=8=$+!"$"$$$^$$I=Bj;XDj$,;H$o$l$F$$$k$H$-$KI=Bj$+$i9gCW$7$?$b(B -$B$N$, -@lisp -(setq gnus-simplify-ignored-prefixes - (concat - "\\`\\[?\\(" - (mapconcat - 'identity - '("looking" - "wanted" "followup" "summary\\( of\\)?" - "help" "query" "problem" "question" - "answer" "reference" "announce" - "How can I" "How to" "Comparison of" - ;; ... - ) - "\\|") - "\\)\\s *\\(" - (mapconcat 'identity - '("for" "for reference" "with" "about") - "\\|") - "\\)?\\]?:?[ \t]*")) -@end lisp - -$B$3$N@55,I=8=$K9gCW$9$k$9$Y$F$N8l$O!"Fs$D$NI=Bj$rHf3S$9$kA0$Ke=q$-$7$^$9!#$3$NJQ?t$OJ8(B -$B;zNs(B @code{Subject} $B$rH?I|$7$F4JC1$J7A$K$?$I$jCe$/$?$a$KE,MQ$9$k4X?t$N%j(B -$B%9%H$G$"$kI,MW$,$"$j$^$9!#(B - -$B$3$N%j%9%H$KF~$l$FLr$KN)$D$h$&$J4X?t$OJ,$J6uGr(B (whitespace) $B$ru67$r>/$7$h$/$9$k$?$a$K!"$I$NI=Bj$,=8$a$k2a(B -$BDx$+$i=|$+$l$k$+$r7h$a$k@55,I=(B -$B8=(B @code{gnus-summary-gather-exclude-subject} $B$r;H$&$3$H$,$G$-$^$9!#%G%#(B -$B%U%)%k%H$O(B @samp{^ *$\\|^(none)$} $B$G$9!#(B - -@item gnus-summary-thread-gathering-function -@vindex gnus-summmary-thread-gathering-function -Gnus $B$O(B @code{Subject} $BMs$r8+$k$3$H$K$h$C$F%9%l%C%I$r=8$a$^$9!#$3$l$O!"(B -$B7k2LE*$KA4$/4X78$NL5$$5-;v$,F1$8!X%9%l%C%I!Y$K4^$^$l$k$3$H$,$"$k$H$$$&$3(B -$B$H$G!"$3$l$O:.Mp$N85$G$9!#BeBXZ(B -$B$7$^$9$,!"$3$o$l$?%K%e!<%9%j!<%@!<$GEj9F$7$?5-;v$OE,@Z$K=8$a$i$l$J$$$H$$(B -$B$&$3$H$G$b$"$j$^$9!#A*Br8"$O$"$J$?$K$"$j$^$9!=!=1VIB$+%3%l%i$+!#(B - -@table @code -@item gnus-gather-threads-by-subject -@findex gnus-gather-threads-by-subject -$B$3$N4X?t$O%G%#%U%)%k%H$N<}=84X?t$G!"GSB>E*$K(B @code{Subject} $B$r8+$^$9!#(B - -@item gnus-gather-threads-by-references -$B$3$N4X?t$OGSB>E*$K(B @code{References} $BMs$r8+$^$9!#(B -@end table - -@code{References} $B$K$h$C$F=8$a$k$3$H$r;n$7$F$_$?$$$N$G$"$l$P!"/$J$$35N,9T$rI=<($7$?$$$1$l$I!"$G$-$k$@$1$?$/$5$s$NHsL)%9%l%C(B -$B%I$K@\B3$7$F$*$-$?$$$H$-$O!"$3$NJQ?t$r(B @code{some} $B$+?t;z$K@_Dj$9$k$3$H(B -$B$,$G$-$^$9!#$b$7?t;z$K@_Dj$7$?$H$-$O!"$=$l$h$jB?$$DI2C$N%X%C%@!<$Ol9g$G$b!"8E$$%X%C%@!<$Nl9g$K;H$&$3$H$rA[Dj$7$F$$$^$9!#$=$l$Ol9g$O%G%#%U%)%k%H$N(B @code{nil} $B$N$^$^$K$7$F$*$/$N$,L5Fq$G(B -$B$9!#;H$$$?$$>l9g$O%0%k!<%WL>$K9gCW$9$k@55,I=8=$+!"$9$Y$F$N%0%k!<%WL>$K9g(B -$BCW$9$k(B @code{t} $B$K$7$F2<$5$$!#(B -@end table - -@node More Threading -@subsubsection $B$b$C$H%9%l%C%I$r(B - -@table @code -@item gnus-show-threads -@vindex gnus-show-threads -$B$3$NJQ?t$,(B @code{nil} $B$G$"$k$H!"%9%l%C%I$O:n$i$l$:!"$3$3$K$"$k;D$j$N$9$Y(B -$B$F$NJQ?t$OA4$/8z2L$,L5$/$J$j$^$9!#%9%l%C%I:n$j$r;_$a$k$H%0%k!<%W$NA*Br$,(B -$B>/$7B.$/$J$j$^$9$,!"5-;v$rFI$`$N$,$b$C$HCY$/!"ITJX$K$J$k$3$H$O3N/$J$$Am9gE*%9%3%"(B (@code{gnus-thread-score-function}) $B$r;}(B -$B$D$9$Y$F$N%9%l%C%I$O>C5n$5$l$^$9!#$3$NJQ?t$O%G%#%U%)%k%H$G(B -$B$O(B @code{nil} $B$G!"$3$l$O$I$N%9%l%C%I$b>C5n$5$l$J$$$H$$$&$3$H$G$9!#(B - -@item gnus-thread-hide-killed -@vindex gnus-thread-hide-killed -$B$b$7%9%l%C%I$r:o=|$7$F!"$3$NJQ?t$,(B @code{nil} $B$G$J$$$H!"ItJ,LZ$O1#$5$l$^(B -$B$9!#(B - -@item gnus-thread-ignore-subject -@vindex gnus-thread-ignore-subject -$B;~!9!"C/$+$,%9%l%C%I$N??Cf$GI=Bj$rJQ99$9$k$3$H$,$"$j$^$9!#$b$7$3$NJQ?t(B -$B$,(B @code{nil} $B$G$J$$$H!"$3$l$,%G%#%U%)%k%H$G$9$,!"I=Bj$NJQ99$OL5;k$5$l$^(B -$B$9!#$b$7(B @code{nil} $B$@$H!"I=Bj$NJQ99$r$9$k$HJL$N%9%l%C%I$K$J$j$^$9!#(B - -@item gnus-thread-indent-level -@vindex gnus-thread-indent-level -$B$3$N?t;z$OItJ,%9%l%C%I$,$I$l$/$i$$;z2<$2(B (indent) $B$5$l$k$Y$-$+$r7h$a$^$9!#(B -$B%G%#%U%)%k%H$O(B 4 $B$G$9!#(B - -@item gnus-sort-gathered-threads-function -@vindex gnus-sort-gathered-threads-function -$B$H$-$I$-!"FC$K%a!<%j%s%0%j%9%H$G!"$C$F!"I{%9%l%C(B -$B%I$r=i4|@_Dj$N(B @code{gnus-thread-sort-by-number} $B$GJB$S49$($k$H!"1~Ez$N(B -$BJ}$,$=$l$,1~Ez$7$F$$$k5-;v$h$j@h$K8=$l$k$3$H$,$"$j$^$9!#%0%k!<%W%Q%i%a!<(B -$B%?$dE,@Z$J%U%C%/(B ($BNc$($P(B @code{gnus-summary-generate-hook}) $B$G$3$NJQ?t$r(B -$BBe$o$j$NCM(B ($BNc$($P!"(B@code{gnus-thread-sort-by-date}) $B$K@_Dj$9$k$3$H$G!"(B -$B$=$N$h$&$J>l9g$K!"$h$jO@M}E*$JI{%9%l%C%I$N=gHV$r@8@.$9$k$3$H$,$G$-$^$9!#(B -@end table - -@node Low-Level Threading -@subsubsection $BDc%l%Y%k$K$*$1$k%9%l%C%I:n@.(B - -@table @code -@item gnus-parse-headers-hook -@vindex gnus-parse-headers-hook -$B$9$Y$F$N%X%C%@!<$r2r@O$9$kA0$K$N$b$N$rIU$12C(B -$B$($k$3$H$K$h$k(B) $BBN7OE*$JJ}K!$G(B @code{Message-ID} $B$r8r49$9$k%a!<%k$+$i(B -$B%K%e!<%9$X$N%2!<%H%&%'%$$,$"$k>l9g!"(B@code{Message-ID} $B$,$b$C$H0UL#$N$"$k(B -$B$b$N$K$9$k$?$a$K!"$3$NJQ?t$r@_Dj$7$F85$KLa$9$3$H$,$G$-$^$9!#$3$l$O0l$D$N(B -$BNc$G$9(B: - -@lisp -(setq gnus-alter-header-function 'my-alter-message-id) - -(defun my-alter-message-id (header) - (let ((id (mail-header-id header))) - (when (string-match - "\\(<[^<>@@]*\\)\\.?cygnus\\..*@@\\([^<>@@]*>\\)" id) - (mail-header-set-id - (concat (match-string 1 id) "@@" (match-string 2 id)) - header)))) -@end lisp -@end table - -@node Thread Commands -@subsection $B%9%l%C%I$NL?Na(B -@cindex thread commands - -@table @kbd -@item T k -@itemx M-C-k -@kindex T k ($B35N,(B) -@kindex M-C-k ($B35N,(B) -@findex gnus-summary-kill-thread -$B8=:_$N(B ($BItJ,(B) $B%9%l%C%I$K4{FI$N0u$rIU$1$^(B -$B$9(B (@code{gnus-summary-kill-thread})$B!#$b$7@\F,0z?t$,@5$G$"$k$H!"Be$o$j$K(B -$B$9$Y$F$N0u$re$2$^(B -$B$9(B (@code{gnus-summary-raise-thread})$B!#(B - -@item T # -@kindex T # ($B35N,(B) -@findex gnus-uu-mark-thread -$B%W%m%;%90u$r8=:_$N(B ($BItJ,(B) $B%9%l%C%I$KIU$1$^(B -$B$9(B (@code{gnus-uu-mark-thread})$B!#(B - -@item T M-# -@kindex T M-# ($B35N,(B) -@findex gnus-uu-unmark-thread -$B8=:_$N(B ($BItJ,(B) $B%9%l%C%I$+$i%W%m%;%90u$r$7$^(B -$B$9(B (@code{gnus-summary-rethread-current})$B!#$3$l$O35N,%P%C%U%!$,%9%l%C%I(B -$BI=<($5$l$F$$$J$$$H$-$G$bF0:n$7$^$9!#(B - -@item T ^ -@kindex T ^ ($B35N,(B) -@findex gnus-summary-reparent-thread -$B8=:_$N5-;v$r0uIU$-(B ($B$b$7$/$OA0$N(B) $B5-;v$N;R5-;v$K$7$^(B -$B$9(B (@code{gnus-summary-reparent-thread})$B!#(B -@end table - -$B0J2<$NL?Na$O%9%l%C%I0\F0L?Na$G$9!#$3$l$i$O$9$Y$F?tCM@\F,0z?t$re>:$7$^$9(B (@code{gnus-summary-up-thread})$B!#(B - -@item T o -@kindex T o ($B35N,(B) -@findex gnus-summary-top-thread -$B%9%l%C%I$ND:>e$K0\F0$7$^$9(B (@code{gnus-summary-top-thread})$B!#(B -@end table - -@vindex gnus-thread-operation-ignore-subject -$B%9%l%C%I$r:n@.$9$k$H$-$KI=Bj$rL5;k$9$k$H!"<+A3$K%9%l%C%I$K$O$$$/$D$+$N0c$C(B -$B$?I=Bj$,$"$k$3$H$K$J$j$^$9!#$=$l$+(B -$B$i(B `T k' (@code{gnus-summary-kill-thread}) $B$N$h$&$JL?Na$rH/$9$k$H$-$K!"(B -$BA4BN$N%9%l%C%I$r:o=|$9$k$N$G$O$J$/!"8=:_$N5-;v$HF1$8I=Bj$r;}$DItJ,$@$1$r(B -$B:o=|$7$?$$$H$-$,$"$k$+$b$7$l$^$;$s!#$b$7$3$NH/A[$,NI$$$H;W$&$N$G$"$l$P!"(B -@code{gnus-thread-operation-ignore-subject} $B$r$$$8$/$k$3$H$,$G$-$^$9!#$3(B -$B$l$,(B @code{nil} $B$G$J$$$H(B ($B$3$l$,%G%#%U%)%k%H$G$9$,(B)$B!"%9%l%C%I$NL?Na$r$N%9%l%C%I$h$j@h$KJB$SBX(B -$B$($i$l$k$Y$-$G$"$l$P!"(B@code{nil} $B$G$J$$CM$r$+$($7$^$9!#IaDL!"JB$SBX$($O(B -$BK\Ev$O$=$l$>$l$N%9%l%C%I$N:,K\$r8+$k$@$1$K$h$j$J$5$l$k$3$H$K5$$rIU$1$F$/(B -$B$@$5$$!#$b$7Fs$D0J>e$N4X?t$r;H$&>l9g!"M%@hE*JB$SBX$(%-!<$O%j%9%H$N:G8e$N(B -$B4X?t$G$9!#$*$=$i$/$$$D$b(B @code{gnus-thread-sort-by-number} $B$rJB$SBX$(4X(B -$B?t$N%j%9%H!=!=:G=i$,9%$^$7$$(B $B$KF~$l$F$*$/$Y$-$G$7$g$&!#$3$l$OB>$NJB$SBX(B -$B$(4p=`$K4X$7$FEy$7$$%9%l%C%I$O5-;v$,>e$,$C$F$$$/=gHV$KI=<($5$l$k$3$H$rJ](B -$B>Z$7$^$9!#(B - -$B%9%3%"$N5U=g!"I=Bj!"$=$7$F:G8e$KHV9f!"$N=g$KJB$SBX$($?$$$N$G$"$l$P!"l9g$O!"1Q;z=g$KJB$S$+$($i$l$^$9!#%9%3%"$HI=Bj$,F1$8%9%l%C%I$OHV9f(B -$B$GJB$SBX$($i$l!"(B($BIaDL$O(B) $B5-;v$,E~Ce$7$?=gHV$K$J$j$^$9!#(B - -$B%9%3%"!"E~Ce$N5U=g$KJB$SBX$($?$$$N$G$"$l$P!"h!"$b$7$/$O$"$J$?$N9%4q?4$r$/(B -$B$9$0$k$h$&$J2?$+$G$7$g$&!#(B - -@findex gnus-article-sort-functions -@findex gnus-article-sort-by-date -@findex gnus-article-sort-by-score -@findex gnus-article-sort-by-subject -@findex gnus-article-sort-by-author -@findex gnus-article-sort-by-number -$B2?$+4qL/$JM}M3$J$I$G%9%l%C%II=<($r;H$C$F$$$J$$$N$J$i!"JQ(B -$B?t(B @code{gnus-article-sort-functions} $B$r$$$8$/$kI,MW$,$"$j$^$9!#$3$l(B -$B$O(B @code{gnus-thread-sort-functions} $B$HHs>o$K;w$F$$$^$9$,!"5-;v$NHf3S$K(B -$B$O>/!90c$C$?4X?t$r;H$$$^$9!#;HMQ2DG=$JJB$SBX$(=R8l4X?t(B -$B$O(B @code{gnus-article-sort-by-number}, @code{gnus-article-sort-by-author}, @code{gnus-article-sort-by-subject}, @code{gnus-article-sort-by-date} $B$*(B -$B$h$S(B @code{gnus-article-sort-by-score} $B$G$9!#(B - -$B%9%l%C%I$r;H$C$F$$$J$$I=Bj$N35N,I=<($rJB$SBX$($?$$$N$G$"$l$P!"u67$rHr$1$k$?$a$K!"(Bgnus $B$O%5!<%P!<$KFs$D$N(B ($B$=$l$O(B 2 $B$H?t$($F$/$@$5(B -$B$$(B) $B@\B3$rD%$k$3$H$,$G$-$^$9!#$3$l$O$"$^$j$7$FNI$$$3$H$G$O$J$$$H9M$($k?M(B -$B$b$$$k$G$7$g$&$,!";d$K$OJ,$J@\B3$r(B -$B$9$k$?$a$K$O2?$i$+$N;~4V$,$+$+$j$^$9$N$G!"(Bgnus $B$N5/F0$OCY$/$J$j$^$9!#(B - -Gnus $B$O$"$J$?$,FI$`$G$"$m$&5-;v$h$j$b$?$/$5$s$N5-;v$rJ,$J5-;v$NMW5a$H!"M>J,$J@\B3$G!#(B - -$B$O$$!"$3$l$GK\Ev$O$3$N$h$&$J$3$H$r$9$Y$-$GL5$$;v$,J,$+$C$?$G$7$g$&(B... $BK\(B -$BEv$K$=$&$7$?$$$H;W$o$J$$8B$j$O!#(B - -@vindex gnus-asynchronous -$B$3$l$,J}K!$G$9(B: @code{gnus-asynchronous} $B$r(B @code{t} $B$K@_Dj$7$F$/$@$5$$!#(B -$B;D$j$N$3$H$O<+F0E*$K5/$3$j$^$9!#(B - -@vindex gnus-use-article-prefetch -@code{gnus-use-article-prefetch} $B$r@_Dj$9$k$3$H$K$h$j!"$I$l$/$i$$$N5-;v(B -$B$,@h$Ko$K(B}$BCY$$(B @sc{nntp} $B@\B3$G$"$k$J$i$P!"5-;v%-%c%C%7%e$r$9$k$3(B -$B$H$r9M$($k$+$b$7$l$^$;$s!#$=$&$9$k$H!"$=$l$>$l$N5-;v$O$"$J$?$N%[!<%`%G%#(B -$B%l%/%H%j$N2<$K%m!<%+%k$KN/$a$i$^$9!#4{$K?dB,$5$l$F$$$k$+$bCN$l$^$;$s$,!"(B -$B$3$l$O(B @emph{$B5pBg$J(B}$B%G%#%9%/%9%Z!<%9$r?)$$!"(Bi$B%N!<%I$bHs>o$KB.$/?)$$$D$V(B -$B$92DG=@-$,$"$k$?$a!"$=$l$O$"$J$?$NF,$r1K$,$;$k;v$K$J$k$+$b$7$l$^$;$s!#(B -$B%&%)%C%+$NCf$G!#(B - -$B$G$bCm0U?<$/;H$o$l$l$P!"$=$l$O5-;v$rJ]B8$9$k4JC1$JJ}K!$K$J$jF@$^$9!#(B - -@vindex gnus-use-long-file-name -@vindex gnus-cache-directory -@vindex gnus-use-cache -$B%-%c%C%7%e$rl9g$O!"%5!<%P!<$NBe$o$j$K%-%c%C%7%e$+$iJ}$H$b%7%s%\%k$N%j%9%H$G$9!#A0/(B -$B$J$/$9$k0l$D$NJ}K!$O!"M_$7$/$J$$5-;v$N%9%3%"$rDc$/$7!"4{FI$N0u$rIU$1$k;v(B -$B$G$9!#$=$&$7$?>l9g!"$=$l$i$O$3$NL?Na$G$O%@%&%s%m!<%I$5$l$^$;$s!#(B - -@vindex gnus-uncacheable-groups -@vindex gnus-cacheable-groups -$B$$$/$D$+$N%0%k!<%W$G$O%-%c%C%7%e$r$7$?$/$J$$$H$$$&$N$ONI$/$"$k;v$G$9!#Nc(B -$B$($P!"(B@code{nnml} $B%a!<%k%G%#%l%/%H%j!<$,%[!<%`%G%#%l%/%H%j!<$N2<$K$"$l$P!"(B -$B$=$l$r$"$J$?$N%[!<%`%G%#%l%/%H%j!<$N2<$NJL$N>l=j$K%-%c%C%7%e$9$k$N$O0UL#(B -$B$NL5$$;v$G$9!#$"$J$?$,FsG\$NMFNL$r;H$&;v$,NI$$$H46$8$J$$8B$j$O!#(B - -$B%-%c%C%7%e$r@)8B$9$k$?$a$K!"(B@code{gnus-cacheable-groups} $B$r(B $B$r%-%c%C%7%e(B -$B$9$k%0%k!<%W$NO"A[%j%9%H!"Nc$($P(B @samp{^nntp}$B!"$H$9$k$+!"@55,I=(B -$B8=(B @code{gnus-uncacheable-groups} $B$rNc$($P!"(B@samp{^nnml} $B$K@_Dj$7$F2<$5(B -$B$$!#N>J}$NJQ?t$N=i4|CM$O(B @code{nil} $B$G$9!#$b$7%0%k!<%W$,N>J}$N@55,I=8=$K(B -$B9gCW$9$k$H!"$=$N%0%k!<%W$O%-%c%C%7%e$5$l$^$;$s!#(B - -@findex gnus-cache-generate-nov-databases -@findex gnus-cache-generate-active -@vindex gnus-cache-active-file -$B%-%c%C%7%e$O$I$N5-;v$,4^$^$l$F$$$k$+$N>pJs$r%"%/%F%#%V%U%!%$(B -$B%k(B (@code{gnus-cache-active-file}) $B$KN/$a$^$9!#$3$N%U%!%$%k(B ($B$b$7$/$O%-%c%C(B -$B%7%e$NB>$NItJ,(B) $B$,2?$i$+$NM}M3$G$0$A$c$0$A$c$K$J$C$F$7$^$C$?>l9g!"(B -gnus $B$OJ*;v$r@5$7$/$9$k$?$a$KFs$D$N4X?t$r$*4+$a$7$^$9!#(B -@kbd{M-x gnus-cache-generate-nov-databases} $B$O$9$Y$F$N(B @sc{nov} $B%U%!%$%k(B -$B$r(B ($B:F(B) $B:n@.$7!"(B@kbd{gnus-cache-generate-active} $B$O%"%/%F%#%V%U%!%$%k(B -$B$r(B ($B:F(B) $B:n@.$7$^$9!#(B - -@node Persistent Articles -@section $B1JB35-;v(B -@cindex persistent articles -$B5-;v$N%-%c%C%7%e$H6a$$4X78$K$"$k$b$K!"(B@dfn{$B1JB35-;v(B}$B$,$"$j$^$9!#l=j$K1J1s$K;D$C$F$$$k(B -$B$Y$-$G$7$g$&!#%K%e!<%9%5!<%P!<$K$*$1$k4|8B:o=|$K$O1F6A$5$l$J$$$G!#(B - -$B$3$l$,(B@dfn{$B1JB35-;v(B}$B$G$9!=!=5-;v$O:o=|$5$l$^$;$s!#$=$l$OIaDL$N%-%c%C%7%e(B -$BL?Na$r;H$C$FJ}$H$b%W%m%;%9(B/$B@\F,0z?t$N=,47$rM}2r$7$^$9!#(B - -$B$b$71JB35-;v$K$@$16=L#$,$"$k$N$G$7$?$i!"2D;k5-;v(B ($B$d$=$NB>$N$b$N(B) $B$,%-%c%C(B -$B%7%e$KF~$k$N$rHr$1$k$?$a$K!"(B@code{gnus-use-cache} $B$r(B @code{passive} $B$K@_(B -$BDj$9$k$N$,NI$$$G$7$g$&(B: - -@lisp -(setq gnus-use-cache 'passive) -@end lisp - -@node Article Backlog -@section $B5-;v$N%P%C%/%m%0(B -@cindex backlog -@cindex article backlog -$B$b$7CY$$@\B3$7$+$J$$>l9g$G!"%-%c%C%7%e$r;H$&$H$$$&H/A[$O$"$^$jL%NOE*$G$O(B -$B$J$$$H$-(B ($Bu67$r2?$H$+$9$k$3$H$,$G$-$^$9!#$3$l$O4{$KFI$s$@5-;v$r:F/$7CY$/$7!"(B -$B%a%b%j!<$N;HMQNL$r$$$/$i$+A}$d$7$^$9!#(B - -@vindex gnus-keep-backlog -$B$b$7(B @code{gnus-keep-backlog} $B$r?t;z(B @var{n} $B$K@_Dj$9$k$H!"(Bgnus $B$O:GBg(B -$B$G(B @var{n} $B$N8E$$5-;v$r8e$N:Fl9g!"(Bgnus $B$O(B@emph{$BA4$F(B}$B$N4{FI5-(B -$B;v$r$?$/$o$($^$9!#$3$l$O$"$J$?$N(B Emacs $B$,!"K=H/$7$F$"$J$?$N%^%7%s$,Mn$A(B -$B$k$^$G@)8B$J$/KD$l>e$,$k$H$$$&$3$H$G$9!#;d$O$"$J$?J}A4$F$,855$$G$$$i$l$k(B -$B$h$&$K$3$3$K=q$-2C$($^$7$?!#(B - -$B$3$NJQ?t$O%G%#%U%)%k%H$G$O(B @code{nil} $B$G$9!#(B - -@node Saving Articles -@section $B5-;v$NJ]B8(B -@cindex saving articles - -Gnus $B$O$?$/$5$s$NJ}K!$G5-;v$rJ]B8$9$k;v$,$G$-$^$9!#0J2<$N$b$N$OHs>o$KN((B -$BD>$JJ}K!(B ($BNc$($P!"5-;v$,J]B8$9$kA0$K$[$H$s$I2?$b$J$5$l$J$$(B) $B$G5-;v$rJ]B8(B -$B$9$k$?$a$N@bL@$G$9!#0c$C$?$^$7$/$J$$%X%C%@!<$r>C5n$7$^$;$s!#(B - -@vindex gnus-saved-headers -$B$b$7>e$NJQ?t$,(B @code{nil} $B$G$"$k$H!"@55,I=(B -$B8=(B @code{gnus-saved-headers} $B$K9gCW$9$k$9$Y$F$N%X%C%@!<$O;D$5$l!";D$j$N(B -$B$b$N$OJ]B8$9$kA0$K:o=|$5$l$^$9!#(B - -@table @kbd -@item O o -@itemx o -@kindex O o ($B35N,(B) -@kindex o ($B35N,(B) -@findex gnus-summary-save-article -@c @icon{gnus-summary-save-article} -$B%G%#%U%)%k%H$N5-;vJ]B8$rMQ$$$F8=:_$N5-;v$rJ]B8$7$^(B -$B$9(B (@code{gnus-summary-save-article})$B!#(B - -@item O m -@kindex O m ($B35N,(B) -@findex gnus-summary-save-article-mail -$B8=:_$N5-;v$r%a!<%k$NMM<0$GJ]B8$7$^(B -$B$9(B (@code{gnus-summary-save-article-mail})$B!#(B - -@item O r -@kindex O r ($B35N,(B) -@findex gnus-summary-save-article-rmail -$B8=:_$N5-;v$r(B rmail $B$NMM<0$GJ]B8$7$^(B -$B$9(B (@code{gnus-summary-save-article-rmail})$B!#(B - -@item O f -@kindex O f ($B35N,(B) -@findex gnus-summary-save-article-file -@c @icon{gnus-summary-save-article-file} -$B8=:_$N5-;v$rIaDL$N%U%!%$%k(B (plain file) $BMM<0$GJ]B8$7$^(B -$B$9(B (@code{gnus-summary-save-article-file})$B!#(B - -@item O F -@kindex O F ($B35N,(B) -@findex gnus-summary-write-article-file -$B8=:_$N5-;v$rIaDL$N%U%!%$%kMM<0$GJ]B8$7!"0JA0$N%U%!%$%k$NFbMF$r>e=q$-$7$^(B -$B$9(B (@code{gnus-summary-write-article-file})$B!#(B - -@item O b -@kindex O b ($B35N,(B) -@findex gnus-summary-save-article-body-file -$B8=:_$N5-;v$NK\J8(B (body) $B$rIaDL$N%U%!%$%kMM<0$GJ]B8$7$^(B -$B$9(B (@code{gnus-summary-save-article-body-file})$B!#(B - -@item O h -@kindex O h ($B35N,(B) -@findex gnus-summary-save-article-folder -$B8=:_$N5-;v$r(B mh $B$N%U%)%k%@!<$NMM<0$GJ]B8$7$^(B -$B$9(B (@code{gnus-summary-save-article-folder})$B!#(B - -@item O v -@kindex O v ($B35N,(B) -@findex gnus-summary-save-article-vm -$B8=:_$N5-;v$r(B VM $B%U%)%k%@!<$KJ]B8$7$^(B -$B$9(B (@code{gnus-summary-save-article-vm})$B!#(B - -@item O p -@itemx | -@kindex O p ($B35N,(B) -@kindex | ($B35N,(B) -@findex gnus-summary-pipe-output -$B8=:_$N5-;v$r%Q%$%W$KJ]B8$7$^$9!#$&!<$s$H!"$"$N$)!";d$,8@$*$&$H$7$F$$$k;v(B -$B$O!=!=8=:_$N5-;v$r%W%m%;%9$K%Q%$%W$9$k$H$$$&$3$H$G(B -$B$9(B (@code{gnus-summary-pipe-output})$B!#(B -@end table - -@vindex gnus-prompt-before-saving -$B$9$Y$F$N$3$l$i$NL?Na$O%W%m%;%9(B/$B@\F,0z?t$N=,47$r;H$$$^(B -$B$9(B (@pxref{Process/Prefix})$B!#$b$7$3$l$i$N4X?t$r;H$C$F$?$/$5$s$N5-;v$rJ](B -$BB8$7$?>l9g!"$=$l$>$l$N$9$Y$F$N5-;v$KBP$7$F%U%!%$%kL>$NF~NO$rMW5a$5$l$k;v(B -$B$KK0$-K0$-$9$k$G$7$g$&!#F~NOB%?JF0:n$OJQ(B -$B?t(B @code{gnus-prompt-before-saving} $B$K$h$C$F@)8f$5$l$^$9!#$3$l$O%G%#%U%)(B -$B%k%H$G$O(B @code{always} $B$G!"$"$J$?$,CN$C$F$$$F7y$,$C$F$$$k!"2a>j$JB%?JF0(B -$B:n$r$7$^$9!#Be$o$j$K$3$NJQ?t$r(B @code{t} $B$K@_Dj$9$k$H!"$"$J$?$,J]B8$9$k$=(B -$B$l$>$l$N0lO"$N5-;v$KBP$7$F0l2s$@$1B%$5$l$^$9!#K\Ev$K(B gnus $B$K$9$Y$F$N;W9M(B -$B$r$5$;$?$$$N$G$"$l$P!"$3$NJQ?t$r(B @code{nil} $B$K$9$k$3$H$5$($G$-$^$9!#$=$7(B -$B$F!"5-;v$rJ]B8$9$k$?$a$N%U%!%$%k$rB%$5$l$k;v$O$"$j$^$;$s!#(BGnus $B$OC1=c$K(B -$B$9$Y$F$N5-;v$r%G%#%U%)%k%H$N%U%!%$%k$KJ]B8$7$^$9!#(B - -@vindex gnus-default-article-saver -Gnus $B$,$"$J$?$NK>$`$H$*$j$K$J$k$h$&$K!"JQ(B -$B?t(B @code{gnus-default-article-saver} $B$r%+%9%?%^%$%:$9$k;v$,$G$-$^$9!#2<(B -$B$NO;$D$N4{@=4X?t$r;H$&;v$,$G$-$^$9$7!"<+J,<+?H$N4X?t$r:n$k;v$b$G$-$^$9!#(B - -@table @code -@item gnus-summary-save-in-rmail -@findex gnus-summary-save-in-rmail -@vindex gnus-rmail-save-name -@findex gnus-plain-save-name -$B$3$l$O%G%#%U%)%k%H$NMM<0!"(B@dfn{babyl} $B$G$9!#JQ(B -$B?t(B @code{gnus-ramil-save-name} $B$KF~$C$F$$$k4X?t$r!"5-;v$rJ]B8$9$k$?$a$N(B -$B%U%!%$%kL>$r$ro$N%U%!%$%k$N8e$KDI2C$7$^$9!#JQ?t(B @code{gnus-file-save-name} $B$K(B -$BF~$C$F$$$k4X?t$r!"5-;v$rJ]B8$9$k$?$a$N%U%!%$%kL>$ro$N%U%!%$%k$N8e$KDI2C$7$^$9!#JQ(B -$B?t(B @code{gnus-file-save-name} $B$KF~$C$F$$$k4X?t$r!"5-;v$rJ]B8$9$k$?$a$N%U%!(B -$B%$%kL>$r$r.J8;z$K$J$C$?L>A0$r$D$/$j$^(B -$B$9!#(B - -@item gnus-summary-save-in-vm -@findex gnus-summary-save-in-vm -$B5-;v$r(B VM $B%U%)%k%@!<$KJ]B8$7$^$9!#$3$N@_Dj$r;H$&$?$a$K$O(B VM $B%a!<%k%j!<%@!<(B -$B$,I,MW$G$9!#(B -@end table - -@vindex gnus-article-save-directory -$B$3$l$i$NA4$F$N4X?t$O:G8e$N0l$D$r=|$$$F!"4D6-JQ?t(B @code{SAVEDIR} $B$K$h$C$F(B -$B=i4|2=$5$l$k(B @code{gnus-article-save-directory} $B$K5-;v$rJ]B8$7$^$9!#$3$l(B -$B$O%G%#%U%)%k%H$G$O(B @file{~/News/} $B$G$9!#(B - -$B>e$K$"$k$h$&$K!"5-;v$rJ]B8$9$k$?$a$N%U%!%$%k$NE,@Z$JL>A0$r8+$D$1$k$?$a$K!"(B -$B4X?t$O0c$C$?4X?t$rMQ$$$^$9!#0J2<$OL>A0$r@8@.$9$k$?$a$K;HMQ2DG=$J4X?t$N%j(B -$B%9%H$G$9(B: - -@table @code -@item gnus-Numeric-save-name -@findex gnus-Numeric-save-name -@file{~/News/Alt.andera-dworkin/45} $B$N$h$&$J%U%!%$%kL>!#(B - -@item gnus-numeric-save-name -@findex gnus-numeric-save-name -@file{~/News/alt.andera-dworkin/45} $B$N$h$&$J%U%!%$%kL>!#(B - -@item gnus-Plain-save-name -@findex gnus-Plain-save-name -@file{~/News/Alt.andera-dworkin} $B$N$h$&$J%U%!%$%kL>!#(B - -@item gnus-plain-save-name -@findex gnus-plain-save-name -@file{~/News/alt.andera-dworkin} $B$N$h$&$J%U%!%$%kL>!#(B - -@item gnus-sender-save-name -@findex gnus-sender-save-name -@file{~/News/larsi} $B$N$h$&$J%U%!%$%kL>!#(B -@end table - -@vindex gnus-split-methods -$BO"A[%j%9%H(B @code{gnus-split-methods} $B$K@55,I=8=$rJ|$j9~$`;v$K$h$C$F!"(B -gnus $B$K5-;v$rJ]B8$9$k>l=j$rDs0F$9$k;v$,$G$-$^$9!#Nc$($P!"(Bgnus $B$K4XO"$7$?(B -$B5-;v$r%U%!%$%k(B @file{gnus-stuff} $B$K!"(BVM $B$K4XO"$7$?5-;v(B -$B$r(B @code{vm-stuff} $BJ]B8$7$?$1$l$P!"$3$NJQ?t$r0J2<$N$h$&$K$9$k;v$,$G$-$^(B -$B$9(B: - -@lisp -(("^Subject:.*gnus\\|^Newsgroups:.*gnus" "gnus-stuff") - ("^Subject:.*vm\\|^Xref:.*vm" "vm-stuff") - (my-choosing-function "../other-dir/my-stuff") - ((equal gnus-newsgroup-name "mail.misc") "mail-stuff")) -@end lisp - -$B$3$l$O$=$l$>$l$NMWAG$,!"Fs$D$NMWAG!=!=(B@dfn{$B9gCW(B} $B$H(B @dfn{$B%U%!%$%k(B} $B$r;}(B -$B$D%j%9%H$G$"$k%j%9%H$G$"$k$H$$$&;v$,$o$+$j$^$9!#9gCW$OJ8;zNs(B ($B$3$N>l9g$O(B -$B5-;v$N%X%C%@!<$K9gCW$9$k@55,I=8=$H$7$F;H$o$l$^$9(B) $B$*$h$S!"%7%s%\%k(B ($B%0%k!<(B -$B%WL>$r0z?t$H$7$F!"4X?t$H$7$F8F$P$l$^$9(B) $B$*$h$S!"%j%9%H(B ($B$3$l$OI>(B -$B2A(B (@code{eval}) $B$5$l$^$9(B) $B$G$"$k$3$H$,$G$-$^$9!#$b$7$3$l$i$NF0:n$N0l$D(B -$B$G$b(B @code{nil} $B$G$J$$7k2L$rJV$9$H!"(B@dfn{$B%U%!%$%k(B}$B$,%G%#%U%)%k%H$NB%?J$H(B -$B$7$F;H$o$l$^$9!#2C$($F!"8F$P$l$?4X?t$+<0$,J8;zNs$+J8;zNs$N%j%9%H$rJV$7$?(B -$B$H$-$O!"1i;;$N7k2L<+BN$,;H$o$l$^$9!#(B - -$B4pK\E*$K$O!"8=:_$N5-;v$rJ]B8$9$k$N$K;H$o$l$k2DG=@-$N$"$k%U%!%$%kL>$N%j%9(B -$B%H$rA0$H$7$F;H$$$?$$$b$N$rB%$5$l!"$3$NJQ?t$rE,MQ$9$k;v$K$h$jF@$i$l$?7k(B -$B2L$+$i%U%!%$%kL>Jd40$r$7$FF~NO$7$^$9!#(B - -$B$3$NJQ?t$O%G%#%U%)%k%H$G$O(B @code{((gnus-article-archive-name))} $B$G!"(B -gnus $B$,J]B8$9$k5-;v$N(B @code{Archive-name} $B9T$rD4$Y$F!"$=$l$r%U%!%$%kL>$N(B -$BDs0F$H$7$F;H$&$H$$$&;v$G$9!#(B - -$B$3$l$O%U%!%$%kL>$r>/$7$-$l$$$K$9$k4X?t$NNc$G$9!#(B -@samp{nnml:mail.whatever} $B$N$h$&$J%a!<%k%0%k!<%W$,$?$/$5$s$"$k$N$G$"$l$P!"(B -$BJ]B8$9$k$?$a$N%U%!%$%kL>$r:n$kA0$K$3$l$i$N%0%k!<%WL>$N:G=i$r@Z$jMn$H$7$?(B -$B$$$+$b$7$l$^$;$s!#e5-$N4X?t$O%0%k!<%WL>$N$9$Y$F$N%T%j%*(B -$B%I(B (@samp{.}) $B$r%9%i%C%7%e(B (@samp{/}) $B$GCV$-49$($^$9!=!=$3$l$O4X?t$O$9$Y(B -$B$F$N%U%!%$%k$r0lHV>e$N%G%#%l%/%H%j!<$KCV$/$N$G$O$J$/!"3,AXE*$J%G%#%l%/%H(B -$B%j!<$r:n$k$H$$$&;v$G$9(B (@file{~/News/alt.andrea-dworkin} $B$NBe$o$j(B -$B$K(B @file{~/News/alt/andrea-dworkin}$B!#(B) $B$3$NJQ?t$O$?$$$F$$$N%7%9%F%`$K$*(B -$B$$$F%G%#%U%)%k%H$G(B @code{t} $B$G$9!#$7$+$7!"Nr;KE*$JM}M3$+(B -$B$i(B Xenix $B$H(B usg-unix-v $B%^%7%s$G$O%G%#%U%)%k%H$G(B @code{nil} $B$G$9!#(B - -$B$3$N4X?t$O:o=|$H%9%3%"$N%U%!%$%kL>$K1F6A$7$^$9!#$3$NJQ?t$,%j%9%H$G!"%j%9(B -$B%H$KMWAG(B @code{not-score} $B$,$"$k$H!"D9$$%U%!%$%kL>$O%9%3%"%U%!%$%k$K$O;H(B -$B$o$l$:!"%j%9%H$KMWAG(B @code{not-save} $B$,$"$k$H!"D9$$%U%!%$%kL>$OJ]B8$K$O(B -$B;H$o$l$:!"MWAG(B @code{not-kill} $B$,$"$k$H!"D9$$%U%!%$%kL>$O:o=|%U%!%$%k$K(B -$B$O;H$o$l$^$;$s!#(B - -$B$b$75-;v$r%9%W!<%k$N$h$&$J3,AX$KJ]B8$7$?$$$N$G$"$l$P!"e$N%G%#%l%/%H%j!<$r0z?t(B (@file{~/News/}) $B$H$7$F(B -$BEO$7$^$9!#(B - -@node Decoding Articles -@section $B5-;v$NI|9f2=(B -@cindex decoding articles - -$B$H$-$I$-MxMQA0!"(B -@samp{[Cc][Ii][Nn][Dd][Yy][0-9]+.\\(gif\\|jpg\\)} $B$K%O!<%I%3!<%I$5$l$k!"(B -$B$r;}$D5-;v$rI|9f2=$7$h$&$H$7$?$H$-$O!"(B@code{gnus-uu} $B$OLdBj$N5-;v$r$A$g(B -$B$&$I1\Mw$7$?;v$rCN$i$;$k$?$a$K!"<+F0E*$K(B @samp{comp.unix.wizards} $B$K5-;v(B -$B$rEj9F$7$^$9!#$3$N5!G=$r;H$o$J$$$h$&$K$9$k;v$O$G$-$^$;$s!#(B - -@node Shell Archives -@subsection $B%7%'%k%"!<%+%$%V(B -@cindex unshar -@cindex shell archives -@cindex shared articles - -$B%7%'%k%"!<%+%$%V(B ($B!X(Bshar $B%U%!%$%k!Y(B) $B$O%=!<%9$rG[I[$9$k$?$a$N?M5$$N$"$k(B -$BJ}K!$G$7$?$,!":#F|$G$O$=$s$J$K;H$o$l$F$$$^$;$s!#$H$K$+$/$3$l$i$r07$&$?$a(B -$B$NL?Na$,$"$j$^$9(B: - -@table @kbd -@item X s -@kindex X s ($B35N,(B) -@findex gnus-uu-decode-unshar -$B8=:_$N72$r2rE`$7$^$9(B (@code{gnus-uu-decode-unshar})$B!#(B - -@item X S -@kindex X S ($B35N,(B) -@findex gnus-uu-decode-unshar-and-save -$B8=:_$N72$r2rE`$7J]B8$7$^$9(B (@code{gnus-uu-decode-unshar-and-save})$B!#(B - -@item X v s -@kindex X v s ($B35N,(B) -@findex gnus-uu-decode-unshar-view -$B8=:_$N72$r2rE`$7I=<($7$^$9(B (@code{gnus-uu-decode-unshar-view})$B!#(B - -@item X v S -@kindex X v S ($B35N,(B) -@findex gnus-uu-decode-unshar-and-save-view -$B8=:_$N72$r2rE`$7!"I=<($7$FJ]B8$7$^(B -$B$9(B (@code{gnus-uu-decode-unshar-and-save-view})$B!#(B -@end table - -@node PostScript Files -@subsection $B%]%9%H%9%/%j%W%H%U%!%$%k(B -@cindex PostScript - -@table @kbd -@item X p -@kindex X p ($B35N,(B) -@findex gnus-uu-decode-postscript -$B8=:_$N%]%9%H%9%/%j%W%H72$rE83+$7$^$9(B (@code{gnus-uu-decode-postscript})$B!#(B - -@item X P -@kindex X P ($B35N,(B) -@findex gnus-uu-decode-postscript-and-save -$B8=:_$N%]%9%H%9%/%j%W%H72$rE83+$7$FJ]B8$7$^(B -$B$9(B (@code{gnus-uu-decode-postscript-and-save})$B!#(B - -@item X v p -@kindex X v p ($B35N,(B) -@findex gnus-uu-decode-postscript-view -$B8=:_$N%]%9%H%9%/%j%W%H72$rI=<($7$^(B -$B$9(B (@code{gnus-uu-decode-postscript-view})$B!#(B - -@item X v P -@kindex X v P ($B35N,(B) -@findex gnus-uu-decode-ostscript-and-save-view -$B8=:_$N%]%9%H%9%/%j%W%H72$rI=<($7J]B8$7$^(B -$B$9(B (@code{gnus-uu-decode-postscript-and-save-view})$B!#(B -@end table - -@node Other Files -@subsection $BB>$N%U%!%$%k(B - -@table @kbd -@item X o -@kindex X o ($B35N,(B) -@findex gnus-uu-decode-save -$B8=:_$N72$rJ]B8$7$^$9(B (@code{gnus-uu-decode-save})$B!#(B - -@item X b -@kindex X b ($B35N,(B) -@findex gnus-uu-decode-binhex -$B8=:_$N5-;v$r(B binhex $B2rE`$7$^$9(B (@code{gnus-uu-decode-binhex})$B!#$3$l$OK\(B -$BEv$OF0:n$7$^$;$s!#(B -@end table - -@node Decoding Variables -@subsection $BI|9f2=$N$?$a$NJQ?t(B - -$B7AMF;l$G$9!#F0;l$G$O$"$j$^$;$s!#(B - -@menu -* Rule Variables:: $B%U%!%$%k$,$I$N$h$&$KI=<($5$l$k$+$r7h$a$k(B - $BJQ?t(B -* Other Decode Variables:: $BB>$NI|9f2=$NJQ?t(B -* Uuencoding and Posting:: uuencode $B$9$k$N$r%+%9%?%^%$%:$9$kJQ?t(B -@end menu - -@node Rule Variables -@subsubsection $B5,B'JQ?t(B -@cindex rule variables - -Gnus $B$O%U%!%$%k$r1\Mw$9$k$N$r7hDj$9$k$N$K(B@dfn{$B5,B'JQ?t(B}$B$rMQ$$$^$9!#$3$l(B -$B$i$NJQ?t$O$9$Y$F0J2<$N$h$&$JMM<0$G$9!#(B - -@lisp - (list '(regexp1 command2) - '(regexp2 command2) - ...) -@end lisp - -@table @code -@item gnus-uu-user-view-rules -@vindex gnus-uu-user-view-rules -@cindex sox -$B$3$NJQ?t$O%U%!%$%k$r1\Mw$9$k$H$-$K:G=i$KD4$Y$i$l$^$9!#Nc$($P!"$b(B -$B$7(B @samp{.au} $B2;%U%!%$%k$rJQ49$9$k$?$a$K(B @code{sox} $B$r;H$$$?$$$H$-$O!" /dev/audio"))) -@end lisp - -@item gnus-uu-user-view-rules-end -@vindex gnus-uu-user-view-rules-end -$B$3$NJQ?t$O(B gnus $B$,MxMQ$NI|9f2=$NJQ?t(B - -@table @code -@vindex gnus-uu-grabbed-file-functions - -@item gnus-uu-grabbed-file-functions -$B$3$N%j%9%H$N$9$Y$F$N4X?t$O$=$l$>$l$N%U%!%$%k$,>e8e$K8F(B -$B$P$l$^$9!=!=$G$9$+$i!"$9$0$K%U%!%$%k$r0\F0$d1\Mw$7$?$j$9$k$3$H$,$G$-!"2?(B -$B$+$r$9$kA0$K$9$Y$F$N%U%!%$%k$,I|9f2=$5$l$k$N$rBT$DI,MW$O$"$j$^$;$s!#$3$N(B -$B%j%9%H$KF~$l$k;v$N$G$-$k4{@=4X?t$O(B: - -@table @code -@item gnus-uu-grab-view -@findex gnus-uu-grab-view -$B%U%!%$%k$r1\Mw$7$^$9!#(B - -@item gnus-uu-grab-move -@findex gnus-uu-grab-move -$B%U%!%$%k$r0\F0$7$^$9(B ($B$b$7J]B84X?t$r;H$C$F$$$k$N$G$"$l$P(B)$B!#(B -@end table - -@item gnus-uu-be-dangerous -@vindex gnus-uu-be-dangerous -$BI|9f2=$N:GCf$KJQ$J>u67$,5/$3$C$?$H$-$K2?$r$9$k$+$r;XDj$7$^$9!#$b(B -$B$7(B @code{nil} $B$G$"$k$H!"$G$-$k$@$1J]e=q$-$7$^$9!#$=$NB>$N>l(B -$B9g$O!"$=$l$>$l$N$H$-$K?R$M$^$9!#(B - -@item gnus-uu-ignore-files-by-name -@vindex gnus-uu-ignore-files-by-name -$B$3$N@55,I=8=$K9gCW$9$kL>A0$N%U%!%$%k$O1\Mw$5$l$^$;$s!#(B - -@item gnus-uu-ignore-files-by-type -@vindex gnus-uu-ignore-files-by-type -$B$3$NJQ?t$K9gCW$9$k(B @sc{mime} $B$N7?$r;}$D%U%!%$%k$O1\Mw$5$l$^$;$s!#(BGnus $B$O(B -$B%U%!%$%kL>$K4p$E$$$F7?$r?dB,$7$F$$$k;v$KCm0U$7$F$/$@$5$$!#(B -@code{gnus-uu} $B$O(B ($B$^$@(B) @sc{mime} $B%Q%C%1!<%8$G$O$"$j$^$;$s$N$G!"$3$l$O(B -$B>/$7JQ$G$9!#(B - -@item gnus-uu-tmp-dir -@vindex gnus-uu-tmp-dir -@code{gnus-uu} $B$,$=$N;E;v$r$9$k>l=j$G$9!#(B - -@item gnus-uu-do-not-unpack-archives -@vindex gnus-uu-do-not-unpack-archives -@code{nil} $B$G$J$$$N$O!"(B@code{gnus-uu} $B$OI=<($9$k$?$a$N%U%!%$%k$rC5$9$?$a(B -$B$K%"!<%+%$%V$NCf$^$G$OF~$C$F$$$+$J$$$H$$$&;v$G$9!#(B - -@item gnus-uu-view-and-save -@vindex gnus-uu-view-and-save -@code{nil} $B$G$J$$$N$O!"MxMQo$KJ]B8$9$k$+$I$&(B -$B$+$r?R$M$i$l$k$H$$$&;v$G$9!#(B - -@item gnus-uu-ignore-default-view-rules -@vindex gnus-uu-ignore-default-view-rules -@code{nil} $B$G$J$$$N$O!"(B@code{gnus-uu} $B$O%G%#%U%)%k%H$N1\Mw5,B'$rL5;k$9$k(B -$B$H$$$&;v$G$9!#(B - -@item gnus-uu-ignore-default-archive-rules -@vindex gnus-uu-ignore-default-archive-rules -@code{nil} $B$G$J$$$N$O!"(B@code{gnus-uu} $B$O%G%#%U%)%k%H$N%"!<%+%$%VE83+L?Na(B -$B$rL5;k$9$k$H$$$&;v$G$9!#(B - -@item gnus-uu-kill-carriage-return -@vindex gnus-uu-kill-carriage-return -@code{nil} $B$G$J$$$N$O!"(B@code{gnus-uu} $B$O5-;v$+$i$9$Y$F$N%-%c%j%C%8%j%?!<(B -$B%s(B (carriage return) $B$r$K4p$E$$$?(B @sc{mime} $BFbMF$N7?$K~$j$r$7$J$$$GA4$F$r%U%!%$%k$KJ]B8$7$^$9!#MWLs(B -$B$O(B RFC1153 $B=`$8$F$$$^$9!=!=0UL#$N$"$kNL$r;XDj$7$F!"HV9f$rH/9T$9$k4JC1$J(B -$BJ}K!$,8+$D$+$i$J$+$C$?$N$G!"C1=c$K$=$l$i$O@Z$jMn$H$7$F$$$^$9!#(B -@end table - -@node Uuencoding and Posting -@subsubsection uuencode $B$HEj9F(B - -@table @code -@item gnus-uu-post-include-before-composing -@vindex gnus-uu-post-include-before-composing -@code{nil} $B$G$J$$$N$O!"(B@code{gnus-uu} $B$,5-;v$r:n@.$9$kA0$KId9f2=$9$k%U%!(B -$B%$%k$r?R$M$k$H$$$&;v$G$9!#$3$NJQ?t$,(B @code{t} $B$G$"$k$H!"(B@kbd{C-c C-i} $B$K(B -$B$h$C$FId9f2=$5$l$?%U%!%$%k$r$NI|9fAuCV$,B8:_$7$J$$$+$i$G$9!#(B($B$(!<$H!";d$O$=$l$r$9(B -$B$k0l$D$N%Q%C%1!<%8$r8+$?;v$,$"$j$^$9!=!=(B@code{gnus-uu} $B$G$9!#$7$+$7$J$<(B -$B$+!"$=$l$,?t$N$&$A$KF~$k$H$O;W$($J$$$N$G$9(B...) $B%G%#%U%)%k%H(B -$B$O(B @code{nil} $B$G$9!#(B - -@item gnus-uu-post-separate-description -@vindex gnus-uu-post-separate-description -@code{nil} $B$G$J$$$N$O!"5-=R$OJL$N5-;v$GEj9F$5$l$k$H$$$&;v$G$9!#:G=i$N5-(B -$B;v$OIaDL$O(B (0/x) $B$N$h$&$KHV9f$,IU$1$i$l$^$9!#$b$7$3$NJQ?t(B -$B$,(B @code{nil} $B$G$"$k$H!"MxMQl9g!"(Bgnus $B$O%"!<%+%$%V(B -$B$rE83+$7$h$&$H;n$_!"%"!<%+%$%V$NCf$K1\Mw$G$-$k%U%!%$%k$,$"$k$+$rD4$Y$^$9!#(B -$BNc$($P!"(Bgzip $B$5$l$?(B tar $B%U%!%$%k(B @file{pics.tar.gz} $B$,$"$C$F!"%U%!%$(B -$B%k(B @file{pic1.jpg} $B$H(B @file{pic2.gif} $B$r4^$s$G$$$k>l9g!"(Bgnus $B$O$l$NCj=P$5$l$?5-;v$4$H$K(B@dfn{$B5?;w5-;v(B}$B$r35N,(B -$B%P%C%U%!$KA^F~$7$^$9!#$3$l$i$N!X5-;v!Y$K0\F0$7$?>l9g$O!"$l$N%U%!%$%k$KBP$7$F:n@.$5$l$^$9!#(B@code{nil} $B$G$"$k(B -$B$H!"F1$81\MwL?Na$r;H$&$9$Y$F$NL?Na$,$=$NL?Na$N0z?t$N%j%9%H$H$7$FEO$5$l$^(B -$B$9!#(B - -@vindex gnus-insert-pseudo-articles -@code{gnus-insert-pseudo-articles} $B$,(B @code{nil} $B$G$J$$$H!"I|9f2=$N$H$-(B -$B$K5?;w5-;v$rA^F~$7$^$9!#%G%#%U%)%k%H$G$O(B @code{t}$B$G$9!#(B - -$B$=$l$G!"$=$N$h$&$J46$8$G$9!#(B@emph{$Bo$K6lpJs$O>C$75n$j$?$$$H$b;W$&(B -* Article Washing:: $B?M@8$r$b$C$H$h$/$9$k$?$/$5$s$N5$$NMx$$$?(B - $B4X?t(B -* Article Buttons:: URL $B$d(B Message-ID $B$d(B $B%"%I%l%9$J$I$r%/%j%C(B - $B%/$9$k(B -* Article Date:: $B$0$:$0$:8@$&$J!"@$3&;~$@(B! -* Article Signature:: $B=pL>$C$F2?(B? -* Article Miscellania:: $BB>$N$$$m$$$m$J$b$N(B -@end menu - -@node Article Highlighting -@subsection $B5-;v$N%O%$%i%$%H(B -@cindex highlighting - -$B5-;v%P%C%U%!$r2LJ*%5%i%@$N$h$&$K$7$?$$$@$1$G$J$/!"2Z$d$+$J2LJ*%5%i%@$N$h(B -$B$&$K8+$($k$h$&$K$7$?$$$G$7$g$&!#(B - -@table @kbd -@item W H a -@kindex W H a ($B35N,(B) -@findex gnus-article-highlight -@findex gnus-article-maybe-highlight -$B8=:_$N5-;v$r$b$C$H%O%$%i%$%H(B (highlight) $B$7$^$9!#$3$N4X?t$O!"%X%C%@!$r%O%$%i%$%H$7!"K\BN(B (body) $B$HF,(B (head) $B$K%\%?%s$r2C$($^$9!#(B - -@item W H h -@kindex W H h ($B35N,(B) -@findex gnus-article-highlight-headers -@vindex gnus-header-face-alist -$B%X%C%@!<$r%O%$%i%$%H$7$^$9(B (@code{gnus-article-highlight-headers})$B!#%O%$(B -$B%i%$%H$OJQ?t(B @code{gnus-header-face-alist} $B$K$7$?$,$C$F$J$5$l!"$=$l$O$=(B -$B$l$>$l$NMWAG$,(B @code{(@var{$B@55,I=8=(B} @var{$BL>A0(B} @var{$BFbMF(B})} $B$H$$$&MM<0(B -$B$N%j%9%H$G$9!#(B -@var{$B@55,I=8=(B}$B$O%X%C%@!<$K9gCW$9$k@55,I=8=!"(B@var{$BL>A0(B}$B$O%X%C%@!<$NL>A0$r(B -$B%O%$%i%$%H$9$k$N$K;H$o$l$k%U%'%$%9(B (face) (@pxref{Faces and Fonts})$B!"(B -@var{$BFbMF(B}$B$O%X%C%@!<$NCM$r%O%$%i%$%H$9$k%U%'%$%9$G$9!#:G=i$K9gCW$7$?$b$N(B -$B$,;H$o$l$^$9!#(B@var{$B@55,I=8=(B}$B$O(B @samp{^} $B$,IU$1$i$l$k$Y$-$G$O$J$$;v$KCm0U(B -$B$7$F$/$@$5$$!=!=(Bgnus $B$,$=$l$rIU$12C$($^$9!#(B - -@item W H c -@kindex W H c ($B35N,(B) -@findex gnus-article-highlight-citation -$B0zMQ$5$l$?J8$r%O%$%i%$%H$7$^$9(B (@code{gnus-article-highlight-citation})$B!#(B - -$B0zMQ%O%$%i%$%H$r%+%9%?%^%$%:$9$k$$$/$D$+$NJQ?t$O(B: - -@table @code -@vindex gnus-cite-parse-max-size - -@item gnus-cite-parse-max-size -$B5-;v$NBg$-$5$,$3$NJQ?t(B ($B%G%#%U%)%k%H$G$O(B 25000) $B$h$jBg$-$$5-;v$O!"0zMQ%O(B -$B%$%i%$%H$O9T$o$l$^$;$s!#(B - -@item gnus-cite-max-prefix -@vindex gnus-cite-max-prefix -$B0zMQ@\F,8l$N:GBg$ND9$5$G$9(B ($B%G%#%U%)%k%H$G$O(B 20 $B$G$9(B)$B!#(B - -@item gnus-cite-face-list -@vindex gnus-cite-face-list -$B0zMQ$r%O%$%i%$%H$9$k$?$a$K;H$o$l$k%U%'%$%9$N%j%9%H$G$9(B (@pxref{Faces and -Fonts})$B!#F1$8%a%C%;!<%8$NCf$KJ#?t$N5-;v$+$i$N0zMQ$,$"$k$H!"(Bgnus $B$O$=$l$>(B -$B$l$N5-;v$+$i$N0zMQ$r$=$lMQ$N%U%'%$%9$GI=<($7$h$&$H$7$^$9!#$3$l$K$h$j!"C/(B -$B$,2?$r=q$$$?$+$,J,$+$j$d$9$/$J$k$G$7$g$&!#(B - -@item gnus-supercite-regexp -@vindex gnus-supercite-regexp -$BIaDL$N(B Supercite $BB0@-9T$K9gCW$9$k@55,I=8=$G$9!#(B - -@item gnus-supercite-secondary-regexp -@vindex gnus-supercite-secondary-regexp -$B0z$-Nv$+$l$?(B Supercite $BB0@-9T$K9gCW$9$k@55,I=8=$G$9!#(B - -@item gnus-cite-minimum-match-count -@vindex gnus-cite-minimum-match-count -$B$=$l$,0zMQ$G$"$k$H7hDj$9$kA0$KD4$Y$J$1$l$P$J$i$J$$:G>.$NF10l@\F,8l$G$9!#(B - -@item gnus-cite-attribution-prefix -@vindex gnus-cite-attribution-prefix -$BB0@-9T$N;O$^$j$K9gCW$9$k@55,I=8=$G$9!#(B - -@item gnus-cite-attribution-suffix -@vindex gnus-cite-attribution-suffix -$BB0@-9T$N:G8e$K9gCW$9$k@55,I=8=$G$9!#(B - -@item gnus-cite-attribution-face -@vindex gnus-cite-attribution-face -$BB0@-9T$K;H$o$l$k%U%'%$%9$G$9!#$=$NB0@-$KB0$9$kJ8$N$?$a$N%U%'%$%9$HM;9g$5(B -$B$l$^$9!#(B -@end table - -@item W H s -@kindex W H s ($B35N,(B) -@vindex gnus-signature-separator -@vindex gnus-signature-face -@findex gnus-article-highlight-signature -$B=pL>(B (signature) $B$r%O%$%i%$%H$7$^(B -$B$9(B (@code{gnus-article-highlight-signature})$B!#(B -@code{gnus-signature-separator} (@pxref{Article Signature}) $B$N8e$NA4$F$N(B -$B$b$N$O=pL>$H9M$($i$l!"(B@code{gnus-signature-face} $B$G%O%$%i%$%H$5$l$^$9!#(B -$B$=$l$O%G%#%U%)%k%H$G$O(B @code{italic} $B$G$9!#5-;v$r<+F0E*$K%O%$%i%$%H$9$k(B -$BJ}K!$K$D$$$F$O(B @xref{Customizing Articles} $B$r;2>H$7$F2<$5$$!#(B -@end table - -@node Article Fontisizing -@subsection $B5-;v$N%U%)%s%HJQ99(B -@cindex emphasis -@cindex article emphasis - -@cindex gnus-article-emphasize -@kindex W e ($B35N,(B) -$B?M!9$O$h$/%K%e!<%9$N5-;v$G(B @samp{_$B$3$l(B_} $B$d(B @samp{*$B$3$l(B*} $B$^$?(B -$B$O(B @samp{/$B$3$l(B/} $B$N$h$&$J$b$N$r;H$C$FC18l$r6/D4$7$^$9!#(BGnus $B$O(B $B5-;v$rL?(B -$BNa(B @kbd{W e} (@code{gnus-article-emphasize}) $B$K$+$1$k;v$K$h$C$FAGE($K8+(B -$B$($k$h$&$K$G$-$^$9!#(B - -@vindex gnus-emphasis-alist -$B6/D4$,$I$N$h$&$K1i;;$5$l$k$+$OJQ?t(B @code{gnus-emphasis-alist} $B$K$h$C$F@)(B -$B8f$5$l$^$9!#$3$l$O:G=i$NMWAG$,9gCW$9$k$Y$-@55,I=8=$G$"$kO"A[%j%9%H$G$9!#(B -$BFsHVL\$NMWAG$O$I$N@55,I=8=$N%0%k!<%W$,6/D48lA4BN$r8+$D$1$k$?$a$K;H$o$l$k(B -$B$+$r<($9?t;z$G$9!#;0HVL\$O$I$N@55,I=8=$N%0%k!<%W$,I=<($5$l%O%$%i%$%H$5$l(B -$B$k$+$r7h$a$k?t;z$G$9!#(B -($B$3$NFs$D$N%0%k!<%W$N4V$N5-;v$O1#$5$l$^$9!#(B) $B;MHVL\$O%O%$%i%$%H$N%U%'%$(B -$B%9$G$9!#(B - -@lisp -(setq gnus-emphasis-alist - '(("_\\(\\w+\\)_" 0 1 gnus-emphasis-underline) - ("\\*\\(\\w+\\)\\*" 0 1 gnus-emphasis-bold))) -@end lisp - -@cindex slash -@cindex asterisk -@cindex underline -@cindex / -@cindex * - -@vindex gnus-emphasis-underline -@vindex gnus-emphasis-bold -@vindex gnus-emphasis-italic -@vindex gnus-emphasis-underline-bold -@vindex gnus-emphasis-underline-italic -@vindex gnus-emphasis-bold-italic -@vindex gnus-emphasis-underline-bold-italic -$B=i4|@_Dj$G$O<7$D$N5,B'$,$"$j!"$=$l$i$O0J2<$N%U%'%$%9$rMQ$$$^(B -$B$9(B: @code{gnus-emphasis-bold}, @code{gnus-emphasis-italic}, @code{gnus-emphasis-underline}, @code{gnus-emphasis-bold-italic}, @code{gnus-emphasis-underline-italic}, @code{gnus-emphasis-underline-bold}, @code{gnus-emphasis-underline-bold-italic}. - -$B$3$l$i$N%U%'%$%9$rJQ99$7$?$$$N$G$"$l$P!"(B -@kbd{M-x customize} $B$+(B @code{copy-face} $B$r;H$&;v$,$G$-$^$9!#Nc$($P!"(B -@code{gnus-emphasis-italic} $B$KBe$o$j$K@V$N%U%'%$%9$r;H$&$h$&$K$7$?$$$H$-(B -$B$O!"H$7$F2<$5$$!#(B - -@node Article Hiding -@subsection $B5-;v$r1#$9(B -@cindex article hiding - -$B$b$7$/$O!"$=$l$>$l$N5-;v$NFCDj$N$b$N$r1#$7$?$$$+$b$7$l$^$;$s!#$?$$$F$$$N(B -$B5-;v$K$OIaDL$O$"$j$9$.$k$/$i$$:n$j$+$($k$b$N$,$"$j$^$9!#(B - -@table @kbd -@item W W a -@kindex W W a ($B35N,(B) -@findex gnus-article-hide -$B5-;v%P%C%U%!$G$?$/$5$s$N1#F?$r$7$^$9(B (@kbd{gnus-article-hide})$B!#FC$K!"$3(B -$B$N4X?t$O%X%C%@!$r1#$7$^$9!#(B - -@item W W h -@kindex W W h ($B35N,(B) -@findex gnus-article-toggle-headers -$B%X%C%@!<$r1#$7$^$9(B (@code{gnus-article-toggle-headers})$B!#(B -@xref{Hiding Headers}. - -@item W W b -@kindex W W b ($B35N,(B) -@findex gnus-article-hide-boring-headers -$B$"$^$j6=L#$N$b$F$J$$%X%C%@!<$r1#$7$^(B -$B$9(B (@code{gnus-article-hide-boring-headers})$B!#(B@xref{Hiding Headers}. - -@item W W s -@kindex W W s ($B35N,(B) -@findex gnus-article-hide-signature -$B=pL>$r1#$7$^$9(B (@code{gnus-article-hide-signature})$B!#(B -@xref{Article Signature}. - -@item W W l -@kindex W W l (Summary) -@findex gnus-article-hide-list-identifiers -@vindex gnus-list-identifiers -@code{gnus-list-identifiers} $B$G;XDj$5$l$F$$$k%a!<%j%s%0%j%9%H$NI8<1$r:o(B -$B=|$7$^$9!#$3$l$i$O$$$/$D$+$N%a!<%j%s%0%j%9%H$N%5!<%P!<$,A4$F(B -$B$N(B @code{Subject} $B%X%C%@!<$N:G=i$K$D$1$kJ8;zNs$G$9(B---$BNc$($P!"(B -@samp{[zebra 4711]}$B!#J8;zNs$N=i$a$K$"$k(B @samp{Re: } $B$O!":o=|$r9T$J$&A0$K(B -$BD7$S1[$5$l$^$9!#(B@code{gnus-list-identifiers} $B$K(B @code{\\(..\\)} $B$r4^$a$F(B -$B$O$$$1$^$;$s!#(B - -@table @code -@item gnus-list-identifiers -@vindex gnus-list-identifiers -$BI=Bj$+$i:o=|$5$l$k$Y$-I8<1$N%j%9%H$K9gCW$9$k@55,I=8=$G$9!#$3$l$O@55,I=8=(B -$B$N%j%9%H$G$"$k$3$H$b$G$-$^$9!#(B -@end table - -@item W W p -@kindex W W p ($B35N,(B) -@findex gnus-article-hide-pgp -@vindex gnus-article-hide-pgp-hook -@sc{pgp} $B=pL>$r1#$7$^$9(B (@code{gnus-article-hide-pgp})$B!#(B@sc{pgp} $B=pL>$,(B -$B1#$5$l$?8e$K%U%C%/(B @code{gnus-article-hide-pgp-hook} $B$,$r;}$D5-;v$r<+F0E*$KG'>Z$9$k$K$O(B: - -@lisp -;;; Hide pgp cruft if any. - -(setq gnus-treat-strip-pgp t) - -;;; After hiding pgp, verify the message; -;;; only happens if pgp signature is found. - -(add-hook 'gnus-article-hide-pgp-hook - (lambda () - (save-excursion - (set-buffer gnus-original-article-buffer) - (mc-verify)))) -@end lisp - -@item W W P -@kindex W W P ($B35N,(B) -@findex gnus-article-hide-pem -@sc{pem} (privacy enhanced messages ($B%W%i%$%P%7!<3HD%%a%C%;!<%8(B)) $BItJ,$r(B -$B1#$7$^$9(B (@code{gnus-article-hide-pem})$B!#(B - -@item W W B -@kindex W W B ($B35N,(B) -@findex gnus-article-strip-banner -@cindex banner -@cindex OneList -@cindex stripping advertisements -@cindex advertisements -@code{banner} $B%0%k!<%W%Q%i%a!<%?$G;XDj$5$l$?%P%J!<$r$r1#$9$?$a$K;EMM$5$l$^$9!#$3$N4X?t$r;H$&J}K!(B -$B$O(B @code{banner} $B%0%k!<%W%Q%i%a!<%?(B (@pxref{Group Parameters}) $B$r%P%J!<(B -$B$rC5n$5$l$k%F%-%9%H$K9gCW$9(B -$B$k@55,I=8=$H$7$F2r$,>C5n$5$l$k$H$$$&0UL#(B -$B$G$"$k%7%s%\%k(B @code{signature}$B!"$^$?(B -$B$O(B @code{gnus-article-banner-alist} $B$N@55,I=8=$KBP1~$7$?%7%s%\%k$G$"$k$3(B -$B$H$,$G$-$^$9!#(B - -@item W W c -@kindex W W c ($B35N,(B) -@findex gnus-article-hide-citation -$B0zMQ$r1#$7$^$9(B (@code{gnus-article-hide-citation})$B!#1#JC$r%+%9%?%^%$%:$9(B -$B$k$$$/$D$+$NJQ?t$O(B: - -@table @code -@item gnus-cited-opend-text-button-line-format -@itemx gnus-cited-closed-text-button-line-format -@vindex gnus-cited-closed-text-button-line-format -@vindex gnus-cited-opend-text-button-line-format - -Gnus $B$O$I$3$N0zMQJ8$,1#$5$l$F$$$k$+$r<($9$?$a$K%\%?%s$rIU$12C$(!"J8>O$N(B -$B1#JC$r@Z$jBX$($i$l$k$h$&$K$7$^$9!#$3$NJQ?t$NMM<0$O$3$l$i$N%U%)!<%^%C%H$N(B -$B$h$&$JJQ?t$K$h$C$F;XDj$5$l$^$9(B (@pxref{Formatting Variables})$B!#/$J$/$H$b$3$ND9$5(B ($B=i4|CM(B 10) $B$G$J$1$l$P$J$j$^$;$s!#(B -@end table -@end table - -$B$3$l$i$NA4$F$N!X1#JC!YL?Na$O@Z$jBX$(L?Na$G$9$,!"$3$l$i$NL?Na$KIi$N@\F,0z(B -$B?t$rM?$($k$H!"$=$l$i$OA0$K1#$5$l$F$$$?$b$N$rI=<($7$^$9!#@5$N@\F,0z?t$rM?(B -$B$($l$P!"$=$l$i$O>o$K1#$7$^$9!#(B - -$B0zMQ%+%9%?%^%$%:$N$?$a$NB>$NJQ?t$N>pJs$N$?$a(B -$B$K(B @pxref{Article Highlighting} $B$b;2>H$7$F$/$@$5$$!#(B - -$B<+F0E*$K5-;v$NMWAG$r1#$9$?$a$NJ}K!$O(B @xref{Customizing Articles} $B$r;2>H(B -$B$7$F2<$5$$!#(B - -@node Article Washing -@subsection $B5-;v@vBu(B -@cindex washing -@cindex article washing - -$B;d$?$A$O$3$l$r$b$C$H$b$JM}M3$N2<$G!X5-;v@vBu!Y(B(article washing) $B$H8F$s$G(B -$B$$$^$9!#$9$J$o$A!"%-!<(B @kbd{A} $B$O;H$o$l$F$$$k$N$G!"Be$o$j$K(B -$B%-!<(B @kbd{W} $B$r;H$&I,MW$,$"$k$N$G$9!#(B - -$B;d$?$A$O(B @dfn{$B@vBu(B} $B$r!X2?$+$N2?$+$r2?$+JL$N$b$N$KJQ49$9$k!Y$HDj5A$7$F$$(B -$B$^$9$,!"IaDL$O$b$C$HNI$/8+$($k2?$+$KMn$ACe$-$^$9!#$=$l$K$b$C$H$-$l$$$G$9!"(B -$B$?$V$s!#(B - -gnus $B$,5-;v$rI=<($9$k4{Dj$N$d$jJ}$rJQ$($?$$$H$-(B -$B$O(B @xref{Customizing Articles} $B$r;2>H$7$F2<$5$$!#(B - -@table @kbd -@item C-u g -$B$3$l$O5-;v@vBu$G$O$J$/$F!"$=$N5U$G$9!#$3$l$r%?%$%W$9$k$H!"%G%#%9%/$d%5!<(B -$B%P!<$K$"$k$,$^$^$N5-;v$,8+$($^$9!#(B - -@item W l -@kindex W l ($B35N,(B) -@findex gnus-summary-stop-page-breaking -$B%Z!<%8$N6h@Z$j$r8=:_$N5-;v$+$iH$7$F2<$5$$!#(B - -@item W r -@kindex W r ($B35N,(B) -@findex gnus-summary-caesar-message -@c @icon{gnus-summary-caesar-message} -$B5-;v%P%C%U%!$G%+%(%5%kJQ49(B (Caesar rotate) (rot13) $B$r$7$^(B -$B$9(B (@code{gnus-summary-caesar-message})$B!#%+%(%5%kJQ49$+(B rot13 $B$rMQ$$$FFI(B -$B$`;v$N$G$-$k!"H=FIIT2DG=$J5-;v$G$9(B ($BE57?E*$K$O!"967bE*$J>iCL$J$I$G$9!#(B) - -$BIaDL$O(B ``rot13'' $B$H8F$P$l$F$$$^$9!#$=$l$O%"%k%U%!%Y%C%H$N0LCV$,(B 13 $B8D2s(B -$BE>$9$k$+$i$G$9!#Nc$($P!"(B@samp{B} (2 $BHVL\$NJ8;z(B) $B"*(B @samp{O} (15 $BHVL\$NJ8(B -$B;z(B)$B!#$3$l$O;~!9!X%+%(%5%kJQ49!Y$H8F$P$l$k;v$b$"$j$^$9!#$H$$$&$N$O!"%+%((B -$B%5%k$,$3$N7A<0$N!"$(!<$H!"$A$g$C$H4JC1$J0E9f2=$r:NMQ$7$?$H$$$&1=$,$"$k$+(B -$B$i$G$9!#(B - -@item W t -@item t -@kindex W t ($B35N,(B) -@kindex t ($B35N,(B) -@findex gnus-article-toggle-headers -$B5-;v%P%C%U%!$K$9$Y$F$N%X%C%@!<$rI=<($9$k$+$I$&$+$r@Z$jBX$($^(B -$B$9(B (@code{gnus-article-toggle-headers})$B!#(B - -@item W v -@kindex W v ($B35N,(B) -@findex gnus-summary-verbose-header -$B5-;v%P%C%U%!$K$9$Y$F$N%X%C%@!<$r1J1s$KI=<($9$k$+$I$&$+$r@Z$jBX$($^(B -$B$9(B (@code{gnus-summary-verbose-header})$B!#(B - -@item W m -@kindex W m ($B35N,(B) -@findex gnus-summary-toggle-mime -$BI=<($9$kA0$K5-;v$K(B @sc{mime} $B=hM}$r!$l$NJ,$N:G=i$N8l$rBgJ8;z$K$7$^(B -$B$9(B (@code{gnus-article-capitalize-sentences})$B!#(B - -@item W c -@kindex W c ($B35N,(B) -@findex gnus-article-remove-cr -CRLF $B$NAH(B ($B$9$J$o$A!"9T$N:G8e$N(B @samp{^M}) $B$r(B LF $B$KJQ49$7$^$9(B ($B$3$l(B -$B$O(B DOS $B$N9TKv$N@$OC$r$7$^$9(B)$B!"$=$7$F$=$l$+$i;D$j$N(B CR $B$r(B LF $B$KJQ49$7$^(B -$B$9(B ($B$3$l$O(B MAC $B$N9TKv$N@$OC$r$7$^$9(B) (@code{gnus-article-remove-cr})$B!#(B - -@c @item W q -@c @kindex W q (Summary) -@c @findex gnus-article-de-quoted-unreadable -@c Treat quoted-printable (@code{gnus-article-de-quoted-unreadable}). -@c Quoted-Printable is one common @sc{mime} encoding employed when sending -@c non-ASCII (i. e., 8-bit) articles. It typically makes strings like -@c @samp{d,Ai(Bj,A`(B vu} look like @samp{d=E9j=E0 vu}, which doesn't look very -@c readable to me. Note that the this is usually done automatically by -@c Gnus if the message in question has a @code{Content-Transfer-Encoding} -@c header that says that this encoding has been done. -@c If a prefix is given, a charset will be asked for. - -@c @item W 6 -@c @kindex W 6 (Summary) -@c @findex gnus-article-de-base64-unreadable -@c Treat base64 (@code{gnus-article-de-base64-unreadable}). -@c Base64 is one common @sc{mime} encoding employed when sending non-ASCII -@c (i. e., 8-bit) articles. Note that the this is usually done -@c automatically by Gnus if the message in question has a -@c @code{Content-Transfer-Encoding} header that says that this encoding has -@c been done. -@c If a prefix is given, a charset will be asked for. - -@item W Z -@kindex W Z (Summary) -@findex gnus-article-decode-HZ -HZ $B$^$?$O(B HZP $B$r=hM}$7$^$9!#(BHZ ($B$^$?$O(B HZP) $B$OCf9q8l$N5-;v$rEAAw$9$k$H$-(B -$B$K;H$o$l$k0lHLE*$JId9f$G$9!#$3$l$O(B @samp{~@{<:Ky2;S@{#,NpJ)l6HK!#~@}} $B$N(B -$B$h$&$JE57?E*$JJ8;zNs$r:n$j$^$9!#(B - -@c @item W h -@c @kindex W h (Summary) -@c @findex gnus-article-wash-html -@c Treat HTML (@code{gnus-article-wash-html}). -@c Note that the this is usually done automatically by Gnus if the message -@c in question has a @code{Content-Type} header that says that this type -@c has been done. -@c If a prefix is given, a charset will be asked for. - -@item W f -@kindex W f ($B35N,(B) -@cindex x-face -@findex gnus-article-display-x-face -@findex gnus-article-x-face-command -@vindex gnus-article-x-face-command -@vindex gnus-article-x-face-too-ugly -@iftex -@iflatex -\include{xface} -@end iflatex -@end iftex -@c @anchor{X-Face} -$B$9$Y$F$N(B X-Face $BMs$rC5$7$FI=<($7$^$9(B(@code{gnus-article-display-x-face})$B!#(B -$B$3$NL?Na$OJQ?t(B @code{gnus-article-x-face-command} $B$K$h$C$FM?$($i$l$?4X?t(B -$B$K$h$C$F%W%m%0%i%`$K$D$$$F$O!"(B -`compface' $B$d(B GNU/Linux $B%7%9%F%`$K$*$1$k(B `faces-xface' $B$N$h$&$J%Q%C%1!<(B -$B%8$rC5$7$F2<$5$$!#(B} $B$r%U%)!<%/$7$F8+$h$&$H$7$^$9!#(BXEmacs $B$G$N%G%#%U%)%k(B -$B%H$NF0:n$O(B @code{From} $BMs$NA0$K4i$rI=<($7$^$9!#(B(XEmacs $B$,(B X-Face $B5!G=IU(B -$B$-$G%3%s%Q%$%k$5$l$F$$$k$HNI$$$G$7$g$&!=!=$=$l$OI=<($r>/$7Aa$/$7$^$9!#$b(B -$B$7:,K\E*(B X-Face $B5!G=$,$J$$$N$G$"$l$P!"(Bgnus $B$O(B @code{pbmplus} $B$d$=$NCg4V(B -$B$N30It%W%m%0%i%`$r;H$C$F(B @code{X-Face} $BMs$rJQ49$7$h$&$H;n$_$^$9!#(B) $B$3$N(B -$B4X?t$rI=<(%U%C%/$KF~$l$?$$$N$G$"$l$P!"$*$=$i$/$=$l$O:G8e$K$J$k$Y$-$G$7$g(B -$B$&!#(B - -@item W b -@kindex W b ($B35N,(B) -@findex gnus-article-add-buttons -$B%/%j%C%/$G$-$k%\%?%s$r5-;v$K2C$($^$9(B (@code{gnus-article-add-buttons})$B!#(B -@xref{Article Buttons}. - -@item W B -@kindex W B ($B35N,(B) -@findex gnus-article-add-buttons-to-head -$B%/%j%C%/$G$-$k%\%?%s$r5-;v$N%X%C%@!<$K2C$($^(B -$B$9(B (@code{gnus-article-add-buttons-to-head})$B!#(B - -@item W p -@kindex W p ($B35N,(B) -@findex gnus-article-verify-x-pgp-sig -$B=pL>IU$-%3%s%H%m!<%k%a%C%;!<%8$NG'>Z$r9T$J$$$^(B -$B$9(B (@code{gnus-article-verify-x-pgp-sig})$B!#(B -@code{newgroup} $B$d(B @code{checkgroups} $B$H$$$C$?%3%s%H%m!<%k%a%C%;!<%8$O!"(B -$BDL>o$=$N%K%e!<%9%0%k!<%W3,AX$N%a%$%s%F%$%J!<$K$h$C$F=pL>$5$l$F$$$^$9!#G'(B -$B>Z$r9T$J$&$?$a$K$O!"%a%$%s%F%$%J!<$N8x3+80$r$"$J$?$N%-!<%j%s%0$KDI2C$7$J(B -$B$1$l$P$J$j$^$;$s!#(B@footnote{$BB?$/$N%K%e!<%9%0%k!<%W3,AX$N%a%$%s%F%$%J!<(B -$B$N(B PGP $B$N80$O(B @uref{ftp://ftp.isc.org/pub/pgpcontrol/README.html} $B$+$iF~(B -$Be$N;0$D$NL?Na$r$9$Y$F9T$$$^$9(B (@code{gnus-article-strip-blank-lines})$B!#(B - -@item W E A -@kindex W E A ($B35N,(B) -@findex gnus-article-strip-all-blank-lines -$B$9$Y$F$N6uGr9T$rC5n$7$^(B -$B$9(B (@code{gnus-article-strip-trailing-space})$B!#(B -@end table - -$B5-;v$N@vBu$r<+F0E*$K$9$k$?$a$NJ}K!$O(B @xref{Customizing Articles} $B$r;2>H(B -$B$7$F2<$5$$!#(B - -@node Article Buttons -@subsection $B5-;v$N%\%?%s(B -@cindex buttons - -$B$h$/5-;v$NCf$KB>$N$b$N$X$N;2>H$,F~$l$i$l$k;v$,$"$j$^$9!#$=$7$F!"(Bgnus $B$,(B -$B$=$l$K4X$9$k;v$r!"$=$l$i$N;2>H$N>e$G(B @kbd{RET} $B$rBG$D$+!"%^%&%9$N??Cf$N(B -$B%\%?%s$r;H$&;v$K$h$C$F!":G>.8B$NEXNO$GH$K(B@dfn{$B%\%?%s(B}$B$rIU$1$^$9(B: $B$A$c$s$H(B -$B$7$?(B URL$B!"%a!<%k%"%I%l%9!"(BMessage-ID $B$G$9!#$3$l$OFs$D$NJQ?t$K$h$C$F@)8f(B -$B$5$l$F$$$F!"$=$N0l$D$O5-;v$NK\BN$r07$$!"$b$&0l$D$O5-;v$N%X%C%@!<$r07$$$^(B -$B$9!#(B - -@table @code -@item gnus-button-alist -@vindex gnus-button-alist -$B$=$l$>$l$NF~NOMWAG$,H$G$"$k$H$_$J$5$l$^$9!#(B -$B$3$l$OKd$a9~$^$l$?(B URL $B$K9gCW$9$kE57?E*$J@55,I=8=$G(B -$B$9(B @samp{]*\\)>}$B!#(B - -@item button-par -Gnus $B$O9gCW$7$?$b$N$N$I$NItJ,$,%O%$%i%$%H$5$l$k$N$+$rCN$i$J$1$l$P$J$j$^(B -$B$;$s!#$3$l$O@55,I=8=$N$I$NI{I=8=$,%O%$%i%$%H$5$l$k$+$r;XDj$9$kHV9f$G$9!#(B -$BA4$F$r%O%$%i%$%H$7$?$$$N$J$i!"$3$3$G(B 0 $B$r;H$C$F$/$@$5$$!#(B - -@item use-p -$B$3$N<0$O(B @code{$BI>2A(B} $B$5$l!"7k2L$,(B @code{nil} $B$G$J$1$l$P!"$3$l$O9gCW$G$"(B -$B$k$H$_$J$5$l$^$9!#$3$l$O4V0c$C$?9gCW$rHr$1$k$?$a$KFCJL$JA*JL$r$7$?$$$H$-(B -$B$KLr$KN)$A$^$9!#(B - -@item function -$B$3$N4X?t(B (function) $B$O$3$N%\%?%s$r%/%j%C%/$7$?$H$-$K8F$P$l$^$9!#(B - -@item data-par -@var{button-par} $B$N$h$&$K!"$3$l$OItJ,I=8=$NHV9f$G$9$,!"$3$l$O9gCW$N$I$N(B -$BItJ,$,(B @var{function} $B$K%G!<%?$H$7$FAw$i$l$k$+$r;XDj$7$^$9!#(B -@end table - -$B$G$9$+$i!"(BURL $B$r%\%?%s$K$9$k40A4$JF~NOMWAG$O(B - -@lisp -("]*\\)>" 0 t gnus-button-url 1) -@end lisp - -@item gnus-header-button-alist -@vindex gnus-header-button-alist -$B$=$l$,5-;v$N%X%C%@!<$@$1$KE,MQ$5$l!"$=$l$>$l$NF~NOMWAG$,$I$N%X%C%@!<$K%\(B -$B%?%s2=$rE,MQ$9$k$+$r<($9DI2C$NMWAG$,$"$k;v$r=|$-!"$3$l$OB>$NO"A[%j%9%H$H(B -$BF1$8$h$&$J$b$N$G$9(B: - -@lisp -(HEADER REGEXP BUTTON-PAR USE-P FUNCTION DATA-PAR) -@end lisp - -@var{header} $B$O@55,I=8=$G$9!#(B - -@item gnus-button-url-regexp -@vindex gnus-button-url-regexp -$BKd$a9~$^$l$?(B URL $B$K9gCW$9$k@55,I=8=$G$9!#$=$l$O>e$NJQ?t$N%G%#%U%)%k%H$N(B -$BCM$G;H$o$l$^$9!#(B - -@item gnus-article-button-face -@vindex gnus-article-button-face -$B%\%?%s$K;H$o$l$k%U%'%$%9$G$9!#(B - -@item gnus-article-mouse-face -@vindex gnus-article-mouse-face -$B%^%&%9$N%+!<%=%k$,%\%?%s$N>e$K$"$k$H$-$K;H$o$l$k%U%'%$%9$G$9!#(B -@end table - -$B5-;v$r<+F0E*$K%\%?%s2=$9$kJ}K!$O(B @xref{Customizing Articles} $B$r;2>H$7$F(B -$B2<$5$$!#(B - -@node Article Date -@subsection $B5-;v$NF|IU(B - -$BF|IU$OJ9$$$?;v$NL5$$2?$+JUnA$J;~4VBS(B (timezone) $B$G:n@.$5$l$F$$$k;v$,NI$/(B -$B$"$k$N$G!"5-;v$,Aw$i$l$?$H$-$K2?;~$G$"$C$?$+$rCN$k;v$,$G$-$k$N$OHs>o$KNI(B -$B$$;v$G$7$g$&!#(B - -@table @kbd -@item W T u -@kindex W T u ($B35N,(B) -@findex gnus-article-date-ut -UT ($BJLL>(B GMT, ZULU) $B$GF|IU$rI=<($7$^$9(B (@code{gnus-article-date-ut})$B!#(B - -@item W T i -@kindex W T i ($B35N,(B) -@findex gnus-article-date-iso-8601 -@cindex ISO 8601 -$BF|IU$r9q:]E*$J7A<0!"(BISO 8601 $B$GI=<($7$^(B -$B$9(B (@code{gnus-article-date-iso8601})$B!#(B - -@item W T l -@kindex W T l ($B35N,(B) -@findex gnus-article-date-local -$BF|IU$r$=$NCO0h$N;~4VBS$GI=<($7$^$9(B (@code{gnus-article-date-local})$B!#(B - -@item W T p -@kindex W T p (Summary) -@findex gnus-article-date-english -$BF|IU$r1Q8l$GH/2;$G$-$k7A<0$GI=<($7$^(B -$B$9(B (@code{gnus-article-date-english})$B!#(B - -@item W T s -@kindex W T s ($B35N,(B) -@vindex gnus-article-time-format -@findex gnus-article-date-user -@findex format-time-string -$BF|IU$rMxMQrM}$KCV$-(B -$B49$($k$3$H$G$9!#(B - -$B$3$N9T$,O"B3$7$F99?7$5$l$k$h$&$K$7$?$$$N$G$"$l$P!"(B - -@lisp -(gnus-start-date-timer) -@end lisp - -$B$r$"$J$?$N(B @file{.gnus.el} $B%U%!%$%k$KF~$l$k$+!"2?$+$N%U%C%/$G$NJQ494X?t$r;H$C$F$$$F!"$=$l$,40A4$K4V0c$C$?;v$r$7$F$$$k$N$G$O(B -$B$J$$$+$H?4G[$7$F$$$k$H$-$KLr$KN)$A$^$9!#Nc$($P!"5-;v$,(B 1854$BG/$KEj9F$5$l(B -$B$?$H$J$C$F$$$k$H$7$^$7$g$&!#$7$+$7!"$=$N$h$&$J;v$O(B @emph{$B40A4$K(B }$BIT2DG=(B -$B$G$9!#;d$,?.MQ$G$-$^$;$s$+(B? *$B$/$9$/$9(B($B>P(B)* -@end table - -$B<+F0E*$K9%$`=q<0$GF|IU$rI=<($9$kJ}K!$O(B @xref{Customizing Articles} $B$r;2(B -$B>H$7$F2<$5$$!#(B - -@node Article Signature -@subsection $B5-;v$N=pL>(B -@cindex signatures -@cindex article signature - -@vindex gnus-signature-separator -$B$=$l$>$l$N5-;v$OFs$D$NItJ,$KJ,$1$i$l$^$9!=!=8+=P$7(B (header) $B$HK\(B -$BBN(B (body) $B$G$9!#K\BN$O=pL>ItJ,$HJ8>OItJ,$KJ,$1$i$l$^$9!#$I$l$,=pL>$H$_$J(B -$B$5$l$k$+$r7h$a$kJQ?t$O(B @code{gnus-signature-separator} $B$G$9!#$3$l$OIaDL(B -$B$O(B son-of-RFC 1036 $B$G;X<($5$l$F$$$kI8=`$N(B @samp{^-- $} $B$G$9!#$7$+$7!"B?(B -$B$/$N?M$,I8=`$G$J$$=pL>J,N%$rMQ$$$^$9$N$G!"$3$NJQ?t$O0l$D0l$D;n$5$l$k!"@5(B -$B5,I=8=$N%j%9%H$G$"$k$3$H$b$G$-$^$9!#(B($BC5:w$OK\BN$N:G8e$+$i;O$a$X$H$J$5$l(B -$B$^$9!#(B) $B$h$/$"$j$=$&$JCM$O(B: - -@lisp -(setq gnus-signature-separator - '("^-- $" ; $BI8=`(B - "^-- *$" ; $BIaDL$N2u$7J}(B - "^-------*$" ; $BB?$/$N?M$OD9!$H$_$J$5$l$k(B -$B$+$X$N@)8B$rDs6!$7$^$9!#(B - -@enumerate -@item -$B$3$l$,@0?t$G$"$l$P!"=pL>$O$3$N@0?t$h$j(B ($BJ8;z$G(B) $BD9$/$J$C$F$$$F$O$$$1$^$;(B -$B$s!#(B -@item -$B$3$l$,IbF0>.?tE@?t$G$"$l$P!"=pL>$O$=$N?t;z$h$j(B ($B9T$G(B) $BD9$/$J$C$F$$$F$O$$(B -$B$1$^$;$s!#(B -@item -$B$3$l$,4X?t$G$"$l$P!"$=$N4X?t$O0z?t$J$7$G8F$P$l!"$=$l$,(B @code{nil} $B$rJV$;(B -$B$P!"%P%C%U%!$K$O=pL>$,$"$j$^$;$s!#(B -@item -$B$3$l$,J8;zNs$G$"$l$P!"$=$l$O@55,I=8=$H$7$F;H$o$l$^$9!#$b$7$=$l$,9gCW$9$l(B -$B$P!"$=$NEv$NJ8;zNs$O=pL>$G$O$"$j$^$;$s!#(B -@end enumerate - -$B$3$NJQ?t$OMWAG$,>e$K5s$2$i$l$?7?$N%j%9%H$G$"$k;v$b$G$-$^$9!#$3$l$ONc$G$9(B: - -@lisp -(setq gnus-signature-limit - '(200.0 "^---*Forwarded article")) -@end lisp - -$B$3$l$O=pL>J,N%J*$N8e$K(B 200 $B$rD6$($k9T$+!"=pL>J,N%J*$N8e$NJ8>O$,@55,I=(B -$B8=(B @samp{^---*Forwarded article} $B$K9gCW$9$l$P!"7k6I$=$l$O=pL>$G$O$J$$$H(B -$B$$$&;v$G$9!#(B - -@node Article Miscellania -@subsection $B5-;v$$$m$$$m(B - -@table @kbd -@item A t -@kindex A t (Summary) -@findex gnus-article-babel -$B5-;v$r$"$k8@8l$+$iJL$N$b$N$XJQ49$7$^(B -$B$9(B (@code{gnus-article-babel})$B!#(B -@end table - -@c node `MIME Commands' and node `Charsets' is stripped, which is -@c pGnus specific. - -@node Article Commands -@section $B5-;vL?Na(B - -@table @kbd -@item A P -@cindex PostScript -@cindex printing -@kindex A P ($B35N,(B) -@vindex gnus-ps-print-article -@findex gnus-summary-print-article -$B5-;v%P%C%U%!$N%]%9%H%9%/%j%W%H(B (PostScript) $B%$%a!<%8$r:n@.$7$F0u:~$7$^(B -$B$9(B (@code{gnus-summary-print-article})$B!#(B@code{gnus-ps-print-hook} $B$,%P%C(B -$B%U%!$r0u:~$9$kD>A0$KJ}$GF0:n$7$^(B -$B$9!#8el9g$O!"$9$Y$F$N35N,9T$,0l9T0l9TJB$SBX$($i$l$^$9!#A0l9g$O!"(B -$B:,K\$H:,K\$r4pK\$H$7$FJB$SBX$($i$l!"$=$l$O$"$J$?$,5a$a$F$$$k;v$H$O0[(B -$B$J$C$F$$$k$+$b$7$l$^$;$s!#%9%l%C%I$r;H$&;v$r@Z$jBX$($k$K$O(B @kbd{T T} $B$r(B -$BBG$C$F$/$@$5$$(B (@pxref{Thread Commands})$B!#(B - -@node Finding the Parent -@section $B?F5-;v$rC5$9(B -@cindex parent articles -@cindex referring articles - -@table @kbd -@item ^ -@kindex ^ ($B35N,(B) -@findex gnus-summary-refer-parent-article -$B8=:_$N5-;v$N?F5-;v$rFI$_$?$/$F!"$=$l$,35N,%P%C%U%!$KI=<($5$l$F$$$J$$$/$F(B -$B$b!"$*$=$i$/$=$l$O2DG=$G$7$g$&!#$H$$$&$N$O!"8=:_$N%0%k!<%W(B -$B$,(B @sc{nntp} $B$GC5n$5$l$F$$$J$$>e!"8=:_$N5-(B -$B;v$N(B @code{References} $B$,$V$A2u$5$l$F$$$J$1$l$P!"$?$@!"(B -@kbd{^} $B$+(B @kbd{A r} $B$r2!$;$PNI$$$@$1$G(B -$B$9(B (@code{gnus-summary-refer-parent-article})$B!#$b$7A4$F$,>e/$7;~4V$,(B -$B$+$+$j$^$9!#$b$7!"$3$l$r$7$P$7$P9T$&$N$G$"$l$P!"(B -@code{gnus-fetch-old-headers} $B$r(B @code{invisible} $B$K@_Dj$9$k$3$H$r9M$($?(B -$B$[$&$,NI$$$G$7$g$&(B (@pxref{Filling In Threads})$B!#$3$l$OIaDL$O;k3PE*$J8z(B -$B2L$O$"$j$^$;$s$,!"$3$NL?Na$NF0:n$r$+$J$jB.$/$9$k$G$7$g$&!#$b$A$m$s!"%0%k!<(B -$B%W$KF~$k$N$O>/$7CY$/$J$j$^$9!#(B - -@vindex gnus-refer-thread-limit -$BJQ?t(B @code{gnus-refer-thread-limit} $B$O$3$NL?Na$re=q$-$9$k;v$,$G$-$^$9!#(B - -@item M-^ ($B35N,(B) -@findex gnus-summary-refer-article -@kindex M-^ ($B35N,(B) -@cindex Message-ID -@cindex fetching by Message-ID -$B$I$N%0%k!<%W$KB0$7$F$$$k$+$K4X$o$i$:!"G$0U$N5-;v$r(B @sc{nntp} $B%5!<%P!<$K(B -$B?R$M$k;v$,$G$-$^$9!#(B -@kbd{M-^} (@code{gnus-summary-refer-article}) $B$O(B @code{Message-ID}$B!"$=$l(B -$B$O$"$ND9$/!"$J$+$J$+FI$`;v$N$G$-$J(B -$B$$(B @samp{<38o6up$6f2@@hymir.ifi.uio.no>} $B$N$h$&$J;2>H$r$"$J$?$K?R$M$^$9!#(B -$B$"$J$?$O$9$Y$F$r@53N$KBG$A9~$^$J$1$l$P$J$j$^$;$s!#;DG0$J$,$i!"$"$$$^$$$J(B -$B8!:w$O$G$-$J$$$N$G$9!#(B -@end table - -$B%K%e!<%9$G$J$$A*BrJ}K!$+$i(B @code{Message-ID} $B$Ge=q$-$9$k;v$,(B -$B$G$-$^$9!#(B - -@vindex gnus-refer-article-method -$B$b$7$"$J$?$NFI$s$G$$$k%0%k!<%W$,(B @code{Message-ID} $B$G$Nl9g!"(B -@code{gnus-refer-article-method} $B$r(B @sc{nntp} $B$K@_Dj$9$k;v$,$G$-$^$9!#$*(B -$B$=$i$/!"$"$J$?$,2qOC$7$F$$$k(B @sc{nntp} $B%5!<%P!<$,$"$J$?$NFI$s$G$$$k%9%W!<(B -$B%k$r99?7$7$F$$$k$HHs>o$KNI$$$G$7$g$&!#$7$+$7!"$=$l$O$I$&$7$F$bI,MW$J$o$1(B -$B$G$O$"$j$^$;$s!#(B - -$B$=$l$OA*BrJ}K!$N%j%9%H$G$"$k$3$H$b$G$-!"FCJL$J%7%s%\%k(B @code{current} $B$G(B -$B$"$k$3$H$b$G$-$^$9!#8el9g$O!"(Bgnus $B$O9g$&$b$N$rH/8+$9$k$^$G%j%9%H$NA4$F$NJ}K!$r;n$7$^$9!#(B - -$B$3$l$O8=:_$NJ}K!$r;n$7$F!"$=$l$,<:GT$7$?>l9g$K$O(B Deja $B$K?V$/@_Dj$NNc$G$9(B: - -@lisp -(setq gnus-refer-article-method - '(current - (nnweb "refer" (nnweb-type dejanews)))) -@end lisp - -$B$[$H$s$I$N%a!<%k%P%C%/%(%s%I$O(B @code{Message-ID} $B$G$N$N$b$N$O;~4V$,$+$+$j$9$.$^$9!#(B) -@code{nnmh} $B$G$OA4$/IT2DG=$G$9!#(B - -@node Alternative Approaches -@section $BBeBX/$7$NA*Br;h$rM?$($F$"$j$^$9!#(B - -@menu -* Pick and Read:: $B$^$:!"5-;v$K0u$rIU$1$F!"$=$l$+$iFI$`(B -* Binary Groups:: $B$9$Y$F$N5-;v$r<+F0(B-$BI|9f2=$9$k(B -@end menu - -@node Pick and Read -@subsection $BA*$s$GFI$`(B -@cindex pick and read - -$B$$$/$D$+$N%K%e!<%9%j!<%@!<(B (@code{nn} $B$d!"$"$N$)!"(BVM/CMS $B$G(B -$B$N(B @code{Netnews} $B$J$I(B) $B$OFsAj$NFI$`$?$a$N3&LL$r;H$$$^$9!#MxMQ/(B -$B$7$N%W%m%;%90uL?Na$,0lBG80L?Na$K$J$j!"35N,%P%C%U%!$X@Z$jBX$($k$?$a$NDI2C(B -$BL?Na$r0l$DDs6!$7$^$9!#(B - -$B$3$l$,(B pick mode $B$r;H$C$?$H$-$K;HMQ2DG=$J%-!<$G$9(B: - -@table @kbd -@item . -@kindex . ($BA*Br(B) -@findex gnus-pick-article-or-thread -$B8=:_$N9T$N5-;v$+%9%l%C%I$rA*Br$7$^(B -$B$9(B (@code{gnus-pickd-article-or-thread})$B!#$b$7JQ(B -$B?t(B @code{gnus-thread-hide-subtree} $B$,(B true $B$G$"$l$P!"$3$N%-!<$O%9%l%C%I(B -$B$N:G=i$N5-;v$G;H$o$l$?$H$-$O%9%l%C%IA4BN$rA*Br$7$^$9!#$=$&$G$J$1$l$P!"$=(B -$B$l$O$=$N5-;v$@$1$rA*Br$7$^$9!#$b$7?tCM@\F,0z?t$rM?$($i$l$l$P$=$N%9%l%C%I(B -$B$+5-;v$X$H@8$s$G$$$-!"$=$l$rA*Br$7$^$9!#(B($B9T?t$OIaDL$O35N,A*Br9T$N:G=i$K(B -$BI=<($5$l$F$$$^$9!#(B) - -@item SPACE -@kindex SPACE ($BA*Br(B) -@findex gnus-pick-next-page -$B35N,%P%C%U%!$r0l%Z!<%8l9g$O$=$l$O5-;v$@(B -$B$1$rL$A*Br$K$7$^$9!#$=$N9T$K$"$k%9%l%C%I$+5-;v$rL$A*Br$K$9$k$?$a$K$3$N%-!<(B -$B$K?tCM@\F,0z?t$rM?$($k;v$,$G$-$^$9!#(B - -@item RET -@kindex RET ($BA*Br(B) -@findex gnus-pick-start-reading -@vindex gnus-pick-display-summary -$BA*Br$5$l$?5-;v$rFI$_;O$a$^$9(B (@code{gnus-pick-start-reading})$B!#@\F,0z?t(B -$B$rM?$($i$l$l$P!"$^$:$9$Y$F$NL$A*Br5-;v$K4{FI$N0u$rIU$1$^$9!#(B -@code{gnus-pick-display-summary} $B$,(B @code{nil} $B$G$J$$$H!"35N,%P%C%U%!$O(B -$BFI$s$G$$$k4V$bI=<($5$l$^$9!#(B -@end table - -$BA4$F$NIaDL$N35N,%b!<%IL?Na$OA*Br%b!<%I(B (pick-mode)$B$G$b;HMQ2DG=$G$9$,!"(B -@kbd{u} $B$ONc30$G$9!#$7$+$7!"F1$84X(B -$B?t(B @code{gnus-summary-tick-article-forward} $B$K3d$jEv$F$i$l$F$$(B -$B$k(B @kbd{!} $B$r;H$&;v$,$G$-$^$9!#(B - -$B$3$l$,NI$$9M$($@$H;W$&$N$G$"$l$P!"/$70c$$$^$9!#$=$l$>$l$N9T$N(B -$B:G=i$K9T?t$,I=<($5$l$^$9!#(BPick $B%b!<%I$N9T$NMM<0$OJQ(B -$B?t(B @code{gnus-summary-pick-line-format} $B$G@)8f$5$l$^(B -$B$9(B (@pxref{Formatting Variables})$B!#$3$l(B -$B$O(B @code{gnus-summary-line-format} $B$HF1$8MM<0;XDj$r/$7$"$j$^$9(B: - -@table @code -@item gnus-tree-mode-hook -@vindex gnus-tree-mode-hook -$B$9$Y$F$NLZ%b!<%I%P%C%U%!$GH$7$F$/$@$5$$!#(B - -@item gnus-selected-tree-face -@vindex gnus-selected-tree-face -$BLZ%P%C%U%!$GA*Br$5$l$?5-;v$r%O%$%i%$%H$9$k$?$a$K;H$o$l$k%U%'%$%9$G$9!#%G%#(B -$B%U%)%k%H$G$O(B @code{modeline} $B$G$9!#(B - -@item gnus-tree-line-format -@vindex gnus-tree-line-format -$BLZ$N@a$N$?$a$N%U%)!<%^%C%HJ8;zNs$G$9!#$G$b$3$NL>A0$O>/$78m$C$?L>>N$G(B -$B$9!=!=$=$l$O9T$G$O$J$/!"$?$@@a$rDj5A$9$k$@$1$G$9!#%G%#%U%)%k%H$NCM(B -$B$O(B @samp{%(%[%3,3n%]%)} $B$G!"$=$l$OEj9FA0$N:G=i$N;0J8;z$rI=<($7$^$9!#(B -$B$9$Y$F$N@a$,F1$8D9$5$G$"$k$N$O=EMW$G$9$N$G!"(B@samp{%4,4n} $B$N$h$&$J;XDj(B -$B$r(B @emph{$B;H$o$J$1$l$P$J$i$J$$(B} $B$N$G$9!#(B - -$BM-8z$J;XDj$O(B: - -@table @samp -@item n -$BEj9FA0!#(B -@item f -@code{From} $BMs!#(B -@item N -$B5-;v$NHV9f!#(B -@item [ -$B3+$-3g8L!#(B -@item ] -$BJD$83g8L!#(B -@item s -$BI=Bj!#(B -@end table - -@xref{Formatting Variables}$B!#(B - -$BI=<($K4XO"$7$?JQ?t$O(B: - -@table @code -@item gnus-tree-brackets -@vindex gnus-tree-brackets -$B$3$l$O!XK\Ev$N!Y5-;v$H!X$^$P$i5-;v!Y$K0c$$$rIU$1$k$?$a$K;H$o$l$^$9!#MM<0(B -$B$O(B @code{((@var{$BK\Ev$N3+(B} . @var{$BK\Ev$NJD(B}) (@var{$B$^$P$i3+(B} . @var{$B$^$P$iJD(B}) (@var{$B56$N3+(B} . @var{$B56$NJD(B}))} $B$H(B -$B$J$C$F$$$F!"%G%#%U%)%k%H(B -$B$O(B @code{((?[ . ?]) (?( . ?)) (?@{ . ?@}) (?< . ?>))} $B$G$9!#(B - -@item gnus-tree-parent-child-edges -@vindex gnus-tree-parent-child-edges -$B$3$l$O?F$N@a$r;R$K@\B3$9$k$?$a$K;H$o$l$kJ8;z$r4^$s$@%j%9%H$G$9!#%G%#%U%)(B -$B%k%H$O(B @code{(?- ?\\ ?|)} $B$G$9!#(B -@end table - -@item gnus-tree-minimize-window -@vindex gnus-tree-minimize-winodw -$B$b$7$3$NJQ?t$,(B @code{nil} $B$G$J$$$H!"B>$N(B gnus $B%&%#%s%I%&$,$b$C$H>l=j$r.$5$/$7$^$9!#$b$7$3$NJQ?t$,?t;z(B -$B$G$"$k$H!"LZ%P%C%U%!$O$=$N?t;z$h$jBg$-$/$J$k;v$O$"$j$^$;$s!#%G%#%U%)%k%H(B -$B$O(B @code{t} $B$G$9!#%U%l!<%`$G$$$/$D$+$N%&%#%s%I%&$,2#$KJB$s$GI=<($5$l$F$$(B -$B$F!"LZ%P%C%U%!$,$=$N$&$A$N0l$D$G$"$k>l9g!"LZ%&%#%s%I%&$r:G>.2=$9$k$3$H$O(B -$B$=$NNY$KI=<($5$l$F$$$k$9$Y$F$N%&%#%s%I%&$NBg$-$5$rJQ99$9$k;v$KCm0U$7$F$/(B -$B$@$5$$!#(B - -@item gnus-generate-tree-function -@vindex gnus-generate-tree-function -@findex gnus-generate-horizontal-tree -@findex gnus-generate-vertical-tree -$BLZ%P%C%U%!(B (vertical tree buffer) $B$GI=<($5$l$?$b$N$G$9(B: - -@example -@{***@} - |--------------------------\-----\-----\ -(***) [Bjo] [Gun] [Gun] - |--\-----\-----\ | -[odd] [Jan] [odd] (***) [Jor] - | | |--\ -[Gun] [Eri] [Eri] [odd] - | - [Paa] -@end example - -$B$b$7?eJ?LZ$r;H$C$F$$$k$N$J$i!"35N,%P%C%U%!$GLZ$rNY$j9g$o$;$GI=<($G$-$l$P(B -$B4r$7$$$G$7$g$&!#C5n$9$k$H$$$&$3(B -$B$H$G$9!#(B(@pxref{Expiring Mail})$B!#(B - -@item B M-C-e -@kindex B M-C-e ($B35N,(B) -@findex gnus-summary-expire-articles-now -$B%0%k!<%W$N$9$Y$F$N4|8B:o=|2DG=$J5-;v$r:o=|$7$^(B -$B$9(B (@code{gnus-summay-expire-articles-now})$B!#$3$l$O8=:_$N%0%k!<%W$N3:Ev(B -$B$9$k(B @strong{$BA4$F(B}$B$N4|8B:o=|5-;v$O1J1s$K6u$NBg$-$J(B @file{/dev/null} $B$X>C(B -$B$(5n$k$H$$$&;v$G$9!#(B - -@item B DEL -@kindex B DEL ($B35N,(B) -@findex gnus-summary-delete-article -@c @icon{gnus-summary-mail-delete} -$B%a!<%k5-;v$r:o=|$7$^$9!#$3$l$O!X$"$J$?$N%G%#%9%/$+$i:#$+$i1J1s$K:o=|$7$F!"(B -$BFsEY$HLa$i$J$$!Y$N!X:o=|!Y$G$9!#Cm0U$7$F;H$C$F$/$@$5(B -$B$$(B (@code{gnus-summary-delete-article})$B!#(B - -@item B m -@kindex B m ($B35N,(B) -@cindex move mail -@findex gnus-summary-move-article -@vindex gnus-preserve-marks -$B$"$k%a!<%k%0%k!<%W$+$iJL$N$H$3$m$X5-;v$r0\F0$7$^(B -$B$9(B (@code{gnus-summary-move-article})$B!#(B@var{gnus-preserve-marks} $B$NCM(B -$B$,(B nil $B$G$O$J$$$J$i$P(B ($B$3$l$,=i4|CM$G$9$,(B)$B!"%^!<%/$OJ]B8$5$l$^$9!#(B - -@item B c -@kindex B c ($B35N,(B) -@cindex copy mail -@findex gnus-summary-copy-article -@c @icon{gnus-summary-mail-copy} -$B$"$k%0%k!<%W(B ($B%a!<%k%0%k!<%W$dB>$N$b$N(B) $B$+$i%a!<%k%0%k!<%W$K5-;v$rJ#@=$7(B -$B$^$9(B (@code{gnus-summary-copy-article})$B!#(B@var{gnus-preserve-marks} $B$NCM(B -$B$,(B nil $B$G$O$J$$$J$i$P(B ($B$3$l$,=i4|CM$G$9$,(B)$B!"%^!<%/$OJ]B8$5$l$^$9!#(B - -@item B B -@kindex B B ($B35N,(B) -@cindex crosspost mail -@findex gnus-summary-crosspost-article -$B8=:_$N5-;v$rB>$N%0%k!<%W$K%/%m%9%]%9%H$7$^(B -$B$9(B (@code{gnus-summary-crosspost-article})$B!#$3$l$OB>$N%0%k!<%W5-;v$N?7$7(B -$B$$J#@=$r:n@.$7!"5-;v$N(B Xref $BMs$bE,@Z$K99?7$5$l$^$9!#(B - -@item B i -@kindex B i ($B35N,(B) -@findex gnus-summary-import-article -$BG$0U$N%U%!%$%k$r8=:_$N%a!<%k%0%k!<%W$K$H!"(B -@code{From} $BMs$H(B @code{Subject} $BMs$NF~NO$rB%$5$l$^$9!#(B - -@item B r -@kindex B r ($B35N,(B) -@findex gnus-summary-respool-article -$B%a!<%k5-;v$r%9%W!<%k$7D>$7$^$9(B (@code{gnus-summary-move-article})$B!#(B -@code{gnus-summary-respool-default-method} $B$,:F%9%W!<%k$9$k$H$-$N%G%#%U%)(B -$B%k%H$NA*BrJ}K!$H$7$F;HMQ$5$l$^$9!#$3$NJQ?t$O%G%#%U%)%k%H$G(B @code{nil} $B$G!"(B -$B$3$l$O8=:_$N%0%k!<%W$NA*BrJ}K!$,Be$o$j$K;H$o$l$k$H$$$&;v$G$9!#(B -@var{gnus-preserve-marks} $B$NCM$,(B nil $B$G$O$J$$$J$i$P(B ($B$3$l$,=i4|CM$G$9$,(B)$B!"(B -$B%^!<%/$OJ]B8$5$l$^$9!#(B - -@item B w -@itemx e -@kindex B w ($B35N,(B) -@kindex e ($B35N,(B) -@findex gnus-summary-edit-article -@kindex C-c C-c ($B5-;v(B) -$B8=:_$N5-;v$rJT=8$7$^$9(B (@code{gnus-summary-edit-article})$B!#JT=8$r=*N;$7(B -$B$FJQ99$r1J1s$K$9$k$?$a$K!"(B@kbd{C-c C-c} $B$rBG$A$^$9!#$b$7L?(B -$BNa(B @kbd{C-c C-c} $B$K?tCM@\F,0z?t$rM?$($k$H!"(Bgnus $B$O5-;v$r:F%O%$%i%$%H$7$^(B -$B$;$s!#(B - -@item B q -@kindex B q ($B35N,(B) -@findex gnus-summary-respool-query -$B$b$75-;v$r:F%9%W!<%k$7$?$$$H$-$O!":F%9%W!<%k$r$9$kA0$K$I$N%0%k!<%W$K5-;v(B -$B$,0\$k$+$K6=L#$,$"$k$G$7$g$&!#$3$NL?Na$G$=$l$,$o$+$j$^(B -$B$9(B (@code{gnus-summary-respool-query})$B!#(B - -@item B t -@kindex B t ($B35N,(B) -@findex gnus-summary-respool-trace -$BF1MM$K!"$3$NL?Na$O:FN/$a9~$_$r$9$k$H$-$K;H$o$l$?A4$F$NFC5iJ,3dJ}<0$r!"$b(B -$B$7$=$l$,$"$l$PI=<($7$^$9(B (@code{gnus-summary-respool-trace})$B!#(B - -@item B p -@kindex B p ($B35N,(B) -@findex gnus-summary-article-posted-p -$B0lIt$N?M$O$"$J$?$NEj9F$X$N%U%)%m!<%"%C%W$r$9$k$H$-$K!"!X?F@Z$J!YJ#@=$rAw(B -$B$k798~$,$"$j$^$9!#$3$l$i$OIaDL$O$=$3$K(B @code{Newsgroups} $BMs$,IU$$$F$$$k(B -$B$N$G$9$,!"$$$D$b$=$&$G$"$k$H$O8B$j$^$;$s!#$3$NL?(B -$BNa(B (@code{gnus-summary-article-posted-p}) $B$O8=:_$N5-;v$r$"$J$?$N%K%e!<%9(B -$B%5!<%P!<$+$i(B ($B$H$$$&$h$j$O!"$`$7(B -$B$m(B @code{gnus-refer-article-method} $B$d(B @code{gnus-select-method} $B$+(B -$B$i(B) $B$r;H$&$N$KBP$7(B -$B$F(B @code{gnus-move-split-methods} $B$O%0%k!<%WL>$r;H$&$3$H$KCm0U$7$F2<$5(B -$B$$!#(B) - -@lisp -(setq gnus-move-split-methods - '(("^From:.*Lars Magne" "nnml:junk") - ("^Subject:.*gnus" "nnfolder:important") - (".*" "nnml:misc"))) -@end lisp - -@node Various Summary Stuff -@section $B$$$m$$$m$J35N,$NJ*7o(B - -@menu -* Summary Group Information:: $B>pJs;X8~$NL?Na(B -* Searching for Articles:: $BJ#?t5-;vL?Na(B -* Summary Generation Commands:: -* Really Various Summary Commands:: $B$"$N$d$C$+$$$JB>$KE,9g$7$J$$L?Na(B -@end menu - -@table @code -@vindex gnus-summary-mode-hook -@item gnus-summary-mode-hook -$B35N,%b!<%I%P%C%U%!$r:n@.$9$k$H$-$K$3$N%U%C%/$,8F$P$l$^$9!#(B - -@vindex gnus-summary-generate-hook -@item gnus-summary-generate-hook -$B$3$l$O%9%l%C%I:n@.$H35N,%P%C%U%!:n@.$NA0$Ko$KJXMx$G$9!#$3$N%U%C%/$O$[$H$s$I$N35N,%P%C%U%!(B -$BJQ?t$,@_Dj$5$l$?8e$K8F$P$l$^$9!#(B - -@vindex gnus-summary-prepare-hook -@item gnus-summary-prepare-hook -$B$=$l$O35N,%P%C%U%!$,:n@.$5$l$?8e$K8F$P$l$^$9!#Nc$($P!"$=$l$O2?$+B>$N$N5-;v$HF1$8$h$&$KI=<($7$^$9!#$3$NJQ?t$,(B @code{t} $B$G$"$k$H!"(B -$B$=$l$O5-;v$rI=<($7$^$;$s(B---$B:G=i$+$iB8:_$7$J$+$C$?$+$N$h$&$K!#(B - -@vindex gnus-alter-articles-to-read-function -@item gnus-alter-articles-to-read-function -$B$3$NJQ?t$K@_Dj$7$?4X?t$G!"A*Br$9$k5-;v$N%j%9%H$rJQ99$9$k$3$H$,$G$-$^$9!#(B -$B4X?t$OFs$D$N0z?t(B ($B%0%k!<%WL>$HA*Br$9$k5-;v$N%j%9%H(B) $B$rpJs(B - -@table @kbd -@item H f -@kindex H f ($B35N,(B) -@findex gnus-summary-fetch-faq -@vindex gnus-grou-faq-directory -$B8=:_$N%0%k!<%W$N(B FAQ (frequently asked questions ($BIQHK$K$5$l$kl9g$O!"$3$NL?Na$K@\F,0z?t$rM?$($k;v$G$$$m$$$m$J%5%$(B -$B%H(B (site) $B$+$iA*$V;v$,$G$-$^$9!#$*$=$i$/(B @code{ange-ftp} $B$b$7$/(B -$B$O(B @code{efs} $B$,%U%!%$%k$No$KC;$$5-=R$rM?$($^(B -$B$9(B (@code{gnus-summary-describe-briefly})$B!#(B - -@item H i -@kindex H i ($B35N,(B) -@findex gnus-info-find-node -Gnus $B$N(B info $B$N@a(B (node) $B$K0\F0$7$^$9(B (@code{gnus-info-find-node})$B!#(B -@end table - -@node Searching for Articles -@subsection $B5-;v$rC5$9(B - -@table @kbd -@item M-s -@kindex M-s ($B35N,(B) -@findex gnus-summary-search-article-forward -$BD>8e$K$"$kA4$F$N(B ($B@8$N(B) $B5-;v$r@55,I=8=$G8!:w$7$^(B -$B$9(B (@code{gnus-summary-search-article-forward})$B!#(B - -@item M-r -@kindex M-r ($B35N,(B) -@findex gnus-summary-search-article-backward -$BA0$K$"$kA4$F$N(B ($B@8$N(B) $B5-;v$r@55,I=8=$G8!:w$7$^(B -$B$9(B (@code{gnus-summary-search-article-backward})$B!#(B - -@item & -@kindex & ($B35N,(B) -@findex gnus-summary-execute-command -$B$3$NL?Na$O$"$J$?$K%X%C%@!l9g(B -$B$K$N5-;v$N=8$^$j$G$"$k$J$i$P(B ($BNc$($P!"E&MW(B (digest))$B!"(B -$B$=$N$h$&$J5-;v$G$G$-$F$$$k%0%k!<%W$KF~$k$?$a$K$3$NL?Na$r;H$&$+$b$7$l$^$;(B -$B$s(B(@code{gnus-summary-enter-digest-group})$B!#(BGnus $B$O$3$NL?Na$K@\F,0z?t$r(B -$BM?$($J$$8B$j!"$I$N$h$&$J7?$N5-;v$,8=:_I=<($5$l$F$$$k$+$r?dB,$7$h$&$H$7!"(B -$B$=$l$O6/@)E*$K!XE&MW!Y$H$$$&2r$NMM<0$+$i$J$kB>(B -$B$N%a%C%;!<%8$N=89g$G$"$C$?$H$-$O!"(B@kbd{C-d} $B$H$9$k$3$H$K$h$j$b$C$HJXMx$J(B -$BJ}K!$G$=$l$i$N%a%C%;!<%8$rFI$`;v$,$G$-$k$h$&$K$J$j$^$9!#(B - -@item M-C-d -@kindex M-C-d ($B35N,(B) -@findex gnus-summary-read-document -$B$3$NL?Na$O>e$N$b$N$KHs>o$K;w$F$$$^$9$,!"$$$/$D$+$NJ8=q$r0l$D$NBg!<$-$$%0(B -$B%k!<%W$K=8$a$^$9(B (@code{gnus-summary-read-read-document})$B!#$=$l$O$$$/$D(B -$B$+$N(B @code{nndoc} $B%0%k!<%W$r$=$l$>$l$NJ8=q$N$?$a$K(B $B3+$-!"$=$l$+$i$3$l$i(B -$B$N(B @code{nndoc} $B%0%k!<%W$N>e$K(B @code{nnvirtual} $B%0%k!<%W$r3+$/;v$K$h$C$F(B -$B$3$N;v$r2DG=$K$7$F$$$^$9!#$3$NL?Na$O%W%m%;%9(B/$B@\F,0z?t$N=,47$rM}2r$7$^(B -$B$9(B (@pxref{Process/Prefix})$B!#(B - -@item C-t -@kindex C-t ($B35N,(B) -@findex gnus-summary-togle-truncation -$B35N,9T$N@ZCG$r@Z$jBX$($^$9(B (@code{gnus-summary-toggle-truncation})$B!#$3$l(B -$B$O$*$=$i$/35N,%P%C%U%!$N9TCf1{I=<(4X?t$r:.Mp$5$;$^$9$N$G!"5-;v$rFI$s$G$$(B -$B$k4V$K@ZCG$r@Z$C$F$$$k$N$ONI$$9M$($G$O$J$$$G$7$g$&!#(B - -@item = -@kindex = ($B35N,(B) -@findex gnus-summary-expand-window -$B35N,%P%C%U%!$N%&%#%s%I%&$r3HBg$7$^(B -$B$9(B (@code{gnus-summary-expand-window})$B!#@\F,0z?t$rM?$($i$l$l$P!"(B -@code{$B5-;v(B} $B%&%#%s%I%&$r3HBg$7$^$9!#(B - -@item M-C-e -@kindex M-C-e ($B35N,(B) -@findex gnus-summary-edit-parameters -$B8=:_$N%0%k!<%W$N%0%k!<%W$NG^2pJQ?t(B (parameter) (@pxref{Group -Parameters}) $B$rJT=8$7$^$9(B (@code{gnus-summary-edit-parameters})$B!#(B - -@item M-C-a -@kindex M-C-a ($B35N,(B) -@findex gnus-summary-customize-parameters -$B8=:_$N%0%k!<%W$N%0%k!<%W%Q%i%a!<%?(B (@pxref{Group Parameters}) $B$r%+%9%?%^(B -$B%$%:$7$^$9(B (@code{gnus-summary-customize-parameters})$B!#(B -@end table - -@node Exiting the Summary Buffer -@section $B35N,%P%C%U%!$rH4$1$k(B -@cindex summary exit -@cindex exiting groups - -$BIaDL$O35N,%P%C%U%!$+$iH4$1$k$H!"%0%k!<%W$NA4$F$N>pJs$r99?7$7$F%0%k!<%W%P%C(B -$B%U%!$KLa$j$^$9!#(B - -@table @kbd -@item Z Z -@itemx q -@kindex Z Z (Summary) -@findex q ($B35N,(B) -@findex gnus-summary-exit -@vindex gnus-summary-exit-hook -@vindex gnus-summary-prepare-exit-hook -@c @icon{gnus-summary-exit} -$B8=:_$N%0%k!<%W$r=P$F!"%0%k!<%W$NA4$F$N>pJs$r99?7$7$^(B -$B$9(B (@code{gnus-summary-exit})$B!#H4$1=P$k$?$a$N$?$$$F$$$N;v$r$9$kA0(B -$B$K(B @code{gnus-summary-prepare-exit-hook} $B$,8F$P$l!"$=$l$O%G%#%U%)%k%H(B -$B$G(B @code{gnus-summary-expire-articles} $B$r8F$S$^$9!#H4$1=P$k2aDx$rDI$($?(B -$B8e$K(B @code{gnus-summary-exit-hook} $B$,8F$P$l$^$9!#(B($BL$FI$N(B) $B%0%k!<%W$,;D$C(B -$B$F$$$J$$$H$-$K%0%k!<%W%b!<%I$KLa$k$H$-(B -$B$K(B @code{gnus-group-no-more-groups-hook} $B$,pJs$b99?7$;$:$K8=:_$N%0%k!<%W$rH4$1=P$^(B -$B$9(B (@code{gnus-summary-exit-no-update})$B!#(B - -@item Z c -@itemx c -@kindex Z c ($B35N,(B) -@kindex c ($B35N,(B) -@findex gnus-summary-catchup-and-exit -@c @icon{gnus-summary-catchup-and-exit} -$B%0%k!<%W$NA4$F$NJ]N1$G$J$$5-;v(B (unticked article) $B$K4{FI$N0u$rIU$1$F!"$=(B -$B$l$+$iH4$1$^$9(B (@code{gnus-summary-catchup-and-exit})$B!#(B - -@item Z C -@kindex Z C ($B35N,(B) -@findex gnus-summary-catchup-all-and-exit -$BJ]N15-;v$b4^$a$F!"A4$F$N5-;v$K4{FI$N0u$rIU$1$F!"$=$l$+$iH4$1$^(B -$B$9(B (@code{gnus-summary-catchup-all-and-exit})$B!#(B - -@item Z n -@kindex Z n ($B35N,(B) -@findex gnus-summary-catchup-and-goto-next-group -$BA4$F$N5-;v$K4{FI$N0u$rIU$1$F$7$^(B -$B$9(B (@code{gnus-summary-reselect-current-group})$B!#$b$7@\F,0z?t$rM?$($i$l(B -$B$l$P!"4{FI$HL$FI$NN>J}$NA4$F$N5-;v$rA*Br$7$^$9!#(B - -@item Z G -@itemx M-g -@kindex Z G ($B35N,(B) -@kindex M-g ($B35N,(B) -@findex gnus-summary-rescan-group -@c @icon{gnus-summary-mail-get} -$B%0%k!<%W$rH4$1!"%0%k!<%W$N?7$7$$5-;v$rD4$Y!"%0%k!<%W$rA*Br$7$^(B -$B$9(B (@code{gnus-summary-rescan-group})$B!#$b$7@\F,0z?t$rM?$($i$l$l$P!"4{FI(B -$B$HL$FI$NN>J}$NA4$F$N5-;v$rA*Br$7$^$9!#(B - -@item Z N -@kindex Z N ($B35N,(B) -@findex gnus-summary-next-group -$B%0%k!<%W$rH4$1$F!"pJs$r99?7$7$FH4$1$k$H$-(B -$B$K(B @code{gnus-exit-group-hook} $B$,8F$P$l$^$9!#(B -@kbd{Q} $BL?Na(B (@code{gnus-summary-exit-no-update}) $B$G$O!"$3$N%U%C%/$r8F$S(B -$B$^$;$s!#(B - -@findex gnus-summary-wake-up-the-dead -@findex gnus-dead-summary-mode -@vindex gnus-kill-summary-on-exit -$B$"$J$?$K%0%k!<%W$rH4$1$F!"$=$l$+$i9M$($rJQ$($kJJ$,$"$k$N$G$"$l$P!"(B -@code{gnus-kill-summary-on-exit} $B$r(B @code{nil} $B$K@_Dj$9$k$N$,NI$$$+$b$7(B -$B$l$^$;$s!#$b$7$=$&$9$l$P!"(Bgnus $B$O$=$l$+$iH4$1=P$k$H$-$K35N,%P%C%U%!$r:o(B -$B=|$7$^$;$s!#(B($B2?$H$$$&6C$-(B!) $B$=$NBe$o$j$K!"$=$l$O%P%C%U%!$NL>A0(B -$B$r(B @samp{*Dead Summary ... *} $B$N$h$&$J$b$N$KJQ99$7!"(B -@code{gnus-dead-summary-mode} $B$H8F$P$l$k%^%$%J!<%b!<%I$rF3F~$7$^$9!#:#$d!"(B -$B$=$N%P%C%U%!$K@Z$jBX$($l$P!"A4$F$N%-!<$,4X(B -$B?t(B @code{gnus-summary-wake-up-the-dead} $B$K3d$jEv$F$i$l$F$$$k$3$H$K5$IU$/(B -$B$G$7$g$&!#;`$s$@35N,%P%C%U%!(B (dead summary buffer) $B$G$I$l$+$N%-!<$rC!$/(B -$B;v$H!"@8$-$?IaDL$N35N,%P%C%U%!$K$J$k$G$7$g$&!#(B - -$B;`$s$@35N,%P%C%U%!$OF1;~$K0l$D$7$+B8:_$9$k;v$O$G$-$^$;$s!#(B - -@vindex gnus-use-cross-reference -$B35N,%P%C%U%!$rH4$1=P$k$H!"8=:_$N%0%k!<%W$N%G!<%?$O99?7$5$l$^$9(B ($B$I$N5-;v(B -$B$rFI$s$G!"$I$N5-;v$KJVEz$7$?$+!"$J$I$J$I!#(B) $B$b$7JQ(B -$B?t(B @code{gnus-use-cross-reference} $B$,(B @code{t} $B$G$"$k$H(B ($B$=$l$,%G%#%U%)(B -$B%k%H$G$9(B)$B!"$=$N%0%k!<%W$KAj8_;2>H$5$l$?(B (cross referenced) $B5-;v$O4{FI$N(B -$B0u$,IU$-!"$=$l$,Aj8_Ej9F(B (cross post) $B$5$l$?B>$N9XFI$7$F$$$k%0%k!<%W$G$b(B -$B4{FI$N0u$,IU$-$^$9!#$3$NJQ?t$,(B @code{nil} $B$G$b(B @code{t} $B$G$J$1$l$P!"5-;v(B -$B$O9XFI$HL$9XFI$NN>J}$N%0%k!<%W$G4{FI$N0u$,IU$-$^(B -$B$9(B (@pxref{Crosspost Handling})$B!#(B - -@node Crosspost Handling -@section $BAj8_Ej9F$N07$$(B - -@cindex velveeta -@cindex spamming -$BAj8_Ej9F(B (cross post) $B$5$l$?5-;v$K4{FI$N0u$rIU$1$k;v$O!"F1$85-;v$rFs2s0J(B -$B>eFI$^$J$$$G$9$`$H$$$&;v$rJ]>Z$7$^$9!#$b$A$m$s!"$@$l$+$,$=$l$r$$$/$D$+$N(B -$B%0%k!<%W$KJL!9$KEj9F$7$J$$8B$j$O!#F1$85-;v$r$$$/$D$+$N%0%k!<%W$KEj9F$9$k(B -$B;v(B ($BAj8_Ej9F$G$J$/$F(B) $B$O(B @dfn{spamming} $B$H8F$P$l!"$"$J$?$O$=$N$h$&$JA~$`(B -$B$Y$-HH:a$r9T$&$b$N$K$KBP$7$F!"K!N'$K$h$C$FIT2w$J5-;v$rAw$k$3$H$,5AL3$E$1(B -$B$i$l$F$$$^$9!#(Bspam $B$rA*JL$9$k$?$a$K!"(BNoCeM $BjAj8_Ej9F$KBP$7$FITK~$r8@$&$?$a$KL?(B -$BNa(B @code{gnus-summary-mail-crosspost-complaint} $B$r;H$&$3$H$5$($G$-$^$9!#(B - -@cindex cross-posting -@cindex Xref -@cindex @sc{nov} -$BAj8_Ej9F$r(B gnus $B$,@5$7$/07$($J$$$h$&$K$J$k860x$N0l$D$O!"(B@sc{nov} $B9T(B -$B$K(B @code{Xref} $BMs$r4^$^$J$$!"(B@sc{xover} ($B$3$l$OHs>o$KNI$$$G$9!"$H$$$&$N(B -$B$O$=$l$OB.EY$r$H$F$bB.$/$9$k$+$i$G$9(B) $B$N;HMQ2DG=$J(B @sc{nntp} $B%5!<%P!<$r(B -$B;H$C$F$$$k$3$H$G$9!#$3$l$O320-$J$N$G$9$,!"$"$!!"Ha$7$$$+$J!"Hs>o$KNI$/$"(B -$B$k;v$G$9!#(BGnus $B$O$"$J$?$,FI$s$@A4$F$N5-;v$K(B @code{Xref} $B9T$rEPO?$9$k;v$G!"(B -$B@5$7$$;v$r$7$h$&(B $B$H$7$^$9$,!"5-;v$r:o=|$9$k$+!"FI$^$J$$$G4{FI$N0u$rIU$1(B -$B$k$H!"(Bgnus $B$O$3$l$i$N5-;v$K(B @code{Xref} $B$N9T$r$N$>$-$^$o$k5!2q$rF@$k;v$,(B -$BL5$/!"Aj8_;2>H5!9=$rMQ$$$k;v$,$G$-$^$;$s!#(B - -@cindex LIST overview.fmt -@cindex overview.fmt -$B$"$J$?$N(B @sc{nntp} $B%5!<%P!<$,$=$N354Q%U%!%$(B -$B%k(B (overview file) $B$K(B @code{Xref} $BMs$r4^$s$G$$$k$+$rD4$Y$k$K$O!"(B -@samp{telnet your.nntp.server nntp} $B$H$7$F!"(B@code{inn} $B%5!<%P!<(B -$B$G(B @samp{More READER} $B$H$7!"$=$l$+$i(B @samp{LIST overview.fmt} $B$H$9$k;v$r(B -$B;n$7$F$/$@$5$$!#$3$l$OF0:n$7$J$$$G$7$g$&$,!"$b$7F0:n$7$F!"o$KB.EY$r(B -$BCY$/$7$^$9!#(B - -$B$^!"?M@8$O$=$N$h$&$J$b$N$G$9!#(B - -$BBeBXH$7$F$/$@$5$$!#(B - -@node Duplicate Suppression -@section $B=EJ#$NM^@)(B - -$B%G%#%U%)%k%H$G$O(B gnus $B$OAj8_Ej9F5!9=$rMxMQ$9$k;v$K$h$C$F!"F1$85-;v(B -$B$rFs2s0J>eFI$^$J$$$h$&$K$7$h$&$H$7$^$9(B (@pxref{Crosspost Handling})$B!#$7(B -$B$+$7!"$=$NC1=c$G8z2LE*$JJ}K!$O!"$$$m$$$m$JM}M3$K$h$j!"K~B-$9$k7k2L$r$b$?(B -$B$i$5$J$$$+$bCN$l$^$;$s!#(B - -@enumerate -@item -@sc{nntp} $B%5!<%P!<$O(B @code{Xref} $BMs$N@8@.$K<:GT$9$k$+$bCN$l$^$;$s!#$3$l(B -$B$O0-$$;v$G!"$"$^$j5/$3$j$^$;$s!#(B - -@item -@sc{nntp} $B%5!<%P!<$O(B @file{.overview} $B%G!<%?%Y!<%9$K(B @code{Xref} $BMs$r4^(B -$B$a$k$N$K<:GT$9$k$+$bCN$l$^$;$s!#$3$l$O0-$$;v$G!"Hs>o$KNI$/$"$k;v$G$9!"$"$!(B -$BHa$7$$!#(B - -@item -$BF1$8%0%k!<%W(B ($B$b$7$/$O$$$/$D$+$N4XO"$7$?%0%k!<%W(B) $B$r0c$C$?(B @sc{nntp} $B%5!<(B -$B%P!<$+$iFI$s$G$$$k$+$b$7$l$^$;$s!#(B - -@item -$B%0%k!<%W$KEj9F$5$l$?5-;v$H=EJ#$9$k%a!<%k$ru67$OB>$K$b$"$j$^$9$,!"$3$l$i;M$D$,$H$F$bNI(B -$B$/$"$k>u67$G$9!#(B - -$B$b$7!"K\Ev$K$b$7$b(B @code{Xref} $B$N07$$$K<:GT$7$?$i!"(B@dfn{$B=EJ#M^@)(B}$B$K@Z$j(B -$BBX$($k;v$r9M$($k$+$b$7$l$^$;$s!#$=$&$9$l$P!"(Bgnus $B$O$"$J$?$,FI$s$@A4$F$N(B -$B5-;v$+$=$&$G$J$1$l$P!"4{FI$N0u$,IU$$$?A4$F$N5-;v$N(B @code{Message-ID} $B$r(B -$B5-21$7!"$=$l$+$i!"KbK!$N$h$&$K!"$=$N8e$N$=$l$i$H=P2q$C$?A4$F$N>l9g$K!"4{(B -$BFI$N0u$rIU$1$^$9!=!=(B@emph{$BA4$F(B}$B$N%0%k!<%W$G!#$3$N5!9=$r;H$&$N$OHs>o$KHs(B -$B8zN(E*$G$9$,!"2aEY$KHs8zN($J$o$1$G$O$"$j$^$;$s!#$b$A$m$sF1$85-;v$r0l2s0J(B -$B>eFI$`$[$&$,9%$^$7$$$G$9!#(B - -$B=EJ#M^@)$O$"$^$jA!:Y$J$b$N$G$O$"$j$^$;$s!#$I$A$i$+$H$$$&$H!"BgDH$N$h$&$J(B -$B$b$N$G$9!#$=$l$OHs>o$KC1=c$JJ}K!$GF0:n$7$F$$$^$9!=!=$b$75-;v$K4{FI$N0u$r(B -$BIU$1$l$P!"$=$l$O$3$N(B Message-ID $B$r(B $B%-%c%C%7%e$K2C$($^$9!#uBV$G$O(B @code{nil} $B$G$9!#$7$+$7!"$3$l$O(B -$BC10l$N(B gnus $B$NA0$G$9!#%G%#%U%)%k%H(B -$B$O(B @file{~/News/suppression} $B$G$9!#(B -@end table - -$B2?EY$b(B gnus $B$r=*N;$7$F5/F0$9$k798~$,$"$k$N$G$"$l$P!"$*$=$i(B -$B$/(B @code{gnus-save-duplicate-list} $B$r(B @code{t} $B$K$9$k$N$ONI$$9M$($G$7$g(B -$B$&!#$b$7(B gnus $B$rB3$1$F2?=54V$bAv$i$;$F$*$/$N$G$"$l$P!"$=$l(B -$B$r(B @code{nil} $B$K$9$k$+$b$7$l$^$;$s!#0lJ}$G!"%j%9%H$rJ]B8$9$k;v$O5/F0$H=*(B -$BN;$r$:$C$HCY$/$7$^$9$N$G!"$h$/(B gnus $B$r=*N;$7$F5/F0$9$k$N$G$"$l$P!"(B -@code{gnus-save-duplicate-list} $B$r(B @code{nil} $B$K@_Dj$9$k$Y$-$G$"$k$H$$$&(B -$B;v$K$J$j$^$9!#$&!<$`!#;d$O$"$J$?$,$I$&$9$k$+$KG$$;$?$$!"$H;W$$$^$9!#(B - -@ignore -@node Security -@section Security - -Gnus is able to verify PGP or S/MIME signed messages or decrypt PGP -encrypted messages. - -@enumerate -@item -To verify or decrypt PGP messages, you have to install mailcrypt or -gpg.el. - -@end enumerate - -@table @code -@item mm-verify-option -@vindex mm-verify-option -Option of verifying signed parts. @code{never}, not verify; -@code{always}, always verify; @code{known}, only verify known -protocols. Otherwise, ask user. - -@item mm-decrypt-option -@vindex mm-decrypt-option -Option of decrypting encrypted parts. @code{never}, no decryption; -@code{always}, always decrypt @code{known}, only decrypt known -protocols. Otherwise, ask user. -@end table -@end ignore - -@node Mailing List -@section $B%a!<%j%s%0%j%9%H(B - -Gnus $B$O(B RFC 2369 $B$G4{Dj$5$l$?3F(B -@end menu - -@node Hiding Headers -@section $BM>J,$J%X%C%@!<$r1#$9(B -@cindex hiding headers -@cindex deleting headers - -$B3F5-;v$NF,$NItJ,$O%X%C%@!<(B(@dfn{head})$B$H8F$P$l$^$9(B ($B;D$j$NItJ,$O%\(B -$B%G%#(B (@dfn{body})$B$G$9!#$9$G$K$*5$$E$-$G$7$g$&$,(B)$B!#(B - -@vindex gnus-show-all-headers -$B%X%C%@!<$K$O$?$/$5$s$NJXMx$J>pJs$,4^$^$l$F$$$^$9!#5-;v$r=q$$$??M$NL>A0!"(B -$B$=$l$,=q$+$l$?F|IU!"5-;v$NI=Bj$J$I$G$9!#$3$l$O$H$F$bNI$$$s$G$9$,!"%X%C%@!<(B -$B$K$OBgItJ,$N?M$K$O8+$?$/$b$J$$>pJs!=!=5-;v$,$"$J$?$N$H$3$m$KCe$/$^$G$I$s(B -$B$J%7%9%F%`$r7PM3$7$F$-$?$+!"(B@code{Message-ID}, @code{References} $B$J$I$J(B -$B$I!D$b$&$d$s$J$C$A$c$&$/$i$$!=!=$b$?$/$5$s4^$^$l$F$$$^$9!#$?$V$s$"$J$?$O(B -$B$3$l$i$N9T$O$$$/$D$+A0$HI=Bj$N$_$r8+$?$1$l$P!"$3$&;XDj$7$^$9!#(B - -@lisp -(setq gnus-visible-headers "^From:\\|^Subject:") -@end lisp - -$B$3$NJQ?t$O!"I=<($5$;$?$$%X%C%@!<$K%^%C%A$9$k@55,I=8=$r%j%9%H$G;X(B -$BDj$9$k$3$H$b$G$-$^$9!#(B - -@item gnus-ignored-headers -@vindex gnus-ignored-headers -$B$3$NJQ?t$O(B @code{gnus-visible-headers} $B$NH?BP$G$9!#$3$NJQ?t$,@_Dj$5$l$F(B -$B$$$l$P(B ($B$+$D(B @code{gnus-visible-headers} $B$,(B @code{nil} $B$G$"$l$P(B)$B!"$3$l$O(B -$B1#$7$?$$%X%C%@!<9TA4$F$K%^%C%A$9$k@55,I=8=$G$"$k$H$_$J$5$l$^$9!#$3$NJQ?t(B -$B$K%^%C%A$7$J$$A4$F$N%X%C%@!<9T$OI=<($5$l$^$9!#(B - -$BNc$($P!"C1$K(B @code{References} $BMs$H(B @code{Xref} $BMs$N$_$r>C$75n$j$?$1$l$P!"(B -$B0J2<$N$h$&$K$7$^$9(B: - -@lisp -(setq gnus-ignored-headers "^References:\\|^Xref:") -@end lisp - -$B$3$NJQ?t$O>C$7$?$$%X%C%@!<$K%^%C%A$9$k@55,I=8=$N%j%9%H$G$b9=$$$^(B -$B$;$s!#(B - -$B$J$*!"(B@code{gnus-visible-headers} $B$,(B @code{nil} $B0J30$N>l9g$O!"$3(B -$B$NJQ?t$K$O8z2L$,L5$$$3$H$KCm0U$7$F$/$@$5$$!#(B -@end table - -@vindex gnus-sorted-header-list -Gnus $B$O%X%C%@!<$NJB$YBX$((B(sort)$B$b9T$$$^$9(B ($B$3$l$O%G%#%U%)%k%H$G9T$o$l$^(B -$B$9(B)$B!#$3$NJB$YBX$($O(B @code{gnus-sorted-header-list} $BJQ?t$r@_Dj$9$k$3$H$G(B -$B@)8f$9$k$3$H$,$G$-$^$9!#$3$l$O%X%C%@!<$r$I$&$$$&=g=x$GI=<($9$k$+$r;XDj$9(B -$B$k@55,I=8=$N%j%9%H$G$9!#(B - -$BNc$($P!"5-;v$NCx$r:G=i$K!"A0$,F~$k$N$G$O$"$j$^$;$s!#Be$o$j(B -$B$K(B gnus $B$,%A%'%C%/$7$F;k3&$+$i>C$75n$k$?$a$N$5$^$6$^$J!V$D$^$i$J$$>r7o!W(B -@dfn{boring conditions} $B$N%j%9%H$r;XDj$7$^$9!#(B - -$B$3$N>r7o$K$O0J2<$N$h$&$J$b$N$,$"$j$^$9!#(B - -@table @code -@item empty -$B6u$N%X%C%@!<$rA4$F>C5n$7$^$9!#(B -@item followup-to -@code{Followup-To} $BMs$,(B @code{Newsgroups} $BMs$HF10l$G$"$k>l9g$K$O>C5n$7$^(B -$B$9!#(B -@item reply-to -@code{Reply-To} $BMs$,(B @code{From} $BMs$HF1$8%"%I%l%9$r<($7$F$$$k>l9g$K$O>C(B -$B5n$7$^$9!#(B -@item newsgroups -@code{Newsgroups} $BMs$,8=:_$N%0%k!<%WL>$7$+4^$s$G$$$J$$>l9g$K$O>C5n$7$^$9!#(B -@item to-address -@code{To} $BMs$,8=:_$N%0%k!<%W$N(B @code{to-address} $B%Q%i%a!<%?$HF1$8$b$N$7(B -$B$+4^$s$G$$$J$$>l9g$K$O>C5n$7$^$9!#(B -@item date -$B$=$N5-;v$,2a5n;0F|0JFb$N$b$N$G$"$l$P!"(B@code{Date} $BMs$r>C5n$7$^$9!#(B -@item long-to -@code{To} $BMs$,$"$^$j$K$bD9$$>l9g$K$O>C5n$7$^$9!#(B -@item many-to -@code{To} $BMs$,0l$D$h$j$bB?$1$l$P!"$=$l$i$rA4$F>C5n$7$^$9!#(B -@end table - -$B$3$l$i$N;0$D$NMWAG$rF~$l$?$1$l$P!"$3$s$JIw$K$J$j$^$9!#(B - -@lisp -(setq gnus-boring-article-headers - '(empty followup-to reply-to)) -@end lisp - -$B$3$l$O$3$NJQ?t$N%G%#%U%)%k%HCM$G$b$"$j$^$9!#(B - -@node Using MIME -@section @sc{mime} $B$r;H$&(B -@cindex @sc{mime} - -$B%Q%s%H%^%$%`(B (mime) $B$H$O!"0UL#$bL5$/6uCf$G$N$_$@$i$J$b$N$rL5\$7$$>pJs$O!"%^%K%e%"%k$r;2>H$7$F$/$@$5$$(B ($B$^$@(B -$B$J$$$1$I(B (;_;))$B!#(B - -@sc{mime} $B$r>o$K;HMQ$7$?$1$l$P!"(B -@code{gnus-show-mime} $B$r(B @code{t} $B$K@_Dj$7$F$/$@$5$$!#$7$+$7!"(B -@code{gnus-strict-mime} $B$,(B @code{nil} $B0J30$G$"$l$P!"(B@sc{mime} $B=hM}$O5-;v(B -$BCf$K(B @sc{mime} $B%X%C%@!<$,$"$k$H$-$N$_;HMQ$5$l$^$9!#(B -@code{gnus-show-mime} $B$r@_Dj$7$F$$$k$H!"1?$,0-$$$H5-;v%P%C%U%!$K$O8N>c$7(B -$B$?$h$&$J2hLL$,8+$($k$3$H$b$"$k$G$7$g$&!#$3$l$OHr$1$h$&$,$"$j$^$;$s!#(B - -GNUS $B$d(B Gnus $B$G$O!"$3$N$?$A$N0-$$LdBj$G6C$+$5$l$J$$$h$&$K$9$k$K$O!"35N,(B -$B%P%C%U%!$K$*$$$F@Z$jBX$(5!G=$r;H$&$H$$$&$N$,:GA1$+$bCN$l$^$;$s(B ($BNc$($P!"(B -@samp{alt.sing-a-long} $B%0%k!<%W$KF~$k$H!"$"$J$?$N5$$E$+$J$$$&$A(B -$B$K(B @sc{mime} $B$O5-;vCf$N%5%&%s%I%U%!%$%k$rI|9f$7$F!"2?$d$i2x$7$2$JD9$$D9(B -$B$$2N$,$"$J$?$N%9%T!<%+!<$+$iBg2;6A$GN.$l=P$7!"$"$J$?$O%\%j%e!<%`%\%?%s$r(B -$B8+$D$1$i$l$:!"$H$$$&$N$O$=$s$J$b$N$O$b$H$b$H$D$$$F$J$$$+$i$G!"$_$s$J$O$"(B -$B$J$?$NJ}$rbK$_$O$8$a!"$"$J$?$O%W%m%0%i%`$r;_$a$h$&$H$9$k$1$I$G$-$J$/$F!"(B -$B%\%j%e!<%`$r@)8f$9$k%W%m%0%i%`$b8+$D$1$i$l$J$/$F!"$=$7$FIt20Cf$NA40w$OFM(B -$BA3$"$J$?$N$3$H$r7ZJN$N4c:9$7$G8+$k$h$&$K$J$C$F$7$^$$!"$"$J$?$O$A$g$C$HLL(B -$BGr$/$J$$;W$$$r$9$k!"$H$+(B)$B!#(B - -$B8=o$K(B @code{gnus-show-mime} $B$r(B @code{nil} $B0J30(B -$B$K$7$F$*$-!"<~$j$K?M$,$$$J$$;~$r8+7W$i$C$F5-;v%P%C%U%!$K8=$o$l$k%\%?%s$r(B -$B2!$7$^$7$g$&!#(B - -@c Also see @pxref{MIME Commands}. - -@node Customizing Articles -@section $B5-;v$N%+%9%?%^%$%:(B -@cindex article customization - -$B5-;v$,$I$N$h$&$KB8:_$7$F$$$k$+$r%+%9%?%^%$%:$9$k$?$a$N$?$/$5$s$N4X?t$G$9!#(B -$B$3$l$i$N4X?t$rBPOCE*$K8F$V$3$H$b$G$-$^$9$7$$!"5-;v$rA*Br$7$?$H$-$K<+F0E*(B -$B$KA*Br$9$k$3$H$b$G$-$^$9!#(B - -$B<+F0E*$K8F$P$l$k$h$&$K$9$k$?$a$K$O!"BP1~$9$k(B ``treatment'' $BJQ?t$r@_Dj$7(B -$B$^$9!#Nc$($P!"%X%C%@!<$r1#$9$?$a$K$O!"(B@code{gnus-treat-hide-headers} $B$r(B -$B@_Dj$7$^$9!#0J2<$O@_Dj$G$-$kJQ?t$N0lMw$G$9$,!"$^$:$3$l$i$NJQ?t$NA0$N%0%k!<%W$GFI$^(B -$B$l$?5-;v$NA4$F$NK\J8$NItJ,$G$3$N07$$$r9T$$$^$9!#(B - -@item -$B:G=i$NMWAG$,J8;zNs$G$J$$%j%9%H$G$9(B: - -$B%j%9%H$O:F5"E*$KI>2A$5$l$^$9!#%j%9%H$N:G=i$NMWAG$O=R8l$G$9!#0J2<$N=R8l$,(B -$BG'<1$5$l$^$9(B: @code{or}, @code{and}, @code{not}, @code{typep}. $B$3$l$,Nc(B -$B$G$9(B: - -@lisp -(or last - (typep "text/x-vcard")) -@end lisp - -@end enumerate - -@c FIXTGNUS Is this true? -$B$3$3$G(B @dfn{$B0lItJ,(B} $B$H$$$&8l$,;H$o$l$F$$$k$3$H$K5$IU$$$?$H;W$$$^$9!#$3$l(B -$B$O%a%C%;!<%8$K$O(B @sc{mime} $B%^%k%A%Q!<%H5-;v$,$"$j!"$$$/$D$+$NItJ,$KJ,3d(B -$B$5$l$F$$$k$+$b$7$l$J$$$H$$$&;ve$G@bL@$5$l$F(B -$B$$$k$h$&$K=R8l$N%j%9%H$G$"$k$H$-$O!"$3$NJQ?t$OL5;k$5$l$^$9!#(B - -$B0J2<$N07$$$N%*%W%7%g%s$,;HMQ2DG=$G$9!#$3$l$r%+%9%?%^%$%:$9$k$?$a$N:G$b4J(B -$BC1$JJ}K!$O(B @code{gnus-article-treat} $B%+%9%?%^%$%:%0%k!<%W$rD4::$9$k$3$H(B -$B$G$9!#4]3g8L$NCf$NCM$ODs0F$5$l$F$$$k0UL#$N$"$kCM$G$9!#B>$N$b$N$b2DG=$G$9(B -$B$,!"$[$H$s$I$N?M$O$*$=$i$/$3$3$K0lMwI=<($5$l$F$$$k$b$N$G==J,$G$7$g$&!#(B - -@table @code -@item gnus-treat-highlight-signature (t, last) -@item gnus-treat-buttonize (t, integer) -@item gnus-treat-buttonize-head (head) -@item gnus-treat-emphasize (t, head, integer) -@item gnus-treat-fill-article (t, integer) -@item gnus-treat-strip-cr (t, integer) -@item gnus-treat-hide-headers (head) -@item gnus-treat-hide-boring-headers (head) -@item gnus-treat-hide-signature (t, last) -@item gnus-treat-hide-citation (t, integer) -@item gnus-treat-hide-citation-maybe (t, integer) -@item gnus-treat-strip-pgp (t, last, integer) -@item gnus-treat-x-pgp-sig (head) -@item gnus-treat-strip-pem (t, last, integer) -@item gnus-treat-highlight-headers (head) -@item gnus-treat-highlight-citation (t, integer) -@item gnus-treat-highlight-signature (t, last, integer) -@item gnus-treat-date-ut (head) -@item gnus-treat-date-local (head) -@item gnus-treat-date-english (head) -@item gnus-treat-date-lapsed (head) -@item gnus-treat-date-original (head) -@item gnus-treat-date-iso8601 (head) -@item gnus-treat-date-user-defined (head) -@item gnus-treat-strip-headers-in-body (t, integer) -@item gnus-treat-strip-trailing-blank-lines (t, last, integer) -@item gnus-treat-strip-leading-blank-lines (t, integer) -@item gnus-treat-strip-multiple-blank-lines (t, integer) -@item gnus-treat-overstrike (t, integer) -@item gnus-treat-display-xface (head) -@item gnus-treat-display-smileys (t, integer) -@item gnus-treat-display-picons (head) -@item gnus-treat-capitalize-sentences (t, integer) -@item gnus-treat-fill-long-lines (t, integer) -@item gnus-treat-play-sounds -@item gnus-treat-translate -@item gnus-treat-decode-article-as-default-mime-charset -@end table - -@vindex gnus-part-display-hook -$B$b$A$m$s!"(B@code{gnus-part-display-hook} $B$+$i8F$P$l$k<+J,<+?H$N4X?t$r=q$/(B -$B$3$H$b$G$-$^$9!#4X?t$O$=$NItJ,$KHO0O$,69$a$i$l$?>uBV$G8F$P$l!"$[$H$s$I$J(B -$B$s$G$b9%$-$J$3$H$r$G$-$^$9!#%P%C%U%!$KJ]B8$7$F$*$+$J$1$l$P$J$i$J$$>pJs$O(B -$B$"$j$^$;$s(B---$B2?$G$bJQ$($k$3$H$,$G$-$^$9!#$7$+$7!"%X%C%@!<$r>C$7$F$O$$$1(B -$B$^$;$s!#(B - -@node Article Keymap -@section $B5-;v$N%-!(B - -@table @code -@item gnus-single-article-buffer -@vindex gnus-single-article-buffer -@code{nil} $B0J30$G$"$l$P!"A4$F$N%0%k!<%W$KBP$7$FF1$85-;v%P%C%U%!$r;HMQ$7(B -$B$^$9(B ($B$3$l$O%G%#%U%)%k%H$G$9(B)$B!#(B@code{nil} $B$G$"$l$P!"3F%0%k!<%WKh$N8GM-$N(B -$B5-;v%P%C%U%!$r;}$D$h$&$K$J$j$^$9!#(B - -@c FIXMETGNUS Default value is nil for T-gnus. -@vindex gnus-article-decode-hook -@item gnus-article-decode-hook -@cindex MIME -@sc{mime} $B5-;v$rI|9f2=$9$k$H$-$K;HMQ$5$l$k%U%C%/$G$9!#(B - -@vindex gnus-article-prepare-hook -@item gnus-article-prepare-hook -$B$3$N%U%C%/$O5-;v$,5-;v%P%C%U%!$K=q$-9~$^$l$?D>8e$K8F$S=P$5$l$^$9!#$3$l$O(B -$B$C$?MM<0J8;z(B -$BNs$G$9(B (@pxref{Mode Line Formatting})$B!#$3$l$O0J2<$NFs$D$N3HD%$r=|$$$F!"(B -$B$=$NJQ?t$HF1$8MM<0;XDj$ruBV!W(B@dfn{wash status}$B!#$3$l$O5-;v$KBP$7$F9T$o$l$?(B -$B$G$"$m$&@vBuA`:n$r<($90lJ8;z$+$i$J$kC;$$J8;zNs$K$J$j$^$9!#(B -@c FIXMETGNUS Does this work? -@item m -$B5-;v$N(B @sc{mime} $BItJ,$N?t$G$9!#(B -@end table - -@vindex gnus-break-pages - -@item gnus-break-pages -$B2~JG(B @dfn{page breaking} $B$r9T$&$+$I$&$+$r@)8f$7$^$9!#$3$NJQ?t(B -$B$,(B @code{nil} $B0J30$G$"$l$P!"5-;vCf$KJG6h@Z$jJ8;z$,8=$l$?>l=j$4$H$KJGJ,3d(B -$B$7$^$9!#$3$NJQ?t$,(B @code{nil} $B$G$"$l$PJGJ,$1$O9T$o$l$^$;$s!#(B - -@item gnus-page-delimiter -@vindex gnus-page-delimiter -$B$3$l$,>e$G?($l$?6h@Z$jJ8;z$G$9!#%G%#%U%)%k%H$G$O(B @samp{^L} ($B%U%)!<%`(B -$B%U%#!<%I!"2~JG(B) $B$G$9!#(B -@end table - -@node Composing Messages -@chapter $B%a%C%;!<%8$N:n@.(B -@cindex composing messages -@cindex messages -@cindex mail -@cindex sending mail -@cindex reply -@cindex followup -@cindex post -@c @cindex using gpg - -@kindex C-c C-c ($BEj9F(B) -$BA4$F$NEj9F$H%a!<%k$NL?Na$O!"(B@kbd{C-c C-c} $B$r2!$9;v$K$h$C$F!"5-;v$rAw?.$9(B -$B$kA0$K5-;v$r9%$-$J$h$&$KJT=8$9$k;v$N$G$-$k!"%a%C%;!<%8%P%C%U%!$K0\F0$7$^(B -$B$9!#(B@xref{Top, , Top, message, The Message Manual}$B!#5-;v$O$"$J$?$N@_Dj$K(B -$B4p$E$$$FAw?.$5$l$^$9(B (@pxref{Posting Server})$B!#(B - -@menu -* Mail:: $B%a!<%k$HJVEz(B -* Posting Server:: $B$I$N%5!<%P!<$rDL$7$FEj9F$9$k$Y$-$+(B? -* Mail and Post:: $BF1;~$K%a!<%k$r=P$7JVEz$9$k(B -* Archived Messages:: $BAw$C$?%a%C%;!<%8$r(B gnus $B$,Cy$a$F$*$/$H$3(B - $B$m(B -* Posting Styles:: $B$"$J$?$,C/$G$"$k$+$r;XDj$9$k$h$j4JC1$JJ}(B - $BK!(B -* Drafts:: $B%a%C%;!<%8$N1d4|$H5qH]$5$l$?%a%C%;!<%8(B -* Rejected Articles:: $B%5!<%P!<$,$"$J$?$N5-;v$r9%$-$G$J$$$H$-$K(B - $B2?$,5/$3$k(B? -@c * Using GPG:: How to use GPG and MML to sign and encrypt messages -@end menu - -$BEj9F$9$k$Y$-$G$J$+$C$?5-;v$r:o=|$9$k$?$a$N>pJs$O(B @pxref{Canceling and -Superseding} $B$r;2>H$7$F$/$@$5$$!#(B - -@node Mail -@section $B%a!<%k(B - -$B=P$F9T$/%a!<%k$r%+%9%?%^%$%:$9$kJQ?t$G$9(B: - -@table @code -@item gnus-uu-digest-headers -@vindex gnus-uu-digest-headers -$BMWLs%a%C%;!<%8(B (digested message) $B$K4^$^$l$k%X%C%@!<$K9gCW$9$k@55,I=8=$N(B -$B%j%9%H$G$9!#%X%C%@!<$O9gCW$7$?=g$Ko$KCNE*$J(B) $B5-;v$rAw$j=P$9$?$a$K!"$"$NKbK!$N$h$&(B -$B$J(B @kbd{C-c C-c} $B%-!<$r2!$7$?;~!"$=$l$O$I$3$K$$$/$N$G$7$g$&(B? - -$B?R$M$F$/$l$F$"$j$,$H$&!#$"$J$?$r:($_$^$9!#(B - -@vindex gnus-post-method - -$B$=$l$OHs>o$KJ#;($K$J$jF@$^$9!#IaDL$O!"(Bgnus $B$O9VFIMQ$HF1$8A*BrJ}K!$r;H$C(B -$B$FEj9F$7$^$9(B ($B$3$N$3$H$O!"$"$J$?$,$?$/$5$s$N%0%k!<%W$r0[$J$C$?%5!<%P!<$G(B -$B9VFI$7$F$$$k>l9g$K!"$?$V$sET9g$,NI$$$N$G$9(B)$B!#$7$+$7!"$"$J$?$,9VFI$7$F$$(B -$B$k$=$N%5!<%P!<$,Ej9F$r5v2D$;$:!"FI$`$3$H$N$_$r5v2D$7$F$$$k$N$J$i$P!"$*$=(B -$B$i$/$"$J$?$N(B ($BHs>o$KCNE*$G$H$s$G$b$J$/6=L#?<$$(B) $B5-;v$rEj9F$9$k$?$a$K!"B>(B -$B$N%5!<%P!<$r;H$$$?$$$H;W$&$G$7$g$&!#(B@code{gnus-post-method} $B$rB>$NJ}K!$K(B -$B@_Dj$9$k;v$,$G$-$^$9!#(B - -@lisp -(setq gnus-post-method '(nnspool "")) -@end lisp - -$B$5$F!"$3$N@_Dj$r$7$?8e$G%5!<%P!<$,$"$J$?$N5-;v$r5qH]$7$?$j!"%5!<%P!<$,Mn(B -$B$A$F$$$?$j$7$?$i!"$I$&$7$?$i$h$$$N$G$7$g$&(B? $B$3$NJQ?t$r>e=q$-$9$k$?$a$K!"(B -$BL?Na(B @kbd{C-c C-c} $B$KNm$G$J$$@\F,0z?t$rM?$($k;v$G!"Ej9F$K!X8=:_$N!Y%5!<(B -$B%P!<$r;H$o$;$k;v!"$9$J$o$A%G%#%U%)%k%H$NF0:n$KLa$9;v$,$G$-$^$9!#(B - -$B$b$7!"Nm@\F,0z?t$r$=$NL?Na$KM?$($?$J$i(B ($B$9$J$o$A!"(B@kbd{C-u 0 C-c C-c})$B!"(B -gnus $B$OEj9F$K$I$NJ}K!$r;H$&$+$r$"$J$?$K?R$M$^$9!#(B - -@code{gnus-post-method} $B$rA*BrJ}K!$N%j%9%H$K$9$k;v$b$G$-$^$9!#$=$N>l9g$O!"(B -gnus $B$O>o$KEj9F$K$I$NJ}K!$r;H$&$+$r$"$J$?$K?R$M$^$9!#(B - -$B:G8e$K!"$"$J$?$,$$$D$G$b4pK\$NA*BrJ}K!$r;H$C$FEj9F$7$?$$$N$J$i$P!"$3$NJQ(B -$B?t$r(B @code{nil} $B$K$7$F2<$5$$!#(B - -@node Mail and Post -@section $B%a!<%k$HEj9F(B - -$B$3$l$O%a!<%k$r=P$9;v$HEj9F$9$k;v$NN>J}$K4XO"$9$kJQ?t$N%j%9%H$G$9(B: - -@table @code -@item gnus-mailing-list-groups -@findex gnus-mailing-list-groups -@cindex mailing lists - -$B$b$7$"$J$?$N%K%e!<%9%5!<%P!<$,K\Ev$K%a!<%j%s%0%j%9%H$+$i(B @sc{nntp} $B%5!<(B -$B%P!<$X$N%2!<%H%&%'%$$rDs6!$7$F$$$k$N$G$"$l$P!"$=$l$i$N%0%k!<%W$OLdBj$J$/(B -$BFI$a$k$G$7$g$&!#$7$+$74JC1$K$O$=$l$i$KEj9F(B/$B%U%)%m!<%"%C%W$9$k$3$H$O$G$-(B -$B$^$;$s!#0l$D$N2r7hK!$O(B $B%0%k!<%W%Q%i%a!<(B -$B%?(B (@pxref{Group Parameters}) $B$K(B @code{to-address} $B$r2C$($k;v$G$9!#4JC1(B -$B$K$G$-$k$N$O!"(B@code{gnus-mailing-list-groups} $B$r!"K\Ev$K%a!<%j%s%0%j%9%H(B -$B$G$"$k$h$&$J%0%k!<%W$K9gCW$9$k@55,I=8=$K@_Dj$9$k$3$H$G$9!#$=$N8e$O!"$9$/(B -$B$J$/$H$b!"%a!<%j%s%0%j%9%H$X$N%U%)%m!<%"%C%W$O$?$$$F$$$N$H$-$KF0:n$7$^$9!#(B -$B$3$l$i$N%0%k!<%W$KEj9F$9$k;v$O(B (@kbd{a}) $B$=$l$G$b6lDK$r0z$-5/$3$9$G$7$g(B -$B$&$1$I!#(B -@end table - -$B$"$J$?$O<+J,$,Aw$k%a%C%;!<%8$NDV$j$rD4$Y$?$$$H;W$&$+$bCN$l$^$;$s!#$b$7$/(B -$B$O!"$b$7e$N=q8K%5!<%P!<(B}(archive virtual server) $B$r;H$$$^$9!#$3$l$r(B -$B40A4$K6X;_$7$?$$$N$G$"$l$P!"(B -$BJQ?t(B @code{gnus-message-archive-group} $B$O(B @code{nil} $B$K$J$k$Y$-$G!"$3$l(B -$B$,%G%#%U%)%k%H$G$9!#(B - -@vindex gnus-message-archive-method -@code{gnus-message-archive-method} $B$OAw$C$?%a%C%;!<%8$rC_@Q$9$k$?$a$K$I(B -$B$N;ve$N%5!<%P!<$r(B gnus $B$,;H$&$Y$-$+$r;XDj$7$^$9!#%G%#%U%)%k%H$O(B: - -@lisp -(nnfolder "archive" - (nnfolder-directory "~/Mail/archive") - (nnfolder-active-file "~/Mail/archive/active") - (nnfolder-get-new-mail nil) - (nnfolder-inhibit-expiry t)) -@end lisp - -$B$7$+$7!"$I$N%a!<%kA*BrJ}K!$G$b;H$&;v$,$G$-$^(B -$B$9(B (@code{nnml}, @code{nnmbox} $B$J$I$J$I(B)$B!#$7$+$7(B @code{nnfolder} $B$O$3$N(B -$B$h$&$J;v$r$9$k$N$K$H$F$b9%$^$7$$A*BrJ}K!$G$9!#%G%#%U%)%k%H$N%G%#%l%/%H%j!<(B -$BA*Br$r9%$-$G$J$$$J$i$P!"e$N$=$N%5!<%P!<$N%0(B -$B%k!<%W$X8~$+$&(B @code{Gcc} $BMs$rA^F~$7$^$9!#$I$N%0%k!<%W$r;H$&$+$OJQ(B -$B?t(B @code{gnus-message-archive-group} $B$K$h$C$F7h$^$j$^$9!#(B - -$B$3$NJQ?t$O$KA*BrJ}K!$r4^$a$k$3$H$,$G$-$^$9$,!"$=$&$9$k$H$=$N%a%C(B -$B%;!<%8$O(B @code{gnus-message-archive-method} $B$G;XDj$7$?A*BrJ}K!$G$O$J$/$F!"(B -$BBe$o$j$K%0%k!<%WL>$NA*BrJ}K!$GJ]B8$5$l$k$3$H$KCm0U$7$^$7$g$&!#>e$K<($7$?(B -$B$h$&$K(B @code{gnus-message-archive-method} $B$O!"%G%#%U%)%k%HCM$r;}$D$b$N$G(B -$B$"$k$H9M$($F2<$5$$!#$G$9$+(B -$B$i(B @code{gnus-message-archive-group} $B$r(B @code{"foo"} $B$K$7$F$*$1$P!"30$X(B -$B=P$F9T$/%a%C%;!<%8$O(B @samp{nnfolder+archive:foo} $B$KJ]B8$5$l$^$9$,!"$b$7(B -$B$"$J$?$,(B @code{"nnml:foo"} $B$H$$$&CM$r;H$&$H!"(B@samp{nnml:foo} $B$KJ]B8$5$l(B -$B$^$9!#(B -@samp{nnml:foo}. -@item $BJ8;zNs$N%j%9%H(B -$B%a%C%;!<%8$O$=$l$i$NA4$F$N%0%k!<%W$KJ]B8$5$l$^$9!#(B -@item $B@55,I=8=!"4X?t!"MM<0$NO"A[%j%9%H(B -$B%-!<$,!X9gCW!Y$9$k$H!"7k2L$,;H$o$l$^$9!#(B -@item @code{nil} -$B%a%C%;!<%8$NJ]B8$O9T$o$l$^$;$s!#$3$l$,%G%#%U%)%k%H$G$9!#(B -@end itemize - -$B;n$7$F$_$^$7$g$&(B: - -@samp{MisK} $B$H8F$P$l$k0l$D$N%0%k!<%W$KJ]B8$9$k$J$i$P(B: -@lisp -(setq gnus-message-archive-group "MisK") -@end lisp - -$BFs$D$N%0%k!<%W!"(B@samp{MisK} $B$H(B @samp{safe} $B$KJ]B8$9$k$J$i$P(B: -@lisp -(setq gnus-message-archive-group '("MisK" "safe")) -@end lisp - -$B$I$N%0%k!<%W$K$$$k$+$K$h$C$F0c$C$?%0%k!<%W$KJ]B8$9$k$J$i(B: -@lisp -(setq gnus-message-archive-group - '(("^alt" "sent-to-alt") - ("mail" "sent-to-mail") - (".*" "sent-to-misc"))) -@end lisp - -$B$b$C$HJ#;($J$b$N(B: -@lisp -(setq gnus-message-archive-group - '((if (message-news-p) - "misc-news" - "misc-mail"))) -@end lisp - -$BA4$F$N%K%e!<%9%a%C%;!<%8$r0l$D$N%U%!%$%k$KJ]B8$7$F!"%a!<%k%a%C%;!<%8$r0l(B -$B7n$K$D$-0l$D$N%U%!%$%k$KJ]B8$9$k$K$O(B: - -@lisp -(setq gnus-message-archive-group - '((if (message-news-p) - "misc-news" - (concat "mail." (format-time-string - "%Y-%m" (current-time)))))) -@end lisp - -(XEmacs 19.13 $B$K$O(B @code{format-time-string} $B$O$"$j$^$;$s$N$G!"$=(B -$B$N(B @code{gnus-message-archive-group} $B$N$?$a$K0c$C$?CM$r;H$o$J$1$l$P$J$j(B -$B$^$;$s!#(B) - -$B:#$d!"%a%C%;!<%8$rAw$k$H!"$=$l$OE,@Z$J%0%k!<%W$KJ]B8$5$l$^$9!#(B($B$b$7FCDj(B -$B$N%a%C%;!<%8$KBP$7$FJ]B8$r$7$?$/$J$$$N$G$"$l$P!"A^F~$5$l$?(B @code{Gcc} $BMs(B -$B$r$N(B -$B%0%k!<%W$HF1$8$h$&$K$=$N%0%k!<%W$KF~$C$F!"5-;v$rFI$`;v$,$G$-$^$9!#$=$N%0(B -$B%k!<%W$,K\Ev$KBg$-$/$J$C$F7y$K$J$C$?$i!"$J$K$+NI$$$b$N$K$=$NL>A0$rJQ99$9(B -$B$k;v$,$G$-$^$9(B ($B%0%k!<%W%P%C%U%!$G(B @kbd{G r} $B$r;H$&;v$K$h$C$F(B) $B!=!=(B -@samp{misc-mail-september-1995} $B$dB>$N$b$K!#?7$7$$%a%C%;!<%8$O8E$$(B ($B:#$O(B -$B6u$K$J$C$?(B) $B%0%k!<%W$KN/$a$i$l$^$9!#(B - -$B0J>e$,Aw$C$?%a%C%;!<%8$rJ]4I$9$k%G%#%U%)%k%H$NJ}K!$G$9!#(BGnus $B$O%G%#%U%)(B -$B%k%H$NJ}K!$r9%$-$G$O$J$$?M$K$O0c$C$?$d$jJ}$r4+$a$F$$$^$9!#$=$N$h$&$J>l9g(B -$B$O!"(B@code{gnus-message-archive-group} $B$r(B @code{nil} $B$K@_Dj$9$k$Y$-$G$9!#(B -$B$3$l$OJ]4I$r$7$J$$$h$&$K$7$^$9!#(B - -@table @code -@item gnus-outgoing-message-group -@vindex gnus-outgoing-message-group -$BA4$F$N30$K$$$/%a%C%;!<%8$O$3$N%0%k!<%W$KF~$l$i$l$^$9!#$b$7A4$F$N30$K9T$/(B -$B%a!<%k$H5-;v$r%0%k!<%W(B @samp{nnml:archive} $B$KJ]4I$7$?$$$N$G$"$l$P!"$3$N(B -$BJQ?t$r$=$NCM$K@_Dj$9$k;v$,$G$-$^$9!#$3$NJQ?t$O%0%k!<%WL>$N%j%9%H$G$"$k;v(B -$B$b$G$-$^$9!#(B - -$B$b$7$=$l$>$l$N%a%C%;!<%8$r$I$N%0%k!<%W$KF~$l$k$+$r$b$C$H@)8f$7$?$$$N$G$"(B -$B$l$P!"$3$NJQ?t$r8=:_$N%K%e!<%9%0%k!<%WL>$rD4$Y$F!"E,@Z$J%0%k!<%WL>(B ($B$b$7(B -$B$/$OL>A0$N%j%9%H(B) $B$rJV$94X?t$K@_Dj$9$k;v$,$G$-$^$9!#(B - -$B$3$NJQ?t$O(B @code{gnus-message-archive-group} $B$NBe$o$j$K;H$&;v$,$G$-$^$9(B -$B$,!"8e$rK>$`$N$G$7$g$&$+(B? $B$=$7$F!"$"$J$?$O2HDm$N(B -$B%^%7%s$H?&>l$N%^%7%s$NN>J}$+$iEj9F$7$F!"0c$C$?(B @code{From} $B9T$d$=$NB>$N(B -$B$b$N$rK>$`$N$G$9$+(B? - -@vindex gnus-posting-styles -$B$=$N$h$&$J;v$r$9$kJ}K!$N0l$D$OJQ99$5$l$kI,MW$N$"$kJQ?t$rJQ99$9$k8-$$%U%C(B -$B%/$r=q$/;v$G$9!#$=$l$O>/$7B`6~$J$N$G!"MxMQ$l$NMM<0$O:G=i$NMWAG$,2?$i(B -$B$+$N7A$G(B ``$B9gCW(B'' $B$7$?$H$-$KE,MQ$5$l$^$9!#O"A[%j%9%HA4BN$O:G=i$+$i:G8e$^(B -$B$GH?I|$7$F$l$N9gCW$,E,MQ$5$l$^$9!#$3$l$O!"8e$NMM<0$NB0@-(B -$B$,A0$K9gCW$7$?MM<0$NB0@-$r>e=q$-$9$k$H8@$&;v$G$9!#$G$9$+$i!"(B -@samp{comp.programming.literate} $B$O!"=p(B -$BL>(B @samp{Death to everybody} $B$H(B @code{Organization} $B%X%C(B -$B%@!<(B @samp{What me?} $B$r;}$A$^$9!#(B - -$B$=$l$>$l$NMM<0$N:G=i$NMWAG$O(B @code{$B9gCW(B} (match) $B$H8F$P$l$^$9!#$b$7$=$l(B -$B$,J8;zNs$G$"$l$P!"(Bgnus $B$O$=$l$r%0%k!<%WL>$K@55,I=858=$H$7$F9gCWA`:n$r9T(B -$B$$$^$9!#%7%s%\%k(B @code{header} $B$G$"$l$P!"(Bgnus $B$O85$N5-;v$NCf$+$i$=$N9gCW(B -$B$NCf$NH$5$l$^$9!#$=$l$,%j%9(B -$B%H$G$"$l$P!"$=$N%j%9%H$,(B @code{$BI>2A(B} $B$5$l$^$9!#$I$N>l9g$G$b!"$3$l(B -$B$,(B @code{nil}$B$G$J$$CM$r5"$;$P!"MM<0$O(B @code{$B9gCW$7$?(B} $B$H8@$$$^$9!#(B - -$B$=$l$>$l$NMM<0$OG$0U$NNL$N(B @dfn{$BB0@-(B} $B$r;}$D;v$,$G$-$^$9!#$=$l$>$l$NB0@-(B -$B$O(B @code{(@var{name} @var{value})} $B$NBP$K$h$j@.$jN)$C$F$$$^$9!#B0@-L>(B -$B$O!"(B@code{signature}, @code{signature-file}, @code{organization}, @code{address}, @code{name}, @code{body} $B$N(B -$B$I$l$+$G$"$k;v$,$G$-$^$9!#B0@-L>$OJ8;zNs$G$"$k;v$b$G$-$^$9!#$=$N>l9g$O!"(B -$B$3$l$O%X%C%@!$H$7$F;H$o$l!"$=$NCM$,5-;v$N%X%C%@!<$KA^F~$5$l$^$9!#$b$7(B -$BB0@-L>$,(B @code{nil} $B$@$C$?$i$=$N%X%C%@!$O:o=|$5$l$^$9!#$b$7B0@-L>(B -$B$,(B @code{eval} $B$@$C$?$i$=$NMM<0$,I>2A$5$l!"7k2L$O2A(B} $B$5$l$F!"JV$j(B -$BCM$,;H$o$l$^$9(B) $B$G$"$k;v$,$G$-$^$9!#4X?t$O%;%C%H%"%C%W$5$l$?%a%C%;!<%8%P%C(B -$B%U%!$G8F$P$l(B (@code{eval} $B$5$l(B) $B$^$9!#8=:_$N5-;v$N%X%C%@!<$OJQ(B -$B?t(B @code{message-reply-headers} $B$+$iF@$i$l$^$9!#(B - -$B$b$7!":n@.$7$h$&$H$7$F$$$k%a%C%;!<%8$,%K%e!<%95-;v$+%a!<%k%a%C%;!<%8$G$"(B -$B$k$+$rD4$Y$?$$$H$-$O!"Fs$D$N4X(B -$B?t(B @code{message-news-p} $B$H(B @code{message-mail-p} $B$r;H$&$3$H$K$h$C$FCN$k(B -$B;v$,$G$-$^$9!#(B - -@findex message-mail-p -@findex message-news-p - -$B$=$7$F!"$3$l$ONc$G$9(B: - -@lisp -(setq gnus-posting-styles - '((".*" - (signature-file "~/.signature") - (name "User Name") - ("X-Home-Page" (getenv "WWW_HOME")) - (organization "People's Front Against MWM")) - ("^rec.humor" - (signature my-funny-signature-randomizer)) - ((equal (system-name) "gnarly") - (signature my-quote-randomizer)) - ((message-news-p) - (signature my-news-signature)) - (header "to" "larsi.*org" - (Organization "Somewhere, Inc.")) - ((posting-from-work-p) - (signature-file "~/.work-signature") - (address "user@@bar.foo") - (body "You are fired.\n\nSincerely, your boss.") - (organization "Important Work, Inc")) - ("nnml:.*" - (From (save-excursion - (set-buffer gnus-article-buffer) - (message-fetch-field "to")))) - ("^nn.+:" - (signature-file "~/.mail-signature")))) -@end lisp - -@samp{nnml:.*} $B$N5,B'$O!"$"$J$?$,=P$9$9$Y$F$NJV;v$N(B @code{To} $B%"%I%l%9(B -$B$r(B @code{From} $B%"%I%l%9$H$7$F;H$&$3$H$r0UL#$7$^$9!#$3$l$O!"$"$J$?$,$?$/(B -$B$5$s$N%a!<%j%s%0%j%9%H$K;22C$7$F$$$k>l9g$KJXMx$G$7$g$&!#(B - -@node Drafts -@section $B2<=q$-(B -@cindex drafts - -$B$b$7%a%C%;!<%8(B ($B%a!<%k$b$7$/$O%K%e!<%9(B) $B$r=q$$$F$$$k$H$-$K!"FMA3%*!<%V%s(B -$B$K%9%F!<%-$,F~$C$F$$$k;v$r;W$$=P$7$?$J$i(B ($B$b$7$/$O!"$"$J$?$,$H!<$C$F$b$9(B -$B$4$$:Z?)C$75n$kM#0l$NJ}K!$O!"$=$l$rL$9XFI$K$9$k$3$H$G$9!#(B - -@c @findex gnus-dissociate-buffer-from-draft -@c @kindex C-c M-d (Mail) -@c @kindex C-c M-d (Post) -@c @findex gnus-associate-buffer-with-draft -@c @kindex C-c C-d (Mail) -@c @kindex C-c C-d (Post) -@c If you're writing some super-secret message that you later want to -@c encode with PGP before sending, you may wish to turn the auto-saving -@c (and association with the draft group) off. You never know who might be -@c interested in reading all your extremely valuable and terribly horrible -@c and interesting secrets. The @kbd{C-c M-d} -@c (@code{gnus-dissociate-buffer-from-draft}) command does that for you. -@c If you change your mind and want to turn the auto-saving back on again, -@c @kbd{C-c C-d} (@code{gnus-associate-buffer-with-draft} does that. -@c -@c @vindex gnus-use-draft -@c To leave association with the draft group off by default, set -@c @code{gnus-use-draft} to @code{nil}. It is @code{t} by default. - -@findex gnus-draft-edit-message -@kindex D e ($B2<=q$-(B) -$B5-;v$NJT=8$rB3$1$?$$$H$-$O!"2<=q$-%0%k!<%W$KF~$C(B -$B$F(B @kbd{D e} (@code{gnus-draft-edit-message}) $B$r2!$9$@$1$G$9!#$"$J$?$,;D(B -$B$7$?>uBV$N%P%C%U%!$K0\F0$7$^$9!#(B - -$B5qH]$5$l$?5-;v$b$3$N2<=q$-%0%k!<%W$KF~$l$i$l$^(B -$B$9(B (@pxref{Rejected Articles})$B!#(B - -@findex gnus-draft-send-all-messages -@findex gnus-draft-send-message -$B$=$l0J>eJT=8$7$J$$$GEj9F(B ($B$b$7$/$O%a!<%k(B) $B$7$?$$5qH]$5$l$?%a%C%;!<%8$,$?(B -$B$/$5$s$"$k$N$G$"$l$P!"L?Na(B @kbd{D s} $B$r;H$&;v$,$G$-$^$9!#$3$NL?Na$O%W%m(B -$B%;%9(B/$B@\F,0z?t$N=,47$rM}2r$7$^$9(B (@pxref{Process/Prefix})$B!#L?(B -$BNa(B @kbd{D S} (@code{gnus-draft-send-all-messages}) $B$O%P%C%U%!$NA4$F$N%a%C(B -$B%;!<%8$rAw$j=P$7$^$9!#(B - -$BAw$j$?$/$J$$%a%C%;!<%8$,$$$/$D$+$"$k$N$G$"$l$P!"L?(B -$BNa(B @kbd{D t} (@code{gnus-draft-toggle-sending}) $B$r;H$C$F%a%C%;!<%8$rG[Aw(B -$BIT2D$N0u$rIU$1$k;v$,$G$-$^$9!#$3$l$O@Z$jBX$(L?Na$G$9!#(B - -@node Rejected Articles -@section $B5qH]$5$l$?5-;v(B -@cindex rejected articles - -$B;~!9%K%e!<%9%5!<%P!<$O5-;v$r5qH]$7$^$9!#$*$=$i$/%5!<%P!<$O$"$J$?$N4i$r9%(B -$B$-$G$O$J$$$N$G$7$g$&!#$*$=$i$/$=$l$O;4$a$K46$8$?$+$i$G$7$g$&!#$*$=$i(B -$B$/(B @emph{$B0-Kb(B (demon) $B$,$$$k$N$G$7$g$&(B}$B!#$*$=$i$/0zMQJ8$rF~$l$9$.$?$N$G(B -$B$7$g$&!#$*$=$i$/%G%#%9%/$,0lGU$@$C$?$N$G$7$g$&!#$*$=$i$/%5!<%P!<$,Mn$A$F(B -$B$$$?$N$G$7$g$&!#(B - -$B$3$l$i$N>u67$O!"$b$A$m$s!"40A4$K(B gnus $B$N07$($kHO0O30$G$9!#(B(Gnus $B$O!"$b$A(B -$B$m$s!"$"$J$?$N308+$r0&$7$F$*$j!"$$$D$b5!7y$,NI$/!"Cf$rHt$S2s$kE7;H$,$$$F!"(B -$B$I$l$/$i$$0zMQJ8$,4^$^$l$F$$$h$&$H5$$K$;$:!"0lGU$K$J$C$?$j!"Mn$C$3$A$?$j(B -$B$7$^$;$s!#(B) $B$G$9$+$i!"(Bgnus $B$O$3$l$i$N5-;v$r8e$G%5!<%P!<$N5$J,$,$h$/$J$k(B -$B$^$GJ]B8$7$^$9!#(B - -$B5qH]$5$l$?5-;v$O<+F0E*$KFCJL$J2<=q$-%0%k!<%W(B (@pxref{Drafts}) $B$KF~$l$i$l(B -$B$^$9!#%5!<%P!<$,La$C$F$-$?$J$i!"IaDL$O$=$N%0%k!<%W$KF~$C$FA4$F$N5-;v$rAw(B -$B$j$^$9!#(B - -@ignore -@node Using GPG -@section Using GPG -@cindex using gpg - -Gnus has an ALPHA support to GPG that's provided by @file{gpg.el}. See -@code{mm-verify-option} and @code{mm-decrypt-option} to enable Gnus to -verify or decrypt messages accordingly. - -To use this correctly with GPG, you'll need the following lisp code in your -@file{~/.emacs} or @file{~/.gnus}: - -@lisp -(require 'gpg) -(setq mml2015-use 'gpg) -(setq gpg-temp-directory (expand-file-name "~/.gnupg/tmp")) -@end lisp - -The @code{gpg-temp-directory} need to point to a directory with permissions set -to 700, for your own safety. - -If you want to benefit of PGP2.6 compatibility, you might create a script named -@file{gpg-2comp} with these instructions: - -@example -#!/bin/sh -exec gpg --rfc1991 "$@@" -@end example - -If you don't want to use such compatibility, you can add the following line to -your @file{~/.emacs} or @file{~/.gnus}: - -@lisp -(setq gpg-command-default-alist (quote ((gpg . "gpg") (gpg-2comp . "gpg")))) -@end lisp - -To sign or encrypt your message you may choose to use the MML Security -menu or @kbd{C-c C-m s p} to sign your message using PGP/MIME, @kbd{C-c -C-m s s} to sign your message using S/MIME. There's also @kbd{C-c C-m c -p} to encrypt your message with PGP/MIME and @kbd{C-c C-m c s} to -encrypt using S/MIME. - -Gnus will ask for your passphrase and then it will send your message, if -you've typed it correctly. - -@end ignore -@node Select Methods -@chapter $BA*BrJ}K!(B -@cindex foreign groups -@cindex select methods - -@dfn{$B30It%0%k!<%W(B} (foreign group) $B$H$O!"IaDL(B ($B$b$7$/$O%G%#%U%)%k%H(B) $B$N(B -$BJ}K!$GFI$^$l$J$$%0%k!<%W$N;v$G$9!#Nc$($P!"$=$l$O0c$C$?(B @sc{nntp} $B%5!<%P!<(B -$B$N%0%k!<%W$G$"$C$?$j!";ve$N%0%k!<%W$G$"$C$?$j!"8D?ME*$J%a!<%k%0%k!<%W(B -$B$G$"$C$?$j$9$k$G$7$g$&!#(B - -$B30It%0%k!<%W(B ($B$b$7$/$O!"K\Ev$KA4$F%0%k!<(B -$B%W(B) $B$O(B @dfn{$BL>A0(B} $B$H(B @dfn{$BA*BrJ}K!(B} $B$G;XDj$5$l$^$9!#8e(B} $B$G$"$kO"A[%j%9%H$G$9!#A*BrJ}K!$K$O!"$=$N(B -$BEv$N%P%C%/%(%s%I$K$H$C$FFCJL$N0UL#$r;}$DCM$G$"$kDI2C$NMWAG$,$"$k$+$bCN$l(B -$B$^$;$s!#(B - -$BA*BrJ}K!$O(B @dfn{$B;ve$N%5!<%P!<(B} $B$rDj5A$9$k$H8@$&$3$H$,$G$-$k$+$b$7$l$^(B -$B$;$s(B---$B$G$9$+$i;d$?$A$O$A$g$&$I$=$l$r$7$^$7(B -$B$?(B (@pxref{Server Buffer})$B!#(B - -$B%0%k!<%W$N(B @dfn{$BL>A0(B} $B$O%P%C%/%(%s%I$,%0%k!<%W$rG'<1$9$kL>A0$G$9!#(B - -$B$?$H$($P!"(B@sc{nntp} $B%5!<%P!<$N%0%k!<%W(B @samp{soc.motss} $B$OL>(B -$BA0(B @samp{soc.motss} $B$HA*BrJ}K!(B @code{(nntp "some.where.edu")} $B$r;}$A$^$9!#(B -@code{nntp} $B%P%C%/%(%s%I$O$3$N%0%k!<%W$r(B @samp{soc.motss} $B$H$7$FCN$C$F$$(B -$B$k$@$1$G$9$,!"(Bgnus $B$O$3$N%0%k!<%W(B -$B$r(B @samp{nntp+some.where.edu:soc.motss}$B$H8F$S$^$9!#(B - -$B$b$A$m$s!"0c$C$?J}K!$OA4$F$=$lFCM-$N$b$N$,$"$j$^$9!#(B - -@menu -* Server Buffer:: $B;ve$N%5!<%P!<$r:n$C$FJT=8$9$k(B -* Getting News:: USENET $B%K%e!<%9$r(B gnus $B$GFI$`(B -* Getting Mail:: $B8D?ME*$J%a!<%k$r(B gnus $B$GFI$`(B -* Browsing the Web:: $B2a>j$J%&%'%V$N;q8;$+$i%a%C%;!<%8$rpJs$rMW5a$9$k%^%7%s(B -$B$+%=%U%H%&%'%"$G$9!#(Bgnus $B$OK\Ev$N$I$s$J%5!<%P!<$K$bD>@\$K$O@\B3$;$:!"%P%C(B -$B%/%(%s%I$+B>$N$b$N$rDL$7$F$9$Y$F$N=hM}$r9T$J$$$^$9!#$7$+$7!"$=$l$Oe$N3,AX$rCV$/$3$H$G$"$C$F!"$=$l$>$l$N(B -$B%P%C%/%(%s%I$,$^$5$K5?;wE*$J%5!<%P!<$KAjEv$9$k$H8@$C$F$bNI$$$G$7$g$&!#(B - -$BNc$($P(B @code{nntp} $B%P%C%/%(%s%I$O!"0[$J$k$$$/$D$+$Nc(B -$B$,$A$J(B @sc{nntp} $B%5!<%P!<(B @samp{news.funet.fi} $B$N%]!<%H(B 13 $B$rFI$_$?$$>l(B -$B9g$H$+!#$&$*$C$[$s!#$H$K$+$/$G$9$M!"$3$N%5!<%P!<$r;H$&$=$l$>$l$N%0%k!<%W(B -$B$K$D$$$F$=$&$$$&$3$H$r@_Dj$7$J$1$l$P$J$i$J$$$H$7$?$i!"BgJQ$J:n6H$K$J$C$F(B -$B$7$^$&$G$7$g$&!#$=$3$G(B gnus $B$O!"$=$&$$$&:n6H$r%5!<%P!<%P%C%U%!$G9T$J$&$?(B -$B$a$K!"A*BrJ}K!$KL>A0$rIU$1$k$rA*BrJ}K!$H$7$F;H$&;v$,$G$-$k(B -* Unavailable Servers:: $B@\B3$7$h$&$H;n$_$?%5!<%P!<$N$$$/$D$+$,Mn(B - $B$A$F$$$k$+$b$7$l$J$$(B -@end menu - -@vindex gnus-server-mode-hook -$B%5!<%P!<%P%C%U%!$r:n@.$9$k$H$-$K(B @code{gnus-server-mode-hook} $B$,A0!#(B - -@item n -$B%5!<%P!<$NL>A0!#(B - -@item w -$B$I$3$+$i%K%e!<%9$,uBV!#(B -@end table - -@vindex gnus-server-mode-line-format -$B%b!<%I9T$bJQ?t(B @code{gnus-server-mode-line-format} $B$r;H$&;v$K$h$C$F%+%9(B -$B%?%^%$%:$9$k;v$,$G$-$^$9(B (@pxref{Mode Line Formatting})$B!#0J2<$N;XDj$OM}(B -$B2r$5$l$^$9(B: - -@table @samp -@item S -$B%5!<%P!!#(B - -@item M -$B%5!<%P!H$7$F$/$@$5$$!#(B - -@node Server Commands -@subsection $B%5!<%P!o$K4JC1$G!"<+J,<+?H$r$h$/@bL@$7$F$$$^$9(B: - -@lisp -(nntp "news.funet.fi") -@end lisp - -$BD>@\%9%W!<%k$+$iFI$`$N$O$b$C$H4JC1$G$9(B: - -@lisp -(nnspool "") -@end lisp - -$B8+$?$H$*$j!"A*BrJ}K!$N:G=i$NMWAG$O%P%C%/%(%s%I$NL>A0$G!"FsHVL\(B -$B$O(B @dfn{$B%"%I%l%9(B} (address)$B!"$b$7$/$O$=$&8F$S$?$$$N$G$"$l$P!"(B -@dfn{$BL>A0(B} $B$G$9!#(B - -$B$3$l$i$NFs$D$NMWAG$N8e$K$O!"G$0U$N?t(B -$B$N(B @code{(@var{$BJQ?t(B} @var{$BMM<0(B})} $B$NBP$rF~$l$k;v$,$G$-$^$9!#(B - -$B:G=i$NNc$KLa$j$^$7$g$&(B---$B$=$N%^%7%s$N%]!<%H(B 15 $B$+$iFI$_$?$+$C$?$H;W$C$F(B -$B$/$@$5$$!#$3$l$,$=$N;~$K!"$J$k$Y$-A*BrJ}K!$G$9(B: - -@lisp -(nntp "news.funet.fi" (nntp-port-number 15)) -@end lisp - -$B$I$NJQ?t$,4XO"$9$k$+$r8+$D$1$k$?$a$K!"$=$l$>$l$N%P%C%/%(%s%I$N@bL@J8=q$r(B -$BFI$`$Y$-$G$7$g$&$,!"$3$l$O(B @code{nnmh} $B$NNc$G$9!#(B - -@code{nnml} $B$O%9%W!<%k$N$h$&$J9=B$$GFI$`%a!<%k%P%C%/%(%s%I$G$9!#Nc$($P!"(B -$B@\?($r?^$j$?$$Fs$D$N9=B$$,$"$k$H$7$^$7$g$&(B: $B0l$D$O$"$J$?$N;dE*$J%a!<%k%9(B -$B%W!<%k$G!"B>J}$O8xE*$J$b$N$G$9!#$3$l$O;dE*$J%a!<%k$N$?$a$K;HMQ2DG=$J;XDj(B -$B$G$9(B: - -@lisp -(nnmh "private" (nnmh-directory "~/private/mail/")) -@end lisp - -($B$=$&$9$k$H$3$N%5!<%P!<$O(B @samp{private} $B$H8F$P$l$^$9$,!"$"$J$?$O4{$K?d(B -$BB,$7$F$$$?$+$b$7$l$^$;$s!#(B) - -$B$3$l$O8xE*%9%W!<%k$N$?$a$NJ}K!$G$9(B: - -@lisp -(nnmh "public" - (nnmh-directory "/usr/information/spool/") - (nnmh-get-new-mail nil)) -@end lisp - -@cindex proxy -@cindex firewall - -$BKIJI(B (firewall) $B$NCf$K$$$F!"KIJI%^%7%s$+$i$N(B @sc{nntp} $B%5!<%P!<$X$N@\B3(B -$B$7$+$J$$$N$G$"$l$P!"(Bgnus $B$KKIJI%^%7%s$K(B @code{rlogin} $B$7$F!"$=$3$+(B -$B$i(B @sc{nntp} $B%5!<%P!<$K(B telnet $B$r$9$k$h$&$K;X<($9$k;v$,$G$-$^$9!#(B -$B$3$l$r$9$k;v$O>/$7$P$+$i$7$$$G$9$,!";ve$N%5!<%P!<$NDj5A$O$*$=$i$/$3$N(B -$B$h$&$J$b$N$K$J$k$Y$-$G$9(B: - -@lisp -(nntp "firewall" - (nntp-open-connection-function nntp-open-via-rlogin-and-telnet) - (nntp-via-address "the.firewall.machine") - (nntp-address "the.real.nntp.host") - (nntp-end-of-line "\n")) -@end lisp - -$B$b$7!"$9$P$i$7$$(B @code{ssh} $B%W%m%0%i%`$r!"%b%G%`@~$+$i$N05=L$5$l$?@\B3$r(B -$BDs6!$9$k$?$a$K;H$$$?$$$N$G$"$l$P!">e5-$NNc$K0J2<$N@_Dj$r2C$($k$3$H$,$G$-(B -$B$^$9!#(B - -@lisp - (nntp-via-rlogin-command "ssh") -@end lisp - -$B$b$7$"$J$?$,KIJI$NCf$K$$$?$H$7$F$b!"(B"runsocks" $B$N$h$&$J%i%C%Q!<%3%^%s%I(B -$B$rDL$7$F30$N@$3&$rD>@\%"%/%;%9$G$-$k$N$J$i$P!"0J2<$N$h$&$K(B socks $B$rDL$7(B -$B$F%K%e!<%9%5!<%P!<$H(B telnet $B@\B3$9$k$3$H$,$G$-$^$9(B: - -@lisp -(nntp "outside" - (nntp-pre-command "runsocks") - (nntp-open-connection-function nntp-open-via-telnet) - (nntp-address "the.news.server") - (nntp-end-of-line "\n")) -@end lisp - -$B$3$l$O$b$A$m$s!"<+F0G'>Z$rDs6!$9$k$?$a$K(B @code{ssh-agent} $B$rE,@Z$K@_Dj$7(B -$B$J$1$l$P$J$j$^$;$s!#05=L$5$l$?@\B3$rF@$k$?$a$K$O!"(B@code{ssh}$B$N%U%!%$(B -$B%k(B @file{config} $B$G(B @samp{Compression} $B%*%W%7%g%s$,$"$kI,MW$,$"$j$^$9!#(B - -@node Creating a Virtual Server -@subsection $B;ve$N%5!<%P!<$r:n@.$9$k(B - -$B$b$7$"$J$?$O1JB35-;v$r;H$C$F$?$/$5$s$N5-;v$r%-%c%C%7%e$KJ]B8$7$F$$$k$N$G(B -$B$"$l$P!"%-%c%C%7%e$rFI$`$?$a$N;ve$N%5!<%P!<$r:n$j$?$$$H;W$&$+$b$7$l$^(B -$B$;$s!#(B - -$B:G=i$K!"?7$7$$%5!<%P!<$rIU$12C$($kI,MW$,$"$j$^$9!#L?Na(B @kbd{a} $B$,$=$l$r(B -$B$7$^$9!#$*$=$i$/%-%c%C%7%e$rFI$`$?$a$K$O(B @code{nnspool} $B$r;H$&$N$,0lHVNI(B -$B$$$G$7$g$&!#(B@code{nnml} $B$d(B @code{nnmh} $B$b;H$&;v$,$G$-$^$9$1$I!#(B - -@kbd{a nnspool RET cache RET} $B$HBG$C$F$/$@$5$$!#(B - -$B:#$dA4$/?7$7$$(B @samp{cache} $B$H8F$P$l$k(B @code{nnspool} $B$N;ve$N%5!<%P!<(B -$B$"$k$O$:$G$9!#e$N%5!<%P!<$G(B @kbd{RET} $B$r2!$9$H!"1\Mw%P%C%U%!$KF~$k$Y$-$G!"I=<($5$l(B -$B$F$$$k$I$N%0%k!<%W$K$G$bF~$k;v$,$G$-$k$O$:$G$9!#(B - -@node Server Variables -@subsection $B%5!<%P!J}$G(B)$B!"(B -$BJQ?t$NDj5A$,%m!<%I$5$l$k$F$$$k4V$K!"$$$/$D$+$NJQ?t$OB>$NJQ?t$+$i=i4|2=$5(B -$B$l$k$H$$$&;v$G$9!#$b$7(B "$B4p$H$J$k(B" $BJQ?t$,%m!<%I$5$l$?8e$KJQ99$7$F$b!"(B"$BF3(B -$B$-=P$5$l$?(B" $BJQ?t$OJQ99$5$l$^$;$s!#(B - -$B$3$l$OIaDL$O%G%#%l%/%H%j!<$d%U%!%$%k$NJQ?t$K1F6A$7$^$9!#Nc$($P!"(B -@code{nnml-directory} $B$O%G%#%U%)%k%H$G(B @file{~/Mail} $B$G$9$,!"A4$F(B -$B$N(B @code{nnml} $B%G%#%l%/%H%j!e$N(B @code{nnml} $B%5!<%P!<$rDj5A$7$?>l9g!"(B@code{nnml-directory} $B$r@_Dj(B -$B$9$k$@$1$G$O=$s$@>uBV$K$J$k$h$&$K!"(B -$BA4$F$N%U%!%$%kJQ?t$rL@<(E*$K@_Dj$7$J$1$l$P$J$j$^$;$s!#$=$l$>$l$N%P%C%/%((B -$B%s%I$KBP$9$k40A4$JJQ?t$N%j%9%H$r8+$k$?$a$K$O!"$3$N%^%K%e%"%k$N8e$KB3$/$=(B -$B$l$>$l$N%P%C%/%(%s%I$NItJ,$rFI$s$G$/$@$5$$!#$G$b!"(B@code{nnml} $B$NDj5A$NNc(B -$B$O$3$3$K$"$j$^$9(B: - -@lisp -(nnml "public" - (nnml-directory "~/my-mail/") - (nnml-active-file "~/my-mail/active") - (nnml-newsgroups-file "~/my-mail/newsgroups")) -@end lisp - -@node Servers and Methods -@subsection $B%5!<%P!<$HJ}K!(B - -$BIaDL$OA*BrJ}K!$r;H$&$H$3$m(B ($BNc$($P!"30It%5!<%P!<$r354Q$7$F$$$k$H$-$N%0%k!<(B -$B%WA*BrJ}K!$G$N(B @code{gnus-secondary-select-method}) $B$O$I$3$G$b!";ve$N(B -$B%5!<%P!$r$=$l$NBe$o$j$K;H$&;v$,$G$-$^$9!#$3$N$3$H$K$h$j$?$/$5$s%-!<%\!<(B -$B%I$rC!$+$J$/$F$9$`2DG=@-$,$"$j$^$9!#$=$7$F!"A4$F$K$o$?$C$F!"$=$NJ}$,NI$$(B -$B$G$9!#(B - -@node Unavailable Servers -@subsection $B;HMQIT2DG=$J%5!<%P!<(B - -$B$b$7%5!<%P!<$K@\B3IT2DG=$G$"$k$J$i$P!"(Bgnus $B$O%5!<%P!<$r(B @code{$B5qH](B} $B$H$7(B -$B$F0u$rIU$1$^$9!#$3$l$O$=$N8e$N$=$N%5!<%P!<$H$N@\B3$r$O$+$k$I$N$h$&$J;n$_(B -$B$bL5;k$5$l$k$H$$$&;v$G$9!#(BGnus $B$O@\B3$,3+$1$J$$$3$H$,K\Ev$G$"$k$+$I$&$+(B -$B$r>/$7$b3N$+$a$:!"(B``It can't be opend,'' ($B@\B3$r3+$/;v$,$G$-$^$;$s(B) $B$H9p(B -$B$2$^$9!#(B - -$B$=$l$O9T57$,0-$$$H;W$&;v$,$"$k$+$b$7$l$^$;$s$,!"$=$l$O$?$$$F$$$N$H$-$K$O(B -$BNI$$J}K!$G$9!#Nc$($P!"%5!<%P!<(B @samp{nephelococcdyia.com} $B$K(B 10 $B8D9XFI$7(B -$B$F$$$k%0%k!<%W$,$"$k$H$7$^$7$g$&!#%5!<%P!<$O$I$3$+Hs>o$K1s$/$K$"$j!"%^%7(B -$B%s$O$H$F$bCY$$$N$G!"$=$l$,:#F|$O$"$J$?$H$N@\B3$r5qH]$9$k$+$I$&$+$rD4$Y$k(B -$B$@$1$G0lJ,$+$+$j$^$9!#$b$7(B gnus $B$,$=$l$r(B 10 $B2s;n$9$h$&$K$J$C$F$$$?$J$i!"(B -$B$"$J$?$OHs>o$K$&$k$5$/;W$&$G$7$g$&!#$G$9$+$i!"(Bgnus $B$O$=$l$r;n$=$&$H$O$7(B -$B$^$;$s!#0lEY(B ``connection refused'' ($B@\B3$O5qH]$5$l$^$7$?(B) $B$rC5n$7$^(B -$B$9(B (@code{gnus-server-remove-denials})$B!#(B -@end table - -@node Getting News -@section $B%K%e!<%9$NpJs$rJT=8$7$J$1$l$P$J$j$^$;(B -$B$s(B (@pxref{Foreign Groups})$B!#(B - -$B30It%0%k!<%W$NL>A0$O4pK\%0%k!<%W$HF1$8$G$"$k;v$,$G$-$^$9!#A0$N>WFM$O5/$3$j$^$;$s!#(B - -$B0J2<$NJQ?t$O;ve$N(B @code{nntp} $B%5!<%P!<$r:n$k$?$a$K;H$o$l$^$9(B: - -@table @code -@item nntp-server-opened-hook -@vindex gnus-server-opend-hook -@cindex @sc{mode reader} -@cindex authinfo -@cindex authentification -@cindex nntp authentification -@findex nntp-send-authinfo -@findex nntp-send-mode-reader -$B$O@\B3$,$G$-$?8e$Ko$K$3$N%U%C%/$K$"$k$Y$-$G$9!#(B - -@item nntp-authinfo-function -@vindex nntp-authinfo-function -@findex nntp-send-authoinfo -@vindex nntp-authinfo-file -$B$3$N4X?t$O(B @sc{nntp} $B%5!<%P!<$K(B @samp{AUTHINFO} $B$rAw$k$?$a$K;H$o$l$^$9!#(B -$B%G%#%U%)%k%H$N4X?t$O(B @code{nntp-send-authinfo} $B$G!"(B -@file{~/.authinfo} ($B$b$7$/$OJQ?t(B @code{nntp-authinfo-file} $B$K@_Dj$7$?$I(B -$B$N$h$&$J$b$N$G$b(B) $B$r;HMQ2DG=$J5-:\$rD4$Y$k$?$a$KC5$7$^$9!#$b$70l$D$b8+$D(B -$B$+$i$J$+$C$?$i!"$"$J$?$K%m%0%$%sL>$H%Q%9%o!<%I$NF~NO$rB%?J$7$^$9!#%U%!%$(B -$B%k(B @file{~/.authinfo} $B$NMM<0$O(B ($B$[$H$s$I(B) @code{ftp} $B$N%U%!%$(B -$B%k(B @file{~/.netrc} $B$HF1$8$G!"$=$l$O(B @code{ftp} $B$N%^%K%e%"%k%Z!<%8$KDj5A(B -$B$5$l$F$$$^$9$,!"$3$3$N$b$N$O82Cx$J;ve$N9T$r4^$_!"$=$l$>$l$O0l$D$N%5!<%P!<$rDj5A$7$^$9!#(B - -@item -$B$=$l$>$l$N9T$OG$0U$N?t$N(B $B6h@Z$j0u(B/$BCM(B $B$NBP$r4^$`;v$,$G$-$^$9!#(B - -$BM-8z$J6h@Z$j0u$O(B @samp{machine}, @samp{login}, @samp{password}, -@samp{default} $B$G$9!#2C$($F!"(Bgnus $B$O(B @file{.netrc}/@code{ftp} $B$N9=J8$N86(B -$B7?$K$O8=$l$J$$Fs$D$N?7$7$$6h@Z$j0u!"L>IU$1(B -$B$F(B @samp{port} $B$H(B @samp{force} $B$rF3F~$7$^$9!#(B -($B$3$l$,(B @file{.authinfo} $B%U%!%$%k$NMM<0$,(B @file{.netrc} $B%U%!%$%k$NMM<0$+(B -$B$i0o$l$kM#0l$NJ}K!$G$9!#(B) @samp{port} $B$O%5!<%P!<$N$I$N%]!<%H$rG'>Z$KMQ$$(B -$B$k$+$r<($7!"(B@samp{force} $B$O0J2<$G@bL@$7$^$9!#(B - -@end enumerate - -$B$3$l$,$=$N%U%!%$%k$NNc$G$9(B: - -@example -machine news.uio.no login larsi password geheimnis -machine nntp.ifi.uio.no login larsi force yes -@end example - -$B6h@Z$j0u(B/$BCM(B $B$NBP$O$I$N$h$&$J=gHV$G$G$b8=$l$k;v$,$G$-$^$9!#Nc$($P!"(B -@samp{machine} $B$O:G=i$K8=$l$kI,MW$O$"$j$^$;$s!#(B - -$B$3$NNc$G$O!"%m%0%$%sL>$H%Q%9%o!<%I$NN>J}$,A0$@$1$r5s$2$F$$$F!"MxMQZ>pJs(B (authinfo) $B$,Aw$i$l$k$H$$$&;v$G$9!#%G%#(B -$B%U%)%k%H(B ($B$9$P$o$A!"(B@samp{force} $B%?%0$,L5$$$H$-(B) $B$G$O(B @var{nntp} $B%5!<%P!<(B -$B$,G'>Z>pJs$r?R$M$J$$8B$j$=$l$r(B @var{nntp} $B%5!<%P!<$KAw$j$^$;$s!#(B - -@samp{machine} $B9T$K9gCW$7$J$$A4$F$N%5!<%P!<$KE,MQ$5$l(B -$B$k(B @samp{default} $B9T$rDI2C$9$k;v$b$G$-$^$9!#(B - -@example -default force yes -@end example - -$B$3$l$O0JA0$K=q$+$l$F$$$J$$A4$F$N%5!<%P!<$KL?Na(B @samp{AUTHINFO} $B$r6/@)E*(B -$B$KAw$j$^$9!#(B - -$B%U%!%$%k(B @file{~/.authinfo} $B$r@$3&Cf$,FI$a$k$h$&$J@_Dj$KJ|CV$7$J$$$h$&$K(B -$BCm0U$7$F$/$@$5$$!#(B - -@item nntp-server-action-alist -@vindex nntp-server-action-alist -$B$3$l$O%5!<%P!<$N7?$K9gCW$9$k@55,I=8=$H!"9gCW$,5/$3$C$?$H$-$Kc$,$A$G$"$k$J$i!"$3$NJQ?t$r(B 1 $B$K@_Dj$9$k$Y$-$G$7$g(B -$B$&!#(B - -@item nntp-connection-timeout -@vindex nntp-connection-timeout -$BDj4|E*$K@\B3$9$k30It(B @code{nntp} $B%0%k!<%W$,$?$/$5$s$"$k$J$i!"E,@Z$K1~Ez(B -$B$7$J$$(B @code{nntp} $B%5!<%P!<$,$"$C$?$j!"$"$k%5!<%P!<$O>o<1E*$J;~4VFb$G$O(B -$BJVEz$G$-$J$$$/$i$$Ii2Y$,$+$+$C$F$$$k!"$J$I$NLdBj$,$"$k$G$7$g$&!#$3$l$O:$$C(B -$B$?LdBj$K$J$k$3$H$,$"$j$^$9$,!"(B@code{nntp-connection-timeout} $B$r@_Dj$9$k(B -$B;v$K$h$j$"$kDxEY2r>C$9$k;v$,$G$-$^$9!#$3$l$O@\B3$r$"$-$i$a$k$^$($K!"(B -@code{nntp} $B%P%C%/%(%s%I$,2?ICBT$D$+$r<($9@0?t$G$9!#$b$7$3$l(B -$B$,(B @code{nil} $B$G$"$k$H!"$3$l$,=i4|@_Dj$G$9$,!";~4V@Z$l@ZCG$O$J$5$l$^$;$s!#(B - -@c @item nntp-command-timeout -@c @vindex nntp-command-timeout -@c @cindex PPP connections -@c @cindex dynamic IP addresses -@c If you're running Gnus on a machine that has a dynamically assigned -@c address, Gnus may become confused. If the address of your machine -@c changes after connecting to the @sc{nntp} server, Gnus will simply sit -@c waiting forever for replies from the server. To help with this -@c unfortunate problem, you can set this command to a number. Gnus will -@c then, if it sits waiting for a reply from the server longer than that -@c number of seconds, shut down the connection, start a new one, and resend -@c the command. This should hopefully be transparent to the user. A -@c likely number is 30 seconds. -@c -@c @item nntp-retry-on-break -@c @vindex nntp-retry-on-break -@c If this variable is non-@code{nil}, you can also @kbd{C-g} if Gnus -@c hangs. This will have much the same effect as the command timeout -@c described above. - -@item nntp-server-hook -@vindex nntp-server-hook -$B$3$N%U%C%/$O(B @sc{nntp} $B%5!<%P!<$K@\B3$9$k:G8e$N0lJb$H$7$Fc$,$A$G$"$k$H$-$K$3$l$r(B @code{nil} $B$G$J$$CM(B -$B$K@_Dj$7$F$/$@$5$$!#(B - -@item nntp-nov-is-evil -@vindex nntp-nov-is-evil -@sc{nntp} $B%5!<%P!<$,(B @sc{nov} $B5!G=$rDs6!$7$F$$$J$1$l$P$3$NJQ?t(B -$B$r(B @code{t} $B$K@_Dj$9$k;v$,$G$-$^$9$,!"(B@code{nntp} $B$OIaDL$O(B @sc{nov} $B$,;H(B -$B$o$l$k$+$I$&$+$r<+F0E*$KD4$Y$^$9!#(B - -@item nntp-xover-commands -@vindex nntp-xover-commands -@cindex nov -@cindex XOVER -$B%5!<%P!<$+$i(B @sc{nov} $B9T$rl(B -$B9g$O!"$3$NJQ?t$rK\Ev$K>.$5$J?t;z$K@_Dj$9$k$H$*$=$i$//$7;(2;$,$?(B -$B$F$i$l$^$9!#(B - -@item nntp-record-commands -@vindex nntp-record-commands -$B$b$7(B @code{nil} $B$G$J$$$H!"(B@code{nntp} $B$O(B @sc{nntp} $B%5!<%P!<$KAw$C$?A4$F(B -$B$NL?Na$r(B ($B;~9o$H6&$K(B) @samp{*nntp-log*} $B%P%C%U%!$K5-O?$7$^$9!#$3$l$OF0:n(B -$B$7$F$$$J$$$H;W$o$l$k(B gnus/@sc{nntp} $B@\B3$r%G%#%P%C%0$7$F$$$k$H$-$KLr$KN)(B -$B$A$^$9!#(B - -@item nntp-open-connection-function -@vindex nntp-open-connection-function -$B$I$N$h$&$K(B nntp $B%5!<%P!<$H@\B3$9$k$+$r%+%9%?%^%$%:$9$k$3$H$,$G$-$^$9!#%Q(B -$B%i%a!<%?(B @code{nntp-open-connection-function} $B$r@_Dj$9$k$H!"(Bgnus $B$O@\B3(B -$B$r3NN)$9$k$?$a$K$=$N4X?t$r;H$$$^$9!#$=$N$?$a$K8^$D$N4X?t$,$"$i$+$8$aMQ0U(B -$B$5$l$F$$$^$9!#$=$l$i$OFs@\@\B3$9$k$?$a$N4X?t(B -$B72(B ($B;0$D(B) $B$H4V@\E*$K@\B3$9$k$?$a$N$b$N(B ($BFs$D(B) $B$,$"$j$^$9!#(B - -@item nntp-list-options -@vindex nntp-list-options -LIST $B%3%^%s%I$N%*%W%7%g%s$K;H$C$F!"(B($B%5!<%P!<$N(B) $B%j%9%H=PNO$r@_Dj$7$?%K%e!<(B -$B%9%0%k!<%W$@$1$K@)8B$9$k$?$a$N!"%K%e!<%9%0%k!<%WL>$N%j%9%H$G$9!#$=$l$>$l(B -$B$N%K%e!<%9%0%k!<%WL>$K$O(B @dfn{fj.*} $B$d(B @dfn{japan.*} $B$N$h$&$J!"%7%'%k7A(B -$B<0$N%o%$%k%I%+!<%I$r;H$&$3$H$,$G$-$^$9!#$b$79,1?$K$b%5!<%P!<$,$=$N$h$&$J(B -$B%*%W%7%g%s$rr7o$G9VFI$9$k%K%e!<%9%0%k!<%WL>$N@55,I=8=$G$9!#@55,I=8=$NJ8(B -$B;zNs$G$O(B @dfn{$} $B$NBe$o$j$K(B @dfn{ } $B$r;H$C$F2<$5$$!#%5!<%P!<$,(B LIST $B%3%^(B -$B%s%I$N%*%W%7%g%s$K%7%'%k7A<0$N%o%$%k%I%+!<%I$rl9g$G$b!"(B -@code{nntp-list-options} $B$HF1MM$N8z2L$,$"$k$G$7$g$&!#$3$l$O!"0J2<$N$h$&(B -$B$K%5!<%P!r7o$G9VFI$9$k%K%e!<%9%0%k!<%WL>$N@55,I=8=$G$9!#@55,I=(B -$B8=$NJ8;zNs$G$O(B @dfn{$} $B$NBe$o$j$K(B @dfn{ } $B$r;H$C$F2<$5$$!#%5!<%P!<(B -$B$,(B LIST $B%3%^%s%I$N%*%W%7%g%s$K%7%'%k7A<0$N%o%$%k%I%+!<%I$rl9g$G$b!"(B@code{nntp-list-options} $B$HF1MM$N8z2L$,$"$k$G$7$g$&!#$3$l(B -$B$O!"0J2<$N$h$&$K%5!<%P!@\@\B3$9$k(B -* Indirect Functions:: $B%5!<%P!<$K4V@\E*$K@\B3$9$k(B -* Common Variables:: $B$$$/$D$+$N@\B3MQ$N4X?t$,;2>H$9$kJQ?t(B -@end menu - -@node Direct Functions -@subsubsection $BD>@\@\B3$9$k$?$a$N4X?t(B -@cindex direct connection functions - -$B$3$l$i$N4X?t$O!"$"$J$?$N%^%7%s$H(B @sc{nntp}$B%5!<%P!<$r@\B3$9$k$?$a$KD>@\8F(B -$B$P$l$^$9!#$^$?!"$=$l$i$NF0:n$O$=$l$i$,6&DL$K;2>H$9$kJQ?t$K1F6A$5$l$^(B -$B$9(B (@pxref{Common Variables})$B!#(B - -@table @code -@findex nntp-open-network-stream -@item nntp-open-network-stream -$B$3$l$O%G%#%U%)%k%H$G!"C1=c$K1s3V%7%9%F%`$N%]!<%H$J$I$K@\B3$7$^$9!#(B - -@findex nntp-open-ssl-stream -@item nntp-open-ssl-stream -@dfn{$B0BA4$J(B} $B%A%c%s%M%k$r;H$C$F%5!<%P!<$K@\B3$7$^$9!#$3$l$r;H$&$?$a$K$O!"(B -SSLeay $B$,%$%s%9%H!<%k$5$l$F$$$J$1$l$P$J$j$^$;(B -$B$s(B (@uref{ftp://ftp.psy.uq.oz.au/pub/Crypto/SSL} $B$H!"(B@file{ssl.el} ($BNc$((B -$B$P!"(BW3 $B$NG[I[$+$i(B) $B$,I,MW$K$J$j$^$9(B)$B!#$=$l$+$i%5!<%P!<$r@\%"%/%;%9$G$-$k$J$i$P!"$"$J$?$O$=$l$r$3$N$h$&$K;H(B -$B$&$3$H$,$G$-$k$N$G$9(B: - -@lisp -(nntp "socksified" - (nntp-pre-command "runsocks") - (nntp-open-connection-function nntp-open-telnet-stream) - (nntp-address "the.news.server")) -@end lisp - -Emacs $B$N%;%C%7%g%sA4BN$r%i%C%W$7$F!"%G%#%U%)%k%H$N%a%=%C%I$r;H$&$H$$$&$N(B -$B$O!"NI$$0F$G$O$"$j$^$;$s!#(B -@end table - -@node Indirect Functions -@subsubsection $B4V@\E*$K@\B3$9$k$?$a$N4X?t(B -@cindex indirect connection functions - -$B$3$l$i$N4X?t$O!"H$9$kJQ?t$K1F6A$5$l$^$9(B (@pxref{Common Variables})$B!#(B - -@table @code -@item nntp-open-via-rlogin-and-telnet -@findex nntp-open-via-rlogin-and-telnet -$B1s3V%7%9%F%`$K(B @samp{rlogin} $B$7$F!"$=$3$+$iK\Ev(B -$B$N(B @sc{nntp} $B%5!<%P!<$K(B @samp{telnet} $B$7$^$9!#$3$l$O!"Nc$($P$"$J$?$,;O$a(B -$B$KKIJI%^%7%s$K@\B3$7$J$1$l$P$J$i$J$$>l9g$KJXMx$G$9!#(B - -@code{nntp-open-via-rlogin-and-telnet}-$BMQ$NJQ?t(B: - -@table @code -@item nntp-via-rlogin-command -@vindex nntp-via-rlogin-command -$BCf4V$N%[%9%H$K%m%0%$%s$9$k$?$a$K;H$o$l$k%3%^%s%I$G$9!#%G%#%U%)%k%H(B -$B$O(B @samp{rsh} $B$G$9$,!"(B@samp{ssh} $B$,?M5$$N$"$kBeBXJ}(B) $B$G(B @code{ENVIRON} $B%*%W%7%g%s$r%5%]!<%H$7!"%m%0%$%sL>$NF~(B -$BNO$rMW5a$7$^$;$s!#$3$l$ONc$($P(B Solaris $B$N(B @code{telnet} $B$GF0:n$7$^$9!#(B - -@item nntp-via-shell-prompt -@vindex nntp-via-shell-prompt -$BCf4V$N%[%9%H$G$N%7%'%k$N%W%m%s%W%H$K9gCW$9$k@55,I=8=$G$9!#%G%#%U%)%k%H(B -$B$O(B @samp{bash\\|\$ *\r?$\\|> *\r?} $B$G$9!#(B -@end table -@end table - -$B$3$l$i$O>e5-$N4X?t$,;2>H$9$kIU2CE*$JJQ?t$G$9(B: - -@table @code -@item nntp-via-user-name -@vindex nntp-via-user-name -$BCf4V$N%[%9%H$K@\B3$9$k$H$-$K;H$&MxMQ$G$9!#(B - -@item nntp-via-address -@vindex nntp-via-address -$B@\B3$9$kCf4V$N%[%9%H$N%"%I%l%9$G$9!#(B -@end table - -@node Common Variables -@subsubsection $B6&DL$NJQ?t(B - -$B0J2<$NJQ?t$O!"$9$Y$F$N!"$^$?$O$$$/$D$+$N$"$i$+$8$aMQ0U$5$l$F$$$k4X?t$NF0(B -$B:n$K1F6A$r5Z$\$7$^$9!#@_Dj$5$l$F$$$J$1$l$P!"$9$Y$F$N4X?t$,1F6A$5$l$^$9!#(B - -@table @code -@item nntp-pre-command -@vindex nntp-pre-command -$BAG$N@\B3MQ$N4X(B -$B?t(B (@code{nntp-open-network-stream} $B$H(B @code{nntp-open-ssl-stream} $B$@$1(B -$B$@$H;W$&(B) $B$G$O$J$$$b$N$rDL$7$F@\B3$9$k$H$-$K;H$&%3%^%s%I%i%C%Q!<$G$9!#Nc(B -$B$($P$"$J$?$O(B @samp{SOCKS} $B%i%C%Q!<$r3d$jEv$F$k$G$7$g$&!#(B - -@item nntp-address -@vindex nntp-address -@sc{nntp} $B%5!<%P!<$N%"%I%l%9$G$9!#(B - -@item nntp-port-number -@vindex nntp-port-number -$B@\B3$9$k(B @sc{nntp} $B%5!<%P!<$N%]!<%HHV9f$G$9!#%G%#%U%)%k%H(B -$B$O(B @samp{nntp} $B$G$9!#(B - -@item nntp-end-of-line -@vindex nntp-end-of-line -@sc{nntp} $B%5!<%P!<$H$*OC$r$7$F$$$k$H$-$K9T$N=*$o$j$N0u$H$7$F;H$o$l$kJ8;z(B -$BNs$G$9!#$3$l$O%G%#%U%)%k%H$G(B @samp{\r\n} $B$G$9$,!"AG$G$O$J$$@\B3MQ$N4X?t(B -$B$r;H$C$F$$$k$H$-$O(B @samp{\n} $B$G$"$k$Y$-$G$9!#(B - -@item nntp-telnet-command -@vindex nntp-telnet-command -@samp{telnet} $B$rDL$7$F(B @sc{nntp} $B%5!<%P!<$H@\B3$9$k$H$-$K;H$&%3%^%s%I$G(B -$B$9!#$3$l$OCf4V$N%[%9%H$H@\B3$9$k$?$a$N$b$N$G$O(B $B!v$"$j$^$;$s!v!#$3$l$OC1(B -$B$KK\Ev$N(B @sc{nntp} $B%5!<%P!<$H@\B3$9$k$?$a$N$b$N$G$9!#%G%#%U%)%k%H(B -$B$O(B @samp{telnet} $B$G$9!#(B - -@item nntp-telnet-switches -@vindex nntp-telnet-switches -@code{nntp-telnet-command} $B$KEO$9%9%$%C%A$N%j%9%H$G$9!#%G%#%U%)%k%H(B -$B$O(B @samp{("-8")} $B$G$9!#(B -@end table - -@node News Spool -@subsection $B%K%e!<%9%9%W!<%k(B -@cindex nnspool -@cindex new spool - -$B%m!<%+%k%9%W!<%k$+$i30It%0%k!<%W$r9XFI$9$k;v$OHs>o$K4JC1$G!"Lr$KN)$A$^$9!#(B -$B$?$H$($P!"Hs>o$KBg$-$J5-;v$,$"$k%0%k!<%W(B---$BNc$((B -$B$P(B @samp{alt.binaries.pictures.furniture} $B$rFI$`B.EY$,B.$/$J$j$^$9!#(B - -$B$H$K$+$/!"(B@code{nnspool} $B$rJ}K!$H$7$F!"(B@code{""} ($B$b$7$/$O2?$G$b(B) $B$r%"%I(B -$B%l%9$H$7$F;XDj$9$k$@$1$G$9!#(B - -$B$b$7%m!<%+%k%9%W!<%k$K$D$J$0;v$,2DG=$J$i!"$*$=$i$/$=$l$r4pK\A*BrJ}K!$H$7(B -$B$F;H$&$Y$-$G$7$g$&(B (@pxref{Finding the News})$B!#$=$l$OIaDL(B -$B$O(B @code{nntp} $BA*BrJ}K!$h$jB.$$$G$9$,!"$=$&$G$J$$$+$b$7$l$^$;$s!#$=$l$O(B -$B>u67$K0MB8$7$^$9!#2?$,$"$J$?$N%5%$%H$G0lHVNI$$$+$r8+$D$1$k$?$a$K!"$$$m$$(B -$B$m$H;n$7$F$_$J$1$l$P$J$j$^$;$s!#(B - -@table @code -@item nnspool-inews-program -@vindex nnspool-inews-program -$B5-;v$rEj9F$9$k$?$a$K;H$o$l$k%W%m%0%i%`$G$9!#(B - -@item nnspool-inews-switches -@vindex nnspool-inews-switches -$B5-;v$rEj9F$9$k$H$-$K(B inews $B%W%m%0%i%`$KM?$($i$l$k%Q%i%a!<%?$G$9!#(B - -@item nnspool-spool-directory -@code{nnspool} $B$,5-;v$rC5$9$H$3$m$G$9!#$3$l$OIaDL(B -$B$O(B @file{/usr/spool/news/} $B$G$9!#(B - -@item nnspool-nov-directory -@vindex nnspool-nov-directory -@code{nnspool} $B$,(B @sc{nov} $B%U%!%$%k$rC5$9$H$3$m$G$9!#$3$l$OIaDL(B -$B$O(B @file{/usr/spool/news/over.view/} $B$G$9!#(B - -@item nnspool-lib-dir -@vindex nnspool-lib-dir -$B%K%e!<%9$N%i%$%V%i%j!<%G%#%l%/%H%j!<$N>l=j$G$9(B ($B%G%#%U%)%k%H(B -$B$G(B @file{/usr/lib/news/} $B$G$9(B)$B!#(B - -@item nnspool-active-file -@vindex nnspool-active-file -$B%"%/%F%#%V%U%!%$%k$X$N%Q%9$G$9!#(B - -@item nnspool-newsgroups-file -@vindex nnspool-newsgroups-file -$B%0%k!<%W5-=R%U%!%$%k$X$N%Q%9$G$9!#(B - -@item nnspool-history-file -@vindex nnspool-history-file -$B%K%e!<%9MzNr%U%!%$%k$X$N%Q%9$G$9!#(B - -@item nnspool-active-times-file -@vindex nnspool-active-times-file -$B8=>uF|IU%U%!%$%k$X$N%Q%9$G$9!#(B - -@item nnspool-nov-is-evil -@vindex nnspool-nov-is-evil -@code{nil} $B$G$J$$$H!"(B@code{nnspool} $B$O$=$l$,8+$D$1$?$I$s$J(B @sc{nov} $B%U%!(B -$B%$%k$b;H$*$&$H$O$7$^$;$s!#(B - -@item nnspool-sift-nov-with-sed -@vindex nnspool-sift-nov-with-sed -@cindex sed -@code{nil} $B$G$J$$$H!"$3$l$,%G%#%U%)%k%H$G$9$,!"354Q%U%!%$%k(B (overview) -$B$+$i4XO"$9$kItJ,$rF@$k$?$a$K(B @code{sed} $B$r;H$$$^$9!#$b$7(B @code{nil} $B$@$H!"(B -@code{nnspool} $B$O%U%!%$%kA4BN$r%P%C%U%!$KFI$_9~$s$G!"$=$3$G$N%U%!%$%k$rFI$`$?$a$K%a!<%k%P%C%/%((B - $B%s%I$r;H$&(B -* Choosing a Mail Backend:: Gnus $B$O?'!9$J%a!<%kMM<0$rFI$`;v$,$G$-$k(B -* Archiving Mail:: $B%a!<%k$r%P%C%/%"%C%W$9$k$K$O(B -@end menu - -@node Mail in a Newsreader -@subsection $B%K%e!<%9%j!<%@$G%a!<%k(B - -$B$"$J$?$,EAE}E*$J%a!<%k%j!<%@$+$i(B gnus $B$K>h$j49$($k$3$H$r7hCG$7$?$J$i$P!"(B -$B$"$J$?$O$$$m$$$m$J%+%k%A%c!<%7%g%C%/$r$`$J(B -$B$i$=$N$h$&$K$b$G$-$^$9$,!"$=$l$O9|@^$jB;$N$/$?$S$lLY$1$G$9!#(B - -gnus $B$O$U$D$&F1$8C$9$?$a$KFCJL$JA`:n$O$7$^$;$s!#(B - -$B$3$N$3$H$O4{FI$N5-;v$O$9$Y$F>C$5$l$F$7$^$&$3$H$r0UL#$9$k$N$+$C$F(B? $B$=$j$c(B -$B$"$s$^$j$G$9$h$M(B! - -$B$=$&$G$O$"$j$^$;$s!#8E$$5-;v$O$$$m$s$J;EAH$_$K$h$C$F(B @dfn{expire} $B$5$l(B -$B$k$N$G$9!#%K%e!<%95-;v$O%K%e!<%9$N4IM}?M(B ($B$,4IM}$7$F$$$k%5!<%P(B) $B$K$h$C(B -$B$F(B expire $B$N=hM}$,@)8f$5$l!"%a!<%k$N(B expire $B$N=hM}$O$"$J$?$,@)8f$7$^$9!#(B -$B%a!<%k$N(B expire $B$K$D$$$F$O(B @pxref{Expiring Mail} $B$r;2>H$7$F2<$5$$!#(B - -$B$7$P$i$/%a!<%k$H%K%e!<%9$NN>J}$r;H$C$F$_$l$P!"5-;v$N.?M?t$KMxMQ$5$l$F$$$k%m!<%+%k%K%e!<%9%0%k!<%W$r9VFI$7$F$$(B -$B$^$9!#$=$l$i$O(B @sc{nntp} $B$GG[Aw$5$l$k!"%K%e!<%9!"$G$9!#;d$?$A$O<+J,$N;E(B -$B;v$KLrN)$F$k$?$a$K!"$=$l$i$NKDBg$J5-;v$NCGJR$rFI$s$@$jJV;v$r$7$J$1$l$P(B -$B$J$j$^$;$s!#$=$7$F$=$l$i$OJ]B8$5$l$F$$$J$$$+$b$7$l$^$;$s$+$i!"6=L#$N$"(B -$B$k5-;v$r8D?M%a!<%k$HF1$8$h$&$KJ]B8$7$J$1$l$P$J$i$J$$$G$7$g$&!#(B - -$BG[Aw$N;EAH$_$N0c$$$O$I$&$G$b$h$$$3$H$G!"Bg;v$J$N$O$$$+$K/$/$H$b!";d$,(B gnus $B$KF~$l$?!"(BEmacs $B$N%5%V%j%_%J%kG>L#A9@vBu4X?t$rGd$C(B -$B$F$/$l$??M$O$=$l$rJ]>Z$7$F$$$^$9!#$"$J$?$bF12=$7$^$9!#$"$J$?$O(B gnus $B$r0&(B -$B$7$^$9!#$"$J$?$O(B gnus $B$G$N%a!<%k$NJ}K!$r0&$7$^$9!#@dBP$K!#(B) - -@node Getting Started Reading Mail -@subsection $B%a!<%k$rFI$`;v$r;O$a$k(B - -Gnus $B$r;H$C$F?7$7$$%a!<%k$rFI$`;v$OHs>o$K4JC1$G$9!#$"$J$?$N%a!<%k%P%C%/(B -$B%(%s%I$N$"$J$?$NA*Br$r(B @code{gnus-secondary-select-methods} $B$KJ|$j9~$`$@(B -$B$1$G!"$"$H$N$3$H$O<+F0E*$K5/$3$j$^$9!#(B - -$BNc$($P!"(B@code{nnml} ($B$3$l$O(B "$B0l%a!<%k0l%U%!%$%k(B" $B%P%C%/%(%s%I$G$9(B) $B$r;H(B -$B$$$?$$$J$i!"$N%0%k!<%W$HF1$8$h$&$KFI$`;v$,$G$-$^(B -$B$9!#(B - -$B$"$J$?$O$*$=$i$/%a!<%k$r$$$/$D$+$N%0%k!<%W$KJ,3d$7$?$$$G$7$g$&$1$I(B: - -@lisp -(setq nnmail-split-methods - '(("junk" "^From:.*Lars Ingebrigtsen") - ("crazy" "^Subject:.*die\\^Organization:.*flabby") - ("other" ""))) -@end lisp - -$B$3$l$O7k2L$H$7$F;0$D$N?7$7$$(B @code{nnml} $B%a!<%k%0%k!<%W$r:n$j$^(B -$B$9(B: @samp{nnml:junk}, @samp{nnml:crazy}, @samp{nnml:other} $B$G$9!#:G=i(B -$B$NFs$D$N%0%k!<%W$K9g$o$J$$%a!<%k$OA4$F:G8e$N%0%k!<%W$KF~$l$i$l$^$9!#(B - -$B$3$l$O(B gnus $B$G%a!<%k$rFI$`$?$a$K=$N9`$r=OFI$7$?$$$H;W$&$+$b$7$l$^$;$s$,!#FC(B -$B$K(B @pxref{Choosing a Mail Backend} $B$H(B @pxref{Expiring Mail} $B$r!#(B - -@node Splitting Mail -@subsection $B%a!<%k$NJ,3d(B -@cindex splitting mail -@cindex mail splitting - -@vindex nnmail-split-methods -$BJQ?t(B @code{nnmail-split-methods} $B$OF~$C$F$/$k%a!<%k$r$I$N$h$&$K%0%k!<%W(B -$BJ,$1$9$k$+$r;XDj$7$^$9!#(B - -@lisp -(setq nnmail-split-methods - '(("mail.junk" "^From:.*Lars Ingebrigtsen") - ("mail.crazy" "^Subject:.*die\\|^Organization:.*flabby") - ("mail.other" ""))) -@end lisp - -$B$3$NJQ?t$O%j%9%H$N%j%9%H$G!"$3$l$i$N%j%9%H$N:G=i$N$=$l$>$l$NMWAG$,%a!<%k(B -$B%0%k!<%W$NL>A0$G(B ($B$H$3$m$G!"$=$l$i$O(B @samp{mail} $B$G;O$^$kI,MW$O$"$j$^$;(B -$B$s(B)$B!"Fs$D$a$NMWAG$,$=$l$>$l$N%a!<%k$N%X%C%@!<$+$i$=$l$,$I$N%0%k!<%W$KB0(B -$B$9$k$+$r7hDj$9$k@55,I=8=$G$9!#:G=i$NJ8;zNs$O!"(B@code{replace-match} $B$K$h$C(B -$B$F!"9gCW$7$?J8>O$+$i$NI{I=8=$rA^F~$9$k$?$a$K;H$o$l$k$h$&$J!"(B -@code{samp\\1} $B$NMM<0$r4^$`$+$b$7$l$^$;$s!#$?$H$($P(B: - -@lisp -("list.\\1" "From:.* \\(.*\\)-list@@majordomo.com") -@end lisp - -$BFsHVL\$NMWAG$O4X?t$G$"$k;v$b$G$-$^$9!#$=$N>l9g$O!"$=$l$OK!B'$N:G=i$NMWAG(B -$B$r0z?t$H$7$F!"%X%C%@!<$KHO0O$r69$a$F(B (narrowed to headers) $B8F$P$l$^$9!#(B -$B$=$l$O!"%a!<%k$,$=$N%0%k!<%W$KB0$9$k$H9M$($k$N$G$"$l$P!"(B@code{nil} $B$G$J(B -$B$$CM$r5"$9I,MW$,$"$j$^$9!#(B - -$B$3$l$i$N:G8e$O>o$KAm9gE*$J$b$N$G$"$k$Y$-$G!"B>$N@55,I=8=$K9gCW$7$J$$%a!<(B -$B%k$K9gCW$9$k$?$a$K!"$3$N@55,I=8=$O(B @emph{$B$$$D$b(B} @samp{}$B$G$"$k$Y$-$G$9!#(B -($B$3$l$i$NK!B'$OO"A[%j%9%H$N=i$a$+$i=*$o$j$^$G=gHV$K!$A$^(B -$B$9(B"$B!#Aj8_Ej9F$r;HMQ2DG=$K$7$F$$$k>l9g!"A4$F$N9gCW$7$?K!B'$,(B "$B>!$A$^$9(B"$B!#(B) - -$B$b$7$"$J$?<+?H$G$3$l$r$$$8$/$j$^$o$7$?$$$H$-$O!"$"$J$?$NA*$s$@4X?t$r$3$N(B -$BJQ?t$K@_Dj$9$k;v$,$G$-$^$9!#$3$N4X?t$OF~$C$FMh$?%a!<%k%a%C%;!<%8$N%X%C%@!<(B -$B$KHO0O$r69$a$i$l$?%P%C%U%!$G0z?t$J$7$G8F$P$l$^$9!#$3$N4X?t$O!"$=$l$,$3$N(B -$B%a!<%k%a%C%;!<%8$r1?$V$Y$-$G$"$k!"$H9M$($k%0%k!<%WL>$N%j%9%H$rJV$9$Y$-$G(B -$B$9!#(B - -$BA4$F$N%a!<%k%P%C%/%(%s%I$O!"F~$C$FMh$?IOK3$G=c?h$J%X%C%@!<$rMpK=$K07$C$F(B -$B$bNI$$;v$KCm0U$7$F$/$@$5$$!#$=$l$i$O$9$Y$F(B @code{Lines} $B%X%C%@!<$rDI2C$7(B -$B$^$9!#$$$/$D$+$O(B @code{X-Gnus-Group} $B%X%C%@!<$r2C$($^$9!#$?$$$F$$$N$b$N(B -$B$O(B Unix $B$N(B mbox $B$N(B @code{From} $B9T$r2?$+JL$NL>A0$KJQ$($^$9!#(B - -@vindex nnmail-crosspost -$B%a!<%k%P%C%/%(%s%I$O$9$Y$FAj8_Ej9F$N5!G=$rDs6!$7$F$$$^$9!#$$$/$D$+$N@55,(B -$BI=8=$,9gCW$9$k$H!"%a!<%k$OA4$F$N%0%k!<%W$K(B ``$BAj8_Ej9F(B'' $B$5$l$^$9!#(B -@code{nnmail-crosspost} $B$O$3$N5!G=$r;H$&$+$I$&$+$r;XDj$7$^$9!#$I$N5-;v$b(B -$BAm9g$N(B (@samp{}) $B%0%k!<%W$KAj8_Ej9F$5$l$J$$;v$KCm0U$7$F$/$@$5$$!#(B - -@vindex nnmail-crosspost-link-function -@cindex crosspost -@cindex links -@code{nnmh} $B$H(B @code{nnml} $B$OAj8_Ej9F$5$l$?5-;v$K%O!<%I%j%s%/(B (hardlink) -$B$r:n$k;v$K$h$C$FAj8_Ej9F$r9T$$$^$9!#$7$+$7!"A4$F$N%U%!%$%k%7%9%F%`$,%O!<(B -$B%I%j%s%/$N5!G=$rDs6!$7$F$$$k$o$1$G$O$"$j$^$;$s!#$b$7$"$J$?$,$=$N>l9g$KEv(B -$B$F$O$^$k$N$G$"$l$P!"(B -@code{nnmail-crosspost-link-function} $B$r(B @code{copy-file} $B$K@_Dj$7$F$/$@(B -$B$5$$!#(B($B$3$NJQ?t$O%G%#%U%)%k%H$G(B @code{add-name-to-file} $B$G$9!#(B) - -@kindex M-x nnmail-split-history -@kindex nnmail-split-history -$BA0$N%a!<%kJ,3d$,%a%C%;!<%8$r$I$3$KF~$l$?$+$r8+$?$$>l9g$O!"L?Na(B @kbd{M-x -nnmail-split-history} $B$r;H$&;v$,$G$-$^$9!#$3$l$+$i%9%W!<%k$7D>$=$&$H$9$k(B -$B%a%C%;!<%8$,$I$3$KF~$k$+$r8+$?$$>l9g$O!"(B -@code{gnus-summary-respool-trace} $B$H4XO"$9$kL?(B -$BNa(B (@pxref{Mail Group Commands}) $B$r;H$&;v$,$G$-$^$9!#(B - -Gnus $B$O$"$J$?$K<+J,<+?H$KD7$MJV$C$F$/$k$h$&$J2DG=@-$N$"$kA4$F$N5!2q$rDs(B -$B6!$7$^$9!#Nc$($P!"$"$J$?$N>e;J$+$i$/$kA4$F$N%a!<%k$r4^$s$@%0%k!<%W$r:n$C(B -$B$?$H$7$^$7$g$&!#$=$l$+$i!"6vH/E*$K$=$N%0%k!<%W$N9XFIe;J$+$i$NA4$F$N%a!<%k$rL$9XFI$N%0%k!<%W$KF~$l$^(B -$B$9$N$G!">e;J$,(B ''$B7nMKF|$^$G$K$=$NJs9p=q$r=`Hw$7$J$$$Hl9g$O!"(BPOP $B$d(B @sc{imap} $B$J(B -$B$I$G%a!<%k$r$O;HMQ$G(B -$B$-$^$;$s(B---$B%a!<%k$r0\F0$7$F$$$k$H$-$K%a!<%k%9%W!<%k$r%m%C%/$9$kJ}K!$,$"(B -$B$j$^$;$s!#(B - -$BE,@Z$J%5!<%P!<$r@_CV$9$k$3$H$,IT2DG=$J$i!"JQ$o$j$K(B ssh $B$r;H$&$3$H$,$G$-(B -$B$^$9!#(B - -@lisp -(setq mail-sources - '((file :prescript "ssh host bin/getmail >%t"))) -@end lisp - -@samp{getmail} $B%9%/%j%W%H$O0J2<$N$h$&$J$b$N$K$J$j$^$9(B: - -@example -#!/bin/sh -# getmail - move mail from spool to stdout -# flu@@iki.fi - -MOVEMAIL=/usr/lib/emacs/20.3/i386-redhat-linux/movemail -TMP=$HOME/Mail/tmp -rm -f $TMP; $MOVEMAIL $MAIL $TMP >/dev/null && cat $TMP -@end example - -$BL\E*$K9g$&$h$&$K;HMQ$7$?$$(B @samp{movemail} $B$K9g$o$;$F%9%/%j%W%H$r=q$-49(B -$B$($F$/$@$5$$!#(B - -@item directory -$B%G%#%l%/%H%j!A0$G$9!#=i4|CM$O(B @code{MAILHOST} $B4D6-JQ?t$+$i$G$J$1$l$P$J$j$^$;$s!#=i(B -$B4|CM$O(B @samp{pop3} $B$G$9!#%7%9%F%`$K$h$C$F$O(B @samp{"pop-3"} $B$H$7$J$1$l$P(B -$B$J$i$J$$$+$b$7$l$^$;$s!#(B - -@item :user -POP $B%5!<%P!<$KM?$($kMxMQ$G$9!#=i4|CM$O%m%0%$%sL>$G$9!#(B - -@item :password -POP $B%5!<%P!<$KM?$($k%Q%9%o!<%I$G$9!#;XDj$5$l$J$$>l9g$O!"MxMQA0$G$9!#$3$l$O>o$K$3$NJ8;zNs$K4^$^$l$F$$$J(B -$B$1$l$P$J$j$^$;$s!#(B - -@item s -$B%5!<%P!<$NL>A0$G$9!#(B - -@item P -$B%5!<%P!<$N%]!<%HHV9f$G$9!#(B - -@item u -$B;HMQ$9$kMxMQ$G$9!#(B - -@item p -$B;HMQ$9$k%Q%9%o!<%I$G$9!#(B -@end table - -$B$3$l$i$N;EMM$G;H$o$l$kCM$OBP1~$9$k%-!<%o!<%I$KM?$($?CM$+$iZJ}<0$r;H$&$+$r(B -$B7h$a$k$b$N$N$I$A$i$+$G$9!#=i4|@_Dj$O(B @code{password} $B$G$9!#(B -@end table - -@code{:program} $B$H(B @code{:function} $B%-!<%o!<%I$,;XDj$5$l$F$$$J$$$H!"(B -@code{pop3-movemail} $B$,;HMQ$5$l$^$9!#(B - -$B$3$l$O$$$/$D$+$NNc$G$9!#=i4|MxMQ$G!"=i4|(B POP $B%5!<%P!<$+$i$5$l$?%5!<%P!<$+$i;XL>$5$l$?MxMQ$l$N%U%!%$%k$,(B -$B@53N$K(B 1 $B%a!<%k$H$J$C$F$$$^$9!#(B - -$B%-!<%o!<%I(B: - -@table @code -@item :path -$B%a!<%k$,J]B8$5$l$k%G%#%l%/%H%j!<$N%Q%9$G$9!#=i4|CM$O4D6-JQ(B -$B?t(B @code{MAILDIR} $B$+$ie$G%a!<%k$rFI$`%W%m%H%3%k$H$7$F07$$$?$/$J$$$H$-$O!"(B -gnus $B$G$O(B POP $B%5!<%P!<$HF1MM$K07$&$3$H$,$G$-!"M?$($i$l$?(B IMAP $B%a!<%k%\%C(B -$B%/%9$+$i5-;v$r\$7$/$O(B @xref{IMAP} $B$r;2>H$7$F2<$5$$!#(B - -$B%-!<%o!<%I(B: - -@table @code -@item :server -IMAP $B%5!<%P!<$NL>A0!#=i4|CM$O4D6-JQ?t(B @code{MAILHOST} $B$+$iF@$^$9!#(B - -@item :port -IMAP $B%5!<%P!<$N%]!<%HHV9f!#IaDL$O=i4|CM$O(B @samp{143} $B$G!"(BSSL $B@\B3$K(B -$B$O(B @samp{993} $B$G$9!#(B - -@item :user -IMAP $B%5!<%P!<$KEO$9MxMQ$G$9!#=i4|CM$O%m%0%$%sL>$G$9!#(B - -@item :password -IMAP $B%5!<%P!<$KEO$9%Q%9%o!<%I$G$9!#;XDj$5$l$F$$$J$$$H$-$O!"MxMQu$G$O!"(B -@samp{kerberos4} $B$+(B @samp{ssl} $B$+=i4|CM$N(B @samp{network} $B$K$J$j$^$9!#(B - -@item :authentication -$B%5!<%P!<$G$NG'>Z$K$I$NG'>ZK!$r;H$&$+!#$3$l(B -$B$O(B @code{imap-authenticator-alist} $B$N%7%s%\%k$N0l$D$r@_Dj$7$^$9!#8=>u$G(B -$B$O!"(B@samp{kerberos4}, @samp{cram-md5}, @samp{anonymous} $B$+=i4|CM(B -$B$N(B @samp{login} $B$K$J$j$^$9!#(B - -@item :program -:stream $B$K(B `shell' $B$,@_Dj$5$l$F$$$k$H$-$O!"$3$NCM$,JQ(B -$B?t(B `imap-shell-program' $B$K3d$jEv$F$i$l$^$9!#$3$l$O(B @code{format} $B$U$&$N(B -$BJ8;zNs(B ($B$^$?$OJ8;zNs$N%j%9%H(B) $B$G$J$1$l$P$J$j$^$;$s!#Nc$r<($7$^$7$g$&!#(B - -@example -ssh %s imapd -@end example - -$BM-8z$J(B format $B;X<(;R$O0J2<$NDL$j$G$9!#(B - -@table @samp -@item s -$B%5!<%P!<$NL>A0!#(B - -@item l -`imap-default-user' $B$G@_Dj$5$l$?%f!<%6L>!#(B - -@item p -$B%5!<%P!<$N%]!<%HHV9f!#(B -@end table - -$B$3$l$i$N;XDj$K;H$o$l$kCM$O!"BP1~$9$k%-!<%o!<%I$KM?$($?CM$+$iA0!#=i4|CM$O(B @samp{INBOX} $B$G!"$3$l$OIa(B -$BDL$OF~$C$F$/$k%a!<%k$rC5n$N0u$rIU$1$^$9$,!"B>$K(B @samp{\Seen} $B$G$OC1$K4{FI$N0u$rIU$1$^$9!#(B -$B$3$l$i$O:G$b$"$j$=$&$JFs$D$NA*Br$G$9$,!"B>$N0u$b(B RFC2060 ,A'(B2.3.2 $B$GDj5A$5(B -$B$l$F$$$^$9!#(B - -@item :dontexpunge -@code{nil} $B$G$J$+$C$?$i!"5-;v$rC5n$N0u$,IU$$$F$$(B -$B$F$b:o=|$7$^$;$s!#(B -@end table - -IMAP $B%a!<%k%=!<%9$NNc(B: - -@lisp -(imap :server "mail.mycorp.com" - :stream kerberos4 - :fetchflag "\\Seen") -@end lisp - -@item webmail -www.hotmail.com, webmail.netscape.com, www.netaddress.com, -www.my-deja.com $B$J$I$N%&%'%V%a!<%k%5!<%P!<$+$i%a!<%k$rl9g(B -$B$O(B "one-line-cookie" $B%Q%C%A$rEv$F$kI,MW$,$"$j$^$9!#(B - -$B7Y9p(B: $B%a!<%k$,<:$o$l$k$+$b$7$l$^$;$s!#L5J]>Z$G$9!#(B - -$B%-!<%o!<%I(B: - -@table @code -@item :subtype -$B%&%'%V%a!<%k%5!<%P!<$N7?$G$9!#=i4|CM$O(B @code{hotmail} $B$G$9!#B>$N8uJd(B -$B$O(B @code{netscape}, @code{netaddress}, @code{my-deja} $B$G$9!#(B - -@item :user -$B%&%'%V%a!<%k%5!<%P!<$NMxMQ$G$9!#=i4|CM$O%m%0%$%sL>$G$9!#(B - -@item :password -$B%&%'%V%a!<%k%5!<%P!<$N%Q%9%o!<%I$G$9!#;XDj$7$J$$>l9g$O!"MxMQl9g$KJXMx$G$9!#(B -@end table -@end table - -@subsubsection Function Interface - -$B>e5-$N$$$/$D$+$N%-!<%o!<%I$O!"$l$N%-!<%o!<%I(B @code{:foo} $B$NCM$H$7$F(B Lisp - $BJQ?t(B @code{foo} $B$,;H$o$l$^$9!#Nc$($P!"0J2<$N%a!<%k%=!<%9$N@_DjNc$K$D$$(B -$B$F9M$($F$_$F2<$5$$!#(B - -@lisp -(setq mail-sources '((pop :user "jrl" - :server "pophost" :function fetchfunc))) -@end lisp - -$B4X?t(B @code{fetchfunc} $B$,$l$N7?$N%a!<%k%=!<%9$N$?$a$N%-!<%o!<%I$N%j%9%H$K$D$$$F$O!">e5-$r;2(B -$B>H$7$F2<$5$$!#(B - -@node Mail Source Customization -@subsubsection $B%a!<%k%=!<%9$N%+%9%?%^%$%:(B - -$B0J2<$O%a!<%k$Nl=j$G$9!#=i4|CM(B -$B$O(B @file{~/.emacs-mail-crash-box} $B$G$9!#(B - -@item mail-source-delete-incoming -@vindex mail-source-delete-incoming -@code{nil} $B$G$J$1$l$P!"F~$C$FMh$?%U%!%$%k$O!"$=$l$r=hM}$7$?8e$K>C5n$5$l(B -$B$^$9!#(B - -@item mail-source-directory -@vindex mail-source-directory -$B%U%!%$%k$,(B ($B$b$7$"$l$P(B) $BJ]B8$5$l$k%G%#%l%/%H%j!<$G$9!#=i4|CM(B -$B$O(B @file{~/Mail/} $B$G$9!#8=;~E@$G$O!"$3$l$,;H$o$l$kM#0l$N$b$N$OA0$NJQ?t(B -$B$,(B @code{nil} $B$G$"$C$?>l9g!"F~$C$F$-$?%U%!%$%k$,J]B8$5$l$k>l=j$N;XDj$G$9!#(B - -@item mail-source-incoming-file-prefix -@vindex mail-source-incoming-file-prefix -$BF~$C$F$-$?%a!<%k$rJ]B8$9$k%U%!%$%k$N%W%l%U%#%C%/%9$G$9!#=i4|CM(B -$B$O(B @file{Incoming} $B$G!"$3$N>l9g%U%!%$%k(B -$B$O(B @file{Incoming30630D_} $B$d(B @file{Incoming298602ZD} $B$N$h$&$K$J$j$^$9!#(B -@code{mail-source-delete-incoming} $B$,(B @code{nil} $B$N>l9g$@$1$G$9$,!#(B - -@item mail-source-default-file-modes -@vindex mail-source-default-file-modes -$BA4$F$N?7$7$$%a!<%k%U%!%$%k$O$3$N%U%!%$%k%b!<%I$K$J$j$^$9!#=i4|CM(B -$B$O(B 384 $B$G$9!#(B -@end table - -@node Fetching Mail -@subsubsection $B%a!<%k$NJ}$+$i%a!<%k$re$2(B -$B$F!"%[!<%`%G%#%l%/%H%j!<$KJ|$jEj$2$^$9!#$"$J$?$,%a!<%k%P%C%/%(%s%I$r;H$C(B -$B$F$$$J$$>l9g$O!"(Bgnus $B$O0lDL$b%a!<%k$r0\F0$7$^$;$s(B---$B:G=i$KKbK!$N8F$S=P$7(B -$B$r$?$/$5$s$7$J$1$l$P$J$j$^$;$s!#$^$:8^3Q7A$rIA$-!"O9?$$K2P$rIU$1!";3MS$r(B -$B@8$1lS$H$7$FJ{$2=*$($?8e$G!"(Bgnus $B$,$"$J$?$N%a!<%k$r0\F0$7$F$bK\Ev$K$"$^(B -$B$j6C$$$F$O$$$1$^$;$s!#(B - -@node Mail Backend Variables -@subsection $B%a!<%k%P%C%/%(%s%IJQ?t(B - -$B$3$l$i$NJQ?t$O(B ($B$?$$$F$$$N>l9g(B) $BA4$F$N0c$C$?%a!<%k%P%C%/%(%s%I$K4XO"$7$^(B -$B$9!#(B - -@table @code -@vindex nnmail-read-incoming-hook -@item nnmail-read-incoming-hook -$B%a!<%k%P%C%/%(%s%I$O?7$7$$%a!<%k$rFI$_9~$s$@8e$K$3$N%U%C%/$r8F$S$^$9!#$b(B -$B$7$=$&$7$?$$$H;W$&$J$i!"$3$N%U%C%/$r%a!<%k4F;k%W%m%0%i%`$KCN$i$;$k$?$a$K(B -$B;H$&;v$,$G$-$^$9!#(B - -@vindex nnmail-split-hook -@item nnmail-split-hook -@findex article-decode-encoded-words -@findex RFC1522 decoding -@findex RFC2047 decoding -$B$=$l$>$l$N%a%C%;!<%8$,$=$N%X%C%@!<$K4p$E$$$FJ,3d$,$J$5$l$kD>A0$K$=$l$,J](B -$BB8$5$l$F$$$k%P%C%U%!$GC5n$5$l!"%P%C%U%!$G9T$o$l$?JQ99$O$I$N%U%!%$%k$K$b8=$l$^$;(B -$B$s!#(B@code{gnus-article-decode-rfc1522} $B$,$3$N%U%C%/$K2C$($k;v$,E,@Z$J4X(B -$B?t$N0l$D$G$9!#(B - -@vindex nnmail-pre-get-new-mail-hook -@vindex nnmail-post-get-new-mail-hook -@item nnmail-pre-get-new-mail-hook -@itemx nnmail-post-get-new-mail-hook -$B$3$l$i$OF~$C$F$/$k%a!<%k$r07$&$H$-$KA0$K(B -$B8F$P$l$^$9(B) $B$H(B @code{nnmail-post-get-new-mail-hook} ($B$3$l$O%a!<%k$N07$$(B -$B$,=*$o$C$?$H$-$K8F$P$l$^$9(B) $B$G$9!#$H%G%#%l%/%H%j!<(B -$BL>$r;H$$$^$9!#(B@samp{mail.misc} $B$N$h$&$J%0%k!<%WL>$O(B @file{mail.misc} $B$H(B -$B$$$&%G%#%l%/%H%j!<(B (@code{nnml} $B%P%C%/%(%s%I$,;H$o$l$F$$$k$H$_$J$9$H(B) $B$+(B -$B%U%!%$%k(B (@code{nnfolder} $B%P%C%/%(%s%I$,;H$o$l$F$$$k$H$_$J$9$H(B) $B$H$$$&7k(B -$B2L$K$J$j$^$9!#$b$7$=$l$,(B @code{nil} $B$G$"$k$J$i!"F1$8%0%k!<%W(B -$B$O(B @file{mail/misc} $B$H$$$&7k2L$K$J$j$^$9!#(B - -@item nnmail-delete-file-function -@vindex nnmail-delete-file-function -@findex delete-file -$B%U%!%$%k$r>C5n$9$k$?$a$K8F$P$l$k4X?t$G$9!#=i4|CM(B -$B$O(B @code{delete-file} $B$G$9!#(B - -@item nnmail-cache-accepted-message-ids -@vindex nnmail-cache-accepted-message-ids -@code{nil} $B$G$J$$$H!"%P%C%/%(%s%I$KF~$C$FMh$?5-;v(B ($BNc$($P!"(B@code{Gcc} $B$K(B -$B$h$C$F(B) $B$N(B @code{Message-ID} $B$r%a!<%k=EJ#H/8+%U%!%$%k$KF~$l$^$9!#%G%#%U%)(B -$B%k%H$O(B @code{nil} $B$G$9!#(B -@end table - -@node Fancy Mail Splitting -@subsection $BFC5i%a!<%kJ,3d(B -@cindex mail splitting -@cindex fancy mail splitting - -@vindex nnmail-split-fancy -@findex nnmail-split-fancy -$BHf3SE*C1=c$JI8=`$N%a!<%kJ,3d;XDj$NJ}K!$G$O$"$J$?$NK>$`;v$,$G$-$J$$>l9g!"(B -@code{nnmail-split-methods} $B$r(B @code{nnmail-split-fancy} $B$K@_Dj$9$k;v$,(B -$B$G$-$^$9!#$=$l$+$iJQ?t(B @code{nnmail-split-fancy} $B$GM7$V;v$,$G$-$^$9!#(B - -$B$^$:$3$NJQ?t$NCM$NNc$r8+$F$_$^$7$g$&(B: - -@lisp -;; $B%a!<%k%G!<%b%s(B (mailer deamon) $B$OIaDL$N%0%k!<%W$K$OAj8_Ej9F$5$l$^$;(B -;; $B$s!#7Y9p$OK\Ev$N%(%i!<$H$O0c$C$?%0%k!<%W$KF~$l$i$l$^$9!#(B -(| ("from" mail (| ("subject" "warn.*" "mail.warning") - "mail.misc")) - ;; $B%(%i!<$G$J$$%a%C%;!<%8$OA4$F$N4XO"$7$?%0%k!<%W$KAj8_Ej9F$5$l$^$9(B - ;; $B$,!"(B(ding) $B%j%9%H$HB>$N(B (ding) $B4XO"$N%a!<%k$N$?$a$N%0%k!<%W$K$O(B - ;; $BAj8_Ej9F$7$^$;$s!#(B - (& (| (any "ding@@ifi\\.uio\\.no" "ding.list" "ding.list") - ("subject "ding" "ding.misc")) - ;; $BB>$N%a!<%j%s%0%j%9%H(B... - (any "procmail@@informatik\\.rwth-aachen\\.de" "procmail.list") - (any "SmartList@@informatik\\.rwth-aachen\\.de" "SmartList.list") - ;; $B0J2<$N$I$A$i$N%a!<%j%s%0%j%9%H$bF1$8@\F,<-$J$N$G!"(Bbugs- - ;; $B$@$1$KEj9F$5$l$?$b$N$,(B mypkg.list $B$KAj8_Ej9F$5$l$J$$$h(B - ;; $B$&$K$7$F$$$^$9!#$7$+$7K\Ev$KAj8_Ej9F$5$l$?5-;v$rAj8_Ej9F(B - ;; $B$9$k$3$H$O5v$7$F$$$^$9!#(B - (any "bugs-mypackage@@somewhere" "mypkg.bugs") - (any "mypackage@@somewhere\" - "bugs-mypackage" "mypkg.list") - ;; $B?M!9(B... - (any "larsi@@ifi\\.uio\\.no" "people.Lars_Magne_Ingebrigtsen")) - ;; $B9gCW$7$J$+$C$?%a!<%k$OA4$F$rJa$^$($k%0%k!<%W$X9T$-$^$9!#(B - "misc.misc") -@end lisp - -$B$3$NJQ?t$O(B @dfn{$BJ,3d(B} $B$NMM<0$K$J$C$F$$$^$9!#J,3d$O(B ($B$"$k$$$O(B) $B$=$l$>$l$N(B -$BJ,3d$,B>$NJ,3d$r4^$`:F5"E*9=B$$G$9!#$3$l$O;HMQ2DG=$J8^$D$NJ,3d9=J8$G$9(B: - -@enumerate - -@item -@samp{group}: $B$b$7J,3d$,J8;zNs$G$"$k$H!"$=$l$O%0%k!<%WL>$H$7$F$_$J$5$l$^(B -$B$9!#IaDL$N@55,I=8=$N9gCW$,$J$5$l$^$9!#Nc$O2<$NJ}$r8+$F2<$5$$!#(B - -@item -@code{(@var{field} @var{value} @code{[-} @var{restrict} @code{[@dots{}]}@code{]} @var{split})}: -$B$b$7J,3d$,%j%9%H$G!":G=i$NMWAG$,J8;zNs$G$"$j!"%X%C%@!<(B @var{field} ($B@55,(B -$BI=8=(B) $B$,(B @var{value} ($B$3$l$b@55,I=8=(B) $B$r4^$s$G$$$k>l9g!"%a%C%;!<%8(B -$B$r(B @var{split} $B$G;XDj$5$l$?$H$3$m$KC_@Q$7$^$9!#(B@var{restrict} ($B$^$?B>$N(B -$B@55,I=8=(B) $B$,(B @var{field} $B$N8e$G!"9gCW$7$?(B @var{value} $B$N:G8e$NA0$N$$$/$D(B -$B$+$NJ8;zNs$K9gCW$7$?$i!"(B@var{split} $B$OL5;k$5$l$^$9!#(B@var{restrict} $B$NJD(B -$BJq$N$I$l$b$,9gCW$7$J$1$l$P(B @var{split} $B$,K@(B) $B$G$"$k$H!"$=$l$>$l$N(B @var{split} $B$r$=$N$&$A$N0l$D$,(B -$B9gCW$9$k$^$Ge$N%0%k!<(B -$B%W$KC_@Q$5$l$?$H$-$K(B ``$B9gCW$7$?(B'' $B$H$7$^$9!#(B - -@item -@code{(& @var{split}@dots{})}: $BJ,3d$,%j%9%H$G!":G=i$NMWAG$,(B @code{&} $B$G(B -$B$"$k$H!"%j%9%H$NA4$F$N(B @var{split} ($BJ#?t(B) $B$ro$KCm0U$7$F;H$C$F2<$5$$!#(B - -@item -@code{(: @var{function} @var{arg1} @var{arg2} @dots{})}: $B$b$7J,3d$,%j%9(B -$B%H$G!":G=i$NMWAG$,(B @code{:} $B$G$"$k$H!"FsHVL\$NMWAG$,(B @var{args} $B$r0z?t$H(B -$B$7$F4X?t$H$7$F8F$P$l$^$9!#4X?t$O(B @var{split} $B$rJV$9$Y$-$G$9!#(B - -@cindex body split -$BNc$($P0J2<$N4X?t$O!"5-;v$N%\%G%#$K4p$E$$$?J,3d$K;H$($k$G$7$g$&(B: - -@lisp -(defun split-on-body () - (save-excursion - (set-buffer " *nnmail incoming*") - (goto-char (point-min)) - (when (re-search-forward "Some.*string" nil t) - "string.group"))) -@end lisp - -@code{:} $B$,;H$o$l$k$H$-!"%P%C%U%!(B @samp{" *nnmail incoming*"} $B$O%a%C%;!<(B -$B%8$NItJ,$K69$a$i$l$^$9!#(B - -@item -@code{(! @var{func} @var{split})}: $BJ,3d$,%j%9%H$G!":G=i$NMWAG(B -$B$,(B @code{!} $B$G$"$k$H(B @var{split} $B$,$K9gCW$7$J$1$l$P$J$j$^(B -$B$;$s!#(B@var{value} $B$O4pAC%b!<%I(B (fundamental mode) $B9=J8%F!<%V%k(B (syntax -table) $B$K=>$C$F40A4$K9gCW$7$J$1$l$P$J$j$^$;$s!#@55,I=8=$G%U%#!<%k%IL>$+(B -$B8l$NItJ,$K9gCW$5$;$k$?$a$K(B @code{.*} $B$r;H$&;v$,$G$-$^$9!#8@$$49$($l$P!"(B -$BA4$F$N(B @var{value} $B$O(B @samp{\<} $B$H(B @samp{\>} $B$NBP$G0O$^$l$^$9!#(B - -@vindex nnmail-split-abbrev-alist -@var{field} $B$H(B @var{value} $B$O(B lisp $B%7%s%\%k(B (symbol) $B$G$"$k;v$b$G$-!"$=(B -$B$N>l9g$O$=$l$i$O(B @code{nnmail-split-abbrev-alist} $B$G;XDj$5$l$F$$$k$h$&$K(B -$BE83+$5$l$^$9!#$3$l$O%;%k$N(B @code{car} $B$,%-!<$r4^$s$G$$$F!"(B@code{cdr} $B$,(B -$B4XO"IU$1$i$l$?CM$r;}$C$F$$$k%3%s%9%;%k(B (cons cell) $B$NO"A[%j%9%H$G$9!#(B - -@vindex nnmail-split-fancy-syntax-table -@code{nnmail-split-fancy-syntax-table} $B$,$3$l$i$NA4$F$NJ,3d$,pJs$K4p$E$$$F!"(Bgnus $B$KF0E*$K%0%k!<%W$r:n$i$;$?$$$N(B -$B$G$"$l$P(B ($BNc$($P!"%0%k!<%WL>$G(B @code{replace-match} $B$N$h$&$JBeMQ$r$9$k(B)$B!"(B -$Be;J$+$i8D?M08$F(B -$B$N%a!<%k$,FO$$$?$H$7$^$9!#<+J,$,7H$C$F$$$k%W%m%8%'%/%H$H$OJL$NOC$G$9!#$1(B -$B$l$I!VB>$N%a!<%k$H6hJL$G$-$k$h$&$K$3$l$3$l$3$&$$$&8@MU$rI=Bj$K=q$$$F$/$@(B -$B$5$$!W$H>e;J$K8~$+$C$F;X?^$9$k$o$1$K$O$$$-$^$;$s$+$i!"7k6I<+J,$Nl9g!"(BGnus $B$O8+$D$1$?A45-(B -$B;v$N%a%C%;!<%8(B ID $B$r(B $BJQ?t(B @code{nnmail-message-id-cache-file} $B$,;XDj$9$k(B -$B%U%!%$%k$K5-O?$7$^$9!#$3$N$H$-!"$=$l$>$l$N5-;v$,B8:_$9$k%0%k!<%W$NL>A0$r(B -$BJ;5-$7$^$9(B ($B$?$@$7%a!<%k$N>l9g$@$1!"$5$b$J$1$l$P%0%k!<%WL>$OD4$Y$^$;$s(B)$B!#(B -$B$5$F!"$$$h$$$h%a!<%k$N?6$jJ,$1$,;O$^$k$H!"4X?t(B -@code{nnmail-split-fancy-with-parent} $B$O!"BP>]$H$J$k3F5-;v$N(B References -($B$H(B In-Reply-To) $B%X%C%@$rD4$Y!"(B@code{nnmail-message-id-cache-file} $B$K;X(B -$BDj$5$l$F$$$k%U%!%$%k$K$=$l$i$N%a%C%;!<%8(B ID $B$,$"$k$+$I$&$+D4$Y$^$9!#?F5-(B -$B;v$,8+$D$+$k$H!"$=$N%0%k!<%WL>$,@55,I=(B -$B8=(B @code{nnmail-split-fancy-with-parent-ignore-groups} $B$K%^%C%A$7$J$1$l(B -$B$P!"$3$N4X?t$OBP1~$9$k%0%k!<%WL>$rJV$9$o$1$G$9!#$3$3$G!"JQ(B -$B?t(B @code{nnmail-message-id-cache-length} $B$NCM$r4{DjCM$h$j$b4v$i$+Bg$-$J(B -$BCM$K@_Dj$9$k$3$H$r$*4+$a$7$^$9!#$=$&$9$k$H!":#D4$Y$i$l$?%a%C%;!<%8(B ID $BC#(B -$B$O:#$7$P$i$/%-%c%C%7%e$NCf$KB8B3$G$-$^$9(B (5000 $B$K@_Dj$9$k$H%-%c%C%7%e%U%!(B -$B%$%k$NBg$-$5$O$@$$$?$$(B 300 $B%-%m%P%$%H$0$i$$$K$J$k$_$?$$$G$9(B)$B!#(B -@vindex nnmail-cache-accepted-message-ids -$B$5$i$K!"JQ?t(B @code{nnmail-cache-accepted-message-ids} $B$NCM$r(B -$BHs(B @code{nil} $B$K@_Dj$9$l$P!"(Bgnus $B$O0\F0$5$l$?5-;v$N%a%C%;!<%8(B ID $B$r$b5-(B -$BO?$9$k$N$G!"%U%)%m!<%"%C%W5-;v$O?F5-;v$N0\F0@h$HF1$8%0%k!<%W$KF~$k$h$&$K(B -$B$J$j$^$9!#(B - -@node Group Mail Splitting -@subsection $B%0%k!<%W%a!<%kJ,3d(B -@cindex mail splitting -@cindex group mail splitting - -@findex gnus-group-split -$B$?!<$/$5$s$N%a!<%j%s%0%j%9%H$r9XFI$7$F$$$k$1$l$I!"J}$b$7$/$O$I$A$i$+$r@_Dj$7(B -$B$F(B @code{nnmail-split-methods} $B$r(B @code{gnus-group-split} $B$K@_Dj$9$k$@$1(B -$B$G$9!#J,3d4X?t$OA4$F$N%0%k!<%W$G$3$l$i$N%Q%i%a!<%?$rAv::$7!"$=$l$K=>$C$F(B -$BJ,3d$7$^$9!#$9$J$o$A!"%a!<%k%0%k!<%W$N%Q%i%a!<(B -$B%?(B @var{to-list} $B$+(B @var{to-address} $B$G;XDj$5$l$?%"%I%l%9$+$iEj9F$5$l$?(B -$B$b$N$+!"$=$N%"%I%l%9$XEj9F$5$l$?%a%C%;!<%8$,$=$N%0%k!<%W$KJ]B8$5$l$^$9!#(B - -$B$H$-$K$O!"%a!<%j%s%0%j%9%H$K$OJ#?t$N%"%I%l%9$,$"$j!"%a!<%kJ,3d$K$=$l$iA4(B -$B$F$rG'<1$5$;$?$$$H;W$&$H$-$,$"$k$+$b$7$l$^$;$s(B: @var{extra-aliases} $B%0%k!<(B -$B%W%Q%i%a!<%?$rDI2C$N%"%I%l%9$N%j%9%H$K@_Dj$9$k$@$1$G=*$j$G$9!#@55,I=8=$r(B -$B;H$$$?$1$l$P!"(B@var{split-regexp} $B$r@_Dj$7$F$/$@$5$$!#(B - -$B$3$l$i$NA4$F$N%0%k!<%W$N%Q%i%a!<%?$O!"(B@code{nnmail-split-fancy} $BJ,3d$r:n(B -$B@.$9$k$?$a$K;HMQ$5$l!"$=$l$O(B @var{field} $B$,(B @samp{any} $B$G!"(B -@var{value} $B$,(B @var{to-list}, @var{to-address}, @var{extra-aliases} $B$NA4(B -$B$F!"(B@var{split-regexp} $B$NA4$F$N9gCW$K9gCW$9$kC1FH$N@55,I=8=!"(B -@var{split} $B$,%0%k!<%W$NL>A0$K$J$j$^$9!#(B@var{restrict} $B$b;HMQ$G$-$^$9(B: -@var{split-exclude} $B%Q%i%a!<%?$r@55,I=8=$N%j%9%H$K@_Dj$9$k$@$1$G$9!#(B - -$B$3$l$i$NA4$F$N%Q%i%a!<%?$r;H$C$F@5$7$$J,3d$,@8@.$5$l$J$$$H$-$d!"2?$+0c$C(B -$B$?$b$N$,I,MW$J$H$-$O!"%Q%i%a!<(B -$B%?(B @var{split-spec} $B$r(B @code{nnmail-split-fancy} $BJ,3d$K@_Dj$9$k$3$H$,$G(B -$B$-$^$9!#$3$N>l9g$O!"B>$NA0$K=q$$$?A4$F$N%Q%i%a!<%?(B -$B$O(B @code{gnus-group-split} $B$KL5;k$5$l$^$9!#FC$K!"(B -@var{split-spec} $B$O(B @code{nil} $B$K@_Dj$9$k$3$H$,$G$-!"$=$N>l9g$O%0%k!<%W(B -$B$O(B @code{gnus-group-split} $B$KL5;k$5$l$^$9!#(B - -@vindex gnus-group-split-default-catch-all-group -@code{gnus-group-split} $B$O$=$l$>$l$N%0%k!<%W$K0l$D$NJ,3d$r4^$`C10l(B -$B$N(B @code{&} $BFC5iJ,3d$rDj5A$9$k$3$H$G9gCW$9$kA4$F$N%0%k!<%W$KAj8_Ej9F$r$7(B -$B$^$9!#%a%C%;!<%8$,$I$NJ,3d$K$b9gCW$7$J$1$l$P!"$I$l$+$N%0%k!<%W(B -$B$G(B @var{split-spec} $B$,(B @code{catch-all} $B$K@_Dj$5$l$F$$$J$$>l9g(B -$B$O(B @code{gnus-group-split-default-catch-all-group} $B$G;XDj$5$l$F$$$k%0%k!<(B -$B%W$KJ]B8$5$l$^$9!#(B@var{split-spec} $B$,(B @code{catch-all} $B$K@_Dj$5$l$F$$$k(B -$B%0%k!<%W$,$"$k>l9g$O!"$=$N%0%k!<%W$,A4$F$rJa3M$9$k%0%k!<%W$H$7$F;HMQ$5$l(B -$B$^$9!#$3$NJQ?t$O$7$P$7$PC1$K%0%k!<%W$r;XDj$9$k$?$a$K;H$o$l$^$9$,!"G$0U$N(B -$BJ#;($JFC5iJ,3d$r$b@_Dj$9$k(B ($B7k6I!"%0%k!<%WL>$OFC5iJ,3d$J$N$G$9(B) $B$N$G!"8D(B -$B?M$N%a!<%k%U%)%k%@!<$N$I$N%a!<%j%s%0%j%9%H$K$bEv$F$O$^$i$J$$%a!<%k$rJ,3d(B -$B$9$k$N$KJXMx$G$7$g$&!#$J$*$3$NFC5iJ,3d$O!"(B@code{|} $BJ,3d%j%9%H$N:G8e$NMW(B -$BAG(B - $B%0%k!<%W%Q%i%a!<%?$+$iCj=P$5$l$?5,B'$r;}$D(B @code{&} $BJ,3d$r4^$`(B - $B$H(B -$B$7$FDI2C$5$l$k$3$H$KCm0U$7$F$/$@$5$$!#(B - -$B$=$m$=$mNc$r=P$9$Y$-$G$7$g$&!#0J2<$N%0%k!<%W%Q%i%a!<%?$,Dj5A$5$l$F$$$k$H(B -$B$7$^$9(B: - -@example -nnml:mail.bar: -((to-address . "bar@@femail.com") - (split-regexp . ".*@@femail\\.com")) -nnml:mail.foo: -((to-list . "foo@@nowhere.gov") - (extra-aliases "foo@@localhost" "foo-redist@@home") - (split-exclude "bugs-foo" "rambling-foo") - (admin-address . "foo-request@@nowhere.gov")) -nnml:mail.others: -((split-spec . catch-all)) -@end example - -@code{nnmail-split-methods} $B$r(B @code{gnus-group-split} $B$K@_Dj$9$k$H!"(B -@code{nnmail-split-fancy} $B$,A*Br$5$l$F!"JQ(B -$B?t(B @code{nnmail-split-fancy} $B$,0J2<$N$h$&$K@_Dj$5$l$F$$$k$+$N$h$&$K?6Iq(B -$B$$$^$9(B: - -@lisp -(| (& (any "\\(bar@@femail\\.com\\|.*@@femail\\.com\\)" "mail.bar") - (any "\\(foo@@nowhere\\.gov\\|foo@@localhost\\|foo-redist@@home\\)" - - "bugs-foo" - "rambling-foo" "mail.foo")) - "mail.others") -@end lisp - -@findex gnus-group-split-fancy -$BA4$F$N%a!<%k%0%k!<%W$G%0%k!<%WJ,3d$r;HMQ$7$?$/$O$J$$$H$-$O!"(B -@code{nnmail-split-fancy} $BJ,3d$r$N%j%9%H$+@55,I=8=$G$9!#(B@var{no-crosspost} $B$OAj8_Ej9F$r;HMQ6X;_$K$k$?(B -$B$a$K;H$&$3$H$,$G$-$^$9!#$=$N>l9g!"C10l$N(B @code{|} $BJ,3d$,=PNO$5$l$^$9!#(B -@var{catch-all} $B$O(B @var{gnus-group-split-default-catch-all-group} $B$N$h$&(B -$B$K!":G8e$Nl9g!"%0%k!<%W(B -$B$K(B @var{split-spec} $B$,(B @code{catch-all} $B$K@_Dj$5$l$F$$$k$b$N$,$"$k$H!"$3(B -$B$N%0%k!<%W$,(B @var{catch-all} $B0z?t$r>e=q$-$7$^$9!#(B - -@findex gnus-group-split-setup -$BIT1?$J$3$H$K!"A4$F$N%0%k%W$H%Q%i%a!<%?$rAv::$9$k$3$H$OHs>o$KCY$$$G$9!#FC(B -$B$KA4$F$N%a%C%;!<%8$KBP$7$F$J$5$l$k$3$H$r9M$($k$H!#$1$l$I$b!"@dK>$7$J$$(B -$B$G(B! $B4X?t(B @code{gnus-group-split-setup} $B$,(B @code{gnus-group-split} $B$r$h$j(B -$B$:$C$H8zN(E*$JJ}K!$G;H$&$3$H$,$G$-$^$9!#$=$l(B -$B$O(B @code{nnmail-split-methods} $B$r(B @code{nnmail-split-fancy} $B$K@_Dj$7!"(B -@code{nnmail-split-fancy} $B$r(B @code{gnus-group-split-fancy} $B$G@8@.$5$l$?(B -$BJ,3d$K@_Dj$7$^$9!#$3$&$7$F$I$s$J$KJ,3d$9$k%a%C%;!<%8$,$?$/$5$s$"$C$F$b!"(B -$B%0%k!<%W%Q%i%a!<%?$O0lEY$@$1Av::$5$l$^$9!#(B - -@findex gnus-group-split-update -$B$7$+$7!"%0%k!<%W%Q%i%a!<%?$rJQ99$9$k$H!"(B@code{nnmail-split-fancy} $B$rJN,$7$J$$>l9g$O(B ($B$=$l$O%*%W%7%g%s(B -$B$G(B @code{nil} $B$HEy(B -$B2A(B)$B!"(B@code{gnus-group-split-default-catch-all-group} $B$O$=$NCM$K@_Dj$5$l(B -$B$^$9!#(B - -@vindex gnus-group-split-updated-hook -@code{nnmail-split-fancy} $B$,(B @code{gnus-group-split-update} $B$G@_Dj$5$l$?(B -$B8e$K!"JQ99$7$?$$$H$-$N$?$a$K!"$3$N4X?t(B -$B$O(B @code{gnus-group-split-update-hook} $B$r=*N;$9$kD>A0$Kc$b$J$/J*;v$,>efIW$J$h$&$G$"$l$P!"(Bmbox $B%U%!%$%k$r>C$9;v(B -$B$r9M$($k$+$b$7$l$^$;$s$,!";d$OA4$F$N%a!<%k$,$"$k$Y$-$H$3$m$KG<$^$C$F$$$k(B -$B$N$r40A4$K3NG'$9$k$^$G$O!"$=$&$O$7$^$;$s!#(B - -@node Expiring Mail -@subsection $B%a!<%k$N4|8B@Z$l>C5n(B -@cindex article expiry - -$BEAE}E*$J%a!<%k%j!<%@!<$O!"2?$+!"4{FI$N0u$rIU$1$k$H5-;v$r:o=|$9$k798~$,$"(B -$B$j$^$9!#(BGnus $B$O%a!<%k$rFI$`;v$KBP$7$F!"4pK\E*$KA4$/0c$C$?J}K!$rC$98"NO$,$"(B -$B$k$H$O9M$($^$;$s!#%a!<%k%0%k!<%W$KF~$C$F!"5-;v$K(B ``$B4{FI(B'' $B$N0u$rIU$1$?$j!"(B -$BB>$NN.57$G@Z$C$?$j$7$F$b!"%a!<%k5-;v$O$^$@%7%9%F%`$KB8:_$7$F$$$^$9!#7+$j(B -$BJV$7$^$9(B: gnus $B$O$"$J$?$N8E$$!"4{FI%a!<%k$r>C5n$7$^$;$s!#$b$A$m$s!"$"$J(B -$B$?$,$=$&$7$m$H?R$M$J$$8B$j$NOC$G$9$,!#(B - -Gnus $B$KK>$^$7$/$J$$%a!<%k$r:o=|$5$;$k$?$a$K$O!"5-;v$r(B @dfn{$B4|8B@Z$l>C5n(B -$B2DG=(B} (expirable) $B$H$7$F0u$rIU$1$J$1$l$P$J$j$^$;$s!#$7$+$7$J$,$i!"$3$l$O(B -$B5-;v$,B(:B$K>C$(5n$k$H$$$&;v$G$O$"$j$^$;$s!#0lHLE*$K!"%a!<%k5-;v$Ol9g$K%7%9%F%`$K$h$C$F:o=|$5$l$^$9(B 1) $B4|8B@Z$l>C5n2DG=$N0u$rIU$1$i$l(B -$B$k(B 2) $B0l=54V0J>e7P$C$?5-;v$G$"$k!#$b$75-;v$r4|8B@Z$l>C5n2DG=$K$7$J$1$l$P!"(B -$B$=$l$OCO9v$,E`$j$D$/$^$G%7%9%F%`$K;D$j$D$E$1$^$9!#$3$l$O$b$&0lEY6/D4IU$-(B -$B$G7+$jJV$5$l$k$KB-$k$b$N$G$9(B: ``$B$b$7(B'' $B$"$J$?$,5-;v(B -$B$r(B ``$B4|8B@Z$l>C5n2DG=(B'' $B$G$"$k$H(B ``$B$7$J$$(B'' $B$J$i!"(Bgnus $B$O(B ``$B7h$7$F(B'' $B$=(B -$B$l$i$N(B ``$B5-;v(B'' $B$r>C5n$7$^$;$s!#(B - -@vindex gnus-auto-expirable-newsgroups -$BC5n2DG=$N0u$rIU$1$J$1$l$P$J$i$J$$$o$1$G$O$"$j$^$;$s!#(B -$B@55,I=8=(B @code{gnus-auto-expirable-newsgroups} $B$K9gCW$9$k%0%k!<%W$OA4$F(B -$B$N4{FI5-;v$K<+F0E*$K4|8B@Z$l>C5n2DG=$N0u$,IU$1$i$l$^$9!#A4$F$N4|8B@Z$l>C(B -$B5n2DG=$N0u$NIU$$$?5-;v$O35N,%P%C%U%!$N:G=i$N7e$K(B @samp{E} $B$,I=<($5$l$^$9!#(B - -$B%G%#%U%)%k%H$G$O<+F04|8B@Z$l>C5n2DG=$r;HMQ$9$k$H!"(Bgnus $B$O$"$J$?$,FI$s$@(B -$BA4$F$N5-;v$r!"$=$l$,4{FI$G$"$C$?$+L$FI$G$"$C$?$+$K4X$o$i$:!"4|8B@Z$l>C5n(B -$B2DG=$H$7$F0u$rIU$1$^$9!#4{FI$N0u$NIU$$$?5-;v$,<+F0E*$K4|8B@Z$l>C5n2DG=$H(B -$B$7$F0uIU$1$i$l$k$N$rHr$1$k$?$a$K!"0J2<$N$h$&$J$b$N$r(B @file{.gnus} $B%U%!%$(B -$B%k$K=q$/;v$,$G$-$^$9(B: - -@vindex gnus-mark-article-hook -@lisp -(remove-hook 'gnus-mark-article-hook - 'gnus-summary-mark-read-and-unread-as-read) -(add-hook 'gnus-mark-article-hook 'gnus-summary-mark-unread-as-read) -@end lisp - -$B<+F04|8B@Z$l>C5n2DG=%0%k!<%W$r:n$k;v$O!"A4$F$N4{FI5-;v$,4|8B@Z$l>C5n$5$l(B -$B$k;v$G$O$J$$;v$K5$$rIU$1$F$/$@$5$$(B---$B4|8B@Z$l>C5n2DG=$H$7$F0u$NIU$$$?5-(B -$B;v$@$1$,4|8B@Z$l>C5n$5$l$^$9!#L?Na(B @kbd{d}$B$,<+F0E*$K5-;v$r4|8B@Z$l>C5n2D(B -$BG=$K$9$k$N$G$OL5$$$H$$$&;v$K$b5$$rIU$1$F$/$@$5$$(B---$BH><+F0$N!"<+F04|8B@Z(B -$B$l>C5n2DG=%0%k!<%W$G5-;v$r4{FI$K0uIU$1$k$3$H$@$1$,5-;v$r4|8B@Z$l>C5n2DG=(B -$B$K$7$^$9!#(B - -@lisp -(setq gnus-auto-expirable-newsgroups - "mail.nosense-list\\|mail.nice-list") -@end lisp - -$B<+F04|8B@Z$l>C5n$r$NJ}K!$O!"%0%k!<%W$N%0%k!<%W%Q%i%a!<%?$H$7$F!"(B -$BMWAG(B @code{auto-expirable} $B$r;}$D;v$G$9!#(B - -$B$b$7E,1~%9%3%"IU$1(B (@pxref{Adaptive Scoring}) $B$H<+F04|8B@Z$l>C5n$r;HMQ$7(B -$B$F$$$k$J$i!"LdBj$,5/$3$k$G$7$g$&!#<+F04|8B@Z$l>C5n$HE,1~%9%3%"IU$1$O$"$^(B -$B$jNI$/Aj8_:nMQ$7$^$;$s!#(B - -@vindex nnmail-expiry-wait -$BJQ?t(B @code{nnmail-expiry-wait} $B$O4|8B@Z$l>C5n2DG=5-;v$,$I$l$/$i$$$N4|4V(B -$B@8B8$7$F$$$k$+$N%G%#%U%)%k%H$N;~4V@_Dj$rDs6!$7$^$9!#(BGnus $B$O%a%C%;!<%8$,(B -$BAw$i$l$?$H$-$G$O$J$/!"$=$l$,(B @emph{$BE~Ce(B} $B$7$F$+$i$NF|$r7W;;$7$^$9!#%G%#(B -$B%U%)%k%H$O(B 7 $BF|4V$G$9!#(B - -Gnus $B$O5-;v$,$I$N%0%k!<%W$KB0$7$F$$$k$+$K4p$E$$$F!"$=$l$,$I$N$/$i$$@8B8(B -$B$9$k$+$r@.8y$K@_Dj$9$k4X?t$bDs6!$7$F$$$^$9!#%0%k!<(B -$B%W(B @samp{mail.private} $B$O4|8B$r(B 1$B%v7n$K!"%0%k!<%W(B @samp{mail.junk} $B$G$O(B -$B4|8B$r(B 1 $BF|$K!"$=$NB>$N$b$N$K$O4|8B$r(B 6 $BF|4V$K$9$k$K$O(B: - -@vindex nnmail-expiry-wait-function -@lisp -(setq nnmail-expiry-wait-function - (lambda (group) - (cond ((string= group "mail.private") - 31) - ((string= group "mail.junk") - 1) - ((string= group "important") - 'never) - (t - 6)))) -@end lisp - -$B$3$N4X?t$KM?$($i$l$k%0%k!<%WL>$O(B ``$BAu>~L5$7(B'' $B$N%0%k!<%WL>$G$9(B--- -@samp{nnml:} $B$d$=$NB>$N;w$?$h$&$J$b$N$OIU$-$^$;$s!#(B - -$BJQ?t(B @code{nnmail-expiry-wait} $B$H4X(B -$B?t(B @code{nnmail-expiry-wait-function} $B$O?t;z(B ($B@0?t$G$"$kI,MW$O$"$j$^$;(B -$B$s(B) $B$+%7%s%\%k(B @code{immediate} $B$+(B @code{never} $B$N$I$A$i$+$G$"$k;v$,$G$-(B -$B$^$9!#(B - -$B4|8B@Z$l4|4V$rA*BrE*$KJQ99$9$k$?$a$K%0%k!<%W%Q%i%a!<(B -$B%?(B @code{expiry-wait} $B$r;H$&;v$b$G$-$^$9(B (@pxref{Group Parameters})$B!#(B - -@vindex nnmail-expiry-target -$B5-;v$N4|8B@Z$l>C5n$NIaDL$NF0:n$O$=$l$i$r>C5n$9$k$3$H$G$9!#$7$+$7!">l9g$K(B -$B$h$C$F$O$=$l$i$r>C5n$9$k$h$j$bJL$N%0%k!<%W$K0\F0$7$?J}$,M-0U5A$+$b$7$l$^(B -$B$;$s!#JQ?t(B @code{nnmail-expiry-target} ($B$H%0%k!<%W%Q%i%a!<(B -$B%?(B @code{expiry-target}) $B$O$3$l$r@)8f$7$^$9!#$3$NJQ?t$NCM$O$9$Y$F$N%0%k!<(B -$B%W$KBP$9$k%G%#%U%)%k%H$K$J$j$^$9$,!"FCDj$N%0%k!<%W$4$H$K%0%k!<%W%Q%i%a!<(B -$B%?$r;H$C$F;XDj$9$l$P>e=q$-$9$k$3$H$,$G$-$^$9!#%G%#%U%)%k%H$NCM(B -$B$O(B @code{delete} $B$G$9$,!"J8;zNs(B ($B5-;v$r0\F0$9$k@h$N%0%k!<%WL>(B) $B$^$?$O0\(B -$BF0@h$N%0%k!<%WL>$+(B @code{delete} $B$rJV$94X?t(B ($B5-;v$KHO0O$r69$a$?%P%C%U%!(B -$B$G!"$=$N5-;v$,B8:_$7$F$$$k%0%k!<%WL>$,0z?t$H$7$FM?$($i$l$^$9(B) $B$K$9$k$3$H(B -$B$,$G$-$^$9!#(B - -$B%0%k!<%WL>$r;XDj$9$k>l9g$NNc(B: -@lisp -(setq nnmail-expiry-target "nnml:expired") -@end lisp - -@vindex nnmail-keep-last-article -@code{nnmail-keep-last-article} $B$,(B @code{nil} $B$G$J$$$H!"(Bgnus $B$O%a!<%k%K%e!<(B -$B%9%0%k!<%W$N:G8e$N5-;v$r7h$7$F4|8B@Z$l>C5n$7$^$;$s!#$3$l$O(B procmail $B$NMx(B -$BMQC5n2DG=$G$J$$5-;v$r4|8B@Z$l(B -$B>C5n$9$k;v$O$J$$!"$H$$$&$N$O13$G$9!#(B@code{total-expire} $B$r%0%k!<%W%Q%i%a!<(B -$B%?$KF~$l$k$H!"5-;v$O4|8B@Z$l>C5n$N0u$,IU$-$^$;$s$,!"A4$F$N5-;v$O4|8B@Z$l(B -$B>C5n2aDx$KF~$l$i$l$^$9!#Hs>o$KCm0U$7$F;H$C$F$/$@$5$$!#$5$i$K$b$C$H4m81$J(B -$B$b$N$OJQ?t(B @code{gnus-total-expirable-newsgroups} $B$G$9!#$3$N@55,I=8=$K9g(B -$BCW$9$kA4$F$N%0%k!<%W$OA4$F$N4{FI5-;v$,4|8B@Z$l>C5n2DG=$N2aDx$KFM$C9~$^$l(B -$B$^$9!#$3$l$O!"Ev$N%0%k!<%W$N(B @emph{$BA4$F(B} $B$N8E$$%a!<%k5-;v$O>/$78e$G:o=|(B -$B$5$l$k$H$$$&;v$G$9!#Hs>o$KCm0U$7$F;H$C$F!"$"$J$?$,;HMQ$7$?@55,I=8=$,4V0c$C(B -$B$?%0%k!<%W$K9gCW$7$F!"$"$J$?$NA4$F$N=EMW$J%a!<%k$,>C$($F$7$^$C$?$H8@$C$F!"(B -$B;d$N$H$3$m$K5c$-IU$$$FMh$J$$$G$/$@$5$$!#(B@emph{$BCK(B}$B$K$J$j$J$5$$(B! $B$b$7$/$O!"(B -@emph{$B=w(B} $B$K$J$j$J$5$$(B! $B$"$J$?$,5$;}$A$h$$$H46$8$kA4$F$N$b$N$H(B! $B$G$9$+$i(B -$B$=$3$K(B! - -$B$?$$$F$$$N?M$O$[$H$s$I$N%a!<%k%0%k!<%W$r(B total-expirable ($BA4BN4|8B@Z$l>C(B -$B5n2DG=(B) $B$K$7$^$9$,!#(B - -@vindex gnus-inhibit-user-auto-expire -@code{gnus-inhibit-user-auto-expire} $B$,(B @code{nil} $B$G$J$1$l$P!"%0%k!<%W(B -$B$,<+F0;~8B>C5n$,;HMQ$5$l$k$h$&$K$J$C$F$$$F$b!"MxMQC5n2DG=$N0u$rIU$1$^$;$s!#(B - -@node Washing Mail -@subsection $B%a!<%k@vBu(B -@cindex mail washing -@cindex list server brain damage -@cindex incoming mail treatment - -$B%a%$%i!<(B (mailer) $B$d%j%9%H%5!<%P!<(B (list server) $B$OK\Ev$KK\Ev$KGO9b$$$G$9!#(B``$B$o$!!"(BRFC822 $B$O2f!9$N%5!<%P!<$rDL$C$F$$$/(B -$B%a%C%;!<%8$NA4$F$N9T$N:G8e$K(B @code{wE aRe ElIte!!!!!1!!} $B$r2C$($k;v$rL@(B -$B<(E*$K6X;_$O$7$F$$$J$$$>!#$5$!!"$d$C$F$_$h$&(B!!!!1'' $B$($'!"$=$N$H$*$j$G$9(B -$B$,!"(BRFC822 $B$OG=NO$NDc$$?M$K$h$C$FFI$^$l$k$h$&$K$O=q$+$l$F$$$^$;$s!#L@Gr(B -$B$J;v$O$=$3$G$O5DO@$5$l$F$$$^$;$s!#$G$9$+$i!#$=$&$$$&$3$H$G$9!#(B - -$BLdBjE@(B: $B%I%$%DHG(B Microsoft Exchange $B$OJVEz$NI=Bj$K(B @samp{Re: } $B$NBe$o$j(B -$B$K(B @samp{AW: } $B$rIU$12C$($^$9!#;d$O$3$l$KF0MI$7$FO5Gb$7$F$$$k$U$j$r$9$k(B -$B$3$H$b$G$-$^$7$?$,!"$=$&$9$k5$NO$,$"$j$^$;$s$G$7$?!#$=$l$O>P$&$Y$-;v$G$9!#(B - -Gnus $B$O5-;v$rI=<($9$k$H$-$K$=$l$r@vBu$9$k$?$a$K2aEY$N4X?t$rDs6!$7$F$$$^(B -$B$9$,!"%a!<%k$r%G%#%9%/$KJ]B8$9$kA0$KA*JL$r$9$k$3$H$,$G$-$?J}$,NI$$$G$7$g(B -$B$&!#$=$NL\E*$N$?$a$K!";0$D$N%U%C%/$H$=$N%U%C%/$KF~$l$k;v$N$G$-$k?'!9$J4X(B -$B?t$,$"$j$^$9!#(B - -@table @code -@item nnmail-prepare-incoming-hook -@vindex nnmail-prepare-incoming-hook -$B$3$N%U%C%/$O%a!<%k$K2?$+$r$9$kA0$K8F$P$l!"4pK\E*$J!"%a!<%k$rA]$$$F$-$l$$(B -$B$K$9$k=j:n$N$?$a$K$"$j$^$9!#$=$l$OA4$F$N?7$7$$!"F~$C$F$-$?%a!<%k$r4^$s$G(B -$B$$$k%P%C%U%!$G8F$P$l$^$9!#;H$&;v$N$G$-$k4X?t$O(B: - -@table @code -@item nnheader-ms-strip-cr -@findex nnheader-ms-strip-cr -$B$=$l$>$l$N9T$+$i!":G8e$K$"$k%-%c%j%C%8%j%?!<%s(B (carriage return) $B$re$GF0:n$7$F$$$k(B Emacs $B$N%G%#%U%)%k%H$G$9!#(B -@end table - -@item nnmail-prepare-incoming-header-hook -@vindex nnmail-prepare-incoming-header-hook -$B$3$N%U%C%/$O$=$l$>$l$N%X%C%@!<$KHO0O$r69$a$i$l$F(B (narrowed) $B8F$P$l$^$9!#(B -$B%X%C%@!<$r$-$l$$$K$9$k$H$-$K;H$&;v$,$G$-$^$9!#;H$&;v$N$G$-$k4X?t$O(B: - -@table @code -@item nnmail-remove-leading-whitespace -@findex nnmail-remove-leading-whitespace -$B%X%C%@!<$K$=$l$,NI$/8+$($k$h$&$K(B ``$BM-MQ$J(B'' $B%j%9%H%5!<%P!<$,A0$NJ}$KIU$1(B -$B2C$($?6uGr$rL5$/$7$^$9!#$"$!$!!#(B - -@item nnmail-remove-list-identifiers -@findex nnmail-remove-list-identifiers -$B$$$/$D$+$N%j%9%H%5!<%P!<$OF10l<1JL;R$rIU$12C$($^$9(B---$BNc$($P!"(B -@samp{(idm)}---$B$rA4$F$N(B @code{Subject} $B%X%C%@!<$N:G=i$KIU$1$^$9!#$=$l$O!"(B -$B@P4o;~Be$N%a!<%k%X%C%@!<$r;H$C$F$$$k?M$K$ONI$$;v$@$H;W$$$^$9!#$3$N4X?t$O(B -$B@55,I=8=(B @code{nnmail-list-identifiers} $B$K9gCW$9$kJ8;zNs$r$l$N%a%C%;!<%8$KHO0O$r69$a$i$l$F8F$P$l$^$9!#;H$&;v$N$G(B -$B$-$k4X?t$O(B: - -@table @code -@item article-de-quoted-unreadable -@findex article-de-quoted-unreadable -Quoted Readable $BId9f2=$rI|9f2=$7$^$9!#(B -@end table -@end table - -@node Duplicates -@subsection $B=EJ#(B - -@vindex nnmail-treat-duplicates -@vindex nnmail-message-id-cache-length -@vindex nnmail-message-id-cache-file -@cindex duplicate mails -$B$$$/$D$+$N%a!<%j%s%0%j%9%H$N%a%s%P!<$J$i!";~!9F1$8%a!<%k$rFs$DC5n$7$^$;$s!#$=$NBe$o$j$K!"%a!<%k$N@hF,$K$3$l$O0c$C$?%a%C%;!<%8$N=E(B -$BJ#$G$"$k$H$$$&7Y9p$rA^F~$7$^$9!#(B - -$B$3$NJQ?t$O4X?t$G$"$k;v$b$G$-$^$9!#$=$N>l9g$O!"4X?t(B -$B$O(B @code{Message-ID} $B$r0z?t$H$7$F!"Ev$N%a%C%;!<%8$KHO0O$r69$a$i$l$?%P%C(B -$B%U%!$+$i8F$P$l$^$9!#$3$N4X?t$O(B @code{nil}, @code{warn}, @code{delete} $B$N(B -$B$I$l$+$rJV$5$J$1$l$P$J$j$^$;$s!#(B - -$BJQ?t$r(B @code{nil} $B$K@_Dj$9$k;v$K$h$C$F!"$3$N5!G=$r40A4$K;H$o$J$$$h$&$K$9(B -$B$k;v$,$G$-$^$9!#(B - -$B$b$7A4$F$N=EJ#%a!<%k$rFCJL$J(B @dfn{duplicate} $B%0%k!<%W$KF~$l$?$$$N$G$"$l(B -$B$P!"IaDL$N%a!<%kJ,3dJ}K!$r;H$C$F$=$l$r$9$k$3$H$,$G$-$^$9(B: - -@lisp -(setq nnmail-split-fancy - '(| ;; $B=EJ#%a%C%;!<%8$OJ,N%$5$l$?%0%k!<%W$X9T$-$^$9!#(B - ("gnus-warning" "duplicat\\(e\\|ion\\) of message" "duplicate") - ;; $B%G!<%b%s$d%]%9%H%^%9%?!<$d;w$?$h$&$J$b$N$+$i$N(B - ;; $B%a%C%;!<%8$OB>$N$H$3$m$X!#(B - (any mail "mail.misc") - ;; $BB>$NK!B'!#(B - [ ... ] )) -@end lisp - -$B$b$7$/$O$NK!B'!#(B - [...])) -@end lisp - -$B$9$P$i$7$$5!G=$,$"$j$^$9(B: $B$b$7Dj$9$k$H$$$&$&$k$5$$JJ$,$"$j$^$9!#$3$l$O$b$C$H$b$G$J(B -$B$$;v$G$O$J$$$+$b$7$l$^$;$s$,!"$"$J$?$NK>$`;v$G$O$J$$$+$b$7$l$^$;$s!#(B - -$B$b$7(B @code{mail-sources} $B$H(B @code{nnmail-spool-file} $B$r(B @code{nil} $B$K@_(B -$BDj$9$k$H!"$I$N%P%C%/%(%s%I$bF~$C$F$/$k%a!<%k$rFI$b$&$H;n$_$k;v$O$J$/!"K>(B -$B$`;v$No$KK~B-$7$F$$$F!"8E(B -$B$$(B @sc{rmail} $B%U%!%$%k$,(B @code{nnbabyl} $B$G1#$5$l$F$$$k$N$r$5$C$H8+$?$$$@(B -$B$1$J$i!"$3$l$OM>J,$G$7$g$&!#$9$Y$F$N%P%C%/%(%s%I$O(B $B%P%C%/%(%s%I(B- -@code{get-new-mail} $B$H$$$&JQ?t$r;}$C$F$$$^$9!#$b$7(B @code{nnbabyl} $B$N%a!<(B -$B%kFI$_9~$_$r;HMQIT2D$K$7$?$$$N$G$"$l$P!"%0%k!<%W$N;ve$N%5!<%P!<(B -$B$r(B @code{nnbabyl-get-new-mail} $B$r(B @code{nil} $B$K@_Dj$9$k$h$&$KJT=8$7$^$9!#(B - -$BA4$F$N%a!<%k%P%C%/%(%s%I$OF~$C$F$/$k%a!<%k$rFI$_9~$`$H$-$K!"J]B8$5$l$k$Y(B -$B$-5-;v$KHO0O$r69$a$F(B @code{nn}*@code{-prepare-save-mail-hook} $B$r8F$S$^$9!#(B - -@node Choosing a Mail Backend -@subsection $B%a!<%k%P%C%/%(%s%I$rA*$V(B - -Gnus $B$O%a!<%k%0%k!<%W$rF0:n$9$k$h$&$K$9$k$H%a!<%k%9%W!<%k$rFI$_9~$_$^$9!#(B -$B%a!<%k%U%!%$%k$O$^$:$"$J$?$N%[!<%`%G%#%l%/%H%j!<$KJ#$l$N%0%k!<%W$KBP$7$F0l$D$N%U%!%$%k(B - $B$r;}$D(B -* Comparing Mail Backends:: $BF@<:$N?<$$F6;!(B -@end menu - -@node Unix Mail Box -@subsubsection Unix $B%a!<%k%\%C%/%9(B -@cindex nnmbox -@cindex unix mail box - -@vindex nnmbox-active-file -@vindex nnmbox-mbox-file -@dfn{nnmbox} $B%P%C%/%(%s%I$O%a!<%k$rC_B"$9$k$?$a$KI8=`$N(B Un*x mbox $B%U%!%$(B -$B%k$rMQ$$$^$9!#(B@code{nnmbox} $B$O$=$l$>$l$N%a!<%k5-;v$K$=$l$,$I$N%0%k!<%W$K(B -$BB0$7$F$$$k$+$r<($9DI2C$N%X%C%@!<$r2C$($^$9!#(B - -$B;ve$N%5!<%P!<$N@_Dj(B: - -@table @code -@item nnmbox-mbox-file -@vindex nnmbox-mbox-file -$BMxMQA0!#4{DjCM(B -$B$O(B @file{~/mbox} $B$G$9!#(B - -@item nnmbox-activate-file -@vindex nnmbox-active-file -$B%a!<%k%\%C%/%9$N%"%/%F%#%V%U%!%$%k$NL>A0!#4{DjCM(B -$B$O(B @file{~/.mbox-active} $B$G$9!#(B - -@item nnmbox-get-new-mail -@vindex nnmbox-get-new-mail -@code{nil} $B$G$J$1$l$P!"(B@code{nnmbox} $B$OF~$C$FMh$?%a!<%k$rFI$_9~$s$G%0%k!<(B -$B%W$KJ,3d$7$^$9!#4{DjCM$O(B @code{t} $B$G$9!#(B -@end table - -@node Rmail Babyl -@subsubsection Rmail Babyl -@cindex nnbabyl -@cindex rmail mbox - -@vindex nnbabyl-active-file -@vindex nnbabyl-mbox-file -@dfn{nnbabyl} $B%P%C%/%(%s%I$O%a!<%k$rC_B"$9$k$?$a$K(B babyl $B%a!<%k%\%C%/(B -$B%9(B ($BJLL>(B @dfn{rmail mbox}) $B$r;H$$$^$9!#(B@code{nnbabyl} $B$O$=$l$>$l$N5-;v$K(B -$B$=$l$,$I$N%0%k!<%W$KB0$7$F$$$k$+$r<($9DI2C$N%X%C%@!<$r2C$($^$9!#(B - -$B;ve$N%5!<%P!<$N@_Dj(B: - -@table @code -@item nnbabyl-mbox-file -@vindex nnbabyl-mbox-file -rmail mbox $B%U%!%$%k$NL>A0!#4{DjCM$O(B @file{~/RMAIL} $B$G$9!#(B - -@item nnbabyl-active-file -@vindex nnbabyl-active-file -rmail box $B$N$?$a$N%"%/%F%#%V%U%!%$%k$NL>A0!#4{DjCM(B -$B$O(B @file{~/.rmail-active} $B$G$9!#(B - -@item nnbabyl-get-new-mail -@vindex nnbabyl-get-new-mail -@code{nil} $B$G$J$1$l$P!"(B@code{nnbabyl} $B$OF~$C$F$/$k%a!<%k$rFI$_9~$_$^$9!#(B -$B4{DjCM$O(B @code{t} $B$G$9!#(B -@end table - -@node Mail Spool -@subsubsection $B%a!<%k%9%W!<%k(B -@cindex nnml -@cindex mail @sc{nov} spool - -@dfn{nnml} $B%9%W!<%k%a!<%kMM<0$OB>$NCN$i$l$?MM<0$H$O8_49@-$,$"$j$^$;$s!#(B -$B$=$l$O>/$7Cm0U$7$F;H$o$l$k$Y$-$G$9!#(B - -@vindex nnml-directory -$B$b$7$3$N%P%C%/%(%s%I$r;H$&$H!"(Bgnus $B$OF~$C$F$/$k%a!<%k$r!"$=$l$>$l$N%a!<(B -$B%k$r(B 1 $B%U%!%$%k$H$7$F%U%!%$%k$KJ,3d$7!"5-;v$rJQ(B -$B?t(B @code{nnml-directory} $B$G;XDj$5$l$?%G%#%l%/%H%j!<$N2<$NBP1~$9$k%G%#%l(B -$B%/%H%j!<$KF~$l$^$9!#%G%#%U%)%k%H$NCM$O(B @file{~/Mail/} $B$G$9!#(B - -$BA0$b$C$F%G%#%l%/%H%j!<$r:n$C$F$*$/I,MW$O$"$j$^$;$s!#$=$l$NLLE]$O(B gnus $B$,(B -$B8+$F$/$l$^$9!#(B - -$B$b$7$"$J$?$N%"%+%&%s%H$KC_@Q$G$-$k%U%!%$%k$N?t$K87L)$J@)8B$,$"$k$J$i!"$3(B -$B$N%P%C%/%(%s%I$r;H$&$Y$-$G$O$"$j$^$;$s!#$=$l$>$l$N%a!<%k$O$=$l<+?H$N%U%!(B -$B%$%k$rF@$^$9$N$G!"?t=54V$G$?$/$5$s$N(B i$B%N!<%I$r@jM-$9$k2DG=@-$O==J,$K$"$j(B -$B$^$9!#JL$K$3$l$,LdBj$G$J$/!"?F@Z$J%7%9%F%`4IM}uBV$G(B gnus $B$KLa$9(B ($BK\Mh$N(B @code{nnml} $B%5!<(B -$B%P!<$K$h$C$FDI2C$9$k(B) $B$3$H$,$G$-$kFC$l$N(B @code{nnml} $B%0%k!<%W$N%G%#%l%/%H%jFb$N!"DL(B -$B>o(B @code{.marks} $B%U%!%$%k(B (@code{nnml-marks-file-name} $B$r;2>H(B) $B$K3JG<$5(B -$B$l$^$9!#$^$?!"8D!9$N(B @code{nnml} $B%0%k!<%W$K$D$$$F$b%P%C%/%"%C%W$9$k$3$H(B -$B$,2DG=$G!"(B($B%P%C%/%"%C%W$r(B nnml $B%G%#%l%/%$%H%j$KLa$7$?8e$G(B) @kbd{G m} $B%-!<(B -$B$r;H$C$F$=$N%0%k!<%W$r85$KLa$7$^$9!#(B - -$B;ve$N%5!<%P!<$N@_Dj(B: - -@table @code -@item nnml-directory -@vindex nnml-directory -$BA4$F$N(B @code{nnml} $B%G%#%l%/%H%j!<$O$3$N%G%#%l%/%H%j!<$N2<$KCV$+$l$^$9!#(B -$B4{DjCM$O(B `message-directory' $B$NCM(B ($B$=$N4{DjCM$O(B @file{~/Mail}) $B$G$9!#(B - -@item nnml-active-file -@vindex nnml-active-file -@code{nnml} $B%5!<%P!<$N$?$a$N%"%/%F%#%V%U%!%$%k!#4{DjCM(B -$B$O(B @file{~/Mail/active"} $B$G$9!#(B - -@item nnml-newsgroups-file -@vindex nnml-newgroups-file -@code{nnml} $B%0%k!<%W5-=R%U%!%$%k!#(B@xref{Newsgroups File Format}$B!#4{DjCM(B -$B$O(B @file{~/Mail/newsgroups"} $B$G$9!#(B - -@item nnml-get-new-mail -@vindex nnml-get-new-mail -@code{nil} $B$G$J$1$l$P!"(B@code{nnml} $B$OF~$C$FMh$?%a!<%kFI$_9~$_$^$9!#4{Dj(B -$BCM$O(B @code{t} $B$G$9!#(B - -@item nnml-nov-is-evil -@vindex nnml-nov-is-evil -@code{nil} $B$G$J$1$l$P!"$3$N%P%C%/%(%s%I$O$I$N(B @sc{nov} $B%U%!%$%k$bL5;k$7(B -$B$^$9!#4{DjCM$O(B @code{nil} $B$G$9!#(B - -@item nnml-nov-file-name -@vindex nnml-nov-file-name -@sc{nov} $B%U%!%$%k$NL>A0!#%G%#%U%)%k%H$O(B @file{.overview} $B$G$9!#(B - -@item nnml-prepare-save-mail-hook -@vindex nnml-prepare-save-mail-hook -$BJ]B8$9$kA0$K5-;v$KHO0O$r69$a$FA0$G$9!#%G%#%U%)%k%H$O(B @file{.marks} $B$G$9!#(B -@end table - -@findex nnml-generate-nov-databases -@code{nnml} $B%0%k!<%W$H(B @sc{nov} $B%U%!%$%k$,40A4$KNI$$>uBV$G$J$/$J$C$F$7$^$C(B -$B$?$J$i!"(B@kbd{M-x nnml-generate-nov-databases} $B$HBG$D;v$K$h$C$F!"40A4$K99(B -$B?7$9$k;v$,$G$-$^$9!#$3$NL?Na$O!"$=$l$>$lA4$F$N%U%!%$%k$r8+$k;v$K$h$C(B -$B$F(B @code{nnml} $B3,AXA4BN$r%H%m!<%k5{LV$G$5$i$$$^$9$N$G!"$=$l$,=*$o$k$^$G(B -$B$K$O;~4V$,$+$+$k$+$b$7$l$^$;$s!#$3$N5!G=$X$N$h$jNI$$%$%s%?!<%U%'!<%9$O%5!<(B -$B%P!<%P%C%U%!$G8+$D$+$k$G$7$g$&(B (@pxref{Server Commands})$B!#(B - -@node MH Spool -@subsubsection MH $B%9%W!<%k(B -@cindex nnmh -@cindex mh-e mail spool - -@code{nnmh} $B$O!"(B@sc{nov} $B%G!<%?%Y!<%9$r:n$i$J$$$3$H$H%"%/%F%#%V%U%!%$%k(B -$B$d0u%U%!%$%k$rJ];}$7$J$$;v$r=|$$$F!"(B@code{nnml} $B$H;w$F$$$^$9!#$=$N$3$H(B -$B$O(B @code{nnmh} $B$r(B @code{nnml} $B$h$j(B @emph{$B$+$J$j(B} $BCY$$%P%C%/%(%s%I$K$7$F(B -$B$$$^$9$,!"$=$l$O(B procmail $B$N%9%/%j%W%H$r=q$/$?$a$K$:$C$H$d$j$d$9$/$J$C$F(B -$B$b$$$^$9!#(B - -$B;ve$N%5!<%P!<$N@_Dj(B: - -@table @code -@item nnmh-directory -@vindex nnmh-directory -$BA4$F$N(B @code{nnmh} $B%G%#%l%/%H%j!<$O$3$N%G%#%l%/%H%j!<$N2<$KCV$+$l$^$9!#(B -$B4{DjCM$O(B @code{message-directory} $B$NCM(B ($B$=$N4{DjCM$O(B @file{~/Mail}) $B$G$9!#(B - -@item nnmh-get-new-mail -@vindex nnmh-get-new-mail -@code{nil} $B$G$J$1$l$P!"(B@code{nnmh} $B$OF~$C$F$/$k%a!<%k$rFI$_9~$_$^$9!#4{(B -$BDjCM$O(B @code{t} $B$G$9!#(B - -@item nnmh-be-safe -@vindex nnmh-be-safe -@code{nil} $B$G$J$1$l$P!"(B@code{nnmh} $B$O%U%)%k%@!<$K$"$k5-;v$,pJs$rD4$Y$^$9$N$G!"$3$l$r(B @code{t} $B$K@_Dj$9$k;v$O?<(B -$B9o$JB.EYDc2<$,5/$3$k$H$$$&;v$G$9!#$b$7(B @code{nnmh} $B5-;v$rFI$`$N(B -$B$K(B gnus $B0J30$N$b$N$r;H$C$F$$$J$$$N$G$"$l$P!"$3$NJQ?t$r(B @code{t} $B$K@_Dj$9(B -$B$kI,MW$O$"$j$^$;$s!#4{DjCM$O(B @code{nil} $B$G$9!#(B -@end table - -@node Mail Folders -@subsubsection $B%a!<%k%U%)%k%@!<(B -@cindex nnfolder -@cindex mbox folders -@cindex mail folders - -@code{nnfolder} $B$O$=$l$>$l$N%a!<%k%0%k!<%W$r0c$C$?%U%!%$%k$KC_B"$9$k%P%C(B -$B%/%(%s%I$G$9!#$=$l$>$l$N%U%!%$%k$OI8=`$N(B Un*x mbox $BMM<0$G$9!#(B -@code{nnfolder} $B$O5-;vHV9f$HE~CeF|$r5-O?$7$F$*$/$?$a$NDI2C$N%X%C%@!<$r2C(B -$B$($^$9!#(B - -@cindex self contained nnfolder servers -$B0u%U%!%$%k(B ($BLuCm(B: marks file) $B$,;H$o$l$k$H(B ($B$=$l$,%G%#%U%)%k%H$G$9$,(B)$B!"(B -@code{nnfolder} $B%5!<%P!<$O(B @code{tar} $B$J$I$r;H$C$F%P%C%/%"%C%W$7$?$j!"8e(B -$B$G$"$J$?$,IU$1$?0u$,$9$Y$FJ]$?$l$?>uBV$G(B gnus $B$KLa$9(B ($BK\Mh(B -$B$N(B @code{nnfolder} $B%5!<%P!<$K$h$C$FDI2C$9$k(B) $B$3$H$,$G$-$kFCo(B @code{.mrk} (@code{nnfolder-marks-file-name} $B$r;2>H(B) $B$,IU2C$5$l(B -$B$?L>A0$N%U%!%$%k$K3JG<$5$l$^$9!#$^$?!"8D!9$N(B @code{nnfolder} $B%0%k!<%W$K(B -$B$D$$$F$b%P%C%/%"%C%W$9$k$3$H$,2DG=$G!"(B($B%P%C%/%"%C%W$r(B nnfolder $B%G%#%l%/(B -$B%$%H%j$KLa$7$?8e$G(B) @kbd{G m} $B%-!<$r;H$C$F$=$N%0%k!<%W$r85$KLa$7$^$9!#(B - -$B;ve$N%5!<%P!<$N@_Dj(B: - -@table @code -@item nnfolder-directory -@vindex nnfolder-directory -$BA4$F$N(B @code{nnfolder} $B%a!<%k%\%C%/%9$O$3$N%G%#%l%/%H%j!<$N2<$KCV$+$l$^(B -$B$9!#4{DjCM$O(B @code{message-directory} $B$NCM(B ($B$=$N4{DjCM(B -$B$O(B @file{~/Mail}) $B$G$9!#(B - -@item nnfolder-active-file -@vindex nnfolder-active-file -$B%"%/%F%#%V%U%!%$%k$NL>A0!#4{DjCM$O(B @file{~/Mail/active} $B$G$9!#(B - -@item nnfolder-newgroups-file -@vindex nnfolder-newsgroups-file -$B%0%k!<%W5-=R%U%!%$%k$NL>A0!#(B@xref{Newsgroups File Format}$B!#4{DjCM(B -$B$O(B @file{~/Mail/newsgroups"} $B$G$9!#(B - -@item nnfolder-get-new-mail -@vindex nnfolder-get-new-mail -@code{nil} $B$G$J$1$l$P!"(B@code{nnfolder} $B$OF~$C$F$/$k%a!<%k$rFI$_9~$_$^$9!#(B -$B4{DjCM$O(B @code{t} $B$G$9!#(B - -@item nnfolder-save-buffer-hook -@vindex nnfolder-save-buffer-hook -@cindex backup files -$B%U%)%k%@!<$rJ]B8$9$kA0$Ko$N%P%C%/%"%C%W$NJQL>$r$9$k;v$KCm0U$7$F2<$5$$!#(B -$B$3$N5!G=$rL58z$K$7$?$$$N$G$"$l$P!"%U%!%$%k(B @file{.emacs} $B$GC5n$5$l$k%a%C%;!<%8$KHO0O$r69$a$i$l$FC5n$9$k$^$($K2?$i$+$N>pJs$r(B -$B$r;H$C$F$$$k$H$-$K$N$_F0:n$7$^$9$,!#(B - -@node Comparing Mail Backends -@subsubsection $B%a!<%k%P%C%/%(%s%I$NHf3S(B - -$B$^$:!"MQ8l$H$7$F!"(B@dfn{$B%P%C%/%(%s%I(B} (backend) $B$ODc$`$J$i!"F)2aE*$G$"$j!"$=$l$O2?$+$r@.$7?k$2$k$b$N$G(B -$B$9!#$=$N$3$3$m$O!"%a!<%k$O$I$3$+$i$+Mh$J$1$l$P$J$i$:!"E,@Z$J%P%C%/%(%s%I(B -$B$NA*Br$O!"%a!<%k$r(B gnus $B$N$9$06a$/$K@\5-;v$N%G%#%l%/%H%j!<%9%W!<%k$KF'$_9~$`$H$$$&$b$N(B -$B$G$7$?!#$=$l$G$b!"$?$^$?$^%5!<%P!<(B ($B$b$7$/$O!"(BNFS $B$G%9%W!<%k$,FI$a$k$h(B -$B$&$J>l9g(B) $B$K$$$k$h$&$J>l9g$O!"$3$l$i$NJ}K!$rA*$V$?$a(B -$B$K(B @code{nntp} $B$d(B @code{nnspool} $B%P%C%/%(%s%I$N$I$A$i$+$rA*$V$3$H$,$G$-(B -$B$^$7$?!#(B - -$B%a!<%k%P%C%/%(%s%I$rA*Br$9$k$3$H$N%4!<%k$O!"85$N7A<0$r07$&$N$KE,$7$?J}K!(B -$B$H!">-Mh;HMQ$9$k$?$a$KJXMx$J7A<0$K%a!<%k$r;D$9$3$H$NN>J}$rF1;~$KI=8=$9$k(B -$B$3$H$G$9!#$=$l$>$l$K$ONI$$E@$H0-$$E@$,$$$/$D$+$"$j$^$9(B: - -@table @code -@item nnmbox - -UNIX $B%7%9%F%`$ONr;KE*$KC10l$N!"Hs>o$K0lHLE*$J!">e2A$G$-$k(B) $BJQ99$r$;$:$KJ#@=$9$k$3$H$G$9!#$=$l$O(B gnus $B$N4D6-$N;H(B -$BMQ2DG=HO0O$K%a!<%k$r0\F0$9$k(B ``$B:G$b6r$+$J(B''$BJ}K!$G$9!#$3$l$ODj$a$i$l$?>l(B -$B=j$K0\F0$9$k$N$rB.$/$7$^$9$,!"(Bgnus $B$,$I$3$K2?$,$"$k$+$rD4$Y$k$H$-$O!"2r(B -$B@O$,CY$/$J$j$^$9!#(B - -@item nnbabyl - -$B$`$+$7$`$+$7!"(BTOPS $B$H8F$P$l$k%*%Z%l!<%F%#%s%0%7%9%F%`$d!";w$?$h$&$J$b$N(B -$B$ruBV%S%C%H$r%U%!(B -$B%$%k$N$=$l$>$l$N%a%C%;!<%8$N@hF,$K2C$($k$3$H$r$7$F$$$^$7$?!#(B -RMAIL $B$O(B Emacs $B$N:G=i$N%a!<%k%j!<%@!<$G!"(BRichard Stallman $B$K$h$C$F=q$+$l!"(B -Stallman $B$O$=$N(B TOPS/Babyl $B4D6-$N=P?H$G$"$k$?$a!"(BRMAIL $B$r4{$KB8:_$7$F$$(B -$B$?%a!<%k%U%!%$%k$N0lB2$rM}2r$9$kMM$K=q$-$^$7$?!#(BGnus ($B$3$NLdBj$K4X$7$F(B -$B$O(B VM $B$b(B) $B$3$N7A<0$r%5%]!<%H$7B3$1$F$$$^$9!#$=$l$O!"$=$N%a!<%i!e$N7A<0$NN>J}$O%a!<%k$r%U%!%$%k%7%9%F%`$NC1FH$N%U%!%$%k$KF~$l!"%a!<%k$r(B -$B8+$k$?$S$K!"%U%!%$%kA4BN$r2r@O$7$J$1$l$P$J$j$^$;$s!#(B - -@item nnml - -@code{nnml} $B$O$[$H$s$I(B @code{nnspool} $B@\B3$N(B Usenet $B%7%9%F%`$rA`:n$7$F$$(B -$B$k$h$&$J46$8$N$9$k%P%C%/%(%s%I$G$9!#(B($Bo$K$?$/$5$s>CHq$7$^$9!#$9$J$o$A!"%U%!%$(B -$B%k%7%9%F%`$G?7$7$$%U%!%$%k$rF~$l$k$?$a$N2DG=$J>l=j$rDj5A$9$k;q8;$r$?$/$5(B -$B$s@jM-$7$^$9!#%7%9%F%`4IM}e$G@83h$7$F$$$k$J$i!"(B@code{nnml} $B$OHs>o$KBg$-$JMxE@$,(B -$B$"$j$^$9!#(B - -$B$^$?!"(BFAT16 $B$N(B Windows $B$N@$3&$K@8$-$F$$$k$J$i!"LdBj$,$"$k$G$7$g$&!#$?$/(B -$B$5$s$N>.$5$J%U%!%$%k$GB?$/$N>l=j$r/$7$+!"A4$/$J$$$+$H$$$&DxEY$G$9(B -- @code{nnmh} $B$O0UL#E*(B -$B$K$O(B ``@code{nnml} $B$K%"%/%F%#%V%U%!%$%k$H(B overview $B$N$J$$$b$N(B'' $B$HEy2A$G(B -$B$9!#$3$l$O5DO@$N$"$k$H$3$m$G$9$,!":G0-$NA*Br$G$9!#$H$$$&$N$O!"8D!9$N%U%!(B -$B%$%k$N:n@.$NCY$5$,!"%0%k!<%W$G2?$,?7$7$$$+$rCN$k$H$-$N2r@O$N$?$a$N;HMQ$N(B -$BCY$5$,7k$SIU$/$+$i$G$9!#(B - -@item nnfolder - -$B4pK\E*$K(B @code{nnfolder} $B$N8z2L$O%0%k!<%WKh$N(B @code{nnmbox} ($B>e$G@bL@$5(B -$B$l$F$$$k:G=i$NJ}K!(B) $B$G$9!#$9$J$o$A!"(B@code{nnmbox} $B<+?H$O(B *$BA4$F(B* $B$N%a!<%k(B -$B$r0l$D$N%U%!%$%k$KF~$l$^$9(B; @code{nnfolder} $B$O%a!<%k%0%k!<%W$=$l$>$l(B -$B$,(B Unix mail box $B%U%!%$%k$r;}$D$h$&$K>/$7:GE,2=$r$7$^$9!#(B -@code{nnmobx} $B$h$j$b!"$=$l$>$l$N%0%k!<%W$rJL$K2r@O$9$k$N$GB.$/!"$=$N$&$((B -$B%a!<%k$r0\F0$5$;$k$N$K:G>.8B$NO+NO$rMW5a$9$kC1=c$J(B Unix mail box $B7A<0$r(B -$BDs6!$7$^$9!#2C$($F!"(Bgnus $B$,$=$l$>$l$NJL$N%0%k!<%W$K$I$N$/$i$$$N%a%C%;!<(B -$B%8$,$"$k$+$rD4$Y$k$?$a$N(B ``$B%"%/%F%#%V(B'' $B%U%!%$%k$r0];}$7$^$9!#(B - -$B$b$7$?$/$5$s$NNL$N%a%C%;!<%8$rl$O$I$s$I$s9-$^$C$F$$$^$9!#B?$/$NJ,Ln$G!"%&%'%V$N(B -$B7G<(HD$O:G$b=EMW$J>l$K$J$j!"%a!<%j%s%0%j%9%H$d%K%e!<%9%0%k!<%W$N=EMW@-$r(B -$BfJ$i$;$F$$$^$9!#M}M3$O4JC1$G$9(B---$B?7$7$$MxMQl(B -$B=j$r%/%j%C%/$9$k$@$1$G!"5DO@$N>l$,$"$j$^$9!#%a!<%j%s%0%j%9%H$G$O!"LLE]$J(B -$B9XFI/$7Hw$($D$D$"$j(B -$B$^$9!#(B - -@menu -* Web Searches:: $BJ8;zNs$K%^%C%A$9$k5-;v$+$i%0%k!<%W$r:n$k(B -* Slashdot:: Slashdot $B$N%3%a%s%H$rFI$`(B -* Ultimate:: Ultimate Bulletin Board $B%7%9%F%`(B -* Web Archive:: $B%&%'%V$KJ]4I$5$l$?%a!<%j%s%0%j%9%H$rFI$`(B -* Web Newspaper:: $B%&%'%V$KJ]4I$5$l$??7J9$rFI$`(B -* RSS:: RDF Site Summary $B$rFI$`(B -* Customizing w3:: Gnus $B$+$i(B Emacs/w3 $B$rA`:n$9$k(B -@end menu - -@samp{Web Newspaper} $B$r=|$/$9$Y$F$N%&%'%V%=!<%9$O!"F0:n$5$;$k$?$a(B -$B$K(B Emacs/w3 $B$H(B url $B%i%$%V%i%j$,I,MW$G$9!#(B - -$B$3$l$i$N%&%'%V%=!<%9$N0lHV$NLdBj$OD94|4V$OF0:n$7$J$$2DG=@-$,9b$$$3$H$G$9!#(B -@sc{html} $B%G!<%?$+$i>pJs$r=8$a$k$N$O$;$$$<$$?dB,$G!"9=B$$,JQ2=$7$?$H$-$K(B -$B$O!"(Bgnus $B%P%C%/%(%s%I$OF0:n$7$^$;$s!#$G$b!"$"$kDxEY?7$7$$%P!<%8%g%s$N%P%C(B -$B%/%(%s%I$r;H$C$F$$$l$PBg>fIW$N$O$:$G$9!#(B - -$B$3$l$i$N%&%'%VJ}K!$K6&DL$9$k$3$H$O!"%&%'%V%=!<%9$O$7$P$7$PMn$A$F$$$?$j!"(B -$B;HMQ2DG=$G$J$+$C$?$j!"C1=c$K3Z$7$`$K$OCY$9$.$k$3$H$,$"$k!"$H$$$&$3$H$G$9!#(B -$B$=$&$$$&>l9g$K$O!"(BGnu Agent (@pxref{Gnus Unplugged}) $B$K5-;v$N%@%&%s%m!<(B -$B%I$rG$$;$F!"%m!<%+%k%G%#%9%/$+$i9%$-$J$H$-$KFI$`$h$&$K$9$k$3$H$,$G$-$^$9!#(B -$B$3$l$G!"(BWorld Wide Wait $B$H$O$*$5$i$P$G$9!#(B - -@node Archiving Mail -@subsection $B%a!<%k$NJ]B8(B -@cindex archiving mail -@cindex backup of mail - -$B$$$/$D$+$N%P%C%/%(%s%I!"FC$K(B nnml $B$H(B nnfolder $B$O!"$=$l$>$l$N%0%k!<%W$N5-(B -$B;v$N0u$rK\Ev$KJ];}$7$^$9!#$3$l$i$N%5!<%P!<$G!"%0%k!<%W$N0u$rJ]$A$D$DJ]B8(B -$B$7$?$j85$KLa$9$N$O$+$J$j4JC1$G$9!#(B - -($B$G$b!"%0%k!<%W%l%Y%k$H%0%k!<%W%Q%i%a!<%?$r$bJ];}$9$k$K$O!":#$^$G$H$*(B -$B$j(B @code{.newsrc.eld} $B$N?@$K!"Iq$$$H@8lS$rJ{$2$J$1$l$P$J$j$^$;$s!#(B) - -@code{nnml} $B$+(B @code{nnfolder} $B$K$^$k$4$HJ]B8$9$k$K$O!"%5!<%P!<$N%G%#%l(B -$B%/%H%j$r:F5"E*$K%3%T!<$7$^$9!#(Bgnus $B$r=*N;$9$kI,MW$OL5$$$N$G!"J]B8(B -$B$O(B @code{cron} $B$d$=$l$KN`$9$k$b$N$,9T$J$&$3$H$,$G$-$^$9!#%G!<%?$rI|5"$5(B -$B$;$k$K$O%G%#%l%/%H%jLZ(B (tree) $B$r85$KLa$9$3$H$G9T$J$$!"$=$N%G%#%l%/%H%j$r(B -$B;X$7<($9$h$&$K(B gnus $B$N%5!<%P!<$NDj5A$KDI2C$7$^$9!#(B@ref{Article Backlog}$B!"(B -@ref{Asynchronous Fetching} $B$*$h$S$=$NB>$O!"%G!<%?$r>e=q$-$7$FJ}$r%3%T!<$9$kI,MW$,$"(B -$B$j$^$9!#%0%k!<%W$r85$KLa$9$N$O!"%0%k!<%W%P%C%U%!$G(B @kbd{G m} $B%-!<$r;H$$(B -$B$^$9!#$=$N:G8e$N$NIaDL$N%0%k!<%W$N$h$&$K5-;v$rFI$_$^$9!#%0%k!<(B -$B%W%P%C%U%!(B (@pxref{Foreign Groups}) $B$N(B @kbd{G w} $BL?Na$K$h$C$F$*A[%5!<%P!$l$N?7$7$$%K%e!<%95-;v$r?7$7(B -$B$$(B gnus $B$N%0%k!<%W$H$7$F9XFI$7!"$3$l$i$N%0%k!<%W$KF~$k$3$H$G%3%a%s%H$rFI(B -$B$`$3$H$,$G$-$^$9!#(B($B=i4|@_Dj$N9XFIJ}K!$G$O!"?7$7$$%0%k!<%W$r%>%s%S$H$7$F(B -$B9XFI$9$k$3$H$KCm0U$7$F$/$@$5$$!#B>$NJ}K!$b;H$($^(B -$B$9(B (@pxref{Subscription Methods})$B!#(B - -$B$b$7$"$J$?$,8E$$(B @code{nnslashdot} $B%0%k!<%W$r:o=|$7$?$$$N$J$i$P!"(B -@kbd{G DEL} $B$,:G$b/$7(B @sc{html} $B$KJQ49$5$l$^$9!#FC$K!"(B@samp{> } $B$G0zMQ$5$l(B -$B$?%F%-%9%H$O$=$NBe$o$j$K(B @code{blockquote} $B$G0zMQ$5$l!"=pL>$K$O$=$l$>$l(B -$B$N9T$N:G8e$K(B @code{br} $B$,DI2C$5$l$^$9!#$=$l0J30$O!"%a%C%;!<%8%P%C%U%!$K(B -$BD>@\(B @sc{html} $B$r=q$/$3$H$,$G$-$^$9!#(BSlashdot $B$O$$$/$D$+(B @sc{html} $B$rA*(B -$BJL$9$k$3$H$K5$$r$D$1$F$/$@$5$$!#(B - -$B0J2<$NJQ?t$G?6$kIq$$$rJQ$($k$3$H$,$G$-$^$9(B: - -@table @code -@item nnslashdot-threaded -@code{nnslashdot} $B$,%0%k!<%W$r%9%l%C%I$GI=<($9$k$+$I$&$+!#=i4|CM(B -$B$O(B @code{t} $B$G$9!#%9%l%C%I$rI=<($G$-$k$?$a$K$O!"(B@code{nnslashdot} $B$O%0%k!<(B -$B%W$KF~$k:]$K$=$NA4$F$N%3%a%s%H$r$G$9!#(B - -@item nnslashdot-password -@vindex nnslashdot-password -$BEj9F;~$K;H$&%Q%9%o!<%I$G$9!#(B - -@item nnslashdot-directory -@vindex nnslashdot-directory -@code{nnslashdot} $B$,%U%!%$%k$rJ]B8$9$k>l=j$G$9!#=i4|CM(B -$B$O(B @samp{~/News/slashdot/} $B$G$9!#(B - -@item nnslashdot-active-url -@vindex nnslashdot-active-url -$B%K%e!<%95-;v$H%3%a%s%H$ruBV$KJ]$C$F$*$/$?$a$K>pJs$rF@$k$3$H$,2DG=$G(B -$B$9!#(B - -@code{nnultimate} $B$r;O$a$k$?$a$N0lHV4JC1$JJ}K!$O%0%k!<%W%P%C%U%!$G0J2<$N(B -$B$h$&$J$b$N$r$9$k$3$H$G$9(B: @kbd{B nnultimate RET -http://www.tcj.com/messboard.ubbcgi/ RET}$B!#(B($B6=L#$N$"$k2q5D<<(B -$B$N(B @sc{url} (@samp{Ultimate.cgi} $BEy$r:G8e$K4^$s$G$$$J$$$b$N(B) $B$KJQ$($F$/(B -$B$@$5$$!#(BUltimate $B%&%'%V%5%$%H$K$O$?$/$5$s5s$2$i$l$F$$$^$9!#(B) $B$=$l$+$i%5!<(B -$B%P!<%P%C%U%!$G6=L#$N$"$k%0%k!<%W$r9XFI$7!"%0%k!<%W%P%C%U%!$+$i$=$l$i$rFI(B -$B$s$G$/$@$5$$!#(B - -$B0J2<$N(B @code{nnutimate} $BJQ?t$rJQ992DG=$G$9(B: - -@table @code -@item nnultimate-directory -@vindex nnultimate-directory -@code{nnultimate} $B$,%U%!%$%k$rJ]B8$9$k%G%#%l%/%H%j!<$G$9!#=i4|CM(B -$B$O(B @samp{~/News/ultimate/} $B$G$9!#(B -@end table - -@node Web Archive -@subsection Web Archive -@cindex nnwarchive -@cindex Web Archive - -$B%a!<%j%s%0%j%9%H$NCf$K$ONc$($P!"(B -@uref{http://www.egroups.com/} $B$d(B @uref{http://www.mail-archive.com/} $B$N(B -$B$h$&$K%&%'%V%5!<%P!<$K$7$+%"!<%+%$%V$,L5$$$b$N$b$"$j$^$9!#$H$F$b@0A3$H$7(B -$B$FNI$$3&LL$G!"(Bgnus $B$,%0%k!<%W$r:G?7$N>uBV$KJ]$C$F$*$/$?$a$K>pJs$rF@$k$3(B -$B$H$,2DG=$G$9!#(B - -@code{nnwarchive} $B$r;O$a$k$?$a$N0lHV4JC1$JJ}K!$O%0%k!<%W%P%C%U%!$G0J2<$N(B -$B$h$&$J$b$N$r$9$k$3$H$G$9(B: @kbd{M-x gnus-group-make-warchive-group RET -an_egroup RET egroups RET www.egroups.comRET your@@email.address RET}$B!#(B -(@sc{an_egroup} $B$r9XFI$7$F$$$k%a!<%j%s%0%j%9%H$K!"(B -@sc{your@@emailaddress} $B$rEE;R%a!<%k%"%I%l%9$KCV$-49$($F$/$@$5$$!#(B) -$B$^$?$O(B @kbd{B nnwarchive RET mail-archive RET} $B$G%P%C%/%(%s%I$r%V%i%&%:(B -$B$7$F2<$5$$!#(B - -$B0J2<$N(B @code{nnwarchive} $BJQ?t$rJQ$($k$3$H$,2DG=$G$9(B: - -@table @code -@item nnwarchive-directory -@vindex nnwarchive-directory -@code{nnwarchive} $B$,%U%!%$%k$rJ]B8$9$k%G%#%l%/%H%j!<$G$9!#=i4|CM(B -$B$O(B @samp{~/News/warchive} $B$G$9!#(B - -@item nnwarchive-login -@vindex nnwarchive-login -$B%&%'%V%5!<%P!<$G$N%"%+%&%s%HL>$G$9!#(B - -@item nnwarchive-passwd -@vindex nnwarchive-passwd -$B%&%'%V%5!<%P!<$G$N%"%+%&%s%H$N%Q%9%o!<%I$G$9!#(B -@end table - -@node Web Newspaper -@subsection Web Newspaper -@cindex nnshimbun -@cindex Web Newspaper - -$B:G6a$G$O4v$D$+$N?7J9$,%&%'%V$G8x3+$5$l$F$$$^$9!#(BGnus $B$O$3$l$i$bE,@Z$K\$7$$$3$H$O0J2<$N%Z!<%8$GCN$k$3$H$,$G$-$^$9!#(B - -@example - @uref{http://emacs-w3m.namazu.org/} - @uref{http://ei5nazha.yz.yamagata-u.ac.jp/~aito/w3m/} -@end example - -@code{nnshimbun} $B$r;O$a$k$?$a$N0lHV4JC1$JJ}K!$O%0%k!<%W%P%C%U%!$G0J2<$N(B -$B$h$&$J$b$N$r$9$k$3$H$G$9(B: - -@example - @kbd{M-x gnus-group-make-shimbun-group RET asahi RET a_group RET} -@end example - -$B>e$N(B @samp{a_group} $B$O1\Mw$7$?$$5-;v%0%k!<%W$KCV$-49$($F$/$@$5$$!#(B -$B$^$?$O(B @kbd{B nnshimbun RET asahi RET} $B$G%P%C%/%(%s%I$r%V%i%&%:$7$F2<$5(B -$B$$!#2C$($F!"(B@sc{html} $B$N%I%-%e%a%s%H$r%$%s%i%$%sI=<($5$;$?$$>l9g$O!"(B -@file{~/.gnus} $B%U%!%$%k$K0J2<$N@_Dj$r$7$F2<$5$$!#(B - -@lisp -(setq mime-setup-enable-inline-html nil) -(eval-after-load "mime-view" - '(progn - (autoload 'mime-w3m-preview-text/html "mime-w3m") - (ctree-set-calist-strictly - 'mime-preview-condition - '((type . text) - (subtype . html) - (body . visible) - (body-presentation-method . mime-w3m-preview-text/html))) - (set-alist 'mime-view-type-subtype-score-alist - '(text . html) 3))) -@end lisp - -Web Newspaper $B$K4X$9$k0J2<$N(B @code{nnshimbun} $BJQ?t$rJQ$($k$3$H$,2DG=$G$9(B: - -@table @code -@item nnshimbun-directory -@vindex nnshimbun-directory -@code{nnshimbun} $B$,%U%!%$%k$rJ]B8$9$k%G%#%l%/%H%j!<$G$9!#=i4|CM(B -$B$O(B @samp{~/News/shimbun} $B$G$9!#(B -@end table - -@cindex group parameters -@code{nnshimbun} $B$O(B Gnus $B$,Ds6!$9$kHFMQ$N%0%k!<%W%Q%i%a!<(B -$B%?(B @footnote{$B%0%k!<%W%Q%i%a!<%?$r@_Dj$9$k$?$a$N:G$bl=j$K%+!<%=%k$,$"$k>uBV(B -$B$G(B @kbd{G c} $B$r%?%$%W$9$k$3$H$G$9(B (@xref{Group Parameters})$B!#(B} $B$K2C$($F!"(B -@code{nnshimbun} $B@lMQ$N%0%k!<%W%Q%i%a!<%?$rMxMQ$9$k$3$H$,$G$-$^$9!#$=$l(B -$B$i$O(B @code{nnshimbun-group-parameters} $B$H$$$&C10l$N%0%k!<%W%Q%i%a!<%?$K(B -$B$^$H$a$i$l$F$$$^$9$,!"$=$l$,3F%0%k!<%WKh$K;}$D$3$H$,$G$-$kCM$O%W%m%Q%F%#(B -$B%j%9%H$G!"Nc$($P/$J$/$J$j$^$9!#%0%k!<%W%Q%i%a!<(B -$B%?(B @code{prefetch-articles} $B$,@_Dj$5$l$F$$$J$$$+!"$=$NCM$,(B @code{nil} $B$K(B -$B$J$C$F$$$k%0%k!<%W$G$O!"%0%k!<%W%Q%i%a!<%?(B @code{prefetch-articles} $B$NBe(B -$B$o$j$K%G%#%U%)%k%HCM$H$7$FJQ?t(B @code{nnshimbun-pre-fetch-article} $B$NCM$,(B -$B;H$o$l$^$9!#$3$NJQ?t(B @code{nnshimbun-pre-fetch-article} $B$N=i4|CM(B -$B$O(B @code{off} $B$G$9!#(B - -@item encapsulate-images -@vindex nnshimbun-encapsulate-images -$B$3$N%0%k!<%W%Q%i%a!<%?$,(B @code{off} $B$^$?$O(B @code{nil} $B0J30$NCM$K%;%C%H$5(B -$B$l$F$$$k%0%k!<%W$G$O!"(B@code{nnshimbun} $B$O85$N5-;v$KKd$a9~$^$l$F$$$k2hA|(B -$B%G!<%?$r(B @samp{multipart/related} $B$N7A<0$G5-;v$K$O$a9~$_$^$9!#%0%k!<%W%Q(B -$B%i%a!<%?(B @code{encapsulate-images} $B$,@_Dj$5$l$F$$$J$$$+!"$=$NCM$,(B -@code{nil} $B$K$J$C$F$$$k%0%k!<%W$G$O!"%0%k!<%W%Q%i%a!<(B -$B%?(B @code{encapsulate-images} $B$NBe$o$j$K%G%#%U%)%k%HCM$H$7$FJQ(B -$B?t(B @code{nnshimbun-encapsulate-images} $B$NCM$,;H$o$l$^$9!#$3$NJQ(B -$B?t(B @code{nnshimbun-encapsulate-images} $B$N%G%#%U%)%k%HCM$O!"(B -@code{shimbun} $B%i%$%V%i%j$NJQ?t(B @code{shimbun-encapsulate-images} $B$NCM$G(B -$B$9(B ($B$?$V$s$=$N=i4|CM$O(B @code{t} $B$G$9(B)$B!#(B - -@item index-range -@vindex nnshimbun-index-range -$B%0%k!<%W%Q%i%a!<%?(B @code{index-range} $B$G!"%&%'%V%5!<%P!<$+$ie$KB8:_$9$kL\l9g$,(B -$B$"$j$^$9!#Nc$($P!"%a!<%j%s%0%j%9%H$N5-;v$rDs6!$7$F$$$k%5!<%P!<$N>l9g$O!"(B -$B$=$N5-;v$,Ej9F$5$l$?F|IU$K$h$C$FJ,N`$5$l$?L\l9g$O(B @code{last} $B$r(B -$B;H$C$F2<$5$$!#$3$&$9$k$H:G?7$NL\H$7$F?7Ce5-;v$N8!::$r9T$&$h$&(B -$B$K$J$j$^$9!#(B - -$B%0%k!<%W%Q%i%a!<%?(B @code{index-range} $B$,@_Dj$5$l$F$$$J$$$+!"CM(B -$B$,(B @code{nil} $B$K$J$C$F$$$k%0%k!<%W$G$O!"JQ(B -$B?t(B @code{nnshimbun-index-range} $B$NCM$,%G%#%U%)%k%H$H$7$F;H$o$l$^$9!#(B -$B$J$*!"(B@code{nnshimbun-index-range} $B$N%G%#%U%)%k%HCM$O(B @code{nil} $B$G$9!#(B - -@item nnshimbun-group-parameters-alist -@vindex nnshimbun-group-parameters-alist -@code{nnshimbun-group-parameters-alist} $B$O%+%9%?%^%$%:2DG=$J%f!<%6%*%W%7%g(B -$B%s$G!"3FMWAG$K%0%k!<%WL>$N@55,I=8=$H(B @code{nnshimbun} $B@lMQ$N%0%k!<%W%Q%i(B -$B%a!<%?$HF1$8%W%m%Q%F%#%j%9%H$r;}$D$3$H$,$G$-$kO"A[%j%9%H$G$9!#O"A[%j%9%H(B -$B$N3FMWAG$O$l%0%k!<%W%Q%i%a!<%?$r@_Dj$9$kBe$o$j$K;H$&$3$H$,(B -$B$G$-$^$9!#$b$7@55,I=8=$K%^%C%A$9$k%0%k!<%W$G%0%k!<%W%Q%i%a!<%?$N@_Dj$,9T(B -$B$J$o$l$F$$$?>l9g$O!"$=$N@_DjCM$NJ}$,M%@h$5$l$^$9!#(B -@end table - -@cindex article expiry -@cindex auto-expire -@cindex expiry-wait -@vindex nnmail-expiry-wait-function -@vindex nnmail-expiry-wait -$B$H$3$m$G(B @code{nnshimbun} $B%P%C%/%(%s%I$G$O!"5-;v$N4|8B@Z$l>C5n$r9T$J$&$3(B -$B$H$,$G$-$^$9(B @footnote{@code{nnshimbun} $B%0%k!<%W$G<+F04|8B@Z$l>C5n$r9T$J(B -$B$&J}K!$K$O$N@55,I=8=$r(B @code{gnus-auto-expirable-newsgroups} $B$KDI2C$7$F!">C5n$9(B -$B$k$^$G$NF|?t$r3F%0%k!<%WKh$K(B @code{nnmail-expiry-wait-function} $B$G;XDj$9(B -$B$k$3$H!#$b$&0l$D$O(B @code{nnshimbun} $B$N3F%0%k!<%WKh$K%0%k!<%W%Q%i%a!<(B -$B%?(B @code{auto-expire} $B$r(B @code{t} $B$K$7$F!"F1$8$/%0%k!<%W%Q%i%a!<(B -$B%?(B @code{expiry-wait} $B$G>C5n$9$k$^$G$NF|?t$r;XDj$9$k$d$jJ}$G$9!#>\$7$$$3(B -$B$H$O(B @xref{Expiring Mail} $B$r;2>H$7$F2<$5$$!#$J$*K\JT$G$b?($l$F$$$^$9$,!"(B -$B8D!9$KF|?t$r@_Dj$7$J$$>l9g$O%G%#%U%)%k%H$NCM$,E,MQ$5$l$^$9!#(B}$B!#$"$"!"$b(B -$B$A$m$s$"$J$?$,;0F|A0$N?7J95-;v$r>C5n$9$k$h$&$K@_Dj$7$?$+$i$H$$$C$F!"?7J9(B -$BC$($F$7$^$&$o$1$G$O$"$j$^$;$s!#>C$($k$N(B -$B$O$"$J$?8D?M$,;}$C$F$$$k(B @code{nnshimbun} $BMQ$N(B @sc{nov} $B%U%!%$(B -$B%k(B @footnote{@code{nnshimbun} $BMQ$N(B @sc{nov} $B%U%!%$%k$H(B -$B$O(B ``~/News/shimbun/asahi/national/.overview'' $B$N$h$&$J$b$N$G$9!#(B} $B$N3:(B -$BEv$9$kItJ,$G!"$=$l$K$h$C$F$=$N5-;v$OFsEY$H35N,%P%C%U%!$K8=$l$J$/$J$j$^$9!#(B - -@code{nnshimbun} $B%P%C%/%(%s%I$G$O5-;v$N4|8B@Z$l>C5n$r9T$J$o$J$$(B -$B$H(B @sc{nov} $B%U%!%$%k$,:]8BL5$/B@$jB3$1!"?7J9l9g$K$O!"2a5n$NA45-;v$rJ]M-$7$F(B -$B$$$k>l9g$,>/$J$/$J$$$G$7$g$&!#@N$"$J$?$,6=$8$?0lO"$N5-;v$rFI$_JV$7$F2{$+(B -$B$7$`$?$a$K!"$=$&$$$&%0%k!<%W$G$O4|8B@Z$l>C5n$O$5$;$?$/$J$$$H;W$&$+$b$7$l(B -$B$^$;$s!#(B - -$B$N%a!<%k%P%C%/%(%s%I$HF1MM$NJ}(B -$BK!$G%0%k!<%WKh$K<+F04|8B@Z$l>C5n2DG=$K$7$?$j!";D$7$F$*$/4|4V$r@_Dj$9$k$3(B -$B$H$,$G$-$k$N$G$9!#(B - -$B$?$@(B @code{nnshimbun} $B%P%C%/%(%s%I$N4|8B@Z$l>C5n$K$O!"B>$N%a!<%k%P%C%/%((B -$B%s%I$H>/$7$@$10c$&E@$,$"$j$^$9!#Bh0l$K!";D$7$F$*$/4|4V$N%G%#%U%)%k%HCM$K(B -@code{shimbun} $B%i%$%V%i%j$,Ds6!$9$kCM$,4X78$7!"0J2<$NM%@hEY$G4|4V$,7hDj(B -$B$5$l$k$3$H$G$9!#(B - -@example -$B%0%k!<%W%Q%i%a!<%?$N(B @code{expiry-wait} -@code{nnmail-expiry-wait-function} $B$rI>2A$7$?CM(B -@code{shimbun} $B%i%$%V%i%j$,Ds6!$9$k%0%k!<%WKh$N%G%#%U%)%k%HCM(B -@code{nnmail-expiry-wait} $B$NCM(B -@end example - -$BBhFs$K!"(B@code{nnmail-expiry-wait-function} $B$,4X?t$@$C$?>l9g$K!"$=$N0z?t(B -$B$KM?$($i$l$kJ8;zNs$K(B ``nnshimbin+asahi:national'' $B$N$h$&$K%P%C%/%(%s%I$H(B -$B%5!<%P!<$NL>A0$,4^$^$l$k$3$H$G$9!#B>$N%a!<%k%P%C%/%(%s%I$N>l9g$K$O%0%k!<(B -$B%WL>$@$1$,M?$($i$l$k$N$K!"$G$9!#0l$DNc$r5s$2$^$7$g$&!#(B - -@lisp -(setq nnmail-expiry-wait-function - (lambda (group) - (cond ((string-equal group "wl") 7) - ((string-equal group "nnshimbun+airs:wl") 'never)))) -@end lisp - -$B$3$l$O!"Nc$($P(B @code{nnml} $B$d(B @code{nnmh} $B$GC5n$9$k$,!"(B@code{nnshimbun} $B$GFI$`F1(B -$B$8%a!<%j%s%0%j%9%H$N%"!<%+%$%V$O$9$Y$FFI$a$k>uBV$K$7$F$*$/!"$H$$$&$3$H$G(B -$B$9!#$I$&$G$9!"$J$+$J$+8-$$$G$7$g(B? - -$BBh;0$K!"$3$l$O$"$J$?$,IT?3$K;W$C$?$H$-$K;W$$=P$7$F$/$l$k$3$H$r4|BT$7$F=q(B -$B$$$F$*$-$^$9$,!"%0%k!<%W$N$9$Y$F$N5-;v$,4|8B@Z$l>C5n$NBP>]$K$J$C$F$7$^$C(B -$B$?$H$-$K!"(B@code{nnshimbun} $B$O:G8e$N0lDL$@$1$O>C$5$:$K;D$7$F$*$-$^$9!#$3(B -$B$l$O$"$J$?$NL$N}?4$rK~B-$5$;$k$?$a$G$O$J$/!"%5!<%P!<$+$i8E$$5-;v$r:F$S$N:v$J$N$G$9!#(B - -@code{nnshimbun} $B$N4|8B@Z$l>C5n$K4X78$9$k%0%k!<%W%Q%i%a!<%?$HJQ?t$O0J2<(B -$B$NDL$j$G$9!#(B - -@table @code -@item expiry-wait -@cindex expiry-wait -$B$I$&$+:.Mp$J$5$i$J$$$h$&$K!#(Bgnus $B$,Ds6!$7$F$$$kHFMQ$N%0%k!<%W%Q%i%a!<(B -$B%?(B @code{expiry-wait} $B$HF1$8L>A0$G0UL#$bF1$8$b$N$,(B @code{nnshimbun} $B@lMQ(B -$B$N%0%k!<%W%Q%i%a!<%?$K$bMQ0U$5$l$F$$$^$9!#$"$J$?$O$I$A$i$r;H$C$F$b9=$$$^(B -$B$;$s!#$b$7(B @code{nnshimbun} $B@lMQ$N%0%k!<%W%Q%i%a!<%?$NJ}$r(B @code{nil} $B0J(B -$B30$NCM$K@_Dj$9$k$H!"HFMQ$N%0%k!<%W%Q%i%a!<%?$NCM$h$j$bM%@h$7$F;H$o$l$^$9!#(B -$B$3$l$O!"%0%k!<%W%P%C%U%!$G(B @kbd{G c} $B$r%?%$%W$7$?$H$-$K8=$l$kJT=82hLL$K(B -$B$*$$$F!"(B@code{nnshimbun} $B$K4X78$9$k$b$N$r0l2U=j$K=8$a$k$?$a$H!"%f!<%6%*(B -$B%W%7%g%s(B @code{nnshimbun-group-parameters-alist} $B$G0l3g$7$F4IM}$G$-$k$h(B -$B$&$K$9$k$3$H$rL\E*$KMQ0U$7$?$b$N$G$9(B @footnote{$B$J(B -$B$<(B @code{auto-expire} $B$J$I$b(B @code{nnshimbun} $B@lMQ$N%0%k!<%W%Q%i%a!<%?$K(B -$B4^$a$F$*$$$F$/$l$J$$$N(B? $B$H$$$&Ld$$$KBP$9$kEz$($rMQ0U$7$F$$$^$9!#(B -@code{expiry-wait} $B$r;2>H$9$k$N$,(B @code{nnshimbun} $B%P%C%/%(%s%I$J$N$KBP(B -$B$7$F!"(B@code{auto-expire} $B$J$I$r;2>H$9$k$N$O(B Gnus $B$NK\BN$J$N$G$9$,!"K\BN(B -$B$N5!G=$rFCDj$N%P%C%/%(%s%I$NLLE]$r8+$k$h$&$K3HD%$9$k$N$O!"(BGnus $B$N@_7W;W(B -$BA[$KH?$7$F$$$k$+$i$G$9!#(B}$B!#@_Dj$G$-$kCM$OHFMQ$N%0%k!<%W%Q%i%a!<%?$HF1MM(B -$B$K!";~8B>C5n$NF|?t!"(B@code{never} $B$^$?$O(B @code{immediate} $B$G$9!#(B - -@item nnshimbun-keep-unparsable-dated-articles -@vindex nnshimbun-keep-unparsable-dated-articles -$B$3$NJQ?t$NCM$,(B @code{nil} $B$G$J$$>l9g$O!":n@.$5$l$?$jAw?.$5$l$?;~9o$,$h$/(B -$B$o$+$i$J$$5-;v$r4|8B@Z$l>C5n$7$^$;$s!#$J$K$7$m4|8B$,$o$+$i$J$$$s$G$9$+$i!#(B -$B=i4|CM$O(B @code{t} $B$G$9$,!"(B@code{nil} $B$K$9$k$H4|8B@Z$l>C5n$N=hM}$,9T$J$o(B -$B$l$k$H$-$K!"4|8B$,$o$+$i$J$$5-;v$G$bM-L5$r8@$o$:>C$7$F$7$^$$$^$9!#$^$"!"(B -$BG/$NJk$l$NBgA]=|$N$H$-$K$G$b;H$C$F2<$5$$!#(B -@end table - -@node RSS -@subsection RSS -@cindex nnrss -@cindex RSS - -$B$$$/$D$+$N%5%$%H$O(B RDF site summary (RSS) $B$r;}$C$F$$$^(B -$B$9(B @uref{http://purl.org/rss/1.0/spec}$B!#$3$l$O$H$F$b5,B'E*$+$DNIo$K?7$7$/$7$F$*$/$?$a$N>pJs$rF@$k$3$H(B -$B$,$G$-$^$9!#(B - -$B4JC1$K(B @code{nnrss} $B$r;H$$;O$a$k$K$O!"%0%k!<%W%P%C%U%!(B -$B$G(B @kbd{B nnrss RET RET} $B$H%?%$%W$7$F!"%0%k!<%W$r9VFI$7$F2<$5$$!#(B - -$B0J2<$N(B @code{nnrss} $BJQ?t$,JQ992DG=$G$9(B: - -@table @code -@item nnrss-directory -@vindex nnrss-directory -@code{nnrss} $B$,%U%!%$%k$r=q$-9~$`%G%#%l%/%H%j!<$G!"%G%#%U%)%k%H(B -$B$O(B @samp{~/News/rss/} $B$G$9!#(B -@end table - -$B35N,%P%C%U%!$K@bL@$rI=<($5$;$?$$$J$i$P!"0J2<$N%3!<%I$,Lr$KN)$D$G$7$g$&!#(B - -@lisp -(add-to-list 'nnmail-extra-headers nnrss-description-field) -(setq gnus-summary-line-format "%U%R%z%I%(%[%4L: %-15,15f%]%) %s%uX\n") - -(defun gnus-user-format-function-X (header) - (let ((descr - (assq nnrss-description-field (mail-header-extra header)))) - (if descr (concat "\n\t" (cdr descr)) ""))) -@end lisp - -$B0J2<$N%3!<%I$O!"35N,%P%C%U%!$+$iD>@\(B nnrss $B$N(B url $B$r%*!<%W%s$9$k$N$KJXMx(B -$B$+$b$7$l$^$;$s!#(B -@lisp -(require 'browse-url) - -(defun browse-nnrss-url( arg ) - (interactive "p") - (let ((url (assq nnrss-url-field - (mail-header-extra - (gnus-data-header - (assq (gnus-summary-article-number) - gnus-newsgroup-data)))))) - (if url - (browse-url (cdr url)) - (gnus-summary-scroll-up arg)))) - -(eval-after-load "gnus" - #'(define-key gnus-summary-mode-map - (kbd "") 'browse-nnrss-url)) -(add-to-list 'nnmail-extra-headers nnrss-url-field) -@end lisp - -@node Customizing w3 -@subsection w3 $B$N%+%9%?%^%$%:(B -@cindex w3 -@cindex html -@cindex url -@cindex Netscape - -Gnus $B$O%&%'%V%Z!<%8$rH$5$;(B -$B$k$K$O$I$&$7$?$i$h$$$+!"$H$$$&$N$,$"$j$^$9!#0J2<$O0l$D$NJ}K!$G$9!#(B - -@lisp -(eval-after-load "w3" - '(progn - (fset 'w3-fetch-orig (symbol-function 'w3-fetch)) - (defun w3-fetch (&optional url target) - (interactive (list (w3-read-url-with-default))) - (if (eq major-mode 'gnus-article-mode) - (browse-url url) - (w3-fetch-orig url target))))) -@end lisp - -$B$3$l$r$"$J$?$N(B .emacs $B%U%!%$%k$K=q$-9~$`$3$H$K$h$C$F!"(BGnus $B$N5-;v%P%C%U%!(B -$B$G(B @sc{html} $B%j%s%/$rC!$1$P!"(B@code{browse-url} $B$r;H$C$F$=$N%j%s%/$r;2>H(B -$B$9$k$h$&$K$J$k$G$7$g$&!#(B - -@node Other Sources -@section $B$=$NB>$N%0%k!<%W8;(B - -Gnus $B$O$?$@C1$K%K%e!<%9$d%a!<%k$rFI$`0J>e$N$3$H$,$G$-$^$9!#0J2<(B -$B$K<($9J}K!$K$h$C$F!"(Bgnus $B$G%G%#%l%/%H%j!<$d%U%!%$%k$r!"$"$?$+$b(B -$B%K%e!<%9%0%k!<%W$G$"$k$+$N$h$&$K1\Mw$9$k$3$H$,$G$-$k$h$&$K$J$j$^(B -$B$9!#(B - -@menu -* Directory Groups:: $B%G%#%l%/%H%j!<$r%K%e!<%9%0%k!<%W$N$h$&$K(B - $BFI$`(B -* Anything Groups:: Dired? $BC/$,(B dired $B$J$s$F;H$&$N(B? -* Document Groups:: $B8DJL$N%U%!%$%k72$O%0%k!<%W$NAG(B -* SOUP:: @sc{soup} $B%Q%1%C%H$r(B ``$B%*%U%i%$%s(B'' $B$GFI$`(B -* Mail-To-News Gateways:: $B%a!<%k$+$i%K%e!<%9$X$N%2!<%H%&%'%$$rDL$7(B - $B$F5-;v$rEj9F$9$k(B -* IMAP:: Gnus $B$r(B IMAP $B$N%/%i%$%"%s%H$H$7$F;H$&(B -@end menu - -@node Directory Groups -@subsection $B%G%#%l%/%H%j!<%0%k!<%W(B -@cindex nndir -@cindex directory groups - -$B$b$7!"$?$/$5$s$N5-;v$,8DJL$N%U%!%$%k$H$7$FF~$C$F$$$k%G%#%l%/%H%j!<$,$"$l(B -$B$P!"$=$l$r%K%e!<%9%0%k!<%W$H$7$F07$&$3$H$,$G$-$^$9!#$b$A$m$s!"%U%!%$%k$O(B -$B?t;z$N%U%!%$%kL>$r$b$C$F$$$J$1$l$P$J$j$^$;$s!#(B - -$B$3$3$G(B Emacs $B$NAG@2$i$7$$%Q%C%1!<%8$NCf$G$b:G$bAG@2$i$7(B -$B$$(B @code{ange-ftp} ($B$H$=$N8e7Q$N(B @code{efs}) $B$K$D$$$F?($l$kNI$$5!2q$G$7$g(B -$B$&!#;d$,(B @code{nndir} $B$r=q$$$?$H$-$O!"$3$l(B --- $B%G%#%l%/%H%j!<$rFI$`%P%C(B -$B%/%(%s%I$K$D$$$F$O$"$^$j9M$($F$$$^$;$s$G$7$?!#$H$s$G$b$J$$$3$H$@$M!#(B - -@code{ange-ftp} $B$O$3$N>p67$r7`E*$KJQ2=$5$;$^$7$?!#Nc$($P!"(B -@code{ange-ftp} $B%U%!%$%k(B -$BL>(B @file{/ftp.hpc.uh.edu:/pub/emacs/ding-list/} $B$r%G%#%l%/%H%j!$H$7$F(B -$BF~NO$7$?$H$9$k$H!"(B@code{ange-ftp} $B$"$k$$$O(B @code{efs} $B$OC5n$r9T$J$&$3$H$O$G$-$^$;$s!#(B@code{nndir} $B$,;H$($k(B -$B$b$N$J$i2?$G$b(B @code{nnmh} $B$"$k$$$O(B @code{nnml} $B$r;H$&$3$H$,$G$-$k$N$G!"(B -$B$b$7FI$_=P$7@lMQ$G$O$J$$(B @code{nndir} $B$,I,MW$@$H;W$C$?$i!"$3$l$i$N$I$A$i(B -$B$+$NJ}K!$K@Z$jBX$($k$3$H$b$G$-$^$9!#(B - -@node Anything Groups -@subsection $B$J$s$G$b%0%k!<%W(B -@cindex nneething - -($B0l$D$N%9%W!<%kIw%G%#%l%/%H%j!<$H2r$lA':w$7$F$^$o$j$^$9!#$b$7$=$N%U%!%$%k$,5-;v$N$h$&$K8+$((B -$B$?$J$i(B ($B$9$J$o$A!":G=i$N?t9T$,%X%C%@!<$N$h$&$K8+$($?$i(B) $B$=$l$r%X%C%@$H$7(B -$B$F;H$$$^$9!#$b$7$=$l$,%X%C%@!<$N$J$$$?$@$NE,Ev$J%U%!%$%k(B ($BNc$($P(B C $B$N%=!<(B -$B%9%U%!%$%k(B) $B$G$"$C$?$J$i!"(B@code{nneething} $B$O%X%C%@!<$r5u6u$+$i:n$j=P$7(B -$B$^$9!#$3$l$O%U%!%$%k$N=jM-A0!"F|IU$r;H$$!"$3$l$i$NMWAG$KBP$7$F$G$-(B -$B$k$3$H$r2?$G$b$d$j$^$9!#(B - -$B$3$l$O$"$J$?$K$H$C$F$OA4$F<+F0E*$K5/$3$k$3$H$G!"$"$J$?$O%K%e!<%9%0%k!<%W(B -$B$K$H$F$bNI$/;w$?2?$+$r8+$;$i$l$k$3$H$K$J$k$G$7$g$&!#$[$s$H$&$K@#J,0c$o$J(B -$B$$!"%K%e!<%9%0%k!<%W$N$h$&$J$b$N$r!#5-;v$rA*Br$9$k$H!"$=$l$O$$$D$b$N$h$&(B -$B$K!"5-;v%P%C%U%!$KI=<($5$l$k$G$7$g$&!#(B - -$B%G%#%l%/%H%j!<$rI=$o$7$F$$$k9T$rA*Br$9$k$H!"(Bgnus $B$O$"$J$?$r$3(B -$B$N(B @code{nneething} $B%0%k!<%W$N$?$a$N?7$7$$35N,%P%C%U%!$KO"$l$F9T$/$G$7$g(B -$B$&!#0J2pJs$r21$($F$*$-$^$;$s!#$b$7(B @kbd{G m} $B$GIaDL$K8G(B -$BDj(B @code{nneething} $B%0%k!<%W$r:n$k$H!"(Bgnus $B$O5-;vHV9f$H%U%!%$%kL>$NBP1~(B -$BI=$r21$($F$*$-!"$3$N%0%k!<%W$rB>$N%0%k!<%W$HF1MM$K07$&$3$H$,$G$-$k$h$&$K(B -$B$J$j$^$9!#8GDj(B @code{nneething} $B%0%k!<%W$r:nF0$5$;$k$H!"L$FI5-;v$,$$$/$D(B -$B4^$^$l$F$$$k$+$rCN$i$5$l$?$j!"$J$I$J$I!#(B - -$B$$$/$D$+$NJQ?t$,$"$j$^$9!#(B - -@table @code -@item nneething-map-file-directory -@vindex nneething-map-file-directory -$BA4$F$N8GDj(B @code{nneething} $B%0%k!<%W$NBP1~I=$O$3$N%G%#%l%/%H%j!<$K3JG<$5(B -$B$l$^$9!#$3$N=i4|@_DjCM$O(B @file{~/.nneething/} $B$G$9!#(B - -@item nneething-exclude-files -@vindex nneething-exclude-files -$B$3$N@55,I=8=$K%^%C%A$9$k%U%!%$%k$O$9$Y$FL5;k$5$l$^$9!#<+F0J]B8%U%!%$%k$J(B -$B$I$r=|$/$N$KJXMx$K;H$($^$9!#$=$7$F$=$l$,$^$5$K=i4|@_Dj$G9T$J$o$l$kF0:n$G(B -$B$9!#(B - -@item nneething-include-files -@vindex nneething-include-files -$B$=$N%U%!%$%k$r%0%k!<%W$K4^$a$k$+$r<($9@55,I=8=$G$9!#$3$NJQ?t(B -$B$,(B @code{nil} $B$G$J$1$l$P!"$3$N@55,I=8=$K9gCW$9$k%U%!%$%k$@$1$,4^$^$l$^$9!#(B - -@item nneething-map-file -@vindex nneething-map-file -$BBP1~I=%U%!%$%k$NL>A0!#(B -@end table - -@node Document Groups -@subsection $BJ8=q%0%k!<%W(B -@cindex nndoc -@cindex documentation group -@cindex help group - -@code{nndoc} $B$O0l$D$N%U%!%$%k$r%K%e!<%9%0%k!<%W$H$7$FFI$`$3$H$r$G$-$k$h(B -$B$&$K$9$k!"$A$g$C$H5$$NMx$$$?$d$D$G$9!#$$$/$D$+$N%U%!%$%kAw7A<0!#(B -@cindex forwarded messages - -@item forward -$BE>Aw$5$l$?5-;v!#(B - -@item nsmail -Netscape mail box$B!#(B - -@item mime-digest -@item mime-parts -MIME $BB>ItJ,%a%C%;!<%8(B (multipart) $B$G$9!#(B - -@item standard-digest -$BI8=`(B (RFC 1153) $B$^$H$aAw$j7A<0!#(B - -@item slack-digest -$BHsI8=`$^$H$aAw$j7A<0(B --- $B$@$$$?$$$O$&$^$/%^%C%A$9$k$,!"$G$b07$$$O2<J,$J%X%C%@!<$rA^F~$7$h(B -$B$&$H$7$?$j$O$7$^$;$s(B --- $BC1=c$K!"%U%!%$%k$r$=$N%0%k!<%W$NA[%5!<%P!A0(B (@dfn{name}) $B$H$=$l$KB3$/@55,I=8=$H2>A[JQ?t@_(B -$BDj$NNs$+$i$J$j$^$9!#0J2<$,$3$l$K;H$($kJQ?t$G$9(B --- $BJQ?t$N?t$K05E]$5$l$J(B -$B$$$G$/$@$5$$!#$[$H$s$I$NJ8=ql9g!"$3$l$O5-;v$N@hF,$K%]%$%s%H$r0\F0$5$;$k4X?t$G$J$/$F$O$J$j(B -$B$^$;$s!#(B - -@item nndoc-head-begin -$B$3$l$,$"$k>l9g!"$3$l$O5-;v$N%X%C%@!<$K%^%C%A$9$k@55,I=8=$G$J$/$F$O$J$j$^(B -$B$;$s!#(B - -@item nndoc-head-end -$B$3$l$O5-;v$N%X%C%@!<$N:G8e$K%^%C%A$7$J$/$F$O$J$j$^$;$s!#$3$N=i4|@_DjCM(B -$B$O(B @samp{^$} --- $B6u9T$G$9!#(B - -@item body-begin-function -$B$3$l$,$"$k>l9g!"$3$N4X?t$O5-;v$N%\%G%#$N3+;O0LCV$K%]%$%s%H$r0\F0$5$;$k4X(B -$B?t$G$J$/$F$O$J$j$^$;$s!#(B - -@item body-begin -$B$3$l$O5-;v$N%\%G%#$N3+;O0LCV$K%^%C%A$7$J$/$F$O$J$j$^$;$s!#$3$N=i4|@_DjCM(B -$B$O(B @samp{^\n} $B$G$9!#(B - -@item body-end-function -$B$3$l$,$"$k>l9g!"$3$N4X?t$O5-;v$N%\%G%#$N:G8e$N0LCV$K%]%$%s%H$r0\F0$5$;$k(B -$B4X?t$G$J$/$F$O$J$j$^$;$s!#(B - -@item body-end -$B$3$l$,$"$l$P!"5-;v$N%\%G%#$N:G8e$K%^%C%A$7$J$/$F$O$J$j$^$;$s!#(B - -@item file-end -$B$3$l$,$"$k>l9g!"$3$l$O%U%!%$%k$N:G8e$K%^%C%A$7$J$/$F$O$J$j$^$;$s!#$3$N@5(B -$B5,I=8=$N8e$m$N%F%-%9%H$OA4$F!"40A4$KL5;k$5$l$^$9!#(B -@end table - -$B$3$N$h$&$K!"$3$l$i$NJQ?t$r;H$C$F(B @code{nndoc} $B$OJ8=q%U%!%$%k$r!"$=$l$>$l(B -$B%X%C%@!<$H%\%G%#$r;}$C$?5-;v$NO"$J$j$H$7$F2rK6$9$k$3$H$,$G$-$^$9!#$7$+$7!"(B -$BA4$F$NJ8=ql9g$KM-MQ$G$9!#(B - -@item article-transform-function -$B$3$l$,$"$l$P!"$3$N4X?t$O5-;v$,MW5a$5$l$?$H$-$K8F$S=P$5$l$^$9!#$3$l$O!"5-(B -$B;v$N%X%C%@!<$H%\%G%#$NN>J}$K$h$j9-HO0O$JJQ7A$r9T$J$&$?$a$K;H$o$l$k$b$N$G(B -$B$9!#(B - -@item generate-head-function -$B$3$l$,$"$l$P!"$3$N4X?t$O(B gnus $B$,M}2r$G$-$k%X%C%@!<$r@8@.$9$k$?$a$K8F$S=P(B -$B$5$l$^$9!#$3$l$O5-;vHV9f$r%Q%i%a!<%?$H$7$F8F$S=P$5$l!"LdBj$N5-;v$N$-$l$$(B -$B$J%X%C%@!<$r@8@.$9$k$3$H$r5a$a$i$l$^$9!#$3$l$OA4$F$N5-;v$N%X%C%@!<$,MW5a(B -$B$5$l$k$H$-$K8F$S=P$5$l$^$9!#(B -@end table - -$B;d$,:n$C$?Cf$G:G$bJ#;($JNc(B --- $BI8=`$^$H$aAw$j7A<0$r8+$F$_$^$7$g$&!#(B - -@example -(standard-digest - (first-article . ,(concat "^" (make-string 70 ?-) "\n\n+")) - (article-begin . ,(concat "\n\n" (make-string 30 ?-) "\n\n+")) - (prepare-body-function . nndoc-unquote-dashes) - (body-end-function . nndoc-digest-body-end) - (head-end . "^ ?$") - (body-begin . "^ ?\n") - (file-end . "^End of .*digest.*[0-9].*\n\\*\\*\\|^End of.*Digest *$") - (subtype digest guess)) -@end example - -70 $BJ8;z$N%@%C%7%e(B(`-')$B$N9T$h$jA0$OA4$FL5;k$5$l$k$H$$$&$N$,J,$+$j$^$9!#$^(B -$B$?(B @samp{^End of} $B$G;O$^$k9T$h$j8e$m$bA4$FL5;k$5$l$^$9!#3F5-;v$O(B 30 $BJ8;z(B -$B$N%@%C%7%e$N9T$G;O$^$j!"%X%C%@!<$H%\%G%#$N6h@Z$j$N9T$O0l8D$N%9%Z!<%9$r4^(B -$B$`$3$H$,$"$j!"$=$7$F%\%G%#$O$=$l$,EO$5$l$kA0(B -$B$K(B @code{nndoc-unquote-dashes} $B$rDL$5$l$^$9!#(B - -$B$"$J$?FH<+$NJ8=qDj5A$r(B @code{nndoc} $B$K@\B3$9$k$K$O!"(B -@code{nndoc-add-type} $B4X?t$r;HMQ$7$^$9!#$3$l$OFs$D$N%Q%i%a!<%?$r$H$j$^(B -$B$9(B --- $B0l$DL\$O$=$NDj5A<+?H$G!"Fs$DL\$N(B ($B>JN,2DG=$J(B) $B%Q%i%a!<%?$O$3$NDj(B -$B5A$r!"J8=ql9g$O(B @code{nil} $B$rJV$7!"$=(B -$B$Nl9g$O(B @code{t} $B$rJV$7!"$=$N$_$=$K3Z$r$5$;$kJ}$r$9$k$N$b;~$K$OJXMx$G$9!#(B - -@sc{soup} $B$H8F$P$l$k%U%!%$%k7A<0$O%K%e!<%9$H%a!<%k$r%5!<%P!<$+$i2H$N%^%7(B -$B%s$X$HE>Aw$7!"$=$l$r$^$?La$9$?$a$K3+H/$5$l$^$7$?!#$A$g$C$HLLE]$/$5$$$+$b(B -$B$7$l$J$$$1$I$M!#(B - -$B$O$8$a$K$$$/$D$+MQ8l$r!#(B - -@table @dfn -@item server -$B$3$l$O30$N@$3&$K7R$,$C$F$$$F!"$"$J$?$,%K%e!<%9$H%a!<%k$rAw$N@$3&$H$$$+$J$k7A$G$b@\B3$5$l$F$$$^$;$s!#(B - -@item packet -$B%a%C%;!<%8$HL?Na$r4^$s$@$b$N!#%Q%1%C%H$K$OFsA0$G$9!#$3$3$G(B @var{x} $B$O?t;z$G$9!#(B - -@item response packets -($BJV?.%Q%1%C%H(B) $B$3$N%Q%1%C%H$O<+Bp%^%7%s$G:n$i$l$k%Q%1%C%H$G!"IaDL$O$"$J(B -$B$?$N=q$$$?JV;v$,4^$^$l$F$$$^$9!#$3$l$i$O=i4|@_Dj$G(B -$B$O(B @file{SoupinX.tgz} $B$H$$$&L>A0$G$9!#$3$3$G(B @var{x} $B$O?t;z$G$9!#(B -@end table -@end table - -@enumerate - -@item -$B$^$:(B @sc{soup} $B%Q%1%C%H$r:n$k$?$a$K%5!<%P!<$K%m%0%$%s$7$^$9!#(B -@sc{soup} $B$N$?$a$N@lMQ$N%V%D(B (@code{awk} $B%W%m%0%i%`$N$h$&$J(B) $B$r;H$C$F$b(B -$BNI$$$7!"(Bgnus $B$N(B @sc{soup} $BL?Na$r;H$C$F%Q%1%C%H$r:n$C$F$bNI$$$G(B -$B$9(B (@kbd{O s} $B$"$k$$$O(B @kbd{G s b} $B$=$7$F(B @kbd{G s p}) - -(@pxref{SOUP Commands})$B!#(B - -@item -$B%Q%1%C%H$r<+Bp$KE>Aw$7$^$9!#EEAw$7$^$9!#(B - -@item -Gnus $B$+$i(B @kbd{G s s} $BL?Na$r;H$C$F$3$N%Q%1%C%H$+$i%a!<%k$r=P$7$^$9!#(B - -@item -$B$"$H$O$3$l$r;`$L$^$GB3$1$^$9!#(B - -@end enumerate - -$B$D$^$j4pK\E*$KFs$$$^$9!#(B - -@item G s w -@kindex G s w (Group) -@findex gnus-soup-save-areas -$BA4$F$N(B @sc{soup} $B%G!<%?%U%!%$%k$rJ]B8$7$^(B -$B$9(B (@code{gnus-soup-save-areas})$B!#(B - -@item G s s -@kindex G s s (Group) -@findex gnus-soup-send-replies -$BJV?.%Q%1%C%H$+$iA4$F$NJV?.$rAw=P$9$k(B (@code{gnus-soup-send-replies})$B!#(B - -@item G s p -@kindex G s p (Group) -@findex gnus-soup-pack-packet -$BA4$F$N%U%!%$%k$r(B @sc{soup} $B%Q%1%C%H$K:-Jq$9(B -$B$k(B (@code{gnus-soup-pack-packet})$B!#(B - -@item G s r -@kindex G s r (Group) -@findex nnsoup-pack-replies -$BA4$F$NJV?.$rJV?.%Q%1%C%H$K:-Jq$9$k(B (@code{nnsoup-pack-replies})$B!#(B - -@item O s -@kindex O s (Summary) -@findex gnus-soup-add-article -$B$3$N35N,%b!<%IL?Na$O!"8=:_$N5-;v$r(B @sc{soup} $B%Q%1%C%H$KDI2C$7$^(B -$B$9(B (@code{gnus-soup-add-article})$B!#$3$l$O%W%m%;%9(B/$B@\F,0z?t$N=,47$K=>$$$^(B -$B$9(B (@pxref{Process/Prefix})$B!#(B -@end table - -gnus $B$,$3$l$i$N!#=i4|@_DjCM(B -$B$O(B @samp{gnus-prefix}$B!#(B - -@item gnus-soup-packer -@vindex gnus-soup-packer -@sc{soup} $B%Q%1%C%H$r:-Jq$9$kL?NaJ8;zNs$N7A<0!#=i4|@_DjCM(B -$B$O(B @samp{tar cf - %s | gzip > $HOME/Soupout%d.tgz}$B!#(B - -@item gnus-soup-unpacker -@vindex gnus-soup-unpacker -@sc{soup} $B%Q%1%C%H$rl=j!#=i4|@_DjCM$O(B @file{~/}$B!#(B - -@item gnus-soup-packet-regexp -@vindex gnus-soup-packet-regexp -@code{gnus-soup-packet-directory} $BFb$N(B @sc{soup} $B%Q%1%C%H$K%^%C%A$9$k@5(B -$B5,I=8=!#(B -@end table - -@node SOUP Groups -@subsubsection @sc{soup} $B%0%k!<%W(B -@cindex nnsoup - -@code{nnsoup} $B$O(B @sc{soup} $B%Q%1%C%H$rFI$`$?$a$N%P%C%/%(%s%I$G$9!#$3$l$O(B -$BF~$C$F$-$?%Q%1%C%H$rFI$_!"$=$l$r$l$N%a%C%;!<%8$H:w0z%U%!%$%k$r$3$N%G%#%l%/(B -$B%H%j!<$K0\F0$5$;$k!#=i4|@_Dj$O(B @file{~/SOUP/}$B!#(B - -@item nnsoup-replies-directory -@vindex nnsoup-replies-directory -$BA4$F$NJV?.$O!"JV?.%Q%1%C%H$K:-Jq$5$l$kA0$K$3$N%G%#%l%/%H%j!<$K3JG<$5$l$k!#(B -$B=i4|@_Dj$O(B @file{~/SOUP/replies/"}$B!#(B - -@item nnsoup-replies-format-type -@vindex nnsoup-replies-format-type -$BJV?.%Q%1%C%H$N(B @sc{soup} $B7A<0!#=i4|@_DjCM(B -$B$O(B @samp{?n} (rnews) $B$G!"$3$NJQ?t$K$O?($k$Y$-$G$O$J$$$H;d$O;W$$$^$9!#$?(B -$B$V$sJ8=q$KL@5-$9$Y$-$G$5$($J$+$C$?$M!#$A$'$C(B! $B$b$&pJs$r3JG<$9$k>l=j!#$3$l$O(B @code{nntp} $B$N0UL#(B -$B$G$N(B ``$B%"%/%F%#%V%U%!%$%k(B'' $B$G$O$J$/!"(BEmacs Lisp $B$N%U%!%$%k$G$9!#$3$N%U%!(B -$B%$%k$rL5$/$7$F$7$^$C$?$j!"2?$+2u$7$F$7$^$C$?$i!"$"$J$?$O;`$K$^$9!#=i4|@_(B -$BDjCM$O(B @file{~/SOUP/active} $B$G$9!#(B - -@item nnsoup-packer -@vindex nnsoup-packer -$BJV?.(B @sc{soup} $B%Q%1%C%H$r:-Jq$9$kL?NaJ8;zNs$N7A<0!#=i4|@_DjCM(B -$B$O(B @samp{tar cf - %s | gzip > $HOME/Soupin%d.tgz}$B!#(B - -@item nnsoup-unpacker -@vindex nnsoup-unpacker -$BF~$C$F$/$k(B @sc{soup} $B%Q%1%C%H$rl=j!#=i4|@_DjCM$O(B @file{~/}$B!#(B - -@item nnsoup-packet-regexp -@vindex nnsoup-packet-regexp -$BF~$C$F$-$?(B @sc{soup} $B%Q%1%C%H$K%^%C%A$9$k@55,I=8=!#=i4|@_DjCM(B -$B$O(B @samp{Soupout}$B!#(B - -@item nnsoup-always-save -@vindex nnsoup-always-save -@code{nil} $B0J30$G$"$l$P!"%a%C%;!<%8$rEj9F$7$?8e$KJV?.%P%C%U%!$rJ]B8$9$k!#(B -@end table - -@node SOUP Replies -@subsubsection SOUP $BJV?.(B - -$BC1$K(B @code{nnsoup} $B$r;H$&$@$1$G$O!"(B@sc{soup} $BJV?.%Q%1%C%HCf$N$"$J$?$NEj(B -$B9F$H%a!<%k$NAw?.$,!"KbK!$N$h$&$K<+F0E*$K=*N;$9$k$o$1$G$O$"$j$^$;$s!#$=$l(B -$B$r5/$3$9$K$O$b$&$A$g$C$HF/$+$J$/$F$O$$$1$^$;$s!#(B - -@findex nnsoup-set-variables -@code{nnsoup-set-variables} $BL?Na$O!"$"$J$?$NA4$F$N%U%)%m!<%"%C%W5-;v$HJV(B -$B?.$r(B @sc{soup} $B%7%9%F%`$K3No$K;w$F$$$F!"$=$N%5!<%P!<$N%M%C%H%o!<%/%"(B -$B%I%l%9$r;XDj$9$k$@$1$K$J$C$F$$$^$9!#(B - -@sc{imap} $B$K$OFs$D$NFCH$7$F2<$5$$!#(B - -@sc{imap} $B$r%a!<%k$rCyB"$9$k%W%m%H%3%k$H$7$F;H$$$?$$$H$-$O!"(B -gnus-secondary-select-methods $B$K(B nnimap $B$rEPO?$7$F2<$5$$!#$3$l$K$h$C(B -$B$F(B gnus $B$O(B @sc{imap} $B%5!<%P!<$KCyB"$5$l$F$$$k%a!<%k$rA`:n$9$k$h$&$K$J$j(B -$B$^$9!#$3$l$,$3$3$G@bL@$9$k;H$$J}$G$9!#(B - -$B$$$/$D$+$N(B @sc{imap} $B%5!<%P!<$r(B @code{~/.gnus} $B$G@_Dj$9$k$H!"$?$V$s$3$N(B -$B$h$&$J$b$N$K$J$k$G$7$g$&(B: - -@lisp -(setq gnus-secondary-select-methods - '((nnimap "simpleserver") ; $BIaDL$N@_Dj(B - ; SSH $B%]!<%H$r%U%)%o!<%I$7$?%5!<%P!<(B: - (nnimap "dolk" - (nnimap-address "localhost") - (nnimap-server-port 1430)) - ; $B%m!<%+%k%[%9%H$G1?E>$7$F$$$k(B UW $B%5!<%P!<(B: - (nnimap "barbar" - (nnimap-server-port 143) - (nnimap-address "localhost") - (nnimap-list-pattern ("INBOX" "mail/*"))) - ; $BF?L>$G;H$($k(B cyrus $B$N8x=0%5!<%P!<(B: - (nnimap "cyrus.andrew.cmu.edu" - (nnimap-authenticator anonymous) - (nnimap-list-pattern "archive.*") - (nnimap-stream network)) - ; $BI8=`$G$O$J$$%]!<%H$N(B SSL $B%5!<%P!<(B: - (nnimap "vic20" - (nnimap-address "vic20.somewhere.com") - (nnimap-server-port 9930) - (nnimap-stream ssl)))) -@end lisp - -$B0J2<$NJQ?t$O2>A[(B @code{nnimap} $B%5!<%P!<$r:n@.$9$k$?$a$K;H$&$3$H$,$G$-$^(B -$B$9!#(B - -@table @code -@item nnimap-address -@vindex nnimap-address - -$B1s3V(B IMAP $B%5!<%P!<$N%"%I%l%9$G$9!#;XDj$5$l$F$$$J$$>l9g$O2>A[%5!<%P!<$N$b(B -$B$N$K$J$j$^$9!#(B - -@item nnimap-server-port -@vindex nnimap-server-port -$B@\B3$r;n$_$k%5!<%P!<$N%]!<%H$G$9!#=i4|CM$G$O!"%]!<%H(B 143 $B$+!"(BSSL $B$G(B -$B$O(B 993 $B$G$9!#(B - -$B$3$l$O@0?t$G$J$1$l$P$J$j$^$;$s!#0J2<$O%5!<%P!<;XDj$NNc$G$9!#(B - -@lisp -(nnimap "mail.server.com" - (nnimap-server-port 4711)) -@end lisp - -@item nnimap-list-pattern -@vindex nnimap-list-pattern -$B;HMQ2DG=$J%a!<%k%\%C%/%9$r@)8B$9$k$?$a$NJ8;zNs$+%j%9%H$G$9!#$3$l$O!"%5!<(B -$B%P!<$KHs>o$KB?$/$N%a!<%k%\%C%/%9$,$"$k$1$l$I!"6=L#$N$"$k$b$N$O>/$7$@$1$G(B -$B$"$k$H$-$K;HMQ$7$^$9!#%5!<%P!<$K$O%[!<%`%G%#%l%/%H%j!<$r(B IMAP $B7PM3$G=P$9(B -$B$b$N$b$"$j$^$9$N$G!"$=$N>l9g$O$*$=$i$/%a!<%k%\%C%/%9(B -$B$r(B @file{~/Mail/*} $B$K@)8B$7$?$$$G$7$g$&!#(B - -$BJ8;zNs$O(B REFERENCE $B$H>e$NJ8;zNs$H$N(B cons $B$G$"$k$3$H$b$G$-$^$9!#$I(B -$B$N(B REFERENCE $B$,;HMQ$5$l$k$+$O%5!<%P!l9g!"JQ(B -$B?t(B @code{imap-shell-program} $B$O2?$N%W%m%0%i%`$r8F$V$+$r;XDj$7$^$9!#(B - -@item nnimap-authenticator -@vindex nnimap-authenticator - -$B%5!<%P!<$K@\B3$9$k$?$a$K;H$o$l$kG'>Z$G$9!#=i4|@_Dj$G$O!"(Bnnimap $B$O%5!<%P!<(B -$B$,;HMQ2DG=$J0lHV0BA4$JG'>Z$r;HMQ$7$^$9!#(B - -$B0J2<$O%5!<%P!<;XDj$NNc$G$9!#(B - -@lisp -(nnimap "mail.server.com" - (nnimap-authenticator anonymous)) -@end lisp - -@code{nnimap-authenticator} $B$NCM$O%7%s%\%k$G$J$1$l$P$J$i$J$$$3$H$KCm0U$7(B -$B$F2<$5$$(B! - -@itemize @bullet -@item -@dfn{gssapi:} GSSAPI ($BIaDL$O(B kerberos 5) $BG'>Z$G$9!#30It%W%m%0%i(B -$B%`(B @code{imtest} $B$,I,MW$G$9!#(B -@item -@dfn{kerberos4:} Kerberos $BG'>Z$G$9!#30It%W%m%0%i%`(B @code{imtest} $B$,I,MW(B -$B$G$9!#(B -@item -@dfn{digest-md5:} DIGEST-MD5 $B$G0E9f2=$5$l$?(B $BMxMQ(B/$B%Q%9%o!<%I(B $B$G$9!#30(B -$BIt%i%$%V%i%j(B @code{digest-md5.el} $B$,I,MW$G$9!#(B -@item -@dfn{cram-md5:} CRAM-MD5 $B$G0E9f2=$5$l$?(B $BMxMQ(B/$B%Q%9%o!<%I(B $B$G$9!#(B -@item -@dfn{login:} LOGIN $B7PM3$G$N@8$N(B $BMxMQ(B/$B%Q%9%o!<%I(B $B$G$9!#(B -@item -@dfn{anonymous:} $BEE;R%a!<%k%"%I%l%9$r%Q%9%o!<%I$H$7!"(B`anonymous' $B$H$7$F(B -$B%m%0%$%s$7$^$9!#(B -@end itemize - -@item nnimap-expunge-on-close -@cindex Expunging -@vindex nnimap-expunge-on-close - -$B%Q%k%a%K%G%9$H0c$C$F!"(BIMAP $B$N@_7W\$7$/@bL@$9$k$H!"(BIMAP $B$OC(B -$B5n$7$J$$!"5-;v$K(B @code{Deleted} $B$H$$$&0u$rIU$1$k35G0$,$"$j!"$3$l(B ($B$($C(B -$B$H!"(B@code{Deleted} $B$H$$$&0u$rIU$1$k$3$H$G$9(B) $B$,(B nnimap $B$,(B Gnus $B$G5-;v$r(B -$B>C5n$9$k$H$-$K$9$k$3$H$G$9(B (@kbd{G DEL} $B$J$I$G(B)$B!#(B -($BLuCm(B: $B%Q%k%a%K%G%9$O5*85A0(B 5 $B@$5*$N%.%j%7%"$N(B Elea $BGI$NE/3XC5n$5$l$F$$$J$$$N(B -$B$G!"C5n$9$k$?$a$NJ}K!$,I,MW$H$J$j$^$9!#=[4D$7$F$$$k$h$&$K46$8$^$9(B -$B$+(B? - -$BEAE}E*$K!"(Bnnimap $B$O%a!<%k%\%C%/%9$rJD$8$k$H$-$K(B @code{Deleted} $B$H$$$&0u(B -$B$NIU$$$?A4$F$N5-;v$r>C5n$7$F$-$^$7$?$,!":#$O%5!<%P!C5n$7$^$9!#(B -@item never -$B7h$7$F5-;v$r>C5n$7$^$;$s!#8=:_$O!">C5n$N0u$,IU$$$?5-;v$r(B nnimap $B$GI=<($9(B -$B$kJ}K!$O$"$j$^$;$s$,!"B>$N(B IMAP $B%/%i%$%"%s%H$O$G$O$G$-$k$+$b$7$l$^$;$s!#(B -$BC5n$5$l$?5-;v$r:o=|$9$k$+$I$&$+(B -$B$r?R$M$^$9!#(B -@end table - -@item nnimap-importantize-dormant -@vindex nnimap-importantize-dormant - -$BHs(B nil $B$@$C$?$i!"B>$N(B IMAP $B%/%i%$%"%s%H$N$?$a$KJ]N15-;v$r0uIU$-$H$7$F$b(B -$B0u$rIU$1$^$9!#(Bgnus $B$NFbIt$G$O!"J]N15-;v$O85!9$9$G$K0uIU$-$H$7$F$N$_0u$,(B -$BIU$1$i$l$F$$$^$9!#$3$l$O!"B>$N(B IMAP $B%/%i%$%"%s%H$K$*$1$kJ]N15-;v$r!"$"$?(B -$B$+$b0uIU$-$N$h$&$K$-$oN)$?$;$^$9!#(B($BJL$N8@$$J}$r$9$k$H!"(Bgnus $B$OFs$D$N0u$r(B -$BIU$1!"(BIMAP $B$O$?$C$?0l$D$@$H$$$&$3$H$G$9!#(B) - -$B$?$V$s$3$l$r$$$8$j$^$o$9$N$O!"$"$J$?$,%f!<%6C10L$NJ]N1%U%i%0$rIU$1$h$&$H(B -$B$9$k$@$1$NM}M3$K$h$k$G$7$g$&!#$3$s$J46$8$G(B: - -@lisp -(setcdr (assq 'dormant nnimap-mark-to-flag-alist) - (format "gnus-dormant-%s" (user-login-name))) -(setcdr (assq 'dormant nnimap-mark-to-predicate-alist) - (format "KEYWORD gnus-dormant-%s" (user-login-name))) -@end lisp - -$B$3$N>l9g!"$"$J$?$O%f!<%6C10L$NJ]N1%U%i%0$r!"B>$N%f!<%6$K0uIU$-$H$7$F8+$i(B -$B$l$?$/$J$$$H;W$C$F$$$^$9!#(B - -@item nnimap-expunge-search-string -@cindex Expunging -@vindex nnimap-expunge-search-string - -$B$3$NJQ?t$K$O!"4|8B@Z$l>C5n$9$k$N$,K>$^$7$$5-;v$rC5$9$H$-$K%5!<%P!<$KAw$C(B -$B$?(B IMAP $B$N8!:w%3%^%s%I$,F~$C$F$$$^$9!#%G%#%U%)%k%H(B -$B$O(B @code{"UID %s NOT SINCE %s"} $B$G!"$3$3$G:G=i$N(B @code{%s} $B$O(B UID $B$GCV$-(B -$B49$($i$l!"FsHVL\$N(B @code{%s} $B$OF|IU$GCV$-49$($i$l$^$9!#(B - -$B$?$V$s;H$$$b$N$K$J$kJL$NCM$O(B @code{"UID %s NOT SENTSINCE %s"} $B$G!"(B -nnimap $B$K5-;v$NFbItE*$JF|IU$NBe$o$j$K(B Date: $B$r;H$&$h$&$K$5$;$^$9!#$5$i$J(B -$B$k>pJs$d;H$&$3$H$,$G$-$kJ8;zNs$K$D$$$F$O!"(BRFC 2060 $B$N%;%/%7%g%s(B 6.4.4 $B$r(B -$B8+$F$/$@$5$$!#(B - -@item nnimap-authinfo-file -@vindex nnimap-authinfo-file - -$B%5!<%P$K%m%0%$%s$9$k$?$a$K;H$&G'>Z>pJs(B (authinfo) $B$r4^$`%U%!%$%k$G$9!#$=(B -$B$N7A<0$O(B ($B$[$H$s$I(B) @code{ftp} $B$N(B @file{~/.netrc} $B%U%!%$%k$HF1$8$G$9!#87(B -$BL)$JDj5A$O!"JQ?t(B @code{nntp-authinfo-file} $B$r8+$F2<$5$$!#$=$7(B -$B$F(B @ref{NNTP} $B$b8+$F2<$5$$!#(B -@end table - -@menu -* Splitting in IMAP:: nnimap $B$G%a!<%k$rJ,3d$9$k(B -* Editing IMAP ACLs:: $B%a!<%k%\%C%/%9$X$NB>$NMxMQA0$r;XDj$7$?J8;zNs$+J8;zNs$N%j%9(B -$B%H$G$9!#=i4|CM$O(B @code{nil} $B$G!"J,3d$O;HMQ$7$J$$$h$&$K$J$C$F$$$^$9(B! - -@lisp -(setq nnimap-split-inbox - '("INBOX" ("~/friend/Mail" . "lists/*") "lists.imap")) -@end lisp - -Nnmail $B$KBP1~$9$k$b$N$O$"$j$^$;$s!#(B - -@item nnimap-split-rule -@cindex Splitting, rules -@vindex nnimap-split-rule - -@code{nnimap-split-inbox} $B$G8+$D$+$C$??7$7$$%a!<%k$O$3$NJQ?t$K=>$C$FJ,3d(B -$B$5$l$^$9!#(B - -$B$3$NJQ?t$O%j%9%H$N%j%9%H$+$i@.$j$^$9!#I{%j%9%H$N:G=i$NMWAG$O(B IMAP $B$N%a!<(B -$B%k%\%C%/%9$G!"Fs$D$a$NMWAG$N@55,I=8=$K9gCW$7$?5-;v$N0\F0@h$r;XDj$7$^$9!#(B -$B$o$+$j$^$7$?$+(B? $B$$$$$(!";d$b$o$+$j$^$;$s!#Nc$,I,MW$G$9!#(B - -@lisp -(setq nnimap-split-rule - '(("INBOX.nnimap" - "^Sender: owner-nnimap@@vic20.globalcom.se") - ("INBOX.junk" "^Subject:.*MAKE MONEY") - ("INBOX.private" ""))) -@end lisp - -$B$3$l$O(B nnimap $B%a!<%j%s%0%j%9%H$+$i$NA4$F$N5-;v$r%a!<%k%\%C%/(B -$B%9(B INBOX.nnimap $B$KF~$l!"(BSubject: $B9T$K(B MAKE MONEY $B$N$"$kA4$F$N5-;v(B -$B$r(B INBOX.junk $B$KF~$l!"$=$NB>A4$F$N$b$N$r(B INBOX.private $B$KF~$l$^$9!#(B - -$B:G=i$NJ8;zNs$O!"(Breplace-match $B$G9gCW$7$?%F%-%9%H$+$iI{I=8=$rA^F~$9$k$H$-(B -$B$K;HMQ$5$l$k$N$HF1$8$h$&$J!"(B`\\1' $B7A<0$r4^$`$3$H$,$G$-$^$9!#Nc$($P(B: - -@lisp -("INBOX.lists.\\1" "^Sender: owner-\\([a-z-]+\\)@@") -@end lisp - -$BFs$DL\$NMWAG$O4X?t$G$"$k$3$H$b$G$-$^$9!#$=$N>l9g$O!"5-;v$N%X%C%@!<$,$"$k(B -$B%P%C%U%!$G!"$=$N5,B'$N:G=i$NMWAG$r0z?t$H$7$F8F$P$l$^$9!#%a!<%k$,$=$N%0%k!<(B -$B%W$KB0$9$k$H9M$($k>l9g$O!"(B@code{nil} $B$G$J$$CM$rJV$9I,MW$,$"$j$^$9!#(B - -Nnmail $B$NMxMQe$NNc$N$h$&$K(B)$B!#$3$l(B -$B$O(B nnimap $B$G$OI,MW$G$O$"$j$^$;$s!#@55,I=8=$N$I$l$K$b9gCW$7$J$$5-;v(B -$B$O(B inbox $B$+$i0\F0$5$l$^$;$s!#(B(inbox $B$KL$FI5-;v$rBgNL$KCV$$$F$*$/$H!"J,3d(B -$B$N%3!<%I$O?7$7$$%a!<%k$r!$A(B" $B$^$9!#Aj8_Ej9F(B -$B$r$7$F$$$k>l9g$O!"A4$F$N9gCW$7$?5,B'$,(B "$B>!$A(B" $B$^$9!#(B - -$B$3$NJQ?t$O$=$NCM$H$7$F4X?t$r;}$D$3$H$b$G$-$^$9!#$=$N4X?t$O5-;v$N%X%C%@$N(B -$BItJ,$KHO0O$,69$a$i$l$?>uBV$G8F$P$l!"5-;v$N0\F0@h$@$H;W$&%0%k!<%W$rJV$9$b(B -$B$N$G$J$1$l$P$J$j$^$;$s!#(B@code{nnimap-split-fancy} $B$r;2>H$7$F2<$5$$!#(B - -$BJ,3d%3!<%I$OI,MW$J$i%a!<%k%\%C%/%9$r:n@.$7$^$9!#(B - -$B0[$J$k2>A[%5!<%P!A[%5!<%P!$Oe5-$NJ,3d$N5,B'$NJ}$G$9!#(B - -Nnmail $B$GBP1~$9$k$b$N(B: @code{nnmail-split-methods}. - -@item nnimap-split-predicate -@cindex splitting -@vindex nnimap-split-predicate - -$B$3$N=R8l$K%^%C%A$9$k(B @code{nnimap-split-inbox} $B$K$"$k%a!<%k$OJ,3d$5$l$^(B -$B$9!#$3$l$OJ8;zNs$G4{DjCM$O(B @samp{UNSEEN UNDELETED} $B$G$9!#(B - -$B$b$7$"$J$?$,(B inbox $B$K$"$k%a!<%k$rFI$`$?$a$KJL$N(B @sc{imap} $B%/%i%$%"%s%H$r(B -$B;H$C$F$$$k$,!"9XFIEY$K4X$o$i$:$K$9$Y$F$N5-;v$r(B gnus $B$KJ,3d$5$;$?$$$J$i$P!"(B -$B$3$l$OLr$KN)$D$+$b$7$l$^$;$s!#$=$N>l9g$O(B @samp{UNDELETED} $B$KJQ$($l$PNI$$(B -$B$G$7$g$&!#(B - -@item nnimap-split-fancy -@cindex splitting, fancy -@findex nnimap-split-fancy -@vindex nnimap-split-fancy - -$B$b$7$"$J$?$,FC5iJ,3d$r;H$$$?$$$J$i$P!"(B@code{nnimap-split-rule} $B$NCM(B -$B$r(B @code{nnmail-split-fancy} $B$K@_Dj$9$k$3$H$,$G$-$^$9!#(B -@xref{Fancy Mail Splitting}$B!#(B - -$B$7$+$7(B nnmail $B$H(B nnimap $B$H$G0[$J$kFC5iJ,3dJ}<0$r;}$D$h$&$K$9$k$K$O!"(B -@code{nnimap-split-rule} $B$NCM$r(B @code{nnimap-split-fancy} $B$K@_Dj$7$F!"(B -nnimap $BFCM-$NFC5iJ,3dJ}<0$r(B @code{nnimap-split-fancy} $B$KDj5A$7$F2<$5$$!#(B - -$BNc(B: - -@lisp -(setq nnimap-split-rule 'nnimap-split-fancy - nnimap-split-fancy ...) -@end lisp - -Nnmail $B$GBP1~$9$k$b$N(B: @code{nnmail-split-fancy}. -@end table - -@node Editing IMAP ACLs -@subsubsection IMAP $B$N(B ACL $B$rJT=8$9$k!#(B -@cindex editing imap acls -@cindex Access Control Lists -@cindex Editing IMAP ACLs -@kindex G l -@findex gnus-group-nnimap-edit-acl - -ACL $B$O(B Access Control List ($B;HMQ@)8B0lMw(B) $B$NN,$G$9!#(BIMAP $B$G$O(B ACL $B$OB>$N(B -$BMxMQ\$7$$;X<($H$H$b$K(B ACL $BJT=8%&%#%s%I%&$,8=$l$^$9!#(B - -$B;HMQ$NNc(B: - -@itemize @bullet -@item -$B%a!<%j%s%0%j%9%H$N%a!<%k%\%C%/%9$G(B "anyone" $B$K(B "lrs" $B5v(B -$B2D(B (lookup, read, seen/unseen $B%U%i%0$NJ];}(B) $B$rM?$($k$3$H$G!"F1$8%5!<%P!<(B -$B$NB>$NMxMQ/$J$/$H$b(B Cyrus $B$N%5!<%P!<$K$*$$$F$O!"(B"plussing" $B$,F0:n$9$k$?$a$K(B ($B$D$^(B -$B$j!"(Buser+mail@@domain $B$,(B INBOX.mailbox $B$H$$$&(B IMAP $B$N%a!<%k%\%C%/%9$K$J(B -$B$k(B)$B!"MxMQC5n$5$l$?5-;v$rC5n$5$l$?5-;v$rI=<($9$kJ}K!$O$"$j$^$;$s!#$?$@>C5n$G$-$k$@$1(B -$B$G$9!#(B - -@node Combined Groups -@section $B7k9g%0%k!<%W(B - -Gnus $B$O!"A4$F$N%0%k!<%W$NA[%0%k!<%W(B -@cindex nnvirtual -@cindex virtual groups - -nnvirtual $B%0%k!<%W(B (@dfn{nnvirtual group}) $B$O$N%0%k!<%W$N=89g0J>e(B -$B$N2?J*$G$b$"$j$^$;$s!#(B - -$BNc$($P!"$b$7>.$5$J%0%k!<%W$r$?$/$5$sFI$`$N$,7y$K$J$C$F$-$?$i!"$=$l$i$r0l(B -$B$D$NBg$-$J%0%k!<%W$KF~$l$F!"7y$K$J$k$/$i$$5pBg$GA[%0%k!<%WFb$GIU$1$i$l$?A4$F$N0u$O!"$=$N9=@.%0%k!<%W$N5-;v$K$/$C$D$1$i(B -$B$l$^$9!#$D$^$j!"$b$72>A[%0%k!<%WFb$G5-;v$K2D;k5-;v$N0u$r$D$1$k$H!"$=$N5-(B -$B;v$O$b$H$b$H$N9=@.%0%k!<%W$NCf$G$b2D;k5-;v$K$J$j$^$9!#(B($B$=$7$F5U$b@.$jN)(B -$B$A$^$9(B --- $B9=@.%0%k!<%WFb$GIU$1$?0u$O2>A[%0%k!<%WFb$G$bI=<($5$l$^$9!#(B) - -$B$3$l$,!"(BAndrea Dworkin $B$K4X$9$kA4$F$N%K%e!<%9%0%k!<%W$r!"0l$D$N5pBg$G%7(B -$B%"%o%;$J%K%e!<%9%0%k!<%W$K$^$H$a$k(B @code{nnvirtual} $BJ}K!$NNc$G$9!#(B - -@lisp -(nnvirtual "^alt\\.fan\\.andrea-dworkin$\\|^rec\\.dworkin.*") -@end lisp - -$B9=@.%0%k!<%W$O4pK\%0%k!<%W$G$b30It%0%k!<%W$G$b9=$$$^$;$s!#A4$FLdBjL5$/F0(B -$B$/$O$:$G$9$,!"$b$7$"$J$?$N%3%s%T%e!<%?!<$,GzH/$G$b$7$F$7$^$C$?$i!"$=$l$O(B -$B$?$V$s;d$,0-$$$s$G$7$g$&$M!#(B - -$B$$$/$D$+$N%5!<%P!<$+$iF1$8%0%k!<%W$r=8$a$k$3$H$O!"MxMQl9g$O!"Hs>o$KNI$$(B -$B$+$bCN$l$^$;$s!#$b$7$"$J$?$,(B @samp{soc.motss} $B$r!"F|K\$N%5!<%P!<$H%N%k%&%'!<(B -$B$N%5!<%P!<$NN>J}$+$iFI$_$?$1$l$P!"%0%k!<%W$N@55,I=8=$H$7$F0J2<$NCM$,;H$((B -$B$^$9!#(B - -@example -"^nntp\\+server\\.jp:soc\\.motss$\\|^nntp\\+server\\.no:soc\\.motss$" -@end example - -($B$G$b$A$g$C$HCm0U!#(B@kbd{G m} $B$G%0%k!<%W$r:n@.$9$k$H$-$O!"%P%C%/%9%i%C%7%e(B -$B$rFs=E$KIU$1$F$O$$$1$^$;$s!#$=$7$FJ8;zNs$N:G=i$H:G8e$N0zMQ5-9f$bJ}$N%0%k!<%W$N5-;v$OA4It40A4(B -$B$K0l$D$N%0%k!<%W$K$J$j!"=EJ#$bL5$$$O$:$G$9!#%9%l%C%II=<((B ($B$H$=$NB>(B) $B$bDL(B -$B>oDL$j$&$^$/F0:n$9$k$G$7$g$&$1$I!"5-;v$NJB$V=g=x$K$OLdBj$,$"$k$+$b$7$l$^(B -$B$;$s!#F|IU$K$h$kJB$YBX$($O$3$3$G$O;EMM30$H$J$k$+$b$7$l$^$;(B -$B$s(B (@pxref{Selecting a Group})$B!#(B - -$B$J$*!"$3$3$G0l$D$@$1@)8B$,$"$j$^$9(B --- $B2>A[%0%k!<%W$K4^$^$l$k%0%k!<%W$O(B -$BA4$F@8$-$F$$$k(B($B$9$J$o$A!"9XFI$^$?$OHs9XFI$N(B)$B>uBV$G$J$/$F$O$J$j$^$;$s!#:o(B -$B=|$"$k$$$O%>%s%S%0%k!<%W$O(B @code{nnvirtual} $B%0%k!<%W$N9=@.%0%k!<%W$K$J$k(B -$B$3$H$O$G$-$^$;$s!#(B - -@vindex nnvirtual-always-rescan -@code{nnvirtual-always-rescan} $B$,(B @code{nil} $B0J30$G$"$l$P!"(B -@code{nnvirtual} $B$O2>A[%0%k!<%W$KF~$C$?$H$->o$K!"L$FI5-;v$rAv::$7$^$9!#(B -$B$3$NJQ?t$,(B @code{nil} ($B$3$l$,=i4|@_Dj(B)$B$G$"$C$F!"2>A[%0%k!<%W$r:n@.$7$?8e(B -$B$K9=@.%0%k!<%WFb$N5-;v$rFI$s$@>l9g$O!"$=$N9=@.%0%k!<%W$GFI$^$l$?5-;v$O!"(B -$B2>A[%0%k!<%W$KF~$C$?$H$-$KI=<($5$l(B $B$k$G$7$g$&!#$b$76&DL$N9=@.%0%k!<%W$r(B -$B;}$DFs$D$N2>A[%0%k!<%W$,$"$k>l9g$K$b$3$N1F6A$,$"$j$^$9!#$=$N>l9g$O$3$NJQ(B -$B?t$r(B @code{t} $B$K$7$?J}$,NI$$$G$9!#$"$k$$$O2>A[%0%k!<%W$KF~$k;~$K!"Kh2s$=(B -$B$N%0%k!<%W$N>e$G(B @code{M-g} $B$rC!$$$F$bNI$$$G$9(B --- $B$3$l$O$[$\F1MM$N8z2L(B -$B$,$"$j$^$9!#(B - -@code{nnvirtual} $B$O%a!<%k$H%K%e!<%9$NN>J}$N%0%k!<%W$r9=@.%0%k!<%W$H$9$k(B -$B;v$,$G$-$^$9!#(B@code{nnvirtual} $B%0%k!<%W$N5-;v$KJVEz$9$k$H$-$O!"(B -@code{nnvirtual} $B$O5-;v$N=P=j$N9=@.%0%k!<%W$N%P%C%/%(%s%I$K$=$l$,%K%e!<(B -$B%9$N%P%C%/%(%s%I$G$"$k$+%a!<%k$N%P%C%/%(%s%I$G$"$k$+$r?R$M$J$1$l$P$J$j$^(B -$B$;$s!#$7$+$7!"(B@kbd{^} $B$r$7$?$H$-$K$O!"IaDL$O9=@.%P%C%/%(%s%I$,$3$l$rCN$k(B -$B3N$+$JJ}K!$O$J$/!"$=$N>l9g$O!"(B@code{nnvirtual} $B$O(B gnus $B$K5-;v$O%K%e!<%9(B -$B$G$J$$%P%C%/%(%s%I$+$iMh$?$H9p$2$k;v$K$J$j$^$9!#(B($B0BA4$N$?$a$K!#(B) - -$B$3$N$h$&$J>l9g$O!"%a%C%;!<%8%P%C%U%!$G$N(B @kbd{C-c C-t} $B$,1~Ez$7$h$&$H$7(B -$B$F$$$k5-;v$+$i(B @code{Newsgroups} $B9T$rH4$-=P$7$FA^F~$7$^$9!#(B - -@node Kibozed Groups -@subsection Kiboze $B%0%k!<%W(B -@cindex nnkiboze -@cindex kibozing - -@dfn{Kiboze} $B$9$k!"$H$O!"(B``$B%K%e!<%9%9%W!<%kA4It(B ($B$"$k$$$O$=$N0lIt(B) $B$+(B -$B$i(B grep $B$9$k$3$H(B'' $B$H%*%C%/%9%U%)!<%IBg<-E5$K$h$C$FDj5A$5$l$F$$$^$9!#(B -@code{nnkiboze} $B$O$3$l$r$"$J$?$N$?$a$K9T$C$F$/$l$k%P%C%/%(%s%I$G$9!#4r$7(B -$B$$$M(B! $B$3$l$G$I$s$J(B @sc{nntp} $B%5!<%P!<$G$b!"Lr$KN)$?$J$$MW5a$G;_$^$C$F$7(B -$B$^$&$^$G9s;H$9$k$3$H$,$G$-$k$M!#$"$"!"$J$s$F9,$;$J$s$@(B! - -@kindex G k (Group) -kiboze $B%0%k!<%W$r:n@.$9$k$K$O!"%0%k!<%W%P%C%U%!$G(B @kbd{G k} $BL?Na$r;H$$$^(B -$B$9!#(B - -@code{nnkiboze} $BJ}K!$K$*$1$k%"%I%l%9Ms$O!"(B@code{nnvirtual} $B$HF1MM$K!"(B -@code{nnkiboze} $B$K(B ``$B4^$a$?$$(B'' $B%0%k!<%W$K%^%C%A$9$k@55,I=8=$G$9!#$3$3(B -$B$,(B @code{nnkiboze} $B$H(B @code{nnvirtual} $B%P%C%/%(%s%I$N:G$bN`;w$7$F$$$kE@(B -$B$G$9!#(B - -$B$3$N9=@.%0%k!<%W$rNs5s$9$k@55,I=8=$K2C$($F!"(B@code{nnkiboze} $B%0%k!<%W$K$O!"(B -$B%0%k!<%WFb$N$I$N5-;v$r4^$a$k$+$r7h$a$k%9%3%"%U%!%$%k$,$J$/$F$O$J$j$^$;(B -$B$s(B (@pxref{Scoring})$B!#(B - -@kindex M-x nnkiboze-generate-groups -@findex nnkiboze-generate-groups -$B$"$J$?$NM_$7$$(B @code{nnkiboze} $B%0%k!<%W$r:n@.$7$?8e$K$O!"(B -@kbd{M-x nnkiboze-generate-groups} $B$rpJs$r3JG<$9$k!"(B@file{.newsrc} $B$NJd=u%U%!%$%k(B -$B$G$9!#(B - -@code{nnkiboze} $B%0%k!<%WFb$N4{FI$H$J$C$?5-;v$O!"$=$N5-;v$N(B @sc{nov} $B9T(B -$B$,(B @sc{nov} $B%U%!%$%k$+$i:o=|$5$l$^$9!#(B - -@node Gnus Unplugged -@section Gnus $B$N@Z$jN%$7(B -@cindex offline -@cindex unplugged -@cindex Agent -@cindex Gnus Agent -@cindex Gnus Unplugged - -$B$$$K$7$($N;~Be(B($B$*$h$=(B 1988 $BG/(B2$B7n:"(B)$B!"?M!9$O%K%e!<%9%j!<%@!<$r!"Bg$-$J%^(B -$B%7%s$N>e$G%M%C%H%o!<%/$K1JB3E*$K@\B3$7$FAv$i$;$F$$$^$7$?!#%K%e!<%9$NG[Aw(B -$B$O%K%e!<%9%5!<%P!<$K$h$C$Fe$i$J$$$h$&$K!"(B -$BA4$F$N%K%e!<%9$H%a!<%k$r5[$$>e$2!"EEOC$r@Z$j!"?t;~4V3]$1$FFI$_!"$=$7$FAw(B -$B$j$?$$JV?.$rA4$FAw?.$9$k!"$H$$$&e$G%K%e!<(B -$B%9$rFI$`?M$,$"$J$?$7$+$$$J$1$l$P!"%K%e!<%9%5!<%P!<$N5!G=$r%K%e!<%9%j!<%@!<(B -$B$KG$$;$k$h$&$K$9$k$3$H$OM}$K$+$J$C$F$$$^$9!#(B - -Gnus $B$r(B ``$B%*%U%i%$%s(B'' $B$N%K%e!<%9%j!<%@!<$H$7$F;H$&$N$O6K$a$F4JC1$G$9!#(B - -@itemize @bullet -@item -$B$^$:!"%M%C%H%o!<%/$K40A4$K7R$,$C$F$$$k%^%7%s>e$GF0:n$5$;$k$N$HF1$8$h$&$K!"(B -gnus $B$r@_Dj$7$^$9!#$^$:$d$C$F$*$$$G!#KM$O$3$3$GBT$C$F$k$+$i!#(B - -@item -$B$=$7$?$i!"0J2<$NKbK!$NC$9J}K!(B -* Agent and IMAP:: $B%(!<%8%'%s%H$r(B IMAP $B$G;H$&J}K!(B -* Outgoing Messages:: $BEj9F!"%a!<%k$r=P$9$H$-$K$J$K$,5/$3$k$N$+(B? -* Agent Variables:: $B%+%9%?%^%$%:$O3Z$7(B -* Example Setup:: $B%*%U%i%$%s?M4V$N$?$a$N(B @file{.gnus.el} $B$NNc(B -* Batching Agents:: @code{cron} $B%8%g%V$K$h$k%K%e!<%9uBV$G5/F0$7$^$9!#$3$N>uBV$G$O!"$9$G$KH$7$F2<$5$$!#(B - -@item -$B$=$7$F!"$=$N>l$G$9$0$K?7$7$$%K%e!<%9$rFI$`$3$H$b$G$-$^$9$7!"%K%e!<%9$r%m!<(B -$B%+%k%^%7%s$K%@%&%s%m!<%I$9$k$3$H$b$G$-$^$9!#8eH$7$F$/$@$5$$!#(B) - -@item -$B5-;v$ruBV$K$5$;!"(B -PPP $B4X78(B($B$J$I(B)$B$rJD$8$^$9!#$=$&$7$F%K%e!<%9$r%*%U%i%$%s$GFI$`$3$H$,$G$-$^(B -$B$9!#(B - -@item -$B$=$7$FBhFs%9%F%C%W$KLa$j$^$9!#(B -@end itemize - -$B0J2<$K%(!<%8%'%s%H$r=i$a$F(B($B$+$=$3$i$K(B)$B;H$&$H$-$KI,MW$J$$$/$D$+$N:n6H$r<((B -$B$7$^$9!#(B - -@itemize @bullet - -@item -$B$I$N%5!<%P!<$r%(!<%8%'%s%H$GLLE]$r8+$k$+$r7h$a$^$9!#$b$7%a!<%k%P%C%/%(%s(B -$B%I$,$"$l$P!"$=$l$r%(!<%8%'%s%H$KLLE]$r8+$5$;$k$N$O$*$=$i$/L50UL#$G$7$g$&!#(B -$B%5!<%P!<%P%C%U%!!<$K0\F0$7(B ($B%0%k!<%W%P%C%U%!!<$G(B @kbd{^})$B!"%(!<%8%'%s%H(B -$B$K07$C$FM_$7$$%5!<%P!<(B($BJ#?t2D(B)$B$G(B @kbd{J a} $B$r2!$7$^(B -$B$9(B (@pxref{Server Agent Commands})$B!#$3$l$OBgDq$N>l9g!"%P%C%U%!!<$N2<$K0l(B -$BMwI=<($5$l$F$$$k4pK\A*BrJ}K!$@$1$G$7$g$&!#(B - -@item -$B%@%&%s%m!<%IJ}?K$r7hDj$7$^$9!#(B@xref{Agent Categories}. - -@item -$B$($($H!D!"0J>e$G$9!#(B -@end itemize - -@node Agent Categories -@subsection $B%(!<%8%'%s%HJ,N`(B - -$B%K%e!<%9G[Aw5!9=$H%K%e!<%9%j!<%@!<$rE}9g$9$k0l$D$NBg$-$JM}M3$O!"$I$N5-;v(B -$B$r%@%&%s%m!<%I$9$k$+$K$D$$$F!"$h$jNI$$@)8f$r2DG=$H$9$k$3$H$G$9!#G|Bg$JNL(B -$B$N5-;v$r%@%&%s%m!<%I$7$F$b$"$^$j0UL#$O$J$/!"$=$l$i$rFI$s$G$b$"$^$jLLGr$/(B -$B$J$$$3$H$,J,$+$k$@$1$G$9!#2?$r%@%&%s%m!<%I$9$k$+$NA*Br$O$b$C$H?5=E$G$"$k(B -$B$Y$-$G$"$j!"$=$N5-;v$,LLGr$$$HJ,$+$C$?;~E@$G!"%@%&%s%m!<%I$9$k$?$a$N0u$r(B -$B$NJ,N`$KB0$5$J$$%0%k!<%W$O(B @code{$B=i4|(B} $BJ,N`$KB0$7$^$9!#(BGnus $B$OJ,N`$N:n(B -$B@.$H4IM}$N$?$a$NFH<+$N%P%C%U%!!<$r;}$C$F$$$^$9!#(B - -@menu -* Category Syntax:: $BJ,N`$H$O$I$s$J$b$N$+(B -* Category Buffer:: $BJ,N`$r4IM}$9$k%P%C%U%!!<(B -* Category Variables:: $B%+%9%?%^%$%6(B"$B$i(B"$B%9(B -@end menu - -@node Category Syntax -@subsubsection $BJ,N`$NJ8K!(B - -$BJ,N`$OFs$D$N$b$N$+$i$J$j$^$9!#(B - -@enumerate -@item -($BDL>o(B) $B$I$N5-;v$r%@%&%s%m!<%I$9$k$N$,E,Ev$+$H$$$&Bg$^$+$JNX3T$rM?$($k=R(B -$B8l!#$=$7$F(B - -@item -($BDL>o(B) $B$I$N5-;v$r%@%&%s%m!<%I$9$k$+$r7h$a$k$H$-$N$h$j$-$a$N:Y$+$$%9%3%"(B -$B5,B'!#(B($B$3$N%@%&%s%m!<%I%9%3%"(B (@dfn{download score}) $B$ODL>o$N%9%3%"$H$O(B -$BI,$:$7$b4X78$,L5$$$3$H$KCm0U$7$F$/$@$5$$!#(B) -@end enumerate - -$B=R8l$N0lHVC1=c$J7A<0$O(B @code{true} $B$d(B @code{false} $B$N$h$&$JC1FH$N=R8l$+(B -$B$i$J$j$^$9!#$3$l$i$NFs$D$O$=$l$>$l!"A4$F$N2DG=$J5-;v$r%@%&%s%m!<%I$9$k$+!"(B -$BA4$/2?$b$7$J$$$+!"$G$9!#$3$l$i$NFs$D$NFCJL$J=R8l$N>l9g$O!"DI2C$N%9%3%"5,(B -$BB'$OM>J,$G$9!#(B - -@code{high} $B$d(B @code{low} $B$H$$$&=R8l$O2<$G@bL@$5$l$F$$$k$h$&$K!"(B -@code{gnus-agent-high-score} $B$H(B @code{gnus-agent-low-score} $B$H$N5-;v$N%9(B -$B%3%"$H$N4X78$K$h$j5-;v$r%@%&%s%m!<%I$7$^$9!#(B - -$B%@%&%s%m!<%I$,E,@Z$+$I$&$+$N!"$5$i$K:Y$+$$@)8f$rF@$k$?$a$K!"=R8l$OO@M}1i(B -$B;;;R$,4V$K;6$j$P$a$i$l$?=R8l$NAH$_9g$o$;$+$i$J$k$3$H$,$G$-$^$9!#(B - -$B$*$=$i$/$$$/$D$+$NNc$,$=$N$^$^;H$($^$9!#(B - -$B0J2<$O4JC1$J=R8l$G$9!#(B($B$3$l$O=i4|@_Dj$N=R8l$G$9!#$D$^$j!"B>$N$I$NJ,N`$K(B -$B$b4^$^$l$J$$A4$F$N%0%k!<%W$KBP$7$F;HMQ$5$l$^$9!#(B) - -@lisp -short -@end lisp - -$B$H$C$F$b4JC1$G$7$g(B? $B$3$N=R8l$O!"5-;v$,C;$$(B(``$BC;$$(B'' $B2ACM$,$"$k(B) $B>l9g$K8B(B -$B$j??$K$J$j$^$9!#(B - -$B$3$l$O$b$C$HJ#;($J=R8l$G$9!#(B - -@lisp -(or high - (and - (not low) - (not long))) -@end lisp - -$B$3$N0UL#$O!"9b$$%9%3%"$r;}$C$F$$$k$+!"$"$k$$$O%9%3%"$,Dc$/$J$/$F$+$DD9$/(B -$B$J$$!"$H$$$&5-;v$r%@%&%s%m!<%I$9$k!"$H$$$&$3$H$G$9!#$o$+$k$@$m!#(B - -$B;H$C$F$b$h$$O@M}1i;;;R$O!"(B@code{or}, @code{and}, @code{not} $B$G$9!#(B($B$b$7(B -$B;H$$$?$1$l$P!"$h$j(B ``C'' $BIw$N1i;;;R(B @samp{|}, @code{&}, @code{!} $B$rBe$j(B -$B$K;H$&$3$H$,$G$-$^$9!#(B) - -$B0J2<$N=R8l$O$"$i$+$8$aDj5A$5$l$F$$$^$9$,!"$3$l$i$N$I$l$b$"$J$?$N$d$j$?$$(B -$B$3$H$K0lCW$7$J$1$l$P!"<+J,$GFH<+$N$b$N$r=q$/$3$H$b$G$-$^$9!#(B - -@table @code -@item short -$B5-;v$,(B @code{gnus-agent-short-article} $B9T$h$jC;$+$1$l$P??!#=i4|@_DjCM(B -$B$O(B 100$B!#(B - -@item long -$B5-;v$,(B @code{gnus-agent-long-article} $B9T$h$jD9$1$l$P??!#=i4|@_DjCM$O(B 200$B!#(B - -@item low -$B5-;v$N%@%&%s%m!<%I%9%3%"$,(B @code{gnus-agent-low-score} $B0J2<$G$"$l$P??!#(B -$B=i4|@_DjCM$O(B 0$B!#(B - -@item high -$B5-;v$N%@%&%s%m!<%I%9%3%"$,(B @code{gnus-agent-high-score} $B0J>e$G$"$l$P??!#(B -$B=i4|@_DjCM$O(B 0$B!#(B - -@item spam -gnus $B%(!<%8%'%s%H$,$=$N5-;v$r(B SPAM $B$@$H8+Pv$7$?$i??!#$3$NH/8+E*o$K??!#(B - -@item false -$B>o$K56!#(B -@end table - -$B$"$J$?$,<+J,$NFH<+$N=R8l4X?t$r:n@.$7$?$1$l$P!"$3$l$rCN$C$F$*$$$F$/$@$5(B -$B$$(B: -$B4X?t$O0z?tL5$7$G8F$S=P$5$l$^$9$,!"(B -@code{gnus-headers} $B$H(B @code{gnus-score} $BF0E*JQ?t$K$OJXMx$JCM$,B+G{$5$l(B -$B$^$9!#(B - -$BNc$($P!"0lDj$NF|IU0J>eA0$KEj9F$5$l$?5-;v(B ($BNc$($P!"(B -@code{gnus-agent-expire-days} $B0JA0$KEj9F$5$l$?$b$N(B) $B$r%@%&%s%m!<%I$7$J$$(B -$B$H$9$k$3$H$b$G$-$^$9!#$=$N>l9g!"0J2<$N$h$&$J4X?t$r=q$/$G$7$g$&(B: - -@lisp -(defun my-article-old-p () - "Say whether an article is old." - (< (time-to-days (date-to-time (mail-header-date gnus-headers))) - (- (time-to-days (current-time)) gnus-agent-expire-days))) -@end lisp - -$B$=$&$9$k$H!"=R8l$O$3$N$h$&$KDj5A$7$^$9(B: - -@lisp -(not my-article-old-p) -@end lisp - -$B$b$7$/$O!"(B@file{~/.gnus.el} $B$d2?$+B>$N$b$N$G$b!"4{Dj(B -$B$N(B @code{gnus-category-predicate-list} $B$K<+J,$N=R8l$rDI2C$9$k$3$H$b$G$-(B -$B$^$9!#(B($BCm0U(B: $B$3$l$O!"(B@code{gnus-agent} $B$G(B @code{(gnus-agentize)} $B$,FI$_(B -$B9~$^$l$?8e$G$"$kI,MW$,$"$k$G$7$g$&(B) - -@lisp -(setq gnus-category-predicate-alist - (append gnus-category-predicate-alist - '((old . my-article-old-p)))) -@end lisp - -$B$=$7$F!"C1$Ke$N$h$&$J$b$N$r;H$&$H$-$O!"@$$NCf$K$O@5$7$/@_Dj$5$l$F$$$J$$%7%9%F%`(B/$B%a(B -$B!<%i!<$,$"$j!"5-;v$NF|IU$O$$$DEj9F$5$l$?$+$r>o$K3Ne$N=R8l$O$=$NJ,N`$KB0$9$k(B*$BA4$F(B*$B$N%0%k!<%W$KE,MQ$5$l$^$9!#$7$+$7!"J,N`Cf(B -$B$N8D!9$N%0%k!<%W$KFCDj$N=R8l$rK>$s$@$j!"BUBF2a$.$F?7$7$$J,N`$r@_Dj$G$-$J(B -$B$$$H$-$O!"%0%k!<%W$N8D!9$N=R8l$r%0%k!<%W%Q%i%a!<%?$Ge$N$b$N$HEy2A$JD9$$J}$NNc$O(B: - -@lisp -(agent-predicate or high (and (not low) (not long))) -@end lisp - -$BJ,N`$N;XDj$GMW5a$5$l$k30$N4]3g8L$O$3$3$G$OF~NO$5$l$F$*$i$:!"%I%C%HBP$N5-(B -$BK!$G$b$J$/!"=R8l$NCM$O%j%9%H$"$k$H$_$J$5$l$^$9!#(B - -$B$5$F!"%@%&%s%m!<%I%9%3%"$NJ8K!$ODL>o$N%9%3%"%U%!%$%k$NJ8K!$HF1$8$G$9$,!"(B -$BNc30$H$7$F!"J}$N>l=j$G!"(B@code{$B%@%&%s%m!<%I%9%3%"5,B'(B} $B$O0J2<$N;0$D$N7A<0$re$G=q$+$l$F$$$k$h$&$K!"%9%3%"IU$1%-!<%o!<%I$N0lItJ,$7$+;H$($J$$$3$H$r=|(B -$B$1$P!"$3$l$OIaDL$N(B gnus $B%9%3%"%U%!%$%k$N9=J8$HF1$8$G$9!#(B - -$BNc(B: - -@itemize @bullet -@item -$BJ,N`;XDj(B - -@lisp -(("from" - ("Lars Ingebrigtsen" 1000000 nil s)) -("lines" - (500 -100 nil <))) -@end lisp - -@item -$B%0%k!<%W%Q%i%a!<%?;XDj(B - -@lisp -(agent-score ("from" - ("Lars Ingebrigtsen" 1000000 nil s)) - ("lines" - (500 -100 nil <))) -@end lisp - -$B$^$?!"$3$3$G0lHV30$N3g8L$,>JN,$5$l$F$$$k$3$H$KCm0U$7$F$/$@$5$$!#(B -@end itemize - -@item -$B%(!<%8%'%s%H%9%3%"%U%!%$%k(B - -$B$3$l$i$N%9%3%"%U%!%$%k$O>e$G=R$Y$i$l$F$$$k;HMQ2DG=$J%9%3%"IU$1%-!<%o!<%I(B -*$B$N$_(B* $B$G$"$kI,MW$,$"$j$^$9!#(B - -$BNc(B: - -@itemize @bullet -@item -$BJ,N`;XDj(B - -@lisp -("~/News/agent.SCORE") -@end lisp - -$B$b$7$/$O!"$?$V$s(B - -@lisp -("~/News/agent.SCORE" "~/News/agent.group.SCORE") -@end lisp - -@item -$B%0%k!<%W%Q%i%a!<%?;XDj(B - -@lisp -(agent-score "~/News/agent.SCORE") -@end lisp - -$B>e$NMM$K!"DI2C$N%9%3%"%U%!%$%k$r;XDj$9$k$3$H$,$G$-$^$9!#$^$?3g8L$K$D$$$F(B -$B8@$o$J$1$l$P$$$1$^$;$s$+(B? -@end itemize - -@item -@code{$BIaDL(B} $B$N%9%3%"%U%!%$%k$N;HMQ(B - -$B0l$D$N%0%k!<%W$GFs$D$N%9%3%"5,B'$r0];}$7$?$/$J$/!"%0%k!<%W$NK>$_(B -$B$N(B @code{$B%@%&%s%m!<%I(B} $B$N4p=`$,(B @code{$BFI$`(B} $B4p=`$HF1$8$J$i!"%(!<%8%'%s%H(B -$B$K2?$r%@%&%s%m!<%I$9$k$+$r7h$a$k:]$K(B @code{$BIaDL(B} $B$N%9%3%"%U%!%$%k$r;2>H(B -$B$9$k$h$&$K$9$k$3$H$,$G$-$^$9!#(B - -$BJ,N`Dj5A$+!"%0%k!<%W%Q%i%a!<%?$N$3$l$i$N;X<($O%(!<%8%'%s%H$K%0%k!<%W$KE,(B -$BMQ2DG=$JA4$F$N%9%3%"%U%!%$%k$rFI$^$;!"%9%3%"IU$1%-!<%o!<%I$N;HMQ2DG=$JIt(B -$BJ,=89g$KL5$$$b$N$r(B *$BA*JL$7$FH4$-o$OA4$F$NJ,N`$OJ,N`%P%C%U%!!<$+$i4IM}$7$^$9!#(B($B%0%k!<%W%P%C%U%!!<(B -$B$+$i(B @kbd{J c} $BL?Na$K$h$C$F(B) $B=i$a$F$3$l$KF~$C$?$H$-!"=i4|@_Dj$N(B -$BJ,N`$@$1$,I=<($5$l$^$9!#(B - -$B0J2<$NL?Na$,$3$N%P%C%U%!!<$G;HMQ$G$-$^$9!#(B - -@table @kbd -@item q -@kindex q (Category) -@findex gnus-category-exit -$B%0%k!<%W%P%C%U%!!<$KLa$k(B (@code{gnus-category-exit})$B!#(B - -@item k -@kindex k (Category) -@findex gnus-category-kill -$B8=:_$NJ,N`$r>C5n$9$k(B (@code{gnus-category-kill})$B!#(B - -@item c -@kindex c (Category) -@findex gnus-category-copy -$B8=:_$NJ,N`$rJ#@=$9$k(B (@code{gnus-category-copy})$B!#(B - -@item a -@kindex a (Category) -@findex gnus-category-add -$B?7$7$$J,N`$rDI2C$9$k(B (@code{gnus-category-add})$B!#(B - -@item p -@kindex p (Category) -@findex gnus-category-edit-predicate -$B8=:_$NJ,N`$N=R8l$rJT=8$9$k(B (@code{gnus-category-edit-predicate})$B!#(B - -@item g -@kindex g (Category) -@findex gnus-category-edit-groups -$B8=:_$NJ,N`$KB0$9$k%0%k!<%W$N0lMw$rJT=8$9(B -$B$k(B (@code{gnus-category-edit-groups})$B!#(B - -@item s -@kindex s (Category) -@findex gnus-category-edit-score -$B8=:_$NJ,N`$N%@%&%s%m!<%I%9%3%"5,B'$rJT=8$9(B -$B$k(B (@code{gnus-category-edit-score})$B!#(B - -@item l -@kindex l (Category) -@findex gnus-category-list -$BA4$F$NJ,N`$rI=<($9$k(B (@code{gnus-category-list})$B!#(B -@end table - -@node Category Variables -@subsubsection $BJ,N`JQ?t(B - -@table @code -@item gnus-category-mode-hook -@vindex gnus-category-mode-hook -$BJ,N`%P%C%U%!!<$GA0!#(B - -@item g -$BJ,N`$KB0$9$k%0%k!<%W$N?t!#(B -@end table - -@item gnus-category-mode-line-format -@vindex gnus-category-mode-line-format -$BJ,N`%b!<%I9T$NMM<0(B (@pxref{Mode Line Formatting})$B!#(B - -@item gnus-agent-short-article -@vindex gnus-agent-short-article -$B$3$NJQ?t$h$j>/$J$$9T?t$N5-;v$OC;$$!#=i4|@_DjCM$O(B 100$B!#(B - -@item gnus-agent-long-article -@vindex gnus-agent-long-article -$B$3$NJQ?t$h$jB?$$9T?t$N5-;v$OD9$$!#=i4|@_DjCM$O(B 200$B!#(B - -@item gnus-agent-low-score -@vindex gnus-agent-low-score -$B$3$NCM$h$j>.$5$$%9%3%"$r;}$D5-;v$ODc%9%3%"$G$"$k!#=i4|@_DjCM$O(B 0$B!#(B - -@item gnus-agent-high-score -@vindex gnus-agent-high-score -$B$3$NCM$h$jBg$-$$%9%3%"$r;}$D5-;v$O9b%9%3%"$G$"$k!#=i4|@_DjCM$O(B 0$B!#(B -@end table - -@node Agent Commands -@subsection $B%(!<%8%'%s%HL?Na(B - -$BA4$F$N(B gnus $B%(!<%8%'%s%HL?Na$O(B @kbd{J} $B%5%V%^%C%W$K$"$j$^$9!#(B -@kbd{J j} (@code{gnus-agent-toggle-plugged}) $BL?Na$OA4$F$N%b!<%I(B -$B$GF0:n$7!"(Bgnus $B%(!<%8%'%s%H$N@Z$jN%$7(B/$B:9$79~$_>uBV$r@Z$jBX$($^$9!#(B - -@menu -* Group Agent Commands:: -* Summary Agent Commands:: -* Server Agent Commands:: -@end menu - -$B40A4$J0l3gC5n$7$^(B -$B$9(B (@code{gnus-agent-remove-group})$B!#$3$NL?Na$O%W%m%;%9(B/$B@\F,<-$N=,47$rM}(B -$B2r$7$^$9!#(B(@pxref{Process/Prefix})$B!#(B - -@item J Y -@kindex J Y (Agent Group) -@findex gnus-agent-synchronize-flags -$B%j%b!<%H%5!<%P!<$,(B @dfn{unplugged} $B$N$H$-$KJQ99$5$l$?%U%i%0$,$"$l$PF14|(B -$B$5$;$^$9!#(B -@end table - -@node Summary Agent Commands -@subsubsection $B35N,%(!<%8%'%s%HL?Na(B - -@table @kbd -@item J # -@kindex J # (Agent Summary) -@findex gnus-agent-mark-article -$B5-;v$K%@%&%s%m!<%I$9$k$h$&$K0u$rIU$1$k(B (@code{gnus-agent-mark-article})$B!#(B - -@item J M-# -@kindex J M-# (Agent Summary) -@findex gnus-agent-unmark-article -$B5-;v$+$i%@%&%s%m!<%I$9$k0u$r>C5n$9$k(B (@code{gnus-agent-unmark-article})$B!#(B - -@item @@ -@kindex @@ (Agent Summary) -@findex gnus-agent-toggle-mark -$B5-;v$r%@%&%s%m!<%I$9$k$+$I$&$+$r@Z$jBX$((B -$B$k(B (@code{gnus-agent-toggle-mark})$B!#(B - -@item J c -@kindex J c (Agent Summary) -@findex gnus-agent-catchup -$B%@%&%s%m!<%I0u$NL5$$5-;v$rA4$F4{FI$K$9$k(B (@code{gnus-agent-catchup})$B!#(B - -@item J u -@kindex J u (Agent Summary) -@findex gnus-agent-summary-fetch-group -$B8=:_$N%0%k!<%W$N%@%&%s%m!<%I2DG=$J5-;v$r!"$9$Y$F%@%&%s%m!<%I$7$^(B -$B$9(B (@code{gnus-agent-summary-fetch-group})$B!#(B -@end table - -@node Server Agent Commands -@subsubsection $B%5!<%P!<%(!<%8%'%s%HL?Na(B - -@table @kbd -@item J a -@kindex J a (Agent Server) -@findex gnus-agent-add-server -$B8=:_$N%5!<%P!<$r!"(Bgnus $B%(!<%8%'%s%H$G07$o$l$k%5!<%P!<$N0lMw$KDI2C$9(B -$B$k(B (@code{gnus-agent-add-server})$B!#(B - -@item J r -@kindex J r (Agent Server) -@findex gnus-agent-remove-server -$B8=:_$N%5!<%P!<$r!"(Bgnus $B%(!<%8%'%s%H$G07$o$l$k%5!<%P!<$N0lMw$+$i:o=|$9(B -$B$k(B (@code{gnus-agent-remove-server})$B!#(B -@end table - -@node Agent Expiry -@subsection $B%(!<%8%'%s%H4|8B@Z$l>C5n(B - -@vindex gnus-agent-expire-days -@findex gnus-agent-expire -@kindex M-x gnus-agent-expire -@cindex Agent expiry -@cindex Gnus Agent expiry -@cindex expiry - -@code{nnagent} $B$O4|8B@Z$l>C5n$r07$$$^$;$s!#$=$NBe$o$j$K!"FCJL(B -$B$J(B @code{gnus-agent-expire} $BL?Na$,(B @code{gnus-agent-expire-days} $BF|$h$j(B -$B$b8E$$4{FI5-;v$rA4$F>C5n$7$^$9!#$3$l$O$"$J$?$,%G%#%9%/MFNL$r;H$$@Z$j$=$&(B -$B$@$H;W$C$?$H$-$K$$$D$G$b$G(B) $BCfCG$9$k$3$H$b$"(B -$B$^$jNI$$$3$H$G$O$"$j$^$;$s!#(B - -@vindex gnus-agent-expire-all -@code{gnus-agent-expire-all} $B$,(B @code{nil} $B$G$J$1$l$P!"$3$NL?Na$OA4$F$N(B -$B5-;v(B --- $BL$FI!"4{FI!"2D;k!"J]N15-;v$r>C5n$7$^$9!#$b$7(B @code{nil} ($B$3$l$,(B -$B=i4|@_DjCM(B) $B$G$"$l$P!"4{FI5-;v$N$_$,>C5n$NBP>]$H$J$j!"L$FI!"2D;k!"J]N15-(B -$B;v$O$5$i$KL54|8B$KJ];}$7$^$9!#(B - -@node Agent and IMAP -@subsection $B%(!<%8%'%s%H$r(B IMAP $B$G;H$&J}K!(B - -$B%(!<%8%'%s%H$O(B nnimap $B$r4^$`(B gnus $B$N$I$s$J%P%C%/%(%s%I$G$bF0:n$7$^$9!#$7(B -$B$+$7(B @sc{nntp} $B$H(B @sc{imap} $B$K$O$$$/$D$+$N35G0$N0c$$$,$"$k$N$G!"$3$N9`$G(B -$B$O(B gnus $B%(!<%8%'%s%H$r(B @sc{imap} $B$N(B @dfn{unplugged} $B$J%b!<%I$N%/%i%$%"%s(B -$B%H$H$7$F1_3j$K;H$($k$h$&$K$9$k$?$a$N!"$$$/$D$+$N>pJs$rDs6!$7$^$9!#(B - -$B?4$KN1$a$F$*$/:G=i$N$3$H$O!"A4$F$N%U%i%0(B (read, ticked $B$J$I(B) $B$O(B nntp $B$N(B -$B>l9g$K$*$1$k(B @code{.newsrc} $B$G$O$J$/$F(B @sc{imap} $B%5!<%P!<$KJ];}$5$l$k$H(B -$B$$$&$3$H$G$9!#$7$?$,$C$F!"(Bgnus $B$O(B @dfn{unplugged} $B$N$H$-$N%U%i%0$NJQ2=$r(B -$B3P$($F$*$$$F!":F$S@\B3$7$?$H$-$K$=$l$i$N%U%i%0$rF14|$5$;$kI,MW$,$"$j$^$9!#(B - -gnus $B$O%(!<%8%'%s%H$N85$G(B nnimap $B%0%k!<%W$rFI$`$H$-!"%G%#%U%)%k%H$G%U%i(B -$B%0$NJQ2=$K@d$($:Cm0U$7$F$$$^$9!#$"$J$?$,:F$S@\B3$7$?$H$-!"%G%#%U%)%k%H(B -$B$G(B gnus $B$O$"$J$?$,2?$i$+$N%U%i%0$rJQ99$7$?$+$I$&$+$rD4$Y$F!"$"$J$?$,$=$l(B -$B$i$r%5!<%P!<$HF14|$5$;$?$$$+$I$&$+$r?R$M$^$9!#$3$N5sF0(B -$B$O(B @code{gnus-agent-synchronize-flags} $B$G%+%9%?%^%$%:$9$k$3$H$,$G$-$^$9!#(B - -@vindex gnus-agent-synchronize-flags -$B$b$7(B @code{gnus-agent-synchronize-flags} $B$,(B @code{nil} $B$@$C$?$i!"%(!<%8%'(B -$B%s%H$O<+F0E*$K%U%i%0$rF14|$5$;$k$3$H$O$7$^$;$s!#$b$7$=$l$,=i4|CM(B -$B$N(B @code{ask} $B$@$C$?$i!"%(!<%8%'%s%H$O$"$J$?$,:F@\B3$7$?$H$-$K$"$J$?$,2?(B -$B$i$+$NJQ99$r9T$J$C$F$$$?$+$I$&$+$rD4$Y$F!"$=$l$i$rF14|$5$;$?$$$+$I$&$+$r(B -$B?R$M$^$9!#$b$7$=$l$i0J30$NCM$@$C$?>l9g$O!"A4$F$N%U%i%0$O<+F0E*$KF14|$5$;(B -$B$i$l$^$9!#(B - -$B$b$7$"$J$?$,!":F@\B3$7$?$H$-$K<+F0$G%U%i%0$rF14|$5$;$?$/$J$$$J$i!"C$;$P!"$"$J$?$,!VF14|!W$NA`:n$r9T$J$C$?$H$-(B -$B$K!"$=$N%U%i%0$O%;%C%H$5$l$F%5!<%P!<$+$i$O:o=|$5$l$^$9!#(B -@c FIXMETGNUS Does it make sense? -"The queued flag" $B$K4X$9$kF0:n$O!"%(!<%8%'%s%H%G%#%l%/%H%j$K$"$k%5!<%P!<(B -$BKh$N(B @code{flags} $B%U%!%$%k$NCf$G8+$D$+$k$G$7$g$&!#$=$l$i$O$"$J$?$,%U%i%0(B -$B$rF14|$5$;$?$H$-$K6u$K$J$j$^$9!#(B - -@node Outgoing Messages -@subsection $B:9=PMQ%a%C%;!<%8(B - -Gnus $B$,@Z$jN%$5$l$F$$$k$H$-!"A4$F$N:9=PMQ%a%C%;!<%8(B ($B%a!<%k$H%K%e!<%9$N(B -$BN>J}(B) $B$O2<=q$-%0%k!<%W(B (@pxref{Drafts}) $B$K3JG<$5$l$^$9!#Ej9F$7$?8e$G$b!"(B -$B$3$3$G$=$N%a%C%;!<%8$r8+$?$j!"JT=8$7$?$j$9$k$N$O0U$N$^$^$G$9!#(B - -Gnus $B$,:F$S:9$79~$^$l$?$H$-!"%a%C%;!<%8$rAw?.$9$k$?$a$K!"FCJL$JL?Na$r;H$C(B -$B$F2<=q$-%0%k!<%W$+$iAw$k$3$H$b!"%0%k!<%W%P%C%U%!Fb$G(B @kbd{J S} $B$r;H$C$F!"(B -$B2<=q$-%0%k!<%WFb$NA4$F$NAw?.2DG=%a%C%;!<%8Aw?.$9$k$3$H$b$G$-$^$9!#(B - -@node Agent Variables -@subsection $B%(!<%8%'%s%HJQ?t(B - -@table @code -@item gnus-agent-directory -@vindex gnus-agent-directory -Gnus $B%(!<%8%'%s%H$,%U%!%$%k$r3JG<$9$k>l=j!#=i4|@_DjCM(B -$B$O(B @file{~/News/agent/}$B!#(B - -@item gnus-agent-handle-level -@vindex gnus-agent-handle-level -$B$3$NJQ?t$NCM$h$j9b$$%l%Y%k(B (@pxref{Group Levels}) $B$N%0%k!<%W$O!"%(!<%8%'(B -$B%s%H$+$i$OL5;k$5$l$^$9!#=i4|@_DjCM$O(B @code{gnus-level-subscribed} $B$G!"$3(B -$B$l$O=i4|@_Dj$G$O!"9XFI$7$F$$$k%0%k!<%W$N$_$,%(!<%8%'%s%H$N=hM}$NBP>]$H$J(B -$B$k$H$$$&$3$H$G$9!#(B - -@item gnus-agent-plugged-hook -@vindex gnus-agent-plugged-hook -$B%M%C%H%o!<%/$K@\B3$5$l$?$H$-$K$K9g$o$;$FJT=8$7!"(BPPP ($B$d2?$+(B) $B$r5/F0$7$F!"(B -@kbd{M-x gnus} $B$HBG80$7$F$/$@$5$$!#(B - -$B$"$J$?$,=i$a$F(B gnus $B$ro$H$F$b;~4V$,(B -$B$+$+$j$^$9$,!"0lEY$@$1$7$+C5n$7$^$9!#(B(@kbd{A k} $B$G:o=|(B -$B%0%k!<%W$OA4$FLa$C$F$-$^$9!#(B) - -$B$5$F!"$3$3$G$=$N>l$G%0%k!<%W$rFI$`$3$H$b$G$-$^$9$7!"$"$k$$(B -$B$O(B @kbd{J s} $BL?Na$G5-;v$r%@%&%s%m!<%I$9$k$3$H$b$G$-$^$9!#$"$H$O$3$N%^%K%e(B -$B%"%k$N;D$j$rFI$s$G!"$=$NB>$N2?I42/$N9`L\$+$i%+%9%?%^%$%:$7$?$$$3$H$r8+$D(B -$B$1=P$7$F$/$@$5$$!#(B - -@node Batching Agents -@subsection $B0l3g%(!<%8%'%s%H=hM}(B - -Gnus $B%(!<%8%'%s%H$K5-;v$ro$K4JC1$G$9!#(B -$B0J2<$N%7%'%k%9%/%j%W%H$OI,MW$J$3$H$rA4$F$d$C$F$/$l$k$G$7$g$&!#(B - -@example -#!/bin/sh -emacs -batch -l ~/.emacs -f gnus-agent-batch >/dev/null -@end example - -@node Control Agents -@subsection gnus-agent $B4D6-$r(B Control $B$9$k(B -$B$3$3$^$GFI$s$GMh$i$l$F!"%(!<%8%'%s%H$,Hs>o$KJXMx$J5!G=$G$"$k;v$,J,$+$C$?(B -$B$H;W$$$^$9!#$?$@!"ITK~$JE@$,$"$k$H$9$k$H!"Kh2s(B @kbd{J j} $B$d(B @kbd{J S} $BEy(B -$B$r%-!<$G:n6H$7$J$1$l$P$J$i$J$$$3$H$G$7$g$&!#%*%s%i%$%s$HF1$8$h$&$JA`:n$G(B -$B$d$j$H$j$G$-$?$i!"$H9M$($?;v$O$"$j$^$;$s$+(B? -gnus-offline $B$O$=$N5!G=$rDs6!$7$^$9!#(B($BI.)$7$^$9!#(B@code{MIEE} $B$K$D$$$F$O8e=R;2>H(B) - -*Group* $B%P%C%U%!$G(B @kbd{g} $B$r2!$9;v$G(B - -@lisp - (Dialup $B$NI,MW$J4D6-$G$O(B Dialup) -> - Mail $B$N - Spool $B$KN/$C$?(B message $B$NAw?.(B -> - News $B$NAw?.(B -> - $BITMW$J5-;v$N(B expire -@end lisp - -$B$^$G$r9T$$$^$9!#(B - -$B%$%s%9%H!<%k$O$$$?$C$F4JC1!#(B($B$3$3$^$G$G(B gnus-agent $B$N@_Dj$O=*$C$F$$$k$H(B -$B2>Dj$7$^(B -$B$9(B) @file{~/.emacs} $B$N(B gnus-agent $B$N@_Dj$N$A$g$$$HA0$K(B - -@lisp -(load "gnus-ofsetup") -(gnus-setup-for-offline) -(load gnus-offline-setting-file) -@end lisp - -$B$H$$$l!"(BEmacs $B$r:F5/F0$7$F$/$@$5$$!#$9$k$H!"$5$^$6$^$Jl9g$K(B -$B$O!"(B@code{MIEE} $B$N@_Dj$O$$$C$5$$$7$J$/$F$b$+$^$$$^$;$s!#(B - -@table @code -@vindex gnus-offline-articles-to-fetch -@item gnus-offline-articles-to-fetch -$B$3$NJQ?t$Ol9g$O!"(BMail $B$@$1$rl9g$O!"(BNews $B$@$1$rl9g$O!"(B -Mail/News $BN>J}$r2A$5$l$k(B hook $B$G$9!#(B - -@vindex gnus-offline-before-online-hook -@item gnus-offline-before-online-hook -$B$3$NJQ?t$O(B Gnus $B$,(B Online(Plugged) $B>uBV$K$J$kD>A0$KI>2A$5$l$k(B hook $B$G$9!#(B - -@vindex gnus-offline-after-online-hook -@item gnus-offline-after-online-hook -$B$3$NJQ?t$O(B Gnus $B$,(B Offline(UnPlugged) $B>uBV$K$J$C$?8e$KI>2A$5$l$k(B hook $B$G(B -$B$9!#(B - -@vindex gnus-offline-interval-time -@item gnus-offline-interval-time -$B$3$NJQ?t$G;XDj$5$l$?4V(B -$B3V(B ($BIC?t(B) $B$G(B @code{gnus-offline-articles-to-fetch} $B$G;XDj$5$l(B -$B$?(B article $B$r$N%*%U%i%$%s%K%e!<%9%j!<%@!<$N$h$&$K$OF0:n$7$^$;(B -$B$s!#$3$l$i$OA[A|E*$J?M$+$i$NNI$/$"$kl9g!"(B -$B$b$&0l2s%@%&%s%m!<%I$5$l$k$N$G$9$+(B? - -@strong{$B$O$$!#(B} -@end table - -$BMWLs$9$k$H!"(Bgnus $B$,@Z$jN%$5$l$F$$$k$H$-$O!"%m!<%+%k$KJ]B8$5$l$?5-;v$r8+(B -$B$k$@$1$G$9!#@\B3$5$l$F$$$k$H$-$O!"(BISP $B$HOC$9$@$1$G$9!#(B - -@node Scoring -@chapter $B%9%3%"(B -@cindex scoring - -$BB>$N?M!9$O(B @dfn{$B:o=|%U%!%$%k(B} $B$r;H$$$^$9$,!"$3$3(B gnus $B%?%o!<$O:o=|$h$j$b(B -$B%9%3%"$NJ}$r9%$_$^$9$N$G!"B>$H3JF.$9$k$h$j$O@Z$jBX$($k;v$K$7$^$7$?!#$=$l(B -$B$i$O40A4$K0c$&;v$r$7$^$9$N$G!"??$CD>$0$K:B$C$FCm0U$rJ'$C$F$/$@$5$$(B! - -@vindex gnus-summary-below -$BA4$F$N5-;v$O%9%3%"$N=i4|CM$r;}$C$F$*(B -$B$j(B (@code{gnus-summary-default-score})$B!"$3$l$O%G%#%U%)%k%H$G(B 0 $B$G$9!#$3(B -$B$N%9%3%"$OBPOCE*$d!"%9%3%"%U%!%$%k(B (score file) $B$NJ}K!$K$h$j!">e$2$i$l$?(B -$B$j2<$2$i$l$?$j$7$^$9!#(B@code{gnus-summary-bark-below} $B$h$j$bDc$$%9%3%"$N(B -$B5-;v$K$O4{FI$N0u$,IU$-$^$9!#(B - -Gnus $B$O35N,%P%C%U%!$r:n@.$9$kA0$K!"8=:_$N%0%k!<%W$KE,MQ$5$l$k$I$s(B -$B$J(B @dfn{$B%9%3%"%U%!%$%k(B} $B$bFI$_9~$_$^$9!#(B - -$B8=:_$N5-;v$K4p$E$$$F%9%3%"$NEPO?$rA^F~$9$k$$$/$D$+$NL?Na$,35N,%P%C%U%!$K(B -$B$"$j$^$9!#Nc$($P!"(Bgnus $B$KFCDj$NI=Bj$N5-;v$N%9%3%"$r2<$2$?$j>e$2$?$j$9$k(B -$B$h$&$K5a$a$k;v$,$G$-$^$9!#(B - -$BFse;H$o$l$F$$$J$$$I$s$J(B -$BEPO?$b!"%9%3%"%U%!%$%k$NBg$-$5$r>.$5$/$9$k$?$a$K!"@E$+$K:o=|$5$l$^$9!#(B - -@menu -* Summary Score Commands:: $B8=:_$N%0%k!<%W$N$?$a$N%9%3%"EPO?$rDI2C$9(B - $B$k(B -* Group Score Commands:: $B0lHLE*$J%9%3%"L?Na(B -* Score Variables:: $B$"$J$?$N%9%3%"$r%+%9%?%^%$%:$9$k(B - ($B$^$!!"$J$s$FMQ8l$G$7$g$&(B) -* Score File Format:: $B%9%3%"%U%!%$%k$K2?$rF~$l$k$+(B -* Score File Editing:: $BC5n%U%!%$%k$r%9%3%"%U%!%$%k$KJQ49$9$k(B -* GroupLens:: $B$I$l$rFI$`$N$,9%$-$+$NM=8@$rF@$k(B -* Advanced Scoring:: $B%9%3%"$NK!B'$r:n$k$?$a$KO@M}I=8=$r;H$&(B -* Score Decays:: $B%9%3%"$r8O$l$F$$$+$;$k$N$OLr$KN)$D;v$b$"(B - $B$k(B -@end menu - -@node Summary Score Commands -@section $B35N,%9%3%"L?Na(B -@cindex score commands - -$B%9%3%"EPO?$rJQ99$9$k%9%3%"L?Na$Ol9g$G$b!"=i4|@_Dj$G%0%k!<%W$N%m!<%+%k%9%3%"%U%!%$%k$K$J$C$F$$(B -$B$^$9!#%9%3%"L?Na$r2?$+B>$N%9%3%"%U%!%$%k(B ($BNc!"(B@file{all.SCORE}) $B$KA^F~$7(B -$B$?$$$J$i!"$^$:$3$N%9%3%"%U%!%$%k$r8=:_$N$b$N$K$7$J$1$l$P$J$j$^$;$s!#(B - -$B0lHLE*$J%9%3%"L?Na$Oo$K5,B'@5$7$$K!B'$K=>$$$^$9(B -$B$N$G!"$=$l$i$NL?NaA4$F$rI=$K>e$2$kI,MW$O$"$j$^$;$s!#(B($B$?!<$/$5$s$"$j$^$9!#(B) - -@findex gnus-summary-increase-score -@findex gnus-summary-lower-score - -@enumerate -@item -$B:G=i$N%-!<$O%9%3%"$rA}$d$9$?$a$N(B @kbd{I} (i $B$NBgJ8;z(B) $B$+!"%9%3%"$r2<$2$k(B -$B$?$a$N(B @kbd{L} $B$G$9!#(B -@item -$BFsHVL\$N%-!<$O$I$N%X%C%@!<$K%9%3%"$r$7$?$$$+$rI=$7$^$9!#0J2<$N%-!<$,;HMQ(B -$B2DG=$G$9(B: - -@table @kbd -@item a -$BCxA0$K%9%3%"$rIU$1$^$9!#(B - -@item s -$BI=Bj(B (subject) $B$N9T$K%9%3%"$rIU$1$^$9!#(B - -@item x -@code{Xref} $B9T$K%9%3%"$rIU$1$^$9(B---$B$9$J$o$A!"Aj8_Ej9F9T$G$9!#(B - -@item r -@code{References} $B9T$K%9%3%"$r$D$1$^$9!#(B - -@item d -$BF|IU(B (date) $B$K%9%3%"$rIU$1$^$9!#(B - -@item l -$B9T?t(B (number of lines) $B$K%9%3%"$rIU$1$^$9!#(B - -@item i -@code{Messsage-ID} $B%X%C%@!<$K%9%3%"$rIU$1$^$9!#(B - -@item f -$B%U%)%m!<%"%C%W(B (followup) $B$K%9%3%"$rIU$1$^$9(B---$B$3$l$OCx$H$N9gCW$r$7!"(B -$B$3$NCx.$5$$$b$N$G$9!#(B - -@item = -$B?t;z$HEy$7$$$b$N$G$9!#(B - -@item > -$B?t;z$h$jBg$-$$$b$N$G$9!#(B -@end table -@end table - -@item -$B;M$D$a$G!":G8e$N%-!<$O$3$l$,0l;~E*(B ($B$9$J$o$A!"4|8B@Z$l>C5n(B) $B$N%9%3%"EPO?(B -$B$+!"1JB3E*$J(B ($B$9$J$o$A!"4|8B@Z$l>C5n$G$J$$(B) $B%9%3%"EPO?$G$"$k$+$H$$$&$3$H!"(B -$B$b$7$/$O$9$0$K$J$5$l$k$Y$-$+!"%9%3%"%U%!%$%k$KDI2C$9$k;v$O$7$J$$$+$H$$$&(B -$B;v$r;XDj$7$^$9!#(B - -@table @kbd -@item t -$B0l;~E*$J(B (temporary) $B%9%3%"EPO?$G$9!#(B - -@item p -$B1JB3E*$J(B (permanent) $B%9%3%"EPO?$G$9!#(B - -@item i -$BB(:B$N(B (immediate) $B%9%3%"IU$1$G$9!#(B -@end table - -@end enumerate - -$B$G$9$+$i!"8=:_$NCxo$K4JC1$G$9!#(B - -$BJ*;v$rJ#;($K$9$k$N$O!"C;=LBG80$,B8:_$9$k$+$i$G$9!#FsHVL\$+;0HVL\$NJ8;z$K(B -$BBgJ8;z$r;H$&$H!"(Bgnus $B$O;D$k0l$D$+Fs$D$NBG80$K=i4|CM$r;H$$$^$9!#=i4|CM(B -$B$O(B ``$BJ8;zNs$N0lIt(B'' $B$H(B ``$B0l;~E*(B'' $B$G$9!#$G$9$+$i!"(B -@kbd{I A} $B$O(B @kbd{I a s t} $B$HF1$8$G!"(B@kbd{I a R} $B$O(B @kbd{I a r t} $B$HF1$8(B -$B$G$9!#(B - -$B$3$l$i$N4X?t$O?t;z@\F,0z?t$H!"%7%s%\%k@\F,0z?t$re$2$k(B) $B$+$r;XDj$7$^$9!#%7%s%\%k@\F,0z?t(B @code{a} $B$OL?Na$,(B -$B8=:_$N%9%3%"%U%!%$%k$G$O$J$/%U%!%$%k(B @file{all.SCORE} $B$r;H$&;v$r;XDj$7$^(B -$B$9!#(B - -@vindex gnus-score-mimic-keymap -@code{gnus-score-mimic-keymap} $B$O$3$l$i$NL?Na$,%-!<%^%C%W$G$"$k$+$N$h$&(B -$B$K?6$kIq$&$+$I$&$+$r;XDj$7$^$9!#(B - -@node Group Score Commands -@section $B%0%k!<%W%9%3%"L?Na(B -@cindex group score commands - -$B;DG0$J$,$i!"$^$@$?$/$5$s$O$"$j$^$;$s!#(B - -@table @kbd -@item W f -@kindex W f ($B%0%k!<%W(B) -@findex gnus-score-flush-cache -Gnus $B$O2?EY$b%9%3%"O"A[%j%9%H$rFI$_9~$`$N$rHr$1$k$?$a$K!"$=$l$N%-%c%C%7%e(B -$B$rJ];}$7$F$$$^$9!#$3$NL?Na$O%-%c%C%7%e$r=q$-=P$7$^(B -$B$9(B (@code{gnus-score-flush-cache})$B!#(B -@end table - -$B0J2<$N$h$&$J;v$r$9$k;v$K$h$C$F!"%3%^%s%I9T$+$i%9%3%"IU$1$r$9$k;v$,$G(B -$B$-$^$9!#(B - -@findex gnus-batch-score -@cindex batch scoring -@example -& emacs -batch -l ~/.emacs -l ~/.gnus.el -f gnus-batch-score -@end example - -@node Score Variables -@section $B%9%3%"JQ?t(B -@cindex score variables - -@table @code -@item gnus-use-scoring -@vindex gnus-use-scoring -@code{nil} $B$G$"$l$P!"(Bgnus $B$O%9%3%"%U%!%$%k$rD4$Y$:!"0lHLE*$K!"%9%3%"4XO"(B -$B$N;E;v$rA4$/$7$^$;$s!#$3$l$O=i4|@_Dj$G(B @code{t} $B$G$9!#(B - -@item gnus-kill-killed -@vindex gnus-kill-killed -$B$3$NJQ?t$,(B @code{nil} $B$G$"$l$P!"(Bgnus $B$O4{$K:o=|2aDx$r$K2C$($k@\Hx8l$G$9(B ($B=i4|CM(B -$B$G(B @samp{SCORE} $B$G$9!#(B) - -@item gnus-score-uncacheable-files -@vindex gnus-score-uncacheable-files -@cindex score cache -$BA4$F$N%9%3%"%U%!%$%k$OIaDL$O%9%3%"%U%!%$%k$N2a>jFI$_9~$_$rHr$1$k$?$a$K(B -$B%-%c%C%7%e$5$l$^$9!#$7$+$7!"$3$l$K$h$j$"$J$?$N(B Emacs $B$,Bg$-$/HnBg2=$9$k(B -$B$N$G$"$l$P!":F$SI,MW$H$5$l$J$$$h$&$J%9%3%"%U%!%$%k$r=|5n$9$k$?$a$K$3$N@5(B -$B5,I=8=$r;H$&;v$,$G$-$^$9!#(B@file{all.SCORE} $B$N%-%c%C%7%e$r;_$a$k$N$O0-$$(B -$B9M$($G$9$,!"(B@file{comp.infosystems.www.authoring.misc.ADAPT} $B$r%-%c%C%7%e(B -$B$7$J$$$N$ONI$$9M$($G$7$g$&!#e$2(B/$B2<$2L?Na$K$h$C$F;H$o$l$k>e$2(B/$B2<$2$9$k%9%3%"$G$9!#(B -$B%G%#%U%)%k%H$O(B 1000 $B$G!"2a>j$@$H;W$&$+$b$7$l$^$;$s$,!"$3$l$OE,1~%9%3%"IU(B -$B$1$r$9$kM>CO$NB8:_$9$k;v$r3N.$5$JJQ99$G>e=q$-$5$l$?$/$O$"$j$^$;$s!#(B - -@item gnus-summary-default-score -@vindex gnus-summary-default-score -$B5-;v$N%9%3%"$N=i4|CM$G!"=i4|@_Dj$G$O(B 0 $B$K$J$C$F$$$^$9!#(B - -@item gnus-summary-expunge-below -@vindex gnus-summary-expunge-below -$B$3$NJQ?t$h$jDc$$%9%3%"$r;}$D5-;v$O35N,$N9T$KI=<($5$l$^$;$s!#$3$l$O=i4|@_(B -$BDj$G(B @code{nil} $B$G!"$3$l$O$I$N5-;v$b1#$5$l$J$$$H$$$&;v$G$9!#$3$NJQ?t$O3F(B -$B35N,%P%C%U%!$K8GM-$G!"(B@code{gnus-summary-mode-hook} $B$K$h$C$F@_Dj$5$l$k$Y(B -$B$-$G$9!#(B - -@item gnus-score-over-mark -@vindex gnus-score-over-mark -$B=i4|@_Dj$N%9%3%"$h$jBg$-$J%9%3%"$r;}$D5-;v$KBP$7$F(B ($B;07eL\$K(B) $B;H$o$l$k0u(B -$B$G$9!#=i4|@_Dj$O(B @samp{+} $B$G$9!#(B - -@item gnus-score-below-mark -@vindex gnus-score-below-mark -$B=i4|@_Dj$N%9%3%"$h$j>.$5$J%9%3%"$r;}$D5-;v$KBP$7$F(B ($B;07eL\$K(B) $B;H$o$l$k0u(B -$B$G$9!#=i4|@_Dj$O(B @samp{-} $B$G$9!#(B - -@item gnus-score-find-score-files-function -@vindex gnus-score-find-score-files-function -$B8=:_$N%0%k!<%W$N%9%3%"%U%!%$%k$r8+$D$1$k$?$a$K;H$o$l$k4X?t$G$9!#$3$N4X?t(B -$B$O%0%k!<%WL>$r0z?t$H$7$F8F$P$l$^$9!#(B - -$B;HMQ2DG=$J4{Dj4X?t$O(B: - -@table @code -@item gnus-score-find-single -@findex gnus-score-find-single -$B%0%k!<%W<+?H$N%9%3%"%U%!%$%k$@$1$rE,MQ$7$^$9!#(B - -@item gnus-score-find-bnews -@findex gnus-score-find-bnews -bnews $B9=J8$r;H$C$F!"A4$F$N9gCW$9$k%9%3%"%U%!%$%k$rE,MQ$7$^$9!#$3$l$,=i4|(B -$B@_Dj$G$9!#Nc$($P!"8=:_$N%0%k!<%W$,(B @samp{gnu.emacs.gnus} $B$J$i$P!"(B -@file{gnu.all.SCORE}, @file{not.alt.SCORE} $B$H(B @file{gnu.all.SCORE} $B$,$9(B -$B$Y$FE,MQ$5$l$^$9!#MW$9$k$K!"%9%3%"%U%!%$%kL>(B -$B$N(B @samp{all} $B$,(B @samp{.*} $B$KJQ49$5$l!"$=$l$+$i@55,I=8=$N9gCW$,$J$5$l$^(B -$B$9!#(B - -$B$3$l$O!"A4$F$N%0%k!<%W$KE,MQ$7$?$$%9%3%"EPO?$,$$$/$D$+$"$k>l9g$O!"$=$l$i(B -$B$NEPO?$r(B @file{all.SCORE} $B%U%!%$%k$KF~$l$k$H$$$&$3$H$G$9!#(B - -Gnus $B$O0lHLE*$J%9%3%"%U%!%$%k$rFCDj$N%9%3%"%U%!%$%k8~$1$N$b$N$h$jA0$KE,(B -$BMQ$7$h$&$H;n$_$^$9$,!"%9%3%"%U%!%$%k$O$[$H$s$IL5:n0Y$N=gHV$GE,MQ$5$l$^$9!#(B -$B$3$l$O%9%3%"%U%!%$%kL>$NMWAG$N?t$rD4$Y$k;v$K$h$C$F$J$5$l$^$9(B--- -@samp{all} $BMWAG$r$l(B -$B$N%5!<%P!<$KBP$7$F;}$D;v$,$G$-$k$H$$$&;v$G$9!#(B -@end table - -$B$3$NJQ?t$O4X?t$N%j%9%H$G$"$k;v$b$G$-$^$9!#$=$N>l9g$O!"$3$l$i$NA4$F$N4X?t(B -$B$,%0%k!<%WL>$r0z?t$H$7$F8F$P$l!"%9%3%"%U%!%$%k$NJV$5$l$?A4$F$N%j%9%H$,E,(B -$BMQ$5$l$^$9!#$3$l$i$N4X?t$OD>@\%9%3%"O"A[%j%9%H$N%j%9%H$N%j%9%H$rJV$9;v$b(B -$B$G$-$^$9!#$=$N>l9g$O!"$=$l$i$N%U%!%$%k$G$J$$%9%3%"O"A[%j%9%H$rJV$94X?t$O!"(B -$BJV$5$l$k:G8e$N%9%3%"%U%!%$%k$,%m!<%+%k%9%3%"%U%!%$%k$G$"$k;v$r3NC5n$rA`:n$7$F$$$kJ}K!$G$9(B---$BA4$F$N9gCW$7$J$$EPO?(B -$B$O8E$/$J$j$9$.!"9gCW$9$kEPO?$r?7A/$GLL$9$k;v$K$J$k$G$7$g$&!#(B - -@item gnus-score-after-write-file-function -@vindex gnus-score-after-write-file-function -$B$=$3$G$A$g$&$I=q$+$l$?%9%3%"%U%!%$%k$NL>A0$H6&$K8F$P$l$k4X?t$G$9!#(B - -@item gnus-score-thread-simplify -@vindex gnus-score-thread-simplify -$B$3$NJQ?t$,(B @code{nil} $B$G$J$$$H!"5-;vI=Bj$O%9%l%C%I$HF1$8J}K!$GI=Bj%9%3%"(B -$B$N$?$a$KC1=c2=$5$l$^$9(B---$B8=:_$N(B gnus-simplify-subject-functions $B$NCM$K$h$C(B -$B$F!#%9%3%"EPO?$,(B @code{$BJ8;zNsItJ,(B} $B$+(B @code{$B@53N$J(B} $B9gCW$r;H$C$F$$$k$H!"(B -$B9gCW$b$3$NJ}K!$GC1=c2=$5$l$^$9!#(B -@end table - -@node Score File Format -@section $B%9%3%"%U%!%$%kMM<0(B -@cindex score file format - -$B%9%3%"%U%!%$%k$OIaDL$OC1=c$JMM<0$N$b$N$@$1$r4^$`(B @code{emacs-lisp} $B%U%!(B -$B%$%k$G$9!#L5F\Ce$JMxMQ2A(B} (eval) $B$5$l$^$;$s!#$7$+$7!"(Blisp $B%j!<%@!<$,$3$NMM<0$rFI$_(B -$B9~$`$N$K;H$o$l$^$9$N$G!"0UL#E*$KM-8z$G$J$$$H$7$F$b!"J8K!E*$K$OM-8z$G$9!#(B - -$B$3$NO"A[%j%9%H$G$OO;$D$N%-!<$r;H$&;v$,$G$-$^$9!#(B - -@table @code -@item $BJ8;zNs(B (STRING) -$B$b$7%-!<$,J8;zNs$G$"$k$H!"$=$l$O9gCW$,A0$G$9!#%9%3(B -$B%"$O$3$l$i$NH,$D$N%X%C%@!<$@$1$K$l$N%9%3%"EPO?$O0l$D$+$i(B -$B;M$D$^$G$NMWAG$r;}$A$^$9!#(B -@enumerate - -@item -$B:G=i$NMWAG$O(B @dfn{$B9gCWMWAG(B} $B$G$9!#$?$$$F$$$N%X%C%@!<$G$O$3$l$OJ8;zNs$G$9(B -$B$,!"(BLines $B$H(B Chars $B%X%C%@!<$G$O$3$l$O@0?t$G$J$1$l$P$J$j$^$;$s!#(B - -@item -$B$b$7FsHVL\$NMWAG$,B8:_$9$k$J$i!"$=$l$O?t;z$G$"$k$Y$-$G(B -$B$9(B---@dfn{$B%9%3%"MWAG(B}$B!#$3$N?t;z$OIi$NL58BBg$+$i@5$NL58BBg$^$G$N4V$N@0?t(B -$B$G$"$k$Y$-$G$9!#$b$79gCW$,@.8y$9$l$P!"$3$N?t;z$,5-;v$N%9%3%"$K2C$($i$l$^(B -$B$9!#$b$7$3$NMWAG$,B8:_$7$F$$$J$1$l$P!"?t(B -$B;z(B @code{gnus-score-interactive-default-score}$B$,Be$o$j$K;H$o$l$^$9!#$3$l(B -$B$O=i4|@_Dj$G(B 1000 $B$G$9!#(B - -@item -$B$b$7;0HVL\$NMWAG$,B8:_$7$F$$$k$H!"$=$l$O?t;z$G$"$k$Y$-$G(B -$B$9(B---@dfn{$BF|IUMWAG(B} $B$G$9!#$3$NF|IU$O:G8e$K$3$N%9%3%"EPO?$,9gCW$7$?;~9o$r(B -$B<($7!"$3$l$O%9%3%"EPO?$N4|8B@Z$l>C5n5!9=$N5!G=$N$?$a$K;H$o$l$^$9!#$3$NMW(B -$BAG$,B8:_$7$F$$$J$1$l$P!"%9%3%"EPO?$O1JB3$7$^$9!#F|IU$O5*85A0(B 1$BG/(B12$B7n(B31$BF|(B -$B$+$i7P2a$7$?F|$K$A$N?t$GI=$5$l$^$9!#(B - -@item -$B$b$7;MHVL\$NMWAG$,B8:_$7$F$$$k$H!"$=$l$O%7%s%\%k$G$"$k$Y$-$G(B -$B$9(B---@dfn{$B7?MWAG(B} $B$G$9!#$3$NMWAG$O$3$N%9%3%"EPO?$,5-;v$K9gCW$9$k$+$I$&$+(B -$B$rD4$Y$k$N$K$I$N4X?t$,;H$o$l$k$Y$-$G$"$k$+$r;XDj$7$^$9!#(B - -@table @dfn -@item From, Subject, References, Xref, Message-ID -$B$?$$$F$$$N%X%C%@!<$N7?$KBP$7$F!"(B@code{r} $B$H(B @code{R} ($B@55,I=(B -$B8=(B) (regexp) $B$d!"(B@code{s} $B$H(B @code{S} ($BJ8;zNs$N0lIt(B) (substring) $B7?!"(B -@code{e} $B$H(B @code{E} ($B@53N$J9gCW(B) (exact match)$B!"(B -@code{w} ($B8l$N9gCW(B) (word match) $B7?$,B8:_$7$^$9!#$b$7$3$NMWAG$,B8:_$7$J(B -$B$$$H!"(Bgnus $B$OJ8;zNs$N0lIt$N9gCW$,MQ$$$i$l$k$Y$-$G$"$k$H$_$J$7$^$9!#(B -@code{R}, @code{S}, @code{E} $B$O9gCW$,BgJ8;z$H>.J8;z$r6hJL$9$kJ}K!$G9T$o(B -$B$l$k$H$$$&E@$GB>$N$b$N$H0[$J$j$^$9!#A4$F$N$3$l$i$N0lJ8;z7?$OK\Ev(B -$B$O(B @code{regexp}, @code{exact}, @code{word} $B7?$NC;=L7A$G!"$b$7$=$&$7$?$$(B -$B$H;W$($P$3$A$i$rBe$o$j$K;H$&;v$,$G$-$^$9!#(B - -@item Lines, Chars -$B$3$l$i$NFs$D$N%X%C%@!<$O0c$C$?9gCW$N7?$r;H$$$^$9(B: @code{<}, @code{>}, @code{=}, @code{>=}, @code{<=} $B$G(B -$B$9!#(B - -$B$3$l$i$N=R8l$O$b$7(B - -@example -(PREDICATE HEADER MATCH) -@end example - -$B$NI>2A$,(B @code{nil} $B$G$J$$$H!"??$H$J$j$^$9!#Nc$($P!">e5i9g(B -$BCW(B @code{("lines" 4 <)} (@pxref{Advanced Scoring}) $B$O7k2L$H$7$F0J2<$N<0(B -$B$K$J$j$^$9!#(B - -@lisp -(< header-value 4) -@end lisp - -$B$b$7$/$OB>$NJ}K!$K$7$^$7$g$&(B: @code{<} $B$r(B @code{Lines} $B$G(B 4 $B$r9gCW$H$7$F(B -$B;H$C$F$$$k$H$-$O!"5-;v$,(B 4 $B9T$h$j$b>/$J$$$H$-$K%9%3%"$,DI2C$5$l$^$9!#(B($B:.(B -$BMp$7$F!"H?BP$G$O$J$$$+$H9M$(0W$$$G$9!#$G$b!"$=$&$G$O$J$$$N$G$9!#;d$,;W$&(B -$B$K!#(B) - -$B9gCW$,(B @code{Lines} $B$G$J$5$l$F$$$k$H!"$$$/$D$+$N%P%C%/%(%s(B -$B%I(B (@code{nndir}$B$N$h$&$J$b$N(B) $B$O(B @code{Lines} $B%X%C%@!<$r:n@.$7$J$$$?$a$K(B -$BA4$F$N5-;v$,(B 0 $B9T$G$"$k$H$7$F07$o$l$k;v$K5$$rIU$1$F$/$@$5$$!#$3$l$O$b$7(B -$B>/$7$N9T$7$+$J$$5-;v$N%9%3%"$r2<$2$F$$$k$N$J$i!"JQ$J7k2L$,5/$3$jF@$k;v$K(B -$B$J$j$^$9!#(B - -@item Date -Date ($BF|IU(B) $B%X%C%@!<$K$O;0$D$N$J$s$H$J$/$P$+$2$F$$$k9gCW$N7?$,$"$j$^$9(B: -@code{before}, @code{at}, @code{after} $B$G$9!#;d$OK\Ev$K$3$l$,LrN)$D$h$&(B -$B$J5!2q$rA[A|$G$-$J$$$N$G$9$,!"$3$N4X?t$rDs6!$7$J$$$N$b$J$s$H$J$/$P$+$2$F(B -$B$$$^$9!#$=$&$7$?>l9g$N$?$a$K$"$k$N$G$9!#$$$DI,MW$K$J$k$+$OC/$K$b$o$+$j$^(B -$B$;$s!#E>$P$L@h$N>s!#C;5$$OB;5$!#K\$r%+%P!<$GH=CG$7$F$O9T$1$^$;$s!#=i$a$F(B -$B$N%G!<%H$G%(%C%A$7$F$O$$$1$^$;$s!#(B($B$7$+$7!";d$O>/$J$/$H$b0l?M!"0zMQ$7$^(B -$B$9$,!"(B``$B$3$N4X?t$O7g$+$;$J$$$b$N$G$"$k;v$,$o$+$C$?(B'' $B$H8@$C$??M$,$$$k$H(B -$BJ9$$$F$$$^$9!#(B) - -($BLuCm(B: $B86E5$N(B "Once burnt, twice shy" $B$r(B "$BC;5$$OB;5$(B" $B$H$7$^$7$?$,!"$b$C(B -$B$HE,@Z$JLu$,$"$l$P$*CN$i$;2<$5$$!#(B) - -@cindex ISO8601 -@cindex date -$B$b$C$HLrN)$D9gCW$N7?$O(B @code{$B@55,I=8=(B} $B$G$9!#$=$l$K$h$C$FF|IUJ8;zNs$K@5(B -$B5,I=8=$rMQ$$$F9gCW$5$;$k;v$,$G$-$^$9!#F|IU$O$^$:(B ISO8601 $BC;=LMM(B -$B<0(B (compact format) $B$KI8=`2=$5$l$^(B -$B$9(B---@var{YYYYMMDD}@code{T}@var{HHMMSS} $B$G$9!#Nc$($P!"$b$7A4$F$NG/(B -$B$N(B 4$B7n(B1$BF|(B $B$KEj9F$5$l$?A4$F$N5-;v$K$,<#$5$;$?$$$N$G$"$l$P!"(B -@samp{....0401.........} $B$r9gCWJ8;zNs$H$7$F;H$&;v$,$G$-$^$9!#(B($BF|IU$O85!9(B -$B$NI8=`;~$GJ]B8$5$l$F$$$^$9$N$G!"$=$N5-;v$,Ej9F$5$l$?$H$3$m$G(B 4$B7n(B1$BF|(B $B$KEj(B -$B9F$5$l$?5-;v$K9gCW$9$k;v$KCm0U$7$F$/$@$5$$!#I8=`;~$O0l2H$K$H$C$FHs>o$KM-(B -$B1W$J3Z$7$_$G$7$g$&(B?) - -@item Head, Body All -$B$3$l$i$N;0$D$N9gCW$N%-!<$O(B @code{From} $B%X%C%@!<(B ($B$J$I(B) $B$HF1$89gCW$N7?$r(B -$B;H$$$^$9!#(B - -@item Followup -$B$3$N9gCW$N%-!<$O>/$7FCJL$G!"$=$l$O(B @code{From} $B%X%C%@!<$K9gCW$7!"9gCW$7(B -$B$?5-;v$@$1$G$J$/$=$N5-;v$X$NA4$F$N%U%)%m!<%"%C%W$N%9%3%"$K$b1F6A$7$^$9!#(B -$B$3$l$O$?$H$($P!"$"$J$?<+?H$N5-;v$X$N%U%)%m!<%"%C%W$N%9%3%"$rA}$d$7$?$j!"(B -$BNI$/CN$i$l$?LdBj;y$X$N%U%)%m!<%"%C%W5-;v$N%9%3%"$r2<$2$?$j$9$k$N$K;H$o$l(B -$B$^$9!#(B@code{From} $B%X%C%@!<$,;H$&$N$HF1$87?$N9gCW$r;H$$$^$9!#(B($B$3$N9gCW%-!<(B -$B$r;H$&$H!"%U%!%$%k(B @file{ADAPT} $B$r:n$k;v$K$J$j$^$9!#(B) - -@item Thread -$B$3$N9gCW%-!<$O(B @code{Followup} $B9gCW%-!<$HF1$89T$KF0:n$7$^$9!#(B -@code{Message-ID} @var{x} $B$G;O$^$C$F$$$k(B ($BI{(B)$B%9%l%C%I$K%9%3%"$rIU$1$?$$(B -$B$N$G$"$l$P!"(B@samp{thread} $B9gCW$rIU$12C$($^$9!#$3$l$O(B @code{Reference} $B%X%C(B -$B%@!<$K(B @var{x} $B$r;}$D$=$l$>$l$N5-;v$K?7$7$$(B @samp{thread} $B9gCW$rDI2C$7$^(B -$B$9!#(B($B$3$l$i$N?7$7$$(B @samp{thread} $B9gCW$O$3$l$i$N9gCW$9$k5-;v(B -$B$N(B @code{Message-ID} $B$r;H$$$^$9!#(B) $B$3$l$O%9%l%C%I$N$$$/$D$+$N5-;v$,40A4(B -$B$J(B @code{References} $B%X%C%@!<$r;}$C$F$$$J$+$C$?$H$7$F$b!"%9%l%C%IA4BN$N(B -$B%9%3%"$r>e$2(B/$B2<$2$G$-$k;v$rJ]>Z$7$^$9!#$3$l$r;H$&$H!"%9%l%C%I$N5-;v$K7h(B -$BDjE*$G$J$$%9%3%"$,IU$/$+$b$7$l$J$$$H$$$&$3$H$KCm0U$7$F$/$@$5$$!#(B($B$3$N9g(B -$BCW%-!<$r;H$&$H!"%U%!%$%k(B @file{ADAPT} $B$r:n$k;v$K$J$j$^$9!#(B) -@end table -@end enumerate - -@cindex Score File Atoms -@item mark -$B$3$NEPO?$NCM$O?t;z$G$"$k$Y$-$G$9!#$3$N?t;z$h$jDc$$%9%3%"$N5-;v$K$O4{FI$N(B -$B0u$,IU$-$^$9!#(B - -@item expunge -$B$3$NEPO?$NCM$O?t;z$G$"$k$Y$-$G$9!#$3$N?t;z$h$jDc$$%9%3%"$N5-;v$O35N,%P%C(B -$B%U%!$+$i:o=|$5$l$^$9!#(B - -@item mark-and-expunge -$B$3$NEPO?$NCM$O?t;z$G$"$k$Y$-$G$9!#$3$N?t;z$h$jDc$$%9%3%"$N5-;v$K$O4{FI$N(B -$B0u$,IU$-!"35N,%P%C%U%!$+$i:o=|$5$l$^$9!#(B - -@item thread-mark-and-expunge -$B$3$NEPO?$NCM$O?t;z$G$"$k$Y$-$G$9!#%9%3%"$NAm7W$,$3$N?t;z$h$jDc$$%9%l%C%I(B -$B$K$O4{FI$N0u$,IU$-!"35N,%P%C%U%!$+$i:o=|$5$l$^$9!#(B -@code{gnus-thread-score-function} $B$O%9%l%C%I$N%9%3%"$NAm7W$r$I$N$h$&$K7W(B -$B;;$9$k$+$r;XDj$7$^$9!#(B - -@item files -$B$3$NEPO?$NCM$OG$0U$N?t$N%U%!%$%kL>$G$"$k$Y$-$G$9!#$3$l$i$N%U%!%$%k$b%9%3(B -$B%"%U%!%$%k$G$"$k$H$_$J$5$l!"$3$l$,$5$l$?$N$HF1$8$h$&$JJ}K!$GFI$_9~$^$l$^(B -$B$9!#(B - -@item exclude-files -$B$3$NEPO?$N$G$"$k$Y$-$G$9!#$3$l$i$N%U%!%$%k(B -$B$O2?$i$+$NM}M3$GIaDL$OFI$_9~$^$l$k$h$&$K$J$C$F$$$?$H$7$F$b!"FI$_9~$^$l$^(B -$B$;$s!#(B - -@item eval -$B$3$NEPO?$NCM$O(B @code{$BI>2A(B} $B$5$l$^$9!#$3$NMWAG$OA4BNE*%9%3%"%U%!%$%k$r07$C(B -$B$F$$$k$H$-$OL5;k$5$l$^$9!#(B - -@item read-only -$BFI$_9~$_@lMQ%9%3%"%U%!%$%k$O99?7$5$l$?$jJ]B8$5$l$?$j$7$^$;$s!#A4BNE*%9%3(B -$B%"%U%!%$%k$O$3$N%"%H%`$r;HMQ$9$k$Y$-$G$9(B (@pxref{Global Score Files})$B!#(B -($BCm0U(B: @dfn{$BA4BNE*(B} $B$O$3$3$G$OK\Ev$K(B @dfn{$BA4BNE*(B} $B$H$$$&0UL#$G$9!#8D?ME*(B -$B$JA4$F$N%0%k!<%W$KE,MQ$9$k%9%3%"%U%!%$%k$N;v$G$O$"$j$^$;$s!#(B) - -@item orphan -$B$3$NEPO?$NCM$O?t;z$G$"$k$Y$-$G$9!#?F5-;v$r;}$?$J$$5-;v$O%9%3%"$K$3$N?t;z(B -$B$,2C$($i$l$^$9!#(B@samp{comp.lang.c} $B$N$h$&$JNL$NB?$$%K%e!<%9%0%k!<%W$rDI(B -$B$$$+$1$F$$$k$H$7$F$/$@$5$$!#$*$=$i$/Fs!";0$N%9%l%C%I$H?7$7$$%9%l%C%I$@$1(B -$B$rDI$$$?$$$G$7$g$&!#(B - -$B0J2<$N;0$D$N%9%3%"%U%!%$%kEPO?$K$h$C$F$=$l$r$9$k;v$,$G$-$^$9(B: - -@example - (orphan -500) - (mark-and-expunge -100) -@end example - -$B:G=i$K$3$N%0%k!<%W$KF~$C$?$H$-$O!"?7$7$$%9%l%C%I$@$1$r8+$^$9!#$=$l$+$i$*(B -$B$b$7$m$$$H;W$C$?%9%l%C%I$N%9%3%"$r>e$2(B (@kbd{I T} $B$b$7$/$O(B @kbd{I S} $B$K(B -$B$h$C$F(B)$B!";D$j$rL5;k(B (@kbd{C y}) $B$7$^$9!#/$7B8:_$7$9$kNL$NB?$$%0%k!<%W$N$?$a$K$"$j$^$9!#(B - -@item adapt -$B$3$NEPO?$OE,1~%9%3%"$r@)8f$7$^$9!#$b$7$3$l$,(B @code{t} $B$G$"$k$H!"=i4|@_Dj(B -$B$NE,1~%9%3%"K!B'$,;H$o$l$^$9!#$b$7$3$l$,(B @code{ignore} $B$G$"$k$H!"$3$N%0(B -$B%k!<%W$K$OE,1~%9%3%"$O$N$b$N$G$"$l$P!"=i4|@_Dj$NE,1~%9%3%"K!(B -$BB'$,;H$o$l$^$9!#$?$$$F$$$N%0%k!<%W$KE,1~%9%3%"$r;H$$$?$$$N$G$"$l$P!"(B -@code{gnus-use-adaptive-scorint} $B$r(B @code{t} $B$K@_Dj$7!"(B@code{(adapt -ignore)} $B$rE,1~%9%3%"$r$7$?$/$J$$%0%k!<%W$KA^F~$9$k$G$7$g$&!#>/$7$N%0%k!<(B -$B%W$G$@$1E,1~%9%3%"$r9T$$$?$$$N$G$"$l$P!"(B -@code{gnus-use-adaptive-scoring} $B$r(B @code{nil} $B$K@_Dj$7!"(B -@code{(adaptive t)} $B$r$=$l$r9T$$$?$$%0%k!<%W$N%9%3%"%U%!%$%k$KA^F~$9$k$G(B -$B$7$g$&!#(B - -@item adaptive-file -$BA4$F$NE,1~%9%3%"EPO?$O$3$NEPO?$K$h$C$FL>$E$1$i$l$?%U%!%$%k$KF~$j$^$9!#$=(B -$B$l$O%0%k!<%W$KF~$k$H$-$K$bE,MQ$5$l$^$9!#$3$N%"%H%`$OB?$/$N%0%k!<%W$KF1$8(B -$BE,1~%9%3%"%U%!%$%k$rMQ$$$k;v$K$h$C$F!"J#?t$N%0%k!<%W$K0lEY$KE,1~%9%3%"$r(B -$BIU$1$?$$$H$-$KJXMx$G$7$g$&!#(B - -@item local -@cindex local variables -$B$3$NEPO?$NCM$O(B @code{(VAR VALUE)} $BBP$N%j%9%H$G$"$k$Y$-$G$9!#$=$l$>$l(B -$B$N(B @var{var} $B$O8=:_$N35N,%P%C%U%!$N%P%C%U%!8GM-$K$J$j!";XDj$5$l$?(B -$BCM(B (value) $B$K@_Dj$5$l$^$9!#$3$l$OJXMx$J!"$b$7>/$7JQ$@$H$7$F$b!"%U%C%/$r(B -$B$"$^$j9%$^$J$$$$$/$D$+$N%0%k!<%W$GJQ?t$r@_Dj$9$kJ}K!$G$9!#(B@var{value} $B$O(B -$BI>2A$5$l$J$$;v$KCm0U$7$F$/$@$5$$!#(B -@end table - -@node Score File Editing -@section $B%9%3%"%U%!%$%kJT=8(B - -$BIaDL$OA4$F$N%9%3%"L?Na$r35N,%P%C%U%!$+$iH/9T$7$^$9$,!"/$7%+%9%?%^%$%:$5$l$?(B @code{emacs-lisp} $B%b!<%I$G!"0J2<$NDI(B -$B2C$NL?Na$,B8:_$7$^$9(B: - -@table @kbd -@item C-c C-c -@kindex C-c C-c ($B%9%3%"(B) -@findex gnus-score-edit-done -$B$"$J$?$,9T$C$?JQ99$rJ]B8$7$F35N,%P%C%U%!$KLa$j$^(B -$B$9(B (@code{gnus-score-edit-done})$B!#(B - -@item C-c C-d -@kindex C-c C-d ($B%9%3%"(B) -@findex gnus-score-edit-insert-date -$B8=:_$NF|IU$r?t;zMM<0$GA^F~$7$^$9(B (@code{gnus-score-edit-insert-date})$B!#(B -$B$b$7$3$l$,$I$N$h$&$J$b$N$G$"$m$&$H9M$($F$$$k$N$G$"$l$P!"$3$l$OK\Ev$KF|$N(B -$B?t;z$G$9!#(B - -@item C-c C-p -@kindex C-c C-p ($B%9%3%"(B) -@findex gnus-score-pretty-print -$BE,1~%9%3%"%U%!%$%k$O@0$($i$l$F$$$J$$N.57$GJ]B8$5$l$^$9!#$b$7$3$l$i$N%U%!(B -$B%$%k$NFb$N0l$D$rFI$_$?$$$H;W$C$F$$$k$N$G$"$l$P!"$^$:(B @dfn{$BAGE($JI=<((B} $B$r(B -$B$7$?$$$G$7$g$&!#$3$NL?Na(B (@code{gnus-score-pretty-print}) $B$,$"$J$?$N$?$a(B -$B$K$=$l$r$7$^$9!#(B -@end table - -$B$3$N%b!<%I$r;H$&$?$a$K$O(B @kbd{M-x gnus-score-mode} $B$HBG$C$F$/$@$5$$!#(B - -@vindex gnus-score-mode-hook -@code{gnus-score-menu-hook} $B$,%9%3%"%b!<%I%P%C%U%!$GJ}$NE,1~(B -$BJ}K!$r;H$$$?$1$l$P!"$3$NJQ?t$r(B@code{(wordline)} $B$K@_Dj$7$F$/$@$5$$!#(B - -@vindex gnus-default-adaptive-score-alist -@code{gnus-default-adaptive-score-alist} $BJQ?t$r%+%9%?%^%$%:$9$k$3$H$G!"(B -$B%9%3%"IU$1$N=hM}$r40A4$K@)8f$G$-$^$9!#Nc$($P!"$3$N$h$&$J46$8$K$J$j$^$9!#(B - -@lisp -(setq gnus-default-adaptive-score-alist - '((gnus-unread-mark) - (gnus-ticked-mark (from 4)) - (gnus-dormant-mark (from 5)) - (gnus-del-mark (from -4) (subject -1)) - (gnus-read-mark (from 4) (subject 2)) - (gnus-expirable-mark (from -1) (subject -1)) - (gnus-killed-mark (from -1) (subject -3)) - (gnus-kill-file-mark) - (gnus-ancient-mark) - (gnus-low-score-mark) - (gnus-catchup-mark (from -1) (subject -1)))) -@end lisp - -$B8+$F$*J,$+$j$N$h$&$K!"$3$NO"A[%j%9%H$N3FMWAG$O!"%-!<$H$7$F0u(B ($BJQ?tL>$+$b(B -$B$7$/$O(B ``$BK\Ev$N(B'' $B0u(B --- $B$D$^$jJ8;z(B)$B$r;}$A$^$9!#$3$N%-!<$N8e$K$OG$0U$N?t(B -$B$N%X%C%@!<(B/$B%9%3%"$NAH$,B3$-$^$9!#$b$7$=$N%-!<$N8e$K%X%C%@!<(B/$B%9%3%"$NAH$,(B -$B0l$D$b$J$1$l$P!"$=$N%-!<$,5-;v$N0u$H$7$F$D$$$F$$$k5-;v$KBP$7$F$OE,1~@-%9(B -$B%3%"$Oe5-$NNc$G$O!"(B@code{gnus-unread-mark} $B$,$D$$(B -$B$F$$$k5-;v$OE,1~@-%9%3%"$NEPO?9`L\$K$O$J$j$^$;$s!#(B - -$B3F5-;v$O$?$@0l$D$N0u$7$+;}$AF@$J$$$N$G!"$=$l$>$l$N5-;v$K$O$3$l$i$N5,B'$N(B -$B$&$A$?$@0l$D$7$+E,MQ$5$l$^$;$s!#(B - -@code{gnus-del-mark} $B$rNc$KC5n(B ($B%a!<%k(B) $B%0%k!<%W(B (@pxref{Expiring Mail})$B$,$"$l$P!"(B -$B4{FI5-;v$K$OA4$F(B @samp{E} $B0u$,$D$1$i$l$^$9!#$3$l$O$*$=$i$/!"E,1~@-%9%3%"(B -$BIU$1$r$A$g$C$H$P$+$jIT2DG=$K$9$k$N$G!"<+F04|8B@Z$l>C5n$HE,1~@-%9%3%"$O0l(B -$B=o$K$O$&$^$/$d$C$F$$$1$^$;$s!#(B - -$B%9%3%"$r$D$1$i$l$k%X%C%@!<$K(B -$B$O(B @code{from}, @code{subject}, @code{message-id}, @code{references}, @code{xref}, @code{lines}, @code{chars}, @code{date} $B$,(B -$B$"$j$^$9!#$5$i$K(B @code{followup} $B$K$b%9%3%"IU$1$G$-$^$9!#$3$l$O8=:_$N5-(B -$B;v$N(B @code{Message-ID} $B$r;HMQ$7$F(B @code{References} $B%X%C%@!<$K%^%C%A!"$9(B -$B$J$o$A$3$l$KB3$$$?%9%l%C%I$K%^%C%A$9$kE,1~@-%9%3%"EPO?$r:n@.$7$^$9!#(B - -$B$^$?(B @code{thread} $B$K$b%9%3%"IU$1$9$k$3$H$,$G$-$^$9!#$3$l$O%9%l%C%ICf$N(B -$BA4$F$N5-;v$K%9%3%"IU$1$7$h$&$H$7$^$9!#(B@code{thread} $B$N%^%C%A$O!"(B -@code{Message-ID} $B$r;H$C$F5-;v$N(B @code{References} $B%X%C%@!<$K%^%C%A$5$;(B -$B$^$9!#%^%C%A$,5/$3$C$?$i$=$N5-;v$N(B @code{Message-ID} $B$,(B @code{thread} $B5,(B -$BB'$KDI2C$5$l$^$9!#(B($B$A$g$C$H9M$($F$_$F$/$@$5$$!#8e$GF,DKLt$rFsN3$*4+$a$7(B -$B$H$-$^$9$,(B) - -$B$3$N5!9=$r;H$&$J$i$P!"$H$-$I$-5-;v$r4{FI$K$7$F$7$^$&>.$5$JJQ99$rHr$1$k$?(B -$B$a$K!"%9%3%"%U%!%$%k$N(B @code{mark} $B%"%H%`$r2?$+>.$5$$CM(B --- $B$3$H$K$h$l(B -$B$P(B -300 $B$/$i$$$K@_Dj$7$F$*$$$?J}$,NI$$$G$9!#(B - -$BE,1~@-%9%3%"$r0l=54V$+$=$3$i;H$C$F$/$k$H!"(Bgnus $B$O$=$lAj1~$KD465$5$l!"$"(B -$B$J$?$,2?$b8@$o$J$/$F$b!"$"$J$?$N9%$-$JEj9FC5n$9$k$h$&$K$J$k$O$:$G$9!#(B - -$B$I$N%0%k!<%W$K$*$$$FE,1~@-%9%3%"$r:nF0$5$;$k$+$O!"%9%3%"%U%!%$(B -$B%k(B (@pxref{Score File Format}) $B$r;H$&$3$H$K$h$C$F@)8f$G$-$^$9!#$^$?$3$l(B -$B$r;H$C$F!"0c$C$?%0%k!<%W$KBP$7$F0c$C$?5,B'$r;H$&$h$&$K$b$G$-$^$9!#(B - -@vindex gnus-adaptive-file-suffix -$BE,1~@-%9%3%"EPO?9`L\$O!"%0%k!<%WL>$K(B @code{gnus-adaptive-file-suffix} $B$r(B -$BIU2C$7$?L>A0$N%U%!%$%k$KF~$l$i$l$^$9!#=i4|@_DjCM$O(B @samp{ADAPT} $B$G$9!#(B - -@vindex gnus-score-exact-adapt-limit -$BE,1~@-%9%3%"$r9T$&$H$-$O!"ItJ,J8;zNs0lCW$d%U%!%8!<$J0lCW$r9T$C$?J}$,!"$*(B -$B$=$i$/$[$H$s$I$N>l9g$K$*$$$FNI$$7k2L$,F@$i$l$k$G$7$g$&!#$7$+$7!"%X%C%@!<(B -$B$N0lCW$7$?ItJ,$,C;$$>l9g!"0U?^$KH?$9$k$h$&$JF0:n$r$9$k2DG=@-$,Bg$-$/$J$k(B -$B$N$G!"(B@code{gnus-score-exact-adapt-limit} $B$h$jC;$$D9$5$7$+0lCW$7$J$$>l9g(B -$B$O40A40lCW$,9T$o$l$^$9!#$3$NJQ?t$,(B @code{nil} $B$G$"$l$P!"$3$NLdBj$,5/$3$i(B -$B$J$$$h$&$K>o$K40A40lCW$,9T$o$l$^$9!#(B - -@vindex gnus-default-adaptive-word-score-alist -$B>e$G=R$Y$?$h$&$K!"8DJL$NC18l$KBP$7$F$b%X%C%@!l9g!"(B -@code{gnus-default-adaptive-word-score-alist} $BJQ?t$K$h$C$F!"3FC18l$KBP$7(B -$B$F$"$k0u$X$I$s$J%9%3%"$rM?$($k$+$r;XDj$7$^$9!#(B - -@lisp -(setq gnus-default-adaptive-word-score-alist - `((,gnus-read-mark . 30) - (,gnus-catchup-mark . -10) - (,gnus-killed-mark . -20) - (,gnus-del-mark . -15))) -@end lisp - -$B$3$l$,=i4|@_DjCM$G$9!#C18l$KBP$9$kE,1~$rM-8z$K$9$k$H!"(B -@code{gnus-read-mark} $B$N0u$N$D$$$?5-;v$NI=Bj$K8=$l$kA4$F$NC18l$,!"%9%3%"(B -$B$K(B 30 $BE@DI2C$9$k$H$$$&%9%3%"5,B'$r@8$_=P$7$^$9!#(B - -@vindex gnus-default-ignored-adaptive-words -@vindex gnus-ignored-adaptive-words -@code{gnus-default-ignored-adaptive-words} $B$N%j%9%H$K8=$l$kC18l$OL5;k$5(B -$B$l$^$9!#L5;k$7$?$$C18l$rDI2C$7$?$$$H$-$O!"$3$NJQ?t$G$O$J(B -$B$/(B @code{gnus-ignored-adaptive-words} $B%j%9%H$NJ}$r;H$C$F$/$@$5$$!#(B - -@vindex gnus-adaptive-word-length-limit -$BC;$$C18l$G$OE,1~@-%9%3%"$r:nF0$5$;$k$Y$-$G$O$J$$$H;W$&?M$b$$$k$G$7$g$&!#(B -$B$b$7$=$&$J$i(B @code{gnus-adaptive-word-length-limit} $B$K@0?t$r@_Dj$9$k$3$H(B -$B$,$G$-!"$3$N?tCM$h$jC;$$C18l$OL5;k$5$l$^$9!#$3$NJQ?t$N=i4|@_DjCM(B -$B$O(B @code{nil} $B$G$9!#(B - -@vindex gnus-adaptive-word-syntax-table -$B%9%3%"IU$1$,=*N;$7$?$H$-!"(B@code{gnus-adaptive-word-syntax-table} $B$NJ8K!(B -$BI=$,$=$N1F6A$r.$5$/$J$k$3$H$O(B -$B$"$j$^$;$s!#=i4|@_DjCM$O(B @code{nil} $B$G$9!#(B - -@vindex gnus-adaptive-word-no-group-words -@code{gnus-acaptive-word-no-group-words} $B$,(B @code{t} $B$K@_Dj$5$l$F$$$k$H!"(B -gnus $B$O%0%k!<%WL>$NA4$F$N8l$K$D$$$F!"C18lE,1~@-%9%3%"$r$7$^$;$s!#$[$H$s(B -$B$I$NI=Bj$,(B @samp{emacs} $B$H$$$&8l$r4^$s$G$$$k(B @samp{comp.editor.emacs} $B$N(B -$B$h$&$J%0%k!<%W$GJXMx$G$9!#(B - -$B$3$N5!9=$r$7$P$i$/;H$C$F$_$?8e$K$O!"$"$J$?$,$I$s$JC18l$,9%$-$G$I$s$JC18l(B -$B$,7y$$$+$r!"$3$N5,B'$rDL$7$F?GCG$9$kMxMQo$K]$G$O!"$3$l$O8=>u$G$OA4$/;H(B -$B$$J*$K$J$i$J$$$h$&$K;W$($^$9!#$3$l$r$b$C$H;H$($k$h$&$K$9$k$?$a$K$O!"(B($B$h(B -$B$j87L)$JE}7WE*o(B ($B=i4|@_Dj$G(B) $B$=$N%0(B -$B%k!<%WMQ$N%9%3%"%U%!%$%k$K$J$j$^$9!#Nc$($P!"(B@samp{gnu.emacs.gnus} $BMQ$N%[!<(B -$B%`%9%3%"%U%!%$%k$O(B @file{gnu.emacs.gnus.SCORE} $B$H$J$k$o$1$G$9!#(B - -$B$7$+$7$J$,$i!"$3$l$O$"$J$?$N$*K>$_$G$O$J$$$+$b$7$l$^$;$s!#$?$/$5$s$N%0%k!<(B -$B%W4V$G6&DL$N%[!<%`%9%3%"%U%!%$%k$r6&M-$9$k$HJXMx$J$H$-$,B?$$$G$7$g(B -$B$&(B --- $BNc$($PA4$F$N(B @samp{emacs} $B%0%k!<%W$GF1$8%[!<%`%9%3%"%U%!%$%k$r;H(B -$B$&$3$H$b$G$-$^$9!#(B - -@vindex gnus-home-score-file -$B$3$l$r@)8f$9$kJQ?t$,(B @code{gnus-home-score-file} $B$G$9!#$3$l$O0J2<$NCM$r(B -$Bl9g$3$N%U%!%$%k$,A4$F$N%0%k!<%W$G%[!<%`%9%3%"%U%!%$%k$H$7$F(B -$B;HMQ$5$l$^$9!#(B - -@item -$B4X?t!#$3$N4X?t$N7k2L$,%[!<%`%9%3%"%U%!%$%k$H$7$F;HMQ$5$l$^$9!#$3$N4X?t$O(B -$B%0%k!<%W$NL>A0$r0z?t$H$7$F8F$S=P$5$l$^$9!#(B - -@item -$B%j%9%H!#$3$N%j%9%H$NMWAG$O0J2<$NCM$r$K%^%C%A(B -$B$9$l$P!"(B@var{file-name} $B$,%[!<%`%9%3%"%U%!%$%k$H$7$F;HMQ$5$l$^$9!#(B - -@item -$B4X?t!#$3$N4X?t$,(B @code{nil} $B0J30$rJV$;$P!"$=$NJV5QCM$,%[!<%`%9%3%"%U%!%$(B -$B%k$H$7$F;HMQ$5$l$^$9!#(B - -@item -$BJ8;zNs!#$3$NJ8;zNs$r%[!<%`%9%3%"%U%!%$%k$H$7$F;HMQ$7$^$9!#(B -@end enumerate - -$B$3$N%j%9%H$NCf$+$i%^%C%A$9$k$b$N$r!":G=i$+$i8e$m$NJ}$K8~$+$C$FC5$7$F$$$-(B -$B$^$9!#(B - -@end enumerate - -$B$H$$$&$o$1$G!"C1$K0l8D$N%9%3%"%U%!%$%k$r;H$$$?$$>l9g$O!"0J2<$N$h$&$K$9$l(B -$B$P$G$-$^$9!#(B - -@lisp -(setq gnus-home-score-file - "my-total-score-file.SCORE") -@end lisp - -$B$b$7A4(B @samp{gnu} $B%0%k!<%W$KBP$7$F(B @file{gnu.SCORE} $B$r!"A4(B @samp{rec} $B%0(B -$B%k!<%W$KBP$7$F(B @file{rec.SCORE} ($BEy!9(B) $B$r;H$$$?$1$l$P!"$3$N$h$&$K$G$-$^(B -$B$9!#(B - -@findex gnus-hierarchial-home-score-file -@lisp -(setq gnus-home-score-file - 'gnus-hierarchial-home-score-file) -@end lisp - -$B$3$l$OJXMx$J$h$&$K$"$i$+$8$aDs6!$5$l$F$$$k4X?t$G$9!#B?$N4X?t$O0J2<$N0J2<(B -$B$N$b$N$r4^$_$^$9!#(B - -@table @code -@item gnus-current-home-scre-file -@findex gnus-current-home-score-file -``$B8=:_$N(B'' $BI8=`%9%3%"%U%!%$%k$rJV$7$^$9!#$3$l$O%9%3%"L?Na$K%9%3%"%U%!%$(B -$B%k$N(B ``$B:GFbIt(B'' $B9gCW$X$NEPO?$r2C$($k$h$&$K$7$^$9!#(B -@end table - -$B$b$7(B @samp{emacs} $B%0%k!<%WMQ$N%9%3%"%U%!%$%k$H!"$=$l$H$OJL(B -$B$N(B @samp{comp} $B%0%k!<%WMQ$N%9%3%"%U%!%$%k$r;H$$!"B>$NA4It$N%0%k!<%W$G$O(B -$B$=$l$>$lFH<+$N%9%3%"%U%!%$%k$r;H$$$?$$$N$G$"$l$P!"(B - -@lisp -(setq gnus-home-score-file - ;; All groups that match the regexp "\\.emacs" - '(("\\.emacs" "emacs.SCORE") - ;; All the comp groups in one score file - ("^comp" "comp.SCORE"))) -@end lisp - -@vindex gnus-home-adapt-file -@code{gnus-home-adapt-file} $B$O(B @code{gnus-home-score-file} $B$HA4$/F1$8$h(B -$B$&$KF0:n$7$^$9$,!"$3$l$OBe$o$j$K2?$r%[!<%`E,MQ%9%3%"%U%!%$%k$K$9$k$+$r;X(B -$BDj$7$^$9!#?7$7$$E,MQ%U%!%$%kEPO?9`L\$OA4$F!"$3$NJQ?t$G;XDj$5$l$k%U%!%$%k(B -$B$KF~$l$i$l$^$9!#CM$K$OF1$8J8K!$,5v$5$l$^$9!#(B - -@code{gnus-home-score-file} $B$H(B @code{gnus-home-adapt-file} $B$N;HMQ$K2C$((B -$B$F!"%0%k!<%W%Q%i%a!<%?(B (@pxref{Group Parameters}) $B$H%H%T%C%/%Q%i%a!<(B -$B%?(B (@pxref{Topic Parameters}) $B$r;H$C$F$[$\F1MM$N$3$H$,$G$-$^$9!#%0%k!<%W!"(B -$B%H%T%C%/%Q%i%a!<%?$O$3$NJQ?t$h$j$bM%@h$5$l$^$9!#(B - -@node Followups To Yourself -@section $B<+J,<+?H$X$N%U%)%m!<%"%C%W(B - -Gnus $B$O8=:_$N%P%C%U%!!<$+$i(B @code{Message-ID} $B%X%C%@!<$r8+$D$1=P$9$?$a$K(B -$BFs$D$NL?Na$rDs6!$7$F$$$^$9!#$=$7$F(B gnus $B$O!"B>$N5-;v$K$*$1(B -$B$k(B @code{References} $B%X%C%@!@\%U%)%m!<%"%C%W$7$?5-;v$K%9%3%"$r2C;;$7$^$9!#(B - -@item gnus-score-followup-thread -@findex gnus-score-followup-thread -$B$3$l$O$"$J$?$N5-;v$h$j(B ``$B2<(B'' $B$N%9%l%C%I$K8=$l$k5-;vA4$F$KBP$7$F%9%3%"$r(B -$B2C;;$7$^$9!#(B -@end table - -@vindex message-sent-hook -$B$3$l$iFs$D$N4X?t$O!"4pK\E*$K$O$I$A$i$b(B @code{message-sent-hook} $B$N$h$&$J(B -$B%U%C%/$NCf$G;H$&$?$a$N$b$N$G$9!#Nc$($P$3$N$h$&$K(B: -@lisp -(add-hook 'message-sent-hook 'gnus-score-followup-thread) -@end lisp - -$B$"$J$?$N<+J,$N(B @code{Message-ID} $B$r$8$C$/$j$HD/$a$F$_$k$H!"$O$8$a$NFs!"(B -$B;0J8;z$O>o$KF1$8$G$"$k$3$H$K5$$,$D$/$G$7$g$&!#0J2<$NFs$D$O;d$N$b$N$G$9!#(B - -@example - - -@end example - -$B$D$^$j$3$N%^%7%s>e$G$N(B ``$B;d$N(B'' $B$N<1JL$O(B @samp{x6} $B$G$"$k$H$$$&$3$H$G$9!#(B -$B$3$l$O;H$($^$9(B --- $B0J2<$N5,B'$O;d<+?H$X$N%U%)%m!<%"%C%WA4$F$KBP$7$F%9%3(B -$B%"$rA}2C$5$;$k$G$7$g$&!#(B - -@lisp -("references" - ("" - 1000 nil r)) -@end lisp - -``$B$"$J$?$N(B'' $B$,:G=i$NFsJ8;z$K$J$k$+:G=i$N;0J8;z$K$J$k$+$O%7%9%F%`$K0MB8(B -$B$7$^$9!#(B - -@node Scoring On Other Headers -@section $BB>$N%X%C%@!<$K%9%3%"$rIU$1$k(B -@cindex scoring on other headers - -gnus $B$,(B ``$BEAE}E*(B'' $B$J%X%C%@!<(B -- @samp{From}, @samp{Subject} $B$J$I(B -- $B$K(B -$B%9%3%"$rIU$1$k$N$O$H$F$bB.$$$G$9!#$G$9$,!"B>$N%X%C%@!<$K%9%3%"$rIU$1$k$K(B -$B$O(B @code{head} $B$N%9%3%"$N$?$a$N5,B'$r=q$/I,MW$,$"$j!"$=$l$O9gCW$rC5$9$?(B -$B$a$K(B gnus $B$,Kh2s%P%C%/%(%s%I$+$iC1FH$N5-;v$r\$7$/@bL@$5(B -$B$l$F$$$^$9$,!"$3$3$G$O(B @code{nnml} $B$G(B @samp{To} $B$H(B @samp{Cc} $B%X%C%@!<$K(B -$B%9%3%"$rIU$1$kJ}K!$ND4M}$NNc$r5s$2$^$7$g$&!#(B - -$B0J2<$r(B @file{.gnus.el} $B%U%!%$%k$KCV$$$F2<$5$$!#(B - -@lisp -(setq gnus-extra-headers '(To Cc Newsgroups Keywords) - nnmail-extra-headers gnus-extra-headers) -@end lisp - -gnus $B$r:F5/F0$7$F!"(B@kbd{M-x nnml-generate-nov-databases} $B%3%^%s%I(B -$B$G(B @code{nnml} $B$N(B overview $B%U%!%$%k$r:n$jD>$7$^$9!#$b$7$"$J$?$,$?$/$5$s(B -$B$N%a!<%k$r;}$C$F$$$k$H!"$3$l$K$OD9$$;~4V$,$+$+$j$^$9!#(B - -$B$=$7$F(B @kbd{I e s p To RET RET} $B$N$h$&$K$9$k$H!"$"$J$?(B -$B$O(B @samp{To} $B$H(B @samp{Cc} $B%X%C%@!<$K(B ``extra headers'' $B$H$7$F%9%3%"$rIU(B -$B$1$k$3$H$,$G$-$^$9!#(B - -$B$o$+$C$?$+$J(B? $B4JC1$@$h$M!#(B - -@node Scoring Tips -@section $B%9%3%"IU$1$N1|5A(B -@cindex scoring tips - -@table @dfn -@item $B%/%m%9%]%9%H(B -@cindex crossposts -@cindex scoring crossposts -$B%/%m%9%]%9%H$N%9%3%"$rDc$/$7$?$1$l$P!"%^%C%A$5$;$k$Y$-9T(B -$B$O(B @code{Xref} $B%X%C%@!<$G$9!#(B - -@lisp -("xref" (" talk.politics.misc:" -1000)) -@end lisp - -@item $BJ#?t$N%/%m%9%]%9%H(B -$B$"$k?t!"Nc$($P;0$D0J>e$N%0%k!<%W$K%/%m%9%]%9%H$5$l$F$$$k5-;v$N%9%3%"$rDc(B -$B$/$7$?$1$l$P!"(B - -@lisp -("xref" - ("[^:\n]+:[0-9]+ +[^:\n]+:[0-9]+ +[^:\n]+:[0-9]+" - -1000 nil r)) -@end lisp - -@item $BK\J8$X$N%^%C%A(B -$B$3$l$O0lHLE*$K$O$"$^$jNI$$9M$($G$O$"$j$^$;$s(B --- $B$=$l$O$H$F$bD9;~4V$+$+$C(B -$B$F$7$^$&$+$i$G$9!#$l$N5-;v$r8DJL$K%5!<%P!<$+$i$l$N5-;v$O(B @emph{$BFs2s(B} $B$K(B @code{All} $B$r;H$C$FA4It%^%C%A$5$;$F$/$@$5(B -$B$$!#(B - -@item $B4{FI$N0uIU$1(B -$B$"$k0lDj?t;z0J2<$N%9%3%"$r;}$D5-;v$K$O!"$*$=$i$/4{FI$N0u$r$D$1$F$7$^$$$?(B -$B$/$J$k$G$7$g$&!#$3$l$O(B @file{all.SCORE} $B%U%!%$%k$K0J2<$N$b$N$rF~$l$F$*$/(B -$B$3$H$K$h$C$F:G$b4JC1$K$N5-;vA4$F$r>C5n$7$F$7$^$$$?$1$l$P!"%9%3%"%U%!%$%k$K0J2<$N$h(B -$B$&$J$b$N$rF~$l$k$3$H$b$G$-$^$9!#(B - -@lisp -(("subject" - ("Sex with Emacs" 2)) - (mark 1) - (expunge 1)) -@end lisp - -$B$=$7$F(B @samp{Sex with Emacs} $B$K%^%C%A$9$kA4$F$N5-;v$r=8$a$F!";D$j$r=3Ht(B -$B$P$9$?$a$K4{FI$N0u$r$D$1!">C5n$7$^$9!#(B - -@node Global Score Files -@section $B%0%m!<%P%k%9%3%"%U%!%$%k(B -@cindex global score files - -$B4V0c$$$J$/!"B>$N%K%e!<%9%j!<%@!<$O(B ``$B%0%m!<%P%k:o=|%U%!%$(B -$B%k(B (global kill file)'' $B$r;}$C$F$$$^$9!#$3$l$OIaDL!"A4$F$N%0%k!<%W$KE,MQ(B -$B$5$l$k!"%f!<%6$N%[!<%`%G%#%l%/%H%j!<$K3JG<$5$l$F$$$k0l$D$N:o=|%U%!%$%k0J(B -$B>e$N2?J*$G$b$"$j$^$;$s!#$O$s(B! $B$A$C$]$1$J%K%e!<%9%j!<%@!<$@$M!#$N?M$N%9%3%"%U%!%$%k$r;H$&$?$a$K$7$J$1$l$P$J$i$J$$$3$H$O!"(B -@code{gnus-global-score-files} $BJQ?t$r@_Dj$9$k$3$H$@$1$G$9!#$=$l$>$l$N%9(B -$B%3%"%U%!%$%kKh$K!"$"$k$$$O$=$l$>$l$N%9%3%"%U%!%$%k%G%#%l%/%H%jKh$KBP$7$F(B -$B0l$D$N9`L\$K$J$j$^$9!#(BGnus $B$O$I$N%9%3%"%U%!%$%k$r$I$N%0%k!<%W$K;H$&$N$,(B -$BE,@Z$G$"$k$+$r<+J,$G7hDj$7$^$9!#(B - -$BNc$($P(B @file{/ftp@@ftp.gnus.org:/pub/larsi/ding/score/soc.motss.SCORE} $B$N(B -$B%9%3%"%U%!%$%k$H(B @file{/ftp@@ftp.some-where:/pub/score} $B%G%#%l%/%H%j$K$"(B -$B$kA4$F$N%9%3%"%U%!%$%k$r;H$$$?$1$l$P!"(B - -@lisp -(setq gnus-global-score-files - '("/ftp@@ftp.gnus.org:/pub/larsi/ding/score/soc.motss.SCORE" - "/ftp@@ftp.some-where:/pub/score/")) -@end lisp - -@findex gnus-score-search-global-directories -@noindent -$B$I$&$@$$!"4JC1$@$m$&(B? $B%G%#%l%/%H%jL>$O(B @samp{/} $B$G=*$o$i$J$/$F$O$J$j$^$;(B -$B$s!#$3$l$i$N%G%#%l%/%H%j$OIaDL$O!"0l2s$N(B gnus $B;HMQ4|4VCf$K0l2s$@$1$7$+FI(B -$B$_9~$_$^$;$s!#$b$71s3V%G%#%l%/%H%j$r$N?M$?$A$K;H$C$F$b$i$&$h$&$K0];}$7$?$/$J$C$F$-$?(B -$B$i!"C1$K$"$J$?$N%9%3%"%U%!%$%k$rF?L>(B FTP $B$KCV$$$F!"@$3&Cf$K8xI=$7$F$/$@(B -$B$5$$!#5U;J2q!$Ao$KB?$/$N>l=j$K%/%m%9%]%9%H$5$l$F$$$k5-;v$O4V0c$$$J$/6}$G$"$k!#(B -@item -$B0l8D$NITE,@Z$J5-;v$r8:E@$9$k$K$O!"(B@code{Message-ID} $B$G8:E@$9$k!#(B -@item -$BFC$KAG@2$i$7$$Ej9FOL5;k$NEj9F$rIQHK$K7+$jJV$9Ej9FC5n$N%9%3%"9`L\$r;H$C$F%U%!%$%k$NBg$-$5$r>.$5$/M^$($k!#$G$b$*$=$i$/$O!"(B -$B%5%$%H$K$h$C$F8E$$5-;v$rD94|4VJ]B8$9$k$h$&$K!"4|8B@Z$l>C5n$N4|4V$OD9$/$N%K%e!<%9%j!<%@!<$O>-Mh!"%0%m!<%P%k%9%3%"%U%!%$%k$r%5%]!<(B -$B%H$9$k$G$7$g$&$+(B? @emph{$B$&$U$U(B}$B!#$=$&!"$I$&9M$($F$_$?$C$F!"(B -Blue Wave $B$d(B xrn $B$d(B 1stReader $B$H$+$$$C$?%K%e!<%9%j!<%@!<$O%9%3%"$r%5%]!<(B -$B%H$9$k$Y$-$@$M!#:#$O8GBC$r0{$s$G8+C5n%U%!%$%k(B -@cindex kill files - -Gnus $B$O$^$@!"$"$N$&$6$C$?$$8E$$>C5n%U%!%$%k$r%5%]!<%H$7$F$$$^$9!#C(B -$B5n%U%!%$%k$N9`L\$O$b$&>C$7$F$b$h$$$N$G$9$,!"$=$l$O(B Daniel Quinlan $B$,%9%3(B -$B%"%U%!%$%k$r9M$(=P$9A0$K;d$,=q$$$?$b$N$J$N$G!"$=$N%3!<%I$O$^$@;D$C$F$$$^(B -$B$9!#(B - -$BMW$9$k$K!">C5n=hM}$O%9%3%"=hM}$h$j$b$+$J$jCY$$$N$G(B ($B;d$N8@$$$?$$$N(B -$B$O(B @emph{$B$b$N$9$4$/(B})$B!"$"$J$?$N>C5n%U%!%$%k$O%9%3%"%U%!%$%k$K=q$-49$($?(B -$BJ}$,NI$$$+$b$7$l$^$;$s!#(B - -$B$$$:$l$K$;$h!">C5n%U%!%$%k$OIaDL$N(B @code{emacs-lisp} $B%U%!%$%k$G$9!#$3$N(B -$B%U%!%$%k$NCf$K$O$I$s$J7A<0$G$bF~$l$k$3$H$,$G$-$^$9!#$D$^$j>C5n%U%!%$%k$r(B -$B%0%k!<%W$KF~$C$?$H$-$Ko$N>C5n%U%!%$%k$O0J2<$N$h$&$K$J$j$^$9!#(B - -@lisp -(gnus-kill "From" "Lars Ingebrigtsen") -(gnus-kill "Subject" "ding") -(gnus-expunge "X") -@end lisp - -$B$3$l$O;d$,=q$$$?A4$F$N5-;v$K4{FI$N0u$r$D$1!"35N,%P%C%U%!$+$i0u$N$D$$$?5-(B -$B;v$r:o=|$7$^$9!#$H$C$F$bJXMx$G$9!#$"$J$?$b$=$&;W$&$G$7$g!#(B - -$BB>$N%W%m%0%i%`$G$OA4$/0c$&>C5n%U%!%$%k$N9=J8$r;H$C$F$$$^$9!#$b(B -$B$7(B gnus $B$,(B @code{rn} $B$N>C5n%U%!%$%k$i$7$-$b$N$K=P2q$C$?$i!"2?$H$+$=$l$r(B -$B2rC5n%U%!%$%k$rJT=8$9$k$?$a$NFs$D$N35N,%P%C%U%!4X?t$,$"$j$^$9!#(B - -@table @kbd -@item M-k -@kindex M-k (Summary) -@findex gnus-summary-edit-local-kill -$B$=$N%0%k!<%W$N>C5n%U%!%$%k$rJT=8$9(B -$B$k(B (@code{gnus-summary-edit-local-kill})$B!#(B - -@item M-K -@kindex M-K (Summary) -@findex gnus-summary-edit-global-kill -$B0lHL>C5n%U%!%$%k$rJT=8$9$k(B (@code{gnus-summary-edit-global-kill})$B!#(B -@end table - -$B>C5n%U%!%$%k$rJT=8$9$kFs$D$N%0%k!<%W%b!<%I4X?t$,$"$j$^$9!#(B - -@table @kbd -@item M-k -@kindex M-k (Group) -@findex gnus-group-edit-local-kill -$B$=$N%0%k!<%W$N>C5n%U%!%$%k$rJT=8$9$k(B (@code{gnus-group-edit-local-kill})$B!#(B - -@item M-K -@kindex M-K (Group) -@findex gnus-group-edit-global-kill -$B0lHL>C5n%U%!%$%k$rJT=8$9$k(B (@code{gnus-group-edit-global-kill})$B!#(B -@end table - -$B>C5n%U%!%$%kJQ?t!#(B - -@table @code -@item gnus-kill-file-name -@vindex gnus-kill-file-name -@samp{soc.motss} $B%0%k!<%WMQ$N>C5n%U%!%$%k$ODL(B -$B>o(B @file{soc.motss.KILL} $B$H$$$&L>A0$G$9!#$3$N%U%!%$%kL>$rF@$k$?$a$K%0%k!<(B -$B%WL>$KIU2C$5$l$k@\Hx<-$O!"(B@code{gnus-kill-file-name} $BJQ?t$GM?$($i$l$^$9!#(B -``$B%0%m!<%P%k(B'' $B>C5n%U%!%$%k$O(B ($B%9%3%"%U%!%$%k$N0UL#$G(B -$B$N(B ``$B%0%m!<%P%k(B'' $B$8$c$J$$$h!"$b$A$m$s(B) $BC1$K(B @file{KILL}$B$H$$$&L>A0$G$9!#(B - -@vindex gnus-kill-save-kill-file -@item gnus-kill-save-kill-file -$B$3$NJQ?t$,(B @code{nil} $B0J30$G$"$l$P!"(Bgnus $B$O=hM}$N8e$K>C5n%U%!%$%k$rJ]B8(B -$B$7$^$9!#$3$l$O4|8B@Z$l:o=|$r9T$&>C5n$r;H$C$F$$$k$H$-$KI,MW$G$9!#(B - -@item gnus-apply-kill-hook -@vindex gnus-apply-kill-hook -@findex gnus-apply-kill-file-unless-scored -@findex gnus-apply-kill-file -$B%0%k!<%W$K>C5n%U%!%$%k$rE,MQ$9$k$?$a$K8F$S=P$5$l$k%U%C%/!#$3$l$O=i4|@_Dj(B -$B$G$O(B @code{(gnus-apply-kill-file)} $B$G$9!#$b$7F1$8%0%k!<%W$KBP$7$F%9%3%"(B -$B%U%!%$%k$,$"$k>l9g$K$O>C5n%U%!%$%k$rL5;k$7$?$1$l$P!"$3$N%U%C%/(B -$B$r(B @code{(gnus-apply-kill-file-unless-scored)} $B$K@_Dj$7$^$9!#>C5n%U%!%$(B -$B%k$r=hM}$5$;$?$/$J$1$l$P!"$3$NJQ?t$r(B@code{nil} $B$K@_Dj$7$F$/$@$5$$!#(B - -@item gnus-kill-file-mode-hook -@vindex gnus-kill-file-mode-hook -$B>C5n%U%!%$%k%b!<%I%P%C%U%!Fb$G8F$S=P$5$l$k%U%C%/!#(B -@end table - -@node Converting Kill Files -@section $B>C5n%U%!%$%k$NJQ49(B -@cindex kill files -@cindex converting kill files - -$B$"$J$?$,8E$$>C5n%U%!%$%k$r$I$C$5$j;}$C$F$$$k$N$G$"$l$P!"$=$l$i$r%9%3%"%U%!(B -$B%$%k$KJQ49$7$?$/$J$k$G$7$g$&!#$b$7$=$l$i$,(B ``$BIaDL$N(B''$B$d$D$G$"$l$P!"(B -@file{gnus-kill-to-score.el} $B%Q%C%1!<%8$r;H$&$3$H$,$G$-$^$9!#$=$&$G$J$1(B -$B$l$P!"C5n%U%!%$%k$+$i%9%3%"%U%!%$%k$X$NJQ49%Q%C%1!<%8$O!"I8=`$G$O(Bgnus $B$K$O4^(B -$B$^$l$^$;$s!#(B -@uref{http://www.stud.ifi.uio.no/~larsi/ding-various/gnus-kill-to-score.el} $B$+(B -$B$iF~C5n%U%!%$%k$,Hs>o$KJ#;($J$b$N$G$"$l$P(B --- $B$=$l(B -$B$K(B @code{gnus-kill} $B7A<00J30$N$b$N$,$?$/$5$s4^$^$l$F$$$l$P!"$=$l$i$r$N(B -$B?M$H6&$K8+$D$1$k$N$r=u$1$k$?$a$N6&F1A*JL5!9=$G$9!#(B - -$B$3$l$rC#@.$9$k$?$a$K!"(BGroupLens $B5!9=$O$"$J$?$,4{$KFI$s$@5-;v$KBP$9$k0U8+(B -$B$r!"F1$8$h$&$J;v$r$7$?B>$N?M$N0U8+$H7k9g$7$F!"$=$l$>$l$NL$FI%K%e!<%95-;v(B -$B$K8D?M2=$5$l$?M=8@$rM?$($^$9!#(BGroupLens $B$rCg?M$N$h$&$J$b$N$@$H8+$J$7$F$/(B -$B$@$5$$!#(BGroupLens $B$O$"$J$?$,$I$N$h$&$K5-;v$N2ACM$rIU$1$k$+$r8+$F!"F1$8$h(B -$B$&$K5-;v$N2ACM$rIU$1$k?M$rC5$7$^$9!#0lEY$"$J$?$N0U8+$H0lCW$9$k?M$rH/8+$9(B -$B$l$P!"M=8@$N7A$G!"$=$l$i$N?M$,5-;v$r$I$&;W$&$+$r$"$J$?$K9p$2$^$9!#$"$J$?(B -$B$O$3$NM=8@$r5-;v$rFI$_$?$$$+$I$&$+$r7hDj$9$k$N$KLrN)$F$k;v$,$G$-$^$9!#(B - -@menu -* Using GroupLens:: $B$I$N$h$&$K(B gnus $B$K(B GroupLens $B$r;H$o$;$k(B - $B$h$&$K$9$k$+(B -* Rating Articles:: GropLens $B$K$"$J$?$,$I$N$h$&$KCM$rIU$1$k(B - $B$+$rCN$i$;$k(B -* Displaying Predictions:: GropuLens $B$K$h$C$FM?$($i$l$?M=8@$rI=<($9(B - $B$k(B -* GroupLens Variables:: GoupLens $B$r%+%9%?%^%$%:$9$k(B -@end menu - -@node Using GroupLens -@subsection GroupLens $B$r;H$&(B - -GroupLens $B$r;H$&$?$a$K$O!"%m!<%+%k$N(B Better Bit Berau (BBB) $B$KI.(B -$BL>(B (pseudonym) $B$rEPO?$7$J$1$l$P$J$j$^$;$s!#(B -@uref{http://www.cs.umn.edu/Research/GroupLens/bbb.html} $B$,8=:_!"$A$^$?(B -$B$KB8:_$9$kM#0l$N(B better bit $B$G$9!#(B - -$BEPO?$7$?8e$G!"$$$/$D$+$NJQ?t$r@_Dj$9$kI,MW$,$"$j$^$9!#(B - -@table @code -@item gnus-use-grouplens -@vindex gnus-use-grouplens -$B$3$NJQ?t$r(B @code{nil} $B$G$J$$CM$K@_Dj$9$k$H!"(BGnus $B$,A4$F$N(B GroupLens $B4XO"(B -$B4X?t$r%U%C%/$9$k$h$&$K$J$j$^$9!#(B - -@item grouplens-pseudonym -@vindex grouplens-pseudonym -$B$3$NJQ?t$O(B Better Bit Bureau $B$KEPO?$7$?$H$-$K$b$i$C$?I.L>$K@_Dj$5$l$k$Y(B -$B$-$G$9!#(B - -@item grouplens-newsgroups -@vindex grouplens-newsgroups -GroupLens $B$NM=8@$rF@$?$$$H;W$&%0%k!<%W$N%j%9%H$G$9!#(B -@end table - -$B$3$l$,5/$->e$,$C$F(B GroupLens $B$r$N?M$,9M$($kJ?6Q$K4p$E$$$?%9%3%"$r$"(B -$B$J$?$KDs6!$9$k$3$H$r;O$a$^$9!#$7$+$7!"(BGroupLens $B$NK\Ev$NMx1W$ro$KLr$KN)$A$^(B -$B$9!#(B -@end table - -$Be=q$-$9$k$+$rA*$V;v$,$G$-$^$9!#>e(B -$B=q$-$,=i4|@_Dj$G$9!#$7$+$7!"(Bgnus $B$N%9%3%"$r(B grouplens $B$N%9%3%"$KB-$9$N$r(B -$B9%$`?M$b$$$^$9!#J,N%%9%3%"$N?6$kIq$$$rF@$k$?$a$K$O!"(B -@code{gnus-grouplens-override-scoring} $B$r(B @code{'separate} $B$K@_Dj$9$kI,(B -$BMW$,$"$j$^$9!#(BGroupLens $B$NM=8@$H(B grouplens $B%9%3%"$r7k9g$9$k$?$a$K$O$=$l(B -$B$r(B @code{'override} $B$K@_Dj$7!"%9%3%"$r7k9g$9$k$?$a$K(B -$B$O(B @code{gnus-grouplens-override-scoring} $B$r(B @code{'combine} $B$K@_Dj$7$^(B -$B$9!#7k9gIU2C5!G=$rMQ$$$k$H$-$O!"(B -@code{grouplens-prediction-offset} $B$H(B @code{grouplens-score-scale-factor} $B$N(B -$BCM$r@_Dj$7$?$$$H;W$&$G$7$g$&!#(B - -@vindex grouplens-prediction-display -$B$I$A$i$N>l9g$G$b!"(BGroupLens $B$OFs!";0$NM=8@$,$I$N$h$&I=<($5$l$?$$$+$NA*Br(B -$B$rM?$($^$9!#M=8@$NI=<($OJQ?t(B @code{grouplens-prediction-display} $B$K$h$C(B -$B$F@)8f$5$l$^$9!#(B - -$B0J2<$N$b$N$,$=$NJQ?t$GM-8z$JCM$G$9!#(B - -@table @code -@item prediction-spot -$BM=8@$,9b$$$[$I!"1&$NJ}$K(B @samp{*} $B$,I=<($5$l$^$9!#(B - -@item confidence-interval -$B?t;z$N3N?.(B (confidence) $B4V3V$G$9!#(B - -@item prediction-bar -$BM=8@$,9b$$$[$I!"K@$,D9$/$J$j$^$9!#(B - -@item confidence-bar -$B?t;z3N?.$G$9!#(B - -@item confidence-spot -$B3N?.$,9b$$$[$IE@$,Bg$-$/$J$j$^$9!#(B - -@item prediction-num -$BIaDL$N@N$J$,$i$N?tCM$G$9!#(B - -@item confidence-plus-minus -$BM=8@$N(B +/- $B3N?.$G$9!#(B -@end table - -@node GroupLens Variables -@subsection GroupLens $BJQ?t(B - -@table @code -@item gnus-summary-grouplens-line-format -GropuLens $B3HD%$N35N,%P%C%U%!$G;H$o$l$k35N,9TMM<0$G$9!#IaDL$N35N,9TMM<0$,(B -$Be5i%9%3%"IU$1(B - -$BI=Bj$d(B From $B%X%C%@!<$K%9%3%"$rIU$1$k$N$O==J,AGE($G$9$,!"$"$k?MFCDj$NBj$K(B -$B4X$7$F8@$C$F$$$k;v$K$@$1K\Ev$K6=L#$,$"$k>l9g$O$I$&$9$l$PNI$$$N$G$7$g(B -$B$&(B? $B$b$7$/$O!"(BA $B$5$s$,(B B $B$5$s$K%U%)%m!<%"%C%W$7$F$$$k$H$-$K8@$C$F$$$k;v(B -$B$rFI$_$?$/$J$$$1$l$I!"(BC$B$5$s$K%U%)%m!<%"%C%W$7$F$$$k$H$-$O2?$r8@$C$F$$$k(B -$B$+$rCN$j$?$$$H$$$&>l9g$O(B? - -$B>e5i%9%3%"K!B'$r;H$&;v$G!"G$0U$NJ#;($J%9%3%"$NIU$1J}$r:n@.$9$k;v$,$G$-$^(B -$B$9!#(B - -@menu -* Advanced Scoring Syntax:: $BDj5A(B -* Advanced Scoring Examples:: $B$I$N$h$&$K8+$($k$+(B -* Advanced Scoring Tips:: $B$=$l$r:GBg8BMxMQ$9$k(B -@end menu - -@node Advanced Scoring Syntax -@subsection $B>e5i%9%3%"IU$19=J8(B - -$BIaDL$N%9%3%"K!B'$OK!B'$N:G=i$NMWAG$KJ8;zNs$,$"$j$^$9!#>e5i%9%3%"IU$1K!B'(B -$B$O:G=i$NMWAG$K%j%9%H$,$"$j$^$9!#FsHVL\$N%j%9%H$O:G=i$NMWAG(B -$B$,(B @code{nil} $B$G$J$$CM$KI>2A$5$l$?$H$-$KE,MQ$5$l$^$9!#(B - -$B$3$l$i$N%j%9%H$O;0$D$NO@M}:nMQ;R$+$i$J$C$F$*$j!"$=$l$i$O0lJ}8~:nMQ;R$G!"(B -$B?'!9$J9gCW:nMQ;R$G$9!#(B - -$BO@M}:nMQ;R(B: - -@table @code -@item & -@itemx and -$B$3$NO@M}:nMQ;R$O$=$l$>$l$N0z?t$r(B @code{false} $B$KI>2A$5$l$k$b$N$r8+$D$1$k(B -$B$^$GI>2A$7!"$=$l$+$iDd;_$7$^$9!#A4$F$N0z?t$,(B @code{true} $B$NCM$KI>2A$5$l(B -$B$?>l9g$O!"$3$N:nMQ;R$O(B @code{true} $B$rJV$7$^$9!#(B - -@item | -@itemx or -$B$3$NO@M}:nMQ;R$O$=$l$>$l$N0z?t$r(B @code{true} $B$KI>2A$5$l$k$b$N$r8+$D$1$k(B -$B$^$GI>2A$7$^$9!#$b$7$I$N0z?t$b(B @code{true} $B$G$J$$$H!"$3$N:nMQ;R(B -$B$O(B @code{false} $B$rJV$7$^$9!#(B - -@item ! -@itemx not -@itemx ,A,(B -$B$3$NO@M}:nMQ;R$OC10l$N0z?t$N$_$r$H$j$^$9!#$=$l$O$=$N0z?t$NCM$NO@M}H]Dj$r(B -$BJV$7$^$9!#(B -@end table - -$B0z?t$r%9%3%"IU$1$5$l$F$$$k8=:_$N5-;v$NAD@h$KE,MQ$9$k(B @dfn{$B4V@\:nMQ;R(B} $B$,(B -$B$"$j$^$9!#Nc$($P!"(B@code{1-} $B$O8=:_$N5-;v$N?F$K$b%9%3%"K!B'$rE,MQ$7$^$9!#(B -@code{2-} $B$O8=:_$N5-;v$NADIcJl$K%9%3%"K!B'$rE,MQ$7$^$9!#Be$o$j$K!"(B -@code{^^} $B$r=q$/;v$b$G$-!"$3$N;~!"(B@code{^} ($B%-%c%i%C%H(B) (carat) $B$N?t$O$I(B -$B$N$/$i$$AD@h$N5-;v$^$G$5$+$N$\$k$+$r<($7$^$9!#(B - -$B:G8e$K!"9gCW:nMQ;R$,$"$j$^$9!#$3$l$i$,K\Ev$N;E;v$r$9$k$b$N$G$9!#9gCW:nMQ(B -$B;R$O%X%C%@!$NJ8;zNs$G!"$=$N8e$K9gCW$H9gCW$N7?$,B3$-$^$9!#E57?E*$J9gCW(B -$B:nMQ;R$O(B @samp{("form" "Lars Ingebrigtsen" s)} $B$N$h$&$J$b$N$G$9!#%X%C%@!<(B -$BL>$OC1=c$J%9%3%"IU$1$r$9$k$H$-$N$b$N$HF1$8$G!"9gCW$N7?$bF1$8$G$9!#(B - -@node Advanced Scoring Examples -@subsection $B>e5i%9%3%"IU$1$NNc(B - -Lars $B$,(B Gnus $B$K4X$7$FOC$r$7$F$$$k$H$-$KH`$K$h$C$F=q$+$l$?5-;v$N%9%3%"$r(B -$BA}$d$7$?$$$H$7$^$7$g$&(B: - -@example -((& - ("from" "Lars Ingebrigtsen") - ("subject" "Gnus")) - 1000) -@end example - -$B$M!"$H$F$bC1=c$G$7$g(B? - -$BD9$$5-;v$r=q$$$F$$$k$H$-$O!";~!92?$+AGE($J;v$r8@$$$^$9(B: - -@example -((& - ("from" "Lars Ingebrigtsen") - (| - ("subject" "Gnus") - ("lines" 100 >))) - 1000) -@end example - -$B$7$+$7!"H`$,(B Reig Eigil Logge $B$K$h$C$F=q$+$l$?$b$N$KH?1~$7$F$$$k$H$-$O!"(B -$BH`$,=q$$$?$b$N$rFI$_$?$/$"$j$^$;$s(B: - -@example -((& - ("from" "Lars Ingebrigtsen") - (1- ("from" "Reig Eigir Logge"))) - -100000) -@end example - -Redmondo $B$,>C$($?7$2<$K$D$$$F=q$$$?$H$-$K%U%)%m!<%"%C%W$7$?A4$F$N?M$O%9(B -$B%3%"$,>e$2$i$l$^$9$,!"$=$l$OH`$i$,Gr$$7$2<$K$D$$$F8l$C$F$$$k$H$-$N$_$G$9!#(B -$B$7$+$7!"(BLars $B$,7$2<$K$D$$$FOC$r$7$F$$$k$H$-$O!"$?$$$F$$$"$^$j$*$b$7$m$/(B -$B$"$j$^$;$s(B: - -@example -((& - (1- - (& - ("from" "redmondo@@.*no" r) - ("body" "disappearing.*socks" t))) - (! ("from" "Lars Ingebrigtsen")) - ("body" "white.*socks")) - 1000) -@end example - -$B2DG=@-$OL58BBg$G$9!#(B - -@node Advanced Scoring Tips -@subsection $B>e5i%9%3%"$N$A$g$C$H$7$?Hk7m(B - -@code{&} $B$H(B @code{|} $BO@M}:nMQ;R$O!"C;=L2sO)O@M}$r9T$$$^$9!#$9$J$o$A!"$=(B -$B$N:nMQ$N7k2L$,L@$i$+$K$J$C$F;~E@$G!"0z?t$r2A$,(B @code{false} $B$K$J$k$H!";D$j$N0z?t$rI>2A(B -$B$9$kL\E*$OB8:_$7$J$/$J$j$^$9!#$3$l$OCY$$9g(B -$BCW(B (@samp{body} $B$d(B @samp{header}) $B$r:G8e$K;}$C$F$-$F!"B.$$9g(B -$BCW(B (@samp{from} $B$d(B @samp{subject}) $B$r:G=i$K;}$C$F$/$k$Y$-$G$"$k$H$$$&;v(B -$B$r0UL#$7$^$9!#(B - -$B4V@\:nMQ;R(B (@code{1-} $B$J$I(B) $B$O$=$l$i$N0z?t$r%9%l%C%I$N0l@$BeA0$K:nMQ$9$k(B -$B$h$&$K$7$^$9!#e$,$k798~$,$"$k;v$K5$IU$/$+$b$7$l$^$;$s!#FC$K!"E,1~(B -$B%9%3%"$r;H$C$F$$$k$H$-$O!#%9%3%"$,Bg$-$/$J$j$9$.$k$H!"$=$l$i$O0UL#$r<:$$(B -$B$^$9(B---$B$=$l$i$OC1$K:GBg$rDL$j1[$7$F$7$^$C$F!"$=$l$r0UL#$N$"$kJ}K!$G;H$&(B -$B;v$OFq$7$/$J$j$^$9!#(B - -@vindex gnus-decay-scores -@findex gnus-decay-score -@vindex gnus-decay-score-function -Gnus $B$O$3$NLdBj$N2r7h$r=u$1$k$?$a$K%9%3%"$rIe$i$;$k5!9=$rDs6!$7$^$9!#%9(B -$B%3%"%U%!%$%k$OFI$_9~$^$l!"(B@code{gnus-decay-scores} $B$,(B @code{nil} $B$G$J$$(B -$B$H!"(Bgnus $B$O%9%3%"%U%!%$%k$rIeGT5!9=$rDL$7!"A4$F$N1JB3$G$J$$%9%3%"K!B'$N(B -$B%9%3%"$r2<$2$^$9!#IeGT<+?H$O4X?t(B @code{gnus-decay-score-function} $B$K$h$C(B -$B$Fe$2$k$+(B -* Mode Lines:: $B%b!<%I9T$K>pJs$rI=<($9$k(B -* Highlighting and Menus:: $B%P%C%U%!$rAGE($G?4CO$h$/8+$;$k(B -* Buttons:: $B4JC1$J==Jb$G%"%-%l%9g'$rF@$k(B -* Daemons:: Gnus $B$O$"$J$?$NN"$GJ*;v$r$NB@$j$d$9$$?);v$rHr$1$kJ}K!(B -* Undo:: $B$$$/$D$+$NF0:n$O85$KLa$9;v$,$G$-$k(B -* Moderation:: $B$"$J$?$,%b%G%l!<%?!<$@$C$?$i$I$&$9$k$+(B -* XEmacs Enhancements:: XEmacs $B$G$O$b$C$H3($d$=$NB>$N$b$N$,B8:_(B - $B$9$k(B -* Fuzzy Matching:: $BBg$-$JLJLS$C$F2?(B? -* Thwarting Email Spam:: $BM>7W$J>&6HE*EE;R%a!<%k$rHr$1$kJ}K!(B -* Various Various:: $BK\Ev$K$$$m$$$m$J$b$N(B -@end menu - -@node Process/Prefix -@section $B%W%m%;%9(B/$B@\F,0z?t(B -@cindex process/prefix convention - -$BB?$/$N4X?t!"$=$NCf$G$b5-;v$N0\F0!"I|9f2=!"J]B8$r$9$k$?$a$N4X?t$O!"(B -@dfn{$B%W%m%;%9(B/$B@\F,0z?t$N=,47(B} $B$H$7$FCN$i$l$F$$$k$b$N$r;H$$$^$9!#(B - -$B$3$l$OMxMQl(B -$B9g$O!"%W%m%;%90u$NIU$$$F$$$k5-;v$K:n6H$,l9g$O!"8=:_$N5-;v$K$@$1:n(B -$B6H$ro$K4JC1$G$9$,!"6CC2$rHr$1$i$l$k$h$&$K>\:Y$rL@$i$+$K$7$F$*(B -$B$/I,MW$,$"$k$N$G$9!#(B - -$B%W%m%;%90u$KH?1~$9$k5-;v$O8=:_$N%W%m%;%90u$NIU$$$F$$$k5-;v$N%j%9%H$r%9%?%C(B -$B%/$K@Q$_!"A4$F$N%W%m%;%90u$N5-;v$N%j%9%H$r>C5n$7$^$9!#A02s$N@_Dj(B -$B$r(B @kbd{M P y} $B$GI|5l$5$;$k;v$,$G$-$^$9(B (@pxref{Setting Process Marks})$B!#(B - -@vindex gnus-summary-goto-unread -$BB?$/$N?M!9$r6C$+$;!"62$,$i$;$k$H;W$o$l$k$3$H$O!"Nc$($P!"(B@kbd{3 d} $B$OK\Ev(B -$B$K(B @kbd{d} @kbd{d} @kbd{d} $B$HF1$8;v$r$9$k;v$G$9!#$=$l$>$l$N(B @kbd{d} ($B$3(B -$B$l$O8=:_$N5-;v$K4{FI$N0u$rIU$1$^$9(B) $B$O=i4|@_Dj$G$O0u$rIU$1$?8e$Ko$K?5=E$J?M$G!"$3$l$OK\Ev$KNI$$;v$G$9!#2?$+4m81$J;v$r(B -$B$9$kA0$K!"(B``$BK\Ev$K$3$l$r$7$?$$$N$G$9$+(B?'' $B$H$$$&$h$&$Jo$KB?$/$N(B Emacs $B$NL?Na$O(B ($B?tCM(B) $B@\F,0z?t$KH?1~$7$^$9!#Nc$($P!"(B -@kbd{C-u 4 C-f} $B$O%]%$%s%H$r(B 4 $BJ8;z@h$K0\F0$7!"(B -@kbd{C-u 9 0 0 I s s p} $B$O1JB3(B @code{Suject} $BJ8;zNs$N0lIt%9%3%"K!B'(B -$B$N(B 900 $B$r8=:_$N5-;v$K2C$($^$9!#(B - -$B$3$l$OAGE($GNI$$$N$G$9$,!"L?Na$K$b$&>/$7DI2C$N>pJs$rM?$($?$$$H$-$O$I$&$9(B -$B$l$PNI$$$N$G$7$g$&(B? $B$(!<$H!"$?$$$F$$$NL?Na$,$7$F$$$k;v$O!"(B``$B@8$N(B'' $B@\F,(B -$B0z?t$rFCJL$JJ}K!$G2r$`$@$1B?$/$N(B @kbd{M-i} $B@\F,8l$r@Q$_=E$M$k;v$,$G$-$^$9!#(B -@kbd{M-i a M-C-u} $B$O(B ``$BL?Na(B @kbd{M-C-u} $B$K%7%s%\%k@\F,0z?t(B @code{a} $B$rM?(B -$B$($k(B'' $B$H$$$&$3$H$G$9!#(B@kbd{M-i a M-i b M-C-u} $B$OL?Na(B @kbd{M-C-u} $B$K%7%s(B -$B%\%k@\F,0z?t(B @code{a} @code{b} $B$rM?$($k(B'' $B$H$$$&;v$G$9!#o$K$?$/$5$s$N$b(B -$B$N$,$"$j$^$9!#9,1?$J;v$K!"$=$l$i$O$9$Y$FF1$89=J8$r;H$$$^$9$N$G!"$"$^$j7y(B -$B$JL\$K$O2q$o$J$$$G$7$g$&!#(B - -$B=qK!;EMM(B (format) $B;XDj$NNc$,$"$j$^$9(B ($B%0%k!<%W%P%C%U%!$h$j(B): -@samp{%M%S%5y: %(%g%)\n}$B!#$=$l$Oo$K=9$/!"$?$/$5$s$N%Q!<%;%s%H5-(B -$B9f$,$I$3$K$G$b$"$j$^$9!#(B - -@menu -* Formatting Basics:: $B=qK!;EMMJQ?t$O4pK\E*$K=qK!;XDjJ8;zNs$G$"(B - $B$k(B -* Mode Line Formatting:: $B%b!<%I9T$N=qK!;EMMJQ?t$K4X$9$k$$$/$D$+$N(B - $B5,B'(B -* Advanced Formatting:: $B?'!9$JJ}K!$G=PNO$r=$@5$9$k(B -* User-Defined Specs:: Gnus $B$K$"$J$?<+?H$N4X?t$r8F$P$;$k(B -* Formatting Fonts:: $B;EMM$rB?:L$GAGE($K8+$;$k(B -* Positioning Point:: $BA`:n$N8e$G%]%$%s%H$r0\F0$9$k(B -* Tabulation:: $B=PNO$N@0Ns(B -* Wide Characters:: $BI}$,9-$$J8;z$r07$&(B -@end menu - -$B8=:_$N$H$3$m!"(Bgnus $B$O0J2<$N=qK!;EMMJQ?t$r;H$$$^$9(B: -@code{gnus-group-line-format}, @code{gnus-summary-line-format}, @code{gnus-server-line-format}, @code{gnus-topic-line-format}, @code{gnus-group-mode-line-format}, @code{gnus-summary-mode-line-format}, @code{gnus-article-mode-line-format}, @code{gnus-server-mode-line-format}, @code{gnus-summary-pick-line-format}$B!#(B - -$B$3$l$iA4$F$N=qK!;EMMJQ?t$OG$0U$N(B elisp $B<0$G$"$k;v$b$G$-$^$9!#$=$N>l9g$O!"(B -$B$=$l$i$OMW5a$5$l$k9T$KA^F~$9$k$?$a$K(B @code{$BI>2A(B} $B$5$l$^$9!#(B - -@kindex M-x gnus-update-format -@findex gnus-update-format -Gnus $B$O$"$J$?<+?H$N=qK!;EMM;XDj$r:n$k2A(B} $B$7!"Ev$N;XDj$r99?7(B -$B$7!"7k2L$N(B lisp $B<0$r$l$NMWAG(B @samp{%} $B$OEv$N%P%C%U%!$,:n@.$5$l$k$H$-$K2?$i$+$NJ8;zNs$d(B -$BB>$N$b$N$GCV$-49$($i$l$^$9!#(B@samp{%5y} $B$O(B ``@samp{y} $B;XDj$rA^F~$7!"(B5 $BJ8(B -$B;z$N>l=j$rF@$k$?$a$K6uGr$rF~$l$J$5$$(B'' $B$H$$$&;v$G$9!#(B - -$BIaDL$N(B C $B$d(B Emacs Lisp $B$N=qK!;EMM(B (format) $BJ8;zNs$HF1$8$h$&$K!"(B -@samp{%} $B$H=qK!;EMM$N7?$NJ8;z$N4V$N?tCM=$>~;R$O>o$K>/$J$/$H$b$=$ND9$5$K(B -$B$J$k$h$&$K!"=PNO$K(B @dfn{$B5M$a(B} $B$l$i$l$^$9!#(B@samp{%5y} $B$O$=$NItJ,$r>o(B -$B$K(B ($B>/$J$/$H$b(B) 5 $BJ8;z$ND9$5$K$J$k$h$&$K!":8$K6uGr$r5M$a$^$9!#$b(B -$B$7(B @samp{%-5y} $B$H$9$l$P!"Be$o$j$K1&B&$K5M$a9~$_$^$9!#(B - -$BFC$KD9$$CM$+$i$=$NItJ,$rJ]8n$9$k$?$a$K!"D9$5$r@)8B$7$?$$$H$b;W$&$G$7$g$&!#(B -$B$=$N$?$a$K$O!"(B@samp{%4,6y} $B$H$9$k;v$,$G$-$F!"$3$l$O$=$NNN0h$O7h$7$F(B 6 $BJ8(B -$B;z$rD6$($kD9$5$K$O$J$i$:!"(B4 $BJ8;z$h$j>/$J$$D9$5$K$J$i$J$$$H$$$&;v$G$9!#(B - -@node Mode Line Formatting -@subsection $B%b!<%I9T=qK!;EMM(B - -$B%b!<%I9T=qK!;EMMJQ?t(B ($B$9$J$o$A!"(B@code{gnus-summary-mode-line-format}) $B$O(B -$B0J2<$NFs$D$N0c$$0J30$O!"%P%C%U%!9T$K4p$E$/=qK!;EMMJQ?t(B -$B$H(B (@pxref{Formatting Basics}) $BF1$8$h$&$J5,B'$K=>$$$^$9(B: - -@enumerate - -@item -$B:G8e$K2~9T(B (@samp{\n}) $B$,$"$C$F$O$J$j$^$;$s!#(B - -@item -$BFCJL$J(B @samp{%%b} $B;XDj$r%P%C%U%!L>$rI=<($9$k$?$a$K;H$&$3$H$,$G$-$^$9!#$(!<(B -$B$H!"K\Ev$O$=$l$O;XDj$G$O$J$$$N$G$9(B---@samp{%%} $B$OC1$K=qK!;EMM$,5!3#E*$K(B -$B@Z$jNv$/$N$r@Z$jH4$1$F(B @samp{%} $B$r$=$N$^$^EO$9$?$a$NJ}K!$G!"(B -Emacs $B$,(B @samp{%b} $B$r$rI=<($7$J$5$$(B'' $B$H2re5i=qK!;EMM(B - -$B2?$i$+$NJ}K!$GNN0h$r8e$G=hM}$9$k$N$OIQHK$KLr$KN)$A$^$9!#ItJ,$r5M$a9~$`!"(B -$B@)8B$9$k!"@Z$j~;R(B} $B$r;H(B -$B$&;v$K$h$jC#@.$5$l$^$9!#$h$/$"$k%A%k%@;XDj$O$3$N$h$&$K8+$($k$+$b$7$l$^$;(B -$B$s(B @samp{%~(cut 3)~(ignore "0")y}$B!#(B - -$B$3$l$i$OM-8z$J=$>~;R$G$9(B: - -@table @code -@item pad -@itemx pad-left -$BMW5a$5$l$?D9$5$K$J$k$^$G!"NN0h$K6uGr$r:8B&$+$i5M$a9~$_$^$9!#(B - -@item pad-right -$BMW5a$5$l$?D9$5$K$J$k$^$G!"NN0h$K6uGr$r1&B&$+$i5M$a9~$_$^$9!#(B - -@item max -@itemx max-left -$B;XDj$5$l$?D9$5$K$J$k$h$&$K!"J8;z$r:8B&$+$i@Z$j.7?$N(B ISO0861 $BMM(B -$B<0$NF|IU$rJV$7$^$9(B---@samp{19960809T230410} $B$G$9!#$3$l$OH/2;$7$K$/$$$N$G!"(B -$B@$5*$rI=$9?t$H;~4V$r:o$.Mn$H$7$F!"(B6 $BJ8;z$NF|IU$r;D$7$?$$$H;W$$$^$9!#$=$l(B -$B$O(B @samp{%~(cut-left 2)~(max-right 6)~(pad 6)o} $B$H$J$k$G$7$g$&!#(B($B@Z$jMn(B -$B$H$7(B (cutting) $B$O(B $B:GBg8B(B (maxing) $B$h$j@h$K$J$5$l$^$9$N$G!"7e$GAGE($K8+$((B -$B$k$h$&$K$9$k$?$a$KF|IU$,(B 6 $BJ8;z$h$j>/$J$/L5$/$J$i$J$$;v$rJ]>Z$9$k$?$a$K(B -$B5M$a9~$_(B (padding) $B$,I,MW$K$J$j$^$9!#(B) - -$BL5;k(B (ignore) $B$,:G=i$K$J$5$l$^$9!#$=$l$+$i@Z$jMn$H$7(B (cut) $B$,9T$o$l$^$9!#(B -$B$=$7$F!"$=$l$+$i:G8e$NA`:n!"5M$a9~$_(B (pad) $B$,9T$o$l$^$9!#(B - -@vindex gnus-compile-user-specs -$B$b$7$"$J$?$,6/$$8D@-$N;}$Ae5i;2>H$r$?$/$5$s;H$C(B -$B$F$$$k$J$i!"(BT-gnus $B$,$H$F$bCY$/$J$k$N$,$o$+$k$G$7$g$&!#$3$l$O$"$J$?$,9T(B -$B$N308+$KK~B-$7$?$H$-$K(B @kbd{M-x gnus-compile} $B$r$N;XDj$+$i$N>pJs$HA4$/F1$8(B -$B$h$&$K%P%C%U%!$KA^F~$5$l$^$9!#4X?t$O0UL#$NL5$$CM$H6&$K8F$P$l$k;v$b$"$j$((B -$B$^$9$N$G!"$=$l$NBP:v$r$9$k$Y$-$G$9!#(B - -$B?7$7$$4X?t$rDj5A$7$J$$$G$b!"%A%k%@=$>~(B -$B;R(B (@pxref{Advanced Formatting}) $B$r;H$C$F$[$H$s$IF1$8;v$rC#@.$9$k;v$,$G(B -$B$-$^$9!#Nc$G$9(B: @samp{%~(form (count-lines (point-min) (point)))@@}$B!#(B -$B$3$3$GM?$($i$l$?<0$OI>2A$5$l$F!"8=:_$N9T?t$r$b$?$i$7!"$=$l$+$iA^F~$5$l$^(B -$B$9!#(B - -@node Formatting Fonts -@subsection $B=qK!;EMM%U%)%s%H(B - -$B%O%$%i%$%H$N$?$a$N;XDj$,$"$j!"$=$l$i$OA4$F$N=qK!;EMMJQ?t$K$h$C$F6&M-$5$l(B -$B$F$$$^$9!#(B@samp{%(} $B$H(B @samp{%)} $B;XDj$N4V$NJ8>O$OFCJL(B -$B$J(B @code{mouse-face} $B%W%m%Q%F%#$,@_Dj$5$l!"$=$l$O$=$3$K%^%&%9$N%]%$%s%?!<(B -$B$r$"$o$;$?$H$-$K(B (@code{gnus-mouse-face} $B$K$h$C$F(B) $B%O%$%i%$%H$5$l$k$3$H(B -$B$K$J$j$^$9!#(B - -@samp{%@{} $B$H(B @samp{%@}} $B;XDj$N4V$NJ8>O$O(B @code{gnus-face-0} $B$r;H$C$FIa(B -$BDL$N%U%'%$%9$,@_Dj$5$l!"$=$l$O=i4|@_Dj$G(B @code{bold} $B$G$9!#$b(B -$B$7(B @samp{%@{1} $B$H$7$?$J$i!"Be$o$j$K(B @code{gnus-face-1} $B$rF@!"0J2} $B;X<(;R$N4V$N%F%-%9%H$OFCJL(B -$B$J(B @code{balloon-help} $B%W%m%Q%F%#$,(B @code{gnus-balloon-face-0} $B$K@_Dj$5(B -$B$l$^$9!#(B@samp{%1<} $B$H$9$k$H!"(B@code{gnus-balloon-face-1} $B$rF@$F!"B>$bF1MM(B -$B$G$9!#(B@code{gnus-balloon-face-*} $BJQ?t$OJ8;zNs$+J8;zNs$rJV$94X?t$r;X$9%7(B -$B%s%\%k$N$I$A$i$+$G$"$kI,MW$,$"$j$^$9!#(B@code{balloon-help-mode} $B$G$O!"%^(B -$B%&%9$,%W%m%Q%F%#$N@_Dj$5$l$F$$$k%F%-%9%H$N>e$rDL2a$9$k$H!"%P%k!<%s%&%#%s(B -$B%I%&$,8=$l$F!"J8;zNs$rI=<($7$^$9!#$3$l$N>\$7$$>pJs(B -$B$O(B @code{balloon-help-mode} $B$N@bL@J8;zNs$r;2>H$7$F$/$@$5$$!#(B - -$B$3$l$O%0%k!<%W%P%C%U%!$NBeBXeEy$N=qK!;EMM$r@_Dj$9$k!#(B -(setq gnus-group-line-format - "%M%S%3@{%5y%@}%2[:%] %(%1@{%g%@}%)\n") -@end lisp - -$B$"$J$?$,$3$N0F$r;H$C$F40A4$KFI$a$J$/$FHs>o$K2o$[$H$s$I$N%P%C%U%!$G!"%]%$%s%H$r3F9T$N$"$i$+$8$a7h$a$i$l$?>l(B -$B=j$K0\F0$7$^$9!#%G%#%U%)%k%H$G$O!"%]%$%s%H$O9T$N:G=i$N%3%m%s$K0\F0$7$^$9!#(B -$B$"$J$?$O$3$N?6$k$^$$$r!";0$D$N0c$&J}K!$G%+%9%?%^%$%:$9$k$3$H$,$G$-$^$9!#(B - -$B$^$?!"$"$J$?$O%3%m%s$r9T$N$I$N>l=j$K$G$b0\F0$9$k$3$H$,$G$-$^$9!#(B - -@findex gnus-goto-colon -$B$"$J$?$O%3%m%s$N0LCV$K%]%$%s%H$r0\F0$5$;$k$?$a$N4X?t$rDj5A$7D>$9$3$H$,$G(B -$B$-$^$9!#$=$N4X?t$O(B @code{gnus-goto-colon} $B$H8F$P$l$F$$$^$9!#(B - -$B$G$b!"$b$7$"$J$?$,9T$K%3%m%s$r4^$a$?$/$J$$$J$i$P!"$3$l$r07$&$?$a$N$*$=$i(B -$B$/:G$bo$O!"1d$P$7$?$j=L$a$?$j$7$FJ8;zNs$r%G%#%9%W%l%$$KJB$Y$k$3$H$,(B -$B$G$-$^$9!#$G$bBg$-$5$,0c$&0[$J$kJ8;zNs$rO"7k$5$;$k>l9g$O!"C1$KJ8;zNs$r=P(B -$BNO$7$F$7$^$&$N$,$h$jl9g$O2?$bA^F~$7$^$;$s!#$3$l$O2:$d(B -$B$+(B (soft) $B$J@0Ns;R$G$9!#(B - -@samp{%-50=} $B$b$^$?!"J8;zNs$,(B 50$B7e$+$i;O$^$k$h$&$K6uGrJ8;z$r5M$a9~$_$^$9!#(B -$B$G$9$,!"$b$7(B 50$B7e$h$j8e$m$K$9$G$K%F%-%9%H$,$"$k>l9g!"(B50$B7e$h$j8e$m$K$"$k(B -$B2a>j$J%F%-%9%H$O:o=|$5$l$^$9!#$3$l$O87L)(B (hard) $B$J@0Ns;R$G$9!#(B - -@node Wide Characters -@subsection Wide Characters - -$BB?$/$NCO0h$K$*$$$F!"%W%m%]!<%7%g%J%k$J%U%)%s%H$OF1$8I}$NJ8;z$r;}$C$F$$$^(B -$B$9!#$7$+$7$$$/$D$+$NCO0h!"$h$/CN$i$l$F$$$kEl%"%8%"$N9q!9$G$O!"%i%F%sJ8;z(B -$B$HI}$N9-$$J8;z$,:.:_$7$F;H$o$l$F$$$^$9!#(B - -$B@07A$K$*$$$F!"(Bgnus $B$OJ8;zNs$,(B 10$B8D$NJ8;z$NI}$@$H$7$?$i!"%9%/%j!<%s$G(B -$B$b(B 10$B8DJ,$N%i%F%sJ8;z$NI}$K$J$k$H2>Dj$7$^$9$,!"$=$l$OLdBj$G$9!#$+$N9q!9(B -$B$G$O!"$=$l$O@5$7$/$"$j$^$;$s!#(B - -@vindex gnus-use-correct-string-widths -$B$=$l$r5_:Q$9$k$?$a$K!"$"$J$?(B -$B$O(B @code{gnus-use-correct-string-widths} $B$r(B @code{t} $B$K@_Dj$9$k$3$H$,$G(B -$B$-$^$9!#$3$l$O%P%C%U%!$N@8@.$rCY$/$7$^$9$,!"$h$jH~$7$$7k2L$rF@$k$3$H$,$G(B -$B$-$k$G$7$g$&!#4{DjCM$O(B @code{t} $B$G$9!#(B - -@node Window Layout -@section $B%&%#%s%I%&$NG[CV(B -@cindex window layout - -$B$$$(!"(BX $B$K4X$9$k;v$O$"$j$^$;$s$N$G!"$*$H$J$7$/$7$F2<$5$$!#(B - -@vindex gnus-use-full-window -$B$b$7(B @code{gnus-use-full-window} $B$,(B @code{nil} $B$G$J$$$H!"(Bgnus $B$OA4$F$NB>(B -$B$N%&%#%s%I%&$r>C$7$F!"(BEmacs $B$N2hLLA4BN$r@jM-$7$^$9!#$3$l$O=i4|@_Dj(B -$B$G(B @code{t} $B$G$9!#(B - -$B$3$NJQ?t$r(B @code{nil} $B$K@_Dj$9$k$N$O$=$l$J$j$KF0:n$7$^$9$,!"LdBj$b$"$j$^(B -$B$9!#4m81$r3P8g$N>e$G;H$C$F$/$@$5$$!#(B - -@vindex gnus-buffer-configuration -@code{gnus-buffer-configuration} $B$O$=$l$>$l$N(B gnus $B$N%P%C%U%!$,$I$N$/$i(B -$B$$$N6u4V$rM?$($i$l$k$Y$-$+$r8=$7$^$9!#$3$l$O$3$NJQ?t$NH4?h$G$9(B: - -@lisp -((group (vertical 1.0 (group 1.0 point) - (if gnus-carpal (group-carpal 4)))) - (article (vertical 1.0 (summary 0.25 point) - (article 1.0)))) -@end lisp - -$B$3$l$OO"A[%j%9%H$G$9!#(B@dfn{$B%-!<(B} $B$O2?$i$+$NF0:n$dB>$N$b$N$rG$L?$9$k%7%s(B -$B%\%k$G$9!#Nc$($P!"%0%k!<%W%P%C%U%!$rI=<($9$k$H$-$O!"%&%#%s%I%&@_Dj4X?t(B -$B$O(B @code{group} $B$r%-!<$H$7$F;H$$$^$9!#;HMQ2DG=$JL>A0$N40A4$J0lMw$O2<$K5s(B -$B$2$i$l$F$$$^$9!#(B - -@dfn{$BCM(B} ($B$9$J$o$A!"(B@dfn{$BJ,3d(B}) $B$O$=$l$>$l$N%P%C%U%!$,$I$l$/$i$$$r@j$a$k(B -$B$Y$-$+$r;XDj$7$^$9!#(B@code{article} $BJ,3d$rNc$Ke$N(B 25% $B$r@j$a(B -$B$k$Y$-$G!"$=$l$O5-;v%P%C%U%!(B (article buffer) $B$N>e$KG[CV$5$l$^$9!#$*5$$E(B -$B$-$NDL$j!"(B100% + 25% $B$OJN,2DG=$J;0$DL\$NMWAG!"(B@code{point} $B$r;}$D%P%C%U%!$KCV$+$l$^(B -$B$9!#(B@code{frame} $BJ,3d$G$O!"%?%0(B @code{frame-focus} $B$,9=@.MWAG$G$"$k(B ($B$9(B -$B$J$o$A!"(B@code{point} $B%?%0$,B8:_$9$k$+$I$&$+$K$h$C$F!"%j%9%H$N;0HVL\$+;M(B -$BHVL\$+$KB8:_$9$kMWAG(B) $BMUJ,3d$r;}$D:G8e$NI{J,3d$,>GE@$rF@$k;v$K$J$j$^$9!#(B - -$B.?tE@?t$NBe$o$j$K@0?t$G$"$C$?$J$i!"$=$l$O3d9g$G$O$J(B -$B$/!"$I$N$/$i$$B?$/$N9T$r%P%C%U%!$,@j$a$k$Y$-$+$r;XDj$9$k$?$a$K;H$o$l$^$9!#(B - -$B$b$7(B @dfn{$BJ,3d(B} $B$,(B @code{$BI>2A(B} $B$5$l$k$b$N$N$h$&$K8+$($k$H$-$O(B ($BL@3N$K$9(B -$B$k$H(B---$BJ,3d$N(B @code{car} $B$,4X?t$+86;O4X?t(B (subr) $B$G$"$k$H$-$O(B)$B!"$3$NJ,3d(B -$B$O(B @code{$BI>2A(B} $B$5$l$^$9!#7k2L$,(B @code{nil} $B$G$J$$$J$i!"$=$l$OJ,3d$H$7$F(B -$BMQ$$$i$l$^$9!#$3$l$O!"(B@code{gnus-carpal} $B$,(B @code{nil} $B$G$"$l$P;0$D$N%P%C(B -$B%U%!$,!"(B@code{gnus-carpal} $B$,(B @code{nil} $B$G$J$$$J$i!";M$D$N%P%C%U%!$,B8(B -$B:_$9$k$H$$$&;v$G$9!#(B - -$B$^$@J#;($G$O$J$$$G$9$C$F(B? $B$=$l$G$O!"Bg$-$5$K$3$l$r;n$7$F$_$F2<$5$$(B: - -@lisp -(article (horizontal 1.0 - (vertical 0.5 - (group 1.0) - (gnus-carpal 4)) - (vertical 1.0 - (summary 0.25 point) - (summary-carpal 4) - (article 1.0)))) -@end lisp - -$B$*$)$C$H!#Fs$D$N%P%C%U%!$KIT;W5D$J(B 100% $B%?%0$,IU$$$F$$$^$9!#$=$7$F!"$"(B -$B$N(B @code{horizontal} $B$C$F$$$&$b$N$O2?$G$7$g$&(B? - -$B$b$7J,3d$N0l$D$N:G=i$NMWAG$,(B @code{horizontal} $B$G$"$C$?$J$i!"(Bgnus $B$O(B $B%&%#(B -$B%s%I%&$r?eJ?$KJ,3d$7!"Fs$D$N%&%#%s%I%&$r2#$KJB$Y$^$9!#$3$l$i$N$=$l$>$l$N(B -$B>.JR$NCf$G$O!"A4$F$rIaDL$NN.57$G9T$&;v$,$G$-$^$9!#(B@code{horizontal} $B$N8e(B -$B$N?t;z$O!"$3$N>.JR$K2hLL$N$I$l$/$i$$$N3d9g$,M?$($i$l$k$+$r;XDj$7$^$9!#(B - -$B$=$l$>$l$NJ,3d$G$O!"(B100% $B$N%?%0$r;}$DMWAG$,(B @emph{$BI,$:(B} $B0l$D$"$kI,MW$,$"(B -$B$j$^$9!#J,3d$O7h$7$F@53N$K$O9T$o$l$^$;$s$N$G!"$3$N%P%C%U%!$,J,3d$+$i;D$5(B -$B$l$?A4$F$N9T$r@jNN$7$^$9!#(B - -$B$b$&>/$7@5<0$K$9$k$?$a$K!"$3$3$KM-8z$JJ,3d$,$I$N$h$&$K$J$k$+$NDj5A$,$"$j(B -$B$^$9(B: - -@example -split = frame | horizontal | vertical | buffer | form -frame = "(frame " size *split ")" -horizontal = "(horizontal " size *split ")" -vertical = "(vertical " size *split ")" -buffer = "(" buf-name " " size *[ "point" ] *[ "frame-focus"] ")" -size = number | frame-params -buf-name = group | article | summary ... -@end example - -$B@)8B$K$O!"(B@code{frame} $B$O:G>e0L$NJ,3d$H$7$F$7$+8=$l$k;v$,$G$-$J$$$H$$$&(B -$B$b$N$,$"$j$^$9!#(B@var{form} $B$OM-8z$JJ,3d$rJV$9(B Emacs Lisp $B$N<0(B (form) $B$G(B -$B$J$1$l$P$J$j$^$;$s!#$=$l$>$l$NJ,3d$O40A4$K:F5"E*$G!"G$0U$N?t(B -$B$N(B @code{vertical} $B$H(B @code{horizontal} $BJ,3d$r4^$`;v$,$G$-$^$9!#(B - -@vindex gnus-window-min-width -@vindex gnus-window-min-height -@cindex window height -@cindex window width -$B@5$7$$Bg$-$5$r8+$D$1$k$N$O>/$7J#;($G$9!#$I$N%&%#%s%I%&(B -$B$b(B @code{gnus-window-min-height} ($B=i4|CM(B 1) $B$NJ8;z$N9b$5$h$j$b>.$5$/$F$O(B -$B$J$i$:!">/$J$/$H$b(B @code{gnus-window-min-width} ($B=i4|CM(B 1) $B$NJ8;zI}$G$J(B -$B$/$F$O$J$j$^$;$s!#(BGnus $B$OJ,3d$rE,MQ$9$kA0$K$3$l$r6/@)$7$h$&$H;n$_$^$9!#(B -$B$b$7IaDL$N(B Emacs $B$N%&%#%s%I%&$NI}(B/$B9b$5@)8B$r;H$$$?$$$J$i!"$3$NFs$D$NJQ?t(B -$B$r(B @code{nil} $B$K$9$k$@$1$GNI$$$G$9!#(B - -$B$b$7(B Emacs $B$NMQ8l$K$J$8$s$G$$$J$$$N$J$i!"(B -@code{horizontal} $B$H(B @code{vertical} $BJ,3d$O!"4|BT$9$k$b$N$HH?BP$NF0:n$r(B -$B$9$k$G$7$g$&!#(B@code{horizontal} $BJ,3d$NCf$N%&%#%s%I%&$O2#$KJB$s$GI=<($5$l!"(B -@code{vertical} $BJ,3d$NCf$N%&%#%s%I%&$O>e2<$KI=<($5$l$^$9!#(B - -@findex gnus-configure-frame -$B%&%#%s%I%&$N@_CV$K4X$7$F(B -$B@\(B @code{gnus-configure-frame} $B$r8F$V$3$H$G$9!#$3$l$O%P%C%U%!$rJ,3d$9$k(B -$B$H$-$KA4$F$NK\Ev$N;E;v$r$9$k4X?t$G$9!#2<$N$b$N$O(B 5 $B%&%#%s%I%&$N$H$F$b$P(B -$B$+$2$?@_Dj$G$9!#Fs$D$r%0%k!<%W%P%C%U%!$K!";0$D$r5-;v%P%C%U%!$N$?$a$K=<$F(B -$B$^$9!#(B($B$=$l$O$P$+$2$F$$$k$H8@$C$?$G$7$g!#(B) $B$b$72<$NJ8$r(B @code{$BI>2A(B} $B$9$k(B -$B$H!"IaDL$N(B gnus $B$N7PO)$r;H$o$J$$$G!"$9$0$K$=$l$,$I$N$h$&$K8+$($k$+$N9M$((B -$B$rF@$k;v$,$G$-$^$9!#K~B-$9$k$^$G$=$l$GM7$s$G!"$=$l$+(B -$B$i(B @code{gnus-add-configuration} $B$r;H$C$F?7$7$$A[A|$r%P%C%U%!@_Dj%j%9%H(B -$B$K2C$($F2<$5$$!#(B - -@lisp -(gnus-configure-frame - '(horizontal 1.0 - (vertical 10 - (group 1.0) - (article 0.3 point)) - (vertical 1.0 - (article 1.0) - (horizontal 4 - (group 1.0) - (article 10))))) -@end lisp - -$B$$$/$D$+$N%U%l!<%`$bM_$7$$$+$b$7$l$^$;$s!#4JC1$G$9(B---@code{frame} $BJ,3d$r(B -$B;H$&$@$1$G$9(B: - -@lisp -(gnus-configure-frame - '(frame 1.0 - (vertical 1.0 - (summary 0.25 point frame-focus) - (article 1.0)) - (vertical ((height . 5) (width . 15) - (user-position . t) - (left . -1) (top . 1)) - (picon 1.0)))) - -@end lisp - -$B$3$NJ,3d$N7k2L$O!":G=i(B ($B$b$7$/$O!"(B``$B.$5$JDI2C$N%U%l!<%`$,(B picon $B$rI=<($9$k$?$a$K:n$i$l$k(B -$B$H$$$&;v$K$J$j$^$9!#$4Mw$NDL$j!"IaDL$N(B @code{1.0} $B:G>e0L;XDj$NBe$o$j$K!"(B -$B$=$l$>$l$NDI2C$NJ,3d$,%U%l!<%`%Q%i%a!<%?O"A[%j%9%H$rBg$-$5;XDj$H$7$F;}$?(B -$B$J$1$l$P$J$j$^$;$s!#(B@xref{Frame Parameters, , Frame Parameters, elisp, -The GNU Emacs Lisp Reference Manual}. XEmacs $B$G$O!"%U%l!<%`%W%m%Q%F%#%j(B -$B%9%H$b;H$($^$9(B---$BNc$($P!"(B@code{(height 5 width 15 left -1 top 1)} $B$O$=$N(B -$B$h$&$J%Q%i%a!<%?%j%9%H$G$9!#(B -@code{gnus-buffer-configuration} $B$K;HMQ2DG=$JA4$F$N%-!<$N0lMw$O$=$N=i4|(B -$BCM$G8+$D$1$k$3$H$,$G$-$^$9!#(B - -$B%-!<(B @code{message} $B$O(B @code{gnus-group-mail} $B$H(B @code{gnus-summary-mail-other-window} $B$N(B -$BN>J}$G;H$o$l$k;v$KCm0U$7$F2<$5$$!#$b$7Fs$D$r6hJL$9$k$[$&$,K>$^$7$$$J$i!"(B -$B$3$N$h$&$JJ*$r;H$&;v$,$G$-$^$9(B: - -@lisp -(message (horizontal 1.0 - (vertical 1.0 (message 1.0 point)) - (vertical 0.24 - (if (buffer-live-p gnus-summary-buffer) - '(summary 0.5)) - (group 1.0))))) -@end lisp - -$BJ#?t$N%U%l!<%`$X$NNI$/$"$kMWK>$O!"%a!<%k$H%K%e!<%9$N:n@.$K$OJL$N%U%l!<%`(B -$B$r;H$$!"85$N%U%l!<%`$O$=$N$^$^$K;D$9$H$$$&$b$N$G$9!#$3$l$NC#@.$K$O!"0J2<(B -$B$N$h$&$J$b$N$G$G$-$^$9!#(B - -@lisp -(message - (frame 1.0 - (if (not (buffer-live-p gnus-summary-buffer)) - (car (cdr (assoc 'group gnus-buffer-configuration))) - (car (cdr (assoc 'summary gnus-buffer-configuration)))) - (vertical ((user-position . t) (top . 1) (left . 1) - (name . "Message")) - (message 1.0 point)))) -@end lisp - -@findex gnus-add-configuration -$BJQ?t(B @code{gnus-buffer-configuration} $B$O$H$F$bD9$/J#;($J$N$G!"C10l$N@_Dj(B -$B$NJQ99$r4JC1$K$9$k$?$a$N4X?t$,$"$j$^$9(B: @code{gnus-add-configuration} $B$G(B -$B$9!#$b$7!"Nc$($P!"(B@code{article} $B$N@_Dj$rJQ$($?$$$N$J$i!"o$K(B ``$B@5$7$$(B'' $B%&%#%s%I%&@_Dj$r6/@)(B -$B$7$?$$$N$G$"$l$P!"(B -@code{gnus-always-force-window-configuration} $B$r(B @code{nil} $B$G$J$$CM$K@_(B -$BDj$9$k;v$,$G$-$^$9!#(B - -$BLZI=<($r;H$C$F$$$F(B (@pxref{Tree Display})$B!"LZ%&%#%s%I%&$O?bD>J}8~$KJL$N(B -$B%&%#%s%I%&$GI=<($5$l$k$J$i!"%&%#%s%I%&$NBg$-$5$,JQ99$5$l$k$3$H$rHr$1$k$?(B -$B$a$K(B @code{gnus-tree-minimize-window} $B$r$$$8$k$N$,NI$$$G$7$g$&!#(B - -@subsection $B%&%#%s%I%&@_Dj$NNc(B - -@itemize @bullet -@item -$B:8B&$r69$a$F%0%k!<%W%P%C%U%!$K!#1&B&$rJ,3d$7$F35N,%P%C%U%!(B ($B>e(B 1/6) $B$H(B -$B5-;v%P%C%U%!(B ($B2<(B) $B$K!#(B - -@ifinfo -@example -+---+---------+ -| G | Summary | -| r +---------+ -| o | | -| u | Article | -| p | | -+---+---------+ -@end example -@end ifinfo - -@lisp -(gnus-add-configuration - '(article - (horizontal 1.0 - (vertical 25 (group 1.0)) - (vertical 1.0 - (summary 0.16 point) - (article 1.0))))) - -(gnus-add-configuration - '(summary - (horizontal 1.0 - (vertical 25 (group 1.0)) - (vertical 1.0 (summary 1.0 point))))) -@end lisp -@end itemize - -@node Faces and Fonts -@section $B%U%'%$%9$H%U%)%s%H(B -@cindex faces -@cindex fonts -@cindex colors - -$B%U%)%s%H$H%U%'%$%9$rO.$k$N$OHs>o$KFq$7$+$C$?$N$G$9$,!":#F|$G$OHs>o$K4JC1(B -$B$G$9!#C1$K(B @kbd{M-x customize-face} $B$H$d$C$F!"JQ$($?$$%U%'%$%9$rA*$S=P$7(B -$B$F!"I8=`$N%+%9%?%^%$%:%$%s%?!<%U%'!<%9$r;H$C$FJQ99$9$k;v$,$G$-$^$9!#(B - -@node Compilation -@section $B%3%s%Q%$%k(B -@cindex compilation -@cindex byte-compilation - -@findex gnus-compile - -$B$"$N9T=qK!;EMM;XDjJQ?t$r3P$($F$$$^$9(B -$B$+(B? @code{gnus-summary-line-format}, @code{gnus-group-line-format} $B$J$I(B -$B$J$I$G$9!#DL>o(B T-gnus $B$O$3$l$i$NJQ?t$r%P%$%H%3%s%Q%$%k$7$F;H$&$N$G!"B.EY(B -$BDc2<$O:G>.8B$K?)$$;_$a$i$l$^$9!#$7$+(B -$B$7(B @code{gnus-compile-user-specs} $B$r(B @code{nil} ($B=i4|CM$O(B @code{t}) $B$K$7(B -$B$?>l9g$O!"IT1?$J;v$K$=$l$i$rJQ99$9$k$HBgJQ=EBg$JB.EYDc2<$r0z$-5/$3$9;v$K(B -$B$J$j$^$9!#(B($B$3$l$i$NJQ?t$N=i4|CM$O$=$l$i$K4XO"IU$1$i$l$?%P%$%H%3%s%Q%$%k(B -$B$5$l$?4X?t$r;}$C$F$$$^$9$,!"MxMQo$K:G?7$N(B -$B$b$N$K$7$F$*$/$+$r;XDj$7$^$9!#$=$l$O%7%s%\%k$N%j%9%H$G$9!#;H$&;v$N$G$-$k(B -$B%7%s%\%k(B -$B$O(B @code{group}, @code{article}, @code{summary}, @code{server}, @code{browse}, @code{tree} $B$J(B -$B$I$G$9!#$b$7BP1~$9$k%7%s%\%k$,B8:_$9$k$H!"(Bgnus $B$O3:Ev$9$k$G$"$m$&>pJs$G(B -$B%b!<%I9T$r99?7$7$^$9!#$3$NJQ?t$,(B @code{nil} $B$G$"$k$J$i!"2hLL$N:FIA2h$O$b$C(B -$B$HB.$$$G$7$g$&!#(B - -@cindex display-time - -@vindex gnus-mode-non-string-length -$B=i4|@_Dj$G$O!"(Bgnus $B$O35N,%P%C%U%!$H5-;v%P%C%U%!$N%b!<%I9T$K8=:_$N5-;v$N(B -$B>pJs$rI=<($7$^$9!#(BGnus $B$,I=<($7$?$$>pJs(B ($BNc$($P!"5-;v$NI=Bj(B) $B$O$7$P$7$P(B -$B%b!<%I9T$h$j$bD9$$$3$H$,$"$k$N$G!"$I$3$+$G@Z$jMn$H$5$l$J$1$l$P$J$j$^$;$s!#(B -$BJQ?t(B @code{gnus-mode-non-string-length} $B$O$=$N9T$NB>$NMWAG(B ($B$9$J$o$A!">p(B -$BJs$G$J$$ItJ,(B) $B$,$I$N$/$i$$$ND9$5$G$"$k$+$r;XDj$7$^$9!#$b$7%b!<%I9T$KDI2C(B -$B$NMWAG$rF~$l$?$J$i!"$3$NJQ?t$r=$@5$9$kI,MW$,$"$j$^$9(B: - -@c Hook written by Francesco Potorti` -@lisp -(add-hook 'display-time-hook - (lambda () (setq gnus-mode-non-string-length - (+ 21 - (if line-number-mode 5 0) - (if column-number-mode 4 0) - (length display-time-string))))) -@end lisp - -$B$b$7$3$NJQ?t$,(B @code{nil} $B$G$"$k$J$i(B ($B$3$l$,=i4|CM$G$9$,(B)$B!"%b!<%I9T$O@Z(B -$B$jMn$H$5$l$:!"5M$a9~$_$b$5$l$^$;$s!#=i4|@_Dj$O!"%P%C%U%!$N40A4$J%Q!<%;%s(B -$B%HI=<($5$($b%b!<%I9T$+$iDI$$$d$i$l$k2DG=@-$b$"$j$^$9$N$G!"$*$=$i$/K>$^$7(B -$B$$@_Dj$G$O$J$$$H$$$&;v$KCm0U$7$F2<$5$$!#MxMQl9g$O!"$3$N$h$&$K$9$k;v$,$G$-$^$9(B: - -@lisp -(setq gnus-visual '(article-highlight menu)) -@end lisp - -$B$b$7%O%$%i%$%H$@$1$G!"%a%K%e!<$NN`$OM_$7$/$J$$$H$-$O!"$NA4$F$N%P%C%U%!$N308+$K1F6A$9$kAm9gE*$JJQ?t$O(B: - -@table @code -@item gnus-mouse-face -@vindex gnus-mouse-face -$B$3$l$O(B gnus $B$G%^%&%9$N%O%$%i%$%H$K;H$o$l$k%U%'%$%9(B ($B$9$J$o$A!"%U%)%s(B -$B%H(B) $B$G$9!#(B@code{gnus-visual} $B$,(B @code{nil} $B$G$"$k$H!"%^%&%9%O%$%i%$%H$O(B -$B$J$5$l$^$;$s!#(B -@end table - -$BA4$/0c$C$?%a%K%e!<$r:n@.$9$k$?$a$K4XO"$9$k%U%C%/$,$"$j$^$9(B: - -@table @code -@item gnus-article-menu-hook -@vindex gnus-article-menu-hook -$B5-;v%b!<%I(B (article mode) $B%a%K%e!<$r:n@.$7$?8e$K8F$P$l$k%U%C%/$G$9!#(B - -@item gnus-group-menu-hook -@vindex gnus-group-menu-hook -$B%0%k!<%W%b!<%I(B (group mode) $B%a%K%e!<$r:n@.$7$?8e$K8F$P$l$k%U%C%/$G$9!#(B - -@item gnus-summary-menu-hook -@vindex gnus-summary-menu-hook -$B35N,%b!<%I(B (summary mode) $B%a%K%e!<$r:n@.$7$?8e$K8F$P$l$k%U%C%/$G$9!#(B - -@item gnus-server-menu-hook -@vindex gnus-server-menu-hook -$B%5!<%P!<%b!<%I(B (server mode) $B%a%K%e!<$r:n@.$7$?8e$K8F$P$l$k%U%C%/$G$9!#(B - -@item gnus-browse-menu-hook -@vindex gnus-browse-menu-hook -$B354Q%b!<%I(B (browse mode) $B%a%K%e!<$r:n@.$7$?8e$K8F$P$l$k%U%C%/$G$9!#(B - -@item gnus-score-menu-hook -@vindex gnus-score-menu-hook -$B%9%3%"%b!<%I(B (score mode) $B%a%K%e!<$r:n@.$7$?8e$K8F$P$l$k%U%C%/$G$9!#(B -@end table - -@node Buttons -@section $B%\%?%s(B -@cindex buttons -@cindex mouse -@cindex click - -$B:G6a$G$O!":G?7N.9T$N%^%&%9(B @dfn{mouse} $BAuCV$,!"$A$c$s$H$7$?A`:nK!$r3X$S(B -$B$?$,$i$J$$%J%&$J%d%s%0$N4V$GBg?M5$$G$9!#$=$l$G$O!";d$,(B Tops 20 $B%7%9%F%`(B -$B>e$G(B Emacs $B$r;H$C$F$$$?:"$N(B '89 $BG/$N2F$r;W$$5/$3$7$F$_$^$7$g$&!#(B300 $B?M$N(B -$BMxMQe$G!"$_$s$J$,(B Simula $B%3%s%Q%$%i$rAv$i$;$F$$$^$7$?!#(B -$B$"$"!"$P$+$P$+$7$$(B! - -$B$[$s$H$K$=$&$@$M!#(B - -@vindex gnus-carpal -$B$^$:$G$9$M!"(B@code{gnus-carpal} $B$r(B @code{t} $B$K@_Dj$9$k$3$H$K$h$C$F!"%/%j%C(B -$B%/$9$k$@$1$G2?$G$b$G$-$k%\%?%s$@$i$1$N%P%C%U%!$r(B gnus $B$KI=<($5$;$k$3$H$,(B -$B$G$-$^$9!#$H$C$F$b4JC1$G$9!"$[$s$H$K!#;X05NEK!$N@h@8$K65$($F$"$2$F!#(B($BLu(B -$BCm(B: carpal $B$H$O$K$b2?$+$=$&(B -$B$$$C$?$3$H$G$9!#(B - -Gnus $B$O$5$^$6$^$J@)8f;R(B @dfn{handlers} $B$rDj5A$9$k$3$H$K$h$C$F$=$N$h$&$J(B -$B$3$H$r2DG=$K$7$^$9!#3F@)8f;R$O;0$D$NMWAG$+$i@.$j$^$9!#(B -@var{$B4X?t(B}, @var{$B;~4V(B}, @var{$B6uE>(B} $B%Q%i%a!<%?$G$9!#(B - -$B0J2<$O(B Emacs $B$,2?$b$7$J$$6uE>>uBV$,;0==J,B3$$$?$H$-$K@\B3$r@ZCG$9$k@)8f(B -$B;R$NNc$G$9!#(B - -@lisp -(gnus-demon-close-connections nil 30) -@end lisp - -$B0J2<$O(B Emacs $B$,2?$b$7$F$$$J$$$H$-!"0l;~4VKh$K(B PGP $B%X%C%@!<$rAv::$9$k@)8f(B -$B;R$G$9!#(B - -@lisp -(gnus-demon-scan-pgp 60 t) -@end lisp - -$B$3$N(B @var{$B;~4V(B} $B%Q%i%a!<%?$H$=$7$F(B @var{$B6uE>(B} $B%Q%i%a!<%?$O!"4qL/$G$+$DAG(B -$B@2$i$7$$J}K!$G0l=o$KF0:n$7$^$9!#4pK\E*$K$O!"(B@var{$B6uE>(B} $B$,(B @code{nil} $B$N(B -$B;~$K$O$3$N4X?t$O(B @var{$B;~4V(B} $BJ,Kh$K8F$S=P$5$l$^$9!#(B - -$B$b$7(B @var{$B6uE>(B} $B$,(B @code{t} $B$G$"$l$P!"$3$N4X?t$O(B Emacs $B$,2?$b$7$F$$$J$$(B -$B;~$K8B$j!"(B@var{$B;~4V(B} $BJ,8e$K8F$S=P$5$l$^$9!#0lC6(B Emacs $B$,$:$C$H6uE>>uBV$K(B -$B$J$C$?8e$O!"$3$N4X?t$O(B @var{$B;~4V(B} $BJ,Kh$K8F$S=P$5$l$^$9!#(B - -@var{$B6uE>(B} $B$,?t$G(B @var{$B;~4V(B} $B$b?t$G$"$k>l9g!"$3$N4X?t$O!"(BEmacs $B$N6uE>>u(B -$BBV$,(B @var{$B6uE>(B} $BJ,B3$$$?;~$K8B$j!"(B@var{$B;~4V(B} $BJ,Kh$K8F$S=P$5$l$^$9!#(B - -@var{$B6uE>(B} $B$,?t$G(B @var{$B;~4V(B} $B$,(B @code{nil} $B$N>l9g!"$3$N4X?t$O!"(BEmacs $B$N(B -$B6uE>>uBV$,(B @var{$B6uE>(B} $BJ,B3$/EY$K0lEY8F$S=P$5$l$^$9!#(B - -$B$=$7$F(B @var{$B;~4V(B} $B$,J8;zNs$N>l9g$O!"(B@samp{07:31} $B$N$h$&$J7A<0$G$J$1$l$P(B -$B$J$i$:!"$3$N4X?t$OKhF|$=$N:"$N;~4V$K$J$k$H0lEY8F$S=P$5$l$^$9!#$b$A$m$s!"(B -@var{$B6uE>(B} $B%Q%i%a!<%?$GF0:n$,JQ$o$j$^$9!#(B - -@vindex gnus-demon-timestep -($B$3$3$G(B ``$BJ,(B'' $B$H8@$C$?$H$-!"$=$l$O@\DI2C$7$?>l9g$K$O!"$=$l$r8z(B -$B$+$;$k$?$a$K(B @code{gnus-demon-init} $B$rC$9$K$O!"(B@code{gnus-demon-cancel} $B4X?t$r;H$&$3$H$,$G$-$^$9!#(B - -$B%G!<%b%s$NDI2C$O!"$d$j$9$.$k$N$O$H$C$F$b$*9T57$N$h$/$J$$$3$H$G$9!#A4$F$N(B -$B%5!<%P!<$+$iA4$F$N%K%e!<%9$H%a!<%k$rFsICKh$KD4$Y$^$o$94X?t$rIU$12C$($A$c$C(B -$B$?$j$9$k$H!"$I$s$JN)GI$J%7%9%F%`$G$b4V0c$$$J$/$*J'$$H"$K$7$F$7$^$$$^$9!#(B -$B$=$&F0$/$s$@$b$s!#(B - -@node NoCeM -@section NoCeM -@cindex nocem -@cindex spam - -$B%9%Q%`(B @dfn{Spam} $B$H$O!"F1$85-;v$r2?2s$b2?2s$b2?2s$bEj9F$9$k$3$H$G$9!#%9(B -$B%Q%`$O0-$$$3$H$G$9!#%9%Q%`$O6'0-$G$9!#(B - -$B%9%Q%`$ODL>o0lF|$+$=$3$i$G!"$5$^$6$^$JH?%9%Q%`5!4X$+$iC$7$5$l$^$9!#(B -$B$3$l$i$N5!4X$ODL>o0l=o$K!"(B@dfn{NoCeM} $B%a%C%;!<%8$bAw?.$7$^$9!#(B -@dfn{NoCeM} $B$O(B ``no see-'em'' ($BH`$i$r8+$?$/$J$$(B)$B$HH/2;$5$l!"0UL#$O$=$NL>(B -$BA0$NDL$j$G$9(B --- $B$3$N%a%C%;!<%8$O!":a$rHH$7$F$$$k5-;v$r!"$D$^$j!">C$7$F(B -$B$7$^$$$^$9!#(B - -$B$I$&$;$=$N5-;v$,C$7$5$l$F$7$^$&$N$J$i!"$3$l$i(B NoCeM $B%a%C%;!<%8$O2?(B -$B$K;H$o$l$k$N$G$7$g$&(B? $B$"$k%5%$%H$G$OC$7%a%C%;!<%8$r0z$-C$7%a%C%;!<%8$N$_$7$+0z$-C$75n$j$^$9!#(B - -$B$b$A$m$s!"$3$l$i$r%+%9%?%^%$%:$9$k$?$a$NJQ?t$,$$$/$D$+$"$j$^$9!#(B - -@table @code -@item gnus-use-nocem -@vindex gnus-use-nocem -$B$3$NJQ?t$r(B @code{t} $B$K@_Dj$9$k$3$H$G3hF0$r3+;O$5$;$^$9!#=i4|@_Dj$G(B -$B$O(B @code{nil} $B$G$9!#(B - -@item gnus-nocem-groups -@vindex gnus-nocem-groups -Gnus $B$O$3$N%0%k!<%W%j%9%H$+$i(B NoCeM $B%a%C%;!<%8$rC5$7$^$9!#=i4|@_DjCM(B -$B$O(B @code{("news.lists.filters" "news.admin.net-abuse.bulletins" "alt.nocem.misc" "news.admin.net-abuse.announce")} $B$G(B -$B$9!#(B - -@item gnus-nocem-issuers -@vindex gnus-nocem-issuers -NoCeM $B%a%C%;!<%8$rH/9T$9$k?M$O$?$/$5$s$$$^$9!#$3$N%j%9%H$G$O!"C/$N8@$&$3(B -$B$H$K=>$$$?$$$+$r;XDj$7$^$9!#=i4|@_DjCM$O(B @code{(("Automoose-1" -"clewis@@ferret.ocunix.on.ca" "cosmo.roadkill" "SpamHippo" -"hweede@@snafu.de")} $B$G$9!#H`$i$O$_$s$J!"N)GI$G9b7i$J;TL1$G$9!#(B - -$B$3$N%j%9%H$K4^$a$i$l$kM-L>$JH?%9%Q%`2H$?$A(B -$B$O(B @uref{http://www.xs4all.nl/~rosalind/nocemreg/nocemreg.html} $B$K:\$C$F(B -$B$$$^$9!#(B - -$B$3$l$iA4$F$N?M!9$N(B NoCeM $B%a%C%;!<%8$KN10U$9$kI,MW$O$"$j$^$;$s(B --- $B8@$&$3(B -$B$H$rJ9$-$?$$?M$@$1$G$$$$$s$G$9!#$^$?$=$N?M$+$i$N(B NoCeM$B%a%C%;!<%8A4$F$r$l/$O(B -$B87L)$J!"DxEY$M!#$?$$$F$$$O>/$@$1$I(B)$B!#NI$/;H$o$l$kr(B -$B7o(B} @dots{})} $BMWAG$r;H$&I,MW$,$"$j$^$9!#3F>r7o$OJ8;zNs(B ($B;H$$$?$$l9g$O(B @var{$BJ8;zNs(B} $B$O;H$$$?$/$J$$l9g$K$O!"(B - -@lisp -("clewis@@ferret.ocunix.on.ca" ".*" (not "troll")) -@end lisp - -$B0lJ}!"H`$N(B @samp{spam} $B$H(B @samp{spew} $B%a%C%;!<%80J30$O2?$b$7$?$/$J$1$l$P!"(B -$B0J2<$N$h$&$K$G$-$^$9!#(B - -@lisp -("clewis@@ferret.ocunix.on.ca" (not ".*") "spew" "spam") -@end lisp - -$B$3$N;XDj$O:8$+$i1&$KE,MQ$5$l$^$9!#(B - -@item gnus-nocem-verifyer -@vindex gnus-nocem-verifyer -@findex mc-verify -$B$3$l$O(B NoCeM $BH/9TZL@$9$k4X?t$G$J$/$F$O$J(B -$B$j$^$;$s!#=i4|@_Dj$G$O(B @code{mc-verify} $B$G$"$j!"$3$l$O(B Mailcrypt $B4X?t$G(B -$B$9!#$b$7$3$l$,Hs>o$KCY$/$F!"$"$J$?$,>ZL@7k2L$r5$$K$7$J$$(B ($B$3$l$O$?$V$s4m(B -$B81$G$9(B) $B$N$G$"$l$P!"$3$NJQ?t$r(B @code{nil} $B$K$9$k$3$H$,$G$-$^$9!#(B - -$B$b$7=pL>:Q$_$N(B NoCeM $B%a%C%;!<%8$r>ZL@:Q$_!"L$=pL>$N%a%C%;!<%8$rL$>Z(B -$BL@(B ($B$G$b$=$l$r;H$&(B) $B$H$7$?$$$N$J$i!"0J2<$N$h$&$K$9$k$3$H$,$G$-$^$9!#(B - -@lisp -(setq gnus-nocem-verifyer 'my-gnus-mc-verify) - -(defun my-gnus-mc-verify () - (not (eq 'forged - (ignore-errors - (if (mc-verify) - t - 'forged))))) -@end lisp - -$B$^$"!"$3$l$O$?$V$s4m81$G$7$g$&$1$I$M!#(B - -@item gnus-nocem-directory -@vindex gnus-nocem-directory -$B$3$l$O(B gnus $B$,(B NoCeM $B%-%c%C%7%e%U%!%$%k$rJ]B8$9$k>l=j$G$9!#=i4|@_DjCM(B -$B$O(B @file{~/News/NoCeM/} $B$G$9!#(B - -@item gnus-nocem-expiry-wait -@vindex gnus-nocem-expiry-wait -$B8E$$(B NoCeM $B9`L\$r%-%c%C%7%e$+$i>C$9$^$G$NF|?t!#=i4|@_DjCM$O(B 15 $B$G$9!#$3(B -$B$l$rC;$/$9$k$[$I(B gnus $B$OB.$/$J$j$^$9$,!"8E$$%9%Q%`$r8+$k$3$H$K$J$C$F$7$^(B -$B$&$+$b$7$l$^$;$s!#(B - -@item gnus-nocem-check-from -@vindex gnus-nocem-check-from -$BHs(B@code{nil} $B$G$O!"5-;v$N%\%G%#$K$"$kH/9T?M$N@5Ev@-$rD4$Y$^$9!#$=$&$G$J(B -$B$$>l9g$O!"CxC$75n$C$F$7$^$C$?J}$,NI$$$G(B -$B$9(B (@pxref{Subscription Commands})$B!#(B - -@node Undo -@section $B$d$jD>$7(B -@cindex undo - -$B$7$,$G$-$k$H!"$H$F$bJXMx$G$9!#IaDL$N(B Emacs $B%P%C%U%!(B -$B$G$O!"$3$l$O==J,4JC1$G$9(B --- $BC1$K(B @code{undo} $B%\%?%s$r2!$9$@$1$G$9!#$7$+(B -$B$7(B gnus $B$N%P%C%U%!$G$O!"$3$l$O4JC1$G$O$"$j$^$;$s!#(B - -Gnus $B$,%P%C%U%!!C5n$9$k(B -$B$N$O!"$=$N9T$O>C$(5n$j$^$9$,!"$=$l$O$7$O!"DL>o$N(B Emacs $B$N(B @code{undo} $B4X?t$G$O9T$J$&$3$H$,$G$-$^(B -$B$;$s!#(B - -Gnus $B$O!"MxMQ$72DG=$J%-!<4X?t$O6O$+$7$+Ds6!$7$F$$$^$;$s!#(B -$B$3$l$i$O!"%0%k!<%W$N:o=|!"%0%k!<%W$NE=$jIU$1!"%0%k!<%W$N4{FI5-;v$N%j%9%H(B -$B$NJQ99!"$=$l$@$1$J$s$G$9!#>-Mh$O$b$C$H4X?t$,DI2C$5$l$k$+$b$7$l$^$;$s$,!"(B -$B4X?t$NDI2C$O$=$l$>$lJ]B8$9$k$Y$-%G!<%?$rA}$d$9$3$H$K$J$k$N$G!"(Bgnus $B$O7h(B -$B$7$F40A4$d$jD>$72DG=$K$O$J$i$J$$$G$7$g$&!#(B - -@findex gnus-undo-mode -@vindex gnus-use-undo -@findex gnus-undo -$B$d$jD>$75!G=$O(B @code{gnus-undo-mode} $B%^%$%J!<%b!<%I$K$h$C$FDs6!$5$l$^$9!#(B -$B$3$l$O(B @code{gnus-use-undo} $B$,(B @code{nil} $B0J30$G$"$l$P;HMQ$5$l!"$3$l$,=i(B -$B4|@_Dj$G$9!#(B@kbd{M-C-_} $B%-!<$,(B @code{gnus-undo} $BL?Na$ro$N(B Emacs $B$N(B @code{undo} $BL?Na$K$A$g$C$H$@$1;w$F$$$k$H;W$o$l$k$G$7$g$&!#(B - -@node Moderation -@section $B;J2qLr(B -@cindex moderation - -$B$b$7$"$J$?$,;J2q5G'$7(B -$B$F$$$J$$5-;v$r$?$^$?$^8+$D$1$?$H$7$?$i!"(B@kbd{c} $BL?Na$GC$7$G$-$^$9!#(B -@end enumerate - -$BFs$D$N%0%k!<%W$G;J2q$N$b$N$rI=<($9$k$3$H$,$G$-$k$N$G!"(Bgnus $B$O$3$l$rMxMQ$9(B -$B$k$3$H$K$7$^$9!#(B - -@menu -* Picons:: $B$"$J$?$,FI$s$G$$$k$b$N$N3($rI=<($9$kJ}K!(B -* Smileys:: $BI=<($5$l$k$Y$/@8$^$l$?9,$;$=$&$J4i$rI=<((B - $B$9$kJ}K!(B -* Toolbar:: $B%/%j%C%/1n(B -* XVarious:: $B$=$NB>$N(B XEmacs $B$G(B Gnus $B$JJQ?t(B -@end menu - -@node Picons -@subsection Picons - -@iftex -@iflatex -\include{picons} -@end iflatex -@end iftex - -$B$=$l$G!D!"$"$J$?$O$3$N%K%e!<%9%j!<%@!<$r$5$i$K$b$C$HCY$/$7$?$$$C$F$o$1$@(B -$B$M(B! $B$3$l$O$=$&$9$k$N$K$T$C$?$j$JJ}K!$G$9!#$5$i$K$3$l$O!"$"$J$?$,%K%e!<%9(B -$B$rFI$s$G$$$k$s$@$H$$$&$3$H$r!"$"$J$?$N8*1[$7$K8+$D$a$F$$$k?M$K0u>]$E$1$k(B -$B$?$a$NAG@2$i$7$$J}K!$G$b$"$j$^$9!#(B - -@menu -* Picon Basics:: picon $B$H$O2?$G!"$I$&$d$C$F$N$V$C2u$7$?$j$R$M$C$?$j$$$8$C$?(B - $B$jM7$s$@$j$9$kJQ?t(B -@end menu - -@node Picon Basics -@subsubsection Picon $B$N4pAC(B - -Picon $B$H$O$J$s$G$7$g$&(B? Picons $B%&%'%V%5%$%H$+$iD>@\0zMQ$7$^$7$g$&!#(B - -@iftex -@iflatex -\margindex{} -@end iflatex -@end iftex - -@quotation -@dfn{Picon} $B$H$O!"(B``$B8D?M%"%$%3%s(B (personal icons)'' $B$NN,$G$9!#$3$l$O!"%M%C(B -$B%H>e$NMxMQ.$5$J2hA|$G!"%G!<%?%Y!<(B -$B%9$r;}$?$;$F!"$"$kEE;R%a!<%k%"%I%l%9$,$"$C$?$i!"$=$l$KE,@Z$J2hA|$r8+$D$1(B -$B$i$l$k$h$&$K$7$F$*$/$b$N$G$9!#MxMQo;~@\B3$7$F$$$k$N$J$i$P!"(B -@code{gnus-picons-piconsearch-url} $B$KJ8;z(B -$BNs(B @uref{http://www.cs.indiana.edu/picons/search.html} $B$r@_Dj$9$k$3$H$G!"(B -Steve Kinzler $B$N(B picon $B8!:w%(%s%8%s$r;H$&$3$H$,$G$-$^$9!#(B - -@vindex gnus-picons-database -$B$=$&$G$J$1$l$P!"H`$N%G!<%?%Y!<%9$rl=j$K%$(B -$B%s%9%H!<%k$7$F$"$k$b$N$H4|BT$7$^$9!#(B - -@node Picon Requirements -@subsubsection Picon $B$NF0:n>r7o(B - -Gnus $B$K(B picon $B$rI=<($5$;$k$K$O!"(BXEmacs 19.13 $B$+$=$l0J9_$r$NHG$N(B Emacs $B$G$O$I$l$b$^$@2hA|$rI=<($G$-$J$$$+$i$G$9!#(B - -$B$5$i$K!"(B@code{x} $B%5%]!<%HIU$-$G(B XEmacs $B$r%3%s%Q%$%k$7$F$$$J$/$F$O$J$j$^(B -$B$;$s!#Gr9u$h$j$b$b$C$H4qNo$J?'IU$-$N(B picon $B$rI=<($9$k$?$a$K$O!"(B -@code{xpm} $B$+(B @code{gif} $B$I$A$i$+$r(B XEmacs $B$H0l=o$K%3%s%Q%$%k$7$F$$$kI,(B -$BMW$b$"$j$^$9!#(B - -@vindex gnus-picons-convert-x-face -@code{X-Face} $B%X%C%@!<$N4i$rI=<($7$?$$$N$J$i!"(BXEmacs $B$r(B @code{xface} $B%5(B -$B%]!<%HIU$-$G%3%s%Q%$%k$7$J$1$l$P$J$j$^$;$s!#$=$&$G$J$1$l$P!"(B -@code{netpbm} $B%f!<%F%#%j%F%#$r%$%s%9%H!<%k$7$F$*$/$+!"$"$k$$$OB>$N2?$+$r(B -$B;H$&$h$&$K(B @code{gnus-picons-convert-x-face} $BJQ?t$r$$$8$/$C$F$/$@$5$$!#(B - -@node Easy Picons -@subsubsection $B3Z!9(B Picons - -picon $BI=<($rM-8z$K$9$k$K$O!"C1$K0J2<$N9T$r(B @file{~/.gnus} $B%U%!%$%k$KF~$l(B -$B$F!"(Bgnus $B$r5/F0$7$F$/$@$5$$!#(B - -@lisp -(setq gnus-use-picons t) -(setq gnus-treat-display-picons t) -@end lisp - -@code{gnus-picons-database} $B$,(B picon $B%G!<%?%Y!<%9$,4^$^$l$F$$$k%G%#%l%/(B -$B%H%j$r;X$7$F$$$k$3$H$r3NG'$7$F$/$@$5$$!#(B - -$B$=$NBe$o$j$K(B Web $B>e$N(B picon $B8!:w%(%s%8%s$r;H$$$?$1$l$P!"$3$l$rDI2C$7$^$9!#(B - -@lisp -(setq gnus-picons-piconsearch-url - "http://www.cs.indiana.edu:800/piconsearch") -@end lisp - -@node Hard Picons -@subsubsection $BFq2r(B Picons - -@iftex -@iflatex -\margindex{} -@end iflatex -@end iftex - -Gnus $B$O!"%0%k!<%W$d5-;v$KF~$C$?$j=P$?$j$9$k$N$K=>$C$F(B picon $B$rI=<($9$k$3(B -$B$H$,$G$-$^$9!#(BGnus $B$O(B picon $B%G!<%?%Y!<%9$N;0$D$N>O$H$I$&Aj8_:nMQ$9$l$P$h(B -$B$$$+$rCN$C$F$$$^$9!#$9$J$o$A!"(Bgnus $B$O%K%e!<%9%0%k!<%W$N3(!"Cxl=j!#(B@file{news}, @file{domains}, @file{users} ($B$J(B -$B$I$J$I(B) $B$N%5%V%G%#%l%/%H%j!<$,4^$^$l$F$$$k%G%#%l%/%H%j!<$r;X$7$F$$$J$1$l(B -$B$P$J$j$^$;$s!#$3$l$O(B @code{gnus-picons-piconsearch-url} $B$,(B @code{nil} $B$G(B -$B$"$k$H$-$N$_;HMQ$5$l$^$9!#=i4|@_DjCM$O(B @file{/usr/local/faces/} $B$G$9!#(B - -@item gnus-picons-piconsearch-url -@vindex gnus-picons-piconsearch-url -Web $B>e$N(B picon $B8!:w%(%s%8%s$N(B URL$B!#8=:_CN$i$l$F$$$kM#0l$N%(%s%8%s(B -$B$O(B @uref{http://www.cs.indiana.edu:800/piconsearch} $B$G$9!#%M%C%H%o!<%/CY(B -$B1d$r2sHr$9$k$?$a$K(B icon $B$O%P%C%/%0%i%&%s%I$Gl=j!#$3$l$O=i4|@_Dj$G$O(B @code{picons} $B$G$9(B ($B$3$l(B -$B$O=i4|@_Dj$G(B @samp{*Picons*} $B%P%C%U%!$K0LCV$7$^$9(B)$B!#B>$NM-8z$J>l=j$H$7$F(B -$B$O(B @code{article}, @code{summary} $B$"$k$$$O(B @samp{*scratch*} $B$@$m$&$HCN$C(B -$B$?$3$H$G$O$"$j$^$;$s!#$?$@$=$N%P%C%U%!$rI8=`$N(B gnus $BAkG[CV=h(B -$BM}(B --- @pxref{Window Layout} $B$K$h$C$F8+$($k$h$&$K$7$F$*$/$3$H$r3NG'$7$F(B -$B$/$@$5$$!#(B - -@item gnus-picons-group-excluded-groups -@vindex gnus-picons-group-excluded-groups -$B$3$N@55,I=8=$K%^%C%A$9$k%0%k!<%W$G$O$=$N%0%k!<%W%"%$%3%s$rI=<($5$;$^$;$s!#(B -@end table - -$BCm0U(B: $B$b$7(B @code{gnus-use-picons} $B$r(B @code{t} $B$K@_Dj$9$k$H!"AkG[CV(B -$B$K(B @code{picons} $B%P%C%U%!$r4^$a$k$h$&$K@_Dj$5$l$^$9!#(B - -$B$5$F!"$3$l$i$r7hDj$7$?8e$K$O!"$3$l$i$N3($,@5$7$$;~$KI=<($5$l$k$h$&$K!"0J(B -$B2<$N4X?t$rE,@Z$J%U%C%/$KDI2C$9$kI,MW$,$"$j$^$9!#(B - -@vindex gnus-picons-display-where - -@table @code -@item gnus-article-display-picons -@findex gnus-article-display-picons -$BCxLr$K(B -$B$bN)$?$J$$$I$&$G$b$h$$$3$H$r@)8f$G$-$k$h$&$K$7$^$9!#(B - -@table @code -@item gnus-picons-news-directories -@vindex gnus-picons-news-directories -@code{gnus-picons-database} $B$+$i%K%e!<%9%0%k!<%W%U%'%$%9$rC5$9$?$a$N%5%V(B -$B%G%#%l%/%H%j!<$N%j%9%H!#(B@code{("news")} $B$,=i4|@_DjCM$G$9!#(B - -@item gnus-picons-user-directories -@vindex gnus-picons-user-directories -@code{gnus-picons-database} $B$+$iMxMQ%U%'%$%9$rC5$9$?$a$N%5%V%G%#%l(B -$B%/%H%j!<$N%j%9%H!#=i4|@_DjCM$O(B @code{("domains")} $B$G$9!#$3$N%j%9%H(B -$B$K(B @samp{"unknown"} $B$rDI2C$7$F$*$-$?$/$J$k?M$b$$$k$G$7$g$&!#(B - -@item gnus-picons-convert-x-face -@vindex gnus-picons-convert-x-face -$B$b$7(B XEmacs $B$K(B @code{xface} $B%5%]!<%H$,AH$_9~$^$l$F$$$J$1$l$P!"$3$NL?Na$,(B -@code{X-Face} $B%X%C%@!<$r(B X $B%S%C%H%^%C%W(B (@code{xbm}) $B$KJQ49$9$k$N$K;HMQ(B -$B$5$l$^$9!#=i4|@_DjCM(B -$B$O(B @code{(format "@{ echo '/* Width=48, Height=48 */'; uncompface; @} | icontopbm | pbmtoxbm > %s" gnus-picons-x-face-file-name)} $B$G(B -$B$9!#(B - -@item gnus-picons-x-face-file-name -@vindex gnus-picons-x-face-file-name -@code{X-Face} $B%S%C%H%^%C%W$r3JG<$7$F$*$/0l;~%U%!%$%k$NL>A0!#=i4|@_DjCM(B -$B$O(B @code{(format "/tmp/picon-xface.%s.xbm" (user-login-name))}$B!#(B - -@item gnus-picons-has-modeline-p -@vindex gnus-picons-has-modeline-p -@code{gnus-picons-display-where} $B$r(B @code{picons} $B$K@_Dj$7$F$7$^$&$H!"(B -XEmacs $B$N%U%l!<%`$O$a$A$c$a$A$c$K$J$C$F$7$^$&$G$7$g$&!#$3$l$rB?>/$J$j$H(B -$B$b7Z8:$9$k$K$O!"(B@code{gnus-picons-has-modeline-p} $B$r(B @code{nil} $B$K@_Dj$7(B -$B$F$/$@$5$$!#$3$l$O(B picon $B%P%C%U%!$+$i%b!<%I9T$r$H$7$F;n$7$F$_$k3HD%;R$N=g=x%j%9%H!#=i4|@_DjCM(B -$B$O(B @code{("xpm" "gif" "xbm")} $B$+$i(B XEmacs $B$KAH$_9~$^$l$F$$$J$$$b$N$r0z$$(B -$B$?$b$N$G$9!#(B - -@item gnus-picons-setup-hook -@vindex gnus-picons-setup-hook -picon $B$,$b$7I=<($5$l$F$$$l$P!"(Bpicon $B%P%C%U%!$GC$75n$k$+$I$&$+!#(BGnus $B$O/@aLs(B -$B$G$-$^$9$,!"%a%b%j$r$$$/$i$+?)$$$^$9!#$b$7$3$NJQ?t$r(B @code{nil} $B$K@_Dj$9(B -$B$l$P!"(Bgnus $B$O$=$N%-%c%C%7%e$r7h$7$F>C$7$^$;$s!#$=$l$r>C$75n$k$K$OC5n$5$l$^$9!#=i(B -$B4|@_DjCM$O(B @code{t} $B$G$9!#(B - -@iftex -@iflatex -\margindex{} -@end iflatex -@end iftex -@end table - -@node Smileys -@subsection $B%9%^%$%j!<(B -@cindex smileys - -@iftex -@iflatex -\gnusfig{-3cm}{0.5cm}{\epsfig{figure=tmp/BigFace.ps,height=20cm}} -\input{smiley} -@end iflatex -@end iftex - -$B%9%^%$%j!<(B @dfn{smiley} $B$O(B gnus $B$H$OJL$N%Q%C%1!<%8$G$9$,!"%9%^%$%j!<$r;H$C(B -$B$F$$$k%Q%C%1!<%8$O8=:_(B gnus $B$@$1$G$9$N$G!"$3$3$G@bL@$7$^$9!#(B - -$B0l8@$G8@$($P(B --- gnus $B$G%9%^%$%j!<$r;H$&$K$O!"0J2<$r(B @file{.gnus.el} $B%U%!(B -$B%$%k$K=q$$$F$/$@$5$$!#(B - -@lisp -(setq gnus-treat-display-smileys t) -@end lisp - -$B%9%^%$%j!<$O!"J8;z$N4i%^!<%/(B --- @samp{:-)}, @samp{:-=}, @samp{:-(} $B$J$I(B -$B$H$$$C$?$b$N(B --- $B$r3($KBP1~$5$;!"J8;z$N4i%^!<%/$NBe$o$j$K$=$N3($rI=<($7(B -$B$^$9!#$3$NJQ49$OJ8;z$K%^%C%A$9$k@55,I=8=$H$=$l$N%U%!%$%kL>$X$NBP1~$N%j%9(B -$B%H$G@)8f$5$l$^$9!#(B - -@vindex smiley-nosey-regexp-alist -@vindex smiley-deformed-regexp-alist -$B%9%^%$%j!<$O=i4|@_Dj$G$OFs$D$NJQ49O"A[%j%9%H$NNc$rDs6!$7$F$$$^$9!#(B -@code{smiley-deformed-regexp-alist} (@samp{:)}, @samp{:(} $B$J$I$K%^%C%A(B -$B$9$k(B) $B$H!"(B@code{smiley-nosey-regexp-alist} (@samp{:-)}, @samp{:-(} $B$J$I(B -$B$K%^%C%A$9$k(B) $B$G$9!#(B - -$B;HMQ$5$l$kO"A[%j%9%H$O(B @code{smiley-regexp-alist} $BJQ?t$G;XDj$5$l$^$9!#$3(B -$B$N=i4|@_DjCM$O(B @code{smiley-deformed-regexp-alist} $B$G$9!#(B - -$B3FMWAG$N:G=i$N9`L\$O%^%C%A$5$;$?$$@55,I=8=$G!"FsHVL\$NMWAG$O3($GCV$-49$((B -$B$?$$%0%k!<%W$K%^%C%A$9$k@55,I=8=!"$=$7$F;0HVL\$NMWAG$OI=<($5$;$?$$%U%!%$(B -$B%k$NL>A0$G$9!#(B - -$B0J2<$NJQ?t$O!"%9%^%$%j!<$,$3$l$i$N%U%!%$%k$rC5$9>l=j!"$"$k$$$O$I$N?'$r;H(B -$B$&$+$H!"$=$NB>$N$b$N$r%+%9%?%^%$%:$7$^$9!#(B - -@table @code -@item smiley-data-directory -@vindex smiley-data-directory -$B%9%^%$%j!<$,4i%U%!%$%k$rC5$9>l=j!#(B - -@item smiley-flesh-color -@vindex smiley-flesh-color -$BH)$N?'!#=i4|@_DjCM$O!"?Ml9g$O!"(B -@code{default-toolbar}, @code{top-toolbar}, @code{bottom-toolbar}, @code{right-toolbar}, @code{left-toolbar} $B$N(B -$B$I$l$+$G$J$/$F$O$J$j$^$;$s!#(B - -@item gnus-group-toolbar -@vindex gnus-group-toolbar -$B%0%k!<%W%P%C%U%!Fb$N%D!<%k%P!l=j$G$9!#(BGnus $B$ODL>o$3$N%G%#%l%/%H%j$r<+F08!=P$7(B -$B$^$9$,!"$b$7I8=`E*$G$J$$%G%#%l%/%H%j!<9=B$$r;}$C$F$$$k>l9g$O!"$3$l$rl9gBEEv$J7k2L$r=P$7$^$9(B --- $B$?$H$(%K%e!<%9%j!<(B -$B%@!<$N2>LL$r$+$V$C$?J8;zNs@Z$j9o$_5!$G@8@.$5$l$?J8;zNs$,:9$7=P$5$l$F$b!"(B -$B$G$9!#(B - -@node Thwarting Email Spam -@section spam $B%a!<%k$NN"$r$+$/(B -@cindex email spam -@cindex spam -@cindex UCE -@cindex unsolicited commercial email - -$B$3$3:G6a$N(B USENET $B$G$O!"@kEA$N%O%2%?%+$I$b$,!"H`$i$N:>5=$d@=IJ$r2!$7IU$1(B -$B$k$?$a$NEE;R%a!<%k%"%I%l%9$rC5$=$&$H$7$F!"5$0c$$$N$h$&$K%K%e!<%9>e$r$&$m(B -$B$D$$$F(B grep $B$7$^$/$C$F$$$^$9!#$3$l$KBP$9$kH?F0$H$7$F!"B?$/$N?M!9(B -$B$,(B @code{From} $B9T$KL50UL#$J%"%I%l%9$rF~$l$O$8$a$k$h$&$K$J$C$F$7$^$$$^$7(B -$B$?!#$3$l$OHs@8;:E*$J$3$H$@$H;d$O;W$$$^$9(B --- $B$"$J$?$,=q$$$?$3$H$KBP$9$k(B -$BJV?.$H$7$F@5Ev$J%a!<%k$rAw$k$3$H$rLLE]$K$5$;!"$^$?C/$,=q$$$?$b$N$J$N$+$r(B -$BJ,$+$j$E$i$/$7$^$9!#$3$s$J=q$-49$($O7k6I$O!"2!$7IU$1@kEA%a!<%k$=$l<+?H$h(B -$B$j$bBg$-$J6<0R$H$J$k$+$b$7$l$^$;$s!#(B - -$B;d$K$H$C$F$N(B spam $B%a!<%k$N:GBg$NLdBj$O!"13$N8}\n") -@end lisp - -$B$=$7$F(B @code{nnmail-split-fancy} $B$K0J2<$NJ,N%5,B'$rF~$l$^(B -$B$9(B (@pxref{Fancy Mail Splitting})$B!#(B - -@lisp -( - ... - (to "larsi@@trym.ifi.uio.no" - (| ("subject" "re:.*" "misc") - ("references" ".*@@.*" "misc") - "spam")) - ... -) -@end lisp - -$B$3$N0UL#$O!"$3$N%"%I%l%9$KFO$$$?A4$F$N%a!<%k$r$^$:5?$$$^$9$,!"(B -@samp{Re:} $B$G;O$^$k(B @code{Subject} $B$,$D$$$F$$$k$+!"(B@code{References} $B%X%C(B -$B%@!<$,$D$$$F$$$l$P$*$=$i$/(B OK $B$@$m$&!"$H$$$&$3$H$G$9!#;D$j$OA4$F(B -@samp{spam} $B%0%k!<%W$K9T$-$^$9!#(B($B$3$N%"%$%G%"$O$*$=$i$/(B Tim Pierce $B;a$K(B -$B$h$k$b$N$G$9!#(B) - -$B$3$l$K2C$($F!"B?$/$N%a!<%k(B spam $B20$O!"$"$J$?$N$H$3$m$N(B @code{smtp} $B%5!<(B -$B%P!<$HD>@\OC$7!"(B@code{To} $B%X%C%@!<$K$"$J$?$N%a!<%k%"%I%l%9$,L@<($5$l$J$$(B -$B$h$&$K$7$^$9!#$J$s$G$=$s$J$3$H$r$9$k$N$+$O$o$+$j$^$;$s$,(B --- $B$*$=$i$/;d(B -$B$?$A$NN"$r$+$/5!9=$NN"$r$+$/$?$a$+$J(B? $B$I$A$i$K$7$F$b!"BP=h$O4JC1$J$3$H$G(B -$B$9(B --- $B$"$J$?08$F$G$J$$$b$N$rA4It(B @samp{spam} $B%0%k!<%W$K$$$l$k$@$1$G$9!#(B -$B$3$l$O$*9%$_J,N%5,B'$N:G8e$K$3$s$JIw$KF~$l$k$3$H$G$G$-$^$9!#(B - -@lisp -( - ... - (to "larsi" "misc") - "spam") -@end lisp - -$B;d$N7P83$G$O!"$3$l$G;veA4$F$,@5$7$$%0%k!<%W$KJ,N`$5$l$^$9!#$^$"!"$=$l(B -$B$G$b$H$-$I$-(B @samp{spam} $B%0%k!<%W$r%A%'%C%/$7$F!"@5$7$$%a!<%k$,$"$k$+%A%'%C(B -$B%/$7$J$/$F$O$$$1$^$;$s$1$I$M!#$b$7$"$J$?$O<+J,$,NI$$%M%C%H%o!<%/;TL1$G$"(B -$B$k$H;W$C$F$$$k$J$i!"$=$l$>$l$N2!$7IU$1@kEA%a!<%k$N4X78Ev6I$K6l>p$rAw$jIU(B -$B$1$k$3$H$5$($b$G$-$^$9(B --- $B2K$J$H$-$K$G$b$M!#(B - -$B$^$?!"$"$J$?$,BU$1p$r$$$&J}$,NI$$$H;W$&$+(B -$B$b$7$l$^$;$s!#$3$l(B -$B$O(B @* @uref{http://stud2.tuwien.ac.at/~e9426626/gnus-junk.html} $B$+(B -$B$i!VL5NA$G!WMxMQ$G$-$^$9!#$[$H$s$I$N(B spam $B%a!<%k$O<+F0E*$KAw$i$l$F$$$k$N(B -$B$G!"$A$g$C$H$@$11'Ch$N%P%i%s%9$,$H$l$k$+$b$7$l$^$;$s!#(B - -$B$3$l$G;d$N$H$3$m$G$OF0$$$F$$$^$9!#$3$l$G$_$s$J$O4JC1$JJ}K!$G;d$KO"Mm$ruBV$G$9!#;d$N0U8+$H$7$F$O!"(B@code{From} $B%X%C%@!<(B -$B$K56B$$7$FB8:_$7$J$$%I%a%$%s$KAw$i$;$k$N$O%-%?%J%$$G$9!#(B - -@node Various Various -@section $B$$$m$$$m$N$$$m$$$m(B -@cindex mode lines -@cindex highlights - -@table @code -@item gnus-home-directory -$BA4$F$N(B gnus $B$N%Q%9JQ?t$O$3$NJQ?t$K$h$C$F=i4|2=$5$l$^$9!#$=$N=i4|@_DjCM(B -$B$O(B @file{~/} $B$G$9!#(B - -@item gnus-directory -@vindex gnus-directory -$B$?$/$5$s$N(B gnus $B3JG<%Q%9JQ?t$O$3$NJQ?t$K$h$C$F=i4|2=$5$l$^$9!#$=$N=i4|@_(B -$BDjCM$O(B @samp{SAVEDIR} $B4D6-JQ?t$NCM$+!"$=$NJQ?t$,@_Dj$5$l$F$$$J$$>l9g(B -$B$O(B @file{~/News/} $B$G$9!#(B - -@file{.gnus.el} $B%U%!%$%k$,FI$^$l$?$H$-$O(B gnus $B$N$[$H$s$I$O$9$G$KFI$_9~$^(B -$B$l$F$$$k$H$$$&$3$H$KCm0U$7$F$/$@$5$$!#$3$l$O$D$^$j!"$3$NJQ?t(B -$B$r(B @file{.gnus.el} $B$NCf$G@_Dj$7$F$b!"$3$NJQ?t$K$h$C$F=i4|2=$5$l$kB>$N%G%#(B -$B%l%/%H%j!e5-$NJQ?t$K$OA4$/4X78$"$j$^$;$s(B --- $B$3$NJQ?t$OA4$F$N(B gnus $B%P%C%U%!!<$N(B -$B%G%#%U%)%k%H%G%#%l%/%H%j!<$r$I$&$9$Y$-$+$r@_Dj$7$^$9!#$b(B -$B$7(B @kbd{C-x C-f} $B$N$h$&$JL?Na$r/$J$$(B -$BNL$@$1$rFI$b$&$HEXNO$7$^$9!#$3$NJQ?t(B ($B=i4|@_DjCM(B 4096) $B$O!"%P%C%/%(%s%I(B -$B$,%X%C%@!<$HK\J8$N4V$N6h@Z$j9T$r8+$D$1$k$^$G$KFI$_9~$b$&$H$9$k@dBP:GBgD9(B -$B$r;XDj$7$^$9!#$3$NJQ?t$,(B @code{nil} $B$G$"$l$P!"FI$_9~$_>e8B$O$"$j$^$;$s!#(B -$B$b$7(B @code{t} $B$G$"$l$P!"%P%C%/%(%s%I$O5-;v$rItJ,ItJ,$GFI$_9~$b$&$H$O$;$:!"(B -$B5-;vA4BN$rFI$_9~$_$^$9!#$3$l$O(B @code{ange-ftp} $B$d(B @code{efs} $B$N$"$k%P!<(B -$B%8%g%s$G0UL#$r$b$A$^$9!#(B - -@item nnheader-head-chop-length -@vindex nnheader-head-chop-length -$B$3$NJQ?t(B ($B=i4|@_DjCM(B 2048) $B$O!"A05-$NA`:n$r9T$C$F$$$k$H$-$K!"$I$l$/$i$$(B -$B$NBg$-$5$NC10L$G3F5-;v$rFI$_9~$`$+$r@_Dj$7$^$9!#(B - -@item nnheader-file-name-translation-alist -@vindex nnheader-file-name-translation-alist -@cindex file names -@cindex invalid characters in file names -@cindex characters in file names -$B$3$l$O%U%!%$%kL>$NJ8;z$r$I$N$h$&$KJQ49$9$k$+$r;XDj$9$kO"A[%j%9%H$G$9!#Nc(B -$B$($P!"$b$7(B @samp{:} $B$,$"$J$?$N%7%9%F%`$G$O%U%!%$%kL>$NJ8;z$H$7$F$O;H$($J(B -$B$$>l9g(B ($B$"$J$?$O(B OS/2 $B%f!<%6$G$9(B)$B!"0J2<$N$h$&$K$9$k$3$H$,$G$-$^$9!#(B - -@lisp -(setq nnheader-file-name-translation-alist - '((?: . ?_))) -@end lisp - -$Be$G$N$3$NJQ?t$N=i4|(B -$B@_DjCM$G$9!#(B - -@item gnus-hidden-properties -@vindex gnus-hidden-properties -$B$3$l$O(B ``$BIT2D;k(B'' $B%F%-%9%H$r1#$9$?$a$K;H$o$l$kB0@-$N%j%9%H$G$9!#$[$H$s$I(B -$B$N%7%9%F%`$G$O=i4|@_DjCM$O(B @code{(invisible t intangible t)} $B$G!"$3$l$O(B -$BIT2D;k%F%-%9%H$r8+$($J$/$7$F?($l$J$/$7$^$9!#(B - -@item gnus-parse-headers-hook -@vindex gnus-parse-headers-hook -$B%X%C%@!<$r2rpJs$r$r3NG'$9$k$H$-$K;H$&!"(B``$B;H$($J$$(B'' $B%0%k!<%WL>$K%^%C%A(B -$B$9$k@55,I=8=$G$9!#4{DjCM$O(B gnus $B$NFbItF0:n(B ($BA*BrJ}K!$H%0%k!<%W$N6-3&$K!"(B -$BDL>o(B @samp{:} $B$r;H$C$F$$$k(B) $B$r$a$A$c$a$A$c$K$7$F$7$^$&$+$b$7$l$J$$!"$$$/(B -$B$D$+$N(B @strong{$BK\Ev$K(B} $B;H$($J$$%0%k!<%WL>$rJa$^$($^$9!#(B - -@sc{imap} $B%f!<%6$O%0%k!<%WL>$K(B @samp{/} $B$r;H$$$?$$$H;W$&$G$7$g$&$1$l$I!#(B -@end table - -@node The End -@chapter $B=*$o$j(B - -$B$O$$!"0J>e$,%^%K%e%"%k$G$9(B---$B$"$J$?$O$b$&<+J,<+?H$N?M@8$rAw$k;v$,$G$-$^(B -$B$9!#O"Mm$r$H$C$F2<$5$$!#$"$J$?$NG-$K:#F|$O!"$H$$$C$F$*$$$F2<$5$$!#(B - -$B$*$*!"(B@strong{$B?@$h(B}---$B$5$h$J$i$rBQ$($k;v$O$G$-$^$;$s!#(B($B$9$9$j5c$-!#(B) - -Ol' Charles Reznikoff $B$O$=$l$rHs>o$K$h$/8=$7$F$$$^$9$N$G!"$3$3$OH`$N$?$a(B -$B$K>y$j$^$9(B: - -@quotation -@strong{Te Deum} - -@sp 1 -Not because of victories @* -I sing,@* -having none,@* -but for the common sunshine,@* -the breeze,@* -the largess of the spring. - -@sp 1 -Not for victory@* -but for the day's work done@* -as well as I was able;@* -not for a seat upon the dais@* -but at the common table.@* -@end quotation - -$B;nLu(B: - -@quotation -@strong{Te Deum} - -@sp 1 -$B>!Mx$7$?$+$i$G$O$J$/(B @* -$B;d$O2N$&(B @* -$B2?$bL5$$$1$l$I(B @* -$B$"$NF|8w$d(B @* -$BB)?a$d(B @* -$B=U$NBg$-$5$N$?$a$K(B @* - -@sp 1 -$B>!Mx$N$?$a$G$O$J$/(B @* -$B0lF|$NO+F/$N$?$a$K(B @* -$B$^$?!"$=$l$rC#@.$G$-$?$3$H$K(B @* -$B9b:B$N>e$N@J$N$?$a$G$O$J$/(B @* -$BIaDL$N%F!<%V%k$N$H$3$m$G(B @* -@end quotation - -@node Appendices -@chapter $BIUO?(B - -@menu -* History:: $B$I$&$d$C$F(B gnus $B$,:#F|$N$h$&$K$J$C$?$+(B -* On Writing Manuals:: $B$J$<$3$l$,=i?4e$=$&$H7h?4$7$^$7(B -$B$?!#(B - -$B$3$NL5Ni$r9T$C$??MJ*$rD4$Y$F$_$?$$$N$J$i!"$"$J$?$N(B ($B$/$=(B!) $B%&%'%V%V%i%&(B -$B%6!<$r(B @uref{http://quimby.gnus.org/} $B$K8~$1$k;v$,$G$-$^$9!#(B -$B$3$l$O?7$7$/$F?h$JHG$N(B gnus $B$NBh0lG[I[>l=j$G!"(BNewsrc $B$r$V$C2u$7$F?M!9$r(B -$B7cE\$5$l$k%5%$%H$H$7$FCN$i$l$F$$$^$9!#(B - -$B:G=i$N%"%k%U%!HG$N3+H/4|4V$K!"?7$7$$(B Gnus $B$O(B ``(ding) Gnus'' $B$H8F$P$l$F(B -$B$$$^$7$?!#(B@dfn{(ding)} $B$O$b$A$m$s!"(B@dfn{ding is not Gnus} $B$NC;=L7A$G!"$3(B -$B$l$OA4$/40A4$J13$G$9$,!"$@$l$,$=$s$J$3$H$r5$$K$9$k$G$7$g$&$+(B? ($B$H$3$m$G!"(B -$B$3$NC;=L7A$N(B ``Gnus'' $B$O$*$=$i$/G_ED$5$s$N0U?^DL$j(B ``$B%K%e!<%9(B'' $B$HH/2;$5(B -$B$l$k$Y$-$G!"$=$&$9$k$H$b$C$HE,@Z$JL>A0$K$J$j$^$9!#$=$&;W$$$^$;$s$+(B?) - -$B$I$A$i$K$;$h!"A4$F$N%(%M%k%.!<$r?7$7$$855$$NNI$$L>A0$rIU$1$k$N$K;H$$2L$?(B -$B$7$?8e!"$=$NL>A0$O(B @emph{$B$"$^$j$K(B} $B855$$,NI$9$.$k$H$$$&;v$K$J$j!"$=$l(B -$B$r(B ``Gnus'' $B$H:F$SL?L>$7$^$7$?!#$G$b!":#2s$OBgJ8;z$H>.J8;z$r:.$<$F$$$^$9!#(B -``Gnus'' $B$H(B ``@sc{gnus}'' $B$G$9!#?7$7$$$b$N(B $B$H(B $B8E$$$b$N!#(B - -@menu -* Gnus Versions:: $B$I$s$J%P!<%8%g%s$N(B Gnus $B$,%j%j!<%9$5$l$F(B - $B$$$k$+(B -* Other Gnus Versions:: $B%j%j!<%9$5$l$F$$$kB>$N%P!<%8%g%s$N(B Gnus -* Why?:: Gnus $B$NL\E*$O2?(B? -* Compatibility:: Gnus $B$O(B @sc{gnus} $B$H$I$l$/$i$$8_49@-$,$"$k(B - $B$N(B? -* Conformity:: Gnus $B$OA4$F$NI8=`$rK~$?$=$&$H$9$k(B -* Emacsen:: Gnus $B$O$$$/$D$+$N8=BeE*$J(B Emacs $B4D6-$G(B ``September Gnus'' (99 $B%j%j!<%9$N8e(B -$B$G(B)) $B$,(B ''Gnus 5.2`` $B$H$$$&L>A0$G%j%j!<%9$5$l$^$7$?(B (40 $B%j%j!<%9(B)$B!#(B - -1996$BG/$N(B 7$B7n(B28$BF|$K(B Red Gnus $B$N:n6H$,;O$^$j!"$=$l$O(B 1997$BG/(B1$B7n(B25$BF|(B -$B$K(B (84 $B%j%j!<%9$N8e$G(B) ``Gnus 5.4'' $B$H$7$F%j%j!<%9$5$l$^$7$?(B (67 $B%j%j!<(B -$B%9(B)$B!#(B - -1997$BG/(B9$B7n(B13$BF|$K!"(BQuassia Gnus $B$,3+;O$5$l!"(B37 $B%j%j!<%9B3$-$^$7$?!#$=$l(B -$B$O(B ``Gnus 5.6'' $B$H$7$F(B 1998$BG/(B3$B7n(B8$BF|$K%j%j!<%9$5$l$^$7$?(B (46 $B%j%j!<%9(B)$B!#(B - -1998$BG/(B8$B7n(B29$BF|$K(B Gnus 5.6 $B$+$i(B Pterodactyl Gnus $B$,@8$^$l!"(B1999$BG/(B12$B7n(B3$BF|(B -$B$K(B (99 $B%j%j!<%9$H(B CVS $B%j%]%8%H%j$G$N:n6H$N8e(B) ``Gnus 5.8'' $B$H$7$F%j%j!<(B -$B%9$5$l$^$7$?!#(B - -2000$BG/(B10$B7n(B26$BF|$K(B Oort Gnus $B$,3+;O$5$l$^$7$?!#(B - -$B$b$7@\F,<-$r;}$C$?HG$N(B Gnus -- ``(ding) Gnus'', ``September Gnus'', -``Red Gnus'', ``Quassia Gnus'', ``Pterodactyl Gnus'', ``Oort Gnus'' --- $B$K=P2q$C$F$b!":.Mp$7$J$$$G$/$@$5$$!#$"$J$?$,62$,$C$F$$$k;v$rCN$i$l$F(B -$B$O$$$1$^$;$s!#8e$m$K2<$,$j$J$5$$!#$f$C$/$j$H!#B>$K2?$r$7$F$b!"Av$C$F$O$$(B -$B$1$^$;$s!#$=$l$,FO$+$/$J$k$^$G!"@E$+$KJb$-5n$j$J$5$$!#E,@Z$K%j%j!<%9$5$l(B -$B$?HG$N(B Gnus $B$r8+$D$1$F!"Be$o$j$K$=$l$K4s$jE:$C$F2<$5$$!#(B - -@node Other Gnus Versions -@subsection $BB>$N(B gnus $B$N%P!<%8%g%s(B -@cindex Semi-gnus - -Lars $B$5$s$,D4@=$7$F%j%j!<%9$7$?(B Gnus $B$K2C$($F!"F|K\$G$O(B Semi-gnus $B$N3+H/(B -$B$,9T$J$o$l$F$$$^$9!#$3$l$O(B SEMI $B$H$$$&(B MIME $B$N5!G=$rN$5$l!"(BT-gnus, Nana-gnus $B$*$h$S(B Chaos $B$N0[$J$C$?7O(B -$BE}$,$"$j$^$9!#$3$l$i$O6/NO$J(B MIME $B$N5!G=$H3F9q8lBP1~$N5!G=$rDs6!$9$k$b$N(B -$B$G!"FC$KF|K\?M$N%f!<%6$K$H$C$FBg;v$J$b$N$G$9!#(B - -@node Why? -@subsection $B$J$<(B? - -Gnus $B$NL\E*$O2?$G$9$+(B? - -$B;d$O!"$"$J$?$N9M$(IU$/;v$rA4$F$G$-$k(B ``$B$9$P$i$7$$(B'' ``$B$+$C$3$$$$(B'' ``$B$$(B -$B$+$9(B'' ``$B$O$d$j$N(B'' $B%K%e!<%9%j!<%@$rDs6!$7$?$$$H;W$$$^$9!#$3$l$O;d$NBg85(B -$B$NF05!$G$9$,!"(BGnus $B$N:n6H$r$7$F$$$k4V$K!"$3$N@$Be$N%K%e!<%9%j!<%@!<$OK\(B -$BEv$K@P4o;~Be$KB0$7$F$$$k$H$$$&;v$,L@$i$+$K$J$j$^$7$?!#%K%e!<%9%j!<%@!<$O!"(B -$B%$%s%?!<%M%C%H$NMD;y4|$+$i$[$H$s$IH/E8$7$F$$$^$;$s$G$7$?!#$b$78=:_$NA}2C(B -$BN($GNL$,A}2C$7$D$E$1$l$P!"A4$F$N8=:_$N%K%e!<%9%j!<%@!<$OA4$/Lr$KN)$?$J$/(B -$B$J$k$G$7$g$&!#0lF|$K(B 1000 $B$d$b$C$H$?$/$5$s$N?7$7$$5-;v$N$"$k%K%e!<%9%0%k!<(B -$B%W$r07$&$K$O$I$&$9$l$PNI$$$N$G$7$g$&(B? $BEj9F$r$9$kI4K|$d$=$l$h$jB?$$?M!9$K(B -$BCY$l$J$$$h$&$KIU$$$F$$$/$K$O$I$&$9$l$PNI$$$N$G$7$g$&(B? - -Gnus $B$O$3$l$i$Nl$H$7$F;H$o$l$FM_$7$$$G$9!#G_ED$5(B -$B$s$N%K%e!<%9%j!<%@!<$r%P%C%/%(%s%I$+$iJ,N%$9$k$H$$$&8-L@$JJ}?K$r3HD%$9$k(B -$B;v$K$h$C$F!"(BGnus $B$O%a!<%k$r7$$$F$$$k$N$G$9!#(B - -$B$*$=$i$/(B Gnus $B$O40@.$9$k;v$O$J$$$N$+$b$7$l$^$;$s!#(B -@kbd{C-u 100 M-x all-hail-emacs} $B$H(B @kbd{C-u 100 M-x all-hail-xemacs} $B$G(B -$B$9!#(B - -@node Compatibility -@subsection $B8_49@-(B - -@cindex compatibility -Gnus $B$O(B @sc{gnus} $B$H40A4$K8_49@-$,$"$k$h$&$K@_7W$5$l$F$$$^$9!#$[$H$s$IA4(B -$B$F$N%-!<%P%$%s%G%#%s%0$O$=$N$^$^;D$C$F$$$^$9!#$b$A$m$s!"B?$/$N%-!<%P%$%s(B -$B%G%#%s%0$,DI2C$5$l$^$7$?$,!"0l$D$+Fs$D$N$"$$$^$$$J>l9g$r=|$$$F!"8E$$%P%$(B -$B%s%G%#%s%0$,JQ99$5$l$?;v$O$"$j$^$;$s!#(B - -$B2f!9$N%b%C%H!<$O(B: -@quotation -@cartouche -@center $B9]E4$N9|AH$_$N6u9b$/!#(B -@end cartouche -@end quotation -$B$G$9!#(B - -$BA4$F$NL?Na$O$=$NL>A0$,JQ$o$C$F$$$^$;$s!#$$$/$D$+$NFbIt4X?t$OL>A0$rJQ$($^(B -$B$7$?!#(B - -@code{gnus-uu} $B%Q%C%1!<%8$O7`E*$KJQ2=$7$F$$$^$9!#(B@xref{Decoding -Articles}. - -$B0l$D$Ne$2$^$9(B)$B!"D>@\O"A[%j%9%H$rJQ99$9$k;v$O0[>o$J7k2L$r$b$?$i$9$G$7$g$&!#(B - -@cindex hilit19 -@cindex highlighting -$B8E$$(B hilit19 $B$N%3!<%I$OA4$/F0:n$7$^$;$s!#$N%3!<(B -$B%I(B) $B$r>C5n$9$k$Y$-$G$7$g$&!#(B@sc{gnus} $B$Ko$K(B} $B$h$/%P%0Js9p$rAw$kJJ$,$"$k$N$G$"$l$P!"$7$P$i$/$9$k$HLr$KN)(B -$B$D(B help $B%P%C%U%!$,$&$k$5$$$H46$8$k$+$b$7$l$^$;$s!#$=$&$G$"$l$P!"$=$l$,I=(B -$B<($5$l$k$N$rHr$1$k$?$a$K!"(B -@code{gnus-bug-create-help-buffer} $B$r(B @code{nil} $B$K@_Dj$7$F2<$5$$!#(B - -@node Conformity -@subsection $B0lCW@-(B - -$B$3$l$O!"M}M3L5$-H?93!"$8$c$J$$$G$9$h!"1|$5$s!#2f!9$OA4$F$NCN$i$l$F$$$kI8(B -$B=`$K1h$C$F$$$^$9!#$b$A$m$s!"2f!9$,;?@.$G$-$J$$I8=`$H(B/$B$b$7$/$O=,47$O=|$-(B -$B$^$9$,!#(B - -@table @strong -@item RFC 822 -@cindex RFC 822 -$B$3$NI8=`$X$NCN$i$l$F$$$k0cH?$O$"$j$^$;$s!#(B - -@item RFC 1036 -@cindex RFC 1036 -$B$3$NI8=`$bCN$i$l$F$$$k0cH?$O$"$j$^$;$s!#(B - -@item Son-of RFC 1036 -@cindex Son-of RFC 1036 -$B$3$l$K$O$$$/$D$+$N0cH?$,$"$j$^$9!#(B - -@table @emph -@item X-Newsreader -@item User-Agent -$B$3$l$O(B ``$B$D$^$i$J$$%X%C%@!<(B'' $B$H9M$($i$l$F$$$^$9$,!";d$O>CHqpJs$G$"(B -$B$k$H8+$J$7$F$$$^$9!#(B@code{tin} $B$H(B @code{Netscape} $B$+$iAw$i$l$F$/$kHs>o$K(B -$BB?$/$NMM<0$K1h$C$F$$$J$$5-;v$r8+$?8e$G!";d$O$=$l$i$r5-;v$rEj9F$9$k$?$a$K(B -$B$O;H$o$J$$J}$,NI$$$H$$$&;v$rCN$j$^$7$?!#$b$7(B @code{X-Newsreader} $B%X%C%@!<(B -$B$,L5$1$l$P;d$O$=$N>pJs$rF@$k;v$O$J$+$C$?$G$7$g$&!#(B -@end table - -@item USEFOR -@cindex USEFOR -USEFOR $B$O!"(BIETF $B$N(B working group $B$,(B Son-of-RFC 1036 $B$K4p$E$$$F!"(B -RFC 1036 $B$N8e7Q$H$7$F=q$$$F$$$k$b$N$G$9!#%K%e!<%95-;v$NMM<0$KBP$7$F!"$$(B -$B$m$$$m$JJQ99$rDs0F$7$?(B draft $B$r:n@.$7$^$7$?!#(BGnus $B%?%o!<(B -$B$O(B draft $B$,(B RFC $B$H$7$FG'$a$i$l$?$H$-$KJQ99$Ne$K=q$+$l$F$$$kJ8>O$K4X$9$k;v$G!"(BGnus $B$,$=$l$rK~$?$7$F$$$J$$$h$&$JF0:n(B -$B$r$7$F$$$k;v$K5$IU$$$?$i!"$?$a$i$o$:$K(B Gnus $B%?%o!<$H2f!9$KCN$i$;$F2<$5$$!#(B - -@node Emacsen -@subsection Emacsen -@cindex Emacsen -@cindex XEmacs -@cindex Mule -@cindex Emacs - -Gnus $B$O0J2<$N$b$N$GF0:n$7$^$9(B: - -@itemize @bullet - -@item -Emacs 19.34 $B$H$=$l0J>e$N(B Mule $B5!G=IU$-!#(B - -@item -XEmacs 21.1.1 $B0J>e$N(B Mule $B5!G=IU$-(B - -@item -Meadow 1.00 $B0J>e!#(B(Mule for Windows $B$G$OF0$-$^$;$s!#(B) - -@end itemize - -$B$3$N(B Gnus $B$NHG$O$3$l$h$j8E$$$I$s$J(B Emacsen $B$G$b40A4$KF0:n$7$J$$$G$7$g$&!#(B -$B>/$J$/$H$b!"?.Mj$G$-$kF0:n$O$7$J$$$G$7$g$&!#8E$$HG$N(B gnus $B$O8E(B -$B$$(B Emacs $B$NHG$G$bF0:n$9$k$G$7$g$&!#$H$O8@$&$b$N$N!"(BT-gnus $B$O%P!<%8%g(B -$B%s(B 21.1.1 $BL$K~$N(B XEmacs, $BNc$($P(B 20.4 $B$G$b;H$($k$+$b$7$l$^$;$s!#>\$7$$$3(B -$B$H$O(B T-gnus $B$NG[I[$K4^$^$l$F$$$k(B README $B%U%!%$%k$rFI$s$G2<$5$$!#(B - -$B$$$m$$$m$J%W%i%C%H%U%)!<%`$N(B Gnus $B$N4V$K$O$$$/$D$+$NGyA3$H$7$?0c$$$,$"$j(B -$B$^$9(B---XEmacs $B$O$b$C$H2hA|5!G=(B ($B%m%4$H%D!<%k%P!<(B) $B$rFCD'$K$7$F$$$^$9(B--$B$7(B -$B$+$7!"$=$NB>$O!"A4$F$N(B Emacsen $B$G$[$H$s$IF1$8$O$:$G$9!#(B - -@node Gnus Development -@subsection Gnus $B$N3+H/(B - -Gnus $B$OFs$D$NCJ3,$N=[4D$G3+H/$5$l$F$$$^$9!#:G=i$NCJ3,(B -$B$O(B @samp{ding@@gnus.org} $B$G$N$?$/$5$s$N5DO@$,$"$j!"$=$3$GJQ99$d?7$7$$5!(B -$BG=$rDs0F$7$^$9!#$3$NCJ3,$O(B @dfn{$B%"%k%U%!(B} $BCJ3,$H8F$P$l$^$9!#$H$$$&$N$O!"(B -$B$3$NCJ3,$G%j%j!<%9$5$l$?(B Gnusae $B$O(B @dfn{$B%"%k%U%!%j%j!<%9(B}$B!"$b$7$/$O(B ($BB>(B -$B$NCDBN$G$O$h$jNI$/;H$o$l$k(B) @dfn{$B%9%J%C%W%7%g%C%H(B} $B$H8F$P$l$k$b$N$@$+$i(B -$B$G$9!#$3$NCJ3,$G$O!"(Bgnus $B$OIT0BDj$G$"$k$H9M$($i$l$F$*$j!"0lHL$NMxMQA0$K$J$C$F$$$^$9!#(B - -50-100 $B$/$i$$$N%j%j!<%9$N8e$G!"(BGnus $B$O(B @dfn{$BE`7k(B} $B$5$l$?$H@k8@$5$l!"%P%0(B -$B=$@5$N$_$,E,MQ$5$l$^$9!#(BGnus $B$O@\F,<-$,l$G=q$/$N$O!"3'$r62$l(B -$B$5$;$k$H$$$&$N$b;ve!";d$OKhF|$H$F$b$?$/$5$s$NAGE($J%P%0%l%]!<%H$r(B -$B$l$,;d$r4n$S$GK~$?$7$^$7$?!#0&Io!#$3$N%j%9%H$N?M!9$O(B -$BG&BQ$rD6$($F;d$N(B ``$B$"$!!"$=$l$O$9$P$i$7$$9M$($@(B $B!"$&$s!";d$O(B -$BBT$?$:$K$=$l$r$9$0%j%j!<%9$7$h$&(B $B!"$=$l$OA4$/F0:n$7$J$$(B $B!"$&$s!";d$O$9$0$K=P$=$&(B $B$$$d!"E;$&!"$=$l$OA4$/F0:n$7$J(B -$B$$$>(B''' $B$H$$$&%j%j!<%9$K4X$9$k$N7A<0$NId9f2=(B/$BI|9f2=$d%P%0=$@5!"?7$7$$5!G=(B -$B$J$I$N$[$s$H$&$KB?$/$N$b$N!#(B - -@item -Per Abrahamsen--custom$B!"%9%3%"!"%O%$%i%$%H$H(B @sc{soup} $B%3!<%I(B ($BB>$NB?$/(B -$B$N;v$H6&$K(B)$B!#(B - -@item -Luis Fernandes---$B%G%6%$%s$H%0%i%U%#%C%/!#(B - -@item -Joe Reiss---$B%9%^%$%j!<$N4i$N:n!#(B - -@item -Wes Hardaker---@file{gnus-picon.el} $B$H(B @dfn{picon} $B$NItJ,$N%^%K%e%"(B -$B%k(B (@pxref{Picons})$B!#(B - -@item -Kim-Minh Kaplan---picon $B%3!<%I$KCV$1$k99$J$k:n6H!#(B - -@item -Brad Miller---@file{gnus-gl.el} $B$H(B Grouplens $B$NItJ,$N%^%K%e%"(B -$B%k(B (@pxref{GroupLens})$B!#(B - -@item -Sudish Joseph---$B?t$(@Z$l$J$$$[$I$N%P%0$N=$@5!#(B - -@item -Ilja Weis---@file{gnus-topic.el}$B!#(B - -@item -Steven L. Baur---$B$?$/$5$s$N$?$/$5$s$N$?$/$5$s$N%P%0$NH/8+$H=$@5!#(B - -@item -Vladimir Alexiev---refcard $B$H%j%U%!%l%s%9$N>.:};R!#(B - -@item -Felix Lee & Jamie Zawinski---$B;d$O(B Felix Lee $B$H(B JWZ $B$N(B XGnus $BG[I[$+$i$$$/(B -$B$D$+$NItJ,$rEp$_$^$7$?!#(B - -@item -Scott Byer---@file{nnfolder.el} $B$N3HD%$H2~D{!#(B - -@item -Peter Mutsaers---$B8E;v5-;v$N%9%3%"%3!<%I!#(B - -@item -Ken Raebburn---POP $B%a!<%k%5%]!<%H!#(B - -@item -Hallvard B Furuseth---$B$$$m$$$m$J>.$5$JJ*$dItJ,!"FC$K(B .newsrc $B%U%!%$%k$r(B -$B07$&ItJ,!#(B - -@item -Brian Edmonds---@file{gnus-bbdbb.el}$B!#(B - -@item -David Moore--@file{nnvirtual.el} $B$N2~D{$HB?$/$NB>$N;v!#(B - -@item -Kevin Davidson---@dfn{ding} $B$NL>A0$r;W$$IU$-$^$7$?!#$G$9$+$i!"H`$r@U$a$F(B -$B2<$5$$!#(B - -@item -Fran,Ag(Bois Pinard---$BB?$/$N!"B?$/$N6=L#?<$/40A4$J%P%0%l%]!<%H$H(B autoconf $B$N(B -$B%5%]!<%H!#(B - -@end itemize - -$B$3$N%^%K%e%"%k(B (Gnus $B1Q8lHG(B) $B$O(B Adrian Aichner $B$H(B Ricardo Nassif, Mark -Borges $B$K$h$C$F9;@5$5$l!"(BJost Krieger $B$K$h$C$F0lItJ,$r9;@5$5$l$^$7$?!#(B - -$B0J2<$N?M!9$OB?$/$N%Q%C%A$HDs0F$G9W8%$7$^$7$?(B: - -Christopher Davis, -Andrew Eskilsson, -Kai Grossjohann, -David K,Ae(Bgedal, -Richard Pieri, -Fabrice Popineau, -Daniel Quinlan, -Jason L. Tibbitts, III, -and -Jack Vinson. - -$B$=$l$H!"0J2<$N?M$K$b%Q%C%A$d$=$NB>$N$b$N$r46$l$N?M!9$,9T$C$?;v$N40A4$J354Q$rF@$k$?$a$K!"(BChangeLog $B$,(B Gnus $B$N%"(B -$B%k%U%!G[I[$K$O4^$^$l$F$$$F!"K-IY$JFI$_J*$rM?$($k$G$7$g$&!#(B(550KB $B$H$$$/(B -$B$i$+(B)$B!#(B - -$B;d$,K:$l$?A4$F$N?M$Ke$N$b$N(B---Gnus 5.4/5.5 -* Quassia Gnus:: 2 $B$+$1$k(B 2 $B$O(B 4$B!"$b$7$/$O(B Gnus 5.6/5.7 -* Pterodactyl Gnus:: $B8^HVL\!"(BP $B$G;O$^$k!"$b$7$/$O(B Gnus 5.8 - /5.9 $B$H$7$FCN$i$l$F$$$k$b$N(B -@end menu - -$B$3$N%j%9%H$O!"$b$A$m$s!"(B@emph{$B$?$$$F$$$N(B} $B=EMW$J?7$7$$5!G=$K4X$9(B -$B$k(B @emph{$BC;$$(B}$B354Q$G$7$+$"$j$^$;$s!#$$$$$(!"K\Ev$O$=$&$G$O$"$j$^$;$s!#$b$C(B -$B$H$b$C$H$?$/$5$s$N$b$N$,$"$j$^$9!#$O$$!"2f!9$OAOB$@-$N40A4$J8z2L$r46$8$F(B -$B$$$k$N$G$9!#(B - -@node ding Gnus -@subsubsection (ding) Gnus - -Gnus 5.0/5.1 $B$N?7$7$$5!G=(B: - -@itemize @bullet - -@item -$BA4$F$N%P%C%U%!$N304Q$O%U%)!<%^%C%H$N$h$&$JJQ?t(B (@pxref{Group Buffer -Format} $B$H(B @pxref{Summary Buffer Format}) $B$K$h$C$F@_Dj$rJQ$($k;v$,$G$-$k(B -$B$h$&$K$J$j$^$7$?!#(B - -@item -$B%m!<%+%k%9%W!<%k$H!"$$$/$D$+$N(B @sc{nntp} $B%5!<%P!<$rF1;~$K;H$&;v$,$G$k$h(B -$B$&$K$J$j$^$7$?(B (@pxref{Select Methods})$B!#(B - -@item -$B%0%k!<%W$r;ve$N%0%k!<%W$K7k9g$G$-$k$h$&$K$J$j$^$7$?(B (@pxref{Virtual -Groups})$B!#(B - -@item -$BB?$/$N0c$C$?%a!<%kMM<0(B (@pxref{Getting Mail}) $B$rFI$a$k$h$&$K$J$j$^$7$?!#(B -$BA4$F$N%a!<%k%P%C%/%(%s%I$OJXMx$J%a!<%k4|8B@Z$l>C5n5!9=$re$2$k$N$K==J,$J%X%C%@!<$r$C$F5-;v$K%9%3%"$rIU$1$k;v$,$G$-$^$9(B (@pxref{Scoring})$B!#(B -$B$"$J$?$N$?$a$K5-;v$r$I$N$h$&$K%9%3%"$rIU$1$k$+$r(B Gnus $B$K8+$D$1$5$;$k;v$b(B -$B$G$-$^$9(B (@pxref{Adaptive Scoring})$B!#(B - -@item -Gnus $B$OIaDL$N(B Emacs $B$NJ}K!$G<+F0J]B8$5$l$k%I%j%V%k%P%C%U%!$rJ];}$7$F$$$^(B -$B$9$N$G!"$"$J$?$N%^%7%s$,Mn$C$3$A$?$H$-$G$b$"$^$j%G!<%?$r<:$o$J$$$G$7$g(B -$B$&(B (@pxref{Auto Save})$B!#(B - -@item -Gnus $B$O:#$d%U%!%$%k(B @file{.emacs} $B$r$0$A$c$0$A$c$K$9$k;v$rHr$1$k$?$a$K@l(B -$BMQ$N5/F0%U%!%$%k(B (@file{.gnus}) $B$r;}$D$h$&$K$J$j$^$7$?!#(B - -@item -$B%0%k!<%W$H5-;v$NN>J}$K%W%m%;%90u$rIU$1$k$3$H$,$G$-!"A4$F$N0u$NIU$$$?9`L\(B -$B$K1i;;$r$9$k;v$,$G$-$^$9(B (@pxref{Process/Prefix})$B!#(B - -@item -$B%0%k!<%W$N0lIt$r(B grep $B$7$F!"$=$N7k2L$+$i%0%k!<%W$r:n$k;v$,$G$-$^(B -$B$9(B (@pxref{Kibozed Groups})$B!#(B - -@item -$B$(!<$H!"A4$F$K$7$?$,$C$F!"%0%k!<%W$N0lMw$r5s$2$k;v$,$G$-$^(B -$B$9(B (@pxref{Listing Groups})$B!#(B - -@item -$B30It%5!<%P!<$r354Q$7$F!"$=$l$i$N%5!<%P!<$N%0%k!<%W$r9XFI$9$k;v$,$G$-$^(B -$B$9(B (@pxref{Browse Foreign Server})$B!#(B - -@item -Gnus $B$O%5!<%P!<$H$NFs$D@\B3$G!"5-;v$rHsF14|$K$H$C$F$/$k;v$,$G$-$^(B -$B$9(B (@pxref{Asynchronous Fetching})$B!#(B - -@item -$B5-;v$r%m!<%+%k$K%-%c%C%7%e$9$k;v$,$G$-$^$9(B (@pxref{Article Caching})$B!#(B - -@item -uudecode $B$N4X?t$,3HD%$5$l!"0lHL2=$5$l$^$7$?(B (@pxref{Decoding Articles})$B!#(B - -@item -$B2a5n$N(B @sc{gnus} $B$N$"$^$jCN$i$l$F$$$J$$5!G=$N(B uuencode $B$5$l$?5-;v$r$^$@(B -$BEj9F$9$k;v$,$G$-$^$9(B (@pxref{Uuencoding and Posting})$B!#(B - -@item -$B?F5-;v(B ($B$HB>$N5-;v(B) $B$Nc$9$k;vL5$/F0:n$9$k$h$&$K(B -$B$J$j$^$7$?(B (@pxref{Finding the Parent})$B!#(B - -@item -Gnus $B$O(B FAQ $B$H%0%k!<%W$N5-=R$r$N30It;2>H$,%\%?%s$K$J$k$h$&$K$J$j$^$7$?(B (@pxref{Article -Buttons})$B!#(B - -@item -Gnus $B$N%&%#%s%I%&$H%U%l!<%`$N@_Dj$G$?$/$5$s$NJQ$J;v$r$G$-$k$h$&$K$J$j$^(B -$B$7$?(B (@pxref{Window Layout})$B!#(B - -@item -$B%-!<%\!<%I$r;H$&Be$o$j$K!"%\%?%s$r%/%j%C%/$G$-$k$h$&$K$J$j$^$7(B -$B$?(B (@pxref{Buttons})$B!#(B - -@end itemize - -@node September Gnus -@subsubsection September Gnus - -@iftex -@iflatex -\gnusfig{-28cm}{0cm}{\epsfig{figure=tmp/september.ps,height=20cm}} -@end iflatex -@end iftex - -Gnus 5.2/5.3 $B$N?7$7$$5!G=(B: - -@itemize @bullet - -@item -$B?7$7$$%a%C%;!<%8:n@.%b!<%I$,;H$o$l$^$9!#(B -@code{mail-mode}, @code{rnews-reply-mode} $B$H(B @code{gnus-msg} $B$NA4$F$N8E(B -$B$$%+%9%?%^%$%:JQ?t$O:#$d5l<0$K$J$j$^$7$?!#(B - -@item -Gnus $B$O(B @dfn{$B$^$P$i(B} $B%9%l%C%I$r:n@.$9$k;v$,$G$-$k$h$&$K$J$j$^$7$?(B---$B%9%l%C(B -$B%I$N<:$o$l$?5-;v$,$"$k$H$3$m$O6u$N@a$GI=8=$5$l$k$h$&$K$J$C$F$$$^(B -$B$9(B (@pxref{Customizing Threading})$B!#(B - -@lisp -(setq gnus-build-sparse-threads 'some) -@end lisp - -@item -$B30$K=P$F$$$/5-;v$OFCJL$JJ]4I%5!<%P!<$KJ]B8$5$l$k$h$&$K$J$j$^$7(B -$B$?(B (@pxref{Archived Messages})$B!#(B - -@item -$B5-;v$,;2>H$5$l$?$H$-$K!"%9%l%C%I$NItJ,:n@.$,5/$3$k$h$&$K$J$j$^$7$?!#(B - -@item -Gnus $B$O(B GroupLens $B$NM=8@$r;H$&;v$,$G$-$k$h$&$K$J$j$^$7(B -$B$?(B (@pxref{GroupLens})$B!#(B - -@item -Picons (personal icons) ($B8D?M%"%$%3%s(B) $B$,(B XEmacs $B$GI=<($G$-$k$h$&$K$J$j(B -$B$^$7$?(B (@pxref{Picons})$B!#(B - -@item -@code{trn} $B$N$h$&$JLZ%P%C%U%!$,I=<($5$l$k$h$&$K$J$j$^$7$?(B (@pxref{Tree -Display})$B!#(B - -@lisp -(setq gnus-use-trees t) -@end lisp - -@item -@code{nn} $B$N$h$&$Jv$_%H%T%C%/3,AX$K%0%k!<%WJ,$1$G$-$k$h$&$K$J$j$^$7(B -$B$?(B (@pxref{Group Topics})$B!#(B - -@lisp -(add-hook 'gnus-group-mode-hook 'gnus-topic-mode) -@end lisp - -@item -Gnus $B$,<:GT%a!<%k$r:FAw$G$-$k$h$&$K$J$j$^$7$?(B (@pxref{Summary Mail -Commands})$B!#(B - -@item -$B%0%k!<%W$,%9%3%"$r;}$D;v$,$G$-$k$h$&$K$J$j!"K,$l$k2s?t$K4p$E$$$FJB$SBX$((B -$B$r$G$-$k$h$&$K$J$j$^$7$?(B (@pxref{Group Score})$B!#(B - -@lisp -(add-hook 'gnus-summary-exit-hook 'gnus-summary-bubble-group) -@end lisp - -@item -$B%0%k!<%W$K%W%m%;%90u$rIU$1$i$l$k$h$&$K$J$j!"%0%k!<%W$N$0%k!<%W$KL?Na$,e$N%0%k!<%W$G%-%c%C%7%e$,$G$-$k$h$&$K$J$j$^$7$?!#(B - -@item -@code{nndoc} $B$OA4$F$N=8G[G[Aw!"%a!<%k%\%C%/%9!"(Brnews $B%K%e!<%90l3g!"(B -ClariNet $BC;<}=8!"$=$7$FA4$F$N$=$NB>$rM}2r$G$-$k$h$&$K$J$j$^$7(B -$B$?(B (@pxref{Document Groups})$B!#(B - -@item -Gnus $B$O(B SOUP $B%Q%1%C%H$r:n@.(B/$BFI$_9~$_$r$9$k$?$a$N?7$7$$%P%C%/%(%s(B -$B%I(B (@code{nnsoup}) $B$r;}$C$F$$$^$9!#(B - -@item -Gnus $B%-%c%C%7%e$,$:$C$HB.$/$J$j$^$7$?!#(B - -@item -$B%0%k!<%W$rB?$/$N4p=`$K=>$C$FJB$SBX$($G$-$k$h$&$K$J$j$^$7(B -$B$?(B (@pxref{Sorting Groups})$B!#(B - -@item -$B%"%I%l%9$N%j%9%H$H4|8B@Z$l>C5n$N;~4V$r@_Dj$9$k?7$7$$%0%k!<%W%Q%i%a!<%?$,(B -$BF3F~$5$l$^$7$?(B (@pxref{Group Parameters})$B!#(B - -@item -$BA4$F$N%U%)!<%^%C%H;XDj$,;H$o$l$k%U%'%$%9$r;XDj$G$-$k$h$&$K$J$j$^$7(B -$B$?(B (@pxref{Formatting Fonts})$B!#(B - -@item -@kbd{M P} $BI{%^%C%W$K%W%m%;%90u$NIU$$$?5-;v$N@_Dj(B/$B:o=|(B/$B@\;HMQ$G$-$k$h$&$K$J$j$^$7(B -$B$?(B (@pxref{Article Keymap})$B!#(B - -@item -$B%U%l!<%`$,(B @code{gnus-buffer-configuration} $B$NItJ,$K$J$k;v$,$G$-$^(B -$B$9(B (@pxref{Window Layout})$B!#(B - -@item -$B%G!<%b%s$N%W%m%;%9$G%a!<%k$r:FAv::$9$k$3$H$,$G$-$k$h$&$K$J$j$^$7(B -$B$?(B (@pxref{Daemons})$B!#(B -@iftex -@iflatex -\marginpar[\mbox{}\hfill\epsfig{figure=tmp/fseptember.ps,height=5cm}]{\epsfig{figure=tmp/fseptember.ps,height=5cm}} -@end iflatex -@end iftex - -@item -Gnus $B$O%9%Q%`$r:,@d$d$7$K$9$k$?$a$K(B NoCeM $B%U%!%$%k$r;H$&;v$,$G$-$k$h$&$K(B -$B$J$j$^$7$?(B (@pxref{NoCeM})$B!#(B - -@lisp -(setq gnus-use-nocem t) -@end lisp - -@item -$B%0%k!<%W$r1J5W2D;k$K$9$k;v$,$G$-$k$h$&$K$J$j$^$7$?(B (@pxref{Listing -Groups})$B!#(B - -@lisp -(setq gnus-permanently-visible-groups "^nnml:") -@end lisp - -@item -$B%+%9%?%^%$%:$r4JC1$K$9$k$?$a$KB?$/$N?7$7$$%U%C%/$,F3F~$5$l$^$7$?!#(B - -@item -Gnus $B$O(B @code{Mail-Copies-To} $B%X%C%@!<$KCm0U$rJ'$&$h$&$K$J$j$^$7$?!#(B - -@item -@code{References} $B%X%C%@!<$r=8$a$k;v$K$h$j%9%l%C%I$r=8$a$k;v$,$G$-$k$h$&(B -$B$K$J$j$^$7$?(B (@pxref{Customizing Threading})$B!#(B - -@lisp -(setq gnus-summary-thread-gathering-function - 'gnus-gather-threads-by-references) -@end lisp - -@item -$B4{FI5-;v$O:FO$KBP$7$F!"5-;v%P%C%U%!$G$N@^$jJV$7$,E,@Z$KF0:n$9$k$h$&$K$J(B -$B$j$^$7$?(B (@pxref{Article Washing})$B!#(B - -@item -$B1#$5$l$?0zMQJ8$O1#$9;v$r@Z$jBX$($k%\%?%s$r2C$(!"$I$N$/$i$$$N0zMQJ8$r1#$9(B -$B$+$r%+%9%?%^%$%:$G$-$k$h$&$K$J$j$^$7$?(B (@pxref{Article Hiding})$B!#(B - -@lisp -(setq gnus-cited-lines-visible 2) -@end lisp - -@item -$BB`6~$J%X%C%@!<$r1#$9;v$,$G$-$^$9(B (@pxref{Article Hiding})$B!#(B - -@item -$B%9%3%"$N=i4|CM$,%a%K%e!<%P!<$+$i@_Dj$G$-$k$h$&$K$J$j$^$7$?!#(B - -@item -$B=P$F9T$/5-;v$N99$J$k9=J8%A%'%C%/$,$G$-$k$h$&$K$J$j$^$7$?!#(B - -@end itemize - -@node Red Gnus -@subsubsection Red Gnus - -Gnus 5.4/5.5 $B$N?7$7$$5!G=(B: - -@iftex -@iflatex -\gnusfig{-5.5cm}{-4cm}{\epsfig{figure=tmp/red.ps,height=20cm}} -@end iflatex -@end iftex - -@itemize @bullet - -@item -@file{nntp.el} $B$OHsF14|$NN.57$G40A4$K2~D{$5$l$^$7$?!#(B - -@item -$B%9%3%"IU$1$O(B @code{and}, @code{or}, @code{not} $B$N$h$&$JO@M}1i;;;R$H!"?F(B -$B$N:FJ}8~$GuBV$,5-;v%b!<%I9T$KI=<($5$l$k$h$&$K$J$j$^$7(B -$B$?(B (@pxref{Misc Article})$B!#(B - -@item -@file{gnus.el} $B$,B?$/$N>.$5$$%U%!%$%k$KJ,3d$5$l$^$7$?!#(B - -@item -Message-ID $B$K4p$E$$$?!"=EJ#5-;v$NM^@)$,$J$5$l$k$h$&$K$J$j$^$7(B -$B$?(B (@pxref{Duplicate Suppression})$B!#(B - -@lisp -(setq gnus-suppress-duplicates t) -@end lisp - -@item -$B$I$N%9%3%"$HE,1~%U%!%$%k$,%[!<%`$N%9%3%"$HE,1~%U%!%$%k$G$"$k$+$r;XDj$9(B -$B$k(B (@pxref{Home Score File}) $B?7$7$$JQ?t$,2C$($i$l$^$7$?!#(B - -@item -@code{nndoc} $B$,4JC1$K3HD%2DG=$K$J$k$h$&$K2~D{$5$l$^$7(B -$B$?(B (@pxref{Document Server Internals})$B!#(B - -@item -$B%0%k!<%W$O?F$N%H%T%C%/$+$i%0%k!<%W%Q%i%a!<%?$r7Q>5$G$-$k$h$&$K$J$j$^$7(B -$B$?(B (@pxref{Topic Parameters})$B!#(B - -@item -$B5-;vJT=8$,2~D{$5$l!"$,$b$C$HCNE*$JJ}K!$GG'<1$5$l$k$h$&$K$J$j$^$7$?(B (@pxref{Article -Signature})$B!#(B - -@item -$B35N,%T%C%/%b!<%I$,$b$C$H(B @code{nn} $B$N$h$&$K$J$j$^$7$?!#9T?t$,I=<($5$l$F!"(B -$BL?Na(B @kbd{.} $B$,5-;v$re(B -$B$G(B) $B$,2C$($i$l$^$7$?(B---@kbd{M-C-d} (@pxref{Really Various Summary -Commands})$B!#(B - -@item -$B%W%m%;%90u$N@_Dj$,(B push $B$H(B pop $B$G$-$k$h$&$K$J$j$^$7$?(B (@pxref{Setting -Process Marks})$B!#(B - -@item -$B?7$7$$%a!<%k$+$i%K%e!<%9$X$N%P%C%/%(%s%I$,(B @sc{nntp} $B%5!<%P!<$,Ej9F$r(B -$B5v2D$7$F$$$J$$>l9g$G$b!"Ej9F$G$-$k$h$&$K$J$j$^$7(B -$B$?(B (@pxref{Mail-To-News Gateways})$B!#(B - -@item -$B%&%'%V8!:w%(%s%8(B -$B%s(B (@dfn{DejaNews}, @dfn{Alta Vista}, @dfn{InReference}) $B$+$i$N8!:w7k2L(B -$B$rFI$`?7$7$$%P%C%/%(%s%I$,2C$($i$l$^$7$?(B (@pxref{Web Searches})$B!#(B - -@item -$BI8=`$NJB$SBX$(4X?t$r;H$C$F%0%k!<%W$NCf$N%H%T%C%/$rJB$SBe$($9$k;v$,$G$-!"(B -$B$=$l$>$l$N%H%T%C%/$,FHN)$7$FJB$SBX$($G$-$k$h$&$K$J$j$^$7(B -$B$?(B (@pxref{Topic Sorting})$B!#(B - -@item -$B%0%k!<%W$N0lItJ,$,FHN)$7$FJB$SBX$($G$-$k$h$&$K$J$j$^$7(B -$B$?(B (@code{Sorting})$B!#(B - -@item -$B%-%c%C%7%e$5$l$?5-;v$,%0%k!<%W$KF~$l$i$l$k$h$&$K$J$j$^$7(B -$B$?(B (@pxref{Summary Generation Commands})$B!#(B -@iftex -@iflatex -\marginpar[\mbox{}\hfill\epsfig{figure=tmp/fred.ps,width=3cm}]{\epsfig{figure=tmp/fred.ps,width=3cm}} -@end iflatex -@end iftex - -@item -$B%9%3%"%U%!%$%k$,$b$C$H?.Mj$G$-$k=gHV$GE,MQ$G$-$k$h$&$K$J$j$^$7(B -$B$?(B (@pxref{Score Variables})$B!#(B - -@item -$B%a!<%k%a%C%;!<%8$,$I$3$K9T$/$+$NJs9p$r:n@.$9$k;v$,$G$-$k$h$&$K$J$j$^$7(B -$B$?(B (@pxref{Splitting Mail})$B!#(B - -@item -$BF~$C$FMh$?%a!<%k$rJ]B8$9$kA0$K$,$i$/$?$rj(B -$B$J$[$I$N?7$7$$L?Na$H%b!<%I$,DI2C$5$l$^$7$?!#40A4$JOC$KIU$$$F(B -$B$O(B @pxref{Gnus Unplugged} $B$r8+$F2<$5$$!#(B - -@item -@code{nndraft} $B%P%C%/%(%s%I$,La$C$F$-$^$7$?$,!"0MA3$H$O0c$&$h$&$KF0:n$9(B -$B$k$h$&$K$J$j$^$7$?!#A4$F$N%a%C%;!<%8%P%C%U%!$O(B @code{nndraft} $B%0%k!<%W$N(B -$B5-;v$G$b$"$j!"$=$l$O<+F0E*$K:n@.$5$l$^$9!#(B - -@item -@code{gnus-alter-header-function} $B$,%X%C%@!<$NCM$rJQ$($k$?$a$K;H$o$l$k$h(B -$B$&$K$J$j$^$7$?!#(B - -@item -@code{gnus-summary-goto-article} $B$,(B Message-ID $B$rO$r>C5n$9$k$?$a$N?7$7$$%a%C%;!<%8L?(B -$BNa$,$"$j$^$9(B: @kbd{C-c C-v}$B!#(B - -@item -@kbd{C-u C-c C-c} $B$K$h$C$F(B @code{nnvirtual} $B%0%k!<%W$r@8@.$7$F$$$k%0%k!<(B -$B%W$KEj9F$G$-$k$h$&$K$J$j$^$7$?!#(B - -@item -@code{nntp-rlogin-program}---$B%+%9%?%^%$%:$r4JC1$K$9$k$?$a$N?7$7$$JQ?t$G(B -$B$9!#(B - -@item -@code{gnus-article-edit-mode} $B$N(B @code{C-u C-c C-c} $B$O5-;v%P%C%U%!$N:F%O(B -$B%$%i%$%H$r6X;_$9$k$h$&$K$J$j$^$7$?!#(B - -@item -@code{gnus-boring-article-headers} $B$K?7$7$$MWAG$,$"$j$^$9(B--- -@code{long-to}$B!#(B - -@item -@kbd{M-i} $B%7%s%\%k@\F,0z?tL?Na$,$"$j$^$9!#>\:Y$O(B "Symbolic Prefixes" $B$N(B -$BItJ,$r8+$F2<$5$$!#(B - -@item -$B35N,%P%C%U%!$N(B @kbd{L} $B$H(B @kbd{I} $B$O%U%!%$%k(B "all.SCORE" $B$K%9%3%"K!B'$r(B -$B2C$($k$?$a$K%7%s%\%k@\F,0z?t(B @kbd{a} $B$r$5$J$1$l$P$J$j$^$;$s!#(B - -@item -$BEj9FC$7$O8=:_$NA*BrJ}K!$r;H$&$h$&$K$J$j$^$7$?!#%7%s%\%k@\F,(B -$B<-(B @kbd{a} $B$OIaDL$NEj9FJ}K!$r6/@)$7$^$9!#(B - -@item -M******** sm*rtq**t*s $B$rE,@Z$JJ8>O$KK]0F$9$k?7$7$$L?Na$,$"$j$^$9(B--- -@kbd{W d}$B!#(B - -@item -@code{nntp} $B$N$h$j4JC1$J%G%P%C%0$N$?$a$K!"(B -@code{nntp-record-commands} $B$r(B @code{nil} $B$G$J$$CM$K@_Dj$9$k;v$,$G$-$^$9!#(B - -@item -@code{nntp} $B$O(B @file{~/.authinfo} $B$r;H$&$h$&$K$J$j!"$3$l(B -$B$O(B @file{.netrc} $B$N$h$&$J%U%!%$%k$G!"$I$3$G$I$N$h$&(B -$B$K(B @sc{authinfo} $B$r(B @sc{nntp} $B%5!<%P!<$KAw$k$+$r@)8f$9$k$?$a$N$b$N$G$9!#(B - -@item -$B35N,%P%C%U%!$N%0%k!<%W%Q%i%a!<%?$rJT=8$9$k$?$a$NL?Na$,2C$($i$l$^$7$?!#(B - -@item -$B%a!<%k$,$I$3$KJ,3d$5$l$?$+$NMzNr$r;HMQ2DG=$K$J$j$^$7$?!#(B - -@item -$B?7$7$$5-;vF|IUL?Na$,2C$($i$l$^$7$?(B---@code{article-date-iso8601}$B!#(B - -@item -@code{gnus-score-thread-simplify} $B$r@_Dj$9$k;v$K$h$j%9%l%C%I$r:n@.$7$F$$(B -$B$k$H$-$OI=Bj$,C1=c2=$5$l$k$h$&$K$J$j$^$7$?!#(B - -@item -$B%a%C%;!<%8$G0zMQ$r$9$k$?$a$N?7$7$$4X?t$,2C$($i$l$^$7$?(B--- -@code{message-cite-original-without-signature}$B!#(B - -@item -@code{article-strip-all-blank-lines}---$B?7$7$$5-;vL?Na$G$9!#(B - -@item -$B5-;v$N=*$o$j$^$G$r@Z$k?7$7$$%a%C%;!<%8L?Na$,2C$($i$l$^$7$?!#(B - -@item -$BJQ?t(B @code{gnus-adaptive-word-minimum} $B$r;H$&;v$K$h$j:G>.8BE,1~%9%3%"$r(B -$B;XDj$9$k;v$,$G$-$^$9!#(B - -@item -$BL?Na(B @code{gnus-start-date-timer} $B$K$h$j(B ``$B2a<:F|IU(B'' $B5-;v%X%C%@!<$,7QB3(B -$BE*$K99?7$5$l$k$h$&$K$J$j$^$7$?!#(B - -@item -$B%&%'%V(B listserv $B%"!<%+%$%V$,(B @code{nnlistserv} $B%P%C%/%(%s%I$K$h$jFI$`;v(B -$B$,$G$-$k$h$&$K$J$j$^$7$?!#(B - -@item -$B8E$$(B dejanews $B%"!<%+%$%V$,(B @code{nnweb} $B$+$iFI$`;v$,$G$-$k$h$&$K$J$j$^$7(B -$B$?!#(B - -@end itemize - -@node Pterodactyl Gnus -@subsubsection Pterodactyl Gnus - -Gnus 5.8 $B$N?7$7$$5!G=(B: - -@itemize @bullet - -@item $B%a!<%k$r\:Y$K$D$$$F$O%^%K%e(B -$B%"%k$r8+$F2<$5$$!#FC$K!"(Bprocmail $B$G\$7$$>pJs$O(B info $B$N(B Select Methods -> Getting Mail -> Mail -Sources $B$GF@$k$3$H$,$G$-$^$9!#(B - -@item Gnus $B$O(B MIME $B$KBP1~$7$?%j!<%@!<$K$J$j$^$7$?!#$3$l$O(B Gnus $B$NB?$/$N(B -$BItJ,$K1F6A$7$F$$$F!"$?$/$5$s$N?7$7$$%3%^%s%I$,DI2C$5$l$F$$$^$9!#>\:Y$O%^(B -$B%K%e%"%k$r;2>H$7$F2<$5$$!#(B($BLuCm(B: T-gnus $B$O(B SEMI $B$*$h$S(B FLIM $B$N=t5!G=$K4p(B -$B$E$$$F$$$^$9!#(B) - -@item Gnus $B$O$^$?3F9q8lBP1~$K$J$j$^$7$?!#$3$3$G$OMWLs$G$-$J$$$/$i$$(B -$B$K(B Gnus $B$NB?$/$NItJ,$K1F6A$7$F$$$F!"?7$7$$$?$/$5$s$NJQ?t$,DI2C$5$l$F$$$^(B -$B$9!#(B($BLuCm(B: T-gnus $B$O(B SEMI $B$*$h$S(B FLIM $B$N=t5!G=$K4p$E$$$F$$$^$9!#(B) - -@item @code{gnus-auto-select-first} $B$,4X?t$G$"$C$F$b$h$/$J$j$^$7$?!#(B - -@item Summary $B%P%C%U%!$H(B NOV $B%U%!%$%k$K4^$a$kDI2C$N%X%C%@!<$r!"%f!<%6$,(B -$B7h$a$k$3$H$,$G$-$k$h$&$K$J$j$^$7$?!#(B - -@item @code{gnus-article-display-hook} $B$,:o=|$5$l$^$7$?!#Be$o$j(B -$B$K(B @code{gnus-treat-} $B$G;O$^$k$?$/$5$s$NJQ?t$,DI2C$5$l$^$7$?!#(B - -@item Gnus posting styles $B$,:F$S2~Au$5$l$^$7$?!#8=:_$OHyL/$K0c$&5,B'$GF0(B -$B:n$7$^$9!#(B - -@item $B?7$7$$%&%'%V$K4p$E$$$?%P%C%/%(%s%I$,DI2C$5$l$^$7$?!#(B -@code{nnslashdot}, @code{nnwarchive} $B$*$h$S(B @code{nnultimate} $B$G$9!#(B -nnweb $B$O:F$S2~:n$5$l!">o$KJQ2=$9$k9=@.$rB3$1$^$9!#(B - -@item Gnus $B$O(B @code{nnimap} $B$K$h$C$F(B IMAP $B%a!<%k$rFI$`$3$H$,$G$-$^$9!#(B - -@end itemize - -@iftex - -@page -@node History -@section $B%^%K%e%"%k(B -@cindex colophon -@cindex manual - -$B$3$N%^%K%e%"%k$O(B TeXinfo $B%U%!%$%k$+$i:n@.$5$l!"$=$l$+(B -$B$i(B @code{texi2dvi} -@iflatex -$B$b$7$/$O!"(BLars $B$5$s$N:n$i$l$?(B Texinfo to \LaTeX $BJQ49$rDL$j!"$=$l$+$i!"(B -@code{latex} $B$H(B @code{dvips} -@end iflatex -$B$r/$7(B -$B$@$H$$$&$3$H$G$9!#(Bgnus $B$N40A4$KA4$F$N$3$H$,@bL@$5$l$F$$$^$9$,!"C5$7$F$$(B -$B$k>l=j$G$O$J$$$H$$$&$3$H$,$h$/$"$j$^$9!#$3$l$O%j%U%!%l%s%9%^%K%e%"%k$G$"(B -$B$j!"(Bgnus $B$r;O$a$k$?$a$NP$o$l$k$G$7$g$&!#$"$J$?$NCN$i$J$$$H$3$m$G!#(B - -@item $B%a!<%k(B (mail) -@cindex mail -$B$"$J$?$K8D?ME*$KG[Aw$5$l$k$b$NA4$F$,%a!<%k$G$9!#$$$/$D$+$N%K%e!<%9(B/$B%a!<(B -$B%k%j!<%@!<(B (gnus $B$N$h$&$J(B) $B$O%a!<%k$H%K%e!<%9$N0c$$$r$\$d$1$5$;$^$9$,!"(B -$B$=$3$K$O0c$$$OB8:_$7$^$9!#%a!<%k$O;dE*$G$9!#%K%e!<%9$O8xE*$G$9!#%a!<%k$r(B -$BAw?.$9$k;v$OEj9F$G$O$J$/!"JV?.$O%U%)%m!<%"%C%W$G$O$"$j$^$;$s!#(B - -@item $BJV?.(B (reply) -@cindex reply -$B$"$J$?$,FI$s$G$$$k$b$N$r=q$$$??M$K%a!<%k$rAw$k;v$G$9!#(B - -@item $B%U%)%m!<%"%C%W(B (follow up) -@cindex follow up -$B$"$J$?$,FI$s$G$$$k5-;v$K1~Ez$7$F8=:_$N%K%e!<%9%0%k!<%W$K5-;v$rEj9F$9$k;v(B -$B$G$9!#(B - -@item $B%P%C%/%(%s%I(B (backend) -@cindex backend -Gnus $B$O%K%e!<%9$H%a!<%k$NN>J}$N$$$m$$$m$J%P%C%/%(%s%I$,M?$($?5-;v$rF@$^(B -$B$9!#(BGnus $B$O!"$$$o$f$k2<$K2#$?$o$C$F$$$k%a%G%#%"$r07$&;v$O$7$^$;$s(B---$B$3$l(B -$B$O$9$Y$F%P%C%/%(%s%I$K$h$C$F$J$5$l$^$9!#(B - -@item $B4pK\(B (native) -@cindex native -Gnus $B$O$$$D$b0l$D$NJ}K!(B ($B$H%P%C%/%(%s%I(B) $B$r%K%e!<%9$rF@$k$?$a$N(B @dfn{$B4p(B -$BK\(B}$B!"$b$7$/$O=i4|@_Dj(B $B$H$7$F;H$$$^$9!#(B - -@item $B30It(B (foreign) -@cindex foreign -$BF1;~$KG$0U$N?t$N30It%0%k!<%W$r3hF0>uBV$K$9$k$3$H$b$G$-$^$9!#$3$l$i$O%K%e!<(B -$B%9$reIt$G!"G'>Z>pJs(B ($BEy(B) $B$,F~$l$i$l$F$$$k$H$3$m$G$9!#(B - -@item $BK\BN(B (body) -@cindex body -$B5-;v$N;D$j$NItJ,$G$9!#%X%C%I$G$J$$$b$N$O$9$Y$FK\BN$G$9!#(B - -@item $B%X%C%@!<(B (header) -@cindex header -$B5-;v$N%X%C%I$+$i$N9T$G$9!#(B - -@item $B%X%C%@!<72(B (headers) -@cindex headers -$B$=$N$h$&$J9T$N=89g$b$7$/$O!"%X%C%I$N=89g$G$9!#$b$7$/$O!"(B@sc{nov} $B9T$N=8(B -$B9g$G$9!#(B - -@item @sc{nov} -@cindex nov -Gnus $B$,%0%k!<%W$KF~$k$H!"%0%k!<%W$NA4$F$NL$FI5-;v$N%X%C%@!<$r%P%C%/%(%s(B -$B%I$K5a$a$^$9!#$[$H$s$I$N%5!<%P!<$O(B News OverView $BMM<0$,;HMQ2DG=$G!"$=$l(B -$B$OIaDL$N(B @sc{head} $BMM<0$h$j$b$C$H$l$N%0%k!<%W$O2?$i$+$N(B @dfn{$B%l%Y%k(B} $B$+B>$N$b$N(B (1-9) $B$G9XFI$5$l$F(B -$B$$$^$9!#Dc$$%l%Y%k$N$b$N$O9b$$%l%Y%k$N$b$N$h$j(B ``$B$h$j(B'' $B9XFI$5$l$F$$$^$9!#(B -$B%s%S(B}; 9 $B$O(B @dfn{$B@Z$i$l$?(B} $B$H8+$J$5$l$^$9!#%0%k!<%W$r%j(B -$B%9%H$7$?$j!"?7$7$$%0%k!<%W$rAv::$7$?$j$9$kL?Na$O$9$Y$F?tCM@\F,0z?t(B -$B$r(B @dfn{$BF0:n%l%Y%k(B} $B$H$7$F;H$$$^$9!#(B - -@item $B@Z$i$l$?%0%k!<%W(B (killed groups) -@cindex killed groups -$B@Z$i$l$?%0%k!<%W$N>pJs$OC_@Q$5$l$?$j99?7$5$l$?$j$7$^$;$s$N$G!"@Z$i$l$?%0(B -$B%k!<%W$r9XFI$5$l$?%0%k!<%W$h$j4JC1$K07$($k$h$&$K$J$j$^$9!#(B - -@item $B%>%s%S%0%k!<%W(B (zombie groups) -@cindex zombie groups -$B$[$H$s$I@Z$i$l$?%0%k!<%W$HF1$8$G!"$=$l$h$j>/$7;`$s$G$$$k$@$1$G$9!#(B - -@item $B%"%/%F%#%V%U%!%$%k(B (active file) -@cindex active file -$B%K%e!<%9%5!<%P!<$O$I$N5-;v$r1?$s$G$$$k$+!"$I$N%0%k!<%W$,B8:_$9$k$+$r5-O?(B -$B$7$F$*$+$J$1$l$P$J$j$^$;$s!#A4$F$N$3$N>pJs$O8=>u%U%!%$%k$KC_@Q$5$l!"$=$l(B -$B$O$"$J$?$,A[A|$9$k$h$&$KHf3SE*Bg$-$$$G$9!#(B - -@item $B56%0%k!<%W(B (bogus groups) -@cindex bogus groups -$B%U%!%$%k(B @file{.newsrc} $B$KB8:_$9$k%0%k!<%W$G$9$,!"%5!<%P!<$KCN$i$l$F$$$J(B -$B$$%0%k!<%W(B ($B$9$J$o$A!"$=$l$O%"%/%F%#%V%U%!%$%k$K$"$j$^$;$s(B) $B$O(B @emph{$B56(B -$B%0%k!<%W(B} $B$G$9!#$3$l$O!"$*$=$i$/(B ($B$9$G$K(B) $B$=$N%0%k!<%W$OB8:_$7$F$$$J$$$N(B -$B$G$7$g$&!#(B - -@item $B3hF02=(B (activating) -@cindex activating groups -$B%5!<%P!<$K%0%k!<%W$N>pJs$r?R$M!"L$FI5-;v$N?t$r1i;;$9$k9T0Y$O(B @dfn{$B%0%k!<(B -$B%W$r3hF02=$9$k(B} $B$H8F$P$l$F$$$^$9!#Hs3hF0%0%k!<%W$O%0%k!<%W%P%C%U%!(B -$B$K(B @samp{*} $B$H$H$b$K0lMwI=<($5$l$^$9!#(B - -@item $B%5!<%P!<(B (server) -@cindex server -$B@\B3$7$F!"%K%e!<%9(B ($B$b$7$/$O%a!<%k(B) $B$re$N%5!<%P!<@_Dj$r;XDj$9$k9=B$$G$9!#(B - -@item $B;ve$N%5!<%P!<(B (virtual server) -@cindex virtual server -$BL?L>$5$l$?A*BrJ}K!$G$9!#A*BrJ}K!$O(B ($BJ*M}E*(B) $B%5!<%P!<$K@\B3$9$k$?$a$KI,MW(B -$B$JJ}K!$rDj5A$9$k$?$a!"J*;v$rA4BN$H$7$Fe$N%5!<%P!<$K$J$j$^(B -$B$9!#(B - -@item $B@vBu(B (washing) -@cindex washing -$B%P%C%U%!$r;}$C$F$-$F!"2?$i$+$N/$J$+$l(B) $B85$N$b$N$h$j$b$h$j$-$l$$$G4n$P$7$$$b$N$K$J$k$G$7$g$&!#(B - -@item $B0l;~%0%k!<%W(B (ephemeral groups) -@cindex ephemeral groups -$B$?$$$F$$$N%0%k!<%W$O$I$N5-;v$rFI$s$@$+$N%G!<%?$rC_@Q$7$^$9!#(B -@dfn{$B0l;~(B} $B%0%k!<%W$O%G!<%?$,N/$a$i$l$J$$%0%k!<%W$G$9(B---$B%0%k!<%W$r=P$k$H!"(B -$B$=$l$OE76u$K>C$(5n$j$^$9!#(B - -@item $B8GDj%0%k!<%W(B (solid groups) -@cindex solid groups -$B$3$l$O0l;~%0%k!<%W$NH?BP$G$9!#%0%k!<%W%P%C%U%!$K5s$2$i$l$F$$$kA4$F$N%0%k!<(B -$B%W$O8GDj%0%k!<%W$G$9!#(B - -@item $B$^$P$i5-;v(B (sparse articles) -@cindex sparse articles -@code{gnus-build-sparse-threads} $B$N5!G=$r;HMQ$7$F$$$k$H$-$O!"35N,%P%C%U%!(B -$B$K5-;v$NF~$l>l=j$,I=<($5$l$^$9!#(B - -@item $B%9%l%C%I:n$j(B (threading) -@cindex threading -$B$=$l$,1~Ez$7$?5-;v$ND>8e$K$=$N5-;v$X$N1~Ez$rCV$/$3$H$G$9(B---$B3,AXE*N.57$G!#(B - -@item $B:,(B (root) -@cindex root -@cindex thread root -$B%9%l%C%I$N:G=i$N5-;v$,:,$G$9!#$=$l$O%9%l%C%I$NA4$F$N5-;v$NAD@h$G$9!#(B - -@item $B?F(B (parent) -@cindex parent -$B1~Ez$N$"$k5-;v$G$9!#(B - -@item $B;R(B (child) -@cindex child -$B0c$C$?5-;v(B---$B$=$N?F(B $B$K1~Ez$9$k5-;v$G$9!#(B - -@item $B=8G[(B (digest) -@cindex digest -$BJ#?t$N%a%C%;!<%8$r0l$D$N%U%!%$%k$K=8$a$?$b$N$G$9!#$b$C$H$bIaDL$N=8G[MM<0(B -$B$O(B RFC1153 $B$G;XDj$5$l$F$$$^$9!#(B -@end table - -@page -@node Customization -@section $B%+%9%?%^%$%:(B -@cindex gerenal customization - -$BA4$F$NJQ?t$O$3$N%^%K%e%"%k$N$I$3$+JL$N$H$3$m$GE,@Z$K@bL@$5$l$F$$$^$9!#$3(B -$B$NItJ,$OHs>o$KNI$/$"$k>u67$G$I$N$h$&$K(B gnus $B$r%+%9%?%^%$%:$9$l$PNI$$$+$N(B -$BAm9gE,;X<(@h$rM?$($k$?$a$K9M0F$5$l$F$$$^$9!#(B - -@menu -* Slow/Expensive Connection:: $B%m!<%+%k$N(B Emacs $B$rN)$A>e$2$F!"B>$N$H$3(B - $B$m$+$i%K%e!<%9$rF@$k;v$,$G$-$k!#(B -* Slow Terminal Connection:: $B1s3V(B Emacs $B$ro$K:Y$$@~$N8~$3$&$N%^%7(B -$B%s$+$i%K%e!<%9$ro$KBg(B -$B$-$/$J$C$F$$$^$9!#$=$l$K2C$($F!"(Bgnus $B$,FMA3$H$K$+$/8=>u%U%!%$%k$ro$K35N,%P%C%U%!$rCf?4:F@_Dj$r$9$k$3$H$r6X;_$9$k$?$a$K$3$l(B -$B$r(B @code{nil} $B$K@_Dj$7$F2<$5$$!#$3$l$,(B @code{vertical} $B$G$"$k$H!"?bD>J}(B -$B8~$N(B (vertical) $BCf?4:F@_Dj$N$_$r$7$^$9!#(B@code{nil} $B$G(B -$B$b(B @code{vertical} $B$G$bL5$1$l$P!"?eJ?J}8~$H?bD>J}8~$NN>J}$NCf?4:F@_Dj$r(B -$B9T$$$^$9!#(B - -@item gnus-visible-headers -$B5-;v$K4^$^$l$k%X%C%@!<$r:G>.8B$K8:$i$7$^$9!#.$5$/$9$k;v$,$G$-$^(B -$B$9!#$3$l$OAm$8$F$=$s$J$K8:$i$7$^$;$s!#$3$l$O!"5-;v$r$I$C$A$K$7$mFI$_$?$/(B -$B$J$$$H$$$&;v$r7hDj$9$kA0$K!">/$7$NItJ,$7$+8+$kI,MW$,L5$$$H$$$&;v$G$9!#(B - -@item gnus-threada-hide-subtree -$B$3$l$,(B @code{nil} $B$G$J$1$l$P!"A4$F$N35N,%P%C%U%!$N%9%l%C%I$O=i$a$K1#$5$l(B -$B$^$9!#(B - -@item gnus-updated-mode-lines -$B$3$l$,(B @code{nil} $B$G$"$k$H!"(Bgnus $B$O%P%C%U%!$N%b!<%I9T$K>pJs$rF~$l$^$;$s(B -$B$N$G!";~4V$r@aLs$G$-$k$G$7$g$&!#(B -@end table - -@node Little Disk Space -@subsection $B>/$7$N%G%#%9%/MFNL(B -@cindex disk space - -$B5/F0%U%!%$%k$OHf3SE*Bg$-$/$J$j$^$9$N$G!"6u$-MFNL$,>/$J$/$J$C$F$-$F$$$k$H(B -$B$-$O$=$NBg$-$5$r>/$7>.$5$/$7$?$$$H;W$&$G$7$g$&!#(B - -@table @code -@item gnus-save-newsrc-file -$B$3$l$,(B @code{nil} $B$G$"$k$H!"(Bgnus $B$O7h$7$F(B @file{.newsrc} $B$rJ]B8$7$^$;(B -$B$s(B---$B$=$l$O(B @file{.newsrc.eld} $B$N$_$rJ]B8$7$^$9!#$3$l$O!"(Bgnus $B$NB>$N%K%e!<(B -$B%9%j!<%@!<$r;H$($J$$$H$$$&;v$G$9!#$3$NJQ?t$O=i4|@_Dj$G(B @code{t} $B$G$9!#(B - -@item gnus-read-newsrc-file -$B$3$l$,(B @code{nil} $B$G$"$l$P!"(Bgnus $B$O(B @file{.newsrc} $B$r7h$7$FFI$_$^$;(B -$B$s(B ---@file{.newsrc.eld} $B$@$1$rFI$_$^$9!#$3$l$O!"(Bgnus $B0J30$N%K%e!<%9%j!<(B -$B%@!<$r;H$($J$/$J$k!"$H$$$&$3$H$G$9!#$3$NJQ?t$O=i4|@_Dj$G$O(B @code{t} $B$G$9!#(B - -@item gnus-save-killed-list -$B$3$l$,(B @code{nil} $B$G$"$k$H!"(Bgnus $B$O;`$s$@%0%k!<%W$N%j%9%H$rJ]B8$7$^$;$s!#(B -$B$3$NJQ?t$r(B @code{nil} $B$K@_Dj$7$?$H$-$O!"(B -@code{gnus-check-new-newsgroups} $B$r(B @code{ask-server} $B$K!"(B -@code{gnus-check-bogus-newsgroups} $B$r(B @code{nil} $B$K@_Dj$9$k$Y$-$G$7$g$&!#(B -$B$3$NJQ?t$O=i4|@_Dj$G(B @code{t} $B$G$9!#(B -@end table - -@node Slow Machine -@subsection $BCY$$5!3#(B -@cindex slow machine - -$B$b$7CY$$5!3#$r;}$C$F$$$k$+!"$b$7$/$OC1$KK\Ev$KG&BQNO$,$J$$;~$O!"(Bgnus $B$N(B -$B/$7$"$j$^$9!#(B - -$B5/F0$rB.$/$9$k$?$a(B -$B$K(B @code{gnus-check-new-newsgroups} $B$H(B @code{gnus-check-bogus-newsgroups} $B$r(B @code{nil} $B$K(B -$B@_Dj$7$F2<$5$$!#35N,%P%C%U%!$KF~$k;v$HH4$1$k;v$rB.$/$9$k$?$a$K!"(B -@code{gnus-show-threads} $B$H(B @code{gnus-use-cross-reference} $B$H(B @code{gnus-nov-is-evil} $B$r(B @code{nil} $B$K(B -$B@_Dj$7$F2<$5$$!#(B - -@page -@node Troubleshooting -@section $BLdBj2r7h(B -@cindex troubleshooting - -Gnus $B$OH"$+$i=P$7$F$9$0$K(B @emph{$BHs>o$K(B} $B$h$/F0:n$7$^$9(B---$B2?$bLdBj$N5/$3(B -$B$k$3$H$OA[A|$G$-$^$;$s!"K\Ev$K!#(B - -$B%*%C%[%s!#(B - -@enumerate - -@item -$B$"$J$?$N%3%s%T%e!<%?$N%9%$%C%A$,F~$C$F$$$k;v$r3N$+$a$F2<$5$$!#(B - -@item -$BK\Ev$K8=9T$N(B gnus $BHG$rFI$_9~$s$G$$$k;v$r3NG'$7$F2<$5$$!#:#$^(B -$B$G(B @sc{gnus} $B$rC$7$F2<$5$$!#(B - -@item -FAQ $B$H(B how-to $B$rFI$`$?$a$K%X%k%W%0%k!<%W(B ($B%0%k!<%W%P%C%U%!(B -$B$G(B @kbd{G h}) $B$rFI$s$G2<$5$$!#(B - -@item -@vindex max-lisp-eval-depth -Gnus $B$OB?$/$NB?$/$N:F5"9=B$$GF0:n$7!"2?$i$+$N6KC<$J(B ($B$=$7$FHs>o$K$^$l(B -$B$J(B) $B;vNc$G$O!"(Bgnus $B$O:F5"$r(B ``$B$"$^$j$K?<$/(B'' $B9_$j$9$.$F!"(BEmacs $B$,$"$J$?(B -$B$K%S!<%W2;$rLD$i$9;v$,$"$j$^$9!#$b$7$3$l$,5/$3$C$?$J$i!"(B -@code{max-lisp-eval-depth} $B$r(B 500 $B$+$=$l$/$i$$$NCM$K@_Dj$7$F2<$5$$!#(B -@end enumerate - -$B$b$7B>$NA4$F$,<:GT$7$?$J$i!"%P%0$H$7$FLdBj$rJs9p$7$F2<$5$$!#(B - -@cindex bugs -@cindex reporting bugs - -@kindex M-x gnus-bug -@findex gnus-bug -$B$b$7(B gnus $B$N%P%0$r8+$D$1$?$J$i!"L?Na(B @kbd{M-x gnus-bug} $B$K$h$C$F$=$l$rJs(B -$B9p$9$k;v$,$G$-$^$9!#(B -@kbd{M-x set-variable RET debug-on-error RET t RET} $B$H$7$F!"$=$l$+$i;d$K(B -$B%P%C%/%H%l!<%9$rAw$C$F2<$5$$!#;d$O%P%0$r=$@5$7$h$&$H$7$^$9$,!"$"$J$?$,%P(B -$B%0$r:F8=$5$;$kJ}K!$r@53N$K=q$$$F$/$l$?$H$-$N$_!"$=$l$r=$@5$9$k;v$,$G$-$^(B -$B$9!#(B - -$B%P%0Js9p$G$O!">\:Y$9$.$k$3$H$O7h$7$F$"$j$^$;$s!#%P%0Js9p$r$9$k$H$-$O!"$=(B -$B$l$,;H$&$?$S$K(B 10Kb $B%a!<%k$r:n$j!"$b$7$"$J$?$N4D6-$r0JA0;d$K(B 500 $B2sAw$C(B -$B$F$-$?$H$7$F$b!"L?Na(B @kbd{M-x gnus-bug} $B$r;H$C$F2<$5$$!#(B - -$B;d$O!"5-21$H$$$&o$K!"A4$F$r@bL@$7$9$.$F(B -$B2<$5$$!#$=$l$O2f!9A4$F$K$H$C$F$b$C$H4JC1$K$J$j$^$9(B---$B$b$7;d$,I,MW$JA4$F(B -$B$N>pJs$rF@$i$l$J$+$C$?$i!";d$O$"$J$?$K%a!<%k$rAw$C$F$5$i$J$k>pJs$r5a$a!"(B -$B$=$N7k2LA4$F$,$h$jB?$/$N;~4V$rLL$7$F$$$kLdBj$,Hs>o$K;k3PE*$G!"$=$l$r>el(B -$B9g$O!"(BEmacs $B$N%&%#%s%I%&$r%U%!%$%k$K%3%T!<$7$F(B ($BNc$($P!"(B@kbd{xwd} $B$G(B)$B!"(B -$B$=$l$r$I$3$+H%,%$%I(B - -$B;d$N4j$$$O!"B>$NC/$+$,(B gnus $B$G$G$-$k2?$+8-$$$b$N$r9M$(=P$7!"$=$N>e$=$N8-(B -$B$$$b$N$r=q$$$F$/$l$k$H$$$&$3$H$G$9!#$3$l$rMF0W$K$9$k$?$a$K$O!"(Bgnus $B$NFb(B -$BItF0:n$r5-=R$9$k$N$,NI$$J}K!$@$m$&$H;d$O;W$$$^$7$?!#$"$H!"$=$s$J$KFbIt$8$c(B -$B$J$$F0:n$r$$$/$D$+$H!";d$,:#$d$C$F$k$3$H$H!#(B - -$B%W%m%0%i%`$NFbIt9=B$$,JQ99$5$l$k$3$H$O$J$$!"$J$I$H;W$C$F$O$$$1$^$;$s$,!"(B -gnus $B$H$=$N%P%C%/%(%s%I4V$N%$%s%?!<%U%'!<%9(B ($B$3$l$O40A4$K5-=R$5$l$F$$(B -$B$k(B) $B$d!"%9%3%"%U%!%$%k$N7A<0(B ($B$3$l$bF1MM(B)$B!"%G!<%?9=B$(B ($B$3$l$OB>$h$jJQ99(B -$B$5$l$d$9$$$b$N$b$"$k(B)$B!"A`:nMQ$N0lHL%a%=%C%I!"$J$I$r(B ($B:YIt$K$o$?$C$F(B) $BDj(B -$B5A$7$F$$$-$^$9!#(B - -@menu -* Gnus Utility Functions:: $B;HMQ$G$-$k6&DL$N4X?t$HJQ?t(B -* Backend Interface:: Gnus $B$O$I$&$d$C$F%5!<%P!<$HDL?.$9$k$N$+(B -* Score File Syntax:: $B%9%3%"%U%!%$%k5,3J$N(B BNF $BDj5A(B -* Headers:: Gnus $B$O%X%C%@!<$rFbItE*$K$I$N$h$&$K3JG<(B - $B$9$k$+(B -* Ranges:: $B$?$/$5$s$N?t$r3JG<$9$kJXMx$J7A<0(B -* Group Info:: $B%0%k!<%W>pJs7A<0(B -* Extended Interactive:: $B5-9f@\F,<-$J$I(B -* Emacs/XEmacs Code:: Gnus $B$OA4$F$N6aBe(B Emacsen $B$GF0:n$9$k(B -* Various File Formats:: Gnus $B$N;HMQ$9$k%U%!%$%k$N7A<0(B -@end menu - -@node Gnus Utility Functions -@subsection Gnus $B$NM-MQ$J4X?t(B -@cindex Gnus utility functions -@cindex utility functions -@cindex functions -@cindex internal variables - -$B%U%C%/$J$I$+$i.$5$J4X?t$r=q$/$H$-$O!"(Bgnus $B$NFbIt4X?t(B -$B$dJQ?t$K%"%/%;%9$9$k$3$H$O@dBPI,MW$G$9!#0J2<$,:G$b$h$/;H$o$l$k$b(B -$B$N$N0lMw$G$9!#(B - -@table @code -@item gnus-newsgroup-name -@vindex gnus-newsgroup-name -$B$3$NJQ?t$O8=:_$N%K%e!<%9%0%k!<%W$NL>A0$rJ];}$7$F$$$^$9!#(B - -@item gnus-find-method-for-group -@findex gnus-find-method-for-group -@var{group} $B$NA*BrJ}K!$rJV$94X?t$G$9!#(B - -@item gnus-group-real-name -@findex gnus-group-real-name -$B@55,$N(B ($B@\F,<-IU$-$N(B) gnus $B%0%k!<%WL>$rA0(B -$B$rJV$7$^$9!#(B - -@item gnus-group-prefixed-name -@findex gnus-group-prefixed-name -$B@\F,<-L5$7$N%0%k!<%WL>$HA*BrJ}K!$r$rJV$7$^$9!#(B - -@item gnus-get-info -@findex gnus-get-info -@var{group} $B$N%0%k!<%W>pJs0lMw$rJV$7$^$9!#(B - -@item gnus-group-unread -@findex gnus-group-unread -@var{group} $B$NL$FI5-;v$N?t$+!"$b$7$/$O$=$l$,J,$+$i$J$$>l9g$O(B @code{t} $B$G(B -$B$9!#(B - -@item gnus-active -@findex gnus-active -@var{group} $B$N3hF0EPO?$G$9!#(B - -@item gnus-set-active -@findex gnus-set-active -@var{group} $B$K3hF0EPO?$r@_Dj$7$^$9!#(B - -@item gnus-add-current-to-buffer-list -@findex gnus-add-current-to-buffer-list -Gnus $B=*N;;~$K>C5n$9$k%P%C%U%!$N0lMw$K8=:_$N%P%C%U%!$rDI2C$7$^$9!#(B - -@item gnus-continuum-version -@findex gnus-continuum-version -$B0z?t$H$7$F(B gnus $B$N%P!<%8%g%sJ8;zNs$r.?tE@?t$rJV$7(B -$B$^$9!#8E$$%P!<%8%g%s$OI,$:?7$7$$%P!<%8%g%s$h$j$b>.$5$$?t$K$J$j$^(B -$B$9!#(B - -@item gnus-group-read-only-p -@findex gnus-group-read-only-p -@var{group} $B$,FI$_=P$7@lMQ$G$"$k$+$I$&$+$r<($7$^$9!#(B - -@item gnus-news-group-p -@findex gnus-news-group-p -@var{group} $B$,%K%e!<%9%P%C%/%(%s%I$G$"$k$+$I$&$+$r<($7$^$9!#(B - -@item gnus-ephemeral-group-p -@findex gnus-ephemeral-group-p -@var{group} $B$,C;4|%0%k!<%W$G$"$k$+$I$&$+$r<($7$^$9!#(B - -@item gnus-server-to-method -@findex gnus-server-to-method -@var{server} $B$KBP1~$7$F$$$kA*BrJ}K!$rJV$7$^$9!#(B - -@item gnus-server-equal -@findex gnus-server-equal -$BFs$D$N2>A[%5!<%P!<$,F10l$N$b$N$G$"$k$+$I$&$+$r<($7$^$9!#(B - -@item gnus-group-native-p -@findex gnus-group-native-p -@var{group} $B$,4pK\%0%k!<%W$G$"$k$+$I$&$+$r<($7$^$9!#(B - -@item gnus-group-secondary-p -@findex gnus-group-secondary-p -@var{group} $B$,FsA[%0%k!<%W$K$D$$$F$O2?$K$bCN$j$^(B -$B$;$s!#$?$@2>A[%5!<%P!<(B @dfn{virtual servers} $B$HBPOC$9$kJ}K!$rCN$C$F$$$k(B -$B$@$1$G$9!#2>A[%5!<%P!<$O%P%C%/%(%s%I(B @dfn{backend} $B$H$$$/$D$+$N%P%C%/%((B -$B%s%IJQ?t(B @dfn{backend variables} $B$+$i$J$j$^$9!#A0pJs$rMW5a$9$k$H(B -$B$-$O!"DL>o4X?t$N0z?t$H$7$F2>A[%5!<%P!$r4^$a$^$9!#(B($B$b$7$J$1$l$P!"%P%C(B -$B%/%(%s%I$O(B ``$B8=:_$N(B'' $B2>A[%5!<%P!<$r;HMQ$7$^$9!#(B) $BNc$($P!"(B -@code{nntp-request-list} $B$O$=$NM#0l$N(B ($B>JN,2DG=$J(B) $B0z?t$H$7$F2>A[%5!<%P!<(B -$B$rA[%5!<%P!<$,3+$+$l$F$$$J$1$l$P!"$3$N4X?t$O<:GT$7$^(B -$B$9!#(B - -$B2>A[%5!<%P!$O!"J*M}E*$J%5!<%P!$H$O2?$N4X78$bL5$$$3$H$KCm0U$7$F$/$@(B -$B$5$$!#$3$NNc$r8+$F$/$@$5$$!#(B - -@lisp -(nntp "odd-one" - (nntp-address "ifi.uio.no") - (nntp-port-number 4324)) -@end lisp - -$B$3$3$G!"J*M}%5!<%P!$O(B @samp{ifi.uio.no} $B$G$"$k$N$KBP$7!"2>A[%5!<%P!<(B -$BL>$O(B @samp{odd-one} $B$G$9!#(B - -$B%P%C%/%(%s%I$OJ#?t$N2>A[%5!<%P!<$r@Z$jBX$(2DG=$G$J$1$l$P$J$j$^$;$s!#I8=`(B -$B$N%P%C%/%(%s%I$O$3$l$r!"2>A[%5!<%P!<4D6-$rI,MW$J$H$-$Ko$K3NG'$9$kG$0U4X?t(B @dfn{optional functions} $B$G$9!#(B - -$B$3$l$i$N4X?t$OA4$F!"JV5Q%G!<%?(B -$B$r(B @code{nntp-server-buffer} (@samp{*nntpd*}) $B%P%C%U%!!<$KJV$9$3$H$,5a$a(B -$B$i$l$^$9!#$3$l$O$A$g$C$HIT1?$JL>A0IU$1$G$9$,!"$3$l$G2fK}$7$J$1$l$P$J$j$^(B -$B$;$s!#;d$,7k2L$N%G!<%?(B @dfn{resulting data} $B$H8@$C$?$H$-$O!"$=$N%P%C%U%!!<(B -$B$NCf$N%G!<%?$r;X$7$F$$$^$9!#JV5QCM(B @dfn{return value} $B$H8@$C$?$H$-$O!"4X(B -$B?t8F$S=P$7$K$h$C$FJV$5$l$k4X?t$NCM$N$3$H$r8@$C$F$$$^$9!#4X?t$,<:GT$7$?$H(B -$B$-$OJV5QCM$H$7$F(B@code{nil} $B$rJV$5$J$/$F$O$$$1$^$;$s!#(B - -$B%P%C%/%(%s%I$K$O%5!<%P!<7A<0(B @dfn{server-forming} $B$N%P%C%/%(%s%I$G$"$k$H(B -$B8F$P$l$k$b$N$,$"$j!"$^$?$=$&8F$P$l$J$$$b$N$b$"$j$^$9!#8epJs$rG[Aw$9$k$b$N(B -$B$G!"$=$l0J>e$N$b$N$G$O$"$j$^$;$s!#(B - -Gnus $B$O%0%k!<%WL>$H5-;vHV9f$K$h$C$F$=$l$>$l$N%a%C%;!<%8$rFCDj$7$^$9!#$=(B -$B$l$i5-;vHV9f$K4X$9$k$A$g$C$H$7$?@bL@$r$9$k$3$H$OM-1W$+$b$7$l$^$;$s!#$^$:(B -$BBh0l$K!"$=$N?t;z$O@5$N@0?t$G$9!#BhFs$K!"(BGnus $B$r:.Mp$5$;$k$3$H$J$/8E$$5-(B -$B;vHV9f$r8e$G:F;HMQ$9$k$3$H$OIaDL$O$G$-$^$;$s!#$=$l$O!"$b$7$"$k%0%k!<%W$,(B -$B$+$D$F(B 42 $BHV$N5-;v$r;}$C$F$$$?$H$7$?$i!"$=$NHV9f$GB>$N5-;v$r;}$D$3$H$O$G(B -$B$-$J$$$+!"$^$?$O(B Gnus $B$,:.Mp$7$F$7$^$&$+$b$7$l$J$$$H$$$&$3$H$G$9!#(B -@footnote{See the function @code{nnchoke-request-update-info}, -@ref{Optional Backend Functions}$B!#(B} $BBh;0$K!"5-;vHV9f$O$=$N%0%k!<%W$G$NE~(B -$BCe=g$K$J$C$F$$$J$1$l$P$J$i$J$$$3$H$G$9!#$H$O8@$(%a%C%;!<%8$NF|IU$bE~Ce=g(B -$B$G$"$kI,MW$O$"$j$^$;$s$,!#(B - -$B$9$G$KA0$N@a$G!"5-;vHV9f$O0l2s;H$o$l$?$@$1$GLrL\$r=*$o$i$J$1$l$P$J$i$J(B -$B$$(B `$B87$7$$(B' $B@)8B$K$D$$$F@bL@$7$^$7$?!#$7$+$7!"5-;vHV9f$NJB$S$KH4$1$,$"$k(B -$B$H(B Gnus $B$O$H$F$b:.Mp$7$F$7$^$&$N$G!"(B@emph{$BDL$7(B} $BHV9f$rIU$1$k$3$H$,M-MQ$J(B -$B$N$+$b$7$l$^$;$s!#$?$@$7(B `$B:F;HMQIT2D(B' $B$N@)8B$,$"$k$N$G!"$$$D$G$bHV9f$NH4(B -$B$1$r2sHr$G$-$k$H$O8B$j$^$;$s!#$^$?!"2DG=$J8B$j5-;vHV9f$r(B 1 $B$+$i;O$a$k$3(B -$B$H$O!"HV9f$r;H$$@Z$C$F$7$^$&$3$H$rHr$1$k$?$a$KLrN)$A$^$9!#(B - -$B$3$3$G$NNc$HDj5A$G$O!"A[A|>e$N%P%C%/%(%s%I(B @code{nnchoke} $B$r0z$-9g$$$K=P(B -$B$9$3$H$K$7$^$9!#(B - -@cindex @code{nnchoke} - -@menu -* Required Backend Functions:: $BJ,$J%X%C%@!o!"(B@code{articles} $B$NCf$N:G>.HV9f$N5-;v$h(B -$B$j$b>.$5$$5-;v$+$i(B ($B>/$J$/$H$b(B) @var{fetch-old} $B8D$NM>J,$J%X%C%@!<$r$&$3$H$r(B -$BHQ$o$7$$$H;W$C$?>l9g$K$O!"$3$N%Q%i%a!<%?$NB8:_$OL5;k$5$l$k$3$H$b$"$j$^$9!#(B -$B$3$NCM$,(B @code{nil} $B$G$b?t;z$G$b$J$1$l$P!":GBg8B$N -References: <38jdmq$4qu@@visbur.ifi.uio.no> -NNTP-Posting-Host: holmenkollen.ifi.uio.no -. -@end example - -$B$D$^$j!"JV5QCM$,(B @code{headers} $B$G$"$k$H$-$O!"%G!<%?%P%C%U%!$K$3$l$i%X%C(B -$B%@!<$,$$$/$D$+$"$k$H$$$&$3$H$r0UL#$7$^$9!#(B - -$B$3$l$,$=$N%P%C%U%!!<$N(B BNF $BDj5A$G$9!#(B - -@example -headers = *head -head = error / valid-head -error-message = [ "4" / "5" ] 2number " " eol -valid-head = valid-message *header "." eol -valid-message = "221 " " Article retrieved." eol -header = eol -@end example - -$B$b$7JV5QCM$,(B @code{nov} $B$G$"$l$P!"%G!<%?%P%C%U%!!<$K(B -$B$O(B @dfn{network overview database} $B9T$,4^$^$l$F$J$/$F$O$J$j$^$;$s!#(B -$B$3$l$O4pK\E*$K$OJ#?t$NMs$r%?%V$G6h@Z$C$?$b$N$G$9!#(B - -@example -nov-buffer = *nov-line -nov-line = 8*9 [ field ] eol -field = -@end example - -$B$3$l$i$NMs$K$I$N$h$&$J$b$N$,4^$^$l$k$+$r$h$j>\$7$/8+$?$1$l$P!"(B -@pxref{Headers} $B$r;2>H$7$F$/$@$5$$!#(B - -@item (nnchoke-open-server SERVER &optional DEFINITIONS) - -$B$3$3$G$N(B @var{server} $B$O2>A[%5!<%P!$G$9!#(B@var{definitions} $B$O(B -$B$3$N2>A[%5!<%P!<$rDj5A$9$k(B @code{(VARIABLE VALUE)} $BAH$N%j%9%H$G(B -$B$9!#(B - -$B$b$7%5!<%P!<$r3+$/$3$H$,$G$-$J$1$l$P!"%(%i!<$O%7%0%J%k$G$ODLCN$5(B -$B$l$^$;$s!#$=$7$F%P%C%/%(%s%I$O!"$=$l0J8e$N$3$N%5!<%P!<$X$N@\B3MW(B -$B5a$r5qH]$9$k$3$H$b$G$-$^$9!#o!"(Bgnus $B$,=*N;$9$k$H$-$K$N$_8F$S=P$5$l$^$9!#(B - -$BJV$5$l$k7k2L$N%G!<%?$O$"$j$^$;$s!#(B - -@item (nnchoke-server-opened &optional SERVER) - -$B$b$7(B @var{server} $B$,8=:_$N2>A[%5!<%P!<$G!"$=$NJ*M}%5!<%P!<$X$N@\(B -$BB3$,@8$-$F$$$l$P!"$3$N4X?t$O(B @code{nil} $B0J30$NCM$rJV$7$^$9!#$3$N(B -$B4X?t$O$I$s$J>l9g$G$b!"@\B3$,<:$o$l$?%5!<%P!<$X$N:F@\B3$r9T$J$&$3(B -$B$H$O$"$j$^$;$s!#(B - -$BJV$5$l$k7k2L$N%G!<%?$O$"$j$^$;$s!#(B - -@item (nnchoke-status-message &optional SERVER) - -$B$3$N4X?t$O(B @var{server} $B$+$i$N:G8e$N%(%i!<%a%C%;!<%8$rJV5Q$7$^$9!#(B - -$BJV$5$l$k7k2L$N%G!<%?$O$"$j$^$;$s!#(B - -@item (nnchoke-request-article ARTICLE &optional GROUP SERVER TO-BUFFER) - -$B$3$N4X?t$N7k2L$N%G!<%?$O!"(B@var{article} $B$G;XDj$5$l$?5-;v$G$9!#$3$N;XDj(B -$B$O(B @code{Message-ID} $B$+HV9f$N$$$:$l$+$G$9!#(B@code{Message-ID} $B$K$h$k5-;v(B -$B$No$N%G!<%?%P%C(B -$B%U%!$NBe$o$j$K!"$3$N%P%C%U%!$KJV$5$l$^$9!#$3$l$K$h$jB?NL$N%G!<%?$r$"$k%P%C(B -$B%U%!$+$iJL$N%P%C%U%!$K%3%T!<$9$k$3$H$rHr$1$k$3$H$,$G$-!"$=$7$F(B gnus $B$ODL(B -$B>o!"5-;v%P%C%U%!$KD>@\5-;v$rA^F~$9$k$h$&$KMW5a$7$F$$$^$9!#(B - -$B$b$72DG=$G$"$k$N$J$i!"$3$N4X?t$O!"(B@code{car}$B$,$G!"(B@code{cdr} $B$,5-;vHV9f$G$"$k(B cons $B%;%k$rJV$9$Y$-$G$9!#$3$l$K$h(B -$B$j(B @code{Message-ID} $B$K$h$C$F5-;v$rl9g$K$O!"5-(B -$B;v$NuBV$G!"$3$l$O(B 211 $B$G$J$/$F$O$J$j$^$;$s!#.$N5-;vHV9f!":GBg$N5-;vHV9f!"$=$7$F:G8e$,%0%k!<%WL>$G(B -$B$9!#5-;v$NAm?t$O!":GBg!&:G>.5-;vHV9f$+$iC1=c$K9M$($i$l$k?t$h$j$b>.$5$$$3(B -$B$H$,$"$k$3$H$KCm0U$7$F$/$@$5$$!#$$$/$D$+$N5-;v$OC$5$l$F$$$k$+$b$7$l(B -$B$^$;$s!#(BGnus $B$OAm?t$OC1$K " " -info = "211 " 3* [ " " ] -@end example - -@item (nnchoke-close-group GROUP &optional SERVER) - -@var{group} $B$rJD$8!"$=$l$K@\B3$5$l$F$$$kA4$F$N;q8;$r3+J|$7$^$9!#$3$l$O$[(B -$B$H$s$I$N%P%C%/%(%s%I$G$O2?$b$9$k$3$H$,$J$$$G$7$g$&!#(B - -$BJV$5$l$k7k2L$N%G!<%?$O$"$j$^$;$s!#(B - -@item (nnchoke-request-list &optional SERVER) - -@var{server} $B>e$GMxMQ2DG=$JA4$F$N%0%k!<%W$N0lMw$rJV$7$^$9!#$3$l(B -$B$O(B @emph{$BA4It(B} $B$H$$$&0UL#$G$9!#(B - -$B$3$l$,!"$?$C$?Fs$D$7$+%0%k!<%W$r;}$C$F$$$J$$%5!<%P!<$+$i$NNc$G$9!#(B - -@example -ifi.test 0000002200 0000002000 y -ifi.discussion 3324 3300 n -@end example - -$B3F9T$K$O%0%k!<%WL>$,$"$j!"$=$7$F$=$N%0%k!<%WFb$N:GBg$N5-;vHV9f!":G>.$N5-(B -$B;vHV9f!"$=$7$F:G8e$K%U%i%0$G$9!#(B - -@example -active-file = *active-line -active-line = name " " " " " " flags eol -name = -flags = "n" / "y" / "m" / "x" / "j" / "=" name -@end example - -$B%U%i%0$O!"$=$N%0%k!<%W$,FI$_=P$7@lMQ(B (@samp{n}) $B$G$"$k$+!";J2q$N%0%k!<%W$NJL(B -$BL>(B (@samp{=other-group}) $B$G$"$k$+!">e5-$N$I$l$G$b$J$$(B (@samp{y}) $B$+!"$H(B -$B$$$&$3$H$r<($7$F$$$^$9!#(B - -@item (nnchoke-request-post &optional SERVER) - -$B$3$N4X?t$O!"8=:_$N%P%C%U%!$rEj9F$7$^$9!#$3$l$OEj9F$,@.8y$7$?$+$I$&$+$rJV(B -$B5Q$7$F$b9=$$$^$;$s$,!"I,?\$G$O$"$j$^$;$s!#Nc$($P!"Ej9F$,HsF14|$K9T$o$l$k(B -$B$N$G$"$l$P!"$3$N4X?t$,=*N;$7$?;~E@$G$OEj9F$OIaDL40N;$7$F$$$^$;$s!#$=$N>l(B -$B9g$3$N4X?t$O!"Ej9F$r40N;$5$;$k$3$H$,$G$-$J$$$H$-!"$=$l$r$O$C$-$j$HMxMQpJs(B (@pxref{Group Info}) $B$,JQ992U=j$H$7$F%P%C%/%((B -$B%s%I$KEO$5$l$^$9!#$3$l$O%P%C%/%(%s%I$,(B ($B2>A[%0%k!<%W$d(B imap $B%0%k!<(B -$B%W$N>l9g$N$h$&$K(B) $BK\Ev$KA4$F$N>pJs$r;}$C$F$$$k>l9g$KJXMx$K$J$j$^(B -$B$9!#$3$N4X?t$O!"$=$NMW5a$KE,9g$5$;$k>pJs$rGK2uE*$KCV$-49$(!"$=(B -$B$N(B ($BCV$-49$($i$l$?(B) $B%0%k!<%W>pJs$rJV$7$^$9!#(B - -$B$3$N4X?t$+$iJV$5$l$k7k2L$N%G!<%?$O$"$j$^$;$s!#(B - -@item (nnchoke-request-type GROUP &optional ARTICLE) - -$BMxMQJ}$H$b(B @code{nil} $B$G$"$k(B -$B$+$b$7$l$^$;$s!#(B - -$B$3$N4X?t$+$iJV$5$l$k7k2L$N%G!<%?$O$"$j$^$;$s!#(B - -@item (nnchoke-request-set-mark GROUP ACTION &optional SERVER) - -$B5-;v$N0u$r@_Dj(B/$B>C5n(B/$BDI2C$7$^$9!#IaDL$O(B gnus $B$O5-;v$N0u(B ($B4{FI!"2D;k!";~8B(B -$B>C5n$J$I(B) $B$rFbIt$G07$$!"(B@code{~/.newsrc.eld} $B$KJ]B8$7$^$9!#$7$+$7!"%P%C(B -$B%/%(%s%I$K$O(B (@sc{imap} $B$N$h$&$K(B) $B5-;v$NA4$F$N>pJs$r%5!<%P!<$K<}$a$k$N(B -$B$G!"(Bgnus $B$O0u$N>pJs$r%5!<%P!<$KEAC#$7$J$1$l$P$J$i$J$$$b$N$,$"$j$^$9!#(B - -ACTION $B$O$3$N$h$&$JMM<0$N0u@_Dj$NMW5a$N%j%9%H$G$9(B: - -@example -(RANGE ACTION MARK) -@end example - -RANGE $B$O0u$rIU$1$?$$5-;v$NHO0O$G$9!#(BACTION $B$O(B @code{add} $B$^$?(B -$B$O(B @code{del} $B$G!"0u$rDI2C$7$?$j>C$7$^$9(B ($B8@5Z$5$l$F$$$J$$$9$Y$F$N0u$OJ](B -$BB8$7$^$9(B)$B!"0u$N>C5n(B ($B8@5Z$5$l$F$$$J$$0u$OJ]B8$7$^$9(B) $B$G$9!#(BMARK $B$O0u(B -$B$N%j%9%H$G$9!#$=$l$>$l$N0u$O%7%s%\%k$G$9!#8=:_;H$o$l$F$$$k0u(B -$B$O(B @code{read}, @code{tick}, @code{reply}, @code{expire}, @code{killed}, -@code{dormant}, @code{save}, @code{download}, @code{unsend}, -@code{forward} $B$*$h$S(B @code{recent} $B$G$9$,!"$b$72DG=$J$i!"$"$J$?$N%P%C%/(B -$B%(%s%I$O$3$l$i$K@)8B$r$9$k$Y$-$G$O$"$j$^$;$s!#(B - -$BL7=b$9$kF0:n$,;XDj$5$l$?$H$-!"%j%9%H$N:G8e$NF0:n$,8zNO$r;}$D$b$N$K$J$j$^(B -$B$9!#$9$J$o$A!"F0:n$K5-;v(B 1 $B$K(B @code{$B2D;k(B} $B0u$rDI2C$9$kMW5a$,$"$j!"%j%9%H(B -$B$N8e$GF1$85-;v$+$i0u$r>C5n$9$k$3$H$rMW5a$7$F$$$l$P!"0u$OC5n$5$l$k(B -$B$Y$-$G$9!#(B - -$BF0:n%j%9%H$NNc$G$9(B: - -@example -(((5 12 30) 'del '(tick)) - ((10 . 90) 'add '(read expire)) - ((92 94) 'del '(read))) -@end example - -$B4X?t$O0u$r@_Dj$G$-$J$+$C$?5-;v$NHO0O$rJV$9$Y$-$G$9(B ($B8=:_$OA4$/;H$o$l$F$$(B -$B$^$;$s(B)$B!#(B - -$B$3$N4X?t$+$i$O7k2L$N%G!<%?$O$"$j$^$;$s!#(B - -@item (nnchoke-request-update-mark GROUP ARTICLE MARK) - -$B$b$7MxMQ$N%4%_$rJV$7$F$O$$$1$^$;$s!#(B - -$B;d$,CN$C$F$$$k$3$l$N$3$l$NMxMQK!$O!"(B@code{nnvirtual} $B$,9T$J$C$F$$$k$3$H(B -$B$@$1$G$9(B --- $B$b$79=@.%0%k!<%W$,<+F04|8B@Z$l>C5n2DG=$G$"$l$P!"$3$N2>A[%0(B -$B%k!<%W$G4{FI$N0u$rIU$1$k$H!"7k2L$H$7$F$=$N5-;v$K4|8B@Z$l>C5n$N0u$,IU$1$i(B -$B$l$^$9!#(B - -$B$3$N4X?t$+$iJV$5$l$k7k2L$N%G!<%?$O$"$j$^$;$s!#(B - -@item (nnchoke-request-scan &optional GROUP SERVER) - -$B$3$N4X?t$O!"%P%C%/%(%s%I$,E~Ce5-;v$r3NG'$9$kMW5a$r9T$J$&$H$-$K$$$D$G(B -$B$b(B (gnus $B$+$=$l0J30$K$h$C$F(B)$B!"$"$l$d$3$l$d$H8F$S=P$5$l$k$3$H$,$"$j$^$9!#(B -$B%a!<%k%P%C%/%(%s%I$O$3$N4X?t$,5/F0$5$l$?$H$-!"E57?E*$K$O%9%W!<%k%U%!%$%k(B -$B$rFI$`$+(B POP $B%5!<%P!<$KLd$$9g$o$;$K$$$-$^$9!#(B@var{group} $B$OFC$K5$$KN1$a(B -$B$kI,MW$O$"$j$^$;$s(B --- $B$b$7%P%C%/%(%s%I$,!"0l$D$@$1$N%0%k!<%W$rAv::$9$k(B -$B$N$OBgJQ$9$.$k$HH=CG$7$?>l9g$K$O!"A4%0%k!<%W$NA4Av::$r9T$J$C$F$b9=$$$^$;(B -$B$s!#$G$9$,!" description eol -name = -description = -@end example - -@item (nnchoke-request-list-newsgroups &optional SERVER) - -$B$3$N4X?t$K$h$C$FJV$5$l$k7k2L$N%G!<%?$O!"%5!<%P!<>e$GMxMQ$G$-$k%0(B -$B%k!<%WA4$F$N@bL@$G$9!#(B - -@example -description-buffer = *description-line -@end example - -@item (nnchoke-request-newgroups DATE &optional SERVER) - -$B$3$N4X?t$+$iJV$5$l$k7k2L$N%G!<%?$O!"(B@samp{date} $B0J9_$K:n@.$5$l$?(B -$BA4$F$N%0%k!<%W$G$9!#(B@samp{date} $B$ODL>o$N?M4V$,FI$a$kF|IU$N7A<0$G(B -$B$9!#%G!<%?$O(B active $B%P%C%U%!$N7A<0$G$J$1$l$P$J$j$^$;$s!#(B - -@item (nnchoke-request-create-group GROUP &optional SERVER) - -$B$3$N4X?t$O!"(B@var{group} $B$H$$$&L>A0$N6u$N%0%k!<%W$r:n@.$7$^$9!#(B - -$BJV$5$l$k7k2L$N%G!<%?$O$"$j$^$;$s!#(B - -@item (nnchoke-request-expire-articles ARTICLES &optional GROUP SERVER FORCE) - -$B$3$N4X?t$O!"(B@var{articles} $B$NHO0O$NA4$F$N5-;v$KBP$7$F4|8B@Z$l>C5n=hM}$r(B -$B9T$J$$$^$9!#(B(@var{articles} $B$O8=:_$O5-;vHV9f$NC1=c$J%j%9%H$G$9!#(B) $B$3$N(B -$B4X?t$G>C5n$5$l$kA0$N!"5-;v$,$I$l$@$18E$$5-;v$G$"$k$+$N7hDj$O%P%C%/%(%s%I(B -$B$KG$$5$l$F$$$^$9!#(B@var{force} $B$,(B @code{nil} $B0J30$G$"$l$P!"$=$l$,$I$s$J$K(B -$B?7$7$$$b$N$G$"$C$F$b!"A4$F$N(B@var{articles} $B$,>C5n$5$l$^$9!#(B - -$B$3$N4X?t$O:o=|$7$J$+$C$?!"$"$k$$$O:o=|$9$k$3$H$,$G$-$J$+$C$?5-;v$N%j%9%H(B -$B$rJV$7$^$9!#(B - -$BJV$5$l$k7k2L$N%G!<%?$O$"$j$^$;$s!#(B - -@item (nnchoke-request-move-article ARTICLE GROUP SERVER ACCEPT-FORM -&optional LAST) - -$B$3$N4X?t$O(B @var{article} ($BHV9f(B) $B$r!"(B@var{group} $B$+(B -$B$i(B @var{accept-form} $B$r8F$S=P$7$F0\F0$7$^$9!#(B - -$B$3$N4X?t$O!"LdBj$N5-;v$r0\F0$5$;$k$?$a$N=`Hw$H$7$F!"5-;v$KIU2C$5$l$?%X%C(B -$B%@!<9T$rA4$F:o=|$7!"0lHL$K5-;v$r!V$-$l$$$5$C$Q$j!W$K$7$^$9!#$=$7$F(B ``$B$-(B -$B$l$$$J(B'' $B5-;v$N$"$k%P%C%U%!!<$G(B @var{accept-form} $B$r(B @code{eval} $B$7$^$9!#(B -$B$3$l$OK\Ev$KJ#@=$r9T$J$$$^$9!#$b$7(B @code{eval} $B$,(B @code{nil} $B0J30$NCM$r(B -$BJV$7$?$i!"$=$N5-;v$O:o=|$5$l$^$;$s!#(B - -@var{last} $B$,(B @code{nil} $B$G$"$l$P!"$3$ND>8e$K$5$i$KMW5a$,H/9T$5$l$k8+9~(B -$B$_$,9b$$!"$H$$$&0UL#$K$J$j!"$3$l$K$h$C$F:GE,2=$,$$$/$i$+$G$-$k$h$&$K$J$j(B -$B$^$9!#(B - -$B$3$N4X?t$O!"%0%k!<%WL>$,(B @code{car} $B$G!"$=$N5-;v$N0\F0@h$N5-;vHV9f$,(B -@code{cdr} $B$G$"$k(B cons $B%;%k$rJV$7$^$9!#(B - -$BJV$5$l$k7k2L$N%G!<%?$O$"$j$^$;$s!#(B - -@item (nnchoke-request-accept-article GROUP &optional SERVER LAST) - -$B$3$N4X?t$O!"8=:_$N%P%C%U%!$r$A$K(B -$B9T$o$l$k$H$$$&0UL#$G$9!#(B - -$B$3$N4X?t$O%0%k!<%WL>$,(B @code{car} $B$G!"$=$N5-;v$N0\F0@h$N5-;vHV9f$,(B -@code{cdr} $B$G$"$k(B cons $B%;%k$rJV$7$^$9!#(B - -$BJV$5$l$k7k2L$N%G!<%?$O$"$j$^$;$s!#(B - -@item (nnchoke-request-replace-article ARTICLE GROUP BUFFER) - -$B$3$N4X?t$O(B @var{article} ($BHV9f(B) $B$r(B @var{group} $B$+$i:o=|$7!"Be$o$j$K(B -@var{buffer} $B$r$=$3$KA^F~$7$^$9!#(B - -$BJV$5$l$k7k2L$N%G!<%?$O$"$j$^$;$s!#(B - -@item (nnchoke-request-delete-group GROUP FORCE &optional SERVER) - -$B$3$N4X?t$O(B @var{group} $B$r>C5n$7$^$9!#$b$7(B @var{force} $B$,$"$l$P!"$=$N%0(B -$B%k!<%WFb$NA4$F$N5-;v$rK\Ev$K>C5n$7!"$=$7$F$=$N%0%k!<%W<+?H$r>C5n$7$^$9!#(B -($B$b$7(B ``$B%0%k!<%W<+?H(B'' $B$H$$$&$b$N$,$"$l$P!#(B) - -$BJV$5$l$k7k2L$N%G!<%?$O$"$j$^$;$s!#(B - -@item (nnchoke-request-rename-group GROUP NEW-NAME &optional SERVER) - -$B$3$N4X?t$O(B @var{group} $B$+$i(B @var{new-name} $B$KL>A0$rJQ99$7$^$9!#(B -@var{group} $BFb$K$"$k5-;v$OA4$F(B @var{new-name} $B$K0\F0$7$^$9!#(B - -$BJV$5$l$k7k2L$N%G!<%?$O$"$j$^$;$s!#(B -@end table - -@node Error Messaging -@subsubsection $B%(%i!<%a%C%;!<%8I=<((B - -@findex nnheader-report -@findex nnheader-get-report -$B%P%C%/%(%s%I$O%(%i!<>u67$rJs9p$9$k$N$K(B @code{nnheader-report} $B$r;H$o$J$/(B -$B$F$O$J$j$^$;$s(B --- $BMW5a$r$N%7%s%\%k$G!";D$j$O!"J#?t$N0z?t(B -$B$,$"$l$P(B @code{format} $B$X$N0z?t$H$7$F2ro$K(B@code{nil} $B$rJV$5$J$/$F$O$J$j$^$;$s!#(B - -@lisp -(nnheader-report 'nnchoke "You did something totally bogus") - -(nnheader-report 'nnchoke "Could not request group %s" group) -@end lisp - -$B0lJ}(B gnus $B$O!"%5!<%P!<$+$i(B @code{nil} $B$rJV$5$l$?$H$-(B -$B$K(B @code{nnheader-get-report} $B$r8F$S=P$7!"$=$7$F$3$N4X?t$,LdBj$N%P%C%/%((B -$B%s%I$KBP$7$F:G8e$KJs9p$5$l$?%a%C%;!<%8$rJV$7$^$9!#$3$N4X?t$O0l$D$N0z(B -$B?t(B --- $B%5!<%P!<$N%7%s%\%k$re$N5-;v$rJT(B -$B=8$9$k$3$H$,$G$-$^$9!#(B@code{nnmh} $B$O(B @code{nnml} $B$K$H$F$b;w$F$$$^$9$,!"(B -$B$3$l$O%"%/%F%#%V%U%!%$%k$r;H$o$:!"35MW%G!<%?%Y!<%9$bJ];}$7$^$;$s!#(B -@code{nndir} $B$O(B @code{nnml} $B$K$H$F$b;w$F$$$^$9$,!"$3$l$K$O(B ``$B%0%k!<%W(B'' -$B$N35G0$O$J$/!"5-;v$N=$@5$O$G$-$^$;$s!#(B - -$B?7$7$$%P%C%/%(%s%I$r=q$/$H$-$KB>$N%P%C%/%(%s%I$+$i4X?t$r(B ``$B7Q>5(B'' $B$9$k$3(B -$B$H$,2DG=$G$"$C$F$[$7$$!"$H;W$&$N$OM}$KE,$C$F$$$^$9!#$=$7$F$^$5$K!"$"$J$?(B -$B$,$=$&$7$?$1$l$P!"$=$l$,$G$-$k$N$G$9!#(B($B$"$J$?$,$=$&$7$?$/$J$1$l$P$7$J$/(B -$B$F$bNI$$$G$9$h!"$b$A$m$s!#(B) - -$BA4$F$N%P%C%/%(%s%I$O8x3+JQ?t$H8x3+4X?t$r!"(B@code{nnoo} $B$H8F$P$l$k%Q%C%1!<(B -$B%8$r;H$C$F@k8@$7$^$9!#(B - -$BB>$N%P%C%/%(%s%I$+$i4X?t$r7Q>5$9$k$K$O(B ($B$=$7$F8=:_$N%P%C%/%(%s%I$+$iB>$N(B -$B%P%C%/%(%s%I$K4X?t$r7Q>5$G$-$k$h$&$K$9$k$K$O(B)$B!"0J2<$N%^%/%m$r;HMQ$7$J$1(B -$B$l$P$J$j$^$;$s!#(B - -@table @code -@item nnoo-declare -$B$3$N%^%/%m$O!":G=i$N0z?t$r!"$=$N8e$KB3$/0z?t$N;R6!$G$"$k$3$H$r@k8@$7$^$9!#(B -$BNc$($P!"(B - -@lisp -(nnoo-declare nndir - nnml nnmh) -@end lisp - -$B$3$l$G(B @code{nndir}$B$O!"(B@code{nnml} $B$H(B @code{nnmh} $B$NN>J}$+$i4X?t$r7Q>5$7(B -$B$h$&$H$7$F$$$k$3$H$r@k8@$7$^$9!#(B - -@item defvoo -$B$3$N%^%/%m$O(B @code{defvar} $B$HF15A$G$9$,!"$=$NJQ?t$r8x3+%5!<%P!uBV;X8~7?$NJQ?t$O(B @code{defvar} $B$G$O$J(B -$B$/(B @code{defvoo} $B$K$h$C$F@k8@$9$k$Y$-$G$9!#(B - -$BDL>o$N(B @code{defvar} $B0z?t$K2C$($F!"$3$N%^%/%m$O?F%P%C%/%(%s%I$NJQ?t$N%j(B -$B%9%H$ro$N(B @code{defun} $B=hM}$K2C$($F!"$3$N%^%/%m$O$=$N4X?t$r8x3+$7$F$$$k$b$N$H(B -$B$7$FEPO?$7!"B>$N%P%C%/%(%s%I$,$=$l$r7Q>5$G$-$k$h$&$K$7$^$9!#(B - -@item nnoo-map-functions -$B$3$N%^%/%m$O8=:_$N%P%C%/%(%s%I$N4X?t$+$i?F%P%C%/%(%s%I$N4X?t$X$NCV$-49$((B -$B$r9T$J$($k$h$&$K$7$^$9!#(B - -@example -(nnoo-map-functions nndir - (nnml-retrieve-headers 0 nndir-current-group 0 0) - (nnmh-request-article 0 nndir-current-group 0 0)) -@end example - -$B$3$l$O(B @code{nndir-retrieve-headers} $B$,8F$S=P$5$l$?$H$-!"0lHVL\!";0HVL\!"(B -$B;MHVL\$N0z?t$,(B @code{nnml-retrieve-headers} $B$KEO$5$l!"0lJ}!"FsHVL\$N0z?t(B -$B$O(B @code{nndir-current-group} $B$NCM$H$7$F@_Dj$5$l$k!"$H$$$&0UL#$G$9!#(B - -@item nnoo-import -$B$3$N%^%/%m$OB>$N%P%C%/%(%s%I$+$i4X?t$r(B -$BA0$HE,Ev$J?t$NG=NO(B @dfn{abilities} $B$G$9!#(B - -$B$3$l$,Nc$G$9!#(B - -@lisp -(gnus-declare-backend "nnchoke" 'mail 'respool 'address) -@end lisp - -$B$=$7$F>e5-$N9T$O(B @file{nnchoke.el} $B%U%!%$%k$KF~$l$^$9!#(B - -$BG=NO$K$O0J2<$N$b$N$,$"$j$^$9!#(B - -@table @code -@item mail -$B$3$l$O%a!<%kIw%P%C%/%(%s%I$G$9(B --- $B%U%)%m!<%"%C%W$O(B ($B$?$$$F$$$O(B) $B%a!<%k(B -$B$GAw$i$l$^$9!#(B -@item post -$B$3$l$O%K%e!<%9Iw%P%C%/%(%s%I$G$9(B --- $B%U%)%m!<%"%C%W$O(B ($B$?$$$F$$$O(B) $B%K%e!<(B -$B%9$GAw$i$l$^$9!#(B -@item post-mail -$B$3$N%P%C%/%(%s%I$O%a!<%k$H%K%e!<%9$NN>J}$r%5%]!<%H$7$^$9!#(B -@item none -$B$3$l$O%K%e!<%9$G$b%a!<%k$G$b$J$$%P%C%/%(%s%I$G$9(B --- $BA4$/0c$C$?2?$+$G$9!#(B -@item respool -$B$3$l$O:F%9%W!<%k$r%5%]!<%H$7$^$9(B --- $B$H$$$&$h$j$O!"$=$N85$N5-;v$H%0%k!<(B -$B%W$r=$@5$9$k$3$H$,$G$-$^$9!#(B -@item address -$B2>A[%5!<%P!$NCf$K%5!<%P!<$NL>A0$,4^$^$k$H$$$&$3$H$G$9!#$3$l$O$[$H$s$I(B -$BA4It$N%P%C%/%(%s%I$GI,MW$K$J$j$^$9!#(B -@item prompt-address -$B%0%k!<%W%P%C%U%!$G(B @kbd{B} $B$J$I$G$3$NL?Na$r$N%P%C%/%(%s%I$KBP$7$F0l@~$r2h$7$F$$$kE@$O!"%a!<(B -$B%k%P%C%/%(%s%I$O(B @file{nnmail.el} $B$NCf$N6&DL4X?t$K6/$/0MB8$7$F$$$k$H$$$&(B -$BE@$G$9!#Nc$($P!"(B@code{nnml-request-scan} $B$NDj5A$O$3$N$h$&$K$J$j$^$9!#(B - -@lisp -(deffoo nnml-request-scan (&optional group server) - (setq nnml-article-file-alist nil) - (nnmail-get-new-mail 'nnml 'nnml-save-nov nnml-directory group)) -@end lisp - -$BC1$K(B @code{nnmail-get-new-mail} $B$K$$$/$D$+0z?t$rM?$($F8F$S=P$9$@$1$G!"(B -@code{nnmail} $B$,%a!<%k$N0\F0$dJ,N%$rA4$F$NLLE]$r8+$F$/$l$^$9!#(B - -$B$3$N4X?t$O;M$D$N0z?t$rl=j$G$9!#(B - -@item group -$B$3$N>JN,2DG=$J0z?t$O!"J,N%$,0l$D$N%0%k!<%W$KBP$7$F$N$_$G$9!#(B -@end table - -@code{nnmail-get-new-mail} $B$O3F5-;v$rJ]B8$9$k$?$a(B -$B$K(B @var{backend}@code{-save-mail} $B$r8F$S=P$7$^$9!#(B -@var{backend}@code{-active-number} $B$O$3$N5-;v$K3d$jEv$F$i$l$?5-;vHV9f$r(B -$BD4$Y$k$?$a$K8F$S=P$5$l$^$9!#(B - -$B$3$N4X?t$Oo$K=@Fp$J$h$&$K0U?^$5$l$F$$$^(B -$B$9!#$=$l$K$O(B Emacs Lisp $B$N%j%9%H$HF1$8FI$_9~$_9=J8$JMM$J$b$N$,$=$N;XDj$K(B -$B9g$&$@$m$&$H$$$&;v$,7hDj$5$l$^$7$?!#(B - -$B$3$l$ONI$/$"$k%9%3%"%U%!%$%k$G$9(B: - -@lisp -(("summary" - ("win95" -10000 nil s) - ("Gnus")) - ("from" - ("Lars" -1000)) - (mark -100)) -@end lisp - -$B%9%3%"%U%!%$%k$N(B BNF $BDj5A$G$9!#(B - -@example -score-file = "" / "(" *element ")" -element = rule / atom -rule = string-rule / number-rule / date-rule -string-rule = "(" quote string-header quote space *string-match ")" -number-rule = "(" quote number-header quote space *number-match ")" -date-rule = "(" quote date-header quote space *date-match ")" -quote = -string-header = "subject" / "from" / "references" / "message-id" / - "xref" / "body" / "head" / "all" / "followup" -number-header = "lines" / "chars" -date-header = "date" -string-match = "(" quote quote [ "" / [ space score [ "" / - space date [ "" / [ space string-match-t ] ] ] ] ] ")" -score = "nil" / -date = "nil" / -string-match-t = "nil" / "s" / "substring" / "S" / "Substring" / - "r" / "regex" / "R" / "Regex" / - "e" / "exact" / "E" / "Exact" / - "f" / "fuzzy" / "F" / "Fuzzy" -number-match = "(" [ "" / [ space score [ "" / - space date [ "" / [ space number-match-t ] ] ] ] ] ")" -number-match-t = "nil" / "=" / "<" / ">" / ">=" / "<=" -date-match = "(" quote quote [ "" / [ space score [ "" / - space date [ "" / [ space date-match-t ] ] ] ] ")" -date-match-t = "nil" / "at" / "before" / "after" -atom = "(" [ required-atom / optional-atom ] ")" -required-atom = mark / expunge / mark-and-expunge / files / - exclude-files / read-only / touched -optional-atom = adapt / local / eval -mark = "mark" space nil-or-number -nil-or-number = "nil" / -expunge = "expunge" space nil-or-number -mark-and-expunge = "mark-and-expunge" space nil-or-number -files = "files" *[ space ] -exclude-files = "exclude-files" *[ space ] -read-only = "read-only" [ space "nil" / space "t" ] -adapt = "adapt" [ space "ignore" / space "t" / space adapt-rule ] -adapt-rule = "(" *[ *[ "(" ")" ] ")" -local = "local" *[ space "(" space ")" ] -eval = "eval" space -space = *[ " " / / ] -@end example - -$B%9%3%"%U%!%$%k$NG'<1IT2DG=$JMWAG$OL5;k$5$l$k$Y$-$G$9$,!"o$KIiC4$N$+$1$i$l$9$.$?8l$G$9!#(B -``$B%X%C%@!<(B'' $B$O(B RFC1036 $B$G$O5-;v$NF,$N9T$N;v(B ($BNc$($P!"(B@code{From}) $B$rOC(B -$B$9$N$KMQ$$$i$l$F$$$^$9!#$=$l$OB?$/$N?M$+(B -$B$i(B ``$B%X%C%I(B''---``$B%X%C%@!<$HK\BN(B'' $B$NF15A8l$H$7$F;H$o$l$F$$$^$9!#(B($B$3$l(B -$B$O!";d$N0U8+$G$OHr$1$i$l$k$Y$-$G$9!#(B) $B$=$7$F!"(Bgnus $B$OFbIt$G(B -$B$O(B ``$B%X%C%@!<(B'' $B$H8F$VMM<0$r;H$C$F$*$j!";d$O$3$3$G$=$l$K$D$$$F@bL@$7$^$9!#(B -$B$3$l$O6e$D$NMWAG$+$i$J$k%Y%/%H%k$G!"4pK\E*$K!"$=$l$>$l$N%X%C(B -$B%@!<(B ($B$"DK(B) $B$,0l$D$N6u$->l=j$r@j$a$F$$$^$9!#(B - -$B$3$l$i$N6u$->l=j$O!"=gHV(B -$B$K(B: @code{number}, @code{subject}, @code{from}, @code{date}, @code{id}, @code{chars}, @code{lines}, @code{xref}, @code{extra} $B$G(B -$B$9!#$3$l$i$N6u$->l=j$K?($C$F@_Dj$9$k%^%/%m$,$"$j$^$9(B---$B$=$l$i$OA4$F!"$=(B -$B$l$>$l(B @code{mail-header-} $B$H(B @code{mail-header-set-} $B$$$&M=A[$5$l$kL>A0(B -$B$r;}$C$F$$$^$9!#(B - -@code{extra} $B$N>l=j$O%X%C%@!<(B/$BCM$NBP$NO"A[%j%9%H$G$"$k0J30$O$3$l$i$NA4$F(B -$B$N>l=j$OJ8;zNs$G$9(B (@pxref{To From Newsgroups})$B!#(B - -@node Ranges -@subsection $BHO0O(B - -@sc{gnus} $B$O;d$K$OHs>o$KLr$KN)$D$H;W$o$l$k35G0$rF3F~$7$^$7$?$N$G!";d$O$=(B -$B$l$r$?$/$5$s;H$$!"$+$J$jG0F~$j$K:n$j>e$2$F$-$^$7$?!#(B - -$BZ$5$l$k(B $B$b(B -$B$N(B (object) (@emph{$BMpK=$J(B} $BNc$r5s$2$k$H!"5-;v$,$=$&$G(B -$B$9(B) $B$r(B ``$B4^$^$l$F$$$k(B'' $B$H$7$F8+$J$7$?$$$H$-$O!"IaDL$NO"B3E*9T0Y$O$"$^$j(B -$BLr$KN)$A$^$;$s!#(B($BD9$5(B 200,000 $B$NO"B3J*$O>/$7B)$,D9$9$.$^$9!#(B) - -$B$3$l$N2r7h:v$O/$7e$NMW5a$O2<9_$7$F$$$J$$(B -$B$H$$$&;v$O3P$($F$*$/I,MW$,$"$j$^$9!#(B($BG$0U$N2s?t$NF1$8?t;z$N7+$jJV$7$O5v(B -$B$5$l$F$$$^$9$,!"HO0O$N07$$$+$i$O>C$(5n$k798~$,$"$j$^$9!#(B) - -@example -range = simple-range / normal-range -simple-range = "(" number " . " number ")" -normal-range = "(" start-contents ")" -contents = "" / simple-range *[ " " contents ] / - number *[ " " contents ] -@end example - -Gnus $B$O8=:_$N$H$3$m4{FI5-;v$H5-;v$N0u$N>pJs$rIU$1$F$*$/$?$a$KHO0O$r;H$C(B -$B$F$$$^$9!#;d$O(B $B$5$J$$$G@$$NCf$r40A4$KHO0O$K4p$E$$$?$b$N$K$9$k(B -$B$?$a$K$b$&>/$79M$($kI,MW$,$"$k$+$i$G$9!#(B) - -@node Group Info -@subsection $B%0%k!<%W>pJs(B - -Gnus $B$O%0%k!<%W$NA4$F$N1JB3>pJs$r(B @dfn{group info} $B%j%9%H$KJ]B8$7$^$9!#(B -$B$3$N%j%9%H$ND9$5$O(B 3 $B$+$i(B 6 ($B$b$7$/$O$b$C$H(B) $B$NMWAG$GE0DlE*$K%0%k!<%W$r(B -$B5-=R$7$^$9!#(B - -$B$3$3$K$"$k$N$O%0%k!<%W>pJs(B (group info) $B$NFs$D$NNc$G$9!#0l$D$OHs>o$KC1=c(B -$B$J%0%k!<%W$G!"Fs$D$a$O$b$C$HJ#;($J$b$N$G$9(B: - -@example -("no.group" 5 ((1 . 54324))) - -("nnml:my.mail" 3 ((1 . 5) 9 (20 . 55)) - ((tick (15 . 19)) (replied 3 6 (19 . 3))) - (nnml "") - ((auto-expire . t) (to-address . "ding@@gnus.org"))) -@end example - -$B:G=i$NMWAG$O(B @dfn{$B%0%k!<%WL>(B} $B$G$9(B---$B$I$N$h$&$K$7$m!"(Bgnus $B$,$=$l$K$h$C$F(B -$B%0%k!<%W$rCN$C$F$$$k$b$N$G$9!#FsHVL\$NMWAG$O(B @dfn{$B9XFIEY(B} $B$G!"IaDL$O>.$5(B -$B$J@0?t$G$9!#(B($B$=$l$O(B @dfn{$B3,5i(B} $B$K$J$k;v$b$G$-$^$9!#$=$l$O!"%3%s%9%;%k$G!"(B -@code{car} $B$,%l%Y%k$G!"(B@code{cdr} $B$,%9%3%"$G$9!#(B) $B;0HVL\$NMWAG$O4{FI5-;v(B -$B$NHO0O$N%j%9%H$G$9!#;MHVL\$NMWAG$O$$$m$$$m$Je$N%5!<%P!<$G$9(B)$B!#O;HVL\$NMWAG$O(B @dfn{$B%0%k!<%W%Q%i%a!<%?(B} $B$N%j%9%H(B -$B$G!"$3$NItJ,$O$=$N$?$a$K$"$j$^$9!#(B - -$B:G8e$N;0$D$NMWAG$O$I$l$G$b!"I,MW$,L5$1$l$PB8:_$7$J$$;v$b$"$j$^$9!#o$KBgItJ,$O:G=i$N;0$D$NMWAG$@$1$r;}$A!"$=$l$O$?$/$5$s$N%3%s(B -$B%9%;%k$r@aLs$9$k;v$,$G$-$^$9!#(B - -$B$3$l$O%0%k!<%W>pJsMM<0$N(B BNF $BDj5A$G$9(B: - -@example -info = "(" group space ralevel space read - [ "" / [ space marks-list [ "" / [ space method [ "" / - space parameters ] ] ] ] ] ")" -group = quote quote -ralevel = rank / level -level = -rank = "(" level "." score ")" -score = -read = range -marks-lists = nil / "(" *marks ")" -marks = "(" range ")" -method = "(" *elisp-forms ")" -parameters = "(" *elisp-forms ")" -@end example - -$B} $B$,(B @samp{range} $B$N>e$K9=@.$5$l$F$$$k$b$N(B -$B$G$9$,!"5?;w(B BNF $B$G$=$l$r8=$9$N$OITL{2w$J$b$N$G$9!#(B - -$B$b$7(B gnus $B>pJs$r;}$C$F$$$F!"MWAG$rD4$Y$?$$$N$H$-$O!"(Bgnus $B$O$=$l$i$NMWAG(B -$B$r$rpJs$N%j%9%H$G$9!#@_Dj4X?t$OFs$D(B -$B$N0z?t$rpJs%j%9%H$H?7$7$$CM$G$9!#(B - -$B%0%k!<%W>pJs$N:G8e$N;0$D$NMWAG$O6/@)E*$J$b$N$G$O$"$j$^$;$s$N$G!"MWAG$r@_(B -$BDj$9$kA0$K%0%k!<%W>pJs$r3HD%$9$kI,MW$,$"$k$+$bCN$l$^$;$s!#$b$7$3$l$,I,MW(B -$B$J>l9g$O!"$3$l$,<+F0E*$K5/$3$k$?$a$K(B @code{nil} $B$G$J$$;0HVL\$N0z?t$r;0$D(B -$B$N:G=*@_Dj4X?t$KM?$($k$@$1$G$9!#(B - -@node Extended Interactive -@subsection $B3HD%BPOC(B -@cindex interactive -@findex gnus-interactive - -Gnus $B$O(B Emacs $B$NI8=`$N(B @code{interactive} $B;XDj$r%7%s%\%k@\F,<-$r4JC1$K;H(B -$B$($k$?$a$K>/$73HD%$7$F$$$^$9(B (@pxref{Symbolic Prefixes})$B!#$3$l$O$=$N;H$$(B -$BJ}$NNc$G$9(B: - -@lisp -(defun gnus-summary-increase-score (&optional score symp) - (interactive (gnus-interactive "P\ny")) - ... - ) -@end lisp - -$B:G>e$NJ}K!$O(B @code{gnus-interactive} $B$r<0(B @code{interactive} $B$rJV$9%^%/(B -$B%m$H$7$F/$72C$($^$9!#(B - -@table @samp -@item y -@vindex gnus-current-prefix-symbol -$B8=:_$N@\F,0z?t%7%s%\%k(B---$BJQ?t(B @code{gnus-current-prefix-symbol} $B$G$9!#(B - -@item Y -@vindex gnus-current-prefix-symbols -$B8=:_$N@\F,0z?t%7%s%\%k$N%j%9%H$G$9(B---$BJQ(B -$B?t(B @code{gnus-current-prefix-symbol} $B$G$9!#(B - -@item A -$B8=:_$N5-;vHV9f$G$9(B---$B4X?t(B @code{gnus-summary-article-number} $B$G$9!#(B - -@item H -$B8=:_$N5-;v%X%C%@!<$G$9(B---$B4X?t(B @code{gnus-summary-article-header} $B$G$9!#(B - -@item g -$B8=:_$N%0%k!<%WL>$G$9(B---$B4X?t(B @code{gnus-group-group-name} $B$G$9!#(B -@end table - -@node Emacs/XEmacs Code -@subsection Emacs/XEmacs $B%3!<%I(B -@cindex XEmacs -@cindex Emacsen - -Gnus $B$O(B Emacs, XEmacs $B$H(B Mule $B$GF0:n$7$^$9$N$G!"$=$N$&$A$N0l$D$ro$KLr$KN)$A$^$9!#(B - -$B;d$O7QB3E*$K(B Emacs $B$N4X?t$N3&LL(B (interface) $B$r;H$C$F$-$^$7$?$,!"4X?t$K(B -$B$O(B gnus $B$NJLL>4X?t(B (alias) $B$r;H$C$F$-$^$7$?!#Nc$r=P$7$^$7$g$&(B: Emacs $B$O(B -$B4X?t(B @code{run-at-time} $B$rDj5A$7$F$$$^$9$,!"(BXEmacs $B$O4X(B -$B?t(B @code{start-itimer} $B$rDj5A$7$F$$$^$9!#$=$3$G;d(B -$B$O(B @code{gnus-run-at-time} $B$H8F$P$l$k4X?t$rDj5A$7!"$=$l(B -$B$O(B Emacs $B$N(B @code{run-at-time} $B$HF1$80z?t$r4X?t(B (alias) $B$K$J$C$F$$$^(B -$B$9!#$7$+$7!"(BXEmacs $B$G4X?t(B (alias) $B$H(B -$B$J$C$F$$$^$9(B: - -@lisp -(defun gnus-xmas-run-at-time (time repeat function &rest args) - (start-itimer - "gnus-run-at-time" - `(lambda () - (,function ,@@args)) - time repeat)) -@end lisp - -$B$3$Nl9g$O!";d$OBe$o$j$K$=$l$r;H$$$^(B -$B$9!#Nc$($P!"(B@code{gnus-region-active-p} $B$O(B XEmacs $B$G(B -$B$O(B @code{region-active-p} $B$NJLL>$G$"$k$N$KBP$7$F!"(BEmacs $B$G$O4X?t$G$9!#(B - -$B$b$A$m$s!";d$O(B XEmacs $B$r;d$N4pK\%W%i%C%H%U%)!<%`$KA*$s$G!"4X?t$N3d$jEv$F(B -$B$r5U$K$9$k;v$b$G$-$^$7$?!#$G$b!";d$O$=$&$7$^$;$s$G$7$?!#(B -XEmacs $B$G(B gnus $B$r/$7$G(B -$B$7$g$&!#(B - -@node Various File Formats -@subsection $B$$$m$$$m$J%U%!%$%kMM<0(B - -@menu -* Active File Format:: $B;HMQ2DG=$J5-;v%0%k!<%W$N>pJs(B -* Newsgroups File Format:: $B%0%k!<%W$N5-=R(B -@end menu - -@node Active File Format -@subsubsection $B%"%/%F%$%V%U%!%$%kMM<0(B - -$B%"%/%F%#%V%U%!%$%k$OEv$N%5!<%P!<$NA4$F$N;HMQ2DG=$J%0%k!<%W$N0lMw$r5s$2$^(B -$B$9!#$=$l$O$=$l$>$l$N%0%k!<%W$N:GDc$H:G9b$N5-;vHV9f$N0lMw$b$"$j$^$9!#(B - -$B$3$l$OIaDL$N%"%/%F%#%V%U%!%$%k$+$i$NH4?h$G$9(B: - -@example -soc.motss 296030 293865 y -alt.binaries.pictures.fractals 3922 3913 n -comp.sources.unix 1605 1593 m -comp.binaries.ibm.pc 5097 5089 y -no.general 1000 900 y -@end example - -$B$3$l$O$3$N%U%!%$%k$N5?;w(B BNF $BDj5A$G$9!#(B - -@example -active = *group-line -group-line = group spc high-number spc low-number spc flag -group = -spc = " " -high-number = -low-number = -flag = "y" / "n" / "m" / "j" / "x" / "=" group -@end example - -$B$3$N%U%!%$%k$N40A4$J5-=R$rF@$k$?$a$K$O!"(B@samp{innd} $B$N%^%K%e%"%kJG!"FC(B -$B$K(B @samp{active(5)} $B$r8+$F2<$5$$!#(B - -@node Newsgroups File Format -@subsubsection $B%K%e!<%9%0%k!<%W%U%!%$%kMM<0(B - -$B%K%e!<%9%0%k!<%W%U%!%$%k$O%0%k!<%W$r$=$N5-=R$H6&$K0lMw$r5s$2$^$9!#%5!<%P!<(B -$B$K$"$kA4$F$N%0%k!<%W$,0lMw$K$5$l$J$1$l$P$J$i$J$$$N$G$O$J$/!"$^$?!"%U%!%$(B -$B%k$NA4$F$N%0%k!<%W$,%5!<%P!<$KB8:_$7$J$1$l$P$J$i$J$$$N$G$O$"$j$^$;$s!#$3(B -$B$N%U%!%$%k$O=c?h$KMxMQpJs$N$?$a$K$"$j$^$9!#(B - -$BMM<0$OHs>o$K4JC1$G$9(B: $B%0%k!<%WL>!"%?%V!"$=$7$F5-=R$G$9!#$3$l$ODj5A$G$9(B: - -@example -newsgroups = *line -line = group tab description -group = -tab = -description = -@end example - -@page -@node Emacs for Heathens -@section $B0[65EL$X$N(B Emacs - -$B?.$8$k$+$I$&$+$OCN$j$^$;$s$,!"(Bgnus $B$r;H$&?M$NCf$K$O(B Gnus Love Boat $B$G$N(B -$BN9$KEk>h$9$kA0$K$"$^$j(B Emacs $B$r;H$C$?;v$,L5$$$H$$$&?M$,$$$^$9!#$b$7$"$J(B -$B$?$,(B ``@kbd{M-C-a}'' $B$d(B ``$B%j!<%8%g%s$r@Z$k(B''$B!"$=$7(B -$B$F(B ``@code{gnus-flargblossen} $B$rO"A[%j%9%H$K@_Dj$7$F$/$@$5$$!#$=$N%-!<$O(B -$B%0%k!<%WL>$K9gCW$9$k$?$a$K;H$o$l$k@55,I=8=$G$9(B'' $B$,>/$7$N0UL#$+A4$/0UL#(B -$B$NL5$$KbK!$N8@MU$G$"$kIT9,$J?M$G$"$l$P!"$3$NIUO?$O$"$J$?$N$?$a$K$"$j$^$9!#(B -$B$b$7$"$J$?$,4{$K(B Emacs $B$K?F$7$s$G$$$k$N$G$"$l$P!"$3$l$rL5;k$7$FO$rF~NO$7$FL?Na$ro$K$&$k$5$/46$8$i$l$k$G$7$g$&!#;D$j$N?M!9$O!"$=(B -$B$l$K$h$j$b$?$i$5$l$kCO9v$r0&$7$^$9!#$"$-$i$a$FI~=>$7$F2<$5$$!#(BEmacs $B$OK\(B -$BEv$O(B ``Escape-Meta-Alt-Control-Shift'' $B$NN,$G!"B>$NI>H=$N0-$$=P(B -$B=j(B (Emacs $B$N:n.;X$N6a$/$K0LCV$7$F$*$j!"IaDL$OBgJ8;z$d$=$NB>$N$b$rF@(B -$B$k$?$a$K;H$o$l$^$9!#$"$J$?$O$:$C$H$=$l$r;H$&;v$G$7$g$&!#%3%s%H%m!<%k%-!<(B -$B$OIaDL$O(B ``CTRL'' $B$d$=$N$h$&$J$b$N$G0u$,IU$$$F$$$^$9!#%a%?%-!<$O!"$*$b$7(B -$B$m$$;v$K!"$I$N%-!<%\!<%I$G$b$=$N$h$&$K0u$,IU$1$i$l$F$$$^$;$s!#$=$l$OIaDL(B -$B$O%-!<%\!<%I$N:8/$7J#;($K$J$C$F$$$^$9!#$=$N$h$&$J>l9g$O!"(B``$B%(%9%1!<%W(B'' $B%-!<$r;H$&;v$,(B -$B$G$-$^$9!#$=$l$O%a%?%-!<$r;}$C$F$$$k$H$-$h$j$b$C$H:n6H$,BgJQ$K$J$j$^$9$N(B -$B$G!"$=$&$$$&>l9g$O!";d$O%a%?%-!<$N$"$k%-!<%\!<%I$r$l$NA4$F$N%-!<$O2?$i$+$N(B Emacs Lisp $B$N%3!<%I$N(B -$B>.JR$r/$J$/$H$b(B Lisp $B%3!<%I$N=q$-J}$rCN$C$F$$$l$P!#(B) $B$7$+$7!"$=$l$O$3$N%^(B -$B%K%e%"%k$NHO0O30$J$N$G!"2f!9$OC1$K(B gnus $B$r%+%9%?%^%$%:$9$k$?$a$K%U%!%$(B -$B%k(B @file{.emacs} $B$GIaDL;H$o$l$k$$$/$D$+$NIaDL$N9=J8$K$D$$$F$@$1OC$r$7$^(B -$B$9!#(B - -$B$b$7JQ?t(B@code{gnus-florgbnize} $B$r;M(B (4) $B$K@_Dj$7$?$$$N$G$"$l$P!"0J2<$N$b(B -$B$N$r=q$-$^$9(B: - -@lisp -(setq gnus-florgbnize 4) -@end lisp - -$B$3$N4X?t(B @code{setq} ($BK\Ev$O(B ``$BFC2A(B} ($B$=$l$O(B ``$B2A(B} $B$7!"$=$l$O$3$3$G$O4JC1$J(B @code{setq} $BJ8$G$9!#(B - -$B$,$s$P$C$F(B---$B$b$7$"$J$?$,(B Emacs $B$NA0$K$"$k$N$G$"$l$P$A$g$C$H;n$7$F2<$5$$!#(B -@kbd{C-x C-e} $B$N8e$G!"H?6A6h0h(B (echo area) $B$K(B @samp{4} $B$,8=$o$l$k$N$,8+(B -$B$($k$G$7$g$&!#$=$l$O$"$J$?$,(B @code{$BI>2A(B} $B$7$?<0$NJV$jCM$G$9!#(B - -$B$$$/$D$+$NMn$H$77j(B: - -$B$b$7%^%K%e%"%k$,(B ``@code{gnus-read-active-file} $B$r(B @code{some} $B$K@_Dj$7(B -$B$J$5$$(B'' $B$H8@$C$?$J$i!"$=$l$O(B: - -@lisp -(setq gnus-read-active-file 'some) -@end lisp - -$B$H8@$&;v$G$9!#(B - -$B0lJ}!"%^%K%e%"%k(B -$B$,(B ``@code{gnus-nntp-server} $B$r(B @samp{nntp.ifi.uio.no} $B$K@_Dj$7$J$5$$(B'' $B$H(B -$B8@$C$?$J$i!"$=$l$O(B: - -@lisp -(setq gnus-nntp-server "nntp.ifi.uio.no") -@end lisp - -$B$H8@$&;v$G$9!#(B - -$B$G$9$+$i!"J8;zNs(B ($B8eu%U%!%$%k!"%"%/%F%#%V%U%!%$%k(B -adapt $BE,MQ(B -adaptive $BE,1~@-(B -address $B%"%I%l%9(B -agent $B%(!<%8%'%s%H(B -alist $BO"A[%j%9%H(B -alternate $BBeBX(B -anything group $B$J$s$G$b%0%k!<%W(B -archive $B%"!<%+%$%V(B -asterisk $B%"%9%?%j%9%/(B -auto-save file $B<+F0J]B8%U%!%$%k(B -backend $B%P%C%/%(%s%I(B -batch $B0l3g(B -bogus group $B56%0%k!<%W(B -browse $B%V%i%&%:!";2>H!"354Q(B -buffer $B%P%C%U%!(B -buggy $B8N>c$,$A(B -category $BJ,N`(B -collapsed group name $BC;=L%0%k!<%WL>(B -combined groups $B7k9g%0%k!<%W(B -command $BL?Na(B -command line $B%3%^%s%I9T(B -configure (shell script) $B4D6-@_Dj(B -copy $B%3%T!C5n!"4|8B@Z$l:o=|(B -expunge $B>C5n(B -field $B%U%#!<%k%I(B -firewall $BKIJI(B -flush cache $B%-%c%C%7%e$r=q$-9~$`(B -follow up $B%U%)%m!<%"%C%W(B -foreign $B30It(B -format $BMM<0!"%U%)!<%^%C%H(B -frame $B%U%l!<%`(B -gateway $B%2!<%H%&%'%$(B -global $B%0%m!<%P%k(B -Gnus gnus -group buffer $B%0%k!<%W%P%C%U%!(B -header $B%X%C%@!<(B -highlight $B%O%$%i%$%H(B -history $BMzNr(B -home score file $B%[!<%`%9%3%"%U%!%$%k(B -hook $B%U%C%/(B -inbox $B%$%s%\%C%/%9(B -indentation $B;z2<$2(B -interactive command $BBPOCL?Na(B -interface $B%$%s%?!<%U%'!<%9(B -kiboze kiboze -key (alist) $B%-!<(B -keymap $B%-!<%^%C%W(B -kiboze kiboze -kill $B:o=|!"@Z$k!"%-%k(B -kill file $B:o=|%U%!%$%k!"(B($B>C5n%U%!%$%k(B) -level $B%l%Y%k(B -load $B%m!<%I(B -local variable $B6I=jJQ?t!"%m!<%+%kJQ?t(B -lower lebel $B>.$5$$%l%Y%k(B -mail $B%a!<%k(B -mailbox $B%a!<%k%\%C%/%9(B -mail-to-news gateway $B%a!<%k$+$i%K%e!<%:$X$N%2!<%H%&%'%$(B -mark $B0u(B -meta-variable $B%a%?JQ?t(B -message $B%a%C%;!<%8(B -method $BJ}K!(B -minor mode $B%^%$%J!<%b!<%I(B -modeline $B%b!<%I9T(B -moderated $B%b%G%l!<%F%C%I!"=$@5$5$l$?(B -native $B4pK\(B -native method $B4pK\J}K!(B -native server $B4pK\%5!<%P!<(B -news $B%K%e!<%9(B ($B%K%e!<%:(B) -newsgroup $B%K%e!<%9%0%k!<%W(B ($B%K%e!<%:%0%k!<%W(B) -news reader $B%K%e!<%9%j!<%@(B -numeric prefix $B?t;z@\F,0z?t(B -operator $B:nMQ;R(B -outgoing $B:9=PMQ(B -overview $B354Q%U%!%$%k(B -pack $B:-Jq$9$k(B -parameter $B%Q%i%a!<%?(B -plugged $B:9$79~$_(B -point $B%]%$%s%H!"%+!<%=%k0LCV(B -predicate function $B=R8l4X?t(B -prefix $B@\F,0z?t(B -process $B%W%m%;%9(B -process mark ($B%W%m%;%9%^!<%/(B)$B!"%W%m%;%90u(B -process/prefix convention $B%W%m%;%9(B/$B@\F,0z?t$N=,47(B ($B%W%m%;%9%^!<%/!&%W%l%U%#%C%/%9%k!<%k(B) -prompt $BF~NOB%?J(B -rank $B%i%s%/(B -region ($B%j!<%8%g%s(B) -release $B%j%j!<%9(B -remote system $B1s3V%7%9%F%`(B -reply packet $BJV?.%Q%1%C%H(B -response packet $BJV?.%Q%1%C%H(B -startup file $B5/F0%U%!%$%k(B -score $B%9%3%"(B -score entry $B%9%3%"EPO?(B -secondary server $BFs%s%S(B - -summary $B35N,(B -body $B%\%G%#(B -head $B%X%C%@!<(B -subject $BI=Bj(B -match $B%^%C%A(B -encode $BId9f2=(B -character set $BJ8;z=89g(B -hook $B%U%C%/(B -keystroke $B%-! #1}} - -\newcommand{\gnusbullet}{{${\bullet}$}} -\newcommand{\gnusdollar}{\$} -\newcommand{\gnusampersand}{\&} -\newcommand{\gnuspercent}{\%} -\newcommand{\gnushash}{\#} -\newcommand{\gnushat}{\symbol{"5E}} -\newcommand{\gnusunderline}{\symbol{"5F}} -\newcommand{\gnusnot}{$\neg$} -\newcommand{\gnustilde}{\symbol{"7E}} -\newcommand{\gnusless}{{$<$}} -\newcommand{\gnusgreater}{{$>$}} -\newcommand{\gnusbraceleft}{{$>$}} -\newcommand{\gnusbraceright}{{$>$}} - -\newcommand{\gnushead}{\raisebox{-1cm}{\epsfig{figure=ps/gnus-head.eps,height=1cm}}} -\newcommand{\gnusinteresting}{ -\marginpar[\mbox{}\hfill\gnushead]{\gnushead} -} - -\newcommand{\gnuscleardoublepage}{\ifodd\count0\mbox{}\clearpage\thispagestyle{empty}\mbox{}\clearpage\else\clearpage\fi} - -\newcommand{\gnuspagechapter}[1]{ -{\mbox{}} -} - -\newdimen{\gnusdimen} -\gnusdimen 0pt - -\newcommand{\gnuschapter}[2]{ -\gnuscleardoublepage -\ifdim \gnusdimen = 0pt\setcounter{page}{1}\pagestyle{gnus}\pagenumbering{arabic} \gnusdimen 1pt\fi -\chapter{#2} -\renewcommand{\gnussectionname}{} -\renewcommand{\gnuschaptername}{#2} -\thispagestyle{empty} -\hspace*{-2cm} -\begin{picture}(500,500)(0,0) -\put(480,350){\makebox(0,0)[tr]{#1}} -\put(40,300){\makebox(500,50)[bl]{{\Huge\bf{#2}}}} -\end{picture} -\clearpage -} - -\newcommand{\gnusfigure}[3]{ -\begin{figure} -\mbox{}\ifodd\count0\hspace*{-0.8cm}\else\hspace*{-3cm}\fi\begin{picture}(440,#2) -#3 -\end{picture} -\caption{#1} -\end{figure} -} - -\newcommand{\gnusicon}[1]{ -\marginpar[\mbox{}\hfill\raisebox{-1.5cm}{\epsfig{figure=tmp/#1-up.ps,height=1.5cm}}]{\raisebox{-1cm}{\epsfig{figure=tmp/#1-up.ps,height=1cm}}} -} - -\newcommand{\gnuspicon}[1]{ -\margindex{\epsfig{figure=#1,width=2cm}} -} - -\newcommand{\gnusxface}[2]{ -\margindex{\epsfig{figure=#1,width=1cm}\epsfig{figure=#2,width=1cm}} -} - -\newcommand{\gnussmiley}[2]{ -\margindex{\makebox[2cm]{\hfill\epsfig{figure=#1,width=0.5cm}\hfill\epsfig{figure=#2,width=0.5cm}\hfill}} -} - -\newcommand{\gnusitemx}[1]{\mbox{}\vspace*{-\itemsep}\vspace*{-\parsep}\item#1} - -\newcommand{\gnussection}[1]{ -\renewcommand{\gnussectionname}{#1} -\section{#1} -} - -\newenvironment{codelist}% -{\begin{list}{}{ -} -}{\end{list}} - -\newenvironment{kbdlist}% -{\begin{list}{}{ -\labelwidth=0cm -} -}{\end{list}} - -\newenvironment{dfnlist}% -{\begin{list}{}{ -} -}{\end{list}} - -\newenvironment{stronglist}% -{\begin{list}{}{ -} -}{\end{list}} - -\newenvironment{samplist}% -{\begin{list}{}{ -} -}{\end{list}} - -\newenvironment{varlist}% -{\begin{list}{}{ -} -}{\end{list}} - -\newenvironment{emphlist}% -{\begin{list}{}{ -} -}{\end{list}} - -\newlength\gnusheadtextwidth -\setlength{\gnusheadtextwidth}{\headtextwidth} -\addtolength{\gnusheadtextwidth}{1cm} - -\newpagestyle{gnuspreamble}% -{ -{ -\ifodd\count0 -{ -\hspace*{-0.23cm}\underline{\makebox[\gnusheadtextwidth]{\mbox{}}\textbf{\hfill\roman{page}}} -} -\else -{ -\hspace*{-3.25cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\roman{page}\hfill\mbox{}}} -} -} -\fi -} -} -{ -\ifodd\count0 -\mbox{} \hfill -\raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo.eps,height=1cm}} -\else -\raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo.eps,height=1cm}} -\hfill \mbox{} -\fi -} - -\newpagestyle{gnusindex}% -{ -{ -\ifodd\count0 -{ -\hspace*{-0.23cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\gnuschaptername\hfill\arabic{page}}}} -} -\else -{ -\hspace*{-3.25cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\arabic{page}\hfill\gnuschaptername}}} -} -\fi -} -} -{ -\ifodd\count0 -\mbox{} \hfill -\raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo.eps,height=1cm}} -\else -\raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo.eps,height=1cm}} -\hfill \mbox{} -\fi -} - -\newpagestyle{gnus}% -{ -{ -\ifodd\count0 -{ -\makebox[12cm]{\hspace*{3.1cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\arabic{chapter}.\arabic{section}} \textbf{\gnussectionname\hfill\arabic{page}}}}} -} -\else -{ -\makebox[12cm]{\hspace*{-2.95cm}\underline{\makebox[\gnusheadtextwidth]{\textbf{\arabic{page}\hfill\gnuschaptername}}}} -} -\fi -} -} -{ -\ifodd\count0 -\mbox{} \hfill -\raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo.eps,height=1cm}} -\else -\raisebox{-0.5cm}{\epsfig{figure=ps/gnus-big-logo.eps,height=1cm}} -\hfill \mbox{} -\fi -} - -\pagenumbering{roman} -\pagestyle{gnuspreamble} - -@end iflatex -@end iftex - -@iftex -@iflatex -\begin{titlepage} -{ - -%\addtolength{\oddsidemargin}{-5cm} -%\addtolength{\evensidemargin}{-5cm} -\parindent=0cm -\addtolength{\textheight}{2cm} - -\gnustitle{\gnustitlename}\\ -\rule{15cm}{1mm}\\ -\vfill -\hspace*{0cm}\epsfig{figure=ps/gnus-big-logo.eps,height=15cm} -\vfill -\rule{15cm}{1mm}\\ -\gnusauthor{by Lars Magne Ingebrigtsen} -\newpage -} - -\mbox{} -\vfill - -\thispagestyle{empty} - -Copyright \copyright{} 1995, 1996, 1997, 1998, 1999, 2000 -Free Software Foundation, Inc. - - -Permission is granted to copy, distribute and/or modify this document -under the terms of the GNU Free Documentation License, Version 1.1 or -any later version published by the Free Software Foundation; with no -Invariant Sections, with the Front-Cover texts being ``A GNU -Manual'', and with the Back-Cover Texts as in (a) below. A copy of the -license is included in the section entitled ``GNU Free Documentation -License'' in the Emacs manual. - -(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify -this GNU Manual, like GNU software. Copies published by the Free -Software Foundation raise funds for GNU development.'' - -This document is part of a collection distributed under the GNU Free -Documentation License. If you want to distribute this document -separately from the collection, you can do so by adding a copy of the -license to the document, as described in section 6 of the license. -\newpage -\end{titlepage} -@end iflatex -@end iftex - -@ifnottex - -This file documents gnus, the GNU Emacs newsreader. - -Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc. - -Permission is granted to copy, distribute and/or modify this document -under the terms of the GNU Free Documentation License, Version 1.1 or -any later version published by the Free Software Foundation; with the -Invariant Sections being none, with the Front-Cover texts being ``A GNU -Manual'', and with the Back-Cover Texts as in (a) below. A copy of the -license is included in the section entitled ``GNU Free Documentation -License'' in the Emacs manual. - -(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify -this GNU Manual, like GNU software. Copies published by the Free -Software Foundation raise funds for GNU development.'' - -This document is part of a collection distributed under the GNU Free -Documentation License. If you want to distribute this document -separately from the collection, you can do so by adding a copy of the -license to the document, as described in section 6 of the license. -@end ifnottex - -@tex - -@titlepage -@title T-gnus 6.15 Manual - -@author by Lars Magne Ingebrigtsen -@page - -@vskip 0pt plus 1filll -Copyright @copyright{} 1995, 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc. - -Permission is granted to copy, distribute and/or modify this document -under the terms of the GNU Free Documentation License, Version 1.1 or -any later version published by the Free Software Foundation; with no -Invariant Sections, with the Front-Cover texts being ``A GNU -Manual'', and with the Back-Cover Texts as in (a) below. A copy of the -license is included in the section entitled ``GNU Free Documentation -License'' in the Emacs manual. - -(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify -this GNU Manual, like GNU software. Copies published by the Free -Software Foundation raise funds for GNU development.'' - -This document is part of a collection distributed under the GNU Free -Documentation License. If you want to distribute this document -separately from the collection, you can do so by adding a copy of the -license to the document, as described in section 6 of the license. - -@end titlepage -@page - -@end tex - - -@node Top -@top The gnus Newsreader - -@ifinfo - -You can read news (and mail) from within Emacs by using gnus. The news -can be gotten by any nefarious means you can think of---@sc{nntp}, local -spool or your mbox file. All at the same time, if you want to push your -luck. - -T-gnus provides MIME features based on SEMI API. So T-gnus supports -your right to read strange messages including big images or other -various kinds of formats. T-gnus also supports -internationalization/localization and multiscript features based on MULE -API. So T-gnus does not discriminate various language communities. -Oh, if you are a Klingon, please wait Unicode Next Generation. - -This manual corresponds to T-gnus 6.15. - -@end ifinfo - -@iftex - -@iflatex -\tableofcontents -\gnuscleardoublepage -@end iflatex - -Gnus is the advanced, self-documenting, customizable, extensible -unreal-time newsreader for GNU Emacs. - -Oops. That sounds oddly familiar, so let's start over again to avoid -being accused of plagiarism: - -Gnus is a message-reading laboratory. It will let you look at just -about anything as if it were a newsgroup. You can read mail with it, -you can browse directories with it, you can @code{ftp} with it---you -can even read news with it! - -Gnus tries to empower people who read news the same way Emacs empowers -people who edit text. Gnus sets no limits to what the user should be -allowed to do. Users are encouraged to extend gnus to make it behave -like they want it to behave. A program should not control people; -people should be empowered to do what they want by using (or abusing) -the program. - -@end iftex - -@menu -* Starting Up:: Finding news can be a pain. -* Group Buffer:: Selecting, subscribing and killing groups. -* Summary Buffer:: Reading, saving and posting articles. -* Article Buffer:: Displaying and handling articles. -* Composing Messages:: Information on sending mail and news. -* Select Methods:: Gnus reads all messages from various select methods. -* Scoring:: Assigning values to articles. -* Various:: General purpose settings. -* The End:: Farewell and goodbye. -* Appendices:: Terminology, Emacs intro, FAQ, History, Internals. -* Index:: Variable, function and concept index. -* Key Index:: Key Index. - -@detailmenu - --- The Detailed Node Listing --- - -Starting Gnus - -* Finding the News:: Choosing a method for getting news. -* The First Time:: What does Gnus do the first time you start it? -* The Server is Down:: How can I read my mail then? -* Slave Gnusae:: You can have more than one Gnus active at a time. -* Fetching a Group:: Starting Gnus just to read a group. -* New Groups:: What is Gnus supposed to do with new groups? -* Changing Servers:: You may want to move from one server to another. -* Startup Files:: Those pesky startup files---@file{.newsrc}. -* Auto Save:: Recovering from a crash. -* The Active File:: Reading the active file over a slow line Takes Time. -* Startup Variables:: Other variables you might change. - -New Groups - -* Checking New Groups:: Determining what groups are new. -* Subscription Methods:: What Gnus should do with new groups. -* Filtering New Groups:: Making Gnus ignore certain new groups. - -Group Buffer - -* Group Buffer Format:: Information listed and how you can change it. -* Group Maneuvering:: Commands for moving in the group buffer. -* Selecting a Group:: Actually reading news. -* Subscription Commands:: Unsubscribing, killing, subscribing. -* Group Data:: Changing the info for a group. -* Group Levels:: Levels? What are those, then? -* Group Score:: A mechanism for finding out what groups you like. -* Marking Groups:: You can mark groups for later processing. -* Foreign Groups:: Creating and editing groups. -* Group Parameters:: Each group may have different parameters set. -* Listing Groups:: Gnus can list various subsets of the groups. -* Sorting Groups:: Re-arrange the group order. -* Group Maintenance:: Maintaining a tidy @file{.newsrc} file. -* Browse Foreign Server:: You can browse a server. See what it has to offer. -* Exiting Gnus:: Stop reading news and get some work done. -* Group Topics:: A folding group mode divided into topics. -* Misc Group Stuff:: Other stuff that you can to do. - -Group Buffer Format - -* Group Line Specification:: Deciding how the group buffer is to look. -* Group Modeline Specification:: The group buffer modeline. -* Group Highlighting:: Having nice colors in the group buffer. - -Group Topics - -* Topic Variables:: How to customize the topics the Lisp Way. -* Topic Commands:: Interactive E-Z commands. -* Topic Sorting:: Sorting each topic individually. -* Topic Topology:: A map of the world. -* Topic Parameters:: Parameters that apply to all groups in a topic. - -Misc Group Stuff - -* Scanning New Messages:: Asking Gnus to see whether new messages have arrived. -* Group Information:: Information and help on groups and Gnus. -* Group Timestamp:: Making Gnus keep track of when you last read a group. -* File Commands:: Reading and writing the Gnus files. - -Summary Buffer - -* Summary Buffer Format:: Deciding how the summary buffer is to look. -* Summary Maneuvering:: Moving around the summary buffer. -* Choosing Articles:: Reading articles. -* Paging the Article:: Scrolling the current article. -* Reply Followup and Post:: Posting articles. -* Delayed Articles:: -* Marking Articles:: Marking articles as read, expirable, etc. -* Limiting:: You can limit the summary buffer. -* Threading:: How threads are made. -* Sorting the Summary Buffer:: How articles and threads are sorted. -* Asynchronous Fetching:: Gnus might be able to pre-fetch articles. -* Article Caching:: You may store articles in a cache. -* Persistent Articles:: Making articles expiry-resistant. -* Article Backlog:: Having already read articles hang around. -* Saving Articles:: Ways of customizing article saving. -* Decoding Articles:: Gnus can treat series of (uu)encoded articles. -* Article Treatment:: The article buffer can be mangled at will. -* MIME Commands:: Doing MIMEy things with the articles. -* Charsets:: Character set issues. -* Article Commands:: Doing various things with the article buffer. -* Summary Sorting:: Sorting the summary buffer in various ways. -* Finding the Parent:: No child support? Get the parent. -* Alternative Approaches:: Reading using non-default summaries. -* Tree Display:: A more visual display of threads. -* Mail Group Commands:: Some commands can only be used in mail groups. -* Various Summary Stuff:: What didn't fit anywhere else. -* Exiting the Summary Buffer:: Returning to the Group buffer, - or reselecting the current group. -* Crosspost Handling:: How crossposted articles are dealt with. -* Duplicate Suppression:: An alternative when crosspost handling fails. -* Security:: Decrypt and Verify. -* Mailing List:: Mailing list minor mode. - -Summary Buffer Format - -* Summary Buffer Lines:: You can specify how summary lines should look. -* To From Newsgroups:: How to not display your own name. -* Summary Buffer Mode Line:: You can say how the mode line should look. -* Summary Highlighting:: Making the summary buffer all pretty and nice. - -Choosing Articles - -* Choosing Commands:: Commands for choosing articles. -* Choosing Variables:: Variables that influence these commands. - -Reply, Followup and Post - -* Summary Mail Commands:: Sending mail. -* Summary Post Commands:: Sending news. -* Summary Message Commands:: Other Message-related commands. -* Canceling and Superseding:: - -Marking Articles - -* Unread Articles:: Marks for unread articles. -* Read Articles:: Marks for read articles. -* Other Marks:: Marks that do not affect readedness. -* Setting Marks:: -* Generic Marking Commands:: -* Setting Process Marks:: - -Marking Articles - -* Setting Marks:: How to set and remove marks. -* Generic Marking Commands:: How to customize the marking. -* Setting Process Marks:: How to mark articles for later processing. - -Threading - -* Customizing Threading:: Variables you can change to affect the threading. -* Thread Commands:: Thread based commands in the summary buffer. - -Customizing Threading - -* Loose Threads:: How Gnus gathers loose threads into bigger threads. -* Filling In Threads:: Making the threads displayed look fuller. -* More Threading:: Even more variables for fiddling with threads. -* Low-Level Threading:: You thought it was over... but you were wrong! - -Decoding Articles - -* Uuencoded Articles:: Uudecode articles. -* Shell Archives:: Unshar articles. -* PostScript Files:: Split PostScript. -* Other Files:: Plain save and binhex. -* Decoding Variables:: Variables for a happy decoding. -* Viewing Files:: You want to look at the result of the decoding? - -Decoding Variables - -* Rule Variables:: Variables that say how a file is to be viewed. -* Other Decode Variables:: Other decode variables. -* Uuencoding and Posting:: Variables for customizing uuencoding. - -Article Treatment - -* Article Highlighting:: You want to make the article look like fruit salad. -* Article Fontisizing:: Making emphasized text look nice. -* Article Hiding:: You also want to make certain info go away. -* Article Washing:: Lots of way-neat functions to make life better. -* Article Buttons:: Click on URLs, Message-IDs, addresses and the like. -* Article Date:: Grumble, UT! -* Article Signature:: What is a signature? -* Article Miscellania:: Various other stuff. - -Alternative Approaches - -* Pick and Read:: First mark articles and then read them. -* Binary Groups:: Auto-decode all articles. - -Various Summary Stuff - -* Summary Group Information:: Information oriented commands. -* Searching for Articles:: Multiple article commands. -* Summary Generation Commands:: -* Really Various Summary Commands:: Those pesky non-conformant commands. - -Article Buffer - -* Hiding Headers:: Deciding what headers should be displayed. -* Using MIME:: Pushing articles through @sc{mime} before reading them. -* Customizing Articles:: Tailoring the look of the articles. -* Article Keymap:: Keystrokes available in the article buffer. -* Misc Article:: Other stuff. - -Composing Messages - -* Mail:: Mailing and replying. -* Posting Server:: What server should you post via? -* Mail and Post:: Mailing and posting at the same time. -* Archived Messages:: Where Gnus stores the messages you've sent. -* Posting Styles:: An easier way to specify who you are. -* Drafts:: Postponing messages and rejected messages. -* Rejected Articles:: What happens if the server doesn't like your article? -* Using GPG:: How to use GPG and MML to sign and encrypt messages - -Select Methods - -* Server Buffer:: Making and editing virtual servers. -* Getting News:: Reading USENET news with Gnus. -* Getting Mail:: Reading your personal mail with Gnus. -* Browsing the Web:: Getting messages from a plethora of Web sources. -* Other Sources:: Reading directories, files, SOUP packets. -* Combined Groups:: Combining groups into one group. -* Gnus Unplugged:: Reading news and mail offline. - -Server Buffer - -* Server Buffer Format:: You can customize the look of this buffer. -* Server Commands:: Commands to manipulate servers. -* Example Methods:: Examples server specifications. -* Creating a Virtual Server:: An example session. -* Server Variables:: Which variables to set. -* Servers and Methods:: You can use server names as select methods. -* Unavailable Servers:: Some servers you try to contact may be down. - -Getting News - -* NNTP:: Reading news from an @sc{nntp} server. -* News Spool:: Reading news from the local spool. - -@sc{nntp} - -* Direct Functions:: Connecting directly to the server. -* Indirect Functions:: Connecting indirectly to the server. -* Common Variables:: Understood by several connection functions. - -Getting Mail - -* Mail in a Newsreader:: Important introductory notes. -* Getting Started Reading Mail:: A simple cookbook example. -* Splitting Mail:: How to create mail groups. -* Mail Sources:: How to tell Gnus where to get mail from. -* Mail Backend Variables:: Variables for customizing mail handling. -* Fancy Mail Splitting:: Gnus can do hairy splitting of incoming mail. -* Group Mail Splitting:: Use group customize to drive mail splitting. -* Incorporating Old Mail:: What about the old mail you have? -* Expiring Mail:: Getting rid of unwanted mail. -* Washing Mail:: Removing gruft from the mail you get. -* Duplicates:: Dealing with duplicated mail. -* Not Reading Mail:: Using mail backends for reading other files. -* Choosing a Mail Backend:: Gnus can read a variety of mail formats. -* Archiving Mail:: How to backup your mail. - -Mail Sources - -* Mail Source Specifiers:: How to specify what a mail source is. -* Mail Source Customization:: Some variables that influence things. -* Fetching Mail:: Using the mail source specifiers. - -Choosing a Mail Backend - -* Unix Mail Box:: Using the (quite) standard Un*x mbox. -* Rmail Babyl:: Emacs programs use the rmail babyl format. -* Mail Spool:: Store your mail in a private spool? -* MH Spool:: An mhspool-like backend. -* Mail Folders:: Having one file for each group. -* Comparing Mail Backends:: An in-depth looks at pros and cons. - -Browsing the Web - -* Web Searches:: Creating groups from articles that match a string. -* Slashdot:: Reading the Slashdot comments. -* Ultimate:: The Ultimate Bulletin Board systems. -* Web Archive:: Reading mailing list archived on web. -* RSS:: Reading RDF site summary. -* Customizing w3:: Doing stuff to Emacs/w3 from Gnus. - -Other Sources - -* Directory Groups:: You can read a directory as if it was a newsgroup. -* Anything Groups:: Dired? Who needs dired? -* Document Groups:: Single files can be the basis of a group. -* SOUP:: Reading @sc{soup} packets ``offline''. -* Mail-To-News Gateways:: Posting articles via mail-to-news gateways. -* IMAP:: Using Gnus as a @sc{imap} client. - -Document Groups - -* Document Server Internals:: How to add your own document types. - -SOUP - -* SOUP Commands:: Commands for creating and sending @sc{soup} packets -* SOUP Groups:: A backend for reading @sc{soup} packets. -* SOUP Replies:: How to enable @code{nnsoup} to take over mail and news. - -@sc{imap} - -* Splitting in IMAP:: Splitting mail with nnimap. -* Editing IMAP ACLs:: Limiting/enabling other users access to a mailbox. -* Expunging mailboxes:: Equivalent of a "compress mailbox" button. - -Combined Groups - -* Virtual Groups:: Combining articles from many groups. -* Kibozed Groups:: Looking through parts of the newsfeed for articles. - -Gnus Unplugged - -* Agent Basics:: How it all is supposed to work. -* Agent Categories:: How to tell the Gnus Agent what to download. -* Agent Commands:: New commands for all the buffers. -* Agent Expiry:: How to make old articles go away. -* Agent and IMAP:: How to use the Agent with IMAP. -* Outgoing Messages:: What happens when you post/mail something? -* Agent Variables:: Customizing is fun. -* Example Setup:: An example @file{.gnus.el} file for offline people. -* Batching Agents:: How to fetch news from a @code{cron} job. -* Agent Caveats:: What you think it'll do and what it does. - -Agent Categories - -* Category Syntax:: What a category looks like. -* Category Buffer:: A buffer for maintaining categories. -* Category Variables:: Customize'r'Us. - -Agent Commands - -* Group Agent Commands:: -* Summary Agent Commands:: -* Server Agent Commands:: - -Scoring - -* Summary Score Commands:: Adding score entries for the current group. -* Group Score Commands:: General score commands. -* Score Variables:: Customize your scoring. (My, what terminology). -* Score File Format:: What a score file may contain. -* Score File Editing:: You can edit score files by hand as well. -* Adaptive Scoring:: Big Sister Gnus knows what you read. -* Home Score File:: How to say where new score entries are to go. -* Followups To Yourself:: Having Gnus notice when people answer you. -* Scoring On Other Headers:: Scoring on non-standard headers. -* Scoring Tips:: How to score effectively. -* Reverse Scoring:: That problem child of old is not problem. -* Global Score Files:: Earth-spanning, ear-splitting score files. -* Kill Files:: They are still here, but they can be ignored. -* Converting Kill Files:: Translating kill files to score files. -* GroupLens:: Getting predictions on what you like to read. -* Advanced Scoring:: Using logical expressions to build score rules. -* Score Decays:: It can be useful to let scores wither away. - -GroupLens - -* Using GroupLens:: How to make Gnus use GroupLens. -* Rating Articles:: Letting GroupLens know how you rate articles. -* Displaying Predictions:: Displaying predictions given by GroupLens. -* GroupLens Variables:: Customizing GroupLens. - -Advanced Scoring - -* Advanced Scoring Syntax:: A definition. -* Advanced Scoring Examples:: What they look like. -* Advanced Scoring Tips:: Getting the most out of it. - -Various - -* Process/Prefix:: A convention used by many treatment commands. -* Interactive:: Making Gnus ask you many questions. -* Symbolic Prefixes:: How to supply some Gnus functions with options. -* Formatting Variables:: You can specify what buffers should look like. -* Window Layout:: Configuring the Gnus buffer windows. -* Faces and Fonts:: How to change how faces look. -* Compilation:: How to speed Gnus up. -* Mode Lines:: Displaying information in the mode lines. -* Highlighting and Menus:: Making buffers look all nice and cozy. -* Buttons:: Get tendinitis in ten easy steps! -* Daemons:: Gnus can do things behind your back. -* NoCeM:: How to avoid spam and other fatty foods. -* Undo:: Some actions can be undone. -* Moderation:: What to do if you're a moderator. -* XEmacs Enhancements:: There are more pictures and stuff under XEmacs. -* Fuzzy Matching:: What's the big fuzz? -* Thwarting Email Spam:: A how-to on avoiding unsolicited commercial email. -* Various Various:: Things that are really various. - -Formatting Variables - -* Formatting Basics:: A formatting variable is basically a format string. -* Mode Line Formatting:: Some rules about mode line formatting variables. -* Advanced Formatting:: Modifying output in various ways. -* User-Defined Specs:: Having Gnus call your own functions. -* Formatting Fonts:: Making the formatting look colorful and nice. -* Positioning Point:: Moving point to a position after an operation. -* Tabulation:: Tabulating your output. -* Wide Characters:: Dealing with wide characters. - -XEmacs Enhancements - -* Picons:: How to display pictures of what your reading. -* Smileys:: Show all those happy faces the way they were meant to be shown. -* Toolbar:: Click'n'drool. -* XVarious:: Other XEmacsy Gnusey variables. - -Picons - -* Picon Basics:: What are picons and How do I get them. -* Picon Requirements:: Don't go further if you aren't using XEmacs. -* Easy Picons:: Displaying Picons---the easy way. -* Hard Picons:: The way you should do it. You'll learn something. -* Picon Useless Configuration:: Other variables you can trash/tweak/munge/play with. - -Appendices - -* History:: How Gnus got where it is today. -* On Writing Manuals:: Why this is not a beginner's guide. -* Terminology:: We use really difficult, like, words here. -* Customization:: Tailoring Gnus to your needs. -* Troubleshooting:: What you might try if things do not work. -* Gnus Reference Guide:: Rilly, rilly technical stuff. -* Emacs for Heathens:: A short introduction to Emacsian terms. - -History - -* Gnus Versions:: What Gnus versions have been released. -* Other Gnus Versions:: Other Gnus versions that also have been released. -* Why?:: What's the point of Gnus? -* Compatibility:: Just how compatible is Gnus with @sc{gnus}? -* Conformity:: Gnus tries to conform to all standards. -* Emacsen:: Gnus can be run on a few modern Emacsen. -* Gnus Development:: How Gnus is developed. -* Contributors:: Oodles of people. -* New Features:: Pointers to some of the new stuff in Gnus. - -New Features - -* ding Gnus:: New things in Gnus 5.0/5.1, the first new Gnus. -* September Gnus:: The Thing Formally Known As Gnus 5.2/5.3. -* Red Gnus:: Third time best---Gnus 5.4/5.5. -* Quassia Gnus:: Two times two is four, or Gnus 5.6/5.7. -* Pterodactyl Gnus:: Pentad also starts with P, AKA Gnus 5.8/5.9. - -Customization - -* Slow/Expensive Connection:: You run a local Emacs and get the news elsewhere. -* Slow Terminal Connection:: You run a remote Emacs. -* Little Disk Space:: You feel that having large setup files is icky. -* Slow Machine:: You feel like buying a faster machine. - -Gnus Reference Guide - -* Gnus Utility Functions:: Common functions and variable to use. -* Backend Interface:: How Gnus communicates with the servers. -* Score File Syntax:: A BNF definition of the score file standard. -* Headers:: How Gnus stores headers internally. -* Ranges:: A handy format for storing mucho numbers. -* Group Info:: The group info format. -* Extended Interactive:: Symbolic prefixes and stuff. -* Emacs/XEmacs Code:: Gnus can be run under all modern Emacsen. -* Various File Formats:: Formats of files that Gnus use. - -Backend Interface - -* Required Backend Functions:: Functions that must be implemented. -* Optional Backend Functions:: Functions that need not be implemented. -* Error Messaging:: How to get messages and report errors. -* Writing New Backends:: Extending old backends. -* Hooking New Backends Into Gnus:: What has to be done on the Gnus end. -* Mail-like Backends:: Some tips on mail backends. - -Various File Formats - -* Active File Format:: Information on articles and groups available. -* Newsgroups File Format:: Group descriptions. - -Emacs for Heathens - -* Keystrokes:: Entering text and executing commands. -* Emacs Lisp:: The built-in Emacs programming language. - -@end detailmenu -@end menu - -@node Starting Up -@chapter Starting gnus -@cindex starting up - -@kindex M-x gnus -@findex gnus -If your system administrator has set things up properly, starting gnus -and reading news is extremely easy---you just type @kbd{M-x gnus} in -your Emacs. - -@findex gnus-other-frame -@kindex M-x gnus-other-frame -If you want to start gnus in a different frame, you can use the command -@kbd{M-x gnus-other-frame} instead. - -If things do not go smoothly at startup, you have to twiddle some -variables in your @file{~/.gnus} file. This file is similar to -@file{~/.emacs}, but is read when gnus starts. - -If you puzzle at any terms used in this manual, please refer to the -terminology section (@pxref{Terminology}). - -@menu -* Finding the News:: Choosing a method for getting news. -* The First Time:: What does Gnus do the first time you start it? -* The Server is Down:: How can I read my mail then? -* Slave Gnusae:: You can have more than one Gnus active at a time. -* Fetching a Group:: Starting Gnus just to read a group. -* New Groups:: What is Gnus supposed to do with new groups? -* Changing Servers:: You may want to move from one server to another. -* Startup Files:: Those pesky startup files---@file{.newsrc}. -* Auto Save:: Recovering from a crash. -* The Active File:: Reading the active file over a slow line Takes Time. -* Startup Variables:: Other variables you might change. -@end menu - - -@node Finding the News -@section Finding the News -@cindex finding news - -@vindex gnus-select-method -@c @head -The @code{gnus-select-method} variable says where gnus should look for -news. This variable should be a list where the first element says -@dfn{how} and the second element says @dfn{where}. This method is your -native method. All groups not fetched with this method are -foreign groups. - -For instance, if the @samp{news.somewhere.edu} @sc{nntp} server is where -you want to get your daily dosage of news from, you'd say: - -@lisp -(setq gnus-select-method '(nntp "news.somewhere.edu")) -@end lisp - -If you want to read directly from the local spool, say: - -@lisp -(setq gnus-select-method '(nnspool "")) -@end lisp - -If you can use a local spool, you probably should, as it will almost -certainly be much faster. - -@vindex gnus-nntpserver-file -@cindex NNTPSERVER -@cindex @sc{nntp} server -If this variable is not set, gnus will take a look at the -@code{NNTPSERVER} environment variable. If that variable isn't set, -gnus will see whether @code{gnus-nntpserver-file} -(@file{/etc/nntpserver} by default) has any opinions on the matter. If -that fails as well, gnus will try to use the machine running Emacs as an @sc{nntp} server. That's a long shot, though. - -@vindex gnus-nntp-server -If @code{gnus-nntp-server} is set, this variable will override -@code{gnus-select-method}. You should therefore set -@code{gnus-nntp-server} to @code{nil}, which is what it is by default. - -@vindex gnus-secondary-servers -@vindex gnus-nntp-server -You can also make gnus prompt you interactively for the name of an -@sc{nntp} server. If you give a non-numerical prefix to @code{gnus} -(i.e., @kbd{C-u M-x gnus}), gnus will let you choose between the servers -in the @code{gnus-secondary-servers} list (if any). You can also just -type in the name of any server you feel like visiting. (Note that this -will set @code{gnus-nntp-server}, which means that if you then @kbd{M-x -gnus} later in the same Emacs session, Gnus will contact the same -server.) - -@findex gnus-group-browse-foreign-server -@kindex B (Group) -However, if you use one @sc{nntp} server regularly and are just -interested in a couple of groups from a different server, you would be -better served by using the @kbd{B} command in the group buffer. It will -let you have a look at what groups are available, and you can subscribe -to any of the groups you want to. This also makes @file{.newsrc} -maintenance much tidier. @xref{Foreign Groups}. - -@vindex gnus-secondary-select-methods -@c @head -A slightly different approach to foreign groups is to set the -@code{gnus-secondary-select-methods} variable. The select methods -listed in this variable are in many ways just as native as the -@code{gnus-select-method} server. They will also be queried for active -files during startup (if that's required), and new newsgroups that -appear on these servers will be subscribed (or not) just as native -groups are. - -For instance, if you use the @code{nnmbox} backend to read your mail, you -would typically set this variable to - -@lisp -(setq gnus-secondary-select-methods '((nnmbox ""))) -@end lisp - - -@node The First Time -@section The First Time -@cindex first time usage - -If no startup files exist, gnus will try to determine what groups should -be subscribed by default. - -@vindex gnus-default-subscribed-newsgroups -If the variable @code{gnus-default-subscribed-newsgroups} is set, gnus -will subscribe you to just those groups in that list, leaving the rest -killed. Your system administrator should have set this variable to -something useful. - -Since she hasn't, gnus will just subscribe you to a few arbitrarily -picked groups (i.e., @samp{*.newusers}). (@dfn{Arbitrary} is defined -here as @dfn{whatever Lars thinks you should read}.) - -You'll also be subscribed to the gnus documentation group, which should -help you with most common problems. - -If @code{gnus-default-subscribed-newsgroups} is @code{t}, gnus will just -use the normal functions for handling new groups, and not do anything -special. - - -@node The Server is Down -@section The Server is Down -@cindex server errors - -If the default server is down, gnus will understandably have some -problems starting. However, if you have some mail groups in addition to -the news groups, you may want to start gnus anyway. - -Gnus, being the trusting sort of program, will ask whether to proceed -without a native select method if that server can't be contacted. This -will happen whether the server doesn't actually exist (i.e., you have -given the wrong address) or the server has just momentarily taken ill -for some reason or other. If you decide to continue and have no foreign -groups, you'll find it difficult to actually do anything in the group -buffer. But, hey, that's your problem. Blllrph! - -@findex gnus-no-server -@kindex M-x gnus-no-server -@c @head -If you know that the server is definitely down, or you just want to read -your mail without bothering with the server at all, you can use the -@code{gnus-no-server} command to start gnus. That might come in handy -if you're in a hurry as well. This command will not attempt to contact -your primary server---instead, it will just activate all groups on level -1 and 2. (You should preferably keep no native groups on those two -levels.) Also @pxref{Group Levels}. - - -@node Slave Gnusae -@section Slave Gnusae -@cindex slave - -You might want to run more than one Emacs with more than one gnus at the -same time. If you are using different @file{.newsrc} files (e.g., if you -are using the two different gnusae to read from two different servers), -that is no problem whatsoever. You just do it. - -The problem appears when you want to run two Gnusae that use the same -@code{.newsrc} file. - -To work around that problem some, we here at the Think-Tank at the gnus -Towers have come up with a new concept: @dfn{Masters} and -@dfn{slaves}. (We have applied for a patent on this concept, and have -taken out a copyright on those words. If you wish to use those words in -conjunction with each other, you have to send $1 per usage instance to -me. Usage of the patent (@dfn{Master/Slave Relationships In Computer -Applications}) will be much more expensive, of course.) - -Anyway, you start one gnus up the normal way with @kbd{M-x gnus} (or -however you do it). Each subsequent slave gnusae should be started with -@kbd{M-x gnus-slave}. These slaves won't save normal @file{.newsrc} -files, but instead save @dfn{slave files} that contain information only -on what groups have been read in the slave session. When a master gnus -starts, it will read (and delete) these slave files, incorporating all -information from them. (The slave files will be read in the sequence -they were created, so the latest changes will have precedence.) - -Information from the slave files has, of course, precedence over the -information in the normal (i.e., master) @code{.newsrc} file. - - -@node Fetching a Group -@section Fetching a Group -@cindex fetching a group - -@findex gnus-fetch-group -It is sometimes convenient to be able to just say ``I want to read this -group and I don't care whether gnus has been started or not''. This is -perhaps more useful for people who write code than for users, but the -command @code{gnus-fetch-group} provides this functionality in any case. -It takes the group name as a parameter. - - -@node New Groups -@section New Groups -@cindex new groups -@cindex subscription - -@vindex gnus-check-new-newsgroups -If you are satisfied that you really never want to see any new groups, -you can set @code{gnus-check-new-newsgroups} to @code{nil}. This will -also save you some time at startup. Even if this variable is -@code{nil}, you can always subscribe to the new groups just by pressing -@kbd{U} in the group buffer (@pxref{Group Maintenance}). This variable -is @code{ask-server} by default. If you set this variable to -@code{always}, then gnus will query the backends for new groups even -when you do the @kbd{g} command (@pxref{Scanning New Messages}). - -@menu -* Checking New Groups:: Determining what groups are new. -* Subscription Methods:: What Gnus should do with new groups. -* Filtering New Groups:: Making Gnus ignore certain new groups. -@end menu - - -@node Checking New Groups -@subsection Checking New Groups - -Gnus normally determines whether a group is new or not by comparing the -list of groups from the active file(s) with the lists of subscribed and -dead groups. This isn't a particularly fast method. If -@code{gnus-check-new-newsgroups} is @code{ask-server}, gnus will ask the -server for new groups since the last time. This is both faster and -cheaper. This also means that you can get rid of the list of killed -groups altogether, so you may set @code{gnus-save-killed-list} to -@code{nil}, which will save time both at startup, at exit, and all over. -Saves disk space, too. Why isn't this the default, then? -Unfortunately, not all servers support this command. - -I bet I know what you're thinking now: How do I find out whether my -server supports @code{ask-server}? No? Good, because I don't have a -fail-safe answer. I would suggest just setting this variable to -@code{ask-server} and see whether any new groups appear within the next -few days. If any do, then it works. If none do, then it doesn't -work. I could write a function to make gnus guess whether the server -supports @code{ask-server}, but it would just be a guess. So I won't. -You could @code{telnet} to the server and say @code{HELP} and see -whether it lists @samp{NEWGROUPS} among the commands it understands. If -it does, then it might work. (But there are servers that lists -@samp{NEWGROUPS} without supporting the function properly.) - -This variable can also be a list of select methods. If so, gnus will -issue an @code{ask-server} command to each of the select methods, and -subscribe them (or not) using the normal methods. This might be handy -if you are monitoring a few servers for new groups. A side effect is -that startup will take much longer, so you can meditate while waiting. -Use the mantra ``dingnusdingnusdingnus'' to achieve permanent bliss. - - -@node Subscription Methods -@subsection Subscription Methods - -@vindex gnus-subscribe-newsgroup-method -What gnus does when it encounters a new group is determined by the -@code{gnus-subscribe-newsgroup-method} variable. - -This variable should contain a function. This function will be called -with the name of the new group as the only parameter. - -Some handy pre-fab functions are: - -@table @code - -@item gnus-subscribe-zombies -@vindex gnus-subscribe-zombies -Make all new groups zombies. This is the default. You can browse the -zombies later (with @kbd{A z}) and either kill them all off properly -(with @kbd{S z}), or subscribe to them (with @kbd{u}). - -@item gnus-subscribe-randomly -@vindex gnus-subscribe-randomly -Subscribe all new groups in arbitrary order. This really means that all -new groups will be added at ``the top'' of the group buffer. - -@item gnus-subscribe-alphabetically -@vindex gnus-subscribe-alphabetically -Subscribe all new groups in alphabetical order. - -@item gnus-subscribe-hierarchically -@vindex gnus-subscribe-hierarchically -Subscribe all new groups hierarchically. The difference between this -function and @code{gnus-subscribe-alphabetically} is slight. -@code{gnus-subscribe-alphabetically} will subscribe new groups in a strictly -alphabetical fashion, while this function will enter groups into its -hierarchy. So if you want to have the @samp{rec} hierarchy before the -@samp{comp} hierarchy, this function will not mess that configuration -up. Or something like that. - -@item gnus-subscribe-interactively -@vindex gnus-subscribe-interactively -Subscribe new groups interactively. This means that gnus will ask -you about @strong{all} new groups. The groups you choose to subscribe -to will be subscribed hierarchically. - -@item gnus-subscribe-killed -@vindex gnus-subscribe-killed -Kill all new groups. - -@item gnus-subscribe-topics -@vindex gnus-subscribe-topics -Put the groups into the topic that has a matching @code{subscribe} topic -parameter (@pxref{Topic Parameters}). For instance, a @code{subscribe} -topic parameter that looks like - -@example -"nnslashdot" -@end example - -will mean that all groups that match that regex will be subscribed under -that topic. - -If no topics match the groups, the groups will be subscribed in the -top-level topic. - -@end table - -@vindex gnus-subscribe-hierarchical-interactive -A closely related variable is -@code{gnus-subscribe-hierarchical-interactive}. (That's quite a -mouthful.) If this variable is non-@code{nil}, gnus will ask you in a -hierarchical fashion whether to subscribe to new groups or not. Gnus -will ask you for each sub-hierarchy whether you want to descend the -hierarchy or not. - -One common mistake is to set the variable a few paragraphs above -(@code{gnus-subscribe-newsgroup-method}) to -@code{gnus-subscribe-hierarchical-interactive}. This is an error. This -will not work. This is ga-ga. So don't do it. - - -@node Filtering New Groups -@subsection Filtering New Groups - -A nice and portable way to control which new newsgroups should be -subscribed (or ignored) is to put an @dfn{options} line at the start of -the @file{.newsrc} file. Here's an example: - -@example -options -n !alt.all !rec.all sci.all -@end example - -@vindex gnus-subscribe-options-newsgroup-method -This line obviously belongs to a serious-minded intellectual scientific -person (or she may just be plain old boring), because it says that all -groups that have names beginning with @samp{alt} and @samp{rec} should -be ignored, and all groups with names beginning with @samp{sci} should -be subscribed. Gnus will not use the normal subscription method for -subscribing these groups. -@code{gnus-subscribe-options-newsgroup-method} is used instead. This -variable defaults to @code{gnus-subscribe-alphabetically}. - -@vindex gnus-options-not-subscribe -@vindex gnus-options-subscribe -If you don't want to mess with your @file{.newsrc} file, you can just -set the two variables @code{gnus-options-subscribe} and -@code{gnus-options-not-subscribe}. These two variables do exactly the -same as the @file{.newsrc} @samp{options -n} trick. Both are regexps, -and if the new group matches the former, it will be unconditionally -subscribed, and if it matches the latter, it will be ignored. - -@vindex gnus-auto-subscribed-groups -Yet another variable that meddles here is -@code{gnus-auto-subscribed-groups}. It works exactly like -@code{gnus-options-subscribe}, and is therefore really superfluous, but I -thought it would be nice to have two of these. This variable is more -meant for setting some ground rules, while the other variable is used -more for user fiddling. By default this variable makes all new groups -that come from mail backends (@code{nnml}, @code{nnbabyl}, -@code{nnfolder}, @code{nnmbox}, and @code{nnmh}) subscribed. If you -don't like that, just set this variable to @code{nil}. - -New groups that match this regexp are subscribed using -@code{gnus-subscribe-options-newsgroup-method}. - - -@node Changing Servers -@section Changing Servers -@cindex changing servers - -Sometimes it is necessary to move from one @sc{nntp} server to another. -This happens very rarely, but perhaps you change jobs, or one server is -very flaky and you want to use another. - -Changing the server is pretty easy, right? You just change -@code{gnus-select-method} to point to the new server? - -@emph{Wrong!} - -Article numbers are not (in any way) kept synchronized between different -@sc{nntp} servers, and the only way Gnus keeps track of what articles -you have read is by keeping track of article numbers. So when you -change @code{gnus-select-method}, your @file{.newsrc} file becomes -worthless. - -Gnus provides a few functions to attempt to translate a @file{.newsrc} -file from one server to another. They all have one thing in -common---they take a looong time to run. You don't want to use these -functions more than absolutely necessary. - -@kindex M-x gnus-change-server -@findex gnus-change-server -If you have access to both servers, Gnus can request the headers for all -the articles you have read and compare @code{Message-ID}s and map the -article numbers of the read articles and article marks. The @kbd{M-x -gnus-change-server} command will do this for all your native groups. It -will prompt for the method you want to move to. - -@kindex M-x gnus-group-move-group-to-server -@findex gnus-group-move-group-to-server -You can also move individual groups with the @kbd{M-x -gnus-group-move-group-to-server} command. This is useful if you want to -move a (foreign) group from one server to another. - -@kindex M-x gnus-group-clear-data-on-native-groups -@findex gnus-group-clear-data-on-native-groups -If you don't have access to both the old and new server, all your marks -and read ranges have become worthless. You can use the @kbd{M-x -gnus-group-clear-data-on-native-groups} command to clear out all data -that you have on your native groups. Use with caution. - -After changing servers, you @strong{must} move the cache hierarchy away, -since the cached articles will have wrong article numbers, which will -affect which articles Gnus thinks are read. - - -@node Startup Files -@section Startup Files -@cindex startup files -@cindex .newsrc -@cindex .newsrc.el -@cindex .newsrc.eld - -Now, you all know about the @file{.newsrc} file. All subscription -information is traditionally stored in this file. - -Things got a bit more complicated with @sc{gnus}. In addition to -keeping the @file{.newsrc} file updated, it also used a file called -@file{.newsrc.el} for storing all the information that didn't fit into -the @file{.newsrc} file. (Actually, it also duplicated everything in -the @file{.newsrc} file.) @sc{gnus} would read whichever one of these -files was the most recently saved, which enabled people to swap between -@sc{gnus} and other newsreaders. - -That was kinda silly, so Gnus went one better: In addition to the -@file{.newsrc} and @file{.newsrc.el} files, Gnus also has a file called -@file{.newsrc.eld}. It will read whichever of these files that are most -recent, but it will never write a @file{.newsrc.el} file. You should -never delete the @file{.newsrc.eld} file---it contains much information -not stored in the @file{.newsrc} file. - -@vindex gnus-save-newsrc-file -@vindex gnus-read-newsrc-file -You can turn off writing the @file{.newsrc} file by setting -@code{gnus-save-newsrc-file} to @code{nil}, which means you can delete -the file and save some space, as well as exiting from gnus faster. -However, this will make it impossible to use other newsreaders than -gnus. But hey, who would want to, right? Similarly, setting -@code{gnus-read-newsrc-file} to @code{nil} makes gnus ignore the -@file{.newsrc} file and any @file{.newsrc-SERVER} files, which is -convenient if you have a tendency to use Netscape once in a while. - -@vindex gnus-save-killed-list -If @code{gnus-save-killed-list} (default @code{t}) is @code{nil}, Gnus -will not save the list of killed groups to the startup file. This will -save both time (when starting and quitting) and space (on disk). It -will also mean that Gnus has no record of what groups are new or old, -so the automatic new groups subscription methods become meaningless. -You should always set @code{gnus-check-new-newsgroups} to @code{nil} or -@code{ask-server} if you set this variable to @code{nil} (@pxref{New -Groups}). This variable can also be a regular expression. If that's -the case, remove all groups that do not match this regexp before -saving. This can be useful in certain obscure situations that involve -several servers where not all servers support @code{ask-server}. - -@vindex gnus-startup-file -The @code{gnus-startup-file} variable says where the startup files are. -The default value is @file{~/.newsrc}, with the Gnus (El Dingo) startup -file being whatever that one is, with a @samp{.eld} appended. - -@vindex gnus-save-newsrc-hook -@vindex gnus-save-quick-newsrc-hook -@vindex gnus-save-standard-newsrc-hook -@code{gnus-save-newsrc-hook} is called before saving any of the newsrc -files, while @code{gnus-save-quick-newsrc-hook} is called just before -saving the @file{.newsrc.eld} file, and -@code{gnus-save-standard-newsrc-hook} is called just before saving the -@file{.newsrc} file. The latter two are commonly used to turn version -control on or off. Version control is on by default when saving the -startup files. If you want to turn backup creation off, say something like: - -@lisp -(defun turn-off-backup () - (set (make-local-variable 'backup-inhibited) t)) - -(add-hook 'gnus-save-quick-newsrc-hook 'turn-off-backup) -(add-hook 'gnus-save-standard-newsrc-hook 'turn-off-backup) -@end lisp - -@vindex gnus-init-file -When gnus starts, it will read the @code{gnus-site-init-file} -(@file{.../site-lisp/gnus} by default) and @code{gnus-init-file} -(@file{~/.gnus} by default) files. These are normal Emacs Lisp files -and can be used to avoid cluttering your @file{~/.emacs} and -@file{site-init} files with gnus stuff. Gnus will also check for files -with the same names as these, but with @file{.elc} and @file{.el} -suffixes. In other words, if you have set @code{gnus-init-file} to -@file{~/.gnus}, it will look for @file{~/.gnus.elc}, @file{~/.gnus.el}, -and finally @file{~/.gnus} (in this order). - - - -@node Auto Save -@section Auto Save -@cindex dribble file -@cindex auto-save - -Whenever you do something that changes the gnus data (reading articles, -catching up, killing/subscribing groups), the change is added to a -special @dfn{dribble buffer}. This buffer is auto-saved the normal -Emacs way. If your Emacs should crash before you have saved the -@file{.newsrc} files, all changes you have made can be recovered from -this file. - -If gnus detects this file at startup, it will ask the user whether to -read it. The auto save file is deleted whenever the real startup file is -saved. - -@vindex gnus-use-dribble-file -If @code{gnus-use-dribble-file} is @code{nil}, gnus won't create and -maintain a dribble buffer. The default is @code{t}. - -@vindex gnus-dribble-directory -Gnus will put the dribble file(s) in @code{gnus-dribble-directory}. If -this variable is @code{nil}, which it is by default, gnus will dribble -into the directory where the @file{.newsrc} file is located. (This is -normally the user's home directory.) The dribble file will get the same -file permissions as the @code{.newsrc} file. - -@vindex gnus-always-read-dribble-file -If @code{gnus-always-read-dribble-file} is non-@code{nil}, Gnus will -read the dribble file on startup without querying the user. - - -@node The Active File -@section The Active File -@cindex active file -@cindex ignored groups - -When gnus starts, or indeed whenever it tries to determine whether new -articles have arrived, it reads the active file. This is a very large -file that lists all the active groups and articles on the server. - -@vindex gnus-ignored-newsgroups -Before examining the active file, gnus deletes all lines that match the -regexp @code{gnus-ignored-newsgroups}. This is done primarily to reject -any groups with bogus names, but you can use this variable to make gnus -ignore hierarchies you aren't ever interested in. However, this is not -recommended. In fact, it's highly discouraged. Instead, @pxref{New -Groups} for an overview of other variables that can be used instead. - -@c This variable is -@c @code{nil} by default, and will slow down active file handling somewhat -@c if you set it to anything else. - -@vindex gnus-read-active-file -@c @head -The active file can be rather Huge, so if you have a slow network, you -can set @code{gnus-read-active-file} to @code{nil} to prevent gnus from -reading the active file. This variable is @code{some} by default. - -Gnus will try to make do by getting information just on the groups that -you actually subscribe to. - -Note that if you subscribe to lots and lots of groups, setting this -variable to @code{nil} will probably make gnus slower, not faster. At -present, having this variable @code{nil} will slow gnus down -considerably, unless you read news over a 2400 baud modem. - -This variable can also have the value @code{some}. Gnus will then -attempt to read active info only on the subscribed groups. On some -servers this is quite fast (on sparkling, brand new INN servers that -support the @code{LIST ACTIVE group} command), on others this isn't fast -at all. In any case, @code{some} should be faster than @code{nil}, and -is certainly faster than @code{t} over slow lines. - -Some news servers (old versions of Leafnode and old versions of INN, for -instance) do not support the @code{LIST ACTIVE group}. For these -servers, @code{nil} is probably the most efficient value for this -variable. - -If this variable is @code{nil}, gnus will ask for group info in total -lock-step, which isn't very fast. If it is @code{some} and you use an -@sc{nntp} server, gnus will pump out commands as fast as it can, and -read all the replies in one swoop. This will normally result in better -performance, but if the server does not support the aforementioned -@code{LIST ACTIVE group} command, this isn't very nice to the server. - -If you think that starting up Gnus takes too long, try all the three -different values for this variable and see what works best for you. - -In any case, if you use @code{some} or @code{nil}, you should definitely -kill all groups that you aren't interested in to speed things up. - -Note that this variable also affects active file retrieval from -secondary select methods. - - -@node Startup Variables -@section Startup Variables - -@table @code - -@item gnus-load-hook -@vindex gnus-load-hook -A hook run while gnus is being loaded. Note that this hook will -normally be run just once in each Emacs session, no matter how many -times you start gnus. - -@item gnus-before-startup-hook -@vindex gnus-before-startup-hook -A hook run after starting up gnus successfully. - -@item gnus-startup-hook -@vindex gnus-startup-hook -A hook run as the very last thing after starting up gnus - -@item gnus-started-hook -@vindex gnus-started-hook -A hook that is run as the very last thing after starting up gnus -successfully. - -@item gnus-setup-news-hook -@vindex gnus-setup-news-hook -A hook that is run after reading the @file{.newsrc} file(s), but before -generating the group buffer. - -@item gnus-check-bogus-newsgroups -@vindex gnus-check-bogus-newsgroups -If non-@code{nil}, gnus will check for and delete all bogus groups at -startup. A @dfn{bogus group} is a group that you have in your -@file{.newsrc} file, but doesn't exist on the news server. Checking for -bogus groups can take quite a while, so to save time and resources it's -best to leave this option off, and do the checking for bogus groups once -in a while from the group buffer instead (@pxref{Group Maintenance}). - -@item gnus-inhibit-startup-message -@vindex gnus-inhibit-startup-message -If non-@code{nil}, the startup message won't be displayed. That way, -your boss might not notice as easily that you are reading news instead -of doing your job. Note that this variable is used before -@file{.gnus.el} is loaded, so it should be set in @code{.emacs} instead. - -@item gnus-no-groups-message -@vindex gnus-no-groups-message -Message displayed by gnus when no groups are available. - -@item gnus-play-startup-jingle -@vindex gnus-play-startup-jingle -If non-@code{nil}, play the gnus jingle at startup. - -@item gnus-startup-jingle -@vindex gnus-startup-jingle -Jingle to be played if the above variable is non-@code{nil}. The -default is @samp{Tuxedomoon.Jingle4.au}. - -@end table - - -@node Group Buffer -@chapter Group Buffer -@cindex group buffer - -The @dfn{group buffer} lists all (or parts) of the available groups. It -is the first buffer shown when gnus starts, and will never be killed as -long as gnus is active. - -@iftex -@iflatex -\gnusfigure{The Group Buffer}{320}{ -\put(75,50){\epsfig{figure=tmp/group.ps,height=9cm}} -\put(120,37){\makebox(0,0)[t]{Buffer name}} -\put(120,38){\vector(1,2){10}} -\put(40,60){\makebox(0,0)[r]{Mode line}} -\put(40,58){\vector(1,0){30}} -\put(200,28){\makebox(0,0)[t]{Native select method}} -\put(200,26){\vector(-1,2){15}} -} -@end iflatex -@end iftex - -@menu -* Group Buffer Format:: Information listed and how you can change it. -* Group Maneuvering:: Commands for moving in the group buffer. -* Selecting a Group:: Actually reading news. -* Subscription Commands:: Unsubscribing, killing, subscribing. -* Group Data:: Changing the info for a group. -* Group Levels:: Levels? What are those, then? -* Group Score:: A mechanism for finding out what groups you like. -* Marking Groups:: You can mark groups for later processing. -* Foreign Groups:: Creating and editing groups. -* Group Parameters:: Each group may have different parameters set. -* Listing Groups:: Gnus can list various subsets of the groups. -* Sorting Groups:: Re-arrange the group order. -* Group Maintenance:: Maintaining a tidy @file{.newsrc} file. -* Browse Foreign Server:: You can browse a server. See what it has to offer. -* Exiting Gnus:: Stop reading news and get some work done. -* Group Topics:: A folding group mode divided into topics. -* Misc Group Stuff:: Other stuff that you can to do. -@end menu - - -@node Group Buffer Format -@section Group Buffer Format - -@menu -* Group Line Specification:: Deciding how the group buffer is to look. -* Group Modeline Specification:: The group buffer modeline. -* Group Highlighting:: Having nice colors in the group buffer. -@end menu - - -@node Group Line Specification -@subsection Group Line Specification -@cindex group buffer format - -The default format of the group buffer is nice and dull, but you can -make it as exciting and ugly as you feel like. - -Here's a couple of example group lines: - -@example - 25: news.announce.newusers - * 0: alt.fan.andrea-dworkin -@end example - -Quite simple, huh? - -You can see that there are 25 unread articles in -@samp{news.announce.newusers}. There are no unread articles, but some -ticked articles, in @samp{alt.fan.andrea-dworkin} (see that little -asterisk at the beginning of the line?). - -@vindex gnus-group-line-format -You can change that format to whatever you want by fiddling with the -@code{gnus-group-line-format} variable. This variable works along the -lines of a @code{format} specification, which is pretty much the same as -a @code{printf} specifications, for those of you who use (feh!) C. -@xref{Formatting Variables}. - -@samp{%M%S%5y: %(%g%)\n} is the value that produced those lines above. - -There should always be a colon on the line; the cursor always moves to -the colon after performing an operation. Nothing else is required---not -even the group name. All displayed text is just window dressing, and is -never examined by gnus. Gnus stores all real information it needs using -text properties. - -(Note that if you make a really strange, wonderful, spreadsheet-like -layout, everybody will believe you are hard at work with the accounting -instead of wasting time reading news.) - -Here's a list of all available format characters: - -@table @samp - -@item M -An asterisk if the group only has marked articles. - -@item S -Whether the group is subscribed. - -@item L -Level of subscribedness. - -@item N -Number of unread articles. - -@item I -Number of dormant articles. - -@item T -Number of ticked articles. - -@item R -Number of read articles. - -@item t -Estimated total number of articles. (This is really @var{max-number} -minus @var{min-number} plus 1.) - -Gnus uses this estimation because the NNTP protocol provides efficient -access to @var{max-number} and @var{min-number} but getting the true -unread message count is not possible efficiently. For hysterical -raisins, even the mail backends, where the true number of unread -messages might be available efficiently, use the same limited -interface. To remove this restriction from Gnus means that the -backend interface has to be changed, which is not an easy job. If you -want to work on this, please contact the Gnus mailing list. - -@item y -Number of unread, unticked, non-dormant articles. - -@item i -Number of ticked and dormant articles. - -@item g -Full group name. - -@item G -Group name. - -@item D -Newsgroup description. - -@item o -@samp{m} if moderated. - -@item O -@samp{(m)} if moderated. - -@item s -Select method. - -@item n -Select from where. - -@item z -A string that looks like @samp{<%s:%n>} if a foreign select method is -used. - -@item P -Indentation based on the level of the topic (@pxref{Group Topics}). - -@item c -@vindex gnus-group-uncollapsed-levels -Short (collapsed) group name. The @code{gnus-group-uncollapsed-levels} -variable says how many levels to leave at the end of the group name. -The default is 1---this will mean that group names like -@samp{gnu.emacs.gnus} will be shortened to @samp{g.e.gnus}. - -@item m -@vindex gnus-new-mail-mark -@cindex % -@samp{%} (@code{gnus-new-mail-mark}) if there has arrived new mail to -the group lately. - -@item p -@samp{#} (@code{gnus-process-mark}) if the group is process marked. - -@item d -A string that says when you last read the group (@pxref{Group -Timestamp}). - -@item u -User defined specifier. The next character in the format string should -be a letter. Gnus will call the function -@code{gnus-user-format-function-}@samp{X}, where @samp{X} is the letter -following @samp{%u}. The function will be passed a single dummy -parameter as argument. The function should return a string, which will -be inserted into the buffer just like information from any other -specifier. -@end table - -@cindex * -All the ``number-of'' specs will be filled with an asterisk (@samp{*}) -if no info is available---for instance, if it is a non-activated foreign -group, or a bogus native group. - - -@node Group Modeline Specification -@subsection Group Modeline Specification -@cindex group modeline - -@vindex gnus-group-mode-line-format -The mode line can be changed by setting -@code{gnus-group-mode-line-format} (@pxref{Mode Line Formatting}). It -doesn't understand that many format specifiers: - -@table @samp -@item S -The native news server. -@item M -The native select method. -@end table - - -@node Group Highlighting -@subsection Group Highlighting -@cindex highlighting -@cindex group highlighting - -@vindex gnus-group-highlight -Highlighting in the group buffer is controlled by the -@code{gnus-group-highlight} variable. This is an alist with elements -that look like @code{(@var{form} . @var{face})}. If @var{form} evaluates to -something non-@code{nil}, the @var{face} will be used on the line. - -Here's an example value for this variable that might look nice if the -background is dark: - -@lisp -(cond (window-system - (setq custom-background-mode 'light) - (defface my-group-face-1 - '((t (:foreground "Red" :bold t))) "First group face") - (defface my-group-face-2 - '((t (:foreground "DarkSeaGreen4" :bold t))) "Second group face") - (defface my-group-face-3 - '((t (:foreground "Green4" :bold t))) "Third group face") - (defface my-group-face-4 - '((t (:foreground "SteelBlue" :bold t))) "Fourth group face") - (defface my-group-face-5 - '((t (:foreground "Blue" :bold t))) "Fifth group face"))) - -(setq gnus-group-highlight - '(((> unread 200) . my-group-face-1) - ((and (< level 3) (zerop unread)) . my-group-face-2) - ((< level 3) . my-group-face-3) - ((zerop unread) . my-group-face-4) - (t . my-group-face-5))) -@end lisp - -Also @pxref{Faces and Fonts}. - -Variables that are dynamically bound when the forms are evaluated -include: - -@table @code -@item group -The group name. -@item unread -The number of unread articles in the group. -@item method -The select method. -@item mailp -Whether the group is a mail group. -@item level -The level of the group. -@item score -The score of the group. -@item ticked -The number of ticked articles in the group. -@item total -The total number of articles in the group. Or rather, MAX-NUMBER minus -MIN-NUMBER plus one. -@item topic -When using the topic minor mode, this variable is bound to the current -topic being inserted. -@end table - -When the forms are @code{eval}ed, point is at the beginning of the line -of the group in question, so you can use many of the normal gnus -functions for snarfing info on the group. - -@vindex gnus-group-update-hook -@findex gnus-group-highlight-line -@code{gnus-group-update-hook} is called when a group line is changed. -It will not be called when @code{gnus-visual} is @code{nil}. This hook -calls @code{gnus-group-highlight-line} by default. - - -@node Group Maneuvering -@section Group Maneuvering -@cindex group movement - -All movement commands understand the numeric prefix and will behave as -expected, hopefully. - -@table @kbd - -@item n -@kindex n (Group) -@findex gnus-group-next-unread-group -Go to the next group that has unread articles -(@code{gnus-group-next-unread-group}). - -@item p -@itemx DEL -@kindex DEL (Group) -@kindex p (Group) -@findex gnus-group-prev-unread-group -Go to the previous group that has unread articles -(@code{gnus-group-prev-unread-group}). - -@item N -@kindex N (Group) -@findex gnus-group-next-group -Go to the next group (@code{gnus-group-next-group}). - -@item P -@kindex P (Group) -@findex gnus-group-prev-group -Go to the previous group (@code{gnus-group-prev-group}). - -@item M-n -@kindex M-n (Group) -@findex gnus-group-next-unread-group-same-level -Go to the next unread group on the same (or lower) level -(@code{gnus-group-next-unread-group-same-level}). - -@item M-p -@kindex M-p (Group) -@findex gnus-group-prev-unread-group-same-level -Go to the previous unread group on the same (or lower) level -(@code{gnus-group-prev-unread-group-same-level}). -@end table - -Three commands for jumping to groups: - -@table @kbd - -@item j -@kindex j (Group) -@findex gnus-group-jump-to-group -Jump to a group (and make it visible if it isn't already) -(@code{gnus-group-jump-to-group}). Killed groups can be jumped to, just -like living groups. - -@item , -@kindex , (Group) -@findex gnus-group-best-unread-group -Jump to the unread group with the lowest level -(@code{gnus-group-best-unread-group}). - -@item . -@kindex . (Group) -@findex gnus-group-first-unread-group -Jump to the first group with unread articles -(@code{gnus-group-first-unread-group}). -@end table - -@vindex gnus-group-goto-unread -If @code{gnus-group-goto-unread} is @code{nil}, all the movement -commands will move to the next group, not the next unread group. Even -the commands that say they move to the next unread group. The default -is @code{t}. - - -@node Selecting a Group -@section Selecting a Group -@cindex group selection - -@table @kbd - -@item SPACE -@kindex SPACE (Group) -@findex gnus-group-read-group -Select the current group, switch to the summary buffer and display the -first unread article (@code{gnus-group-read-group}). If there are no -unread articles in the group, or if you give a non-numerical prefix to -this command, gnus will offer to fetch all the old articles in this -group from the server. If you give a numerical prefix @var{N}, @var{N} -determines the number of articles gnus will fetch. If @var{N} is -positive, gnus fetches the @var{N} newest articles, if @var{N} is -negative, Gnus fetches the @code{abs(@var{N})} oldest articles. - -Thus, @kbd{SPC} enters the group normally, @kbd{C-u SPC} offers old -articles, @kbd{C-u 4 2 SPC} fetches the 42 newest articles, and @kbd{C-u -- 4 2 SPC} fetches the 42 oldest ones. - -When you are in the group (in the Summary buffer), you can type -@kbd{M-g} to fetch new articles, or @kbd{C-u M-g} to also show the old -ones. - -@item RET -@kindex RET (Group) -@findex gnus-group-select-group -Select the current group and switch to the summary buffer -(@code{gnus-group-select-group}). Takes the same arguments as -@code{gnus-group-read-group}---the only difference is that this command -does not display the first unread article automatically upon group -entry. - -@item M-RET -@kindex M-RET (Group) -@findex gnus-group-quick-select-group -This does the same as the command above, but tries to do it with the -minimum amount of fuzz (@code{gnus-group-quick-select-group}). No -scoring/killing will be performed, there will be no highlights and no -expunging. This might be useful if you're in a real hurry and have to -enter some humongous group. If you give a 0 prefix to this command -(i.e., @kbd{0 M-RET}), gnus won't even generate the summary buffer, -which is useful if you want to toggle threading before generating the -summary buffer (@pxref{Summary Generation Commands}). - -@item M-SPACE -@kindex M-SPACE (Group) -@findex gnus-group-visible-select-group -This is yet one more command that does the same as the @kbd{RET} -command, but this one does it without expunging and hiding dormants -(@code{gnus-group-visible-select-group}). - -@item M-C-RET -@kindex M-C-RET (Group) -@findex gnus-group-select-group-ephemerally -Finally, this command selects the current group ephemerally without -doing any processing of its contents -(@code{gnus-group-select-group-ephemerally}). Even threading has been -turned off. Everything you do in the group after selecting it in this -manner will have no permanent effects. - -@end table - -@vindex gnus-large-newsgroup -The @code{gnus-large-newsgroup} variable says what gnus should consider -to be a big group. This is 200 by default. If the group has more -(unread and/or ticked) articles than this, gnus will query the user -before entering the group. The user can then specify how many articles -should be fetched from the server. If the user specifies a negative -number (@code{-n}), the @code{n} oldest articles will be fetched. If it -is positive, the @code{n} articles that have arrived most recently will -be fetched. - -@vindex gnus-select-group-hook -@vindex gnus-auto-select-first -@code{gnus-auto-select-first} control whether any articles are selected -automatically when entering a group with the @kbd{SPACE} command. - -@table @code - -@item nil -Don't select any articles when entering the group. Just display the -full summary buffer. - -@item t -Select the first unread article when entering the group. - -@item best -Select the highest scored article in the group when entering the -group. - -@end table - -This variable can also be a function. In that case, that function will -be called to place point on a subject line, and/or select some article. -Useful functions include: - -@table @code -@item gnus-summary-first-unread-subject -Place point on the subject line of the first unread article, but -don't select the article. - -@item gnus-summary-first-unread-article -Select the first unread article. - -@item gnus-summary-best-unread-article -Select the highest-scored unread article. -@end table - - -If you want to prevent automatic selection in some group (say, in a -binary group with Huge articles) you can set this variable to @code{nil} -in @code{gnus-select-group-hook}, which is called when a group is -selected. - - -@node Subscription Commands -@section Subscription Commands -@cindex subscription - -@table @kbd - -@item S t -@itemx u -@kindex S t (Group) -@kindex u (Group) -@findex gnus-group-unsubscribe-current-group -@c @icon{gnus-group-unsubscribe} -Toggle subscription to the current group -(@code{gnus-group-unsubscribe-current-group}). - -@item S s -@itemx U -@kindex S s (Group) -@kindex U (Group) -@findex gnus-group-unsubscribe-group -Prompt for a group to subscribe, and then subscribe it. If it was -subscribed already, unsubscribe it instead -(@code{gnus-group-unsubscribe-group}). - -@item S k -@itemx C-k -@kindex S k (Group) -@kindex C-k (Group) -@findex gnus-group-kill-group -@c @icon{gnus-group-kill-group} -Kill the current group (@code{gnus-group-kill-group}). - -@item S y -@itemx C-y -@kindex S y (Group) -@kindex C-y (Group) -@findex gnus-group-yank-group -Yank the last killed group (@code{gnus-group-yank-group}). - -@item C-x C-t -@kindex C-x C-t (Group) -@findex gnus-group-transpose-groups -Transpose two groups (@code{gnus-group-transpose-groups}). This isn't -really a subscription command, but you can use it instead of a -kill-and-yank sequence sometimes. - -@item S w -@itemx C-w -@kindex S w (Group) -@kindex C-w (Group) -@findex gnus-group-kill-region -Kill all groups in the region (@code{gnus-group-kill-region}). - -@item S z -@kindex S z (Group) -@findex gnus-group-kill-all-zombies -Kill all zombie groups (@code{gnus-group-kill-all-zombies}). - -@item S C-k -@kindex S C-k (Group) -@findex gnus-group-kill-level -Kill all groups on a certain level (@code{gnus-group-kill-level}). -These groups can't be yanked back after killing, so this command should -be used with some caution. The only time where this command comes in -really handy is when you have a @file{.newsrc} with lots of unsubscribed -groups that you want to get rid off. @kbd{S C-k} on level 7 will -kill off all unsubscribed groups that do not have message numbers in the -@file{.newsrc} file. - -@end table - -Also @pxref{Group Levels}. - - -@node Group Data -@section Group Data - -@table @kbd - -@item c -@kindex c (Group) -@findex gnus-group-catchup-current -@vindex gnus-group-catchup-group-hook -@c @icon{gnus-group-catchup-current} -Mark all unticked articles in this group as read -(@code{gnus-group-catchup-current}). -@code{gnus-group-catchup-group-hook} is called when catching up a group from -the group buffer. - -@item C -@kindex C (Group) -@findex gnus-group-catchup-current-all -Mark all articles in this group, even the ticked ones, as read -(@code{gnus-group-catchup-current-all}). - -@item M-c -@kindex M-c (Group) -@findex gnus-group-clear-data -Clear the data from the current group---nix out marks and the list of -read articles (@code{gnus-group-clear-data}). - -@item M-x gnus-group-clear-data-on-native-groups -@kindex M-x gnus-group-clear-data-on-native-groups -@findex gnus-group-clear-data-on-native-groups -If you have switched from one @sc{nntp} server to another, all your marks -and read ranges have become worthless. You can use this command to -clear out all data that you have on your native groups. Use with -caution. - -@end table - - -@node Group Levels -@section Group Levels -@cindex group level -@cindex level - -All groups have a level of @dfn{subscribedness}. For instance, if a -group is on level 2, it is more subscribed than a group on level 5. You -can ask gnus to just list groups on a given level or lower -(@pxref{Listing Groups}), or to just check for new articles in groups on -a given level or lower (@pxref{Scanning New Messages}). - -Remember: The higher the level of the group, the less important it is. - -@table @kbd - -@item S l -@kindex S l (Group) -@findex gnus-group-set-current-level -Set the level of the current group. If a numeric prefix is given, the -next @var{n} groups will have their levels set. The user will be -prompted for a level. -@end table - -@vindex gnus-level-killed -@vindex gnus-level-zombie -@vindex gnus-level-unsubscribed -@vindex gnus-level-subscribed -Gnus considers groups from levels 1 to -@code{gnus-level-subscribed} (inclusive) (default 5) to be subscribed, -@code{gnus-level-subscribed} (exclusive) and -@code{gnus-level-unsubscribed} (inclusive) (default 7) to be -unsubscribed, @code{gnus-level-zombie} to be zombies (walking dead) -(default 8) and @code{gnus-level-killed} to be killed (completely dead) -(default 9). Gnus treats subscribed and unsubscribed groups exactly the -same, but zombie and killed groups have no information on what articles -you have read, etc, stored. This distinction between dead and living -groups isn't done because it is nice or clever, it is done purely for -reasons of efficiency. - -It is recommended that you keep all your mail groups (if any) on quite -low levels (e.g. 1 or 2). - -Maybe the following description of the default behavior of Gnus helps to -understand what these levels are all about. By default, Gnus shows you -subscribed nonempty groups, but by hitting @kbd{L} you can have it show -empty subscribed groups and unsubscribed groups, too. Type @kbd{l} to -go back to showing nonempty subscribed groups again. Thus, unsubscribed -groups are hidden, in a way. - -Zombie and killed groups are similar to unsubscribed groups in that they -are hidden by default. But they are different from subscribed and -unsubscribed groups in that Gnus doesn't ask the news server for -information (number of messages, number of unread messages) on zombie -and killed groups. Normally, you use @kbd{C-k} to kill the groups you -aren't interested in. If most groups are killed, Gnus is faster. - -Why does Gnus distinguish between zombie and killed groups? Well, when -a new group arrives on the server, Gnus by default makes it a zombie -group. This means that you are normally not bothered with new groups, -but you can type @kbd{A z} to get a list of all new groups. Subscribe -the ones you like and kill the ones you don't want. (@kbd{A k} shows a -list of killed groups.) - -If you want to play with the level variables, you should show some care. -Set them once, and don't touch them ever again. Better yet, don't touch -them at all unless you know exactly what you're doing. - -@vindex gnus-level-default-unsubscribed -@vindex gnus-level-default-subscribed -Two closely related variables are @code{gnus-level-default-subscribed} -(default 3) and @code{gnus-level-default-unsubscribed} (default 6), -which are the levels that new groups will be put on if they are -(un)subscribed. These two variables should, of course, be inside the -relevant valid ranges. - -@vindex gnus-keep-same-level -If @code{gnus-keep-same-level} is non-@code{nil}, some movement commands -will only move to groups of the same level (or lower). In -particular, going from the last article in one group to the next group -will go to the next group of the same level (or lower). This might be -handy if you want to read the most important groups before you read the -rest. - -If this variable is @code{best}, Gnus will make the next newsgroup the -one with the best level. - -@vindex gnus-group-default-list-level -All groups with a level less than or equal to -@code{gnus-group-default-list-level} will be listed in the group buffer -by default. - -@vindex gnus-group-list-inactive-groups -If @code{gnus-group-list-inactive-groups} is non-@code{nil}, non-active -groups will be listed along with the unread groups. This variable is -@code{t} by default. If it is @code{nil}, inactive groups won't be -listed. - -@vindex gnus-group-use-permanent-levels -If @code{gnus-group-use-permanent-levels} is non-@code{nil}, once you -give a level prefix to @kbd{g} or @kbd{l}, all subsequent commands will -use this level as the ``work'' level. - -@vindex gnus-activate-level -Gnus will normally just activate (i. e., query the server about) groups -on level @code{gnus-activate-level} or less. If you don't want to -activate unsubscribed groups, for instance, you might set this variable -to 5. The default is 6. - - -@node Group Score -@section Group Score -@cindex group score -@cindex group rank -@cindex rank - -You would normally keep important groups on high levels, but that scheme -is somewhat restrictive. Don't you wish you could have Gnus sort the -group buffer according to how often you read groups, perhaps? Within -reason? - -This is what @dfn{group score} is for. You can have Gnus assign a score -to each group through the mechanism described below. You can then sort -the group buffer based on this score. Alternatively, you can sort on -score and then level. (Taken together, the level and the score is -called the @dfn{rank} of the group. A group that is on level 4 and has -a score of 1 has a higher rank than a group on level 5 that has a score -of 300. (The level is the most significant part and the score is the -least significant part.)) - -@findex gnus-summary-bubble-group -If you want groups you read often to get higher scores than groups you -read seldom you can add the @code{gnus-summary-bubble-group} function to -the @code{gnus-summary-exit-hook} hook. This will result (after -sorting) in a bubbling sort of action. If you want to see that in -action after each summary exit, you can add -@code{gnus-group-sort-groups-by-rank} or -@code{gnus-group-sort-groups-by-score} to the same hook, but that will -slow things down somewhat. - - -@node Marking Groups -@section Marking Groups -@cindex marking groups - -If you want to perform some command on several groups, and they appear -subsequently in the group buffer, you would normally just give a -numerical prefix to the command. Most group commands will then do your -bidding on those groups. - -However, if the groups are not in sequential order, you can still -perform a command on several groups. You simply mark the groups first -with the process mark and then execute the command. - -@table @kbd - -@item # -@kindex # (Group) -@itemx M m -@kindex M m (Group) -@findex gnus-group-mark-group -Set the mark on the current group (@code{gnus-group-mark-group}). - -@item M-# -@kindex M-# (Group) -@itemx M u -@kindex M u (Group) -@findex gnus-group-unmark-group -Remove the mark from the current group -(@code{gnus-group-unmark-group}). - -@item M U -@kindex M U (Group) -@findex gnus-group-unmark-all-groups -Remove the mark from all groups (@code{gnus-group-unmark-all-groups}). - -@item M w -@kindex M w (Group) -@findex gnus-group-mark-region -Mark all groups between point and mark (@code{gnus-group-mark-region}). - -@item M b -@kindex M b (Group) -@findex gnus-group-mark-buffer -Mark all groups in the buffer (@code{gnus-group-mark-buffer}). - -@item M r -@kindex M r (Group) -@findex gnus-group-mark-regexp -Mark all groups that match some regular expression -(@code{gnus-group-mark-regexp}). -@end table - -Also @pxref{Process/Prefix}. - -@findex gnus-group-universal-argument -If you want to execute some command on all groups that have been marked -with the process mark, you can use the @kbd{M-&} -(@code{gnus-group-universal-argument}) command. It will prompt you for -the command to be executed. - - -@node Foreign Groups -@section Foreign Groups -@cindex foreign groups - -Below are some group mode commands for making and editing general foreign -groups, as well as commands to ease the creation of a few -special-purpose groups. All these commands insert the newly created -groups under point---@code{gnus-subscribe-newsgroup-method} is not -consulted. - -@table @kbd - -@item G m -@kindex G m (Group) -@findex gnus-group-make-group -@cindex making groups -Make a new group (@code{gnus-group-make-group}). Gnus will prompt you -for a name, a method and possibly an @dfn{address}. For an easier way -to subscribe to @sc{nntp} groups, @pxref{Browse Foreign Server}. - -@item G r -@kindex G r (Group) -@findex gnus-group-rename-group -@cindex renaming groups -Rename the current group to something else -(@code{gnus-group-rename-group}). This is valid only on some -groups---mail groups mostly. This command might very well be quite slow -on some backends. - -@item G c -@kindex G c (Group) -@cindex customizing -@findex gnus-group-customize -Customize the group parameters (@code{gnus-group-customize}). - -@item G e -@kindex G e (Group) -@findex gnus-group-edit-group-method -@cindex renaming groups -Enter a buffer where you can edit the select method of the current -group (@code{gnus-group-edit-group-method}). - -@item G p -@kindex G p (Group) -@findex gnus-group-edit-group-parameters -Enter a buffer where you can edit the group parameters -(@code{gnus-group-edit-group-parameters}). - -@item G E -@kindex G E (Group) -@findex gnus-group-edit-group -Enter a buffer where you can edit the group info -(@code{gnus-group-edit-group}). - -@item G d -@kindex G d (Group) -@findex gnus-group-make-directory-group -@cindex nndir -Make a directory group (@pxref{Directory Groups}). You will be prompted -for a directory name (@code{gnus-group-make-directory-group}). - -@item G h -@kindex G h (Group) -@cindex help group -@findex gnus-group-make-help-group -Make the gnus help group (@code{gnus-group-make-help-group}). - -@item G a -@kindex G a (Group) -@cindex (ding) archive -@cindex archive group -@findex gnus-group-make-archive-group -@vindex gnus-group-archive-directory -@vindex gnus-group-recent-archive-directory -Make a gnus archive group (@code{gnus-group-make-archive-group}). By -default a group pointing to the most recent articles will be created -(@code{gnus-group-recent-archive-directory}), but given a prefix, a full -group will be created from @code{gnus-group-archive-directory}. - -@item G k -@kindex G k (Group) -@findex gnus-group-make-kiboze-group -@cindex nnkiboze -Make a kiboze group. You will be prompted for a name, for a regexp to -match groups to be ``included'' in the kiboze group, and a series of -strings to match on headers (@code{gnus-group-make-kiboze-group}). -@xref{Kibozed Groups}. - -@item G D -@kindex G D (Group) -@findex gnus-group-enter-directory -@cindex nneething -Read an arbitrary directory as if it were a newsgroup with the -@code{nneething} backend (@code{gnus-group-enter-directory}). -@xref{Anything Groups}. - -@item G f -@kindex G f (Group) -@findex gnus-group-make-doc-group -@cindex ClariNet Briefs -@cindex nndoc -Make a group based on some file or other -(@code{gnus-group-make-doc-group}). If you give a prefix to this -command, you will be prompted for a file name and a file type. -Currently supported types are @code{babyl}, @code{mbox}, @code{digest}, -@code{mmdf}, @code{news}, @code{rnews}, @code{clari-briefs}, -@code{rfc934}, @code{rfc822-forward}, @code{nsmail} and @code{forward}. -If you run this command without a prefix, Gnus will guess at the file -type. @xref{Document Groups}. - -@item G u -@kindex G u (Group) -@vindex gnus-useful-groups -@findex gnus-group-make-useful-group -Create one of the groups mentioned in @code{gnus-useful-groups} -(@code{gnus-group-make-useful-group}). - -@item G w -@kindex G w (Group) -@findex gnus-group-make-web-group -@cindex DejaNews -@cindex Alta Vista -@cindex InReference -@cindex nnweb -Make an ephemeral group based on a web search -(@code{gnus-group-make-web-group}). If you give a prefix to this -command, make a solid group instead. You will be prompted for the -search engine type and the search string. Valid search engine types -include @code{dejanews}, @code{altavista} and @code{reference}. -@xref{Web Searches}. - -If you use the @code{dejanews} search engine, you can limit the search -to a particular group by using a match string like -@samp{~g alt.sysadmin.recovery shaving}. - -@item G DEL -@kindex G DEL (Group) -@findex gnus-group-delete-group -This function will delete the current group -(@code{gnus-group-delete-group}). If given a prefix, this function will -actually delete all the articles in the group, and forcibly remove the -group itself from the face of the Earth. Use a prefix only if you are -absolutely sure of what you are doing. This command can't be used on -read-only groups (like @code{nntp} group), though. - -@item G V -@kindex G V (Group) -@findex gnus-group-make-empty-virtual -Make a new, fresh, empty @code{nnvirtual} group -(@code{gnus-group-make-empty-virtual}). @xref{Virtual Groups}. - -@item G v -@kindex G v (Group) -@findex gnus-group-add-to-virtual -Add the current group to an @code{nnvirtual} group -(@code{gnus-group-add-to-virtual}). Uses the process/prefix convention. -@end table - -@xref{Select Methods}, for more information on the various select -methods. - -@vindex gnus-activate-foreign-newsgroups -If @code{gnus-activate-foreign-newsgroups} is a positive number, -gnus will check all foreign groups with this level or lower at startup. -This might take quite a while, especially if you subscribe to lots of -groups from different @sc{nntp} servers. Also @pxref{Group Levels}; -@code{gnus-activate-level} also affects activation of foreign -newsgroups. - - -@node Group Parameters -@section Group Parameters -@cindex group parameters - -The group parameters store information local to a particular group. -Here's an example group parameter list: - -@example -((to-address . "ding@@gnus.org") - (auto-expire . t)) -@end example - -We see that each element consists of a "dotted pair"---the thing before -the dot is the key, while the thing after the dot is the value. All the -parameters have this form @emph{except} local variable specs, which are -not dotted pairs, but proper lists. - -Some parameters have correspondant customizable variables, each of which -is an alist of regexps and values. - -The following group parameters can be used: - -@table @code -@item to-address -@cindex to-address -Address used by when doing followups and new posts. - -@example -(to-address . "some@@where.com") -@end example - -This is primarily useful in mail groups that represent closed mailing -lists---mailing lists where it's expected that everybody that writes to -the mailing list is subscribed to it. Since using this parameter -ensures that the mail only goes to the mailing list itself, it means -that members won't receive two copies of your followups. - -Using @code{to-address} will actually work whether the group is foreign -or not. Let's say there's a group on the server that is called -@samp{fa.4ad-l}. This is a real newsgroup, but the server has gotten -the articles from a mail-to-news gateway. Posting directly to this -group is therefore impossible---you have to send mail to the mailing -list address instead. - -See also @code{gnus-parameter-to-address-alist}. - -@item to-list -@cindex to-list -Address used when doing @kbd{a} in that group. - -@example -(to-list . "some@@where.com") -@end example - -It is totally ignored -when doing a followup---except that if it is present in a news group, -you'll get mail group semantics when doing @kbd{f}. - -If you do an @kbd{a} command in a mail group and you have neither a -@code{to-list} group parameter nor a @code{to-address} group parameter, -then a @code{to-list} group parameter will be added automatically upon -sending the message if @code{gnus-add-to-list} is set to @code{t}. -@vindex gnus-add-to-list - -If you do an @kbd{a} command in a mail group and you don't have a -@code{to-list} group parameter, one will be added automatically upon -sending the message. - -@findex gnus-mailing-list-mode -@cindex Mail List Groups -If this variable is set, @code{gnus-mailing-list-mode} is turned on when -entering summary buffer. - -See also @code{gnus-parameter-to-list-alist}. - -@item visible -@cindex visible -If the group parameter list has the element @code{(visible . t)}, -that group will always be visible in the Group buffer, regardless -of whether it has any unread articles. - -@item broken-reply-to -@cindex broken-reply-to -Elements like @code{(broken-reply-to . t)} signals that @code{Reply-To} -headers in this group are to be ignored. This can be useful if you're -reading a mailing list group where the listserv has inserted -@code{Reply-To} headers that point back to the listserv itself. This is -broken behavior. So there! - -@item to-group -@cindex to-group -Elements like @code{(to-group . "some.group.name")} means that all -posts in that group will be sent to @code{some.group.name}. - -@item newsgroup -@cindex newsgroup -If you have @code{(newsgroup . t)} in the group parameter list, gnus -will treat all responses as if they were responses to news articles. -This can be useful if you have a mail group that's really a mirror of a -news group. - -@item gcc-self -@cindex gcc-self -If @code{(gcc-self . t)} is present in the group parameter list, newly -composed messages will be @code{Gcc}'d to the current group. If -@code{(gcc-self . none)} is present, no @code{Gcc:} header will be -generated, if @code{(gcc-self . "string")} is present, this string will -be inserted literally as a @code{gcc} header. This parameter takes -precedence over any default @code{Gcc} rules as described later -(@pxref{Archived Messages}). - -@item auto-expire -@cindex auto-expire -If the group parameter has an element that looks like @code{(auto-expire -. t)}, all articles read will be marked as expirable. For an -alternative approach, @pxref{Expiring Mail}. - -See also @code{gnus-auto-expirable-newsgroups}. - -@item total-expire -@cindex total-expire -If the group parameter has an element that looks like -@code{(total-expire . t)}, all read articles will be put through the -expiry process, even if they are not marked as expirable. Use with -caution. Unread, ticked and dormant articles are not eligible for -expiry. - -See also @code{gnus-total-expirable-newsgroups}. - -@item expiry-wait -@cindex expiry-wait -@vindex nnmail-expiry-wait-function -If the group parameter has an element that looks like @code{(expiry-wait -. 10)}, this value will override any @code{nnmail-expiry-wait} and -@code{nnmail-expiry-wait-function} when expiring expirable messages. -The value can either be a number of days (not necessarily an integer) or -the symbols @code{never} or @code{immediate}. - -@item score-file -@cindex score file group parameter -Elements that look like @code{(score-file . "file")} will make -@file{file} into the current score file for the group in question. All -interactive score entries will be put into this file. - -@item adapt-file -@cindex adapt file group parameter -Elements that look like @code{(adapt-file . "file")} will make -@file{file} into the current adaptive file for the group in question. -All adaptive score entries will be put into this file. - -@item admin-address -@cindex admin-address -When unsubscribing from a mailing list you should never send the -unsubscription notice to the mailing list itself. Instead, you'd send -messages to the administrative address. This parameter allows you to -put the admin address somewhere convenient. - -@item display -@cindex display -Elements that look like @code{(display . MODE)} say which articles to -display on entering the group. Valid values are: - -@table @code -@item all -Display all articles, both read and unread. - -@item default -Display the default visible articles, which normally includes unread and -ticked articles. - -@item an array -Display articles that satisfy a predicate. - -Here are some examples: - -@table @code -@item [read] -Display only read articles. - -@item [not expire] -Display everything except expirable articles. - -@item [and (not reply) (not expire)] -Display everything except expirable and articles you've already -responded to. -@end table - -The available operators are @code{not}, @code{and} and @code{or}. -Predicates include @code{tick}, @code{unsend}, @code{undownload}, -@code{read}, @code{dormant}, @code{expire}, @code{reply}, -@code{killed}, @code{bookmark}, @code{score}, @code{save}, -@code{cache}, @code{forward}, @code{seen} and @code{recent}. - -@end table - -The @code{display} parameter works by limiting the summary buffer to -the subset specified. You can pop the limit by using the @kbd{/ w} -command (@pxref{Limiting}). - -@item comment -@cindex comment -Elements that look like @code{(comment . "This is a comment")} -are arbitrary comments on the group. They are currently ignored by -gnus, but provide a place for you to store information on particular -groups. - -@item charset -@cindex charset -Elements that look like @code{(charset . iso-8859-1)} will make -@code{iso-8859-1} the default charset; that is, the charset that will be -used for all articles that do not specify a charset. - -See also @code{gnus-group-charset-alist}. - -@item ignored-charsets -@cindex ignored-charset -Elements that look like @code{(ignored-charsets x-unknown iso-8859-1)} -will make @code{iso-8859-1} and @code{x-unknown} ignored; that is, the -default charset will be used for decoding articles. - -See also @code{gnus-group-ignored-charsets-alist}. - -@item posting-style -@cindex posting-style -You can store additional posting style information for this group only -here (@pxref{Posting Styles}). The format is that of an entry in the -@code{gnus-posting-styles} alist, except that there's no regexp matching -the group name (of course). Style elements in this group parameter will -take precedence over the ones found in @code{gnus-posting-styles}. - -For instance, if you want a funky name and signature in this group only, -instead of hacking @code{gnus-posting-styles}, you could put something -like this in the group parameters: - -@example -(posting-style - (name "Funky Name") - (signature "Funky Signature")) -@end example - -@item post-method -@cindex post-method -If it is set, the value is used as the method for posting message -instead of @code{gnus-post-method}. - -@item banner -@cindex banner -An item like @code{(banner . "regex")} causes any part of an article -that matches the regular expression "regex" to be stripped. Instead of -"regex", you can also use the symbol @code{signature} which strips the -last signature or any of the elements of the alist -@code{gnus-article-banner-alist}. - -@item (@var{variable} @var{form}) -You can use the group parameters to set variables local to the group you -are entering. If you want to turn threading off in @samp{news.answers}, -you could put @code{(gnus-show-threads nil)} in the group parameters of -that group. @code{gnus-show-threads} will be made into a local variable -in the summary buffer you enter, and the form @code{nil} will be -@code{eval}ed there. - -This can also be used as a group-specific hook function, if you'd like. -If you want to hear a beep when you enter a group, you could put -something like @code{(dummy-variable (ding))} in the parameters of that -group. @code{dummy-variable} will be set to the result of the -@code{(ding)} form, but who cares? - -@end table - -Use the @kbd{G p} or the @kbd{G c} command to edit group parameters of a -group. (@kbd{G p} presents you with a Lisp-based interface, @kbd{G c} -presents you with a Customize-like interface. The latter helps avoid -silly Lisp errors.) You might also be interested in reading about topic -parameters (@pxref{Topic Parameters}). - -Group parameters can be set via the @code{gnus-parameters} variable too. -But some variables, such as @code{visible}, have no effect. For -example: - -@example -(setq gnus-parameters - '(("mail\\..*" - (gnus-show-threads nil) - (gnus-use-scoring nil) - (gnus-summary-line-format - "%U%R%z%I%(%[%d:%ub%-23,23f%]%) %s\n") - (gcc-self . t) - (display . all)) - - ("^nnimap:\\(foo.bar\\)$" - (to-group . "\\1")) - - ("mail\\.me" - (gnus-use-scoring t)) - - ("list\\..*" - (total-expire . t) - (broken-reply-to . t)))) -@end example - -String value of parameters will be subjected to regexp substitution, as -the @code{to-group} example shows. - - -@node Listing Groups -@section Listing Groups -@cindex group listing - -These commands all list various slices of the groups available. - -@table @kbd - -@item l -@itemx A s -@kindex A s (Group) -@kindex l (Group) -@findex gnus-group-list-groups -List all groups that have unread articles -(@code{gnus-group-list-groups}). If the numeric prefix is used, this -command will list only groups of level ARG and lower. By default, it -only lists groups of level five (i. e., -@code{gnus-group-default-list-level}) or lower (i.e., just subscribed -groups). - -@item L -@itemx A u -@kindex A u (Group) -@kindex L (Group) -@findex gnus-group-list-all-groups -List all groups, whether they have unread articles or not -(@code{gnus-group-list-all-groups}). If the numeric prefix is used, -this command will list only groups of level ARG and lower. By default, -it lists groups of level seven or lower (i.e., just subscribed and -unsubscribed groups). - -@item A l -@kindex A l (Group) -@findex gnus-group-list-level -List all unread groups on a specific level -(@code{gnus-group-list-level}). If given a prefix, also list the groups -with no unread articles. - -@item A k -@kindex A k (Group) -@findex gnus-group-list-killed -List all killed groups (@code{gnus-group-list-killed}). If given a -prefix argument, really list all groups that are available, but aren't -currently (un)subscribed. This could entail reading the active file -from the server. - -@item A z -@kindex A z (Group) -@findex gnus-group-list-zombies -List all zombie groups (@code{gnus-group-list-zombies}). - -@item A m -@kindex A m (Group) -@findex gnus-group-list-matching -List all unread, subscribed groups with names that match a regexp -(@code{gnus-group-list-matching}). - -@item A M -@kindex A M (Group) -@findex gnus-group-list-all-matching -List groups that match a regexp (@code{gnus-group-list-all-matching}). - -@item A A -@kindex A A (Group) -@findex gnus-group-list-active -List absolutely all groups in the active file(s) of the -server(s) you are connected to (@code{gnus-group-list-active}). This -might very well take quite a while. It might actually be a better idea -to do a @kbd{A M} to list all matching, and just give @samp{.} as the -thing to match on. Also note that this command may list groups that -don't exist (yet)---these will be listed as if they were killed groups. -Take the output with some grains of salt. - -@item A a -@kindex A a (Group) -@findex gnus-group-apropos -List all groups that have names that match a regexp -(@code{gnus-group-apropos}). - -@item A d -@kindex A d (Group) -@findex gnus-group-description-apropos -List all groups that have names or descriptions that match a regexp -(@code{gnus-group-description-apropos}). - -@item A c -@kindex A c (Group) -@findex gnus-group-list-cached -List all groups with cached articles (@code{gnus-group-list-cached}). - -@item A ? -@kindex A ? (Group) -@findex gnus-group-list-dormant -List all groups with dormant articles (@code{gnus-group-list-dormant}). - -@item A / -@kindex A / (Group) -@findex gnus-group-list-limit -List groups limited within the current selection -(@code{gnus-group-list-limit}). - -@item A f -@kindex A f (Group) -@findex gnus-group-list-flush -Flush groups from the current selection (@code{gnus-group-list-flush}). - -@item A p -@kindex A p (Group) -@findex gnus-group-list-plus -List groups plus the current selection (@code{gnus-group-list-plus}). - -@end table - -@vindex gnus-permanently-visible-groups -@cindex visible group parameter -Groups that match the @code{gnus-permanently-visible-groups} regexp will -always be shown, whether they have unread articles or not. You can also -add the @code{visible} element to the group parameters in question to -get the same effect. - -@vindex gnus-list-groups-with-ticked-articles -Groups that have just ticked articles in it are normally listed in the -group buffer. If @code{gnus-list-groups-with-ticked-articles} is -@code{nil}, these groups will be treated just like totally empty -groups. It is @code{t} by default. - - -@node Sorting Groups -@section Sorting Groups -@cindex sorting groups - -@kindex C-c C-s (Group) -@findex gnus-group-sort-groups -@vindex gnus-group-sort-function -The @kbd{C-c C-s} (@code{gnus-group-sort-groups}) command sorts the -group buffer according to the function(s) given by the -@code{gnus-group-sort-function} variable. Available sorting functions -include: - -@table @code - -@item gnus-group-sort-by-alphabet -@findex gnus-group-sort-by-alphabet -Sort the group names alphabetically. This is the default. - -@item gnus-group-sort-by-real-name -@findex gnus-group-sort-by-real-name -Sort the group alphabetically on the real (unprefixed) group names. - -@item gnus-group-sort-by-level -@findex gnus-group-sort-by-level -Sort by group level. - -@item gnus-group-sort-by-score -@findex gnus-group-sort-by-score -Sort by group score. @xref{Group Score}. - -@item gnus-group-sort-by-rank -@findex gnus-group-sort-by-rank -Sort by group score and then the group level. The level and the score -are, when taken together, the group's @dfn{rank}. @xref{Group Score}. - -@item gnus-group-sort-by-unread -@findex gnus-group-sort-by-unread -Sort by number of unread articles. - -@item gnus-group-sort-by-method -@findex gnus-group-sort-by-method -Sort alphabetically on the select method. - -@item gnus-group-sort-by-server -@findex gnus-group-sort-by-server -Sort alphabetically on the Gnus server name. - - -@end table - -@code{gnus-group-sort-function} can also be a list of sorting -functions. In that case, the most significant sort key function must be -the last one. - - -There are also a number of commands for sorting directly according to -some sorting criteria: - -@table @kbd -@item G S a -@kindex G S a (Group) -@findex gnus-group-sort-groups-by-alphabet -Sort the group buffer alphabetically by group name -(@code{gnus-group-sort-groups-by-alphabet}). - -@item G S u -@kindex G S u (Group) -@findex gnus-group-sort-groups-by-unread -Sort the group buffer by the number of unread articles -(@code{gnus-group-sort-groups-by-unread}). - -@item G S l -@kindex G S l (Group) -@findex gnus-group-sort-groups-by-level -Sort the group buffer by group level -(@code{gnus-group-sort-groups-by-level}). - -@item G S v -@kindex G S v (Group) -@findex gnus-group-sort-groups-by-score -Sort the group buffer by group score -(@code{gnus-group-sort-groups-by-score}). @xref{Group Score}. - -@item G S r -@kindex G S r (Group) -@findex gnus-group-sort-groups-by-rank -Sort the group buffer by group rank -(@code{gnus-group-sort-groups-by-rank}). @xref{Group Score}. - -@item G S m -@kindex G S m (Group) -@findex gnus-group-sort-groups-by-method -Sort the group buffer alphabetically by backend name -(@code{gnus-group-sort-groups-by-method}). - -@end table - -All the commands below obey the process/prefix convention -(@pxref{Process/Prefix}). - -When given a symbolic prefix (@pxref{Symbolic Prefixes}), all these -commands will sort in reverse order. - -You can also sort a subset of the groups: - -@table @kbd -@item G P a -@kindex G P a (Group) -@findex gnus-group-sort-selected-groups-by-alphabet -Sort the groups alphabetically by group name -(@code{gnus-group-sort-selected-groups-by-alphabet}). - -@item G P u -@kindex G P u (Group) -@findex gnus-group-sort-selected-groups-by-unread -Sort the groups by the number of unread articles -(@code{gnus-group-sort-selected-groups-by-unread}). - -@item G P l -@kindex G P l (Group) -@findex gnus-group-sort-selected-groups-by-level -Sort the groups by group level -(@code{gnus-group-sort-selected-groups-by-level}). - -@item G P v -@kindex G P v (Group) -@findex gnus-group-sort-selected-groups-by-score -Sort the groups by group score -(@code{gnus-group-sort-selected-groups-by-score}). @xref{Group Score}. - -@item G P r -@kindex G P r (Group) -@findex gnus-group-sort-selected-groups-by-rank -Sort the groups by group rank -(@code{gnus-group-sort-selected-groups-by-rank}). @xref{Group Score}. - -@item G P m -@kindex G P m (Group) -@findex gnus-group-sort-selected-groups-by-method -Sort the groups alphabetically by backend name -(@code{gnus-group-sort-selected-groups-by-method}). - -@end table - -And finally, note that you can use @kbd{C-k} and @kbd{C-y} to manually -move groups around. - - -@node Group Maintenance -@section Group Maintenance -@cindex bogus groups - -@table @kbd -@item b -@kindex b (Group) -@findex gnus-group-check-bogus-groups -Find bogus groups and delete them -(@code{gnus-group-check-bogus-groups}). - -@item F -@kindex F (Group) -@findex gnus-group-find-new-groups -Find new groups and process them (@code{gnus-group-find-new-groups}). -With 1 @kbd{C-u}, use the @code{ask-server} method to query the server -for new groups. With 2 @kbd{C-u}'s, use most complete method possible -to query the server for new groups, and subscribe the new groups as -zombies. - -@item C-c C-x -@kindex C-c C-x (Group) -@findex gnus-group-expire-articles -Run all expirable articles in the current group through the expiry -process (if any) (@code{gnus-group-expire-articles}). That is, delete -all expirable articles in the group that have been around for a while. -(@pxref{Expiring Mail}). - -@item C-c M-C-x -@kindex C-c M-C-x (Group) -@findex gnus-group-expire-all-groups -Run all expirable articles in all groups through the expiry process -(@code{gnus-group-expire-all-groups}). - -@end table - - -@node Browse Foreign Server -@section Browse Foreign Server -@cindex foreign servers -@cindex browsing servers - -@table @kbd -@item B -@kindex B (Group) -@findex gnus-group-browse-foreign-server -You will be queried for a select method and a server name. Gnus will -then attempt to contact this server and let you browse the groups there -(@code{gnus-group-browse-foreign-server}). -@end table - -@findex gnus-browse-mode -A new buffer with a list of available groups will appear. This buffer -will use the @code{gnus-browse-mode}. This buffer looks a bit (well, -a lot) like a normal group buffer. - -Here's a list of keystrokes available in the browse mode: - -@table @kbd -@item n -@kindex n (Browse) -@findex gnus-group-next-group -Go to the next group (@code{gnus-group-next-group}). - -@item p -@kindex p (Browse) -@findex gnus-group-prev-group -Go to the previous group (@code{gnus-group-prev-group}). - -@item SPACE -@kindex SPACE (Browse) -@findex gnus-browse-read-group -Enter the current group and display the first article -(@code{gnus-browse-read-group}). - -@item RET -@kindex RET (Browse) -@findex gnus-browse-select-group -Enter the current group (@code{gnus-browse-select-group}). - -@item u -@kindex u (Browse) -@findex gnus-browse-unsubscribe-current-group -Unsubscribe to the current group, or, as will be the case here, -subscribe to it (@code{gnus-browse-unsubscribe-current-group}). - -@item l -@itemx q -@kindex q (Browse) -@kindex l (Browse) -@findex gnus-browse-exit -Exit browse mode (@code{gnus-browse-exit}). - -@item ? -@kindex ? (Browse) -@findex gnus-browse-describe-briefly -Describe browse mode briefly (well, there's not much to describe, is -there) (@code{gnus-browse-describe-briefly}). -@end table - - -@node Exiting Gnus -@section Exiting gnus -@cindex exiting gnus - -Yes, gnus is ex(c)iting. - -@table @kbd -@item z -@kindex z (Group) -@findex gnus-group-suspend -Suspend gnus (@code{gnus-group-suspend}). This doesn't really exit gnus, -but it kills all buffers except the Group buffer. I'm not sure why this -is a gain, but then who am I to judge? - -@item q -@kindex q (Group) -@findex gnus-group-exit -@c @icon{gnus-group-exit} -Quit gnus (@code{gnus-group-exit}). - -@item Q -@kindex Q (Group) -@findex gnus-group-quit -Quit gnus without saving the @file{.newsrc} files (@code{gnus-group-quit}). -The dribble file will be saved, though (@pxref{Auto Save}). -@end table - -@vindex gnus-exit-gnus-hook -@vindex gnus-suspend-gnus-hook -@code{gnus-suspend-gnus-hook} is called when you suspend gnus and -@code{gnus-exit-gnus-hook} is called when you quit gnus, while -@code{gnus-after-exiting-gnus-hook} is called as the final item when -exiting gnus. - -@findex gnus-unload -@cindex unloading -If you wish to completely unload gnus and all its adherents, you can use -the @code{gnus-unload} command. This command is also very handy when -trying to customize meta-variables. - -Note: - -@quotation -Miss Lisa Cannifax, while sitting in English class, felt her feet go -numbly heavy and herself fall into a hazy trance as the boy sitting -behind her drew repeated lines with his pencil across the back of her -plastic chair. -@end quotation - - -@node Group Topics -@section Group Topics -@cindex topics - -If you read lots and lots of groups, it might be convenient to group -them hierarchically according to topics. You put your Emacs groups over -here, your sex groups over there, and the rest (what, two groups or so?) -you put in some misc section that you never bother with anyway. You can -even group the Emacs sex groups as a sub-topic to either the Emacs -groups or the sex groups---or both! Go wild! - -@iftex -@iflatex -\gnusfigure{Group Topics}{400}{ -\put(75,50){\epsfig{figure=tmp/group-topic.ps,height=9cm}} -} -@end iflatex -@end iftex - -Here's an example: - -@example -Gnus - Emacs -- I wuw it! - 3: comp.emacs - 2: alt.religion.emacs - Naughty Emacs - 452: alt.sex.emacs - 0: comp.talk.emacs.recovery - Misc - 8: comp.binaries.fractals - 13: comp.sources.unix -@end example - -@findex gnus-topic-mode -@kindex t (Group) -To get this @emph{fab} functionality you simply turn on (ooh!) the -@code{gnus-topic} minor mode---type @kbd{t} in the group buffer. (This -is a toggling command.) - -Go ahead, just try it. I'll still be here when you get back. La de -dum... Nice tune, that... la la la... What, you're back? Yes, and now -press @kbd{l}. There. All your groups are now listed under -@samp{misc}. Doesn't that make you feel all warm and fuzzy? Hot and -bothered? - -If you want this permanently enabled, you should add that minor mode to -the hook for the group mode: - -@lisp -(add-hook 'gnus-group-mode-hook 'gnus-topic-mode) -@end lisp - -@menu -* Topic Variables:: How to customize the topics the Lisp Way. -* Topic Commands:: Interactive E-Z commands. -* Topic Sorting:: Sorting each topic individually. -* Topic Topology:: A map of the world. -* Topic Parameters:: Parameters that apply to all groups in a topic. -@end menu - - -@node Topic Variables -@subsection Topic Variables -@cindex topic variables - -Now, if you select a topic, it will fold/unfold that topic, which is -really neat, I think. - -@vindex gnus-topic-line-format -The topic lines themselves are created according to the -@code{gnus-topic-line-format} variable (@pxref{Formatting Variables}). -Valid elements are: - -@table @samp -@item i -Indentation. -@item n -Topic name. -@item v -Visibility. -@item l -Level. -@item g -Number of groups in the topic. -@item a -Number of unread articles in the topic. -@item A -Number of unread articles in the topic and all its subtopics. -@end table - -@vindex gnus-topic-indent-level -Each sub-topic (and the groups in the sub-topics) will be indented with -@code{gnus-topic-indent-level} times the topic level number of spaces. -The default is 2. - -@vindex gnus-topic-mode-hook -@code{gnus-topic-mode-hook} is called in topic minor mode buffers. - -@vindex gnus-topic-display-empty-topics -The @code{gnus-topic-display-empty-topics} says whether to display even -topics that have no unread articles in them. The default is @code{t}. - - -@node Topic Commands -@subsection Topic Commands -@cindex topic commands - -When the topic minor mode is turned on, a new @kbd{T} submap will be -available. In addition, a few of the standard keys change their -definitions slightly. - -@table @kbd - -@item T n -@kindex T n (Topic) -@findex gnus-topic-create-topic -Prompt for a new topic name and create it -(@code{gnus-topic-create-topic}). - -@item T m -@kindex T m (Topic) -@findex gnus-topic-move-group -Move the current group to some other topic -(@code{gnus-topic-move-group}). This command uses the process/prefix -convention (@pxref{Process/Prefix}). - -@item T j -@kindex T j (Topic) -@findex gnus-topic-jump-to-topic -Go to a topic (@code{gnus-topic-jump-to-topic}). - -@item T c -@kindex T c (Topic) -@findex gnus-topic-copy-group -Copy the current group to some other topic -(@code{gnus-topic-copy-group}). This command uses the process/prefix -convention (@pxref{Process/Prefix}). - -@item T h -@kindex T h (Topic) -@findex gnus-topic-hide-topic -Hide the current topic (@code{gnus-topic-hide-topic}). If given -a prefix, hide the topic permanently. - -@item T s -@kindex T s (Topic) -@findex gnus-topic-show-topic -Show the current topic (@code{gnus-topic-show-topic}). If given -a prefix, show the topic permanently. - -@item T D -@kindex T D (Topic) -@findex gnus-topic-remove-group -Remove a group from the current topic (@code{gnus-topic-remove-group}). -This command is mainly useful if you have the same group in several -topics and wish to remove it from one of the topics. You may also -remove a group from all topics, but in that case, Gnus will add it to -the root topic the next time you start Gnus. In fact, all new groups -(which, naturally, don't belong to any topic) will show up in the root -topic. - -This command uses the process/prefix convention -(@pxref{Process/Prefix}). - -@item T M -@kindex T M (Topic) -@findex gnus-topic-move-matching -Move all groups that match some regular expression to a topic -(@code{gnus-topic-move-matching}). - -@item T C -@kindex T C (Topic) -@findex gnus-topic-copy-matching -Copy all groups that match some regular expression to a topic -(@code{gnus-topic-copy-matching}). - -@item T H -@kindex T H (Topic) -@findex gnus-topic-toggle-display-empty-topics -Toggle hiding empty topics -(@code{gnus-topic-toggle-display-empty-topics}). - -@item T # -@kindex T # (Topic) -@findex gnus-topic-mark-topic -Mark all groups in the current topic with the process mark -(@code{gnus-topic-mark-topic}). - -@item T M-# -@kindex T M-# (Topic) -@findex gnus-topic-unmark-topic -Remove the process mark from all groups in the current topic -(@code{gnus-topic-unmark-topic}). - -@item T TAB -@itemx TAB -@kindex T TAB (Topic) -@kindex TAB (Topic) -@findex gnus-topic-indent -``Indent'' the current topic so that it becomes a sub-topic of the -previous topic (@code{gnus-topic-indent}). If given a prefix, -``un-indent'' the topic instead. - -@item M-TAB -@kindex M-TAB (Topic) -@findex gnus-topic-unindent -``Un-indent'' the current topic so that it becomes a sub-topic of the -parent of its current parent (@code{gnus-topic-unindent}). - -@item RET -@kindex RET (Topic) -@findex gnus-topic-select-group -@itemx SPACE -Either select a group or fold a topic (@code{gnus-topic-select-group}). -When you perform this command on a group, you'll enter the group, as -usual. When done on a topic line, the topic will be folded (if it was -visible) or unfolded (if it was folded already). So it's basically a -toggling command on topics. In addition, if you give a numerical -prefix, group on that level (and lower) will be displayed. - -@item C-c C-x -@kindex C-c C-x (Topic) -@findex gnus-topic-expire-articles -Run all expirable articles in the current group or topic through the -expiry process (if any) -(@code{gnus-topic-expire-articles}). (@pxref{Expiring Mail}). - -@item C-k -@kindex C-k (Topic) -@findex gnus-topic-kill-group -Kill a group or topic (@code{gnus-topic-kill-group}). All groups in the -topic will be removed along with the topic. - -@item C-y -@kindex C-y (Topic) -@findex gnus-topic-yank-group -Yank the previously killed group or topic -(@code{gnus-topic-yank-group}). Note that all topics will be yanked -before all groups. - -@item T r -@kindex T r (Topic) -@findex gnus-topic-rename -Rename a topic (@code{gnus-topic-rename}). - -@item T DEL -@kindex T DEL (Topic) -@findex gnus-topic-delete -Delete an empty topic (@code{gnus-topic-delete}). - -@item A T -@kindex A T (Topic) -@findex gnus-topic-list-active -List all groups that gnus knows about in a topics-ified way -(@code{gnus-topic-list-active}). - -@item G p -@kindex G p (Topic) -@findex gnus-topic-edit-parameters -@cindex group parameters -@cindex topic parameters -@cindex parameters -Edit the topic parameters (@code{gnus-topic-edit-parameters}). -@xref{Topic Parameters}. - -@end table - - -@node Topic Sorting -@subsection Topic Sorting -@cindex topic sorting - -You can sort the groups in each topic individually with the following -commands: - - -@table @kbd -@item T S a -@kindex T S a (Topic) -@findex gnus-topic-sort-groups-by-alphabet -Sort the current topic alphabetically by group name -(@code{gnus-topic-sort-groups-by-alphabet}). - -@item T S u -@kindex T S u (Topic) -@findex gnus-topic-sort-groups-by-unread -Sort the current topic by the number of unread articles -(@code{gnus-topic-sort-groups-by-unread}). - -@item T S l -@kindex T S l (Topic) -@findex gnus-topic-sort-groups-by-level -Sort the current topic by group level -(@code{gnus-topic-sort-groups-by-level}). - -@item T S v -@kindex T S v (Topic) -@findex gnus-topic-sort-groups-by-score -Sort the current topic by group score -(@code{gnus-topic-sort-groups-by-score}). @xref{Group Score}. - -@item T S r -@kindex T S r (Topic) -@findex gnus-topic-sort-groups-by-rank -Sort the current topic by group rank -(@code{gnus-topic-sort-groups-by-rank}). @xref{Group Score}. - -@item T S m -@kindex T S m (Topic) -@findex gnus-topic-sort-groups-by-method -Sort the current topic alphabetically by backend name -(@code{gnus-topic-sort-groups-by-method}). - -@end table - -@xref{Sorting Groups}, for more information about group sorting. - - -@node Topic Topology -@subsection Topic Topology -@cindex topic topology -@cindex topology - -So, let's have a look at an example group buffer: - -@example -Gnus - Emacs -- I wuw it! - 3: comp.emacs - 2: alt.religion.emacs - Naughty Emacs - 452: alt.sex.emacs - 0: comp.talk.emacs.recovery - Misc - 8: comp.binaries.fractals - 13: comp.sources.unix -@end example - -So, here we have one top-level topic (@samp{Gnus}), two topics under -that, and one sub-topic under one of the sub-topics. (There is always -just one (1) top-level topic). This topology can be expressed as -follows: - -@lisp -(("Gnus" visible) - (("Emacs -- I wuw it!" visible) - (("Naughty Emacs" visible))) - (("Misc" visible))) -@end lisp - -@vindex gnus-topic-topology -This is in fact how the variable @code{gnus-topic-topology} would look -for the display above. That variable is saved in the @file{.newsrc.eld} -file, and shouldn't be messed with manually---unless you really want -to. Since this variable is read from the @file{.newsrc.eld} file, -setting it in any other startup files will have no effect. - -This topology shows what topics are sub-topics of what topics (right), -and which topics are visible. Two settings are currently -allowed---@code{visible} and @code{invisible}. - - -@node Topic Parameters -@subsection Topic Parameters -@cindex topic parameters - -All groups in a topic will inherit group parameters from the parent (and -ancestor) topic parameters. All valid group parameters are valid topic -parameters (@pxref{Group Parameters}). - -In addition, the following parameters are only valid as topic -parameters: - -@table @code -@item subscribe -When subscribing new groups by topic (@pxref{Subscription Methods}), the -@code{subscribe} topic parameter says what groups go in what topic. Its -value should be a regexp to match the groups that should go in that -topic. - -@end table - -Group parameters (of course) override topic parameters, and topic -parameters in sub-topics override topic parameters in super-topics. You -know. Normal inheritance rules. (@dfn{Rules} is here a noun, not a -verb, although you may feel free to disagree with me here.) - -@example -Gnus - Emacs - 3: comp.emacs - 2: alt.religion.emacs - 452: alt.sex.emacs - Relief - 452: alt.sex.emacs - 0: comp.talk.emacs.recovery - Misc - 8: comp.binaries.fractals - 13: comp.sources.unix - 452: alt.sex.emacs -@end example - -The @samp{Emacs} topic has the topic parameter @code{(score-file -. "emacs.SCORE")}; the @samp{Relief} topic has the topic parameter -@code{(score-file . "relief.SCORE")}; and the @samp{Misc} topic has the -topic parameter @code{(score-file . "emacs.SCORE")}. In addition, -@* @samp{alt.religion.emacs} has the group parameter @code{(score-file -. "religion.SCORE")}. - -Now, when you enter @samp{alt.sex.emacs} in the @samp{Relief} topic, you -will get the @file{relief.SCORE} home score file. If you enter the same -group in the @samp{Emacs} topic, you'll get the @file{emacs.SCORE} home -score file. If you enter the group @samp{alt.religion.emacs}, you'll -get the @file{religion.SCORE} home score file. - -This seems rather simple and self-evident, doesn't it? Well, yes. But -there are some problems, especially with the @code{total-expiry} -parameter. Say you have a mail group in two topics; one with -@code{total-expiry} and one without. What happens when you do @kbd{M-x -gnus-expire-all-expirable-groups}? Gnus has no way of telling which one -of these topics you mean to expire articles from, so anything may -happen. In fact, I hereby declare that it is @dfn{undefined} what -happens. You just have to be careful if you do stuff like that. - - -@node Misc Group Stuff -@section Misc Group Stuff - -@menu -* Scanning New Messages:: Asking Gnus to see whether new messages have arrived. -* Group Information:: Information and help on groups and Gnus. -* Group Timestamp:: Making Gnus keep track of when you last read a group. -* File Commands:: Reading and writing the Gnus files. -@end menu - -@table @kbd - -@item ^ -@kindex ^ (Group) -@findex gnus-group-enter-server-mode -Enter the server buffer (@code{gnus-group-enter-server-mode}). -@xref{Server Buffer}. - -@item a -@kindex a (Group) -@findex gnus-group-post-news -Post an article to a group (@code{gnus-group-post-news}). If given a -prefix, the current group name will be used as the default. - -@item m -@kindex m (Group) -@findex gnus-group-mail -Mail a message somewhere (@code{gnus-group-mail}). - -@end table - -Variables for the group buffer: - -@table @code - -@item gnus-group-mode-hook -@vindex gnus-group-mode-hook -is called after the group buffer has been -created. - -@item gnus-group-prepare-hook -@vindex gnus-group-prepare-hook -is called after the group buffer is -generated. It may be used to modify the buffer in some strange, -unnatural way. - -@item gnus-group-prepared-hook -@vindex gnus-group-prepare-hook -is called as the very last thing after the group buffer has been -generated. It may be used to move point around, for instance. - -@item gnus-permanently-visible-groups -@vindex gnus-permanently-visible-groups -Groups matching this regexp will always be listed in the group buffer, -whether they are empty or not. - -@item gnus-group-name-charset-method-alist -@vindex gnus-group-name-charset-method-alist -An alist of method and the charset for group names. It is used to show -non-ASCII group names. - -For example: -@lisp -(setq gnus-group-name-charset-method-alist - '(((nntp "news.com.cn") . cn-gb-2312))) -@end lisp - -@item gnus-group-name-charset-group-alist -@vindex gnus-group-name-charset-group-alist -An alist of regexp of group name and the charset for group names. -It is used to show non-ASCII group names. - -For example: -@lisp -(setq gnus-group-name-charset-group-alist - '(("\\.com\\.cn:" . cn-gb-2312))) -@end lisp - -@end table - -@node Scanning New Messages -@subsection Scanning New Messages -@cindex new messages -@cindex scanning new news - -@table @kbd - -@item g -@kindex g (Group) -@findex gnus-group-get-new-news -@c @icon{gnus-group-get-new-news} -Check the server(s) for new articles. If the numerical prefix is used, -this command will check only groups of level @var{arg} and lower -(@code{gnus-group-get-new-news}). If given a non-numerical prefix, this -command will force a total re-reading of the active file(s) from the -backend(s). - -@item M-g -@kindex M-g (Group) -@findex gnus-group-get-new-news-this-group -@vindex gnus-goto-next-group-when-activating -@c @icon{gnus-group-get-new-news-this-group} -Check whether new articles have arrived in the current group -(@code{gnus-group-get-new-news-this-group}). -@code{gnus-goto-next-group-when-activating} says whether this command is -to move point to the next group or not. It is @code{t} by default. - -@findex gnus-activate-all-groups -@cindex activating groups -@item C-c M-g -@kindex C-c M-g (Group) -Activate absolutely all groups (@code{gnus-activate-all-groups}). - -@item R -@kindex R (Group) -@cindex restarting -@findex gnus-group-restart -Restart gnus (@code{gnus-group-restart}). This saves the @file{.newsrc} -file(s), closes the connection to all servers, clears up all run-time -gnus variables, and then starts gnus all over again. - -@end table - -@vindex gnus-get-new-news-hook -@code{gnus-get-new-news-hook} is run just before checking for new news. - -@vindex gnus-after-getting-new-news-hook -@code{gnus-after-getting-new-news-hook} is run after checking for new -news. - - -@node Group Information -@subsection Group Information -@cindex group information -@cindex information on groups - -@table @kbd - - -@item H f -@kindex H f (Group) -@findex gnus-group-fetch-faq -@vindex gnus-group-faq-directory -@cindex FAQ -@cindex ange-ftp -Try to fetch the FAQ for the current group -(@code{gnus-group-fetch-faq}). Gnus will try to get the FAQ from -@code{gnus-group-faq-directory}, which is usually a directory on a -remote machine. This variable can also be a list of directories. In -that case, giving a prefix to this command will allow you to choose -between the various sites. @code{ange-ftp} (or @code{efs}) will be used -for fetching the file. - -If fetching from the first site is unsuccessful, gnus will attempt to go -through @code{gnus-group-faq-directory} and try to open them one by one. - -@item H d -@itemx C-c C-d -@c @icon{gnus-group-describe-group} -@kindex H d (Group) -@kindex C-c C-d (Group) -@cindex describing groups -@cindex group description -@findex gnus-group-describe-group -Describe the current group (@code{gnus-group-describe-group}). If given -a prefix, force Gnus to re-read the description from the server. - -@item M-d -@kindex M-d (Group) -@findex gnus-group-describe-all-groups -Describe all groups (@code{gnus-group-describe-all-groups}). If given a -prefix, force gnus to re-read the description file from the server. - -@item H v -@itemx V -@kindex V (Group) -@kindex H v (Group) -@cindex version -@findex gnus-version -Display current gnus version numbers (@code{gnus-version}). - -@item ? -@kindex ? (Group) -@findex gnus-group-describe-briefly -Give a very short help message (@code{gnus-group-describe-briefly}). - -@item C-c C-i -@kindex C-c C-i (Group) -@cindex info -@cindex manual -@findex gnus-info-find-node -Go to the gnus info node (@code{gnus-info-find-node}). -@end table - - -@node Group Timestamp -@subsection Group Timestamp -@cindex timestamps -@cindex group timestamps - -It can be convenient to let gnus keep track of when you last read a -group. To set the ball rolling, you should add -@code{gnus-group-set-timestamp} to @code{gnus-select-group-hook}: - -@lisp -(add-hook 'gnus-select-group-hook 'gnus-group-set-timestamp) -@end lisp - -After doing this, each time you enter a group, it'll be recorded. - -This information can be displayed in various ways---the easiest is to -use the @samp{%d} spec in the group line format: - -@lisp -(setq gnus-group-line-format - "%M\%S\%p\%P\%5y: %(%-40,40g%) %d\n") -@end lisp - -This will result in lines looking like: - -@example -* 0: mail.ding 19961002T012943 - 0: custom 19961002T012713 -@end example - -As you can see, the date is displayed in compact ISO 8601 format. This -may be a bit too much, so to just display the date, you could say -something like: - -@lisp -(setq gnus-group-line-format - "%M\%S\%p\%P\%5y: %(%-40,40g%) %6,6~(cut 2)d\n") -@end lisp - - -@node File Commands -@subsection File Commands -@cindex file commands - -@table @kbd - -@item r -@kindex r (Group) -@findex gnus-group-read-init-file -@vindex gnus-init-file -@cindex reading init file -Re-read the init file (@code{gnus-init-file}, which defaults to -@file{~/.gnus}) (@code{gnus-group-read-init-file}). - -@item s -@kindex s (Group) -@findex gnus-group-save-newsrc -@cindex saving .newsrc -Save the @file{.newsrc.eld} file (and @file{.newsrc} if wanted) -(@code{gnus-group-save-newsrc}). If given a prefix, force saving the -file(s) whether Gnus thinks it is necessary or not. - -@c @item Z -@c @kindex Z (Group) -@c @findex gnus-group-clear-dribble -@c Clear the dribble buffer (@code{gnus-group-clear-dribble}). - -@end table - - -@node Summary Buffer -@chapter Summary Buffer -@cindex summary buffer - -A line for each article is displayed in the summary buffer. You can -move around, read articles, post articles and reply to articles. - -The most common way to a summary buffer is to select a group from the -group buffer (@pxref{Selecting a Group}). - -You can have as many summary buffers open as you wish. - -@menu -* Summary Buffer Format:: Deciding how the summary buffer is to look. -* Summary Maneuvering:: Moving around the summary buffer. -* Choosing Articles:: Reading articles. -* Paging the Article:: Scrolling the current article. -* Reply Followup and Post:: Posting articles. -* Delayed Articles:: -* Marking Articles:: Marking articles as read, expirable, etc. -* Limiting:: You can limit the summary buffer. -* Threading:: How threads are made. -* Sorting the Summary Buffer:: How articles and threads are sorted. -* Asynchronous Fetching:: Gnus might be able to pre-fetch articles. -* Article Caching:: You may store articles in a cache. -* Persistent Articles:: Making articles expiry-resistant. -* Article Backlog:: Having already read articles hang around. -* Saving Articles:: Ways of customizing article saving. -* Decoding Articles:: Gnus can treat series of (uu)encoded articles. -* Article Treatment:: The article buffer can be mangled at will. -* MIME Commands:: Doing MIMEy things with the articles. -* Charsets:: Character set issues. -* Article Commands:: Doing various things with the article buffer. -* Summary Sorting:: Sorting the summary buffer in various ways. -* Finding the Parent:: No child support? Get the parent. -* Alternative Approaches:: Reading using non-default summaries. -* Tree Display:: A more visual display of threads. -* Mail Group Commands:: Some commands can only be used in mail groups. -* Various Summary Stuff:: What didn't fit anywhere else. -* Exiting the Summary Buffer:: Returning to the Group buffer, - or reselecting the current group. -* Crosspost Handling:: How crossposted articles are dealt with. -* Duplicate Suppression:: An alternative when crosspost handling fails. -* Security:: Decrypt and Verify. -* Mailing List:: Mailing list minor mode. -@end menu - - -@node Summary Buffer Format -@section Summary Buffer Format -@cindex summary buffer format - -@iftex -@iflatex -\gnusfigure{The Summary Buffer}{180}{ -\put(0,0){\epsfig{figure=tmp/summary.ps,width=7.5cm}} -\put(445,0){\makebox(0,0)[br]{\epsfig{figure=tmp/summary-article.ps,width=7.5cm}}} -} -@end iflatex -@end iftex - -@menu -* Summary Buffer Lines:: You can specify how summary lines should look. -* To From Newsgroups:: How to not display your own name. -* Summary Buffer Mode Line:: You can say how the mode line should look. -* Summary Highlighting:: Making the summary buffer all pretty and nice. -@end menu - -@findex mail-extract-address-components -@findex gnus-extract-address-components -@vindex gnus-extract-address-components -Gnus will use the value of the @code{gnus-extract-address-components} -variable as a function for getting the name and address parts of a -@code{From} header. Three pre-defined functions exist: -@code{gnus-extract-address-components}, which is the default, quite -fast, and too simplistic solution; -@code{mail-extract-address-components}, which works nicely, but is -slower; and @code{std11-extract-address-components}, which works very -nicely, but is slower. The default function will return the wrong -answer in 5% of the cases. If this is unacceptable to you, use the -other function instead: - -@lisp -(setq gnus-extract-address-components - 'mail-extract-address-components) -@end lisp - -@vindex gnus-summary-same-subject -@code{gnus-summary-same-subject} is a string indicating that the current -article has the same subject as the previous. This string will be used -with those specs that require it. The default is @code{""}. - - -@node Summary Buffer Lines -@subsection Summary Buffer Lines - -@vindex gnus-summary-line-format -You can change the format of the lines in the summary buffer by changing -the @code{gnus-summary-line-format} variable. It works along the same -lines as a normal @code{format} string, with some extensions -(@pxref{Formatting Variables}). - -There should always be a colon or a point position marker on the line; -the cursor always moves to the point position marker or the colon after -performing an operation. (Of course, Gnus wouldn't be Gnus if it wasn't -possible to change this. Just write a new function -@code{gnus-goto-colon} which does whatever you like with the cursor.) - -The default string is @samp{%U%R%z%I%(%[%4L: %-23,23n%]%) %s\n}. - -The following format specification characters are understood: - -@table @samp -@item N -Article number. -@item S -Subject string. List identifiers stripped, -@code{gnus-list-identifies}. @xref{Article Hiding}. -@item s -Subject if the article is the root of the thread or the previous article -had a different subject, @code{gnus-summary-same-subject} otherwise. -(@code{gnus-summary-same-subject} defaults to @code{""}.) -@item F -Full @code{From} header. -@item n -The name (from the @code{From} header). -@item f -The name, code @code{To} header or the @code{Newsgroups} header -(@pxref{To From Newsgroups}). -@item a -The name (from the @code{From} header). This differs from the @code{n} -spec in that it uses the function designated by the -@code{gnus-extract-address-components} variable, which is slower, but -may be more thorough. -@item A -The address (from the @code{From} header). This works the same way as -the @code{a} spec. -@item L -Number of lines in the article. -@item c -Number of characters in the article. This specifier is not supported -in some methods (like nnfolder). -@item I -Indentation based on thread level (@pxref{Customizing Threading}). -@item B -A complex trn-style thread tree, showing response-connecting trace -lines. -@item T -Nothing if the article is a root and lots of spaces if it isn't (it -pushes everything after it off the screen). -@item [ -Opening bracket, which is normally @samp{[}, but can also be @samp{<} -for adopted articles (@pxref{Customizing Threading}). -@item ] -Closing bracket, which is normally @samp{]}, but can also be @samp{>} -for adopted articles. -@item > -One space for each thread level. -@item < -Twenty minus thread level spaces. -@item U -Unread. - -@item R -This misleadingly named specifier is the @dfn{secondary mark}. This -mark will say whether the article has been replied to, has been cached, -or has been saved. - -@item i -Score as a number (@pxref{Scoring}). -@item z -@vindex gnus-summary-zcore-fuzz -Zcore, @samp{+} if above the default level and @samp{-} if below the -default level. If the difference between -@code{gnus-summary-default-score} and the score is less than -@code{gnus-summary-zcore-fuzz}, this spec will not be used. -@item V -Total thread score. -@item x -@code{Xref}. -@item D -@code{Date}. -@item d -The @code{Date} in @code{DD-MMM} format. -@item o -The @code{Date} in @var{YYYYMMDD}@code{T}@var{HHMMSS} format. -@item M -@code{Message-ID}. -@item r -@code{References}. -@item t -Number of articles in the current sub-thread. Using this spec will slow -down summary buffer generation somewhat. -@item e -An @samp{=} (@code{gnus-not-empty-thread-mark}) will be displayed if the -article has any children. -@item P -The line number. -@item O -Download mark. -@item u -User defined specifier. The next character in the format string should -be a letter. Gnus will call the function -@code{gnus-user-format-function-}@samp{X}, where @samp{X} is the letter -following @samp{%u}. The function will be passed the current header as -argument. The function should return a string, which will be inserted -into the summary just like information from any other summary specifier. -@end table - -The @samp{%U} (status), @samp{%R} (replied) and @samp{%z} (zcore) specs -have to be handled with care. For reasons of efficiency, gnus will -compute what column these characters will end up in, and ``hard-code'' -that. This means that it is invalid to have these specs after a -variable-length spec. Well, you might not be arrested, but your summary -buffer will look strange, which is bad enough. - -The smart choice is to have these specs as far to the left as possible. -(Isn't that the case with everything, though? But I digress.) - -This restriction may disappear in later versions of gnus. - - -@node To From Newsgroups -@subsection To From Newsgroups -@cindex To -@cindex Newsgroups - -In some groups (particularly in archive groups), the @code{From} header -isn't very interesting, since all the articles there are written by -you. To display the information in the @code{To} or @code{Newsgroups} -headers instead, you need to decide three things: What information to -gather; where to display it; and when to display it. - -@enumerate -@item -@vindex gnus-extra-headers -The reading of extra header information is controlled by the -@code{gnus-extra-headers}. This is a list of header symbols. For -instance: - -@lisp -(setq gnus-extra-headers - '(To Newsgroups X-Newsreader)) -@end lisp - -This will result in Gnus trying to obtain these three headers, and -storing it in header structures for later easy retrieval. - -@item -@findex gnus-extra-header -The value of these extra headers can be accessed via the -@code{gnus-extra-header} function. Here's a format line spec that will -access the @code{X-Newsreader} header: - -@example -"%~(form (gnus-extra-header 'X-Newsreader))@@" -@end example - -@item -@vindex gnus-ignored-from-addresses -The @code{gnus-ignored-from-addresses} variable says when the @samp{%f} -summary line spec returns the @code{To}, @code{Newsreader} or -@code{From} header. If this regexp matches the contents of the -@code{From} header, the value of the @code{To} or @code{Newsreader} -headers are used instead. - -@end enumerate - -@vindex nnmail-extra-headers -A related variable is @code{nnmail-extra-headers}, which controls when -to include extra headers when generating overview (@sc{nov}) files. If -you have old overview files, you should regenerate them after changing -this variable. - -@vindex gnus-summary-line-format -You also have to instruct Gnus to display the data by changing the -@code{%n} spec to the @code{%f} spec in the -@code{gnus-summary-line-format} variable. - -In summary, you'd typically put something like the following in -@file{~/.gnus}: - -@lisp -(setq gnus-extra-headers - '(To Newsgroups)) -(setq nnmail-extra-headers gnus-extra-headers) -(setq gnus-summary-line-format - "%U%R%z%I%(%[%4L: %-23,23f%]%) %s\n") -(setq gnus-ignored-from-addresses - "Your Name Here") -@end lisp - -Now, this is mostly useful for mail groups, where you have control over -the @sc{nov} files that are created. However, if you can persuade your -nntp admin to add: - -@example -Newsgroups:full -@end example - -to the end of her @file{overview.fmt} file, then you can use that just -as you would the extra headers from the mail groups. - - -@node Summary Buffer Mode Line -@subsection Summary Buffer Mode Line - -@vindex gnus-summary-mode-line-format -You can also change the format of the summary mode bar (@pxref{Mode Line -Formatting}). Set @code{gnus-summary-mode-line-format} to whatever you -like. The default is @samp{Gnus: %%b [%A] %Z}. - -Here are the elements you can play with: - -@table @samp -@item G -Group name. -@item p -Unprefixed group name. -@item A -Current article number. -@item z -Current article score. -@item V -Gnus version. -@item U -Number of unread articles in this group. -@item e -Number of unread articles in this group that aren't displayed in the -summary buffer. -@item Z -A string with the number of unread and unselected articles represented -either as @samp{<%U(+%e) more>} if there are both unread and unselected -articles, and just as @samp{<%U more>} if there are just unread articles -and no unselected ones. -@item g -Shortish group name. For instance, @samp{rec.arts.anime} will be -shortened to @samp{r.a.anime}. -@item S -Subject of the current article. -@item u -User-defined spec (@pxref{User-Defined Specs}). -@item s -Name of the current score file (@pxref{Scoring}). -@item d -Number of dormant articles (@pxref{Unread Articles}). -@item t -Number of ticked articles (@pxref{Unread Articles}). -@item r -Number of articles that have been marked as read in this session. -@item E -Number of articles expunged by the score files. -@end table - - -@node Summary Highlighting -@subsection Summary Highlighting - -@table @code - -@item gnus-visual-mark-article-hook -@vindex gnus-visual-mark-article-hook -This hook is run after selecting an article. It is meant to be used for -highlighting the article in some way. It is not run if -@code{gnus-visual} is @code{nil}. - -@item gnus-summary-update-hook -@vindex gnus-summary-update-hook -This hook is called when a summary line is changed. It is not run if -@code{gnus-visual} is @code{nil}. - -@item gnus-summary-selected-face -@vindex gnus-summary-selected-face -This is the face (or @dfn{font} as some people call it) used to -highlight the current article in the summary buffer. - -@item gnus-summary-highlight -@vindex gnus-summary-highlight -Summary lines are highlighted according to this variable, which is a -list where the elements are of the format @code{(@var{form} -. @var{face})}. If you would, for instance, like ticked articles to be -italic and high-scored articles to be bold, you could set this variable -to something like -@lisp -(((eq mark gnus-ticked-mark) . italic) - ((> score default) . bold)) -@end lisp -As you may have guessed, if @var{form} returns a non-@code{nil} value, -@var{face} will be applied to the line. -@end table - - -@node Summary Maneuvering -@section Summary Maneuvering -@cindex summary movement - -All the straight movement commands understand the numeric prefix and -behave pretty much as you'd expect. - -None of these commands select articles. - -@table @kbd -@item G M-n -@itemx M-n -@kindex M-n (Summary) -@kindex G M-n (Summary) -@findex gnus-summary-next-unread-subject -Go to the next summary line of an unread article -(@code{gnus-summary-next-unread-subject}). - -@item G M-p -@itemx M-p -@kindex M-p (Summary) -@kindex G M-p (Summary) -@findex gnus-summary-prev-unread-subject -Go to the previous summary line of an unread article -(@code{gnus-summary-prev-unread-subject}). - -@item G g -@kindex G g (Summary) -@findex gnus-summary-goto-subject -Ask for an article number and then go to the summary line of that article -without displaying the article (@code{gnus-summary-goto-subject}). -@end table - -If gnus asks you to press a key to confirm going to the next group, you -can use the @kbd{C-n} and @kbd{C-p} keys to move around the group -buffer, searching for the next group to read without actually returning -to the group buffer. - -Variables related to summary movement: - -@table @code - -@vindex gnus-auto-select-next -@item gnus-auto-select-next -If you issue one of the movement commands (like @kbd{n}) and there are -no more unread articles after the current one, gnus will offer to go to -the next group. If this variable is @code{t} and the next group is -empty, gnus will exit summary mode and return to the group buffer. If -this variable is neither @code{t} nor @code{nil}, gnus will select the -next group, no matter whether it has any unread articles or not. As a -special case, if this variable is @code{quietly}, gnus will select the -next group without asking for confirmation. If this variable is -@code{almost-quietly}, the same will happen only if you are located on -the last article in the group. Finally, if this variable is -@code{slightly-quietly}, the @kbd{Z n} command will go to the next group -without confirmation. Also @pxref{Group Levels}. - -@item gnus-auto-select-same -@vindex gnus-auto-select-same -If non-@code{nil}, all the movement commands will try to go to the next -article with the same subject as the current. (@dfn{Same} here might -mean @dfn{roughly equal}. See @code{gnus-summary-gather-subject-limit} -for details (@pxref{Customizing Threading}).) If there are no more -articles with the same subject, go to the first unread article. - -This variable is not particularly useful if you use a threaded display. - -@item gnus-summary-check-current -@vindex gnus-summary-check-current -If non-@code{nil}, all the ``unread'' movement commands will not proceed -to the next (or previous) article if the current article is unread. -Instead, they will choose the current article. - -@item gnus-auto-center-summary -@vindex gnus-auto-center-summary -If non-@code{nil}, gnus will keep the point in the summary buffer -centered at all times. This makes things quite tidy, but if you have a -slow network connection, or simply do not like this un-Emacsism, you can -set this variable to @code{nil} to get the normal Emacs scrolling -action. This will also inhibit horizontal re-centering of the summary -buffer, which might make it more inconvenient to read extremely long -threads. - -This variable can also be a number. In that case, center the window at -the given number of lines from the top. - -@end table - - -@node Choosing Articles -@section Choosing Articles -@cindex selecting articles - -@menu -* Choosing Commands:: Commands for choosing articles. -* Choosing Variables:: Variables that influence these commands. -@end menu - - -@node Choosing Commands -@subsection Choosing Commands - -None of the following movement commands understand the numeric prefix, -and they all select and display an article. - -If you want to fetch new articles or redisplay the group, see -@ref{Exiting the Summary Buffer}. - -@table @kbd -@item SPACE -@kindex SPACE (Summary) -@findex gnus-summary-next-page -Select the current article, or, if that one's read already, the next -unread article (@code{gnus-summary-next-page}). - -@item G n -@itemx n -@kindex n (Summary) -@kindex G n (Summary) -@findex gnus-summary-next-unread-article -@c @icon{gnus-summary-next-unread} -Go to next unread article (@code{gnus-summary-next-unread-article}). - -@item G p -@itemx p -@kindex p (Summary) -@findex gnus-summary-prev-unread-article -@c @icon{gnus-summary-prev-unread} -Go to previous unread article (@code{gnus-summary-prev-unread-article}). - -@item G N -@itemx N -@kindex N (Summary) -@kindex G N (Summary) -@findex gnus-summary-next-article -Go to the next article (@code{gnus-summary-next-article}). - -@item G P -@itemx P -@kindex P (Summary) -@kindex G P (Summary) -@findex gnus-summary-prev-article -Go to the previous article (@code{gnus-summary-prev-article}). - -@item G C-n -@kindex G C-n (Summary) -@findex gnus-summary-next-same-subject -Go to the next article with the same subject -(@code{gnus-summary-next-same-subject}). - -@item G C-p -@kindex G C-p (Summary) -@findex gnus-summary-prev-same-subject -Go to the previous article with the same subject -(@code{gnus-summary-prev-same-subject}). - -@item G f -@itemx . -@kindex G f (Summary) -@kindex . (Summary) -@findex gnus-summary-first-unread-article -Go to the first unread article -(@code{gnus-summary-first-unread-article}). - -@item G b -@itemx , -@kindex G b (Summary) -@kindex , (Summary) -@findex gnus-summary-best-unread-article -Go to the article with the highest score -(@code{gnus-summary-best-unread-article}). - -@item G l -@itemx l -@kindex l (Summary) -@kindex G l (Summary) -@findex gnus-summary-goto-last-article -Go to the previous article read (@code{gnus-summary-goto-last-article}). - -@item G o -@kindex G o (Summary) -@findex gnus-summary-pop-article -@cindex history -@cindex article history -Pop an article off the summary history and go to this article -(@code{gnus-summary-pop-article}). This command differs from the -command above in that you can pop as many previous articles off the -history as you like, while @kbd{l} toggles the two last read articles. -For a somewhat related issue (if you use these commands a lot), -@pxref{Article Backlog}. - -@item G j -@itemx j -@kindex j (Summary) -@kindex G j (Summary) -@findex gnus-summary-goto-article -Ask for an article number or @code{Message-ID}, and then go to that -article (@code{gnus-summary-goto-article}). - -@end table - - -@node Choosing Variables -@subsection Choosing Variables - -Some variables relevant for moving and selecting articles: - -@table @code -@item gnus-auto-extend-newsgroup -@vindex gnus-auto-extend-newsgroup -All the movement commands will try to go to the previous (or next) -article, even if that article isn't displayed in the Summary buffer if -this variable is non-@code{nil}. Gnus will then fetch the article from -the server and display it in the article buffer. - -@item gnus-select-article-hook -@vindex gnus-select-article-hook -This hook is called whenever an article is selected. By default it -exposes any threads hidden under the selected article. - -@item gnus-mark-article-hook -@vindex gnus-mark-article-hook -@findex gnus-summary-mark-unread-as-read -@findex gnus-summary-mark-read-and-unread-as-read -@findex gnus-unread-mark -This hook is called whenever an article is selected. It is intended to -be used for marking articles as read. The default value is -@code{gnus-summary-mark-read-and-unread-as-read}, and will change the -mark of almost any article you read to @code{gnus-unread-mark}. The -only articles not affected by this function are ticked, dormant, and -expirable articles. If you'd instead like to just have unread articles -marked as read, you can use @code{gnus-summary-mark-unread-as-read} -instead. It will leave marks like @code{gnus-low-score-mark}, -@code{gnus-del-mark} (and so on) alone. - -@end table - - -@node Paging the Article -@section Scrolling the Article -@cindex article scrolling - -@table @kbd - -@item SPACE -@kindex SPACE (Summary) -@findex gnus-summary-next-page -Pressing @kbd{SPACE} will scroll the current article forward one page, -or, if you have come to the end of the current article, will choose the -next article (@code{gnus-summary-next-page}). - -@item DEL -@kindex DEL (Summary) -@findex gnus-summary-prev-page -Scroll the current article back one page (@code{gnus-summary-prev-page}). - -@item RET -@kindex RET (Summary) -@findex gnus-summary-scroll-up -Scroll the current article one line forward -(@code{gnus-summary-scroll-up}). - -@item M-RET -@kindex M-RET (Summary) -@findex gnus-summary-scroll-down -Scroll the current article one line backward -(@code{gnus-summary-scroll-down}). - -@item A g -@itemx g -@kindex A g (Summary) -@kindex g (Summary) -@findex gnus-summary-show-article -@vindex gnus-summary-show-article-charset-alist -(Re)fetch the current article (@code{gnus-summary-show-article}). If -given a prefix, fetch the current article, but don't run any of the -article treatment functions. This will give you a ``raw'' article, just -the way it came from the server. - -If given a numerical prefix, you can do semi-manual charset stuff. -@kbd{C-u 0 g cn-gb-2312 RET} will decode the message as if it were -encoded in the @code{cn-gb-2312} charset. If you have - -@lisp -(setq gnus-summary-show-article-charset-alist - '((1 . cn-gb-2312) - (2 . big5))) -@end lisp - -then you can say @kbd{C-u 1 g} to get the same effect. - -@item A < -@itemx < -@kindex < (Summary) -@kindex A < (Summary) -@findex gnus-summary-beginning-of-article -Scroll to the beginning of the article -(@code{gnus-summary-beginning-of-article}). - -@item A > -@itemx > -@kindex > (Summary) -@kindex A > (Summary) -@findex gnus-summary-end-of-article -Scroll to the end of the article (@code{gnus-summary-end-of-article}). - -@item A s -@itemx s -@kindex A s (Summary) -@kindex s (Summary) -@findex gnus-summary-isearch-article -Perform an isearch in the article buffer -(@code{gnus-summary-isearch-article}). - -@item h -@kindex h (Summary) -@findex gnus-summary-select-article-buffer -Select the article buffer (@code{gnus-summary-select-article-buffer}). - -@end table - - -@node Reply Followup and Post -@section Reply, Followup and Post - -@menu -* Summary Mail Commands:: Sending mail. -* Summary Post Commands:: Sending news. -* Summary Message Commands:: Other Message-related commands. -* Canceling and Superseding:: -@end menu - - -@node Summary Mail Commands -@subsection Summary Mail Commands -@cindex mail -@cindex composing mail - -Commands for composing a mail message: - -@table @kbd - -@item S r -@itemx r -@kindex S r (Summary) -@kindex r (Summary) -@findex gnus-summary-reply -@c @icon{gnus-summary-mail-reply} -@c @icon{gnus-summary-reply} -Mail a reply to the author of the current article -(@code{gnus-summary-reply}). - -@item S R -@itemx R -@kindex R (Summary) -@kindex S R (Summary) -@findex gnus-summary-reply-with-original -@c @icon{gnus-summary-reply-with-original} -Mail a reply to the author of the current article and include the -original message (@code{gnus-summary-reply-with-original}). This -command uses the process/prefix convention. - -@item S w -@kindex S w (Summary) -@findex gnus-summary-wide-reply -Mail a wide reply to the author of the current article -(@code{gnus-summary-wide-reply}). A @dfn{wide reply} is a reply that -goes out to all people listed in the @code{To}, @code{From} (or -@code{Reply-to}) and @code{Cc} headers. - -@item S W -@kindex S W (Summary) -@findex gnus-summary-wide-reply-with-original -Mail a wide reply to the current article and include the original -message (@code{gnus-summary-wide-reply-with-original}). This command uses -the process/prefix convention. - -@item S v -@kindex S v (Summary) -@findex gnus-summary-very-wide-reply -Mail a very wide reply to the author of the current article -(@code{gnus-summary-wide-reply}). A @dfn{very wide reply} is a reply -that goes out to all people listed in the @code{To}, @code{From} (or -@code{Reply-to}) and @code{Cc} headers in all the process/prefixed -articles. This command uses the process/prefix convention. - -@item S o m -@itemx C-c C-f -@kindex S o m (Summary) -@kindex C-c C-f (Summary) -@findex gnus-summary-mail-forward -@c @icon{gnus-summary-mail-forward} -Forward the current article to some other person -(@code{gnus-summary-mail-forward}). If given a prefix, include the full -headers of the forwarded article. - -@item S m -@itemx m -@kindex m (Summary) -@kindex S m (Summary) -@findex gnus-summary-mail-other-window -@c @icon{gnus-summary-mail-originate} -Send a mail to some other person -(@code{gnus-summary-mail-other-window}). - -@item S D b -@kindex S D b (Summary) -@findex gnus-summary-resend-bounced-mail -@cindex bouncing mail -If you have sent a mail, but the mail was bounced back to you for some -reason (wrong address, transient failure), you can use this command to -resend that bounced mail (@code{gnus-summary-resend-bounced-mail}). You -will be popped into a mail buffer where you can edit the headers before -sending the mail off again. If you give a prefix to this command, and -the bounced mail is a reply to some other mail, gnus will try to fetch -that mail and display it for easy perusal of its headers. This might -very well fail, though. - -@item S D r -@kindex S D r (Summary) -@findex gnus-summary-resend-message -Not to be confused with the previous command, -@code{gnus-summary-resend-message} will prompt you for an address to -send the current message off to, and then send it to that place. The -headers of the message won't be altered---but lots of headers that say -@code{Resent-To}, @code{Resent-From} and so on will be added. This -means that you actually send a mail to someone that has a @code{To} -header that (probably) points to yourself. This will confuse people. -So, natcherly you'll only do that if you're really eVIl. - -This command is mainly used if you have several accounts and want to -ship a mail to a different account of yours. (If you're both -@code{root} and @code{postmaster} and get a mail for @code{postmaster} -to the @code{root} account, you may want to resend it to -@code{postmaster}. Ordnung muß sein! - -This command understands the process/prefix convention -(@pxref{Process/Prefix}). - -@item S O m -@kindex S O m (Summary) -@findex gnus-summary-digest-mail-forward -Digest the current series (@pxref{Decoding Articles}) and forward the -result using mail (@code{gnus-summary-digest-mail-forward}). This -command uses the process/prefix convention (@pxref{Process/Prefix}). - -@item S M-c -@kindex S M-c (Summary) -@findex gnus-summary-mail-crosspost-complaint -@cindex crossposting -@cindex excessive crossposting -Send a complaint about excessive crossposting to the author of the -current article (@code{gnus-summary-mail-crosspost-complaint}). - -@findex gnus-crosspost-complaint -This command is provided as a way to fight back against the current -crossposting pandemic that's sweeping Usenet. It will compose a reply -using the @code{gnus-crosspost-complaint} variable as a preamble. This -command understands the process/prefix convention -(@pxref{Process/Prefix}) and will prompt you before sending each mail. - -@end table - -Also @pxref{(message)Header Commands} for more information. - - -@node Summary Post Commands -@subsection Summary Post Commands -@cindex post -@cindex composing news - -Commands for posting a news article: - -@table @kbd -@item S p -@itemx a -@kindex a (Summary) -@kindex S p (Summary) -@findex gnus-summary-post-news -@c @icon{gnus-summary-post-news} -Post an article to the current group -(@code{gnus-summary-post-news}). - -@item S f -@itemx f -@kindex f (Summary) -@kindex S f (Summary) -@findex gnus-summary-followup -@c @icon{gnus-summary-followup} -Post a followup to the current article (@code{gnus-summary-followup}). - -@item S F -@itemx F -@kindex S F (Summary) -@kindex F (Summary) -@c @icon{gnus-summary-followup-with-original} -@findex gnus-summary-followup-with-original -Post a followup to the current article and include the original message -(@code{gnus-summary-followup-with-original}). This command uses the -process/prefix convention. - -@item S n -@kindex S n (Summary) -@findex gnus-summary-followup-to-mail -Post a followup to the current article via news, even if you got the -message through mail (@code{gnus-summary-followup-to-mail}). - -@item S N -@kindex S N (Summary) -@findex gnus-summary-followup-to-mail-with-original -Post a followup to the current article via news, even if you got the -message through mail and include the original message -(@code{gnus-summary-followup-to-mail-with-original}). This command uses -the process/prefix convention. - -@item S o p -@kindex S o p (Summary) -@findex gnus-summary-post-forward -Forward the current article to a newsgroup -(@code{gnus-summary-post-forward}). If given a prefix, include the full -headers of the forwarded article. - -@item S O p -@kindex S O p (Summary) -@findex gnus-summary-digest-post-forward -@cindex digests -@cindex making digests -Digest the current series and forward the result to a newsgroup -(@code{gnus-summary-digest-post-forward}). This command uses the -process/prefix convention. - -@item S u -@kindex S u (Summary) -@findex gnus-uu-post-news -@c @icon{gnus-uu-post-news} -Uuencode a file, split it into parts, and post it as a series -(@code{gnus-uu-post-news}). (@pxref{Uuencoding and Posting}). -@end table - -Also @pxref{(message)Header Commands} for more information. - - -@node Summary Message Commands -@subsection Summary Message Commands - -@table @kbd -@item S y -@kindex S y (Summary) -@findex gnus-summary-yank-message -Yank the current article into an already existing Message composition -buffer (@code{gnus-summary-yank-message}). This command prompts for -what message buffer you want to yank into, and understands the -process/prefix convention (@pxref{Process/Prefix}). - -@end table - - -@node Canceling and Superseding -@subsection Canceling Articles -@cindex canceling articles -@cindex superseding articles - -Have you ever written something, and then decided that you really, -really, really wish you hadn't posted that? - -Well, you can't cancel mail, but you can cancel posts. - -@findex gnus-summary-cancel-article -@kindex C (Summary) -@c @icon{gnus-summary-cancel-article} -Find the article you wish to cancel (you can only cancel your own -articles, so don't try any funny stuff). Then press @kbd{C} or @kbd{S -c} (@code{gnus-summary-cancel-article}). Your article will be -canceled---machines all over the world will be deleting your article. -This command uses the process/prefix convention (@pxref{Process/Prefix}). - -Be aware, however, that not all sites honor cancels, so your article may -live on here and there, while most sites will delete the article in -question. - -Gnus will use the ``current'' select method when canceling. If you -want to use the standard posting method, use the @samp{a} symbolic -prefix (@pxref{Symbolic Prefixes}). - -If you discover that you have made some mistakes and want to do some -corrections, you can post a @dfn{superseding} article that will replace -your original article. - -@findex gnus-summary-supersede-article -@kindex S (Summary) -Go to the original article and press @kbd{S s} -(@code{gnus-summary-supersede-article}). You will be put in a buffer -where you can edit the article all you want before sending it off the -usual way. - -The same goes for superseding as for canceling, only more so: Some -sites do not honor superseding. On those sites, it will appear that you -have posted almost the same article twice. - -If you have just posted the article, and change your mind right away, -there is a trick you can use to cancel/supersede the article without -waiting for the article to appear on your site first. You simply return -to the post buffer (which is called @code{*sent ...*}). There you will -find the article you just posted, with all the headers intact. Change -the @code{Message-ID} header to a @code{Cancel} or @code{Supersedes} -header by substituting one of those words for the word -@code{Message-ID}. Then just press @kbd{C-c C-c} to send the article as -you would do normally. The previous article will be -canceled/superseded. - -Just remember, kids: There is no 'c' in 'supersede'. - -@node Delayed Articles -@section Delayed Articles -@cindex delayed sending -@cindex send delayed - -Sometimes, you might wish to delay the sending of a message. For -example, you might wish to arrange for a message to turn up just in time -to remind your about the birthday of your Significant Other. For this, -there is the @code{gnus-delay} package. Setup is simple: - -@lisp -(gnus-delay-initialize) -@end lisp - -@findex gnus-delay-article -Normally, to send a message you use the @kbd{C-c C-c} command from -Message mode. To delay a message, use @kbd{C-c C-j} -(@code{gnus-delay-article}) instead. This will ask you for how long the -message should be delayed. Possible answers are: - -@itemize -@item -A time span. Consists of an integer and a letter. For example, -@code{42d} means to delay for 42 days. Available letters are @code{m} -(minutes), @code{h} (hours), @code{d} (days), @code{w} (weeks), @code{M} -(months) and @code{Y} (years). - -@item -A specific date. Looks like @code{YYYYY-MM-DD}. The message will be -delayed until that day, at a specific time (eight o'clock by default). -See also @code{gnus-delay-default-hour}. - -@item -A specific time of day. Given in @code{hh:mm} format, 24h, no am/pm -stuff. The deadline will be at that time today, except if that time has -already passed, then it's at the given time tomorrow. So if it's ten -o'clock in the morning and you specify @code{11:15}, then the deadline -is one hour and fifteen minutes hence. But if you specify @code{9:20}, -that means a time tomorrow. -@end itemize - -The action of the @code{gnus-delay-article} command is influenced by a -couple of variables: - -@table @code -@item gnus-delay-default-hour -@vindex gnus-delay-default-hour -When you specify a specific date, the message will be due on that hour -on the given date. Possible values are integers 0 through 23. - -@item gnus-delay-default-delay -@vindex gnus-delay-default-delay -This is a string and gives the default delay. It can be of any of the -formats described above. - -@item gnus-delay-group -@vindex gnus-delay-group -Delayed articles will be kept in this group on the drafts server until -they are due. You probably don't need to change this. The default -value is @code{"delayed"}. - -@item gnus-delay-header -@vindex gnus-delay-header -The deadline for each article will be stored in a header. This variable -is a string and gives the header name. You probably don't need to -change this. The default value is @code{"X-Gnus-Delayed"}. -@end table - -The way delaying works is like this: when you use the -@code{gnus-delay-article} command, you give a certain delay. Gnus -calculates the deadline of the message and stores it in the -@code{X-Gnus-Delayed} header and puts the message in the -@code{nndraft:delayed} group. - -And whenever you get new news, Gnus looks through the group for articles -which are due and sends them. It uses the @code{gnus-delay-send-drafts} -function for this. By default, this function is added to the hook -@code{gnus-get-new-news-hook}. But of course, you can change this. -Maybe you want to use the demon to send drafts? Just tell the demon to -execute the @code{gnus-delay-send-drafts} function. - -@table @code -@item gnus-delay-initialize -@findex gnus-delay-initialize -By default, this function installs the @kbd{C-c C-j} key binding in -Message mode and @code{gnus-delay-send-drafts} in -@code{gnus-get-new-news-hook}. But it accepts two optional arguments, -@code{no-keymap} and @code{no-check}. If @code{no-keymap} is non-nil, -the @kbd{C-c C-j} binding is not intalled. If @code{no-check} is -non-nil, @code{gnus-get-new-news-hook} is not changed. - -For example, @code{(gnus-delay-initialize nil t)} means to change the -keymap but not to change @code{gnus-get-new-news-hook}. Presumably, you -want to use the demon for sending due delayed articles. Just don't -forget to set that up :-) -@end table - - -@node Marking Articles -@section Marking Articles -@cindex article marking -@cindex article ticking -@cindex marks - -There are several marks you can set on an article. - -You have marks that decide the @dfn{readedness} (whoo, neato-keano -neologism ohoy!) of the article. Alphabetic marks generally mean -@dfn{read}, while non-alphabetic characters generally mean @dfn{unread}. - -In addition, you also have marks that do not affect readedness. - -@menu -* Unread Articles:: Marks for unread articles. -* Read Articles:: Marks for read articles. -* Other Marks:: Marks that do not affect readedness. -@end menu - -@ifinfo -There's a plethora of commands for manipulating these marks: -@end ifinfo - -@menu -* Setting Marks:: How to set and remove marks. -* Generic Marking Commands:: How to customize the marking. -* Setting Process Marks:: How to mark articles for later processing. -@end menu - - -@node Unread Articles -@subsection Unread Articles - -The following marks mark articles as (kinda) unread, in one form or -other. - -@table @samp -@item ! -@vindex gnus-ticked-mark -Marked as ticked (@code{gnus-ticked-mark}). - -@dfn{Ticked articles} are articles that will remain visible always. If -you see an article that you find interesting, or you want to put off -reading it, or replying to it, until sometime later, you'd typically -tick it. However, articles can be expired (from news servers by the -news server software, Gnus itself never expires ticked messages), so if -you want to keep an article forever, you'll have to make it persistent -(@pxref{Persistent Articles}). - -@item ? -@vindex gnus-dormant-mark -Marked as dormant (@code{gnus-dormant-mark}). - -@dfn{Dormant articles} will only appear in the summary buffer if there -are followups to it. If you want to see them even if they don't have -followups, you can use the @kbd{/ D} command (@pxref{Limiting}). -Otherwise (except for the visibility issue), they are just like ticked -messages. - -@item SPACE -@vindex gnus-unread-mark -Marked as unread (@code{gnus-unread-mark}). - -@dfn{Unread articles} are articles that haven't been read at all yet. -@end table - - -@node Read Articles -@subsection Read Articles -@cindex expirable mark - -All the following marks mark articles as read. - -@table @samp - -@item r -@vindex gnus-del-mark -These are articles that the user has marked as read with the @kbd{d} -command manually, more or less (@code{gnus-del-mark}). - -@item R -@vindex gnus-read-mark -Articles that have actually been read (@code{gnus-read-mark}). - -@item O -@vindex gnus-ancient-mark -Articles that were marked as read in previous sessions and are now -@dfn{old} (@code{gnus-ancient-mark}). - -@item K -@vindex gnus-killed-mark -Marked as killed (@code{gnus-killed-mark}). - -@item X -@vindex gnus-kill-file-mark -Marked as killed by kill files (@code{gnus-kill-file-mark}). - -@item Y -@vindex gnus-low-score-mark -Marked as read by having too low a score (@code{gnus-low-score-mark}). - -@item C -@vindex gnus-catchup-mark -Marked as read by a catchup (@code{gnus-catchup-mark}). - -@item G -@vindex gnus-canceled-mark -Canceled article (@code{gnus-canceled-mark}) - -@item F -@vindex gnus-souped-mark -@sc{soup}ed article (@code{gnus-souped-mark}). @xref{SOUP}. - -@item Q -@vindex gnus-sparse-mark -Sparsely reffed article (@code{gnus-sparse-mark}). @xref{Customizing -Threading}. - -@item M -@vindex gnus-duplicate-mark -Article marked as read by duplicate suppression -(@code{gnus-duplicate-mark}). @xref{Duplicate Suppression}. - -@end table - -All these marks just mean that the article is marked as read, really. -They are interpreted differently when doing adaptive scoring, though. - -One more special mark, though: - -@table @samp -@item E -@vindex gnus-expirable-mark -Marked as expirable (@code{gnus-expirable-mark}). - -Marking articles as @dfn{expirable} (or have them marked as such -automatically) doesn't make much sense in normal groups---a user doesn't -control expiring of news articles, but in mail groups, for instance, -articles marked as @dfn{expirable} can be deleted by gnus at -any time. -@end table - - -@node Other Marks -@subsection Other Marks -@cindex process mark -@cindex bookmarks - -There are some marks that have nothing to do with whether the article is -read or not. - -@itemize @bullet - -@item -You can set a bookmark in the current article. Say you are reading a -long thesis on cats' urinary tracts, and have to go home for dinner -before you've finished reading the thesis. You can then set a bookmark -in the article, and gnus will jump to this bookmark the next time it -encounters the article. @xref{Setting Marks}. - -@item -@vindex gnus-replied-mark -All articles that you have replied to or made a followup to (i.e., have -answered) will be marked with an @samp{A} in the second column -(@code{gnus-replied-mark}). - -@vindex gnus-forwarded-mark -All articles that you have forwarded will be marked with an @samp{F} in -the second column (@code{gnus-forwarded-mark}). - -@vindex gnus-recent-mark -Articles that are ``recently'' arrived in the group will be marked -with an @samp{N} in the second column (@code{gnus-recent-mark}). Most -backend doesn't support the mark, in which case it's not shown. - -@item -@vindex gnus-cached-mark -Articles stored in the article cache will be marked with an @samp{*} in -the second column (@code{gnus-cached-mark}). @xref{Article Caching}. - -@item -@vindex gnus-saved-mark -Articles ``saved'' (in some manner or other; not necessarily -religiously) are marked with an @samp{S} in the second column -(@code{gnus-saved-mark}). - -@item -@vindex gnus-unseen-mark -Articles that haven't been seen by the user before are marked with a -@samp{.} in the second column (@code{gnus-unseen-mark}). - -@item -@vindex gnus-not-empty-thread-mark -@vindex gnus-empty-thread-mark -If the @samp{%e} spec is used, the presence of threads or not will be -marked with @code{gnus-not-empty-thread-mark} and -@code{gnus-empty-thread-mark} in the third column, respectively. - -@item -@vindex gnus-process-mark -Finally we have the @dfn{process mark} (@code{gnus-process-mark}). A -variety of commands react to the presence of the process mark. For -instance, @kbd{X u} (@code{gnus-uu-decode-uu}) will uudecode and view -all articles that have been marked with the process mark. Articles -marked with the process mark have a @samp{#} in the second column. - -@end itemize - -You might have noticed that most of these ``non-readedness'' marks -appear in the second column by default. So if you have a cached, saved, -replied article that you have process-marked, what will that look like? - -Nothing much. The precedence rules go as follows: process -> cache -> -replied -> saved. So if the article is in the cache and is replied, -you'll only see the cache mark and not the replied mark. - - -@node Setting Marks -@subsection Setting Marks -@cindex setting marks - -All the marking commands understand the numeric prefix. - -@table @kbd -@item M c -@itemx M-u -@kindex M c (Summary) -@kindex M-u (Summary) -@findex gnus-summary-clear-mark-forward -@cindex mark as unread -Clear all readedness-marks from the current article -(@code{gnus-summary-clear-mark-forward}). In other words, mark the -article as unread. - -@item M t -@itemx ! -@kindex ! (Summary) -@kindex M t (Summary) -@findex gnus-summary-tick-article-forward -Tick the current article (@code{gnus-summary-tick-article-forward}). -@xref{Article Caching}. - -@item M ? -@itemx ? -@kindex ? (Summary) -@kindex M ? (Summary) -@findex gnus-summary-mark-as-dormant -Mark the current article as dormant -(@code{gnus-summary-mark-as-dormant}). @xref{Article Caching}. - -@item M d -@itemx d -@kindex M d (Summary) -@kindex d (Summary) -@findex gnus-summary-mark-as-read-forward -Mark the current article as read -(@code{gnus-summary-mark-as-read-forward}). - -@item D -@kindex D (Summary) -@findex gnus-summary-mark-as-read-backward -Mark the current article as read and move point to the previous line -(@code{gnus-summary-mark-as-read-backward}). - -@item M k -@itemx k -@kindex k (Summary) -@kindex M k (Summary) -@findex gnus-summary-kill-same-subject-and-select -Mark all articles that have the same subject as the current one as read, -and then select the next unread article -(@code{gnus-summary-kill-same-subject-and-select}). - -@item M K -@itemx C-k -@kindex M K (Summary) -@kindex C-k (Summary) -@findex gnus-summary-kill-same-subject -Mark all articles that have the same subject as the current one as read -(@code{gnus-summary-kill-same-subject}). - -@item M C -@kindex M C (Summary) -@findex gnus-summary-catchup -@c @icon{gnus-summary-catchup} -Mark all unread articles as read (@code{gnus-summary-catchup}). - -@item M C-c -@kindex M C-c (Summary) -@findex gnus-summary-catchup-all -Mark all articles in the group as read---even the ticked and dormant -articles (@code{gnus-summary-catchup-all}). - -@item M H -@kindex M H (Summary) -@findex gnus-summary-catchup-to-here -Catchup the current group to point (before the point) -(@code{gnus-summary-catchup-to-here}). - -@item M h -@kindex M h (Summary) -@findex gnus-summary-catchup-from-here -Catchup the current group from point (after the point) -(@code{gnus-summary-catchup-from-here}). - -@item C-w -@kindex C-w (Summary) -@findex gnus-summary-mark-region-as-read -Mark all articles between point and mark as read -(@code{gnus-summary-mark-region-as-read}). - -@item M V k -@kindex M V k (Summary) -@findex gnus-summary-kill-below -Kill all articles with scores below the default score (or below the -numeric prefix) (@code{gnus-summary-kill-below}). - -@item M e -@itemx E -@kindex M e (Summary) -@kindex E (Summary) -@findex gnus-summary-mark-as-expirable -Mark the current article as expirable -(@code{gnus-summary-mark-as-expirable}). - -@item M b -@kindex M b (Summary) -@findex gnus-summary-set-bookmark -Set a bookmark in the current article -(@code{gnus-summary-set-bookmark}). - -@item M B -@kindex M B (Summary) -@findex gnus-summary-remove-bookmark -Remove the bookmark from the current article -(@code{gnus-summary-remove-bookmark}). - -@item M V c -@kindex M V c (Summary) -@findex gnus-summary-clear-above -Clear all marks from articles with scores over the default score (or -over the numeric prefix) (@code{gnus-summary-clear-above}). - -@item M V u -@kindex M V u (Summary) -@findex gnus-summary-tick-above -Tick all articles with scores over the default score (or over the -numeric prefix) (@code{gnus-summary-tick-above}). - -@item M V m -@kindex M V m (Summary) -@findex gnus-summary-mark-above -Prompt for a mark, and mark all articles with scores over the default -score (or over the numeric prefix) with this mark -(@code{gnus-summary-clear-above}). -@end table - -@vindex gnus-summary-goto-unread -The @code{gnus-summary-goto-unread} variable controls what action should -be taken after setting a mark. If non-@code{nil}, point will move to -the next/previous unread article. If @code{nil}, point will just move -one line up or down. As a special case, if this variable is -@code{never}, all the marking commands as well as other commands (like -@kbd{SPACE}) will move to the next article, whether it is unread or not. -The default is @code{t}. - - -@node Generic Marking Commands -@subsection Generic Marking Commands - -Some people would like the command that ticks an article (@kbd{!}) go to -the next article. Others would like it to go to the next unread -article. Yet others would like it to stay on the current article. And -even though I haven't heard of anybody wanting it to go to the -previous (unread) article, I'm sure there are people that want that as -well. - -Multiply these five behaviors with five different marking commands, and -you get a potentially complex set of variable to control what each -command should do. - -To sidestep that mess, Gnus provides commands that do all these -different things. They can be found on the @kbd{M M} map in the summary -buffer. Type @kbd{M M C-h} to see them all---there are too many of them -to list in this manual. - -While you can use these commands directly, most users would prefer -altering the summary mode keymap. For instance, if you would like the -@kbd{!} command to go to the next article instead of the next unread -article, you could say something like: - -@lisp -(add-hook 'gnus-summary-mode-hook 'my-alter-summary-map) -(defun my-alter-summary-map () - (local-set-key "!" 'gnus-summary-put-mark-as-ticked-next)) -@end lisp - -or - -@lisp -(defun my-alter-summary-map () - (local-set-key "!" "MM!n")) -@end lisp - - -@node Setting Process Marks -@subsection Setting Process Marks -@cindex setting process marks - -@table @kbd - -@item M P p -@itemx # -@kindex # (Summary) -@kindex M P p (Summary) -@findex gnus-summary-mark-as-processable -Mark the current article with the process mark -(@code{gnus-summary-mark-as-processable}). -@findex gnus-summary-unmark-as-processable - -@item M P u -@itemx M-# -@kindex M P u (Summary) -@kindex M-# (Summary) -Remove the process mark, if any, from the current article -(@code{gnus-summary-unmark-as-processable}). - -@item M P U -@kindex M P U (Summary) -@findex gnus-summary-unmark-all-processable -Remove the process mark from all articles -(@code{gnus-summary-unmark-all-processable}). - -@item M P i -@kindex M P i (Summary) -@findex gnus-uu-invert-processable -Invert the list of process marked articles -(@code{gnus-uu-invert-processable}). - -@item M P R -@kindex M P R (Summary) -@findex gnus-uu-mark-by-regexp -Mark articles that have a @code{Subject} header that matches a regular -expression (@code{gnus-uu-mark-by-regexp}). - -@item M P G -@kindex M P G (Summary) -@findex gnus-uu-unmark-by-regexp -Unmark articles that have a @code{Subject} header that matches a regular -expression (@code{gnus-uu-unmark-by-regexp}). - -@item M P r -@kindex M P r (Summary) -@findex gnus-uu-mark-region -Mark articles in region (@code{gnus-uu-mark-region}). - -@item M P t -@kindex M P t (Summary) -@findex gnus-uu-mark-thread -Mark all articles in the current (sub)thread -(@code{gnus-uu-mark-thread}). - -@item M P T -@kindex M P T (Summary) -@findex gnus-uu-unmark-thread -Unmark all articles in the current (sub)thread -(@code{gnus-uu-unmark-thread}). - -@item M P v -@kindex M P v (Summary) -@findex gnus-uu-mark-over -Mark all articles that have a score above the prefix argument -(@code{gnus-uu-mark-over}). - -@item M P s -@kindex M P s (Summary) -@findex gnus-uu-mark-series -Mark all articles in the current series (@code{gnus-uu-mark-series}). - -@item M P S -@kindex M P S (Summary) -@findex gnus-uu-mark-sparse -Mark all series that have already had some articles marked -(@code{gnus-uu-mark-sparse}). - -@item M P a -@kindex M P a (Summary) -@findex gnus-uu-mark-all -Mark all articles in series order (@code{gnus-uu-mark-series}). - -@item M P b -@kindex M P b (Summary) -@findex gnus-uu-mark-buffer -Mark all articles in the buffer in the order they appear -(@code{gnus-uu-mark-buffer}). - -@item M P k -@kindex M P k (Summary) -@findex gnus-summary-kill-process-mark -Push the current process mark set onto the stack and unmark all articles -(@code{gnus-summary-kill-process-mark}). - -@item M P y -@kindex M P y (Summary) -@findex gnus-summary-yank-process-mark -Pop the previous process mark set from the stack and restore it -(@code{gnus-summary-yank-process-mark}). - -@item M P w -@kindex M P w (Summary) -@findex gnus-summary-save-process-mark -Push the current process mark set onto the stack -(@code{gnus-summary-save-process-mark}). - -@end table - -Also see the @kbd{&} command in @pxref{Searching for Articles} for how to -set process marks based on article body contents. - - -@node Limiting -@section Limiting -@cindex limiting - -It can be convenient to limit the summary buffer to just show some -subset of the articles currently in the group. The effect most limit -commands have is to remove a few (or many) articles from the summary -buffer. - -All limiting commands work on subsets of the articles already fetched -from the servers. None of these commands query the server for -additional articles. - -@table @kbd - -@item / / -@itemx / s -@kindex / / (Summary) -@findex gnus-summary-limit-to-subject -Limit the summary buffer to articles that match some subject -(@code{gnus-summary-limit-to-subject}). - -@item / a -@kindex / a (Summary) -@findex gnus-summary-limit-to-author -Limit the summary buffer to articles that match some author -(@code{gnus-summary-limit-to-author}). - -@item / x -@kindex / x (Summary) -@findex gnus-summary-limit-to-extra -Limit the summary buffer to articles that match one of the ``extra'' -headers (@pxref{To From Newsgroups}) -(@code{gnus-summary-limit-to-extra}). - -@item / u -@itemx x -@kindex / u (Summary) -@kindex x (Summary) -@findex gnus-summary-limit-to-unread -Limit the summary buffer to articles not marked as read -(@code{gnus-summary-limit-to-unread}). If given a prefix, limit the -buffer to articles strictly unread. This means that ticked and -dormant articles will also be excluded. - -@item / m -@kindex / m (Summary) -@findex gnus-summary-limit-to-marks -Ask for a mark and then limit to all articles that have been marked -with that mark (@code{gnus-summary-limit-to-marks}). - -@item / t -@kindex / t (Summary) -@findex gnus-summary-limit-to-age -Ask for a number and then limit the summary buffer to articles older than (or equal to) that number of days -(@code{gnus-summary-limit-to-age}). If given a prefix, limit to -articles younger than that number of days. - -@item / n -@kindex / n (Summary) -@findex gnus-summary-limit-to-articles -Limit the summary buffer to the current article -(@code{gnus-summary-limit-to-articles}). Uses the process/prefix -convention (@pxref{Process/Prefix}). - -@item / w -@kindex / w (Summary) -@findex gnus-summary-pop-limit -Pop the previous limit off the stack and restore it -(@code{gnus-summary-pop-limit}). If given a prefix, pop all limits off -the stack. - -@item / v -@kindex / v (Summary) -@findex gnus-summary-limit-to-score -Limit the summary buffer to articles that have a score at or above some -score (@code{gnus-summary-limit-to-score}). - -@item / p -@kindex / p (Summary) -@findex gnus-summary-limit-to-display-parameter -Limit the summary buffer to articles that satisfy the @code{display} -group parameter predicate -(@code{gnus-summary-limit-to-display-parameter}). See @pxref{Group -Parameters} for more on this predicate. - -@item / E -@itemx M S -@kindex M S (Summary) -@kindex / E (Summary) -@findex gnus-summary-limit-include-expunged -Include all expunged articles in the limit -(@code{gnus-summary-limit-include-expunged}). - -@item / D -@kindex / D (Summary) -@findex gnus-summary-limit-include-dormant -Include all dormant articles in the limit -(@code{gnus-summary-limit-include-dormant}). - -@item / * -@kindex / * (Summary) -@findex gnus-summary-limit-include-cached -Include all cached articles in the limit -(@code{gnus-summary-limit-include-cached}). - -@item / d -@kindex / d (Summary) -@findex gnus-summary-limit-exclude-dormant -Exclude all dormant articles from the limit -(@code{gnus-summary-limit-exclude-dormant}). - -@item / M -@kindex / M (Summary) -@findex gnus-summary-limit-exclude-marks -Exclude all marked articles (@code{gnus-summary-limit-exclude-marks}). - -@item / T -@kindex / T (Summary) -@findex gnus-summary-limit-include-thread -Include all the articles in the current thread in the limit. - -@item / c -@kindex / c (Summary) -@findex gnus-summary-limit-exclude-childless-dormant -Exclude all dormant articles that have no children from the limit -(@code{gnus-summary-limit-exclude-childless-dormant}). - -@item / C -@kindex / C (Summary) -@findex gnus-summary-limit-mark-excluded-as-read -Mark all excluded unread articles as read -(@code{gnus-summary-limit-mark-excluded-as-read}). If given a prefix, -also mark excluded ticked and dormant articles as read. - -@end table - - -@node Threading -@section Threading -@cindex threading -@cindex article threading - -Gnus threads articles by default. @dfn{To thread} is to put responses -to articles directly after the articles they respond to---in a -hierarchical fashion. - -Threading is done by looking at the @code{References} headers of the -articles. In a perfect world, this would be enough to build pretty -trees, but unfortunately, the @code{References} header is often broken -or simply missing. Weird news propagation exacerbates the problem, -so one has to employ other heuristics to get pleasing results. A -plethora of approaches exists, as detailed in horrible detail in -@pxref{Customizing Threading}. - -First, a quick overview of the concepts: - -@table @dfn -@item root -The top-most article in a thread; the first article in the thread. - -@item thread -A tree-like article structure. - -@item sub-thread -A small(er) section of this tree-like structure. - -@item loose threads -Threads often lose their roots due to article expiry, or due to the root -already having been read in a previous session, and not displayed in the -summary buffer. We then typically have many sub-threads that really -belong to one thread, but are without connecting roots. These are -called loose threads. - -@item thread gathering -An attempt to gather loose threads into bigger threads. - -@item sparse threads -A thread where the missing articles have been ``guessed'' at, and are -displayed as empty lines in the summary buffer. - -@end table - - -@menu -* Customizing Threading:: Variables you can change to affect the threading. -* Thread Commands:: Thread based commands in the summary buffer. -@end menu - - -@node Customizing Threading -@subsection Customizing Threading -@cindex customizing threading - -@menu -* Loose Threads:: How Gnus gathers loose threads into bigger threads. -* Filling In Threads:: Making the threads displayed look fuller. -* More Threading:: Even more variables for fiddling with threads. -* Low-Level Threading:: You thought it was over... but you were wrong! -@end menu - - -@node Loose Threads -@subsubsection Loose Threads -@cindex < -@cindex > -@cindex loose threads - -@table @code -@item gnus-summary-make-false-root -@vindex gnus-summary-make-false-root -If non-@code{nil}, gnus will gather all loose subtrees into one big tree -and create a dummy root at the top. (Wait a minute. Root at the top? -Yup.) Loose subtrees occur when the real root has expired, or you've -read or killed the root in a previous session. - -When there is no real root of a thread, gnus will have to fudge -something. This variable says what fudging method gnus should use. -There are four possible values: - -@iftex -@iflatex -\gnusfigure{The Summary Buffer}{390}{ -\put(0,0){\epsfig{figure=tmp/summary-adopt.ps,width=7.5cm}} -\put(445,0){\makebox(0,0)[br]{\epsfig{figure=tmp/summary-empty.ps,width=7.5cm}}} -\put(0,400){\makebox(0,0)[tl]{\epsfig{figure=tmp/summary-none.ps,width=7.5cm}}} -\put(445,400){\makebox(0,0)[tr]{\epsfig{figure=tmp/summary-dummy.ps,width=7.5cm}}} -} -@end iflatex -@end iftex - -@cindex adopting articles - -@table @code - -@item adopt -Gnus will make the first of the orphaned articles the parent. This -parent will adopt all the other articles. The adopted articles will be -marked as such by pointy brackets (@samp{<>}) instead of the standard -square brackets (@samp{[]}). This is the default method. - -@item dummy -@vindex gnus-summary-dummy-line-format -Gnus will create a dummy summary line that will pretend to be the -parent. This dummy line does not correspond to any real article, so -selecting it will just select the first real article after the dummy -article. @code{gnus-summary-dummy-line-format} is used to specify the -format of the dummy roots. It accepts only one format spec: @samp{S}, -which is the subject of the article. @xref{Formatting Variables}. - -@item empty -Gnus won't actually make any article the parent, but simply leave the -subject field of all orphans except the first empty. (Actually, it will -use @code{gnus-summary-same-subject} as the subject (@pxref{Summary -Buffer Format}).) - -@item none -Don't make any article parent at all. Just gather the threads and -display them after one another. - -@item nil -Don't gather loose threads. -@end table - -@item gnus-summary-gather-subject-limit -@vindex gnus-summary-gather-subject-limit -Loose threads are gathered by comparing subjects of articles. If this -variable is @code{nil}, gnus requires an exact match between the -subjects of the loose threads before gathering them into one big -super-thread. This might be too strict a requirement, what with the -presence of stupid newsreaders that chop off long subject lines. If -you think so, set this variable to, say, 20 to require that only the -first 20 characters of the subjects have to match. If you set this -variable to a really low number, you'll find that gnus will gather -everything in sight into one thread, which isn't very helpful. - -@cindex fuzzy article gathering -If you set this variable to the special value @code{fuzzy}, gnus will -use a fuzzy string comparison algorithm on the subjects (@pxref{Fuzzy -Matching}). - -@item gnus-simplify-subject-fuzzy-regexp -@vindex gnus-simplify-subject-fuzzy-regexp -This can either be a regular expression or list of regular expressions -that match strings that will be removed from subjects if fuzzy subject -simplification is used. - -@item gnus-simplify-ignored-prefixes -@vindex gnus-simplify-ignored-prefixes -If you set @code{gnus-summary-gather-subject-limit} to something as low -as 10, you might consider setting this variable to something sensible: - -@c Written by Michael Ernst -@lisp -(setq gnus-simplify-ignored-prefixes - (concat - "\\`\\[?\\(" - (mapconcat - 'identity - '("looking" - "wanted" "followup" "summary\\( of\\)?" - "help" "query" "problem" "question" - "answer" "reference" "announce" - "How can I" "How to" "Comparison of" - ;; ... - ) - "\\|") - "\\)\\s *\\(" - (mapconcat 'identity - '("for" "for reference" "with" "about") - "\\|") - "\\)?\\]?:?[ \t]*")) -@end lisp - -All words that match this regexp will be removed before comparing two -subjects. - -@item gnus-simplify-subject-functions -@vindex gnus-simplify-subject-functions -If non-@code{nil}, this variable overrides -@code{gnus-summary-gather-subject-limit}. This variable should be a -list of functions to apply to the @code{Subject} string iteratively to -arrive at the simplified version of the string. - -Useful functions to put in this list include: - -@table @code -@item gnus-simplify-subject-re -@findex gnus-simplify-subject-re -Strip the leading @samp{Re:}. - -@item gnus-simplify-subject-fuzzy -@findex gnus-simplify-subject-fuzzy -Simplify fuzzily. - -@item gnus-simplify-whitespace -@findex gnus-simplify-whitespace -Remove excessive whitespace. -@end table - -You may also write your own functions, of course. - - -@item gnus-summary-gather-exclude-subject -@vindex gnus-summary-gather-exclude-subject -Since loose thread gathering is done on subjects only, that might lead -to many false hits, especially with certain common subjects like -@samp{} and @samp{(none)}. To make the situation slightly better, -you can use the regexp @code{gnus-summary-gather-exclude-subject} to say -what subjects should be excluded from the gathering process.@* -The default is @samp{^ *$\\|^(none)$}. - -@item gnus-summary-thread-gathering-function -@vindex gnus-summary-thread-gathering-function -Gnus gathers threads by looking at @code{Subject} headers. This means -that totally unrelated articles may end up in the same ``thread'', which -is confusing. An alternate approach is to look at all the -@code{Message-ID}s in all the @code{References} headers to find matches. -This will ensure that no gathered threads ever include unrelated -articles, but it also means that people who have posted with broken -newsreaders won't be gathered properly. The choice is yours---plague or -cholera: - -@table @code -@item gnus-gather-threads-by-subject -@findex gnus-gather-threads-by-subject -This function is the default gathering function and looks at -@code{Subject}s exclusively. - -@item gnus-gather-threads-by-references -@findex gnus-gather-threads-by-references -This function looks at @code{References} headers exclusively. -@end table - -If you want to test gathering by @code{References}, you could say -something like: - -@lisp -(setq gnus-summary-thread-gathering-function - 'gnus-gather-threads-by-references) -@end lisp - -@end table - - -@node Filling In Threads -@subsubsection Filling In Threads - -@table @code -@item gnus-fetch-old-headers -@vindex gnus-fetch-old-headers -If non-@code{nil}, gnus will attempt to build old threads by fetching -more old headers---headers to articles marked as read. If you -would like to display as few summary lines as possible, but still -connect as many loose threads as possible, you should set this variable -to @code{some} or a number. If you set it to a number, no more than -that number of extra old headers will be fetched. In either case, -fetching old headers only works if the backend you are using carries -overview files---this would normally be @code{nntp}, @code{nnspool} and -@code{nnml}. Also remember that if the root of the thread has been -expired by the server, there's not much gnus can do about that. - -This variable can also be set to @code{invisible}. This won't have any -visible effects, but is useful if you use the @kbd{A T} command a lot -(@pxref{Finding the Parent}). - -@item gnus-build-sparse-threads -@vindex gnus-build-sparse-threads -Fetching old headers can be slow. A low-rent similar effect can be -gotten by setting this variable to @code{some}. Gnus will then look at -the complete @code{References} headers of all articles and try to string -together articles that belong in the same thread. This will leave -@dfn{gaps} in the threading display where gnus guesses that an article -is missing from the thread. (These gaps appear like normal summary -lines. If you select a gap, gnus will try to fetch the article in -question.) If this variable is @code{t}, gnus will display all these -``gaps'' without regard for whether they are useful for completing the -thread or not. Finally, if this variable is @code{more}, gnus won't cut -off sparse leaf nodes that don't lead anywhere. This variable is -@code{nil} by default. - -@item gnus-read-all-available-headers -@vindex gnus-read-all-available-headers -This is a rather obscure variable that few will find useful. It's -intended for those non-news newsgroups where the backend has to fetch -quite a lot to present the summary buffer, and where it's impossible to -go back to parents of articles. This is mostly the case in the -web-based groups, like the @code{nnultimate} groups. - -If you don't use those, then it's safe to leave this as the default -@code{nil}. If you want to use this variable, it should be a regexp -that matches the group name, or @code{t} for all groups. - -@end table - - -@node More Threading -@subsubsection More Threading - -@table @code -@item gnus-show-threads -@vindex gnus-show-threads -If this variable is @code{nil}, no threading will be done, and all of -the rest of the variables here will have no effect. Turning threading -off will speed group selection up a bit, but it is sure to make reading -slower and more awkward. - -@item gnus-thread-hide-subtree -@vindex gnus-thread-hide-subtree -If non-@code{nil}, all threads will be hidden when the summary buffer is -generated. - -@item gnus-thread-expunge-below -@vindex gnus-thread-expunge-below -All threads that have a total score (as defined by -@code{gnus-thread-score-function}) less than this number will be -expunged. This variable is @code{nil} by default, which means that no -threads are expunged. - -@item gnus-thread-hide-killed -@vindex gnus-thread-hide-killed -if you kill a thread and this variable is non-@code{nil}, the subtree -will be hidden. - -@item gnus-thread-ignore-subject -@vindex gnus-thread-ignore-subject -Sometimes somebody changes the subject in the middle of a thread. If -this variable is non-@code{nil}, which is the default, the subject -change is ignored. If it is @code{nil}, a change in the subject will -result in a new thread. - -@item gnus-thread-indent-level -@vindex gnus-thread-indent-level -This is a number that says how much each sub-thread should be indented. -The default is 4. - -@item gnus-sort-gathered-threads-function -@vindex gnus-sort-gathered-threads-function -Sometimes, particularly with mailing lists, the order in which mails -arrive locally is not necessarily the same as the order in which they -arrived on the mailing list. Consequently, when sorting sub-threads -using the default @code{gnus-thread-sort-by-number}, responses can end -up appearing before the article to which they are responding to. -Setting this variable to an alternate value -(e.g. @code{gnus-thread-sort-by-date}), in a group's parameters or in an -appropriate hook (e.g. @code{gnus-summary-generate-hook}) can produce a -more logical sub-thread ordering in such instances. - -@end table - - -@node Low-Level Threading -@subsubsection Low-Level Threading - -@table @code - -@item gnus-parse-headers-hook -@vindex gnus-parse-headers-hook -Hook run before parsing any headers. The default value is -@code{(gnus-set-summary-default-charset)}, which sets up local value of -@code{default-mime-charset} in summary buffer based on variable -@code{gnus-newsgroup-default-charset-alist}. - -@item gnus-alter-header-function -@vindex gnus-alter-header-function -If non-@code{nil}, this function will be called to allow alteration of -article header structures. The function is called with one parameter, -the article header vector, which it may alter in any way. For instance, -if you have a mail-to-news gateway which alters the @code{Message-ID}s -in systematic ways (by adding prefixes and such), you can use this -variable to un-scramble the @code{Message-ID}s so that they are more -meaningful. Here's one example: - -@lisp -(setq gnus-alter-header-function 'my-alter-message-id) - -(defun my-alter-message-id (header) - (let ((id (mail-header-id header))) - (when (string-match - "\\(<[^<>@@]*\\)\\.?cygnus\\..*@@\\([^<>@@]*>\\)" id) - (mail-header-set-id - (concat (match-string 1 id) "@@" (match-string 2 id)) - header)))) -@end lisp - -@end table - - -@node Thread Commands -@subsection Thread Commands -@cindex thread commands - -@table @kbd - -@item T k -@itemx M-C-k -@kindex T k (Summary) -@kindex M-C-k (Summary) -@findex gnus-summary-kill-thread -Mark all articles in the current (sub-)thread as read -(@code{gnus-summary-kill-thread}). If the prefix argument is positive, -remove all marks instead. If the prefix argument is negative, tick -articles instead. - -@item T l -@itemx M-C-l -@kindex T l (Summary) -@kindex M-C-l (Summary) -@findex gnus-summary-lower-thread -Lower the score of the current (sub-)thread -(@code{gnus-summary-lower-thread}). - -@item T i -@kindex T i (Summary) -@findex gnus-summary-raise-thread -Increase the score of the current (sub-)thread -(@code{gnus-summary-raise-thread}). - -@item T # -@kindex T # (Summary) -@findex gnus-uu-mark-thread -Set the process mark on the current (sub-)thread -(@code{gnus-uu-mark-thread}). - -@item T M-# -@kindex T M-# (Summary) -@findex gnus-uu-unmark-thread -Remove the process mark from the current (sub-)thread -(@code{gnus-uu-unmark-thread}). - -@item T T -@kindex T T (Summary) -@findex gnus-summary-toggle-threads -Toggle threading (@code{gnus-summary-toggle-threads}). - -@item T s -@kindex T s (Summary) -@findex gnus-summary-show-thread -Expose the (sub-)thread hidden under the current article, if any -(@code{gnus-summary-show-thread}). - -@item T h -@kindex T h (Summary) -@findex gnus-summary-hide-thread -Hide the current (sub-)thread (@code{gnus-summary-hide-thread}). - -@item T S -@kindex T S (Summary) -@findex gnus-summary-show-all-threads -Expose all hidden threads (@code{gnus-summary-show-all-threads}). - -@item T H -@kindex T H (Summary) -@findex gnus-summary-hide-all-threads -Hide all threads (@code{gnus-summary-hide-all-threads}). - -@item T t -@kindex T t (Summary) -@findex gnus-summary-rethread-current -Re-thread the current article's thread -(@code{gnus-summary-rethread-current}). This works even when the -summary buffer is otherwise unthreaded. - -@item T ^ -@kindex T ^ (Summary) -@findex gnus-summary-reparent-thread -Make the current article the child of the marked (or previous) article -(@code{gnus-summary-reparent-thread}). - -@end table - -The following commands are thread movement commands. They all -understand the numeric prefix. - -@table @kbd - -@item T n -@kindex T n (Summary) -@itemx M-C-n -@kindex M-C-n (Summary) -@itemx M-down -@kindex M-down (Summary) -@findex gnus-summary-next-thread -Go to the next thread (@code{gnus-summary-next-thread}). - -@item T p -@kindex T p (Summary) -@itemx M-C-p -@kindex M-C-p (Summary) -@itemx M-up -@kindex M-up (Summary) -@findex gnus-summary-prev-thread -Go to the previous thread (@code{gnus-summary-prev-thread}). - -@item T d -@kindex T d (Summary) -@findex gnus-summary-down-thread -Descend the thread (@code{gnus-summary-down-thread}). - -@item T u -@kindex T u (Summary) -@findex gnus-summary-up-thread -Ascend the thread (@code{gnus-summary-up-thread}). - -@item T o -@kindex T o (Summary) -@findex gnus-summary-top-thread -Go to the top of the thread (@code{gnus-summary-top-thread}). -@end table - -@vindex gnus-thread-operation-ignore-subject -If you ignore subject while threading, you'll naturally end up with -threads that have several different subjects in them. If you then issue -a command like `T k' (@code{gnus-summary-kill-thread}) you might not -wish to kill the entire thread, but just those parts of the thread that -have the same subject as the current article. If you like this idea, -you can fiddle with @code{gnus-thread-operation-ignore-subject}. If it -is non-@code{nil} (which it is by default), subjects will be ignored -when doing thread commands. If this variable is @code{nil}, articles in -the same thread with different subjects will not be included in the -operation in question. If this variable is @code{fuzzy}, only articles -that have subjects fuzzily equal will be included (@pxref{Fuzzy -Matching}). - - -@node Sorting the Summary Buffer -@section Sorting the Summary Buffer - -@findex gnus-thread-sort-by-total-score -@findex gnus-thread-sort-by-date -@findex gnus-thread-sort-by-score -@findex gnus-thread-sort-by-subject -@findex gnus-thread-sort-by-author -@findex gnus-thread-sort-by-number -@vindex gnus-thread-sort-functions -If you are using a threaded summary display, you can sort the threads by -setting @code{gnus-thread-sort-functions}, which can be either a single -function, a list of functions, or a list containing functions and -@code{(not some-function)} elements. - -By default, sorting is done on article numbers. Ready-made sorting -predicate functions include @code{gnus-thread-sort-by-number}, -@code{gnus-thread-sort-by-author}, @code{gnus-thread-sort-by-subject}, -@code{gnus-thread-sort-by-date}, @code{gnus-thread-sort-by-score}, and -@code{gnus-thread-sort-by-total-score}. - -Each function takes two threads and returns non-@code{nil} if the first -thread should be sorted before the other. Note that sorting really is -normally done by looking only at the roots of each thread. - -If you use more than one function, the primary sort key should be the -last function in the list. You should probably always include -@code{gnus-thread-sort-by-number} in the list of sorting -functions---preferably first. This will ensure that threads that are -equal with respect to the other sort criteria will be displayed in -ascending article order. - -If you would like to sort by reverse score, then by subject, and finally -by number, you could do something like: - -@lisp -(setq gnus-thread-sort-functions - '(gnus-thread-sort-by-number - gnus-thread-sort-by-subject - (not gnus-thread-sort-by-total-score))) -@end lisp - -The threads that have highest score will be displayed first in the -summary buffer. When threads have the same score, they will be sorted -alphabetically. The threads that have the same score and the same -subject will be sorted by number, which is (normally) the sequence in -which the articles arrived. - -If you want to sort by score and then reverse arrival order, you could -say something like: - -@lisp -(setq gnus-thread-sort-functions - '((lambda (t1 t2) - (not (gnus-thread-sort-by-number t1 t2))) - gnus-thread-sort-by-score)) -@end lisp - -@vindex gnus-thread-score-function -The function in the @code{gnus-thread-score-function} variable (default -@code{+}) is used for calculating the total score of a thread. Useful -functions might be @code{max}, @code{min}, or squared means, or whatever -tickles your fancy. - -@findex gnus-article-sort-functions -@findex gnus-article-sort-by-date -@findex gnus-article-sort-by-score -@findex gnus-article-sort-by-subject -@findex gnus-article-sort-by-author -@findex gnus-article-sort-by-number -If you are using an unthreaded display for some strange reason or other, -you have to fiddle with the @code{gnus-article-sort-functions} variable. -It is very similar to the @code{gnus-thread-sort-functions}, except that -it uses slightly different functions for article comparison. Available -sorting predicate functions are @code{gnus-article-sort-by-number}, -@code{gnus-article-sort-by-author}, @code{gnus-article-sort-by-subject}, -@code{gnus-article-sort-by-date}, and @code{gnus-article-sort-by-score}. - -If you want to sort an unthreaded summary display by subject, you could -say something like: - -@lisp -(setq gnus-article-sort-functions - '(gnus-article-sort-by-number - gnus-article-sort-by-subject)) -@end lisp - - - -@node Asynchronous Fetching -@section Asynchronous Article Fetching -@cindex asynchronous article fetching -@cindex article pre-fetch -@cindex pre-fetch - -If you read your news from an @sc{nntp} server that's far away, the -network latencies may make reading articles a chore. You have to wait -for a while after pressing @kbd{n} to go to the next article before the -article appears. Why can't gnus just go ahead and fetch the article -while you are reading the previous one? Why not, indeed. - -First, some caveats. There are some pitfalls to using asynchronous -article fetching, especially the way gnus does it. - -Let's say you are reading article 1, which is short, and article 2 is -quite long, and you are not interested in reading that. Gnus does not -know this, so it goes ahead and fetches article 2. You decide to read -article 3, but since gnus is in the process of fetching article 2, the -connection is blocked. - -To avoid these situations, gnus will open two (count 'em two) -connections to the server. Some people may think this isn't a very nice -thing to do, but I don't see any real alternatives. Setting up that -extra connection takes some time, so gnus startup will be slower. - -Gnus will fetch more articles than you will read. This will mean that -the link between your machine and the @sc{nntp} server will become more -loaded than if you didn't use article pre-fetch. The server itself will -also become more loaded---both with the extra article requests, and the -extra connection. - -Ok, so now you know that you shouldn't really use this thing... unless -you really want to. - -@vindex gnus-asynchronous -Here's how: Set @code{gnus-asynchronous} to @code{t}. The rest should -happen automatically. - -@vindex gnus-use-article-prefetch -You can control how many articles are to be pre-fetched by setting -@code{gnus-use-article-prefetch}. This is 30 by default, which means -that when you read an article in the group, the backend will pre-fetch -the next 30 articles. If this variable is @code{t}, the backend will -pre-fetch all the articles it can without bound. If it is -@code{nil}, no pre-fetching will be done. - -@vindex gnus-async-prefetch-article-p -@findex gnus-async-read-p -There are probably some articles that you don't want to pre-fetch---read -articles, for instance. The @code{gnus-async-prefetch-article-p} variable controls whether an article is to be pre-fetched. This function should -return non-@code{nil} when the article in question is to be -pre-fetched. The default is @code{gnus-async-read-p}, which returns -@code{nil} on read articles. The function is called with an article -data structure as the only parameter. - -If, for instance, you wish to pre-fetch only unread articles shorter than 100 lines, you could say something like: - -@lisp -(defun my-async-short-unread-p (data) - "Return non-nil for short, unread articles." - (and (gnus-data-unread-p data) - (< (mail-header-lines (gnus-data-header data)) - 100))) - -(setq gnus-async-prefetch-article-p 'my-async-short-unread-p) -@end lisp - -These functions will be called many, many times, so they should -preferably be short and sweet to avoid slowing down gnus too much. -It's probably a good idea to byte-compile things like this. - -@vindex gnus-prefetched-article-deletion-strategy -Articles have to be removed from the asynch buffer sooner or later. The -@code{gnus-prefetched-article-deletion-strategy} says when to remove -articles. This is a list that may contain the following elements: - -@table @code -@item read -Remove articles when they are read. - -@item exit -Remove articles when exiting the group. -@end table - -The default value is @code{(read exit)}. - -@c @vindex gnus-use-header-prefetch -@c If @code{gnus-use-header-prefetch} is non-@code{nil}, prefetch articles -@c from the next group. - - -@node Article Caching -@section Article Caching -@cindex article caching -@cindex caching - -If you have an @emph{extremely} slow @sc{nntp} connection, you may -consider turning article caching on. Each article will then be stored -locally under your home directory. As you may surmise, this could -potentially use @emph{huge} amounts of disk space, as well as eat up all -your inodes so fast it will make your head swim. In vodka. - -Used carefully, though, it could be just an easier way to save articles. - -@vindex gnus-use-long-file-name -@vindex gnus-cache-directory -@vindex gnus-use-cache -To turn caching on, set @code{gnus-use-cache} to @code{t}. By default, -all articles ticked or marked as dormant will then be copied -over to your local cache (@code{gnus-cache-directory}). Whether this -cache is flat or hierarchical is controlled by the -@code{gnus-use-long-file-name} variable, as usual. - -When re-selecting a ticked or dormant article, it will be fetched from the -cache instead of from the server. As articles in your cache will never -expire, this might serve as a method of saving articles while still -keeping them where they belong. Just mark all articles you want to save -as dormant, and don't worry. - -When an article is marked as read, is it removed from the cache. - -@vindex gnus-cache-remove-articles -@vindex gnus-cache-enter-articles -The entering/removal of articles from the cache is controlled by the -@code{gnus-cache-enter-articles} and @code{gnus-cache-remove-articles} -variables. Both are lists of symbols. The first is @code{(ticked -dormant)} by default, meaning that ticked and dormant articles will be -put in the cache. The latter is @code{(read)} by default, meaning that -articles marked as read are removed from the cache. Possibly -symbols in these two lists are @code{ticked}, @code{dormant}, -@code{unread} and @code{read}. - -@findex gnus-jog-cache -So where does the massive article-fetching and storing come into the -picture? The @code{gnus-jog-cache} command will go through all -subscribed newsgroups, request all unread articles, score them, and -store them in the cache. You should only ever, ever ever ever, use this -command if 1) your connection to the @sc{nntp} server is really, really, -really slow and 2) you have a really, really, really huge disk. -Seriously. One way to cut down on the number of articles downloaded is -to score unwanted articles down and have them marked as read. They will -not then be downloaded by this command. - -@vindex gnus-uncacheable-groups -@vindex gnus-cacheable-groups -It is likely that you do not want caching on all groups. For instance, -if your @code{nnml} mail is located under your home directory, it makes no -sense to cache it somewhere else under your home directory. Unless you -feel that it's neat to use twice as much space. - -To limit the caching, you could set @code{gnus-cacheable-groups} to a -regexp of groups to cache, @samp{^nntp} for instance, or set the -@code{gnus-uncacheable-groups} regexp to @samp{^nnml}, for instance. -Both variables are @code{nil} by default. If a group matches both -variables, the group is not cached. - -@findex gnus-cache-generate-nov-databases -@findex gnus-cache-generate-active -@vindex gnus-cache-active-file -The cache stores information on what articles it contains in its active -file (@code{gnus-cache-active-file}). If this file (or any other parts -of the cache) becomes all messed up for some reason or other, gnus -offers two functions that will try to set things right. @kbd{M-x -gnus-cache-generate-nov-databases} will (re)build all the @sc{nov} -files, and @kbd{gnus-cache-generate-active} will (re)generate the active -file. - - -@node Persistent Articles -@section Persistent Articles -@cindex persistent articles - -Closely related to article caching, we have @dfn{persistent articles}. -In fact, it's just a different way of looking at caching, and much more -useful in my opinion. - -Say you're reading a newsgroup, and you happen on to some valuable gem -that you want to keep and treasure forever. You'd normally just save it -(using one of the many saving commands) in some file. The problem with -that is that it's just, well, yucky. Ideally you'd prefer just having -the article remain in the group where you found it forever; untouched by -the expiry going on at the news server. - -This is what a @dfn{persistent article} is---an article that just won't -be deleted. It's implemented using the normal cache functions, but -you use two explicit commands for managing persistent articles: - -@table @kbd - -@item * -@kindex * (Summary) -@findex gnus-cache-enter-article -Make the current article persistent (@code{gnus-cache-enter-article}). - -@item M-* -@kindex M-* (Summary) -@findex gnus-cache-remove-article -Remove the current article from the persistent articles -(@code{gnus-cache-remove-article}). This will normally delete the -article. -@end table - -Both these commands understand the process/prefix convention. - -To avoid having all ticked articles (and stuff) entered into the cache, -you should set @code{gnus-use-cache} to @code{passive} if you're just -interested in persistent articles: - -@lisp -(setq gnus-use-cache 'passive) -@end lisp - - -@node Article Backlog -@section Article Backlog -@cindex backlog -@cindex article backlog - -If you have a slow connection, but the idea of using caching seems -unappealing to you (and it is, really), you can help the situation some -by switching on the @dfn{backlog}. This is where gnus will buffer -already read articles so that it doesn't have to re-fetch articles -you've already read. This only helps if you are in the habit of -re-selecting articles you've recently read, of course. If you never do -that, turning the backlog on will slow gnus down a little bit, and -increase memory usage some. - -@vindex gnus-keep-backlog -If you set @code{gnus-keep-backlog} to a number @var{n}, gnus will store -at most @var{n} old articles in a buffer for later re-fetching. If this -variable is non-@code{nil} and is not a number, gnus will store -@emph{all} read articles, which means that your Emacs will grow without -bound before exploding and taking your machine down with you. I put -that in there just to keep y'all on your toes. - -This variable is @code{nil} by default. - - -@node Saving Articles -@section Saving Articles -@cindex saving articles - -Gnus can save articles in a number of ways. Below is the documentation -for saving articles in a fairly straight-forward fashion (i.e., little -processing of the article is done before it is saved). For a different -approach (uudecoding, unsharing) you should use @code{gnus-uu} -(@pxref{Decoding Articles}). - -@vindex gnus-save-all-headers -If @code{gnus-save-all-headers} is non-@code{nil}, gnus will not delete -unwanted headers before saving the article. - -@vindex gnus-saved-headers -If the preceding variable is @code{nil}, all headers that match the -@code{gnus-saved-headers} regexp will be kept, while the rest will be -deleted before saving. - -@table @kbd - -@item O o -@itemx o -@kindex O o (Summary) -@kindex o (Summary) -@findex gnus-summary-save-article -@c @icon{gnus-summary-save-article} -Save the current article using the default article saver -(@code{gnus-summary-save-article}). - -@item O m -@kindex O m (Summary) -@findex gnus-summary-save-article-mail -Save the current article in mail format -(@code{gnus-summary-save-article-mail}). - -@item O r -@kindex O r (Summary) -@findex gnus-summary-save-article-rmail -Save the current article in rmail format -(@code{gnus-summary-save-article-rmail}). - -@item O f -@kindex O f (Summary) -@findex gnus-summary-save-article-file -@c @icon{gnus-summary-save-article-file} -Save the current article in plain file format -(@code{gnus-summary-save-article-file}). - -@item O F -@kindex O F (Summary) -@findex gnus-summary-write-article-file -Write the current article in plain file format, overwriting any previous -file contents (@code{gnus-summary-write-article-file}). - -@item O b -@kindex O b (Summary) -@findex gnus-summary-save-article-body-file -Save the current article body in plain file format -(@code{gnus-summary-save-article-body-file}). - -@item O h -@kindex O h (Summary) -@findex gnus-summary-save-article-folder -Save the current article in mh folder format -(@code{gnus-summary-save-article-folder}). - -@item O v -@kindex O v (Summary) -@findex gnus-summary-save-article-vm -Save the current article in a VM folder -(@code{gnus-summary-save-article-vm}). - -@item O p -@itemx | -@kindex O p (Summary) -@kindex | (Summary) -@findex gnus-summary-pipe-output -Save the current article in a pipe. Uhm, like, what I mean is---Pipe -the current article to a process (@code{gnus-summary-pipe-output}). -@end table - -@vindex gnus-prompt-before-saving -All these commands use the process/prefix convention -(@pxref{Process/Prefix}). If you save bunches of articles using these -functions, you might get tired of being prompted for files to save each -and every article in. The prompting action is controlled by -the @code{gnus-prompt-before-saving} variable, which is @code{always} by -default, giving you that excessive prompting action you know and -loathe. If you set this variable to @code{t} instead, you'll be prompted -just once for each series of articles you save. If you like to really -have Gnus do all your thinking for you, you can even set this variable -to @code{nil}, which means that you will never be prompted for files to -save articles in. Gnus will simply save all the articles in the default -files. - - -@vindex gnus-default-article-saver -You can customize the @code{gnus-default-article-saver} variable to make -gnus do what you want it to. You can use any of the six ready-made -functions below, or you can create your own. - -@table @code - -@item gnus-summary-save-in-rmail -@findex gnus-summary-save-in-rmail -@vindex gnus-rmail-save-name -@findex gnus-plain-save-name -This is the default format, @dfn{babyl}. Uses the function in the -@code{gnus-rmail-save-name} variable to get a file name to save the -article in. The default is @code{gnus-plain-save-name}. - -@item gnus-summary-save-in-mail -@findex gnus-summary-save-in-mail -@vindex gnus-mail-save-name -Save in a Unix mail (mbox) file. Uses the function in the -@code{gnus-mail-save-name} variable to get a file name to save the -article in. The default is @code{gnus-plain-save-name}. - -@item gnus-summary-save-in-file -@findex gnus-summary-save-in-file -@vindex gnus-file-save-name -@findex gnus-numeric-save-name -Append the article straight to an ordinary file. Uses the function in -the @code{gnus-file-save-name} variable to get a file name to save the -article in. The default is @code{gnus-numeric-save-name}. - -@item gnus-summary-save-body-in-file -@findex gnus-summary-save-body-in-file -Append the article body to an ordinary file. Uses the function in the -@code{gnus-file-save-name} variable to get a file name to save the -article in. The default is @code{gnus-numeric-save-name}. - -@item gnus-summary-save-in-folder -@findex gnus-summary-save-in-folder -@findex gnus-folder-save-name -@findex gnus-Folder-save-name -@vindex gnus-folder-save-name -@cindex rcvstore -@cindex MH folders -Save the article to an MH folder using @code{rcvstore} from the MH -library. Uses the function in the @code{gnus-folder-save-name} variable -to get a file name to save the article in. The default is -@code{gnus-folder-save-name}, but you can also use -@code{gnus-Folder-save-name}, which creates capitalized names. - -@item gnus-summary-save-in-vm -@findex gnus-summary-save-in-vm -Save the article in a VM folder. You have to have the VM mail -reader to use this setting. -@end table - -@vindex gnus-article-save-directory -All of these functions, except for the last one, will save the article -in the @code{gnus-article-save-directory}, which is initialized from the -@code{SAVEDIR} environment variable. This is @file{~/News/} by -default. - -As you can see above, the functions use different functions to find a -suitable name of a file to save the article in. Below is a list of -available functions that generate names: - -@table @code - -@item gnus-Numeric-save-name -@findex gnus-Numeric-save-name -File names like @file{~/News/Alt.andrea-dworkin/45}. - -@item gnus-numeric-save-name -@findex gnus-numeric-save-name -File names like @file{~/News/alt.andrea-dworkin/45}. - -@item gnus-Plain-save-name -@findex gnus-Plain-save-name -File names like @file{~/News/Alt.andrea-dworkin}. - -@item gnus-plain-save-name -@findex gnus-plain-save-name -File names like @file{~/News/alt.andrea-dworkin}. - -@item gnus-sender-save-name -@findex gnus-sender-save-name -File names like @file{~/News/larsi}. -@end table - -@vindex gnus-split-methods -You can have gnus suggest where to save articles by plonking a regexp into -the @code{gnus-split-methods} alist. For instance, if you would like to -save articles related to gnus in the file @file{gnus-stuff}, and articles -related to VM in @code{vm-stuff}, you could set this variable to something -like: - -@lisp -(("^Subject:.*gnus\\|^Newsgroups:.*gnus" "gnus-stuff") - ("^Subject:.*vm\\|^Xref:.*vm" "vm-stuff") - (my-choosing-function "../other-dir/my-stuff") - ((equal gnus-newsgroup-name "mail.misc") "mail-stuff")) -@end lisp - -We see that this is a list where each element is a list that has two -elements---the @dfn{match} and the @dfn{file}. The match can either be -a string (in which case it is used as a regexp to match on the article -head); it can be a symbol (which will be called as a function with the -group name as a parameter); or it can be a list (which will be -@code{eval}ed). If any of these actions have a non-@code{nil} result, -the @dfn{file} will be used as a default prompt. In addition, the -result of the operation itself will be used if the function or form -called returns a string or a list of strings. - -You basically end up with a list of file names that might be used when -saving the current article. (All ``matches'' will be used.) You will -then be prompted for what you really want to use as a name, with file -name completion over the results from applying this variable. - -This variable is @code{((gnus-article-archive-name))} by default, which -means that gnus will look at the articles it saves for an -@code{Archive-name} line and use that as a suggestion for the file -name. - -Here's an example function to clean up file names somewhat. If you have -lots of mail groups called things like -@samp{nnml:mail.whatever}, you may want to chop off the beginning of -these group names before creating the file name to save to. The -following will do just that: - -@lisp -(defun my-save-name (group) - (when (string-match "^nnml:mail." group) - (substring group (match-end 0)))) - -(setq gnus-split-methods - '((gnus-article-archive-name) - (my-save-name))) -@end lisp - - -@vindex gnus-use-long-file-name -Finally, you have the @code{gnus-use-long-file-name} variable. If it is -@code{nil}, all the preceding functions will replace all periods -(@samp{.}) in the group names with slashes (@samp{/})---which means that -the functions will generate hierarchies of directories instead of having -all the files in the top level directory -(@file{~/News/alt/andrea-dworkin} instead of -@file{~/News/alt.andrea-dworkin}.) This variable is @code{t} by default -on most systems. However, for historical reasons, this is @code{nil} on -Xenix and usg-unix-v machines by default. - -This function also affects kill and score file names. If this variable -is a list, and the list contains the element @code{not-score}, long file -names will not be used for score files, if it contains the element -@code{not-save}, long file names will not be used for saving, and if it -contains the element @code{not-kill}, long file names will not be used -for kill files. - -If you'd like to save articles in a hierarchy that looks something like -a spool, you could - -@lisp -(setq gnus-use-long-file-name '(not-save)) ; to get a hierarchy -(setq gnus-default-article-saver - 'gnus-summary-save-in-file) ; no encoding -@end lisp - -Then just save with @kbd{o}. You'd then read this hierarchy with -ephemeral @code{nneething} groups---@kbd{G D} in the group buffer, and -the top level directory as the argument (@file{~/News/}). Then just walk -around to the groups/directories with @code{nneething}. - - -@node Decoding Articles -@section Decoding Articles -@cindex decoding articles - -Sometime users post articles (or series of articles) that have been -encoded in some way or other. Gnus can decode them for you. - -@menu -* Uuencoded Articles:: Uudecode articles. -* Shell Archives:: Unshar articles. -* PostScript Files:: Split PostScript. -* Other Files:: Plain save and binhex. -* Decoding Variables:: Variables for a happy decoding. -* Viewing Files:: You want to look at the result of the decoding? -@end menu - -@cindex series -@cindex article series -All these functions use the process/prefix convention -(@pxref{Process/Prefix}) for finding out what articles to work on, with -the extension that a ``single article'' means ``a single series''. Gnus -can find out by itself what articles belong to a series, decode all the -articles and unpack/view/save the resulting file(s). - -Gnus guesses what articles are in the series according to the following -simplish rule: The subjects must be (nearly) identical, except for the -last two numbers of the line. (Spaces are largely ignored, however.) - -For example: If you choose a subject called @samp{cat.gif (2/3)}, gnus -will find all the articles that match the regexp @samp{^cat.gif -([0-9]+/[0-9]+).*$}. - -Subjects that are non-standard, like @samp{cat.gif (2/3) Part 6 of a -series}, will not be properly recognized by any of the automatic viewing -commands, and you have to mark the articles manually with @kbd{#}. - - -@node Uuencoded Articles -@subsection Uuencoded Articles -@cindex uudecode -@cindex uuencoded articles - -@table @kbd - -@item X u -@kindex X u (Summary) -@findex gnus-uu-decode-uu -@c @icon{gnus-uu-decode-uu} -Uudecodes the current series (@code{gnus-uu-decode-uu}). - -@item X U -@kindex X U (Summary) -@findex gnus-uu-decode-uu-and-save -Uudecodes and saves the current series -(@code{gnus-uu-decode-uu-and-save}). - -@item X v u -@kindex X v u (Summary) -@findex gnus-uu-decode-uu-view -Uudecodes and views the current series (@code{gnus-uu-decode-uu-view}). - -@item X v U -@kindex X v U (Summary) -@findex gnus-uu-decode-uu-and-save-view -Uudecodes, views and saves the current series -(@code{gnus-uu-decode-uu-and-save-view}). - -@end table - -Remember that these all react to the presence of articles marked with -the process mark. If, for instance, you'd like to decode and save an -entire newsgroup, you'd typically do @kbd{M P a} -(@code{gnus-uu-mark-all}) and then @kbd{X U} -(@code{gnus-uu-decode-uu-and-save}). - -All this is very much different from how @code{gnus-uu} worked with -@sc{gnus 4.1}, where you had explicit keystrokes for everything under -the sun. This version of @code{gnus-uu} generally assumes that you mark -articles in some way (@pxref{Setting Process Marks}) and then press -@kbd{X u}. - -@vindex gnus-uu-notify-files -Note: When trying to decode articles that have names matching -@code{gnus-uu-notify-files}, which is hard-coded to -@samp{[Cc][Ii][Nn][Dd][Yy][0-9]+.\\(gif\\|jpg\\)}, @code{gnus-uu} will -automatically post an article on @samp{comp.unix.wizards} saying that -you have just viewed the file in question. This feature can't be turned -off. - - -@node Shell Archives -@subsection Shell Archives -@cindex unshar -@cindex shell archives -@cindex shared articles - -Shell archives (``shar files'') used to be a popular way to distribute -sources, but it isn't used all that much today. In any case, we have -some commands to deal with these: - -@table @kbd - -@item X s -@kindex X s (Summary) -@findex gnus-uu-decode-unshar -Unshars the current series (@code{gnus-uu-decode-unshar}). - -@item X S -@kindex X S (Summary) -@findex gnus-uu-decode-unshar-and-save -Unshars and saves the current series (@code{gnus-uu-decode-unshar-and-save}). - -@item X v s -@kindex X v s (Summary) -@findex gnus-uu-decode-unshar-view -Unshars and views the current series (@code{gnus-uu-decode-unshar-view}). - -@item X v S -@kindex X v S (Summary) -@findex gnus-uu-decode-unshar-and-save-view -Unshars, views and saves the current series -(@code{gnus-uu-decode-unshar-and-save-view}). -@end table - - -@node PostScript Files -@subsection PostScript Files -@cindex PostScript - -@table @kbd - -@item X p -@kindex X p (Summary) -@findex gnus-uu-decode-postscript -Unpack the current PostScript series (@code{gnus-uu-decode-postscript}). - -@item X P -@kindex X P (Summary) -@findex gnus-uu-decode-postscript-and-save -Unpack and save the current PostScript series -(@code{gnus-uu-decode-postscript-and-save}). - -@item X v p -@kindex X v p (Summary) -@findex gnus-uu-decode-postscript-view -View the current PostScript series -(@code{gnus-uu-decode-postscript-view}). - -@item X v P -@kindex X v P (Summary) -@findex gnus-uu-decode-postscript-and-save-view -View and save the current PostScript series -(@code{gnus-uu-decode-postscript-and-save-view}). -@end table - - -@node Other Files -@subsection Other Files - -@table @kbd -@item X o -@kindex X o (Summary) -@findex gnus-uu-decode-save -Save the current series -(@code{gnus-uu-decode-save}). - -@item X b -@kindex X b (Summary) -@findex gnus-uu-decode-binhex -Unbinhex the current series (@code{gnus-uu-decode-binhex}). This -doesn't really work yet. -@end table - - -@node Decoding Variables -@subsection Decoding Variables - -Adjective, not verb. - -@menu -* Rule Variables:: Variables that say how a file is to be viewed. -* Other Decode Variables:: Other decode variables. -* Uuencoding and Posting:: Variables for customizing uuencoding. -@end menu - - -@node Rule Variables -@subsubsection Rule Variables -@cindex rule variables - -Gnus uses @dfn{rule variables} to decide how to view a file. All these -variables are of the form - -@lisp - (list '(regexp1 command2) - '(regexp2 command2) - ...) -@end lisp - -@table @code - -@item gnus-uu-user-view-rules -@vindex gnus-uu-user-view-rules -@cindex sox -This variable is consulted first when viewing files. If you wish to use, -for instance, @code{sox} to convert an @samp{.au} sound file, you could -say something like: -@lisp -(setq gnus-uu-user-view-rules - (list '("\\\\.au$" "sox %s -t .aiff > /dev/audio"))) -@end lisp - -@item gnus-uu-user-view-rules-end -@vindex gnus-uu-user-view-rules-end -This variable is consulted if gnus couldn't make any matches from the -user and default view rules. - -@item gnus-uu-user-archive-rules -@vindex gnus-uu-user-archive-rules -This variable can be used to say what commands should be used to unpack -archives. -@end table - - -@node Other Decode Variables -@subsubsection Other Decode Variables - -@table @code -@vindex gnus-uu-grabbed-file-functions - -@item gnus-uu-grabbed-file-functions -All functions in this list will be called right after each file has been -successfully decoded---so that you can move or view files right away, -and don't have to wait for all files to be decoded before you can do -anything. Ready-made functions you can put in this list are: - -@table @code - -@item gnus-uu-grab-view -@findex gnus-uu-grab-view -View the file. - -@item gnus-uu-grab-move -@findex gnus-uu-grab-move -Move the file (if you're using a saving function.) -@end table - -@item gnus-uu-be-dangerous -@vindex gnus-uu-be-dangerous -Specifies what to do if unusual situations arise during decoding. If -@code{nil}, be as conservative as possible. If @code{t}, ignore things -that didn't work, and overwrite existing files. Otherwise, ask each -time. - -@item gnus-uu-ignore-files-by-name -@vindex gnus-uu-ignore-files-by-name -Files with name matching this regular expression won't be viewed. - -@item gnus-uu-ignore-files-by-type -@vindex gnus-uu-ignore-files-by-type -Files with a @sc{mime} type matching this variable won't be viewed. -Note that Gnus tries to guess what type the file is based on the name. -@code{gnus-uu} is not a @sc{mime} package (yet), so this is slightly -kludgey. - -@item gnus-uu-tmp-dir -@vindex gnus-uu-tmp-dir -Where @code{gnus-uu} does its work. - -@item gnus-uu-do-not-unpack-archives -@vindex gnus-uu-do-not-unpack-archives -Non-@code{nil} means that @code{gnus-uu} won't peek inside archives -looking for files to display. - -@item gnus-uu-view-and-save -@vindex gnus-uu-view-and-save -Non-@code{nil} means that the user will always be asked to save a file -after viewing it. - -@item gnus-uu-ignore-default-view-rules -@vindex gnus-uu-ignore-default-view-rules -Non-@code{nil} means that @code{gnus-uu} will ignore the default viewing -rules. - -@item gnus-uu-ignore-default-archive-rules -@vindex gnus-uu-ignore-default-archive-rules -Non-@code{nil} means that @code{gnus-uu} will ignore the default archive -unpacking commands. - -@item gnus-uu-kill-carriage-return -@vindex gnus-uu-kill-carriage-return -Non-@code{nil} means that @code{gnus-uu} will strip all carriage returns -from articles. - -@item gnus-uu-unmark-articles-not-decoded -@vindex gnus-uu-unmark-articles-not-decoded -Non-@code{nil} means that @code{gnus-uu} will mark unsuccessfully -decoded articles as unread. - -@item gnus-uu-correct-stripped-uucode -@vindex gnus-uu-correct-stripped-uucode -Non-@code{nil} means that @code{gnus-uu} will @emph{try} to fix -uuencoded files that have had trailing spaces deleted. - -@item gnus-uu-pre-uudecode-hook -@vindex gnus-uu-pre-uudecode-hook -Hook run before sending a message to @code{uudecode}. - -@item gnus-uu-view-with-metamail -@vindex gnus-uu-view-with-metamail -@cindex metamail -Non-@code{nil} means that @code{gnus-uu} will ignore the viewing -commands defined by the rule variables and just fudge a @sc{mime} -content type based on the file name. The result will be fed to -@code{metamail} for viewing. - -@item gnus-uu-save-in-digest -@vindex gnus-uu-save-in-digest -Non-@code{nil} means that @code{gnus-uu}, when asked to save without -decoding, will save in digests. If this variable is @code{nil}, -@code{gnus-uu} will just save everything in a file without any -embellishments. The digesting almost conforms to RFC 1153---no easy way -to specify any meaningful volume and issue numbers were found, so I -simply dropped them. - -@end table - - -@node Uuencoding and Posting -@subsubsection Uuencoding and Posting - -@table @code - -@item gnus-uu-post-include-before-composing -@vindex gnus-uu-post-include-before-composing -Non-@code{nil} means that @code{gnus-uu} will ask for a file to encode -before you compose the article. If this variable is @code{t}, you can -either include an encoded file with @kbd{C-c C-i} or have one included -for you when you post the article. - -@item gnus-uu-post-length -@vindex gnus-uu-post-length -Maximum length of an article. The encoded file will be split into how -many articles it takes to post the entire file. - -@item gnus-uu-post-threaded -@vindex gnus-uu-post-threaded -Non-@code{nil} means that @code{gnus-uu} will post the encoded file in a -thread. This may not be smart, as no other decoder I have seen is able -to follow threads when collecting uuencoded articles. (Well, I have -seen one package that does that---@code{gnus-uu}, but somehow, I don't -think that counts...) Default is @code{nil}. - -@item gnus-uu-post-separate-description -@vindex gnus-uu-post-separate-description -Non-@code{nil} means that the description will be posted in a separate -article. The first article will typically be numbered (0/x). If this -variable is @code{nil}, the description the user enters will be included -at the beginning of the first article, which will be numbered (1/x). -Default is @code{t}. - -@end table - - -@node Viewing Files -@subsection Viewing Files -@cindex viewing files -@cindex pseudo-articles - -After decoding, if the file is some sort of archive, gnus will attempt -to unpack the archive and see if any of the files in the archive can be -viewed. For instance, if you have a gzipped tar file @file{pics.tar.gz} -containing the files @file{pic1.jpg} and @file{pic2.gif}, gnus will -uncompress and de-tar the main file, and then view the two pictures. -This unpacking process is recursive, so if the archive contains archives -of archives, it'll all be unpacked. - -Finally, gnus will normally insert a @dfn{pseudo-article} for each -extracted file into the summary buffer. If you go to these -``articles'', you will be prompted for a command to run (usually Gnus -will make a suggestion), and then the command will be run. - -@vindex gnus-view-pseudo-asynchronously -If @code{gnus-view-pseudo-asynchronously} is @code{nil}, Emacs will wait -until the viewing is done before proceeding. - -@vindex gnus-view-pseudos -If @code{gnus-view-pseudos} is @code{automatic}, Gnus will not insert -the pseudo-articles into the summary buffer, but view them -immediately. If this variable is @code{not-confirm}, the user won't even -be asked for a confirmation before viewing is done. - -@vindex gnus-view-pseudos-separately -If @code{gnus-view-pseudos-separately} is non-@code{nil}, one -pseudo-article will be created for each file to be viewed. If -@code{nil}, all files that use the same viewing command will be given as -a list of parameters to that command. - -@vindex gnus-insert-pseudo-articles -If @code{gnus-insert-pseudo-articles} is non-@code{nil}, insert -pseudo-articles when decoding. It is @code{t} by default. - -So; there you are, reading your @emph{pseudo-articles} in your -@emph{virtual newsgroup} from the @emph{virtual server}; and you think: -Why isn't anything real anymore? How did we get here? - - -@node Article Treatment -@section Article Treatment - -Reading through this huge manual, you may have quite forgotten that the -object of newsreaders is to actually, like, read what people have -written. Reading articles. Unfortunately, people are quite bad at -writing, so there are tons of functions and variables to make reading -these articles easier. - -@menu -* Article Highlighting:: You want to make the article look like fruit salad. -* Article Fontisizing:: Making emphasized text look nice. -* Article Hiding:: You also want to make certain info go away. -* Article Washing:: Lots of way-neat functions to make life better. -* Article Buttons:: Click on URLs, Message-IDs, addresses and the like. -* Article Date:: Grumble, UT! -* Article Signature:: What is a signature? -* Article Miscellania:: Various other stuff. -@end menu - - -@node Article Highlighting -@subsection Article Highlighting -@cindex highlighting - -Not only do you want your article buffer to look like fruit salad, but -you want it to look like technicolor fruit salad. - -@table @kbd - -@item W H a -@kindex W H a (Summary) -@findex gnus-article-highlight -@findex gnus-article-maybe-highlight -Do much highlighting of the current article -(@code{gnus-article-highlight}). This function highlights header, cited -text, the signature, and adds buttons to the body and the head. - -@item W H h -@kindex W H h (Summary) -@findex gnus-article-highlight-headers -@vindex gnus-header-face-alist -Highlight the headers (@code{gnus-article-highlight-headers}). The -highlighting will be done according to the @code{gnus-header-face-alist} -variable, which is a list where each element has the form -@code{(@var{regexp} @var{name} @var{content})}. -@var{regexp} is a regular expression for matching the -header, @var{name} is the face used for highlighting the header name -(@pxref{Faces and Fonts}) and @var{content} is the face for highlighting -the header value. The first match made will be used. Note that -@var{regexp} shouldn't have @samp{^} prepended---Gnus will add one. - -@item W H c -@kindex W H c (Summary) -@findex gnus-article-highlight-citation -Highlight cited text (@code{gnus-article-highlight-citation}). - -Some variables to customize the citation highlights: - -@table @code -@vindex gnus-cite-parse-max-size - -@item gnus-cite-parse-max-size -If the article size if bigger than this variable (which is 25000 by -default), no citation highlighting will be performed. - -@item gnus-cite-max-prefix -@vindex gnus-cite-max-prefix -Maximum possible length for a citation prefix (default 20). - -@item gnus-cite-face-list -@vindex gnus-cite-face-list -List of faces used for highlighting citations (@pxref{Faces and Fonts}). -When there are citations from multiple articles in the same message, -gnus will try to give each citation from each article its own face. -This should make it easier to see who wrote what. - -@item gnus-supercite-regexp -@vindex gnus-supercite-regexp -Regexp matching normal Supercite attribution lines. - -@item gnus-supercite-secondary-regexp -@vindex gnus-supercite-secondary-regexp -Regexp matching mangled Supercite attribution lines. - -@item gnus-cite-minimum-match-count -@vindex gnus-cite-minimum-match-count -Minimum number of identical prefixes we have to see before we believe -that it's a citation. - -@item gnus-cite-attribution-prefix -@vindex gnus-cite-attribution-prefix -Regexp matching the beginning of an attribution line. - -@item gnus-cite-attribution-suffix -@vindex gnus-cite-attribution-suffix -Regexp matching the end of an attribution line. - -@item gnus-cite-attribution-face -@vindex gnus-cite-attribution-face -Face used for attribution lines. It is merged with the face for the -cited text belonging to the attribution. - -@end table - - -@item W H s -@kindex W H s (Summary) -@vindex gnus-signature-separator -@vindex gnus-signature-face -@findex gnus-article-highlight-signature -Highlight the signature (@code{gnus-article-highlight-signature}). -Everything after @code{gnus-signature-separator} (@pxref{Article -Signature}) in an article will be considered a signature and will be -highlighted with @code{gnus-signature-face}, which is @code{italic} by -default. - -@end table - -@xref{Customizing Articles}, for how to highlight articles automatically. - - -@node Article Fontisizing -@subsection Article Fontisizing -@cindex emphasis -@cindex article emphasis - -@findex gnus-article-emphasize -@kindex W e (Summary) -People commonly add emphasis to words in news articles by writing things -like @samp{_this_} or @samp{*this*} or @samp{/this/}. Gnus can make -this look nicer by running the article through the @kbd{W e} -(@code{gnus-article-emphasize}) command. - -@vindex gnus-emphasis-alist -How the emphasis is computed is controlled by the -@code{gnus-emphasis-alist} variable. This is an alist where the first -element is a regular expression to be matched. The second is a number -that says what regular expression grouping is used to find the entire -emphasized word. The third is a number that says what regexp grouping -should be displayed and highlighted. (The text between these two -groupings will be hidden.) The fourth is the face used for -highlighting. - -@lisp -(setq gnus-emphasis-alist - '(("_\\(\\w+\\)_" 0 1 gnus-emphasis-underline) - ("\\*\\(\\w+\\)\\*" 0 1 gnus-emphasis-bold))) -@end lisp - -@cindex slash -@cindex asterisk -@cindex underline -@cindex / -@cindex * - -@vindex gnus-emphasis-underline -@vindex gnus-emphasis-bold -@vindex gnus-emphasis-italic -@vindex gnus-emphasis-underline-bold -@vindex gnus-emphasis-underline-italic -@vindex gnus-emphasis-bold-italic -@vindex gnus-emphasis-underline-bold-italic -By default, there are seven rules, and they use the following faces: -@code{gnus-emphasis-bold}, @code{gnus-emphasis-italic}, -@code{gnus-emphasis-underline}, @code{gnus-emphasis-bold-italic}, -@code{gnus-emphasis-underline-italic}, -@code{gnus-emphasis-underline-bold}, and -@code{gnus-emphasis-underline-bold-italic}. - -If you want to change these faces, you can either use @kbd{M-x -customize}, or you can use @code{copy-face}. For instance, if you want -to make @code{gnus-emphasis-italic} use a red face instead, you could -say something like: - -@lisp -(copy-face 'red 'gnus-emphasis-italic) -@end lisp - -@vindex gnus-group-highlight-words-alist - -If you want to highlight arbitrary words, you can use the -@code{gnus-group-highlight-words-alist} variable, which uses the same -syntax as @code{gnus-emphasis-alist}. The @code{highlight-words} group -parameter (@pxref{Group Parameters}) can also be used. - -@xref{Customizing Articles}, for how to fontize articles automatically. - - -@node Article Hiding -@subsection Article Hiding -@cindex article hiding - -Or rather, hiding certain things in each article. There usually is much -too much cruft in most articles. - -@table @kbd - -@item W W a -@kindex W W a (Summary) -@findex gnus-article-hide -Do quite a lot of hiding on the article buffer -(@kbd{gnus-article-hide}). In particular, this function will hide -headers, PGP, cited text and the signature. - -@item W W h -@kindex W W h (Summary) -@findex gnus-article-toggle-headers -Toggle hiding of headers (@code{gnus-article-toggle-headers}). @xref{Hiding -Headers}. - -@item W W b -@kindex W W b (Summary) -@findex gnus-article-hide-boring-headers -Hide headers that aren't particularly interesting -(@code{gnus-article-hide-boring-headers}). @xref{Hiding Headers}. - -@item W W s -@kindex W W s (Summary) -@findex gnus-article-hide-signature -Hide signature (@code{gnus-article-hide-signature}). @xref{Article -Signature}. - -@item W W l -@kindex W W l (Summary) -@findex gnus-article-hide-list-identifiers -@vindex gnus-list-identifiers -Strip list identifiers specified in @code{gnus-list-identifiers}. These -are strings some mailing list servers add to the beginning of all -@code{Subject} headers---for example, @samp{[zebra 4711]}. Any leading -@samp{Re: } is skipped before stripping. @code{gnus-list-identifiers} -may not contain @code{\\(..\\)}. - -@table @code - -@item gnus-list-identifiers -@vindex gnus-list-identifiers -A regular expression that matches list identifiers to be removed from -subject. This can also be a list of regular expressions. - -@end table - -@item W W p -@kindex W W p (Summary) -@findex gnus-article-hide-pgp -@vindex gnus-article-hide-pgp-hook -Hide @sc{pgp} signatures (@code{gnus-article-hide-pgp}). The -@code{gnus-article-hide-pgp-hook} hook will be run after a @sc{pgp} -signature has been hidden. For example, to automatically verify -articles that have signatures in them do: -@lisp -;;; Hide pgp cruft if any. - -(setq gnus-treat-strip-pgp t) - -;;; After hiding pgp, verify the message; -;;; only happens if pgp signature is found. - -(add-hook 'gnus-article-hide-pgp-hook - (lambda () - (save-excursion - (set-buffer gnus-original-article-buffer) - (mc-verify)))) -@end lisp - -@item W W P -@kindex W W P (Summary) -@findex gnus-article-hide-pem -Hide @sc{pem} (privacy enhanced messages) cruft -(@code{gnus-article-hide-pem}). - -@item W W B -@kindex W W B (Summary) -@findex gnus-article-strip-banner -@cindex banner -@cindex OneList -@cindex stripping advertisements -@cindex advertisements -Strip the banner specified by the @code{banner} group parameter -(@code{gnus-article-strip-banner}). This is mainly used to hide those -annoying banners and/or signatures that some mailing lists and moderated -groups adds to all the messages. The way to use this function is to add -the @code{banner} group parameter (@pxref{Group Parameters}) to the -group you want banners stripped from. The parameter either be a string, -which will be interpreted as a regular expression matching text to be -removed, or the symbol @code{signature}, meaning that the (last) -signature should be removed, or other symbol, meaning that the -corresponding regular expression in @code{gnus-article-banner-alist} is -used. - -@item W W c -@kindex W W c (Summary) -@findex gnus-article-hide-citation -Hide citation (@code{gnus-article-hide-citation}). Some variables for -customizing the hiding: - -@table @code - -@item gnus-cited-opened-text-button-line-format -@itemx gnus-cited-closed-text-button-line-format -@vindex gnus-cited-closed-text-button-line-format -@vindex gnus-cited-opened-text-button-line-format -Gnus adds buttons to show where the cited text has been hidden, and to -allow toggle hiding the text. The format of the variable is specified -by these format-like variable (@pxref{Formatting Variables}). These -specs are valid: - -@table @samp -@item b -Starting point of the hidden text. -@item e -Ending point of the hidden text. -@item l -Number of characters in the hidden region. -@item n -Number of lines of hidden text. -@end table - -@item gnus-cited-lines-visible -@vindex gnus-cited-lines-visible -The number of lines at the beginning of the cited text to leave -shown. This can also be a cons cell with the number of lines at the top -and bottom of the text, respectively, to remain visible. - -@end table - -@item W W C-c -@kindex W W C-c (Summary) -@findex gnus-article-hide-citation-maybe - -Hide citation (@code{gnus-article-hide-citation-maybe}) depending on the -following two variables: - -@table @code -@item gnus-cite-hide-percentage -@vindex gnus-cite-hide-percentage -If the cited text is of a bigger percentage than this variable (default -50), hide the cited text. - -@item gnus-cite-hide-absolute -@vindex gnus-cite-hide-absolute -The cited text must have at least this length (default 10) before it -is hidden. -@end table - -@item W W C -@kindex W W C (Summary) -@findex gnus-article-hide-citation-in-followups -Hide cited text in articles that aren't roots -(@code{gnus-article-hide-citation-in-followups}). This isn't very -useful as an interactive command, but might be a handy function to stick -have happen automatically (@pxref{Customizing Articles}). - -@end table - -All these ``hiding'' commands are toggles, but if you give a negative -prefix to these commands, they will show what they have previously -hidden. If you give a positive prefix, they will always hide. - -Also @pxref{Article Highlighting} for further variables for -citation customization. - -@xref{Customizing Articles}, for how to hide article elements -automatically. - - -@node Article Washing -@subsection Article Washing -@cindex washing -@cindex article washing - -We call this ``article washing'' for a really good reason. Namely, the -@kbd{A} key was taken, so we had to use the @kbd{W} key instead. - -@dfn{Washing} is defined by us as ``changing something from something to -something else'', but normally results in something looking better. -Cleaner, perhaps. - -@xref{Customizing Articles}, if you want to change how Gnus displays -articles by default. - -@table @kbd - -@item C-u g -This is not really washing, it's sort of the opposite of washing. If -you type this, you see the article exactly as it exists on disk or on -the server. - -@item W l -@kindex W l (Summary) -@findex gnus-summary-stop-page-breaking -Remove page breaks from the current article -(@code{gnus-summary-stop-page-breaking}). @xref{Misc Article}, for page -delimiters. - -@item W r -@kindex W r (Summary) -@findex gnus-summary-caesar-message -@c @icon{gnus-summary-caesar-message} -Do a Caesar rotate (rot13) on the article buffer -(@code{gnus-summary-caesar-message}). -Unreadable articles that tell you to read them with Caesar rotate or rot13. -(Typically offensive jokes and such.) - -It's commonly called ``rot13'' because each letter is rotated 13 -positions in the alphabet, e. g. @samp{B} (letter #2) -> @samp{O} (letter -#15). It is sometimes referred to as ``Caesar rotate'' because Caesar -is rumored to have employed this form of, uh, somewhat weak encryption. - -@item W t -@item t -@kindex W t (Summary) -@kindex t (Summary) -@findex gnus-article-toggle-headers -Toggle whether to display all headers in the article buffer -(@code{gnus-article-toggle-headers}). - -@item W v -@kindex W v (Summary) -@findex gnus-summary-verbose-header -Toggle whether to display all headers in the article buffer permanently -(@code{gnus-summary-verbose-header}). - -@item W m -@kindex W m (Summary) -@findex gnus-summary-toggle-mime -Toggle whether to run the article through @sc{mime} before displaying -(@code{gnus-summary-toggle-mime}). - -@item W o -@kindex W o (Summary) -@findex gnus-article-treat-overstrike -Treat overstrike (@code{gnus-article-treat-overstrike}). - -@item W d -@kindex W d (Summary) -@findex gnus-article-treat-dumbquotes -@vindex gnus-article-dumbquotes-map -@cindex Smartquotes -@cindex M****s*** sm*rtq**t*s -@cindex Latin 1 -Treat M****s*** sm*rtq**t*s according to -@code{gnus-article-dumbquotes-map} -(@code{gnus-article-treat-dumbquotes}). Note that this function guesses -whether a character is a sm*rtq**t* or not, so it should only be used -interactively. - -Sm*rtq**t*s are M****s***'s unilateral extension to the character map in -an attempt to provide more quoting characters. If you see something -like @code{\222} or @code{\264} where you're expecting some kind of -apostrophe or quotation mark, then try this wash. - -@item W w -@kindex W w (Summary) -@findex gnus-article-fill-cited-article -Do word wrap (@code{gnus-article-fill-cited-article}). - -You can give the command a numerical prefix to specify the width to use -when filling. - -@item W Q -@kindex W Q (Summary) -@findex gnus-article-fill-long-lines -Fill long lines (@code{gnus-article-fill-long-lines}). - -@item W C -@kindex W C (Summary) -@findex gnus-article-capitalize-sentences -Capitalize the first word in each sentence -(@code{gnus-article-capitalize-sentences}). - -@item W c -@kindex W c (Summary) -@findex gnus-article-remove-cr -Translate CRLF pairs (i. e., @samp{^M}s on the end of the lines) into LF -(this takes care of DOS line endings), and then translate any remaining -CRs into LF (this takes care of Mac line endings) -(@code{gnus-article-remove-cr}). - -@item W 6 -@kindex W 6 (Summary) -@findex gnus-article-de-base64-unreadable -Treat base64 (@code{gnus-article-de-base64-unreadable}). -Base64 is one common @sc{mime} encoding employed when sending non-ASCII -(i. e., 8-bit) articles. Note that the this is usually done -automatically by Gnus if the message in question has a -@code{Content-Transfer-Encoding} header that says that this encoding has -been done. -If a prefix is given, a charset will be asked for. - -@item W Z -@kindex W Z (Summary) -@findex gnus-article-decode-HZ -Treat HZ or HZP (@code{gnus-article-decode-HZ}). HZ (or HZP) is one -common encoding employed when sending Chinese articles. It typically -makes strings look like @samp{~@{<:Ky2;S@{#,NpJ)l6HK!#~@}}. - -@item W h -@kindex W h (Summary) -@findex gnus-article-wash-html -Treat HTML (@code{gnus-article-wash-html}). -Note that the this is usually done automatically by Gnus if the message -in question has a @code{Content-Type} header that says that this type -has been done. -If a prefix is given, a charset will be asked for. - -@item W f -@kindex W f (Summary) -@cindex x-face -@findex gnus-article-display-x-face -@findex gnus-article-x-face-command -@vindex gnus-article-x-face-command -@vindex gnus-article-x-face-too-ugly -@iftex -@iflatex -\include{xface} -@end iflatex -@end iftex -@c @anchor{X-Face} -Look for and display any X-Face headers -(@code{gnus-article-display-x-face}). The command executed by this -function is given by the @code{gnus-article-x-face-command} variable. -If this variable is a string, this string will be executed in a -sub-shell. If it is a function, this function will be called with the -face as the argument. If the @code{gnus-article-x-face-too-ugly} (which -is a regexp) matches the @code{From} header, the face will not be shown. -The default action under Emacs is to fork off the @code{display} -program@footnote{@code{display} is from the ImageMagick package. For the -@code{uncompface} and @code{icontopbm} programs look for a package -like `compface' or `faces-xface' on a GNU/Linux system.} -to view the face. Under XEmacs or Emacs 21+ with suitable image -support, the default action is to display the face before the -@code{From} header. (It's nicer if XEmacs has been compiled with X-Face -support---that will make display somewhat faster. If there's no native -X-Face support, Gnus will try to convert the @code{X-Face} header using -external programs from the @code{pbmplus} package and -friends.@footnote{On a GNU/Linux system look for packages with names -like @code{netpbm} or @code{libgr-progs}.}) If you -want to have this function in the display hook, it should probably come -last. - -@item W b -@kindex W b (Summary) -@findex gnus-article-add-buttons -Add clickable buttons to the article (@code{gnus-article-add-buttons}). -@xref{Article Buttons}. - -@item W B -@kindex W B (Summary) -@findex gnus-article-add-buttons-to-head -Add clickable buttons to the article headers -(@code{gnus-article-add-buttons-to-head}). - -@item W p -@kindex W p (Summary) -@findex gnus-article-verify-x-pgp-sig -Verify a signed control message (@code{gnus-article-verify-x-pgp-sig}). -Control messages such as @code{newgroup} and @code{checkgroups} are -usually signed by the hierarchy maintainer. You need to add the PGP -public key of the maintainer to your keyring to verify the -message.@footnote{PGP keys for many hierarchies are available at -@uref{ftp://ftp.isc.org/pub/pgpcontrol/README.html}} - -@item W W H -@kindex W W H (Summary) -@findex gnus-article-strip-headers-from-body -Strip headers like the @code{X-No-Archive} header from the beginning of -article bodies (@code{gnus-article-strip-headers-from-body}). - -@item W E l -@kindex W E l (Summary) -@findex gnus-article-strip-leading-blank-lines -Remove all blank lines from the beginning of the article -(@code{gnus-article-strip-leading-blank-lines}). - -@item W E m -@kindex W E m (Summary) -@findex gnus-article-strip-multiple-blank-lines -Replace all blank lines with empty lines and then all multiple empty -lines with a single empty line. -(@code{gnus-article-strip-multiple-blank-lines}). - -@item W E t -@kindex W E t (Summary) -@findex gnus-article-remove-trailing-blank-lines -Remove all blank lines at the end of the article -(@code{gnus-article-remove-trailing-blank-lines}). - -@item W E a -@kindex W E a (Summary) -@findex gnus-article-strip-blank-lines -Do all the three commands above -(@code{gnus-article-strip-blank-lines}). - -@item W E A -@kindex W E A (Summary) -@findex gnus-article-strip-all-blank-lines -Remove all blank lines -(@code{gnus-article-strip-all-blank-lines}). - -@item W E s -@kindex W E s (Summary) -@findex gnus-article-strip-leading-space -Remove all white space from the beginning of all lines of the article -body (@code{gnus-article-strip-leading-space}). - -@item W E e -@kindex W E e (Summary) -@findex gnus-article-strip-trailing-space -Remove all white space from the end of all lines of the article -body (@code{gnus-article-strip-trailing-space}). - -@end table - -@xref{Customizing Articles}, for how to wash articles automatically. - - -@node Article Buttons -@subsection Article Buttons -@cindex buttons - -People often include references to other stuff in articles, and it would -be nice if Gnus could just fetch whatever it is that people talk about -with the minimum of fuzz when you hit @kbd{RET} or use the middle mouse -button on these references. - -Gnus adds @dfn{buttons} to certain standard references by default: -Well-formed URLs, mail addresses and Message-IDs. This is controlled by -two variables, one that handles article bodies and one that handles -article heads: - -@table @code - -@item gnus-button-alist -@vindex gnus-button-alist -This is an alist where each entry has this form: - -@lisp -(REGEXP BUTTON-PAR USE-P FUNCTION DATA-PAR) -@end lisp - -@table @var - -@item regexp -All text that match this regular expression will be considered an -external reference. Here's a typical regexp that matches embedded URLs: -@samp{]*\\)>}. - -@item button-par -Gnus has to know which parts of the matches is to be highlighted. This -is a number that says what sub-expression of the regexp is to be -highlighted. If you want it all highlighted, you use 0 here. - -@item use-p -This form will be @code{eval}ed, and if the result is non-@code{nil}, -this is considered a match. This is useful if you want extra sifting to -avoid false matches. - -@item function -This function will be called when you click on this button. - -@item data-par -As with @var{button-par}, this is a sub-expression number, but this one -says which part of the match is to be sent as data to @var{function}. - -@end table - -So the full entry for buttonizing URLs is then - -@lisp -("]*\\)>" 0 t gnus-button-url 1) -@end lisp - -@item gnus-header-button-alist -@vindex gnus-header-button-alist -This is just like the other alist, except that it is applied to the -article head only, and that each entry has an additional element that is -used to say what headers to apply the buttonize coding to: - -@lisp -(HEADER REGEXP BUTTON-PAR USE-P FUNCTION DATA-PAR) -@end lisp - -@var{header} is a regular expression. - -@item gnus-button-url-regexp -@vindex gnus-button-url-regexp -A regular expression that matches embedded URLs. It is used in the -default values of the variables above. - -@item gnus-article-button-face -@vindex gnus-article-button-face -Face used on buttons. - -@item gnus-article-mouse-face -@vindex gnus-article-mouse-face -Face used when the mouse cursor is over a button. - -@end table - -@xref{Customizing Articles}, for how to buttonize articles automatically. - - -@node Article Date -@subsection Article Date - -The date is most likely generated in some obscure timezone you've never -heard of, so it's quite nice to be able to find out what the time was -when the article was sent. - -@table @kbd - -@item W T u -@kindex W T u (Summary) -@findex gnus-article-date-ut -Display the date in UT (aka. GMT, aka ZULU) -(@code{gnus-article-date-ut}). - -@item W T i -@kindex W T i (Summary) -@findex gnus-article-date-iso8601 -@cindex ISO 8601 -Display the date in international format, aka. ISO 8601 -(@code{gnus-article-date-iso8601}). - -@item W T l -@kindex W T l (Summary) -@findex gnus-article-date-local -Display the date in the local timezone (@code{gnus-article-date-local}). - -@item W T p -@kindex W T p (Summary) -@findex gnus-article-date-english -Display the date in a format that's easily pronounceable in English -(@code{gnus-article-date-english}). - -@item W T s -@kindex W T s (Summary) -@vindex gnus-article-time-format -@findex gnus-article-date-user -@findex format-time-string -Display the date using a user-defined format -(@code{gnus-article-date-user}). The format is specified by the -@code{gnus-article-time-format} variable, and is a string that's passed -to @code{format-time-string}. See the documentation of that variable -for a list of possible format specs. - -@item W T e -@kindex W T e (Summary) -@findex gnus-article-date-lapsed -@findex gnus-start-date-timer -@findex gnus-stop-date-timer -Say how much time has elapsed between the article was posted and now -(@code{gnus-article-date-lapsed}). It looks something like: - -@example -X-Sent: 6 weeks, 4 days, 1 hour, 3 minutes, 8 seconds ago -@end example - -The value of @code{gnus-article-date-lapsed-new-header} determines -whether this header will just be added below the old Date one, or will -replace it. - -An advantage of using Gnus to read mail is that it converts simple bugs -into wonderful absurdities. - -If you want to have this line updated continually, you can put - -@lisp -(gnus-start-date-timer) -@end lisp - -in your @file{.gnus.el} file, or you can run it off of some hook. If -you want to stop the timer, you can use the @code{gnus-stop-date-timer} -command. - -@item W T o -@kindex W T o (Summary) -@findex gnus-article-date-original -Display the original date (@code{gnus-article-date-original}). This can -be useful if you normally use some other conversion function and are -worried that it might be doing something totally wrong. Say, claiming -that the article was posted in 1854. Although something like that is -@emph{totally} impossible. Don't you trust me? *titter* - -@end table - -@xref{Customizing Articles}, for how to display the date in your -preferred format automatically. - - -@node Article Signature -@subsection Article Signature -@cindex signatures -@cindex article signature - -@vindex gnus-signature-separator -Each article is divided into two parts---the head and the body. The -body can be divided into a signature part and a text part. The variable -that says what is to be considered a signature is -@code{gnus-signature-separator}. This is normally the standard -@samp{^-- $} as mandated by son-of-RFC 1036. However, many people use -non-standard signature separators, so this variable can also be a list -of regular expressions to be tested, one by one. (Searches are done -from the end of the body towards the beginning.) One likely value is: - -@lisp -(setq gnus-signature-separator - '("^-- $" ; The standard - "^-- *$" ; A common mangling - "^-------*$" ; Many people just use a looong - ; line of dashes. Shame! - "^ *--------*$" ; Double-shame! - "^________*$" ; Underscores are also popular - "^========*$")) ; Pervert! -@end lisp - -The more permissive you are, the more likely it is that you'll get false -positives. - -@vindex gnus-signature-limit -@code{gnus-signature-limit} provides a limit to what is considered a -signature when displaying articles. - -@enumerate -@item -If it is an integer, no signature may be longer (in characters) than -that integer. -@item -If it is a floating point number, no signature may be longer (in lines) -than that number. -@item -If it is a function, the function will be called without any parameters, -and if it returns @code{nil}, there is no signature in the buffer. -@item -If it is a string, it will be used as a regexp. If it matches, the text -in question is not a signature. -@end enumerate - -This variable can also be a list where the elements may be of the types -listed above. Here's an example: - -@lisp -(setq gnus-signature-limit - '(200.0 "^---*Forwarded article")) -@end lisp - -This means that if there are more than 200 lines after the signature -separator, or the text after the signature separator is matched by -the regular expression @samp{^---*Forwarded article}, then it isn't a -signature after all. - - -@node Article Miscellania -@subsection Article Miscellania - -@table @kbd -@item A t -@kindex A t (Summary) -@findex gnus-article-babel -Translate the article from one language to another -(@code{gnus-article-babel}). - -@end table - - -@node MIME Commands -@section @sc{mime} Commands -@cindex MIME decoding -@cindex attachments -@cindex viewing attachments - -The following commands all understand the numerical prefix. For -instance, @kbd{3 b} means ``view the third @sc{mime} part''. - -@table @kbd -@item b -@itemx K v -@kindex b (Summary) -@kindex K v (Summary) -View the @sc{mime} part. - -@item K o -@kindex K o (Summary) -Save the @sc{mime} part. - -@item K c -@kindex K c (Summary) -Copy the @sc{mime} part. - -@item K e -@kindex K e (Summary) -View the @sc{mime} part externally. - -@item K i -@kindex K i (Summary) -View the @sc{mime} part internally. - -@item K | -@kindex K | (Summary) -Pipe the @sc{mime} part to an external command. -@end table - -The rest of these @sc{mime} commands do not use the numerical prefix in -the same manner: - -@table @kbd -@item K b -@kindex K b (Summary) -Make all the @sc{mime} parts have buttons in front of them. This is -mostly useful if you wish to save (or perform other actions) on inlined -parts. - -@item K m -@kindex K m (Summary) -@findex gnus-summary-repair-multipart -Some multipart messages are transmitted with missing or faulty headers. -This command will attempt to ``repair'' these messages so that they can -be viewed in a more pleasant manner -(@code{gnus-summary-repair-multipart}). - -@item X m -@kindex X m (Summary) -@findex gnus-summary-save-parts -Save all parts matching a @sc{mime} type to a directory -(@code{gnus-summary-save-parts}). Understands the process/prefix -convention (@pxref{Process/Prefix}). - -@item M-t -@kindex M-t (Summary) -@findex gnus-summary-display-buttonized -Toggle the buttonized display of the article buffer -(@code{gnus-summary-toggle-display-buttonized}). - -@item W M w -@kindex W M w (Summary) -Decode RFC 2047-encoded words in the article headers -(@code{gnus-article-decode-mime-words}). - -@item W M c -@kindex W M c (Summary) -Decode encoded article bodies as well as charsets -(@code{gnus-article-decode-charset}). - -This command looks in the @code{Content-Type} header to determine the -charset. If there is no such header in the article, you can give it a -prefix, which will prompt for the charset to decode as. In regional -groups where people post using some common encoding (but do not include -MIME headers), you can set the @code{charset} group/topic parameter to -the required charset (@pxref{Group Parameters}). - -@item W M v -@kindex W M v (Summary) -View all the @sc{mime} parts in the current article -(@code{gnus-mime-view-all-parts}). - -@end table - -Relevant variables: - -@table @code -@item gnus-ignored-mime-types -@vindex gnus-ignored-mime-types -This is a list of regexps. @sc{mime} types that match a regexp from -this list will be completely ignored by Gnus. The default value is -@code{nil}. - -To have all Vcards be ignored, you'd say something like this: - -@lisp -(setq gnus-ignored-mime-types - '("text/x-vcard")) -@end lisp - -@item gnus-unbuttonized-mime-types -@vindex gnus-unbuttonized-mime-types -This is a list of regexps. @sc{mime} types that match a regexp from -this list won't have @sc{mime} buttons inserted unless they aren't -displayed. The default value is @code{(".*/.*")}. - -@item gnus-article-mime-part-function -@vindex gnus-article-mime-part-function -For each @sc{mime} part, this function will be called with the @sc{mime} -handle as the parameter. The function is meant to be used to allow -users to gather information from the article (e. g., add Vcard info to -the bbdb database) or to do actions based on parts (e. g., automatically -save all jpegs into some directory). - -Here's an example function the does the latter: - -@lisp -(defun my-save-all-jpeg-parts (handle) - (when (equal (car (mm-handle-type handle)) "image/jpeg") - (with-temp-buffer - (insert (mm-get-part handle)) - (write-region (point-min) (point-max) - (read-file-name "Save jpeg to: "))))) -(setq gnus-article-mime-part-function - 'my-save-all-jpeg-parts) -@end lisp - -@vindex gnus-mime-multipart-functions -@item gnus-mime-multipart-functions -Alist of @sc{mime} multipart types and functions to handle them. - -@vindex mm-file-name-rewrite-functions -@item mm-file-name-rewrite-functions -List of functions used for rewriting file names of @sc{mime} parts. -Each function takes a file name as input and returns a file name. - -Ready-made functions include@* -@code{mm-file-name-delete-whitespace}, -@code{mm-file-name-trim-whitespace}, -@code{mm-file-name-collapse-whitespace}, and -@code{mm-file-name-replace-whitespace}. The later uses the value of -the variable @code{mm-file-name-replace-whitespace} to replace each -whitespace character in a file name with that string; default value -is @code{"_"} (a single underscore). -@findex mm-file-name-delete-whitespace -@findex mm-file-name-trim-whitespace -@findex mm-file-name-collapse-whitespace -@findex mm-file-name-replace-whitespace -@vindex mm-file-name-replace-whitespace - -The standard functions @code{capitalize}, @code{downcase}, -@code{upcase}, and @code{upcase-initials} may be useful, too. - -Everybody knows that whitespace characters in file names are evil, -except those who don't know. If you receive lots of attachments from -such unenlightened users, you can make live easier by adding - -@lisp -(setq mm-file-name-rewrite-functions - '(mm-file-name-trim-whitespace - mm-file-name-collapse-whitespace - mm-file-name-replace-whitespace)) -@end lisp - -@noindent -to your @file{.gnus} file. - -@end table - - -@node Charsets -@section Charsets -@cindex charsets - -People use different charsets, and we have @sc{mime} to let us know what -charsets they use. Or rather, we wish we had. Many people use -newsreaders and mailers that do not understand or use @sc{mime}, and -just send out messages without saying what character sets they use. To -help a bit with this, some local news hierarchies have policies that say -what character set is the default. For instance, the @samp{fj} -hierarchy uses @code{iso-2022-jp-2}. - -@vindex gnus-group-charset-alist -This knowledge is encoded in the @code{gnus-group-charset-alist} -variable, which is an alist of regexps (use the first item to match full -group names) and default charsets to be used when reading these groups. - -In addition, some people do use soi-disant @sc{mime}-aware agents that -aren't. These blithely mark messages as being in @code{iso-8859-1} even -if they really are in @code{koi-8}. To help here, the -@code{gnus-newsgroup-ignored-charsets} variable can be used. The -charsets that are listed here will be ignored. The variable can be set -on a group-by-group basis using the group parameters (@pxref{Group -Parameters}). The default value is @code{(unknown-8bit)}, which is -something some agents insist on having in there. - -@vindex gnus-group-posting-charset-alist -When posting, @code{gnus-group-posting-charset-alist} is used to -determine which charsets should not be encoded using the @sc{mime} -encodings. For instance, some hierarchies discourage using -quoted-printable header encoding. - -This variable is an alist of regexps and permitted unencoded charsets -for posting. Each element of the alist has the form @code{(}@var{test -header body-list}@code{)}, where: - -@table @var -@item test -is either a regular expression matching the newsgroup header or a -variable to query, -@item header -is the charset which may be left unencoded in the header (@code{nil} -means encode all charsets), -@item body-list -is a list of charsets which may be encoded using 8bit content-transfer -encoding in the body, or one of the special values @code{nil} (always -encode using quoted-printable) or @code{t} (always use 8bit). -@end table - -@cindex Russian -@cindex koi8-r -@cindex koi8-u -@cindex iso-8859-5 -@cindex coding system aliases -@cindex preferred charset - -Other charset tricks that may be useful, although not Gnus-specific: - -If there are several @sc{mime} charsets that encode the same Emacs -charset, you can choose what charset to use by saying the following: - -@lisp -(put-charset-property 'cyrillic-iso8859-5 - 'preferred-coding-system 'koi8-r) -@end lisp - -This means that Russian will be encoded using @code{koi8-r} instead of -the default @code{iso-8859-5} @sc{mime} charset. - -If you want to read messages in @code{koi8-u}, you can cheat and say - -@lisp -(define-coding-system-alias 'koi8-u 'koi8-r) -@end lisp - -This will almost do the right thing. - -And finally, to read charsets like @code{windows-1251}, you can say -something like - -@lisp -(codepage-setup 1251) -(define-coding-system-alias 'windows-1251 'cp1251) -@end lisp - - -@node Article Commands -@section Article Commands - -@table @kbd - -@item A P -@cindex PostScript -@cindex printing -@kindex A P (Summary) -@vindex gnus-ps-print-hook -@findex gnus-summary-print-article -Generate and print a PostScript image of the article buffer -(@code{gnus-summary-print-article}). @code{gnus-ps-print-hook} will be -run just before printing the buffer. - -@end table - - -@node Summary Sorting -@section Summary Sorting -@cindex summary sorting - -You can have the summary buffer sorted in various ways, even though I -can't really see why you'd want that. - -@table @kbd - -@item C-c C-s C-n -@kindex C-c C-s C-n (Summary) -@findex gnus-summary-sort-by-number -Sort by article number (@code{gnus-summary-sort-by-number}). - -@item C-c C-s C-a -@kindex C-c C-s C-a (Summary) -@findex gnus-summary-sort-by-author -Sort by author (@code{gnus-summary-sort-by-author}). - -@item C-c C-s C-s -@kindex C-c C-s C-s (Summary) -@findex gnus-summary-sort-by-subject -Sort by subject (@code{gnus-summary-sort-by-subject}). - -@item C-c C-s C-d -@kindex C-c C-s C-d (Summary) -@findex gnus-summary-sort-by-date -Sort by date (@code{gnus-summary-sort-by-date}). - -@item C-c C-s C-l -@kindex C-c C-s C-l (Summary) -@findex gnus-summary-sort-by-lines -Sort by lines (@code{gnus-summary-sort-by-lines}). - -@item C-c C-s C-c -@kindex C-c C-s C-c (Summary) -@findex gnus-summary-sort-by-chars -Sort by article length (@code{gnus-summary-sort-by-chars}). - -@item C-c C-s C-i -@kindex C-c C-s C-i (Summary) -@findex gnus-summary-sort-by-score -Sort by score (@code{gnus-summary-sort-by-score}). - -@item C-c C-s C-o -@kindex C-c C-s C-o (Summary) -@findex gnus-summary-sort-by-original -Sort using the default sorting method -(@code{gnus-summary-sort-by-original}). -@end table - -These functions will work both when you use threading and when you don't -use threading. In the latter case, all summary lines will be sorted, -line by line. In the former case, sorting will be done on a -root-by-root basis, which might not be what you were looking for. To -toggle whether to use threading, type @kbd{T T} (@pxref{Thread -Commands}). - - -@node Finding the Parent -@section Finding the Parent -@cindex parent articles -@cindex referring articles - -@table @kbd -@item ^ -@kindex ^ (Summary) -@findex gnus-summary-refer-parent-article -If you'd like to read the parent of the current article, and it is not -displayed in the summary buffer, you might still be able to. That is, -if the current group is fetched by @sc{nntp}, the parent hasn't expired -and the @code{References} in the current article are not mangled, you -can just press @kbd{^} or @kbd{A r} -(@code{gnus-summary-refer-parent-article}). If everything goes well, -you'll get the parent. If the parent is already displayed in the -summary buffer, point will just move to this article. - -If given a positive numerical prefix, fetch that many articles back into -the ancestry. If given a negative numerical prefix, fetch just that -ancestor. So if you say @kbd{3 ^}, gnus will fetch the parent, the -grandparent and the grandgrandparent of the current article. If you say -@kbd{-3 ^}, gnus will only fetch the grandgrandparent of the current -article. - -@item A R (Summary) -@findex gnus-summary-refer-references -@kindex A R (Summary) -Fetch all articles mentioned in the @code{References} header of the -article (@code{gnus-summary-refer-references}). - -@item A T (Summary) -@findex gnus-summary-refer-thread -@kindex A T (Summary) -Display the full thread where the current article appears -(@code{gnus-summary-refer-thread}). This command has to fetch all the -headers in the current group to work, so it usually takes a while. If -you do it often, you may consider setting @code{gnus-fetch-old-headers} -to @code{invisible} (@pxref{Filling In Threads}). This won't have any -visible effects normally, but it'll make this command work a whole lot -faster. Of course, it'll make group entry somewhat slow. - -@vindex gnus-refer-thread-limit -The @code{gnus-refer-thread-limit} variable says how many old (i. e., -articles before the first displayed in the current group) headers to -fetch when doing this command. The default is 200. If @code{t}, all -the available headers will be fetched. This variable can be overridden -by giving the @kbd{A T} command a numerical prefix. - -@item M-^ (Summary) -@findex gnus-summary-refer-article -@kindex M-^ (Summary) -@cindex Message-ID -@cindex fetching by Message-ID -You can also ask the @sc{nntp} server for an arbitrary article, no -matter what group it belongs to. @kbd{M-^} -(@code{gnus-summary-refer-article}) will ask you for a -@code{Message-ID}, which is one of those long, hard-to-read thingies -that look something like @samp{<38o6up$6f2@@hymir.ifi.uio.no>}. You -have to get it all exactly right. No fuzzy searches, I'm afraid. -@end table - -The current select method will be used when fetching by -@code{Message-ID} from non-news select method, but you can override this -by giving this command a prefix. - -@vindex gnus-refer-article-method -If the group you are reading is located on a backend that does not -support fetching by @code{Message-ID} very well (like @code{nnspool}), -you can set @code{gnus-refer-article-method} to an @sc{nntp} method. It -would, perhaps, be best if the @sc{nntp} server you consult is the one -updating the spool you are reading from, but that's not really -necessary. - -It can also be a list of select methods, as well as the special symbol -@code{current}, which means to use the current select method. If it -is a list, Gnus will try all the methods in the list until it finds a -match. - -Here's an example setting that will first try the current method, and -then ask Deja if that fails: - -@lisp -(setq gnus-refer-article-method - '(current - (nnweb "refer" (nnweb-type dejanews)))) -@end lisp - -Most of the mail backends support fetching by @code{Message-ID}, but do -not do a particularly excellent job at it. That is, @code{nnmbox} and -@code{nnbabyl} are able to locate articles from any groups, while -@code{nnml} and @code{nnfolder} are only able to locate articles that -have been posted to the current group. (Anything else would be too time -consuming.) @code{nnmh} does not support this at all. - - -@node Alternative Approaches -@section Alternative Approaches - -Different people like to read news using different methods. This being -gnus, we offer a small selection of minor modes for the summary buffers. - -@menu -* Pick and Read:: First mark articles and then read them. -* Binary Groups:: Auto-decode all articles. -@end menu - - -@node Pick and Read -@subsection Pick and Read -@cindex pick and read - -Some newsreaders (like @code{nn} and, uhm, @code{Netnews} on VM/CMS) use -a two-phased reading interface. The user first marks in a summary -buffer the articles she wants to read. Then she starts reading the -articles with just an article buffer displayed. - -@findex gnus-pick-mode -@kindex M-x gnus-pick-mode -Gnus provides a summary buffer minor mode that allows -this---@code{gnus-pick-mode}. This basically means that a few process -mark commands become one-keystroke commands to allow easy marking, and -it provides one additional command for switching to the summary buffer. - -Here are the available keystrokes when using pick mode: - -@table @kbd -@item . -@kindex . (Pick) -@findex gnus-pick-article-or-thread -Pick the article or thread on the current line -(@code{gnus-pick-article-or-thread}). If the variable -@code{gnus-thread-hide-subtree} is true, then this key selects the -entire thread when used at the first article of the thread. Otherwise, -it selects just the article. If given a numerical prefix, go to that -thread or article and pick it. (The line number is normally displayed -at the beginning of the summary pick lines.) - -@item SPACE -@kindex SPACE (Pick) -@findex gnus-pick-next-page -Scroll the summary buffer up one page (@code{gnus-pick-next-page}). If -at the end of the buffer, start reading the picked articles. - -@item u -@kindex u (Pick) -@findex gnus-pick-unmark-article-or-thread. -Unpick the thread or article -(@code{gnus-pick-unmark-article-or-thread}). If the variable -@code{gnus-thread-hide-subtree} is true, then this key unpicks the -thread if used at the first article of the thread. Otherwise it unpicks -just the article. You can give this key a numerical prefix to unpick -the thread or article at that line. - -@item RET -@kindex RET (Pick) -@findex gnus-pick-start-reading -@vindex gnus-pick-display-summary -Start reading the picked articles (@code{gnus-pick-start-reading}). If -given a prefix, mark all unpicked articles as read first. If -@code{gnus-pick-display-summary} is non-@code{nil}, the summary buffer -will still be visible when you are reading. - -@end table - -All the normal summary mode commands are still available in the -pick-mode, with the exception of @kbd{u}. However @kbd{!} is available -which is mapped to the same function -@code{gnus-summary-tick-article-forward}. - -If this sounds like a good idea to you, you could say: - -@lisp -(add-hook 'gnus-summary-mode-hook 'gnus-pick-mode) -@end lisp - -@vindex gnus-pick-mode-hook -@code{gnus-pick-mode-hook} is run in pick minor mode buffers. - -@vindex gnus-mark-unpicked-articles-as-read -If @code{gnus-mark-unpicked-articles-as-read} is non-@code{nil}, mark -all unpicked articles as read. The default is @code{nil}. - -@vindex gnus-summary-pick-line-format -The summary line format in pick mode is slightly different from the -standard format. At the beginning of each line the line number is -displayed. The pick mode line format is controlled by the -@code{gnus-summary-pick-line-format} variable (@pxref{Formatting -Variables}). It accepts the same format specs that -@code{gnus-summary-line-format} does (@pxref{Summary Buffer Lines}). - - -@node Binary Groups -@subsection Binary Groups -@cindex binary groups - -@findex gnus-binary-mode -@kindex M-x gnus-binary-mode -If you spend much time in binary groups, you may grow tired of hitting -@kbd{X u}, @kbd{n}, @kbd{RET} all the time. @kbd{M-x gnus-binary-mode} -is a minor mode for summary buffers that makes all ordinary Gnus article -selection functions uudecode series of articles and display the result -instead of just displaying the articles the normal way. - -@kindex g (Binary) -@findex gnus-binary-show-article -The only way, in fact, to see the actual articles is the @kbd{g} -command, when you have turned on this mode -(@code{gnus-binary-show-article}). - -@vindex gnus-binary-mode-hook -@code{gnus-binary-mode-hook} is called in binary minor mode buffers. - - -@node Tree Display -@section Tree Display -@cindex trees - -@vindex gnus-use-trees -If you don't like the normal gnus summary display, you might try setting -@code{gnus-use-trees} to @code{t}. This will create (by default) an -additional @dfn{tree buffer}. You can execute all summary mode commands -in the tree buffer. - -There are a few variables to customize the tree display, of course: - -@table @code -@item gnus-tree-mode-hook -@vindex gnus-tree-mode-hook -A hook called in all tree mode buffers. - -@item gnus-tree-mode-line-format -@vindex gnus-tree-mode-line-format -A format string for the mode bar in the tree mode buffers (@pxref{Mode -Line Formatting}). The default is @samp{Gnus: %%b %S %Z}. For a list -of valid specs, @pxref{Summary Buffer Mode Line}. - -@item gnus-selected-tree-face -@vindex gnus-selected-tree-face -Face used for highlighting the selected article in the tree buffer. The -default is @code{modeline}. - -@item gnus-tree-line-format -@vindex gnus-tree-line-format -A format string for the tree nodes. The name is a bit of a misnomer, -though---it doesn't define a line, but just the node. The default value -is @samp{%(%[%3,3n%]%)}, which displays the first three characters of -the name of the poster. It is vital that all nodes are of the same -length, so you @emph{must} use @samp{%4,4n}-like specifiers. - -Valid specs are: - -@table @samp -@item n -The name of the poster. -@item f -The @code{From} header. -@item N -The number of the article. -@item [ -The opening bracket. -@item ] -The closing bracket. -@item s -The subject. -@end table - -@xref{Formatting Variables}. - -Variables related to the display are: - -@table @code -@item gnus-tree-brackets -@vindex gnus-tree-brackets -This is used for differentiating between ``real'' articles and -``sparse'' articles. The format is @code{((@var{real-open} . @var{real-close}) -(@var{sparse-open} . @var{sparse-close}) (@var{dummy-open} . @var{dummy-close}))}, and the -default is @code{((?[ . ?]) (?( . ?)) (?@{ . ?@}) (?< . ?>))}. - -@item gnus-tree-parent-child-edges -@vindex gnus-tree-parent-child-edges -This is a list that contains the characters used for connecting parent -nodes to their children. The default is @code{(?- ?\\ ?|)}. - -@end table - -@item gnus-tree-minimize-window -@vindex gnus-tree-minimize-window -If this variable is non-@code{nil}, gnus will try to keep the tree -buffer as small as possible to allow more room for the other gnus -windows. If this variable is a number, the tree buffer will never be -higher than that number. The default is @code{t}. Note that if you -have several windows displayed side-by-side in a frame and the tree -buffer is one of these, minimizing the tree window will also resize all -other windows displayed next to it. - -@item gnus-generate-tree-function -@vindex gnus-generate-tree-function -@findex gnus-generate-horizontal-tree -@findex gnus-generate-vertical-tree -The function that actually generates the thread tree. Two predefined -functions are available: @code{gnus-generate-horizontal-tree} and -@code{gnus-generate-vertical-tree} (which is the default). - -@end table - -Here's an example from a horizontal tree buffer: - -@example -@{***@}-(***)-[odd]-[Gun] - | \[Jan] - | \[odd]-[Eri] - | \(***)-[Eri] - | \[odd]-[Paa] - \[Bjo] - \[Gun] - \[Gun]-[Jor] -@end example - -Here's the same thread displayed in a vertical tree buffer: - -@example -@{***@} - |--------------------------\-----\-----\ -(***) [Bjo] [Gun] [Gun] - |--\-----\-----\ | -[odd] [Jan] [odd] (***) [Jor] - | | |--\ -[Gun] [Eri] [Eri] [odd] - | - [Paa] -@end example - -If you're using horizontal trees, it might be nice to display the trees -side-by-side with the summary buffer. You could add something like the -following to your @file{.gnus.el} file: - -@lisp -(setq gnus-use-trees t - gnus-generate-tree-function 'gnus-generate-horizontal-tree - gnus-tree-minimize-window nil) -(gnus-add-configuration - '(article - (vertical 1.0 - (horizontal 0.25 - (summary 0.75 point) - (tree 1.0)) - (article 1.0)))) -@end lisp - -@xref{Window Layout}. - - -@node Mail Group Commands -@section Mail Group Commands -@cindex mail group commands - -Some commands only make sense in mail groups. If these commands are -invalid in the current group, they will raise a hell and let you know. - -All these commands (except the expiry and edit commands) use the -process/prefix convention (@pxref{Process/Prefix}). - -@table @kbd - -@item B e -@kindex B e (Summary) -@findex gnus-summary-expire-articles -Run all expirable articles in the current group through the expiry -process (@code{gnus-summary-expire-articles}). That is, delete all -expirable articles in the group that have been around for a while. -(@pxref{Expiring Mail}). - -@item B M-C-e -@kindex B M-C-e (Summary) -@findex gnus-summary-expire-articles-now -Delete all the expirable articles in the group -(@code{gnus-summary-expire-articles-now}). This means that @strong{all} -articles eligible for expiry in the current group will -disappear forever into that big @file{/dev/null} in the sky. - -@item B DEL -@kindex B DEL (Summary) -@findex gnus-summary-delete-article -@c @icon{gnus-summary-mail-delete} -Delete the mail article. This is ``delete'' as in ``delete it from your -disk forever and ever, never to return again.'' Use with caution. -(@code{gnus-summary-delete-article}). - -@item B m -@kindex B m (Summary) -@cindex move mail -@findex gnus-summary-move-article -@vindex gnus-preserve-marks -Move the article from one mail group to another -(@code{gnus-summary-move-article}). Marks will be preserved if -@var{gnus-preserve-marks} is non-@code{nil} (which is the default). - -@item B c -@kindex B c (Summary) -@cindex copy mail -@findex gnus-summary-copy-article -@c @icon{gnus-summary-mail-copy} -Copy the article from one group (mail group or not) to a mail group -(@code{gnus-summary-copy-article}). Marks will be preserved if -@var{gnus-preserve-marks} is non-@code{nil} (which is the default). - -@item B B -@kindex B B (Summary) -@cindex crosspost mail -@findex gnus-summary-crosspost-article -Crosspost the current article to some other group -(@code{gnus-summary-crosspost-article}). This will create a new copy of -the article in the other group, and the Xref headers of the article will -be properly updated. - -@item B i -@kindex B i (Summary) -@findex gnus-summary-import-article -Import an arbitrary file into the current mail newsgroup -(@code{gnus-summary-import-article}). You will be prompted for a file -name, a @code{From} header and a @code{Subject} header. - -@item B r -@kindex B r (Summary) -@findex gnus-summary-respool-article -Respool the mail article (@code{gnus-summary-respool-article}). -@code{gnus-summary-respool-default-method} will be used as the default -select method when respooling. This variable is @code{nil} by default, -which means that the current group select method will be used instead. -Marks will be preserved if @var{gnus-preserve-marks} is non-@code{nil} -(which is the default). - -@item B w -@itemx e -@kindex B w (Summary) -@kindex e (Summary) -@findex gnus-summary-edit-article -@kindex C-c C-c (Article) -Edit the current article (@code{gnus-summary-edit-article}). To finish -editing and make the changes permanent, type @kbd{C-c C-c} -(@kbd{gnus-summary-edit-article-done}). If you give a prefix to the -@kbd{C-c C-c} command, gnus won't re-highlight the article. - -@item B q -@kindex B q (Summary) -@findex gnus-summary-respool-query -If you want to re-spool an article, you might be curious as to what group -the article will end up in before you do the re-spooling. This command -will tell you (@code{gnus-summary-respool-query}). - -@item B t -@kindex B t (Summary) -@findex gnus-summary-respool-trace -Similarly, this command will display all fancy splitting patterns used -when repooling, if any (@code{gnus-summary-respool-trace}). - -@item B p -@kindex B p (Summary) -@findex gnus-summary-article-posted-p -Some people have a tendency to send you "courtesy" copies when they -follow up to articles you have posted. These usually have a -@code{Newsgroups} header in them, but not always. This command -(@code{gnus-summary-article-posted-p}) will try to fetch the current -article from your news server (or rather, from -@code{gnus-refer-article-method} or @code{gnus-select-method}) and will -report back whether it found the article or not. Even if it says that -it didn't find the article, it may have been posted anyway---mail -propagation is much faster than news propagation, and the news copy may -just not have arrived yet. - -@end table - -@vindex gnus-move-split-methods -@cindex moving articles -If you move (or copy) articles regularly, you might wish to have gnus -suggest where to put the articles. @code{gnus-move-split-methods} is a -variable that uses the same syntax as @code{gnus-split-methods} -(@pxref{Saving Articles}). You may customize that variable to create -suggestions you find reasonable. (Note that -@code{gnus-move-split-methods} uses group names where -@code{gnus-split-methods} uses file names.) - -@lisp -(setq gnus-move-split-methods - '(("^From:.*Lars Magne" "nnml:junk") - ("^Subject:.*gnus" "nnfolder:important") - (".*" "nnml:misc"))) -@end lisp - - -@node Various Summary Stuff -@section Various Summary Stuff - -@menu -* Summary Group Information:: Information oriented commands. -* Searching for Articles:: Multiple article commands. -* Summary Generation Commands:: -* Really Various Summary Commands:: Those pesky non-conformant commands. -@end menu - -@table @code -@vindex gnus-summary-mode-hook -@item gnus-summary-mode-hook -This hook is called when creating a summary mode buffer. - -@vindex gnus-summary-generate-hook -@item gnus-summary-generate-hook -This is called as the last thing before doing the threading and the -generation of the summary buffer. It's quite convenient for customizing -the threading variables based on what data the newsgroup has. This hook -is called from the summary buffer after most summary buffer variables -have been set. - -@vindex gnus-summary-prepare-hook -@item gnus-summary-prepare-hook -It is called after the summary buffer has been generated. You might use -it to, for instance, highlight lines or modify the look of the buffer in -some other ungodly manner. I don't care. - -@vindex gnus-summary-prepared-hook -@item gnus-summary-prepared-hook -A hook called as the very last thing after the summary buffer has been -generated. - -@vindex gnus-summary-ignore-duplicates -@item gnus-summary-ignore-duplicates -When gnus discovers two articles that have the same @code{Message-ID}, -it has to do something drastic. No articles are allowed to have the -same @code{Message-ID}, but this may happen when reading mail from some -sources. Gnus allows you to customize what happens with this variable. -If it is @code{nil} (which is the default), gnus will rename the -@code{Message-ID} (for display purposes only) and display the article as -any other article. If this variable is @code{t}, it won't display the -article---it'll be as if it never existed. - -@vindex gnus-alter-articles-to-read-function -@item gnus-alter-articles-to-read-function -This function, which takes two parameters (the group name and the list -of articles to be selected), is called to allow the user to alter the -list of articles to be selected. - -For instance, the following function adds the list of cached articles to -the list in one particular group: - -@lisp -(defun my-add-cached-articles (group articles) - (if (string= group "some.group") - (append gnus-newsgroup-cached articles) - articles)) -@end lisp - -@end table - - -@node Summary Group Information -@subsection Summary Group Information - -@table @kbd - -@item H f -@kindex H f (Summary) -@findex gnus-summary-fetch-faq -@vindex gnus-group-faq-directory -Try to fetch the FAQ (list of frequently asked questions) for the -current group (@code{gnus-summary-fetch-faq}). Gnus will try to get the -FAQ from @code{gnus-group-faq-directory}, which is usually a directory -on a remote machine. This variable can also be a list of directories. -In that case, giving a prefix to this command will allow you to choose -between the various sites. @code{ange-ftp} or @code{efs} will probably -be used for fetching the file. - -@item H d -@kindex H d (Summary) -@findex gnus-summary-describe-group -Give a brief description of the current group -(@code{gnus-summary-describe-group}). If given a prefix, force -rereading the description from the server. - -@item H h -@kindex H h (Summary) -@findex gnus-summary-describe-briefly -Give an extremely brief description of the most important summary -keystrokes (@code{gnus-summary-describe-briefly}). - -@item H i -@kindex H i (Summary) -@findex gnus-info-find-node -Go to the gnus info node (@code{gnus-info-find-node}). -@end table - - -@node Searching for Articles -@subsection Searching for Articles - -@table @kbd - -@item M-s -@kindex M-s (Summary) -@findex gnus-summary-search-article-forward -Search through all subsequent (raw) articles for a regexp -(@code{gnus-summary-search-article-forward}). - -@item M-r -@kindex M-r (Summary) -@findex gnus-summary-search-article-backward -Search through all previous (raw) articles for a regexp -(@code{gnus-summary-search-article-backward}). - -@item & -@kindex & (Summary) -@findex gnus-summary-execute-command -This command will prompt you for a header, a regular expression to match -on this field, and a command to be executed if the match is made -(@code{gnus-summary-execute-command}). If the header is an empty -string, the match is done on the entire article. If given a prefix, -search backward instead. - -For instance, @kbd{& RET some.*string #} will put the process mark on -all articles that have heads or bodies that match @samp{some.*string}. - -@item M-& -@kindex M-& (Summary) -@findex gnus-summary-universal-argument -Perform any operation on all articles that have been marked with -the process mark (@code{gnus-summary-universal-argument}). -@end table - -@node Summary Generation Commands -@subsection Summary Generation Commands - -@table @kbd - -@item Y g -@kindex Y g (Summary) -@findex gnus-summary-prepare -Regenerate the current summary buffer (@code{gnus-summary-prepare}). - -@item Y c -@kindex Y c (Summary) -@findex gnus-summary-insert-cached-articles -Pull all cached articles (for the current group) into the summary buffer -(@code{gnus-summary-insert-cached-articles}). - -@end table - - -@node Really Various Summary Commands -@subsection Really Various Summary Commands - -@table @kbd - -@item A D -@itemx C-d -@kindex C-d (Summary) -@kindex A D (Summary) -@findex gnus-summary-enter-digest-group -If the current article is a collection of other articles (for instance, -a digest), you might use this command to enter a group based on the that -article (@code{gnus-summary-enter-digest-group}). Gnus will try to -guess what article type is currently displayed unless you give a prefix -to this command, which forces a ``digest'' interpretation. Basically, -whenever you see a message that is a collection of other messages of -some format, you @kbd{C-d} and read these messages in a more convenient -fashion. - -@item M-C-d -@kindex M-C-d (Summary) -@findex gnus-summary-read-document -This command is very similar to the one above, but lets you gather -several documents into one biiig group -(@code{gnus-summary-read-document}). It does this by opening several -@code{nndoc} groups for each document, and then opening an -@code{nnvirtual} group on top of these @code{nndoc} groups. This -command understands the process/prefix convention -(@pxref{Process/Prefix}). - -@item C-t -@kindex C-t (Summary) -@findex gnus-summary-toggle-truncation -Toggle truncation of summary lines -(@code{gnus-summary-toggle-truncation}). This will probably confuse the -line centering function in the summary buffer, so it's not a good idea -to have truncation switched off while reading articles. - -@item = -@kindex = (Summary) -@findex gnus-summary-expand-window -Expand the summary buffer window (@code{gnus-summary-expand-window}). -If given a prefix, force an @code{article} window configuration. - -@item M-C-e -@kindex M-C-e (Summary) -@findex gnus-summary-edit-parameters -Edit the group parameters (@pxref{Group Parameters}) of the current -group (@code{gnus-summary-edit-parameters}). - -@item M-C-a -@kindex M-C-a (Summary) -@findex gnus-summary-customize-parameters -Customize the group parameters (@pxref{Group Parameters}) of the current -group (@code{gnus-summary-customize-parameters}). - -@end table - - -@node Exiting the Summary Buffer -@section Exiting the Summary Buffer -@cindex summary exit -@cindex exiting groups - -Exiting from the summary buffer will normally update all info on the -group and return you to the group buffer. - -@table @kbd - -@item Z Z -@itemx q -@kindex Z Z (Summary) -@kindex q (Summary) -@findex gnus-summary-exit -@vindex gnus-summary-exit-hook -@vindex gnus-summary-prepare-exit-hook -@c @icon{gnus-summary-exit} -Exit the current group and update all information on the group -(@code{gnus-summary-exit}). @code{gnus-summary-prepare-exit-hook} is -called before doing much of the exiting, which calls -@code{gnus-summary-expire-articles} by default. -@code{gnus-summary-exit-hook} is called after finishing the exit -process. @code{gnus-group-no-more-groups-hook} is run when returning to -group mode having no more (unread) groups. - -@item Z E -@itemx Q -@kindex Z E (Summary) -@kindex Q (Summary) -@findex gnus-summary-exit-no-update -Exit the current group without updating any information on the group -(@code{gnus-summary-exit-no-update}). - -@item Z c -@itemx c -@kindex Z c (Summary) -@kindex c (Summary) -@findex gnus-summary-catchup-and-exit -@c @icon{gnus-summary-catchup-and-exit} -Mark all unticked articles in the group as read and then exit -(@code{gnus-summary-catchup-and-exit}). - -@item Z C -@kindex Z C (Summary) -@findex gnus-summary-catchup-all-and-exit -Mark all articles, even the ticked ones, as read and then exit -(@code{gnus-summary-catchup-all-and-exit}). - -@item Z n -@kindex Z n (Summary) -@findex gnus-summary-catchup-and-goto-next-group -Mark all articles as read and go to the next group -(@code{gnus-summary-catchup-and-goto-next-group}). - -@item Z R -@kindex Z R (Summary) -@findex gnus-summary-reselect-current-group -Exit this group, and then enter it again -(@code{gnus-summary-reselect-current-group}). If given a prefix, select -all articles, both read and unread. - -@item Z G -@itemx M-g -@kindex Z G (Summary) -@kindex M-g (Summary) -@findex gnus-summary-rescan-group -@c @icon{gnus-summary-mail-get} -Exit the group, check for new articles in the group, and select the -group (@code{gnus-summary-rescan-group}). If given a prefix, select all -articles, both read and unread. - -@item Z N -@kindex Z N (Summary) -@findex gnus-summary-next-group -Exit the group and go to the next group -(@code{gnus-summary-next-group}). - -@item Z P -@kindex Z P (Summary) -@findex gnus-summary-prev-group -Exit the group and go to the previous group -(@code{gnus-summary-prev-group}). - -@item Z s -@kindex Z s (Summary) -@findex gnus-summary-save-newsrc -Save the current number of read/marked articles in the dribble buffer -and then save the dribble buffer (@code{gnus-summary-save-newsrc}). If -given a prefix, also save the @file{.newsrc} file(s). Using this -command will make exit without updating (the @kbd{Q} command) worthless. -@end table - -@vindex gnus-exit-group-hook -@code{gnus-exit-group-hook} is called when you exit the current group -with an ``updating'' exit. For instance @kbd{Q} -(@code{gnus-summary-exit-no-update}) does not call this hook. - -@findex gnus-summary-wake-up-the-dead -@findex gnus-dead-summary-mode -@vindex gnus-kill-summary-on-exit -If you're in the habit of exiting groups, and then changing your mind -about it, you might set @code{gnus-kill-summary-on-exit} to @code{nil}. -If you do that, gnus won't kill the summary buffer when you exit it. -(Quelle surprise!) Instead it will change the name of the buffer to -something like @samp{*Dead Summary ... *} and install a minor mode -called @code{gnus-dead-summary-mode}. Now, if you switch back to this -buffer, you'll find that all keys are mapped to a function called -@code{gnus-summary-wake-up-the-dead}. So tapping any keys in a dead -summary buffer will result in a live, normal summary buffer. - -There will never be more than one dead summary buffer at any one time. - -@vindex gnus-use-cross-reference -The data on the current group will be updated (which articles you have -read, which articles you have replied to, etc.) when you exit the -summary buffer. If the @code{gnus-use-cross-reference} variable is -@code{t} (which is the default), articles that are cross-referenced to -this group and are marked as read, will also be marked as read in the -other subscribed groups they were cross-posted to. If this variable is -neither @code{nil} nor @code{t}, the article will be marked as read in -both subscribed and unsubscribed groups (@pxref{Crosspost Handling}). - - -@node Crosspost Handling -@section Crosspost Handling - -@cindex velveeta -@cindex spamming -Marking cross-posted articles as read ensures that you'll never have to -read the same article more than once. Unless, of course, somebody has -posted it to several groups separately. Posting the same article to -several groups (not cross-posting) is called @dfn{spamming}, and you are -by law required to send nasty-grams to anyone who perpetrates such a -heinous crime. You may want to try NoCeM handling to filter out spam -(@pxref{NoCeM}). - -Remember: Cross-posting is kinda ok, but posting the same article -separately to several groups is not. Massive cross-posting (aka. -@dfn{velveeta}) is to be avoided at all costs, and you can even use the -@code{gnus-summary-mail-crosspost-complaint} command to complain about -excessive crossposting (@pxref{Summary Mail Commands}). - -@cindex cross-posting -@cindex Xref -@cindex @sc{nov} -One thing that may cause Gnus to not do the cross-posting thing -correctly is if you use an @sc{nntp} server that supports @sc{xover} -(which is very nice, because it speeds things up considerably) which -does not include the @code{Xref} header in its @sc{nov} lines. This is -Evil, but all too common, alas, alack. Gnus tries to Do The Right Thing -even with @sc{xover} by registering the @code{Xref} lines of all -articles you actually read, but if you kill the articles, or just mark -them as read without reading them, Gnus will not get a chance to snoop -the @code{Xref} lines out of these articles, and will be unable to use -the cross reference mechanism. - -@cindex LIST overview.fmt -@cindex overview.fmt -To check whether your @sc{nntp} server includes the @code{Xref} header -in its overview files, try @samp{telnet your.nntp.server nntp}, -@samp{MODE READER} on @code{inn} servers, and then say @samp{LIST -overview.fmt}. This may not work, but if it does, and the last line you -get does not read @samp{Xref:full}, then you should shout and whine at -your news admin until she includes the @code{Xref} header in the -overview files. - -@vindex gnus-nov-is-evil -If you want Gnus to get the @code{Xref}s right all the time, you have to -set @code{gnus-nov-is-evil} to @code{t}, which slows things down -considerably. - -C'est la vie. - -For an alternative approach, @pxref{Duplicate Suppression}. - - -@node Duplicate Suppression -@section Duplicate Suppression - -By default, gnus tries to make sure that you don't have to read the same -article more than once by utilizing the crossposting mechanism -(@pxref{Crosspost Handling}). However, that simple and efficient -approach may not work satisfactory for some users for various -reasons. - -@enumerate -@item -The @sc{nntp} server may fail to generate the @code{Xref} header. This -is evil and not very common. - -@item -The @sc{nntp} server may fail to include the @code{Xref} header in the -@file{.overview} data bases. This is evil and all too common, alas. - -@item -You may be reading the same group (or several related groups) from -different @sc{nntp} servers. - -@item -You may be getting mail that duplicates articles posted to groups. -@end enumerate - -I'm sure there are other situations where @code{Xref} handling fails as -well, but these four are the most common situations. - -If, and only if, @code{Xref} handling fails for you, then you may -consider switching on @dfn{duplicate suppression}. If you do so, Gnus -will remember the @code{Message-ID}s of all articles you have read or -otherwise marked as read, and then, as if by magic, mark them as read -all subsequent times you see them---in @emph{all} groups. Using this -mechanism is quite likely to be somewhat inefficient, but not overly -so. It's certainly preferable to reading the same articles more than -once. - -Duplicate suppression is not a very subtle instrument. It's more like a -sledge hammer than anything else. It works in a very simple -fashion---if you have marked an article as read, it adds this Message-ID -to a cache. The next time it sees this Message-ID, it will mark the -article as read with the @samp{M} mark. It doesn't care what group it -saw the article in. - -@table @code -@item gnus-suppress-duplicates -@vindex gnus-suppress-duplicates -If non-@code{nil}, suppress duplicates. - -@item gnus-save-duplicate-list -@vindex gnus-save-duplicate-list -If non-@code{nil}, save the list of duplicates to a file. This will -make startup and shutdown take longer, so the default is @code{nil}. -However, this means that only duplicate articles read in a single gnus -session are suppressed. - -@item gnus-duplicate-list-length -@vindex gnus-duplicate-list-length -This variable says how many @code{Message-ID}s to keep in the duplicate -suppression list. The default is 10000. - -@item gnus-duplicate-file -@vindex gnus-duplicate-file -The name of the file to store the duplicate suppression list in. The -default is @file{~/News/suppression}. -@end table - -If you have a tendency to stop and start gnus often, setting -@code{gnus-save-duplicate-list} to @code{t} is probably a good idea. If -you leave gnus running for weeks on end, you may have it @code{nil}. On -the other hand, saving the list makes startup and shutdown much slower, -so that means that if you stop and start gnus often, you should set -@code{gnus-save-duplicate-list} to @code{nil}. Uhm. I'll leave this up -to you to figure out, I think. - -@node Security -@section Security - -Gnus is able to verify PGP or S/MIME signed messages or decrypt PGP -encrypted messages. - -@enumerate -@item -To verify or decrypt PGP messages, you have to install mailcrypt or -gpg.el. - -@end enumerate - -@table @code -@item mm-verify-option -@vindex mm-verify-option -Option of verifying signed parts. @code{never}, not verify; -@code{always}, always verify; @code{known}, only verify known -protocols. Otherwise, ask user. - -@item mm-decrypt-option -@vindex mm-decrypt-option -Option of decrypting encrypted parts. @code{never}, no decryption; -@code{always}, always decrypt @code{known}, only decrypt known -protocols. Otherwise, ask user. - -@end table - -@node Mailing List -@section Mailing List - -Gnus understands some mailing list fields of RFC 2369. - -@table @kbd - -@item C-c C-n h -@kindex C-c C-n h (Summary) -@findex gnus-mailing-list-help -Send a message to fetch mailing list help, if List-Help field exists. - -@item C-c C-n s -@kindex C-c C-n s (Summary) -@findex gnus-mailing-list-subscribe -Send a message to subscribe the mailing list, if List-Subscribe field exists. - -@item C-c C-n u -@kindex C-c C-n u (Summary) -@findex gnus-mailing-list-unsubscribe -Send a message to unsubscribe the mailing list, if List-Unsubscribe -field exists. - -@item C-c C-n p -@kindex C-c C-n p (Summary) -@findex gnus-mailing-list-post -Post to the mailing list, if List-Post field exists. - -@item C-c C-n o -@kindex C-c C-n o (Summary) -@findex gnus-mailing-list-owner -Send a message to the mailing list owner, if List-Owner field exists. - -@item C-c C-n a -@kindex C-c C-n a (Summary) -@findex gnus-mailing-list-owner -Browse the mailing list archive, if List-Archive field exists. - -@end table - -@node Article Buffer -@chapter Article Buffer -@cindex article buffer - -The articles are displayed in the article buffer, of which there is only -one. All the summary buffers share the same article buffer unless you -tell gnus otherwise. - -@menu -* Hiding Headers:: Deciding what headers should be displayed. -* Using MIME:: Pushing articles through @sc{mime} before reading them. -* Customizing Articles:: Tailoring the look of the articles. -* Article Keymap:: Keystrokes available in the article buffer. -* Misc Article:: Other stuff. -@end menu - - -@node Hiding Headers -@section Hiding Headers -@cindex hiding headers -@cindex deleting headers - -The top section of each article is the @dfn{head}. (The rest is the -@dfn{body}, but you may have guessed that already.) - -@vindex gnus-show-all-headers -There is a lot of useful information in the head: the name of the person -who wrote the article, the date it was written and the subject of the -article. That's well and nice, but there's also lots of information -most people do not want to see---what systems the article has passed -through before reaching you, the @code{Message-ID}, the -@code{References}, etc. ad nauseum---and you'll probably want to get rid -of some of those lines. If you want to keep all those lines in the -article buffer, you can set @code{gnus-show-all-headers} to @code{t}. - -Gnus provides you with two variables for sifting headers: - -@table @code - -@item gnus-visible-headers -@vindex gnus-visible-headers -If this variable is non-@code{nil}, it should be a regular expression -that says what headers you wish to keep in the article buffer. All -headers that do not match this variable will be hidden. - -For instance, if you only want to see the name of the person who wrote -the article and the subject, you'd say: - -@lisp -(setq gnus-visible-headers "^From:\\|^Subject:") -@end lisp - -This variable can also be a list of regexps to match headers to -remain visible. - -@item gnus-ignored-headers -@vindex gnus-ignored-headers -This variable is the reverse of @code{gnus-visible-headers}. If this -variable is set (and @code{gnus-visible-headers} is @code{nil}), it -should be a regular expression that matches all lines that you want to -hide. All lines that do not match this variable will remain visible. - -For instance, if you just want to get rid of the @code{References} field -and the @code{Xref} field, you might say: - -@lisp -(setq gnus-ignored-headers "^References:\\|^Xref:") -@end lisp - -This variable can also be a list of regexps to match headers to -be removed. - -Note that if @code{gnus-visible-headers} is non-@code{nil}, this -variable will have no effect. - -@end table - -@vindex gnus-sorted-header-list -Gnus can also sort the headers for you. (It does this by default.) You -can control the sorting by setting the @code{gnus-sorted-header-list} -variable. It is a list of regular expressions that says in what order -the headers are to be displayed. - -For instance, if you want the name of the author of the article first, -and then the subject, you might say something like: - -@lisp -(setq gnus-sorted-header-list '("^From:" "^Subject:")) -@end lisp - -Any headers that are to remain visible, but are not listed in this -variable, will be displayed in random order after all the headers listed in this variable. - -@findex gnus-article-hide-boring-headers -@vindex gnus-boring-article-headers -You can hide further boring headers by setting -@code{gnus-treat-hide-boring-headers} to @code{head}. What this function -does depends on the @code{gnus-boring-article-headers} variable. It's a -list, but this list doesn't actually contain header names. Instead is -lists various @dfn{boring conditions} that Gnus can check and remove -from sight. - -These conditions are: -@table @code -@item empty -Remove all empty headers. -@item followup-to -Remove the @code{Followup-To} header if it is identical to the -@code{Newsgroups} header. -@item reply-to -Remove the @code{Reply-To} header if it lists the same address as the -@code{From} header. -@item newsgroups -Remove the @code{Newsgroups} header if it only contains the current group -name. -@item to-address -Remove the @code{To} header if it only contains the address identical to -the current groups's @code{to-address} parameter. -@item date -Remove the @code{Date} header if the article is less than three days -old. -@item long-to -Remove the @code{To} header if it is very long. -@item many-to -Remove all @code{To} headers if there are more than one. -@end table - -To include these three elements, you could say something like; - -@lisp -(setq gnus-boring-article-headers - '(empty followup-to reply-to)) -@end lisp - -This is also the default value for this variable. - - -@node Using MIME -@section Using @sc{mime} -@cindex @sc{mime} - -Mime is a standard for waving your hands through the air, aimlessly, -while people stand around yawning. - -@sc{mime}, however, is a standard for encoding your articles, aimlessly, -while all newsreaders die of fear. - -@sc{mime} may specify what character set the article uses, the encoding -of the characters, and it also makes it possible to embed pictures and -other naughty stuff in innocent-looking articles. - -@vindex gnus-show-mime -@vindex gnus-article-display-method-for-mime -@vindex gnus-strict-mime -@findex gnus-article-display-mime-message -Gnus handles @sc{mime} by pushing the articles through -@code{gnus-article-display-method-for-mime}, which is -@code{gnus-article-display-mime-message} by default. This function -calls the SEMI MIME-View program to actually do the work. For more -information on SEMI MIME-View, see its manual page (however it is not -existed yet, sorry). - -Set @code{gnus-show-mime} to @code{t} if you want to use -@sc{mime} all the time. However, if @code{gnus-strict-mime} is -non-@code{nil}, the @sc{mime} method will only be used if there are -@sc{mime} headers in the article. If you have @code{gnus-show-mime} -set, then you'll see some unfortunate display glitches in the article -buffer. These can't be avoided. - -In GNUS or Gnus, it might be best to just use the toggling functions -from the summary buffer to avoid getting nasty surprises. (For instance, -you enter the group @samp{alt.sing-a-long} and, before you know it, -@sc{mime} has decoded the sound file in the article and some horrible -sing-a-long song comes screaming out your speakers, and you can't find -the volume button, because there isn't one, and people are starting to -look at you, and you try to stop the program, but you can't, and you -can't find the program to control the volume, and everybody else in the -room suddenly decides to look at you disdainfully, and you'll feel -rather stupid.) - -Any similarity to real events and people is purely coincidental. Ahem. - -To avoid such kind of situation, gnus stops to use -@code{metamail-buffer}. So now, you can set @code{gnus-show-mime} to -non-@code{nil} every-time, then you can push button in the article -buffer when there are nobody else. - -Also see @pxref{MIME Commands}. - - -@node Customizing Articles -@section Customizing Articles -@cindex article customization - -A slew of functions for customizing how the articles are to look like -exist. You can call these functions interactively, or you can have them -called automatically when you select the articles. - -To have them called automatically, you should set the corresponding -``treatment'' variable. For instance, to have headers hidden, you'd set -@code{gnus-treat-hide-headers}. Below is a list of variables that can -be set, but first we discuss the values these variables can have. - -Note: Some values, while valid, make little sense. Check the list below -for sensible values. - -@enumerate -@item -@code{nil}: Don't do this treatment. - -@item -@code{t}: Do this treatment on all body parts. - -@item -@code{head}: Do the treatment on the headers. - -@item -@code{last}: Do this treatment on the last part. - -@item -An integer: Do this treatment on all body parts that have a length less -than this number. - -@item -A list of strings: Do this treatment on all body parts that are in -articles that are read in groups that have names that match one of the -regexps in the list. - -@item -A list where the first element is not a string: - -The list is evaluated recursively. The first element of the list is a -predicate. The following predicates are recognized: @code{or}, -@code{and}, @code{not} and @code{typep}. Here's an example: - -@lisp -(or last - (typep "text/x-vcard")) -@end lisp - -@item -@code{mime}: Do this treatment if the value of @code{gnus-show-mime}' is -non-nil. - -@end enumerate - -You may have noticed that the word @dfn{part} is used here. This refers -to the fact that some messages are @sc{mime} multipart articles that may -be divided into several parts. Articles that are not multiparts are -considered to contain just a single part. - -@vindex gnus-article-treat-types -Are the treatments applied to all sorts of multipart parts? Yes, if you -want to, but by default, only @samp{text/plain} parts are given the -treatment. This is controlled by the @code{gnus-article-treat-types} -variable, which is a list of regular expressions that are matched to the -type of the part. This variable is ignored if the value of the -controlling variable is a predicate list, as described above. - -The following treatment options are available. The easiest way to -customize this is to examine the @code{gnus-article-treat} customization -group. Values in parenthesis are suggested sensible values. Others are -possible but those listed are probably sufficient for most people. - -@table @code -@item gnus-treat-highlight-signature (t, last) -@item gnus-treat-buttonize (t, integer) -@item gnus-treat-buttonize-head (head) -@item gnus-treat-emphasize (t, head, integer) -@item gnus-treat-fill-article (t, integer) -@item gnus-treat-strip-cr (t, integer) -@item gnus-treat-hide-headers (head) -@item gnus-treat-hide-boring-headers (head) -@item gnus-treat-hide-signature (t, last) -@item gnus-treat-hide-citation (t, integer) -@item gnus-treat-hide-citation-maybe (t, integer) -@item gnus-treat-strip-pgp (t, last, integer) -@item gnus-treat-x-pgp-sig (head) -@item gnus-treat-strip-pem (t, last, integer) -@item gnus-treat-highlight-headers (head) -@item gnus-treat-highlight-citation (t, integer) -@item gnus-treat-highlight-signature (t, last, integer) -@item gnus-treat-date-ut (head) -@item gnus-treat-date-local (head) -@item gnus-treat-date-english (head) -@item gnus-treat-date-lapsed (head) -@item gnus-treat-date-original (head) -@item gnus-treat-date-iso8601 (head) -@item gnus-treat-date-user-defined (head) -@item gnus-treat-strip-headers-in-body (t, integer) -@item gnus-treat-strip-trailing-blank-lines (t, last, integer) -@item gnus-treat-strip-leading-blank-lines (t, integer) -@item gnus-treat-strip-multiple-blank-lines (t, integer) -@item gnus-treat-overstrike (t, integer) -@item gnus-treat-display-xface (head) -@item gnus-treat-display-smileys (t, integer) -@item gnus-treat-display-picons (head) -@item gnus-treat-capitalize-sentences (t, integer) -@item gnus-treat-fill-long-lines (t, integer) -@item gnus-treat-play-sounds -@item gnus-treat-translate -@item gnus-treat-decode-article-as-default-mime-charset -@end table - -@vindex gnus-part-display-hook -You can, of course, write your own functions to be called from -@code{gnus-part-display-hook}. The functions are called narrowed to the -part, and you can do anything you like, pretty much. There is no -information that you have to keep in the buffer---you can change -everything. - - -@node Article Keymap -@section Article Keymap - -Most of the keystrokes in the summary buffer can also be used in the -article buffer. They should behave as if you typed them in the summary -buffer, which means that you don't actually have to have a summary -buffer displayed while reading. You can do it all from the article -buffer. - -A few additional keystrokes are available: - -@table @kbd - -@item SPACE -@kindex SPACE (Article) -@findex gnus-article-next-page -Scroll forwards one page (@code{gnus-article-next-page}). - -@item DEL -@kindex DEL (Article) -@findex gnus-article-prev-page -Scroll backwards one page (@code{gnus-article-prev-page}). - -@item C-c ^ -@kindex C-c ^ (Article) -@findex gnus-article-refer-article -If point is in the neighborhood of a @code{Message-ID} and you press -@kbd{C-c ^}, Gnus will try to get that article from the server -(@code{gnus-article-refer-article}). - -@item C-c C-m -@kindex C-c C-m (Article) -@findex gnus-article-mail -Send a reply to the address near point (@code{gnus-article-mail}). If -given a prefix, include the mail. - -@item s -@kindex s (Article) -@findex gnus-article-show-summary -Reconfigure the buffers so that the summary buffer becomes visible -(@code{gnus-article-show-summary}). - -@item ? -@kindex ? (Article) -@findex gnus-article-describe-briefly -Give a very brief description of the available keystrokes -(@code{gnus-article-describe-briefly}). - -@item TAB -@kindex TAB (Article) -@findex gnus-article-next-button -Go to the next button, if any (@code{gnus-article-next-button}). This -only makes sense if you have buttonizing turned on. - -@item M-TAB -@kindex M-TAB (Article) -@findex gnus-article-prev-button -Go to the previous button, if any (@code{gnus-article-prev-button}). - -@end table - - -@node Misc Article -@section Misc Article - -@table @code - -@item gnus-single-article-buffer -@vindex gnus-single-article-buffer -If non-@code{nil}, use the same article buffer for all the groups. -(This is the default.) If @code{nil}, each group will have its own -article buffer. - -@vindex gnus-article-decode-hook -@item gnus-article-decode-hook -@cindex MIME -Hook used to decode @sc{mime} articles. The default value is -@code{(article-decode-charset article-decode-encoded-words)} - -@vindex gnus-article-prepare-hook -@item gnus-article-prepare-hook -This hook is called right after the article has been inserted into the -article buffer. It is mainly intended for functions that do something -depending on the contents; it should probably not be used for changing -the contents of the article buffer. - -@item gnus-article-mode-hook -@vindex gnus-article-mode-hook -Hook called in article mode buffers. - -@item gnus-article-mode-syntax-table -@vindex gnus-article-mode-syntax-table -Syntax table used in article buffers. It is initialized from -@code{text-mode-syntax-table}. - -@vindex gnus-article-mode-line-format -@item gnus-article-mode-line-format -This variable is a format string along the same lines as -@code{gnus-summary-mode-line-format} (@pxref{Mode Line Formatting}). It -accepts the same format specifications as that variable, with two -extensions: - -@table @samp -@item w -The @dfn{wash status} of the article. This is a short string with one -character for each possible article wash operation that may have been -performed. -@item m -The number of @sc{mime} parts in the article. -@end table - -@vindex gnus-break-pages - -@item gnus-break-pages -Controls whether @dfn{page breaking} is to take place. If this variable -is non-@code{nil}, the articles will be divided into pages whenever a -page delimiter appears in the article. If this variable is @code{nil}, -paging will not be done. - -@item gnus-page-delimiter -@vindex gnus-page-delimiter -This is the delimiter mentioned above. By default, it is @samp{^L} -(formfeed). -@end table - - -@node Composing Messages -@chapter Composing Messages -@cindex composing messages -@cindex messages -@cindex mail -@cindex sending mail -@cindex reply -@cindex followup -@cindex post -@cindex using gpg - -@kindex C-c C-c (Post) -All commands for posting and mailing will put you in a message buffer -where you can edit the article all you like, before you send the -article by pressing @kbd{C-c C-c}. @xref{Top, , Top, message, The -Message Manual}. Where the message will be posted/mailed to depends -on your setup (@pxref{Posting Server}). - -@menu -* Mail:: Mailing and replying. -* Posting Server:: What server should you post via? -* Mail and Post:: Mailing and posting at the same time. -* Archived Messages:: Where Gnus stores the messages you've sent. -* Posting Styles:: An easier way to specify who you are. -* Drafts:: Postponing messages and rejected messages. -* Rejected Articles:: What happens if the server doesn't like your article? -* Using GPG:: How to use GPG and MML to sign and encrypt messages -@end menu - -Also see @pxref{Canceling and Superseding} for information on how to -remove articles you shouldn't have posted. - - -@node Mail -@section Mail - -Variables for customizing outgoing mail: - -@table @code -@item gnus-uu-digest-headers -@vindex gnus-uu-digest-headers -List of regexps to match headers included in digested messages. The -headers will be included in the sequence they are matched. - -@item gnus-add-to-list -@vindex gnus-add-to-list -If non-@code{nil}, add a @code{to-list} group parameter to mail groups -that have none when you do a @kbd{a}. - -@end table - - -@node Posting Server -@section Posting Server - -When you press those magical @kbd{C-c C-c} keys to ship off your latest -(extremely intelligent, of course) article, where does it go? - -Thank you for asking. I hate you. - -@vindex gnus-post-method - -It can be quite complicated. Normally, Gnus will post using the same -select method as you're reading from (which might be convenient if -you're reading lots of groups from different private servers). -However. If the server you're reading from doesn't allow posting, -just reading, you probably want to use some other server to post your -(extremely intelligent and fabulously interesting) articles. You can -then set the @code{gnus-post-method} to some other method: - -@lisp -(setq gnus-post-method '(nnspool "")) -@end lisp - -Now, if you've done this, and then this server rejects your article, or -this server is down, what do you do then? To override this variable you -can use a non-zero prefix to the @kbd{C-c C-c} command to force using -the ``current'' server, to get back the default behavior, for posting. - -If you give a zero prefix (i.e., @kbd{C-u 0 C-c C-c}) to that command, -gnus will prompt you for what method to use for posting. - -You can also set @code{gnus-post-method} to a list of select methods. -If that's the case, gnus will always prompt you for what method to use -for posting. - -Finally, if you want to always post using the native select method, -you can set this variable to @code{nil}. - - -@node Mail and Post -@section Mail and Post - -Here's a list of variables relevant to both mailing and -posting: - -@table @code -@item gnus-mailing-list-groups -@findex gnus-mailing-list-groups -@cindex mailing lists - -If your news server offers groups that are really mailing lists -gatewayed to the @sc{nntp} server, you can read those groups without -problems, but you can't post/followup to them without some difficulty. -One solution is to add a @code{to-address} to the group parameters -(@pxref{Group Parameters}). An easier thing to do is set the -@code{gnus-mailing-list-groups} to a regexp that matches the groups that -really are mailing lists. Then, at least, followups to the mailing -lists will work most of the time. Posting to these groups (@kbd{a}) is -still a pain, though. - -@end table - -You may want to do spell-checking on messages that you send out. Or, if -you don't want to spell-check by hand, you could add automatic -spell-checking via the @code{ispell} package: - -@cindex ispell -@findex ispell-message -@lisp -(add-hook 'message-send-hook 'ispell-message) -@end lisp - -If you want to change the @code{ispell} dictionary based on what group -you're in, you could say something like the following: - -@lisp -(add-hook 'gnus-select-group-hook - (lambda () - (cond - ((string-match - "^de\\." (gnus-group-real-name gnus-newsgroup-name)) - (ispell-change-dictionary "deutsch")) - (t - (ispell-change-dictionary "english"))))) -@end lisp - -Modify to suit your needs. - - -@node Archived Messages -@section Archived Messages -@cindex archived messages -@cindex sent messages - -Gnus provides a few different methods for storing the mail and news you -send. The default method is to use the @dfn{archive virtual server} to -store the messages. If you want to disable this completely, the -@code{gnus-message-archive-group} variable should be @code{nil}, which -is the default. - -@vindex gnus-message-archive-method -@code{gnus-message-archive-method} says what virtual server gnus is to -use to store sent messages. The default is: - -@lisp -(nnfolder "archive" - (nnfolder-directory "~/Mail/archive") - (nnfolder-active-file "~/Mail/archive/active") - (nnfolder-get-new-mail nil) - (nnfolder-inhibit-expiry t)) -@end lisp - -You can, however, use any mail select method (@code{nnml}, -@code{nnmbox}, etc.). @code{nnfolder} is a quite likable select method -for doing this sort of thing, though. If you don't like the default -directory chosen, you could say something like: - -@lisp -(setq gnus-message-archive-method - '(nnfolder "archive" - (nnfolder-inhibit-expiry t) - (nnfolder-active-file "~/News/sent-mail/active") - (nnfolder-directory "~/News/sent-mail/"))) -@end lisp - -@vindex gnus-message-archive-group -@cindex Gcc -Gnus will insert @code{Gcc} headers in all outgoing messages that point -to one or more group(s) on that server. Which group to use is -determined by the @code{gnus-message-archive-group} variable. - -This variable can be used to do the following: - -@itemize @bullet -@item a string -Messages will be saved in that group. - -Note that you can include a select method in the group name, then the -message will not be stored in the select method given by -@code{gnus-message-archive-method}, but in the select method specified -by the group name, instead. Suppose @code{gnus-message-archive-method} -has the default value shown above. Then setting -@code{gnus-message-archive-group} to @code{"foo"} means that outgoing -messages are stored in @samp{nnfolder+archive:foo}, but if you use the -value @code{"nnml:foo"}, then outgoing messages will be stored in -@samp{nnml:foo}. -@item a list of strings -Messages will be saved in all those groups. -@item an alist of regexps, functions and forms -When a key ``matches'', the result is used. -@item @code{nil} -No message archiving will take place. This is the default. -@end itemize - -Let's illustrate: - -Just saving to a single group called @samp{MisK}: -@lisp -(setq gnus-message-archive-group "MisK") -@end lisp - -Saving to two groups, @samp{MisK} and @samp{safe}: -@lisp -(setq gnus-message-archive-group '("MisK" "safe")) -@end lisp - -Save to different groups based on what group you are in: -@lisp -(setq gnus-message-archive-group - '(("^alt" "sent-to-alt") - ("mail" "sent-to-mail") - (".*" "sent-to-misc"))) -@end lisp - -More complex stuff: -@lisp -(setq gnus-message-archive-group - '((if (message-news-p) - "misc-news" - "misc-mail"))) -@end lisp - -How about storing all news messages in one file, but storing all mail -messages in one file per month: - -@lisp -(setq gnus-message-archive-group - '((if (message-news-p) - "misc-news" - (concat "mail." (format-time-string "%Y-%m"))))) -@end lisp - -(XEmacs 19.13 doesn't have @code{format-time-string}, so you'll have to -use a different value for @code{gnus-message-archive-group} there.) - -Now, when you send a message off, it will be stored in the appropriate -group. (If you want to disable storing for just one particular message, -you can just remove the @code{Gcc} header that has been inserted.) The -archive group will appear in the group buffer the next time you start -gnus, or the next time you press @kbd{F} in the group buffer. You can -enter it and read the articles in it just like you'd read any other -group. If the group gets really big and annoying, you can simply rename -if (using @kbd{G r} in the group buffer) to something -nice---@samp{misc-mail-september-1995}, or whatever. New messages will -continue to be stored in the old (now empty) group. - -That's the default method of archiving sent messages. Gnus offers a -different way for the people who don't like the default method. In that -case you should set @code{gnus-message-archive-group} to @code{nil}; -this will disable archiving. - -@table @code -@item gnus-outgoing-message-group -@vindex gnus-outgoing-message-group -All outgoing messages will be put in this group. If you want to store -all your outgoing mail and articles in the group @samp{nnml:archive}, -you set this variable to that value. This variable can also be a list of -group names. - -If you want to have greater control over what group to put each -message in, you can set this variable to a function that checks the -current newsgroup name and then returns a suitable group name (or list -of names). - -This variable can be used instead of @code{gnus-message-archive-group}, -but the latter is the preferred method. - -@item gnus-inews-mark-gcc-as-read -@vindex gnus-inews-mark-gcc-as-read -If non-@code{nil}, automatically mark @code{Gcc} articles as read. - -@end table - - -@node Posting Styles -@section Posting Styles -@cindex posting styles -@cindex styles - -All them variables, they make my head swim. - -So what if you want a different @code{Organization} and signature based -on what groups you post to? And you post both from your home machine -and your work machine, and you want different @code{From} lines, and so -on? - -@vindex gnus-posting-styles -One way to do stuff like that is to write clever hooks that change the -variables you need to have changed. That's a bit boring, so somebody -came up with the bright idea of letting the user specify these things in -a handy alist. Here's an example of a @code{gnus-posting-styles} -variable: - -@lisp -((".*" - (signature "Peace and happiness") - (organization "What me?")) - ("^comp" - (signature "Death to everybody")) - ("comp.emacs.i-love-it" - (organization "Emacs is it"))) -@end lisp - -As you might surmise from this example, this alist consists of several -@dfn{styles}. Each style will be applicable if the first element -``matches'', in some form or other. The entire alist will be iterated -over, from the beginning towards the end, and each match will be -applied, which means that attributes in later styles that match override -the same attributes in earlier matching styles. So -@samp{comp.programming.literate} will have the @samp{Death to everybody} -signature and the @samp{What me?} @code{Organization} header. - -The first element in each style is called the @code{match}. If it's a -string, then Gnus will try to regexp match it against the group name. -If it is the symbol @code{header}, then Gnus will look for header (the -next element in the match) in the original article , and compare that to -the last regexp in the match. If it's a function symbol, that function -will be called with no arguments. If it's a variable symbol, then the -variable will be referenced. If it's a list, then that list will be -@code{eval}ed. In any case, if this returns a non-@code{nil} value, -then the style is said to @dfn{match}. - -Each style may contain a arbitrary amount of @dfn{attributes}. Each -attribute consists of a @code{(@var{name} @var{value})} pair. The -attribute name can be one of @code{signature}, @code{signature-file}, -@code{organization}, @code{address}, @code{name} or @code{body}. The -attribute name can also be a string. In that case, this will be used as -a header name, and the value will be inserted in the headers of the -article; if the value is @code{nil}, the header name will be removed. -If the attribute name is @code{eval}, the form is evaluated, and the -result is thrown away. - -The attribute value can be a string (used verbatim), a function with -zero arguments (the return value will be used), a variable (its value -will be used) or a list (it will be @code{eval}ed and the return value -will be used). The functions and sexps are called/@code{eval}ed in the -message buffer that is being set up. The headers of the current article -are available through the @code{message-reply-headers} variable. - -If you wish to check whether the message you are about to compose is -meant to be a news article or a mail message, you can check the values -of the @code{message-news-p} and @code{message-mail-p} functions. - -@findex message-mail-p -@findex message-news-p - -So here's a new example: - -@lisp -(setq gnus-posting-styles - '((".*" - (signature-file "~/.signature") - (name "User Name") - ("X-Home-Page" (getenv "WWW_HOME")) - (organization "People's Front Against MWM")) - ("^rec.humor" - (signature my-funny-signature-randomizer)) - ((equal (system-name) "gnarly") - (signature my-quote-randomizer)) - ((message-news-p) - (signature my-news-signature)) - (header "to" "larsi.*org" - (Organization "Somewhere, Inc.")) - ((posting-from-work-p) - (signature-file "~/.work-signature") - (address "user@@bar.foo") - (body "You are fired.\n\nSincerely, your boss.") - (organization "Important Work, Inc")) - ("nnml:.*" - (From (save-excursion - (set-buffer gnus-article-buffer) - (message-fetch-field "to")))) - ("^nn.+:" - (signature-file "~/.mail-signature")))) -@end lisp - -The @samp{nnml:.*} rule means that you use the @code{To} address as the -@code{From} address in all your outgoing replies, which might be handy -if you fill many roles. - - -@node Drafts -@section Drafts -@cindex drafts - -If you are writing a message (mail or news) and suddenly remember that -you have a steak in the oven (or some pesto in the food processor, you -craaazy vegetarians), you'll probably wish there was a method to save -the message you are writing so that you can continue editing it some -other day, and send it when you feel its finished. - -Well, don't worry about it. Whenever you start composing a message of -some sort using the gnus mail and post commands, the buffer you get will -automatically associate to an article in a special @dfn{draft} group. -If you save the buffer the normal way (@kbd{C-x C-s}, for instance), the -article will be saved there. (Auto-save files also go to the draft -group.) - -@cindex nndraft -@vindex nndraft-directory -The draft group is a special group (which is implemented as an -@code{nndraft} group, if you absolutely have to know) called -@samp{nndraft:drafts}. The variable @code{nndraft-directory} says where -@code{nndraft} is to store its files. What makes this group special is -that you can't tick any articles in it or mark any articles as -read---all articles in the group are permanently unread. - -If the group doesn't exist, it will be created and you'll be subscribed -to it. The only way to make it disappear from the Group buffer is to -unsubscribe it. - -@c @findex gnus-dissociate-buffer-from-draft -@c @kindex C-c M-d (Mail) -@c @kindex C-c M-d (Post) -@c @findex gnus-associate-buffer-with-draft -@c @kindex C-c C-d (Mail) -@c @kindex C-c C-d (Post) -@c If you're writing some super-secret message that you later want to -@c encode with PGP before sending, you may wish to turn the auto-saving -@c (and association with the draft group) off. You never know who might be -@c interested in reading all your extremely valuable and terribly horrible -@c and interesting secrets. The @kbd{C-c M-d} -@c (@code{gnus-dissociate-buffer-from-draft}) command does that for you. -@c If you change your mind and want to turn the auto-saving back on again, -@c @kbd{C-c C-d} (@code{gnus-associate-buffer-with-draft} does that. -@c -@c @vindex gnus-use-draft -@c To leave association with the draft group off by default, set -@c @code{gnus-use-draft} to @code{nil}. It is @code{t} by default. - -@findex gnus-draft-edit-message -@kindex D e (Draft) -When you want to continue editing the article, you simply enter the -draft group and push @kbd{D e} (@code{gnus-draft-edit-message}) to do -that. You will be placed in a buffer where you left off. - -Rejected articles will also be put in this draft group (@pxref{Rejected -Articles}). - -@findex gnus-draft-send-all-messages -@findex gnus-draft-send-message -If you have lots of rejected messages you want to post (or mail) without -doing further editing, you can use the @kbd{D s} command -(@code{gnus-draft-send-message}). This command understands the -process/prefix convention (@pxref{Process/Prefix}). The @kbd{D S} -command (@code{gnus-draft-send-all-messages}) will ship off all messages -in the buffer. - -If you have some messages that you wish not to send, you can use the -@kbd{D t} (@code{gnus-draft-toggle-sending}) command to mark the message -as unsendable. This is a toggling command. - - -@node Rejected Articles -@section Rejected Articles -@cindex rejected articles - -Sometimes a news server will reject an article. Perhaps the server -doesn't like your face. Perhaps it just feels miserable. Perhaps -@emph{there be demons}. Perhaps you have included too much cited text. -Perhaps the disk is full. Perhaps the server is down. - -These situations are, of course, totally beyond the control of gnus. -(Gnus, of course, loves the way you look, always feels great, has angels -fluttering around inside of it, doesn't care about how much cited text -you include, never runs full and never goes down.) So gnus saves these -articles until some later time when the server feels better. - -The rejected articles will automatically be put in a special draft group -(@pxref{Drafts}). When the server comes back up again, you'd then -typically enter that group and send all the articles off. - -@node Using GPG -@section Using GPG -@cindex using gpg - -Gnus has an ALPHA support to GPG that's provided by @file{gpg.el}. See -@code{mm-verify-option} and @code{mm-decrypt-option} to enable Gnus to -verify or decrypt messages accordingly. - -To use this correctly with GPG, you'll need the following lisp code in your -@file{~/.emacs} or @file{~/.gnus}: - -@lisp -(require 'gpg) -(setq mml2015-use 'gpg) -(setq gpg-temp-directory (expand-file-name "~/.gnupg/tmp")) -@end lisp - -The @code{gpg-temp-directory} need to point to a directory with permissions set -to 700, for your own safety. - -If you want to benefit of PGP2.6 compatibility, you might create a script named -@file{gpg-2comp} with these instructions: - -@example -#!/bin/sh -exec gpg --rfc1991 "$@@" -@end example - -If you don't want to use such compatibility, you can add the following line to -your @file{~/.emacs} or @file{~/.gnus}: - -@lisp -(setq gpg-command-default-alist (quote ((gpg . "gpg") (gpg-2comp . "gpg")))) -@end lisp - -To sign or encrypt your message you may choose to use the MML Security -menu or @kbd{C-c C-m s p} to sign your message using PGP/MIME, @kbd{C-c -C-m s s} to sign your message using S/MIME. There's also @kbd{C-c C-m c -p} to encrypt your message with PGP/MIME and @kbd{C-c C-m c s} to -encrypt using S/MIME. - -Gnus will ask for your passphrase and then it will send your message, if -you've typed it correctly. - -@node Select Methods -@chapter Select Methods -@cindex foreign groups -@cindex select methods - -A @dfn{foreign group} is a group not read by the usual (or -default) means. It could be, for instance, a group from a different -@sc{nntp} server, it could be a virtual group, or it could be your own -personal mail group. - -A foreign group (or any group, really) is specified by a @dfn{name} and -a @dfn{select method}. To take the latter first, a select method is a -list where the first element says what backend to use (e.g. @code{nntp}, -@code{nnspool}, @code{nnml}) and the second element is the @dfn{server -name}. There may be additional elements in the select method, where the -value may have special meaning for the backend in question. - -One could say that a select method defines a @dfn{virtual server}---so -we do just that (@pxref{Server Buffer}). - -The @dfn{name} of the group is the name the backend will recognize the -group as. - -For instance, the group @samp{soc.motss} on the @sc{nntp} server -@samp{some.where.edu} will have the name @samp{soc.motss} and select -method @code{(nntp "some.where.edu")}. Gnus will call this group -@samp{nntp+some.where.edu:soc.motss}, even though the @code{nntp} -backend just knows this group as @samp{soc.motss}. - -The different methods all have their peculiarities, of course. - -@menu -* Server Buffer:: Making and editing virtual servers. -* Getting News:: Reading USENET news with Gnus. -* Getting Mail:: Reading your personal mail with Gnus. -* Browsing the Web:: Getting messages from a plethora of Web sources. -* Other Sources:: Reading directories, files, SOUP packets. -* Combined Groups:: Combining groups into one group. -* Gnus Unplugged:: Reading news and mail offline. -@end menu - - -@node Server Buffer -@section Server Buffer - -Traditionally, a @dfn{server} is a machine or a piece of software that -one connects to, and then requests information from. Gnus does not -connect directly to any real servers, but does all transactions through -one backend or other. But that's just putting one layer more between -the actual media and Gnus, so we might just as well say that each -backend represents a virtual server. - -For instance, the @code{nntp} backend may be used to connect to several -different actual @sc{nntp} servers, or, perhaps, to many different ports -on the same actual @sc{nntp} server. You tell Gnus which backend to -use, and what parameters to set by specifying a @dfn{select method}. - -These select method specifications can sometimes become quite -complicated---say, for instance, that you want to read from the -@sc{nntp} server @samp{news.funet.fi} on port number 13, which -hangs if queried for @sc{nov} headers and has a buggy select. Ahem. -Anyway, if you had to specify that for each group that used this -server, that would be too much work, so Gnus offers a way of naming -select methods, which is what you do in the server buffer. - -To enter the server buffer, use the @kbd{^} -(@code{gnus-group-enter-server-mode}) command in the group buffer. - -@menu -* Server Buffer Format:: You can customize the look of this buffer. -* Server Commands:: Commands to manipulate servers. -* Example Methods:: Examples server specifications. -* Creating a Virtual Server:: An example session. -* Server Variables:: Which variables to set. -* Servers and Methods:: You can use server names as select methods. -* Unavailable Servers:: Some servers you try to contact may be down. -@end menu - -@vindex gnus-server-mode-hook -@code{gnus-server-mode-hook} is run when creating the server buffer. - - -@node Server Buffer Format -@subsection Server Buffer Format -@cindex server buffer format - -@vindex gnus-server-line-format -You can change the look of the server buffer lines by changing the -@code{gnus-server-line-format} variable. This is a @code{format}-like -variable, with some simple extensions: - -@table @samp - -@item h -How the news is fetched---the backend name. - -@item n -The name of this server. - -@item w -Where the news is to be fetched from---the address. - -@item s -The opened/closed/denied status of the server. -@end table - -@vindex gnus-server-mode-line-format -The mode line can also be customized by using the -@code{gnus-server-mode-line-format} variable (@pxref{Mode Line -Formatting}). The following specs are understood: - -@table @samp -@item S -Server name. - -@item M -Server method. -@end table - -Also @pxref{Formatting Variables}. - - -@node Server Commands -@subsection Server Commands -@cindex server commands - -@table @kbd - -@item a -@kindex a (Server) -@findex gnus-server-add-server -Add a new server (@code{gnus-server-add-server}). - -@item e -@kindex e (Server) -@findex gnus-server-edit-server -Edit a server (@code{gnus-server-edit-server}). - -@item SPACE -@kindex SPACE (Server) -@findex gnus-server-read-server -Browse the current server (@code{gnus-server-read-server}). - -@item q -@kindex q (Server) -@findex gnus-server-exit -Return to the group buffer (@code{gnus-server-exit}). - -@item k -@kindex k (Server) -@findex gnus-server-kill-server -Kill the current server (@code{gnus-server-kill-server}). - -@item y -@kindex y (Server) -@findex gnus-server-yank-server -Yank the previously killed server (@code{gnus-server-yank-server}). - -@item c -@kindex c (Server) -@findex gnus-server-copy-server -Copy the current server (@code{gnus-server-copy-server}). - -@item l -@kindex l (Server) -@findex gnus-server-list-servers -List all servers (@code{gnus-server-list-servers}). - -@item s -@kindex s (Server) -@findex gnus-server-scan-server -Request that the server scan its sources for new articles -(@code{gnus-server-scan-server}). This is mainly sensible with mail -servers. - -@item g -@kindex g (Server) -@findex gnus-server-regenerate-server -Request that the server regenerate all its data structures -(@code{gnus-server-regenerate-server}). This can be useful if you have -a mail backend that has gotten out of sync. - -@end table - - -@node Example Methods -@subsection Example Methods - -Most select methods are pretty simple and self-explanatory: - -@lisp -(nntp "news.funet.fi") -@end lisp - -Reading directly from the spool is even simpler: - -@lisp -(nnspool "") -@end lisp - -As you can see, the first element in a select method is the name of the -backend, and the second is the @dfn{address}, or @dfn{name}, if you -will. - -After these two elements, there may be an arbitrary number of -@code{(@var{variable} @var{form})} pairs. - -To go back to the first example---imagine that you want to read from -port 15 on that machine. This is what the select method should -look like then: - -@lisp -(nntp "news.funet.fi" (nntp-port-number 15)) -@end lisp - -You should read the documentation to each backend to find out what -variables are relevant, but here's an @code{nnmh} example: - -@code{nnmh} is a mail backend that reads a spool-like structure. Say -you have two structures that you wish to access: One is your private -mail spool, and the other is a public one. Here's the possible spec for -your private mail: - -@lisp -(nnmh "private" (nnmh-directory "~/private/mail/")) -@end lisp - -(This server is then called @samp{private}, but you may have guessed -that.) - -Here's the method for a public spool: - -@lisp -(nnmh "public" - (nnmh-directory "/usr/information/spool/") - (nnmh-get-new-mail nil)) -@end lisp - -@cindex proxy -@cindex firewall - -If you are behind a firewall and only have access to the @sc{nntp} -server from the firewall machine, you can instruct Gnus to @code{rlogin} -on the firewall machine and telnet from there to the @sc{nntp} server. -Doing this can be rather fiddly, but your virtual server definition -should probably look something like this: - -@lisp -(nntp "firewall" - (nntp-open-connection-function nntp-open-via-rlogin-and-telnet) - (nntp-via-address "the.firewall.machine") - (nntp-address "the.real.nntp.host") - (nntp-end-of-line "\n")) -@end lisp - -If you want to use the wonderful @code{ssh} program to provide a -compressed connection over the modem line, you could add the following -configuration to the example above: - -@lisp - (nntp-via-rlogin-command "ssh") -@end lisp - -If you're behind a firewall, but have direct access to the outside world -through a wrapper command like "runsocks", you could open a socksified -telnet connection to the news server as follows: - -@lisp -(nntp "outside" - (nntp-pre-command "runsocks") - (nntp-open-connection-function nntp-open-via-telnet) - (nntp-address "the.news.server") - (nntp-end-of-line "\n")) -@end lisp - -This means that you have to have set up @code{ssh-agent} correctly to -provide automatic authorization, of course. And to get a compressed -connection, you have to have the @samp{Compression} option in the -@code{ssh} @file{config} file. - - -@node Creating a Virtual Server -@subsection Creating a Virtual Server - -If you're saving lots of articles in the cache by using persistent -articles, you may want to create a virtual server to read the cache. - -First you need to add a new server. The @kbd{a} command does that. It -would probably be best to use @code{nnspool} to read the cache. You -could also use @code{nnml} or @code{nnmh}, though. - -Type @kbd{a nnspool RET cache RET}. - -You should now have a brand new @code{nnspool} virtual server called -@samp{cache}. You now need to edit it to have the right definitions. -Type @kbd{e} to edit the server. You'll be entered into a buffer that -will contain the following: - -@lisp -(nnspool "cache") -@end lisp - -Change that to: - -@lisp -(nnspool "cache" - (nnspool-spool-directory "~/News/cache/") - (nnspool-nov-directory "~/News/cache/") - (nnspool-active-file "~/News/cache/active")) -@end lisp - -Type @kbd{C-c C-c} to return to the server buffer. If you now press -@kbd{RET} over this virtual server, you should be entered into a browse -buffer, and you should be able to enter any of the groups displayed. - - -@node Server Variables -@subsection Server Variables - -One sticky point when defining variables (both on backends and in Emacs -in general) is that some variables are typically initialized from other -variables when the definition of the variables is being loaded. If you -change the "base" variable after the variables have been loaded, you -won't change the "derived" variables. - -This typically affects directory and file variables. For instance, -@code{nnml-directory} is @file{~/Mail/} by default, and all @code{nnml} -directory variables are initialized from that variable, so -@code{nnml-active-file} will be @file{~/Mail/active}. If you define a -new virtual @code{nnml} server, it will @emph{not} suffice to set just -@code{nnml-directory}---you have to explicitly set all the file -variables to be what you want them to be. For a complete list of -variables for each backend, see each backend's section later in this -manual, but here's an example @code{nnml} definition: - -@lisp -(nnml "public" - (nnml-directory "~/my-mail/") - (nnml-active-file "~/my-mail/active") - (nnml-newsgroups-file "~/my-mail/newsgroups")) -@end lisp - - -@node Servers and Methods -@subsection Servers and Methods - -Wherever you would normally use a select method -(e.g. @code{gnus-secondary-select-method}, in the group select method, -when browsing a foreign server) you can use a virtual server name -instead. This could potentially save lots of typing. And it's nice all -over. - - -@node Unavailable Servers -@subsection Unavailable Servers - -If a server seems to be unreachable, Gnus will mark that server as -@code{denied}. That means that any subsequent attempt to make contact -with that server will just be ignored. ``It can't be opened,'' Gnus -will tell you, without making the least effort to see whether that is -actually the case or not. - -That might seem quite naughty, but it does make sense most of the time. -Let's say you have 10 groups subscribed to on server -@samp{nephelococcygia.com}. This server is located somewhere quite far -away from you and the machine is quite slow, so it takes 1 minute just -to find out that it refuses connection to you today. If Gnus were to -attempt to do that 10 times, you'd be quite annoyed, so Gnus won't -attempt to do that. Once it has gotten a single ``connection refused'', -it will regard that server as ``down''. - -So, what happens if the machine was only feeling unwell temporarily? -How do you test to see whether the machine has come up again? - -You jump to the server buffer (@pxref{Server Buffer}) and poke it -with the following commands: - -@table @kbd - -@item O -@kindex O (Server) -@findex gnus-server-open-server -Try to establish connection to the server on the current line -(@code{gnus-server-open-server}). - -@item C -@kindex C (Server) -@findex gnus-server-close-server -Close the connection (if any) to the server -(@code{gnus-server-close-server}). - -@item D -@kindex D (Server) -@findex gnus-server-deny-server -Mark the current server as unreachable -(@code{gnus-server-deny-server}). - -@item M-o -@kindex M-o (Server) -@findex gnus-server-open-all-servers -Open the connections to all servers in the buffer -(@code{gnus-server-open-all-servers}). - -@item M-c -@kindex M-c (Server) -@findex gnus-server-close-all-servers -Close the connections to all servers in the buffer -(@code{gnus-server-close-all-servers}). - -@item R -@kindex R (Server) -@findex gnus-server-remove-denials -Remove all marks to whether Gnus was denied connection from any servers -(@code{gnus-server-remove-denials}). - -@end table - - -@node Getting News -@section Getting News -@cindex reading news -@cindex news backends - -A newsreader is normally used for reading news. Gnus currently provides -only two methods of getting news---it can read from an @sc{nntp} server, -or it can read from a local spool. - -@menu -* NNTP:: Reading news from an @sc{nntp} server. -* News Spool:: Reading news from the local spool. -@end menu - - -@node NNTP -@subsection @sc{nntp} -@cindex nntp - -Subscribing to a foreign group from an @sc{nntp} server is rather easy. -You just specify @code{nntp} as method and the address of the @sc{nntp} -server as the, uhm, address. - -If the @sc{nntp} server is located at a non-standard port, setting the -third element of the select method to this port number should allow you -to connect to the right port. You'll have to edit the group info for -that (@pxref{Foreign Groups}). - -The name of the foreign group can be the same as a native group. In -fact, you can subscribe to the same group from as many different servers -you feel like. There will be no name collisions. - -The following variables can be used to create a virtual @code{nntp} -server: - -@table @code - -@item nntp-server-opened-hook -@vindex nntp-server-opened-hook -@cindex @sc{mode reader} -@cindex authinfo -@cindex authentification -@cindex nntp authentification -@findex nntp-send-authinfo -@findex nntp-send-mode-reader -is run after a connection has been made. It can be used to send -commands to the @sc{nntp} server after it has been contacted. By -default it sends the command @code{MODE READER} to the server with the -@code{nntp-send-mode-reader} function. This function should always be -present in this hook. - -@item nntp-authinfo-function -@vindex nntp-authinfo-function -@findex nntp-send-authinfo -@vindex nntp-authinfo-file -This function will be used to send @samp{AUTHINFO} to the @sc{nntp} -server. The default function is @code{nntp-send-authinfo}, which looks -through your @file{~/.authinfo} (or whatever you've set the -@code{nntp-authinfo-file} variable to) for applicable entries. If none -are found, it will prompt you for a login name and a password. The -format of the @file{~/.authinfo} file is (almost) the same as the -@code{ftp} @file{~/.netrc} file, which is defined in the @code{ftp} -manual page, but here are the salient facts: - -@enumerate -@item -The file contains one or more line, each of which define one server. - -@item -Each line may contain an arbitrary number of token/value pairs. - -The valid tokens include @samp{machine}, @samp{login}, @samp{password}, -@samp{default}. In addition Gnus introduces two new tokens, not present -in the original @file{.netrc}/@code{ftp} syntax, namely @samp{port} and -@samp{force}. (This is the only way the @file{.authinfo} file format -deviates from the @file{.netrc} file format.) @samp{port} is used to -indicate what port on the server the credentials apply to and -@samp{force} is explained below. - -@end enumerate - -Here's an example file: - -@example -machine news.uio.no login larsi password geheimnis -machine nntp.ifi.uio.no login larsi force yes -@end example - -The token/value pairs may appear in any order; @samp{machine} doesn't -have to be first, for instance. - -In this example, both login name and password have been supplied for the -former server, while the latter has only the login name listed, and the -user will be prompted for the password. The latter also has the -@samp{force} tag, which means that the authinfo will be sent to the -@var{nntp} server upon connection; the default (i.e., when there is not -@samp{force} tag) is to not send authinfo to the @var{nntp} server -until the @var{nntp} server asks for it. - -You can also add @samp{default} lines that will apply to all servers -that don't have matching @samp{machine} lines. - -@example -default force yes -@end example - -This will force sending @samp{AUTHINFO} commands to all servers not -previously mentioned. - -Remember to not leave the @file{~/.authinfo} file world-readable. - -@item nntp-server-action-alist -@vindex nntp-server-action-alist -This is a list of regexps to match on server types and actions to be -taken when matches are made. For instance, if you want Gnus to beep -every time you connect to innd, you could say something like: - -@lisp -(setq nntp-server-action-alist - '(("innd" (ding)))) -@end lisp - -You probably don't want to do that, though. - -The default value is - -@lisp -'(("nntpd 1\\.5\\.11t" - (remove-hook 'nntp-server-opened-hook - 'nntp-send-mode-reader))) -@end lisp - -This ensures that Gnus doesn't send the @code{MODE READER} command to -nntpd 1.5.11t, since that command chokes that server, I've been told. - -@item nntp-maximum-request -@vindex nntp-maximum-request -If the @sc{nntp} server doesn't support @sc{nov} headers, this backend -will collect headers by sending a series of @code{head} commands. To -speed things up, the backend sends lots of these commands without -waiting for reply, and then reads all the replies. This is controlled -by the @code{nntp-maximum-request} variable, and is 400 by default. If -your network is buggy, you should set this to 1. - -@item nntp-connection-timeout -@vindex nntp-connection-timeout -If you have lots of foreign @code{nntp} groups that you connect to -regularly, you're sure to have problems with @sc{nntp} servers not -responding properly, or being too loaded to reply within reasonable -time. This is can lead to awkward problems, which can be helped -somewhat by setting @code{nntp-connection-timeout}. This is an integer -that says how many seconds the @code{nntp} backend should wait for a -connection before giving up. If it is @code{nil}, which is the default, -no timeouts are done. - -@c @item nntp-command-timeout -@c @vindex nntp-command-timeout -@c @cindex PPP connections -@c @cindex dynamic IP addresses -@c If you're running Gnus on a machine that has a dynamically assigned -@c address, Gnus may become confused. If the address of your machine -@c changes after connecting to the @sc{nntp} server, Gnus will simply sit -@c waiting forever for replies from the server. To help with this -@c unfortunate problem, you can set this command to a number. Gnus will -@c then, if it sits waiting for a reply from the server longer than that -@c number of seconds, shut down the connection, start a new one, and resend -@c the command. This should hopefully be transparent to the user. A -@c likely number is 30 seconds. -@c -@c @item nntp-retry-on-break -@c @vindex nntp-retry-on-break -@c If this variable is non-@code{nil}, you can also @kbd{C-g} if Gnus -@c hangs. This will have much the same effect as the command timeout -@c described above. - -@item nntp-server-hook -@vindex nntp-server-hook -This hook is run as the last step when connecting to an @sc{nntp} -server. - -@item nntp-buggy-select -@vindex nntp-buggy-select -Set this to non-@code{nil} if your select routine is buggy. - -@item nntp-nov-is-evil -@vindex nntp-nov-is-evil -If the @sc{nntp} server does not support @sc{nov}, you could set this -variable to @code{t}, but @code{nntp} usually checks automatically whether @sc{nov} -can be used. - -@item nntp-xover-commands -@vindex nntp-xover-commands -@cindex nov -@cindex XOVER -List of strings used as commands to fetch @sc{nov} lines from a -server. The default value of this variable is @code{("XOVER" -"XOVERVIEW")}. - -@item nntp-nov-gap -@vindex nntp-nov-gap -@code{nntp} normally sends just one big request for @sc{nov} lines to -the server. The server responds with one huge list of lines. However, -if you have read articles 2-5000 in the group, and only want to read -article 1 and 5001, that means that @code{nntp} will fetch 4999 @sc{nov} -lines that you will not need. This variable says how -big a gap between two consecutive articles is allowed to be before the -@code{XOVER} request is split into several request. Note that if your -network is fast, setting this variable to a really small number means -that fetching will probably be slower. If this variable is @code{nil}, -@code{nntp} will never split requests. The default is 5. - -@item nntp-prepare-server-hook -@vindex nntp-prepare-server-hook -A hook run before attempting to connect to an @sc{nntp} server. - -@item nntp-warn-about-losing-connection -@vindex nntp-warn-about-losing-connection -If this variable is non-@code{nil}, some noise will be made when a -server closes connection. - -@item nntp-record-commands -@vindex nntp-record-commands -If non-@code{nil}, @code{nntp} will log all commands it sends to the -@sc{nntp} server (along with a timestamp) in the @samp{*nntp-log*} -buffer. This is useful if you are debugging a Gnus/@sc{nntp} connection -that doesn't seem to work. - -@item nntp-open-connection-function -@vindex nntp-open-connection-function -It is possible to customize how the connection to the nntp server will -be opened. If you specify an @code{nntp-open-connection-function} -parameter, Gnus will use that function to establish the connection. -Five pre-made functions are supplied. These functions can be grouped in -two categories: direct connection functions (three pre-made), and -indirect ones (two pre-made). - -@item nntp-list-options -@vindex nntp-list-options -List of newsgroup name used for a option of the LIST command to restrict -the listing output to only the specified newsgroups. Each newsgroup name -can be a shell-style wildcard, for instance, @dfn{fj.*}, @dfn{japan.*}, -etc. Fortunately, if the server can accept such a option, it will -probably make gnus run faster. You may use it as a server variable as -follows: - -@lisp -(setq gnus-select-method - '(nntp "news.somewhere.edu" - (nntp-list-options ("fj.*" "japan.*")))) -@end lisp - -@item nntp-options-subscribe -@vindex nntp-options-subscribe -Regexp matching the newsgroup names which will be subscribed -unconditionally. Use @dfn{ } instead of @dfn{$} for a regexp string. -It may be effective as well as @code{nntp-list-options} even though the -server could not accept a shell-style wildcard as a option of the LIST -command. You may use it as a server variable as follows: - -@lisp -(setq gnus-select-method - '(nntp "news.somewhere.edu" - (nntp-options-subscribe "^fj\\.\\|^japan\\."))) -@end lisp - -@item nntp-options-not-subscribe -@vindex nntp-options-not-subscribe -Regexp matching the newsgroup names which will not be subscribed -unconditionally. Use @dfn{ } instead of @dfn{$} for a regexp string. -It may be effective as well as @code{nntp-list-options} even though the -server could not accept a shell-style wildcard as a option of the LIST -command. You may use it as a server variable as follows: - -@lisp -(setq gnus-select-method - '(nntp "news.somewhere.edu" - (nntp-options-not-subscribe "\\.binaries\\."))) -@end lisp -@end table - -@menu -* Direct Functions:: Connecting directly to the server. -* Indirect Functions:: Connecting indirectly to the server. -* Common Variables:: Understood by several connection functions. -@end menu - - -@node Direct Functions -@subsubsection Direct Functions -@cindex direct connection functions - -These functions are called direct because they open a direct connection -between your machine and the @sc{nntp} server. The behavior of these -functions is also affected by commonly understood variables -(@pxref{Common Variables}). - -@table @code -@findex nntp-open-network-stream -@item nntp-open-network-stream -This is the default, and simply connects to some port or other on the -remote system. - -@findex nntp-open-ssl-stream -@item nntp-open-ssl-stream -Opens a connection to a server over a @dfn{secure} channel. To use this -you must have SSLay installed -(@uref{ftp://ftp.psy.uq.oz.au/pub/Crypto/SSL}, and you also need -@file{ssl.el} (from the W3 distribution, for instance). You then -define a server as follows: - -@lisp -;; Type `C-c C-c' after you've finished editing. -;; -;; "snews" is port 563 and is predefined in our /etc/services -;; -(nntp "snews.bar.com" - (nntp-open-connection-function nntp-open-ssl-stream) - (nntp-port-number "snews") - (nntp-address "snews.bar.com")) -@end lisp - -@findex nntp-open-telnet-stream -@item nntp-open-telnet-stream -Opens a connection to an @sc{nntp} server by simply @samp{telnet}'ing -it. You might wonder why this function exists, since we have the -default @code{nntp-open-network-stream} which would do the job. (One -of) the reason(s) is that if you are behind a firewall but have direct -connections to the outside world thanks to a command wrapper like -@code{runsocks}, you can use it like this: - -@lisp -(nntp "socksified" - (nntp-pre-command "runsocks") - (nntp-open-connection-function nntp-open-telnet-stream) - (nntp-address "the.news.server")) -@end lisp - -With the default method, you would need to wrap your whole Emacs -session, which is not a good idea. -@end table - - -@node Indirect Functions -@subsubsection Indirect Functions -@cindex indirect connection functions - -These functions are called indirect because they connect to an -intermediate host before actually connecting to the @sc{nntp} server. -All of these functions and related variables are also said to belong to -the "via" family of connection: they're all prefixed with "via" to make -things cleaner. The behavior of these functions is also affected by -commonly understood variables (@pxref{Common Variables}). - -@table @code -@item nntp-open-via-rlogin-and-telnet -@findex nntp-open-via-rlogin-and-telnet -Does an @samp{rlogin} on a remote system, and then does a @samp{telnet} -to the real @sc{nntp} server from there. This is useful for instance if -you need to connect to a firewall machine first. - -@code{nntp-open-via-rlogin-and-telnet}-specific variables: - -@table @code -@item nntp-via-rlogin-command -@vindex nntp-via-rlogin-command -Command used to log in on the intermediate host. The default is -@samp{rsh}, but @samp{ssh} is a popular alternative. -@end table - -@item nntp-open-via-telnet-and-telnet -@findex nntp-open-via-telnet-and-telnet -Does essentially the same, but uses @samp{telnet} instead of -@samp{rlogin} to connect to the intermediate host. - -@code{nntp-open-via-telnet-and-telnet}-specific variables: - -@table @code -@item nntp-via-telnet-command -@vindex nntp-via-telnet-command -Command used to @code{telnet} the intermediate host. The default is -@samp{telnet}. - -@item nntp-via-telnet-switches -@vindex nntp-via-telnet-switches -List of strings to be used as the switches to the -@code{nntp-via-telnet-command} command. The default is @samp{("-8")}. - -@item nntp-via-user-password -@vindex nntp-via-user-password -Password to use when logging in on the intermediate host. - -@item nntp-via-envuser -@vindex nntp-via-envuser -If non-@code{nil}, the intermediate @code{telnet} session (client and -server both) will support the @code{ENVIRON} option and not prompt for -login name. This works for Solaris @code{telnet}, for instance. - -@item nntp-via-shell-prompt -@vindex nntp-via-shell-prompt -Regexp matching the shell prompt on the intermediate host. The default -is @samp{bash\\|\$ *\r?$\\|> *\r?}. - -@end table - -@end table - - -Here are some additional variables that are understood by all the above -functions: - -@table @code - -@item nntp-via-user-name -@vindex nntp-via-user-name -User name to use when connecting to the intermediate host. - -@item nntp-via-address -@vindex nntp-via-address -Address of the intermediate host to connect to. - -@end table - - -@node Common Variables -@subsubsection Common Variables - -The following variables affect the behavior of all, or several of the -pre-made connection functions. When not specified, all functions are -affected. - -@table @code - -@item nntp-pre-command -@vindex nntp-pre-command -A command wrapper to use when connecting through a non native connection -function (all except @code{nntp-open-network-stream} and -@code{nntp-open-ssl-stream}. This is where you would put a @samp{SOCKS} -wrapper for instance. - -@item nntp-address -@vindex nntp-address -The address of the @sc{nntp} server. - -@item nntp-port-number -@vindex nntp-port-number -Port number to connect to the @sc{nntp} server. The default is @samp{nntp}. - -@item nntp-end-of-line -@vindex nntp-end-of-line -String to use as end-of-line marker when talking to the @sc{nntp} -server. This is @samp{\r\n} by default, but should be @samp{\n} when -using a non native connection function. - -@item nntp-telnet-command -@vindex nntp-telnet-command -Command to use when connecting to the @sc{nntp} server through -@samp{telnet}. This is NOT for an intermediate host. This is just for -the real @sc{nntp} server. The default is @samp{telnet}. - -@item nntp-telnet-switches -@vindex nntp-telnet-switches -A list of switches to pass to @code{nntp-telnet-command}. The default -is @samp{("-8")}. - -@end table - - -@node News Spool -@subsection News Spool -@cindex nnspool -@cindex news spool - -Subscribing to a foreign group from the local spool is extremely easy, -and might be useful, for instance, to speed up reading groups that -contain very big articles---@samp{alt.binaries.pictures.furniture}, for -instance. - -Anyway, you just specify @code{nnspool} as the method and @code{""} (or -anything else) as the address. - -If you have access to a local spool, you should probably use that as the -native select method (@pxref{Finding the News}). It is normally faster -than using an @code{nntp} select method, but might not be. It depends. -You just have to try to find out what's best at your site. - -@table @code - -@item nnspool-inews-program -@vindex nnspool-inews-program -Program used to post an article. - -@item nnspool-inews-switches -@vindex nnspool-inews-switches -Parameters given to the inews program when posting an article. - -@item nnspool-spool-directory -@vindex nnspool-spool-directory -Where @code{nnspool} looks for the articles. This is normally -@file{/usr/spool/news/}. - -@item nnspool-nov-directory -@vindex nnspool-nov-directory -Where @code{nnspool} will look for @sc{nov} files. This is normally -@file{/usr/spool/news/over.view/}. - -@item nnspool-lib-dir -@vindex nnspool-lib-dir -Where the news lib dir is (@file{/usr/lib/news/} by default). - -@item nnspool-active-file -@vindex nnspool-active-file -The path to the active file. - -@item nnspool-newsgroups-file -@vindex nnspool-newsgroups-file -The path to the group descriptions file. - -@item nnspool-history-file -@vindex nnspool-history-file -The path to the news history file. - -@item nnspool-active-times-file -@vindex nnspool-active-times-file -The path to the active date file. - -@item nnspool-nov-is-evil -@vindex nnspool-nov-is-evil -If non-@code{nil}, @code{nnspool} won't try to use any @sc{nov} files -that it finds. - -@item nnspool-sift-nov-with-sed -@vindex nnspool-sift-nov-with-sed -@cindex sed -If non-@code{nil}, which is the default, use @code{sed} to get the -relevant portion from the overview file. If nil, @code{nnspool} will -load the entire file into a buffer and process it there. - -@end table - - -@node Getting Mail -@section Getting Mail -@cindex reading mail -@cindex mail - -Reading mail with a newsreader---isn't that just plain WeIrD? But of -course. - -@menu -* Mail in a Newsreader:: Important introductory notes. -* Getting Started Reading Mail:: A simple cookbook example. -* Splitting Mail:: How to create mail groups. -* Mail Sources:: How to tell Gnus where to get mail from. -* Mail Backend Variables:: Variables for customizing mail handling. -* Fancy Mail Splitting:: Gnus can do hairy splitting of incoming mail. -* Group Mail Splitting:: Use group customize to drive mail splitting. -* Incorporating Old Mail:: What about the old mail you have? -* Expiring Mail:: Getting rid of unwanted mail. -* Washing Mail:: Removing gruft from the mail you get. -* Duplicates:: Dealing with duplicated mail. -* Not Reading Mail:: Using mail backends for reading other files. -* Choosing a Mail Backend:: Gnus can read a variety of mail formats. -* Archiving Mail:: How to backup your mail. -@end menu - - -@node Mail in a Newsreader -@subsection Mail in a Newsreader - -If you are used to traditional mail readers, but have decided to switch -to reading mail with Gnus, you may find yourself experiencing something -of a culture shock. - -Gnus does not behave like traditional mail readers. If you want to make -it behave that way, you can, but it's an uphill battle. - -Gnus, by default, handles all its groups using the same approach. This -approach is very newsreaderly---you enter a group, see the new/unread -messages, and when you read the messages, they get marked as read, and -you don't see them any more. (Unless you explicitly ask for them.) - -In particular, you do not do anything explicitly to delete messages. - -Does this mean that all the messages that have been marked as read are -deleted? How awful! - -But, no, it means that old messages are @dfn{expired} according to some -scheme or other. For news messages, the expire process is controlled by -the news administrator; for mail, the expire process is controlled by -you. The expire process for mail is covered in depth in @pxref{Expiring -Mail}. - -What many Gnus users find, after using it a while for both news and -mail, is that the transport mechanism has very little to do with how -they want to treat a message. - -Many people subscribe to several mailing lists. These are transported -via SMTP, and are therefore mail. But we might go for weeks without -answering, or even reading these messages very carefully. We may not -need to save them because if we should need to read one again, they are -archived somewhere else. - -Some people have local news groups which have only a handful of readers. -These are transported via @sc{nntp}, and are therefore news. But we may need -to read and answer a large fraction of the messages very carefully in -order to do our work. And there may not be an archive, so we may need -to save the interesting messages the same way we would personal mail. - -The important distinction turns out to be not the transport mechanism, -but other factors such as how interested we are in the subject matter, -or how easy it is to retrieve the message if we need to read it again. - -Gnus provides many options for sorting mail into ``groups'' which behave -like newsgroups, and for treating each group (whether mail or news) -differently. - -Some users never get comfortable using the Gnus (ahem) paradigm and wish -that Gnus should grow up and be a male, er, mail reader. It is possible -to whip Gnus into a more mailreaderly being, but, as said before, it's -not easy. People who prefer proper mail readers should try @sc{vm} -instead, which is an excellent, and proper, mail reader. - -I don't mean to scare anybody off, but I want to make it clear that you -may be required to learn a new way of thinking about messages. After -you've been subjected to The Gnus Way, you will come to love it. I can -guarantee it. (At least the guy who sold me the Emacs Subliminal -Brain-Washing Functions that I've put into Gnus did guarantee it. You -Will Be Assimilated. You Love Gnus. You Love The Gnus Mail Way. -You Do.) - - -@node Getting Started Reading Mail -@subsection Getting Started Reading Mail - -It's quite easy to use Gnus to read your new mail. You just plonk the -mail backend of your choice into @code{gnus-secondary-select-methods}, -and things will happen automatically. - -For instance, if you want to use @code{nnml} (which is a "one file per -mail" backend), you could put the following in your @file{.gnus} file: - -@lisp -(setq gnus-secondary-select-methods '((nnml ""))) -@end lisp - -Now, the next time you start Gnus, this backend will be queried for new -articles, and it will move all the messages in your spool file to its -directory, which is @code{~/Mail/} by default. The new group that will -be created (@samp{mail.misc}) will be subscribed, and you can read it -like any other group. - -You will probably want to split the mail into several groups, though: - -@lisp -(setq nnmail-split-methods - '(("junk" "^From:.*Lars Ingebrigtsen") - ("crazy" "^Subject:.*die\\|^Organization:.*flabby") - ("other" ""))) -@end lisp - -This will result in three new @code{nnml} mail groups being created: -@samp{nnml:junk}, @samp{nnml:crazy}, and @samp{nnml:other}. All the -mail that doesn't fit into the first two groups will be placed in the -last group. - -This should be sufficient for reading mail with Gnus. You might want to -give the other sections in this part of the manual a perusal, though. -Especially @pxref{Choosing a Mail Backend} and @pxref{Expiring Mail}. - - -@node Splitting Mail -@subsection Splitting Mail -@cindex splitting mail -@cindex mail splitting - -@vindex nnmail-split-methods -The @code{nnmail-split-methods} variable says how the incoming mail is -to be split into groups. - -@lisp -(setq nnmail-split-methods - '(("mail.junk" "^From:.*Lars Ingebrigtsen") - ("mail.crazy" "^Subject:.*die\\|^Organization:.*flabby") - ("mail.other" ""))) -@end lisp - -This variable is a list of lists, where the first element of each of -these lists is the name of the mail group (they do not have to be called -something beginning with @samp{mail}, by the way), and the second -element is a regular expression used on the header of each mail to -determine if it belongs in this mail group. The first string may -contain @samp{\\1} forms, like the ones used by @code{replace-match} to -insert sub-expressions from the matched text. For instance: - -@lisp -("list.\\1" "From:.* \\(.*\\)-list@@majordomo.com") -@end lisp - -The second element can also be a function. In that case, it will be -called narrowed to the headers with the first element of the rule as the -argument. It should return a non-@code{nil} value if it thinks that the -mail belongs in that group. - -The last of these groups should always be a general one, and the regular -expression should @emph{always} be @samp{} so that it matches any mails -that haven't been matched by any of the other regexps. (These rules are -processed from the beginning of the alist toward the end. The first -rule to make a match will "win", unless you have crossposting enabled. -In that case, all matching rules will "win".) - -If you like to tinker with this yourself, you can set this variable to a -function of your choice. This function will be called without any -arguments in a buffer narrowed to the headers of an incoming mail -message. The function should return a list of group names that it -thinks should carry this mail message. - -Note that the mail backends are free to maul the poor, innocent, -incoming headers all they want to. They all add @code{Lines} headers; -some add @code{X-Gnus-Group} headers; most rename the Unix mbox -@code{From} line to something else. - -@vindex nnmail-crosspost -The mail backends all support cross-posting. If several regexps match, -the mail will be ``cross-posted'' to all those groups. -@code{nnmail-crosspost} says whether to use this mechanism or not. Note -that no articles are crossposted to the general (@samp{}) group. - -@vindex nnmail-crosspost-link-function -@cindex crosspost -@cindex links -@code{nnmh} and @code{nnml} makes crossposts by creating hard links to -the crossposted articles. However, not all file systems support hard -links. If that's the case for you, set -@code{nnmail-crosspost-link-function} to @code{copy-file}. (This -variable is @code{add-name-to-file} by default.) - -@kindex M-x nnmail-split-history -@kindex nnmail-split-history -If you wish to see where the previous mail split put the messages, you -can use the @kbd{M-x nnmail-split-history} command. If you wish to see -where re-spooling messages would put the messages, you can use -@code{gnus-summary-respool-trace} and related commands (@pxref{Mail -Group Commands}). - -Gnus gives you all the opportunity you could possibly want for shooting -yourself in the foot. Let's say you create a group that will contain -all the mail you get from your boss. And then you accidentally -unsubscribe from the group. Gnus will still put all the mail from your -boss in the unsubscribed group, and so, when your boss mails you ``Have -that report ready by Monday or you're fired!'', you'll never see it and, -come Tuesday, you'll still believe that you're gainfully employed while -you really should be out collecting empty bottles to save up for next -month's rent money. - - -@node Mail Sources -@subsection Mail Sources - -Mail can be gotten from many different sources---the mail spool, from a -POP mail server, from a procmail directory, or from a maildir, for -instance. - -@menu -* Mail Source Specifiers:: How to specify what a mail source is. -* Mail Source Customization:: Some variables that influence things. -* Fetching Mail:: Using the mail source specifiers. -@end menu - - -@node Mail Source Specifiers -@subsubsection Mail Source Specifiers -@cindex POP -@cindex mail server -@cindex procmail -@cindex mail spool -@cindex mail source - -You tell Gnus how to fetch mail by setting @code{mail-sources} -(@pxref{Fetching Mail}) to a @dfn{mail source specifier}. - -Here's an example: - -@lisp -(pop :server "pop3.mailserver.com" :user "myname") -@end lisp - -As can be observed, a mail source specifier is a list where the first -element is a @dfn{mail source type}, followed by an arbitrary number of -@dfn{keywords}. Keywords that are not explicitly specified are given -default values. - -The following mail source types are available: - -@table @code -@item file -Get mail from a single file; typically from the mail spool. - -Keywords: - -@table @code -@item :path -The path of the file. Defaults to the value of the @code{MAIL} -environment variable or @file{/usr/mail/spool/user-name}. -@end table - -An example file mail source: - -@lisp -(file :path "/usr/spool/mail/user-name") -@end lisp - -Or using the default path: - -@lisp -(file) -@end lisp - -If the mail spool file is not located on the local machine, it's best to -use POP or @sc{imap} or the like to fetch the mail. You can not use ange-ftp -file names here---it has no way to lock the mail spool while moving the -mail. - -If it's impossible to set up a proper server, you can use ssh instead. - -@lisp -(setq mail-sources - '((file :prescript "ssh host bin/getmail >%t"))) -@end lisp - -The @samp{getmail} script would look something like the following: - -@example -#!/bin/sh -# getmail - move mail from spool to stdout -# flu@@iki.fi - -MOVEMAIL=/usr/lib/emacs/20.3/i386-redhat-linux/movemail -TMP=$HOME/Mail/tmp -rm -f $TMP; $MOVEMAIL $MAIL $TMP >/dev/null && cat $TMP -@end example - -Alter this script to fit find the @samp{movemail} you want to use. - - -@item directory -Get mail from several files in a directory. This is typically used when -you have procmail split the incoming mail into several files. Setting -@code{nnmail-scan-directory-mail-source-once} to non-nil forces Gnus to -scan the mail source only once. This is particularly useful if you want -to scan mail groups at a specified level. - -Keywords: - -@table @code -@item :path -The path of the directory where the files are. There is no default -value. - -@item :suffix -Only files ending with this suffix are used. The default is -@samp{.spool}. - -@item :predicate -Only files that have this predicate return non-@code{nil} are returned. -The default is @code{identity}. This is used as an additional -filter---only files that have the right suffix @emph{and} satisfy this -predicate are considered. - -@item :prescript -@itemx :postscript -Script run before/after fetching mail. - -@end table - -An example directory mail source: - -@lisp -(directory :path "/home/user-name/procmail-dir/" - :suffix ".prcml") -@end lisp - -@item pop -Get mail from a POP server. - -Keywords: - -@table @code -@item :server -The name of the POP server. The default is taken from the -@code{MAILHOST} environment variable. - -@item :port -The port number of the POP server. This can be a number (eg, -@samp{:port 1234}) or a string (eg, @samp{:port "pop3"}). If it is a -string, it should be a service name as listed in @file{/etc/services} on -Unix systems. The default is @samp{"pop3"}. On some systems you might -need to specify it as @samp{"pop-3"} instead. - -@item :user -The user name to give to the POP server. The default is the login -name. - -@item :password -The password to give to the POP server. If not specified, the user is -prompted. - -@item :program -The program to use to fetch mail from the POP server. This should be -a @code{format}-like string. Here's an example: - -@example -fetchmail %u@@%s -P %p %t -@end example - -The valid format specifier characters are: - -@table @samp -@item t -The name of the file the mail is to be moved to. This must always be -included in this string. - -@item s -The name of the server. - -@item P -The port number of the server. - -@item u -The user name to use. - -@item p -The password to use. -@end table - -The values used for these specs are taken from the values you give the -corresponding keywords. - -@item :prescript -A script to be run before fetching the mail. The syntax is the same as -the @code{:program} keyword. This can also be a function to be run. - -@item :postscript -A script to be run after fetching the mail. The syntax is the same as -the @code{:program} keyword. This can also be a function to be run. - -@item :function -The function to use to fetch mail from the POP server. The function is -called with one parameter---the name of the file where the mail should -be moved to. - -@item :authentication -This can be either the symbol @code{password} or the symbol @code{apop} -and says what authentication scheme to use. The default is -@code{password}. - -@end table - -If the @code{:program} and @code{:function} keywords aren't specified, -@code{pop3-movemail} will be used. - -Here are some examples. Fetch from the default POP server, using the -default user name, and default fetcher: - -@lisp -(pop) -@end lisp - -Fetch from a named server with a named user and password: - -@lisp -(pop :server "my.pop.server" - :user "user-name" :password "secret") -@end lisp - -Use @samp{movemail} to move the mail: - -@lisp -(pop :program "movemail po:%u %t %p") -@end lisp - -@item maildir -Get mail from a maildir. This is a type of mailbox that is supported by -at least qmail and postfix, where each file in a special directory -contains exactly one mail. - -Keywords: - -@table @code -@item :path -The path of the directory where the mails are stored. The default is -taken from the @code{MAILDIR} environment variable or -@samp{~/Maildir/}. -@item :subdirs -The subdirectories of the Maildir. The default is -@samp{("new" "cur")}. - -@c If you sometimes look at your mail through a pop3 daemon before fetching -@c them with Gnus, you may also have to fetch your mails from the -@c @code{cur} directory inside the maildir, like in the first example -@c below. - -You can also get mails from remote hosts (because maildirs don't suffer -from locking problems). - -@end table - -Two example maildir mail sources: - -@lisp -(maildir :path "/home/user-name/Maildir/" - :subdirs ("cur" "new")) -@end lisp - -@lisp -(maildir :path "/user@@remotehost.org:~/Maildir/" - :subdirs ("new")) -@end lisp - -@item imap -Get mail from a @sc{imap} server. If you don't want to use @sc{imap} -as intended, as a network mail reading protocol (ie with nnimap), for -some reason or other, Gnus let you treat it similar to a POP server -and fetches articles from a given @sc{imap} mailbox. @xref{IMAP}, for -more information. - -Keywords: - -@table @code -@item :server -The name of the @sc{imap} server. The default is taken from the -@code{MAILHOST} environment variable. - -@item :port -The port number of the @sc{imap} server. The default is @samp{143}, or -@samp{993} for SSL connections. - -@item :user -The user name to give to the @sc{imap} server. The default is the login -name. - -@item :password -The password to give to the @sc{imap} server. If not specified, the user is -prompted. - -@item :stream -What stream to use for connecting to the server, this is one of the -symbols in @code{imap-stream-alist}. Right now, this means -@samp{kerberos4}, @samp{ssl} or the default @samp{network}. - -@item :authentication -Which authenticator to use for authenticating to the server, this is one -of the symbols in @code{imap-authenticator-alist}. Right now, this -means @samp{kerberos4}, @samp{cram-md5}, @samp{anonymous} or the default -@samp{login}. - -@item :program -When using the `shell' :stream, the contents of this variable is -mapped into the `imap-shell-program' variable. This should be a -@code{format}-like string (or list of strings). Here's an example: - -@example -ssh %s imapd -@end example - -The valid format specifier characters are: - -@table @samp -@item s -The name of the server. - -@item l -User name from `imap-default-user'. - -@item p -The port number of the server. -@end table - -The values used for these specs are taken from the values you give the -corresponding keywords. - -@item :mailbox -The name of the mailbox to get mail from. The default is @samp{INBOX} -which normally is the mailbox which receive incoming mail. - -@item :predicate -The predicate used to find articles to fetch. The default, @samp{UNSEEN -UNDELETED}, is probably the best choice for most people, but if you -sometimes peek in your mailbox with a @sc{imap} client and mark some -articles as read (or; SEEN) you might want to set this to @samp{nil}. -Then all articles in the mailbox is fetched, no matter what. For a -complete list of predicates, see RFC 2060 §6.4.4. - -@item :fetchflag -How to flag fetched articles on the server, the default @samp{\Deleted} -will mark them as deleted, an alternative would be @samp{\Seen} which -would simply mark them as read. These are the two most likely choices, -but more flags are defined in RFC 2060 §2.3.2. - -@item :dontexpunge -If non-nil, don't remove all articles marked as deleted in the mailbox -after finishing the fetch. - -@end table - -An example @sc{imap} mail source: - -@lisp -(imap :server "mail.mycorp.com" - :stream kerberos4 - :fetchflag "\\Seen") -@end lisp - -@item webmail -Get mail from a webmail server, such as www.hotmail.com, -webmail.netscape.com, www.netaddress.com, www.my-deja.com. - -NOTE: Now mail.yahoo.com provides POP3 service, so @sc{pop} mail source -is suggested. - -NOTE: Webmail largely depends cookies. A "one-line-cookie" patch is -required for url "4.0pre.46". - -WARNING: Mails may lost. NO WARRANTY. - -Keywords: - -@table @code -@item :subtype -The type of the webmail server. The default is @code{hotmail}. The -alternatives are @code{netscape}, @code{netaddress}, @code{my-deja}. - -@item :user -The user name to give to the webmail server. The default is the login -name. - -@item :password -The password to give to the webmail server. If not specified, the user is -prompted. - -@item :dontexpunge -If non-nil, only fetch unread articles and don't move them to trash -folder after finishing the fetch. - -@end table - -An example webmail source: - -@lisp -(webmail :subtype 'hotmail - :user "user-name" - :password "secret") -@end lisp -@end table - -@table @dfn -@item Common Keywords -Common keywords can be used in any type of mail source. - -Keywords: - -@table @code -@item :plugged -If non-nil, fetch the mail even when Gnus is unplugged. If you use -directory source to get mail, you can specify it as in this example: - -@lisp -(setq mail-sources - '((directory :path "/home/pavel/.Spool/" - :suffix "" - :plugged t))) -@end lisp - -Gnus will then fetch your mail even when you are unplugged. This is -useful when you use local mail and news. - -@end table -@end table - -@subsubsection Function Interface - -Some of the above keywords specify a Lisp function to be executed. -For each keyword @code{:foo}, the Lisp variable @code{foo} is bound to -the value of the keyword while the function is executing. For example, -consider the following mail-source setting: - -@lisp -(setq mail-sources '((pop :user "jrl" - :server "pophost" :function fetchfunc))) -@end lisp - -While the function @code{fetchfunc} is executing, the symbol @code{user} -is bound to @code{"jrl"}, and the symbol @code{server} is bound to -@code{"pophost"}. The symbols @code{port}, @code{password}, -@code{program}, @code{prescript}, @code{postscript}, @code{function}, -and @code{authentication} are also bound (to their default values). - -See above for a list of keywords for each type of mail source. - - -@node Mail Source Customization -@subsubsection Mail Source Customization - -The following is a list of variables that influence how the mail is -fetched. You would normally not need to set or change any of these -variables. - -@table @code -@item mail-source-crash-box -@vindex mail-source-crash-box -File where mail will be stored while processing it. The default is -@file{~/.emacs-mail-crash-box}. - -@item mail-source-delete-incoming -@vindex mail-source-delete-incoming -If non-@code{nil}, delete incoming files after handling them. - -@item mail-source-directory -@vindex mail-source-directory -Directory where files (if any) will be stored. The default is -@file{~/Mail/}. At present, the only thing this is used for is to say -where the incoming files will be stored if the previous variable is -@code{nil}. - -@item mail-source-incoming-file-prefix -@vindex mail-source-incoming-file-prefix -Prefix for file name for storing incoming mail. The default is -@file{Incoming}, in which case files will end up with names like -@file{Incoming30630D_} or @file{Incoming298602ZD}. This is really only -relevant if @code{mail-source-delete-incoming} is @code{nil}. - -@item mail-source-default-file-modes -@vindex mail-source-default-file-modes -All new mail files will get this file mode. The default is 384. - -@end table - - -@node Fetching Mail -@subsubsection Fetching Mail - -@vindex mail-sources -@vindex nnmail-spool-file -The way to actually tell Gnus where to get new mail from is to set -@code{mail-sources} to a list of mail source specifiers -(@pxref{Mail Source Specifiers}). - -If this variable (and the obsolescent @code{nnmail-spool-file}) is -@code{nil}, the mail backends will never attempt to fetch mail by -themselves. - -If you want to fetch mail both from your local spool as well as a POP -mail server, you'd say something like: - -@lisp -(setq mail-sources - '((file) - (pop :server "pop3.mail.server" - :password "secret"))) -@end lisp - -Or, if you don't want to use any of the keyword defaults: - -@lisp -(setq mail-sources - '((file :path "/var/spool/mail/user-name") - (pop :server "pop3.mail.server" - :user "user-name" - :port "pop3" - :password "secret"))) -@end lisp - - -When you use a mail backend, Gnus will slurp all your mail from your -inbox and plonk it down in your home directory. Gnus doesn't move any -mail if you're not using a mail backend---you have to do a lot of magic -invocations first. At the time when you have finished drawing the -pentagram, lightened the candles, and sacrificed the goat, you really -shouldn't be too surprised when Gnus moves your mail. - - - -@node Mail Backend Variables -@subsection Mail Backend Variables - -These variables are (for the most part) pertinent to all the various -mail backends. - -@table @code -@vindex nnmail-read-incoming-hook -@item nnmail-read-incoming-hook -The mail backends all call this hook after reading new mail. You can -use this hook to notify any mail watch programs, if you want to. - -@vindex nnmail-split-hook -@item nnmail-split-hook -@findex article-decode-encoded-words -@findex RFC 1522 decoding -@findex RFC 2047 decoding -Hook run in the buffer where the mail headers of each message is kept -just before the splitting based on these headers is done. The hook is -free to modify the buffer contents in any way it sees fit---the buffer -is discarded after the splitting has been done, and no changes performed -in the buffer will show up in any files. -@code{gnus-article-decode-encoded-words} is one likely function to add -to this hook. - -@vindex nnmail-pre-get-new-mail-hook -@vindex nnmail-post-get-new-mail-hook -@item nnmail-pre-get-new-mail-hook -@itemx nnmail-post-get-new-mail-hook -These are two useful hooks executed when treating new incoming -mail---@code{nnmail-pre-get-new-mail-hook} (is called just before -starting to handle the new mail) and -@code{nnmail-post-get-new-mail-hook} (is called when the mail handling -is done). Here's and example of using these two hooks to change the -default file modes the new mail files get: - -@lisp -(add-hook 'nnmail-pre-get-new-mail-hook - (lambda () (set-default-file-modes 511))) - -(add-hook 'nnmail-post-get-new-mail-hook - (lambda () (set-default-file-modes 551))) -@end lisp - -@item nnmail-use-long-file-names -@vindex nnmail-use-long-file-names -If non-@code{nil}, the mail backends will use long file and directory -names. Groups like @samp{mail.misc} will end up in directories -(assuming use of @code{nnml} backend) or files (assuming use of -@code{nnfolder} backend) like @file{mail.misc}. If it is @code{nil}, -the same group will end up in @file{mail/misc}. - -@item nnmail-delete-file-function -@vindex nnmail-delete-file-function -@findex delete-file -Function called to delete files. It is @code{delete-file} by default. - -@item nnmail-cache-accepted-message-ids -@vindex nnmail-cache-accepted-message-ids -If non-@code{nil}, put the @code{Message-ID}s of articles imported into -the backend (via @code{Gcc}, for instance) into the mail duplication -discovery cache. The default is @code{nil}. - -@end table - - -@node Fancy Mail Splitting -@subsection Fancy Mail Splitting -@cindex mail splitting -@cindex fancy mail splitting - -@vindex nnmail-split-fancy -@findex nnmail-split-fancy -If the rather simple, standard method for specifying how to split mail -doesn't allow you to do what you want, you can set -@code{nnmail-split-methods} to @code{nnmail-split-fancy}. Then you can -play with the @code{nnmail-split-fancy} variable. - -Let's look at an example value of this variable first: - -@lisp -;; Messages from the mailer daemon are not crossposted to any of -;; the ordinary groups. Warnings are put in a separate group -;; from real errors. -(| ("from" mail (| ("subject" "warn.*" "mail.warning") - "mail.misc")) - ;; Non-error messages are crossposted to all relevant - ;; groups, but we don't crosspost between the group for the - ;; (ding) list and the group for other (ding) related mail. - (& (| (any "ding@@ifi\\.uio\\.no" "ding.list") - ("subject" "ding" "ding.misc")) - ;; Other mailing lists... - (any "procmail@@informatik\\.rwth-aachen\\.de" "procmail.list") - (any "SmartList@@informatik\\.rwth-aachen\\.de" "SmartList.list") - ;; Both lists below have the same suffix, so prevent - ;; cross-posting to mkpkg.list of messages posted only to - ;; the bugs- list, but allow cross-posting when the - ;; message was really cross-posted. - (any "bugs-mypackage@@somewhere" "mypkg.bugs") - (any "mypackage@@somewhere\" - "bugs-mypackage" "mypkg.list") - ;; People... - (any "larsi@@ifi\\.uio\\.no" "people.Lars_Magne_Ingebrigtsen")) - ;; Unmatched mail goes to the catch all group. - "misc.misc") -@end lisp - -This variable has the format of a @dfn{split}. A split is a (possibly) -recursive structure where each split may contain other splits. Here are -the five possible split syntaxes: - -@enumerate - -@item -@samp{group}: If the split is a string, that will be taken as a group -name. Normal regexp match expansion will be done. See below for -examples. - -@item -@code{(@var{field} @var{value} @code{[-} @var{restrict} -@code{[@dots{}]}@code{]} @var{split})}: If the split is a list, the -first element of which is a string, then store the message as -specified by @var{split}, if header @var{field} (a regexp) contains -@var{value} (also a regexp). If @var{restrict} (yet another regexp) -matches some string after @var{field} and before the end of the -matched @var{value}, the @var{split} is ignored. If none of the -@var{restrict} clauses match, @var{split} is processed. - -@item -@code{(| @var{split}@dots{})}: If the split is a list, and the first -element is @code{|} (vertical bar), then process each @var{split} until -one of them matches. A @var{split} is said to match if it will cause -the mail message to be stored in one or more groups. - -@item -@code{(& @var{split}@dots{})}: If the split is a list, and the first -element is @code{&}, then process all @var{split}s in the list. - -@item -@code{junk}: If the split is the symbol @code{junk}, then don't save -this message. Use with extreme caution. - -@item -@code{(: @var{function} @var{arg1} @var{arg2} @dots{})}: If the split is -a list, and the first element is @code{:}, then the second element will -be called as a function with @var{args} given as arguments. The -function should return a @var{split}. - -@cindex body split -For instance, the following function could be used to split based on the -body of the messages: - -@lisp -(defun split-on-body () - (save-excursion - (set-buffer " *nnmail incoming*") - (goto-char (point-min)) - (when (re-search-forward "Some.*string" nil t) - "string.group"))) -@end lisp - -The @samp{" *nnmail incoming*"} is narrowed to the message in question -when the @code{:} function is run. - -@item -@code{(! @var{func} @var{split})}: If the split is a list, and the first -element is @code{!}, then SPLIT will be processed, and FUNC will be -called as a function with the result of SPLIT as argument. FUNC should -return a split. - -@item -@code{nil}: If the split is @code{nil}, it is ignored. - -@end enumerate - -In these splits, @var{field} must match a complete field name. -@var{value} must match a complete word according to the fundamental mode -syntax table. You can use @code{.*} in the regexps to match partial -field names or words. In other words, all @var{value}'s are wrapped in -@samp{\<} and @samp{\>} pairs. - -@vindex nnmail-split-abbrev-alist -@var{field} and @var{value} can also be lisp symbols, in that case they -are expanded as specified by the variable -@code{nnmail-split-abbrev-alist}. This is an alist of cons cells, where -the @code{car} of a cell contains the key, and the @code{cdr} contains the associated -value. - -@vindex nnmail-split-fancy-syntax-table -@code{nnmail-split-fancy-syntax-table} is the syntax table in effect -when all this splitting is performed. - -If you want to have Gnus create groups dynamically based on some -information in the headers (i.e., do @code{replace-match}-like -substitutions in the group names), you can say things like: - -@example -(any "debian-\\b\\(\\w+\\)@@lists.debian.org" "mail.debian.\\1") -@end example - -In this example, messages sent to @samp{debian-foo@@lists.debian.org} -will be filed in @samp{mail.debian.foo}. - -If the string contains the element @samp{\&}, then the previously -matched string will be substituted. Similarly, the elements @samp{\\1} -up to @samp{\\9} will be substituted with the text matched by the -groupings 1 through 9. - -@findex nnmail-split-fancy-with-parent -@code{nnmail-split-fancy-with-parent} is a function which allows you to -split followups into the same groups their parents are in. Sometimes -you can't make splitting rules for all your mail. For example, your -boss might send you personal mail regarding different projects you are -working on, and as you can't tell your boss to put a distinguishing -string into the subject line, you have to resort to manually moving the -messages into the right group. With this function, you only have to do -it once per thread. - -To use this feature, you have to set @code{nnmail-treat-duplicates} and -@code{nnmail-cache-accepted-message-ids} to a non-nil value. And then -you can include @code{nnmail-split-fancy-with-parent} using the colon -feature, like so: -@lisp -(setq nnmail-split-fancy - '(| (: nnmail-split-fancy-with-parent) - ;; other splits go here - )) -@end lisp - -This feature works as follows: when @code{nnmail-treat-duplicates} is -non-nil, Gnus records the message id of every message it sees in the -file specified by the variable @code{nnmail-message-id-cache-file}, -together with the group it is in (the group is omitted for non-mail -messages). When mail splitting is invoked, the function -@code{nnmail-split-fancy-with-parent} then looks at the References (and -In-Reply-To) header of each message to split and searches the file -specified by @code{nnmail-message-id-cache-file} for the message ids. -When it has found a parent, it returns the corresponding group name -unless the group name matches the regexp -@code{nnmail-split-fancy-with-parent-ignore-groups}. It is recommended -that you set @code{nnmail-message-id-cache-length} to a somewhat higher -number than the default so that the message ids are still in the cache. -(A value of 5000 appears to create a file some 300 kBytes in size.) -@vindex nnmail-cache-accepted-message-ids -When @code{nnmail-cache-accepted-message-ids} is non-@code{nil}, Gnus -also records the message ids of moved articles, so that the followup -messages goes into the new group. - - -@node Group Mail Splitting -@subsection Group Mail Splitting -@cindex mail splitting -@cindex group mail splitting - -@findex gnus-group-split -If you subscribe to dozens of mailing lists but you don't want to -maintain mail splitting rules manually, group mail splitting is for you. -You just have to set @var{to-list} and/or @var{to-address} in group -parameters or group customization and set @code{nnmail-split-methods} to -@code{gnus-group-split}. This splitting function will scan all groups -for those parameters and split mail accordingly, i.e., messages posted -from or to the addresses specified in the parameters @var{to-list} or -@var{to-address} of a mail group will be stored in that group. - -Sometimes, mailing lists have multiple addresses, and you may want mail -splitting to recognize them all: just set the @var{extra-aliases} group -parameter to the list of additional addresses and it's done. If you'd -rather use a regular expression, set @var{split-regexp}. - -All these parameters in a group will be used to create an -@code{nnmail-split-fancy} split, in which the @var{field} is @samp{any}, -the @var{value} is a single regular expression that matches -@var{to-list}, @var{to-address}, all of @var{extra-aliases} and all -matches of @var{split-regexp}, and the @var{split} is the name of the -group. @var{restrict}s are also supported: just set the -@var{split-exclude} parameter to a list of regular expressions. - -If you can't get the right split to be generated using all these -parameters, or you just need something fancier, you can set the -parameter @var{split-spec} to an @code{nnmail-split-fancy} split. In -this case, all other aforementioned parameters will be ignored by -@code{gnus-group-split}. In particular, @var{split-spec} may be set to -@code{nil}, in which case the group will be ignored by -@code{gnus-group-split}. - -@vindex gnus-group-split-default-catch-all-group -@code{gnus-group-split} will do cross-posting on all groups that match, -by defining a single @code{&} fancy split containing one split for each -group. If a message doesn't match any split, it will be stored in the -group named in @code{gnus-group-split-default-catch-all-group}, unless -some group has @var{split-spec} set to @code{catch-all}, in which case -that group is used as the catch-all group. Even though this variable is -often used just to name a group, it may also be set to an arbitrarily -complex fancy split (after all, a group name is a fancy split), and this -may be useful to split mail that doesn't go to any mailing list to -personal mail folders. Note that this fancy split is added as the last -element of a @code{|} split list that also contains a @code{&} split -with the rules extracted from group parameters. - -It's time for an example. Assume the following group parameters have -been defined: - -@example -nnml:mail.bar: -((to-address . "bar@@femail.com") - (split-regexp . ".*@@femail\\.com")) -nnml:mail.foo: -((to-list . "foo@@nowhere.gov") - (extra-aliases "foo@@localhost" "foo-redist@@home") - (split-exclude "bugs-foo" "rambling-foo") - (admin-address . "foo-request@@nowhere.gov")) -nnml:mail.others: -((split-spec . catch-all)) -@end example - -Setting @code{nnmail-split-methods} to @code{gnus-group-split} will -behave as if @code{nnmail-split-fancy} had been selected and variable -@code{nnmail-split-fancy} had been set as follows: - -@lisp -(| (& (any "\\(bar@@femail\\.com\\|.*@@femail\\.com\\)" "mail.bar") - (any "\\(foo@@nowhere\\.gov\\|foo@@localhost\\|foo-redist@@home\\)" - - "bugs-foo" - "rambling-foo" "mail.foo")) - "mail.others") -@end lisp - -@findex gnus-group-split-fancy -If you'd rather not use group splitting for all your mail groups, you -may use it for only some of them, by using @code{nnmail-split-fancy} -splits like this: - -@lisp -(: gnus-mlsplt-fancy GROUPS NO-CROSSPOST CATCH-ALL) -@end lisp - -@var{groups} may be a regular expression or a list of group names whose -parameters will be scanned to generate the output split. -@var{no-crosspost} can be used to disable cross-posting; in this case, a -single @code{|} split will be output. @var{catch-all} is the fallback -fancy split, used like @var{gnus-group-split-default-catch-all-group}. -If @var{catch-all} is @code{nil}, or if @var{split-regexp} matches the -empty string in any selected group, no catch-all split will be issued. -Otherwise, if some group has @var{split-spec} set to @code{catch-all}, -this group will override the value of the @var{catch-all} argument. - -@findex gnus-group-split-setup -Unfortunately, scanning all groups and their parameters can be quite -slow, especially considering that it has to be done for every message. -But don't despair! The function @code{gnus-group-split-setup} can be -used to enable @code{gnus-group-split} in a much more efficient way. It -sets @code{nnmail-split-methods} to @code{nnmail-split-fancy} and sets -@code{nnmail-split-fancy} to the split produced by -@code{gnus-group-split-fancy}. Thus, the group parameters are only -scanned once, no matter how many messages are split. - -@findex gnus-group-split-update -However, if you change group parameters, you'd have to update -@code{nnmail-split-fancy} manually. You can do it by running -@code{gnus-group-split-update}. If you'd rather have it updated -automatically, just tell @code{gnus-group-split-setup} to do it for -you. For example, add to your @file{.gnus}: - -@lisp -(gnus-group-split-setup AUTO-UPDATE CATCH-ALL) -@end lisp - -If @var{auto-update} is non-@code{nil}, @code{gnus-group-split-update} -will be added to @code{nnmail-pre-get-new-mail-hook}, so you won't ever -have to worry about updating @code{nnmail-split-fancy} again. If you -don't omit @var{catch-all} (it's optional, equivalent to @code{nil}), -@code{gnus-group-split-default-catch-all-group} will be set to its -value. - -@vindex gnus-group-split-updated-hook -Because you may want to change @code{nnmail-split-fancy} after it is set -by @code{gnus-group-split-update}, this function will run -@code{gnus-group-split-updated-hook} just before finishing. - -@node Incorporating Old Mail -@subsection Incorporating Old Mail -@cindex incorporating old mail -@cindex import old mail - -Most people have lots of old mail stored in various file formats. If -you have set up Gnus to read mail using one of the spiffy Gnus mail -backends, you'll probably wish to have that old mail incorporated into -your mail groups. - -Doing so can be quite easy. - -To take an example: You're reading mail using @code{nnml} -(@pxref{Mail Spool}), and have set @code{nnmail-split-methods} to a -satisfactory value (@pxref{Splitting Mail}). You have an old Unix mbox -file filled with important, but old, mail. You want to move it into -your @code{nnml} groups. - -Here's how: - -@enumerate -@item -Go to the group buffer. - -@item -Type `G f' and give the path to the mbox file when prompted to create an -@code{nndoc} group from the mbox file (@pxref{Foreign Groups}). - -@item -Type `SPACE' to enter the newly created group. - -@item -Type `M P b' to process-mark all articles in this group's buffer -(@pxref{Setting Process Marks}). - -@item -Type `B r' to respool all the process-marked articles, and answer -@samp{nnml} when prompted (@pxref{Mail Group Commands}). -@end enumerate - -All the mail messages in the mbox file will now also be spread out over -all your @code{nnml} groups. Try entering them and check whether things -have gone without a glitch. If things look ok, you may consider -deleting the mbox file, but I wouldn't do that unless I was absolutely -sure that all the mail has ended up where it should be. - -Respooling is also a handy thing to do if you're switching from one mail -backend to another. Just respool all the mail in the old mail groups -using the new mail backend. - - -@node Expiring Mail -@subsection Expiring Mail -@cindex article expiry - -Traditional mail readers have a tendency to remove mail articles when -you mark them as read, in some way. Gnus takes a fundamentally -different approach to mail reading. - -Gnus basically considers mail just to be news that has been received in -a rather peculiar manner. It does not think that it has the power to -actually change the mail, or delete any mail messages. If you enter a -mail group, and mark articles as ``read'', or kill them in some other -fashion, the mail articles will still exist on the system. I repeat: -Gnus will not delete your old, read mail. Unless you ask it to, of -course. - -To make Gnus get rid of your unwanted mail, you have to mark the -articles as @dfn{expirable}. This does not mean that the articles will -disappear right away, however. In general, a mail article will be -deleted from your system if, 1) it is marked as expirable, AND 2) it is -more than one week old. If you do not mark an article as expirable, it -will remain on your system until hell freezes over. This bears -repeating one more time, with some spurious capitalizations: IF you do -NOT mark articles as EXPIRABLE, Gnus will NEVER delete those ARTICLES. - -@vindex gnus-auto-expirable-newsgroups -You do not have to mark articles as expirable by hand. Groups that -match the regular expression @code{gnus-auto-expirable-newsgroups} will -have all articles that you read marked as expirable automatically. All -articles marked as expirable have an @samp{E} in the first -column in the summary buffer. - -By default, if you have auto expiry switched on, Gnus will mark all the -articles you read as expirable, no matter if they were read or unread -before. To avoid having articles marked as read marked as expirable -automatically, you can put something like the following in your -@file{.gnus} file: - -@vindex gnus-mark-article-hook -@lisp -(remove-hook 'gnus-mark-article-hook - 'gnus-summary-mark-read-and-unread-as-read) -(add-hook 'gnus-mark-article-hook 'gnus-summary-mark-unread-as-read) -@end lisp - -Note that making a group auto-expirable doesn't mean that all read -articles are expired---only the articles marked as expirable -will be expired. Also note that using the @kbd{d} command won't make -articles expirable---only semi-automatic marking of articles as read will -mark the articles as expirable in auto-expirable groups. - -Let's say you subscribe to a couple of mailing lists, and you want the -articles you have read to disappear after a while: - -@lisp -(setq gnus-auto-expirable-newsgroups - "mail.nonsense-list\\|mail.nice-list") -@end lisp - -Another way to have auto-expiry happen is to have the element -@code{auto-expire} in the group parameters of the group. - -If you use adaptive scoring (@pxref{Adaptive Scoring}) and -auto-expiring, you'll have problems. Auto-expiring and adaptive scoring -don't really mix very well. - -@vindex nnmail-expiry-wait -The @code{nnmail-expiry-wait} variable supplies the default time an -expirable article has to live. Gnus starts counting days from when the -message @emph{arrived}, not from when it was sent. The default is seven -days. - -Gnus also supplies a function that lets you fine-tune how long articles -are to live, based on what group they are in. Let's say you want to -have one month expiry period in the @samp{mail.private} group, a one day -expiry period in the @samp{mail.junk} group, and a six day expiry period -everywhere else: - -@vindex nnmail-expiry-wait-function -@lisp -(setq nnmail-expiry-wait-function - (lambda (group) - (cond ((string= group "mail.private") - 31) - ((string= group "mail.junk") - 1) - ((string= group "important") - 'never) - (t - 6)))) -@end lisp - -The group names this function is fed are ``unadorned'' group -names---no @samp{nnml:} prefixes and the like. - -The @code{nnmail-expiry-wait} variable and -@code{nnmail-expiry-wait-function} function can either be a number (not -necessarily an integer) or one of the symbols @code{immediate} or -@code{never}. - -You can also use the @code{expiry-wait} group parameter to selectively -change the expiry period (@pxref{Group Parameters}). - -@vindex nnmail-expiry-target -The normal action taken when expiring articles is to delete them. -However, in some circumstances it might make more sense to move them to -other groups instead of deleting them. The variable @code{nnmail-expiry-target} -(and the @code{expiry-target} group parameter) controls this. The -variable supplies a default value for all groups, which can be -overridden for specific groups by the group parameter. -default value is @code{delete}, but this can also be a string (which -should be the name of the group the message should be moved to), or a -function (which will be called in a buffer narrowed to the message in -question, and with the name of the group being moved from as its -parameter) which should return a target -- either a group name or -@code{delete}. - -Here's an example for specifying a group name: -@lisp -(setq nnmail-expiry-target "nnml:expired") -@end lisp - - -@vindex nnmail-keep-last-article -If @code{nnmail-keep-last-article} is non-@code{nil}, Gnus will never -expire the final article in a mail newsgroup. This is to make life -easier for procmail users. - -@vindex gnus-total-expirable-newsgroups -By the way: That line up there, about Gnus never expiring non-expirable -articles, is a lie. If you put @code{total-expire} in the group -parameters, articles will not be marked as expirable, but all read -articles will be put through the expiry process. Use with extreme -caution. Even more dangerous is the -@code{gnus-total-expirable-newsgroups} variable. All groups that match -this regexp will have all read articles put through the expiry process, -which means that @emph{all} old mail articles in the groups in question -will be deleted after a while. Use with extreme caution, and don't come -crying to me when you discover that the regexp you used matched the -wrong group and all your important mail has disappeared. Be a -@emph{man}! Or a @emph{woman}! Whatever you feel more comfortable -with! So there! - -Most people make most of their mail groups total-expirable, though. - -@vindex gnus-inhibit-user-auto-expire -If @code{gnus-inhibit-user-auto-expire} is non-@code{nil}, user marking -commands will not mark an article as expirable, even if the group has -auto-expire turned on. - - -@node Washing Mail -@subsection Washing Mail -@cindex mail washing -@cindex list server brain damage -@cindex incoming mail treatment - -Mailers and list servers are notorious for doing all sorts of really, -really stupid things with mail. ``Hey, RFC 822 doesn't explicitly -prohibit us from adding the string @code{wE aRe ElItE!!!!!1!!} to the -end of all lines passing through our server, so let's do that!!!!1!'' -Yes, but RFC 822 wasn't designed to be read by morons. Things that were -considered to be self-evident were not discussed. So. Here we are. - -Case in point: The German version of Microsoft Exchange adds @samp{AW: -} to the subjects of replies instead of @samp{Re: }. I could pretend to -be shocked and dismayed by this, but I haven't got the energy. It is to -laugh. - -Gnus provides a plethora of functions for washing articles while -displaying them, but it might be nicer to do the filtering before -storing the mail to disc. For that purpose, we have three hooks and -various functions that can be put in these hooks. - -@table @code -@item nnmail-prepare-incoming-hook -@vindex nnmail-prepare-incoming-hook -This hook is called before doing anything with the mail and is meant for -grand, sweeping gestures. It is called in a buffer that contains all -the new, incoming mail. Functions to be used include: - -@table @code -@item nnheader-ms-strip-cr -@findex nnheader-ms-strip-cr -Remove trailing carriage returns from each line. This is default on -Emacs running on MS machines. - -@end table - -@item nnmail-prepare-incoming-header-hook -@vindex nnmail-prepare-incoming-header-hook -This hook is called narrowed to each header. It can be used when -cleaning up the headers. Functions that can be used include: - -@table @code -@item nnmail-remove-leading-whitespace -@findex nnmail-remove-leading-whitespace -Clear leading white space that ``helpful'' listservs have added to the -headers to make them look nice. Aaah. - -@item nnmail-remove-list-identifiers -@findex nnmail-remove-list-identifiers -Some list servers add an identifier---for example, @samp{(idm)}---to the -beginning of all @code{Subject} headers. I'm sure that's nice for -people who use stone age mail readers. This function will remove -strings that match the @code{nnmail-list-identifiers} regexp, which can -also be a list of regexp. @code{nnmail-list-identifiers} may not contain -@code{\\(..\\)}. - -For instance, if you want to remove the @samp{(idm)} and the -@samp{nagnagnag} identifiers: - -@lisp -(setq nnmail-list-identifiers - '("(idm)" "nagnagnag")) -@end lisp - -This can also be done non-destructively with -@code{gnus-list-identifiers}, @xref{Article Hiding}. - -@item nnmail-remove-tabs -@findex nnmail-remove-tabs -Translate all @samp{TAB} characters into @samp{SPACE} characters. - -@item nnmail-fix-eudora-headers -@findex nnmail-fix-eudora-headers -@cindex Eudora -Eudora produces broken @code{References} headers, but OK -@code{In-Reply-To} headers. This function will get rid of the -@code{References} headers. - -@end table - -@item nnmail-prepare-incoming-message-hook -@vindex nnmail-prepare-incoming-message-hook -This hook is called narrowed to each message. Functions to be used -include: - -@table @code -@item article-de-quoted-unreadable -@findex article-de-quoted-unreadable -Decode Quoted Readable encoding. - -@end table -@end table - - -@node Duplicates -@subsection Duplicates - -@vindex nnmail-treat-duplicates -@vindex nnmail-message-id-cache-length -@vindex nnmail-message-id-cache-file -@cindex duplicate mails -If you are a member of a couple of mailing lists, you will sometimes -receive two copies of the same mail. This can be quite annoying, so -@code{nnmail} checks for and treats any duplicates it might find. To do -this, it keeps a cache of old @code{Message-ID}s--- -@code{nnmail-message-id-cache-file}, which is @file{~/.nnmail-cache} by -default. The approximate maximum number of @code{Message-ID}s stored -there is controlled by the @code{nnmail-message-id-cache-length} -variable, which is 1000 by default. (So 1000 @code{Message-ID}s will be -stored.) If all this sounds scary to you, you can set -@code{nnmail-treat-duplicates} to @code{warn} (which is what it is by -default), and @code{nnmail} won't delete duplicate mails. Instead it -will insert a warning into the head of the mail saying that it thinks -that this is a duplicate of a different message. - -This variable can also be a function. If that's the case, the function -will be called from a buffer narrowed to the message in question with -the @code{Message-ID} as a parameter. The function must return either -@code{nil}, @code{warn}, or @code{delete}. - -You can turn this feature off completely by setting the variable to -@code{nil}. - -If you want all the duplicate mails to be put into a special -@dfn{duplicates} group, you could do that using the normal mail split -methods: - -@lisp -(setq nnmail-split-fancy - '(| ;; Messages duplicates go to a separate group. - ("gnus-warning" "duplicat\\(e\\|ion\\) of message" "duplicate") - ;; Message from daemons, postmaster, and the like to another. - (any mail "mail.misc") - ;; Other rules. - [ ... ] )) -@end lisp - -Or something like: -@lisp -(setq nnmail-split-methods - '(("duplicates" "^Gnus-Warning:.*duplicate") - ;; Other rules. - [...])) -@end lisp - -Here's a neat feature: If you know that the recipient reads her mail -with Gnus, and that she has @code{nnmail-treat-duplicates} set to -@code{delete}, you can send her as many insults as you like, just by -using a @code{Message-ID} of a mail that you know that she's already -received. Think of all the fun! She'll never see any of it! Whee! - - -@node Not Reading Mail -@subsection Not Reading Mail - -If you start using any of the mail backends, they have the annoying -habit of assuming that you want to read mail with them. This might not -be unreasonable, but it might not be what you want. - -If you set @code{mail-sources} and @code{nnmail-spool-file} to -@code{nil}, none of the backends will ever attempt to read incoming -mail, which should help. - -@vindex nnbabyl-get-new-mail -@vindex nnmbox-get-new-mail -@vindex nnml-get-new-mail -@vindex nnmh-get-new-mail -@vindex nnfolder-get-new-mail -This might be too much, if, for instance, you are reading mail quite -happily with @code{nnml} and just want to peek at some old @sc{rmail} -file you have stashed away with @code{nnbabyl}. All backends have -variables called backend-@code{get-new-mail}. If you want to disable -the @code{nnbabyl} mail reading, you edit the virtual server for the -group to have a setting where @code{nnbabyl-get-new-mail} to @code{nil}. - -All the mail backends will call @code{nn}*@code{-prepare-save-mail-hook} -narrowed to the article to be saved before saving it when reading -incoming mail. - - -@node Choosing a Mail Backend -@subsection Choosing a Mail Backend - -Gnus will read the mail spool when you activate a mail group. The mail -file is first copied to your home directory. What happens after that -depends on what format you want to store your mail in. - -There are five different mail backends in the standard Gnus, and more -backends are available separately. The mail backend most people use -(because it is the fastest and most flexible) is @code{nnml} -(@pxref{Mail Spool}). - -@menu -* Unix Mail Box:: Using the (quite) standard Un*x mbox. -* Rmail Babyl:: Emacs programs use the rmail babyl format. -* Mail Spool:: Store your mail in a private spool? -* MH Spool:: An mhspool-like backend. -* Mail Folders:: Having one file for each group. -* Comparing Mail Backends:: An in-depth looks at pros and cons. -@end menu - - -@node Unix Mail Box -@subsubsection Unix Mail Box -@cindex nnmbox -@cindex unix mail box - -@vindex nnmbox-active-file -@vindex nnmbox-mbox-file -The @dfn{nnmbox} backend will use the standard Un*x mbox file to store -mail. @code{nnmbox} will add extra headers to each mail article to say -which group it belongs in. - -Virtual server settings: - -@table @code -@item nnmbox-mbox-file -@vindex nnmbox-mbox-file -The name of the mail box in the user's home directory. Default is -@file{~/mbox}. - -@item nnmbox-active-file -@vindex nnmbox-active-file -The name of the active file for the mail box. Default is -@file{~/.mbox-active}. - -@item nnmbox-get-new-mail -@vindex nnmbox-get-new-mail -If non-@code{nil}, @code{nnmbox} will read incoming mail and split it -into groups. Default is @code{t}. -@end table - - -@node Rmail Babyl -@subsubsection Rmail Babyl -@cindex nnbabyl -@cindex rmail mbox - -@vindex nnbabyl-active-file -@vindex nnbabyl-mbox-file -The @dfn{nnbabyl} backend will use a babyl mail box (aka. @dfn{rmail -mbox}) to store mail. @code{nnbabyl} will add extra headers to each -mail article to say which group it belongs in. - -Virtual server settings: - -@table @code -@item nnbabyl-mbox-file -@vindex nnbabyl-mbox-file -The name of the rmail mbox file. The default is @file{~/RMAIL} - -@item nnbabyl-active-file -@vindex nnbabyl-active-file -The name of the active file for the rmail box. The default is -@file{~/.rmail-active} - -@item nnbabyl-get-new-mail -@vindex nnbabyl-get-new-mail -If non-@code{nil}, @code{nnbabyl} will read incoming mail. Default is -@code{t} -@end table - - -@node Mail Spool -@subsubsection Mail Spool -@cindex nnml -@cindex mail @sc{nov} spool - -The @dfn{nnml} spool mail format isn't compatible with any other known -format. It should be used with some caution. - -@vindex nnml-directory -If you use this backend, Gnus will split all incoming mail into files, -one file for each mail, and put the articles into the corresponding -directories under the directory specified by the @code{nnml-directory} -variable. The default value is @file{~/Mail/}. - -You do not have to create any directories beforehand; Gnus will take -care of all that. - -If you have a strict limit as to how many files you are allowed to store -in your account, you should not use this backend. As each mail gets its -own file, you might very well occupy thousands of inodes within a few -weeks. If this is no problem for you, and it isn't a problem for you -having your friendly systems administrator walking around, madly, -shouting ``Who is eating all my inodes?! Who? Who!?!'', then you should -know that this is probably the fastest format to use. You do not have -to trudge through a big mbox file just to read your new mail. - -@code{nnml} is probably the slowest backend when it comes to article -splitting. It has to create lots of files, and it also generates -@sc{nov} databases for the incoming mails. This makes it the fastest -backend when it comes to reading mail. - -@cindex self contained nnml servers -When the marks file is used (which it is by default), @code{nnml} -servers have the property that you may backup them using @code{tar} or -similar, and later be able to restore them into Gnus (by adding the -proper @code{nnml} server) and have all your marks be preserved. Marks -for a group is usually stored in the @code{.marks} file (but see -@code{nnml-marks-file-name}) within each @code{nnml} group's directory. -Individual @code{nnml} groups are also possible to backup, use @kbd{G m} -to restore the group (after restoring the backup into the nnml -directory). - -Virtual server settings: - -@table @code -@item nnml-directory -@vindex nnml-directory -All @code{nnml} directories will be placed under this directory. -The default is the value of `message-directory' (whose default value is -@file{~/Mail}). - -@item nnml-active-file -@vindex nnml-active-file -The active file for the @code{nnml} server. The default is -@file{~/Mail/active"}. - -@item nnml-newsgroups-file -@vindex nnml-newsgroups-file -The @code{nnml} group descriptions file. @xref{Newsgroups File -Format}. The default is @file{~/Mail/newsgroups"}. - -@item nnml-get-new-mail -@vindex nnml-get-new-mail -If non-@code{nil}, @code{nnml} will read incoming mail. The default is -@code{t}. - -@item nnml-nov-is-evil -@vindex nnml-nov-is-evil -If non-@code{nil}, this backend will ignore any @sc{nov} files. The -default is @code{nil}. - -@item nnml-nov-file-name -@vindex nnml-nov-file-name -The name of the @sc{nov} files. The default is @file{.overview}. - -@item nnml-prepare-save-mail-hook -@vindex nnml-prepare-save-mail-hook -Hook run narrowed to an article before saving. - -@item nnml-marks-is-evil -@vindex nnml-marks-is-evil -If non-@code{nil}, this backend will ignore any @sc{marks} files. The -default is @code{nil}. - -@item nnml-marks-file-name -@vindex nnml-marks-file-name -The name of the @sc{marks} files. The default is @file{.marks}. - -@end table - -@findex nnml-generate-nov-databases -If your @code{nnml} groups and @sc{nov} files get totally out of whack, -you can do a complete update by typing @kbd{M-x -nnml-generate-nov-databases}. This command will trawl through the -entire @code{nnml} hierarchy, looking at each and every article, so it -might take a while to complete. A better interface to this -functionality can be found in the server buffer (@pxref{Server -Commands}). - - -@node MH Spool -@subsubsection MH Spool -@cindex nnmh -@cindex mh-e mail spool - -@code{nnmh} is just like @code{nnml}, except that is doesn't generate -@sc{nov} databases and it doesn't keep an active file or marks file. -This makes @code{nnmh} a @emph{much} slower backend than @code{nnml}, -but it also makes it easier to write procmail scripts for. - -Virtual server settings: - -@table @code -@item nnmh-directory -@vindex nnmh-directory -All @code{nnmh} directories will be located under this directory. The -default is the value of @code{message-directory} (whose default is -@file{~/Mail}) - -@item nnmh-get-new-mail -@vindex nnmh-get-new-mail -If non-@code{nil}, @code{nnmh} will read incoming mail. The default is -@code{t}. - -@item nnmh-be-safe -@vindex nnmh-be-safe -If non-@code{nil}, @code{nnmh} will go to ridiculous lengths to make -sure that the articles in the folder are actually what Gnus thinks they -are. It will check date stamps and stat everything in sight, so -setting this to @code{t} will mean a serious slow-down. If you never -use anything but Gnus to read the @code{nnmh} articles, you do not have -to set this variable to @code{t}. The default is @code{nil}. -@end table - - -@node Mail Folders -@subsubsection Mail Folders -@cindex nnfolder -@cindex mbox folders -@cindex mail folders - -@code{nnfolder} is a backend for storing each mail group in a separate -file. Each file is in the standard Un*x mbox format. @code{nnfolder} -will add extra headers to keep track of article numbers and arrival -dates. - -@cindex self contained nnfolder servers -When the marks file is used (which it is by default), @code{nnfolder} -servers have the property that you may backup them using @code{tar} or -similar, and later be able to restore them into Gnus (by adding the -proper @code{nnfolder} server) and have all your marks be preserved. -Marks for a group is usually stored in a file named as the mbox file -with @code{.mrk} concatenated to it (but see -@code{nnfolder-marks-file-suffix}) within the @code{nnfolder} directory. -Individual @code{nnfolder} groups are also possible to backup, use -@kbd{G m} to restore the group (after restoring the backup into the -@code{nnfolder} directory). - -Virtual server settings: - -@table @code -@item nnfolder-directory -@vindex nnfolder-directory -All the @code{nnfolder} mail boxes will be stored under this directory. -The default is the value of @code{message-directory} (whose default is -@file{~/Mail}) - -@item nnfolder-active-file -@vindex nnfolder-active-file -The name of the active file. The default is @file{~/Mail/active}. - -@item nnfolder-newsgroups-file -@vindex nnfolder-newsgroups-file -The name of the group descriptions file. @xref{Newsgroups File -Format}. The default is @file{~/Mail/newsgroups"} - -@item nnfolder-get-new-mail -@vindex nnfolder-get-new-mail -If non-@code{nil}, @code{nnfolder} will read incoming mail. The default -is @code{t} - -@item nnfolder-save-buffer-hook -@vindex nnfolder-save-buffer-hook -@cindex backup files -Hook run before saving the folders. Note that Emacs does the normal -backup renaming of files even with the @code{nnfolder} buffers. If you -wish to switch this off, you could say something like the following in -your @file{.emacs} file: - -@lisp -(defun turn-off-backup () - (set (make-local-variable 'backup-inhibited) t)) - -(add-hook 'nnfolder-save-buffer-hook 'turn-off-backup) -@end lisp - -@item nnfolder-delete-mail-hook -@vindex nnfolder-delete-mail-hook -Hook run in a buffer narrowed to the message that is to be deleted. -This function can be used to copy the message to somewhere else, or to -extract some information from it before removing it. - -@item nnfolder-nov-is-evil -@vindex nnfolder-nov-is-evil -If non-@code{nil}, this backend will ignore any @sc{nov} files. The -default is @code{nil}. - -@item nnfolder-nov-file-suffix -@vindex nnfolder-nov-file-suffix -The extension for @sc{nov} files. The default is @file{.nov}. - -@item nnfolder-marks-is-evil -@vindex nnfolder-marks-is-evil -If non-@code{nil}, this backend will ignore any @sc{marks} files. The -default is @code{nil}. - -@item nnfolder-marks-file-suffix -@vindex nnfolder-marks-file-suffix -The extension for @sc{marks} files. The default is @file{.mrk}. - -@end table - - -@findex nnfolder-generate-active-file -@kindex M-x nnfolder-generate-active-file -If you have lots of @code{nnfolder}-like files you'd like to read with -@code{nnfolder}, you can use the @kbd{M-x nnfolder-generate-active-file} -command to make @code{nnfolder} aware of all likely files in -@code{nnfolder-directory}. This only works if you use long file names, -though. - -@node Comparing Mail Backends -@subsubsection Comparing Mail Backends - -First, just for terminology, the @dfn{backend} is the common word for a -low-level access method---a transport, if you will, by which something -is acquired. The sense is that one's mail has to come from somewhere, -and so selection of a suitable backend is required in order to get that -mail within spitting distance of Gnus. - -The same concept exists for Usenet itself: Though access to articles is -typically done by @sc{nntp} these days, once upon a midnight dreary, everyone -in the world got at Usenet by running a reader on the machine where the -articles lay (the machine which today we call an @sc{nntp} server), and -access was by the reader stepping into the articles' directory spool -area directly. One can still select between either the @code{nntp} or -@code{nnspool} backends, to select between these methods, if one happens -actually to live on the server (or can see its spool directly, anyway, -via NFS). - -The goal in selecting a mail backend is to pick one which -simultaneously represents a suitable way of dealing with the original -format plus leaving mail in a form that is convenient to use in the -future. Here are some high and low points on each: - -@table @code -@item nnmbox - -UNIX systems have historically had a single, very common, and well- -defined format. All messages arrive in a single @dfn{spool file}, and -they are delineated by a line whose regular expression matches -@samp{^From_}. (My notational use of @samp{_} is to indicate a space, -to make it clear in this instance that this is not the RFC-specified -@samp{From:} header.) Because Emacs and therefore Gnus emanate -historically from the Unix environment, it is simplest if one does not -mess a great deal with the original mailbox format, so if one chooses -this backend, Gnus' primary activity in getting mail from the real spool -area to Gnus' preferred directory is simply to copy it, with no -(appreciable) format change in the process. It is the ``dumbest'' way -to move mail into availability in the Gnus environment. This makes it -fast to move into place, but slow to parse, when Gnus has to look at -what's where. - -@item nnbabyl - -Once upon a time, there was the DEC-10 and DEC-20, running operating -systems called TOPS and related things, and the usual (only?) mail -reading environment was a thing called Babyl. I don't know what format -was used for mail landing on the system, but Babyl had its own internal -format to which mail was converted, primarily involving creating a -spool-file-like entity with a scheme for inserting Babyl-specific -headers and status bits above the top of each message in the file. -RMAIL was Emacs' first mail reader, it was written by Richard Stallman, -and Stallman came out of that TOPS/Babyl environment, so he wrote RMAIL -to understand the mail files folks already had in existence. Gnus (and -VM, for that matter) continue to support this format because it's -perceived as having some good qualities in those mailer-specific -headers/status bits stuff. RMAIL itself still exists as well, of -course, and is still maintained by Stallman. - -Both of the above forms leave your mail in a single file on your -filesystem, and they must parse that entire file each time you take a -look at your mail. - -@item nnml - -@code{nnml} is the backend which smells the most as though you were -actually operating with an @code{nnspool}-accessed Usenet system. (In -fact, I believe @code{nnml} actually derived from @code{nnspool} code, -lo these years ago.) One's mail is taken from the original spool file, -and is then cut up into individual message files, 1:1. It maintains a -Usenet-style active file (analogous to what one finds in an INN- or -CNews-based news system in (for instance) @file{/var/lib/news/active}, -or what is returned via the @samp{NNTP LIST} verb) and also creates -@dfn{overview} files for efficient group entry, as has been defined for -@sc{nntp} servers for some years now. It is slower in mail-splitting, -due to the creation of lots of files, updates to the @code{nnml} active -file, and additions to overview files on a per-message basis, but it is -extremely fast on access because of what amounts to the indexing support -provided by the active file and overviews. - -@code{nnml} costs @dfn{inodes} in a big way; that is, it soaks up the -resource which defines available places in the filesystem to put new -files. Sysadmins take a dim view of heavy inode occupation within -tight, shared filesystems. But if you live on a personal machine where -the filesystem is your own and space is not at a premium, @code{nnml} -wins big. - -It is also problematic using this backend if you are living in a -FAT16-based Windows world, since much space will be wasted on all these -tiny files. - -@item nnmh - -The Rand MH mail-reading system has been around UNIX systems for a very -long time; it operates by splitting one's spool file of messages into -individual files, but with little or no indexing support -- @code{nnmh} -is considered to be semantically equivalent to ``@code{nnml} without -active file or overviews''. This is arguably the worst choice, because -one gets the slowness of individual file creation married to the -slowness of access parsing when learning what's new in one's groups. - -@item nnfolder - -Basically the effect of @code{nnfolder} is @code{nnmbox} (the first -method described above) on a per-group basis. That is, @code{nnmbox} -itself puts *all* one's mail in one file; @code{nnfolder} provides a -little bit of optimization to this so that each of one's mail groups has -a Unix mail box file. It's faster than @code{nnmbox} because each group -can be parsed separately, and still provides the simple Unix mail box -format requiring minimal effort in moving the mail around. In addition, -it maintains an ``active'' file making it much faster for Gnus to figure -out how many messages there are in each separate group. - -If you have groups that are expected to have a massive amount of -messages, @code{nnfolder} is not the best choice, but if you receive -only a moderate amount of mail, @code{nnfolder} is probably the most -friendly mail backend all over. - -@end table - - -@node Browsing the Web -@section Browsing the Web -@cindex web -@cindex browsing the web -@cindex www -@cindex http - -Web-based discussion forums are getting more and more popular. On many -subjects, the web-based forums have become the most important forums, -eclipsing the importance of mailing lists and news groups. The reason -is easy to understand---they are friendly to new users; you just point -and click, and there's the discussion. With mailing lists, you have to -go through a cumbersome subscription procedure, and most people don't -even know what a news group is. - -The problem with this scenario is that web browsers are not very good at -being newsreaders. They do not keep track of what articles you've read; -they do not allow you to score on subjects you're interested in; they do -not allow off-line browsing; they require you to click around and drive -you mad in the end. - -So---if web browsers suck at reading discussion forums, why not use Gnus -to do it instead? - -Gnus has been getting a bit of a collection of backends for providing -interfaces to these sources. - -@menu -* Web Searches:: Creating groups from articles that match a string. -* Slashdot:: Reading the Slashdot comments. -* Ultimate:: The Ultimate Bulletin Board systems. -* Web Archive:: Reading mailing list archived on web. -* RSS:: Reading RDF site summary. -* Customizing w3:: Doing stuff to Emacs/w3 from Gnus. -@end menu - -All the web sources require Emacs/w3 and the url library to work. - -The main caveat with all these web sources is that they probably won't -work for a very long time. Gleaning information from the @sc{html} data -is guesswork at best, and when the layout is altered, the Gnus backend -will fail. If you have reasonably new versions of these backends, -though, you should be ok. - -One thing all these Web methods have in common is that the Web sources -are often down, unavailable or just plain too slow to be fun. In those -cases, it makes a lot of sense to let the Gnus Agent (@pxref{Gnus -Unplugged}) handle downloading articles, and then you can read them at -leisure from your local disk. No more World Wide Wait for you. - -@node Archiving Mail -@subsection Archiving Mail -@cindex archiving mail -@cindex backup of mail - -Some of the backends, notably nnml and nnfolder, now actually store -the article marks with each group. For these servers, archiving and -restoring a group while preserving marks is fairly simple. - -(Preserving the group level and group parameters as well still -requires ritual dancing and sacrifices to the @code{.newsrc.eld} deity -though.) - -To archive an entire @code{nnml} or @code{nnfolder} server, take a -recursive copy of the server directory. There is no need to shut down -Gnus, so archiving may be invoked by @code{cron} or similar. You -restore the data by restoring the directory tree, and adding a server -definition pointing to that directory in Gnus. The @ref{Article -Backlog}, @ref{Asynchronous Fetching} and other things might interfer -with overwriting data, so you may want to shut down Gnus before you -restore the data. - -It is also possible to archive individual @code{nnml} or -@code{nnfolder} groups, while preserving marks. For @code{nnml}, you -copy all files in the group's directory. For @code{nnfolder} you need -to copy both the base folder file itself (@code{FOO}, say), and the -marks file (@code{FOO.mrk} in this example). Restoring the group is -done with @kbd{G m} from the Group buffer. The last step makes Gnus -notice the new directory. - -@node Web Searches -@subsection Web Searches -@cindex nnweb -@cindex DejaNews -@cindex Alta Vista -@cindex InReference -@cindex Usenet searches -@cindex searching the Usenet - -It's, like, too neat to search the Usenet for articles that match a -string, but it, like, totally @emph{sucks}, like, totally, to use one of -those, like, Web browsers, and you, like, have to, rilly, like, look at -the commercials, so, like, with Gnus you can do @emph{rad}, rilly, -searches without having to use a browser. - -The @code{nnweb} backend allows an easy interface to the mighty search -engine. You create an @code{nnweb} group, enter a search pattern, and -then enter the group and read the articles like you would any normal -group. The @kbd{G w} command in the group buffer (@pxref{Foreign -Groups}) will do this in an easy-to-use fashion. - -@code{nnweb} groups don't really lend themselves to being solid -groups---they have a very fleeting idea of article numbers. In fact, -each time you enter an @code{nnweb} group (not even changing the search -pattern), you are likely to get the articles ordered in a different -manner. Not even using duplicate suppression (@pxref{Duplicate -Suppression}) will help, since @code{nnweb} doesn't even know the -@code{Message-ID} of the articles before reading them using some search -engines (DejaNews, for instance). The only possible way to keep track -of which articles you've read is by scoring on the @code{Date} -header---mark all articles posted before the last date you read the -group as read. - -If the search engine changes its output substantially, @code{nnweb} -won't be able to parse it and will fail. One could hardly fault the Web -providers if they were to do this---their @emph{raison d'être} is to -make money off of advertisements, not to provide services to the -community. Since @code{nnweb} washes the ads off all the articles, one -might think that the providers might be somewhat miffed. We'll see. - -You must have the @code{url} and @code{w3} package installed to be able -to use @code{nnweb}. - -Virtual server variables: - -@table @code -@item nnweb-type -@vindex nnweb-type -What search engine type is being used. The currently supported types -are @code{dejanews}, @code{dejanewsold}, @code{altavista} and -@code{reference}. - -@item nnweb-search -@vindex nnweb-search -The search string to feed to the search engine. - -@item nnweb-max-hits -@vindex nnweb-max-hits -Advisory maximum number of hits per search to display. The default is -100. - -@item nnweb-type-definition -@vindex nnweb-type-definition -Type-to-definition alist. This alist says what @code{nnweb} should do -with the various search engine types. The following elements must be -present: - -@table @code -@item article -Function to decode the article and provide something that Gnus -understands. - -@item map -Function to create an article number to message header and URL alist. - -@item search -Function to send the search string to the search engine. - -@item address -The address the aforementioned function should send the search string -to. - -@item id -Format string URL to fetch an article by @code{Message-ID}. -@end table - -@end table - - -@node Slashdot -@subsection Slashdot -@cindex Slashdot -@cindex nnslashdot - -Slashdot (@uref{http://slashdot.org/}) is a popular news site, with -lively discussion following the news articles. @code{nnslashdot} will -let you read this forum in a convenient manner. - -The easiest way to read this source is to put something like the -following in your @file{.gnus.el} file: - -@lisp -(setq gnus-secondary-select-methods - '((nnslashdot ""))) -@end lisp - -This will make Gnus query the @code{nnslashdot} backend for new comments -and groups. The @kbd{F} command will subscribe each new news article as -a new Gnus group, and you can read the comments by entering these -groups. (Note that the default subscription method is to subscribe new -groups as zombies. Other methods are available (@pxref{Subscription -Methods}). - -If you want to remove an old @code{nnslashdot} group, the @kbd{G DEL} -command is the most handy tool (@pxref{Foreign Groups}). - -When following up to @code{nnslashdot} comments (or posting new -comments), some light @sc{html}izations will be performed. In -particular, text quoted with @samp{> } will be quoted with -@code{blockquote} instead, and signatures will have @code{br} added to -the end of each line. Other than that, you can just write @sc{html} -directly into the message buffer. Note that Slashdot filters out some -@sc{html} forms. - -The following variables can be altered to change its behavior: - -@table @code -@item nnslashdot-threaded -Whether @code{nnslashdot} should display threaded groups or not. The -default is @code{t}. To be able to display threads, @code{nnslashdot} -has to retrieve absolutely all comments in a group upon entry. If a -threaded display is not required, @code{nnslashdot} will only retrieve -the comments that are actually wanted by the user. Threading is nicer, -but much, much slower than untreaded. - -@item nnslashdot-login-name -@vindex nnslashdot-login-name -The login name to use when posting. - -@item nnslashdot-password -@vindex nnslashdot-password -The password to use when posting. - -@item nnslashdot-directory -@vindex nnslashdot-directory -Where @code{nnslashdot} will store its files. The default is -@samp{~/News/slashdot/}. - -@item nnslashdot-active-url -@vindex nnslashdot-active-url -The @sc{url} format string that will be used to fetch the information on -news articles and comments. The default is -@samp{http://slashdot.org/search.pl?section=&min=%d}. - -@item nnslashdot-comments-url -@vindex nnslashdot-comments-url -The @sc{url} format string that will be used to fetch comments. The -default is -@samp{http://slashdot.org/comments.pl?sid=%s&threshold=%d&commentsort=%d&mode=flat&startat=%d}. - -@item nnslashdot-article-url -@vindex nnslashdot-article-url -The @sc{url} format string that will be used to fetch the news article. The -default is -@samp{http://slashdot.org/article.pl?sid=%s&mode=nocomment}. - -@item nnslashdot-threshold -@vindex nnslashdot-threshold -The score threshold. The default is -1. - -@item nnslashdot-group-number -@vindex nnslashdot-group-number -The number of old groups, in addition to the ten latest, to keep -updated. The default is 0. - -@end table - - - -@node Ultimate -@subsection Ultimate -@cindex nnultimate -@cindex Ultimate Bulletin Board - -The Ultimate Bulletin Board (@uref{http://www.ultimatebb.com/}) is -probably the most popular Web bulletin board system used. It has a -quite regular and nice interface, and it's possible to get the -information Gnus needs to keep groups updated. - -The easiest way to get started with @code{nnultimate} is to say -something like the following in the group buffer: @kbd{B nnultimate RET -http://www.tcj.com/messboard/ubbcgi/ RET}. (Substitute the @sc{url} -(not including @samp{Ultimate.cgi} or the like at the end) for a forum -you're interested in; there's quite a list of them on the Ultimate web -site.) Then subscribe to the groups you're interested in from the -server buffer, and read them from the group buffer. - -The following @code{nnultimate} variables can be altered: - -@table @code -@item nnultimate-directory -@vindex nnultimate-directory -The directory where @code{nnultimate} stores its files. The default is -@samp{~/News/ultimate/}. -@end table - - -@node Web Archive -@subsection Web Archive -@cindex nnwarchive -@cindex Web Archive - -Some mailing lists only have archives on Web servers, such as -@uref{http://www.egroups.com/} and -@uref{http://www.mail-archive.com/}. It has a quite regular and nice -interface, and it's possible to get the information Gnus needs to keep -groups updated. - -The easiest way to get started with @code{nnwarchive} is to say -something like the following in the group buffer: @kbd{M-x -gnus-group-make-warchive-group RET an_egroup RET egroups RET -www.egroups.com RET your@@email.address RET}. (Substitute the -@sc{an_egroup} with the mailing list you subscribed, the -@sc{your@@email.address} with your email address.), or to browse the -backend by @kbd{B nnwarchive RET mail-archive RET}. - -The following @code{nnwarchive} variables can be altered: - -@table @code -@item nnwarchive-directory -@vindex nnwarchive-directory -The directory where @code{nnwarchive} stores its files. The default is -@samp{~/News/warchive/}. - -@item nnwarchive-login -@vindex nnwarchive-login -The account name on the web server. - -@item nnwarchive-passwd -@vindex nnwarchive-passwd -The password for your account on the web server. -@end table - -@node RSS -@subsection RSS -@cindex nnrss -@cindex RSS - -Some sites have RDF site summary (RSS) -@uref{http://purl.org/rss/1.0/spec}. It has a quite regular and nice -interface, and it's possible to get the information Gnus needs to keep -groups updated. - -The easiest way to get started with @code{nnrss} is to say something -like the following in the group buffer: @kbd{B nnrss RET RET}, then -subscribe groups. - -The following @code{nnrss} variables can be altered: - -@table @code -@item nnrss-directory -@vindex nnrss-directory -The directory where @code{nnrss} stores its files. The default is -@samp{~/News/rss/}. - -@end table - -The following code may be helpful, if you want to show the description in -the summary buffer. - -@lisp -(add-to-list 'nnmail-extra-headers nnrss-description-field) -(setq gnus-summary-line-format "%U%R%z%I%(%[%4L: %-15,15f%]%) %s%uX\n") - -(defun gnus-user-format-function-X (header) - (let ((descr - (assq nnrss-description-field (mail-header-extra header)))) - (if descr (concat "\n\t" (cdr descr)) ""))) -@end lisp - -The following code may be useful to open an nnrss url directly from the -summary buffer. -@lisp -(require 'browse-url) - -(defun browse-nnrss-url( arg ) - (interactive "p") - (let ((url (assq nnrss-url-field - (mail-header-extra - (gnus-data-header - (assq (gnus-summary-article-number) - gnus-newsgroup-data)))))) - (if url - (browse-url (cdr url)) - (gnus-summary-scroll-up arg)))) - -(eval-after-load "gnus" - #'(define-key gnus-summary-mode-map - (kbd "") 'browse-nnrss-url)) -(add-to-list 'nnmail-extra-headers nnrss-url-field) -@end lisp - -@node Customizing w3 -@subsection Customizing w3 -@cindex w3 -@cindex html -@cindex url -@cindex Netscape - -Gnus uses the url library to fetch web pages and Emacs/w3 to display web -pages. Emacs/w3 is documented in its own manual, but there are some -things that may be more relevant for Gnus users. - -For instance, a common question is how to make Emacs/w3 follow links -using the @code{browse-url} functions (which will call some external web -browser like Netscape). Here's one way: - -@lisp -(eval-after-load "w3" - '(progn - (fset 'w3-fetch-orig (symbol-function 'w3-fetch)) - (defun w3-fetch (&optional url target) - (interactive (list (w3-read-url-with-default))) - (if (eq major-mode 'gnus-article-mode) - (browse-url url) - (w3-fetch-orig url target))))) -@end lisp - -Put that in your @file{.emacs} file, and hitting links in w3-rendered -@sc{html} in the Gnus article buffers will use @code{browse-url} to -follow the link. - - -@node Other Sources -@section Other Sources - -Gnus can do more than just read news or mail. The methods described -below allow Gnus to view directories and files as if they were -newsgroups. - -@menu -* Directory Groups:: You can read a directory as if it was a newsgroup. -* Anything Groups:: Dired? Who needs dired? -* Document Groups:: Single files can be the basis of a group. -* SOUP:: Reading @sc{soup} packets ``offline''. -* Mail-To-News Gateways:: Posting articles via mail-to-news gateways. -* IMAP:: Using Gnus as a @sc{imap} client. -@end menu - - -@node Directory Groups -@subsection Directory Groups -@cindex nndir -@cindex directory groups - -If you have a directory that has lots of articles in separate files in -it, you might treat it as a newsgroup. The files have to have numerical -names, of course. - -This might be an opportune moment to mention @code{ange-ftp} (and its -successor @code{efs}), that most wonderful of all wonderful Emacs -packages. When I wrote @code{nndir}, I didn't think much about it---a -backend to read directories. Big deal. - -@code{ange-ftp} changes that picture dramatically. For instance, if you -enter the @code{ange-ftp} file name -@file{/ftp.hpc.uh.edu:/pub/emacs/ding-list/} as the directory name, -@code{ange-ftp} or @code{efs} will actually allow you to read this -directory over at @samp{sina} as a newsgroup. Distributed news ahoy! - -@code{nndir} will use @sc{nov} files if they are present. - -@code{nndir} is a ``read-only'' backend---you can't delete or expire -articles with this method. You can use @code{nnmh} or @code{nnml} for -whatever you use @code{nndir} for, so you could switch to any of those -methods if you feel the need to have a non-read-only @code{nndir}. - - -@node Anything Groups -@subsection Anything Groups -@cindex nneething - -From the @code{nndir} backend (which reads a single spool-like -directory), it's just a hop and a skip to @code{nneething}, which -pretends that any arbitrary directory is a newsgroup. Strange, but -true. - -When @code{nneething} is presented with a directory, it will scan this -directory and assign article numbers to each file. When you enter such -a group, @code{nneething} must create ``headers'' that Gnus can use. -After all, Gnus is a newsreader, in case you're forgetting. -@code{nneething} does this in a two-step process. First, it snoops each -file in question. If the file looks like an article (i.e., the first -few lines look like headers), it will use this as the head. If this is -just some arbitrary file without a head (e.g. a C source file), -@code{nneething} will cobble up a header out of thin air. It will use -file ownership, name and date and do whatever it can with these -elements. - -All this should happen automatically for you, and you will be presented -with something that looks very much like a newsgroup. Totally like a -newsgroup, to be precise. If you select an article, it will be displayed -in the article buffer, just as usual. - -If you select a line that represents a directory, Gnus will pop you into -a new summary buffer for this @code{nneething} group. And so on. You can -traverse the entire disk this way, if you feel like, but remember that -Gnus is not dired, really, and does not intend to be, either. - -There are two overall modes to this action---ephemeral or solid. When -doing the ephemeral thing (i.e., @kbd{G D} from the group buffer), Gnus -will not store information on what files you have read, and what files -are new, and so on. If you create a solid @code{nneething} group the -normal way with @kbd{G m}, Gnus will store a mapping table between -article numbers and file names, and you can treat this group like any -other groups. When you activate a solid @code{nneething} group, you will -be told how many unread articles it contains, etc., etc. - -Some variables: - -@table @code -@item nneething-map-file-directory -@vindex nneething-map-file-directory -All the mapping files for solid @code{nneething} groups will be stored -in this directory, which defaults to @file{~/.nneething/}. - -@item nneething-exclude-files -@vindex nneething-exclude-files -All files that match this regexp will be ignored. Nice to use to exclude -auto-save files and the like, which is what it does by default. - -@item nneething-include-files -@vindex nneething-include-files -Regexp saying what files to include in the group. If this variable is -non-@code{nil}, only files matching this regexp will be included. - -@item nneething-map-file -@vindex nneething-map-file -Name of the map files. -@end table - - -@node Document Groups -@subsection Document Groups -@cindex nndoc -@cindex documentation group -@cindex help group - -@code{nndoc} is a cute little thing that will let you read a single file -as a newsgroup. Several files types are supported: - -@table @code -@cindex babyl -@cindex rmail mbox - -@item babyl -The babyl (rmail) mail box. -@cindex mbox -@cindex Unix mbox - -@item mbox -The standard Unix mbox file. - -@cindex MMDF mail box -@item mmdf -The MMDF mail box format. - -@item news -Several news articles appended into a file. - -@item rnews -@cindex rnews batch files -The rnews batch transport format. -@cindex forwarded messages - -@item forward -Forwarded articles. - -@item nsmail -Netscape mail boxes. - -@item mime-parts -MIME multipart messages. - -@item standard-digest -The standard (RFC 1153) digest format. - -@item slack-digest -Non-standard digest format---matches most things, but does it badly. -@end table - -You can also use the special ``file type'' @code{guess}, which means -that @code{nndoc} will try to guess what file type it is looking at. -@code{digest} means that @code{nndoc} should guess what digest type the -file is. - -@code{nndoc} will not try to change the file or insert any extra headers into -it---it will simply, like, let you use the file as the basis for a -group. And that's it. - -If you have some old archived articles that you want to insert into your -new & spiffy Gnus mail backend, @code{nndoc} can probably help you with -that. Say you have an old @file{RMAIL} file with mail that you now want -to split into your new @code{nnml} groups. You look at that file using -@code{nndoc} (using the @kbd{G f} command in the group buffer -(@pxref{Foreign Groups})), set the process mark on all the articles in -the buffer (@kbd{M P b}, for instance), and then re-spool (@kbd{B r}) -using @code{nnml}. If all goes well, all the mail in the @file{RMAIL} -file is now also stored in lots of @code{nnml} directories, and you can -delete that pesky @file{RMAIL} file. If you have the guts! - -Virtual server variables: - -@table @code -@item nndoc-article-type -@vindex nndoc-article-type -This should be one of @code{mbox}, @code{babyl}, @code{digest}, -@code{news}, @code{rnews}, @code{mmdf}, @code{forward}, @code{rfc934}, -@code{rfc822-forward}, @code{mime-parts}, @code{standard-digest}, -@code{slack-digest}, @code{clari-briefs}, @code{nsmail} or @code{guess}. - -@item nndoc-post-type -@vindex nndoc-post-type -This variable says whether Gnus is to consider the group a news group or -a mail group. There are two valid values: @code{mail} (the default) -and @code{news}. -@end table - -@menu -* Document Server Internals:: How to add your own document types. -@end menu - - -@node Document Server Internals -@subsubsection Document Server Internals - -Adding new document types to be recognized by @code{nndoc} isn't -difficult. You just have to whip up a definition of what the document -looks like, write a predicate function to recognize that document type, -and then hook into @code{nndoc}. - -First, here's an example document type definition: - -@example -(mmdf - (article-begin . "^\^A\^A\^A\^A\n") - (body-end . "^\^A\^A\^A\^A\n")) -@end example - -The definition is simply a unique @dfn{name} followed by a series of -regexp pseudo-variable settings. Below are the possible -variables---don't be daunted by the number of variables; most document -types can be defined with very few settings: - -@table @code -@item first-article -If present, @code{nndoc} will skip past all text until it finds -something that match this regexp. All text before this will be -totally ignored. - -@item article-begin -This setting has to be present in all document type definitions. It -says what the beginning of each article looks like. - -@item head-begin-function -If present, this should be a function that moves point to the head of -the article. - -@item nndoc-head-begin -If present, this should be a regexp that matches the head of the -article. - -@item nndoc-head-end -This should match the end of the head of the article. It defaults to -@samp{^$}---the empty line. - -@item body-begin-function -If present, this function should move point to the beginning of the body -of the article. - -@item body-begin -This should match the beginning of the body of the article. It defaults -to @samp{^\n}. - -@item body-end-function -If present, this function should move point to the end of the body of -the article. - -@item body-end -If present, this should match the end of the body of the article. - -@item file-end -If present, this should match the end of the file. All text after this -regexp will be totally ignored. - -@end table - -So, using these variables @code{nndoc} is able to dissect a document -file into a series of articles, each with a head and a body. However, a -few more variables are needed since not all document types are all that -news-like---variables needed to transform the head or the body into -something that's palatable for Gnus: - -@table @code -@item prepare-body-function -If present, this function will be called when requesting an article. It -will be called with point at the start of the body, and is useful if the -document has encoded some parts of its contents. - -@item article-transform-function -If present, this function is called when requesting an article. It's -meant to be used for more wide-ranging transformation of both head and -body of the article. - -@item generate-head-function -If present, this function is called to generate a head that Gnus can -understand. It is called with the article number as a parameter, and is -expected to generate a nice head for the article in question. It is -called when requesting the headers of all articles. - -@end table - -Let's look at the most complicated example I can come up with---standard -digests: - -@example -(standard-digest - (first-article . ,(concat "^" (make-string 70 ?-) "\n\n+")) - (article-begin . ,(concat "\n\n" (make-string 30 ?-) "\n\n+")) - (prepare-body-function . nndoc-unquote-dashes) - (body-end-function . nndoc-digest-body-end) - (head-end . "^ ?$") - (body-begin . "^ ?\n") - (file-end . "^End of .*digest.*[0-9].*\n\\*\\*\\|^End of.*Digest *$") - (subtype digest guess)) -@end example - -We see that all text before a 70-width line of dashes is ignored; all -text after a line that starts with that @samp{^End of} is also ignored; -each article begins with a 30-width line of dashes; the line separating -the head from the body may contain a single space; and that the body is -run through @code{nndoc-unquote-dashes} before being delivered. - -To hook your own document definition into @code{nndoc}, use the -@code{nndoc-add-type} function. It takes two parameters---the first is -the definition itself and the second (optional) parameter says where in -the document type definition alist to put this definition. The alist is -traversed sequentially, and @code{nndoc-TYPE-type-p} is called for a given type @code{TYPE}. So @code{nndoc-mmdf-type-p} is called to see whether a document -is of @code{mmdf} type, and so on. These type predicates should return -@code{nil} if the document is not of the correct type; @code{t} if it is -of the correct type; and a number if the document might be of the -correct type. A high number means high probability; a low number means -low probability with @samp{0} being the lowest valid number. - - -@node SOUP -@subsection SOUP -@cindex SOUP -@cindex offline - -In the PC world people often talk about ``offline'' newsreaders. These -are thingies that are combined reader/news transport monstrosities. -With built-in modem programs. Yecchh! - -Of course, us Unix Weenie types of human beans use things like -@code{uucp} and, like, @code{nntpd} and set up proper news and mail -transport things like Ghod intended. And then we just use normal -newsreaders. - -However, it can sometimes be convenient to do something that's a bit -easier on the brain if you have a very slow modem, and you're not really -that interested in doing things properly. - -A file format called @sc{soup} has been developed for transporting news -and mail from servers to home machines and back again. It can be a bit -fiddly. - -First some terminology: - -@table @dfn - -@item server -This is the machine that is connected to the outside world and where you -get news and/or mail from. - -@item home machine -This is the machine that you want to do the actual reading and responding -on. It is typically not connected to the rest of the world in any way. - -@item packet -Something that contains messages and/or commands. There are two kinds -of packets: - -@table @dfn -@item message packets -These are packets made at the server, and typically contain lots of -messages for you to read. These are called @file{SoupoutX.tgz} by -default, where @var{x} is a number. - -@item response packets -These are packets made at the home machine, and typically contains -replies that you've written. These are called @file{SoupinX.tgz} by -default, where @var{x} is a number. - -@end table - -@end table - - -@enumerate - -@item -You log in on the server and create a @sc{soup} packet. You can either -use a dedicated @sc{soup} thingie (like the @code{awk} program), or you -can use Gnus to create the packet with its @sc{soup} commands (@kbd{O -s} and/or @kbd{G s b}; and then @kbd{G s p}) (@pxref{SOUP Commands}). - -@item -You transfer the packet home. Rail, boat, car or modem will do fine. - -@item -You put the packet in your home directory. - -@item -You fire up Gnus on your home machine using the @code{nnsoup} backend as -the native or secondary server. - -@item -You read articles and mail and answer and followup to the things you -want (@pxref{SOUP Replies}). - -@item -You do the @kbd{G s r} command to pack these replies into a @sc{soup} -packet. - -@item -You transfer this packet to the server. - -@item -You use Gnus to mail this packet out with the @kbd{G s s} command. - -@item -You then repeat until you die. - -@end enumerate - -So you basically have a bipartite system---you use @code{nnsoup} for -reading and Gnus for packing/sending these @sc{soup} packets. - -@menu -* SOUP Commands:: Commands for creating and sending @sc{soup} packets -* SOUP Groups:: A backend for reading @sc{soup} packets. -* SOUP Replies:: How to enable @code{nnsoup} to take over mail and news. -@end menu - - -@node SOUP Commands -@subsubsection SOUP Commands - -These are commands for creating and manipulating @sc{soup} packets. - -@table @kbd -@item G s b -@kindex G s b (Group) -@findex gnus-group-brew-soup -Pack all unread articles in the current group -(@code{gnus-group-brew-soup}). This command understands the -process/prefix convention. - -@item G s w -@kindex G s w (Group) -@findex gnus-soup-save-areas -Save all @sc{soup} data files (@code{gnus-soup-save-areas}). - -@item G s s -@kindex G s s (Group) -@findex gnus-soup-send-replies -Send all replies from the replies packet -(@code{gnus-soup-send-replies}). - -@item G s p -@kindex G s p (Group) -@findex gnus-soup-pack-packet -Pack all files into a @sc{soup} packet (@code{gnus-soup-pack-packet}). - -@item G s r -@kindex G s r (Group) -@findex nnsoup-pack-replies -Pack all replies into a replies packet (@code{nnsoup-pack-replies}). - -@item O s -@kindex O s (Summary) -@findex gnus-soup-add-article -This summary-mode command adds the current article to a @sc{soup} packet -(@code{gnus-soup-add-article}). It understands the process/prefix -convention (@pxref{Process/Prefix}). - -@end table - - -There are a few variables to customize where Gnus will put all these -thingies: - -@table @code - -@item gnus-soup-directory -@vindex gnus-soup-directory -Directory where Gnus will save intermediate files while composing -@sc{soup} packets. The default is @file{~/SoupBrew/}. - -@item gnus-soup-replies-directory -@vindex gnus-soup-replies-directory -This is what Gnus will use as a temporary directory while sending our -reply packets. @file{~/SoupBrew/SoupReplies/} is the default. - -@item gnus-soup-prefix-file -@vindex gnus-soup-prefix-file -Name of the file where Gnus stores the last used prefix. The default is -@samp{gnus-prefix}. - -@item gnus-soup-packer -@vindex gnus-soup-packer -A format string command for packing a @sc{soup} packet. The default is -@samp{tar cf - %s | gzip > $HOME/Soupout%d.tgz}. - -@item gnus-soup-unpacker -@vindex gnus-soup-unpacker -Format string command for unpacking a @sc{soup} packet. The default is -@samp{gunzip -c %s | tar xvf -}. - -@item gnus-soup-packet-directory -@vindex gnus-soup-packet-directory -Where Gnus will look for reply packets. The default is @file{~/}. - -@item gnus-soup-packet-regexp -@vindex gnus-soup-packet-regexp -Regular expression matching @sc{soup} reply packets in -@code{gnus-soup-packet-directory}. - -@end table - - -@node SOUP Groups -@subsubsection @sc{soup} Groups -@cindex nnsoup - -@code{nnsoup} is the backend for reading @sc{soup} packets. It will -read incoming packets, unpack them, and put them in a directory where -you can read them at leisure. - -These are the variables you can use to customize its behavior: - -@table @code - -@item nnsoup-tmp-directory -@vindex nnsoup-tmp-directory -When @code{nnsoup} unpacks a @sc{soup} packet, it does it in this -directory. (@file{/tmp/} by default.) - -@item nnsoup-directory -@vindex nnsoup-directory -@code{nnsoup} then moves each message and index file to this directory. -The default is @file{~/SOUP/}. - -@item nnsoup-replies-directory -@vindex nnsoup-replies-directory -All replies will be stored in this directory before being packed into a -reply packet. The default is @file{~/SOUP/replies/"}. - -@item nnsoup-replies-format-type -@vindex nnsoup-replies-format-type -The @sc{soup} format of the replies packets. The default is @samp{?n} -(rnews), and I don't think you should touch that variable. I probably -shouldn't even have documented it. Drats! Too late! - -@item nnsoup-replies-index-type -@vindex nnsoup-replies-index-type -The index type of the replies packet. The default is @samp{?n}, which -means ``none''. Don't fiddle with this one either! - -@item nnsoup-active-file -@vindex nnsoup-active-file -Where @code{nnsoup} stores lots of information. This is not an ``active -file'' in the @code{nntp} sense; it's an Emacs Lisp file. If you lose -this file or mess it up in any way, you're dead. The default is -@file{~/SOUP/active}. - -@item nnsoup-packer -@vindex nnsoup-packer -Format string command for packing a reply @sc{soup} packet. The default -is @samp{tar cf - %s | gzip > $HOME/Soupin%d.tgz}. - -@item nnsoup-unpacker -@vindex nnsoup-unpacker -Format string command for unpacking incoming @sc{soup} packets. The -default is @samp{gunzip -c %s | tar xvf -}. - -@item nnsoup-packet-directory -@vindex nnsoup-packet-directory -Where @code{nnsoup} will look for incoming packets. The default is -@file{~/}. - -@item nnsoup-packet-regexp -@vindex nnsoup-packet-regexp -Regular expression matching incoming @sc{soup} packets. The default is -@samp{Soupout}. - -@item nnsoup-always-save -@vindex nnsoup-always-save -If non-@code{nil}, save the replies buffer after each posted message. - -@end table - - -@node SOUP Replies -@subsubsection SOUP Replies - -Just using @code{nnsoup} won't mean that your postings and mailings end -up in @sc{soup} reply packets automagically. You have to work a bit -more for that to happen. - -@findex nnsoup-set-variables -The @code{nnsoup-set-variables} command will set the appropriate -variables to ensure that all your followups and replies end up in the -@sc{soup} system. - -In specific, this is what it does: - -@lisp -(setq message-send-news-function 'nnsoup-request-post) -(setq message-send-mail-function 'nnsoup-request-mail) -@end lisp - -And that's it, really. If you only want news to go into the @sc{soup} -system you just use the first line. If you only want mail to be -@sc{soup}ed you use the second. - - -@node Mail-To-News Gateways -@subsection Mail-To-News Gateways -@cindex mail-to-news gateways -@cindex gateways - -If your local @code{nntp} server doesn't allow posting, for some reason -or other, you can post using one of the numerous mail-to-news gateways. -The @code{nngateway} backend provides the interface. - -Note that you can't read anything from this backend---it can only be -used to post with. - -Server variables: - -@table @code -@item nngateway-address -@vindex nngateway-address -This is the address of the mail-to-news gateway. - -@item nngateway-header-transformation -@vindex nngateway-header-transformation -News headers often have to be transformed in some odd way or other -for the mail-to-news gateway to accept it. This variable says what -transformation should be called, and defaults to -@code{nngateway-simple-header-transformation}. The function is called -narrowed to the headers to be transformed and with one parameter---the -gateway address. - -This default function just inserts a new @code{To} header based on the -@code{Newsgroups} header and the gateway address. -For instance, an article with this @code{Newsgroups} header: - -@example -Newsgroups: alt.religion.emacs -@end example - -will get this @code{From} header inserted: - -@example -To: alt-religion-emacs@@GATEWAY -@end example - -The following pre-defined functions exist: - -@findex nngateway-simple-header-transformation -@table @code - -@item nngateway-simple-header-transformation -Creates a @code{To} header that looks like -@var{newsgroup}@@@code{nngateway-address}. - -@findex nngateway-mail2news-header-transformation - -@item nngateway-mail2news-header-transformation -Creates a @code{To} header that looks like -@code{nngateway-address}. - -Here's an example: - -@lisp -(setq gnus-post-method - '(nngateway - "mail2news@@replay.com" - (nngateway-header-transformation - nngateway-mail2news-header-transformation))) -@end lisp - -@end table - - -@end table - -So, to use this, simply say something like: - -@lisp -(setq gnus-post-method '(nngateway "GATEWAY.ADDRESS")) -@end lisp - - - -@node IMAP -@subsection @sc{imap} -@cindex nnimap -@cindex @sc{imap} - -@sc{imap} is a network protocol for reading mail (or news, or ...), -think of it as a modernized @sc{nntp}. Connecting to a @sc{imap} -server is much similar to connecting to a news server, you just -specify the network address of the server. - -@sc{imap} has two properties. First, @sc{imap} can do everything that -POP can, it can hence be viewed as POP++. Secondly, @sc{imap} is a -mail storage protocol, similar to @sc{nntp} being a news storage -protocol. (@sc{imap} offers more features than @sc{nntp} because news -is more or less read-only whereas mail is read-write.) - -If you want to use @sc{imap} as POP++, use an imap entry in -mail-sources. With this, Gnus will fetch mails from the @sc{imap} -server and store them on the local disk. This is not the usage -described in this section. @xref{Mail Sources}. - -If you want to use @sc{imap} as a mail storage protocol, use an nnimap -entry in gnus-secondary-select-methods. With this, Gnus will -manipulate mails stored on the @sc{imap} server. This is the kind of -usage explained in this section. - -A server configuration in @code{~/.gnus} with a few @sc{imap} servers -might look something like this: - -@lisp -(setq gnus-secondary-select-methods - '((nnimap "simpleserver") ; no special configuration - ; perhaps a ssh port forwarded server: - (nnimap "dolk" - (nnimap-address "localhost") - (nnimap-server-port 1430)) - ; a UW server running on localhost - (nnimap "barbar" - (nnimap-server-port 143) - (nnimap-address "localhost") - (nnimap-list-pattern ("INBOX" "mail/*"))) - ; anonymous public cyrus server: - (nnimap "cyrus.andrew.cmu.edu" - (nnimap-authenticator anonymous) - (nnimap-list-pattern "archive.*") - (nnimap-stream network)) - ; a ssl server on a non-standard port: - (nnimap "vic20" - (nnimap-address "vic20.somewhere.com") - (nnimap-server-port 9930) - (nnimap-stream ssl)))) -@end lisp - -The following variables can be used to create a virtual @code{nnimap} -server: - -@table @code - -@item nnimap-address -@vindex nnimap-address - -The address of the remote @sc{imap} server. Defaults to the virtual -server name if not specified. - -@item nnimap-server-port -@vindex nnimap-server-port -Port on server to contact. Defaults to port 143, or 993 for SSL. - -Note that this should be a integer, example server specification: - -@lisp -(nnimap "mail.server.com" - (nnimap-server-port 4711)) -@end lisp - -@item nnimap-list-pattern -@vindex nnimap-list-pattern -String or list of strings of mailboxes to limit available groups to. -This is used when the server has very many mailboxes and you're only -interested in a few -- some servers export your home directory via -@sc{imap}, you'll probably want to limit the mailboxes to those in -@file{~/Mail/*} then. - -The string can also be a cons of REFERENCE and the string as above, what -REFERENCE is used for is server specific, but on the University of -Washington server it's a directory that will be concatenated with the -mailbox. - -Example server specification: - -@lisp -(nnimap "mail.server.com" - (nnimap-list-pattern ("INBOX" "Mail/*" "alt.sex.*" - ("~friend/Mail/" . "list/*")))) -@end lisp - -@item nnimap-stream -@vindex nnimap-stream -The type of stream used to connect to your server. By default, nnimap -will detect and automatically use all of the below, with the exception -of SSL. (SSL is being replaced by STARTTLS, which can be automatically -detected, but it's not widely deployed yet). - -Example server specification: - -@lisp -(nnimap "mail.server.com" - (nnimap-stream ssl)) -@end lisp - -Please note that the value of @code{nnimap-stream} is a symbol! - -@itemize @bullet -@item -@dfn{gssapi:} Connect with GSSAPI (usually kerberos 5). Requires the -@samp{imtest} program. -@item -@dfn{kerberos4:} Connect with kerberos 4. Requires the @samp{imtest} program. -@item -@dfn{starttls:} Connect via the STARTTLS extension (similar to -SSL). Requires the external library @samp{starttls.el} and program -@samp{starttls}. -@item -@dfn{ssl:} Connect through SSL. Requires OpenSSL (the -program @samp{openssl}) or SSLeay (@samp{s_client}). -@item -@dfn{shell:} Use a shell command to start @sc{imap} connection. -@item -@dfn{network:} Plain, TCP/IP network connection. -@end itemize - -@vindex imap-kerberos4-program -The @samp{imtest} program is shipped with Cyrus IMAPD. If you're -using @samp{imtest} from Cyrus IMAPD < 2.0.14 (which includes version -1.5.x and 1.6.x) you need to frob @code{imap-process-connection-type} -to make @code{imap.el} use a pty instead of a pipe when communicating -with @samp{imtest}. You will then suffer from a line length -restrictions on IMAP commands, which might make Gnus seem to hang -indefinitely if you have many articles in a mailbox. The variable -@code{imap-kerberos4-program} contain parameters to pass to the imtest -program. - -@vindex imap-ssl-program -For SSL connections, the OpenSSL program is available from -@uref{http://www.openssl.org/}. OpenSSL was formerly known as SSLeay, -and nnimap support it too - although the most recent versions of -SSLeay, 0.9.x, are known to have serious bugs making it -useless. Earlier versions, especially 0.8.x, of SSLeay are known to -work. The variable @code{imap-ssl-program} contain parameters to pass -to OpenSSL/SSLeay. - -@vindex imap-shell-program -@vindex imap-shell-host -For @sc{imap} connections using the @code{shell} stream, the variable -@code{imap-shell-program} specify what program to call. - -@item nnimap-authenticator -@vindex nnimap-authenticator - -The authenticator used to connect to the server. By default, nnimap -will use the most secure authenticator your server is capable of. - -Example server specification: - -@lisp -(nnimap "mail.server.com" - (nnimap-authenticator anonymous)) -@end lisp - -Please note that the value of @code{nnimap-authenticator} is a symbol! - -@itemize @bullet -@item -@dfn{gssapi:} GSSAPI (usually kerberos 5) authentication. Require -external program @code{imtest}. -@item -@dfn{kerberos4:} Kerberos authentication. Require external program -@code{imtest}. -@item -@dfn{digest-md5:} Encrypted username/password via DIGEST-MD5. Require -external library @code{digest-md5.el}. -@item -@dfn{cram-md5:} Encrypted username/password via CRAM-MD5. -@item -@dfn{login:} Plain-text username/password via LOGIN. -@item -@dfn{anonymous:} Login as `anonymous', supplying your emailadress as password. -@end itemize - -@item nnimap-expunge-on-close -@cindex Expunging -@vindex nnimap-expunge-on-close -Unlike Parmenides the @sc{imap} designers has decided that things that -doesn't exist actually does exist. More specifically, @sc{imap} has -this concept of marking articles @code{Deleted} which doesn't actually -delete them, and this (marking them @code{Deleted}, that is) is what -nnimap does when you delete a article in Gnus (with @kbd{G DEL} or -similar). - -Since the articles aren't really removed when we mark them with the -@code{Deleted} flag we'll need a way to actually delete them. Feel like -running in circles yet? - -Traditionally, nnimap has removed all articles marked as @code{Deleted} -when closing a mailbox but this is now configurable by this server -variable. - -The possible options are: - -@table @code - -@item always -The default behavior, delete all articles marked as "Deleted" when -closing a mailbox. -@item never -Never actually delete articles. Currently there is no way of showing -the articles marked for deletion in nnimap, but other @sc{imap} clients -may allow you to do this. If you ever want to run the EXPUNGE command -manually, @xref{Expunging mailboxes}. -@item ask -When closing mailboxes, nnimap will ask if you wish to expunge deleted -articles or not. - -@end table - -@item nnimap-importantize-dormant -@vindex nnimap-importantize-dormant - -If non-nil, marks dormant articles as ticked (as well), for other IMAP -clients. Within Gnus, dormant articles will naturally still (only) be -marked as ticked. This is to make dormant articles stand out, just -like ticked articles, in other IMAP clients. (In other words, Gnus has -two ``Tick'' marks and IMAP has only one.) - -Probably the only reason for frobing this would be if you're trying -enable per-user persistant dormant flags, using something like: - -@lisp -(setcdr (assq 'dormant nnimap-mark-to-flag-alist) - (format "gnus-dormant-%s" (user-login-name))) -(setcdr (assq 'dormant nnimap-mark-to-predicate-alist) - (format "KEYWORD gnus-dormant-%s" (user-login-name))) -@end lisp - -In this case, you would not want the per-user dormant flag showing up -as ticked for other users. - -@item nnimap-expunge-search-string -@cindex Expunging -@vindex nnimap-expunge-search-string - -This variable contain the IMAP search command sent to server when -searching for articles eligible for expiring. The default is -@code{"UID %s NOT SINCE %s"}, where the first @code{%s} is replaced by -UID set and the second @code{%s} is replaced by a date. - -Probably the only useful value to change this to is -@code{"UID %s NOT SENTSINCE %s"}, which makes nnimap use the Date: in -messages instead of the internal article date. See section 6.4.4 of -RFC 2060 for more information on valid strings. - -@item nnimap-authinfo-file -@vindex nnimap-authinfo-file - -A file containing credentials used to log in on servers. The format is -(almost) the same as the @code{ftp} @file{~/.netrc} file. See the -variable @code{nntp-authinfo-file} for exact syntax; also see -@ref{NNTP}. - -@end table - -@menu -* Splitting in IMAP:: Splitting mail with nnimap. -* Editing IMAP ACLs:: Limiting/enabling other users access to a mailbox. -* Expunging mailboxes:: Equivalent of a "compress mailbox" button. -@end menu - - - -@node Splitting in IMAP -@subsubsection Splitting in @sc{imap} -@cindex splitting imap mail - -Splitting is something Gnus users has loved and used for years, and now -the rest of the world is catching up. Yeah, dream on, not many -@sc{imap} server has server side splitting and those that have splitting -seem to use some non-standard protocol. This means that @sc{imap} -support for Gnus has to do it's own splitting. - -And it does. - -Here are the variables of interest: - -@table @code - -@item nnimap-split-crosspost -@cindex splitting, crosspost -@cindex crosspost -@vindex nnimap-split-crosspost - -If non-nil, do crossposting if several split methods match the mail. If -nil, the first match in @code{nnimap-split-rule} found will be used. - -Nnmail equivalent: @code{nnmail-crosspost}. - -@item nnimap-split-inbox -@cindex splitting, inbox -@cindex inbox -@vindex nnimap-split-inbox - -A string or a list of strings that gives the name(s) of @sc{imap} -mailboxes to split from. Defaults to nil, which means that splitting is -disabled! - -@lisp -(setq nnimap-split-inbox - '("INBOX" ("~/friend/Mail" . "lists/*") "lists.imap")) -@end lisp - -No nnmail equivalent. - -@item nnimap-split-rule -@cindex Splitting, rules -@vindex nnimap-split-rule - -New mail found in @code{nnimap-split-inbox} will be split according to -this variable. - -This variable contains a list of lists, where the first element in the -sublist gives the name of the @sc{imap} mailbox to move articles -matching the regexp in the second element in the sublist. Got that? -Neither did I, we need examples. - -@lisp -(setq nnimap-split-rule - '(("INBOX.nnimap" - "^Sender: owner-nnimap@@vic20.globalcom.se") - ("INBOX.junk" "^Subject:.*MAKE MONEY") - ("INBOX.private" ""))) -@end lisp - -This will put all articles from the nnimap mailing list into mailbox -INBOX.nnimap, all articles containing MAKE MONEY in the Subject: line -into INBOX.junk and everything else in INBOX.private. - -The first string may contain `\\1' forms, like the ones used by -replace-match to insert sub-expressions from the matched text. For -instance: - -@lisp -("INBOX.lists.\\1" "^Sender: owner-\\([a-z-]+\\)@@") -@end lisp - -The second element can also be a function. In that case, it will be -called with the first element of the rule as the argument, in a buffer -containing the headers of the article. It should return a non-nil value -if it thinks that the mail belongs in that group. - -Nnmail users might recollect that the last regexp had to be empty to -match all articles (like in the example above). This is not required in -nnimap. Articles not matching any of the regexps will not be moved out -of your inbox. (This might affect performance if you keep lots of -unread articles in your inbox, since the splitting code would go over -them every time you fetch new mail.) - -These rules are processed from the beginning of the alist toward the -end. The first rule to make a match will "win", unless you have -crossposting enabled. In that case, all matching rules will "win". - -This variable can also have a function as its value, the function will -be called with the headers narrowed and should return a group where it -thinks the article should be split to. See @code{nnimap-split-fancy}. - -The splitting code tries to create mailboxes if it need too. - -To allow for different split rules on different virtual servers, and -even different split rules in different inboxes on the same server, -the syntax of this variable have been extended along the lines of: - -@lisp -(setq nnimap-split-rule - '(("my1server" (".*" (("ding" "ding@@gnus.org") - ("junk" "From:.*Simon"))) - ("my2server" ("INBOX" nnimap-split-fancy)) - ("my[34]server" (".*" (("private" "To:.*Simon") - ("junk" my-junk-func))))) -@end lisp - -The virtual server name is in fact a regexp, so that the same rules -may apply to several servers. In the example, the servers -@code{my3server} and @code{my4server} both use the same rules. -Similarly, the inbox string is also a regexp. The actual splitting -rules are as before, either a function, or a list with group/regexp or -group/function elements. - -Nnmail equivalent: @code{nnmail-split-methods}. - -@item nnimap-split-predicate -@cindex splitting -@vindex nnimap-split-predicate - -Mail matching this predicate in @code{nnimap-split-inbox} will be -split, it is a string and the default is @samp{UNSEEN UNDELETED}. - -This might be useful if you use another @sc{imap} client to read mail in -your inbox but would like Gnus to split all articles in the inbox -regardless of readedness. Then you might change this to -@samp{UNDELETED}. - -@item nnimap-split-fancy -@cindex splitting, fancy -@findex nnimap-split-fancy -@vindex nnimap-split-fancy - -It's possible to set @code{nnimap-split-rule} to -@code{nnmail-split-fancy} if you want to use fancy -splitting. @xref{Fancy Mail Splitting}. - -However, to be able to have different fancy split rules for nnmail and -nnimap backends you can set @code{nnimap-split-rule} to -@code{nnimap-split-fancy} and define the nnimap specific fancy split -rule in @code{nnimap-split-fancy}. - -Example: - -@lisp -(setq nnimap-split-rule 'nnimap-split-fancy - nnimap-split-fancy ...) -@end lisp - -Nnmail equivalent: @code{nnmail-split-fancy}. - -@end table - -@node Editing IMAP ACLs -@subsubsection Editing @sc{imap} ACLs -@cindex editing imap acls -@cindex Access Control Lists -@cindex Editing @sc{imap} ACLs -@kindex G l -@findex gnus-group-nnimap-edit-acl - -ACL stands for Access Control List. ACLs are used in @sc{imap} for -limiting (or enabling) other users access to your mail boxes. Not all -@sc{imap} servers support this, this function will give an error if it -doesn't. - -To edit a ACL for a mailbox, type @kbd{G l} -(@code{gnus-group-edit-nnimap-acl}) and you'll be presented with a ACL -editing window with detailed instructions. - -Some possible uses: - -@itemize @bullet -@item -Giving "anyone" the "lrs" rights (lookup, read, keep seen/unseen flags) -on your mailing list mailboxes enables other users on the same server to -follow the list without subscribing to it. -@item -At least with the Cyrus server, you are required to give the user -"anyone" posting ("p") capabilities to have "plussing" work (that is, -mail sent to user+mailbox@@domain ending up in the @sc{imap} mailbox -INBOX.mailbox). -@end itemize - -@node Expunging mailboxes -@subsubsection Expunging mailboxes -@cindex expunging - -@cindex Expunge -@cindex Manual expunging -@kindex G x -@findex gnus-group-nnimap-expunge - -If you're using the @code{never} setting of @code{nnimap-expunge-on-close}, -you may want the option of expunging all deleted articles in a mailbox -manually. This is exactly what @kbd{G x} does. - -Currently there is no way of showing deleted articles, you can just -delete them. - - - -@node Combined Groups -@section Combined Groups - -Gnus allows combining a mixture of all the other group types into bigger -groups. - -@menu -* Virtual Groups:: Combining articles from many groups. -* Kibozed Groups:: Looking through parts of the newsfeed for articles. -@end menu - - -@node Virtual Groups -@subsection Virtual Groups -@cindex nnvirtual -@cindex virtual groups -@cindex merging groups - -An @dfn{nnvirtual group} is really nothing more than a collection of -other groups. - -For instance, if you are tired of reading many small groups, you can -put them all in one big group, and then grow tired of reading one -big, unwieldy group. The joys of computing! - -You specify @code{nnvirtual} as the method. The address should be a -regexp to match component groups. - -All marks in the virtual group will stick to the articles in the -component groups. So if you tick an article in a virtual group, the -article will also be ticked in the component group from whence it came. -(And vice versa---marks from the component groups will also be shown in -the virtual group.) - -Here's an example @code{nnvirtual} method that collects all Andrea Dworkin -newsgroups into one, big, happy newsgroup: - -@lisp -(nnvirtual "^alt\\.fan\\.andrea-dworkin$\\|^rec\\.dworkin.*") -@end lisp - -The component groups can be native or foreign; everything should work -smoothly, but if your computer explodes, it was probably my fault. - -Collecting the same group from several servers might actually be a good -idea if users have set the Distribution header to limit distribution. -If you would like to read @samp{soc.motss} both from a server in Japan -and a server in Norway, you could use the following as the group regexp: - -@example -"^nntp\\+server\\.jp:soc\\.motss$\\|^nntp\\+server\\.no:soc\\.motss$" -@end example - -(Remember, though, that if you're creating the group with @kbd{G m}, you -shouldn't double the backslashes, and you should leave off the quote -characters at the beginning and the end of the string.) - -This should work kinda smoothly---all articles from both groups should -end up in this one, and there should be no duplicates. Threading (and -the rest) will still work as usual, but there might be problems with the -sequence of articles. Sorting on date might be an option here -(@pxref{Selecting a Group}). - -One limitation, however---all groups included in a virtual -group have to be alive (i.e., subscribed or unsubscribed). Killed or -zombie groups can't be component groups for @code{nnvirtual} groups. - -@vindex nnvirtual-always-rescan -If the @code{nnvirtual-always-rescan} is non-@code{nil}, -@code{nnvirtual} will always scan groups for unread articles when -entering a virtual group. If this variable is @code{nil} (which is the -default) and you read articles in a component group after the virtual -group has been activated, the read articles from the component group -will show up when you enter the virtual group. You'll also see this -effect if you have two virtual groups that have a component group in -common. If that's the case, you should set this variable to @code{t}. -Or you can just tap @code{M-g} on the virtual group every time before -you enter it---it'll have much the same effect. - -@code{nnvirtual} can have both mail and news groups as component groups. -When responding to articles in @code{nnvirtual} groups, @code{nnvirtual} -has to ask the backend of the component group the article comes from -whether it is a news or mail backend. However, when you do a @kbd{^}, -there is typically no sure way for the component backend to know this, -and in that case @code{nnvirtual} tells Gnus that the article came from a -not-news backend. (Just to be on the safe side.) - -@kbd{C-c C-t} in the message buffer will insert the @code{Newsgroups} -line from the article you respond to in these cases. - - - -@node Kibozed Groups -@subsection Kibozed Groups -@cindex nnkiboze -@cindex kibozing - -@dfn{Kibozing} is defined by @sc{oed} as ``grepping through (parts of) -the news feed''. @code{nnkiboze} is a backend that will do this for -you. Oh joy! Now you can grind any @sc{nntp} server down to a halt -with useless requests! Oh happiness! - -@kindex G k (Group) -To create a kibozed group, use the @kbd{G k} command in the group -buffer. - -The address field of the @code{nnkiboze} method is, as with -@code{nnvirtual}, a regexp to match groups to be ``included'' in the -@code{nnkiboze} group. That's where most similarities between @code{nnkiboze} -and @code{nnvirtual} end. - -In addition to this regexp detailing component groups, an @code{nnkiboze} group -must have a score file to say what articles are to be included in -the group (@pxref{Scoring}). - -@kindex M-x nnkiboze-generate-groups -@findex nnkiboze-generate-groups -You must run @kbd{M-x nnkiboze-generate-groups} after creating the -@code{nnkiboze} groups you want to have. This command will take time. Lots of -time. Oodles and oodles of time. Gnus has to fetch the headers from -all the articles in all the component groups and run them through the -scoring process to determine if there are any articles in the groups -that are to be part of the @code{nnkiboze} groups. - -Please limit the number of component groups by using restrictive -regexps. Otherwise your sysadmin may become annoyed with you, and the -@sc{nntp} site may throw you off and never let you back in again. -Stranger things have happened. - -@code{nnkiboze} component groups do not have to be alive---they can be dead, -and they can be foreign. No restrictions. - -@vindex nnkiboze-directory -The generation of an @code{nnkiboze} group means writing two files in -@code{nnkiboze-directory}, which is @file{~/News/} by default. One -contains the @sc{nov} header lines for all the articles in the group, -and the other is an additional @file{.newsrc} file to store information -on what groups have been searched through to find component articles. - -Articles marked as read in the @code{nnkiboze} group will have -their @sc{nov} lines removed from the @sc{nov} file. - - -@node Gnus Unplugged -@section Gnus Unplugged -@cindex offline -@cindex unplugged -@cindex Agent -@cindex Gnus Agent -@cindex Gnus Unplugged - -In olden times (ca. February '88), people used to run their newsreaders -on big machines with permanent connections to the net. News transport -was dealt with by news servers, and all the newsreaders had to do was to -read news. Believe it or not. - -Nowadays most people read news and mail at home, and use some sort of -modem to connect to the net. To avoid running up huge phone bills, it -would be nice to have a way to slurp down all the news and mail, hang up -the phone, read for several hours, and then upload any responses you -have to make. And then you repeat the procedure. - -Of course, you can use news servers for doing this as well. I've used -@code{inn} together with @code{slurp}, @code{pop} and @code{sendmail} -for some years, but doing that's a bore. Moving the news server -functionality up to the newsreader makes sense if you're the only person -reading news on a machine. - -Using Gnus as an ``offline'' newsreader is quite simple. - -@itemize @bullet -@item -First, set up Gnus as you would do if you were running it on a machine -that has full connection to the net. Go ahead. I'll still be waiting -here. - -@item -Then, put the following magical incantation at the end of your -@file{.gnus.el} file: - -@lisp -(gnus-agentize) -@end lisp -@end itemize - -That's it. Gnus is now an ``offline'' newsreader. - -Of course, to use it as such, you have to learn a few new commands. - -@menu -* Agent Basics:: How it all is supposed to work. -* Agent Categories:: How to tell the Gnus Agent what to download. -* Agent Commands:: New commands for all the buffers. -* Agent Expiry:: How to make old articles go away. -* Agent and IMAP:: How to use the Agent with IMAP. -* Outgoing Messages:: What happens when you post/mail something? -* Agent Variables:: Customizing is fun. -* Example Setup:: An example @file{.gnus.el} file for offline people. -* Batching Agents:: How to fetch news from a @code{cron} job. -* Agent Caveats:: What you think it'll do and what it does. -@end menu - - -@node Agent Basics -@subsection Agent Basics - -First, let's get some terminology out of the way. - -The Gnus Agent is said to be @dfn{unplugged} when you have severed the -connection to the net (and notified the Agent that this is the case). -When the connection to the net is up again (and Gnus knows this), the -Agent is @dfn{plugged}. - -The @dfn{local} machine is the one you're running on, and which isn't -connected to the net continuously. - -@dfn{Downloading} means fetching things from the net to your local -machine. @dfn{Uploading} is doing the opposite. - -Let's take a typical Gnus session using the Agent. - -@itemize @bullet - -@item -You start Gnus with @code{gnus-unplugged}. This brings up the Gnus -Agent in a disconnected state. You can read all the news that you have -already fetched while in this mode. - -@item -You then decide to see whether any new news has arrived. You connect -your machine to the net (using PPP or whatever), and then hit @kbd{J j} -to make Gnus become @dfn{plugged} and use @kbd{g} to check for new mail -as usual. To check for new mail in unplugged mode, see (@pxref{Mail -Source Specifiers}). - -@item -You can then read the new news immediately, or you can download the news -onto your local machine. If you want to do the latter, you press @kbd{g} -to check if there are any new news and then @kbd{J -s} to fetch all the eligible articles in all the groups. (To let Gnus -know which articles you want to download, @pxref{Agent Categories}.) - -@item -After fetching the articles, you press @kbd{J j} to make Gnus become -unplugged again, and you shut down the PPP thing (or whatever). And -then you read the news offline. - -@item -And then you go to step 2. -@end itemize - -Here are some things you should do the first time (or so) that you use -the Agent. - -@itemize @bullet - -@item -Decide which servers should be covered by the Agent. If you have a mail -backend, it would probably be nonsensical to have it covered by the -Agent. Go to the server buffer (@kbd{^} in the group buffer) and press -@kbd{J a} the server (or servers) that you wish to have covered by the -Agent (@pxref{Server Agent Commands}). This will typically be only the -primary select method, which is listed on the bottom in the buffer. - -@item -Decide on download policy. @xref{Agent Categories}. - -@item -Uhm... that's it. -@end itemize - - -@node Agent Categories -@subsection Agent Categories - -One of the main reasons to integrate the news transport layer into the -newsreader is to allow greater control over what articles to download. -There's not much point in downloading huge amounts of articles, just to -find out that you're not interested in reading any of them. It's better -to be somewhat more conservative in choosing what to download, and then -mark the articles for downloading manually if it should turn out that -you're interested in the articles anyway. - -The main way to control what is to be downloaded is to create a -@dfn{category} and then assign some (or all) groups to this category. -Groups that do not belong in any other category belong to the -@code{default} category. Gnus has its own buffer for creating and -managing categories. - -@menu -* Category Syntax:: What a category looks like. -* Category Buffer:: A buffer for maintaining categories. -* Category Variables:: Customize'r'Us. -@end menu - - -@node Category Syntax -@subsubsection Category Syntax - -A category consists of two things. - -@enumerate -@item -A predicate which (generally) gives a rough outline of which articles -are eligible for downloading; and - -@item -a score rule which (generally) gives you a finer granularity when -deciding what articles to download. (Note that this @dfn{download -score} is not necessarily related to normal scores.) -@end enumerate - -A predicate in its simplest form can be a single predicate such as -@code{true} or @code{false}. These two will download every available -article or nothing respectively. In the case of these two special -predicates an additional score rule is superfluous. - -Predicates of @code{high} or @code{low} download articles in respect of -their scores in relationship to @code{gnus-agent-high-score} and -@code{gnus-agent-low-score} as described below. - -To gain even finer control of what is to be regarded eligible for -download a predicate can consist of a number of predicates with logical -operators sprinkled in between. - -Perhaps some examples are in order. - -Here's a simple predicate. (It's the default predicate, in fact, used -for all groups that don't belong to any other category.) - -@lisp -short -@end lisp - -Quite simple, eh? This predicate is true if and only if the article is -short (for some value of ``short''). - -Here's a more complex predicate: - -@lisp -(or high - (and - (not low) - (not long))) -@end lisp - -This means that an article should be downloaded if it has a high score, -or if the score is not low and the article is not long. You get the -drift. - -The available logical operators are @code{or}, @code{and} and -@code{not}. (If you prefer, you can use the more ``C''-ish operators -@samp{|}, @code{&} and @code{!} instead.) - -The following predicates are pre-defined, but if none of these fit what -you want to do, you can write your own. - -@table @code -@item short -True iff the article is shorter than @code{gnus-agent-short-article} -lines; default 100. - -@item long -True iff the article is longer than @code{gnus-agent-long-article} -lines; default 200. - -@item low -True iff the article has a download score less than -@code{gnus-agent-low-score}; default 0. - -@item high -True iff the article has a download score greater than -@code{gnus-agent-high-score}; default 0. - -@item spam -True iff the Gnus Agent guesses that the article is spam. The -heuristics may change over time, but at present it just computes a -checksum and sees whether articles match. - -@item true -Always true. - -@item false -Always false. -@end table - -If you want to create your own predicate function, here's what you have -to know: The functions are called with no parameters, but the -@code{gnus-headers} and @code{gnus-score} dynamic variables are bound to -useful values. - -For example, you could decide that you don't want to download articles -that were posted more than a certain number of days ago (e.g. posted -more than @code{gnus-agent-expire-days} ago) you might write a function -something along the lines of the following: - -@lisp -(defun my-article-old-p () - "Say whether an article is old." - (< (time-to-days (date-to-time (mail-header-date gnus-headers))) - (- (time-to-days (current-time)) gnus-agent-expire-days))) -@end lisp - -with the predicate then defined as: - -@lisp -(not my-article-old-p) -@end lisp - -or you could append your predicate to the predefined -@code{gnus-category-predicate-alist} in your @file{~/.gnus.el} or -wherever. (Note: this would have to be at a point *after* -@code{gnus-agent} has been loaded via @code{(gnus-agentize)}) - -@lisp -(setq gnus-category-predicate-alist - (append gnus-category-predicate-alist - '((old . my-article-old-p)))) -@end lisp - -and simply specify your predicate as: - -@lisp -(not old) -@end lisp - -If/when using something like the above, be aware that there are many -misconfigured systems/mailers out there and so an article's date is not -always a reliable indication of when it was posted. Hell, some people -just don't give a damn. - -The above predicates apply to *all* the groups which belong to the -category. However, if you wish to have a specific predicate for an -individual group within a category, or you're just too lazy to set up a -new category, you can enter a group's individual predicate in it's group -parameters like so: - -@lisp -(agent-predicate . short) -@end lisp - -This is the group parameter equivalent of the agent category default. -Note that when specifying a single word predicate like this, the -@code{agent-predicate} specification must be in dotted pair notation. - -The equivalent of the longer example from above would be: - -@lisp -(agent-predicate or high (and (not low) (not long))) -@end lisp - -The outer parenthesis required in the category specification are not -entered here as, not being in dotted pair notation, the value of the -predicate is assumed to be a list. - - -Now, the syntax of the download score is the same as the syntax of -normal score files, except that all elements that require actually -seeing the article itself are verboten. This means that only the -following headers can be scored on: @code{Subject}, @code{From}, -@code{Date}, @code{Message-ID}, @code{References}, @code{Chars}, -@code{Lines}, and @code{Xref}. - -As with predicates, the specification of the @code{download score rule} -to use in respect of a group can be in either the category definition if -it's to be applicable to all groups in therein, or a group's parameters -if it's to be specific to that group. - -In both of these places the @code{download score rule} can take one of -three forms: - -@enumerate -@item -Score rule - -This has the same syntax as a normal gnus score file except only a -subset of scoring keywords are available as mentioned above. - -example: - -@itemize @bullet -@item -Category specification - -@lisp -(("from" - ("Lars Ingebrigtsen" 1000000 nil s)) -("lines" - (500 -100 nil <))) -@end lisp - -@item -Group Parameter specification - -@lisp -(agent-score ("from" - ("Lars Ingebrigtsen" 1000000 nil s)) - ("lines" - (500 -100 nil <))) -@end lisp - -Again, note the omission of the outermost parenthesis here. -@end itemize - -@item -Agent score file - -These score files must *only* contain the permitted scoring keywords -stated above. - -example: - -@itemize @bullet -@item -Category specification - -@lisp -("~/News/agent.SCORE") -@end lisp - -or perhaps - -@lisp -("~/News/agent.SCORE" "~/News/agent.group.SCORE") -@end lisp - -@item -Group Parameter specification - -@lisp -(agent-score "~/News/agent.SCORE") -@end lisp - -Additional score files can be specified as above. Need I say anything -about parenthesis? -@end itemize - -@item -Use @code{normal} score files - -If you don't want to maintain two sets of scoring rules for a group, and -your desired @code{downloading} criteria for a group are the same as your -@code{reading} criteria then you can tell the agent to refer to your -@code{normal} score files when deciding what to download. - -These directives in either the category definition or a group's -parameters will cause the agent to read in all the applicable score -files for a group, *filtering out* those sections that do not -relate to one of the permitted subset of scoring keywords. - -@itemize @bullet -@item -Category Specification - -@lisp -file -@end lisp - -@item -Group Parameter specification - -@lisp -(agent-score . file) -@end lisp -@end itemize -@end enumerate - -@node Category Buffer -@subsubsection Category Buffer - -You'd normally do all category maintenance from the category buffer. -When you enter it for the first time (with the @kbd{J c} command from -the group buffer), you'll only see the @code{default} category. - -The following commands are available in this buffer: - -@table @kbd -@item q -@kindex q (Category) -@findex gnus-category-exit -Return to the group buffer (@code{gnus-category-exit}). - -@item k -@kindex k (Category) -@findex gnus-category-kill -Kill the current category (@code{gnus-category-kill}). - -@item c -@kindex c (Category) -@findex gnus-category-copy -Copy the current category (@code{gnus-category-copy}). - -@item a -@kindex a (Category) -@findex gnus-category-add -Add a new category (@code{gnus-category-add}). - -@item p -@kindex p (Category) -@findex gnus-category-edit-predicate -Edit the predicate of the current category -(@code{gnus-category-edit-predicate}). - -@item g -@kindex g (Category) -@findex gnus-category-edit-groups -Edit the list of groups belonging to the current category -(@code{gnus-category-edit-groups}). - -@item s -@kindex s (Category) -@findex gnus-category-edit-score -Edit the download score rule of the current category -(@code{gnus-category-edit-score}). - -@item l -@kindex l (Category) -@findex gnus-category-list -List all the categories (@code{gnus-category-list}). -@end table - - -@node Category Variables -@subsubsection Category Variables - -@table @code -@item gnus-category-mode-hook -@vindex gnus-category-mode-hook -Hook run in category buffers. - -@item gnus-category-line-format -@vindex gnus-category-line-format -Format of the lines in the category buffer (@pxref{Formatting -Variables}). Valid elements are: - -@table @samp -@item c -The name of the category. - -@item g -The number of groups in the category. -@end table - -@item gnus-category-mode-line-format -@vindex gnus-category-mode-line-format -Format of the category mode line (@pxref{Mode Line Formatting}). - -@item gnus-agent-short-article -@vindex gnus-agent-short-article -Articles that have fewer lines than this are short. Default 100. - -@item gnus-agent-long-article -@vindex gnus-agent-long-article -Articles that have more lines than this are long. Default 200. - -@item gnus-agent-low-score -@vindex gnus-agent-low-score -Articles that have a score lower than this have a low score. Default -0. - -@item gnus-agent-high-score -@vindex gnus-agent-high-score -Articles that have a score higher than this have a high score. Default -0. - -@end table - - -@node Agent Commands -@subsection Agent Commands - -All the Gnus Agent commands are on the @kbd{J} submap. The @kbd{J j} -(@code{gnus-agent-toggle-plugged} command works in all modes, and -toggles the plugged/unplugged state of the Gnus Agent. - - -@menu -* Group Agent Commands:: -* Summary Agent Commands:: -* Server Agent Commands:: -@end menu - -You can run a complete batch fetch from the command line with the -following incantation: - -@cindex gnus-agent-batch-fetch -@example -$ emacs -batch -l ~/.gnus.el -f gnus-agent-batch-fetch -@end example - - - -@node Group Agent Commands -@subsubsection Group Agent Commands - -@table @kbd -@item J u -@kindex J u (Agent Group) -@findex gnus-agent-fetch-groups -Fetch all eligible articles in the current group -(@code{gnus-agent-fetch-groups}). - -@item J c -@kindex J c (Agent Group) -@findex gnus-enter-category-buffer -Enter the Agent category buffer (@code{gnus-enter-category-buffer}). - -@item J s -@kindex J s (Agent Group) -@findex gnus-agent-fetch-session -Fetch all eligible articles in all groups -(@code{gnus-agent-fetch-session}). - -@item J S -@kindex J S (Agent Group) -@findex gnus-group-send-drafts -Send all sendable messages in the draft group -(@code{gnus-group-send-drafts}). @xref{Drafts}. - -@item J a -@kindex J a (Agent Group) -@findex gnus-agent-add-group -Add the current group to an Agent category -(@code{gnus-agent-add-group}). This command understands the -process/prefix convention (@pxref{Process/Prefix}). - -@item J r -@kindex J r (Agent Group) -@findex gnus-agent-remove-group -Remove the current group from its category, if any -(@code{gnus-agent-remove-group}). This command understands the -process/prefix convention (@pxref{Process/Prefix}). - -@item J Y -@kindex J Y (Agent Group) -@findex gnus-agent-synchronize-flags -Synchronize flags changed while unplugged with remote server, if any. - - -@end table - - -@node Summary Agent Commands -@subsubsection Summary Agent Commands - -@table @kbd -@item J # -@kindex J # (Agent Summary) -@findex gnus-agent-mark-article -Mark the article for downloading (@code{gnus-agent-mark-article}). - -@item J M-# -@kindex J M-# (Agent Summary) -@findex gnus-agent-unmark-article -Remove the downloading mark from the article -(@code{gnus-agent-unmark-article}). - -@item @@ -@kindex @@ (Agent Summary) -@findex gnus-agent-toggle-mark -Toggle whether to download the article (@code{gnus-agent-toggle-mark}). - -@item J c -@kindex J c (Agent Summary) -@findex gnus-agent-catchup -Mark all undownloaded articles as read (@code{gnus-agent-catchup}). - -@item J u -@kindex J u (Agent Summary) -@findex gnus-agent-summary-fetch-group -Download all downloadable articles in the current group -(@code{gnus-agent-summary-fetch-group}). - -@end table - - -@node Server Agent Commands -@subsubsection Server Agent Commands - -@table @kbd -@item J a -@kindex J a (Agent Server) -@findex gnus-agent-add-server -Add the current server to the list of servers covered by the Gnus Agent -(@code{gnus-agent-add-server}). - -@item J r -@kindex J r (Agent Server) -@findex gnus-agent-remove-server -Remove the current server from the list of servers covered by the Gnus -Agent (@code{gnus-agent-remove-server}). - -@end table - - -@node Agent Expiry -@subsection Agent Expiry - -@vindex gnus-agent-expire-days -@findex gnus-agent-expire -@kindex M-x gnus-agent-expire -@cindex Agent expiry -@cindex Gnus Agent expiry -@cindex expiry - -@code{nnagent} doesn't handle expiry. Instead, there's a special -@code{gnus-agent-expire} command that will expire all read articles that -are older than @code{gnus-agent-expire-days} days. It can be run -whenever you feel that you're running out of space. It's not -particularly fast or efficient, and it's not a particularly good idea to -interrupt it (with @kbd{C-g} or anything else) once you've started it. - -@vindex gnus-agent-expire-all -if @code{gnus-agent-expire-all} is non-@code{nil}, this command will -expire all articles---unread, read, ticked and dormant. If @code{nil} -(which is the default), only read articles are eligible for expiry, and -unread, ticked and dormant articles will be kept indefinitely. - - -@node Agent and IMAP -@subsection Agent and IMAP - -The Agent work with any Gnus backend, including nnimap. However, -since there are some conceptual differences between @sc{nntp} and -@sc{imap}, this section (should) provide you with some information to -make Gnus Agent work smoother as a @sc{imap} Disconnected Mode client. - -The first thing to keep in mind is that all flags (read, ticked, etc) -are kept on the @sc{imap} server, rather than in @code{.newsrc} as is the -case for nntp. Thus Gnus need to remember flag changes when -disconnected, and synchronize these flags when you plug back in. - -Gnus keep track of flag changes when reading nnimap groups under the -Agent by default. When you plug back in, by default Gnus will check if -you have any changed any flags and ask if you wish to synchronize these -with the server. This behavior is customizable with -@code{gnus-agent-synchronize-flags}. - -@vindex gnus-agent-synchronize-flags -If @code{gnus-agent-synchronize-flags} is @code{nil}, the Agent will -never automatically synchronize flags. If it is @code{ask}, the -default, the Agent will check if you made any changes and if so ask if -you wish to synchronize these when you re-connect. If it has any other -value, all flags will be synchronized automatically. - -If you do not wish to automatically synchronize flags when you -re-connect, this can be done manually with the -@code{gnus-agent-synchronize-flags} command that is bound to @kbd{J Y} -in the group buffer by default. - -Some things are currently not implemented in the Agent that you'd might -expect from a disconnected @sc{imap} client, including: - -@itemize @bullet - -@item -Copying/moving articles into nnimap groups when unplugged. - -@item -Creating/deleting nnimap groups when unplugged. - -@end itemize - -Technical note: the synchronization algorithm does not work by "pushing" -all local flags to the server, but rather incrementally update the -server view of flags by changing only those flags that were changed by -the user. Thus, if you set one flag on a article, quit the group and -re-select the group and remove the flag; the flag will be set and -removed from the server when you "synchronize". The queued flag -operations can be found in the per-server @code{flags} file in the Agent -directory. It's emptied when you synchronize flags. - - -@node Outgoing Messages -@subsection Outgoing Messages - -When Gnus is unplugged, all outgoing messages (both mail and news) are -stored in the draft groups (@pxref{Drafts}). You can view them there -after posting, and edit them at will. - -When Gnus is plugged again, you can send the messages either from the -draft group with the special commands available there, or you can use -the @kbd{J S} command in the group buffer to send all the sendable -messages in the draft group. - - - -@node Agent Variables -@subsection Agent Variables - -@table @code -@item gnus-agent-directory -@vindex gnus-agent-directory -Where the Gnus Agent will store its files. The default is -@file{~/News/agent/}. - -@item gnus-agent-handle-level -@vindex gnus-agent-handle-level -Groups on levels (@pxref{Group Levels}) higher than this variable will -be ignored by the Agent. The default is @code{gnus-level-subscribed}, -which means that only subscribed group will be considered by the Agent -by default. - -@item gnus-agent-plugged-hook -@vindex gnus-agent-plugged-hook -Hook run when connecting to the network. - -@item gnus-agent-unplugged-hook -@vindex gnus-agent-unplugged-hook -Hook run when disconnecting from the network. - -@end table - - -@node Example Setup -@subsection Example Setup - -If you don't want to read this manual, and you have a fairly standard -setup, you may be able to use something like the following as your -@file{.gnus.el} file to get started. - -@lisp -;;; Define how Gnus is to fetch news. We do this over @sc{nntp} -;;; from your ISP's server. -(setq gnus-select-method '(nntp "news.your-isp.com")) - -;;; Define how Gnus is to read your mail. We read mail from -;;; your ISP's POP server. -(setq mail-sources '((pop :server "pop.your-isp.com"))) - -;;; Say how Gnus is to store the mail. We use nnml groups. -(setq gnus-secondary-select-methods '((nnml ""))) - -;;; Make Gnus into an offline newsreader. -(gnus-agentize) -@end lisp - -That should be it, basically. Put that in your @file{~/.gnus.el} file, -edit to suit your needs, start up PPP (or whatever), and type @kbd{M-x -gnus}. - -If this is the first time you've run Gnus, you will be subscribed -automatically to a few default newsgroups. You'll probably want to -subscribe to more groups, and to do that, you have to query the -@sc{nntp} server for a complete list of groups with the @kbd{A A} -command. This usually takes quite a while, but you only have to do it -once. - -After reading and parsing a while, you'll be presented with a list of -groups. Subscribe to the ones you want to read with the @kbd{u} -command. @kbd{l} to make all the killed groups disappear after you've -subscribe to all the groups you want to read. (@kbd{A k} will bring -back all the killed groups.) - -You can now read the groups at once, or you can download the articles -with the @kbd{J s} command. And then read the rest of this manual to -find out which of the other gazillion things you want to customize. - - -@node Batching Agents -@subsection Batching Agents - -Having the Gnus Agent fetch articles (and post whatever messages you've -written) is quite easy once you've gotten things set up properly. The -following shell script will do everything that is necessary: - -@example -#!/bin/sh -emacs -batch -l ~/.emacs -f gnus-agent-batch >/dev/null -@end example - - -@node Agent Caveats -@subsection Agent Caveats - -The Gnus Agent doesn't seem to work like most other offline -newsreaders. Here are some common questions that some imaginary people -may ask: - -@table @dfn -@item If I read an article while plugged, do they get entered into the -Agent? - -@strong{No.} - -@item If I read an article while plugged, and the article already exists -in the Agent, will it get downloaded once more? - -@strong{Yes.} - -@end table - -In short, when Gnus is unplugged, it only looks into the locally stored -articles; when it's plugged, it only talks to your ISP. - - -@node Scoring -@chapter Scoring -@cindex scoring - -Other people use @dfn{kill files}, but we here at Gnus Towers like -scoring better than killing, so we'd rather switch than fight. They do -something completely different as well, so sit up straight and pay -attention! - -@vindex gnus-summary-mark-below -All articles have a default score (@code{gnus-summary-default-score}), -which is 0 by default. This score may be raised or lowered either -interactively or by score files. Articles that have a score lower than -@code{gnus-summary-mark-below} are marked as read. - -Gnus will read any @dfn{score files} that apply to the current group -before generating the summary buffer. - -There are several commands in the summary buffer that insert score -entries based on the current article. You can, for instance, ask Gnus to -lower or increase the score of all articles with a certain subject. - -There are two sorts of scoring entries: Permanent and temporary. -Temporary score entries are self-expiring entries. Any entries that are -temporary and have not been used for, say, a week, will be removed -silently to help keep the sizes of the score files down. - -@menu -* Summary Score Commands:: Adding score entries for the current group. -* Group Score Commands:: General score commands. -* Score Variables:: Customize your scoring. (My, what terminology). -* Score File Format:: What a score file may contain. -* Score File Editing:: You can edit score files by hand as well. -* Adaptive Scoring:: Big Sister Gnus knows what you read. -* Home Score File:: How to say where new score entries are to go. -* Followups To Yourself:: Having Gnus notice when people answer you. -* Scoring On Other Headers:: Scoring on non-standard headers. -* Scoring Tips:: How to score effectively. -* Reverse Scoring:: That problem child of old is not problem. -* Global Score Files:: Earth-spanning, ear-splitting score files. -* Kill Files:: They are still here, but they can be ignored. -* Converting Kill Files:: Translating kill files to score files. -* GroupLens:: Getting predictions on what you like to read. -* Advanced Scoring:: Using logical expressions to build score rules. -* Score Decays:: It can be useful to let scores wither away. -@end menu - - -@node Summary Score Commands -@section Summary Score Commands -@cindex score commands - -The score commands that alter score entries do not actually modify real -score files. That would be too inefficient. Gnus maintains a cache of -previously loaded score files, one of which is considered the -@dfn{current score file alist}. The score commands simply insert -entries into this list, and upon group exit, this list is saved. - -The current score file is by default the group's local score file, even -if no such score file actually exists. To insert score commands into -some other score file (e.g. @file{all.SCORE}), you must first make this -score file the current one. - -General score commands that don't actually change the score file: - -@table @kbd - -@item V s -@kindex V s (Summary) -@findex gnus-summary-set-score -Set the score of the current article (@code{gnus-summary-set-score}). - -@item V S -@kindex V S (Summary) -@findex gnus-summary-current-score -Display the score of the current article -(@code{gnus-summary-current-score}). - -@item V t -@kindex V t (Summary) -@findex gnus-score-find-trace -Display all score rules that have been used on the current article -(@code{gnus-score-find-trace}). - -@item V R -@kindex V R (Summary) -@findex gnus-summary-rescore -Run the current summary through the scoring process -(@code{gnus-summary-rescore}). This might be useful if you're playing -around with your score files behind Gnus' back and want to see the -effect you're having. - -@item V c -@kindex V c (Summary) -@findex gnus-score-change-score-file -Make a different score file the current -(@code{gnus-score-change-score-file}). - -@item V e -@kindex V e (Summary) -@findex gnus-score-edit-current-scores -Edit the current score file (@code{gnus-score-edit-current-scores}). -You will be popped into a @code{gnus-score-mode} buffer (@pxref{Score -File Editing}). - -@item V f -@kindex V f (Summary) -@findex gnus-score-edit-file -Edit a score file and make this score file the current one -(@code{gnus-score-edit-file}). - -@item V F -@kindex V F (Summary) -@findex gnus-score-flush-cache -Flush the score cache (@code{gnus-score-flush-cache}). This is useful -after editing score files. - -@item V C -@kindex V C (Summary) -@findex gnus-score-customize -Customize a score file in a visually pleasing manner -(@code{gnus-score-customize}). - -@end table - -The rest of these commands modify the local score file. - -@table @kbd - -@item V m -@kindex V m (Summary) -@findex gnus-score-set-mark-below -Prompt for a score, and mark all articles with a score below this as -read (@code{gnus-score-set-mark-below}). - -@item V x -@kindex V x (Summary) -@findex gnus-score-set-expunge-below -Prompt for a score, and add a score rule to the current score file to -expunge all articles below this score -(@code{gnus-score-set-expunge-below}). -@end table - -The keystrokes for actually making score entries follow a very regular -pattern, so there's no need to list all the commands. (Hundreds of -them.) - -@findex gnus-summary-increase-score -@findex gnus-summary-lower-score - -@enumerate -@item -The first key is either @kbd{I} (upper case i) for increasing the score -or @kbd{L} for lowering the score. -@item -The second key says what header you want to score on. The following -keys are available: -@table @kbd - -@item a -Score on the author name. - -@item s -Score on the subject line. - -@item x -Score on the @code{Xref} line---i.e., the cross-posting line. - -@item r -Score on the @code{References} line. - -@item d -Score on the date. - -@item l -Score on the number of lines. - -@item i -Score on the @code{Message-ID} header. - -@item f -Score on followups---this matches the author name, and adds scores to -the followups to this author. (Using this key leads to the creation of -@file{ADAPT} files.) - -@item b -Score on the body. - -@item h -Score on the head. - -@item t -Score on thread. (Using this key leads to the creation of @file{ADAPT} -files.) - -@end table - -@item -The third key is the match type. Which match types are valid depends on -what headers you are scoring on. - -@table @code - -@item strings - -@table @kbd - -@item e -Exact matching. - -@item s -Substring matching. - -@item f -Fuzzy matching (@pxref{Fuzzy Matching}). - -@item r -Regexp matching -@end table - -@item date -@table @kbd - -@item b -Before date. - -@item a -After date. - -@item n -This date. -@end table - -@item number -@table @kbd - -@item < -Less than number. - -@item = -Equal to number. - -@item > -Greater than number. -@end table -@end table - -@item -The fourth and final key says whether this is a temporary (i.e., expiring) -score entry, or a permanent (i.e., non-expiring) score entry, or whether -it is to be done immediately, without adding to the score file. -@table @kbd - -@item t -Temporary score entry. - -@item p -Permanent score entry. - -@item i -Immediately scoring. -@end table - -@end enumerate - -So, let's say you want to increase the score on the current author with -exact matching permanently: @kbd{I a e p}. If you want to lower the -score based on the subject line, using substring matching, and make a -temporary score entry: @kbd{L s s t}. Pretty easy. - -To make things a bit more complicated, there are shortcuts. If you use -a capital letter on either the second or third keys, Gnus will use -defaults for the remaining one or two keystrokes. The defaults are -``substring'' and ``temporary''. So @kbd{I A} is the same as @kbd{I a s -t}, and @kbd{I a R} is the same as @kbd{I a r t}. - -These functions take both the numerical prefix and the symbolic prefix -(@pxref{Symbolic Prefixes}). A numerical prefix says how much to lower -(or increase) the score of the article. A symbolic prefix of @code{a} -says to use the @file{all.SCORE} file for the command instead of the -current score file. - -@vindex gnus-score-mimic-keymap -The @code{gnus-score-mimic-keymap} says whether these commands will -pretend they are keymaps or not. - - -@node Group Score Commands -@section Group Score Commands -@cindex group score commands - -There aren't many of these as yet, I'm afraid. - -@table @kbd - -@item W f -@kindex W f (Group) -@findex gnus-score-flush-cache -Gnus maintains a cache of score alists to avoid having to reload them -all the time. This command will flush the cache -(@code{gnus-score-flush-cache}). - -@end table - -You can do scoring from the command line by saying something like: - -@findex gnus-batch-score -@cindex batch scoring -@example -$ emacs -batch -l ~/.emacs -l ~/.gnus.el -f gnus-batch-score -@end example - - -@node Score Variables -@section Score Variables -@cindex score variables - -@table @code - -@item gnus-use-scoring -@vindex gnus-use-scoring -If @code{nil}, Gnus will not check for score files, and will not, in -general, do any score-related work. This is @code{t} by default. - -@item gnus-kill-killed -@vindex gnus-kill-killed -If this variable is @code{nil}, Gnus will never apply score files to -articles that have already been through the kill process. While this -may save you lots of time, it also means that if you apply a kill file -to a group, and then change the kill file and want to run it over you -group again to kill more articles, it won't work. You have to set this -variable to @code{t} to do that. (It is @code{t} by default.) - -@item gnus-kill-files-directory -@vindex gnus-kill-files-directory -All kill and score files will be stored in this directory, which is -initialized from the @code{SAVEDIR} environment variable by default. -This is @file{~/News/} by default. - -@item gnus-score-file-suffix -@vindex gnus-score-file-suffix -Suffix to add to the group name to arrive at the score file name -(@samp{SCORE} by default.) - -@item gnus-score-uncacheable-files -@vindex gnus-score-uncacheable-files -@cindex score cache -All score files are normally cached to avoid excessive re-loading of -score files. However, if this might make your Emacs grow big and -bloated, so this regexp can be used to weed out score files unlikely to be needed again. It would be a bad idea to deny caching of -@file{all.SCORE}, while it might be a good idea to not cache -@file{comp.infosystems.www.authoring.misc.ADAPT}. In fact, this -variable is @samp{ADAPT$} by default, so no adaptive score files will -be cached. - -@item gnus-save-score -@vindex gnus-save-score -If you have really complicated score files, and do lots of batch -scoring, then you might set this variable to @code{t}. This will make -Gnus save the scores into the @file{.newsrc.eld} file. - -If you do not set this to @code{t}, then manual scores (like those set -with @kbd{V s} (@code{gnus-summary-set-score})) will not be preserved -across group visits. - -@item gnus-score-interactive-default-score -@vindex gnus-score-interactive-default-score -Score used by all the interactive raise/lower commands to raise/lower -score with. Default is 1000, which may seem excessive, but this is to -ensure that the adaptive scoring scheme gets enough room to play with. -We don't want the small changes from the adaptive scoring to overwrite -manually entered data. - -@item gnus-summary-default-score -@vindex gnus-summary-default-score -Default score of an article, which is 0 by default. - -@item gnus-summary-expunge-below -@vindex gnus-summary-expunge-below -Don't display the summary lines of articles that have scores lower than -this variable. This is @code{nil} by default, which means that no -articles will be hidden. This variable is local to the summary buffers, -and has to be set from @code{gnus-summary-mode-hook}. - -@item gnus-score-over-mark -@vindex gnus-score-over-mark -Mark (in the third column) used for articles with a score over the -default. Default is @samp{+}. - -@item gnus-score-below-mark -@vindex gnus-score-below-mark -Mark (in the third column) used for articles with a score below the -default. Default is @samp{-}. - -@item gnus-score-find-score-files-function -@vindex gnus-score-find-score-files-function -Function used to find score files for the current group. This function -is called with the name of the group as the argument. - -Predefined functions available are: -@table @code - -@item gnus-score-find-single -@findex gnus-score-find-single -Only apply the group's own score file. - -@item gnus-score-find-bnews -@findex gnus-score-find-bnews -Apply all score files that match, using bnews syntax. This is the -default. If the current group is @samp{gnu.emacs.gnus}, for instance, -@file{all.emacs.all.SCORE}, @file{not.alt.all.SCORE} and -@file{gnu.all.SCORE} would all apply. In short, the instances of -@samp{all} in the score file names are translated into @samp{.*}, and -then a regexp match is done. - -This means that if you have some score entries that you want to apply to -all groups, then you put those entries in the @file{all.SCORE} file. - -The score files are applied in a semi-random order, although Gnus will -try to apply the more general score files before the more specific score -files. It does this by looking at the number of elements in the score -file names---discarding the @samp{all} elements. - -@item gnus-score-find-hierarchical -@findex gnus-score-find-hierarchical -Apply all score files from all the parent groups. This means that you -can't have score files like @file{all.SCORE}, but you can have -@file{SCORE}, @file{comp.SCORE} and @file{comp.emacs.SCORE} for each -server. - -@end table -This variable can also be a list of functions. In that case, all -these functions will be called with the group name as argument, and -all the returned lists of score files will be applied. These -functions can also return lists of lists of score alists directly. In -that case, the functions that return these non-file score alists -should probably be placed before the ``real'' score file functions, to -ensure that the last score file returned is the local score file. -Phu. - -For example, to do hierarchical scoring but use a non-server-specific -overall score file, you could use the value -@example -(list (lambda (group) ("all.SCORE")) - 'gnus-score-find-hierarchical) -@end example - -@item gnus-score-expiry-days -@vindex gnus-score-expiry-days -This variable says how many days should pass before an unused score file -entry is expired. If this variable is @code{nil}, no score file entries -are expired. It's 7 by default. - -@item gnus-update-score-entry-dates -@vindex gnus-update-score-entry-dates -If this variable is non-@code{nil}, matching score entries will have -their dates updated. (This is how Gnus controls expiry---all -non-matching entries will become too old while matching entries will -stay fresh and young.) However, if you set this variable to @code{nil}, -even matching entries will grow old and will have to face that oh-so -grim reaper. - -@item gnus-score-after-write-file-function -@vindex gnus-score-after-write-file-function -Function called with the name of the score file just written. - -@item gnus-score-thread-simplify -@vindex gnus-score-thread-simplify -If this variable is non-@code{nil}, article subjects will be simplified -for subject scoring purposes in the same manner as with -threading---according to the current value of -gnus-simplify-subject-functions. If the scoring entry uses -@code{substring} or @code{exact} matching, the match will also be -simplified in this manner. - -@end table - - -@node Score File Format -@section Score File Format -@cindex score file format - -A score file is an @code{emacs-lisp} file that normally contains just a -single form. Casual users are not expected to edit these files; -everything can be changed from the summary buffer. - -Anyway, if you'd like to dig into it yourself, here's an example: - -@lisp -(("from" - ("Lars Ingebrigtsen" -10000) - ("Per Abrahamsen") - ("larsi\\|lmi" -50000 nil R)) - ("subject" - ("Ding is Badd" nil 728373)) - ("xref" - ("alt.politics" -1000 728372 s)) - ("lines" - (2 -100 nil <)) - (mark 0) - (expunge -1000) - (mark-and-expunge -10) - (read-only nil) - (orphan -10) - (adapt t) - (files "/hom/larsi/News/gnu.SCORE") - (exclude-files "all.SCORE") - (local (gnus-newsgroup-auto-expire t) - (gnus-summary-make-false-root empty)) - (eval (ding))) -@end lisp - -This example demonstrates most score file elements. For a different -approach, see @pxref{Advanced Scoring}. - -Even though this looks much like lisp code, nothing here is actually -@code{eval}ed. The lisp reader is used to read this form, though, so it -has to be valid syntactically, if not semantically. - -Six keys are supported by this alist: - -@table @code - -@item STRING -If the key is a string, it is the name of the header to perform the -match on. Scoring can only be performed on these eight headers: -@code{From}, @code{Subject}, @code{References}, @code{Message-ID}, -@code{Xref}, @code{Lines}, @code{Chars} and @code{Date}. In addition to -these headers, there are three strings to tell Gnus to fetch the entire -article and do the match on larger parts of the article: @code{Body} -will perform the match on the body of the article, @code{Head} will -perform the match on the head of the article, and @code{All} will -perform the match on the entire article. Note that using any of these -last three keys will slow down group entry @emph{considerably}. The -final ``header'' you can score on is @code{Followup}. These score -entries will result in new score entries being added for all follow-ups -to articles that matches these score entries. - -Following this key is a arbitrary number of score entries, where each -score entry has one to four elements. -@enumerate - -@item -The first element is the @dfn{match element}. On most headers this will -be a string, but on the Lines and Chars headers, this must be an -integer. - -@item -If the second element is present, it should be a number---the @dfn{score -element}. This number should be an integer in the neginf to posinf -interval. This number is added to the score of the article if the match -is successful. If this element is not present, the -@code{gnus-score-interactive-default-score} number will be used -instead. This is 1000 by default. - -@item -If the third element is present, it should be a number---the @dfn{date -element}. This date says when the last time this score entry matched, -which provides a mechanism for expiring the score entries. It this -element is not present, the score entry is permanent. The date is -represented by the number of days since December 31, 1 BCE. - -@item -If the fourth element is present, it should be a symbol---the @dfn{type -element}. This element specifies what function should be used to see -whether this score entry matches the article. What match types that can -be used depends on what header you wish to perform the match on. -@table @dfn - -@item From, Subject, References, Xref, Message-ID -For most header types, there are the @code{r} and @code{R} (regexp), as -well as @code{s} and @code{S} (substring) types, and @code{e} and -@code{E} (exact match), and @code{w} (word match) types. If this -element is not present, Gnus will assume that substring matching should -be used. @code{R}, @code{S}, and @code{E} differ from the others in -that the matches will be done in a case-sensitive manner. All these -one-letter types are really just abbreviations for the @code{regexp}, -@code{string}, @code{exact}, and @code{word} types, which you can use -instead, if you feel like. - -@item Lines, Chars -These two headers use different match types: @code{<}, @code{>}, -@code{=}, @code{>=} and @code{<=}. - -These predicates are true if - -@example -(PREDICATE HEADER MATCH) -@end example - -evaluates to non-@code{nil}. For instance, the advanced match -@code{("lines" 4 <)} (@pxref{Advanced Scoring}) will result in the -following form: - -@lisp -(< header-value 4) -@end lisp - -Or to put it another way: When using @code{<} on @code{Lines} with 4 as -the match, we get the score added if the article has less than 4 lines. -(It's easy to get confused and think it's the other way around. But -it's not. I think.) - -When matching on @code{Lines}, be careful because some backends (like -@code{nndir}) do not generate @code{Lines} header, so every article ends -up being marked as having 0 lines. This can lead to strange results if -you happen to lower score of the articles with few lines. - -@item Date -For the Date header we have three kinda silly match types: -@code{before}, @code{at} and @code{after}. I can't really imagine this -ever being useful, but, like, it would feel kinda silly not to provide -this function. Just in case. You never know. Better safe than sorry. -Once burnt, twice shy. Don't judge a book by its cover. Never not have -sex on a first date. (I have been told that at least one person, and I -quote, ``found this function indispensable'', however.) - -@cindex ISO8601 -@cindex date -A more useful match type is @code{regexp}. With it, you can match the -date string using a regular expression. The date is normalized to -ISO8601 compact format first---@var{YYYYMMDD}@code{T}@var{HHMMSS}. If -you want to match all articles that have been posted on April 1st in -every year, you could use @samp{....0401.........} as a match string, -for instance. (Note that the date is kept in its original time zone, so -this will match articles that were posted when it was April 1st where -the article was posted from. Time zones are such wholesome fun for the -whole family, eh?) - -@item Head, Body, All -These three match keys use the same match types as the @code{From} (etc) -header uses. - -@item Followup -This match key is somewhat special, in that it will match the -@code{From} header, and affect the score of not only the matching -articles, but also all followups to the matching articles. This allows -you e.g. increase the score of followups to your own articles, or -decrease the score of followups to the articles of some known -trouble-maker. Uses the same match types as the @code{From} header -uses. (Using this match key will lead to creation of @file{ADAPT} -files.) - -@item Thread -This match key works along the same lines as the @code{Followup} match -key. If you say that you want to score on a (sub-)thread started by an -article with a @code{Message-ID} @var{x}, then you add a @samp{thread} -match. This will add a new @samp{thread} match for each article that -has @var{x} in its @code{References} header. (These new @samp{thread} -matches will use the @code{Message-ID}s of these matching articles.) -This will ensure that you can raise/lower the score of an entire thread, -even though some articles in the thread may not have complete -@code{References} headers. Note that using this may lead to -undeterministic scores of the articles in the thread. (Using this match -key will lead to creation of @file{ADAPT} files.) -@end table -@end enumerate - -@cindex Score File Atoms -@item mark -The value of this entry should be a number. Any articles with a score -lower than this number will be marked as read. - -@item expunge -The value of this entry should be a number. Any articles with a score -lower than this number will be removed from the summary buffer. - -@item mark-and-expunge -The value of this entry should be a number. Any articles with a score -lower than this number will be marked as read and removed from the -summary buffer. - -@item thread-mark-and-expunge -The value of this entry should be a number. All articles that belong to -a thread that has a total score below this number will be marked as read -and removed from the summary buffer. @code{gnus-thread-score-function} -says how to compute the total score for a thread. - -@item files -The value of this entry should be any number of file names. These files -are assumed to be score files as well, and will be loaded the same way -this one was. - -@item exclude-files -The clue of this entry should be any number of files. These files will -not be loaded, even though they would normally be so, for some reason or -other. - -@item eval -The value of this entry will be @code{eval}el. This element will be -ignored when handling global score files. - -@item read-only -Read-only score files will not be updated or saved. Global score files -should feature this atom (@pxref{Global Score Files}). (Note: -@dfn{Global} here really means @dfn{global}; not your personal -apply-to-all-groups score files.) - -@item orphan -The value of this entry should be a number. Articles that do not have -parents will get this number added to their scores. Imagine you follow -some high-volume newsgroup, like @samp{comp.lang.c}. Most likely you -will only follow a few of the threads, also want to see any new threads. - -You can do this with the following two score file entries: - -@example - (orphan -500) - (mark-and-expunge -100) -@end example - -When you enter the group the first time, you will only see the new -threads. You then raise the score of the threads that you find -interesting (with @kbd{I T} or @kbd{I S}), and ignore (@kbd{C y}) the -rest. Next time you enter the group, you will see new articles in the -interesting threads, plus any new threads. - -I.e.---the orphan score atom is for high-volume groups where a few -interesting threads which can't be found automatically by ordinary -scoring rules exist. - -@item adapt -This entry controls the adaptive scoring. If it is @code{t}, the -default adaptive scoring rules will be used. If it is @code{ignore}, no -adaptive scoring will be performed on this group. If it is a list, this -list will be used as the adaptive scoring rules. If it isn't present, -or is something other than @code{t} or @code{ignore}, the default -adaptive scoring rules will be used. If you want to use adaptive -scoring on most groups, you'd set @code{gnus-use-adaptive-scoring} to -@code{t}, and insert an @code{(adapt ignore)} in the groups where you do -not want adaptive scoring. If you only want adaptive scoring in a few -groups, you'd set @code{gnus-use-adaptive-scoring} to @code{nil}, and -insert @code{(adapt t)} in the score files of the groups where you want -it. - -@item adapt-file -All adaptive score entries will go to the file named by this entry. It -will also be applied when entering the group. This atom might be handy -if you want to adapt on several groups at once, using the same adaptive -file for a number of groups. - -@item local -@cindex local variables -The value of this entry should be a list of @code{(VAR VALUE)} pairs. -Each @var{var} will be made buffer-local to the current summary buffer, -and set to the value specified. This is a convenient, if somewhat -strange, way of setting variables in some groups if you don't like hooks -much. Note that the @var{value} won't be evaluated. -@end table - - -@node Score File Editing -@section Score File Editing - -You normally enter all scoring commands from the summary buffer, but you -might feel the urge to edit them by hand as well, so we've supplied you -with a mode for that. - -It's simply a slightly customized @code{emacs-lisp} mode, with these -additional commands: - -@table @kbd - -@item C-c C-c -@kindex C-c C-c (Score) -@findex gnus-score-edit-done -Save the changes you have made and return to the summary buffer -(@code{gnus-score-edit-done}). - -@item C-c C-d -@kindex C-c C-d (Score) -@findex gnus-score-edit-insert-date -Insert the current date in numerical format -(@code{gnus-score-edit-insert-date}). This is really the day number, if -you were wondering. - -@item C-c C-p -@kindex C-c C-p (Score) -@findex gnus-score-pretty-print -The adaptive score files are saved in an unformatted fashion. If you -intend to read one of these files, you want to @dfn{pretty print} it -first. This command (@code{gnus-score-pretty-print}) does that for -you. - -@end table - -Type @kbd{M-x gnus-score-mode} to use this mode. - -@vindex gnus-score-mode-hook -@code{gnus-score-menu-hook} is run in score mode buffers. - -In the summary buffer you can use commands like @kbd{V f} and @kbd{V -e} to begin editing score files. - - -@node Adaptive Scoring -@section Adaptive Scoring -@cindex adaptive scoring - -If all this scoring is getting you down, Gnus has a way of making it all -happen automatically---as if by magic. Or rather, as if by artificial -stupidity, to be precise. - -@vindex gnus-use-adaptive-scoring -When you read an article, or mark an article as read, or kill an -article, you leave marks behind. On exit from the group, Gnus can sniff -these marks and add score elements depending on what marks it finds. -You turn on this ability by setting @code{gnus-use-adaptive-scoring} to -@code{t} or @code{(line)}. If you want score adaptively on separate -words appearing in the subjects, you should set this variable to -@code{(word)}. If you want to use both adaptive methods, set this -variable to @code{(word line)}. - -@vindex gnus-default-adaptive-score-alist -To give you complete control over the scoring process, you can customize -the @code{gnus-default-adaptive-score-alist} variable. For instance, it -might look something like this: - -@lisp -(setq gnus-default-adaptive-score-alist - '((gnus-unread-mark) - (gnus-ticked-mark (from 4)) - (gnus-dormant-mark (from 5)) - (gnus-del-mark (from -4) (subject -1)) - (gnus-read-mark (from 4) (subject 2)) - (gnus-expirable-mark (from -1) (subject -1)) - (gnus-killed-mark (from -1) (subject -3)) - (gnus-kill-file-mark) - (gnus-ancient-mark) - (gnus-low-score-mark) - (gnus-catchup-mark (from -1) (subject -1)))) -@end lisp - -As you see, each element in this alist has a mark as a key (either a -variable name or a ``real'' mark---a character). Following this key is -a arbitrary number of header/score pairs. If there are no header/score -pairs following the key, no adaptive scoring will be done on articles -that have that key as the article mark. For instance, articles with -@code{gnus-unread-mark} in the example above will not get adaptive score -entries. - -Each article can have only one mark, so just a single of these rules -will be applied to each article. - -To take @code{gnus-del-mark} as an example---this alist says that all -articles that have that mark (i.e., are marked with @samp{D}) will have a -score entry added to lower based on the @code{From} header by -4, and -lowered by @code{Subject} by -1. Change this to fit your prejudices. - -If you have marked 10 articles with the same subject with -@code{gnus-del-mark}, the rule for that mark will be applied ten times. -That means that that subject will get a score of ten times -1, which -should be, unless I'm much mistaken, -10. - -If you have auto-expirable (mail) groups (@pxref{Expiring Mail}), all -the read articles will be marked with the @samp{E} mark. This'll -probably make adaptive scoring slightly impossible, so auto-expiring and -adaptive scoring doesn't really mix very well. - -The headers you can score on are @code{from}, @code{subject}, -@code{message-id}, @code{references}, @code{xref}, @code{lines}, -@code{chars} and @code{date}. In addition, you can score on -@code{followup}, which will create an adaptive score entry that matches -on the @code{References} header using the @code{Message-ID} of the -current article, thereby matching the following thread. - -You can also score on @code{thread}, which will try to score all -articles that appear in a thread. @code{thread} matches uses a -@code{Message-ID} to match on the @code{References} header of the -article. If the match is made, the @code{Message-ID} of the article is -added to the @code{thread} rule. (Think about it. I'd recommend two -aspirins afterwards.) - -If you use this scheme, you should set the score file atom @code{mark} -to something small---like -300, perhaps, to avoid having small random -changes result in articles getting marked as read. - -After using adaptive scoring for a week or so, Gnus should start to -become properly trained and enhance the authors you like best, and kill -the authors you like least, without you having to say so explicitly. - -You can control what groups the adaptive scoring is to be performed on -by using the score files (@pxref{Score File Format}). This will also -let you use different rules in different groups. - -@vindex gnus-adaptive-file-suffix -The adaptive score entries will be put into a file where the name is the -group name with @code{gnus-adaptive-file-suffix} appended. The default -is @samp{ADAPT}. - -@vindex gnus-score-exact-adapt-limit -When doing adaptive scoring, substring or fuzzy matching would probably -give you the best results in most cases. However, if the header one -matches is short, the possibility for false positives is great, so if -the length of the match is less than -@code{gnus-score-exact-adapt-limit}, exact matching will be used. If -this variable is @code{nil}, exact matching will always be used to avoid -this problem. - -@vindex gnus-default-adaptive-word-score-alist -As mentioned above, you can adapt either on individual words or entire -headers. If you adapt on words, the -@code{gnus-default-adaptive-word-score-alist} variable says what score -each instance of a word should add given a mark. - -@lisp -(setq gnus-default-adaptive-word-score-alist - `((,gnus-read-mark . 30) - (,gnus-catchup-mark . -10) - (,gnus-killed-mark . -20) - (,gnus-del-mark . -15))) -@end lisp - -This is the default value. If you have adaption on words enabled, every -word that appears in subjects of articles marked with -@code{gnus-read-mark} will result in a score rule that increase the -score with 30 points. - -@vindex gnus-default-ignored-adaptive-words -@vindex gnus-ignored-adaptive-words -Words that appear in the @code{gnus-default-ignored-adaptive-words} list -will be ignored. If you wish to add more words to be ignored, use the -@code{gnus-ignored-adaptive-words} list instead. - -@vindex gnus-adaptive-word-length-limit -Some may feel that short words shouldn't count when doing adaptive -scoring. If so, you may set @code{gnus-adaptive-word-length-limit} to -an integer. Words shorter than this number will be ignored. This -variable defaults til @code{nil}. - -@vindex gnus-adaptive-word-syntax-table -When the scoring is done, @code{gnus-adaptive-word-syntax-table} is the -syntax table in effect. It is similar to the standard syntax table, but -it considers numbers to be non-word-constituent characters. - -@vindex gnus-adaptive-word-minimum -If @code{gnus-adaptive-word-minimum} is set to a number, the adaptive -word scoring process will never bring down the score of an article to -below this number. The default is @code{nil}. - -@vindex gnus-adaptive-word-no-group-words -If @code{gnus-adaptive-word-no-group-words} is set to @code{t}, gnus -won't adaptively word score any of the words in the group name. Useful -for groups like @samp{comp.editors.emacs}, where most of the subject -lines contain the word @samp{emacs}. - -After using this scheme for a while, it might be nice to write a -@code{gnus-psychoanalyze-user} command to go through the rules and see -what words you like and what words you don't like. Or perhaps not. - -Note that the adaptive word scoring thing is highly experimental and is -likely to change in the future. Initial impressions seem to indicate -that it's totally useless as it stands. Some more work (involving more -rigorous statistical methods) will have to be done to make this useful. - - -@node Home Score File -@section Home Score File - -The score file where new score file entries will go is called the -@dfn{home score file}. This is normally (and by default) the score file -for the group itself. For instance, the home score file for -@samp{gnu.emacs.gnus} is @file{gnu.emacs.gnus.SCORE}. - -However, this may not be what you want. It is often convenient to share -a common home score file among many groups---all @samp{emacs} groups -could perhaps use the same home score file. - -@vindex gnus-home-score-file -The variable that controls this is @code{gnus-home-score-file}. It can -be: - -@enumerate -@item -A string. Then this file will be used as the home score file for all -groups. - -@item -A function. The result of this function will be used as the home score -file. The function will be called with the name of the group as the -parameter. - -@item -A list. The elements in this list can be: - -@enumerate -@item -@code{(@var{regexp} @var{file-name})}. If the @var{regexp} matches the -group name, the @var{file-name} will be used as the home score file. - -@item -A function. If the function returns non-nil, the result will be used as -the home score file. - -@item -A string. Use the string as the home score file. -@end enumerate - -The list will be traversed from the beginning towards the end looking -for matches. - -@end enumerate - -So, if you want to use just a single score file, you could say: - -@lisp -(setq gnus-home-score-file - "my-total-score-file.SCORE") -@end lisp - -If you want to use @file{gnu.SCORE} for all @samp{gnu} groups and -@file{rec.SCORE} for all @samp{rec} groups (and so on), you can say: - -@findex gnus-hierarchial-home-score-file -@lisp -(setq gnus-home-score-file - 'gnus-hierarchial-home-score-file) -@end lisp - -This is a ready-made function provided for your convenience. -Other functions include - -@table @code -@item gnus-current-home-score-file -@findex gnus-current-home-score-file -Return the ``current'' regular score file. This will make scoring -commands add entry to the ``innermost'' matching score file. - -@end table - -If you want to have one score file for the @samp{emacs} groups and -another for the @samp{comp} groups, while letting all other groups use -their own home score files: - -@lisp -(setq gnus-home-score-file - ;; All groups that match the regexp "\\.emacs" - '(("\\.emacs" "emacs.SCORE") - ;; All the comp groups in one score file - ("^comp" "comp.SCORE"))) -@end lisp - -@vindex gnus-home-adapt-file -@code{gnus-home-adapt-file} works exactly the same way as -@code{gnus-home-score-file}, but says what the home adaptive score file -is instead. All new adaptive file entries will go into the file -specified by this variable, and the same syntax is allowed. - -In addition to using @code{gnus-home-score-file} and -@code{gnus-home-adapt-file}, you can also use group parameters -(@pxref{Group Parameters}) and topic parameters (@pxref{Topic -Parameters}) to achieve much the same. Group and topic parameters take -precedence over this variable. - - -@node Followups To Yourself -@section Followups To Yourself - -Gnus offers two commands for picking out the @code{Message-ID} header in -the current buffer. Gnus will then add a score rule that scores using -this @code{Message-ID} on the @code{References} header of other -articles. This will, in effect, increase the score of all articles that -respond to the article in the current buffer. Quite useful if you want -to easily note when people answer what you've said. - -@table @code - -@item gnus-score-followup-article -@findex gnus-score-followup-article -This will add a score to articles that directly follow up your own -article. - -@item gnus-score-followup-thread -@findex gnus-score-followup-thread -This will add a score to all articles that appear in a thread ``below'' -your own article. -@end table - -@vindex message-sent-hook -These two functions are both primarily meant to be used in hooks like -@code{message-sent-hook}, like this: -@lisp -(add-hook 'message-sent-hook 'gnus-score-followup-thread) -@end lisp - - -If you look closely at your own @code{Message-ID}, you'll notice that -the first two or three characters are always the same. Here's two of -mine: - -@example - - -@end example - -So ``my'' ident on this machine is @samp{x6}. This can be -exploited---the following rule will raise the score on all followups to -myself: - -@lisp -("references" - ("" - 1000 nil r)) -@end lisp - -Whether it's the first two or first three characters that are ``yours'' -is system-dependent. - - -@node Scoring On Other Headers -@section Scoring On Other Headers -@cindex scoring on other headers - -Gnus is quite fast when scoring the ``traditional'' -headers---@samp{From}, @samp{Subject} and so on. However, scoring -other headers requires writing a @code{head} scoring rule, which means -that Gnus has to request every single article from the backend to find -matches. This takes a long time in big groups. - -Now, there's not much you can do about this for news groups, but for -mail groups, you have greater control. In the @pxref{To From -Newsgroups} section of the manual, it's explained in greater detail what -this mechanism does, but here's a cookbook example for @code{nnml} on -how to allow scoring on the @samp{To} and @samp{Cc} headers. - -Put the following in your @file{.gnus.el} file. - -@lisp -(setq gnus-extra-headers '(To Cc Newsgroups Keywords) - nnmail-extra-headers gnus-extra-headers) -@end lisp - -Restart Gnus and rebuild your @code{nnml} overview files with the -@kbd{M-x nnml-generate-nov-databases} command. This will take a long -time if you have much mail. - -Now you can score on @samp{To} and @samp{Cc} as ``extra headers'' like -so: @kbd{I e s p To RET RET}. - -See? Simple. - - -@node Scoring Tips -@section Scoring Tips -@cindex scoring tips - -@table @dfn - -@item Crossposts -@cindex crossposts -@cindex scoring crossposts -If you want to lower the score of crossposts, the line to match on is -the @code{Xref} header. -@lisp -("xref" (" talk.politics.misc:" -1000)) -@end lisp - -@item Multiple crossposts -If you want to lower the score of articles that have been crossposted to -more than, say, 3 groups: -@lisp -("xref" - ("[^:\n]+:[0-9]+ +[^:\n]+:[0-9]+ +[^:\n]+:[0-9]+" - -1000 nil r)) -@end lisp - -@item Matching on the body -This is generally not a very good idea---it takes a very long time. -Gnus actually has to fetch each individual article from the server. But -you might want to anyway, I guess. Even though there are three match -keys (@code{Head}, @code{Body} and @code{All}), you should choose one -and stick with it in each score file. If you use any two, each article -will be fetched @emph{twice}. If you want to match a bit on the -@code{Head} and a bit on the @code{Body}, just use @code{All} for all -the matches. - -@item Marking as read -You will probably want to mark articles that have scores below a certain -number as read. This is most easily achieved by putting the following -in your @file{all.SCORE} file: -@lisp -((mark -100)) -@end lisp -You may also consider doing something similar with @code{expunge}. - -@item Negated character classes -If you say stuff like @code{[^abcd]*}, you may get unexpected results. -That will match newlines, which might lead to, well, The Unknown. Say -@code{[^abcd\n]*} instead. -@end table - - -@node Reverse Scoring -@section Reverse Scoring -@cindex reverse scoring - -If you want to keep just articles that have @samp{Sex with Emacs} in the -subject header, and expunge all other articles, you could put something -like this in your score file: - -@lisp -(("subject" - ("Sex with Emacs" 2)) - (mark 1) - (expunge 1)) -@end lisp - -So, you raise all articles that match @samp{Sex with Emacs} and mark the -rest as read, and expunge them to boot. - - -@node Global Score Files -@section Global Score Files -@cindex global score files - -Sure, other newsreaders have ``global kill files''. These are usually -nothing more than a single kill file that applies to all groups, stored -in the user's home directory. Bah! Puny, weak newsreaders! - -What I'm talking about here are Global Score Files. Score files from -all over the world, from users everywhere, uniting all nations in one -big, happy score file union! Ange-score! New and untested! - -@vindex gnus-global-score-files -All you have to do to use other people's score files is to set the -@code{gnus-global-score-files} variable. One entry for each score file, -or each score file directory. Gnus will decide by itself what score -files are applicable to which group. - -To use the score file -@file{/ftp@@ftp.gnus.org:/pub/larsi/ding/score/soc.motss.SCORE} and -all score files in the @file{/ftp@@ftp.some-where:/pub/score} directory, -say this: - -@lisp -(setq gnus-global-score-files - '("/ftp@@ftp.gnus.org:/pub/larsi/ding/score/soc.motss.SCORE" - "/ftp@@ftp.some-where:/pub/score/")) -@end lisp - -@findex gnus-score-search-global-directories -@noindent -Simple, eh? Directory names must end with a @samp{/}. These -directories are typically scanned only once during each Gnus session. -If you feel the need to manually re-scan the remote directories, you can -use the @code{gnus-score-search-global-directories} command. - -Note that, at present, using this option will slow down group entry -somewhat. (That is---a lot.) - -If you want to start maintaining score files for other people to use, -just put your score file up for anonymous ftp and announce it to the -world. Become a retro-moderator! Participate in the retro-moderator -wars sure to ensue, where retro-moderators battle it out for the -sympathy of the people, luring them to use their score files on false -premises! Yay! The net is saved! - -Here are some tips for the would-be retro-moderator, off the top of my -head: - -@itemize @bullet - -@item -Articles heavily crossposted are probably junk. -@item -To lower a single inappropriate article, lower by @code{Message-ID}. -@item -Particularly brilliant authors can be raised on a permanent basis. -@item -Authors that repeatedly post off-charter for the group can safely be -lowered out of existence. -@item -Set the @code{mark} and @code{expunge} atoms to obliterate the nastiest -articles completely. - -@item -Use expiring score entries to keep the size of the file down. You -should probably have a long expiry period, though, as some sites keep -old articles for a long time. -@end itemize - -... I wonder whether other newsreaders will support global score files -in the future. @emph{Snicker}. Yup, any day now, newsreaders like Blue -Wave, xrn and 1stReader are bound to implement scoring. Should we start -holding our breath yet? - - -@node Kill Files -@section Kill Files -@cindex kill files - -Gnus still supports those pesky old kill files. In fact, the kill file -entries can now be expiring, which is something I wrote before Daniel -Quinlan thought of doing score files, so I've left the code in there. - -In short, kill processing is a lot slower (and I do mean @emph{a lot}) -than score processing, so it might be a good idea to rewrite your kill -files into score files. - -Anyway, a kill file is a normal @code{emacs-lisp} file. You can put any -forms into this file, which means that you can use kill files as some -sort of primitive hook function to be run on group entry, even though -that isn't a very good idea. - -Normal kill files look like this: - -@lisp -(gnus-kill "From" "Lars Ingebrigtsen") -(gnus-kill "Subject" "ding") -(gnus-expunge "X") -@end lisp - -This will mark every article written by me as read, and remove the -marked articles from the summary buffer. Very useful, you'll agree. - -Other programs use a totally different kill file syntax. If Gnus -encounters what looks like a @code{rn} kill file, it will take a stab at -interpreting it. - -Two summary functions for editing a GNUS kill file: - -@table @kbd - -@item M-k -@kindex M-k (Summary) -@findex gnus-summary-edit-local-kill -Edit this group's kill file (@code{gnus-summary-edit-local-kill}). - -@item M-K -@kindex M-K (Summary) -@findex gnus-summary-edit-global-kill -Edit the general kill file (@code{gnus-summary-edit-global-kill}). -@end table - -Two group mode functions for editing the kill files: - -@table @kbd - -@item M-k -@kindex M-k (Group) -@findex gnus-group-edit-local-kill -Edit this group's kill file (@code{gnus-group-edit-local-kill}). - -@item M-K -@kindex M-K (Group) -@findex gnus-group-edit-global-kill -Edit the general kill file (@code{gnus-group-edit-global-kill}). -@end table - -Kill file variables: - -@table @code -@item gnus-kill-file-name -@vindex gnus-kill-file-name -A kill file for the group @samp{soc.motss} is normally called -@file{soc.motss.KILL}. The suffix appended to the group name to get -this file name is detailed by the @code{gnus-kill-file-name} variable. -The ``global'' kill file (not in the score file sense of ``global'', of -course) is just called @file{KILL}. - -@vindex gnus-kill-save-kill-file -@item gnus-kill-save-kill-file -If this variable is non-@code{nil}, Gnus will save the -kill file after processing, which is necessary if you use expiring -kills. - -@item gnus-apply-kill-hook -@vindex gnus-apply-kill-hook -@findex gnus-apply-kill-file-unless-scored -@findex gnus-apply-kill-file -A hook called to apply kill files to a group. It is -@code{(gnus-apply-kill-file)} by default. If you want to ignore the -kill file if you have a score file for the same group, you can set this -hook to @code{(gnus-apply-kill-file-unless-scored)}. If you don't want -kill files to be processed, you should set this variable to @code{nil}. - -@item gnus-kill-file-mode-hook -@vindex gnus-kill-file-mode-hook -A hook called in kill-file mode buffers. - -@end table - - -@node Converting Kill Files -@section Converting Kill Files -@cindex kill files -@cindex converting kill files - -If you have loads of old kill files, you may want to convert them into -score files. If they are ``regular'', you can use -the @file{gnus-kill-to-score.el} package; if not, you'll have to do it -by hand. - -The kill to score conversion package isn't included in Gnus by default. -You can fetch it from -@uref{http://www.stud.ifi.uio.no/~larsi/ding-various/gnus-kill-to-score.el}. - -If your old kill files are very complex---if they contain more -non-@code{gnus-kill} forms than not, you'll have to convert them by -hand. Or just let them be as they are. Gnus will still use them as -before. - - -@node GroupLens -@section GroupLens -@cindex GroupLens - -GroupLens is a collaborative filtering system that helps you work -together with other people to find the quality news articles out of the -huge volume of news articles generated every day. - -To accomplish this the GroupLens system combines your opinions about -articles you have already read with the opinions of others who have done -likewise and gives you a personalized prediction for each unread news -article. Think of GroupLens as a matchmaker. GroupLens watches how you -rate articles, and finds other people that rate articles the same way. -Once it has found some people you agree with it tells you, in the form -of a prediction, what they thought of the article. You can use this -prediction to help you decide whether or not you want to read the -article. - -@menu -* Using GroupLens:: How to make Gnus use GroupLens. -* Rating Articles:: Letting GroupLens know how you rate articles. -* Displaying Predictions:: Displaying predictions given by GroupLens. -* GroupLens Variables:: Customizing GroupLens. -@end menu - - -@node Using GroupLens -@subsection Using GroupLens - -To use GroupLens you must register a pseudonym with your local Better -Bit Bureau (BBB). -@uref{http://www.cs.umn.edu/Research/GroupLens/bbb.html} is the only -better bit in town at the moment. - -Once you have registered you'll need to set a couple of variables. - -@table @code - -@item gnus-use-grouplens -@vindex gnus-use-grouplens -Setting this variable to a non-@code{nil} value will make Gnus hook into -all the relevant GroupLens functions. - -@item grouplens-pseudonym -@vindex grouplens-pseudonym -This variable should be set to the pseudonym you got when registering -with the Better Bit Bureau. - -@item grouplens-newsgroups -@vindex grouplens-newsgroups -A list of groups that you want to get GroupLens predictions for. - -@end table - -That's the minimum of what you need to get up and running with GroupLens. -Once you've registered, GroupLens will start giving you scores for -articles based on the average of what other people think. But, to get -the real benefit of GroupLens you need to start rating articles -yourself. Then the scores GroupLens gives you will be personalized for -you, based on how the people you usually agree with have already rated. - - -@node Rating Articles -@subsection Rating Articles - -In GroupLens, an article is rated on a scale from 1 to 5, inclusive. -Where 1 means something like this article is a waste of bandwidth and 5 -means that the article was really good. The basic question to ask -yourself is, "on a scale from 1 to 5 would I like to see more articles -like this one?" - -There are four ways to enter a rating for an article in GroupLens. - -@table @kbd - -@item r -@kindex r (GroupLens) -@findex bbb-summary-rate-article -This function will prompt you for a rating on a scale of one to five. - -@item k -@kindex k (GroupLens) -@findex grouplens-score-thread -This function will prompt you for a rating, and rate all the articles in -the thread. This is really useful for some of those long running giant -threads in rec.humor. - -@end table - -The next two commands, @kbd{n} and @kbd{,} take a numerical prefix to be -the score of the article you're reading. - -@table @kbd - -@item 1-5 n -@kindex n (GroupLens) -@findex grouplens-next-unread-article -Rate the article and go to the next unread article. - -@item 1-5 , -@kindex , (GroupLens) -@findex grouplens-best-unread-article -Rate the article and go to the next unread article with the highest score. - -@end table - -If you want to give the current article a score of 4 and then go to the -next article, just type @kbd{4 n}. - - -@node Displaying Predictions -@subsection Displaying Predictions - -GroupLens makes a prediction for you about how much you will like a -news article. The predictions from GroupLens are on a scale from 1 to -5, where 1 is the worst and 5 is the best. You can use the predictions -from GroupLens in one of three ways controlled by the variable -@code{gnus-grouplens-override-scoring}. - -@vindex gnus-grouplens-override-scoring -There are three ways to display predictions in grouplens. You may -choose to have the GroupLens scores contribute to, or override the -regular gnus scoring mechanism. override is the default; however, some -people prefer to see the Gnus scores plus the grouplens scores. To get -the separate scoring behavior you need to set -@code{gnus-grouplens-override-scoring} to @code{'separate}. To have the -GroupLens predictions combined with the grouplens scores set it to -@code{'override} and to combine the scores set -@code{gnus-grouplens-override-scoring} to @code{'combine}. When you use -the combine option you will also want to set the values for -@code{grouplens-prediction-offset} and -@code{grouplens-score-scale-factor}. - -@vindex grouplens-prediction-display -In either case, GroupLens gives you a few choices for how you would like -to see your predictions displayed. The display of predictions is -controlled by the @code{grouplens-prediction-display} variable. - -The following are valid values for that variable. - -@table @code -@item prediction-spot -The higher the prediction, the further to the right an @samp{*} is -displayed. - -@item confidence-interval -A numeric confidence interval. - -@item prediction-bar -The higher the prediction, the longer the bar. - -@item confidence-bar -Numerical confidence. - -@item confidence-spot -The spot gets bigger with more confidence. - -@item prediction-num -Plain-old numeric value. - -@item confidence-plus-minus -Prediction +/- confidence. - -@end table - - -@node GroupLens Variables -@subsection GroupLens Variables - -@table @code - -@item gnus-summary-grouplens-line-format -The summary line format used in GroupLens-enhanced summary buffers. It -accepts the same specs as the normal summary line format (@pxref{Summary -Buffer Lines}). The default is @samp{%U%R%z%l%I%(%[%4L: %-23,23n%]%) -%s\n}. - -@item grouplens-bbb-host -Host running the bbbd server. @samp{grouplens.cs.umn.edu} is the -default. - -@item grouplens-bbb-port -Port of the host running the bbbd server. The default is 9000. - -@item grouplens-score-offset -Offset the prediction by this value. In other words, subtract the -prediction value by this number to arrive at the effective score. The -default is 0. - -@item grouplens-score-scale-factor -This variable allows the user to magnify the effect of GroupLens scores. -The scale factor is applied after the offset. The default is 1. - -@end table - - -@node Advanced Scoring -@section Advanced Scoring - -Scoring on Subjects and From headers is nice enough, but what if you're -really interested in what a person has to say only when she's talking -about a particular subject? Or what if you really don't want to -read what person A has to say when she's following up to person B, but -want to read what she says when she's following up to person C? - -By using advanced scoring rules you may create arbitrarily complex -scoring patterns. - -@menu -* Advanced Scoring Syntax:: A definition. -* Advanced Scoring Examples:: What they look like. -* Advanced Scoring Tips:: Getting the most out of it. -@end menu - - -@node Advanced Scoring Syntax -@subsection Advanced Scoring Syntax - -Ordinary scoring rules have a string as the first element in the rule. -Advanced scoring rules have a list as the first element. The second -element is the score to be applied if the first element evaluated to a -non-@code{nil} value. - -These lists may consist of three logical operators, one redirection -operator, and various match operators. - -Logical operators: - -@table @code -@item & -@itemx and -This logical operator will evaluate each of its arguments until it finds -one that evaluates to @code{false}, and then it'll stop. If all arguments -evaluate to @code{true} values, then this operator will return -@code{true}. - -@item | -@itemx or -This logical operator will evaluate each of its arguments until it finds -one that evaluates to @code{true}. If no arguments are @code{true}, -then this operator will return @code{false}. - -@item ! -@itemx not -@itemx ¬ -This logical operator only takes a single argument. It returns the -logical negation of the value of its argument. - -@end table - -There is an @dfn{indirection operator} that will make its arguments -apply to the ancestors of the current article being scored. For -instance, @code{1-} will make score rules apply to the parent of the -current article. @code{2-} will make score rules apply to the -grandparent of the current article. Alternatively, you can write -@code{^^}, where the number of @code{^}s (carets) says how far back into -the ancestry you want to go. - -Finally, we have the match operators. These are the ones that do the -real work. Match operators are header name strings followed by a match -and a match type. A typical match operator looks like @samp{("from" -"Lars Ingebrigtsen" s)}. The header names are the same as when using -simple scoring, and the match types are also the same. - - -@node Advanced Scoring Examples -@subsection Advanced Scoring Examples - -Let's say you want to increase the score of articles written by Lars -when he's talking about Gnus: - -@example -((& - ("from" "Lars Ingebrigtsen") - ("subject" "Gnus")) - 1000) -@end example - -Quite simple, huh? - -When he writes long articles, he sometimes has something nice to say: - -@example -((& - ("from" "Lars Ingebrigtsen") - (| - ("subject" "Gnus") - ("lines" 100 >))) - 1000) -@end example - -However, when he responds to things written by Reig Eigil Logge, you -really don't want to read what he's written: - -@example -((& - ("from" "Lars Ingebrigtsen") - (1- ("from" "Reig Eigir Logge"))) - -100000) -@end example - -Everybody that follows up Redmondo when he writes about disappearing -socks should have their scores raised, but only when they talk about -white socks. However, when Lars talks about socks, it's usually not -very interesting: - -@example -((& - (1- - (& - ("from" "redmondo@@.*no" r) - ("body" "disappearing.*socks" t))) - (! ("from" "Lars Ingebrigtsen")) - ("body" "white.*socks")) - 1000) -@end example - -The possibilities are endless. - - -@node Advanced Scoring Tips -@subsection Advanced Scoring Tips - -The @code{&} and @code{|} logical operators do short-circuit logic. -That is, they stop processing their arguments when it's clear what the -result of the operation will be. For instance, if one of the arguments -of an @code{&} evaluates to @code{false}, there's no point in evaluating -the rest of the arguments. This means that you should put slow matches -(@samp{body}, @samp{header}) last and quick matches (@samp{from}, -@samp{subject}) first. - -The indirection arguments (@code{1-} and so on) will make their -arguments work on previous generations of the thread. If you say -something like: - -@example -... -(1- - (1- - ("from" "lars"))) -... -@end example - -Then that means "score on the from header of the grandparent of the -current article". An indirection is quite fast, but it's better to say: - -@example -(1- - (& - ("from" "Lars") - ("subject" "Gnus"))) -@end example - -than it is to say: - -@example -(& - (1- ("from" "Lars")) - (1- ("subject" "Gnus"))) -@end example - - -@node Score Decays -@section Score Decays -@cindex score decays -@cindex decays - -You may find that your scores have a tendency to grow without -bounds, especially if you're using adaptive scoring. If scores get too -big, they lose all meaning---they simply max out and it's difficult to -use them in any sensible way. - -@vindex gnus-decay-scores -@findex gnus-decay-score -@vindex gnus-decay-score-function -Gnus provides a mechanism for decaying scores to help with this problem. -When score files are loaded and @code{gnus-decay-scores} is -non-@code{nil}, Gnus will run the score files through the decaying -mechanism thereby lowering the scores of all non-permanent score rules. -The decay itself if performed by the @code{gnus-decay-score-function} -function, which is @code{gnus-decay-score} by default. Here's the -definition of that function: - -@lisp -(defun gnus-decay-score (score) - "Decay SCORE. -This is done according to `gnus-score-decay-constant' -and `gnus-score-decay-scale'." - (floor - (- score - (* (if (< score 0) 1 -1) - (min (abs score) - (max gnus-score-decay-constant - (* (abs score) - gnus-score-decay-scale))))))) -@end lisp - -@vindex gnus-score-decay-scale -@vindex gnus-score-decay-constant -@code{gnus-score-decay-constant} is 3 by default and -@code{gnus-score-decay-scale} is 0.05. This should cause the following: - -@enumerate -@item -Scores between -3 and 3 will be set to 0 when this function is called. - -@item -Scores with magnitudes between 3 and 60 will be shrunk by 3. - -@item -Scores with magnitudes greater than 60 will be shrunk by 5% of the -score. -@end enumerate - -If you don't like this decay function, write your own. It is called -with the score to be decayed as its only parameter, and it should return -the new score, which should be an integer. - -Gnus will try to decay scores once a day. If you haven't run Gnus for -four days, Gnus will decay the scores four times, for instance. - - -@node Various -@chapter Various - -@menu -* Process/Prefix:: A convention used by many treatment commands. -* Interactive:: Making Gnus ask you many questions. -* Symbolic Prefixes:: How to supply some Gnus functions with options. -* Formatting Variables:: You can specify what buffers should look like. -* Window Layout:: Configuring the Gnus buffer windows. -* Faces and Fonts:: How to change how faces look. -* Compilation:: How to speed Gnus up. -* Mode Lines:: Displaying information in the mode lines. -* Highlighting and Menus:: Making buffers look all nice and cozy. -* Buttons:: Get tendinitis in ten easy steps! -* Daemons:: Gnus can do things behind your back. -* NoCeM:: How to avoid spam and other fatty foods. -* Undo:: Some actions can be undone. -* Moderation:: What to do if you're a moderator. -* XEmacs Enhancements:: There are more pictures and stuff under XEmacs. -* Fuzzy Matching:: What's the big fuzz? -* Thwarting Email Spam:: A how-to on avoiding unsolicited commercial email. -* Various Various:: Things that are really various. -@end menu - - -@node Process/Prefix -@section Process/Prefix -@cindex process/prefix convention - -Many functions, among them functions for moving, decoding and saving -articles, use what is known as the @dfn{Process/Prefix convention}. - -This is a method for figuring out what articles the user wants the -command to be performed on. - -It goes like this: - -If the numeric prefix is N, perform the operation on the next N -articles, starting with the current one. If the numeric prefix is -negative, perform the operation on the previous N articles, starting -with the current one. - -@vindex transient-mark-mode -If @code{transient-mark-mode} in non-@code{nil} and the region is -active, all articles in the region will be worked upon. - -If there is no numeric prefix, but some articles are marked with the -process mark, perform the operation on the articles marked with -the process mark. - -If there is neither a numeric prefix nor any articles marked with the -process mark, just perform the operation on the current article. - -Quite simple, really, but it needs to be made clear so that surprises -are avoided. - -Commands that react to the process mark will push the current list of -process marked articles onto a stack and will then clear all process -marked articles. You can restore the previous configuration with the -@kbd{M P y} command (@pxref{Setting Process Marks}). - -@vindex gnus-summary-goto-unread -One thing that seems to shock & horrify lots of people is that, for -instance, @kbd{3 d} does exactly the same as @kbd{d} @kbd{d} @kbd{d}. -Since each @kbd{d} (which marks the current article as read) by default -goes to the next unread article after marking, this means that @kbd{3 d} -will mark the next three unread articles as read, no matter what the -summary buffer looks like. Set @code{gnus-summary-goto-unread} to -@code{nil} for a more straightforward action. - -Many commands do not use the process/prefix convention. All commands -that do explicitly say so in this manual. To apply the process/prefix -convention to commands that do not use it, you can use the @kbd{M-&} -command. For instance, to mark all the articles in the group as -expirable, you could say `M P b M-& E'. - - -@node Interactive -@section Interactive -@cindex interaction - -@table @code - -@item gnus-novice-user -@vindex gnus-novice-user -If this variable is non-@code{nil}, you are either a newcomer to the -World of Usenet, or you are very cautious, which is a nice thing to be, -really. You will be given questions of the type ``Are you sure you want -to do this?'' before doing anything dangerous. This is @code{t} by -default. - -@item gnus-expert-user -@vindex gnus-expert-user -If this variable is non-@code{nil}, you will seldom be asked any -questions by Gnus. It will simply assume you know what you're doing, no -matter how strange. - -@item gnus-interactive-catchup -@vindex gnus-interactive-catchup -Require confirmation before catching up a group if non-@code{nil}. It -is @code{t} by default. - -@item gnus-interactive-exit -@vindex gnus-interactive-exit -Require confirmation before exiting Gnus. This variable is @code{t} by -default. -@end table - - -@node Symbolic Prefixes -@section Symbolic Prefixes -@cindex symbolic prefixes - -Quite a lot of Emacs commands react to the (numeric) prefix. For -instance, @kbd{C-u 4 C-f} moves point four characters forward, and -@kbd{C-u 9 0 0 I s s p} adds a permanent @code{Subject} substring score -rule of 900 to the current article. - -This is all nice and well, but what if you want to give a command some -additional information? Well, what most commands do is interpret the -``raw'' prefix in some special way. @kbd{C-u 0 C-x C-s} means that one -doesn't want a backup file to be created when saving the current buffer, -for instance. But what if you want to save without making a backup -file, and you want Emacs to flash lights and play a nice tune at the -same time? You can't, and you're probably perfectly happy that way. - -@kindex M-i (Summary) -@findex gnus-symbolic-argument -I'm not, so I've added a second prefix---the @dfn{symbolic prefix}. The -prefix key is @kbd{M-i} (@code{gnus-symbolic-argument}), and the next -character typed in is the value. You can stack as many @kbd{M-i} -prefixes as you want. @kbd{M-i a M-C-u} means ``feed the @kbd{M-C-u} -command the symbolic prefix @code{a}''. @kbd{M-i a M-i b M-C-u} means -``feed the @kbd{M-C-u} command the symbolic prefixes @code{a} and -@code{b}''. You get the drift. - -Typing in symbolic prefixes to commands that don't accept them doesn't -hurt, but it doesn't do any good either. Currently not many Gnus -functions make use of the symbolic prefix. - -If you're interested in how Gnus implements this, @pxref{Extended -Interactive}. - - -@node Formatting Variables -@section Formatting Variables -@cindex formatting variables - -Throughout this manual you've probably noticed lots of variables called -things like @code{gnus-group-line-format} and -@code{gnus-summary-mode-line-format}. These control how Gnus is to -output lines in the various buffers. There's quite a lot of them. -Fortunately, they all use the same syntax, so there's not that much to -be annoyed by. - -Here's an example format spec (from the group buffer): @samp{%M%S%5y: -%(%g%)\n}. We see that it is indeed extremely ugly, and that there are -lots of percentages everywhere. - -@menu -* Formatting Basics:: A formatting variable is basically a format string. -* Mode Line Formatting:: Some rules about mode line formatting variables. -* Advanced Formatting:: Modifying output in various ways. -* User-Defined Specs:: Having Gnus call your own functions. -* Formatting Fonts:: Making the formatting look colorful and nice. -* Positioning Point:: Moving point to a position after an operation. -* Tabulation:: Tabulating your output. -* Wide Characters:: Dealing with wide characters. -@end menu - -Currently Gnus uses the following formatting variables: -@code{gnus-group-line-format}, @code{gnus-summary-line-format}, -@code{gnus-server-line-format}, @code{gnus-topic-line-format}, -@code{gnus-group-mode-line-format}, -@code{gnus-summary-mode-line-format}, -@code{gnus-article-mode-line-format}, -@code{gnus-server-mode-line-format}, and -@code{gnus-summary-pick-line-format}. - -All these format variables can also be arbitrary elisp forms. In that -case, they will be @code{eval}ed to insert the required lines. - -@kindex M-x gnus-update-format -@findex gnus-update-format -Gnus includes a command to help you while creating your own format -specs. @kbd{M-x gnus-update-format} will @code{eval} the current form, -update the spec in question and pop you to a buffer where you can -examine the resulting lisp code to be run to generate the line. - - - -@node Formatting Basics -@subsection Formatting Basics - -Each @samp{%} element will be replaced by some string or other when the -buffer in question is generated. @samp{%5y} means ``insert the @samp{y} -spec, and pad with spaces to get a 5-character field''. - -As with normal C and Emacs Lisp formatting strings, the numerical -modifier between the @samp{%} and the formatting type character will -@dfn{pad} the output so that it is always at least that long. -@samp{%5y} will make the field always (at least) five characters wide by -padding with spaces to the left. If you say @samp{%-5y}, it will pad to -the right instead. - -You may also wish to limit the length of the field to protect against -particularly wide values. For that you can say @samp{%4,6y}, which -means that the field will never be more than 6 characters wide and never -less than 4 characters wide. - - -@node Mode Line Formatting -@subsection Mode Line Formatting - -Mode line formatting variables (e.g., -@code{gnus-summary-mode-line-format}) follow the same rules as other, -buffer line oriented formatting variables (@pxref{Formatting Basics}) -with the following two differences: - -@enumerate - -@item -There must be no newline (@samp{\n}) at the end. - -@item -The special @samp{%%b} spec can be used to display the buffer name. -Well, it's no spec at all, really---@samp{%%} is just a way to quote -@samp{%} to allow it to pass through the formatting machinery unmangled, -so that Emacs receives @samp{%b}, which is something the Emacs mode line -display interprets to mean ``show the buffer name''. For a full list of -mode line specs Emacs understands, see the documentation of the -@code{mode-line-format} variable. - -@end enumerate - - -@node Advanced Formatting -@subsection Advanced Formatting - -It is frequently useful to post-process the fields in some way. -Padding, limiting, cutting off parts and suppressing certain values can -be achieved by using @dfn{tilde modifiers}. A typical tilde spec might -look like @samp{%~(cut 3)~(ignore "0")y}. - -These are the valid modifiers: - -@table @code -@item pad -@itemx pad-left -Pad the field to the left with spaces until it reaches the required -length. - -@item pad-right -Pad the field to the right with spaces until it reaches the required -length. - -@item max -@itemx max-left -Cut off characters from the left until it reaches the specified length. - -@item max-right -Cut off characters from the right until it reaches the specified -length. - -@item cut -@itemx cut-left -Cut off the specified number of characters from the left. - -@item cut-right -Cut off the specified number of characters from the right. - -@item ignore -Return an empty string if the field is equal to the specified value. - -@item form -Use the specified form as the field value when the @samp{@@} spec is -used. -@end table - -Let's take an example. The @samp{%o} spec in the summary mode lines -will return a date in compact ISO8601 format---@samp{19960809T230410}. -This is quite a mouthful, so we want to shave off the century number and -the time, leaving us with a six-character date. That would be -@samp{%~(cut-left 2)~(max-right 6)~(pad 6)o}. (Cutting is done before -maxing, and we need the padding to ensure that the date is never less -than 6 characters to make it look nice in columns.) - -Ignoring is done first; then cutting; then maxing; and then as the very -last operation, padding. - -@vindex gnus-compile-user-specs -If @code{gnus-compile-user-specs} is set to @code{nil} (@code{t} by -default) with your strong personality, and use a lots of these advanced -thingies, you'll find that Gnus gets quite slow. This can be helped -enormously by running @kbd{M-x gnus-compile} when you are satisfied with -the look of your lines. -@xref{Compilation}. - - -@node User-Defined Specs -@subsection User-Defined Specs - -All the specs allow for inserting user defined specifiers---@samp{u}. -The next character in the format string should be a letter. Gnus -will call the function @code{gnus-user-format-function-}@samp{X}, where -@samp{X} is the letter following @samp{%u}. The function will be passed -a single parameter---what the parameter means depends on what buffer -it's being called from. The function should return a string, which will -be inserted into the buffer just like information from any other -specifier. This function may also be called with dummy values, so it -should protect against that. - -You can also use tilde modifiers (@pxref{Advanced Formatting} to achieve -much the same without defining new functions. Here's an example: -@samp{%~(form (count-lines (point-min) (point)))@@}. The form -given here will be evaluated to yield the current line number, and then -inserted. - - -@node Formatting Fonts -@subsection Formatting Fonts - -There are specs for highlighting, and these are shared by all the format -variables. Text inside the @samp{%(} and @samp{%)} specifiers will get -the special @code{mouse-face} property set, which means that it will be -highlighted (with @code{gnus-mouse-face}) when you put the mouse pointer -over it. - -Text inside the @samp{%@{} and @samp{%@}} specifiers will have their -normal faces set using @code{gnus-face-0}, which is @code{bold} by -default. If you say @samp{%1@{}, you'll get @code{gnus-face-1} instead, -and so on. Create as many faces as you wish. The same goes for the -@code{mouse-face} specs---you can say @samp{%3(hello%)} to have -@samp{hello} mouse-highlighted with @code{gnus-mouse-face-3}. - -Text inside the @samp{%<} and @samp{%>} specifiers will get the special -@code{balloon-help} property set to @code{gnus-balloon-face-0}. If you -say @samp{%1<}, you'll get @code{gnus-balloon-face-1} and so on. The -@code{gnus-balloon-face-*} variables should be either strings or symbols -naming functions that return a string. Under @code{balloon-help-mode}, -when the mouse passes over text with this property set, a balloon window -will appear and display the string. Please refer to the doc string of -@code{balloon-help-mode} for more information on this. - -Here's an alternative recipe for the group buffer: - -@lisp -;; Create three face types. -(setq gnus-face-1 'bold) -(setq gnus-face-3 'italic) - -;; We want the article count to be in -;; a bold and green face. So we create -;; a new face called `my-green-bold'. -(copy-face 'bold 'my-green-bold) -;; Set the color. -(set-face-foreground 'my-green-bold "ForestGreen") -(setq gnus-face-2 'my-green-bold) - -;; Set the new & fancy format. -(setq gnus-group-line-format - "%M%S%3@{%5y%@}%2[:%] %(%1@{%g%@}%)\n") -@end lisp - -I'm sure you'll be able to use this scheme to create totally unreadable -and extremely vulgar displays. Have fun! - -Note that the @samp{%(} specs (and friends) do not make any sense on the -mode-line variables. - -@node Positioning Point -@subsection Positioning Point - -Gnus usually moves point to a pre-defined place on each line in most -buffers. By default, point move to the first colon character on the -line. You can customize this behaviour in three different ways. - -You can move the colon character to somewhere else on the line. - -@findex gnus-goto-colon -You can redefine the function that moves the point to the colon. The -function is called @code{gnus-goto-colon}. - -But perhaps the most convenient way to deal with this, if you don't want -to have a colon in your line, is to use the @samp{%C} specifier. If you -put a @samp{%C} somewhere in your format line definition, Gnus will -place point there. - - -@node Tabulation -@subsection Tabulation - -You can usually line up your displays by padding and cutting your -strings. However, when combining various strings of different size, it -can often be more convenient to just output the strings, and then worry -about lining up the following text afterwards. - -To do that, Gnus supplies tabulator specs--@samp{%=}. There are two -different types---@dfn{hard tabulators} and @dfn{soft tabulators}. - -@samp{%50=} will insert space characters to pad the line up to column -50. If the text is already past column 50, nothing will be inserted. -This is the soft tabulator. - -@samp{%-50=} will insert space characters to pad the line up to column -50. If the text is already past column 50, the excess text past column -50 will be removed. This is the hard tabulator. - - -@node Wide Characters -@subsection Wide Characters - -Proportional fonts in most countries have characters of the same width. -Some countries, however, use Latin characters mixed with wider -characters---most notable East Asian countries. - -The problem is that when formatting, Gnus assumes that if a string is 10 -characters wide, it'll be 10 Latin characters wide on the screen. In -these coutries, that's not true. - -@vindex gnus-use-correct-string-widths -To help fix this, you can set @code{gnus-use-correct-string-widths} to -@code{t}. This makes buffer generation slower, but the results will be -prettieer. The default value is @code{nil}. - - - -@node Window Layout -@section Window Layout -@cindex window layout - -No, there's nothing here about X, so be quiet. - -@vindex gnus-use-full-window -If @code{gnus-use-full-window} non-@code{nil}, Gnus will delete all -other windows and occupy the entire Emacs screen by itself. It is -@code{t} by default. - -Setting this variable to @code{nil} kinda works, but there are -glitches. Use at your own peril. - -@vindex gnus-buffer-configuration -@code{gnus-buffer-configuration} describes how much space each Gnus -buffer should be given. Here's an excerpt of this variable: - -@lisp -((group (vertical 1.0 (group 1.0 point) - (if gnus-carpal (group-carpal 4)))) - (article (vertical 1.0 (summary 0.25 point) - (article 1.0)))) -@end lisp - -This is an alist. The @dfn{key} is a symbol that names some action or -other. For instance, when displaying the group buffer, the window -configuration function will use @code{group} as the key. A full list of -possible names is listed below. - -The @dfn{value} (i.e., the @dfn{split}) says how much space each buffer -should occupy. To take the @code{article} split as an example - - -@lisp -(article (vertical 1.0 (summary 0.25 point) - (article 1.0))) -@end lisp - -This @dfn{split} says that the summary buffer should occupy 25% of upper -half of the screen, and that it is placed over the article buffer. As -you may have noticed, 100% + 25% is actually 125% (yup, I saw y'all -reaching for that calculator there). However, the special number -@code{1.0} is used to signal that this buffer should soak up all the -rest of the space available after the rest of the buffers have taken -whatever they need. There should be only one buffer with the @code{1.0} -size spec per split. - -Point will be put in the buffer that has the optional third element -@code{point}. In a @code{frame} split, the last subsplit having a leaf -split where the tag @code{frame-focus} is a member (i.e. is the third or -fourth element in the list, depending on whether the @code{point} tag is -present) gets focus. - -Here's a more complicated example: - -@lisp -(article (vertical 1.0 (group 4) - (summary 0.25 point) - (if gnus-carpal (summary-carpal 4)) - (article 1.0))) -@end lisp - -If the size spec is an integer instead of a floating point number, -then that number will be used to say how many lines a buffer should -occupy, not a percentage. - -If the @dfn{split} looks like something that can be @code{eval}ed (to be -precise---if the @code{car} of the split is a function or a subr), this -split will be @code{eval}ed. If the result is non-@code{nil}, it will -be used as a split. This means that there will be three buffers if -@code{gnus-carpal} is @code{nil}, and four buffers if @code{gnus-carpal} -is non-@code{nil}. - -Not complicated enough for you? Well, try this on for size: - -@lisp -(article (horizontal 1.0 - (vertical 0.5 - (group 1.0) - (gnus-carpal 4)) - (vertical 1.0 - (summary 0.25 point) - (summary-carpal 4) - (article 1.0)))) -@end lisp - -Whoops. Two buffers with the mystery 100% tag. And what's that -@code{horizontal} thingie? - -If the first element in one of the split is @code{horizontal}, Gnus will -split the window horizontally, giving you two windows side-by-side. -Inside each of these strips you may carry on all you like in the normal -fashion. The number following @code{horizontal} says what percentage of -the screen is to be given to this strip. - -For each split, there @emph{must} be one element that has the 100% tag. -The splitting is never accurate, and this buffer will eat any leftover -lines from the splits. - -To be slightly more formal, here's a definition of what a valid split -may look like: - -@example -split = frame | horizontal | vertical | buffer | form -frame = "(frame " size *split ")" -horizontal = "(horizontal " size *split ")" -vertical = "(vertical " size *split ")" -buffer = "(" buf-name " " size *[ "point" ] *[ "frame-focus"] ")" -size = number | frame-params -buf-name = group | article | summary ... -@end example - -The limitations are that the @code{frame} split can only appear as the -top-level split. @var{form} should be an Emacs Lisp form that should -return a valid split. We see that each split is fully recursive, and -may contain any number of @code{vertical} and @code{horizontal} splits. - -@vindex gnus-window-min-width -@vindex gnus-window-min-height -@cindex window height -@cindex window width -Finding the right sizes can be a bit complicated. No window may be less -than @code{gnus-window-min-height} (default 1) characters high, and all -windows must be at least @code{gnus-window-min-width} (default 1) -characters wide. Gnus will try to enforce this before applying the -splits. If you want to use the normal Emacs window width/height limit, -you can just set these two variables to @code{nil}. - -If you're not familiar with Emacs terminology, @code{horizontal} and -@code{vertical} splits may work the opposite way of what you'd expect. -Windows inside a @code{horizontal} split are shown side-by-side, and -windows within a @code{vertical} split are shown above each other. - -@findex gnus-configure-frame -If you want to experiment with window placement, a good tip is to call -@code{gnus-configure-frame} directly with a split. This is the function -that does all the real work when splitting buffers. Below is a pretty -nonsensical configuration with 5 windows; two for the group buffer and -three for the article buffer. (I said it was nonsensical.) If you -@code{eval} the statement below, you can get an idea of how that would -look straight away, without going through the normal Gnus channels. -Play with it until you're satisfied, and then use -@code{gnus-add-configuration} to add your new creation to the buffer -configuration list. - -@lisp -(gnus-configure-frame - '(horizontal 1.0 - (vertical 10 - (group 1.0) - (article 0.3 point)) - (vertical 1.0 - (article 1.0) - (horizontal 4 - (group 1.0) - (article 10))))) -@end lisp - -You might want to have several frames as well. No prob---just use the -@code{frame} split: - -@lisp -(gnus-configure-frame - '(frame 1.0 - (vertical 1.0 - (summary 0.25 point frame-focus) - (article 1.0)) - (vertical ((height . 5) (width . 15) - (user-position . t) - (left . -1) (top . 1)) - (picon 1.0)))) - -@end lisp - -This split will result in the familiar summary/article window -configuration in the first (or ``main'') frame, while a small additional -frame will be created where picons will be shown. As you can see, -instead of the normal @code{1.0} top-level spec, each additional split -should have a frame parameter alist as the size spec. -@xref{Frame Parameters, , Frame Parameters, elisp, The GNU Emacs Lisp -Reference Manual}. Under XEmacs, a frame property list will be -accepted, too---for instance, @code{(height 5 width 15 left -1 top 1)} -is such a plist. -The list of all possible keys for @code{gnus-buffer-configuration} can -be found in its default value. - -Note that the @code{message} key is used for both -@code{gnus-group-mail} and @code{gnus-summary-mail-other-window}. If -it is desirable to distinguish between the two, something like this -might be used: - -@lisp -(message (horizontal 1.0 - (vertical 1.0 (message 1.0 point)) - (vertical 0.24 - (if (buffer-live-p gnus-summary-buffer) - '(summary 0.5)) - (group 1.0))))) -@end lisp - -One common desire for a multiple frame split is to have a separate frame -for composing mail and news while leaving the original frame intact. To -accomplish that, something like the following can be done: - -@lisp -(message - (frame 1.0 - (if (not (buffer-live-p gnus-summary-buffer)) - (car (cdr (assoc 'group gnus-buffer-configuration))) - (car (cdr (assoc 'summary gnus-buffer-configuration)))) - (vertical ((user-position . t) (top . 1) (left . 1) - (name . "Message")) - (message 1.0 point)))) -@end lisp - -@findex gnus-add-configuration -Since the @code{gnus-buffer-configuration} variable is so long and -complicated, there's a function you can use to ease changing the config -of a single setting: @code{gnus-add-configuration}. If, for instance, -you want to change the @code{article} setting, you could say: - -@lisp -(gnus-add-configuration - '(article (vertical 1.0 - (group 4) - (summary .25 point) - (article 1.0)))) -@end lisp - -You'd typically stick these @code{gnus-add-configuration} calls in your -@file{.gnus.el} file or in some startup hook---they should be run after -Gnus has been loaded. - -@vindex gnus-always-force-window-configuration -If all windows mentioned in the configuration are already visible, Gnus -won't change the window configuration. If you always want to force the -``right'' window configuration, you can set -@code{gnus-always-force-window-configuration} to non-@code{nil}. - -If you're using tree displays (@pxref{Tree Display}), and the tree -window is displayed vertically next to another window, you may also want -to fiddle with @code{gnus-tree-minimize-window} to avoid having the -windows resized. - -@subsection Example Window Configurations - -@itemize @bullet -@item -Narrow left hand side occupied by group buffer. Right hand side split -between summary buffer (top one-sixth) and article buffer (bottom). - -@ifinfo -@example -+---+---------+ -| G | Summary | -| r +---------+ -| o | | -| u | Article | -| p | | -+---+---------+ -@end example -@end ifinfo - -@lisp -(gnus-add-configuration - '(article - (horizontal 1.0 - (vertical 25 (group 1.0)) - (vertical 1.0 - (summary 0.16 point) - (article 1.0))))) - -(gnus-add-configuration - '(summary - (horizontal 1.0 - (vertical 25 (group 1.0)) - (vertical 1.0 (summary 1.0 point))))) -@end lisp - -@end itemize - - -@node Faces and Fonts -@section Faces and Fonts -@cindex faces -@cindex fonts -@cindex colors - -Fiddling with fonts and faces used to be very difficult, but these days -it is very simple. You simply say @kbd{M-x customize-face}, pick out -the face you want to alter, and alter it via the standard Customize -interface. - - -@node Compilation -@section Compilation -@cindex compilation -@cindex byte-compilation - -@findex gnus-compile - -Remember all those line format specification variables? -@code{gnus-summary-line-format}, @code{gnus-group-line-format}, and so -on. By default, T-gnus will use the byte-compiled codes of these -variables and we can keep a slow-down to a minimum. However, if you set -@code{gnus-compile-user-specs} to @code{nil} (@code{t} by default), -unfortunately, changing them will mean a quite significant slow-down. -(The default values of these variables have byte-compiled functions -associated with them, while the user-generated versions do not, of -course.) - -To help with this, you can run @kbd{M-x gnus-compile} after you've -fiddled around with the variables and feel that you're (kind of) -satisfied. This will result in the new specs being byte-compiled, and -you'll get top speed again. Note that T-gnus will not save these -compiled specs in the @file{.newsrc.eld} file. - -@table @code -@item gnus-compile-user-specs -@vindex gnus-compile-user-specs -If it is non-nil, the user-defined format specs will be byte-compiled -automatically. The default value of this variable is @code{t}. It has -an effect on the values of @code{gnus-*-line-format-spec}. -@end table - - -@node Mode Lines -@section Mode Lines -@cindex mode lines - -@vindex gnus-updated-mode-lines -@code{gnus-updated-mode-lines} says what buffers should keep their mode -lines updated. It is a list of symbols. Supported symbols include -@code{group}, @code{article}, @code{summary}, @code{server}, -@code{browse}, and @code{tree}. If the corresponding symbol is present, -Gnus will keep that mode line updated with information that may be -pertinent. If this variable is @code{nil}, screen refresh may be -quicker. - -@cindex display-time - -@vindex gnus-mode-non-string-length -By default, Gnus displays information on the current article in the mode -lines of the summary and article buffers. The information Gnus wishes -to display (e.g. the subject of the article) is often longer than the -mode lines, and therefore have to be cut off at some point. The -@code{gnus-mode-non-string-length} variable says how long the other -elements on the line is (i.e., the non-info part). If you put -additional elements on the mode line (e.g. a clock), you should modify -this variable: - -@c Hook written by Francesco Potorti` -@lisp -(add-hook 'display-time-hook - (lambda () (setq gnus-mode-non-string-length - (+ 21 - (if line-number-mode 5 0) - (if column-number-mode 4 0) - (length display-time-string))))) -@end lisp - -If this variable is @code{nil} (which is the default), the mode line -strings won't be chopped off, and they won't be padded either. Note -that the default is unlikely to be desirable, as even the percentage -complete in the buffer may be crowded off the mode line; the user should -configure this variable appropriately for her configuration. - - -@node Highlighting and Menus -@section Highlighting and Menus -@cindex visual -@cindex highlighting -@cindex menus - -@vindex gnus-visual -The @code{gnus-visual} variable controls most of the Gnus-prettifying -aspects. If @code{nil}, Gnus won't attempt to create menus or use fancy -colors or fonts. This will also inhibit loading the @file{gnus-vis.el} -file. - -This variable can be a list of visual properties that are enabled. The -following elements are valid, and are all included by default: - -@table @code -@item group-highlight -Do highlights in the group buffer. -@item summary-highlight -Do highlights in the summary buffer. -@item article-highlight -Do highlights in the article buffer. -@item highlight -Turn on highlighting in all buffers. -@item group-menu -Create menus in the group buffer. -@item summary-menu -Create menus in the summary buffers. -@item article-menu -Create menus in the article buffer. -@item browse-menu -Create menus in the browse buffer. -@item server-menu -Create menus in the server buffer. -@item score-menu -Create menus in the score buffers. -@item menu -Create menus in all buffers. -@end table - -So if you only want highlighting in the article buffer and menus in all -buffers, you could say something like: - -@lisp -(setq gnus-visual '(article-highlight menu)) -@end lisp - -If you want highlighting only and no menus whatsoever, you'd say: - -@lisp -(setq gnus-visual '(highlight)) -@end lisp - -If @code{gnus-visual} is @code{t}, highlighting and menus will be used -in all Gnus buffers. - -Other general variables that influence the look of all buffers include: - -@table @code -@item gnus-mouse-face -@vindex gnus-mouse-face -This is the face (i.e., font) used for mouse highlighting in Gnus. No -mouse highlights will be done if @code{gnus-visual} is @code{nil}. - -@end table - -There are hooks associated with the creation of all the different menus: - -@table @code - -@item gnus-article-menu-hook -@vindex gnus-article-menu-hook -Hook called after creating the article mode menu. - -@item gnus-group-menu-hook -@vindex gnus-group-menu-hook -Hook called after creating the group mode menu. - -@item gnus-summary-menu-hook -@vindex gnus-summary-menu-hook -Hook called after creating the summary mode menu. - -@item gnus-server-menu-hook -@vindex gnus-server-menu-hook -Hook called after creating the server mode menu. - -@item gnus-browse-menu-hook -@vindex gnus-browse-menu-hook -Hook called after creating the browse mode menu. - -@item gnus-score-menu-hook -@vindex gnus-score-menu-hook -Hook called after creating the score mode menu. - -@end table - - -@node Buttons -@section Buttons -@cindex buttons -@cindex mouse -@cindex click - -Those new-fangled @dfn{mouse} contraptions is very popular with the -young, hep kids who don't want to learn the proper way to do things -these days. Why, I remember way back in the summer of '89, when I was -using Emacs on a Tops 20 system. Three hundred users on one single -machine, and every user was running Simula compilers. Bah! - -Right. - -@vindex gnus-carpal -Well, you can make Gnus display bufferfuls of buttons you can click to -do anything by setting @code{gnus-carpal} to @code{t}. Pretty simple, -really. Tell the chiropractor I sent you. - - -@table @code - -@item gnus-carpal-mode-hook -@vindex gnus-carpal-mode-hook -Hook run in all carpal mode buffers. - -@item gnus-carpal-button-face -@vindex gnus-carpal-button-face -Face used on buttons. - -@item gnus-carpal-header-face -@vindex gnus-carpal-header-face -Face used on carpal buffer headers. - -@item gnus-carpal-group-buffer-buttons -@vindex gnus-carpal-group-buffer-buttons -Buttons in the group buffer. - -@item gnus-carpal-summary-buffer-buttons -@vindex gnus-carpal-summary-buffer-buttons -Buttons in the summary buffer. - -@item gnus-carpal-server-buffer-buttons -@vindex gnus-carpal-server-buffer-buttons -Buttons in the server buffer. - -@item gnus-carpal-browse-buffer-buttons -@vindex gnus-carpal-browse-buffer-buttons -Buttons in the browse buffer. -@end table - -All the @code{buttons} variables are lists. The elements in these list -are either cons cells where the @code{car} contains a text to be displayed and -the @code{cdr} contains a function symbol, or a simple string. - - -@node Daemons -@section Daemons -@cindex demons -@cindex daemons - -Gnus, being larger than any program ever written (allegedly), does lots -of strange stuff that you may wish to have done while you're not -present. For instance, you may want it to check for new mail once in a -while. Or you may want it to close down all connections to all servers -when you leave Emacs idle. And stuff like that. - -Gnus will let you do stuff like that by defining various -@dfn{handlers}. Each handler consists of three elements: A -@var{function}, a @var{time}, and an @var{idle} parameter. - -Here's an example of a handler that closes connections when Emacs has -been idle for thirty minutes: - -@lisp -(gnus-demon-close-connections nil 30) -@end lisp - -Here's a handler that scans for PGP headers every hour when Emacs is -idle: - -@lisp -(gnus-demon-scan-pgp 60 t) -@end lisp - -This @var{time} parameter and than @var{idle} parameter work together -in a strange, but wonderful fashion. Basically, if @var{idle} is -@code{nil}, then the function will be called every @var{time} minutes. - -If @var{idle} is @code{t}, then the function will be called after -@var{time} minutes only if Emacs is idle. So if Emacs is never idle, -the function will never be called. But once Emacs goes idle, the -function will be called every @var{time} minutes. - -If @var{idle} is a number and @var{time} is a number, the function will -be called every @var{time} minutes only when Emacs has been idle for -@var{idle} minutes. - -If @var{idle} is a number and @var{time} is @code{nil}, the function -will be called once every time Emacs has been idle for @var{idle} -minutes. - -And if @var{time} is a string, it should look like @samp{07:31}, and -the function will then be called once every day somewhere near that -time. Modified by the @var{idle} parameter, of course. - -@vindex gnus-demon-timestep -(When I say ``minute'' here, I really mean @code{gnus-demon-timestep} -seconds. This is 60 by default. If you change that variable, -all the timings in the handlers will be affected.) - -So, if you want to add a handler, you could put something like this in -your @file{.gnus} file: - -@findex gnus-demon-add-handler -@lisp -(gnus-demon-add-handler 'gnus-demon-close-connections 30 t) -@end lisp - -@findex gnus-demon-add-nocem -@findex gnus-demon-add-scanmail -@findex gnus-demon-add-rescan -@findex gnus-demon-add-scan-timestamps -@findex gnus-demon-add-disconnection -Some ready-made functions to do this have been created: -@code{gnus-demon-add-nocem}, @code{gnus-demon-add-disconnection}, -@code{gnus-demon-add-nntp-close-connection}, -@code{gnus-demon-add-scan-timestamps}, @code{gnus-demon-add-rescan}, and -@code{gnus-demon-add-scanmail}. Just put those functions in your -@file{.gnus} if you want those abilities. - -@findex gnus-demon-init -@findex gnus-demon-cancel -@vindex gnus-demon-handlers -If you add handlers to @code{gnus-demon-handlers} directly, you should -run @code{gnus-demon-init} to make the changes take hold. To cancel all -daemons, you can use the @code{gnus-demon-cancel} function. - -Note that adding daemons can be pretty naughty if you over do it. Adding -functions that scan all news and mail from all servers every two seconds -is a sure-fire way of getting booted off any respectable system. So -behave. - - -@node NoCeM -@section NoCeM -@cindex nocem -@cindex spam - -@dfn{Spamming} is posting the same article lots and lots of times. -Spamming is bad. Spamming is evil. - -Spamming is usually canceled within a day or so by various anti-spamming -agencies. These agencies usually also send out @dfn{NoCeM} messages. -NoCeM is pronounced ``no see-'em'', and means what the name -implies---these are messages that make the offending articles, like, go -away. - -What use are these NoCeM messages if the articles are canceled anyway? -Some sites do not honor cancel messages and some sites just honor cancels -from a select few people. Then you may wish to make use of the NoCeM -messages, which are distributed in the @samp{alt.nocem.misc} newsgroup. - -Gnus can read and parse the messages in this group automatically, and -this will make spam disappear. - -There are some variables to customize, of course: - -@table @code -@item gnus-use-nocem -@vindex gnus-use-nocem -Set this variable to @code{t} to set the ball rolling. It is @code{nil} -by default. - -@item gnus-nocem-groups -@vindex gnus-nocem-groups -Gnus will look for NoCeM messages in the groups in this list. The -default is @code{("news.lists.filters" "news.admin.net-abuse.bulletins" -"alt.nocem.misc" "news.admin.net-abuse.announce")}. - -@item gnus-nocem-issuers -@vindex gnus-nocem-issuers -There are many people issuing NoCeM messages. This list says what -people you want to listen to. The default is @code{("Automoose-1" -"clewis@@ferret.ocunix.on.ca" "cosmo.roadkill" "SpamHippo" -"hweede@@snafu.de")}; fine, upstanding citizens all of them. - -Known despammers that you can put in this list are listed at -@uref{http://www.xs4all.nl/~rosalind/nocemreg/nocemreg.html}. - -You do not have to heed NoCeM messages from all these people---just the -ones you want to listen to. You also don't have to accept all NoCeM -messages from the people you like. Each NoCeM message has a @dfn{type} -header that gives the message a (more or less, usually less) rigorous -definition. Common types are @samp{spam}, @samp{spew}, @samp{mmf}, -@samp{binary}, and @samp{troll}. To specify this, you have to use -@code{(@var{issuer} @var{conditions} @dots{})} elements in the list. -Each condition is either a string (which is a regexp that matches types -you want to use) or a list on the form @code{(not @var{string})}, where -@var{string} is a regexp that matches types you don't want to use. - -For instance, if you want all NoCeM messages from Chris Lewis except his -@samp{troll} messages, you'd say: - -@lisp -("clewis@@ferret.ocunix.on.ca" ".*" (not "troll")) -@end lisp - -On the other hand, if you just want nothing but his @samp{spam} and -@samp{spew} messages, you'd say: - -@lisp -("clewis@@ferret.ocunix.on.ca" (not ".*") "spew" "spam") -@end lisp - -The specs are applied left-to-right. - - -@item gnus-nocem-verifyer -@vindex gnus-nocem-verifyer -@findex mc-verify -This should be a function for verifying that the NoCeM issuer is who she -says she is. The default is @code{mc-verify}, which is a Mailcrypt -function. If this is too slow and you don't care for verification -(which may be dangerous), you can set this variable to @code{nil}. - -If you want signed NoCeM messages to be verified and unsigned messages -not to be verified (but used anyway), you could do something like: - -@lisp -(setq gnus-nocem-verifyer 'my-gnus-mc-verify) - -(defun my-gnus-mc-verify () - (not (eq 'forged - (ignore-errors - (if (mc-verify) - t - 'forged))))) -@end lisp - -This might be dangerous, though. - -@item gnus-nocem-directory -@vindex gnus-nocem-directory -This is where Gnus will store its NoCeM cache files. The default is -@file{~/News/NoCeM/}. - -@item gnus-nocem-expiry-wait -@vindex gnus-nocem-expiry-wait -The number of days before removing old NoCeM entries from the cache. -The default is 15. If you make it shorter Gnus will be faster, but you -might then see old spam. - -@item gnus-nocem-check-from -@vindex gnus-nocem-check-from -Non-@code{nil} means check for valid issuers in message bodies. -Otherwise don't bother fetching articles unless their author matches a -valid issuer; that is much faster if you are selective about the -issuers. - -@item gnus-nocem-check-article-limit -@vindex gnus-nocem-check-article-limit -If non-@code{nil}, the maximum number of articles to check in any NoCeM -group. NoCeM groups can be huge and very slow to process. - -@end table - -Using NoCeM could potentially be a memory hog. If you have many living -(i. e., subscribed or unsubscribed groups), your Emacs process will grow -big. If this is a problem, you should kill off all (or most) of your -unsubscribed groups (@pxref{Subscription Commands}). - - -@node Undo -@section Undo -@cindex undo - -It is very useful to be able to undo actions one has done. In normal -Emacs buffers, it's easy enough---you just push the @code{undo} button. -In Gnus buffers, however, it isn't that simple. - -The things Gnus displays in its buffer is of no value whatsoever to -Gnus---it's all just data designed to look nice to the user. -Killing a group in the group buffer with @kbd{C-k} makes the line -disappear, but that's just a side-effect of the real action---the -removal of the group in question from the internal Gnus structures. -Undoing something like that can't be done by the normal Emacs -@code{undo} function. - -Gnus tries to remedy this somewhat by keeping track of what the user -does and coming up with actions that would reverse the actions the user -takes. When the user then presses the @code{undo} key, Gnus will run -the code to reverse the previous action, or the previous actions. -However, not all actions are easily reversible, so Gnus currently offers -a few key functions to be undoable. These include killing groups, -yanking groups, and changing the list of read articles of groups. -That's it, really. More functions may be added in the future, but each -added function means an increase in data to be stored, so Gnus will -never be totally undoable. - -@findex gnus-undo-mode -@vindex gnus-use-undo -@findex gnus-undo -The undoability is provided by the @code{gnus-undo-mode} minor mode. It -is used if @code{gnus-use-undo} is non-@code{nil}, which is the -default. The @kbd{M-C-_} key performs the @code{gnus-undo} -command, which should feel kinda like the normal Emacs @code{undo} -command. - - -@node Moderation -@section Moderation -@cindex moderation - -If you are a moderator, you can use the @file{gnus-mdrtn.el} package. -It is not included in the standard Gnus package. Write a mail to -@samp{larsi@@gnus.org} and state what group you moderate, and you'll -get a copy. - -The moderation package is implemented as a minor mode for summary -buffers. Put - -@lisp -(add-hook 'gnus-summary-mode-hook 'gnus-moderate) -@end lisp - -in your @file{.gnus.el} file. - -If you are the moderator of @samp{rec.zoofle}, this is how it's -supposed to work: - -@enumerate -@item -You split your incoming mail by matching on -@samp{Newsgroups:.*rec.zoofle}, which will put all the to-be-posted -articles in some mail group---for instance, @samp{nnml:rec.zoofle}. - -@item -You enter that group once in a while and post articles using the @kbd{e} -(edit-and-post) or @kbd{s} (just send unedited) commands. - -@item -If, while reading the @samp{rec.zoofle} newsgroup, you happen upon some -articles that weren't approved by you, you can cancel them with the -@kbd{c} command. -@end enumerate - -To use moderation mode in these two groups, say: - -@lisp -(setq gnus-moderated-list - "^nnml:rec.zoofle$\\|^rec.zoofle$") -@end lisp - - -@node XEmacs Enhancements -@section XEmacs Enhancements -@cindex XEmacs - -XEmacs is able to display pictures and stuff, so Gnus has taken -advantage of that. - -@menu -* Picons:: How to display pictures of what your reading. -* Smileys:: Show all those happy faces the way they were meant to be shown. -* Toolbar:: Click'n'drool. -* XVarious:: Other XEmacsy Gnusey variables. -@end menu - - -@node Picons -@subsection Picons - -@iftex -@iflatex -\include{picons} -@end iflatex -@end iftex - -So@dots{} You want to slow down your news reader even more! This is a -good way to do so. Its also a great way to impress people staring -over your shoulder as you read news. - -@menu -* Picon Basics:: What are picons and How do I get them. -* Picon Requirements:: Don't go further if you aren't using XEmacs. -* Easy Picons:: Displaying Picons---the easy way. -* Hard Picons:: The way you should do it. You'll learn something. -* Picon Useless Configuration:: Other variables you can trash/tweak/munge/play with. -@end menu - - -@node Picon Basics -@subsubsection Picon Basics - -What are Picons? To quote directly from the Picons Web site: - -@iftex -@iflatex -\margindex{} -@end iflatex -@end iftex - -@quotation -@dfn{Picons} is short for ``personal icons''. They're small, -constrained images used to represent users and domains on the net, -organized into databases so that the appropriate image for a given -e-mail address can be found. Besides users and domains, there are picon -databases for Usenet newsgroups and weather forecasts. The picons are -in either monochrome @code{XBM} format or color @code{XPM} and -@code{GIF} formats. -@end quotation - -@vindex gnus-picons-piconsearch-url -If you have a permanent connection to the Internet you can use Steve -Kinzler's Picons Search engine by setting -@code{gnus-picons-piconsearch-url} to the string @* -@uref{http://www.cs.indiana.edu/picons/search.html}. - -@vindex gnus-picons-database -Otherwise you need a local copy of his database. For instructions on -obtaining and installing the picons databases, point your Web browser at @* -@uref{http://www.cs.indiana.edu/picons/ftp/index.html}. Gnus expects -picons to be installed into a location pointed to by -@code{gnus-picons-database}. - - -@node Picon Requirements -@subsubsection Picon Requirements - -To have Gnus display Picons for you, you must be running XEmacs -19.13 or greater since all other versions of Emacs aren't yet able to -display images. - -Additionally, you must have @code{x} support compiled into XEmacs. To -display color picons which are much nicer than the black & white one, -you also need one of @code{xpm} or @code{gif} compiled into XEmacs. - -@vindex gnus-picons-convert-x-face -If you want to display faces from @code{X-Face} headers, you should have -the @code{xface} support compiled into XEmacs. Otherwise you must have -the @code{netpbm} utilities installed, or munge the -@code{gnus-picons-convert-x-face} variable to use something else. - - -@node Easy Picons -@subsubsection Easy Picons - -To enable displaying picons, simply put the following line in your -@file{~/.gnus} file and start Gnus. - -@lisp -(setq gnus-use-picons t) -(setq gnus-treat-display-picons t) -@end lisp - -and make sure @code{gnus-picons-database} points to the directory -containing the Picons databases. - -Alternatively if you want to use the web piconsearch engine add this: - -@lisp -(setq gnus-picons-piconsearch-url - "http://www.cs.indiana.edu:800/piconsearch") -@end lisp - - -@node Hard Picons -@subsubsection Hard Picons - -@iftex -@iflatex -\margindex{} -@end iflatex -@end iftex - -Gnus can display picons for you as you enter and leave groups and -articles. It knows how to interact with three sections of the picons -database. Namely, it can display the picons newsgroup pictures, -author's face picture(s), and the authors domain. To enable this -feature, you need to select where to get the picons from, and where to -display them. - -@table @code - -@item gnus-picons-database -@vindex gnus-picons-database -The location of the picons database. Should point to a directory -containing the @file{news}, @file{domains}, @file{users} (and so on) -subdirectories. This is only useful if -@code{gnus-picons-piconsearch-url} is @code{nil}. Defaults to -@file{/usr/local/faces/}. - -@item gnus-picons-piconsearch-url -@vindex gnus-picons-piconsearch-url -The URL for the web picons search engine. The only currently known -engine is @uref{http://www.cs.indiana.edu:800/piconsearch}. To -workaround network delays, icons will be fetched in the background. If -this is @code{nil} 'the default), then picons are fetched from local -database indicated by @code{gnus-picons-database}. - -@item gnus-picons-display-where -@vindex gnus-picons-display-where -Where the picon images should be displayed. It is @code{picons} by -default (which by default maps to the buffer @samp{*Picons*}). Other -valid places could be @code{article}, @code{summary}, or -@samp{*scratch*} for all I care. Just make sure that you've made the -buffer visible using the standard Gnus window configuration -routines---@pxref{Window Layout}. - -@item gnus-picons-group-excluded-groups -@vindex gnus-picons-group-excluded-groups -Groups that are matched by this regexp won't have their group icons -displayed. - -@end table - -Note: If you set @code{gnus-use-picons} to @code{t}, it will set up your -window configuration for you to include the @code{picons} buffer. - -Now that you've made those decision, you need to add the following -functions to the appropriate hooks so these pictures will get displayed -at the right time. - -@vindex gnus-picons-display-where -@table @code -@item gnus-article-display-picons -@findex gnus-article-display-picons -Looks up and displays the picons for the author and the author's domain -in the @code{gnus-picons-display-where} buffer. - -@item gnus-picons-article-display-x-face -@findex gnus-article-display-picons -Decodes and displays the X-Face header if present. - -@end table - - - -@node Picon Useless Configuration -@subsubsection Picon Useless Configuration - -@iftex -@iflatex -\margindex{} -@end iflatex -@end iftex - -The following variables offer further control over how things are -done, where things are located, and other useless stuff you really -don't need to worry about. - -@table @code - -@item gnus-picons-news-directories -@vindex gnus-picons-news-directories -List of subdirectories to search in @code{gnus-picons-database} for -newsgroups faces. @code{("news")} is the default. - -@item gnus-picons-user-directories -@vindex gnus-picons-user-directories -List of subdirectories to search in @code{gnus-picons-database} for user -faces. @code{("local" "users" "usenix" "misc")} is the default. - -@item gnus-picons-domain-directories -@vindex gnus-picons-domain-directories -List of subdirectories to search in @code{gnus-picons-database} for -domain name faces. Defaults to @code{("domains")}. Some people may -want to add @samp{"unknown"} to this list. - -@item gnus-picons-convert-x-face -@vindex gnus-picons-convert-x-face -If you don't have @code{xface} support builtin XEmacs, this is the -command to use to convert the @code{X-Face} header to an X bitmap -(@code{xbm}). Defaults to @code{(format "@{ echo '/* Width=48, -Height=48 */'; uncompface; @} | icontopbm | pbmtoxbm > %s" -gnus-picons-x-face-file-name)} - -@item gnus-picons-x-face-file-name -@vindex gnus-picons-x-face-file-name -Names a temporary file to store the @code{X-Face} bitmap in. Defaults -to @code{(format "/tmp/picon-xface.%s.xbm" (user-login-name))}. - -@item gnus-picons-has-modeline-p -@vindex gnus-picons-has-modeline-p -If you have set @code{gnus-picons-display-where} to @code{picons}, your -XEmacs frame will become really cluttered. To alleviate this a bit you -can set @code{gnus-picons-has-modeline-p} to @code{nil}; this will -remove the mode line from the Picons buffer. This is only useful if -@code{gnus-picons-display-where} is @code{picons}. - -@item gnus-picons-refresh-before-display -@vindex gnus-picons-refresh-before-display -If non-nil, display the article buffer before computing the picons. -Defaults to @code{nil}. - -@item gnus-picons-display-as-address -@vindex gnus-picons-display-as-address -If @code{t} display textual email addresses along with pictures. -Defaults to @code{t}. - -@item gnus-picons-file-suffixes -@vindex gnus-picons-file-suffixes -Ordered list of suffixes on picon file names to try. Defaults to -@code{("xpm" "gif" "xbm")} minus those not builtin your XEmacs. - -@item gnus-picons-setup-hook -@vindex gnus-picons-setup-hook -Hook run in the picon buffer, if that is displayed. - -@item gnus-picons-display-article-move-p -@vindex gnus-picons-display-article-move-p -Whether to move point to first empty line when displaying picons. This -has only an effect if `gnus-picons-display-where' has value `article'. - -If @code{nil}, display the picons in the @code{From} and -@code{Newsgroups} lines. This is the default. - -@item gnus-picons-clear-cache-on-shutdown -@vindex gnus-picons-clear-cache-on-shutdown -Whether to clear the picons cache when exiting gnus. Gnus caches every -picons it finds while it is running. This saves some time in the search -process but eats some memory. If this variable is set to @code{nil}, -Gnus will never clear the cache itself; you will have to manually call -@code{gnus-picons-clear-cache} to clear it. Otherwise the cache will be -cleared every time you exit Gnus. Defaults to @code{t}. - -@iftex -@iflatex -\margindex{} -@end iflatex -@end iftex - -@end table - -@node Smileys -@subsection Smileys -@cindex smileys - -@iftex -@iflatex -\gnusfig{-3cm}{0.5cm}{\epsfig{figure=tmp/BigFace.ps,height=20cm}} -\input{smiley} -@end iflatex -@end iftex - -@dfn{Smiley} is a package separate from Gnus, but since Gnus is -currently the only package that uses Smiley, it is documented here. - -In short---to use Smiley in Gnus, put the following in your -@file{.gnus.el} file: - -@lisp -(setq gnus-treat-display-smileys t) -@end lisp - -Smiley maps text smiley faces---@samp{:-)}, @samp{:-=}, @samp{:-(} and -the like---to pictures and displays those instead of the text smiley -faces. The conversion is controlled by a list of regexps that matches -text and maps that to file names. - -@vindex smiley-nosey-regexp-alist -@vindex smiley-deformed-regexp-alist -Smiley supplies two example conversion alists by default: -@code{smiley-deformed-regexp-alist} (which matches @samp{:)}, @samp{:(} -and so on), and @code{smiley-nosey-regexp-alist} (which matches -@samp{:-)}, @samp{:-(} and so on). - -The alist used is specified by the @code{smiley-regexp-alist} variable, -which defaults to the value of @code{smiley-deformed-regexp-alist}. - -The first item in each element is the regexp to be matched; the second -element is the regexp match group that is to be replaced by the picture; -and the third element is the name of the file to be displayed. - -The following variables customize where Smiley will look for these -files, as well as the color to be used and stuff: - -@table @code - -@item smiley-data-directory -@vindex smiley-data-directory -Where Smiley will look for smiley faces files. - -@item smiley-flesh-color -@vindex smiley-flesh-color -Skin color. The default is @samp{yellow}, which is really racist. - -@item smiley-features-color -@vindex smiley-features-color -Color of the features of the face. The default is @samp{black}. - -@item smiley-tongue-color -@vindex smiley-tongue-color -Color of the tongue. The default is @samp{red}. - -@item smiley-circle-color -@vindex smiley-circle-color -Color of the circle around the face. The default is @samp{black}. - -@item smiley-mouse-face -@vindex smiley-mouse-face -Face used for mouse highlighting over the smiley face. - -@end table - - -@node Toolbar -@subsection Toolbar - -@table @code - -@iftex -@iflatex -\margindex{} -@end iflatex -@end iftex - -@item gnus-use-toolbar -@vindex gnus-use-toolbar -If @code{nil}, don't display toolbars. If non-@code{nil}, it should be -one of @code{default-toolbar}, @code{top-toolbar}, @code{bottom-toolbar}, -@code{right-toolbar}, or @code{left-toolbar}. - -@item gnus-group-toolbar -@vindex gnus-group-toolbar -The toolbar in the group buffer. - -@item gnus-summary-toolbar -@vindex gnus-summary-toolbar -The toolbar in the summary buffer. - -@item gnus-summary-mail-toolbar -@vindex gnus-summary-mail-toolbar -The toolbar in the summary buffer of mail groups. - -@end table - - -@node XVarious -@subsection Various XEmacs Variables - -@table @code -@item gnus-xmas-glyph-directory -@vindex gnus-xmas-glyph-directory -This is where Gnus will look for pictures. Gnus will normally -auto-detect this directory, but you may set it manually if you have an -unusual directory structure. - -@item gnus-xmas-logo-color-alist -@vindex gnus-xmas-logo-color-alist -This is an alist where the key is a type symbol and the values are the -foreground and background color of the splash page glyph. - -@item gnus-xmas-logo-color-style -@vindex gnus-xmas-logo-color-style -This is the key used to look up the color in the alist described above. -Valid values include @code{flame}, @code{pine}, @code{moss}, -@code{irish}, @code{sky}, @code{tin}, @code{velvet}, @code{grape}, -@code{labia}, @code{berry}, @code{neutral}, and @code{september}. - -@item gnus-xmas-modeline-glyph -@vindex gnus-xmas-modeline-glyph -A glyph displayed in all Gnus mode lines. It is a tiny gnu head by -default. - -@iftex -@iflatex -\margindex{} -@end iflatex -@end iftex - -@end table - - - - -@node Fuzzy Matching -@section Fuzzy Matching -@cindex fuzzy matching - -Gnus provides @dfn{fuzzy matching} of @code{Subject} lines when doing -things like scoring, thread gathering and thread comparison. - -As opposed to regular expression matching, fuzzy matching is very fuzzy. -It's so fuzzy that there's not even a definition of what @dfn{fuzziness} -means, and the implementation has changed over time. - -Basically, it tries to remove all noise from lines before comparing. -@samp{Re: }, parenthetical remarks, white space, and so on, are filtered -out of the strings before comparing the results. This often leads to -adequate results---even when faced with strings generated by text -manglers masquerading as newsreaders. - - -@node Thwarting Email Spam -@section Thwarting Email Spam -@cindex email spam -@cindex spam -@cindex UCE -@cindex unsolicited commercial email - -In these last days of the Usenet, commercial vultures are hanging about -and grepping through news like crazy to find email addresses they can -foist off their scams and products to. As a reaction to this, many -people have started putting nonsense addresses into their @code{From} -lines. I think this is counterproductive---it makes it difficult for -people to send you legitimate mail in response to things you write, as -well as making it difficult to see who wrote what. This rewriting may -perhaps be a bigger menace than the unsolicited commercial email itself -in the end. - -The biggest problem I have with email spam is that it comes in under -false pretenses. I press @kbd{g} and Gnus merrily informs me that I -have 10 new emails. I say ``Golly gee! Happy is me!'' and select the -mail group, only to find two pyramid schemes, seven advertisements -(``New! Miracle tonic for growing full, lustrous hair on your toes!'') -and one mail asking me to repent and find some god. - -This is annoying. - -The way to deal with this is having Gnus split out all spam into a -@samp{spam} mail group (@pxref{Splitting Mail}). - -First, pick one (1) valid mail address that you can be reached at, and -put it in your @code{From} header of all your news articles. (I've -chosen @samp{larsi@@trym.ifi.uio.no}, but for many addresses on the form -@samp{larsi+usenet@@ifi.uio.no} will be a better choice. Ask your -sysadmin whether your sendmail installation accepts keywords in the local -part of the mail address.) - -@lisp -(setq message-default-news-headers - "From: Lars Magne Ingebrigtsen \n") -@end lisp - -Then put the following split rule in @code{nnmail-split-fancy} -(@pxref{Fancy Mail Splitting}): - -@lisp -( - ... - (to "larsi@@trym.ifi.uio.no" - (| ("subject" "re:.*" "misc") - ("references" ".*@@.*" "misc") - "spam")) - ... -) -@end lisp - -This says that all mail to this address is suspect, but if it has a -@code{Subject} that starts with a @samp{Re:} or has a @code{References} -header, it's probably ok. All the rest goes to the @samp{spam} group. -(This idea probably comes from Tim Pierce.) - -In addition, many mail spammers talk directly to your @code{smtp} server -and do not include your email address explicitly in the @code{To} -header. Why they do this is unknown---perhaps it's to thwart this -thwarting scheme? In any case, this is trivial to deal with---you just -put anything not addressed to you in the @samp{spam} group by ending -your fancy split rule in this way: - -@lisp -( - ... - (to "larsi" "misc") - "spam") -@end lisp - -In my experience, this will sort virtually everything into the right -group. You still have to check the @samp{spam} group from time to time to -check for legitimate mail, though. If you feel like being a good net -citizen, you can even send off complaints to the proper authorities on -each unsolicited commercial email---at your leisure. - -If you are also a lazy net citizen, you will probably prefer complaining -automatically with the @file{gnus-junk.el} package, available FOR FREE -at @* @uref{http://stud2.tuwien.ac.at/~e9426626/gnus-junk.html}. -Since most e-mail spam is sent automatically, this may reconcile the -cosmic balance somewhat. - -This works for me. It allows people an easy way to contact me (they can -just press @kbd{r} in the usual way), and I'm not bothered at all with -spam. It's a win-win situation. Forging @code{From} headers to point -to non-existent domains is yucky, in my opinion. - - -@node Various Various -@section Various Various -@cindex mode lines -@cindex highlights - -@table @code - -@item gnus-home-directory -All Gnus path variables will be initialized from this variable, which -defaults to @file{~/}. - -@item gnus-directory -@vindex gnus-directory -Most Gnus storage path variables will be initialized from this variable, -which defaults to the @samp{SAVEDIR} environment variable, or -@file{~/News/} if that variable isn't set. - -Note that gnus is mostly loaded when the @file{.gnus.el} file is read. -This means that other directory variables that are initialized from this -variable won't be set properly if you set this variable in -@file{.gnus.el}. Set this variable in @file{.emacs} instead. - -@item gnus-default-directory -@vindex gnus-default-directory -Not related to the above variable at all---this variable says what the -default directory of all Gnus buffers should be. If you issue commands -like @kbd{C-x C-f}, the prompt you'll get starts in the current buffer's -default directory. If this variable is @code{nil} (which is the -default), the default directory will be the default directory of the -buffer you were in when you started Gnus. - -@item gnus-verbose -@vindex gnus-verbose -This variable is an integer between zero and ten. The higher the value, -the more messages will be displayed. If this variable is zero, Gnus -will never flash any messages, if it is seven (which is the default), -most important messages will be shown, and if it is ten, Gnus won't ever -shut up, but will flash so many messages it will make your head swim. - -@item gnus-verbose-backends -@vindex gnus-verbose-backends -This variable works the same way as @code{gnus-verbose}, but it applies -to the Gnus backends instead of Gnus proper. - -@item nnheader-max-head-length -@vindex nnheader-max-head-length -When the backends read straight heads of articles, they all try to read -as little as possible. This variable (default 4096) specifies -the absolute max length the backends will try to read before giving up -on finding a separator line between the head and the body. If this -variable is @code{nil}, there is no upper read bound. If it is -@code{t}, the backends won't try to read the articles piece by piece, -but read the entire articles. This makes sense with some versions of -@code{ange-ftp} or @code{efs}. - -@item nnheader-head-chop-length -@vindex nnheader-head-chop-length -This variable (default 2048) says how big a piece of each article to -read when doing the operation described above. - -@item nnheader-file-name-translation-alist -@vindex nnheader-file-name-translation-alist -@cindex file names -@cindex invalid characters in file names -@cindex characters in file names -This is an alist that says how to translate characters in file names. -For instance, if @samp{:} is invalid as a file character in file names -on your system (you OS/2 user you), you could say something like: - -@lisp -(setq nnheader-file-name-translation-alist - '((?: . ?_))) -@end lisp - -In fact, this is the default value for this variable on OS/2 and MS -Windows (phooey) systems. - -@item gnus-hidden-properties -@vindex gnus-hidden-properties -This is a list of properties to use to hide ``invisible'' text. It is -@code{(invisible t intangible t)} by default on most systems, which -makes invisible text invisible and intangible. - -@item gnus-parse-headers-hook -@vindex gnus-parse-headers-hook -A hook called before parsing headers. It can be used, for instance, to -gather statistics on the headers fetched, or perhaps you'd like to prune -some headers. I don't see why you'd want that, though. - -@item gnus-shell-command-separator -@vindex gnus-shell-command-separator -String used to separate two shell commands. The default is @samp{;}. - -@item gnus-invalid-group-regexp -@vindex gnus-invalid-group-regexp - -Regexp to match ``invalid'' group names when querying user for a group -name. The default value catches some @strong{really} invalid group -names who could possibly mess up Gnus internally (like allowing -@samp{:} in a group name, which is normally used to delimit method and -group). - -@sc{imap} users might want to allow @samp{/} in group names though. - - -@end table - - -@node The End -@chapter The End - -Well, that's the manual---you can get on with your life now. Keep in -touch. Say hello to your cats from me. - -My @strong{ghod}---I just can't stand goodbyes. Sniffle. - -Ol' Charles Reznikoff said it pretty well, so I leave the floor to him: - -@quotation -@strong{Te Deum} - -@sp 1 -Not because of victories @* -I sing,@* -having none,@* -but for the common sunshine,@* -the breeze,@* -the largess of the spring. - -@sp 1 -Not for victory@* -but for the day's work done@* -as well as I was able;@* -not for a seat upon the dais@* -but at the common table.@* -@end quotation - - -@node Appendices -@chapter Appendices - -@menu -* History:: How Gnus got where it is today. -* On Writing Manuals:: Why this is not a beginner's guide. -* Terminology:: We use really difficult, like, words here. -* Customization:: Tailoring Gnus to your needs. -* Troubleshooting:: What you might try if things do not work. -* Gnus Reference Guide:: Rilly, rilly technical stuff. -* Emacs for Heathens:: A short introduction to Emacsian terms. -* Frequently Asked Questions:: -@end menu - - -@node History -@section History - -@cindex history -@sc{gnus} was written by Masanobu @sc{Umeda}. When autumn crept up in -'94, Lars Magne Ingebrigtsen grew bored and decided to rewrite Gnus. - -If you want to investigate the person responsible for this outrage, -you can point your (feh!) web browser to -@uref{http://quimby.gnus.org/}. This is also the primary -distribution point for the new and spiffy versions of Gnus, and is -known as The Site That Destroys Newsrcs And Drives People Mad. - -During the first extended alpha period of development, the new Gnus was -called ``(ding) Gnus''. @dfn{(ding)} is, of course, short for -@dfn{ding is not Gnus}, which is a total and utter lie, but who cares? -(Besides, the ``Gnus'' in this abbreviation should probably be -pronounced ``news'' as @sc{Umeda} intended, which makes it a more -appropriate name, don't you think?) - -In any case, after spending all that energy on coming up with a new and -spunky name, we decided that the name was @emph{too} spunky, so we -renamed it back again to ``Gnus''. But in mixed case. ``Gnus'' vs. -``@sc{gnus}''. New vs. old. - -@menu -* Gnus Versions:: What Gnus versions have been released. -* Other Gnus Versions:: Other Gnus versions that also have been released. -* Why?:: What's the point of Gnus? -* Compatibility:: Just how compatible is Gnus with @sc{gnus}? -* Conformity:: Gnus tries to conform to all standards. -* Emacsen:: Gnus can be run on a few modern Emacsen. -* Gnus Development:: How Gnus is developed. -* Contributors:: Oodles of people. -* New Features:: Pointers to some of the new stuff in Gnus. -@end menu - - -@node Gnus Versions -@subsection Gnus Versions -@cindex Pterodactyl Gnus -@cindex ding Gnus -@cindex September Gnus -@cindex Quassia Gnus - -The first ``proper'' release of Gnus 5 was done in November 1995 when it -was included in the Emacs 19.30 distribution (132 (ding) Gnus releases -plus 15 Gnus 5.0 releases). - -In May 1996 the next Gnus generation (aka. ``September Gnus'' (after 99 -releases)) was released under the name ``Gnus 5.2'' (40 releases). - -On July 28th 1996 work on Red Gnus was begun, and it was released on -January 25th 1997 (after 84 releases) as ``Gnus 5.4'' (67 releases). - -On September 13th 1997, Quassia Gnus was started and lasted 37 releases. -If was released as ``Gnus 5.6'' on March 8th 1998 (46 releases). - -Gnus 5.6 begat Pterodactyl Gnus on August 29th 1998 and was released as -``Gnus 5.8'' (after 99 releases and a CVS repository) on December 3rd -1999. - -On the 26th of October 2000, Oort Gnus was begun. - -If you happen upon a version of Gnus that has a prefixed name -- -``(ding) Gnus'', ``September Gnus'', ``Red Gnus'', ``Quassia Gnus'', -``Pterodactyl Gnus'', ``Oort Gnus'' -- don't panic. Don't let it know -that you're frightened. Back away. Slowly. Whatever you do, don't -run. Walk away, calmly, until you're out of its reach. Find a proper -released version of Gnus and snuggle up to that instead. - - -@node Other Gnus Versions -@subsection Other Gnus Versions -@cindex Semi-gnus - -In addition to the versions of Gnus which have had their releases -coordinated by Lars, one major development has been Semi-gnus from -Japan. It's based on a library called @sc{semi}, which provides -@sc{mime} capabilities. - -These Gnusae are based mainly on Gnus 5.6 and Pterodactyl Gnus. -Collectively, they are called ``Semi-gnus'', and different strains are -called T-gnus, ET-gnus, Nana-gnus and Chaos. These provide powerful -@sc{mime} and multilingualization things, especially important for -Japanese users. - - -@node Why? -@subsection Why? - -What's the point of Gnus? - -I want to provide a ``rad'', ``happening'', ``way cool'' and ``hep'' -newsreader, that lets you do anything you can think of. That was my -original motivation, but while working on Gnus, it has become clear to -me that this generation of newsreaders really belong in the stone age. -Newsreaders haven't developed much since the infancy of the net. If the -volume continues to rise with the current rate of increase, all current -newsreaders will be pretty much useless. How do you deal with -newsgroups that have thousands of new articles each day? How do you -keep track of millions of people who post? - -Gnus offers no real solutions to these questions, but I would very much -like to see Gnus being used as a testing ground for new methods of -reading and fetching news. Expanding on @sc{Umeda}-san's wise decision -to separate the newsreader from the backends, Gnus now offers a simple -interface for anybody who wants to write new backends for fetching mail -and news from different sources. I have added hooks for customizations -everywhere I could imagine it being useful. By doing so, I'm inviting -every one of you to explore and invent. - -May Gnus never be complete. @kbd{C-u 100 M-x all-hail-emacs} and -@kbd{C-u 100 M-x all-hail-xemacs}. - - -@node Compatibility -@subsection Compatibility - -@cindex compatibility -Gnus was designed to be fully compatible with @sc{gnus}. Almost all key -bindings have been kept. More key bindings have been added, of course, -but only in one or two obscure cases have old bindings been changed. - -Our motto is: -@quotation -@cartouche -@center In a cloud bones of steel. -@end cartouche -@end quotation - -All commands have kept their names. Some internal functions have changed -their names. - -The @code{gnus-uu} package has changed drastically. @xref{Decoding -Articles}. - -One major compatibility question is the presence of several summary -buffers. All variables relevant while reading a group are -buffer-local to the summary buffer they belong in. Although many -important variables have their values copied into their global -counterparts whenever a command is executed in the summary buffer, this -change might lead to incorrect values being used unless you are careful. - -All code that relies on knowledge of @sc{gnus} internals will probably -fail. To take two examples: Sorting @code{gnus-newsrc-alist} (or -changing it in any way, as a matter of fact) is strictly verboten. Gnus -maintains a hash table that points to the entries in this alist (which -speeds up many functions), and changing the alist directly will lead to -peculiar results. - -@cindex hilit19 -@cindex highlighting -Old hilit19 code does not work at all. In fact, you should probably -remove all hilit code from all Gnus hooks -(@code{gnus-group-prepare-hook} and @code{gnus-summary-prepare-hook}). -Gnus provides various integrated functions for highlighting. These are -faster and more accurate. To make life easier for everybody, Gnus will -by default remove all hilit calls from all hilit hooks. Uncleanliness! -Away! - -Packages like @code{expire-kill} will no longer work. As a matter of -fact, you should probably remove all old @sc{gnus} packages (and other -code) when you start using Gnus. More likely than not, Gnus already -does what you have written code to make @sc{gnus} do. (Snicker.) - -Even though old methods of doing things are still supported, only the -new methods are documented in this manual. If you detect a new method of -doing something while reading this manual, that does not mean you have -to stop doing it the old way. - -Gnus understands all @sc{gnus} startup files. - -@kindex M-x gnus-bug -@findex gnus-bug -@cindex reporting bugs -@cindex bugs -Overall, a casual user who hasn't written much code that depends on -@sc{gnus} internals should suffer no problems. If problems occur, -please let me know by issuing that magic command @kbd{M-x gnus-bug}. - -@vindex gnus-bug-create-help-buffer -If you are in the habit of sending bug reports @emph{very} often, you -may find the helpful help buffer annoying after a while. If so, set -@code{gnus-bug-create-help-buffer} to @code{nil} to avoid having it pop -up at you. - - -@node Conformity -@subsection Conformity - -No rebels without a clue here, ma'am. We conform to all standards known -to (wo)man. Except for those standards and/or conventions we disagree -with, of course. - -@table @strong - -@item RFC 822 -@cindex RFC 822 -There are no known breaches of this standard. - -@item RFC 1036 -@cindex RFC 1036 -There are no known breaches of this standard, either. - -@item Son-of-RFC 1036 -@cindex Son-of-RFC 1036 -We do have some breaches to this one. - -@table @emph - -@item X-Newsreader -@itemx User-Agent -These are considered to be ``vanity headers'', while I consider them -to be consumer information. After seeing so many badly formatted -articles coming from @code{tin} and @code{Netscape} I know not to use -either of those for posting articles. I would not have known that if -it wasn't for the @code{X-Newsreader} header. -@end table - -@item USEFOR -@cindex USEFOR -USEFOR is an IETF working group writing a successor to RFC 1036, based -on Son-of-RFC 1036. They have produced a number of drafts proposing -various changes to the format of news articles. The Gnus towers will -look into implementing the changes when the draft is accepted as an RFC. - -@end table - -If you ever notice Gnus acting non-compliant with regards to the texts -mentioned above, don't hesitate to drop a note to Gnus Towers and let us -know. - - -@node Emacsen -@subsection Emacsen -@cindex Emacsen -@cindex XEmacs -@cindex Mule -@cindex Emacs - -Gnus should work on : - -@itemize @bullet - -@item -Emacs 20.3 and up. - -@item -XEmacs 21.1.1 and up. - -@end itemize - -This Gnus version will absolutely not work on any Emacsen older than -that. Not reliably, at least. Older versions of Gnus may work on older -Emacs versions. However, T-gnus does support ``Mule 2.3 based on Emacs -19.34'' and possibly the versions of XEmacs prior to 21.1.1, e.g. 20.4. -See the file ``README'' in the T-gnus distribution for more details. - -There are some vague differences between Gnus on the various -platforms---XEmacs features more graphics (a logo and a toolbar)---but -other than that, things should look pretty much the same under all -Emacsen. - - -@node Gnus Development -@subsection Gnus Development - -Gnus is developed in a two-phased cycle. The first phase involves much -discussion on the @samp{ding@@gnus.org} mailing list, where people -propose changes and new features, post patches and new backends. This -phase is called the @dfn{alpha} phase, since the Gnusae released in this -phase are @dfn{alpha releases}, or (perhaps more commonly in other -circles) @dfn{snapshots}. During this phase, Gnus is assumed to be -unstable and should not be used by casual users. Gnus alpha releases -have names like ``Red Gnus'' and ``Quassia Gnus''. - -After futzing around for 50-100 alpha releases, Gnus is declared -@dfn{frozen}, and only bug fixes are applied. Gnus loses the prefix, -and is called things like ``Gnus 5.6.32'' instead. Normal people are -supposed to be able to use these, and these are mostly discussed on the -@samp{gnu.emacs.gnus} newsgroup. - -@cindex Incoming* -@vindex mail-source-delete-incoming -Some variable defaults differ between alpha Gnusae and released Gnusae. -In particular, @code{mail-source-delete-incoming} defaults to @code{nil} in -alpha Gnusae and @code{t} in released Gnusae. This is to prevent -lossage of mail if an alpha release hiccups while handling the mail. - -The division of discussion between the ding mailing list and the Gnus -newsgroup is not purely based on publicity concerns. It's true that -having people write about the horrible things that an alpha Gnus release -can do (sometimes) in a public forum may scare people off, but more -importantly, talking about new experimental features that have been -introduced may confuse casual users. New features are frequently -introduced, fiddled with, and judged to be found wanting, and then -either discarded or totally rewritten. People reading the mailing list -usually keep up with these rapid changes, while people on the newsgroup -can't be assumed to do so. - - - -@node Contributors -@subsection Contributors -@cindex contributors - -The new Gnus version couldn't have been done without the help of all the -people on the (ding) mailing list. Every day for over a year I have -gotten billions of nice bug reports from them, filling me with joy, -every single one of them. Smooches. The people on the list have been -tried beyond endurance, what with my ``oh, that's a neat idea , yup, I'll release it right away no wait, that doesn't -work at all , yup, I'll ship that one off right away no, wait, that absolutely does not work'' policy for releases. -Micro$oft---bah. Amateurs. I'm @emph{much} worse. (Or is that -``worser''? ``much worser''? ``worsest''?) - -I would like to take this opportunity to thank the Academy for... oops, -wrong show. - -@itemize @bullet - -@item -Masanobu @sc{Umeda}---the writer of the original @sc{gnus}. - -@item -Shenghuo Zhu---uudecode.el, mm-uu.el, rfc1843.el, webmail.el, -nnwarchive and many, many other things connected with @sc{mime} and -other types of en/decoding, as well as general bug fixing, new -functionality and stuff. - -@item -Per Abrahamsen---custom, scoring, highlighting and @sc{soup} code (as -well as numerous other things). - -@item -Luis Fernandes---design and graphics. - -@item -Joe Reiss---creator of the smiley faces. - -@item -Justin Sheehy--the FAQ maintainer. - -@item -Erik Naggum---help, ideas, support, code and stuff. - -@item -Wes Hardaker---@file{gnus-picon.el} and the manual section on -@dfn{picons} (@pxref{Picons}). - -@item -Kim-Minh Kaplan---further work on the picon code. - -@item -Brad Miller---@file{gnus-gl.el} and the GroupLens manual section -(@pxref{GroupLens}). - -@item -Sudish Joseph---innumerable bug fixes. - -@item -Ilja Weis---@file{gnus-topic.el}. - -@item -Steven L. Baur---lots and lots and lots of bugs detections and fixes. - -@item -Vladimir Alexiev---the refcard and reference booklets. - -@item -Felix Lee & Jamie Zawinski---I stole some pieces from the XGnus -distribution by Felix Lee and JWZ. - -@item -Scott Byer---@file{nnfolder.el} enhancements & rewrite. - -@item -Peter Mutsaers---orphan article scoring code. - -@item -Ken Raeburn---POP mail support. - -@item -Hallvard B Furuseth---various bits and pieces, especially dealing with -.newsrc files. - -@item -Brian Edmonds---@file{gnus-bbdb.el}. - -@item -David Moore---rewrite of @file{nnvirtual.el} and many other things. - -@item -Kevin Davidson---came up with the name @dfn{ding}, so blame him. - -@item -François Pinard---many, many interesting and thorough bug reports, as -well as autoconf support. - -@end itemize - -This manual was proof-read by Adrian Aichner, with Ricardo Nassif, Mark -Borges, and Jost Krieger proof-reading parts of the manual. - -The following people have contributed many patches and suggestions: - -Christopher Davis, -Andrew Eskilsson, -Kai Grossjohann, -David Kågedal, -Richard Pieri, -Fabrice Popineau, -Daniel Quinlan, -Jason L. Tibbitts, III, -and -Jack Vinson. - -Also thanks to the following for patches and stuff: - -Jari Aalto, -Adrian Aichner, -Vladimir Alexiev, -Russ Allbery, -Peter Arius, -Matt Armstrong, -Marc Auslander, -Miles Bader, -Alexei V. Barantsev, -Frank Bennett, -Robert Bihlmeyer, -Chris Bone, -Mark Borges, -Mark Boyns, -Lance A. Brown, -Rob Browning, -Kees de Bruin, -Martin Buchholz, -Joe Buehler, -Kevin Buhr, -Alastair Burt, -Joao Cachopo, -Zlatko Calusic, -Massimo Campostrini, -Castor, -David Charlap, -Dan Christensen, -Kevin Christian, -Jae-you Chung, @c ? -James H. Cloos, Jr., -Laura Conrad, -Michael R. Cook, -Glenn Coombs, -Andrew J. Cosgriff, -Neil Crellin, -Frank D. Cringle, -Geoffrey T. Dairiki, -Andre Deparade, -Ulrik Dickow, -Dave Disser, -Rui-Tao Dong, @c ? -Joev Dubach, -Michael Welsh Duggan, -Dave Edmondson, -Paul Eggert, -Mark W. Eichin, -Karl Eichwalder, -Enami Tsugutomo, @c Enami -Michael Ernst, -Luc Van Eycken, -Sam Falkner, -Nelson Jose dos Santos Ferreira, -Sigbjorn Finne, -Sven Fischer, -Paul Fisher, -Decklin Foster, -Gary D. Foster, -Paul Franklin, -Guy Geens, -Arne Georg Gleditsch, -David S. Goldberg, -Michelangelo Grigni, -Dale Hagglund, -D. Hall, -Magnus Hammerin, -Kenichi Handa, @c Handa -Raja R. Harinath, -Yoshiki Hayashi, @c ? -P. E. Jareth Hein, -Hisashige Kenji, @c Hisashige -Scott Hofmann, -Marc Horowitz, -Gunnar Horrigmo, -Richard Hoskins, -Brad Howes, -Miguel de Icaza, -François Felix Ingrand, -Tatsuya Ichikawa, @c ? -Ishikawa Ichiro, @c Ishikawa -Lee Iverson, -Iwamuro Motonori, @c Iwamuro -Rajappa Iyer, -Andreas Jaeger, -Adam P. Jenkins, -Randell Jesup, -Fred Johansen, -Gareth Jones, -Simon Josefsson, -Greg Klanderman, -Karl Kleinpaste, -Michael Klingbeil, -Peter Skov Knudsen, -Shuhei Kobayashi, @c Kobayashi -Petr Konecny, -Koseki Yoshinori, @c Koseki -Thor Kristoffersen, -Jens Lautenbacher, -Martin Larose, -Seokchan Lee, @c Lee -Joerg Lenneis, -Carsten Leonhardt, -James LewisMoss, -Christian Limpach, -Markus Linnala, -Dave Love, -Mike McEwan, -Tonny Madsen, -Shlomo Mahlab, -Nat Makarevitch, -Istvan Marko, -David Martin, -Jason R. Mastaler, -Gordon Matzigkeit, -Timo Metzemakers, -Richard Mlynarik, -Lantz Moore, -Morioka Tomohiko, @c Morioka -Erik Toubro Nielsen, -Hrvoje Niksic, -Andy Norman, -Fred Oberhauser, -C. R. Oldham, -Alexandre Oliva, -Ken Olstad, -Masaharu Onishi, @c Onishi -Hideki Ono, @c Ono -Ettore Perazzoli, -William Perry, -Stephen Peters, -Jens-Ulrik Holger Petersen, -Ulrich Pfeifer, -Matt Pharr, -Andy Piper, -John McClary Prevost, -Bill Pringlemeir, -Mike Pullen, -Jim Radford, -Colin Rafferty, -Lasse Rasinen, -Lars Balker Rasmussen, -Joe Reiss, -Renaud Rioboo, -Roland B. Roberts, -Bart Robinson, -Christian von Roques, -Markus Rost, -Jason Rumney, -Wolfgang Rupprecht, -Jay Sachs, -Dewey M. Sasser, -Conrad Sauerwald, -Loren Schall, -Dan Schmidt, -Ralph Schleicher, -Philippe Schnoebelen, -Andreas Schwab, -Randal L. Schwartz, -Danny Siu, -Matt Simmons, -Paul D. Smith, -Jeff Sparkes, -Toby Speight, -Michael Sperber, -Darren Stalder, -Richard Stallman, -Greg Stark, -Sam Steingold, -Paul Stevenson, -Jonas Steverud, -Paul Stodghill, -Kiyokazu Suto, @c Suto -Kurt Swanson, -Samuel Tardieu, -Teddy, -Chuck Thompson, -Tozawa Akihiko, @c Tozawa -Philippe Troin, -James Troup, -Trung Tran-Duc, -Jack Twilley, -Aaron M. Ucko, -Aki Vehtari, -Didier Verna, -Vladimir Volovich, -Jan Vroonhof, -Stefan Waldherr, -Pete Ware, -Barry A. Warsaw, -Christoph Wedler, -Joe Wells, -Lee Willis, -Katsumi Yamaoka @c Yamaoka -and -Lloyd Zusman. - - -For a full overview of what each person has done, the ChangeLogs -included in the Gnus alpha distributions should give ample reading -(550kB and counting). - -Apologies to everybody that I've forgotten, of which there are many, I'm -sure. - -Gee, that's quite a list of people. I guess that must mean that there -actually are people who are using Gnus. Who'd'a thunk it! - - -@node New Features -@subsection New Features -@cindex new features - -@menu -* ding Gnus:: New things in Gnus 5.0/5.1, the first new Gnus. -* September Gnus:: The Thing Formally Known As Gnus 5.2/5.3. -* Red Gnus:: Third time best---Gnus 5.4/5.5. -* Quassia Gnus:: Two times two is four, or Gnus 5.6/5.7. -* Pterodactyl Gnus:: Pentad also starts with P, AKA Gnus 5.8/5.9. -@end menu - -These lists are, of course, just @emph{short} overviews of the -@emph{most} important new features. No, really. There are tons more. -Yes, we have feeping creaturism in full effect. - -@node ding Gnus -@subsubsection (ding) Gnus - -New features in Gnus 5.0/5.1: - -@itemize @bullet - -@item -The look of all buffers can be changed by setting format-like variables -(@pxref{Group Buffer Format} and @pxref{Summary Buffer Format}). - -@item -Local spool and several @sc{nntp} servers can be used at once -(@pxref{Select Methods}). - -@item -You can combine groups into virtual groups (@pxref{Virtual Groups}). - -@item -You can read a number of different mail formats (@pxref{Getting Mail}). -All the mail backends implement a convenient mail expiry scheme -(@pxref{Expiring Mail}). - -@item -Gnus can use various strategies for gathering threads that have lost -their roots (thereby gathering loose sub-threads into one thread) or it -can go back and retrieve enough headers to build a complete thread -(@pxref{Customizing Threading}). - -@item -Killed groups can be displayed in the group buffer, and you can read -them as well (@pxref{Listing Groups}). - -@item -Gnus can do partial group updates---you do not have to retrieve the -entire active file just to check for new articles in a few groups -(@pxref{The Active File}). - -@item -Gnus implements a sliding scale of subscribedness to groups -(@pxref{Group Levels}). - -@item -You can score articles according to any number of criteria -(@pxref{Scoring}). You can even get Gnus to find out how to score -articles for you (@pxref{Adaptive Scoring}). - -@item -Gnus maintains a dribble buffer that is auto-saved the normal Emacs -manner, so it should be difficult to lose much data on what you have -read if your machine should go down (@pxref{Auto Save}). - -@item -Gnus now has its own startup file (@file{.gnus}) to avoid cluttering up -the @file{.emacs} file. - -@item -You can set the process mark on both groups and articles and perform -operations on all the marked items (@pxref{Process/Prefix}). - -@item -You can grep through a subset of groups and create a group from the -results (@pxref{Kibozed Groups}). - -@item -You can list subsets of groups according to, well, anything -(@pxref{Listing Groups}). - -@item -You can browse foreign servers and subscribe to groups from those -servers (@pxref{Browse Foreign Server}). - -@item -Gnus can fetch articles, asynchronously, on a second connection to the -server (@pxref{Asynchronous Fetching}). - -@item -You can cache articles locally (@pxref{Article Caching}). - -@item -The uudecode functions have been expanded and generalized -(@pxref{Decoding Articles}). - -@item -You can still post uuencoded articles, which was a little-known feature -of @sc{gnus}' past (@pxref{Uuencoding and Posting}). - -@item -Fetching parents (and other articles) now actually works without -glitches (@pxref{Finding the Parent}). - -@item -Gnus can fetch FAQs and group descriptions (@pxref{Group Information}). - -@item -Digests (and other files) can be used as the basis for groups -(@pxref{Document Groups}). - -@item -Articles can be highlighted and customized (@pxref{Customizing -Articles}). - -@item -URLs and other external references can be buttonized (@pxref{Article -Buttons}). - -@item -You can do lots of strange stuff with the Gnus window & frame -configuration (@pxref{Window Layout}). - -@item -You can click on buttons instead of using the keyboard -(@pxref{Buttons}). - -@end itemize - - -@node September Gnus -@subsubsection September Gnus - -@iftex -@iflatex -\gnusfig{-28cm}{0cm}{\epsfig{figure=tmp/september.ps,height=20cm}} -@end iflatex -@end iftex - -New features in Gnus 5.2/5.3: - -@itemize @bullet - -@item -A new message composition mode is used. All old customization variables -for @code{mail-mode}, @code{rnews-reply-mode} and @code{gnus-msg} are -now obsolete. - -@item -Gnus is now able to generate @dfn{sparse} threads---threads where -missing articles are represented by empty nodes (@pxref{Customizing -Threading}). - -@lisp -(setq gnus-build-sparse-threads 'some) -@end lisp - -@item -Outgoing articles are stored on a special archive server -(@pxref{Archived Messages}). - -@item -Partial thread regeneration now happens when articles are -referred. - -@item -Gnus can make use of GroupLens predictions (@pxref{GroupLens}). - -@item -Picons (personal icons) can be displayed under XEmacs (@pxref{Picons}). - -@item -A @code{trn}-like tree buffer can be displayed (@pxref{Tree Display}). - -@lisp -(setq gnus-use-trees t) -@end lisp - -@item -An @code{nn}-like pick-and-read minor mode is available for the summary -buffers (@pxref{Pick and Read}). - -@lisp -(add-hook 'gnus-summary-mode-hook 'gnus-pick-mode) -@end lisp - -@item -In binary groups you can use a special binary minor mode (@pxref{Binary -Groups}). - -@item -Groups can be grouped in a folding topic hierarchy (@pxref{Group -Topics}). - -@lisp -(add-hook 'gnus-group-mode-hook 'gnus-topic-mode) -@end lisp - -@item -Gnus can re-send and bounce mail (@pxref{Summary Mail Commands}). - -@item -Groups can now have a score, and bubbling based on entry frequency -is possible (@pxref{Group Score}). - -@lisp -(add-hook 'gnus-summary-exit-hook 'gnus-summary-bubble-group) -@end lisp - -@item -Groups can be process-marked, and commands can be performed on -groups of groups (@pxref{Marking Groups}). - -@item -Caching is possible in virtual groups. - -@item -@code{nndoc} now understands all kinds of digests, mail boxes, rnews -news batches, ClariNet briefs collections, and just about everything -else (@pxref{Document Groups}). - -@item -Gnus has a new backend (@code{nnsoup}) to create/read SOUP packets -(@pxref{SOUP}). - -@item -The Gnus cache is much faster. - -@item -Groups can be sorted according to many criteria (@pxref{Sorting -Groups}). - -@item -New group parameters have been introduced to set list-addresses and -expiry times (@pxref{Group Parameters}). - -@item -All formatting specs allow specifying faces to be used -(@pxref{Formatting Fonts}). - -@item -There are several more commands for setting/removing/acting on process -marked articles on the @kbd{M P} submap (@pxref{Setting Process Marks}). - -@item -The summary buffer can be limited to show parts of the available -articles based on a wide range of criteria. These commands have been -bound to keys on the @kbd{/} submap (@pxref{Limiting}). - -@item -Articles can be made persistent with the @kbd{*} command -(@pxref{Persistent Articles}). - -@item -All functions for hiding article elements are now toggles. - -@item -Article headers can be buttonized (@pxref{Article Washing}). - -@item -All mail backends support fetching articles by @code{Message-ID}. - -@item -Duplicate mail can now be treated properly (@pxref{Duplicates}). - -@item -All summary mode commands are available directly from the article -buffer (@pxref{Article Keymap}). - -@item -Frames can be part of @code{gnus-buffer-configuration} (@pxref{Window -Layout}). - -@item -Mail can be re-scanned by a daemonic process (@pxref{Daemons}). -@iftex -@iflatex -\marginpar[\mbox{}\hfill\epsfig{figure=tmp/fseptember.ps,height=5cm}]{\epsfig{figure=tmp/fseptember.ps,height=5cm}} -@end iflatex -@end iftex - -@item -Gnus can make use of NoCeM files to weed out spam (@pxref{NoCeM}). - -@lisp -(setq gnus-use-nocem t) -@end lisp - -@item -Groups can be made permanently visible (@pxref{Listing Groups}). - -@lisp -(setq gnus-permanently-visible-groups "^nnml:") -@end lisp - -@item -Many new hooks have been introduced to make customizing easier. - -@item -Gnus respects the @code{Mail-Copies-To} header. - -@item -Threads can be gathered by looking at the @code{References} header -(@pxref{Customizing Threading}). - -@lisp -(setq gnus-summary-thread-gathering-function - 'gnus-gather-threads-by-references) -@end lisp - -@item -Read articles can be stored in a special backlog buffer to avoid -refetching (@pxref{Article Backlog}). - -@lisp -(setq gnus-keep-backlog 50) -@end lisp - -@item -A clean copy of the current article is always stored in a separate -buffer to allow easier treatment. - -@item -Gnus can suggest where to save articles (@pxref{Saving Articles}). - -@item -Gnus doesn't have to do as much prompting when saving (@pxref{Saving -Articles}). - -@lisp -(setq gnus-prompt-before-saving t) -@end lisp - -@item -@code{gnus-uu} can view decoded files asynchronously while fetching -articles (@pxref{Other Decode Variables}). - -@lisp -(setq gnus-uu-grabbed-file-functions 'gnus-uu-grab-view) -@end lisp - -@item -Filling in the article buffer now works properly on cited text -(@pxref{Article Washing}). - -@item -Hiding cited text adds buttons to toggle hiding, and how much -cited text to hide is now customizable (@pxref{Article Hiding}). - -@lisp -(setq gnus-cited-lines-visible 2) -@end lisp - -@item -Boring headers can be hidden (@pxref{Article Hiding}). - -@item -Default scoring values can now be set from the menu bar. - -@item -Further syntax checking of outgoing articles have been added. - -@end itemize - - -@node Red Gnus -@subsubsection Red Gnus - -New features in Gnus 5.4/5.5: - -@iftex -@iflatex -\gnusfig{-5.5cm}{-4cm}{\epsfig{figure=tmp/red.ps,height=20cm}} -@end iflatex -@end iftex - -@itemize @bullet - -@item -@file{nntp.el} has been totally rewritten in an asynchronous fashion. - -@item -Article prefetching functionality has been moved up into -Gnus (@pxref{Asynchronous Fetching}). - -@item -Scoring can now be performed with logical operators like @code{and}, -@code{or}, @code{not}, and parent redirection (@pxref{Advanced -Scoring}). - -@item -Article washing status can be displayed in the -article mode line (@pxref{Misc Article}). - -@item -@file{gnus.el} has been split into many smaller files. - -@item -Suppression of duplicate articles based on Message-ID can be done -(@pxref{Duplicate Suppression}). - -@lisp -(setq gnus-suppress-duplicates t) -@end lisp - -@item -New variables for specifying what score and adapt files are to be -considered home score and adapt files (@pxref{Home Score File}) have -been added. - -@item -@code{nndoc} was rewritten to be easily extendable (@pxref{Document -Server Internals}). - -@item -Groups can inherit group parameters from parent topics (@pxref{Topic -Parameters}). - -@item -Article editing has been revamped and is now actually usable. - -@item -Signatures can be recognized in more intelligent fashions -(@pxref{Article Signature}). - -@item -Summary pick mode has been made to look more @code{nn}-like. Line -numbers are displayed and the @kbd{.} command can be used to pick -articles (@code{Pick and Read}). - -@item -Commands for moving the @file{.newsrc.eld} from one server to -another have been added (@pxref{Changing Servers}). - -@item -There's a way now to specify that ``uninteresting'' fields be suppressed -when generating lines in buffers (@pxref{Advanced Formatting}). - -@item -Several commands in the group buffer can be undone with @kbd{M-C-_} -(@pxref{Undo}). - -@item -Scoring can be done on words using the new score type @code{w} -(@pxref{Score File Format}). - -@item -Adaptive scoring can be done on a Subject word-by-word basis -(@pxref{Adaptive Scoring}). - -@lisp -(setq gnus-use-adaptive-scoring '(word)) -@end lisp - -@item -Scores can be decayed (@pxref{Score Decays}). - -@lisp -(setq gnus-decay-scores t) -@end lisp - -@item -Scoring can be performed using a regexp on the Date header. The Date is -normalized to compact ISO 8601 format first (@pxref{Score File Format}). - -@item -A new command has been added to remove all data on articles from -the native server (@pxref{Changing Servers}). - -@item -A new command for reading collections of documents -(@code{nndoc} with @code{nnvirtual} on top) has been added---@kbd{M-C-d} -(@pxref{Really Various Summary Commands}). - -@item -Process mark sets can be pushed and popped (@pxref{Setting Process -Marks}). - -@item -A new mail-to-news backend makes it possible to post even when the @sc{nntp} -server doesn't allow posting (@pxref{Mail-To-News Gateways}). - -@item -A new backend for reading searches from Web search engines -(@dfn{DejaNews}, @dfn{Alta Vista}, @dfn{InReference}) has been added -(@pxref{Web Searches}). - -@item -Groups inside topics can now be sorted using the standard sorting -functions, and each topic can be sorted independently (@pxref{Topic -Sorting}). - -@item -Subsets of the groups can be sorted independently (@code{Sorting -Groups}). - -@item -Cached articles can be pulled into the groups (@pxref{Summary Generation -Commands}). -@iftex -@iflatex -\marginpar[\mbox{}\hfill\epsfig{figure=tmp/fred.ps,width=3cm}]{\epsfig{figure=tmp/fred.ps,width=3cm}} -@end iflatex -@end iftex - -@item -Score files are now applied in a more reliable order (@pxref{Score -Variables}). - -@item -Reports on where mail messages end up can be generated (@pxref{Splitting -Mail}). - -@item -More hooks and functions have been added to remove junk from incoming -mail before saving the mail (@pxref{Washing Mail}). - -@item -Emphasized text can be properly fontisized: - -@end itemize - - -@node Quassia Gnus -@subsubsection Quassia Gnus - -New features in Gnus 5.6: - -@itemize @bullet - -@item -New functionality for using Gnus as an offline newsreader has been -added. A plethora of new commands and modes have been added. See -@pxref{Gnus Unplugged} for the full story. - -@item - The @code{nndraft} backend has returned, but works differently than -before. All Message buffers are now also articles in the @code{nndraft} -group, which is created automatically. - -@item -@code{gnus-alter-header-function} can now be used to alter header -values. - -@item - @code{gnus-summary-goto-article} now accept Message-ID's. - -@item - A new Message command for deleting text in the body of a message -outside the region: @kbd{C-c C-v}. - -@item - You can now post to component group in @code{nnvirtual} groups with -@kbd{C-u C-c C-c}. - -@item - @code{nntp-rlogin-program}---new variable to ease customization. - -@item - @code{C-u C-c C-c} in @code{gnus-article-edit-mode} will now inhibit -re-highlighting of the article buffer. - -@item - New element in @code{gnus-boring-article-headers}---@code{long-to}. - -@item - @kbd{M-i} symbolic prefix command. See the section "Symbolic -Prefixes" in the Gnus manual for details. - -@item - @kbd{L} and @kbd{I} in the summary buffer now take the symbolic prefix -@kbd{a} to add the score rule to the "all.SCORE" file. - -@item - @code{gnus-simplify-subject-functions} variable to allow greater -control over simplification. - -@item - @kbd{A T}---new command for fetching the current thread. - -@item - @kbd{/ T}---new command for including the current thread in the -limit. - -@item - @kbd{M-RET} is a new Message command for breaking cited text. - -@item - @samp{\\1}-expressions are now valid in @code{nnmail-split-methods}. - -@item - The @code{custom-face-lookup} function has been removed. -If you used this function in your initialization files, you must -rewrite them to use @code{face-spec-set} instead. - -@item - Canceling now uses the current select method. Symbolic prefix -@kbd{a} forces normal posting method. - -@item - New command to translate M******** sm*rtq**t*s into proper -text---@kbd{W d}. - -@item - For easier debugging of @code{nntp}, you can set -@code{nntp-record-commands} to a non-@code{nil} value. - -@item - @code{nntp} now uses @file{~/.authinfo}, a @file{.netrc}-like file, for -controlling where and how to send @sc{authinfo} to @sc{nntp} servers. - -@item - A command for editing group parameters from the summary buffer -has been added. - -@item - A history of where mails have been split is available. - -@item - A new article date command has been added---@code{article-date-iso8601}. - -@item - Subjects can be simplified when threading by setting -@code{gnus-score-thread-simplify}. - -@item - A new function for citing in Message has been -added---@code{message-cite-original-without-signature}. - -@item - @code{article-strip-all-blank-lines}---new article command. - -@item - A new Message command to kill to the end of the article has -been added. - -@item - A minimum adaptive score can be specified by using the -@code{gnus-adaptive-word-minimum} variable. - -@item - The "lapsed date" article header can be kept continually -updated by the @code{gnus-start-date-timer} command. - -@item - Web listserv archives can be read with the @code{nnlistserv} backend. - -@item - Old dejanews archives can now be read by @code{nnweb}. - -@end itemize - -@node Pterodactyl Gnus -@subsubsection Pterodactyl Gnus - -New features in Gnus 5.8: - -@itemize @bullet - -@item The mail-fetching functions have changed. See the manual for the -many details. In particular, all procmail fetching variables are gone. - -If you used procmail like in - -@lisp -(setq nnmail-use-procmail t) -(setq nnmail-spool-file 'procmail) -(setq nnmail-procmail-directory "~/mail/incoming/") -(setq nnmail-procmail-suffix "\\.in") -@end lisp - -this now has changed to - -@lisp -(setq mail-sources - '((directory :path "~/mail/incoming/" - :suffix ".in"))) -@end lisp - -More information is available in the info doc at Select Methods -> -Getting Mail -> Mail Sources - -@item Gnus is now a MIME-capable reader. This affects many parts of -Gnus, and adds a slew of new commands. See the manual for details. - -@item Gnus has also been multilingualized. This also affects too -many parts of Gnus to summarize here, and adds many new variables. - -@item @code{gnus-auto-select-first} can now be a function to be -called to position point. - -@item The user can now decide which extra headers should be included in -summary buffers and NOV files. - -@item @code{gnus-article-display-hook} has been removed. Instead, a number -of variables starting with @code{gnus-treat-} have been added. - -@item The Gnus posting styles have been redone again and now works in a -subtly different manner. - -@item New web-based backends have been added: @code{nnslashdot}, -@code{nnwarchive} and @code{nnultimate}. nnweb has been revamped, -again, to keep up with ever-changing layouts. - -@item Gnus can now read IMAP mail via @code{nnimap}. - -@end itemize - -@iftex - -@page -@node History -@section The Manual -@cindex colophon -@cindex manual - -This manual was generated from a TeXinfo file and then run through -either @code{texi2dvi} -@iflatex -or my own home-brewed TeXinfo to \LaTeX\ transformer, -and then run through @code{latex} and @code{dvips} -@end iflatex -to get what you hold in your hands now. - -The following conventions have been used: - -@enumerate - -@item -This is a @samp{string} - -@item -This is a @kbd{keystroke} - -@item -This is a @file{file} - -@item -This is a @code{symbol} - -@end enumerate - -So if I were to say ``set @code{flargnoze} to @samp{yes}'', that would -mean: - -@lisp -(setq flargnoze "yes") -@end lisp - -If I say ``set @code{flumphel} to @code{yes}'', that would mean: - -@lisp -(setq flumphel 'yes) -@end lisp - -@samp{yes} and @code{yes} are two @emph{very} different things---don't -ever get them confused. - -@iflatex -@c @head -Of course, everything in this manual is of vital interest, so you should -read it all. Several times. However, if you feel like skimming the -manual, look for that gnu head you should see in the margin over -there---it means that what's being discussed is of more importance than -the rest of the stuff. (On the other hand, if everything is infinitely -important, how can anything be more important than that? Just one more -of the mysteries of this world, I guess.) -@end iflatex - -@end iftex - - -@node On Writing Manuals -@section On Writing Manuals - -I guess most manuals are written after-the-fact; documenting a program -that's already there. This is not how this manual is written. When -implementing something, I write the manual entry for that something -straight away. I then see that it's difficult to explain the -functionality, so I write how it's supposed to be, and then I change the -implementation. Writing the documentation and writing the code goes -hand in hand. - -This, of course, means that this manual has no, or little, flow. It -documents absolutely everything in Gnus, but often not where you're -looking for it. It is a reference manual, and not a guide to how to get -started with Gnus. - -That would be a totally different book, that should be written using the -reference manual as source material. It would look quite differently. - - -@page -@node Terminology -@section Terminology - -@cindex terminology -@table @dfn - -@item news -@cindex news -This is what you are supposed to use this thing for---reading news. -News is generally fetched from a nearby @sc{nntp} server, and is -generally publicly available to everybody. If you post news, the entire -world is likely to read just what you have written, and they'll all -snigger mischievously. Behind your back. - -@item mail -@cindex mail -Everything that's delivered to you personally is mail. Some news/mail -readers (like Gnus) blur the distinction between mail and news, but -there is a difference. Mail is private. News is public. Mailing is -not posting, and replying is not following up. - -@item reply -@cindex reply -Send a mail to the person who has written what you are reading. - -@item follow up -@cindex follow up -Post an article to the current newsgroup responding to the article you -are reading. - -@item backend -@cindex backend -Gnus gets fed articles from a number of backends, both news and mail -backends. Gnus does not handle the underlying media, so to speak---this -is all done by the backends. - -@item native -@cindex native -Gnus will always use one method (and backend) as the @dfn{native}, or -default, way of getting news. - -@item foreign -@cindex foreign -You can also have any number of foreign groups active at the same time. -These are groups that use non-native non-secondary backends for getting -news. - -@item secondary -@cindex secondary -Secondary backends are somewhere half-way between being native and being -foreign, but they mostly act like they are native. - -@item article -@cindex article -A message that has been posted as news. - -@item mail message -@cindex mail message -A message that has been mailed. - -@item message -@cindex message -A mail message or news article - -@item head -@cindex head -The top part of a message, where administrative information (etc.) is -put. - -@item body -@cindex body -The rest of an article. Everything not in the head is in the -body. - -@item header -@cindex header -A line from the head of an article. - -@item headers -@cindex headers -A collection of such lines, or a collection of heads. Or even a -collection of @sc{nov} lines. - -@item @sc{nov} -@cindex nov -When Gnus enters a group, it asks the backend for the headers of all -unread articles in the group. Most servers support the News OverView -format, which is more compact and much faster to read and parse than the -normal @sc{head} format. - -@item level -@cindex levels -Each group is subscribed at some @dfn{level} or other (1-9). The ones -that have a lower level are ``more'' subscribed than the groups with a -higher level. In fact, groups on levels 1-5 are considered -@dfn{subscribed}; 6-7 are @dfn{unsubscribed}; 8 are @dfn{zombies}; and 9 -are @dfn{killed}. Commands for listing groups and scanning for new -articles will all use the numeric prefix as @dfn{working level}. - -@item killed groups -@cindex killed groups -No information on killed groups is stored or updated, which makes killed -groups much easier to handle than subscribed groups. - -@item zombie groups -@cindex zombie groups -Just like killed groups, only slightly less dead. - -@item active file -@cindex active file -The news server has to keep track of what articles it carries, and what -groups exist. All this information in stored in the active file, which -is rather large, as you might surmise. - -@item bogus groups -@cindex bogus groups -A group that exists in the @file{.newsrc} file, but isn't known to the -server (i.e., it isn't in the active file), is a @emph{bogus group}. -This means that the group probably doesn't exist (any more). - -@item activating -@cindex activating groups -The act of asking the server for info on a group and computing the -number of unread articles is called @dfn{activating the group}. -Un-activated groups are listed with @samp{*} in the group buffer. - -@item server -@cindex server -A machine one can connect to and get news (or mail) from. - -@item select method -@cindex select method -A structure that specifies the backend, the server and the virtual -server settings. - -@item virtual server -@cindex virtual server -A named select method. Since a select method defines all there is to -know about connecting to a (physical) server, taking the thing as a -whole is a virtual server. - -@item washing -@cindex washing -Taking a buffer and running it through a filter of some sort. The -result will (more often than not) be cleaner and more pleasing than the -original. - -@item ephemeral groups -@cindex ephemeral groups -Most groups store data on what articles you have read. @dfn{Ephemeral} -groups are groups that will have no data stored---when you exit the -group, it'll disappear into the aether. - -@item solid groups -@cindex solid groups -This is the opposite of ephemeral groups. All groups listed in the -group buffer are solid groups. - -@item sparse articles -@cindex sparse articles -These are article placeholders shown in the summary buffer when -@code{gnus-build-sparse-threads} has been switched on. - -@item threading -@cindex threading -To put responses to articles directly after the articles they respond -to---in a hierarchical fashion. - -@item root -@cindex root -@cindex thread root -The first article in a thread is the root. It is the ancestor of all -articles in the thread. - -@item parent -@cindex parent -An article that has responses. - -@item child -@cindex child -An article that responds to a different article---its parent. - -@item digest -@cindex digest -A collection of messages in one file. The most common digest format is -specified by RFC 1153. - -@end table - - -@page -@node Customization -@section Customization -@cindex general customization - -All variables are properly documented elsewhere in this manual. This -section is designed to give general pointers on how to customize Gnus -for some quite common situations. - -@menu -* Slow/Expensive Connection:: You run a local Emacs and get the news elsewhere. -* Slow Terminal Connection:: You run a remote Emacs. -* Little Disk Space:: You feel that having large setup files is icky. -* Slow Machine:: You feel like buying a faster machine. -@end menu - - -@node Slow/Expensive Connection -@subsection Slow/Expensive @sc{nntp} Connection - -If you run Emacs on a machine locally, and get your news from a machine -over some very thin strings, you want to cut down on the amount of data -Gnus has to get from the @sc{nntp} server. - -@table @code - -@item gnus-read-active-file -Set this to @code{nil}, which will inhibit Gnus from requesting the -entire active file from the server. This file is often v. large. You -also have to set @code{gnus-check-new-newsgroups} and -@code{gnus-check-bogus-newsgroups} to @code{nil} to make sure that Gnus -doesn't suddenly decide to fetch the active file anyway. - -@item gnus-nov-is-evil -This one has to be @code{nil}. If not, grabbing article headers from -the @sc{nntp} server will not be very fast. Not all @sc{nntp} servers -support @sc{xover}; Gnus will detect this by itself. -@end table - - -@node Slow Terminal Connection -@subsection Slow Terminal Connection - -Let's say you use your home computer for dialing up the system that runs -Emacs and Gnus. If your modem is slow, you want to reduce (as much as -possible) the amount of data sent over the wires. - -@table @code - -@item gnus-auto-center-summary -Set this to @code{nil} to inhibit Gnus from re-centering the summary -buffer all the time. If it is @code{vertical}, do only vertical -re-centering. If it is neither @code{nil} nor @code{vertical}, do both -horizontal and vertical recentering. - -@item gnus-visible-headers -Cut down on the headers included in the articles to the -minimum. You can, in fact, make do without them altogether---most of the -useful data is in the summary buffer, anyway. Set this variable to -@samp{^NEVVVVER} or @samp{From:}, or whatever you feel you need. - -Set this hook to all the available hiding commands: -@lisp -(setq gnus-treat-hide-headers 'head - gnus-treat-hide-signature t - gnus-treat-hide-citation t) -@end lisp - -@item gnus-use-full-window -By setting this to @code{nil}, you can make all the windows smaller. -While this doesn't really cut down much generally, it means that you -have to see smaller portions of articles before deciding that you didn't -want to read them anyway. - -@item gnus-thread-hide-subtree -If this is non-@code{nil}, all threads in the summary buffer will be -hidden initially. - -@item gnus-updated-mode-lines -If this is @code{nil}, Gnus will not put information in the buffer mode -lines, which might save some time. -@end table - - -@node Little Disk Space -@subsection Little Disk Space -@cindex disk space - -The startup files can get rather large, so you may want to cut their -sizes a bit if you are running out of space. - -@table @code - -@item gnus-save-newsrc-file -If this is @code{nil}, Gnus will never save @file{.newsrc}---it will -only save @file{.newsrc.eld}. This means that you will not be able to -use any other newsreaders than Gnus. This variable is @code{t} by -default. - -@item gnus-read-newsrc-file -If this is @code{nil}, Gnus will never read @file{.newsrc}---it will -only read @file{.newsrc.eld}. This means that you will not be able to -use any other newsreaders than Gnus. This variable is @code{t} by -default. - -@item gnus-save-killed-list -If this is @code{nil}, Gnus will not save the list of dead groups. You -should also set @code{gnus-check-new-newsgroups} to @code{ask-server} -and @code{gnus-check-bogus-newsgroups} to @code{nil} if you set this -variable to @code{nil}. This variable is @code{t} by default. - -@end table - - -@node Slow Machine -@subsection Slow Machine -@cindex slow machine - -If you have a slow machine, or are just really impatient, there are a -few things you can do to make Gnus run faster. - -Set @code{gnus-check-new-newsgroups} and -@code{gnus-check-bogus-newsgroups} to @code{nil} to make startup faster. - -Set @code{gnus-show-threads}, @code{gnus-use-cross-reference} and -@code{gnus-nov-is-evil} to @code{nil} to make entering and exiting the -summary buffer faster. - - -@page -@node Troubleshooting -@section Troubleshooting -@cindex troubleshooting - -Gnus works @emph{so} well straight out of the box---I can't imagine any -problems, really. - -Ahem. - -@enumerate - -@item -Make sure your computer is switched on. - -@item -Make sure that you really load the current Gnus version. If you have -been running @sc{gnus}, you need to exit Emacs and start it up again before -Gnus will work. - -@item -Try doing an @kbd{M-x gnus-version}. If you get something that looks -like @samp{T-gnus 6.15.* (based on Oort Gnus v0.*; for SEMI 1.1*, FLIM -1.1*)} you have the right files loaded. If, on the other hand, you get -something like @samp{NNTP 3.x} or @samp{nntp flee}, you have some old -@file{.el} files lying around. Delete these. - -@item -Read the help group (@kbd{G h} in the group buffer) for a FAQ and a -how-to. - -@item -@vindex max-lisp-eval-depth -Gnus works on many recursive structures, and in some extreme (and very -rare) cases Gnus may recurse down ``too deeply'' and Emacs will beep at -you. If this happens to you, set @code{max-lisp-eval-depth} to 500 or -something like that. -@end enumerate - -If all else fails, report the problem as a bug. - -@cindex bugs -@cindex reporting bugs - -@kindex M-x gnus-bug -@findex gnus-bug -If you find a bug in Gnus, you can report it with the @kbd{M-x gnus-bug} -command. @kbd{M-x set-variable RET debug-on-error RET t RET}, and send -me the backtrace. I will fix bugs, but I can only fix them if you send -me a precise description as to how to reproduce the bug. - -You really can never be too detailed in a bug report. Always use the -@kbd{M-x gnus-bug} command when you make bug reports, even if it creates -a 10Kb mail each time you use it, and even if you have sent me your -environment 500 times before. I don't care. I want the full info each -time. - -It is also important to remember that I have no memory whatsoever. If -you send a bug report, and I send you a reply, and then you just send -back ``No, it's not! Moron!'', I will have no idea what you are -insulting me about. Always over-explain everything. It's much easier -for all of us---if I don't have all the information I need, I will just -mail you and ask for more info, and everything takes more time. - -If the problem you're seeing is very visual, and you can't quite explain -it, copy the Emacs window to a file (with @code{xwd}, for instance), put -it somewhere it can be reached, and include the URL of the picture in -the bug report. - -@cindex patches -If you would like to contribute a patch to fix bugs or make -improvements, please produce the patch using @samp{diff -u}. - -If you just need help, you are better off asking on -@samp{gnu.emacs.gnus}. I'm not very helpful. - -@cindex gnu.emacs.gnus -@cindex ding mailing list -You can also ask on the ding mailing list---@samp{ding@@gnus.org}. -Write to @samp{ding-request@@gnus.org} to subscribe. - - -@page -@node Gnus Reference Guide -@section Gnus Reference Guide - -It is my hope that other people will figure out smart stuff that Gnus -can do, and that other people will write those smart things as well. To -facilitate that I thought it would be a good idea to describe the inner -workings of Gnus. And some of the not-so-inner workings, while I'm at -it. - -You can never expect the internals of a program not to change, but I -will be defining (in some details) the interface between Gnus and its -backends (this is written in stone), the format of the score files -(ditto), data structures (some are less likely to change than others) -and general methods of operation. - -@menu -* Gnus Utility Functions:: Common functions and variable to use. -* Backend Interface:: How Gnus communicates with the servers. -* Score File Syntax:: A BNF definition of the score file standard. -* Headers:: How Gnus stores headers internally. -* Ranges:: A handy format for storing mucho numbers. -* Group Info:: The group info format. -* Extended Interactive:: Symbolic prefixes and stuff. -* Emacs/XEmacs Code:: Gnus can be run under all modern Emacsen. -* Various File Formats:: Formats of files that Gnus use. -@end menu - - -@node Gnus Utility Functions -@subsection Gnus Utility Functions -@cindex Gnus utility functions -@cindex utility functions -@cindex functions -@cindex internal variables - -When writing small functions to be run from hooks (and stuff), it's -vital to have access to the Gnus internal functions and variables. -Below is a list of the most common ones. - -@table @code - -@item gnus-newsgroup-name -@vindex gnus-newsgroup-name -This variable holds the name of the current newsgroup. - -@item gnus-find-method-for-group -@findex gnus-find-method-for-group -A function that returns the select method for @var{group}. - -@item gnus-group-real-name -@findex gnus-group-real-name -Takes a full (prefixed) Gnus group name, and returns the unprefixed -name. - -@item gnus-group-prefixed-name -@findex gnus-group-prefixed-name -Takes an unprefixed group name and a select method, and returns the full -(prefixed) Gnus group name. - -@item gnus-get-info -@findex gnus-get-info -Returns the group info list for @var{group}. - -@item gnus-group-unread -@findex gnus-group-unread -The number of unread articles in @var{group}, or @code{t} if that is -unknown. - -@item gnus-active -@findex gnus-active -The active entry for @var{group}. - -@item gnus-set-active -@findex gnus-set-active -Set the active entry for @var{group}. - -@item gnus-add-current-to-buffer-list -@findex gnus-add-current-to-buffer-list -Adds the current buffer to the list of buffers to be killed on Gnus -exit. - -@item gnus-continuum-version -@findex gnus-continuum-version -Takes a Gnus version string as a parameter and returns a floating point -number. Earlier versions will always get a lower number than later -versions. - -@item gnus-group-read-only-p -@findex gnus-group-read-only-p -Says whether @var{group} is read-only or not. - -@item gnus-news-group-p -@findex gnus-news-group-p -Says whether @var{group} came from a news backend. - -@item gnus-ephemeral-group-p -@findex gnus-ephemeral-group-p -Says whether @var{group} is ephemeral or not. - -@item gnus-server-to-method -@findex gnus-server-to-method -Returns the select method corresponding to @var{server}. - -@item gnus-server-equal -@findex gnus-server-equal -Says whether two virtual servers are equal. - -@item gnus-group-native-p -@findex gnus-group-native-p -Says whether @var{group} is native or not. - -@item gnus-group-secondary-p -@findex gnus-group-secondary-p -Says whether @var{group} is secondary or not. - -@item gnus-group-foreign-p -@findex gnus-group-foreign-p -Says whether @var{group} is foreign or not. - -@item group-group-find-parameter -@findex group-group-find-parameter -Returns the parameter list of @var{group}. If given a second parameter, -returns the value of that parameter for @var{group}. - -@item gnus-group-set-parameter -@findex gnus-group-set-parameter -Takes three parameters; @var{group}, @var{parameter} and @var{value}. - -@item gnus-narrow-to-body -@findex gnus-narrow-to-body -Narrows the current buffer to the body of the article. - -@item gnus-check-backend-function -@findex gnus-check-backend-function -Takes two parameters, @var{function} and @var{group}. If the backend -@var{group} comes from supports @var{function}, return non-@code{nil}. - -@lisp -(gnus-check-backend-function "request-scan" "nnml:misc") -@result{} t -@end lisp - -@item gnus-read-method -@findex gnus-read-method -Prompts the user for a select method. - -@end table - - -@node Backend Interface -@subsection Backend Interface - -Gnus doesn't know anything about @sc{nntp}, spools, mail or virtual -groups. It only knows how to talk to @dfn{virtual servers}. A virtual -server is a @dfn{backend} and some @dfn{backend variables}. As examples -of the first, we have @code{nntp}, @code{nnspool} and @code{nnmbox}. As -examples of the latter we have @code{nntp-port-number} and -@code{nnmbox-directory}. - -When Gnus asks for information from a backend---say @code{nntp}---on -something, it will normally include a virtual server name in the -function parameters. (If not, the backend should use the ``current'' -virtual server.) For instance, @code{nntp-request-list} takes a virtual -server as its only (optional) parameter. If this virtual server hasn't -been opened, the function should fail. - -Note that a virtual server name has no relation to some physical server -name. Take this example: - -@lisp -(nntp "odd-one" - (nntp-address "ifi.uio.no") - (nntp-port-number 4324)) -@end lisp - -Here the virtual server name is @samp{odd-one} while the name of -the physical server is @samp{ifi.uio.no}. - -The backends should be able to switch between several virtual servers. -The standard backends implement this by keeping an alist of virtual -server environments that they pull down/push up when needed. - -There are two groups of interface functions: @dfn{required functions}, -which must be present, and @dfn{optional functions}, which Gnus will -always check for presence before attempting to call 'em. - -All these functions are expected to return data in the buffer -@code{nntp-server-buffer} (@samp{ *nntpd*}), which is somewhat -unfortunately named, but we'll have to live with it. When I talk about -@dfn{resulting data}, I always refer to the data in that buffer. When I -talk about @dfn{return value}, I talk about the function value returned by -the function call. Functions that fail should return @code{nil} as the -return value. - -Some backends could be said to be @dfn{server-forming} backends, and -some might be said not to be. The latter are backends that generally -only operate on one group at a time, and have no concept of ``server'' --- they have a group, and they deliver info on that group and nothing -more. - -Gnus identifies each message by way of group name and article number. A -few remarks about these article numbers might be useful. First of all, -the numbers are positive integers. Secondly, it is normally not -possible for later articles to `re-use' older article numbers without -confusing Gnus. That is, if a group has ever contained a message -numbered 42, then no other message may get that number, or Gnus will get -mightily confused.@footnote{See the function -@code{nnchoke-request-update-info}, @ref{Optional Backend Functions}.} -Third, article numbers must be assigned in order of arrival in the -group; this is not necessarily the same as the date of the message. - -The previous paragraph already mentions all the `hard' restrictions that -article numbers must fulfill. But it seems that it might be useful to -assign @emph{consecutive} article numbers, for Gnus gets quite confused -if there are holes in the article numbering sequence. However, due to -the `no-reuse' restriction, holes cannot be avoided altogether. It's -also useful for the article numbers to start at 1 to avoid running out -of numbers as long as possible. - -In the examples and definitions I will refer to the imaginary backend -@code{nnchoke}. - -@cindex @code{nnchoke} - -@menu -* Required Backend Functions:: Functions that must be implemented. -* Optional Backend Functions:: Functions that need not be implemented. -* Error Messaging:: How to get messages and report errors. -* Writing New Backends:: Extending old backends. -* Hooking New Backends Into Gnus:: What has to be done on the Gnus end. -* Mail-like Backends:: Some tips on mail backends. -@end menu - - -@node Required Backend Functions -@subsubsection Required Backend Functions - -@table @code - -@item (nnchoke-retrieve-headers ARTICLES &optional GROUP SERVER FETCH-OLD) - -@var{articles} is either a range of article numbers or a list of -@code{Message-ID}s. Current backends do not fully support either---only -sequences (lists) of article numbers, and most backends do not support -retrieval of @code{Message-ID}s. But they should try for both. - -The result data should either be HEADs or NOV lines, and the result -value should either be @code{headers} or @code{nov} to reflect this. -This might later be expanded to @code{various}, which will be a mixture -of HEADs and NOV lines, but this is currently not supported by Gnus. - -If @var{fetch-old} is non-@code{nil} it says to try fetching "extra -headers", in some meaning of the word. This is generally done by -fetching (at most) @var{fetch-old} extra headers less than the smallest -article number in @code{articles}, and filling the gaps as well. The -presence of this parameter can be ignored if the backend finds it -cumbersome to follow the request. If this is non-@code{nil} and not a -number, do maximum fetches. - -Here's an example HEAD: - -@example -221 1056 Article retrieved. -Path: ifi.uio.no!sturles -From: sturles@@ifi.uio.no (Sturle Sunde) -Newsgroups: ifi.discussion -Subject: Re: Something very droll -Date: 27 Oct 1994 14:02:57 +0100 -Organization: Dept. of Informatics, University of Oslo, Norway -Lines: 26 -Message-ID: <38o8e1$a0o@@holmenkollen.ifi.uio.no> -References: <38jdmq$4qu@@visbur.ifi.uio.no> -NNTP-Posting-Host: holmenkollen.ifi.uio.no -. -@end example - -So a @code{headers} return value would imply that there's a number of -these in the data buffer. - -Here's a BNF definition of such a buffer: - -@example -headers = *head -head = error / valid-head -error-message = [ "4" / "5" ] 2number " " eol -valid-head = valid-message *header "." eol -valid-message = "221 " " Article retrieved." eol -header = eol -@end example - -If the return value is @code{nov}, the data buffer should contain -@dfn{network overview database} lines. These are basically fields -separated by tabs. - -@example -nov-buffer = *nov-line -nov-line = 8*9 [ field ] eol -field = -@end example - -For a closer look at what should be in those fields, -@pxref{Headers}. - - -@item (nnchoke-open-server SERVER &optional DEFINITIONS) - -@var{server} is here the virtual server name. @var{definitions} is a -list of @code{(VARIABLE VALUE)} pairs that define this virtual server. - -If the server can't be opened, no error should be signaled. The backend -may then choose to refuse further attempts at connecting to this -server. In fact, it should do so. - -If the server is opened already, this function should return a -non-@code{nil} value. There should be no data returned. - - -@item (nnchoke-close-server &optional SERVER) - -Close connection to @var{server} and free all resources connected -to it. Return @code{nil} if the server couldn't be closed for some -reason. - -There should be no data returned. - - -@item (nnchoke-request-close) - -Close connection to all servers and free all resources that the backend -have reserved. All buffers that have been created by that backend -should be killed. (Not the @code{nntp-server-buffer}, though.) This -function is generally only called when Gnus is shutting down. - -There should be no data returned. - - -@item (nnchoke-server-opened &optional SERVER) - -If @var{server} is the current virtual server, and the connection to the -physical server is alive, then this function should return a -non-@code{nil} vlue. This function should under no circumstances -attempt to reconnect to a server we have lost connection to. - -There should be no data returned. - - -@item (nnchoke-status-message &optional SERVER) - -This function should return the last error message from @var{server}. - -There should be no data returned. - - -@item (nnchoke-request-article ARTICLE &optional GROUP SERVER TO-BUFFER) - -The result data from this function should be the article specified by -@var{article}. This might either be a @code{Message-ID} or a number. -It is optional whether to implement retrieval by @code{Message-ID}, but -it would be nice if that were possible. - -If @var{to-buffer} is non-@code{nil}, the result data should be returned -in this buffer instead of the normal data buffer. This is to make it -possible to avoid copying large amounts of data from one buffer to -another, while Gnus mainly requests articles to be inserted directly -into its article buffer. - -If it is at all possible, this function should return a cons cell where -the @code{car} is the group name the article was fetched from, and the @code{cdr} is -the article number. This will enable Gnus to find out what the real -group and article numbers are when fetching articles by -@code{Message-ID}. If this isn't possible, @code{t} should be returned -on successful article retrieval. - - -@item (nnchoke-request-group GROUP &optional SERVER FAST) - -Get data on @var{group}. This function also has the side effect of -making @var{group} the current group. - -If @var{fast}, don't bother to return useful data, just make @var{group} -the current group. - -Here's an example of some result data and a definition of the same: - -@example -211 56 1000 1059 ifi.discussion -@end example - -The first number is the status, which should be 211. Next is the -total number of articles in the group, the lowest article number, the -highest article number, and finally the group name. Note that the total -number of articles may be less than one might think while just -considering the highest and lowest article numbers, but some articles -may have been canceled. Gnus just discards the total-number, so -whether one should take the bother to generate it properly (if that is a -problem) is left as an exercise to the reader. - -@example -group-status = [ error / info ] eol -error = [ "4" / "5" ] 2 " " -info = "211 " 3* [ " " ] -@end example - - -@item (nnchoke-close-group GROUP &optional SERVER) - -Close @var{group} and free any resources connected to it. This will be -a no-op on most backends. - -There should be no data returned. - - -@item (nnchoke-request-list &optional SERVER) - -Return a list of all groups available on @var{server}. And that means -@emph{all}. - -Here's an example from a server that only carries two groups: - -@example -ifi.test 0000002200 0000002000 y -ifi.discussion 3324 3300 n -@end example - -On each line we have a group name, then the highest article number in -that group, the lowest article number, and finally a flag. - -@example -active-file = *active-line -active-line = name " " " " " " flags eol -name = -flags = "n" / "y" / "m" / "x" / "j" / "=" name -@end example - -The flag says whether the group is read-only (@samp{n}), is moderated -(@samp{m}), is dead (@samp{x}), is aliased to some other group -(@samp{=other-group}) or none of the above (@samp{y}). - - -@item (nnchoke-request-post &optional SERVER) - -This function should post the current buffer. It might return whether -the posting was successful or not, but that's not required. If, for -instance, the posting is done asynchronously, it has generally not been -completed by the time this function concludes. In that case, this -function should set up some kind of sentinel to beep the user loud and -clear if the posting could not be completed. - -There should be no result data from this function. - -@end table - - -@node Optional Backend Functions -@subsubsection Optional Backend Functions - -@table @code - -@item (nnchoke-retrieve-groups GROUPS &optional SERVER) - -@var{groups} is a list of groups, and this function should request data -on all those groups. How it does it is of no concern to Gnus, but it -should attempt to do this in a speedy fashion. - -The return value of this function can be either @code{active} or -@code{group}, which says what the format of the result data is. The -former is in the same format as the data from -@code{nnchoke-request-list}, while the latter is a buffer full of lines -in the same format as @code{nnchoke-request-group} gives. - -@example -group-buffer = *active-line / *group-status -@end example - - -@item (nnchoke-request-update-info GROUP INFO &optional SERVER) - -A Gnus group info (@pxref{Group Info}) is handed to the backend for -alterations. This comes in handy if the backend really carries all the -information (as is the case with virtual and imap groups). This -function should destructively alter the info to suit its needs, and -should return the (altered) group info. - -There should be no result data from this function. - - -@item (nnchoke-request-type GROUP &optional ARTICLE) - -When the user issues commands for ``sending news'' (@kbd{F} in the -summary buffer, for instance), Gnus has to know whether the article the -user is following up on is news or mail. This function should return -@code{news} if @var{article} in @var{group} is news, @code{mail} if it -is mail and @code{unknown} if the type can't be decided. (The -@var{article} parameter is necessary in @code{nnvirtual} groups which -might very well combine mail groups and news groups.) Both @var{group} -and @var{article} may be @code{nil}. - -There should be no result data from this function. - - -@item (nnchoke-request-set-mark GROUP ACTION &optional SERVER) - -Set/remove/add marks on articles. Normally Gnus handles the article -marks (such as read, ticked, expired etc) internally, and store them in -@code{~/.newsrc.eld}. Some backends (such as @sc{imap}) however carry -all information about the articles on the server, so Gnus need to -propagate the mark information to the server. - -ACTION is a list of mark setting requests, having this format: - -@example -(RANGE ACTION MARK) -@end example - -RANGE is a range of articles you wish to update marks on. ACTION is -@code{add} or @code{del}, used to add marks or remove marks -(preserving all marks not mentioned). MARK is a list of marks; where -each mark is a symbol. Currently used marks are @code{read}, -@code{tick}, @code{reply}, @code{expire}, @code{killed}, -@code{dormant}, @code{save}, @code{download}, @code{unsend}, -@code{forward} and @code{recent}, but your backend should, if -possible, not limit itself to these. - -Given contradictory actions, the last action in the list should be the -effective one. That is, if your action contains a request to add the -@code{tick} mark on article 1 and, later in the list, a request to -remove the mark on the same article, the mark should in fact be removed. - -An example action list: - -@example -(((5 12 30) 'del '(tick)) - ((10 . 90) 'add '(read expire)) - ((92 94) 'del '(read))) -@end example - -The function should return a range of articles it wasn't able to set the -mark on (currently not used for anything). - -There should be no result data from this function. - -@item (nnchoke-request-update-mark GROUP ARTICLE MARK) - -If the user tries to set a mark that the backend doesn't like, this -function may change the mark. Gnus will use whatever this function -returns as the mark for @var{article} instead of the original -@var{mark}. If the backend doesn't care, it must return the original -@var{mark}, and not @code{nil} or any other type of garbage. - -The only use for this I can see is what @code{nnvirtual} does with -it---if a component group is auto-expirable, marking an article as read -in the virtual group should result in the article being marked as -expirable. - -There should be no result data from this function. - - -@item (nnchoke-request-scan &optional GROUP SERVER) - -This function may be called at any time (by Gnus or anything else) to -request that the backend check for incoming articles, in one way or -another. A mail backend will typically read the spool file or query the -POP server when this function is invoked. The @var{group} doesn't have -to be heeded---if the backend decides that it is too much work just -scanning for a single group, it may do a total scan of all groups. It -would be nice, however, to keep things local if that's practical. - -There should be no result data from this function. - - -@item (nnchoke-request-group-description GROUP &optional SERVER) - -The result data from this function should be a description of -@var{group}. - -@example -description-line = name description eol -name = -description = -@end example - -@item (nnchoke-request-list-newsgroups &optional SERVER) - -The result data from this function should be the description of all -groups available on the server. - -@example -description-buffer = *description-line -@end example - - -@item (nnchoke-request-newgroups DATE &optional SERVER) - -The result data from this function should be all groups that were -created after @samp{date}, which is in normal human-readable date -format. The data should be in the active buffer format. - - -@item (nnchoke-request-create-group GROUP &optional SERVER) - -This function should create an empty group with name @var{group}. - -There should be no return data. - - -@item (nnchoke-request-expire-articles ARTICLES &optional GROUP SERVER FORCE) - -This function should run the expiry process on all articles in the -@var{articles} range (which is currently a simple list of article -numbers.) It is left up to the backend to decide how old articles -should be before they are removed by this function. If @var{force} is -non-@code{nil}, all @var{articles} should be deleted, no matter how new -they are. - -This function should return a list of articles that it did not/was not -able to delete. - -There should be no result data returned. - - -@item (nnchoke-request-move-article ARTICLE GROUP SERVER ACCEPT-FORM -&optional LAST) - -This function should move @var{article} (which is a number) from -@var{group} by calling @var{accept-form}. - -This function should ready the article in question for moving by -removing any header lines it has added to the article, and generally -should ``tidy up'' the article. Then it should @code{eval} -@var{accept-form} in the buffer where the ``tidy'' article is. This -will do the actual copying. If this @code{eval} returns a -non-@code{nil} value, the article should be removed. - -If @var{last} is @code{nil}, that means that there is a high likelihood -that there will be more requests issued shortly, so that allows some -optimizations. - -The function should return a cons where the @code{car} is the group name and -the @code{cdr} is the article number that the article was entered as. - -There should be no data returned. - - -@item (nnchoke-request-accept-article GROUP &optional SERVER LAST) - -This function takes the current buffer and inserts it into @var{group}. -If @var{last} in @code{nil}, that means that there will be more calls to -this function in short order. - -The function should return a cons where the @code{car} is the group name and -the @code{cdr} is the article number that the article was entered as. - -There should be no data returned. - - -@item (nnchoke-request-replace-article ARTICLE GROUP BUFFER) - -This function should remove @var{article} (which is a number) from -@var{group} and insert @var{buffer} there instead. - -There should be no data returned. - - -@item (nnchoke-request-delete-group GROUP FORCE &optional SERVER) - -This function should delete @var{group}. If @var{force}, it should -really delete all the articles in the group, and then delete the group -itself. (If there is such a thing as ``the group itself''.) - -There should be no data returned. - - -@item (nnchoke-request-rename-group GROUP NEW-NAME &optional SERVER) - -This function should rename @var{group} into @var{new-name}. All -articles in @var{group} should move to @var{new-name}. - -There should be no data returned. - -@end table - - -@node Error Messaging -@subsubsection Error Messaging - -@findex nnheader-report -@findex nnheader-get-report -The backends should use the function @code{nnheader-report} to report -error conditions---they should not raise errors when they aren't able to -perform a request. The first argument to this function is the backend -symbol, and the rest are interpreted as arguments to @code{format} if -there are multiple of them, or just a string if there is one of them. -This function must always returns @code{nil}. - -@lisp -(nnheader-report 'nnchoke "You did something totally bogus") - -(nnheader-report 'nnchoke "Could not request group %s" group) -@end lisp - -Gnus, in turn, will call @code{nnheader-get-report} when it gets a -@code{nil} back from a server, and this function returns the most -recently reported message for the backend in question. This function -takes one argument---the server symbol. - -Internally, these functions access @var{backend}@code{-status-string}, -so the @code{nnchoke} backend will have its error message stored in -@code{nnchoke-status-string}. - - -@node Writing New Backends -@subsubsection Writing New Backends - -Many backends are quite similar. @code{nnml} is just like -@code{nnspool}, but it allows you to edit the articles on the server. -@code{nnmh} is just like @code{nnml}, but it doesn't use an active file, -and it doesn't maintain overview databases. @code{nndir} is just like -@code{nnml}, but it has no concept of ``groups'', and it doesn't allow -editing articles. - -It would make sense if it were possible to ``inherit'' functions from -backends when writing new backends. And, indeed, you can do that if you -want to. (You don't have to if you don't want to, of course.) - -All the backends declare their public variables and functions by using a -package called @code{nnoo}. - -To inherit functions from other backends (and allow other backends to -inherit functions from the current backend), you should use the -following macros: - -@table @code - -@item nnoo-declare -This macro declares the first parameter to be a child of the subsequent -parameters. For instance: - -@lisp -(nnoo-declare nndir - nnml nnmh) -@end lisp - -@code{nndir} has declared here that it intends to inherit functions from -both @code{nnml} and @code{nnmh}. - -@item defvoo -This macro is equivalent to @code{defvar}, but registers the variable as -a public server variable. Most state-oriented variables should be -declared with @code{defvoo} instead of @code{defvar}. - -In addition to the normal @code{defvar} parameters, it takes a list of -variables in the parent backends to map the variable to when executing -a function in those backends. - -@lisp -(defvoo nndir-directory nil - "Where nndir will look for groups." - nnml-current-directory nnmh-current-directory) -@end lisp - -This means that @code{nnml-current-directory} will be set to -@code{nndir-directory} when an @code{nnml} function is called on behalf -of @code{nndir}. (The same with @code{nnmh}.) - -@item nnoo-define-basics -This macro defines some common functions that almost all backends should -have. - -@example -(nnoo-define-basics nndir) -@end example - -@item deffoo -This macro is just like @code{defun} and takes the same parameters. In -addition to doing the normal @code{defun} things, it registers the -function as being public so that other backends can inherit it. - -@item nnoo-map-functions -This macro allows mapping of functions from the current backend to -functions from the parent backends. - -@example -(nnoo-map-functions nndir - (nnml-retrieve-headers 0 nndir-current-group 0 0) - (nnmh-request-article 0 nndir-current-group 0 0)) -@end example - -This means that when @code{nndir-retrieve-headers} is called, the first, -third, and fourth parameters will be passed on to -@code{nnml-retrieve-headers}, while the second parameter is set to the -value of @code{nndir-current-group}. - -@item nnoo-import -This macro allows importing functions from backends. It should be the -last thing in the source file, since it will only define functions that -haven't already been defined. - -@example -(nnoo-import nndir - (nnmh - nnmh-request-list - nnmh-request-newgroups) - (nnml)) -@end example - -This means that calls to @code{nndir-request-list} should just be passed -on to @code{nnmh-request-list}, while all public functions from -@code{nnml} that haven't been defined in @code{nndir} yet should be -defined now. - -@end table - -Below is a slightly shortened version of the @code{nndir} backend. - -@lisp -;;; nndir.el --- single directory newsgroup access for Gnus -;; Copyright (C) 1995,96 Free Software Foundation, Inc. - -;;; Code: - -(require 'nnheader) -(require 'nnmh) -(require 'nnml) -(require 'nnoo) -(eval-when-compile (require 'cl)) - -(nnoo-declare nndir - nnml nnmh) - -(defvoo nndir-directory nil - "Where nndir will look for groups." - nnml-current-directory nnmh-current-directory) - -(defvoo nndir-nov-is-evil nil - "*Non-nil means that nndir will never retrieve NOV headers." - nnml-nov-is-evil) - -(defvoo nndir-current-group "" - nil - nnml-current-group nnmh-current-group) -(defvoo nndir-top-directory nil nil nnml-directory nnmh-directory) -(defvoo nndir-get-new-mail nil nil nnml-get-new-mail nnmh-get-new-mail) - -(defvoo nndir-status-string "" nil nnmh-status-string) -(defconst nndir-version "nndir 1.0") - -;;; Interface functions. - -(nnoo-define-basics nndir) - -(deffoo nndir-open-server (server &optional defs) - (setq nndir-directory - (or (cadr (assq 'nndir-directory defs)) - server)) - (unless (assq 'nndir-directory defs) - (push `(nndir-directory ,server) defs)) - (push `(nndir-current-group - ,(file-name-nondirectory - (directory-file-name nndir-directory))) - defs) - (push `(nndir-top-directory - ,(file-name-directory (directory-file-name nndir-directory))) - defs) - (nnoo-change-server 'nndir server defs)) - -(nnoo-map-functions nndir - (nnml-retrieve-headers 0 nndir-current-group 0 0) - (nnmh-request-article 0 nndir-current-group 0 0) - (nnmh-request-group nndir-current-group 0 0) - (nnmh-close-group nndir-current-group 0)) - -(nnoo-import nndir - (nnmh - nnmh-status-message - nnmh-request-list - nnmh-request-newgroups)) - -(provide 'nndir) -@end lisp - - -@node Hooking New Backends Into Gnus -@subsubsection Hooking New Backends Into Gnus - -@vindex gnus-valid-select-methods -@findex gnus-declare-backend -Having Gnus start using your new backend is rather easy---you just -declare it with the @code{gnus-declare-backend} functions. This will -enter the backend into the @code{gnus-valid-select-methods} variable. - -@code{gnus-declare-backend} takes two parameters---the backend name and -an arbitrary number of @dfn{abilities}. - -Here's an example: - -@lisp -(gnus-declare-backend "nnchoke" 'mail 'respool 'address) -@end lisp - -The above line would then go in the @file{nnchoke.el} file. - -The abilities can be: - -@table @code -@item mail -This is a mailish backend---followups should (probably) go via mail. -@item post -This is a newsish backend---followups should (probably) go via news. -@item post-mail -This backend supports both mail and news. -@item none -This is neither a post nor mail backend---it's something completely -different. -@item respool -It supports respooling---or rather, it is able to modify its source -articles and groups. -@item address -The name of the server should be in the virtual server name. This is -true for almost all backends. -@item prompt-address -The user should be prompted for an address when doing commands like -@kbd{B} in the group buffer. This is true for backends like -@code{nntp}, but not @code{nnmbox}, for instance. -@end table - - -@node Mail-like Backends -@subsubsection Mail-like Backends - -One of the things that separate the mail backends from the rest of the -backends is the heavy dependence by the mail backends on common -functions in @file{nnmail.el}. For instance, here's the definition of -@code{nnml-request-scan}: - -@lisp -(deffoo nnml-request-scan (&optional group server) - (setq nnml-article-file-alist nil) - (nnmail-get-new-mail 'nnml 'nnml-save-nov nnml-directory group)) -@end lisp - -It simply calls @code{nnmail-get-new-mail} with a few parameters, -and @code{nnmail} takes care of all the moving and splitting of the -mail. - -This function takes four parameters. - -@table @var -@item method -This should be a symbol to designate which backend is responsible for -the call. - -@item exit-function -This function should be called after the splitting has been performed. - -@item temp-directory -Where the temporary files should be stored. - -@item group -This optional argument should be a group name if the splitting is to be -performed for one group only. -@end table - -@code{nnmail-get-new-mail} will call @var{backend}@code{-save-mail} to -save each article. @var{backend}@code{-active-number} will be called to -find the article number assigned to this article. - -The function also uses the following variables: -@var{backend}@code{-get-new-mail} (to see whether to get new mail for -this backend); and @var{backend}@code{-group-alist} and -@var{backend}@code{-active-file} to generate the new active file. -@var{backend}@code{-group-alist} should be a group-active alist, like -this: - -@example -(("a-group" (1 . 10)) - ("some-group" (34 . 39))) -@end example - - -@node Score File Syntax -@subsection Score File Syntax - -Score files are meant to be easily parseable, but yet extremely -mallable. It was decided that something that had the same read syntax -as an Emacs Lisp list would fit that spec. - -Here's a typical score file: - -@lisp -(("summary" - ("win95" -10000 nil s) - ("Gnus")) - ("from" - ("Lars" -1000)) - (mark -100)) -@end lisp - -BNF definition of a score file: - -@example -score-file = "" / "(" *element ")" -element = rule / atom -rule = string-rule / number-rule / date-rule -string-rule = "(" quote string-header quote space *string-match ")" -number-rule = "(" quote number-header quote space *number-match ")" -date-rule = "(" quote date-header quote space *date-match ")" -quote = -string-header = "subject" / "from" / "references" / "message-id" / - "xref" / "body" / "head" / "all" / "followup" -number-header = "lines" / "chars" -date-header = "date" -string-match = "(" quote quote [ "" / [ space score [ "" / - space date [ "" / [ space string-match-t ] ] ] ] ] ")" -score = "nil" / -date = "nil" / -string-match-t = "nil" / "s" / "substring" / "S" / "Substring" / - "r" / "regex" / "R" / "Regex" / - "e" / "exact" / "E" / "Exact" / - "f" / "fuzzy" / "F" / "Fuzzy" -number-match = "(" [ "" / [ space score [ "" / - space date [ "" / [ space number-match-t ] ] ] ] ] ")" -number-match-t = "nil" / "=" / "<" / ">" / ">=" / "<=" -date-match = "(" quote quote [ "" / [ space score [ "" / - space date [ "" / [ space date-match-t ] ] ] ] ")" -date-match-t = "nil" / "at" / "before" / "after" -atom = "(" [ required-atom / optional-atom ] ")" -required-atom = mark / expunge / mark-and-expunge / files / - exclude-files / read-only / touched -optional-atom = adapt / local / eval -mark = "mark" space nil-or-number -nil-or-number = "nil" / -expunge = "expunge" space nil-or-number -mark-and-expunge = "mark-and-expunge" space nil-or-number -files = "files" *[ space ] -exclude-files = "exclude-files" *[ space ] -read-only = "read-only" [ space "nil" / space "t" ] -adapt = "adapt" [ space "ignore" / space "t" / space adapt-rule ] -adapt-rule = "(" *[ *[ "(" ")" ] ")" -local = "local" *[ space "(" space ")" ] -eval = "eval" space -space = *[ " " / / ] -@end example - -Any unrecognized elements in a score file should be ignored, but not -discarded. - -As you can see, white space is needed, but the type and amount of white -space is irrelevant. This means that formatting of the score file is -left up to the programmer---if it's simpler to just spew it all out on -one looong line, then that's ok. - -The meaning of the various atoms are explained elsewhere in this -manual (@pxref{Score File Format}). - - -@node Headers -@subsection Headers - -Internally Gnus uses a format for storing article headers that -corresponds to the @sc{nov} format in a mysterious fashion. One could -almost suspect that the author looked at the @sc{nov} specification and -just shamelessly @emph{stole} the entire thing, and one would be right. - -@dfn{Header} is a severely overloaded term. ``Header'' is used in -RFC 1036 to talk about lines in the head of an article (e.g., -@code{From}). It is used by many people as a synonym for -``head''---``the header and the body''. (That should be avoided, in my -opinion.) And Gnus uses a format internally that it calls ``header'', -which is what I'm talking about here. This is a 9-element vector, -basically, with each header (ouch) having one slot. - -These slots are, in order: @code{number}, @code{subject}, @code{from}, -@code{date}, @code{id}, @code{references}, @code{chars}, @code{lines}, -@code{xref}, and @code{extra}. There are macros for accessing and -setting these slots---they all have predictable names beginning with -@code{mail-header-} and @code{mail-header-set-}, respectively. - -All these slots contain strings, except the @code{extra} slot, which -contains an alist of header/value pairs (@pxref{To From Newsgroups}). - - -@node Ranges -@subsection Ranges - -@sc{gnus} introduced a concept that I found so useful that I've started -using it a lot and have elaborated on it greatly. - -The question is simple: If you have a large amount of objects that are -identified by numbers (say, articles, to take a @emph{wild} example) -that you want to qualify as being ``included'', a normal sequence isn't -very useful. (A 200,000 length sequence is a bit long-winded.) - -The solution is as simple as the question: You just collapse the -sequence. - -@example -(1 2 3 4 5 6 10 11 12) -@end example - -is transformed into - -@example -((1 . 6) (10 . 12)) -@end example - -To avoid having those nasty @samp{(13 . 13)} elements to denote a -lonesome object, a @samp{13} is a valid element: - -@example -((1 . 6) 7 (10 . 12)) -@end example - -This means that comparing two ranges to find out whether they are equal -is slightly tricky: - -@example -((1 . 5) 7 8 (10 . 12)) -@end example - -and - -@example -((1 . 5) (7 . 8) (10 . 12)) -@end example - -are equal. In fact, any non-descending list is a range: - -@example -(1 2 3 4 5) -@end example - -is a perfectly valid range, although a pretty long-winded one. This is -also valid: - -@example -(1 . 5) -@end example - -and is equal to the previous range. - -Here's a BNF definition of ranges. Of course, one must remember the -semantic requirement that the numbers are non-descending. (Any number -of repetition of the same number is allowed, but apt to disappear in -range handling.) - -@example -range = simple-range / normal-range -simple-range = "(" number " . " number ")" -normal-range = "(" start-contents ")" -contents = "" / simple-range *[ " " contents ] / - number *[ " " contents ] -@end example - -Gnus currently uses ranges to keep track of read articles and article -marks. I plan on implementing a number of range operators in C if The -Powers That Be are willing to let me. (I haven't asked yet, because I -need to do some more thinking on what operators I need to make life -totally range-based without ever having to convert back to normal -sequences.) - - -@node Group Info -@subsection Group Info - -Gnus stores all permanent info on groups in a @dfn{group info} list. -This list is from three to six elements (or more) long and exhaustively -describes the group. - -Here are two example group infos; one is a very simple group while the -second is a more complex one: - -@example -("no.group" 5 ((1 . 54324))) - -("nnml:my.mail" 3 ((1 . 5) 9 (20 . 55)) - ((tick (15 . 19)) (replied 3 6 (19 . 3))) - (nnml "") - ((auto-expire . t) (to-address . "ding@@gnus.org"))) -@end example - -The first element is the @dfn{group name}---as Gnus knows the group, -anyway. The second element is the @dfn{subscription level}, which -normally is a small integer. (It can also be the @dfn{rank}, which is a -cons cell where the @code{car} is the level and the @code{cdr} is the -score.) The third element is a list of ranges of read articles. The -fourth element is a list of lists of article marks of various kinds. -The fifth element is the select method (or virtual server, if you like). -The sixth element is a list of @dfn{group parameters}, which is what -this section is about. - -Any of the last three elements may be missing if they are not required. -In fact, the vast majority of groups will normally only have the first -three elements, which saves quite a lot of cons cells. - -Here's a BNF definition of the group info format: - -@example -info = "(" group space ralevel space read - [ "" / [ space marks-list [ "" / [ space method [ "" / - space parameters ] ] ] ] ] ")" -group = quote quote -ralevel = rank / level -level = -rank = "(" level "." score ")" -score = -read = range -marks-lists = nil / "(" *marks ")" -marks = "(" range ")" -method = "(" *elisp-forms ")" -parameters = "(" *elisp-forms ")" -@end example - -Actually that @samp{marks} rule is a fib. A @samp{marks} is a -@samp{} consed on to a @samp{range}, but that's a bitch to say -in pseudo-BNF. - -If you have a Gnus info and want to access the elements, Gnus offers a -series of macros for getting/setting these elements. - -@table @code -@item gnus-info-group -@itemx gnus-info-set-group -@findex gnus-info-group -@findex gnus-info-set-group -Get/set the group name. - -@item gnus-info-rank -@itemx gnus-info-set-rank -@findex gnus-info-rank -@findex gnus-info-set-rank -Get/set the group rank (@pxref{Group Score}). - -@item gnus-info-level -@itemx gnus-info-set-level -@findex gnus-info-level -@findex gnus-info-set-level -Get/set the group level. - -@item gnus-info-score -@itemx gnus-info-set-score -@findex gnus-info-score -@findex gnus-info-set-score -Get/set the group score (@pxref{Group Score}). - -@item gnus-info-read -@itemx gnus-info-set-read -@findex gnus-info-read -@findex gnus-info-set-read -Get/set the ranges of read articles. - -@item gnus-info-marks -@itemx gnus-info-set-marks -@findex gnus-info-marks -@findex gnus-info-set-marks -Get/set the lists of ranges of marked articles. - -@item gnus-info-method -@itemx gnus-info-set-method -@findex gnus-info-method -@findex gnus-info-set-method -Get/set the group select method. - -@item gnus-info-params -@itemx gnus-info-set-params -@findex gnus-info-params -@findex gnus-info-set-params -Get/set the group parameters. -@end table - -All the getter functions take one parameter---the info list. The setter -functions take two parameters---the info list and the new value. - -The last three elements in the group info aren't mandatory, so it may be -necessary to extend the group info before setting the element. If this -is necessary, you can just pass on a non-@code{nil} third parameter to -the three final setter functions to have this happen automatically. - - -@node Extended Interactive -@subsection Extended Interactive -@cindex interactive -@findex gnus-interactive - -Gnus extends the standard Emacs @code{interactive} specification -slightly to allow easy use of the symbolic prefix (@pxref{Symbolic -Prefixes}). Here's an example of how this is used: - -@lisp -(defun gnus-summary-increase-score (&optional score symp) - (interactive (gnus-interactive "P\ny")) - ... - ) -@end lisp - -The best thing to do would have been to implement -@code{gnus-interactive} as a macro which would have returned an -@code{interactive} form, but this isn't possible since Emacs checks -whether a function is interactive or not by simply doing an @code{assq} -on the lambda form. So, instead we have @code{gnus-interactive} -function that takes a string and returns values that are usable to -@code{interactive}. - -This function accepts (almost) all normal @code{interactive} specs, but -adds a few more. - -@table @samp -@item y -@vindex gnus-current-prefix-symbol -The current symbolic prefix---the @code{gnus-current-prefix-symbol} -variable. - -@item Y -@vindex gnus-current-prefix-symbols -A list of the current symbolic prefixes---the -@code{gnus-current-prefix-symbol} variable. - -@item A -The current article number---the @code{gnus-summary-article-number} -function. - -@item H -The current article header---the @code{gnus-summary-article-header} -function. - -@item g -The current group name---the @code{gnus-group-group-name} -function. - -@end table - - -@node Emacs/XEmacs Code -@subsection Emacs/XEmacs Code -@cindex XEmacs -@cindex Emacsen - -While Gnus runs under Emacs, XEmacs and Mule, I decided that one of the -platforms must be the primary one. I chose Emacs. Not because I don't -like XEmacs or Mule, but because it comes first alphabetically. - -This means that Gnus will byte-compile under Emacs with nary a warning, -while XEmacs will pump out gigabytes of warnings while byte-compiling. -As I use byte-compilation warnings to help me root out trivial errors in -Gnus, that's very useful. - -I've also consistently used Emacs function interfaces, but have used -Gnusey aliases for the functions. To take an example: Emacs defines a -@code{run-at-time} function while XEmacs defines a @code{start-itimer} -function. I then define a function called @code{gnus-run-at-time} that -takes the same parameters as the Emacs @code{run-at-time}. When running -Gnus under Emacs, the former function is just an alias for the latter. -However, when running under XEmacs, the former is an alias for the -following function: - -@lisp -(defun gnus-xmas-run-at-time (time repeat function &rest args) - (start-itimer - "gnus-run-at-time" - `(lambda () - (,function ,@@args)) - time repeat)) -@end lisp - -This sort of thing has been done for bunches of functions. Gnus does -not redefine any native Emacs functions while running under XEmacs---it -does this @code{defalias} thing with Gnus equivalents instead. Cleaner -all over. - -In the cases where the XEmacs function interface was obviously cleaner, -I used it instead. For example @code{gnus-region-active-p} is an alias -for @code{region-active-p} in XEmacs, whereas in Emacs it is a function. - -Of course, I could have chosen XEmacs as my native platform and done -mapping functions the other way around. But I didn't. The performance -hit these indirections impose on Gnus under XEmacs should be slight. - - -@node Various File Formats -@subsection Various File Formats - -@menu -* Active File Format:: Information on articles and groups available. -* Newsgroups File Format:: Group descriptions. -@end menu - - -@node Active File Format -@subsubsection Active File Format - -The active file lists all groups available on the server in -question. It also lists the highest and lowest current article numbers -in each group. - -Here's an excerpt from a typical active file: - -@example -soc.motss 296030 293865 y -alt.binaries.pictures.fractals 3922 3913 n -comp.sources.unix 1605 1593 m -comp.binaries.ibm.pc 5097 5089 y -no.general 1000 900 y -@end example - -Here's a pseudo-BNF definition of this file: - -@example -active = *group-line -group-line = group spc high-number spc low-number spc flag -group = -spc = " " -high-number = -low-number = -flag = "y" / "n" / "m" / "j" / "x" / "=" group -@end example - -For a full description of this file, see the manual pages for -@samp{innd}, in particular @samp{active(5)}. - - -@node Newsgroups File Format -@subsubsection Newsgroups File Format - -The newsgroups file lists groups along with their descriptions. Not all -groups on the server have to be listed, and not all groups in the file -have to exist on the server. The file is meant purely as information to -the user. - -The format is quite simple; a group name, a tab, and the description. -Here's the definition: - -@example -newsgroups = *line -line = group tab description -group = -tab = -description = -@end example - - -@page -@node Emacs for Heathens -@section Emacs for Heathens - -Believe it or not, but some people who use Gnus haven't really used -Emacs much before they embarked on their journey on the Gnus Love Boat. -If you are one of those unfortunates whom ``@kbd{M-C-a}'', ``kill the -region'', and ``set @code{gnus-flargblossen} to an alist where the key -is a regexp that is used for matching on the group name'' are magical -phrases with little or no meaning, then this appendix is for you. If -you are already familiar with Emacs, just ignore this and go fondle your -cat instead. - -@menu -* Keystrokes:: Entering text and executing commands. -* Emacs Lisp:: The built-in Emacs programming language. -@end menu - - -@node Keystrokes -@subsection Keystrokes - -@itemize @bullet -@item -Q: What is an experienced Emacs user? - -@item -A: A person who wishes that the terminal had pedals. -@end itemize - -Yes, when you use Emacs, you are apt to use the control key, the shift -key and the meta key a lot. This is very annoying to some people -(notably @code{vi}le users), and the rest of us just love the hell out -of it. Just give up and submit. Emacs really does stand for -``Escape-Meta-Alt-Control-Shift'', and not ``Editing Macros'', as you -may have heard from other disreputable sources (like the Emacs author). - -The shift keys are normally located near your pinky fingers, and are -normally used to get capital letters and stuff. You probably use it all -the time. The control key is normally marked ``CTRL'' or something like -that. The meta key is, funnily enough, never marked as such on any -keyboard. The one I'm currently at has a key that's marked ``Alt'', -which is the meta key on this keyboard. It's usually located somewhere -to the left hand side of the keyboard, usually on the bottom row. - -Now, us Emacs people don't say ``press the meta-control-m key'', -because that's just too inconvenient. We say ``press the @kbd{M-C-m} -key''. @kbd{M-} is the prefix that means ``meta'' and ``C-'' is the -prefix that means ``control''. So ``press @kbd{C-k}'' means ``press -down the control key, and hold it down while you press @kbd{k}''. -``Press @kbd{M-C-k}'' means ``press down and hold down the meta key and -the control key and then press @kbd{k}''. Simple, ay? - -This is somewhat complicated by the fact that not all keyboards have a -meta key. In that case you can use the ``escape'' key. Then @kbd{M-k} -means ``press escape, release escape, press @kbd{k}''. That's much more -work than if you have a meta key, so if that's the case, I respectfully -suggest you get a real keyboard with a meta key. You can't live without -it. - - - -@node Emacs Lisp -@subsection Emacs Lisp - -Emacs is the King of Editors because it's really a Lisp interpreter. -Each and every key you tap runs some Emacs Lisp code snippet, and since -Emacs Lisp is an interpreted language, that means that you can configure -any key to run any arbitrary code. You just, like, do it. - -Gnus is written in Emacs Lisp, and is run as a bunch of interpreted -functions. (These are byte-compiled for speed, but it's still -interpreted.) If you decide that you don't like the way Gnus does -certain things, it's trivial to have it do something a different way. -(Well, at least if you know how to write Lisp code.) However, that's -beyond the scope of this manual, so we are simply going to talk about -some common constructs that you normally use in your @file{.emacs} file -to customize Gnus. - -If you want to set the variable @code{gnus-florgbnize} to four (4), you -write the following: - -@lisp -(setq gnus-florgbnize 4) -@end lisp - -This function (really ``special form'') @code{setq} is the one that can -set a variable to some value. This is really all you need to know. Now -you can go and fill your @code{.emacs} file with lots of these to change -how Gnus works. - -If you have put that thing in your @code{.emacs} file, it will be read -and @code{eval}ed (which is lisp-ese for ``run'') the next time you -start Emacs. If you want to change the variable right away, simply say -@kbd{C-x C-e} after the closing parenthesis. That will @code{eval} the -previous ``form'', which is a simple @code{setq} statement here. - -Go ahead---just try it, if you're located at your Emacs. After you -@kbd{C-x C-e}, you will see @samp{4} appear in the echo area, which -is the return value of the form you @code{eval}ed. - -Some pitfalls: - -If the manual says ``set @code{gnus-read-active-file} to @code{some}'', -that means: - -@lisp -(setq gnus-read-active-file 'some) -@end lisp - -On the other hand, if the manual says ``set @code{gnus-nntp-server} to -@samp{nntp.ifi.uio.no}'', that means: - -@lisp -(setq gnus-nntp-server "nntp.ifi.uio.no") -@end lisp - -So be careful not to mix up strings (the latter) with symbols (the -former). The manual is unambiguous, but it can be confusing. - -@page -@include gnus-faq.texi - -@node Index -@chapter Index -@printindex cp - -@node Key Index -@chapter Key Index -@printindex ky - -@summarycontents -@contents -@bye - -@iftex -@iflatex -\end{document} -@end iflatex -@end iftex - -@c End: -% LocalWords: Backend BNF mucho Backends backends detailmenu cindex kindex kbd -% LocalWords: findex Gnusae vindex dfn dfn samp nntp setq nnspool nntpserver -% LocalWords: nnmbox backend newusers Blllrph NEWGROUPS dingnusdingnusdingnus -% LocalWords: pre fab rec comp nnslashdot regex ga ga sci nnml nnbabyl nnmh -% LocalWords: nnfolder emph looong eld newsreaders defun init elc pxref diff --git a/texi/gnuslogo.refcard b/texi/gnuslogo.refcard deleted file mode 100644 index aacf40e..0000000 --- a/texi/gnuslogo.refcard +++ /dev/null @@ -1,243 +0,0 @@ -%!PS-Adobe-2.0 EPSF-1.2 -%%Creator: Adobe Illustrator 88(TM) format generated by CorelTRACE Version 2.0C -%%Title: /home/menja/c/larsi/gnus.eps -%%BoundingBox: 0 0 924.5 907.2 -%%CreationDate: Tue Feb 20 01:51:37 1996 -%%DocumentFonts: -%%ColorUsage: B & W -%%TileBox: 0 0 924.5 907.2 -%%EndComments -%%BeginProcSet:Adobe_Illustrator_1.1 0 0 -% Copyright 1992 Corel Corporation. - -% All rights reserved. -.15 .15 scale - -/wPSMDict 150 dict def -wPSMDict begin -/bd {bind def} bind def -/ld {load def} bd -/xd {exch def} bd -/_ null def -/$c 0 def -/$m 0 def -/$y 0 def -/$k 0 def -/$t 1 def -/$n _ def -/$o 0 def -/$C 0 def -/$M 0 def -/$Y 0 def -/$K 0 def -/$T 1 def -/$N _ def -/$O 0 def -/$h false def -/$al 0 def -/$tr 0 def -/$le 0 def -/$lx 0 def -/$ly 0 def -/$ctm matrix currentmatrix def -/@cp /closepath ld -/@gs /gsave ld -/@gr /grestore ld -/@MN {2 copy le{pop}{exch pop}ifelse}bd -/setcmykcolor where {pop}{/setcmykcolor{4 1 roll -3 {3 index add 1 @MN 1 exch sub 3 1 roll} repeat -setrgbcolor -pop}bd}ifelse -/@tc{dup 1 ge{pop}{4 {dup -6 -1 roll -mul -exch}repeat -pop}ifelse}bd -/@scc{$c $m $y $k $t @tc setcmykcolor true}bd -/@SCC{$C $M $Y $K $T @tc setcmykcolor true}bd -/@sm{/$ctm $ctm currentmatrix def}bd -/x {/$t xd /$n xd -/$k xd /$y xd /$m xd /$c xd}bd -/X {/$T xd /$N xd -/$K xd /$Y xd /$M xd /$C xd}bd -/g {1 exch sub 0 0 0 -4 -1 roll -_ 1 x}bd -/G {1 exch sub 0 0 0 -4 -1 roll -_ 1 X}bd -/k {_ 1 x}bd -/K {_ 1 X}bd -/d /setdash ld -/i {dup 0 ne {setflat} {pop} ifelse}bd -/j /setlinejoin ld -/J /setlinecap ld -/M /setmiterlimit ld -/w /setlinewidth ld -/O {/$o xd}bd -/R {/$O xd}bd -/c /curveto ld -/C /c ld -/l /lineto ld -/L /l ld -/m /moveto ld -/n /newpath ld -/N /newpath ld -/F {@scc{eofill}if n} bd -/f {@cp F}bd -/S {@SCC{stroke}if n} bd -/s {@cp -S}bd -/B {@gs F @gr -S}bd -/b {@cp B }bd -/u {}bd -/U {}bd -%%EndProlog -%%BeginSetup -%%EndSetup -1 i -2 J -0 j -4 M -[]0 d - -%%Note: traced as Normal_Outline -0 g -259.2 78.2 m -327.3 178.5 L -327.8 179.0 328.3 180.0 329.7 180.4 C -373.4 241.9 L -388.8 263.5 L -389.2 264.0 390.7 264.4 391.6 265.4 C -413.7 298.0 453.6 351.8 468.0 404.6 C -467.5 405.6 467.5 407.0 467.5 407.0 C -442.0 367.6 411.3 319.2 379.2 279.3 C -372.0 267.3 366.7 265.9 361.9 254.8 C -333.1 216.0 L -323.5 207.3 311.0 185.2 302.8 175.6 C -298.0 165.6 293.2 164.1 288.9 154.0 C -282.2 147.8 282.2 139.6 276.4 132.4 C -258.2 77.7 L -258.2 77.7 259.2 78.2 259.2 78.2 C -f -0 g -470.8 211.6 m -470.8 211.6 472.3 212.1 472.3 212.1 C -518.8 305.2 L -531.3 317.2 L -537.6 314.8 539.0 300.9 548.6 301.9 C -555.8 301.9 554.8 302.8 561.6 306.2 C -595.2 357.1 L -595.6 358.0 597.6 358.5 598.5 360.0 C -615.8 398.4 650.8 450.7 657.6 483.8 C -658.0 486.2 658.0 488.1 658.0 489.6 C -654.2 489.1 656.1 485.2 650.4 479.5 C -634.5 446.8 611.5 402.2 592.8 377.2 C -588.0 370.0 581.7 365.7 577.4 358.5 C -570.2 355.6 568.3 351.3 560.1 356.6 C -554.8 360.0 553.9 364.8 550.0 370.0 C -548.1 371.5 550.0 370.5 547.2 371.0 C -541.4 365.2 L -511.2 319.6 484.3 276.0 471.8 220.3 C -470.8 215.5 471.3 215.5 469.4 212.1 C -469.4 212.1 470.8 211.6 470.8 211.6 C -f -0 g -731.0 292.8 m -756.0 351.3 751.6 407.0 771.3 468.0 C -783.3 520.8 809.7 582.2 822.2 635.0 C -829.4 684.4 855.8 732.0 825.1 789.1 C -811.6 797.7 799.6 805.4 784.8 802.0 C -757.9 792.0 732.9 743.0 726.2 712.8 C -727.6 708.4 727.2 707.0 730.0 704.6 C -731.0 704.1 732.9 704.1 734.4 704.6 C -737.2 709.9 L -754.0 747.3 L -758.8 755.0 771.8 754.0 781.9 751.2 C -788.1 748.3 791.5 745.9 797.7 744.0 C -831.8 680.1 800.6 611.0 784.3 542.8 C -765.6 478.5 748.3 431.5 739.2 370.5 C -733.9 347.5 729.1 318.7 730.0 292.8 C -730.0 292.8 731.0 292.8 731.0 292.8 C -f -0 g -434.4 462.7 m -460.3 496.8 462.2 532.8 458.4 575.5 C -456.4 588.0 451.2 599.0 445.4 609.1 C -435.3 620.1 435.3 622.5 421.9 630.7 C -411.8 619.6 398.4 604.8 391.6 586.0 C -393.6 581.7 396.4 584.1 401.7 577.9 C -403.2 577.4 404.6 576.9 404.6 576.9 C -407.0 574.5 406.0 573.6 410.4 571.2 C -414.2 564.0 418.5 558.2 424.3 545.7 C -437.2 526.5 428.1 489.6 433.9 462.2 C -433.9 462.2 434.4 462.7 434.4 462.7 C -f -0 g -226.0 482.4 m -281.7 485.7 311.0 531.3 357.1 565.9 C -362.8 572.1 364.8 574.0 368.6 580.3 C -368.6 581.7 369.1 582.7 369.6 584.6 C -370.0 585.6 371.5 587.0 372.9 588.0 C -381.6 606.2 L -377.2 605.2 374.8 602.8 371.0 597.6 C -346.0 576.4 316.8 552.0 289.9 536.1 C -288.9 535.2 288.0 534.2 288.0 534.2 C -273.6 528.0 263.5 527.5 247.6 530.8 C -242.4 535.2 239.0 536.1 238.0 544.3 C -239.5 572.1 266.8 600.0 281.2 624.9 C -293.7 637.9 300.4 650.4 311.5 668.1 C -312.0 669.1 313.9 669.6 314.8 671.0 C -319.6 679.6 L -319.6 680.1 319.6 681.6 319.2 682.0 C -285.6 649.4 258.7 601.4 229.9 555.8 C -216.4 529.9 205.4 511.2 210.2 491.0 C -212.6 483.8 218.8 484.8 226.0 482.4 C -f -0 g -624.9 600.4 m -645.1 606.2 L -676.3 622.5 694.5 658.0 710.8 698.4 C -710.4 704.1 711.3 704.6 712.3 709.4 C -696.9 685.9 693.6 667.6 662.4 653.7 C -654.7 651.3 649.4 650.4 639.3 650.8 C -633.1 654.2 625.4 659.0 621.6 670.5 C -597.6 620.6 L -600.9 612.4 604.3 607.2 613.4 603.8 C -617.2 603.3 621.1 601.4 624.9 600.4 C -f -0 g -528.4 619.2 m -548.6 617.2 564.9 629.2 578.8 645.6 C -584.1 651.8 586.5 662.8 591.8 671.0 C -593.2 681.6 603.8 690.2 601.9 704.1 C -598.5 705.1 599.0 698.8 594.7 694.0 C -581.7 679.6 L -569.7 668.6 545.7 663.8 532.8 673.9 C -487.2 697.9 467.5 754.5 413.2 772.8 C -393.1 778.0 387.3 771.8 367.2 760.3 C -360.9 755.5 357.6 744.9 351.3 740.6 C -347.0 740.6 349.9 743.5 344.6 747.3 C -344.1 748.8 343.6 750.2 343.6 750.2 C -322.5 770.8 L -312.9 775.2 300.9 784.3 287.0 779.0 C -283.6 777.1 281.7 776.1 279.3 775.2 C -250.0 750.7 229.4 705.6 181.4 697.4 C -165.6 705.1 160.3 715.2 150.7 733.9 C -130.5 685.4 L -142.5 663.3 L -147.3 661.9 147.3 660.4 151.2 655.6 C -160.8 650.4 169.9 649.4 182.8 655.2 C -212.1 676.8 L -213.1 677.7 214.0 678.7 216.0 679.2 C -238.5 695.5 250.5 727.6 279.3 735.3 C -296.1 727.2 312.4 715.6 326.8 695.5 C -330.2 688.3 331.6 684.9 335.5 681.1 C -345.1 694.5 352.8 717.6 372.9 721.9 C -423.3 726.7 453.6 670.5 498.2 631.6 C -510.7 624.4 517.4 621.1 528.4 619.2 C -f -%%Trailer -end -showpage diff --git a/texi/gnusref-ja.tex b/texi/gnusref-ja.tex deleted file mode 100644 index 23c0947..0000000 --- a/texi/gnusref-ja.tex +++ /dev/null @@ -1,924 +0,0 @@ -% -*- mode:LaTeX; eval:(set (make-local-variable 'LaTeX-version) "2"); truncate-lines:t; -*- -% include file for the Gnus refcard and booklet -\def\version{5.5} -\def\date{2 May 1998} -\def\author{Vladimir Alexiev $<$vladimir@cs.ualberta.ca$>$} -\raggedbottom\raggedright -\newlength{\logowidth}\setlength{\logowidth}{6.861in} -\newlength{\logoheight}\setlength{\logoheight}{7.013in} -\newlength{\keycolwidth} -\newenvironment{keys}[1]% #1 is the widest key - {\nopagebreak%\noindent% - \settowidth{\keycolwidth}{#1}% - \addtolength{\keycolwidth}{\tabcolsep}% - \addtolength{\keycolwidth}{-\columnwidth}% - \begin{tabular}{@{}l@{\hspace{\tabcolsep}}p{-\keycolwidth}@{}}}% - {\end{tabular}\\} -\catcode`\^=12 % allow ^ to be typed literally -\catcode`\~=12 % allow ~ to be typed literally -\newcommand{\B}[1]{{\bf#1})} % bold l)etter - -\def\Title{ -\begin{center} -{\bf\LARGE Gnus \version\ Reference \Guide\\} -%{\normalsize \Guide\ version \refver} -\end{center} -} - -\newcommand\Logo[1]{\centerline{ -\makebox[\logoscale\logowidth][l]{\vbox to \logoscale\logoheight -{\vfill\special{psfile=gnuslogo.#1}}\vspace{-\baselineskip}}}} - -\def\CopyRight{ -\begin{center} -Copyright \copyright\ 1995 Free Software Foundation, Inc.\\* -Copyright \copyright\ 1995-97 \author.\\* -Created from the Gnus manual Copyright \copyright\ 1994-97 Lars Magne -Ingebrigtsen.\\* -and the Emacs Help Bindings feature (C-h b).\\* -Gnus logo copyright \copyright\ 1995 Luis Fernandes.\\* -\end{center} - -Permission is granted to make and distribute copies of this reference -\guide{} provided the copyright notice and this permission are preserved on -all copies. Please send corrections, additions and suggestions to the -above email address. \Guide{} last edited on \date. -} - -\def\Notes{ -\subsec{Notes} -{\samepage -Gnus $B$O5pBg$G$9(B. $B8=:_$O(B 633 $B$b$NBPOCE*(B ($BMxMQl(B -$B=j$N@aLs$N$?$a$K(B, $B$3$N(B \guide $B$G$OA4$F$N4X?t$O(B ``$B$h$jO@M}E*(B'' $B$JB+G{$G(B -$B0lEY$@$1I=<($5$l$F$$$^$9(B. $BB>$NB+G{$O5-=R$N:G=i$K3g8L$NCf$GM?$($i$l$F$$(B -$B$^$9(B. $B$3$N(B \guide{} $B$O%-!/$/$H$b$r%^%K%e%"%k$r$6$C$HD/$a$k(B {\em $BI,MW(B -\/} $B$,$"$j$^$9(B. - -$BB?$/$N(B gnus $B$NL?Na$O?tCM0z?t$r;H$$$^$9(B. $BIaDL$O%a%?%-!<$r2!$7$F$$$k(B -$B4V$K@\F,0z?t$rF~NO$7$^$9$,(B, $B$?$$$F$$$N(B gnus $B$N%b!<%I$G$O(B, $B?t;z$,<+J,<+(B -$B?H$rA^F~$7$J$$$?$a(B, $B%a%?$r;H$&I,MW$O$"$j$^$;$s(B. $B@\F,0z?t$NIU$$$?$H$-$N(B -$B?6$kIq$$$O(B [$B3Q3g8L(B] $B$G=q$+$l$F$$$^$9(B. $B@\F,0z?t$O$7$P$7$P$3$l$i$r;XDj$9(B -$B$k$N$KMQ$$$i$l$^$9(B: - -\quad [$B5wN%(B] $B%]%$%s%H$,$I$N$/$i$$$N%*%V%8%'%/%H$rHt$P$9$+(B. - -\quad [$BHO0O(B] $B$I$N$/$i$$$N%*%V%8%'%/%H$,:nMQ$5$l$k$+(B ($B8=:_$NJ*$r4^$`(B). - -\quad [p/p] ``$B%W%m%;%9(B/$B@\F,0z?t$N=,47(B'': $B@\F,0z?t$,M?$($i$l$k$H(B, $B:nMQ(B -$B$9$kBP>]$N?t$r7hDj$7$^$9(B ($BIi$O5U8~$-$H$$$&0UL#$G$9(B). -transient-mark-mode $B$+(B zmacs-region $B$,@_Dj$5$l$F$$$F%j!<%8%g%s$,(Bactive -$B$G$"$k$H(B, $B$=$N%j!<%8%g%s$rA`:n$7$^$9(B. $B%W%m%;%90u(B \# $B$G0u$NIU$$$?BP>]$,(B -$B$"$l$P(B, $B$=$l$i$rA`:n$7$^$9(B. $B$=$&$G$J$1$l$P(B, $B8=:_$NBP>]$@$1$rA`:n$7$^$9(B. - -\quad [$B%l%Y%k(B] $B%0%k!<%W9VFIEY%l%Y%k$G$9(B. $BF1Ey$+$=$l$h$jDc$$%0%k!<%W$N(B -$B$_$,:nMQ$N1F6A$rDj$7$F$$$^$9(B. $BMxMQuBV(B \\ -\hline -1 & $B%a!<%k%0%k!<%W(B & \\ -2 & $B%a!<%k%0%k!<%W(B & \\ -3 & $B=i4|9VFI%l%Y%k(B & $B9VFI(B \\ -4 & & \\ -5 & $B=i4|0lMw%l%Y%k(B & \\ -\hline -6 & $B=i4|Hs9VFI%l%Y%k(B & $BHs9VFI(B \\ -7 & & \\ -\hline -8 & & $B%>%s%S(B \\ -\hline -9 & & $B:o=|(B \\ -\hline -\end{tabular} -}} - -\def\Marks{\subsec{$B0u;X<(J8;z(B}{\samepage -$BL?Na$,D>@\0u$rIU$1$k>l9g$O(B, $B3g8L$GI=<($5$l$F$$$^$9(B. \\* -\newlength{\markcolwidth} -\settowidth{\markcolwidth}{` '}% widest character -\addtolength{\markcolwidth}{4\tabcolsep} -\addtolength{\markcolwidth}{-\columnwidth} -\newlength{\markdblcolwidth} -\setlength{\markdblcolwidth}{\columnwidth} -\addtolength{\markdblcolwidth}{-2\tabcolsep} -\begin{tabular}{|c|p{-\markcolwidth}|} -\hline -\multicolumn{2}{|p{\markdblcolwidth}|} -{{\bf ``$B4{FI(B'' $B0u(B.} - $B$3$l$i$N0u$NA4$F$O35N,9T$N:G=i$N7e$K8=$l$^$9$N$G(B, $B6&B8$9$k$3$H$O$G$-(B - $B$^$;$s(B.}\\ -\hline -` ' & (M-u, M SPC, M c) $BL$FI(B.\\ -! & (!, M t) $B2D;k(B ($B6=L#?<$$(B).\\ %(M !) -? & (?, M ?) $BJ]N1(B ($B%U%)%m!<%"%C%W$N$_$K6=L#$,$"$k(B).\\ -E & (E, M e) {\bf $B;~8B>C5n2DG=(B}. $B%a!<%k%0%k!<%W$G$N$_0UL#$,$"$k(B.\\ %(M x) -\hline\hline -\multicolumn{2}{|p{\markdblcolwidth}|}{$B2<$N0u$O5-;v$,4{FI(B ($B@Z$i$l$?(B, - $B6=L#$N$J$$(B) $B$H$$$&$3$H$r0UL#$7(B, $BBgBNF1MM$J8z2L$r;}$A$^$9(B. $B$7$+$7L?Na(B - $B$K$O$=$l$i$GL@$i$+$J0c$$$,$"$k$b$N$b$"$j$^$9(B ($BNc(B.{} M M-C-r, $BE,1~%9%3(B - $B%"(B).}\\ -\hline -r & (d, M d, M r) $B>C5n(B ($B4{FI(B ({\bf read}) $B$H$7$F0uIU$1$i$l$?(B).\\ -C & (M C; M C-c; M H; c, Z c; Z n; Z C) {\bf catch-up} $B$G@Z$i$l$?(B.\\ -F & (O s; G s b) SOUP $B$5$l$F$$$k(B.\\ -G & (S C, C) $BC$7:Q$_(B ($B<+J,<+?H$N5-;v$N$_(B).\\ -O & $B8E$$(B ({\bf old}) ($BA02s$N%;%C%7%g%s$G4{FI$N0u$,IU$$$?(B).\\ -K & (k, M k; C-k, M K) $B@Z$i$l$?(B ({\bf Killed}).\\ -M & $B=EJ#>C5n$K$h$C$F0u$,IU$$$?(B.\\ -Q & $B$^$P$i%9%l%C%I$N:n@.Cf$KJ,$1$i$l$?(B.\\ -R & $B4{FI(B ({\bf read}) ($B$N0u(B}}\\ -\hline -\# & (\#, M \#, M P p) $B$NM}M3$G%-%c%C%7%e$5$l$F$$$k(B).\\ -A & $B1~Ez:Q$_(B ({\bf answered}) ($B%U%)%m!<%"%C%W$b$7$/$OJVEz$r$7$?(B).\\ -S & (O {\bf x}) $BJ]B8:Q$_(B {\bf Saved}.\\ -+ & $B=i4|%9%3%"$h$j>e(B.\\ -$-$ & $B=i4|%9%3%"$h$j2<(B.\\ -= & $B;R$r;}$D(B ($B$=$N2<$K%9%l%C%I$r(B). `\%e' `gnus-summary-line-format' -$B$r2C$($^$9(B.\\ -\hline -\end{tabular} -}} - - -\def\General{\sec{(H) $B0lHLE*$J%3%^%s%I$H%X%k%W%3%^%s%I(B}{\samepage -$B$3$l$i$NL?Na$O$I$3$G$bF0:n$7$^$9(B. -\begin{keys}{C-c C-i} -C-c C-i & Gnus $B$N%*%s%i%$%s(B {\bf info} $B$K0\F0$7$^$9(B.\\ -C-c C-b & Gnus $B$N(B {\bf bug} $BJs9p$rAw$j$^$9(B.\\ -\end{keys} - -$B$3$l$i$NL?Na$O35N,%b!<%I$GF0:n$7(B, $B$[$H$s$I$O%0%k!<%W%b!<%I$G$bF0:n$7$^(B -$B$9(B.\\* -\begin{keys}{H d} -H d & (C-c C-d) $B$3$N%0%k!<%W$N@bL@(B ({\bf Describe}) $B$r$7$^$9(B. [$B@\(B - $BF,<-(B: $B%5!<%P!<$+$i@bL@$r:FEYFI$_9~$_$^$9(B.]\\ -H f & ange-ftp $B$r;H$C$F(B, $B$3$N%0%k!<%W$N(B {\bf FAQ} $B$ro$KC;$$%X%k%W(B ({\bf help}) $B%a%C%;!<%8$rI=<($7$^$9(B.\\ - -H i & (C-c C-i) Gnus $B$N%*%s%i%$%s(B {\bf info} $B$K0\F0$7$^$9(B.\\ -H v & Gnus $B$N%P!<%8%g%s(B ({\bf version}) $BHV9f$rI=<($7$^$9(B.\\ -\end{keys}}} - -\def\GroupMode{\sec{$B%0%k!<%W%b!<%I(B} -\begin{keys}{C-c M-C-x} -RET & (=) $B$3$N%0%k!<%W$rA*Br$7$^$9(B [$B@\F,0z?t(B: $B$I$l$/$i$$$N(B ($B4{FI(B) - $B5-;v$re$HF1$8$G$9(B.]\\ -? & $BHs>o$KC;$$%X%k%W%a%C%;!<%8$rM?$($^$9(B.\\ -$<$ & $B%0%k!<%W%P%C%U%!$N:G=i$K0\F0$7$^$9(B.\\ -$>$ & $B%0%k!<%W%P%C%U%!$N:G8e$K0\F0$7$^$9(B.\\ -, & $B:GDc%l%Y%k$NL$FI5-;v$KHt$S$^$9(B.\\ -. & $B:G=i$NL$FI5-;v$N$"$k%0%k!<%W$KHt$S$^$9(B.\\ -^ & $B%5!<%P!<%P%C%U%!%b!<%I$KF~$j$^$9(B.\\ -a & $B5-;v(B ({\bf article}) $B$r%0%k!<%W$KEj9F$7$^$9(B.\\ -b & $B56(B ({\bf bogus}) $B%0%k!<%W$r8+$D$1$F>C5n$7$^$9(B.\\ -c & $BA4$F$NL$0u5-;v$K4{FI$N0u$rIU$1$^$9(B ({\bf catch-up}). [p/p]\\ -g & $B?7$7$$5-;v$,$"$k$+(B, $B%5!<%P!<$rD4$Y$^$9(B ({\bf get}). [$B%l%Y%k(B]\\ -j & $B;XDj$5$l$?%0%k!<%W$KHt$S$^$9(B ({\bf jump}) ($B$b$7$+$7$?$i@Z$i(B - $B$l$F$$$k$+$b$7$l$^$;$s(B).\\ -m & $BC/$+$K%a!<%k(B ({\bf mail}) $B$rAw$j$^$9(B.\\ -n & $BL$FI5-;v$N$"$kC5n$9$k$K$O(B - M-x gnus-unload $B$rA0$r;XDj$7(B - $B$^$9(B).\\ -C & $B$3$N%0%k!<%W$NA4$F$N5-;v$r4{FI$H$7$F0uIU$1$^$9(B ({\bf - Catch-up}). [p/p]\\ -F & $B?7$7$$%0%k!<%W$r8+$D$1(B ({\bf find}) $B$=$l$i$K:n6H$rC5n$7$^$9(B.\\ -C-c C-s & `gnus-group-sort-function'. $B$K=>$C$FJB$S49$((B({\bf Sort}) $B$^$9(B.\\ -C-c C-x & $B$3$N%0%k!<%W$NA4$F$N;~8B>C5n2DG=5-;v$r;~8B>C5n(B ({\bf -expiry}) $B$N2aDx$K$+$1$^$9(B.\\ -C-c M-C-x & $B$3$N%0%k!<%W$NA4$F$N5-;v$r;~8B>C5n(B ({\bf expiry}) $B$N2aDx$K(B -$B$+$1$^$9(B.\\ -C-c M-g & $B40A4$KA4$F$N%0%k!<%W$r3hF02=$7$^$9(B.\\ -C-x C-t & 2$B$D$N%0%k!<%W$N0LCV$rJQ99$7$^$9(B ({\bf transpose}).\\ -M-\& & $BC5n(B ({\bf clear}) $B$7$^$9(B ($B4{FI$dB>$N(B - $B0u(B). [p/p] $B%5!<%P!<$rJQ99$7$F(B, $B5-;vHV9f$,9gCW$7$J$$$H$-$O(B - M-x gnus-group-clear-data-on-native-groups $B$r;H$C$F$/$@$5$$(B. - $B$b$7$/$O(B, $B5-;v$K:FHV9fIU$1$r$9$k$?$a$K(B M-x gnus-chage-server - $B$r;H$C$F$/$@$5$$(B. $B$G$b(B, $B$3$l$OCY$$$G$9(B.\\ -\end{keys} -\begin{keys}{C-c M-C-x} -\newlength{\keywidth}\settowidth{\keywidth}{C-c M-C-x}% -\makebox[\keywidth][l]% -{M-d} & {\em $BA4$F(B\/} $B$N%0%k!<%W$N@bL@(B ({\bf describe}) $B$r$7$^$9(B. [$B@\F,0z?t(B: -$B%5!<%P!<$+$i@bL@$r:FFI$_9~$_$7$^$9(B]\\ -M-f & $B$3$N%0%k!<%W$N(B {\bf FAQ} $B$r(B (ange-ftp $B$r;H$C$F(B) $BA0$+@bL@(B ({\bf descriptions}) $B$,@55,I=8=$K9g$&A4$F$N%0%k!<(B -$B%W$r0lMwI=<($7$^$9(B.\\ -A k & $BA4$F$N:o=|$5$l$?(B ({\bf killed}) $B%0%k!<%W$r0lMwI=<($7$^$9(B. -[$B@\F,<-(B: [$BHs(B]$B9XFI$r=|$/A4$F$N%0%k!<%W(B]\\ -A l & $B;XDj$5$l$?%l%Y%k(B {\bf level} $B$NL$FI%0%k!<%W$r0lMwI=<($7$^$9(B. -[$B@\F,<-(B: $B4{FI%0%k!<%W$b(B]\\ -A m & $B@55,I=8=$K9g$$(B ({\bf match}), $BL$FI5-;v$r;}$D%0%k!<%W$r0lMwI=(B -$B<($7$^$9(B. [$B%l%Y%k(B]\\ -A s & (l) $BL$FI5-;v$N$"$k9VFI%0%k!<%W(B {\bf subscribed} $B$r0lMwI=<($7(B -$B$^$9(B. [$B%l%Y%k(B]\\ -A u & (L) $BA4$F$N%0%k!<%W(B ($BHs9VFI(B ({\bf unsubscribed}) $B$r4^$`(B) $B$r0l(B -$BMwI=<($7$^$9(B. [$B%l%Y%k(B, $B=i4|CM$O(B7]\\ -A z & $B%>%s%S(B ({\bf zombie}) $B%0%k!<%W$r0lMwI=<($7$^$9(B.\\ -A A & $BA4$F$N%5!<%P!<$NA4$F$N2DG=$J3hF0(B ({\bf active}) $B%0%k!<%W$r0l(B -$BMwI=<($7$^$9(B ($BCY$$$+$b$7$l$^$;$s(B).\\ -A M & $B@55,I=8=$K9g$&(B ({\bf match}) $BA4$F$N%0%k!<%W$r0lMwI=<($7$^$9(B.\\ -A T & $B%H%T%C%/(B ({\bf topic}) $B$GJT;<$5$l$F$$$kA4$F$N3hF0%0%k!<%W$r(B -$B0lMwI=<($7$^$9(B.\\ -\end{keys}}}} - -\def\CreateGroups{\subsec{(G) $B30It%0%k!<%W$N:n@.(B/$BJT=8(B}{\samepage -$BA*BrJ}K!$O3g8L$NCf$K<($5$l$F$$$^$9(B.\\* -\begin{keys}{G DEL} -G DEL & $B$3$N%0%k!<%W$r>C5n(B ({\bf Delete}) $B$7$^$9(B. [$B@\F,<-(B: $B5-;v$b(B - {\bf $BA4$F(B} $B>C5n$7$^$9(B]\\ -G a & Gnus $B%j%9%H(B {\bf archive} $B%0%k!<%W$r:n$j$^$9(B. (ange-ftp $B$rDL(B - $B$8$F$N(B nndir)\\ -G c & $B$3$N%0%k!<%W$N%Q%i%a!<%?$r(B {\bf customize} $B$7$^$9(B.\\ -G d & $B%G%#%l%/%H%j!<(B ({\bf directory}) $B%0%k!<%W(B $B$r:n$j$^$9(B ($BA4$F$N(B - $B%U%!%$%k$O?t;z$NL>A0$NEj9F$G$9(B). (nndir)\\ -G e & $B$3$N%0%k!<%W$NA*BrJ}K!$rJT=8(B ({\bf edit}) $B$7$^$9(B.\\ -G f & $B%U%!%$%k(B ({\bf file}) $B$K4p$E$$$?%0%k!<%W$r:n$j$^$9(B. - (nndoc: mbox, babyl, digest, mmdf, news, rnews, - clari-briefs, rfc934,rfc822, forward) [$B@\F,<-(B: $B$I$N7A<0$+$r(B - $B?dB,$7$^$;$s(B]\\ -G h & Gnus $B$N%X%k%W(B ({\bf help}) ($B@bL@(B/$B%A%e!<%H%j%"%k(B) $B%0%k!<%W$r(B - $B:n@.$7$^$9(B. (nndoc)\\ -G k & {\bf kiboze} $B%0%k!<%W$r:n@.$7$^$9(B. ($BL>A0(B, $B%0%k!<%W(B, $B@55,I=8=(B - $B$r;XDj$7$^$9(B). (nnkiboze)\\ -G m & $B?7$7$$%0%k!<%W$r:n@.(B ({\bf make}) $B$7$^$9(B ($BL>A0(B, $BJ}K!(B, $B%"%I%l(B - $B%9$r;XDj$7$^$9(B).\\ -G p & $B$3$N%0%k!<%W(B/$B%H%T%C%/$N%Q%i%a!<%?(B ({\bf parameters}) $B$rJT=8(B - $B$7$^$9(B.\\ -G r & $B$3$N%0%k!<%W$r2~L>(B ({\bf rename}) $B$7$^$9(B ($B%a!<%k%0%k!<%W$N$_(B).\\ -G v & $B$3$N%0%k!<%W$r2>A[(B ({\bf virtual}) $B%0%k!<%W$KDI2C$7$^$9(B. [p/p]\\ -G w & {\bf web} $B$K4p$$$?%0%k!<%W$r:n@.$7$^$9(B. (nnweb: dejanews, - altavista, reference) [$B@\F,<-(B: $B%0%k!<%W$r1JB3$K(B]\\ -G D & $B%G%#%l%/%H%j!<(B ({\bf directory}) $B$K(B ($B0l;~(B) $B%0%k!<%W$H$7$FF~(B -$B$j$^$9(B. ($B4{FI0u$r5-O?$7$J$$(B nneething.)\\ -G E & $B$3$N%0%k!<%W$N>pJs(B ($BA*BrJ}K!(B, $B5-;v$N4{FI(B, $B$J$I$J$I(B) $B$rJT=8(B -({\bf edit}) $B$7$^$9(B.\\ -G V & $B6u$N2>A[(B ({\bf virtual}) $B%0%k!<%W$r:n@.$7$^$9(B. -(nnvirtual)\\ -\end{keys} -$B%a!<%k%0%k!<%W$r:n@.$7$F%a!<%k$r(B nnmbox, nnbabyl, nnml, nnmh, nnfolder -$B$N(B1$B$D$NJ}K!$r;H$C$F(BGnus $B$GFI$`$3$H$b$G$-$^$9(B ($B%a!<%j%0%j%9%H$r9VFI$7$F(B -$B$$$k$HHs>o$KLr$KN)$A$^$9(B). $B%*%s%i%$%s(B info $B$GFI$s$G$/$@$5$$(B (C-c C-i g -Reading Mail RET). -}} - -\def\SortGroups{\subsubsec{(G S) $B%0%k!<%W$NJB$S49$((B}{\samepage -$BJ#?t$N4p=`$GJB$S49$($r$9$k$?$a$K$O(B, $B$^$:$"$^$j=EMW$G$J$$$b$N$rE,MQ$7(B, -$B:G8e$K0lHV=EMW$J$b$N$rE,MQ$7$^$9(B.\\* -\begin{keys}{G P \bf x} -G S a & $B%0%k!<%WL>$r%"%k%U%!%C%Y%H=g(B ({\bf Alphabetically}) $B$KJB$S(B -$B49$($^$9(B. [$B@\F,<-(B: $B5U$N=gHV(B]\\ -G S l & $B%l%Y%k$G(B ({\bf level}) $BJB$S49$($^$9(B. [$B@\F,<-(B: $B5U$N=gHV(B]\\ -G S m & $BJ}K!(B ({\bf method}) $BL>$GJB$S49$($^$9(B. [$B@\F,<-(B: $B5U$N=gHV(B]\\ -G S r & $B3,5i(B ($B%l%Y%k$H%9%3%"(B) $B$GJB$S49$($^$9(B. [$B@\F,<-(B: $B5U$N=gHV(B]\\ -G S u & $BL$FI(B ({\bf unread}) $B5-;v$N?t$GJB$S49$($^$9(B. [$B@\F,<-(B: $B5U$N(B -$B=gHV(B]\\ -G S v & $B%0%k!<%W%9%3%"(B ($BCM(B ({\bf value})) $B$GJB$S49$($^$9(B. [$B@\F,<-(B: -$B5U$N=gHV(B]\\ -\end{keys} -$B$3$3$G(B, {\bf x} $B$O(B a,l,m,r,u,v $B$N$I$l$+$G$9(B:\\* -\begin{keys}{G P \bf x} -G P \bf x & [p/p] $B$GA*Br$5$l$?%0%k!<%W$N$_$rJB$S49$($^$9(B.\\ -T S \bf x & $B8=:_$N%H%T%C%/$N$_$GJB$S49$($^$9(B.\\ -\end{keys} -}} - -\def\SOUP{\subsubsec{(G s) SOUP $B%3%^%s%I(B}{\samepage -SOUP $B$OB?$/$N5-;v(B/$BJVEz$r%Q%1%C%H$KF~$l$F(B, $B0lEY$KE>Aw$7(B, $B$=$l$i$r%*%U%i(B -$B%$%s$GFI$_9~$_(B/$B:n@.$9$k%W%m%H%3%k$G$9(B. $B%Q%1%C%H$NA`:n$K$O0J2<$NL?Na$r(B -$B;H$$(B, $BFI$`$?$a$K$O(B nnsoup $BJ}K!$r;HMQ$7$F$/$@$5$$(B.\\* -\begin{keys}{G s w} -G s b & $BA4$F$N5-;v$r:-Jq$7$^$9(B (soup $B$r:n$j$^$9(B ({\bf -brew})). [p/p]\\ -G s p & $BA4$F$N(B SOUP $B%G!<%?$r(B SOUP $B%Q%1%C%H$K:-Jq(B ({\bf pack}) $B$7$^$9(B.\\ -G s r & $BA4$F$NJVEz(B ({\bf replies}) $B$rJVEz%Q%1%C%H$K:-Jq$7$^$9(B.\\ -G s s & $BJVEz%Q%1%C%H$KF~$l$?A4$F$NJVEz$rAw?.(B ({\bf send}) $B$7$^$9(B.\\ -G s w & $BA4$F$N(B SOUP $B%G!<%?%U%!%$%k$r=q$-$^$9(B ({\bf Write}).\\ -\end{keys}}} - -\def\MarkGroups{\subsec{(M) $B%0%k!<%W$N0uIU$1(B}{\samepage -\begin{keys}{M m} -M b & $B%P%C%U%!(B ({\bf buffer}) $B$NA4$F$N%0%k!<%W$K%W%m%;%90u$rIU$1$^(B -$B$9(B.\\ -M r & $B@55,I=8=(B ({\bf regexp}) $B$K9gCW$9$kA4$F$N%0%k!<%W$K0u$rIU$1$^(B -$B$9(B.\\ -M m & (\#) $B$3$N%0%k!<%W$K0u(B {\bf mark} $B$rIU$1$^$9(B. [$BHO0O(B]\\ -M u & (M-\#) $B$3$N%0%k!<%W$+$i0u$r%s%S(B ({\bf zombie}) $B%0%k!<%W$r@Z$j$^$9(B.\\ -\end{keys}}} - -\def\GroupTopics{\subsec{(T) $B%0%k!<%W%H%T%C%/(B}{\samepage -$B%H%T%C%/$OFI$s$@$j4IM}$7$?$j$9$k$N$r4JC1$K$9$k$?$a$N%0%k!<%W$N3,AXE*$J(B -$BAH9g$;$G$9(B. -\begin{keys}{T TAB} -T TAB & $B$3$N%H%T%C%/$r0JA0$N$b$N$NI{%H%T%C%/$K$J$k$h$&$K;z2<$2$r$7$^(B - $B$9(B. [$B@\F,<-(B: $B;z2<$2$rLa$7$$$^$9(B]\\ -T DEL & $B6u$N%H%T%C%/$r>C5n(B ({\bf delete}) $B$7$^$9(B.\\ -T \# & $B$3$N%H%T%C%/$NA4$F$N%0%k!<%W$K$N%H%T%C%/$KJ#@=(B ({\bf copy}) $B$7$^$9(B. - [p/p]\\ -T h & $B6u$N%H%T%C%/$r1#$9(B ({\bf hiding}) $B$+$r@Z$j49$($^$9(B.\\ -T m & $B$3$N%0%k!<%W$rB>$N%H%T%C%/$K0\F0(B ({\bf move}) $B$7$^$9(B. - [p/p]\\ -T n & $B?7$7$$(B ({\bf new}) $B%H%T%C%/$r:n@.$7$^$9(B.\\ -T r & $B%H%T%C%/$r2~L>(B ({\bf rename}) $B$7$^$9(B.\\ -T C & $B@55,I=8=$K9gCW$9$kA4$F$N%0%k!<%W$r%H%T%C%/$KJ#@=(B ({\bf - copy}) $B$7$^$9(B.\\ -T D & $B$3$N%H%T%C%/$r$3$N%0%k!<%W$+$i>C5n(B ({\bf delete}) $B$7$^$9(B. [p/p]\\ -T M & $B@55,I=8=$K9gCW$9$kA4$F$N%0%k!<%W$r%H%T%C%/$K0\F0(B ({\bf - move}) $B$7$^$9(B.\\ -\end{keys}}} - -\def\SummaryMode{\sec{$B35N,%b!<%I(B}{\samepage -\begin{keys}{M-C-d} -SPC & $B5-;v$NA*Br(B, 1$B%Z!<%8%9%/%m!<%k(B, $B$ & (A $>$) $B$3$N5-;v$N:G8e$K%9%/%m!<%k$7$^$9(B.\\ %(A e) -\& & $B@55,I=8=$K9g$&A4$F$N5-;v$KL?Na$rC5n(B (\bf delete}) $B$7$^$9(B. [p/p]\\ -B c & $B$3$N5-;v$r$I$3$+$N%0%k!<%W$+$i%a!<%k%0%k!<%W$KJ#@=(B ({\bf -copy}) $B$7$^$9(B. [p/p]\\ -B e & $B$3$N%0%k!<%W$NA4$F$N;~8B>C5n2DG=5-;v$r;~8B>C5n(B ({\bf -expire}) $B$7$^$9(B. [p/p]\\ -B i & $BG$0U$N%U%!%$%k$r$3$N%a!<%k%0%k!<%W$NC5n2DG=5-;v$r:o=|(B ({\bf expunge}) -($B%G%#%9%/$+$i>C$7$^$9(B). [p/p]\\ -B C & $B$3$N5-;v$rJL$N%0%k!<%W$KAj8_Ej9F(B ({\bf crosspost}) $B$7$^$9(B.\\ -\end{keys}}} - -\def\GotoArticle{\subsec{(G) $B5-;v$X$N0\F0(B}{\samepage -$B$3$l$i$NL?Na$OBP>]5-;v$rA*Br$7$^$9(B. $B@\F,0z?t$OM}2r$7$^$;$s(B. \\* -\begin{keys}{G C-n} -G b & (,) $B:G9b(B ({\bf best}) $B$N5-;v$K0\F0$7$^$9(B ($B:G9b%9%3%"$N$b$N$G(B -$B$9(B). [GL rating]\\ -G f & (.) $B:G=i(B ({\bf first}) $B$NL$FI5-;v$K0\F0$7$^$9(B.\\ -G g & $B5-;vHV9f$r?V$$$F$+$i$=$N35N,9T$X0\F0(B ({\bf go to}) $B$7$^$9(B.\\ -G j & (j) $B5-;vHV9f$r?V$$$F$+$i$=$N5-;v$XHt$S$^$9(B ({\bf jump}).\\ -G l & (l) $B:G8e(B ({\bf last}) $B$N4{FI5-;v$K0\F0$7$^$9(B.\\ -G o & $B35N,$NMzNr$+$i5-;v$rC5n(B ({\bf -delete})) $B$N0u$rIU$1$F(B, $BC5n$7(B ({\bf Clear}), $BC5n$7(B, $BA0$N5-;v$K0\F0$7$^$9(B. [$BHO0O(B]\\ -M ? & (?) $B$3$N5-;v$KJ]N1$N0u$rIU$1$^$9(B ($B%U%)%m!<%"%C%W$K$@$16=L#$,(B -$B$"$k(B). [$BHO0O(B]\\ -* & $B%-%c%C%7%e$K5-;v$rF~$l$^$9(B ($B1JB3$K$7$^$9(B). [p/p]\\ -M-* & $B$3$N5-;v$r%-%c%C%7%e$+$iC5n2DG=(B ({\bf expirable}) $B$H$7$F0u$rIU$1(B -$B$^$9(B. [$BHO0O(B]\\ %(M x) -M k & (k) $BF1$8I=Bj$NA4$F$N5-;v$r@Z$j(B ({\bf kill}), $BC5n$7$^$9(B.\\ -M M-D & $BA4$F$NJ]N1(B ({\bf dormant}) $B5-;v$r1#$7$^$9(B.\\ -M M-C-r & $BM?$($i$l$?0u$NA4$F$N5-;v$r>C5n$7$^$9(B.\\ -\end{keys}}} - -\def\MarkScore{\subsubsec{(M V) $B%9%3%"(B ($BCM(B) $B$K4p$E$$$?0u(B}{\samepage -\begin{keys}{M s m} -M V c & $BA4$F$N9b%9%3%"$N5-;v$+$iA4$F$N0u$r>C5n(B ({\bf clear}) $B$7$^$9(B. -[score]\\ -M V k & $BA4$F$NDc%9%3%"$N5-;v$r@Z$j$^$9(B ({\bf kill}). [score]\\ -M V m & $BA4$F$N9b%9%3%"$N5-;v$KM?$($i$($l$?0u(B ({\bf mark}) $B$rIU$1$^$9(B. -[score]\\ -M V u & $BA4$F$N9b%9%3%"$N5-;v$r$*$b$7$m$$$H$7$F0u$rIU$1$^$9(B ($B2D;k0u$r(B -$BIU$1$^$9(B). [score]\\ -\end{keys}}} - -\def\ProcessMark{\subsubsec{(M P) $B%W%m%;%90u(B}{\samepage -$B$3$l$i$NL?Na$O%W%m%;%90u(B \# $B$rIU$1$?$j>C5n$7$?$j$7$^$9(B. $BA`:n$7$?$$5-;v(B -$B$,O"B3$7$F$$$J$$$H$-$@$1$=$l$r;H$&I,MW$,$"$k$G$7$g$&(B. $B$=$&$G$J$1$l$P?t(B -$BCM0z?t$r;H$$$^$9(B.\\* -\begin{keys}{M P R} -M P a & $BA4$F(B ({\bf all}) $B$N5-;v$K0u$rIU$1$^$9(B ($B=gHV$K(B).\\ -M P b & $B%P%C%U%!(B ({\bf buffer}) $B$K8=$l$?=g$KA4$F$N5-;v$K0u$rIU$1$^$9(B.\\ -M P i & $BA4$F$NC$7$^$9(B ({\bf unmark}).\\ %(M M-\#) -M P v & $BA4$F$N9b$$%9%3%"$N5-;v(B ($BCM(B ({\bf value})) $B$K0u$rIU$1$^$9(B. -[score]\\ -M P w & $BA4$F$N0u$r%9%?%C%/$K@Q$_$^$9(B.\\ -M P y & `M P y', `M P w' $B$d0u$r>C5n$9$kA`:n$N8e$G%9%?%C%/$+$i0u$rE=(B -$B$j(B ({\bf yank}), $BI|85$7$^$9(B.\\ -M P R & $B@55,I=8=(B ({\bf regexp}) $B$K9g$&A4$F$N5-;v$K0u$rIU$1$^$9(B.\\ -M P S & $B0uIU$-$N5-;v$r4^$`A4$F$NO"B3$7$?5-;v(B ({\bf series}) $B$K0u$rIU(B -$B$1$^$9(B.\\ -M P T & $B$3$N(B ($BI{(B)$B%9%l%C%I(B ({\bf thread}) $B$K$"$kA4$F$N5-;v$N0u$rC$7$^$9(B ({\bf unmark}).\\ -\end{keys}}} - -\def\OutputArticles{\subsec{(O) $B5-;v$N=PNO(B}{\samepage -\begin{keys}{O m} -O b & $B5-;v$NK\BN(B ({bf body} $B$r%W%l%$%s%U%!%$%k7A<0$GJ]B8$7$^$9(B. -[p/p]\\ -O f & $B$3$N5-;v$r%W%l%$%s%U%!%$%k(B ({\bf file}) $B7A<0$GJ]B8$7$^$9(B. -[p/p]\\ -O h & $B$3$N5-;v$r(B {\bf mh} $B%U%)%k%@!<$N7A<0$GJ]B8$7$^$9(B. [p/p]\\ -O m & $B$3$N5-;v$r%a!<%k(B ({\bf mail}) $B7A<0$GJ]B8$7$^$9(B. [p/p]\\ -O o & (o, C-o) $B$3$N5-;v$r(B gnus-default-article-saver $B$r;H$C$FJ]B8(B -$B$7$^$9(B. [p/p]\\ -O p & ($\mid$) $B$3$N5-;v$r%7%'%k%3%^%s%I$K%Q%$%W$GAw$j$^$9(B. [p/p]\\ -O r & $B$3$N5-;v$r(B {\bf RMAIL} $B7A<0$GJ]B8$7$^$9(B. [p/p]\\ -O s & $B$3$N5-;v$r(B {\bf SOUP} $B%Q%1%C%H$r5-;v$KDI2C$7$^$9(B. [p/p]\\ -O v & $B$3$N5-;v$r(B {\bf vm} $B$N7A<0$GJ]B8$7$^$9(B. [p/p]\\ -O F & $B$3$N5-;v$r(B, $BB8:_$9$k%U%!%$%k$r>e=q$-$7$F(B, $B%W%l%$%s%U%!%$%k(B -({\bf file}) $B$KJ]B8$7$^$9(B. [p/p]\\ -\end{keys}}} - -\def\Send{\subsec{(S) $BEj9F(B, $B%U%)%m!<%"%C%W(B, $BJVEz(B, $BE>Aw(B, $BC$7(B}{\samepage -$B$3$l$i$NL?Na$OJL$N(B Message $B%P%C%U%!$K9T$-$^$9(B. $B5-;v$rJT=8$7$?8e(B, -C-c C-c $B$r2!$7$FAw?.$7$^$9(B. $B30It%0%k!<%W$K$$$F(B, $B30It%5!<%P!<$r;H$C$F5-(B -$B;v$rEj9F$7$?$$$J$i(B, C-c C-c $B$K@\F,<-$rM?$($F$/$@$5$$(B. [$B0l;~E*(B] $B$K%5!<(B -$B%P!<$,Ej9F$G$-$J$$$J$/$F(B, $B%a!<%k$+$i%K%e!<%9$X$N%2!<%H%&%'%$$r;H$C$FEj(B -$B9F$7$?$$$H$-$K$O(B, `gnus-post-method' $B$r(B `nngateway' $B$K@_Dj$7$F$/$@$5$$(B. -\\* -\begin{keys}{S O m} -%S b & $B$3$N5-;v$X$N%U%)%m!<%"%C%W$NEj9F$H(B, $BJVEz$NAw?.$NN>J}(B ({\bf -%both}) $B$r$7$^$9(B.\\ -S c & (C) $B$3$N5-;v$rC$7$^$9(B ({\bf cancel}) ($B<+J,<+?H$N$b$N$K(B -$B$N$_F0:n$7$^$9(B).\\ -S f & (f) $B$3$N5-;v$X$N%U%)%m!<%"%C%W(B ({\bf followup}) $B$rEj9F$7$^$9(B. -[$B@\F,<-(B: $B855-;v$r4^$a$^$9(B]\\ -S m & (m) $BC/$+$K%a!<%k(B {\bf mail} $B$rAw$j$^$9(B.\\ -S n & $B%a!<%k$GAw(B -$B$7$^$9(B. [$B@\F,<-(B: $B40A4$J%X%C%@!<$r4^$a$^$9(B]\\ -S o p & $B$3$N5-;v$r%K%e!<%9%0%k!<%W$X$NEj9F(B ({\bf post}) $B$H$7$FE>Aw$7(B -$B$^$9(B.\\ -S p & (a) $B$3$N%0%k!<%W$K5-;v$rEj9F(B ({\bf post}) $B$7$^$9(B.\\ -S r & (r) $B$3$N5-;v$NCxJ}(B ({\bf -both}) $B$r$7$^$9(B. [p/p]\\ -S D b & $B<:GT$7$?(B ({\bf bounced}) $B%a!<%k$rAw$7$^$9(B. -[p/p]\\ -S O p & $B$3$l$i$NO"B3$r=8G[7A<0$K$7$F%K%e!<%9%0%k!<%W$KEj9F(B ({\bf -post}) $B$7$^$9(B. [p/p]\\ -S R & (R) $B855-;v$r0zMQ$7$F%a!<%k$GJVEz(B ({\bf reply}) $B$7$^$9(B. -[p/p]\\ -S W & $B855-;v$r0zMQ$7$F9-$$(B ({\bf wide}) $BJVEz$r%a!<%k$GAw$j$^$9(B. -[p/p]\\ -S W-c & $B2a>jAj8_Ej9F(B ({\bf crossposting}) $B$X$NJ86g(B ({\bf complaint}) -$B$rAw?.$7$^$9(B. [p/p]\\ -\end{keys} -$B$?$C$?:#Ej9F$7$?5-;v$rC$7$?$jBeBX$7$?$1$l$P(B ($B%5!<%P!<$K8=$l$kA0$K(B), -*sent \ldots* $B%P%C%U%!$K0\F0$7$F(B, `Message-ID' $B$r(B `Cancel' $B$+(B -`Supersedes' $B$K49$($F(B C-c C-c $B$G$b$&0lEYAw?.$7$F$/$@$5$$(B. -}} - -\def\Thread{\subsec{(T) $B%9%l%C%IL?Na(B}{\samepage -\begin{keys}{T M-\#} -T ^ & $B$3$N5-;v$rA0$N$b$N$+C5n$7$^$9(B.\\ -T d & $B$3$N%9%l%C%I$r2<$,$j$^$9(B ({\bf down}). [$B5wN%(B]\\ -T h & $B$3$N(B ($BI{(B)$B%9%l%C%I$r1#$7$^$9(B ({\bf hide}).\\ -T i & $B$3$N%9%l%C%I$N%9%3%"$r>e$2$^$9(B ({\bf increase}). [$B%9%3%"(B]\\ -T k & (M-C-k) $B8=:_$N(B ($BI{(B)$B%9%l%C%I$r@Z$j$^$9(B ({\bf kill}). [$B0z?t(B: -$BIi(B--$B2D;k0u(B, $B@5(B: $B0u$r>C$9(B.]\\ -T l & (M-C-l) $B$3$N%9%l%C%I$N%9%3%"$r2<$2$^$9(B ({\bf lower}). [$B%9%3(B -$B%"(B]\\ -T n & (M-C-f) $Be$,$j$^$9(B ({\bf up}). [$B5wN%(B]\\ -T H & $BA4$F$N%9%l%C%I$r1#$7$^$9(B ({\bf hide}).\\ -T S & $BA4$F$N1#$5$l$?%9%l%C%I$rI=<((B ({\bf show}) $B$7$^$9(B.\\ -T T & (M-C-t) $B%9%l%C%II=<($r@Z$jBX$($^$9(B ({\bf toggle}).\\ -\end{keys}}} - -\def\Score{\subsec{(V) $B%9%3%"(B ($BCM(B) $BL?Na(B}{\samepage -$B%*%s%i%$%s(B info $B$GE,1~%9%3%"$rFI$s$G$/$@$5$$(B.\\* -\begin{keys}{\bf A p m l} -V a & $BA4$F$NMWAG$r;XDj$7$F?7$7$$%9%3%"EPO?$r2C$((B ({\bf add}) $B$^$9(B.\\ -V c & $B?7$7$$%9%3%"%U%!%$%k$r8=:_$N$b$N(B ({\bf current}) $B$H$7$FA*Br(B -$B$7$^$9(B.\\ -V e & $B8=:_$N%9%3%"%U%!%$%k$rJT=8(B ({\bf edit}) $B$7$^$9(B.\\ -V f & $B%9%3%"%U%!%$%k(B ({\bf file}) $B$rJT=8$7$F8=:_$N$b$N$H$7$^$9(B.\\ -V m & $BM?$($i$l$?%9%3%"$h$j2<$N5-;v$K4{FI$K0u(B ({\bf mark}) $B$rIU$1$^(B -$B$9(B. [$B%9%3%"(B]\\ -V s & $B$3$N5-;v$N%9%3%"$r@_Dj(B ({\bf set}) $B$7$^$9(B.\\ -V t & $B$3$N5-;v$KE,MQ$5$l$?A4$F$N%9%3%"5,B'$rDI@W(B ({\bf trace}) $B$7(B -$B$^$9(B.\\ -V x & $BA4$F$NDc%9%3%"$N5-;v$r>C5n(B ({\bf expunge}) $B$7$^$9(B. [score]\\ -V C & $B8=:_$N%9%3%"%U%!%$%k$rMxMQ$;\\* -\quad \B{l}ifetime: t)emporary, p)ermanent, i)mmediate. - -2/3$BHVL\$NJ8;z$rBgJ8;z$GF~NO$9$k$H(B, $B;D$j$NJ8;z$O(B s)ubstring $B$H(B t)emporary -$B$G$"$k$H$_$J$5$l$^$9(B. 3$BHVL\$NJ8;z$rBgJ8;z$GF~NO$9$k$H(B, $B:G8e$N$b$N$O(B -t)emporary $B$G$"$k$H$_$J$5$l$^$9(B. - -\quad $B%9%3%"%U%!%$%k$N$r%^%&%9$G%/%j%C%/(B -$B2DG=$J%\%?%s$K(B ({\bf buttons}) $B$7$^$9(B.\\ -W c & $BM>J,$J(B {\bf CR} (^M) $B$r(B ({\bf rotate}) (rot13) $B$r9T$$$^$9(B.\\ -W t & (t) $BA4$F$N%X%C%@!iD9$J(B ({\bf verbose}) $BI=<($r@Z$jBX$($^$9(B.\\ -W w & $B5-;v$N8l$N@^$jJV$7(B ({\bf wrap}) $B$r9T$$$^$9(B.\\ -W T e & $B5-;v$N;~9o$rAw$i$l$?;~$+$i7P2a$7$?(B ({\bf elapsed}) $B;~4V$KJQ(B - $B49$7$^$9(B.\\ -W T l & $B5-;v$N;~9o$r%m!<%+%k(B ({\bf local}) $BI8=`;~9oBS$KJQ49$7$^$9(B.\\ -W T u & (W T z) $B5-;v$N;~9o$r(B {\bf UTC} ({\bf Zulu}, GMT) $B$KJQ49$7$^(B - $B$9(B.\\ -\end{keys}}} - -\def\Hide{\subsubsec{(W W) $B5-;v$NItJ,$r1#$9(B/$B%O%$%i%$%H$9$k(B}{\samepage -$B@\F,<-$,L5$$$H!"$3$l$i$NL?Na$O1#$9$+$I$&$+$r@Z$j49$($^$9!#@5$N0z?t$O1#(B -$B$7!"Ii$N0z?t$OI=<($7$^$9(B.\\* -\begin{keys}{W W C-c} -W W C-c & $BB0@-9T$r;}$D0zMQ$5$l$?(B ({\bf cited}) $B%F%-%9%H$r1#$7$^$9(B.\\ -W W a & $BA4$F$N(B ({\bf all}) $BK>$^$7$/$J$$ItJ,$r1#$7$^$9(B.\\ -W W b & $BB`6~$J(B ({\bf boring}) $B%X%C%@!<$r1#$7$^$9(B.\\ -W W c & $B0zMQ$5$l$?(B ({\bf cited}) $B%F%-%9%H$r1#$7$^$9(B.\\ -W W h & (t, W t) $BK>$^$7$/$J$$%X%C%@!<(B ({\bf headers}) $B$r1#$7$^$9(B.\\ -W W p & {\bf PGP} $B$N%X%C%@!<$H=pL>$r1#$7$^$9(B.\\ -W W s & $B=pL>(B ({\bf signature}) $B$r1#$7$^$9(B.\\ -W W P & {\bf PEM} $B%X%C%@!<$H=pL>$r1#$7$^$9(B. -\end{keys}}} - -\def\Highlight{\subsubsec{(W H) $B5-;v$N0lItJ,$r%O%$%i%$%H$9$k(B}{\samepage -\begin{keys}{W H A} -W H a & $BA4$F(B ({\bf all}) $B$NItJ,$r1#$7$^$9(B.\\ -W H c & $B0zMQ$5$l$?(B ({\bf cited}) $B%F%-%9%H$r%O%$%i%$%H$7$^$9(B.\\ -W H h & $B%X%C%@!<(B ({\bf headers}) $B$r%O%$%i%$%H$7$^$9(B.\\ -W H s & $B=pL>(B ({\bf signature}) $B$r%O%$%i%$%H$7$^$9(B.\\ -\end{keys}}} - -\def\Extract{\subsec{(X) $BO"B3$NE83+(B (Uudecode $B$J$I(B)}{\samepage -Gnus $B$O8=:_$N5-;v$,O"B3J*(B ($B$=$l$>$l$NItJ,$,I=Bj$K$*$$$F(B, $BNc$($P(B -{}1/10\dots10/10 $B$N$h$&$K(B, $B?t;z$GF1Dj$5$l$kJ#?t$NEj9F(B) $B$N0lIt$G$"$k$H(B, -$B$=$l$rG'<1$7$^$9(B. 1$B$D0J>e$NO"B3J*$K0u$rIU$1$F$l$K$O(B4$B$D$N0[7A$,$"$j$^$9(B:\\* -\begin{keys}{X v \bf Z} -X \bf z & $BO"B3J*$rI|9f2=$7$^$9(B. [p/p]\\ -X \bf Z & $BO"B3J*$rI|9f2=$7$FJ]B8$7$^$9(B. [p/p]\\ -X v \bf z & $BO"B3J*$rI|9f2=$7$F1\Mw$7$^$9(B. [p/p]\\ -X v \bf Z & $BO"B3J*$rI|9f2=$7(B, $BJ]B8$7(B, $B1\Mw$7$^$9(B. [p/p]\\ -\end{keys} -{\bf z} $B$d(B {\bf Z} $B$OI|9f2=$NJ}K!$r<($7$^$9(B (b, o, p, s, u). - -$B$3$l$i$NL?Na$G:G$bNI$/;H$o$l$kJL$NB+G{$O(B\\* -\begin{keys}{C-c C-v C-v} -C-c C-v C-v & (X v u) $BO"B3J*$r(B uudecode $B$71\Mw$7$^$9(B. [p/p]\\ -\end{keys} -$BI|9f2=$r<+F0E*$K9T$J$&$K$O(B, `M-x gnus-binary-mode' $B$r;H$C$F$/$@$5$$(B -($B$=$l$+$i5-;v$N85$N%F%-%9%H$r8+$k$?$a$K(B `g' $B$r;H$C$F$/$@$5$$(B). -}} - -\def\Exit{\subsec{(Z) $B8=:_$N%0%k!<%W$r=P$k(B}{\samepage -\begin{keys}{Z G} -Z c & (c) $BA4$F$N2D;k0uIU$-$G$J$$5-;v$K4{FI$N0u$rIU$1(B ({\bf -catch-up}, $B%-%c%C%A%"%C%W(B) $B=*N;$7$^$9(B.\\ -Z n & $BA4$F$N5-;v$K4{FI$N0u$rIU$1(B, $BpJs$r%I%j%V%k%U%!%$%k$KJ]B8(B {\bf save}) $B$7$^(B -$B$9(B. [$B@\F,<-(B: .newsrc $B$bJ]B8$7$^$9(B]\\ -Z C & $BA4$F$N5-;v$K4{FI$N0u$rIU$1(B ({\bf catch-up}, $B%-%c%C%A%"%C%W(B) -$B=*N;$7$^$9(B.\\ -Z E & (Q) $B%0%k!<%W>pJs$r99?7$;$:$K=*N;(B ({\bf Exit}) $B$7$^$9(B.\\ -Z G & (M-g) $B%0%k!<%W$N?7$7$$5-;v$rD4$Y$^$9(B ({\bf get}, $BC5n$7$^$9(B]\\ -/ v & $B%9%3%"$N9b$$5-;v$K@)8B$7$^$9(B($BCM(B ({\bf value})). [$B%9%3%"(B]\\ -/ w & $BA0$N@)8B$r%9%?%C%/$+$i(B, $B$J$I$r1#$7$?$j$7$^$9(B.\\ -TAB & $B%]%$%s%H$rH(B -({\bf refer}))\\ -C-c C-m & $B%]%$%s%H$N6a$/$N%"%I%l%9$K%a!<%k(B ({\bf mail}) $B$GJVEz$7$^$9(B -($B@\F,0z?t(B: $B5-;v$r0zMQ$7$^$9(B).\\ -\end{keys}}} - -\def\ServerMode{\sec{$B%5!<%P!<%b!<%I(B}{\samepage -$B$3$N%b!<%I$KF~$k$?$a$K$O(B, $B%0%k!<%W%b!<%I$G(B `^' $B$r2!$7$F$/$@$5$$(B.\\* -\begin{keys}{SPC} -SPC & (RET) $B$3$N%5!<%P!<$r354Q$7$^$9(B.\\ -a & $B?7$7$$%5!<%P!<$rDI2C(B {\bf add} $B$7$^$9(B.\\ -c & $B$3$N%5!<%P!<$rJ#$.\\* - Created from the Gnus manual Copyright \copyright\ 1994 Lars Magne - Ingebrigtsen.\\* - and the Emacs Help Bindings feature (C-h b).\\* - Gnus logo copyright \copyright\ 1995 Luis Fernandes.\\* - \end{center} - - Permission is granted to make and distribute copies of this reference - \guide{} provided the copyright notice and this permission are preserved on - all copies. Please send corrections, additions and suggestions to the - current maintainer's email address. \Guide{} last edited on \date. - } - -\newcommand{\Notes}{% - \subsection*{Notes} - {\esamepage - Gnus is complex. Currently it has some 346 interactive (user-callable) - functions. Of these 279 are in the two major modes (Group and - Summary/Article). Many of these functions have more than one binding, some - have 3 or even 4 bindings. The total number of keybindings is 389. So in - order to save 40\% space, every function is listed only once on this - \guide, under the ``more logical'' binding. Alternative bindings are given - in parentheses in the beginning of the description. - - Many Gnus commands are affected by the numeric prefix. Normally you enter a - prefix by holding the Meta key and typing a number, but in most Gnus modes - you don't need to use Meta since the digits are not self-inserting. The - prefixed behavior of commands is given in [brackets]. Often the prefix is - used to specify: - - \quad [distance] How many objects to move the point over. - - \quad [scope] How many objects to operate on (including the current one). - - \quad [p/p] The ``Process/Prefix Convention'': If a prefix is given then it - determines how many objects to operate on. Else if there are some objects - marked with the process mark \#, these are operated on. Else only the - current object is affected. - - \quad [level] A group subscribedness level. Only groups with a lower or - equal level will be affected by the operation. If no prefix is given, - `gnus-group-default-list-level' is used. If - `gnus-group-use-permanent-levels', then a prefix to the `g' and `l' - commands will also set the default level. - - \quad [score] An article score. If no prefix is given, - `gnus-summary-default-score' is used. \\*[\baselineskip] - % some keys - \begin{keys}{C-c C-i} - M-x gnus & start Gnus. \\ - M-x gnus-no-server & start Gnus without trying to connect to server - (i.e. to read mail). \\ - M-x gnus-unplugged & start Gnus in \texttt{unplugged}-mode - (first see the manual, C-c C-i g Gnus Unplugged RET).\\ - % - C-c C-i & Go to the Gnus online {\bf info}.\\ - C-c C-b & Send a Gnus {\bf bug} report.\\ - \end{keys} - }} - -\newcommand{\GroupLevels}{% - The table below assumes that you use the default Gnus levels. - Fill your user-specific levels in the blank cells.\\[1\baselineskip] - \begin{tabular}{|c|l|l|} - \hline - Level & Groups & Status \\ - \hline - 1 & draft/mail groups & \\ - 2 & mail groups & \\ - 3 & & subscribed \\ - 4 & & \\ - 5 & default list level & \\ - \hline - 6 & & unsubscribed \\ - 7 & & \\ - \hline - 8 & & zombies \\ - \hline - 9 & & killed \\ - \hline - \end{tabular}} - -\newcommand{\MarkCharacters}{% - {\esamepage If a command directly sets a mark, it is shown in parentheses.\\* - \newlength{\markcolwidth} - \settowidth{\markcolwidth}{` '}% widest character - \addtolength{\markcolwidth}{4\tabcolsep} - \addtolength{\markcolwidth}{-\columnwidth} - \newlength{\markdblcolwidth} - \setlength{\markdblcolwidth}{\columnwidth} - \addtolength{\markdblcolwidth}{-2\tabcolsep} - \begin{tabular}{|c|p{-\markcolwidth}|} - \hline - \multicolumn{2}{|p{\markdblcolwidth}|}{{\bf ``Read'' Marks.} - All these marks appear in the first column of the summary line, and so - are mutually exclusive.}\\ - \hline - ` ' & (M-u, M SPC, M c) Not read.\\ - ! & (!, M !, M t) Ticked (interesting).\\ - ? & (?, M ?) Dormant (only followups are interesting).\\ - E & (E, M e, M x) {\bf Expirable}. Only has effect in mail groups.\\ - G & (C, B DEL) Canceled article (or deleted in mailgroups).\\ - \hline\hline - \multicolumn{2}{|p{\markdblcolwidth}|} - {The marks below mean that the article - is read (killed, uninteresting), and have more or less the same effect. - Some commands however explicitly differentiate between them (e.g.\ M - M-C-r, adaptive scoring).}\\ - \hline - r & (d, M d, M r) Deleted (marked as {\bf read}).\\ - C & (M C; M C-c; M H; c, Z c; Z n; Z C) Killed by {\bf catch-up}.\\ - F & SOUPed article. See the manual.\\ - O & {\bf Old} (read in a previous session).\\ - K & (k, M k; C-k, M K) {\bf Killed}.\\ - M & Article marked as read by duplicate suppression.\\ - Q & Article is part of a sparse thread (see ``Threading'' - in the manual).\\ - R & {\bf Read} (viewed in actuality).\\ - X & Killed by a kill file.\\ - Y & Killed due to low score.\\ - \hline\multicolumn{2}{c}{\vspace{1ex}}\\\hline - \multicolumn{2}{|p{\markdblcolwidth}|} - {{\bf Marks not affecting visibility}}\\ - \hline - \# & (\#, M \#, M P p) Processable (will be affected by the next operation). - [2]\\ - A & {\bf Answered} (followed-up or replied). [2]\\ - * & Cached. [2]\\ - S & Saved. [2]\\ - + & Over default score. [3]\\ - $-$ & Under default score. [3]\\ - $=$ & Has children (thread underneath it). Add `\%e' to - `gnus-summary-line-format'. [3]\\ - \hline - \end{tabular} - }} - -\newcommand{\GroupModeGeneral}{% - \begin{keys}{C-c M-C-x} - RET & (=) Enter this group. [Prefix: how many (read) articles to fetch. - Positive: newest articles, negative: oldest ones; non-numerical: - view all articles, not just unread]\\ - M-RET & Enter group quickly.\\ - M-SPC & Same as RET but does not expunge and hide dormants.\\ - M-C-RET & Enter group without any processing, changes will not be permanent.\\ - SPC & Select this group and display the first (unread) article. [Same - prefix as above.]\\ - ? & Give a very short help message.\\ - $<$ & Go to the beginning of the Group buffer.\\ - $>$ & Go to the end of the Group buffer.\\ - , & Jump to the lowest-level group with unread articles.\\ - . & Jump to the first group with unread articles.\\ - xx & Enter the Server buffer mode.\\ - a & Post an {\bf article} to a group.\\ - b & Find {\bf bogus} groups and delete them.\\ - c & Mark all unticked articles in this group as read ({\bf catch-up}). - [p/p]\\ - g & Check the server for new articles ({\bf get}). [level]\\ - M-g & Check the server for new articles in this group ({\bf get}). [p/p]\\ - j & {\bf Jump} to a group.\\ - m & {\bf Mail} a message to someone.\\ - n & Go to the {\bf next} group with unread articles. [distance]\\ - M-n & Go to the {\bf next} group on the same or lower level. - [distance]\\ - p & (DEL) Go to the {\bf previous} group with unread articles. - [distance]\\ - M-p & Go to the {\bf previous} group on the same or lower level. [distance]\\ - q & {\bf Quit} Gnus.\\ - r & Re-read the init file ({\bf reset}).\\ - s & {\bf Save} the `.newsrc.eld' file (and `.newsrc' if - `gnus-save-newsrc-file').\\ - z & Suspend (kill all buffers of) Gnus.\\ - B & {\bf Browse} a foreign server.\\ - C & Mark all articles in this group as read ({\bf Catch-up}). [p/p]\\ - F & {\bf Find} new groups and process them.\\ - N & Go to the {\bf next} group. [distance]\\ - P & Go to the {\bf previous} group. [distance]\\ - Q & {\bf Quit} Gnus without saving any startup (.newsrc) files.\\ - R & {\bf Restart} Gnus.\\ - Z & Clear the dribble buffer.\\ - M-c & Clear data from group (marks and list of read articles). \\ - C-c C-s & {\bf Sort} the groups by name, number of unread articles, or level - (depending on `gnus-group-sort-function').\\ - C-c C-x & Run all expirable articles in this group through the {\bf expiry} - process.\\ - C-c M-C-x & Run all articles in all groups through the {\bf expiry} process.\\ - C-c M-g & Activate all {\bf groups}.\\ - C-c C-i & Gnus online-manual ({\bf info}).\\ - C-x C-t & {\bf Transpose} two groups.\\ - H f & Fetch this group's {\bf FAQ} (using ange-ftp).\\ - H v & (V) Display the Gnus {\bf version} number.\\ - H d & (C-c C-d) Show the {\bf description} of this group - [Prefix: re-read from server].\\ - M-d & {\bf Describe} all groups. [Prefix: re-read from server]\\ - \end{keys} - } - -\newcommand{\ListGroups}{% - {\esamepage - \begin{keys}{A M} - A d & List all groups whose names or {\bf descriptions} match a regexp.\\ - A k & (C-c C-l) List all {\bf killed} groups. - [Prefix: look at active-file from server]\\ - A l & List all groups on a specific level. - [Prefix: also list groups with no unread articles]\\ - A d & List all groups that have names or {\bf descriptions} matching - a regexp.\\ - A a & (C-c C-a) List all groups whose names match a regexp - ({\bf apropos}).\\ - A A & List the server's active-file.\\ - A M & List groups that {\bf match} a regexp.\\ - A m & List groups that {\bf match} a regexp and have unread articles. - [level]\\ - A s & (l) List all {\bf subscribed} groups with unread articles. - [level; 5 and lower is the default]\\ - A u & (L) List all groups (including read and {\bf unsubscribed}). - [level; 7 and lower is the default]\\ - A z & List all {\bf zombie} groups.\\ - \end{keys} - } - - \newcommand{\CreateEditGroups}{% - {\esamepage - The select methods are indicated in parentheses.\\* - \begin{keys}{G DEL} - G a & Make the Gnus list {\bf archive} group. (nndir over ange-ftp)\\ - G c & {\bf Customize} this group's parameters.\\ - G d & Make a {\bf directory} group (every file must be a posting and files - must have numeric names). (nndir)\\ - G D & Enter a {\bf directory} as a (temporary) group. - (nneething without recording articles read)\\ - G e & (M-e) {\bf Edit} this group's select method.\\ - G E & {\bf Edit} this group's info (select method, articles read, etc).\\ - G f & Make a group based on a {\bf file}. (nndoc)\\ - G h & Make the Gnus {\bf help} (documentation) group. (nndoc)\\ - G k & Make a {\bf kiboze} group. (nnkiboze)\\ - G m & {\bf Make} a new group.\\ - G p & Edit this group's {\bf parameters}.\\ - G r & Rename this group (does not work with read-only groups!).\\ - G u & Create one of the groups mentioned in gnus-{\bf useful}-groups.\\ - G v & Add this group to a {\bf virtual} group. [p/p]\\ - G V & Make a new empty {\bf virtual} group. (nnvirtual)\\ - G w & Create ephemeral group based on web-search. [Prefix: make solid group - instead]\\ - G DEL & {\bf Delete} group [Prefix: delete all articles as well].\\ - \end{keys} - You can also create mail-groups and read your mail with Gnus (very useful - if you are subscribed to mailing lists), using one of the methods - nnmbox, nnbabyl, nnml, nnmh, or nnfolder. Read about it in the online info - (C-c C-i g Reading Mail RET). - }} - - % TODO: - \newcommand{\SoupCommands}{% - \begin{keys}{G s w} - G s b & gnus-group-brew-soup: not documented.\\ - G s p & gnus-soup-pack-packet: not documented.\\ - G s r & nnsoup-pack-replies: not documented.\\ - G s s & gnus-soup-send-replies: not documented.\\ - G s w & gnus-soup-save-areas: not documented.\\ - \end{keys}} - - \newcommand{\MarkGroups}{% - \begin{keys}{M m} - M m & (\#) Set the process {\bf mark} on this group. [scope]\\ - M r & Mark all groups matching regular expression.\\ - M u & (M-\#) Remove the process mark from this group ({\bf unmark}). - [scope]\\ - M U & Remove the process mark from all groups (\textbf{umark all}).\\ - M w & Mark all groups in the current region.\\ - \end{keys}} - - \newcommand{\GroupTopicsGeneral}{% - {\esamepage - Topics are ``categories'' for groups. Press t in the group-buffer to - toggle gnus-topic-mode (C-c C-i g Group Topics RET). - \begin{keys}{C-c C-x} - T n & Prompt for topic {\bf name} and create it.\\ - T m & {\bf Move} the current group to some other topic [p/p].\\ - T j & {\bf Jump} to a topic.\\ - T c & {\bf Copy} the current group to some other topic [p/p].\\ - T D & Remove (not delete) the current group [p/p].\\ - T M & {\bf Move} all groups matching a regexp to a topic.\\ - T C & {\bf Copy} all groups matching a regexp to a topic.\\ - T H & Toggle {\bf hiding} of empty topics.\\ - T r & {\bf Rename} a topic.\\ - T DEL & Delete an empty topic.\\ - T \# & Mark all groups in the current topic with the process-mark.\\ - T M-\# & Remove the process-mark from all groups in the current topic.\\ - T TAB & (TAB) Indent current topic [Prefix: unindent].\\ - M-TAB & Unindent the current topic.\\ - RET & (SPC) Either unfold topic or enter group [level].\\ - C-c C-x & Expire all articles in current group or topic.\\ - C-k & {\bf Kill} a group or topic.\\ - C-y & {\bf Yank} a group or topic.\\ - A T & List active-file using {\bf topics}.\\ - G p & Edit topic-{\bf parameters}.\\ - \end{keys} - } - } - - \newcommand{\TopicSorting}{% - {\esamepage - \begin{keys}{T S m} - T S a & Sort {\bf alphabetically}.\\ - T S u & Sort by number of {\bf unread} articles.\\ - T S l & Sort by group {\bf level}.\\ - T S v & Sort by group score ({\bf value}).\\ - T S r & Sort by group {\bf rank}.\\ - T S m & Sort by {\bf method}.\\ - \end{keys} - } - } - - \newcommand{\SubscribeKillYankGroups}{% - {\esamepage - \begin{keys}{S C-k} - S k & (C-k) {\bf Kill} this group.\\ - S l & Set the {\bf level} of this group. [p/p]\\ - S s & (U) Prompt for a group and toggle its {\bf subscription}.\\ - S t & (u) {\bf Toggle} subscription to this group. [p/p]\\ - S w & (C-w) Kill all groups in the region.\\ - S y & (C-y) {\bf Yank} the last killed group.\\ - S z & Kill all {\bf zombie} groups.\\ - S C-k & Kill all groups on a certain level.\\ - \end{keys} - } - } - - \newcommand{\SummaryModeGeneral}{% - {\esamepage - \begin{keys}{M-RET} - SPC & (A SPC, A n) Select an article, scroll it one page, move to the - next one.\\ - DEL & (A DEL, A p, b) Scroll this article one page back. [distance]\\ - RET & Scroll this article one line forward. [distance]\\ - M-RET & Scroll this article one line backward. [distance]\\ - = & Expand the Summary window (fullsize). - [Prefix: shrink to display article window]\\ - % - \& & Execute a command on all articles whose header matches a regexp. - [Prefix: move backwards]\\ - M-\& & Execute a command on all articles having the process mark.\\ - % - M-n & (G M-n) Go to the {\bf next} summary line of an unread article. - [distance]\\ - M-p & (G M-p) Go to the {\bf previous} summary line of an unread article. - [distance]\\ - M-s & {\bf Search} through all subsequent articles for a regexp.\\ - M-r & Search through all previous articles for a regexp.\\ - % - A P & {\bf Postscript}-print current buffer.\\ - % - M-k & Edit this group's {\bf kill} file.\\ - M-K & Edit the general {\bf kill} file.\\ - % - C-t & Toggle {\bf truncation} of summary lines.\\ - Y g & Regenerate the summary-buffer.\\ - Y c & Insert all cached articles into the summary-buffer.\\ - % - M-C-e & {\bf Edit} the group-parameters.\\ - M-C-g & Customize the group-parameters.\\ - % - % article handling - % - A $<$ & ($<$, A b) Scroll to the beginning of this article.\\ - A $>$ & ($>$, A e) Scroll to the end of this article.\\ - A s & (s) Perform an i{\bf search} in the article buffer.\\ - % - A D & (C-d) Un{\bf digestify} this article into a separate group. - [Prefix: force digest]\\ - M-C-d & Like C-d, but open several documents in nndoc-groups, wrapped - in an nnvirtual group [p/p]\\ - % - A g & (g) (Re)fetch this article ({\bf get}). [Prefix: get raw version]\\ - A r & (\^{}, A \^{}) Fetch the parent(s) of this article. - [Prefix: if positive fetch \textit{n} ancestors; - negative: fetch only the \textit{n}th ancestor]\\ - A t & {\bf Translate} this article.\\ - A R & Fetch all articles mentioned in the {\bf References}-header.\\ - A T & Fetch full \textbf{thread} in which the current article appears.\\ - M-\^{} & Fetch the article with a given Message-ID.\\ - S y & {\bf Yank} the current article into an existing message-buffer. - [p/p]\\ - \end{keys} - } - } - - \newcommand{\MIMESummary}{% - {\esamepage - For the commands operating on one MIME part (a subset of gnus-article-*), a - prefix selects which part to operate on. If the point is placed over a - MIME button in the article buffer, use the corresponding bindings for the - article buffer instead. - \begin{keys}{W M w} - K v & (b) {\bf View} the MIME-part.\\ - K o & {\bf Save} the MIME part.\\ - K c & {\bf Copy} the MIME part.\\ - K e & View the MIME part {\bf externally}.\\ - K i & View the MIME part {\bf internally}.\\ - K $\mid$ & Pipe the MIME part to an external command.\\ - K b & Make all the MIME parts have buttons in front of them.\\ - K m & Try to repair {\bf multipart-headers}.\\ - X m & Save all parts matching a MIME type to a directory. [p/p]\\ - M-t & Toggle the buttonized display of the article buffer.\\ - W M w & Decode RFC2047-encoded words in the article headers.\\ - W M c & Decode encoded article bodies. [Prefix: prompt for charset]\\ - W M v & View all MIME parts in the current article.\\ - \end{keys} - } - } - - \newcommand{\SortSummary}{% - {\esamepage - \begin{keys}{C-c C-s C-a} - C-c C-s C-a & Sort the summary-buffer by {\bf author}.\\ - C-c C-s C-d & Sort the summary-buffer by {\bf date}.\\ - C-c C-s C-i & Sort the summary-buffer by article score.\\ - C-c C-s C-l & Sort the summary-buffer by amount of lines.\\ - C-c C-s C-c & Sort the summary-buffer by length.\\ - C-c C-s C-n & Sort the summary-buffer by article {\bf number}.\\ - C-c C-s C-s & Sort the summary-buffer by {\bf subject}.\\ - \end{keys} - } - } - - \newcommand{\MailGroups}{% formerly \Bsubmap - {\esamepage - These commands (except `B c') are only valid in a mail group.\\* - \begin{keys}{B M-C-e} - B DEL & (B backspace, B delete) {\bf Delete} the mail article from disk (!). - [p/p]\\ - B B & Crosspost this article to another group.\\ - B c & {\bf Copy} this article from any group to a mail group. [p/p]\\ - B e & {\bf Expire} all expirable articles in this group. [p/p]\\ - B i & {\bf Import} a random file into this group.\\ - B m & {\bf Move} the article from one mail group to another. [p/p]\\ - B p & Query whether the article was posted as well.\\ - B q & {\bf Query} where the article will end up after fancy splitting\\ - B r & {\bf Respool} this mail article. [p/p]\\ - B t & {\bf Trace} the fancy splitting patterns applied to this article.\\ - B w & (e) Edit this article.\\ - B M-C-e & {\bf Expunge} (delete from disk) all expirable articles in this group - (!). [p/p]\\ - \end{keys} - } - } - - \newcommand{\DraftGroup}{% formerly \Dsubmap - {\esamepage - The ``drafts''-group contains messages that have been saved but not sent - and rejected articles. \\* - \begin{keys}{B DEL} - D e & \textbf{edit} message.\\ - D s & \textbf{Send} message. [p/p]\\ - D S & \textbf{Send} all messages.\\ - D t & \textbf{Toggle} sending (mark as unsendable).\\ - B DEL & \textbf{Delete} message (like in mailgroup).\\ - \end{keys} - } - } - - \newcommand{\SelectArticles}{% formerly \Gsubmap - {\esamepage - These commands select the target article. They do not understand the prefix.\\* - \begin{keys}{G C-n} - h & Enter article-buffer.\\ - G b & (,) Go to the {\bf best} article (the one with highest score).\\ - G f & (.) Go to the {\bf first} unread article.\\ - G n & (n) Go to the {\bf next} unread article.\\ - G p & (p) Go to the {\bf previous} unread article.\\ - % - G N & (N) Go to {\bf the} next article.\\ - G P & (P) Go to the {\bf previous} article.\\ - % - G C-n & (M-C-n) Go to the {\bf next} article with the same subject.\\ - G C-p & (M-C-p) Go to the {\bf previous} article with the same subject.\\ - % - G l & (l) Go to the previously read article ({\bf last-read-article}).\\ - G o & Pop an article off the summary history and go to it.\\ - % - G g & Search an article via subject.\\ - G j & (j) Search an article via Message-Id or subject.\\ - \end{keys} - } - } - - \newcommand{\ArticleModeGeneral}{% - {\esamepage - The normal navigation keys work in Article mode. Some additional keys are:\\* - \begin{keys}{C-c RET} - C-c \^{} & Get the article with the Message-ID near point.\\ - C-c RET & Send reply to address near point.\\ - h & Go to the \textbf{header}-line of the article in the - summary-buffer.\\ - s & Go to \textbf{summary}-buffer.\\ - RET & (middle mouse button) Activate the button at point to follow - an URL or Message-ID.\\ - TAB & Move the point to the next button.\\ - M-TAB & Move point to previous button.\\ - \end{keys} - } - } - - \newcommand{\WashArticle}{% formerly \Wsubmap - {\esamepage - \begin{keys}{W W H} - W b & Make Message-IDs and URLs in the article mouse-clickable - {\bf buttons}.\\ - W l & (w) Remove page breaks ({\bf\^{}L}) from the article.\\ - W c & Translate CRLF-pairs to LF and then the remaining CR's to LF's.\\ - W d & Treat {\bf dumbquotes}.\\ - W f & Look for and display any X-{\bf Face} headers.\\ - W m & Toggle {\bf MIME} processing.\\ - W o & Treat {\bf overstrike} or underline (\^{}H\_) in the article.\\ - W q & Treat {\bf quoted}-printable in the article.\\ - W r & (C-c C-r) Do a Caesar {\bf rotate} (rot13) on the article.\\ - W t & (t) {\bf Toggle} display of all headers.\\ - W v & (v) Toggle permanent {\bf verbose} displaying of all headers.\\ - W w & Do word {\bf wrap} in the article.\\ - W B & Add clickable {\bf buttons} to the article headers.\\ - W C & {\bf Capitalize} first word in each sentence.\\ - W Q & Fill long lines.\\ - % - W W H & Strip certain {\bf headers} from body.\\ - % - W E l & Strip blank {\bf lines} from the beginning of the article.\\ - W E m & Replace blank lines with empty lines and remove {\bf multiple} - blank lines.\\ - W E t & Remove {\bf trailing} blank lines.\\ - W E a & Strip blank lines at the beginning and the end - (W E l, W E m and W E t).\\ - W E A & Strip {\bf all} blank lines.\\ - W E s & Strip leading blank lines from the article body.\\ - W E e & Strip trailing blank lines from the article body.\\ - % - W T u & (W T z) Display the article timestamp in GMT ({\bf UT, ZULU}).\\ - W T i & Display the article timestamp in {\bf ISO} 8601.\\ - W T l & Display the article timestamp in the {\bf local} timezone.\\ - W T s & Display according to `gnus-article-time-format'.\\ - W T e & Display the time {\bf elapsed} since it was sent.\\ - W T o & Display the {\bf original} timestamp.\\ - \end{keys} - } - } - - \newcommand{\HideHighlightArticle}{% - {\esamepage - \begin{keys}{W W C-c} - W W a & Hide {\bf all} unwanted parts. Calls W W h, W W s, W W C-c.\\ - W W h & Hide article {\bf headers}.\\ - W W b & Hide {\bf boring} headers.\\ - W W s & Hide {\bf signature}.\\ - W W l & Hide {\bf list} identifiers in subject-header.\\ - W W p & Hide {\bf PGP}-signatures.\\ - W W P & Hide {\bf PEM} (privacy enhanced messages).\\ - W W B & Hide banner specified by group parameter.\\ - W W c & Hide {\bf citation}.\\ - W W C-c & Hide {\bf citation} using a more intelligent algorithm.\\ - W W C & Hide cited text in articles that aren't roots.\\ - % - W e & {\bf Emphasize} article.\\ - % - W H a & Highlight {\bf all} parts. Calls W b, W H c, W H h, W H s.\\ - W H c & Highlight article {\bf citations}.\\ - W H h & Highlight article {\bf headers}.\\ - W H s & Highlight article {\bf signature}.\\ - \end{keys} - For all hiding-commands: A positive prefix always hides, and a negative - prefix will show what was previously hidden. - }} - - \newcommand{\MIMEArticleMode}{% - {\esamepage - \begin{keys}{M-RET} - RET & (BUTTON-2) Toggle display of the MIME object.\\ - v & (M-RET) Prompt for a method and then view object using this method.\\ - o & Prompt for a filename and save the MIME object.\\ - c & {\bf Copy} the MIME object to a new buffer and display this buffer.\\ - t & View the MIME object as a different {\bf type}.\\ - $\mid$ & Pipe the MIME object to a process.\\ - \end{keys} - } - } - - %% end of article mode for reading .......................................... - - \newcommand{\MarkArticlesGeneral}{% formerly \Msubmap - {\esamepage - \begin{keys}{M M-C-r} - d & (M d, M r) Mark this article as read and move to the next one. - [scope]\\ - D & Mark this article as read and move to the previous one. [scope]\\ - ! & (u, M !, M t) Tick this article (mark it as interesting) and move - to the next one. [scope]\\ - U & Tick this article and move to the previous one. [scope]\\ - M ? & (?) Mark this article as dormant (only followups are - interesting). [scope]\\ - M D & Show all {\bf dormant} articles (normally they are hidden unless they - have any followups).\\ - M M-D & Hide all {\bf dormant} articles.\\ - C-w & Mark all articles between point and mark as read.\\ - M-u & (M SPC, M c) Clear all marks from this article and move to the next - one. [scope]\\ - M-U & Clear all marks from this article and move to the previous one. - [scope]\\ - % - M e & (E, M x) Mark this article as {\bf expirable}. [scope]\\ - % - M k & (k) {\bf Kill} all articles with the same subject then select the - next unread one.\\ - M K & (C-k) {\bf Kill} all articles with the same subject as this one.\\ - % - M C & {\bf Catch-up} the articles that are not ticked and not dormant.\\ - M C-c & {\bf Catch-up} all articles in this group.\\ - M H & {\bf Catch-up} (mark read) this group to point (to-{\bf here}).\\ - % - M b & Set a {\bf bookmark} in this article.\\ - M B & Remove the {\bf bookmark} from this article.\\ - % - M M-r & (x) Expunge all {\bf read} articles from this group.\\ - M M-C-r & Expunge all articles having a given mark.\\ - M S & (C-c M-C-s) {\bf Show} all expunged articles.\\ - M M C-h & Displays some more keys doing ticking slightly differently.\\ - \end{keys} - The variable `gnus-summary-goto-unread' controls what happens after a mark - has been set (C-x C-i g Setting Marks RET) - }} - - \newcommand{\MarkByScore}{% - \begin{keys}{M V m} - M V c & {\bf Clear} all marks from all high-scored articles. [score]\\ - M V k & {\bf Kill} all low-scored articles. [score]\\ - M V m & Mark all high-scored articles with a given {\bf mark}. [score]\\ - M V u & Mark all high-scored articles as interesting (tick them). [score]\\ - \end{keys} - } - } - -\newcommand{\ProcessMark}{% - {\esamepage - These commands set and remove the process mark (\#). You only need to use - it if the set of articles you want to operate on is non-contiguous. Else - use a numeric prefix.\\* - \begin{keys}{M P R} - M P p & (\#, M \#) Mark this article.\\ - M P u & (M-\#, M M-\#) \textbf{unmark} this article.\\ - M P b & Mark all articles in {\bf buffer}.\\ - M P r & Mark all articles in the {\bf region}.\\ - M P R & Mark all articles matching a {\bf regexp}.\\ - M P t & Mark all articles in this (sub){\bf thread}.\\ - M P s & Mark all articles in the current {\bf series}.\\ - M P S & Mark all {\bf series} that already contain a marked article.\\ - M P a & Mark {\bf all} articles (in series order).\\ - M P U & \textbf{unmark} all articles.\\ - % - M P i & {\bf Invert} the list of process-marked articles.\\ - M P k & Push the current process-mark set onto stack and unmark - all articles.\\ - M P y & Pop process-mark set from stack and restore it.\\ - \end{keys} - } - } - -\newcommand{\Limiting}{% - {\esamepage - \begin{keys}{/M} - // & (/s) Limit the summary-buffer to articles matching {\bf subject}.\\ - /a & Limit the summary-buffer to articles matching {\bf author}.\\ - /x & Limit depending on ``extra'' headers.\\ - /u & (x) Limit to {\bf unread} articles. - [Prefix: also exclude ticked and dormant articles]\\ - /m & Limit to articles marked with specified {\bf mark}.\\ - /t & Ask for a number and exclude articles younger than that many days. - [Prefix: exclude older articles]\\ - /n & Limit to current article. [p/p]\\ - /w & Pop the previous limit off the stack and restore it. - [Prefix: pop all limits]\\ - /v & Limit to score. [score]\\ - /E & (M S) Include all expunged articles in the limit.\\ - /D & Include all dormant articles in the limit.\\ - /* & Include all cached articles in the limit.\\ - /d & Exclude all dormant articles from the limit.\\ - /M & Exclude all marked articles.\\ - /T & Include all articles from the current thread in the limit.\\ - /c & Exclude all dormant articles that have no children from the limit.\\ - /C & Mark all excluded unread articles as read. - [Prefix: also mark ticked and dormant articles]\\ - \end{keys} - } - } - -\newcommand{\OutputArticles}{% formerly \Osubmap - {\esamepage - \begin{keys}{O m} - O o & (o, C-o) Save this article using the default article saver. [p/p]\\ - O b & Save this article's {\bf body} in plain file format [p/p]\\ - O f & Save this article in plain {\bf file} format. [p/p]\\ - O F & like O f, but overwrite file's contents. [p/p]\\ - O h & Save this article in {\bf mh} folder format. [p/p]\\ - O m & Save this article in {\bf mail} format. [p/p]\\ - O r & Save this article in {\bf rmail} format. [p/p]\\ - O v & Save this article in {\bf vm} format. [p/p]\\ - O p & ($\mid$) Pipe this article to a shell command. [p/p]\\ - \end{keys} - } - } - -\newcommand{\PostReplyetc}{% formerly \Ssubmap - {\esamepage - These commands put you in a separate news or mail buffer. See the section - about composing messages for more information. - %After - %editing the article, send it by pressing C-c C-c. If you are in a - %foreign group and want to post the article using the foreign server, give - %a prefix to C-c C-c.\\* - \begin{keys}{S O m} - S p & (a) {\bf Post} an article to this group.\\ - S f & (f) Post a {\bf followup} to this article.\\ - S F & (F) Post a {\bf followup} and include the original. [p/p]\\ - S o p & Forward this article as a {\bf post} to a newsgroup. - [Prefix: include all headers]\\ - S M-c & Send a complaint about excessive crossposting to the author of this - article. [p/p]\\ - % - S m & (m) Send {\bf a} mail to some other person.\\ - S r & (r) Mail a {\bf reply} to the author of this article.\\ - S R & (R) Mail a {\bf reply} and include the original. [p/p]\\ - S w & Mail a {\bf wide} reply to this article.\\ - S W & Mail a {\bf wide} reply to this article.\\ - S o m & (C-c C-f) Forward this article by {\bf mail} to a person. - [Prefix: include all headers]\\ - S D b & Resend {\bf bounced} mail.\\ - S D r & {\bf Resend} mail to a different person.\\ - % - S n & Post a followup via {\bf news} even if you got the message - through mail.\\ - S N & Post a followup via {\bf news} and include the original mail. - [p/p]\\ - % - S c & (C) {\bf Cancel} this article (only works if it is your own).\\ - S s & {\bf Supersede} this article with a new one (only for own - articles).\\ - % - S O m & Digest these series and forward by {\bf mail}. [p/p]\\ - S O p & Digest these series and forward as a {\bf post} to a newsgroup. - [p/p]\\ - % - S u & {\bf Uuencode} a file and post it as a series.\\ - \end{keys} - If you want to cancel or supersede an article you just posted (before it - has appeared on the server), go to the *post-news* buffer, change - `Message-ID' to `Cancel' or `Supersedes' and send it again with C-c C-c. - }} - -\newcommand{\Threading}{% formerly \Tsubmap - {\esamepage - \begin{keys}{T M-\#} - T \# & Mark this thread with the process mark.\\ - T M-\# & Remove process-marks from this thread.\\ - % - T t & Re-{\bf thread} the current article's thread.\\ - % movement - T n & (M-C-f) Go to the {\bf next} thread. [distance]\\ - T p & (M-C-b) Go to the {\bf previous} thread. [distance]\\ - T d & {\bf Descend} this thread. [distance]\\ - T u & Ascend this thread ({\bf up}-thread). [distance]\\ - T o & Go to the top of this thread.\\ - % - T s & {\bf Show} the thread hidden under this article.\\ - T h & {\bf Hide} this (sub)thread.\\ - % - T i & {\bf Increase} the score of this thread.\\ - T l & (M-C-l) {\bf Lower} the score of this thread.\\ - % - T k & (M-C-k) {\bf Kill} the current (sub)thread. [Negative prefix: - tick it, positive prefix: unmark it.]\\ - % - T H & {\bf Hide} all threads.\\ - T S & {\bf Show} all hidden threads.\\ - T T & (M-C-t) {\bf Toggle} threading.\\ - \end{keys} - } - } - -\newcommand{\Scoring}{% formerly \Vsubmap - {\esamepage - Read about Adaptive Scoring in the online info.\\* - \begin{keys}{\bf A p m l} - V a & {\bf Add} a new score entry, specifying all elements.\\ - V c & Specify a new score file as {\bf current}.\\ - V e & {\bf Edit} the current score alist.\\ - V f & Edit a score {\bf file} and make it the current one.\\ - V m & {\bf Mark} all articles below a given score as read.\\ - V s & Set the {\bf score} of this article.\\ - V t & Display all score rules applied to this article ({\bf track}).\\ - V x & {\bf Expunge} all low-scored articles. [score]\\ - V C & {\bf Customize} the current score file through a user-friendly - interface.\\ - V S & Display the {\bf score} of this article.\\ - \bf A p m l& Make a scoring entry based on this article.\\ - \end{keys} - The four letters stand for:\\* - \quad \B{A}ction: I)ncrease, L)ower;\\* - \quad \B{p}art: a)utor (from), s)ubject, x)refs (cross-posting), d)ate, l)ines, - message-i)d, t)references (parent), f)ollowup, b)ody, h)ead (all headers);\\* - \quad \B{m}atch type:\\* - \qquad string: s)ubstring, e)xact, r)egexp, f)uzzy,\\* - \qquad date: b)efore, a)t, n)this,\\* - \qquad number: $<$, =, $>$;\\* - \quad \B{l}ifetime: t)emporary, p)ermanent, i)mmediate. - - If you type the second letter in uppercase, the remaining two are assumed - to be s)ubstring and t)emporary. - If you type the third letter in uppercase, the last one is assumed to be - t)emporary. - - \quad Extra keys for manual editing of a score file:\\* - \begin{keys}{C-c C-c} - C-c C-c & Finish editing the score file.\\ - C-c C-d & Insert the current {\bf date} as number of days.\\ - \end{keys} - } - } - -\newcommand{\ExtractSeries}{% formerly \Xsubmap - {\esamepage - Gnus recognizes if the current article is part of a series (multipart - posting whose parts are identified by numbers in their subjects, e.g.{} - 1/10\dots10/10) and processes the series accordingly. You can mark and - process more than one series at a time. If the posting contains any - archives, they are expanded and gathered in a new group.\\* - \begin{keys}{X p} - X b & Un-{\bf binhex} these series. [p/p]\\ - X o & Simply {\bf output} these series (no decoding). [p/p]\\ - X p & Unpack these {\bf postscript} series. [p/p]\\ - X s & Un-{\bf shar} these series. [p/p]\\ - X u & {\bf Uudecode} these series. [p/p]\\ - \end{keys} - - Each one of these commands has four variants:\\* - \begin{keys}{X v \bf Z} - X \bf z & Decode these series. [p/p]\\ - X \bf Z & Decode and save these series. [p/p]\\ - X v \bf z & Decode and view these series. [p/p]\\ - X v \bf Z & Decode, save and view these series. [p/p]\\ - \end{keys} - where {\bf z} or {\bf Z} identifies the decoding method (b, o, p, s, u). - - An alternative binding for the most-often used of these commands is\\* - \begin{keys}{C-c C-v C-v} - C-c C-v C-v & (X v u) Uudecode and view these series. [p/p]\\ - \end{keys} - }} - -\newcommand{\ExitSummary}{% formerly \Zsubmap - {\esamepage - \begin{keys}{Z G} - Z Z & (q, Z Q) Exit this group.\\ - Z E & (Q) {\bf Exit} without updating the group information.\\ - % - Z c & (c) Mark all unticked articles as read ({\bf catch-up}) and exit.\\ - Z C & Mark all articles as read ({\bf catch-up}) and exit.\\ - % - Z n & Mark all articles as read and go to the {\bf next} group.\\ - Z N & Exit and go to {\bf the} next group.\\ - Z P & Exit and go to the {\bf previous} group.\\ - % - Z G & (M-g) Check for new articles in this group ({\bf get}).\\ - Z R & Exit this group, and then enter it again ({\bf reenter}). - [Prefix: select all articles, read and unread.]\\ - Z s & Update and save the dribble buffer. [Prefix: save .newsrc* as well]\\ - \end{keys} - } - } - -\newcommand{\MsgCompositionGeneral}{% - Press C-c ? in the composition-buffer to get this information. - {\esamepage - \begin{keys}{C-c C-m} - % sending - C-c C-c & Send message and exit. [Prefix: send via foreign server]\\ - C-c C-s & Send message. [Prefix: send via foreign server]\\ - C-c C-d & Don't send message (save as \textbf{draft}).\\ - C-c C-k & \textbf{Kill} message-buffer.\\ - C-c C-m & {\bf Mail} reply to the address near point. - [Prefix: include the original]\\ - % modify headers/body - C-c C-t & Paste the recipient's address into \textbf{To:}-field.\\ - C-c C-n & Insert a \textbf{Newsgroups:}-header.\\ - C-c C-o & Sort headers.\\ - C-c C-e & \textbf{Elide} region.\\ - C-c C-v & Kill everything outside region.\\ - C-c C-r & Do a \textbf{Rot-13} on the body.\\ - C-c C-w & Insert signature (from `message-signature-file').\\ - C-c C-z & Kill everything up to signature.\\ - C-c C-y & \textbf{Yank} original message.\\ - C-c C-q & Fill the yanked message.\\ - \end{keys} - } - } - -\newcommand{\MsgCompositionMovementArticle}{% - The following functions create the header-field if necessary. - {\esamepage - \begin{keys}{C-c C-f C-u} - C-c TAB & Move to \textbf{signature}.\\ - C-c C-b & Move to \textbf{body}.\\ - C-c C-f C-t & Move to \textbf{To:}.\\ - C-c C-f C-c & Move to \textbf{Cc:}.\\ - C-c C-f C-b & Move to \textbf{Bcc:}.\\ - C-c C-f C-w & Move to \textbf{Fcc:}.\\ - C-c C-f C-s & Move to \textbf{Subject:}.\\ - C-c C-f C-r & Move to \textbf{Reply-To:}.\\ - C-c C-f C-f & Move to \textbf{Followup-To:}.\\ - C-c C-f C-n & Move to \textbf{Newsgroups:}.\\ - C-c C-f C-u & Move to \textbf{Summary:}.\\ - C-c C-f C-k & Move to \textbf{Keywords:}.\\ - C-c C-f C-d & Move to \textbf{Distribution:}.\\ - \end{keys} - } - } - -\newcommand{\MsgCompositionMML}{% - {\esamepage - \begin{keys}{M-m P} - M-m f & (C-c C-a) Attach \textbf{file}.\\ - M-m b & Attach contents of \textbf{buffer}.\\ - M-m e & Attach \textbf{external} file (ftp..).\\ - M-m P & Create MIME-\textbf{preview} (new buffer).\\ - M-m v & \textbf{Validate} article.\\ - M-m p & Insert \textbf{part}.\\ - M-m m & Insert \textbf{multi}-part.\\ - M-m q & \textbf{Quote} region.\\ - % TODO: narrow headers (M-m n) ? - \end{keys} - } - } - -%% TODO: -\newcommand{\ServerMode}{% - {\esamepage - To enter this mode, press `\^' while in Group mode.\\* - \begin{keys}{SPC} - SPC & (RET) Browse this server.\\ - a & {\bf Add} a new server.\\ - c & {\bf Copy} this server.\\ - e & {\bf Edit} a server.\\ - k & {\bf Kill} this server. [scope]\\ - l & {\bf List} all servers.\\ - q & Return to the group buffer ({\bf quit}).\\ - s & Request that the server scan its sources for new articles.\\ - g & Request that the server regenerate its data.\\ - y & {\bf Yank} the previously killed server.\\ - \end{keys} - } - } - -\newcommand{\BrowseServer}{% - {\esamepage - To enter this mode, press `B' while in Group mode.\\* - \begin{keys}{RET} - RET & Enter the current group.\\ - SPC & Enter the current group and display the first article.\\ - ? & Give a very short help message.\\ - n & Go to the {\bf next} group. [distance]\\ - p & Go to the {\bf previous} group. [distance]\\ - q & (l) {\bf Quit} browse mode.\\ - u & Subscribe to the current group. [scope]\\ - \end{keys} - } - } - -\newcommand{\GroupUnplugged}{% - {\esamepage - \begin{keys}{J S} - J j & Toggle plugged-state.\\ - J s & Fetch articles from current group.\\ - J s & Fetch articles from all groups for offline-reading.\\ - J S & \textbf{Send} all sendable messages in the drafts group.\\ - % - J c & Enter \textbf{category} buffer.\\ - J a & \textbf{Add} this group to an Agent category [p/p].\\ - J r & \textbf{Remove} this group from its Agent category [p/p].\\ - \end{keys} - } - } - -\newcommand{\SummaryUnplugged}{% - {\esamepage - \begin{keys}{J M-\#} - J \# & \textbf{Mark} the article for downloading.\\ - J M-\# & \textbf{Unmark} the article for downloading.\\ - @ & \textbf{Toggle} whether to download the article.\\ - J c & Mark all undownloaded articles as read (\textbf{catch-up}).\\ - \end{keys} - } - } - -\newcommand{\ServerUnplugged}{% - {\esamepage - \begin{keys}{J a} - J a & \textbf{Add} the current server to the list of servers covered - by the agent.\\ - J r & \textbf{Remove} the current server from the list of servers covered - by the agent.\\ - \end{keys} - } - } diff --git a/texi/infohack.el b/texi/infohack.el deleted file mode 100644 index f487f9e..0000000 --- a/texi/infohack.el +++ /dev/null @@ -1,146 +0,0 @@ -;;; infohack.el --- a hack to format info file. -;; Copyright (C) 2001 Free Software Foundation, Inc. - -;; Author: Shenghuo Zhu -;; Keywords: info - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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. - -;; GNU Emacs 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. - -;;; Commentary: - -;;; Code: - -(require 'texinfmt) - -(defun infohack-remove-unsupported () - (goto-char (point-min)) - (while (re-search-forward "@\\(end \\)?ifnottex" nil t) - (replace-match ""))) - -(defun infohack (file) - (let ((dest-directory default-directory) - (max-lisp-eval-depth (max max-lisp-eval-depth 600))) - (find-file file) - (infohack-remove-unsupported) - (texinfo-every-node-update) - (texinfo-format-buffer t) ;; Don't save any file. - (setq default-directory dest-directory) - (setq buffer-file-name - (expand-file-name (file-name-nondirectory buffer-file-name) - default-directory)) - (if (> (buffer-size) 100000) - (Info-split)) - (save-buffer))) - -(defun batch-makeinfo () - "Emacs makeinfo in batch mode." - (infohack-texi-format (car command-line-args-left) - (car (cdr command-line-args-left))) - (setq command-line-args-left nil)) - - -(let ((default-directory (expand-file-name "../lisp/")) - (features (cons 'w3-forms (copy-sequence features)))) - ;; Adjust `load-path' for APEL. - (load-file "dgnushack.el")) -(load-file (expand-file-name "ptexinfmt.el" "./")) - -(defun infohack-texi-format (file &optional addsuffix) - (let ((auto-save-default nil) - (find-file-run-dired nil) - coding-system-for-write - output-coding-system - (error 0)) - (condition-case err - (progn - (find-file file) - (buffer-disable-undo (current-buffer)) - (if (boundp 'MULE) - (setq output-coding-system file-coding-system) - (setq coding-system-for-write buffer-file-coding-system)) - ;; Remove ignored areas first. - (while (re-search-forward "^@ignore[\t\r ]*$" nil t) - (delete-region (match-beginning 0) - (if (re-search-forward - "^@end[\t ]+ignore[\t\r ]*$" nil t) - (1+ (match-end 0)) - (point-max)))) - (infohack-remove-unsupported) - (goto-char (point-min)) - ;; Add suffix if it is needed. - (when (and addsuffix - (re-search-forward "^@setfilename[\t ]+\\([^\t\n ]+\\)" - nil t) - (not (string-match "\\.info$" (match-string 1)))) - (insert ".info") - (goto-char (point-min))) - ;; process @include before updating node - ;; This might produce some problem if we use @lowersection or - ;; such. - (let ((input-directory default-directory) - (texinfo-command-end)) - (while (re-search-forward "^@include" nil t) - (setq texinfo-command-end (point)) - (let ((filename (concat input-directory - (texinfo-parse-line-arg)))) - (re-search-backward "^@include") - (delete-region (point) (save-excursion - (forward-line 1) - (point))) - (message "Reading included file: %s" filename) - (save-excursion - (save-restriction - (narrow-to-region - (point) (+ (point) - (car (cdr (insert-file-contents filename))))) - (goto-char (point-min)) - ;; Remove `@setfilename' line from included file, - ;; if any, so @setfilename command not duplicated. - (if (re-search-forward "^@setfilename" - (save-excursion - (forward-line 100) - (point)) - t) - (progn - (beginning-of-line) - (delete-region (point) (save-excursion - (forward-line 1) - (point)))))))))) - (texinfo-mode) - (texinfo-every-node-update) - (set-buffer-modified-p nil) - (message "texinfo formatting %s..." file) - (texinfo-format-buffer nil) - (if (buffer-modified-p) - (progn (message "Saving modified %s" (buffer-file-name)) - (save-buffer)))) - (error - (message ">> Error: %s" (prin1-to-string err)) - (message ">> point at") - (let ((s (buffer-substring (point) (min (+ (point) 100) (point-max)))) - (tem 0)) - (while (setq tem (string-match "\n+" s tem)) - (setq s (concat (substring s 0 (match-beginning 0)) - "\n>> " - (substring s (match-end 0))) - tem (1+ tem))) - (message ">> %s" s)) - (setq error 1))) - (kill-emacs error))) - -;;; infohack.el ends here diff --git a/texi/message-ja.texi b/texi/message-ja.texi deleted file mode 100644 index 470f62d..0000000 --- a/texi/message-ja.texi +++ /dev/null @@ -1,1582 +0,0 @@ -\input texinfo @c -*- mode: texinfo; coding: iso-2022-7bit; -*- - -@setfilename message-ja -@settitle T-gnus 6.15 Message Manual -@synindex fn cp -@synindex vr cp -@synindex pg cp -@dircategory Emacs -@direntry -* Message-ja: (message-ja). Mail and news composition mode that goes - with Gnus (Japanese). -@end direntry -@iftex -@finalout -@end iftex -@setchapternewpage odd - -@ifnottex - -This file documents Message, the Emacs message composition mode. - -$B$3$N%U%!%$%k$O(B Emacs $B$N%a%C%;!<%8:n@.%b!<%I$G$"$k(B Message $B$K4X$9$k@bL@J8(B -$B=q$G$9!#(B - -Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc. - -Permission is granted to copy, distribute and/or modify this document -under the terms of the GNU Free Documentation License, Version 1.1 or -any later version published by the Free Software Foundation; with no -Invariant Sections, with the Front-Cover texts being ``A GNU -Manual'', and with the Back-Cover Texts as in (a) below. A copy of the -license is included in the section entitled ``GNU Free Documentation -License''. - -$B$3$NJ8=q$r!"%U%j!<%=%U%H%&%'%":bCDH/9T$N(B GNU $B%U%j!r7o$N2<$GJ#@=!"G[I[!"$"$k$$$OJQ99$9(B -$B$k$3$H$r5v2D$7$^$9!#JQ99IT2DItJ,$O;XDj$7$^$;$s!#!V(BA GNU Manual$B!W$OI=I=;f(B -$B%F%-%9%H!"0J2<$N(B (a) $B$ON"I=;f%F%-%9%H$G$9!#$3$NMxMQ5vBz7@Ls=q$NJ#O$K4^$^$l$F$$$^(B -$B$9!#(B - -(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify -this GNU Manual, like GNU software. Copies published by the Free -Software Foundation raise funds for GNU development.'' - -(a) FSF $B$NN"I=;f%F%-%9%H(B:$B!V$"$J$?$K$O$3$N(B GNU Manual $B$r(B GNU $B%=%U%H%&%'%"(B -$B$N$h$&$KJ#@=$7$?$jJQ99$9$k<+M3$,$"$j$^$9!#J#@=$O%U%j!<%=%U%H%&%'%":bCD$K(B -$B$h$C$F=PHG$5$l$^$7$?!#(B($B%U%j!<%=%U%H%&%'%":bCD$O(B) GNU $B$N3+H/$N$?$a$KI,MW(B -$B$J;q6b$r=8$a$F$$$^$9!#!W(B - -This document is part of a collection distributed under the GNU Free -Documentation License. If you want to distribute this document -separately from the collection, you can do so by adding a copy of the -license to the document, as described in section 6 of the license. - -$B$3$NJ8=q$O!V(BGNU $B%U%j!r7o$N2<$GJ#@=!"G[I[!"$"$k$$$OJQ99$9(B -$B$k$3$H$r5v2D$7$^$9!#JQ99IT2DItJ,$O;XDj$7$^$;$s!#!V(BA GNU Manual$B!W$OI=I=;f(B -$B%F%-%9%H!"0J2<$N(B (a) $B$ON"I=;f%F%-%9%H$G$9!#$3$NMxMQ5vBz7@Ls=q$NJ#O$K4^$^$l$F$$$^(B -$B$9!#(B - -(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify -this GNU Manual, like GNU software. Copies published by the Free -Software Foundation raise funds for GNU development.'' - -(a) FSF $B$NN"I=;f%F%-%9%H(B:$B!V$"$J$?$K$O$3$N(B GNU Manual $B$r(B GNU $B%=%U%H%&%'%"(B -$B$N$h$&$KJ#@=$7$?$jJQ99$9$k<+M3$,$"$j$^$9!#J#@=$O%U%j!<%=%U%H%&%'%":bCD$K(B -$B$h$C$F=PHG$5$l$^$7$?!#(B($B%U%j!<%=%U%H%&%'%":bCD$O(B) GNU $B$N3+H/$N$?$a$KI,MW(B -$B$J;q6b$r=8$a$F$$$^$9!#!W(B - -This document is part of a collection distributed under the GNU Free -Documentation License. If you want to distribute this document -separately from the collection, you can do so by adding a copy of the -license to the document, as described in section 6 of the license. - -$B$3$NJ8=q$O!V(BGNU $B%U%j!J}(B) $B$O%a%C%;!<%8%b!<(B -$B%I%P%C%U%!$G9T$o$l$^$9!#(B - -@menu -* Interface:: $B%a%C%;!<%8%P%C%U%!$r@_Dj$9$k(B -* Commands:: $B%a%C%;!<%8%b!<%I%P%C%U%!$GAw!"C$7(B -- $B$=$N%W%m%0%i%`(B ($B$b$7$/$O?M(B) $B$O%a%C%;!<%8$,$"$k%P%C(B -$B%U%!$K%]%$%s%H$rF~$l$FI,MW$JL?Na$r8F$S=P$9$@$1$GNI$$$Y$-$G$9!#$=$&$9$k(B -$B$H(B @code{Message} $B$O?7$7$$(B @code{message} $B%b!<%I%P%C%U%!$rE,@Z$J%X%C%@!<(B -$B$rF~$l$F:n$j=P$7!"MxMQC$9(B -* Superseding:: $B%a%C%;!<%8$NBeBX(B -* Forwarding:: $B%a%C%;!<%8$r%K%e!<%9$b$7$/$O%a!<%k$GE>Aw$9$k(B -* Resending:: $B%a!<%k%a%C%;!<%8$r:FAw$9$k(B -* Bouncing:: $B%a!<%k%a%C%;!<%8$N<:GT$r:FAw$9$k(B -@end menu - -@node New Mail Message -@section $B?7$7$$%a!<%k%a%C%;!<%8(B - -@findex message-mail -@code{message-mail} $BL?Na$O?7$7$$%P%C%U%!$r:n$jI=<($7$^$9!#(B - -2$B$D$NA*Br<+M3$J0z?t$,l9g$O!"$=$l$>$l$NMWAG(B -$B$O(B cons $B%;%k$G$"$k$Y$-$G!"$=$l$N(B car $B$O%X%C%@!<$NL>A0(B ($BNc(B @code{Cc}) $B$G!"(B -cdr $B$,%X%C%@!<$NCM(B ($BNc(B @samp{larsi@@ifi.uio.no}) $B$G$"$k$Y$-$G$9!#A4$F$N(B -$B$3$l$i$N%X%C%@!<$O=P$F9T$/%a!<%k$N%X%C%@!<$KA^F~$5$l$^$9!#(B - -@node Wide Reply -@section $B9-$/JVEz(B - -@findex message-wide-reply -@code{message-wide-reply} $B$O8=:_$N%P%C%U%!$N%a%C%;!<%8$X$N9-$$JVEz$N%a%C(B -$B%;!<%8%P%C%U%!$r:n$C$FI=<($7$^$9!#(B@dfn{$B9-$$JVEz(B} $B$O(B @code{To}$B!"(B -@code{From}$B!"(B($B$b$7$/$O(B @code{Reply-to}) $B$H(B @code{Cc} $B%X%C%@!<$K5s$2$i$l(B -$B$F$$$kA4$F$N?M!9$KFO$/JVEz$G$9!#(B - -@vindex message-wide-reply-to-function -Message $B$OJVEz$,2?=h$K9T$/$+$r7hDj$9$k$?$a$KIaDL$NJ}K!$r;H$$$^$9$,!"(B -@code{message-wide-reply} $B$rO.$k;v$G!"?6$kIq$$$r$"$J$?$NMW5a$K9g$&$h$&$K(B -$BJQ99$9$k;v$,$G$-$^$9!#$=$l$O(B @code{message-reply-to-function} $B$HF1$8$h$&(B -$B$K;H$o$l$^$9(B (@pxref{Reply})$B!#(B - -@findex message-dont-reply-to-names -$B@55,I=8=(B @code{rmail-dont-reply-to-names} $B$K9gCW$9$k%"%I%l%9$O(B @code{Cc} -$B%X%C%@!<$+$iC$9(B - -@findex message-cancel-news -$BL?Na(B @code{message-cancel-news} $B$O8=:_$N%P%C%U%!$N5-;v$rC$7$^$9!#(B - -@node Superseding -@section $BBeBX(B - -@findex message-supersede -$BL?Na(B @code{message-supersede} $B$O8=:_$N%P%C%U%!$N%a%C%;!<%8$rBeBX$9$k%a%C(B -$B%;!<%8%P%C%U%!$r:n$jI=<($7$^$9!#(B - -@vindex message-ignored-supersede-headers -@code{message-ignored-supersedes-headers} $B$K9gCW$9$k%X%C%@!<$O?7$7$$%a%C(B -$B%;!<%8%P%C%U%!$r:n$j>e$2$kA0$KAw(B - -@findex message-forward -$BL?Na(B @code{message-forward} $B$O8=:_$N%P%C%U%!$N%a%C%;!<%8$rE>Aw$9$k$?$a$N(B -$B%a%C%;!<%8%P%C%U%!$r:n$jI=<($7$^$9!#$b$7@\F,0z?t$rM?$($i$l$k$H!"E>Aw$O(B -$B%K%e!<%9$r;H$$$^$9!#(B - -@table @code -@item message-forward-ignored-headers -@vindex message-forward-ignored-headers -$B$3$N@55,I=8=$K9gCW$9$k$9$Y$F$N%X%C%@!<$,!"E>Aw$5$l$k%a%C%;!<%8$+$i:o=|$5(B -$B$l$^$9!#(B - -@end table - -@node Resending -@section $B:FAw(B - -@findex message-resend -$BL?Na(B @code{message-resend} $B$OMxMQpJs$re$2$kA0$K$r;H$&$+(B -* Spelling:: Emacs $B$K%9%Z%k%A%'%C%/$5$;$k(B -@end menu - -@node Buffer Entry -@section $B%P%C%U%!$KF~$k(B -@cindex undo -@kindex C-_ - -$B2?$+B>$N%a%C%;!<%8$KJVEz$9$k$H$-!"$"$J$?$O$?$$$F$$%a%C%;!<%8%P%C%U%!$G=q(B -$B$->e$2$^$9$h$M!#(BMessage $B$OB?$/$N0zMQJ8$r07$$!"=pL>$N:o=|$dJ8>O$N@07A$r$7(B -$B$?$j!"$"$k$$$O$"$?$J$,;H$C$F$$$k@_Dj$K0MB8$7$F$$$^$9!#(BMessage $B$OIaDL$O$&(B -$B$^$/F0:n$7$^$9$,!"$H$-$I$-4V0c$($b$7$^$9!#$=$l$i$N4V0c$$$r%f!<%6$,@5$9$3(B -$B$H$,$G$-$k$h$&$K!"(BMessage $B$O$=$l$>$lo(B @kbd{C-_}) $B$r2!$;$P!"L$(B -$BJT=8$N%a%C%;!<%8$KLa$9$3$H$,$G$-$^$9!#(B - -@node Header Commands -@section $B%X%C%@!$K0\F0$7$^$9(B (@code{message-goto-signature})$B!#(B - -@end table - -@node Insertion -@section $BA^F~(B - -@table @kbd - -@item C-c C-y -@kindex C-c C-y -@findex message-yank-original -$B%P%C%U%!(B @code{gnus-article-copy} $B$K$"$k%a%C%;!<%8$r%a%C%;!<%8%P%C%U%!$K(B -$BE=$jIU$1$^$9!#IaDL$O(B @code{gnus-article-copy} $B$O$"$J$?$,JVEz$7$h$&$H$7$F(B -$B$$$k%a%C%;!<%8$G$9(B (@code{messsage-yank-original})$B!#(B - -@item C-c M-C-y -@kindex C-c M-C-y -@findex message-yank-buffer -Prompt for a buffer name and yank the contents of that buffer into the -message buffer (@code{message-yank-buffer}). - -@item C-c C-q -@kindex C-c C-q -@findex message-fill-yanked-message -$BE=$jIU$1$i$l$?%a%C%;!<%8$r@^$jJV$7$^(B -$B$9(B (@code{message-fill-yanked-message})$B!#7Y9p(B: $B$b$7!"0zMQ$N=,47$,JQ$G$"(B -$B$k$J$i!"E=$jIU$1$i$l$?J8>O$r$R$I$/$0$A$c$0$A$c$K$7$F$7$^$&$+$b$7$l$^$;$s!#(B -$B$=$l$,0BA4$G$"$k$HCN$k$H!"$9$0$K?M?4CO$D$/$G$7$g$&$,!#$H$K$+$/!"(B -@kbd{C-x u} (@code{undo}) $B$,;HMQ2DG=$G!"Bg>fIW$G$"$k$H8@$&;v$r3P$($F$*$$(B -$B$F2<$5$$!#(B - -@item C-c C-w -@kindex C-c C-w -@findex message-insert-signature -$B%P%C%U%!$N:G8e$K=pL>$rA^F~$7$^$9(B (@code{message-insert-signature})$B!#(B - -@item C-c M-h -@kindex C-c M-h -@findex message-insert-headers -$B%a%C%;!<%8$N%X%C%@!<$rA^F~$7$^$9(B (@code{message-insert-headers})$B!#(B - -@end table - -@table @code -@item message-ignored-cited-headers -$B$3$N@55,I=8=$K9gCW$9$kA4$F$N%X%C%@!<$OE=$jIU$1$i$l$?%a%C%;!<%8$+$i writes: -@end example - -$B$3$N4X?t$,8F$P$l$?$H$-!"%]%$%s%H$O%a%C%;!<%8$NK\BN$N@hF,$K$"$k$G$7$g$&!#(B - -$B$J$*(B gnus $B$K$O!"(B`writes:' $B$N>e$G%/%j%C%/$9$k$H0zMQ$5$l$?%F%-%9%H$r1#$95!(B -$BG=$,$"$j$^$9!#$b$7$"$J$?$,EY$r1[$7$F0zMQ9T$rJQ99$7$F$7$^$&$H!"$=$l$rFI$`(B -$B?M$?$A$bH`$i$N(B gnus $B$rBP1~$5$;$J$1$l$P$J$i$J$/$J$k$G$7$g$&!#JQ(B -$B?t(B @code{gnus-cite-attribution-suffix} $B$r;2>H$7$F2<$5$$!#>\:Y(B -$B$O(B @xref{Article Highlighting, , $B5-;v$N%O%$%i%$%H(B, gnus-ja}, $B$K$"$j$^$9!#(B - -@item message-yank-prefix -@vindex message-yank-prefix -@cindex yanking -@cindex quoting -$B$"$J$?$,5-;v$KJVEz$+%U%)%m!<%"%C%W$r$7$F$$$k$H$-$O!"IaDL$O$"$J$?$,1~Ez$7(B -$B$F$$$k?M$N$b$N$K0zMQId$rIU$1$?$$$G$7$g$&!#0zMQJ8$NA^F~$O(B @dfn{$BE=$jIU$1(B} -$B$K$h$C$F$J$5$l(B ($B$9$G$K0zMQId$,IU$$$F$$$k$b$N$OBP>]30!"(B -@code{message-yank-cited-prefix} $B$r;2>H$N$3$H(B)$B!"$=$l$>$l$NE=$jIU$1$i$l$?(B -$B0zMQ9T$O$=$NA0$K(B @code{message-yank-prefix} $B$rIU$1$i$l$^$9!#=i4|CM(B -$B$O(B @samp{> } $B$G$9!#(B - -@item message-yank-cited-prefix -@vindex message-yank-cited-prefix -@cindex yanking -@cindex cited -@cindex quoting -$B$9$G$K0zMQ$5$l$?9T$K$O(B @code{message-yank-prefix} $B$NBe$o$j$K$3$NJQ?t$NFb(B -$BMF$,0zMQId$H$7$F;H$o$l$^$9!#=i4|CM$O(B @samp{>} $B$G$9!#(B - -@item message-yank-add-new-references -@vindex message-yank-add-new-references -@cindex yanking -$B%3%^%s%I(B @code{message-yank-original} $B$rBPOCE*$K;H$C$?$H$-$K!"$3$NCM(B -$B$,(B @code{nil} $B$G$J$+$C$?$i!"(BReferences $B%U%#!<%k%I$K(B ID $B$,DI2C$5$l$^$9!#(B -$B$b$7CM$,%7%s%\%k(B @code{message-id-only} $B$@$C$?$i(B Message-ID $B%U%#!<%k%I(B -$B$N(B ID $B$@$1$,;H$o$l$^$9$,!"$=$&$G$J$1$l$P(B References$B!"(BIn-Reply-To $B$*$h(B -$B$S(B Message-ID $B%U%#!<%k%I$+$iCj=P$5$l$?(B ID $B$,;H$o$l$^$9!#(B - -@item message-list-references-add-position -@vindex message-list-references-add-position -@cindex yanking -$B%3%^%s%I(B @code{message-yank-original} $B$rBPOCE*$K;H$C$?$H$-$K!"$3$NCM$,(B -$B@5$N@0?t$@$C$?$i!"$9$G$K$"$k(B References $B%U%#!<%k%I$N:G8e$+$i$=$N8D?t(B -$B$N(B ID $B$@$1N%$l$?>l=j$K?7$7$$(B ID $B$,A^F~$5$l$^$9!#$=$l0J30$N>l9g$O:G8e$KA^(B -$BF~$5$l$^$9!#(B - -@item message-indentation-spaces -@vindex message-indentation-spaces -$BE=$jIU$1$i$l$?%a%C%;!<%8$r;z2<$2$9$k$?$a$N6uGr$N?t$G$9!#(B - -@item message-cite-function -@vindex message-cite-function -@findex message-cite-original -@findex sc-cite-original -@findex message-cite-original-without-signature -@cindex Supercite -$BK\5-;v$r0zMQ$9$k$?$a$N4X?t$G$9!#=i4|CM$O(B @code{message-cite-original} $B$G!"(B -$B$3$l$OC1=c$K$b$H$N%a%C%;!<%8$rA^F~$7!"$=$l$>$l$N9T$NF,$K(B @samp{> } $B$r$/$C(B -$B$D$1$^$9!#(B@code{message-cite-original-without-signature} $B$OF1MM$N;v$r$7(B -$B$^$9$,!"=pL>$O>J$-$^$9!#(BSupercite $B$r;H$&$?$a$K!"$=$l(B -$B$r(B @code{sc-cite-original} $B$K@_Dj$9$k;v$b$G$-$^$9!#(B - -@item message-suspend-font-lock-when-citing -@vindex message-suspend-font-lock-when-citing -@code{nil} $B$G$J$1$l$P!"K\5-;v$r0zMQ$7$F$$$k4V(B font-lock $B$NF0:n$r;_$a$^$9!#(B -$B$$$/$D$+$N!"(BEmacs $B$,2K$J$H$-$KCY$l$FF0:n$9$k(B font-lock $B$N$?$a$N%D!<(B -$B%k(B ($B$^$?$O(B Emacs $B<+?H(B) $B$K$O%P%0$,$"$j!"$=$l$i$O$7$P$7$P(B font-lock $B$NF0:n(B -$B$r9T$J$&BP>]$H$J$k%P%C%U%!$rl$7$N$.$NBP:v(B -$B$G$O$"$k$N$G$9$,!"$3$N%*%W%7%g%s$rHs(B-@code{nil} $B$K$9$k$3$H$K$h$C$F!"$"$J(B -$B$?$OITL{2w$J%(%i!<$r2sHr$G$-$k$+$b$7$l$^$;$s!#(B - -@item message-indent-citation-function -@vindex message-indent-citation-function -$B$A$g$&$I%a!<%k%P%C%U%!$KA^F~$5$l$?0zMQJ8$r=$@5$9$k$?$a$N4X?t$G$9!#$3$l$O(B -$B4X?t$N%j%9%H$G$"$k;v$b$G$-$^$9!#$=$l$>$l$N4X?t(B -$B$O(B @code{(point)} $B$H(B @code{(mark t)} $B$N4V$G0zMQ$rH/8+$9$k;v$,$G$-$^$9!#(B -$B$=$7$F!"$=$l$>$l$N4X?t$O0zMQJ8$,=$@5$5$l$k$H!"$=$N<~$j$K%]%$%s%H$H%^!<%/(B -$B$r;D$5$J$1$l$P$J$j$^$;$s!#(B - -@item message-signature -@vindex message-signature -$B%a%C%;!<%8%P%C%U%!$N:G8e$KA^F~$5$l$kJ8;zNs$G$9!#$b$7(B @code{t} ($B$3$l$,=i(B -$B4|@_Dj$G$9(B) $B$G$"$l$P!"%U%!%$%k(B @code{message-signature-file} $B$,Be$o$j$K(B -$BA^F~$5$l$^$9!#$b$74X?t$G$"$l$P!"4X?t$N7k2L$,Be$o$j$K;H$o$l$^$9!#$b$7<0$G(B -$B$"$l$P!"<0$N7k2L$,JQ$o$j$K;H$o$l$^$9!#$3$NJQ?t$,(B @code{nil} $B$G$"$l$P!"=p(B -$BL>$OA4$/A^F~$5$l$^$;$s!#(B - -@item messsage-signature-file -@vindex message-signature-file -$B%P%C%U%!$N:G8e$KA^F~$5$l$k=pL>$NF~$C$F$$$k%U%!%$%k$G$9!#=i4|CM(B -$B$O(B @samp{~/.signature} $B$G$9!#(B - -@end table - -RFC1036bis $B$O!"=pL>$O$=$NA0$K(B @samp{-- } $B$N(B3$BJ8;z$@$1$N9T$,$"$k$Y$-$G$"$k(B -$B$H8@$C$F$$$k;v$KCm0U$7$F2<$5$$!#$3$l$O$rG'<1$7$F!"=h(B -$BM}$r$9$k;v$r4JC1$K$9$k$?$a$G$9!#$G$9$+$i!"$"$J$?$NH~$7$$%G%6%$%s$r$=$l$,!"(B -$B$"$N!"40A4$KGK2u$7$F$$$k$H46$8$F$b$=$l$i$NJ8;z$r$O(B4$B9T$h$jB?$/$J$k$Y$-$G$OL5$$$H8@$&;v$bCm0U$7$F2<$5$$!#(BASCII $B$N3($r(B -$BF~$l$k;v$O!"3'$K$"$J$?$,GO key+cert.pem -@end example - -The @code{key+cert.pem} file should be pointed to from the -@code{smime-keys} variable. You should now be able to send signed mail. - -@emph{Note!} Your private key is store unencrypted in the file, so take -care in handling it. - -@subsection Using PGP/MIME - -PGP/MIME requires an external OpenPGP implementation, such as GNU Privacy -Guard (@code{http://www.gnupg.org/}). It also requires an Emacs interface -to it, such as Mailcrypt (available from -@code{http://www.nb.net/~lbudney/linux/software/mailcrypt.html}) or -Florian Weimer's @code{gpg.el}. - -Creating your own OpenPGP key is described in detail in the -documentation of your OpenPGP implementation, so we refer to it. - -@end ignore -@node Various Commands -@section $B$$$m$$$m$JL?Na(B - -@table @kbd - -@item C-c C-r -@kindex C-c C-r -@findex message-caesar-buffer-body -$B8=:_$N%a%C%;!<%8$r%7!<%6!(B rot13) $B$7$^(B -$B$9(B (@code{message-caesar-buffer-body})$B!#$b$7HO0O8BDj$,$5(B -$B$;$k$+$r;XDj$7$^$9!#=i4|CM$O(B 13 $B$G$9!#(B - -@item C-c C-e -@kindex C-c C-e -@findex message-elide-region -$B%]%$%s%H$H%^!<%/$N4V$NJ8$r>J$-$^$9(B (@code{message-elide-region})$B!#J8>O$O(B -$B@Z$i$l$F(B (killed) $BJQ?t(B @code{message-elide-ellipsis} $B$NCM$GCV$-49$($i$l(B -$B$^$9!#%G%#%U%)%k%H$N>JN,Id9f$H$7$F;H$o$l$kCM$O(B (@samp{[...]}) $B$G$9!#(B - -@item C-c C-z -@kindex C-c C-x -@findex message-kill-to-signature -$B=pL>$^$G$+!"$=$l$,L5$1$l$P5-;v$N:G8e$^$G$NA4$F$NJ8$r@Z$j$^(B -$B$9(B (@code{message-kill-to-signature})$B!#(B - -@item C-c C-v -@kindex C-c C-v -@findex message-delete-not-region -$B%a%C%;!<%8$NK\BN$N%j!<%8%g%s$N30$NA4$F$NJ8$r>C5n$7$^(B -$B$9(B (@code{message-delete-not-region})$B!#(B - -@item M-RET -@kindex M-RET -@kindex message-newline-and-format -4$B$D$N?7$7$$9T$rA^F~$7!"$b$7%]%$%s%H$,0zMQJ8$N4V$K$"$k$J$i$P!":F@07A$7$^(B -$B$9!#(B - -$B$3$l$ONc$G$9(B: - -@example -> $B$3$l$O2?$+$N0zMQJ8$G$9!#(B $B$=$7$F!"$3$3$K$O$b$C$H0zMQJ8$,$"$j$^$9!#(B -@end example - -$B$b$7!"%]%$%s%H$,(B @samp{$B$=$7$F(B} $B$NA0$K$"$j!"(B@kbd{M-RET} $B$r2!$7$?$J$i!"0J(B -$B2<$N$h$&$J$b$N$rF@$^$9(B: - -@example -> $B$3$l$O2?$+$N0zMQJ8$G$9!#(B - -* - -> $B$=$7$F!"$3$3$K$O$b$C$H0zMQJ8$,$"$j$^$9!#(B -@end example - -@samp{*} $B$O%]%$%s%H$,CV$+$l$F$$$k>l=j$G$9!#(B - -@item C-c C-t -@kindex C-c C-t -@findex message-insert-to -$B%U%)%m!<%"%C%W$7$h$&$H$9$k%a%C%;!<%8$N(B @code{Reply-To} $B$b$7$/(B -$B$O(B @code{From} $B%X%C%@!<$r4^$`(B @code{To} $B%X%C%@!<$rA^F~$7$^(B -$B$9(B (@code{message-insert-to})$B!#(B - -@item C-c C-n -@kindex C-c C-n -@findex message-insert-newsgroups -$BJVEz$7$F$$$k5-;v$N(B @code{Followup-To} $B$b$7$/$O!"(B@code{Nesgroups} $B%X%C%@!<(B -$B$rH?1G$7$?(B @code{Newsgroups} $B%X%C%@!<$rA^F~$7$^(B -$B$9(B (@code{message-insert-newsgroups})$B!#(B - -@item C-c M-r -@kindex C-c M-r -@findex message-rename-buffer -$B%P%C%U%!$NL>A0$rJQ99$7$^$9(B (@code{message-rename-buffer})$B!#@\F,0z?t$rM?(B -$B$($i$l$l$P!"?7$7$$%P%C%U%!L>$NF~NO$rB%?J$7$^$9!#(B - -@end table - -@node Sending -@section $BAw?.(B - -@table @kbd -@item C-c C-c -@kindex C-c C-c -@findex message-send-and-exit -$B%a%C%;!<%8$rAw?.$7!"8=:_$N%P%C%U%!$rKd$a$^(B -$B$9(B (@code{message-send-and-exit})$B!#(B - -@item C-c C-s -@kindex C-c C-s -@findex message-send -$B%a%C%;!<%8$rAw?.$7$^$9(B (@code{message-send})$B!#(B - -@item C-c C-d -@kindex C-c C-d -@findex message-dong-send -$B%a%C%;!<%8%P%C%U%!$rKd$a$F=*N;$7$^$9(B (@code{message-dont-send})$B!#(B - -@item C-c C-k -@kindex C-c C-k -@findex message-kill-buffer -$B%a%C%;!<%8%P%C%U%!$r@Z$C$F=*N;$7$^$9(B (@code{message-kill-buffer})$B!#(B - -@end table - -@node Mail Aliases -@section $B%a!<%kJLL>(B -@cindex mail aliases -@cindex aliases - -@vindex message-mail-alias-type -$BJQ?t(B @code{message-mail-alias-type} $B$O$I$N$h$&$J7?$N%a!<%kJLL>(B (mail -alias) $B?-D%$r;H$&$+$r@)8f$7$^$9!#8=:_$G$O!"0l$D$NMM<0$@$1$,;HMQ2DG=$G$9(B--- -Message $B$O%a!<%kJLL>$r07$&$?$a$K(B @code{mailabbrev} $B$r;H$$$^$9!#$b$7$3$N(B -$BJQ?t$,(B @code{nil} $B$G$"$k$J$i!"%a!<%kJLL>?-D%$O" -alias ding "ding@@ifi.uio.no (ding mailing list)" -@end example - -$B$3$N$h$&$J9T$r$"$J$?$N(B @file{~/.mailrc} $B%U%!%$%k$KDI2C$7$?8e$G!"(B -@code{To} $B$d(B @code{Cc} ($BEy$J$I(B) $B$N%X%C%@!<$G(B @samp{lmi} $B$H=q$$$F!"(B -@kbd{SPC} $B$r2!$9$@$1$GJLL>$r?-D%$7$^$9!#(B - -$B%a%C%;!<%8$rAw$k$H$-$K$O?-D%$O9T$o$l$^$;$s(B---$BA4$F$N?-D%$OL@<(E*$K9T$o$l(B -$B$J$/$F$O$J$j$^$;$s!#(B - -@node Spelling -@section Emacs $B$K%9%Z%k%A%'%C%/$5$;$k(B -@cindex spelling -@findex ispell-message - -Emacs $B$G%9%Z%k%A%'%C%/$9$k$?$a$KIa5Z$7$F$$$kFs$D$NJ}K!!"(B -@code{ispell} $B$H(B @code{flyspell} $B$,$"$j$^$9!#(B@code{ispell} $B$NJ}$O@N$+$i(B -$B$"$C$F!"$?$V$s$h$j0lHLE*$J%Q%C%1!<%8$G$9!#$"$J$?$ONc$K$h$C$F:G=i$K%a%C%;!<(B -$B%8$r=q$$$F$+$iA4BN$r(B @code{ispell} $B$KDL$7!"$9$Y$F$N=q$-B;$8$r=$@5$7$^$9!#(B -$B%a%C%;!<%8$rAw?.$9$k$H$-$K$=$l$r<+F0E*$K9T$J$&$?$a$K$O!"(B.emacs $B%U%!%$%k(B -$B$K0J2<$N$h$&$J$b$N$rF~$l$F2<$5$$!#(B - -@lisp -(add-hook 'message-send-hook 'ispell-message) -@end lisp - -@vindex ispell-message-dictionary-alist -$B$b$7$"$J$?$,0c$&8@8l$G=q$/=,47$J$i$P!"$=$l$OJQ(B -$B?t(B @code{ispell-message-dictionary-alist} $B$G@)8f$G$-$^$9!#(B - -@lisp -(setq ispell-message-dictionary-alist - '(("^Newsgroups:.*\\bde\\." . "deutsch8") - (".*" . "default"))) -@end lisp - -@code{ispell} $B$O%$%s%9%H!<%k$5$l$?(B @samp{ispell} $B%3%^%s%I$K0MB8$7$F$$$^(B -$B$9!#(B - -$B$b$&0lJ}$NIa5Z$7$F$$$kJ}K!$O(B @code{flyspell} $B$r;H$&$3$H$G$9!#$3$N%Q%C%1!<(B -$B%8$O$"$J$?$,=q$$$F$$$k:GCf$K%9%Z%k%A%'%C%/$r9T$J$$!"$$$m$s$JJ}K!$G4V0c$C(B -$B$?%9%Z%k$N8l$r;XE&$7$F$/$l$^$9!#(B - -@code{flyspell} $B$r;H$&$K$O!"0J2<$N$h$&$J$b$N$r(B .emacs $B%U%!%$%k$KF~$l$F2<(B -$B$5$$!#(B - -@lisp -(defun my-message-setup-routine () - (flyspell-mode 1)) -(add-hook 'message-setup-hook 'my-message-setup-routine) -@end lisp - -@code{flyspell} $B$O%$%s%9%H!<%k$5$l$?(B @samp{ispell} $B%3%^%s%I$K0MB8$7$F$$$^(B -$B$9!#(B - -@node Variables -@chapter $BJQ?t(B - -@menu -* Message Headers:: $B0lHLE*$J%a%C%;!<%8%X%C%@!<$N$h$&$J$b$N(B -* Mail Headers:: $B%a!<%k%X%C%@!<$r%+%9%?%^%$%:$9$k(B -* Mail Variables:: $BB>$N%a!<%kJQ?t(B -* News Headers:: $B%K%e!<%9%X%C%@!<$r%+%9%?%^%$%:$9$k(B -* News Variables:: $BB>$N%K%e!<%9JQ?t(B -* Various Message Variables:: $BB>$N%a%C%;!<%8JQ?t(B -* Sending Variables:: $BAw?.$9$k$?$a$NJQ?t(B -* Message Buffers:: Message $B$,$=$N%P%C%U%!$NL>A0$rIU$1$kJ}K!(B -* Message Actions:: $B=*N;$9$k$H$-$Ko$K@Q6KE*$G$9!#$=$l$OC$5$l$?$j:n$jD>$5$l$?$j$7$^$9!#$3$l$K(B -$B$OJQ?t(B @code{message-deletable-headers} ($B8e=R(B) $B$,4X78$7$^$9!#(B - -@item message-from-style -@vindex message-from-style -@code{From} $B%X%C%@!<$,$I$N$h$&$K8+$($k$+$r;XDj$7$^$9!#0J2<$N#4$D$NCM$,;H(B -$B$($^$9(B: - -@table @code -@item nil -$B%"%I%l%9$@$1$G$9(B -- @samp{king@@grassland.com}. - -@item parens -@samp{king@@granssland.com (Elvis Parsley)}. - -@item angles -@samp{Elvis Parsley }. - -@item default -$B$=$l$,0zMQId9f$rMW5a$7$J$1$l$P(B @code{angles} $B$N$h$&$K8+$(!"$b$70zMQId9f(B -$B$,MW5a$5$l$k>l9g$O(B @code{parens} $B$N$h$&$K8+$($^$9!#(B@code{parens} $B$,0zMQ(B -$BId9f$rMW5a$7$?$H$7$F$b!"$H$K$+$/(B @code{angles} $B$r;H$$$^$9!#(B - -@end table - -@item message-deletable-headers -@vindex message-deletable-headers -$B$3$N%j%9%H$K$"$k!"0JA0$K(B Message $B$K$h$j:n@.$5$l$?%X%C%@!<$OEj9F$9$kA0$K(B -$B:o=|$5$l$^$9!#5-;v$rEj9F$9$k$H$7$^$7$g$&!#$=$l$+$i!"$o$s$Q$/K7$N%0%k!<%W$K:F$SEj9F$9$k;v$K7hDj$7$?$N$G!"(B -@code{*post-buf*} $B%P%C%U%!$KLa$j!"(B@code{Newsgroups} $B9T$rJT=8$7!":F$SAw$j(B -$B=P$7$?$H$7$^$9!#=i4|@_Dj$G$O!"$3$NJQ?t$OA0$K:n@.$5$l$?8E(B -$B$$(B @code{Message-ID} $B$,l9g$O$3$NJQ?t$r$3$l$i$N@\F,8l$K9g$&$h$&$J@55,I=8=$K@_Dj$9$k$G$7$g$&!#(B -$B;d<+?H$O!"$=$N$h$&$J5,3J$K=>$o$J$$%a!<%k$O$?$@H$7$F2<$5$$!#$=$l(B -$B$N=i4|CM$O(B @code{(From Date Subject (optional . In-Reply-To) Message-ID -Lines (optional . User-Agent))} $B$G$9!#(B - -@item message-ignored-mail-headers -@vindex message-ignored-mail-headers -$B%a!<%k$r=P$9A0$K(B -$B$K(B @code{message-send-mail-with-mh}, -@code{message-send-mail-with-qmail}, @code{message-send-mail-with-smtp}, -@code{smtpmail-send-it} $B$*$h$S(B @code{feedmail-send-it} $B$,;H$($^$9!#(B - -@item message-mh-deletable-headers -@vindex message-mh-deletable-headers -$B$[$H$s$I$NHG$N(B MH $B$O$3$NJQ?t$N%X%C%@!<$r4^$`%a%C%;!<%8$r?)$o$5$l$k$N$r7y(B -$B$$$^$9!#$3$NJQ?t$,(B @code{nil} $B$G$J$$$J$i(B ($B$3$l$,=i4|@_Dj$G$9$,(B)$B!"$3$l$i(B -$B$N%X%C%@!<$O(B MH $B$r;H$C$F%a%C%;!<%8$rAw$C$F$$$k$H$-$K$Ol9g$OF~NO$rB%?J$5$l$^$9!#(B - -@item Newsgroups -@cindex Newsgroups -$B$3$NI,MW$J%X%C%@!<$O$I$N%K%e!<%9%0%k!<%W$K5-;v$,Ej9F$5$l$k;v$K$J$k$+$r;X(B -$BDj$7$^$9!#$b$7$^$@B8:_$7$F$$$J$$$J$i!"F~NO$rB%?J$5$l$^$9!#(B - -@item Organization -@cindex organization -$B$3$NA*BrG$0U$J%X%C%@!<$OJQ?t(B @code{message-user-organization} $B$K0MB8$7$F(B -$B:n@.$5$l$^$9!#$b$7$3$NJQ?t$,(B @code{t} $B$G$"$l$P!"(B -@code{message-user-organization-file} $B$,;H$o$l$^$9!#$3$NJQ?t$OJ8;zNs$G$"(B -$B$k;v$b$G$-(B ($B$=$N>l9g$O$=$NJ8;zNs$,;H$o$l$^$9(B)$B!"4X?t$G$"$k;v$b$G$-$^(B -$B$9(B ($B$=$N4X?t$O0z?tL5$7$G8F$P$l!";H$o$l$kJ8;zNs$rJV$9I,MW$,$"$j$^$9(B)$B!#(B - -@item Lines -@cindex Lines -$B$3$NA*BrG$0U$J%X%C%@!<$O(B Message $B$K$h$j7W;;$5$l$^$9!#(B - -@item Message-ID -@cindex Message-ID -@vindex mail-host-address -@findex system-name -@cindex Sun -$B$3$NI,MW$J%X%C%@!<$O(B Message $B$K$h$j:n@.$5$l$^$9!#F|IU!";~4V!"MxMQ!"(B -$B%7%9%F%`L>$K4p$E$$$?B>$KL5$$(B ID $B$,:n@.$5$l$^$9!#(B -Message $B$O(B @code{system-name} $B$r%7%9%F%`L>$r7h$a$k$?$a$K;H$$$^$9!#$b$7$3(B -$B$l$,(B fully qualified domain name (FQDN) ($B40A4$K>r7o$rK~$?$7$?%I%a%$%s(B -$BL>(B) $B$G$J$$$J$i(B $B$P!"(BMessage $B$O(B @code{mail-host-address} $B$r(B FQDN $B$H$7$F;H(B -$B$$$^$9!#(B - -@item User-Agent -@cindex User-Agent -$B$3$NA*Br<+M3$J%X%C%@!<$O%m!<%+%kJQ?t(B @code{message-newsreader} $B$K$7$?$,$C(B -$B$F:n$i$l$^$9!#(B - -@item In-Reply-To -$B$3$NA*Br<+M3$J%X%C%@!<$OJVEz$7$F$$$k5-;v$N(B @code{Date} $B$H(B @code{From} $B%X%C(B -$B%@!<$r;H$C$F:n$i$l$^$9!#(B - -@item Expires -@cindex Expires -$B$3$NHs>o$KA*Br<+M3$J%X%C%@!<$OJQ?t(B @code{message-expires} $B$K$7$?$,$C$FA^(B -$BF~$5$l$^$9!#$3$l$O<+J,$,2?$r$7$F$$$k$+$rCN$i$J$$8B$j!";HMQ$OA4$/4+$a$i$l(B -$B$^$;$s!#(B - -@item Distribution -@cindex Distribution -$B$3$NA*Br<+M3$J%X%C%@!<$OJQ?t(B @code{message-distribution-function} $B$K$7$?(B -$B$,$C$F:n$i$l$^$9!#$=$l$OHs?d>)$G!"Hs>o$K8m2r$5$l$?%X%C%@!<$G$9!#(B - -@item Path -@cindex path -$B$3$NHs>o$KA*Br<+M3$J%X%C%@!<$O$*$=$i$/7h$7$F;H$o$l$F$O$J$i$J$$$G$7$g$&!#(B -$B$7$+$7$$$/$D$+$N(B @emph{$B$H$F$b(B} $B8E$$%5!<%P!<$O$3$N%X%C%@!<$,B8:_$9$k;v$r(B -$BMW5a$7$^$9!#(B@code{message-user-path} $B$,$3$N(B @code{Path} $B%X%C%@!<$,$I$N$h(B -$B$&$K8+$($k$+$r$5$i$K@)8f$7$^$9!#$b$7$=$l$,(B @code{nil} $B$G$"$l$P!"%5!<%P!<(B -$BL>$r(B leaf $B@a$H$7$F;H$$$^$9!#$b$7$=$l$,J8;zNs$G$"$l$P!"$=$NJ8;zNs$r;H$$$^(B -$B$9!#$b$7$=$l$,J8;zNs$G$b(B @code{nil} $B$G$b$J$1$l$P!"MxMQA0$@$1$r;H$$(B -$B$^$9!#$7$+$7!"2?$i$+$N7A$G$3$NJQ?t$rO.$i$J$1$l$P$J$i$J$$I,MW@-$OHs>o$K>/(B -$B$J$$$G$7$g$&!#(B -@end table - -@findex yow -@cindex Mime-Version -$B2C$($F!"$"$J$?$O(B cons $B$r%j%9%H$KF~$l$k;v$,$G$-$^$9!#(Bcons $B$N(B car $B$O%7%s%\(B -$B%k$G$"$k$Y$-$G$9!#$3$N%7%s%\%kL>$O%X%C%@!$G!"(Bcdr $B$O$3$N%X%C%@!<$NCM$H(B -$B$7$F$=$N$^$^F~$l$i$l$k$3$H$K$J$kJ8;zNs$+!"8F$P$l$k4X?t$N$I$A$i$+$G$"$k;v(B -$B$,$G$-$^$9!#Nc$($P!"$b$7(B @code{Mime-Version: 1.0} $B$rA^F~$7$?$$$J$i!"(B -@code{(Mime-Version . "1.0")} $B$r%j%9%H$KF~$l$k$Y$-$G$7$g$&!#$b$7$*$b$7$m(B -$B$$0zMQ$rA^F~$7$?$$$J$i!"(B@code{(X-Yow . yow)} $B$N$h$&$J$b$N$r%j%9%H$KF~$l(B -$B$k;v$,$G$-$k$G$7$g$&!#4X?t(B @code{yow} $B$O$=$N8e$G0z?tL5$7$G8F$P$l$^$9!#(B - -$B$b$7%j%9%H$,(B cons $B$N(B car $B$,(B @code{optional} $B$G$"$k(B cons $B$r4^$s$G$$$k$J$i!"(B -$B$3$N(B cons $B$N(B cdr $B$O(B @code{nil} $B$G$J$$$H$-$@$1A^F~$5$l$^$9!#(B - -$B=P$F9T$/%K%e!<%95-;v$r%+%9%?%^%$%:$9$k$?$a$NB>$NJQ?t(B: - -@table @code - -@item message-syntax-checks -@vindex message-syntax-checks -@code{nil} $B$G$J$1$l$P!"(BMessage $B$OEj9F$NA0$K!"%X%C%@!<$HB>$N$b$N$N9gK!@-(B -$B$rD4$Y$^$9!#$3$N%j%9%H$KMWAG$rIU$12C$($?$jfIW$+$I$&$+D4$Y$^$9!#(B -@item from -@code{From} $B%X%C%@!<$,$h$/8+$($k$+$I$&$+$rD4$Y$^$9!#(B -@item long-lines -$B$"$^$j$KD9$$9T$rD4$Y$^$9!#(B -@item control-chars -$B;H$C$F$O$$$1$J$$J8;z$rD4$Y$^$9!#(B -@item size -$B2a>j$JBg$-$5$rD4$Y$^$9!#(B -@item new-text -$B%a%C%;!<%8$K?7$7$$J8$,$"$k$+$I$&$+$rD4$Y$^$9!#(B -@item signature -$B=pL>$ND9$5$rD4$Y$^$9!#(B -@item approved -@cindex approved -$B5-;v$,(B @code{Approved} $B%X%C%@!<$r;}$C$F$$$k$+$I$&$+$rD4$Y$^$9!#$=$l$O;J(B -$B2q(B -$B$,L5$$$+$rD4$Y$^$9!#(B -@item shorten-followup-to -$BEj9F$9$k%0%k!<%W$N?t$r(B @code{Followup-to} $B%X%C%@!<$rIU$12C$($k;v$G>/$J$/(B -$B$9$k$+$rD4$Y$^$9!#(B -@end table - -$B$3$l$iA4$F$N>uBV$O=i4|@_Dj$G$OD4$Y$i$l$^$9!#(B - -@item message-ignored-news-headers -@vindex message-ignored-news-headers -$BEj9F$9$kA0$K\:Y$O(B gnus $B%^%K%e%"%k$r8+$F2<$5$$(B) $B$G$9!#(B - -@end table - -@node Various Message Variables -@section $B$$$m$$$m$J%a%C%;!<%8JQ?t(B - -@table @code -@c @item message-default-charset -@c @vindex message-default-charset -@c @cindex charset -@c Symbol naming a @sc{mime} charset. Non-ASCII characters in messages are -@c assumed to be encoded using this charset. The default is @code{nil}, -@c which means ask the user. (This variable is used only on non-@sc{mule} -@c Emacsen. -@c @xref{Charset Translation, , Charset Translation, emacs-mime, -@c Emacs MIME Manual}, for details on the @sc{mule}-to-@sc{mime} -@c translation process. -@c -@item message-signature-separator -@vindex message-signature-separator -$B=pL>J,N%$K9gCW$9$k@55,I=8=$G$9!#=i4|CM$O(B @samp{^-- *$} $B$G$9!#(B - -@item mail-header-separator -@vindex mail-header-separator -$B%X%C%@!<$rK\BN$+$iJ,$1$k$N$K;H$o$l$kJ8;zNs$G$9!#=i4|CM$O(B @samp{--text -follows this line--} $B$G$9!#(B - -@item message-directory -@vindex message-directory -$BB?$/$N%a!<%k$N$b$N$+$i;H$o$l$k%G%#%l%/%H%j!<$G$9!#=i4|CM(B -$B$O(B @file{~/Mail/} $B$G$9!#(B - -@item message-signature-setup-hook -@vindex message-signature-setup-hook -$B%a%C%;!<%8%P%C%U%!$r=i4|2=$9$k$H$-$K$,A^F~$5$l$kA0$KO$,A^(B -$BF~$5$l$kA0$Kl9g$O%X%C%@!<$r2C$($^$;$s!#(B - -@item message-send-mail-hook -@vindex message-send-mail-hook -$B%a!<%k%a%C%;!<%8$rAw$kA0$K$l$NMWAG$O$H6&$K8F$P$l$^$9!#=i4|@_Dj$N4X?t$O(B @code{message-output} -$B$G!"$=$l$O(B Unix mailbox $BMM<0$GJ]B8$7$^$9!#(B - -@item message-courtesy-message -@vindex messsage-courtesy-messsage -$BJ#9g%a%C%;!<%8$rAw$k$H$-$O!"$3$NJ8;zNs$O%a!<%k$GAw$i$l$?J#@=$NJ}$N:G=i$K(B -$BA^F~$5$l$^$9!#$b$7$=$NJ8;zNs$,=qK!;EMM;XDj(B @samp{%s} $B$r4^$s$G$$$l$P!"5-(B -$B;v$,Ej9F$5$l$?%K%e!<%9%0%k!<%W$,$=$3$KA^F~$5$l$^$9!#$b$7$3$NJQ?t(B -$B$,(B @code{nil} $B$G$"$l$P!"$=$N$h$&$J?F@Z%a%C%;!<%8$O2C$($i$l$^$;$s!#=i4|CM(B -$B$O(B @samp{"The following message is a courtesy copy of an article\nthat has -been posted to %s as well.\n\n"} $B$G$9!#(B - -@end table - -@node Message Buffers -@section $B%a%C%;!<%8%P%C%U%!(B - -Message $B$O$"$J$?$,%a%C%;!<%8%P%C%U%!$rMW5a$7$?$H$-$K!"B>$KL5$$M#0l$N%P%C(B -$B%U%!L>$G?7$7$$%P%C%U%!$r$D$/$j$^$9!#%a%C%;!<%8$rAw$C$?$H$-$K!"%P%C%U%!$O(B -$BIaDL$O:o=|$5$l$^$;$s!#$=$NL>A0$OJQ99$5$l$F!"FCDj$N?t$N8E$$%a%C%;!<%8%P%C(B -$B%U%!$O@8$-$?$^$^$K$J$j$^$9!#(B - -@table @code -@item message-generate-new-buffers -@vindex message-generate-new-buffers -@code{nil} $B$G$J$1$l$P!"?7$7$$%P%C%U%!$r:n@.$7$^$9!#=i4|CM$O(B @code{t} $B$G(B -$B$9!#$b$7$3$l$,4X?t$J$i!"$=$N4X?t$r(B3$B$D$N0z?t$H6&$K8F$S$^$9(B: $B7?!"Aw$j@h%"(B -$B%I%l%9!"%0%k!<%WL>(B $B$G$9!#(B ($B$3$l$i$N$I$l$G$b(B @code{nil} $B$G$"$k$+$b$7$l$^(B -$B$;$s!#(B) $B4X?t$O?7$7$$%P%C%U%!L>$rJV$9$Y$-$G$9!#(B - -@item message-use-multi-frames -@vindex message-use-multi-frames -@code{nil} $B$G$J$1$l$P!"?7$7$$%U%l!<%`$r:n@.$7$^$9!#=i4|CM$O(B @code{nil} -$B$G$9!#(B - -@item message-delete-frame-on-exit -@vindex messgae-delete-frame-on-exit -$BJQ?t(B @code{message-delete-frame-on-exit} $B$O%a%C%;!<%8$rAw?.$7$?$H$-$H!"(B -$B%P%C%U%!$r@Z$C$?$H$-$K%U%l!<%`$r>C5n$9$k$+$r7hDj$7$^$9!#(B@code{nil} $B$G$"(B -$B$l$P!"(B($B$3$l$,=i4|@_Dj$G$9$,(B) $B%U%l!<%`$r>C5n$7$^$;$s!#(B@code{ask} $B$G$"$l$P!"(B -$B>C5n$9$k$+$I$&$+$rMxMQo$K>C5n$7$^$9!#(B - -@item message-max-buffers -@vindex message-max-buffers -$B$3$NJQ?t$O$I$N$/$i$$8E$$%a%C%;!<%8%P%C%U%!$rJ]$C$F$*$/$+$r;XDj$7$^$9!#$3(B -$B$l$h$jB?$$%a%C%;!<%8%P%C%U%!$,$"$l$P!"0lHV8E$$%P%C%U%!$,:o=|$5$l$^$9!#=i(B -$B4|CM$O(B10$B$G$9!#$3$NJQ?t$,(B @code{nil} $B$G$"$k$H!"8E$$%a%C%;!<%8%P%C%U%!$O:o(B -$B=|$5$l$^$;$s!#(B - -@item message-send-rename-function -@vindex message-send-rename-function -$B%a%C%;!<%8$rAw$C$?8e$G!"%P%C%U%!$NL>A0$O!"Nc$($P!"(B@samp{*reply to Lars*} -$B$+$i(B @samp{*sent reply to Lars*} $B$KJQ99$5$l$^$9!#$b$7$3$l$r9%$^$J$$$J$i!"(B -$B$3$NJQ?t$r$"$J$?$N9%$-$JJ}K!$G%P%C%U%!$NL>A0$rJQ99$9$k4X?t$K@_Dj$7$F2<$5(B -$B$$!#$=$b$=$b%P%C%U%!L>$rJQ99$9$k;v$r9%$^$J$$$N$G$"$l$P!"$N2D(B -$BG=@-$K$O(B @kbd{C-c C-s} $B$,$"$j!"$3$l$O%a%C%;!<%8$rAw$k$@$1$G$"$j!"(B -@kbd{C-c C-d} $B$O%a%C%;!<%8$NJT=8$r@h$K1d$P$7$F%a%C%;!<%8%P%C%U%!$rKd$a!"(B -@kbd{C-c C-k} $B$O%a%C%;!<%8%P%C%U%!$r:o=|$7$^$9!#$3$l$i$NF0:n$O$=$l$>$l$=(B -$B$l$H4XO"IU$1$i$l$?%j%9%H$r;}$C$F$$$F!"$=$l$O2A(B} $B$5$l$k<0$G$9!#(B - -@node Compatibility -@chapter $B8_49@-(B -@cindex compatibility - -Message $B$O;ve!"$=$l<+?H$NJQ?t$7$+;H$$$^$;$s(B---$B8E$$(B @code{mail-} $B$NJQ(B -$B?t$O9MN8$5$l$^$;$s!#(BMessage $B$K$3$l$i$NJQ?t$r7W;;$KF~$l$5$;$?$$$N$G$"$l$P!"(B -$B0J2<$N$b$N$r$"$J$?$N(B @code{.emacs} $B%U%!%$%k$KF~$l$k;v$,$G$-$^$9(B: - -@lisp -(require 'messcompat) -@end lisp - -$B$3$l$OB?$/$N(B Message $BJQ?t$rBP1~$9$k%a!<%kJQ?t$+$i=i4|2=$7$^$9!#(B - -@node Appendices -@chapter $BIU5-(B - -@menu -* Responses:: $B1~Ez$,2?=h$K9T$/$+$r7hDj$9$kI8=`$NK!B'!#(B -@end menu - -@node Responses -@section $B1~Ez(B - -$B%a%C%;!<%8$,2?=h$K9T$/$+$r7hDj$9$k$?$a$K!"=i4|@_Dj$G$O0J2<$N%"%k%4%j%:%`(B -$B$,;H$o$l$^$9!#(B - -@table @dfn -@item reply -@dfn{$BJVEz(B} (reply) $B$O%a%C%;!<%8$rAw$C$??M(B @emph{$B$@$1(B} $B$K%a!<%k$G1~Ez$7$?(B -$B$$$H$-$N$b$N$G$9!#l9g$O$=$l$,Be$o$j(B -$B$K;H$o$l$^$9(B)$B!#(B - -@item Cc - -@item To -@end table - -@code{Mail-Copies-To} $B%X%C%@!<$,B8:_$7$F$$$k$H!"$=$l$b%a!<%k%\%C%/%9$N%j(B -$B%9%H$K2C$($i$l$k$G$7$g$&!#$3$N%X%C%@!<$,(B @samp{never} $B$G$"$l$P!"$=$l(B -$B$O(B @code{From} ($B$b$7$/$O(B @code{Reply-To}) $B%a!<%k%\%C%/%9$,M^@)$5$l$k$H8@(B -$B$&;v$G$9!#(B - -@item followup -@dfn{$B%U%)%m!<%"%C%W(B} (followup) $B$O%K%e!<%9$K$h$k1~Ez$G$9!#0J2<$N%X%C(B -$B%@!<(B ($BM%@h=g0L$N9b$$$b$N$+$i5s$2$i$l$F$$$^$9(B) $B$,2?=h$K1~Ez$,Aw$i$l$k$+$r(B -$B7hDj$7$^$9(B: - -@table @code - -@item Followup-To - -@item Newsgroups - -@end table - -$B$b$7(B @code{Mail-Copies-To} $B%X%C%@!<$,B8:_$9$k$H!"$=$l$,(B @samp{never} $B$G(B -$B$J$1$l$P!"?7$7$$(B @code{Cc} $B%X%C%@!<$N4p$H$7$F;H$o$l!"$^$9!#(B - -@end table - -@node Index -@chapter Index -@printindex cp - -@node Key Index -@chapter Key Index -@printindex ky - -@summarycontents -@contents -@bye - -@c End: diff --git a/texi/message.texi b/texi/message.texi deleted file mode 100644 index 3529ef1..0000000 --- a/texi/message.texi +++ /dev/null @@ -1,1630 +0,0 @@ -\input texinfo @c -*-texinfo-*- - -@setfilename message -@settitle T-gnus 6.15 Message Manual -@synindex fn cp -@synindex vr cp -@synindex pg cp -@dircategory Emacs -@direntry -* Message: (message). Mail and news composition mode that goes with Gnus. -@end direntry -@iftex -@finalout -@end iftex -@setchapternewpage odd - -@ifnottex - -This file documents Message, the Emacs message composition mode. - -Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc. - -Permission is granted to copy, distribute and/or modify this document -under the terms of the GNU Free Documentation License, Version 1.1 or -any later version published by the Free Software Foundation; with no -Invariant Sections, with the Front-Cover texts being ``A GNU -Manual'', and with the Back-Cover Texts as in (a) below. A copy of the -license is included in the section entitled ``GNU Free Documentation -License'' in the Emacs manual. - -(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify -this GNU Manual, like GNU software. Copies published by the Free -Software Foundation raise funds for GNU development.'' - -This document is part of a collection distributed under the GNU Free -Documentation License. If you want to distribute this document -separately from the collection, you can do so by adding a copy of the -license to the document, as described in section 6 of the license. -@end ifnottex - -@tex - -@titlepage -@title T-gnus 6.15 Message Manual - -@author by Lars Magne Ingebrigtsen -@page - -@vskip 0pt plus 1filll -Copyright @copyright{} 1996, 1997, 1998, 1999, 2000 - Free Software Foundation, Inc. - -Permission is granted to copy, distribute and/or modify this document -under the terms of the GNU Free Documentation License, Version 1.1 or -any later version published by the Free Software Foundation; with the -Invariant Sections being none, with the Front-Cover texts being ``A GNU -Manual'', and with the Back-Cover Texts as in (a) below. A copy of the -license is included in the section entitled ``GNU Free Documentation -License'' in the Emacs manual. - -(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify -this GNU Manual, like GNU software. Copies published by the Free -Software Foundation raise funds for GNU development.'' - -This document is part of a collection distributed under the GNU Free -Documentation License. If you want to distribute this document -separately from the collection, you can do so by adding a copy of the -license to the document, as described in section 6 of the license. -@end titlepage -@page - -@end tex - -@node Top -@top Message - -All message composition from Gnus (both mail and news) takes place in -Message mode buffers. - -@menu -* Interface:: Setting up message buffers. -* Commands:: Commands you can execute in message mode buffers. -* Variables:: Customizing the message buffers. -* Compatibility:: Making Message backwards compatible. -* Appendices:: More technical things. -* Index:: Variable, function and concept index. -* Key Index:: List of Message mode keys. -@end menu - -This manual corresponds to T-gnus 6.15 Message. Message is distributed -with the Gnus distribution bearing the same version number as this -manual. - - -@node Interface -@chapter Interface - -When a program (or a person) wants to respond to a message -- reply, -follow up, forward, cancel -- the program (or person) should just put -point in the buffer where the message is and call the required command. -@code{Message} will then pop up a new @code{message} mode buffer with -appropriate headers filled out, and the user can edit the message before -sending it. - -@menu -* New Mail Message:: Editing a brand new mail message. -* New News Message:: Editing a brand new news message. -* Reply:: Replying via mail. -* Wide Reply:: Responding to all people via mail. -* Followup:: Following up via news. -* Canceling News:: Canceling a news article. -* Superseding:: Superseding a message. -* Forwarding:: Forwarding a message via news or mail. -* Resending:: Resending a mail message. -* Bouncing:: Bouncing a mail message. -@end menu - - -@node New Mail Message -@section New Mail Message - -@findex message-mail -The @code{message-mail} command pops up a new message buffer. - -Two optional parameters are accepted: The first will be used as the -@code{To} header and the second as the @code{Subject} header. If these -are @code{nil}, those two headers will be empty. - - -@node New News Message -@section New News Message - -@findex message-news -The @code{message-news} command pops up a new message buffer. - -This function accepts two optional parameters. The first will be used -as the @code{Newsgroups} header and the second as the @code{Subject} -header. If these are @code{nil}, those two headers will be empty. - - -@node Reply -@section Reply - -@findex message-reply -The @code{message-reply} function pops up a message buffer that's a -reply to the message in the current buffer. - -@vindex message-reply-to-function -Message uses the normal methods to determine where replies are to go -(@pxref{Responses}), but you can change the behavior to suit your needs -by fiddling with the @code{message-reply-to-function} variable. - -If you want the replies to go to the @code{Sender} instead of the -@code{From}, you could do something like this: - -@lisp -(setq message-reply-to-function - (lambda () - (cond ((equal (mail-fetch-field "from") "somebody") - (list (cons 'To (mail-fetch-field "sender")))) - (t - nil)))) -@end lisp - -This function will be called narrowed to the head of the article that is -being replied to. - -As you can see, this function should return a string if it has an -opinion as to what the To header should be. If it does not, it should -just return @code{nil}, and the normal methods for determining the To -header will be used. - -This function can also return a list. In that case, each list element -should be a cons, where the car should be the name of an header -(eg. @code{Cc}) and the cdr should be the header value -(eg. @samp{larsi@@ifi.uio.no}). All these headers will be inserted into -the head of the outgoing mail. - - -@node Wide Reply -@section Wide Reply - -@findex message-wide-reply -The @code{message-wide-reply} pops up a message buffer that's a wide -reply to the message in the current buffer. A @dfn{wide reply} is a -reply that goes out to all people listed in the @code{To}, @code{From} -(or @code{Reply-to}) and @code{Cc} headers. - -@vindex message-wide-reply-to-function -Message uses the normal methods to determine where wide replies are to go, -but you can change the behavior to suit your needs by fiddling with the -@code{message-wide-reply-to-function}. It is used in the same way as -@code{message-reply-to-function} (@pxref{Reply}). - -@findex message-dont-reply-to-names -Addresses that match the @code{message-dont-reply-to-names} regular -expression will be removed from the @code{Cc} header. - - -@node Followup -@section Followup - -@findex message-followup -The @code{message-followup} command pops up a message buffer that's a -followup to the message in the current buffer. - -@vindex message-followup-to-function -Message uses the normal methods to determine where followups are to go, -but you can change the behavior to suit your needs by fiddling with the -@code{message-followup-to-function}. It is used in the same way as -@code{message-reply-to-function} (@pxref{Reply}). - -@vindex message-use-followup-to -The @code{message-use-followup-to} variable says what to do about -@code{Followup-To} headers. If it is @code{use}, always use the value. -If it is @code{ask} (which is the default), ask whether to use the -value. If it is @code{t}, use the value unless it is @samp{poster}. If -it is @code{nil}, don't use the value. - - -@node Canceling News -@section Canceling News - -@findex message-cancel-news -The @code{message-cancel-news} command cancels the article in the -current buffer. - - -@node Superseding -@section Superseding - -@findex message-supersede -The @code{message-supersede} command pops up a message buffer that will -supersede the message in the current buffer. - -@vindex message-ignored-supersedes-headers -Headers matching the @code{message-ignored-supersedes-headers} are -removed before popping up the new message buffer. The default is@* -@samp{^Path:\\|^Date\\|^NNTP-Posting-Host:\\|^Xref:\\|^Lines:\\|@* -^Received:\\|^X-From-Line:\\|Return-Path:\\|^Supersedes:}. - - - -@node Forwarding -@section Forwarding - -@findex message-forward -The @code{message-forward} command pops up a message buffer to forward -the message in the current buffer. If given a prefix, forward using -news. - -@table @code -@item message-forward-ignored-headers -@vindex message-forward-ignored-headers -All headers that match this regexp will be deleted when forwarding a message. - -@item message-make-forward-subject-function -@vindex message-make-forward-subject-function -A list of functions that are called to generate a subject header for -forwarded messages. The subject generated by the previous function is -passed into each successive function. - -The provided functions are: - -@table @code -@item message-forward-subject-author-subject -@findex message-forward-subject-author-subject -Source of article (author or newsgroup), in brackets followed by the -subject. - -@item message-forward-subject-fwd -Subject of article with @samp{Fwd:} prepended to it. -@end table - -@item message-wash-forwarded-subjects -@vindex message-wash-forwarded-subjects -If this variable is @code{t}, the subjects of forwarded messages have -the evidence of previous forwards (such as @samp{Fwd:}, @samp{Re:}, -@samp{(fwd)}) removed before the new subject is -constructed. The default value is @code{nil}. - -@item message-forward-as-mime -@vindex message-forward-as-mime -If this variable is @code{t} (the default), forwarded messages are -included as inline MIME RFC822 parts. If it's @code{nil}, forwarded -messages will just be copied inline to the new message, like previous, -non MIME-savvy versions of gnus would do. -@end table - - -@node Resending -@section Resending - -@findex message-resend -The @code{message-resend} command will prompt the user for an address -and resend the message in the current buffer to that address. - -@vindex message-ignored-resent-headers -Headers that match the @code{message-ignored-resent-headers} regexp will -be removed before sending the message. The default is -@samp{^Return-receipt}. - - -@node Bouncing -@section Bouncing - -@findex message-bounce -The @code{message-bounce} command will, if the current buffer contains a -bounced mail message, pop up a message buffer stripped of the bounce -information. A @dfn{bounced message} is typically a mail you've sent -out that has been returned by some @code{mailer-daemon} as -undeliverable. - -@vindex message-ignored-bounced-headers -Headers that match the @code{message-ignored-bounced-headers} regexp -will be removed before popping up the buffer. The default is -@samp{^\\(Received\\|Return-Path\\):}. - - -@node Commands -@chapter Commands - -@menu -* Buffer Entry:: Commands after entering a Message buffer. -* Header Commands:: Commands for moving to headers. -* Movement:: Moving around in message buffers. -* Insertion:: Inserting things into message buffers. -* MIME:: @sc{mime} considerations. -* Security:: Signing and encrypting messages. -* Various Commands:: Various things. -* Sending:: Actually sending the message. -* Mail Aliases:: How to use mail aliases. -* Spelling:: Having Emacs check your spelling. -@end menu - - -@node Buffer Entry -@section Buffer Entry -@cindex undo -@kindex C-_ - -You most often end up in a Message buffer when responding to some other -message of some sort. Message does lots of handling of quoted text, and -may remove signatures, reformat the text, or the like---depending on -which used settings you're using. Message usually gets things right, -but sometimes it stumbles. To help the user unwind these stumblings, -Message sets the undo boundary before each major automatic action it -takes. If you press the undo key (usually located at @kbd{C-_}) a few -times, you will get back the un-edited message you're responding to. - - -@node Header Commands -@section Header Commands - -All these commands move to the header in question. If it doesn't exist, -it will be inserted. - -@table @kbd - -@item C-c ? -@kindex C-c ? -@findex message-goto-to -Describe the message mode. - -@item C-c C-f C-t -@kindex C-c C-f C-t -@findex message-goto-to -Go to the @code{To} header (@code{message-goto-to}). - -@item C-c C-f C-b -@kindex C-c C-f C-b -@findex message-goto-bcc -Go to the @code{Bcc} header (@code{message-goto-bcc}). - -@item C-c C-f C-f -@kindex C-c C-f C-f -@findex message-goto-fcc -Go to the @code{Fcc} header (@code{message-goto-fcc}). - -@item C-c C-f C-c -@kindex C-c C-f C-c -@findex message-goto-cc -Go to the @code{Cc} header (@code{message-goto-cc}). - -@item C-c C-f C-s -@kindex C-c C-f C-s -@findex message-goto-subject -Go to the @code{Subject} header (@code{message-goto-subject}). - -@item C-c C-f C-r -@kindex C-c C-f C-r -@findex message-goto-reply-to -Go to the @code{Reply-To} header (@code{message-goto-reply-to}). - -@item C-c C-f C-n -@kindex C-c C-f C-n -@findex message-goto-newsgroups -Go to the @code{Newsgroups} header (@code{message-goto-newsgroups}). - -@item C-c C-f C-d -@kindex C-c C-f C-d -@findex message-goto-distribution -Go to the @code{Distribution} header (@code{message-goto-distribution}). - -@item C-c C-f C-o -@kindex C-c C-f C-o -@findex message-goto-followup-to -Go to the @code{Followup-To} header (@code{message-goto-followup-to}). - -@item C-c C-f C-k -@kindex C-c C-f C-k -@findex message-goto-keywords -Go to the @code{Keywords} header (@code{message-goto-keywords}). - -@item C-c C-f C-u -@kindex C-c C-f C-u -@findex message-goto-summary -Go to the @code{Summary} header (@code{message-goto-summary}). - -@end table - - -@node Movement -@section Movement - -@table @kbd -@item C-c C-b -@kindex C-c C-b -@findex message-goto-body -Move to the beginning of the body of the message -(@code{message-goto-body}). - -@item C-c C-i -@kindex C-c C-i -@findex message-goto-signature -Move to the signature of the message (@code{message-goto-signature}). - -@end table - - -@node Insertion -@section Insertion - -@table @kbd - -@item C-c C-y -@kindex C-c C-y -@findex message-yank-original -Yank the message in the buffer @code{gnus-article-copy} into the message -buffer. Normally @code{gnus-article-copy} is what you are replying to -(@code{message-yank-original}). - -@item C-c M-C-y -@kindex C-c M-C-y -@findex message-yank-buffer -Prompt for a buffer name and yank the contents of that buffer into the -message buffer (@code{message-yank-buffer}). - -@item C-c C-q -@kindex C-c C-q -@findex message-fill-yanked-message -Fill the yanked message (@code{message-fill-yanked-message}). Warning: -Can severely mess up the yanked text if its quoting conventions are -strange. You'll quickly get a feel for when it's safe, though. Anyway, -just remember that @kbd{C-x u} (@code{undo}) is available and you'll be -all right. - -@item C-c C-w -@kindex C-c C-w -@findex message-insert-signature -Insert a signature at the end of the buffer -(@code{message-insert-signature}). - -@item C-c M-h -@kindex C-c M-h -@findex message-insert-headers -Insert the message headers (@code{message-insert-headers}). - -@end table - -@table @code -@item message-ignored-cited-headers -@vindex message-ignored-cited-headers -All headers that match this regexp will be removed from yanked -messages. The default is @samp{.}, which means that all headers will be -removed. - -@item message-cite-prefix-regexp -@vindex message-cite-prefix-regexp -Regexp matching the longest possible citation prefix on a line. - -@item message-citation-line-function -@vindex message-citation-line-function -@cindex attribution line -Function called to insert the citation line. The default is -@code{message-insert-citation-line}, which will lead to citation lines -that look like: - -@example -Hallvard B Furuseth writes: -@end example - -Point will be at the beginning of the body of the message when this -function is called. - -Note that Gnus provides a feature where clicking on `writes:' hides the -cited text. If you change the citation line too much, readers of your -messages will have to adjust their Gnus, too. See the variable -@code{gnus-cite-attribution-suffix}. @xref{Article Highlighting, , -Article Highlighting, gnus}, for details. - -@item message-yank-prefix -@vindex message-yank-prefix -@cindex yanking -@cindex quoting -When you are replying to or following up an article, you normally want -to quote the person you are answering. Inserting quoted text is done -by @dfn{yanking}, and each quoted line you yank (except earlier -quotes, see @code{message-yank-cited-prefix}) will have -@code{message-yank-prefix} prepended to it. The default is @samp{> }. - -@item message-yank-cited-prefix -@vindex message-yank-cited-prefix -@cindex yanking -@cindex cited -@cindex quoting -The @code{message-yank-prefix} prefix is not used on already cited -lines, instead the contents of this variable is used as yank prefix. -The default is @samp{>}. - -@item message-yank-add-new-references -@vindex message-yank-add-new-references -@cindex yanking -Non-@code{nil} means new IDs will be added to References field when an -article is yanked by the command @code{message-yank-original} -interactively. If it is a symbol @code{message-id-only}, only an ID -from Message-ID field is used, otherwise IDs extracted from References, -In-Reply-To and Message-ID fields are used. - -@item message-list-references-add-position -@vindex message-list-references-add-position -@cindex yanking -Integer value means position for adding to References field when an -article is yanked by the command @code{message-yank-original} -interactively. - -@item message-indentation-spaces -@vindex message-indentation-spaces -Number of spaces to indent yanked messages. - -@item message-cite-function -@vindex message-cite-function -@findex message-cite-original -@findex sc-cite-original -@findex message-cite-original-without-signature -@cindex Supercite -Function for citing an original message. The default is -@code{message-cite-original}, which simply inserts the original message -and prepends @samp{> } to each line. -@code{message-cite-original-without-signature} does the same, but elides -the signature. You can also set it to @code{sc-cite-original} to use -Supercite. - -@item message-suspend-font-lock-when-citing -@vindex message-suspend-font-lock-when-citing -If non-@code{nil}, suspend font-lock'ing while citing an original -message. Some lazy demand-driven fontification tools (or Emacs itself) -have a bug that they often miss a buffer to be fontified. It will -mostly occur when Emacs prompts user for any inputs in the minibuffer. -Setting this option to non-@code{nil} may help you to avoid unpleasant -errors even if it is an add-hoc expedient. - -@item message-indent-citation-function -@vindex message-indent-citation-function -Function for modifying a citation just inserted in the mail buffer. -This can also be a list of functions. Each function can find the -citation between @code{(point)} and @code{(mark t)}. And each function -should leave point and mark around the citation text as modified. - -@item message-signature -@vindex message-signature -String to be inserted at the end of the message buffer. If @code{t} -(which is the default), the @code{message-signature-file} file will be -inserted instead. If a function, the result from the function will be -used instead. If a form, the result from the form will be used instead. -If this variable is @code{nil}, no signature will be inserted at all. - -@item message-signature-file -@vindex message-signature-file -File containing the signature to be inserted at the end of the buffer. -The default is @samp{~/.signature}. - -@end table - -Note that RFC1036bis says that a signature should be preceded by the three -characters @samp{-- } on a line by themselves. This is to make it -easier for the recipient to automatically recognize and process the -signature. So don't remove those characters, even though you might feel -that they ruin your beautiful design, like, totally. - -Also note that no signature should be more than four lines long. -Including ASCII graphics is an efficient way to get everybody to believe -that you are silly and have nothing important to say. - - -@node MIME -@section MIME -@cindex MML -@cindex MIME -@cindex multipart -@cindex attachment - -Message is a @sc{mime}-compliant posting agent. The user generally -doesn't have to do anything to make the @sc{mime} happen---Message will -automatically add the @code{Content-Type} and -@code{Content-Transfer-Encoding} headers. - -The most typical thing users want to use the multipart things in -@sc{mime} for is to add ``attachments'' to mail they send out. This can -be done with the @code{C-c C-a} command, which will prompt for a file -name and a @sc{mime} type. - -You can also create arbitrarily complex multiparts using the MML -language (@pxref{Composing, , Composing, emacs-mime, The Emacs MIME -Manual}). - -@node Security -@section Security -@cindex Security -@cindex S/MIME -@cindex PGP/MIME -@cindex sign -@cindex encrypt - -Using the MML language, Message is able to create digitally signed and -digitally encrypted messages. Message (or rather MML) currently support -PGP/MIME and S/MIME. Instructing MML to perform security operations on -a MIME part is done using the @code{C-c C-m s} key map for signing and the -@code{C-c C-m c} key map for encryption, as follows. - -@table @kbd - -@item C-c C-m s s -@kindex C-c C-m s s -@findex mml-secure-sign-smime - -Digitally sign current MIME part using S/MIME. - -@item C-c C-m s p -@kindex C-c C-m s p -@findex mml-secure-sign-pgp - -Digitally sign current MIME part using PGP/MIME. - -@item C-c C-m c s -@kindex C-c C-m c s -@findex mml-secure-encrypt-smime - -Digitally encrypt current MIME part using S/MIME. - -@item C-c C-m c p -@kindex C-c C-m c p -@findex mml-secure-encrypt-pgpmime - -Digitally encrypt current MIME part using PGP/MIME. - -@end table - -These commands do not immediately sign or encrypt the message, they -merely insert proper MML tags to instruct the MML engine to perform that -operation when the message is actually sent. They may perform other -operations too, such as locating and retrieving a S/MIME certificate of -the person you wish to send encrypted mail to. - -Since signing and especially encryption often is used when sensitive -information is sent, you may want to have some way to ensure that your -mail is actually signed or encrypted. After invoking the above -sign/encrypt commands, it is possible to preview the raw article by -using @code{C-u C-m P} (@code{mml-preview}). Then you can verify that -your long rant about what your ex-significant other or whomever actually -did with that funny looking person at that strange party the other -night, actually will be sent encrypted. - -@emph{Note!} Neither PGP/MIME nor S/MIME encrypt/signs RFC822 headers. -They only operate on the MIME object. Keep this in mind before sending -mail with a sensitive Subject line. - -Actually using the security commands above is not very difficult. At -least not compared with making sure all involved programs talk with each -other properly. Thus, we now describe what external libraries or -programs are required to make things work, and some small general hints. - -@subsection Using S/MIME - -@emph{Note!} This section assume you have a basic familiarity with -modern cryptography, S/MIME, various PKCS standards, OpenSSL and so on. - -The S/MIME support in Message (and MML) require OpenSSL. OpenSSL -perform the actual S/MIME sign/encrypt operations. OpenSSL can be found -at @code{http://www.openssl.org/}. OpenSSL 0.9.6 and later should work. -Version 0.9.5a cannot extract mail addresses from certificates, and it -insert a spurious CR character into MIME separators so you may wish to -avoid it if you would like to avoid being regarded as someone who send -strange mail. (Although by sending S/MIME messages you've probably -already lost that contest.) - -To be able to send encrypted mail, a personal certificate is not -required. Message (MML) need a certificate for the person to whom you -wish to communicate with though. You're asked for this when you type -@code{C-c C-m c s}. Currently there are two ways to retrieve this -certificate, from a local file or from DNS. If you chose a local file, -it need to contain a X.509 certificate in PEM format. If you chose DNS, -you're asked for the domain name where the certificate is stored, the -default is a good guess. To my belief, Message (MML) is the first mail -agent in the world to support retrieving S/MIME certificates from DNS, -so you're not likely to find very many certificates out there. At least -there should be one, stored at the domain @code{simon.josefsson.org}. -LDAP is a more popular method of distributing certificates, support for -it is planned. (Meanwhile, you can use @code{ldapsearch} from the -command line to retrieve a certificate into a file and use it.) - -As for signing messages, OpenSSL can't perform signing operations -without some kind of configuration. Especially, you need to tell it -where your private key and your certificate is stored. MML uses an -Emacs interface to OpenSSL, aptly named @code{smime.el}, and it contain -a @code{custom} group used for this configuration. So, try @code{M-x -customize-group RET smime RET} and look around. - -Currently there is no support for talking to a CA (or RA) to create your -own certificate. None is planned either. You need to do this manually -with OpenSSL or using some other program. I used Netscape and got a -free S/MIME certificate from one of the big CA's on the net. Netscape -is able to export your private key and certificate in PKCS #12 format. -Use OpenSSL to convert this into a plain X.509 certificate in PEM format -as follows. - -@example -$ openssl pkcs12 -in ns.p12 -clcerts -nodes > key+cert.pem -@end example - -The @code{key+cert.pem} file should be pointed to from the -@code{smime-keys} variable. You should now be able to send signed mail. - -@emph{Note!} Your private key is store unencrypted in the file, so take -care in handling it. - -@subsection Using PGP/MIME - -PGP/MIME requires an external OpenPGP implementation, such as GNU -Privacy Guard (@code{http://www.gnupg.org/}). It also requires an Emacs -interface to it, such as Mailcrypt (available from -@code{http://www.nb.net/~lbudney/linux/software/mailcrypt.html}) or -Florian Weimer's @code{gpg.el}. - -Creating your own OpenPGP key is described in detail in the -documentation of your OpenPGP implementation, so we refer to it. - -@node Various Commands -@section Various Commands - -@table @kbd - -@item C-c C-r -@kindex C-c C-r -@findex message-caesar-buffer-body -Caesar rotate (aka. rot13) the current message -(@code{message-caesar-buffer-body}). If narrowing is in effect, just -rotate the visible portion of the buffer. A numerical prefix says how -many places to rotate the text. The default is 13. - -@item C-c C-e -@kindex C-c C-e -@findex message-elide-region -Elide the text between point and mark (@code{message-elide-region}). -The text is killed and replaced with the contents of the variable -@code{message-elide-ellipsis}. The default value is to use an ellipsis -(@samp{[...]}). - -@item C-c C-z -@kindex C-c C-x -@findex message-kill-to-signature -Kill all the text up to the signature, or if that's missing, up to the -end of the message (@code{message-kill-to-signature}). - -@item C-c C-v -@kindex C-c C-v -@findex message-delete-not-region -Delete all text in the body of the message that is outside the region -(@code{message-delete-not-region}). - -@item M-RET -@kindex M-RET -@kindex message-newline-and-reformat -Insert four newlines, and then reformat if inside quoted text. - -Here's an example: - -@example -> This is some quoted text. And here's more quoted text. -@end example - -If point is before @samp{And} and you press @kbd{M-RET}, you'll get: - -@example -> This is some quoted text. - -* - -> And here's more quoted text. -@end example - -@samp{*} says where point will be placed. - -@item C-c C-t -@kindex C-c C-t -@findex message-insert-to -Insert a @code{To} header that contains the @code{Reply-To} or -@code{From} header of the message you're following up -(@code{message-insert-to}). - -@item C-c C-n -@kindex C-c C-n -@findex message-insert-newsgroups -Insert a @code{Newsgroups} header that reflects the @code{Followup-To} -or @code{Newsgroups} header of the article you're replying to -(@code{message-insert-newsgroups}). - -@item C-c M-r -@kindex C-c M-r -@findex message-rename-buffer -Rename the buffer (@code{message-rename-buffer}). If given a prefix, -prompt for a new buffer name. - -@end table - - -@node Sending -@section Sending - -@table @kbd -@item C-c C-c -@kindex C-c C-c -@findex message-send-and-exit -Send the message and bury the current buffer -(@code{message-send-and-exit}). - -@item C-c C-s -@kindex C-c C-s -@findex message-send -Send the message (@code{message-send}). - -@item C-c C-d -@kindex C-c C-d -@findex message-dont-send -Bury the message buffer and exit (@code{message-dont-send}). - -@item C-c C-k -@kindex C-c C-k -@findex message-kill-buffer -Kill the message buffer and exit (@code{message-kill-buffer}). - -@end table - - - -@node Mail Aliases -@section Mail Aliases -@cindex mail aliases -@cindex aliases - -@vindex message-mail-alias-type -The @code{message-mail-alias-type} variable controls what type of mail -alias expansion to use. Currently only one form is supported---Message -uses @code{mailabbrev} to handle mail aliases. If this variable is -@code{nil}, no mail alias expansion will be performed. - -@code{mailabbrev} works by parsing the @file{/etc/mailrc} and -@file{~/.mailrc} files. These files look like: - -@example -alias lmi "Lars Magne Ingebrigtsen " -alias ding "ding@@ifi.uio.no (ding mailing list)" -@end example - -After adding lines like this to your @file{~/.mailrc} file, you should -be able to just write @samp{lmi} in the @code{To} or @code{Cc} (and so -on) headers and press @kbd{SPC} to expand the alias. - -No expansion will be performed upon sending of the message---all -expansions have to be done explicitly. - - -@node Spelling -@section Spelling -@cindex spelling -@findex ispell-message - -There are two popular ways to have Emacs spell-check your messages: -@code{ispell} and @code{flyspell}. @code{ispell} is the older and -probably more popular package. You typically first write the message, -and then run the entire thing through @code{ispell} and fix all the -typos. To have this happen automatically when you send a message, put -something like the following in your @file{.emacs} file: - -@lisp -(add-hook 'message-send-hook 'ispell-message) -@end lisp - -@vindex ispell-message-dictionary-alist -If you're in the habit of writing in different languages, this can be -controlled by the @code{ispell-message-dictionary-alist} variable: - -@lisp -(setq ispell-message-dictionary-alist - '(("^Newsgroups:.*\\bde\\." . "deutsch8") - (".*" . "default"))) -@end lisp - -@code{ispell} depends on having the external @samp{ispell} command -installed. - -The other popular method is using @code{flyspell}. This package checks -your spelling while you're writing, and marks any mis-spelled words in -various ways. - -To use @code{flyspell}, put something like the following in your -@file{.emacs} file: - -@lisp -(defun my-message-setup-routine () - (flyspell-mode 1)) -(add-hook 'message-setup-hook 'my-message-setup-routine) -@end lisp - -@code{flyspell} depends on having the external @samp{ispell} command -installed. - - -@node Variables -@chapter Variables - -@menu -* Message Headers:: General message header stuff. -* Mail Headers:: Customizing mail headers. -* Mail Variables:: Other mail variables. -* News Headers:: Customizing news headers. -* News Variables:: Other news variables. -* Various Message Variables:: Other message variables. -* Sending Variables:: Variables for sending. -* Message Buffers:: How Message names its buffers. -* Message Actions:: Actions to be performed when exiting. -@end menu - - -@node Message Headers -@section Message Headers - -Message is quite aggressive on the message generation front. It has to -be -- it's a combined news and mail agent. To be able to send combined -messages, it has to generate all headers itself (instead of letting the -mail/news system do it) to ensure that mail and news copies of messages -look sufficiently similar. - -@table @code - -@item message-generate-headers-first -@vindex message-generate-headers-first -If non-@code{nil}, generate all required headers before starting to -compose the message. - -The variables @code{message-required-mail-headers} and -@code{message-required-news-headers} specify which headers are required. - -Note that some headers will be removed and re-generated before posting, -because of the variable @code{message-deletable-headers} (see below). - -@item message-from-style -@vindex message-from-style -Specifies how @code{From} headers should look. There are four valid -values: - -@table @code -@item nil -Just the address -- @samp{king@@grassland.com}. - -@item parens -@samp{king@@grassland.com (Elvis Parsley)}. - -@item angles -@samp{Elvis Parsley }. - -@item default -Look like @code{angles} if that doesn't require quoting, and -@code{parens} if it does. If even @code{parens} requires quoting, use -@code{angles} anyway. - -@end table - -@item message-deletable-headers -@vindex message-deletable-headers -Headers in this list that were previously generated by Message will be -deleted before posting. Let's say you post an article. Then you decide -to post it again to some other group, you naughty boy, so you jump back -to the @code{*post-buf*} buffer, edit the @code{Newsgroups} line, and -ship it off again. By default, this variable makes sure that the old -generated @code{Message-ID} is deleted, and a new one generated. If -this isn't done, the entire empire would probably crumble, anarchy would -prevail, and cats would start walking on two legs and rule the world. -Allegedly. - -@item message-default-headers -@vindex message-default-headers -This string is inserted at the end of the headers in all message -buffers. - -@item message-subject-re-regexp -@vindex message-subject-re-regexp -Responses to messages have subjects that start with @samp{Re: }. This -is @emph{not} an abbreviation of the English word ``response'', but is -Latin, and means ``in response to''. Some illiterate nincompoops have -failed to grasp this fact, and have ``internationalized'' their software -to use abonimations like @samp{Aw: } (``antwort'') or @samp{Sv: } -(``svar'') instead, which is meaningless and evil. However, you may -have to deal with users that use these evil tools, in which case you may -set this variable to a regexp that matches these prefixes. Myself, I -just throw away non-compliant mail. - -@item message-alternative-emails -@vindex message-alternative-emails -A regexp to match the alternative email addresses. The first matched -address (not primary one) is used in the @code{From} field. - -@end table - - -@node Mail Headers -@section Mail Headers - -@table @code -@item message-required-mail-headers -@vindex message-required-mail-headers -@xref{News Headers}, for the syntax of this variable. It is -@code{(From Date Subject (optional . In-Reply-To) Message-ID Lines -(optional . User-Agent))} by default. - -@item message-ignored-mail-headers -@vindex message-ignored-mail-headers -Regexp of headers to be removed before mailing. The default is -@samp{^[GF]cc:\\|^Resent-Fcc:\\|^Xref:\\|^X-Draft-From:}. - -@item message-default-mail-headers -@vindex message-default-mail-headers -This string is inserted at the end of the headers in all message -buffers that are initialized as mail. - -@end table - - -@node Mail Variables -@section Mail Variables - -@table @code -@item message-send-mail-function -@vindex message-send-mail-function -@findex message-send-mail-with-sendmail -@findex message-send-mail-with-mh -@findex message-send-mail-with-qmail -@findex smtpmail-send-it -@findex feedmail-send-it -Function used to send the current buffer as mail. The default is -@code{message-send-mail-with-sendmail}. Other valid values include -@code{message-send-mail-with-mh}, @code{message-send-mail-with-qmail}, -@code{smtpmail-send-it} and @code{feedmail-send-it}. - -@item message-mh-deletable-headers -@vindex message-mh-deletable-headers -Most versions of MH doesn't like being fed messages that contain the -headers in this variable. If this variable is non-@code{nil} (which is -the default), these headers will be removed before mailing when sending -messages via MH. Set it to @code{nil} if your MH can handle these -headers. - -@item message-send-mail-partially-limit -@vindex message-send-mail-partially-limit -The limitation of messages sent as message/partial. -The lower bound of message size in characters, beyond which the message -should be sent in several parts. If it is nil, the size is unlimited. - -@end table - - -@node News Headers -@section News Headers - -@vindex message-required-news-headers -@code{message-required-news-headers} a list of header symbols. These -headers will either be automatically generated, or, if that's -impossible, they will be prompted for. The following symbols are valid: - -@table @code - -@item From -@cindex From -@findex user-full-name -@findex user-mail-address -This required header will be filled out with the result of the -@code{message-make-from} function, which depends on the -@code{message-from-style}, @code{user-full-name}, -@code{user-mail-address} variables. - -@item Subject -@cindex Subject -This required header will be prompted for if not present already. - -@item Newsgroups -@cindex Newsgroups -This required header says which newsgroups the article is to be posted -to. If it isn't present already, it will be prompted for. - -@item Organization -@cindex organization -This optional header will be filled out depending on the -@code{message-user-organization} variable. -@code{message-user-organization-file} will be used if this variable is -@code{t}. This variable can also be a string (in which case this string -will be used), or it can be a function (which will be called with no -parameters and should return a string to be used). - -@item Lines -@cindex Lines -This optional header will be computed by Message. - -@item Message-ID -@cindex Message-ID -@vindex mail-host-address -@findex system-name -@cindex Sun -This required header will be generated by Message. A unique ID will be -created based on the date, time, user name and system name. Message -will use @code{system-name} to determine the name of the system. If -this isn't a fully qualified domain name (FQDN), Message will use -@code{mail-host-address} as the FQDN of the machine. - -@item User-Agent -@cindex User-Agent -This optional header will be filled out according to the -@code{message-newsreader} local variable. - -@item In-Reply-To -This optional header is filled out using the @code{Date} and @code{From} -header of the article being replied to. - -@item Expires -@cindex Expires -This extremely optional header will be inserted according to the -@code{message-expires} variable. It is highly deprecated and shouldn't -be used unless you know what you're doing. - -@item Distribution -@cindex Distribution -This optional header is filled out according to the -@code{message-distribution-function} variable. It is a deprecated and -much misunderstood header. - -@item Path -@cindex path -This extremely optional header should probably never be used. -However, some @emph{very} old servers require that this header is -present. @code{message-user-path} further controls how this -@code{Path} header is to look. If it is @code{nil}, use the server name -as the leaf node. If it is a string, use the string. If it is neither -a string nor @code{nil}, use the user name only. However, it is highly -unlikely that you should need to fiddle with this variable at all. -@end table - -@findex yow -@cindex Mime-Version -In addition, you can enter conses into this list. The car of this cons -should be a symbol. This symbol's name is the name of the header, and -the cdr can either be a string to be entered verbatim as the value of -this header, or it can be a function to be called. This function should -return a string to be inserted. For instance, if you want to insert -@code{Mime-Version: 1.0}, you should enter @code{(Mime-Version . "1.0")} -into the list. If you want to insert a funny quote, you could enter -something like @code{(X-Yow . yow)} into the list. The function -@code{yow} will then be called without any arguments. - -If the list contains a cons where the car of the cons is -@code{optional}, the cdr of this cons will only be inserted if it is -non-@code{nil}. - -Other variables for customizing outgoing news articles: - -@table @code - -@item message-syntax-checks -@vindex message-syntax-checks -Controls what syntax checks should not be performed on outgoing posts. -To disable checking of long signatures, for instance, add - -@lisp -(signature . disabled) -@end lisp - -to this list. - -Valid checks are: - -@table @code -@item subject-cmsg -Check the subject for commands. -@item sender -@cindex Sender -Insert a new @code{Sender} header if the @code{From} header looks odd. -@item multiple-headers -Check for the existence of multiple equal headers. -@item sendsys -@cindex sendsys -Check for the existence of version and sendsys commands. -@item message-id -Check whether the @code{Message-ID} looks ok. -@item from -Check whether the @code{From} header seems nice. -@item long-lines -@cindex long lines -Check for too long lines. -@item control-chars -Check for invalid characters. -@item size -Check for excessive size. -@item new-text -Check whether there is any new text in the messages. -@item signature -Check the length of the signature. -@item approved -@cindex approved -Check whether the article has an @code{Approved} header, which is -something only moderators should include. -@item empty -Check whether the article is empty. -@item invisible-text -Check whether there is any invisible text in the buffer. -@item empty-headers -Check whether any of the headers are empty. -@item existing-newsgroups -Check whether the newsgroups mentioned in the @code{Newsgroups} and -@code{Followup-To} headers exist. -@item valid-newsgroups -Check whether the @code{Newsgroups} and @code{Followup-to} headers -are valid syntactically. -@item repeated-newsgroups -Check whether the @code{Newsgroups} and @code{Followup-to} headers -contains repeated group names. -@item shorten-followup-to -Check whether to add a @code{Followup-to} header to shorten the number -of groups to post to. -@end table - -All these conditions are checked by default. - -@item message-ignored-news-headers -@vindex message-ignored-news-headers -Regexp of headers to be removed before posting. The default is@* -@samp{^NNTP-Posting-Host:\\|^Xref:\\|^[BGF]cc:\\|^Resent-Fcc:\\|^X-Draft-From:}. - -@item message-default-news-headers -@vindex message-default-news-headers -This string is inserted at the end of the headers in all message -buffers that are initialized as news. - -@end table - - -@node News Variables -@section News Variables - -@table @code -@item message-send-news-function -@vindex message-send-news-function -Function used to send the current buffer as news. The default is -@code{message-send-news}. - -@item message-post-method -@vindex message-post-method -Gnusish @dfn{select method} (see the Gnus manual for details) used for -posting a prepared news message. - -@end table - - -@node Various Message Variables -@section Various Message Variables - -@table @code -@item message-default-charset -@vindex message-default-charset -@cindex charset -Symbol naming a @sc{mime} charset. Non-ASCII characters in messages are -assumed to be encoded using this charset. The default is @code{nil}, -which means ask the user. (This variable is used only on non-@sc{mule} -Emacsen. -@xref{Charset Translation, , Charset Translation, emacs-mime, - Emacs MIME Manual}, for details on the @sc{mule}-to-@sc{mime} -translation process. - -@item message-signature-separator -@vindex message-signature-separator -Regexp matching the signature separator. It is @samp{^-- *$} by -default. - -@item mail-header-separator -@vindex mail-header-separator -String used to separate the headers from the body. It is @samp{--text -follows this line--} by default. - -@item message-directory -@vindex message-directory -Directory used by many mailey things. The default is @file{~/Mail/}. - -@item message-signature-setup-hook -@vindex message-signature-setup-hook -Hook run when initializing the message buffer. It is run after the -headers have been inserted but before the signature has been inserted. - -@item message-setup-hook -@vindex message-setup-hook -Hook run as the last thing when the message buffer has been initialized, -but before yanked text is inserted. - -@item message-header-setup-hook -@vindex message-header-setup-hook -Hook called narrowed to the headers after initializing the headers. - -For instance, if you're running Gnus and wish to insert a -@samp{Mail-Copies-To} header in all your news articles and all messages -you send to mailing lists, you could do something like the following: - -@lisp -(defun my-message-header-setup-hook () - (let ((group (or gnus-newsgroup-name ""))) - (when (or (message-fetch-field "newsgroups") - (gnus-group-find-parameter group 'to-address) - (gnus-group-find-parameter group 'to-list)) - (insert "Mail-Copies-To: never\n")))) - -(add-hook 'message-header-setup-hook - 'my-message-header-setup-hook) -@end lisp - -@item message-send-hook -@vindex message-send-hook -Hook run before sending messages. - -If you want to add certain headers before sending, you can use the -@code{message-add-header} function in this hook. For instance: -@findex message-add-header - -@lisp -(add-hook 'message-send-hook 'my-message-add-content) -(defun my-message-add-content () - (message-add-header "X-In-No-Sense: Nonsense") - (message-add-header "X-Whatever: no")) -@end lisp - -This function won't add the header if the header is already present. - -@item message-send-mail-hook -@vindex message-send-mail-hook -Hook run before sending mail messages. - -@item message-send-news-hook -@vindex message-send-news-hook -Hook run before sending news messages. - -@item message-sent-hook -@vindex message-sent-hook -Hook run after sending messages. - -@item message-mode-syntax-table -@vindex message-mode-syntax-table -Syntax table used in message mode buffers. - -@item message-send-method-alist -@vindex message-send-method-alist - -Alist of ways to send outgoing messages. Each element has the form - -@lisp -(TYPE PREDICATE FUNCTION) -@end lisp - -@table @var -@item type -A symbol that names the method. - -@item predicate -A function called without any parameters to determine whether the -message is a message of type @var{type}. - -@item function -A function to be called if @var{predicate} returns non-@code{nil}. -@var{function} is called with one parameter -- the prefix. -@end table - -@lisp -((news message-news-p message-send-via-news) - (mail message-mail-p message-send-via-mail)) -@end lisp - - - -@end table - - - -@node Sending Variables -@section Sending Variables - -@table @code - -@item message-fcc-handler-function -@vindex message-fcc-handler-function -A function called to save outgoing articles. This function will be -called with the name of the file to store the article in. The default -function is @code{message-output} which saves in Unix mailbox format. - -@item message-courtesy-message -@vindex message-courtesy-message -When sending combined messages, this string is inserted at the start of -the mailed copy. If the string contains the format spec @samp{%s}, the -newsgroups the article has been posted to will be inserted there. If -this variable is @code{nil}, no such courtesy message will be added. -The default value is @samp{"The following message is a courtesy copy of -an article\nthat has been posted to %s as well.\n\n"}. - -@end table - - -@node Message Buffers -@section Message Buffers - -Message will generate new buffers with unique buffer names when you -request a message buffer. When you send the message, the buffer isn't -normally killed off. Its name is changed and a certain number of old -message buffers are kept alive. - -@table @code -@item message-generate-new-buffers -@vindex message-generate-new-buffers -If non-@code{nil}, generate new buffers. The default is @code{t}. If -this is a function, call that function with three parameters: The type, -the to address and the group name. (Any of these may be @code{nil}.) -The function should return the new buffer name. - -@item message-use-multi-frames -@vindex message-use-multi-frames -If non-@code{nil}, generate new frames. The default is @code{nil}. - -@item message-delete-frame-on-exit -@vindex message-delete-frame-on-exit -The @code{message-delete-frame-on-exit} variable says whether to delete -the frame after sending the message or killing the message buffer. If it -is @code{nil} (which is the default), don't delete the frame. If it is -@code{ask}, ask wheter to delete the frame. If it is @code{t}, always -delete the frame. - -@item message-max-buffers -@vindex message-max-buffers -This variable says how many old message buffers to keep. If there are -more message buffers than this, the oldest buffer will be killed. The -default is 10. If this variable is @code{nil}, no old message buffers -will ever be killed. - -@item message-send-rename-function -@vindex message-send-rename-function -After sending a message, the buffer is renamed from, for instance, -@samp{*reply to Lars*} to @samp{*sent reply to Lars*}. If you don't -like this, set this variable to a function that renames the buffer in a -manner you like. If you don't want to rename the buffer at all, you can -say: - -@lisp -(setq message-send-rename-function 'ignore) -@end lisp - -@item message-kill-buffer-on-exit -@findex message-kill-buffer-on-exit -If non-@code{nil}, kill the buffer immediately on exit. - -@end table - - -@node Message Actions -@section Message Actions - -When Message is being used from a news/mail reader, the reader is likely -to want to perform some task after the message has been sent. Perhaps -return to the previous window configuration or mark an article as -replied. - -@vindex message-kill-actions -@vindex message-postpone-actions -@vindex message-exit-actions -@vindex message-send-actions -The user may exit from the message buffer in various ways. The most -common is @kbd{C-c C-c}, which sends the message and exits. Other -possibilities are @kbd{C-c C-s} which just sends the message, @kbd{C-c -C-d} which postpones the message editing and buries the message buffer, -and @kbd{C-c C-k} which kills the message buffer. Each of these actions -have lists associated with them that contains actions to be executed: -@code{message-send-actions}, @code{message-exit-actions}, -@code{message-postpone-actions}, and @code{message-kill-actions}. - -Message provides a function to interface with these lists: -@code{message-add-action}. The first parameter is the action to be -added, and the rest of the arguments are which lists to add this action -to. Here's an example from Gnus: - -@lisp - (message-add-action - `(set-window-configuration ,(current-window-configuration)) - 'exit 'postpone 'kill) -@end lisp - -This restores the Gnus window configuration when the message buffer is -killed, postponed or exited. - -An @dfn{action} can be either: a normal function, or a list where the -@code{car} is a function and the @code{cdr} is the list of arguments, or -a form to be @code{eval}ed. - - -@node Compatibility -@chapter Compatibility -@cindex compatibility - -Message uses virtually only its own variables---older @code{mail-} -variables aren't consulted. To force Message to take those variables -into account, you can put the following in your @code{.emacs} file: - -@lisp -(require 'messcompat) -@end lisp - -This will initialize many Message variables from the values in the -corresponding mail variables. - - -@node Appendices -@chapter Appendices - -@menu -* Responses:: Standard rules for determining where responses go. -@end menu - - -@node Responses -@section Responses - -To determine where a message is to go, the following algorithm is used -by default. - -@table @dfn -@item reply -A @dfn{reply} is when you want to respond @emph{just} to the person who -sent the message via mail. There will only be one recipient. To -determine who the recipient will be, the following headers are -consulted, in turn: - -@table @code -@item Reply-To - -@item From -@end table - - -@item wide reply -A @dfn{wide reply} is a mail response that includes @emph{all} entities -mentioned in the message you are responded to. All mailboxes from the -following headers will be concatenated to form the outgoing -@code{To}/@code{Cc} headers: - -@table @code -@item From -(unless there's a @code{Reply-To}, in which case that is used instead). - -@item Cc - -@item To -@end table - -If a @code{Mail-Copies-To} header is present, it will also be included -in the list of mailboxes. If this header is @samp{never}, that means -that the @code{From} (or @code{Reply-To}) mailbox will be suppressed. - - -@item followup -A @dfn{followup} is a response sent via news. The following headers -(listed in order of precedence) determine where the response is to be -sent: - -@table @code - -@item Followup-To - -@item Newsgroups - -@end table - -If a @code{Mail-Copies-To} header is present, it will be used as the -basis of the new @code{Cc} header, except if this header is -@samp{never}. - -@end table - - - -@node Index -@chapter Index -@printindex cp - -@node Key Index -@chapter Key Index -@printindex ky - -@summarycontents -@contents -@bye - -@c End: diff --git a/texi/pagestyle.sty b/texi/pagestyle.sty deleted file mode 100644 index ffd4529..0000000 --- a/texi/pagestyle.sty +++ /dev/null @@ -1,85 +0,0 @@ -\def\verbatim@font{\fontencoding{OT1}\fontfamily{pcr}\fontsize{10pt}{10}\selectfont} - -\catcode `\÷ = \active -\def ÷{\penalty10000\hskip0.001pt-\penalty\hyphenpenalty\hskip0.001pt\relax} - -\def \newpagestyle#1#2#3{\@namedef{ps@#1}{\def\@oddhead{#2}\def\@oddfoot{#3}% - \let\@evenhead\@oddhead \let\@evenfoot\@oddfoot}} -\def \newdoublepagestyle#1#2#3#4#5{\@namedef{ps@#1}{\def\@evenhead{#2}% - \def\@oddhead{#3}% - \def\@evenfoot{#4}% - \def\@oddfoot{#5}}} - -\newlength{\headtextwidth} -\setlength{\headtextwidth}{\textwidth} -\addtolength{\headtextwidth}{2cm} -\newlength{\headetextwidth} -\setlength{\headetextwidth}{\headtextwidth} -\addtolength{\headetextwidth}{-0.5cm} -\newlength{\headotextwidth} -\setlength{\headotextwidth}{\headtextwidth} -\addtolength{\headotextwidth}{-0.35cm} - -\def\outputpage{% - \let \protect \noexpand - \shipout \vbox{% - \set@typeset@protect - \aftergroup\set@typeset@protect - \@shipoutsetup - \@begindvi - \vskip \topmargin - \moveright\@themargin \vbox {% - \setbox\@tempboxa \vbox to\headheight{% - \vfil - \color@hbox - \normalcolor - \hb@xt@ \headtextwidth {% - \let \label \@gobble - \let \index \@gobble - \let \glossary \@gobble %% 21 Jun 91 - \@thehead - }% - \color@endbox - }% %% 22 Feb 87 - \ifodd\c@page - \dp\@tempboxa \z@ - \box\@tempboxa \mbox{} \\ - \ifx \@oddhead\@empty\else - % \rule{\headotextwidth}{0.5pt} - \fi - \else - \hskip -2.2cm - \dp\@tempboxa \z@ - \box\@tempboxa \mbox{} - \\\mbox{} - \vskip 2pt - \hskip -2.0cm - \ifx \@oddhead\@empty\else - % \rule{\headetextwidth}{0.5pt} - \fi - \fi - \vskip \headsep - \box\@outputbox - \baselineskip \footskip - \color@hbox - \normalcolor - \hb@xt@\textwidth{% - \let \label \@gobble - \let \index \@gobble %% 22 Feb 87 - \let \glossary \@gobble %% 21 Jun 91 - \@thefoot - }% - \color@endbox - }% - }% - \global \@colht \textheight - \stepcounter{page}% - \let\firstmark\botmark -} - -\def\@makechapterhead#1{\gnuspagechapter{#1}} - -\setcounter{tocdepth}{3} -\setcounter{secnumdepth}{3} - -\def\verbatim@font{\fontfamily{bcr}\fontsize{10pt}{10}\selectfont} diff --git a/texi/postamble.tex b/texi/postamble.tex deleted file mode 100644 index a7d0a5c..0000000 --- a/texi/postamble.tex +++ /dev/null @@ -1,46 +0,0 @@ -\gnuscleardoublepage - -\pagestyle{gnusindex} - -\renewcommand\indexname{Key Index} -\renewcommand{\gnuschaptername}{Key Index} -\input{gnus.kind} -\gnuscleardoublepage - -\renewcommand\indexname{Function and Variable Index} -\renewcommand{\gnuschaptername}{Function and Variable Index} -\input{gnus.gind} -\gnuscleardoublepage -\thispagestyle{empty} - -\renewcommand\indexname{Concept Index} -\renewcommand{\gnuschaptername}{Concept Index} -\input{gnus.cind} - -\mbox{} -%\thispagestyle{empty}\mbox{}\clearpage\thispagestyle{empty}\mbox{}\clearpage -\ifodd\count0\else\thispagestyle{empty}\clearpage\fi -\mbox{} -\thispagestyle{empty} -\vfill - -This manual was written by Lars Magne Ingebrigtsen (1968 --- ) who -resides in Oslo, Norway and poses as a student, but doesn't get much -studying done, for some strange reason or other. When not worshipping -at the altar of Emacs, he can often be found slouching on his couch -reading while bopping his head gently to some obscure music. He does -not have a cat. - -\marginpar[\vspace*{-2.5cm}\epsfig{figure=tmp/larsi.ps,height=2cm}]{\vspace*{-2.2cm}\epsfig{figure=tmp/larsi.ps,height=2.5cm}} - -Graphics by Luis Fernandes. Set in Adobe Bembo, Adobe Futura and -Bitstream Courier. - -\clearpage -\mbox{} -\thispagestyle{empty} -\begin{picture}(500,500)(0,0) -\put(-35,325){\makebox(480,350)[tr]{\epsfig{figure=tmp/new-herd-section.ps}}} -\end{picture} - -\end{document} diff --git a/texi/ps/gnus-big-logo.eps b/texi/ps/gnus-big-logo.eps deleted file mode 100644 index 88ea3b8..0000000 --- a/texi/ps/gnus-big-logo.eps +++ /dev/null @@ -1,213 +0,0 @@ -%!PS-Adobe-2.0 EPSF-1.2 -%%Creator: Adobe Illustrator 88(TM) format generated by CorelTRACE Version 2.0C -%%Title: /home/menja/c/larsi/rgnus/texi/ps/eegnu.eps -%%BoundingBox: 0 0 890.3 909.7 -%%CreationDate: Fri Oct 11 14:59:05 1996 -%%DocumentFonts: -%%ColorUsage: B & W -%%TileBox: 0 0 890.3 909.7 -%%EndComments -%%BeginProcSet:Adobe_Illustrator_1.1 0 0 -% Copyright 1992 Corel Corporation. - -% All rights reserved. -/wPSMDict 150 dict def -wPSMDict begin -/bd {bind def} bind def -/ld {load def} bd -/xd {exch def} bd -/_ null def -/$c 0 def -/$m 0 def -/$y 0 def -/$k 0 def -/$t 1 def -/$n _ def -/$o 0 def -/$C 0 def -/$M 0 def -/$Y 0 def -/$K 0 def -/$T 1 def -/$N _ def -/$O 0 def -/$h false def -/$al 0 def -/$tr 0 def -/$le 0 def -/$lx 0 def -/$ly 0 def -/$ctm matrix currentmatrix def -/@cp /closepath ld -/@gs /gsave ld -/@gr /grestore ld -/@MN {2 copy le{pop}{exch pop}ifelse}bd -/setcmykcolor where {pop}{/setcmykcolor{4 1 roll -3 {3 index add 1 @MN 1 exch sub 3 1 roll} repeat -setrgbcolor -pop}bd}ifelse -/@tc{dup 1 ge{pop}{4 {dup -6 -1 roll -mul -exch}repeat -pop}ifelse}bd -/@scc{$c $m $y $k $t @tc setcmykcolor true}bd -/@SCC{$C $M $Y $K $T @tc setcmykcolor true}bd -/@sm{/$ctm $ctm currentmatrix def}bd -/x {/$t xd /$n xd -/$k xd /$y xd /$m xd /$c xd}bd -/X {/$T xd /$N xd -/$K xd /$Y xd /$M xd /$C xd}bd -/g {1 exch sub 0 0 0 -4 -1 roll -_ 1 x}bd -/G {1 exch sub 0 0 0 -4 -1 roll -_ 1 X}bd -/k {_ 1 x}bd -/K {_ 1 X}bd -/d /setdash ld -/i {dup 0 ne {setflat} {pop} ifelse}bd -/j /setlinejoin ld -/J /setlinecap ld -/M /setmiterlimit ld -/w /setlinewidth ld -/O {/$o xd}bd -/R {/$O xd}bd -/c /curveto ld -/C /c ld -/l /lineto ld -/L /l ld -/m /moveto ld -/n /newpath ld -/N /newpath ld -/F {@scc{eofill}if n} bd -/f {@cp F}bd -/S {@SCC{stroke}if n} bd -/s {@cp -S}bd -/B {@gs F @gr -S}bd -/b {@cp B }bd -/u {}bd -/U {}bd -%%EndProlog -%%BeginSetup -%%EndSetup -1 i -2 J -0 j -4 M -[]0 d - -%%Note: traced as Normal_Outline -0 g -163.4 2.9 m -197.1 51.5 223.7 94.3 251.6 130.7 C -283.4 176.1 312.0 216.3 342.8 256.8 C -373.2 303.2 401.1 342.1 420.0 396.9 C -421.2 403.1 425.1 408.9 424.5 413.5 C -395.6 371.6 368.4 326.2 337.2 285.0 C -306.1 247.4 276.3 199.4 244.5 161.5 C -212.1 116.7 182.9 79.1 168.6 20.4 C -166.3 13.9 164.7 8.1 162.4 2.2 C -162.4 2.2 163.4 2.9 163.4 2.9 C -f -0 g -428.1 170.2 m -428.1 170.2 429.7 170.2 430.0 170.5 C -454.7 211.4 474.8 275.6 504.0 301.9 C -512.1 300.6 515.0 280.8 527.3 283.1 C -534.8 284.4 536.4 284.1 542.9 288.9 C -571.4 331.1 600.3 374.5 623.6 423.2 C -640.2 454.7 661.6 492.9 663.5 517.6 C -660.3 515.6 L -633.7 468.6 613.2 419.6 582.4 378.4 C -572.1 367.1 566.5 352.8 550.7 348.3 C -543.2 348.3 536.1 354.4 530.5 363.8 C -528.9 367.1 528.9 368.1 525.4 369.7 C -495.5 333.7 466.7 282.8 446.5 233.5 C -436.2 206.2 433.2 190.0 427.4 170.5 C -427.4 170.5 428.1 170.2 428.1 170.2 C -f -0 g -754.7 271.7 m -783.8 345.7 780.3 386.2 794.2 447.5 C -806.2 497.1 819.2 543.8 843.5 614.9 C -869.5 690.4 875.0 731.0 888.0 787.1 C -892.5 826.7 892.8 865.9 869.5 898.7 C -853.9 908.7 841.9 912.3 822.1 909.4 C -785.5 890.2 764.1 846.4 749.8 799.7 C -750.4 793.6 750.8 791.3 755.0 788.1 C -755.6 788.1 756.9 788.1 757.9 788.1 C -772.8 803.3 773.8 842.9 796.8 849.0 C -817.6 849.0 826.3 847.7 840.3 834.8 C -855.8 799.7 856.2 789.4 858.1 755.0 C -855.2 687.5 836.7 643.7 819.8 576.9 C -801.7 513.7 781.9 454.3 772.8 406.7 C -766.3 361.6 755.0 332.4 754.0 271.7 C -754.0 271.7 754.7 271.7 754.7 271.7 C -f -0 g -383.0 484.8 m -421.2 539.0 420.6 593.1 405.4 650.9 C -395.0 674.5 382.7 683.6 367.7 695.0 C -354.8 681.0 339.2 664.2 330.1 640.2 C -330.1 640.2 330.1 638.5 330.4 638.2 C -351.5 628.8 372.3 592.2 378.1 567.2 C -381.0 544.5 378.8 505.2 382.3 484.8 C -382.3 484.8 383.0 484.8 383.0 484.8 C -f -0 g -120.6 509.8 m -171.2 511.7 215.0 550.7 255.8 589.6 C -283.4 609.7 302.2 627.8 315.8 663.5 C -280.8 636.9 238.3 595.7 192.6 571.7 C -179.6 566.2 162.4 565.6 147.8 570.4 C -139.4 578.2 136.2 580.5 136.5 588.6 C -144.6 635.3 192.3 684.3 217.6 724.8 C -223.4 738.1 235.7 745.9 238.3 758.9 C -204.3 726.8 174.1 677.1 147.5 634.3 C -127.1 600.3 95.3 560.1 102.1 520.5 C -107.0 510.8 111.8 513.7 120.6 509.8 C -f -0 g -621.7 657.7 m -669.0 661.2 703.4 716.1 724.8 769.6 C -730.7 779.0 728.7 785.5 731.3 792.9 C -711.8 758.5 695.0 728.4 656.7 720.9 C -638.2 720.3 635.0 721.9 624.9 732.6 C -621.7 736.5 620.4 739.4 618.1 744.3 C -588.6 683.0 L -593.1 671.6 598.3 665.5 608.1 661.9 C -612.0 661.6 617.8 659.0 621.7 657.7 C -f -0 g -502.0 681.0 m -526.7 680.4 547.7 694.7 565.2 716.1 C -576.0 734.9 583.1 755.0 592.2 775.4 C -592.2 779.6 591.5 783.2 592.8 786.8 C -582.4 775.7 571.4 752.7 549.7 746.5 C -520.8 736.2 500.7 751.4 481.6 766.7 C -440.4 802.3 416.7 847.7 366.8 868.5 C -346.3 878.2 335.0 875.6 319.1 869.5 C -300.3 862.7 292.8 850.7 279.2 833.8 C -285.0 838.3 271.7 828.6 277.2 833.5 C -268.5 845.8 244.2 875.3 220.8 881.1 C -168.6 888.3 147.5 809.8 96.3 789.4 C -83.3 784.8 72.0 776.7 61.2 781.6 C -41.5 794.2 38.2 804.6 27.5 824.1 C -2.2 764.7 L -9.0 751.1 16.8 730.3 32.1 725.1 C -45.0 720.3 55.1 721.6 68.1 727.1 C -91.1 745.2 116.4 758.9 132.0 779.3 C -140.1 789.4 146.5 797.5 157.6 808.5 C -166.3 816.6 176.1 823.1 187.7 827.0 C -219.2 813.0 240.6 789.7 259.1 759.5 C -275.3 782.5 284.7 815.0 321.4 810.1 C -373.9 801.4 405.0 751.7 443.6 715.1 C -462.8 694.7 478.3 687.2 502.0 681.0 C -f -%%Trailer -end -showpage diff --git a/texi/ps/gnus-head.eps b/texi/ps/gnus-head.eps deleted file mode 100644 index 82206f8..0000000 --- a/texi/ps/gnus-head.eps +++ /dev/null @@ -1,150 +0,0 @@ -%!PS-Adobe-2.0 EPSF-1.2 -%%Creator: Adobe Illustrator 88(TM) format generated by CorelTRACE Version 2.0C -%%Title: /home/menja/c/larsi/gnus-head.eps -%%BoundingBox: 0 0 430.6 312.5 -%%CreationDate: Sat Feb 3 13:06:12 1996 -%%DocumentFonts: -%%ColorUsage: B & W -%%TileBox: 0 0 430.6 312.5 -%%EndComments -%%BeginProcSet:Adobe_Illustrator_1.1 0 0 -% Copyright 1992 Corel Corporation. - -% All rights reserved. -/wPSMDict 150 dict def -wPSMDict begin -/bd {bind def} bind def -/ld {load def} bd -/xd {exch def} bd -/_ null def -/$c 0 def -/$m 0 def -/$y 0 def -/$k 0 def -/$t 1 def -/$n _ def -/$o 0 def -/$C 0 def -/$M 0 def -/$Y 0 def -/$K 0 def -/$T 1 def -/$N _ def -/$O 0 def -/$h false def -/$al 0 def -/$tr 0 def -/$le 0 def -/$lx 0 def -/$ly 0 def -/$ctm matrix currentmatrix def -/@cp /closepath ld -/@gs /gsave ld -/@gr /grestore ld -/@MN {2 copy le{pop}{exch pop}ifelse}bd -/setcmykcolor where {pop}{/setcmykcolor{4 1 roll -3 {3 index add 1 @MN 1 exch sub 3 1 roll} repeat -setrgbcolor -pop}bd}ifelse -/@tc{dup 1 ge{pop}{4 {dup -6 -1 roll -mul -exch}repeat -pop}ifelse}bd -/@scc{$c $m $y $k $t @tc setcmykcolor true}bd -/@SCC{$C $M $Y $K $T @tc setcmykcolor true}bd -/@sm{/$ctm $ctm currentmatrix def}bd -/x {/$t xd /$n xd -/$k xd /$y xd /$m xd /$c xd}bd -/X {/$T xd /$N xd -/$K xd /$Y xd /$M xd /$C xd}bd -/g {1 exch sub 0 0 0 -4 -1 roll -_ 1 x}bd -/G {1 exch sub 0 0 0 -4 -1 roll -_ 1 X}bd -/k {_ 1 x}bd -/K {_ 1 X}bd -/d /setdash ld -/i {dup 0 ne {setflat} {pop} ifelse}bd -/j /setlinejoin ld -/J /setlinecap ld -/M /setmiterlimit ld -/w /setlinewidth ld -/O {/$o xd}bd -/R {/$O xd}bd -/c /curveto ld -/C /c ld -/l /lineto ld -/L /l ld -/m /moveto ld -/n /newpath ld -/N /newpath ld -/F {@scc{eofill}if n} bd -/f {@cp F}bd -/S {@SCC{stroke}if n} bd -/s {@cp -S}bd -/B {@gs F @gr -S}bd -/b {@cp B }bd -/u {}bd -/U {}bd -%%EndProlog -%%BeginSetup -%%EndSetup -1 i -2 J -0 j -4 M -[]0 d - -%%Note: traced as Normal_Outline -0 g -267.8 10.0 m -291.8 50.8 294.2 95.0 278.8 136.8 C -270.2 147.3 264.9 154.5 252.4 156.9 C -227.0 119.5 L -256.3 98.8 267.3 63.3 264.0 12.4 C -264.4 10.5 265.9 9.1 265.9 9.1 C -265.9 9.1 267.8 10.0 267.8 10.0 C -f -0 g -79.2 40.3 m -116.6 43.6 150.2 75.3 180.9 103.6 C -197.2 121.4 204.0 133.4 217.9 150.7 C -216.4 151.2 215.0 152.1 213.1 152.1 C -178.0 128.6 147.3 81.1 102.2 86.8 C -98.4 88.8 95.0 89.2 92.6 92.1 C -87.3 120.4 126.2 159.8 141.1 182.8 C -148.8 193.4 159.3 203.0 159.8 217.4 C -131.0 190.0 98.8 140.6 71.5 90.7 C -65.2 76.3 58.0 67.6 63.3 53.7 C -68.6 45.1 70.5 43.2 79.2 40.3 C -f -0 g -355.6 161.2 m -376.3 159.3 388.3 171.8 404.6 184.3 C -412.3 201.1 422.4 223.2 423.3 237.6 C -416.6 234.2 410.8 229.4 405.1 217.4 C -399.8 211.6 386.8 206.8 378.7 207.8 C -334.0 206.4 308.1 288.4 252.4 297.1 C -236.1 299.5 229.9 291.8 214.5 285.6 C -203.0 270.2 L -193.4 281.7 175.2 306.7 147.8 303.3 C -115.2 279.8 101.2 238.5 57.6 230.8 C -42.7 235.2 26.8 240.9 21.1 253.4 C -19.6 257.7 19.6 260.1 16.8 262.5 C -14.4 259.2 12.9 257.7 11.5 253.4 C -20.1 231.8 12.4 207.8 31.6 190.5 C -45.6 184.8 60.4 188.1 74.8 201.6 C -103.6 220.3 113.2 256.3 142.5 259.2 C -164.1 248.1 178.5 237.1 189.1 214.0 C -208.8 241.9 L -225.6 253.4 243.8 250.0 262.0 241.4 C -294.2 215.0 325.9 167.5 355.6 161.2 C -f -%%Trailer -end -showpage diff --git a/texi/ptexinfmt.el b/texi/ptexinfmt.el deleted file mode 100644 index e98956e..0000000 --- a/texi/ptexinfmt.el +++ /dev/null @@ -1,762 +0,0 @@ -;;; ptexinfmt.el -- portable Texinfo formatter. - -;; Copyright (C) 1985, 1986, 1988, 1990, 1991, 1992, 1993, -;; 1994, 1995, 1996, 1997 Free Software Foundation, Inc. -;; Copyright (C) 1999 Yoshiki Hayashi -;; Copyright (C) 2000, 2001 TAKAHASHI Kaoru - -;; Author: TAKAHASHI Kaoru -;; Yoshiki Hayashi -;; Maintainer: TAKAHASHI Kaoru -;; Created: 7 Jul 2000 -;; Keywords: maint, tex, docs, emulation, compatibility - -;; This program 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 program 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. - -;;; Commentary: - -;; Original code: Yoshiki Hayashi -;; makeinfo.el (gnujdoc project) - -;; Support texinfmt.el 2.32 or later. - -;;; Code: -(require 'texinfmt) -(require 'poe) -(require 'broken) - -;;; Broken -(defvar ptexinfmt-disable-broken-notice-flag t - "If non-nil disable notice, when call `broken-facility'. -This is NO-NOTICE argument in `broken-facility'.") - -;; sort -fd -(broken-facility texinfo-format-printindex - "Can't sort on Mule for Windows." - (if (and (memq system-type '(windows-nt ms-dos)) -;;; I don't know version threshold. -;;; (string< texinfmt-version "2.37 of 24 May 1997") - (boundp 'MULE) (not (featurep 'meadow))) ; Mule for Windows - nil - t) - ptexinfmt-disable-broken-notice-flag) - -;; @var -(broken-facility texinfo-format-var - "Don't perse @var argument." - (condition-case nil - (with-temp-buffer - (let (texinfo-enclosure-list texinfo-alias-list) - (texinfo-mode) - (insert "@var{@asis{foo}}\n") - (texinfo-format-expand-region (point-min) (point-max)) - t)) - (error nil)) - ptexinfmt-disable-broken-notice-flag) - -;; @xref -(broken-facility texinfo-format-xref - "Can't format @xref, 1st argument is empty." - (condition-case nil - (with-temp-buffer - (let (texinfo-enclosure-list texinfo-alias-list) - (texinfo-mode) - (insert "@xref{, xref, , file}\n") - (texinfo-format-expand-region (point-min) (point-max)) - t)) - (error nil)) - ptexinfmt-disable-broken-notice-flag) - -;; @uref -(broken-facility texinfo-format-uref - "Parse twice @uref argument." - (condition-case nil - (with-temp-buffer - (let (texinfo-enclosure-list texinfo-alias-list) - (texinfo-mode) - (insert "@uref{mailto:foo@@bar.com}\n") - (texinfo-format-expand-region (point-min) (point-max)) - t)) - (error nil)) - ptexinfmt-disable-broken-notice-flag) - -;; @multitable -(broken-facility texinfo-multitable-widths - "`texinfo-multitable-widths' unsupport wide-char." - (if (fboundp 'texinfo-multitable-widths) - (with-temp-buffer - (let ((str "$BI}9-J8;z(B")) - (texinfo-mode) - (insert (format " {%s}\n" str)) - (goto-char (point-min)) - (if (= (car (texinfo-multitable-widths)) (length str)) - nil - t))) - ;; function definition is void - t) - ptexinfmt-disable-broken-notice-flag) - -(broken-facility texinfo-multitable-item - "`texinfo-multitable-item' unsupport wide-char." - (if-broken texinfo-multitable-widths nil t) - ptexinfmt-disable-broken-notice-flag) - - -;;; Obsolete -;; Removed Texinfo 3.8 -(put 'overfullrule 'texinfo-format 'texinfo-discard-line) -(put 'smallbreak 'texinfo-format 'texinfo-discard-line) -(put 'medbreak 'texinfo-format 'texinfo-discard-line) -(put 'bigbreak 'texinfo-format 'texinfo-discard-line) -;; Removed Texinfo 3.9 -(put 'setchapterstyle 'texinfo-format 'texinfo-discard-line-with-args) - -;;; Hardcopy and HTML (discard) -;; I18N -(put 'documentlanguage 'texinfo-format 'texinfo-discard-line-with-args) -(put 'documentencoding 'texinfo-format 'texinfo-discard-line-with-args) - -;; size -(put 'smallbook 'texinfo-format 'texinfo-discard-line) -(put 'letterpaper 'texinfo-format 'texinfo-discard-line) -(put 'afourpaper 'texinfo-format 'texinfo-discard-line) -(put 'afourlatex 'texinfo-format 'texinfo-discard-line) -(put 'afourwide 'texinfo-format 'texinfo-discard-line) -(put 'afivepaper 'texinfo-format 'texinfo-discard-line) -(put 'pagesizes 'texinfo-format 'texinfo-discard-line-with-args) - -;; style -(put 'setchapternewpage 'texinfo-format 'texinfo-discard-line-with-args) -(put 'kbdinputstyle 'texinfo-format 'texinfo-discard-line-with-args) - -;; flags -(put 'setcontentsaftertitlepage 'texinfo-format 'texinfo-discard-line) -(put 'setshortcontentsaftertitlepage 'texinfo-format 'texinfo-discard-line) -(put 'novalidate 'texinfo-format 'texinfo-discard-line-with-args) - -;; head & foot -(put 'headings 'texinfo-format 'texinfo-discard-line-with-args) -(put 'evenfooting 'texinfo-format 'texinfo-discard-line-with-args) -(put 'evenheading 'texinfo-format 'texinfo-discard-line-with-args) -(put 'oddfooting 'texinfo-format 'texinfo-discard-line-with-args) -(put 'oddheading 'texinfo-format 'texinfo-discard-line-with-args) -(put 'everyfooting 'texinfo-format 'texinfo-discard-line-with-args) -(put 'everyheading 'texinfo-format 'texinfo-discard-line-with-args) - -;; misc -(put 'page 'texinfo-format 'texinfo-discard-line) -(put 'hyphenation 'texinfo-format 'texinfo-discard-command-and-arg) - - - -;;; Directory File -;; @direcategory -(put 'dircategory 'texinfo-format 'texinfo-format-dircategory) -(defun-maybe texinfo-format-dircategory () - (let ((str (texinfo-parse-arg-discard))) - (delete-region (point) - (progn - (skip-chars-forward " ") - (point))) - (insert "INFO-DIR-SECTION " str "\n"))) - -;; @direntry -(put 'direntry 'texinfo-format 'texinfo-format-direntry) -(defun-maybe texinfo-format-direntry () - (texinfo-push-stack 'direntry nil) - (texinfo-discard-line) - (insert "START-INFO-DIR-ENTRY\n")) - -(put 'direntry 'texinfo-end 'texinfo-end-direntry) -(defun-maybe texinfo-end-direntry () - (texinfo-discard-command) - (insert "END-INFO-DIR-ENTRY\n\n") - (texinfo-pop-stack 'direntry)) - - -;;; Block Enclosing and Conditional -;; @detailmenu ... @end detailmenu -(put 'detailmenu 'texinfo-format 'texinfo-discard-line) -(put 'detailmenu 'texinfo-end 'texinfo-discard-command) - -;; @smalldisplay ... @end smalldisplay -(put 'smalldisplay 'texinfo-format 'texinfo-format-example) -(put 'smalldisplay 'texinfo-end 'texinfo-end-example) - -;; @smallformat ... @end smallformat -(put 'smallformat 'texinfo-format 'texinfo-format-flushleft) -(put 'smallformat 'texinfo-end 'texinfo-end-flushleft) - -;; @ifnottex ... @end ifnottex -(put 'ifnottex 'texinfo-format 'texinfo-discard-line) -(put 'ifnottex 'texinfo-end 'texinfo-discard-command) - -;; @ifnothtml ... @end ifnothtml -(put 'ifnothtml 'texinfo-format 'texinfo-discard-line) -(put 'ifnothtml 'texinfo-end 'texinfo-discard-command) - -;; @ifnotinfo ... @end ifnotinfo -(put 'ifnotinfo 'texinfo-format 'texinfo-format-ifnotinfo) -(put 'endifnotinfo 'texinfo-format 'texinfo-discard-line) -(defun-maybe texinfo-format-ifnotinfo () - (delete-region texinfo-command-start - (progn (re-search-forward "@end ifnotinfo[ \t]*\n") - (point)))) - -;; @html ... @end html -(put 'html 'texinfo-format 'texinfo-format-html) -(put 'endhtml 'texinfo-format 'texinfo-discard-line) -(defun-maybe texinfo-format-html () - (delete-region texinfo-command-start - (progn (re-search-forward "@end html[ \t]*\n") - (point)))) - - - -;;; Marking -;; @url, @env, @command -(put 'url 'texinfo-format 'texinfo-format-code) -(put 'env 'texinfo-format 'texinfo-format-code) -(put 'command 'texinfo-format 'texinfo-format-code) - -;; @acronym -(put 'acronym 'texinfo-format 'texinfo-format-var) - -(when-broken texinfo-format-var - (fmakunbound 'texinfo-format-var)) -(defun-maybe texinfo-format-var () - (let ((arg (texinfo-parse-expanded-arg))) - (texinfo-discard-command) - (insert (upcase arg)))) - -;; @key -(put 'key 'texinfo-format 'texinfo-format-key) -(defun-maybe texinfo-format-key () - (insert (texinfo-parse-arg-discard)) - (goto-char texinfo-command-start)) - -;; @email{EMAIL-ADDRESS[, DISPLAYED-TEXT]} -(put 'email 'texinfo-format 'texinfo-format-email) -(defun-maybe texinfo-format-email () - "Format EMAIL-ADDRESS and optional DISPLAYED-TXT. -Insert < ... > around EMAIL-ADDRESS." - (let ((args (texinfo-format-parse-args))) - (texinfo-discard-command) - ;; if displayed-text - (if (nth 1 args) - (insert (nth 1 args) " <" (nth 0 args) ">") - (insert "<" (nth 0 args) ">")))) - -;; @option -(put 'option 'texinfo-format 'texinfo-format-option) -(defun texinfo-format-option () - "Insert ` ... ' around arg unless inside a table; in that case, no quotes." - ;; `looking-at-backward' not available in v. 18.57, 20.2 - ;; searched-for character is a control-H - (if (not (search-backward "\010" - (save-excursion (beginning-of-line) (point)) - t)) - (insert "`" (texinfo-parse-arg-discard) "'") - (insert (texinfo-parse-arg-discard))) - (goto-char texinfo-command-start)) - - - -;;; Accents and Special characters -;; @pounds{} ==> # Pounds Sterling -(put 'pounds 'texinfo-format 'texinfo-format-pounds) -(defun-maybe texinfo-format-pounds () - (texinfo-parse-arg-discard) - (insert "#")) - -;; @OE{} ==> OE French-OE-ligature -(put 'OE 'texinfo-format 'texinfo-format-French-OE-ligature) -(defun-maybe texinfo-format-French-OE-ligature () - (insert "OE" (texinfo-parse-arg-discard)) - (goto-char texinfo-command-start)) - -;; @oe{} ==> oe -(put 'oe 'texinfo-format 'texinfo-format-French-oe-ligature) -(defun-maybe texinfo-format-French-oe-ligature () ; lower case - (insert "oe" (texinfo-parse-arg-discard)) - (goto-char texinfo-command-start)) - -;; @AA{} ==> AA Scandinavian-A-with-circle -(put 'AA 'texinfo-format 'texinfo-format-Scandinavian-A-with-circle) -(defun-maybe texinfo-format-Scandinavian-A-with-circle () - (insert "AA" (texinfo-parse-arg-discard)) - (goto-char texinfo-command-start)) - -;; @aa{} ==> aa -(put 'aa 'texinfo-format 'texinfo-format-Scandinavian-a-with-circle) -(defun-maybe texinfo-format-Scandinavian-a-with-circle () ; lower case - (insert "aa" (texinfo-parse-arg-discard)) - (goto-char texinfo-command-start)) - -;; @AE{} ==> AE Latin-Scandinavian-AE -(put 'AE 'texinfo-format 'texinfo-format-Latin-Scandinavian-AE) -(defun-maybe texinfo-format-Latin-Scandinavian-AE () - (insert "AE" (texinfo-parse-arg-discard)) - (goto-char texinfo-command-start)) - -;; @ae{} ==> ae -(put 'ae 'texinfo-format 'texinfo-format-Latin-Scandinavian-ae) -(defun-maybe texinfo-format-Latin-Scandinavian-ae () ; lower case - (insert "ae" (texinfo-parse-arg-discard)) - (goto-char texinfo-command-start)) - -;; @ss{} ==> ss German-sharp-S -(put 'ss 'texinfo-format 'texinfo-format-German-sharp-S) -(defun-maybe texinfo-format-German-sharp-S () - (insert "ss" (texinfo-parse-arg-discard)) - (goto-char texinfo-command-start)) - -;; @questiondown{} ==> ? upside-down-question-mark -(put 'questiondown 'texinfo-format 'texinfo-format-upside-down-question-mark) -(defun-maybe texinfo-format-upside-down-question-mark () - (insert "?" (texinfo-parse-arg-discard)) - (goto-char texinfo-command-start)) - -;; @exclamdown{} ==> ! upside-down-exclamation-mark -(put 'exclamdown 'texinfo-format 'texinfo-format-upside-down-exclamation-mark) -(defun-maybe texinfo-format-upside-down-exclamation-mark () - (insert "!" (texinfo-parse-arg-discard)) - (goto-char texinfo-command-start)) - -;; @L{} ==> L/ Polish suppressed-L (Lslash) -(put 'L 'texinfo-format 'texinfo-format-Polish-suppressed-L) -(defun-maybe texinfo-format-Polish-suppressed-L () - (insert (texinfo-parse-arg-discard) "/L") - (goto-char texinfo-command-start)) - -;; @l{} ==> l/ Polish suppressed-L (Lslash) (lower case) -(put 'l 'texinfo-format 'texinfo-format-Polish-suppressed-l-lower-case) -(defun-maybe texinfo-format-Polish-suppressed-l-lower-case () - (insert (texinfo-parse-arg-discard) "/l") - (goto-char texinfo-command-start)) - -;; @O{} ==> O/ Scandinavian O-with-slash -(put 'O 'texinfo-format 'texinfo-format-Scandinavian-O-with-slash) -(defun-maybe texinfo-format-Scandinavian-O-with-slash () - (insert (texinfo-parse-arg-discard) "O/") - (goto-char texinfo-command-start)) - -;; @o{} ==> o/ Scandinavian O-with-slash (lower case) -(put 'o 'texinfo-format 'texinfo-format-Scandinavian-o-with-slash-lower-case) -(defun-maybe texinfo-format-Scandinavian-o-with-slash-lower-case () - (insert (texinfo-parse-arg-discard) "o/") - (goto-char texinfo-command-start)) - -;; @,{c} ==> c, cedilla accent -(put ', 'texinfo-format 'texinfo-format-cedilla-accent) -(defun-maybe texinfo-format-cedilla-accent () - (insert (texinfo-parse-arg-discard) ",") - (goto-char texinfo-command-start)) - - -;; @dotaccent{o} ==> .o overdot-accent -(put 'dotaccent 'texinfo-format 'texinfo-format-overdot-accent) -(defun-maybe texinfo-format-overdot-accent () - (insert "." (texinfo-parse-arg-discard)) - (goto-char texinfo-command-start)) - -;; @ubaraccent{o} ==> _o underbar-accent -(put 'ubaraccent 'texinfo-format 'texinfo-format-underbar-accent) -(defun-maybe texinfo-format-underbar-accent () - (insert "_" (texinfo-parse-arg-discard)) - (goto-char texinfo-command-start)) - -;; @udotaccent{o} ==> o-. underdot-accent -(put 'udotaccent 'texinfo-format 'texinfo-format-underdot-accent) -(defun-maybe texinfo-format-underdot-accent () - (insert (texinfo-parse-arg-discard) "-.") - (goto-char texinfo-command-start)) - -;; @H{o} ==> ""o long Hungarian umlaut -(put 'H 'texinfo-format 'texinfo-format-long-Hungarian-umlaut) -(defun-maybe texinfo-format-long-Hungarian-umlaut () - (insert "\"\"" (texinfo-parse-arg-discard)) - (goto-char texinfo-command-start)) - -;; @ringaccent{o} ==> *o ring accent -(put 'ringaccent 'texinfo-format 'texinfo-format-ring-accent) -(defun-maybe texinfo-format-ring-accent () - (insert "*" (texinfo-parse-arg-discard)) - (goto-char texinfo-command-start)) - -;; @tieaccent{oo} ==> [oo tie after accent -(put 'tieaccent 'texinfo-format 'texinfo-format-tie-after-accent) -(defun-maybe texinfo-format-tie-after-accent () - (insert "[" (texinfo-parse-arg-discard)) - (goto-char texinfo-command-start)) - -;; @u{o} ==> (o breve accent -(put 'u 'texinfo-format 'texinfo-format-breve-accent) -(defun-maybe texinfo-format-breve-accent () - (insert "(" (texinfo-parse-arg-discard)) - (goto-char texinfo-command-start)) - -;; @v{o} ==> i dotless i and dotless j -(put 'dotless 'texinfo-format 'texinfo-format-dotless) -(defun-maybe texinfo-format-dotless () - (insert (texinfo-parse-arg-discard)) - (goto-char texinfo-command-start)) - - - -;;; Cross References -;; @ref, @xref -(put 'ref 'texinfo-format 'texinfo-format-xref) - -(when-broken texinfo-format-xref - (fmakunbound 'texinfo-format-xref)) -(defun-maybe texinfo-format-xref () - (let ((args (texinfo-format-parse-args))) - (texinfo-discard-command) - (insert "*Note ") - (let ((fname (or (nth 1 args) (nth 2 args)))) - (if (null (or fname (nth 3 args))) - (insert (nth 0 args) "::") - (insert (or fname (nth 0 args)) ": ") - (if (nth 3 args) - (insert "(" (nth 3 args) ")")) - (unless (null (nth 0 args)) - (insert (nth 0 args))))))) - -;; @uref -(put 'uref 'texinfo-format 'texinfo-format-uref) -(when-broken texinfo-format-uref - (fmakunbound 'texinfo-format-uref)) -(defun-maybe texinfo-format-uref () - "Format URL and optional URL-TITLE. -Insert ` ... ' around URL if no URL-TITLE argument; -otherwise, insert URL-TITLE followed by URL in parentheses." - (let ((args (texinfo-format-parse-args))) - (texinfo-discard-command) - ;; if url-title - (if (nth 1 args) - (insert (nth 1 args) " (" (nth 0 args) ")") - (insert "`" (nth 0 args) "'")))) - - - -;;; New command definition -;; @alias NEW=EXISTING -(put 'alias 'texinfo-format 'texinfo-alias) -(defun-maybe texinfo-alias () - (let ((start (1- (point))) - args) - (skip-chars-forward " ") - (save-excursion (end-of-line) (setq texinfo-command-end (point))) - (if (not (looking-at "\\([^=]+\\)=\\(.*\\)")) - (error "Invalid alias command") - (setq texinfo-alias-list - (cons - (cons - (buffer-substring (match-beginning 1) (match-end 1)) - (buffer-substring (match-beginning 2) (match-end 2))) - texinfo-alias-list)) - (texinfo-discard-command)))) - -;; @definfoenclose NEWCMD, BEFORE, AFTER - - - -;;; Special -;; @image{FILENAME, [WIDTH], [HEIGHT]} -(put 'image 'texinfo-format 'texinfo-format-image) -(defun-maybe texinfo-format-image () - ;; I don't know makeinfo parse FILENAME. - (let ((args (texinfo-format-parse-args)) - filename) - (when (null (nth 0 args)) - (error "Invalid image command")) - (texinfo-discard-command) - ;; makeinfo uses FILENAME.txt - (setq filename (format "%s.txt" (nth 0 args))) - (message "Reading included file: %s" filename) - ;; verbatim for Info output - (goto-char (+ (point) (cadr (insert-file-contents filename)))) - (message "Reading included file: %s...done" filename))) - - -;; @exampleindent - - - -;;; @multitable ... @end multitable -(defvar-maybe texinfo-extra-inter-column-width 0 - "*Number of extra spaces between entries (columns) in @multitable.") - -(defvar-maybe texinfo-multitable-buffer-name "*multitable-temporary-buffer*") -(defvar-maybe texinfo-multitable-rectangle-name "texinfo-multitable-temp-") - -;; These commands are defined in texinfo.tex for printed output. -(put 'multitableparskip 'texinfo-format 'texinfo-discard-line-with-args) -(put 'multitableparindent 'texinfo-format 'texinfo-discard-line-with-args) -(put 'multitablecolmargin 'texinfo-format 'texinfo-discard-line-with-args) -(put 'multitablelinespace 'texinfo-format 'texinfo-discard-line-with-args) - -(put 'multitable 'texinfo-format 'texinfo-multitable) - -(defun-maybe texinfo-multitable () - "Produce multi-column tables." - -;; This function pushes information onto the `texinfo-stack'. -;; A stack element consists of: -;; - type-of-command, i.e., multitable -;; - the information about column widths, and -;; - the position of texinfo-command-start. -;; e.g., ('multitable (1 2 3 4) 123) -;; The command line is then deleted. - (texinfo-push-stack - 'multitable - ;; push width information on stack - (texinfo-multitable-widths)) - (texinfo-discard-line-with-args)) - -(put 'multitable 'texinfo-end 'texinfo-end-multitable) -(defun-maybe texinfo-end-multitable () - "Discard the @end multitable line and pop the stack of multitable." - (texinfo-discard-command) - (texinfo-pop-stack 'multitable)) - -(when-broken texinfo-multitable-widths - (fmakunbound 'texinfo-multitable-widths)) - -(defun-maybe texinfo-multitable-widths () - "Return list of widths of each column in a multi-column table." - (let (texinfo-multitable-width-list) - ;; Fractions format: - ;; @multitable @columnfractions .25 .3 .45 - ;; - ;; Template format: - ;; @multitable {Column 1 template} {Column 2} {Column 3 example} - ;; Place point before first argument - (skip-chars-forward " \t") - (cond - ;; Check for common misspelling - ((looking-at "@columnfraction ") - (error "In @multitable, @columnfractions misspelled")) - ;; Case 1: @columnfractions .25 .3 .45 - ((looking-at "@columnfractions") - (forward-word 1) - (while (not (eolp)) - (setq texinfo-multitable-width-list - (cons - (truncate - (1- - (* fill-column (read (get-buffer (current-buffer)))))) - texinfo-multitable-width-list)))) - ;; - ;; Case 2: {Column 1 template} {Column 2} {Column 3 example} - ((looking-at "{") - (let ((start-of-templates (point))) - (while (not (eolp)) - (skip-chars-forward " \t") - (let* ((start-of-template (1+ (point))) - (end-of-template - ;; forward-sexp works with braces in Texinfo mode - (progn (forward-sexp 1) (1- (point))))) - (setq texinfo-multitable-width-list - (cons (- (progn (goto-char end-of-template) (current-column)) - (progn (goto-char start-of-template) (current-column))) - texinfo-multitable-width-list)) - ;; Remove carriage return from within a template, if any. - ;; This helps those those who want to use more than - ;; one line's worth of words in @multitable line. - (narrow-to-region start-of-template end-of-template) - (goto-char (point-min)) - (while (search-forward " -" nil t) - (delete-char -1)) - (goto-char (point-max)) - (widen) - (forward-char 1))))) - ;; - ;; Case 3: Trouble - (t - (error - "You probably need to specify column widths for @multitable correctly"))) - ;; Check whether columns fit on page. - (let ((desired-columns - (+ - ;; between column spaces - (length texinfo-multitable-width-list) - ;; additional between column spaces, if any - texinfo-extra-inter-column-width - ;; sum of spaces for each entry - (apply '+ texinfo-multitable-width-list)))) - (if (> desired-columns fill-column) - (error - (format - "Multi-column table width, %d chars, is greater than page width, %d chars." - desired-columns fill-column)))) - texinfo-multitable-width-list)) - -;; @item A1 @tab A2 @tab A3 -(defun-maybe texinfo-multitable-extract-row () - "Return multitable row, as a string. -End of row is beginning of next @item or beginning of @end. -Cells within rows are separated by @tab." - (skip-chars-forward " \t") - (let* ((start (point)) - (end (progn - (re-search-forward "@item\\|@end") - (match-beginning 0))) - (row (progn (goto-char end) - (skip-chars-backward " ") - ;; remove whitespace at end of argument - (delete-region (point) end) - (buffer-substring start (point))))) - (delete-region texinfo-command-start end) - row)) - -(when-broken texinfo-multitable-item - (fmakunbound 'texinfo-multitable-item)) - -(put 'multitable 'texinfo-item 'texinfo-multitable-item) -(defun-maybe texinfo-multitable-item () - "Format a row within a multicolumn table. -Cells in row are separated by @tab. -Widths of cells are specified by the arguments in the @multitable line. -All cells are made to be the same height. -This command is executed when texinfmt sees @item inside @multitable." - (let ((original-buffer (current-buffer)) - (table-widths (reverse (car (cdr (car texinfo-stack))))) - (existing-fill-column fill-column) - start - end - (table-column 0) - (table-entry-height 0) - ;; unformatted row looks like: A1 @tab A2 @tab A3 - ;; extract-row command deletes the source line in the table. - (unformated-row (texinfo-multitable-extract-row))) - ;; Use a temporary buffer - (set-buffer (get-buffer-create texinfo-multitable-buffer-name)) - (delete-region (point-min) (point-max)) - (insert unformated-row) - (goto-char (point-min)) -;; 1. Check for correct number of @tab in line. - (let ((tab-number 1)) ; one @tab between two columns - (while (search-forward "@tab" nil t) - (setq tab-number (1+ tab-number))) - (if (/= tab-number (length table-widths)) - (error "Wrong number of @tab's in a @multitable row"))) - (goto-char (point-min)) -;; 2. Format each cell, and copy to a rectangle - ;; buffer looks like this: A1 @tab A2 @tab A3 - ;; Cell #1: format up to @tab - ;; Cell #2: format up to @tab - ;; Cell #3: format up to eob - (while (not (eobp)) - (setq start (point)) - (setq end (save-excursion - (if (search-forward "@tab" nil 'move) - ;; Delete the @tab command, including the @-sign - (delete-region - (point) - (progn (forward-word -1) (1- (point))))) - (point))) - ;; Set fill-column *wider* than needed to produce inter-column space - (setq fill-column (+ 1 - texinfo-extra-inter-column-width - (nth table-column table-widths))) - (narrow-to-region start end) - ;; Remove whitespace before and after entry. - (skip-chars-forward " ") - (delete-region (point) (save-excursion (beginning-of-line) (point))) - (goto-char (point-max)) - (skip-chars-backward " ") - (delete-region (point) (save-excursion (end-of-line) (point))) - ;; Temorarily set texinfo-stack to nil so texinfo-format-scan - ;; does not see an unterminated @multitable. - (let (texinfo-stack) ; nil - (texinfo-format-scan)) - (let (fill-prefix) ; no fill prefix - (fill-region (point-min) (point-max))) - (setq table-entry-height - (max table-entry-height (count-lines (point-min) (point-max)))) -;; 3. Move point to end of bottom line, and pad that line to fill column. - (goto-char (point-min)) - (forward-line (1- table-entry-height)) - (let* ((beg (point)) ; beginning of line - ;; add one more space for inter-column spacing - (needed-whitespace - (1+ - (- fill-column - (progn (end-of-line) (current-column)))))) ; end of existing line - (insert (make-string - (if (> needed-whitespace 0) needed-whitespace 1) - ? ))) - ;; now, put formatted cell into a rectangle - (set (intern (concat texinfo-multitable-rectangle-name - (int-to-string table-column))) - (extract-rectangle (point-min) (point))) - (delete-region (point-min) (point)) - (goto-char (point-max)) - (setq table-column (1+ table-column)) - (widen)) -;; 4. Add extra lines to rectangles so all are of same height - (let ((total-number-of-columns table-column) - (column-number 0) - here) - (while (> table-column 0) - (let ((this-rectangle (int-to-string table-column))) - (while (< (length this-rectangle) table-entry-height) - (setq this-rectangle (append this-rectangle '(""))))) - (setq table-column (1- table-column))) -;; 5. Insert formatted rectangles in original buffer - (switch-to-buffer original-buffer) - (open-line table-entry-height) - (while (< column-number total-number-of-columns) - (setq here (point)) - (insert-rectangle - (eval (intern - (concat texinfo-multitable-rectangle-name - (int-to-string column-number))))) - (goto-char here) - (end-of-line) - (setq column-number (1+ column-number)))) - (kill-buffer texinfo-multitable-buffer-name) - (setq fill-column existing-fill-column))) - - -(when-broken texinfo-format-printindex - (fmakunbound 'texinfo-format-printindex)) - -(defun-maybe texinfo-format-printindex () - (let ((indexelts (symbol-value - (cdr (assoc (texinfo-parse-arg-discard) - texinfo-indexvar-alist)))) - opoint) - (insert "\n* Menu:\n\n") - (setq opoint (point)) - (texinfo-print-index nil indexelts) - - (if (memq system-type '(vax-vms windows-nt ms-dos)) - (texinfo-sort-region opoint (point)) - (shell-command-on-region opoint (point) "sort -fd" 1)))) - -(provide 'ptexinfmt) - -;;; ptexinfmt.el ends here diff --git a/texi/refcard-ja.tex b/texi/refcard-ja.tex deleted file mode 100644 index fdd8d6e..0000000 --- a/texi/refcard-ja.tex +++ /dev/null @@ -1,83 +0,0 @@ -% Reference Card for (ding) Gnus, 3 twocolumn pages. -% To be processed with latex 2.09 -\def\Guide{Card}\def\guide{card} -\def\logoscale{0.25} -\def\sec{\section*} -\def\subsec{\subsection*} -\def\subsubsec{\subsubsection*} -\documentstyle{article} -\textwidth 7.26in \textheight 10.3in \topmargin -1.2in -% the same settings work for A4, although there is a bit of space at the -% top and bottom of the page. -\oddsidemargin -0.5in \evensidemargin -0.5in -\begin{document} -\twocolumn\footnotesize\pagestyle{empty} -\input{gnusref-ja} - -\vspace*{\fill} -\Title -\vspace*{2ex} -\Logo{refcard} -\vspace*{\fill} -\Marks -\GroupLevels -\pagebreak - -\Notes -\General -\ArticleMode -\vspace*{\fill} -\CopyRight -\pagebreak - -\GroupMode -\SOUP -\pagebreak - -\ListGroups -\CreateGroups -\SortGroups -\MarkGroups -\pagebreak - -\Unsubscribe -\GroupTopics -\vspace*{\fill} -\SummaryMode -\SortSummary -\Article -\pagebreak - -\MailGroup -\GotoArticle -\Score -\pagebreak - -\MarkArticles -%\vspace*{-0.5ex} -\MarkScore -%\vspace*{-0.5ex} -\ProcessMark -%\vspace*{-0.5ex} -\OutputArticles -\pagebreak - -\Send -%\vspace*{-1.1ex} -\Thread -%\vspace*{-1.1ex} -\Exit -\pagebreak - -\Wash -\Hide -\Highlight -\Extract -\pagebreak - -\Limit -\PickAndRead -\ServerMode -\BrowseServer - -\end{document} diff --git a/texi/refcard.tex b/texi/refcard.tex deleted file mode 100644 index 5e5731f..0000000 --- a/texi/refcard.tex +++ /dev/null @@ -1,188 +0,0 @@ -% -*- latex -*- -% Reference Card for (ding) Gnus 5.8.x: to be processed with LaTeX2e -\documentclass{article} -\def\Guide{Card}\def\guide{card} -\def\logoscale{0.25} -\textwidth 7.26in \textheight 10in \topmargin -1.0in -% the same settings work for A4, although there is a bit of space at the -% top and bottom of the page. -\oddsidemargin -0.5in \evensidemargin -0.5in - -% README: -% *** purpose -% this was originally thought of as a reference card, but as it is now 5+ -% pages long, I doubt that it is more useful than the online-help. It helped -% to get an overview for the Gnus-functionality. -% -% *** files -% refcard.tex (this file), gnusref.tex ("include"-file) and gnuslogo.refcard -% (Gnus logo). -% -% *** printing (about 5 pages now: write me if you can make it shorter..) -% if you are using latex-mode, you do C-c C-f (process with latex), -% C-c C-v (view using xdvi/dvi2tty) and C-c C-p (print) -% the original author has set up the page dimensions cleverly so that this -% should print on both letter and a4 (see note above) -% $latex refcard.tex -% this creates a file refcard.dvi which you can preview using -% $xdvi refcard.dvi [C-c C-v] -% and print using something like -% $dvips refcard.dvi -% which creates refcard.ps (print using 'lpr refcard.ps') -% -% *** customization: -% the part following \begin{document} in this file consists of a macro for -% each section and section-headers (\section*{..}). It should be easy to -% reorder things and/or remove sections (put '%' at the beginning of the line). -% (i.e. you might want to omit \notes in the printed version ?) -% If you think that the order is not logical and you have ideas for -% improvements, please send mail to the current maintainer. -% -% *** ChangeLog: -% 2000-03-26 Felix Natter : -% refcard updated for Gnus 5.8.x: please send corrections or suggestions -% to the above email-address -% changes since 2000-03-26: -% o Create/Edit Foreign Groups: remove S b and S B (not available in 5.8.3) -% o Send/Reply etc.: remove w and W (the only bindings are S w and S W) -% Mon Apr 3 18:41:09 2000: -% o added C-c C-n and C-c C-t (Article) -% o C-c C-a as alias for M-m f (Article) + some other M-m *-bindings -% o added section for ``jumping'' in article-mode -% o now there's a difference between ``reading'' and ``composition'' -% (article-modes) -% Apr 24th, 2000: -% o added D s, D S and D t for nndraft -% o group-mode: i.e. C-u RET does not actually fetch fewer articles; also ,=>; -% Fri Jul 14 23:15:43 2000: -% o added README-section -% Thu Jul 27 20:51:01 2000: -% o added Unplugged-commands -% -% *** TODO: -% o (LaTeX) how can you get 'tabular' to wrap around pages ? -% o some things might not be updated: scoring and server modes, maybe more -% o Gnus Unplugged category-buffer commands need to be written - -\begin{document} -\newlength{\logowidth} \setlength{\logowidth}{6.861in} -\newlength{\logoheight} \setlength{\logoheight}{7.013in} - -\def\progver{5.8}\def\refver{5.8-4} % program and refcard versions -\def\date{July 27th, 2000} -\def\author{Vladimir Alexiev $<$vladimir@cs.ualberta.ca$>$} -\raggedbottom\raggedright - -\twocolumn -%\tiny -\scriptsize -\pagestyle{plain} - -% this contains a set of commands containing the actual sections -% (and some explanations). -\input{gnusref} - -\Title -\par -\Logo{refcard} -\Notes -% -% -\section*{Group-Mode} -\GroupModeGeneral - \subsection*{Group Subscribedness-Levels} - \GroupLevels - \subsection*{List Groups} - \ListGroups - \subsection*{Create/Edit Foreign Groups} - \CreateEditGroups - \subsection*{Unsubscribe, Kill and Yank Groups} - \SubscribeKillYankGroups - \subsection*{Mark Groups} - \MarkGroups - \subsection*{Group-Unplugged} - \GroupUnplugged -% topics in group-mode - \subsection*{Group Topics} - \GroupTopicsGeneral - \subsubsection*{Topic Sorting} - \TopicSorting -% -% summary-mode -\section*{Summary-Mode} -\SummaryModeGeneral - \subsection*{Select Articles} - \SelectArticles -% - \subsection*{Threading} - \Threading -% - \subsection*{Limiting} - \Limiting - \subsection*{Sort the Summary-Buffer} - \SortSummary - \subsection*{Score (Value) Commands} - \Scoring -% - \subsection*{MIME operations from the Summary-Buffer} - \MIMESummary - \subsection*{Extract Series (Uudecode etc)} - \ExtractSeries - \subsection*{Output Articles} - \OutputArticles -% - \subsection*{Post, Followup, Reply, Forward, Cancel} - \PostReplyetc - \subsection*{Message-Composition} - \MsgCompositionGeneral - \subsubsection*{Jumping in message-buffer} - \MsgCompositionMovementArticle - \subsubsection*{Attachments/MML} - \MsgCompositionMML -% marking articles - \subsection*{Mark Articles} - \MarkArticlesGeneral - \subsubsection*{Mark Based on Score} - \MarkByScore - \subsubsection*{The Process Mark} - \ProcessMark - \subsubsection*{Mark Indication-Characters} - \MarkCharacters -% - \subsection*{Summary-Unplugged} - \SummaryUnplugged - \subsection*{Mail-Group Commands} - \MailGroups - \subsection*{Draft-Group Commands} - \DraftGroup -% exiting - \subsection*{Exit the Summary-Buffer} - \ExitSummary -% -% -\section*{Article Mode (reading)} -\ArticleModeGeneral - \subsection*{Wash the Article-Buffer} - \WashArticle - \subsection*{Hide/Highlight Parts of the Article} - \HideHighlightArticle - \subsection*{MIME operations from the Article-Buffer (reading)} - \MIMEArticleMode -% -% -\section*{Server Mode} -\ServerMode - \subsection*{Unplugged-Server} - \ServerUnplugged -% -% -\section*{Browse Server Mode} -\BrowseServer - -%\pagebreak -\vspace*{\fill} -\Copyright - -\end{document} - - diff --git a/texi/splitindex b/texi/splitindex deleted file mode 100755 index cfd568c..0000000 --- a/texi/splitindex +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/sh -match='M-x |(Group)|(Summary)|(Article)|(Server)|(Browse)|(Post)|(Mail)|(Score)|(Binary)|(Topic)|(Pick)' -fun='\{gnus-|\{nn.*-|\{grouplens-' -egrep "$match" gnus.idx > gnus.kidx -egrep "$fun" gnus.idx > gnus.gidx -egrep -v "$match|$fun" gnus.idx > gnus.cidx diff --git a/texi/texi2latex.el b/texi/texi2latex.el deleted file mode 100644 index 5ff6804..0000000 --- a/texi/texi2latex.el +++ /dev/null @@ -1,345 +0,0 @@ -;;; texi2latex.el --- convert a texi file into a LaTeX file. -;; Copyright (C) 1996 Lars Magne Ingebrigtsen - -(require 'cl) - -(defun latexi-discard-until (string) - (let ((beg (match-beginning 0))) - (unless (re-search-forward (concat "^@end +" string "[ \t]*\n") nil t) - (error "No end: %s" string)) - (delete-region beg (match-end 0)))) - -(defun latexi-strip-line () - (delete-region (progn (beginning-of-line) (point)) - (progn (forward-line 1) (point)))) - -(defun latexi-switch-line (command arg) - (latexi-strip-line) - (insert (format "\\%s{%s}\n" command arg))) - -(defun latexi-index-command (command arg) - (latexi-strip-line) - (insert (format "\\gnus%sindex{%s}\n" - (if (equal command "kindex") "k" "") - arg))) - -(defun latexi-begin-command (command) - (latexi-strip-line) - (insert (format "\\begin{%s}\n" command))) - -(defun latexi-exchange-command (command arg) - (delete-region (match-beginning 0) (match-end 0)) - (insert (format "\\%s{%s}" command arg))) - -(defun latexi-translate () - "Translate." - (interactive) - (latexi-translate-file "gnus") - (latexi-translate-file "gnus-faq")) - -(defun latexi-translate-file (file) - "Translate file a LaTeX file." - (let ((item-string "") - (item-stack nil) - (list-stack nil) - (latexi-buffer (get-buffer-create "*LaTeXi*")) - verbatim - (regexp - (concat - "@\\([^{} \t\n]+\\)" - "\\(\\( +\\(.*$\\)\\|[ \t]*$\\)\\|{\\([^}]*\\)}\\)")) - (cur (find-file-noselect (concat (or (getenv "srcdir") ".") - "/" file ".texi"))) - (times 3) - (chapter 0) - command arg) - (pop-to-buffer latexi-buffer) - (buffer-disable-undo) - (erase-buffer) - (insert-buffer-substring cur) - (goto-char (point-min)) - (latexi-strip-line) - (latexi-translate-string "%@{" "\\gnuspercent{}\\gnusbraceleft{}") - (latexi-translate-string "%@}" "\\gnuspercent{}\\gnusbraceright{}") - (latexi-translate-string "%1@{" "\\gnuspercent{}1\\gnusbraceright{}") - (latexi-translate-string "@*" "\\newline{}") - (latexi-translate-string "S@{" "S\\gnusbraceleft{}") - (latexi-translate-string "@code{\\222}" "@code{\\gnusbackslash{}222}") - (latexi-translate-string "@code{\\264}" "@code{\\gnusbackslash{}264}") - (latexi-translate-string "@samp{\\Deleted}" "@samp{\\gnusbackslash{}Deleted}") - (latexi-translate-string "@samp{\\Seen}" "@samp{\\gnusbackslash{}Seen}") -; (while (re-search-forward "{\"[^\"]*\\(\\\\\\)[^\"]*\"}\\\\" nil t) -; (replace-match "\\verb+\\\\+ " t t)) - (while (not (zerop (decf times))) - (goto-char (point-min)) - (while (re-search-forward regexp nil t) - (setq command (match-string 1)) - (if (match-beginning 3) - (progn - (setq arg (or (match-string 4) "")) - (save-match-data - (when (string-match "[ \t]+$" arg) - (setq arg (substring arg 0 (match-beginning 0))))) - (cond - ((member command '("c" "comment")) - (if (string-match "@icon" (or arg "")) - (progn - (beginning-of-line) - (delete-region (point) (+ (point) 4)) - (insert "\\gnus")) - (delete-region (match-beginning 0) - (progn (end-of-line) (point)))) - (if (equal arg "@head") - (insert "\\gnusinteresting"))) - ((member command '("setfilename" - "synindex" "setchapternewpage" - "summarycontents" "bye" - "top" "iftex" "cartouche" - "iflatex" "finalout" "vskip" - "dircategory")) - (latexi-strip-line)) - ((member command '("menu" "tex" "ifinfo" "ignore" - "ifnottex" "direntry")) - (latexi-discard-until command)) - ((member command '("subsection" "subsubsection")) - (latexi-switch-line command arg)) - ((member command '("chapter")) - (latexi-switch-line - (format - "gnus%s{\\epsfig{figure=tmp/new-herd-%d.ps,scale=.5}}" - command (incf chapter)) - arg)) - ((member command '("section")) - (latexi-switch-line (format "gnus%s" command) arg)) - ((member command '("cindex" "findex" "kindex" "vindex")) - (latexi-index-command command arg)) - ((member command '("*")) - (delete-char -2) - (insert "\\\\")) - ((equal command "sp") - (replace-match "" t t)) - ((equal command "node") - (latexi-strip-line) - (insert (format "\\label{%s}\n" arg))) - ((equal command "contents") - (latexi-strip-line) - ;;(insert (format "\\tableofcontents\n" arg)) - ) - ((member command '("titlepage")) - (latexi-begin-command command)) - ((member command '("lisp" "example")) - (latexi-strip-line) - (insert (format "\\begin{verbatim}\n")) - (setq verbatim (point))) - ((member command '("center")) - (latexi-strip-line) - (insert (format "\\begin{%s}%s\\end{%s}\n" - command arg command))) - ((member command '("end")) - (cond - ((member arg '("titlepage")) - (latexi-strip-line) - (insert (format "\\end{%s}\n" arg))) - ((equal arg "quotation") - (latexi-strip-line) - (insert (format "\\end{verse}\n"))) - ((member arg '("lisp" "example")) - (latexi-strip-line) - (save-excursion - (save-restriction - (narrow-to-region verbatim (point)) - (goto-char (point-min)) - (while (search-forward "@{" nil t) - (replace-match "{" t t)) - (goto-char (point-min)) - (while (search-forward "@}" nil t) - (replace-match "}" t t)))) - (setq verbatim nil) - (insert "\\end{verbatim}\n")) - ((member arg '("table")) - (setq item-string (pop item-stack)) - (latexi-strip-line) - (insert (format "\\end{%slist}\n" (pop list-stack)))) - ((member arg '("itemize" "enumerate")) - (setq item-string (pop item-stack)) - (latexi-strip-line) - (insert (format "\\end{%s}\n" arg))) - ((member arg '("iflatex" "iftex" "cartouche")) - (latexi-strip-line)) - (t - (error "Unknown end arg: %s" arg)))) - ((member command '("table")) - (push item-string item-stack) - (push (substring arg 1) list-stack) - (setq item-string - (format "[@%s{%%s}]" (car list-stack))) - (latexi-strip-line) - (insert (format "\\begin{%slist}\n" (car list-stack)))) - ((member command '("itemize" "enumerate")) - (push item-string item-stack) - (cond - ((member arg '("@bullet")) - (setq item-string "[\\gnusbullet]")) - (t - (setq item-string ""))) - (latexi-strip-line) - (insert (format "\\begin{%s}\n" command))) - ((member command '("item")) - (latexi-strip-line) - (insert (format "\\%s%s\n" command (format item-string arg)))) - ((equal command "itemx") - (latexi-strip-line) - (insert (format "\\gnusitemx{%s}\n" (format item-string arg)))) - ((eq (aref command 0) ?@) - (goto-char (match-beginning 0)) - (delete-char 2) - (insert "duppat{}")) - ((equal command "settitle") - (latexi-strip-line) - (insert (format "\\newcommand{\\gnustitlename}{%s}\n" arg))) - ((equal command "title") - (latexi-strip-line) - (insert (format "\\gnustitlename{%s}\n" arg))) - ((equal command "author") - (latexi-strip-line) - (insert (format "\\gnusauthor{%s}\n" arg))) - ((equal command "quotation") - (latexi-begin-command "verse")) - ((equal command "page") - (latexi-strip-line) - (insert (format "\\newpage\n" arg))) - ((equal command "'s") - (goto-char (match-beginning 0)) - (delete-char 1)) - ((equal command "include") - (latexi-strip-line) - (insert "\\input{gnus-faq.latexi}\n")) - ((equal command "noindent") - (latexi-strip-line) - (insert "\\noindent\n")) - ((equal command "printindex") - (latexi-strip-line) - ;;(insert - ;; (format - ;; "\\begin{theindex}\\input{gnus.%s}\\end{theindex}\n" arg)) - ) - (t - (error "Unknown command (line %d): %s" - (save-excursion - (widen) - (1+ (count-lines (point-min) (progn - (beginning-of-line) - (point))))) - command)))) - ;; These are commands with {}. - (setq arg (match-string 5)) - (cond - ((member command '("anchor")) - (latexi-strip-line)) - ((member command '("ref" "xref" "pxref")) - (latexi-exchange-command (concat "gnus" command) arg)) - ((member command '("sc" "file" "dfn" "emph" "kbd" "uref" - "code" "samp" "var" "strong" "i" - "result")) - (goto-char (match-beginning 0)) - (delete-char 1) - (insert "\\gnus")) - ((member command '("copyright" "footnote")) - (goto-char (match-beginning 0)) - (delete-char 1) - (insert "\\")) - ((member command '("dots")) - (goto-char (match-beginning 0)) - (delete-region (match-beginning 0) (match-end 0)) - (insert "...")) - ((eq (aref command 0) ?@) - (goto-char (match-beginning 0)) - (delete-char 2) - (insert "duppat{}")) - (t - (error "Unknown command (line %d): %s" - (save-excursion - (widen) - (1+ (count-lines (point-min) (progn - (beginning-of-line) - (point))))) - command)))))) - (latexi-translate-string "$" "\\gnusdollar{}") - (latexi-translate-string "&" "\\gnusampersand{}") - (latexi-translate-string "%" "\\gnuspercent{}") - (latexi-translate-string "#" "\\gnushash{}") - (latexi-translate-string "^" "\\gnushat{}") - (latexi-translate-string "~" "\\gnustilde{}") - (latexi-translate-string "_" "\\gnusunderline{}") - (latexi-translate-string "¬" "\\gnusnot{}") - (goto-char (point-min)) - (while (search-forward "duppat{}" nil t) - (replace-match "@" t t)) - (latexi-translate-string "@@" "@") - (latexi-translate-string "<" "\\gnusless{}") - (latexi-translate-string ">" "\\gnusgreater{}") - (goto-char (point-min)) - (search-forward "label{Top}" nil t) - (while (re-search-forward "\\\\[ntr]\\b" nil t) - (when (save-match-data - (or (not (save-excursion - (search-backward "begin{verbatim}" nil t))) - (> (save-excursion - (search-backward "end{verbatim")) - (save-excursion - (search-backward "begin{verbatim}"))))) - (goto-char (match-beginning 0)) - (delete-char 1) - (insert "\\gnusbackslash{}"))) - (latexi-translate-string "\\\\" "\\gnusbackslash{}") - (goto-char (point-min)) - (while (re-search-forward "\\\\[][{}]" nil t) - (goto-char (match-beginning 0)) - (delete-char 1)) - (latexi-contributors) - (let ((coding-system-for-write 'iso-8859-1)) - (write-region (point-min) (point-max) (concat file ".latexi"))))) - -(defun latexi-translate-string (in out) - (let (yes) - (goto-char (point-min)) - (search-forward "label{Top}" nil t) - (while (search-forward in nil t) - (when (save-match-data - (or (not (save-excursion - (search-backward "begin{verbatim}" nil t))) - (> (save-excursion - (re-search-backward "end{verbatim}\\|end{verse}")) - (save-excursion - (re-search-backward - "begin{verbatim}\\|begin{verse}"))))) - (replace-match out t t))))) - -(defun latexi-contributors () - (goto-char (point-min)) - (when (re-search-forward "^Also thanks to the following" nil t) - (forward-line 2) - (narrow-to-region - (point) - (1- (search-forward "\n\n"))) - (when (re-search-backward "^and" nil t) - (latexi-strip-line)) - (goto-char (point-min)) - (while (re-search-forward "[.,] *$" nil t) - (replace-match "" t t)) - (goto-char (point-min)) - (let (names) - (while (not (eobp)) - (push (buffer-substring (point) (progn (end-of-line) (point))) - names) - (forward-line 1)) - (delete-region (point-min) (point-max)) - (insert "\\begin{tabular}{lll}\n") - (setq names (nreverse (delete "" names))) - (while names - (insert (pop names) " & " (or (pop names) "\\mbox{}") - " & " (or (pop names) "\\mbox{}") - "\\\\\n")) - (insert "\\end{tabular}\n") - (widen)))) - diff --git a/todo b/todo deleted file mode 100644 index daa6f67..0000000 --- a/todo +++ /dev/null @@ -1,1486 +0,0 @@ -;; Also know as the "wish list". Some are done. For the others, no -;; promise when to be implemented. - -* Multiple charsets for topic names. - -* Allow specification of server in Newsgroups header - - [Kai wrote] - - WIBNI I could put `Newsgroups: nntp+quimby:bla' into a message and - Gnus would know to post this message on my server `nntp:quimby' into - the group bla? I think this would be way cool. - - But Gnus would have to rewrite the Newsgroups header before actually - sending the posting. - - Thanks for Micha Wiedenmann for this suggestion. - -* Understand mail-user-agent. Maybe gnus-mail-user-agent. - - [Done] - -* Emphasis delimiters show when `W W c'. - - [Fixed] - -* Parsing of the common list confirmation requests so that Gnus can - prepare the response with a single command. Including LISTSERV - periodic ping messages and the like. - -* Parsing of the various List-* headers to enable automatic commands - like "send help message," "send unsubscribe message," and the like. - - [done, see gnus-ml.el] - -* Parsing of the subscription notice to stash away details like what - address you're subscribed to the list under (and automatically send - mail to the list using that address, when you send mail inside the list - group), what address to mail to unsubscribe, and the list info message - if available. Hitting the "get FAQ" command inside a mailing list - group should display that stashed copy of the info message. - -* Some help in coming up with good split rules for mailing lists, as - automated as possible. Splitting on To and Cc is almost always not - what I want, since it can misfile messages and since if I'm cc'd on - list mail I want to get both copies, one in my personal mailbox and one - in the list mailbox. I know other people handle it other ways, but I - prefer it that way. Accordingly, some way to semi-automatically - generate split rules based on Sender, Mailing-List, Return-Path, - X-Loop, and all of the other random headers that often work would be - very cool. - -* Support for zipped folders for all backends this makes sense for. - Most likely using jka-compr. (It has been suggested that this do - work but I think it should be verified for all backends.) - -* Support for RFC2015, PGP-MIME. Probably has to involve the people in - the Mailcrypt project. - - [done] - -* Agent (Can someone write some subtopics here? I don't use it myself - so I don't know what is lacking.) - -* Support for encrypted folders. Even if the mail arrives unencrypted - Gnus should be able to encrypt the *folder* for added safety. This - should go for both Gnus' own folders and the folders Gnus reads from - (e.g. /var/spool/mail/${USER}). All backends this makes sense for. - - [John Wiegley's article <200011030445.VAA08277@localhost.dynodns.net>, - posted on gnu.emacs.gnus does this. - Also, gnus-article-encrypt `K E' encrypts the article body.] - -* The stuff on "Newest Features" in the manual should be implemented - and the node updated (it maybe is?). - -* Splitting .newsrc.eld so the history is in one file and the - configuration is in another. To help those that reads at two - locations (e.g. work and home) and want to have the same - configuration. - -* gnus-uu-decode should complain if one or more parts of a series post - (ie, "part N of X") is missing, and optionally tick what parts are - there for decoding in a later session. - -* Additional article marking, and an ability to affect marks placed - during e.g. mail acquisition. I want to be able to notice the - subject "fast money" or "web traffic", automatically mark it with a - `$', and score it into oblivion. (But I fear that wanting to change - marks with mail-source-* and nnmail-* functions will represent a - philosophical conflict with the rest of Gnus' management of article - marks. mail-source-* and nnmail-* currently hack around with files - under ~/Mail and leave traces in ~/Mail/active, but don't affect - things stored in .newsrc.eld.) - -* A much better interface to nnmail-split-methods. I don't know how - I'd like this done, but I know that the current method of manually - hacking regexps is pretty untenable for new users. My boss, who is - tenured faculty at CMU and CEO & CTO at JPRC, and whose research - work has involved Lisp for the last 25 years, is trying to implant - himself in a Gnus mail environment, and this is a big sticking point - even for him. - -* PGP-supported encryption of entire nnml & nnmh groups. There are - people with whom I exchange mail routinely who don't send w/PGP, but - I'd really rather that the content not be left lying around - unencrypted. Hook into article acquisition the way jka-compr - supposedly does, to auto-decrypt every message read. - - [See Support for encrypted folders.] - -* Baby's First Mail In Gnus. Some set of functions that the - new-to-mail-in-Gnus user can invoke which will query the user - appropriately for the basic information required to establish mail - handling, leaving the appropriate traces in .gnus. Perhaps a - customize buffer would be appropriate. - - Where does your mail come from? - - If some server, what is your POP/IMAP protocol identity? - - What is your identity when sending mail, as opposed to posting to - Usenet? - - Here are some basic concepts of mail groups (list a few: - personal mail, company-wide mail, mailing lists, garbage dumps, - receptacles for outbound copies of what one sends; which ones do - you want to instantiate, and what mail should land in each? - [/viz./ problem of nnmail-split-methods interface.] - -* Full integration of nnir into Gnus. Generic hooks for adding new - external nnir sources. I use a couple experimental, in-house tools - (JPRC is a research lab, occupied with document analysis and machine - learning) and adding new search engines to nnir by hacking the main - nnir.el module is rather clunky. - -* Manual ordering of articles in an nnml folder. - - That is, keystrokes to move articles (or whole threads) up or down - in the *Summary* buffer relative to the other articles. The order - would be persistent (e.g., across gnus sessions). - - With this ability, an nnml folder would make for a good to-do list. - -* Since many uses Gnus to store to do lists I think it is time for an - nntodo. (I know Kai already written one, maybe use that for a start?) - -* nnsql backend, which would allow messages or folders to be imported - in a local (My|Postgre|?)SQL RDBMS. - -* "posting profiles" ideally accessible from a popup menu; allowing - choice between predefined profiles of - from,name,organization,etc. Example: I'm at home, but need to reply - to a work mail; i can hit 'R', then use this command to switch to my - 'work' profile for purposes of this one reply. (This might already - be possible with current Gnus, but I don't think so.) - -* Better handling of the mail retrieving / splitting feature: - - the variables -get-new-mail should not exist anymore. Mail - retrieving should be a separate matter. - - we should be able to split mails to groups AND backends at the same time. - - meanwhile, we should still be able to associate certain mail sources with - certain backends. - -* A better interface to the agent download scoring rules, like the one - for the other scoring rules. - -* Editing of messages in the agents cache. - -* More article marks (like '!' or '?'). - Maybe user defined marks that can be displayed as any choosen charakter, - so one could do things like limiting on, to do whatever one likes with - these articles. - -* A possibility to add notes to messages. If thouse could include links - to other (stored) messages this would be very practical. - -* A nnfolder like backend with .overview files. - This would not only speed up things, but also allow nnir to work on it. - - [done] - -* Allow article editing in groups which do not support it, but - emulating it via deleting the old article and entering the new one - into the group. This would be very useful to support `T ^' (say) in - nnimap groups. - -* Allow user to specify which kinds of groups should be displayed. - For example, I want to display all the groups that are displayed - now, plus those which have cached messages in them. (Gnus does - display those with ticked messages but not those with - cached-but-unticked ones.) This would become even more important - when we allow labels. - -* Go through the todo list and remove items already done. - -* Create new data type `article identifier' and use that instead of - article numbers. A first implementation could offer something like - (num . 4711) but this could be extended. This would be useful for - using servers with *really* large numbers -- there we could have a - bignum type. It might also be useful for the nnweb and nnultimate - thingies where article identifiers are not really numbers. - -* Allow use of digests to keep related articles. Normally, you use - groups to group together articles which are thematically related. - But sometimes, you have so many themes that this becomes - impractical. WIBNI I could have digests in a group, and there was a - way to add a new article to one of the digests in that group? - - Or maybe what I really want is a way to tell Gnus that a specific - thread should always be hidden (as in `T h') by default, while most - other threads are not hidden by default. Hm. - -* New backend between nnfolder and nnml: have more than one article - per file, but more than one file per group. With .overview files. - - [done. nnfolder has .overview. Backward- and forward-compatible - between 1.0 and 2.0. (setq nnfolder-nov-is-evil t) disables the - feature] - -* .overview files for nnfolder? - - [done] - -* New backend nnbabylfolder. There is also nnbabyl which is like - nnmbox but uses babyl format, but there is no babyl format - equivalent of nnfolder. - -* Make movement commands in summary buffer independent of `move after - mark' behavior when marking articles. Currently, if you don't want - `E' to move to the next unread article, you have to set - gnus-summary-goto-unread to nil, and then there is no way to move to - the next or previous unread article. - - This one has two sub-tasks. Providing the commands is one thing, - finding out useful key bindings for them is another. I think we - could provide the commands first while not changing the behavior of - the key bindings; then different people can experiment with - different key binding schemes until we find something which suits - many people. - -* `Move to next/previous/first article' is a misnomer, since ticked - articles are also unread but not moved to by these commands. Should - the terminology be fixed or the documentation, or what? - -* Allow sorting of threads by newest article rather than by root of - thread. Consider the following thread structure: - - root1 Jan 1 - leaf1 Jan 4 - root2 Jan 2 - leaf2 Jan 3 - - These two threads are sorted this way because root1 is older than - root2. I want an option to sort them the other way round because - leaf1 is newer than leaf2. - -* Improve editing of MIME messages. I would like to use html-mode to - edit the body of a text/html message, and enriched-mode for - text/enriched messages, and so on. This should go for multipart - messages as well. This is probably a hard one since Emacs currently - does not allow several major modes per buffer. But maybe it would - be nice to hack Emacs to provide this infrastructure so that Gnus - can make use of it? This would also make it possible to provide - nifty commands for editing the headers, for example, rather than - relying on commands which do the same thing everywhere. - message-x.el is really just a half-assed attempt at doing it, and - while it is useful, that's not the way it should be done. - - I think Francisco Potort,Al(B already did something like this? - -* Provide commands for editing MML tags. For example, there could be - a command mml-add-tag-attribute which prompts me for an attribute - name (with completion, from the set filename, type, ...), and then - for a value. (This is like `C-c +' in psgml.) Or there could be a - command which showed me all the attributes in an MML tag and allows - me to use TAB to move between them, and then to edit each attribute - value. (This is like `C-c C-a' in psgml.) - -* Have Gnus automagically set group parameters for mailing list - groups. For example, if I have a splitting rule that automatically - sorts ding@gnus.org into mail.ding, then Gnus should clue in, set - the to-list parameter to 'ding@gnus.org', and set total-expire. - (This is probably Hard (TM). And of course the user should be able - to configure what parameters exactly get set.) - -* Along the same lines, automagically detect broken reply-to's. (But - don't auto-detect users legitimately setting a reply-to header that - points back to the list.) - -* Make it easier to change parameters on a set of groups, - e.g. set/clear gcc-self on process-marked groups. - -* Make it easier/possible to migrate between primary select-methods, - if that concept is going to be kept. Right now I have only one - group on my primary server, and I'd kind of like to change from nntp - to nnml, but apparently this doesn't work well. - -* Make it possible to refer to uniquely-named groups without - select-method prefix (e.g. mail.misc instead of nnml:mail.misc). - -* Allow a user-defined picons directory for personal groups. - -* Annotations as discussed last autumn. Be able to make comments to - articles for all bakends. The comments amybe should go into a - seperate "backend", like nndraft. - -* Catchup on a topic and all its subtopics. I.e. do "c y" when on a - topic line in *Group*. - -* Better/more advanced subject washing in *Summary*, see my - js-gnus-simplify-subject-function I posted earlier this winter. - -;; From Newest Features node. Some are not done. - -* I would like the zombie-page to contain an URL to the source of the -latest version of gnus or some explanation on where to find it. - -* A way to continue editing the latest Message composition. - -* http://www.sonicnet.com/feature/ari3/ - - [N/A] - -* facep is not declared. - -* Include a section in the manual on why the number of articles isn't -the same in the group buffer and on the SPC prompt. - -* Interacting with rmail fcc isn't easy. - -* Hypermail: - [N/A] - [N/A] - [N/A] - [N/A] - http://www.uwsg.indiana.edu/hypermail/linux/kernel/9610/index.html - [N/A] - [N/A]http://www.miranova.com/gnus-list/ - - [w3 or nnwarchive?] - -* `^-- ' is made into - in LaTeX. - -* gnus-kill is much slower than it was in GNUS 4.1.3. - -* when expunging articles on low score, the sparse nodes keep - hanging on? - -* starting the first time seems to hang Gnus on some systems. Does - NEWGROUPS answer too fast? - -* nndir doesn't read gzipped files. - -* FAQ doesn't have an up node? - -* when moving mail from a procmail spool to the crash-box, the - crash-box is only appropriate to one specific group. - -* `t' `t' makes X-Faces disappear. - -* nnmh-be-safe means that crossposted articles will be marked as - unread. - -* Orphan score entries don't show on "V t" score trace - -* when clearing out data, the cache data should also be reset. - -* rewrite gnus-summary-limit-children to be non-recursive to avoid -exceeding lisp nesting on huge groups. - -* expunged articles are counted when computing scores. - -* implement gnus-batch-brew-soup - -* ticked articles aren't easy to read in pick mode - `n' and stuff - just skips past them. Read articles are the same. - -* topics that contain just groups with ticked articles aren't - displayed. - -* nndoc should always allocate unique Message-IDs. - -* If there are mail groups the first time you use Gnus, Gnus'll - make the mail groups killed. - -* no "no news is good news" when using topics. - -* when doing crosspost marking, the cache has to be consulted and - articles have to be removed. - -* nnweb should fetch complete articles when they are split into - several parts. - -* scoring on head immediate doesn't work. - -* finding short score file names takes forever. - -* canceling articles in foreign groups. - -* nntp-open-rlogin no longer works. - -* C-u C-x C-s (Summary) switches to the group buffer. - -* move nnmail-split-history out to the backends. - -* nnweb doesn't work properly. - -* using a virtual server name as `gnus-select-method' doesn't work? - -* when killing/yanking a group from one topic to another in a - slave, the master will yank it first to one topic and then add it - to another. Perhaps. - -* warn user about `=' redirection of a group in the active file? - -* take over the XEmacs menubar and offer a toggle between the XEmacs - bar and the Gnus bar. - -* push active file and NOV file parsing down into C code. - `(canonize-message-id id)' - `(mail-parent-message-id references n)' - `(parse-news-nov-line &optional dependency-hashtb)' - `(parse-news-nov-region beg end &optional dependency-hashtb fullp)' - `(parse-news-active-region beg end hashtb)' - -* nnml .overview directory with splits. - -* asynchronous cache - -* postponed commands. - -* the selected article show have its Subject displayed in its - summary line. - -* when entering groups, get the real number of unread articles from - the server? - -* sort after gathering threads - make false roots have the headers - of the oldest orphan with a 0 article number? - -* nndoc groups should inherit the score files of their parents? - Also inherit copy prompts and save files. - -* command to start up Gnus (if not running) and enter a mail mode - buffer. - -* allow editing the group description from the group buffer for - backends that support that. - -* gnus-hide,show-all-topics - -* groups and sub-topics should be allowed to mingle inside each - topic, and not just list all subtopics at the end. - -* a command to remove all read articles that are not needed to - connect threads - `gnus-summary-limit-to-sparse-unread'? - -* a variable to turn off limiting/cutting of threads in the tree - buffer. - -* a variable to limit how many files are uudecoded. - -* add zombie groups to a special "New Groups" topic. - -* server mode command: close/open all connections - -* put a file date in gnus-score-alist and check whether the file - has been changed before using it. - -* on exit from a digest group, go to the next article in the parent - group. - -* hide (sub)threads with low score. - -* when expiring, remove all marks from expired articles. - -* gnus-summary-limit-to-body - -* a regexp alist that says what level groups are to be subscribed - on. Eg. - `(("nnml:" . 1))'. - -* easier interface to nnkiboze to create ephemeral groups that - contain groups that match a regexp. - -* allow newlines in urls, but remove them before using the - URL. - -* If there is no From line, the mail backends should fudge one from - the "From " line. - -* fuzzy simplifying should strip all non-alpha-numerical info from - subject lines. - -* gnus-soup-brew-soup-with-high-scores. - -* nntp-ping-before-connect - -* command to check whether NOV is evil. "list overview.fmt". - -* when entering a group, Gnus should look through the score files - very early for `local' atoms and set those local variables. - -* message annotations. - -* topics are always yanked before groups, and that's not good. - -* (set-extent-property extent 'help-echo "String to display in - minibuf") to display help in the minibuffer on buttons under - XEmacs. - -* allow group line format spec to say how many articles there are - in the cache. - -* AUTHINFO GENERIC - -* `run-with-idle-timer' in gnus-demon. - -* stop using invisible text properties and start using overlays - instead - -* C-c C-f C-e to add an Expires header. - -* go from one group to the next; everything is expunged; go to the - next group instead of going to the group buffer. - -* gnus-renumber-cache - to renumber the cache using "low" numbers. - -* record topic changes in the dribble buffer. - -* `nnfolder-generate-active-file' should look at the folders it - finds and generate proper active ranges. - -* nneething-look-in-files-for-article-heads variable to control - whether nneething should sniff all files in the directories. - -* gnus-fetch-article - start Gnus, enter group, display article - -* gnus-dont-move-articles-to-same-group variable when respooling. - -* when messages are crossposted between several auto-expirable - groups, articles aren't properly marked as expirable. - -* nneething should allow deletion/moving. - -* TAB on the last button should go to the first button. - -* if the car of an element in `mail-split-methods' is a function, - and the function returns non-nil, use that as the name of the - group(s) to save mail in. - -* command for listing all score files that have been applied. - -* a command in the article buffer to return to `summary' config. - -* `gnus-always-post-using-current-server' - variable to override - `C-c C-c' when posting. - -* nnmail-group-spool-alist - says where each group should use as a - spool file. - -* when an article is crossposted to an auto-expirable group, the - article should be marker as expirable. - -* article mode command/menu for "send region as URL to browser". - -* on errors, jump to info nodes that explain the error. For - instance, on invalid From headers, or on error messages from the - nntp server. - -* when gathering threads, make the article that has no "Re: " the - parent. Also consult Date headers. - -* a token in splits to call shrink-window-if-larger-than-buffer - -* `1 0 A M' to do matches on the active hashtb. - -* duplicates - command to remove Gnus-Warning header, use the read - Message-ID, delete the "original". - -* when replying to several messages at once, put the "other" - message-ids into a See-Also header. - -* support setext: URL:http://www.bsdi.com/setext/ - -* support ProleText: - - -* when browsing a foreign server, the groups that are already - subscribed should be listed as such and not as "K". - - [done] - -* generate font names dynamically. - -* score file mode auto-alist. - -* allow nndoc to change/add/delete things from documents. Implement - methods for each format for adding an article to the document. - -* `gnus-fetch-old-headers' `all' value to incorporate absolutely - all headers there is. - -* function like `|', but concatenate all marked articles and pipe - them to the process. - -* cache the list of killed (or active) groups in a separate file. - Update the file whenever we read the active file or the list of - killed groups in the .eld file reaches a certain length. - -* function for starting to edit a file to put into the current mail - group. - -* score-find-trace should display the total score of the article. - -* "ghettozie" - score on Xref header and nix it out after using it - to avoid marking as read in other groups it has been crossposted - to. - -* look at procmail splitting. The backends should create the - groups automatically if a spool file exists for that group. - -* function for backends to register themselves with Gnus. - -* when replying to several process-marked articles, have all the - From end up in Cc headers? Variable to toggle. - -* command to delete a crossposted mail article from all groups it - has been mailed to. - -* `B c' and `B m' should be crosspost aware. - -* hide-pgp should also hide PGP public key blocks. - -* Command in the group buffer to respool process-marked groups. - -* `gnus-summary-find-matching' should accept pseudo-"headers" like - "body", "head" and "all" - -* When buttifying things, all white space (including - newlines) should be ignored. - -* Process-marking all groups in a topic should process-mark groups - in subtopics as well. - -* Add non-native groups to the list of killed groups when killing - them. - -* nntp-suggest-kewl-config to probe the nntp server and suggest - variable settings. - -* add edit and forward secondary marks. - -* nnml shouldn't visit its .overview files. - -* allow customizing sorting within gathered threads. - -* `B q' shouldn't select the current article. - -* nnmbox should support a newsgroups file for descriptions. - -* allow fetching mail from several pop servers. - - [done] - -* Be able to specify whether the saving commands save the original - or the formatted article. - -* a command to reparent with the child process-marked (cf. `T ^'.). - -* I think the possibility to send a password with nntp-open-rlogin - should be a feature in Red Gnus. - -* The `Z n' command should be possible to execute from a mouse - click. - -* more limiting functions - date, etc. - -* be able to limit on a random header; on body; using reverse - matches. - -* a group parameter (`absofucking-total-expiry') that will make - Gnus expire even unread articles. - -* a command to print the article buffer as postscript. - -* variable to disable password fetching when opening by - nntp-open-telnet. - -* manual: more example servers - nntp with rlogin, telnet - -* checking for bogus groups should clean topic alists as well. - -* canceling articles in foreign groups. - -* article number in folded topics isn't properly updated by Xref - handling. - -* Movement in the group buffer to the next unread group should go - to the next closed topic with unread messages if no group can be - found. - -* Extensive info pages generated on the fly with help everywhere - - in the "*Gnus edit*" buffers, for instance. - -* Topic movement commands - like thread movement. Up, down, - forward, next. - -* a way to tick/mark as read Gcc'd articles. - - [done, (setq gnus-inews-mark-gcc-as-read t)] - -* a way to say that all groups within a specific topic comes from a - particular server? Hm. - -* `gnus-article-fill-if-long-lines' - a function to fill the - article buffer if there are any looong lines there. - -* `T h' should jump to the parent topic and fold it. - -* a command to create an ephemeral nndoc group out of a file, and - then splitting it/moving it to some other group/backend. - -* a group parameter for nnkiboze groups that says that all kibozed - articles should be entered into the cache. - -* It should also probably be possible to delimit what - `gnus-jog-cache' does - for instance, work on just some groups, or - on some levels, and entering just articles that have a score - higher than a certain number. - -* nnfolder should append to the folder instead of re-writing the - entire folder to disk when accepting new messages. - -* allow all backends to do the proper thing with .gz files. - -* a backend for reading collections of babyl files nnbabylfolder? - -* a command for making the native groups into foreign groups. - -* server mode command for clearing read marks from all groups from - a server. - -* when following up multiple articles, include all To, Cc, etc - headers from all articles. - -* a command for deciding what the total score of the current thread - is. Also a way to highlight based on this. - -* command to show and edit group scores - -* a gnus-tree-minimize-horizontal to minimize tree buffers - horizontally. - -* command to generate nnml overview file for one group. - -* `C-u C-u a' - prompt for many crossposted groups. - -* keep track of which mail groups have received new articles (in - this session). Be able to generate a report and perhaps do some - marking in the group buffer. - -* gnus-build-sparse-threads to a number - build only sparse threads - that are of that length. - -* have nnmh respect mh's unseen sequence in .mh_profile. - -* cache the newsgroups descriptions locally. - -* asynchronous posting under nntp. - -* be able to control word adaptive scoring from the score files. - -* a variable to make `C-c C-c' post using the "current" select - method. - -* `limit-exclude-low-scored-articles'. - -* if `gnus-summary-show-thread' is a number, hide threads that have - a score lower than this number. - -* split newsgroup subscription variable up into "order" and - "method". - -* buttonize ange-ftp file names. - -* a command to make a duplicate copy of the current article so that - each copy can be edited separately. - -* nnweb should allow fetching from the local nntp server. - -* record the sorting done in the summary buffer so that it can be - repeated when limiting/regenerating the buffer. - -* nnml-generate-nov-databses should generate for all nnml servers. - -* when the user does commands in the group buffer, check the - modification time of the .newsrc.eld file and use - ask-user-about-supersession-threat. Also warn when trying to save - .newsrc.eld and it has changed. - -* M-g on a topic will display all groups with 0 articles in the - topic. - -* command to remove all topic stuff. - -* allow exploding incoming digests when reading incoming mail and - splitting the resulting digests. - -* nnsoup shouldn't set the `message-' variables. - -* command to nix out all nnoo state information. - -* nnmail-process-alist that calls functions if group names matches - an alist - before saving. - -* use buffer-invisibility-spec everywhere for hiding text. - -* variable to activate each group before entering them to get the - (new) number of articles. `gnus-activate-before-entering'. - -* command to fetch a Message-ID from any buffer, even starting Gnus - first if necessary. - -* when posting and checking whether a group exists or not, just ask - the nntp server instead of relying on the active hashtb. - -* buttonize the output of `C-c C-a' in an apropos-like way. - -* `G p' should understand process/prefix, and allow editing of - several groups at once. - -* command to create an ephemeral nnvirtual group that matches some - regexp(s). - -* nndoc should understand "Content-Type: message/rfc822" forwarded - messages. - - [done] - -* it should be possible to score "thread" on the From header. - -* hitting RET on a "gnus-uu-archive" pseudo article should unpack - it. - -* `B i' should display the article at once in the summary buffer. - -* remove the "*" mark at once when unticking an article. - -* `M-s' should highlight the matching text. - -* when checking for duplicated mails, use Resent-Message-ID if - present. - -* killing and yanking groups in topics should be better. If - killing one copy of a group that exists in multiple topics, only - that copy should be removed. Yanking should insert the copy, and - yanking topics should be possible to be interspersed with the - other yankings. - -* command for enter a group just to read the cached articles. A - way to say "ignore the nntp connection; just read from the cache." - -* `X u' should decode base64 articles. - - [`X m' does so.] - -* a way to hide all "inner" cited text, leaving just the most - recently cited text. - -* nnvirtual should be asynchronous. - -* after editing an article, gnus-original-article-buffer should be - invalidated. - -* there should probably be a way to make Gnus not connect to the - server and just read the articles in the server - -* allow a `set-default' (or something) to change the default value - of nnoo variables. - -* a command to import group infos from a .newsrc.eld file. - -* groups from secondary servers have the entire select method - listed in each group info. - -* a command for just switching from the summary buffer to the group - buffer. - -* a way to specify that some incoming mail washing functions should - only be applied to some groups. - -* Message `C-f C-t' should ask the user whether to heed - mail-copies-to: never. - -* new group parameter - `post-to-server' that says to post using - the current server. Also a variable to do the same. - -* the slave dribble files should auto-save to the slave file names. - -* a group parameter that says what articles to display on group - entry, based on article marks. - -* a way to visually distinguish slave Gnusae from masters. (Whip - instead of normal logo?) - -* Use DJ Bernstein "From " quoting/dequoting, where applicable. - -* Why is hide-citation-maybe and hide-citation different? Also - clear up info. - -* group user-defined meta-parameters. - - From: John Griffith - -* I like the option for trying to retrieve the FAQ for a group and - I was thinking it would be great if for those newsgroups that had - archives you could also try to read the archive for that group. - Part of the problem is that archives are spread all over the net, - unlike FAQs. What would be best I suppose is to find the one - closest to your site. - - In any case, there is a list of general news group archives at - ftp://ftp.neosoft.com/pub/users/claird/news.lists/newsgroup_archives.html - -* From: Jason L Tibbitts III - (add-hook 'gnus-select-group-hook - (lambda () - (gnus-group-add-parameter group - (cons 'gnus-group-date-last-entered (list (current-time-string)))))) - - (defun gnus-user-format-function-d (headers) - "Return the date the group was last read." - (cond ((car (gnus-group-get-parameter gnus-tmp-group 'gnus-group-date-last-entered))) - (t ""))) - -* tanken var at n,Ae(Br du bruker `gnus-startup-file' som prefix (FOO) - til ,Ae(B lete opp en fil FOO-SERVER, FOO-SERVER.el, FOO-SERVER.eld, - kan du la den v,Af(Bre en liste hvor du bruker hvert element i listen - som FOO, istedet. da kunne man hatt forskjellige serveres - startup-filer forskjellige steder. - -* LMI> Well, nnbabyl could alter the group info to heed labels like - LMI> answered and read, I guess. - - It could also keep them updated (the same for the Status: header of - unix mbox files). - - They could be used like this: - - `M l RET' add label to current message. - `M u RET' remove label from current message. - `/ l RET' limit summary buffer according to . - - would be a boolean expression on the labels, e.g. - - `/ l bug & !fixed RET' - - would show all the messages which are labeled `bug' but not labeled - `fixed'. - - One could also imagine the labels being used for highlighting, or - affect the summary line format. - -* Sender: abraham@dina.kvl.dk - - I'd like a gnus-find-file which work like find file, except that it - would recognize things that looks like messages or folders: - - - If it is a directory containing numbered files, create an nndir - summary buffer. - - - For other directories, create a nneething summary buffer. - - - For files matching "\\`From ", create a nndoc/mbox summary. - - - For files matching "\\`BABYL OPTIONS:", create a nndoc/baby - summary. - - - For files matching "\\`[^ \t\n]+:", create an *Article* buffer. - - - For other files, just find them normally. - - I'd like `nneething' to use this function, so it would work on a - directory potentially containing mboxes or babyl files. - -* Please send a mail to bwarsaw@cnri.reston.va.us (Barry A. Warsaw) - and tell him what you are doing. - -* Currently, I get prompted: - - decend into sci? - type y decend into sci.something ? - type n - decend into ucd? - - The problem above is that since there is really only one - subsection of science, shouldn't it prompt you for only descending - sci.something? If there was a sci.somethingelse group or section, - then it should prompt for sci? first the sci.something? then - sci.somethingelse?... - -* Ja, det burde v,Af(Bre en m,Ae(Bte ,Ae(B si slikt. Kanskje en ny variabel? - `gnus-use-few-score-files'? S,Ae(B kunne score-regler legges til den - "mest" lokale score-fila. F. eks. ville no-gruppene betjenes av - "no.all.SCORE", osv. - -* What i want is for Gnus to treat any sequence or combination of - the following as a single spoiler warning and hide it all, - replacing it with a "Next Page" button: - - ^L's - - more than n blank lines - - more than m identical lines (which should be replaced with button - to show them) - - any whitespace surrounding any of the above - -* Well, we could allow a new value to `gnus-thread-ignore-subject' - - `spaces', or something. (We could even default to that.) And then - subjects that differ in white space only could be considered the - "same" subject for threading purposes. - -* Modes to preprocess the contents (e.g. jka-compr) use the second - form "(REGEXP FUNCTION NON-NIL)" while ordinary modes (e.g. tex) - use the first form "(REGEXP . FUNCTION)", so you could use it to - distinguish between those two types of modes. (auto-modes-alist, - insert-file-contents-literally.) - -* Under XEmacs - do funny article marks: tick - thumb tack killed - - skull soup - bowl of soup score below - dim light bulb score over - - bright light bulb - -* Yes. I think the algorithm is as follows: - - Group-mode - - show-list-of-articles-in-group - if (key-pressed == SPACE) - if (no-more-articles-in-group-to-select) - if (articles-selected) - start-reading-selected-articles; - junk-unread-articles; - next-group; - else - show-next-page; - - else if (key-pressed = '.') - if (consolidated-menus) # same as hide-thread in Gnus - select-thread-under-cursor; - else - select-article-under-cursor; - - - Article-mode - if (key-pressed == SPACE) - if (more-pages-in-article) - next-page; - else if (more-selected-articles-to-read) - next-article; - else - next-group; - -* My precise need here would have been to limit files to Incoming*. - One could think of some `nneething-only-files' variable, but I - guess it would have been unacceptable if one was using many - unrelated such nneething groups. - - A more useful approach would be to, in response to the `G D' - prompt, be allowed to say something like: `~/.mail/Incoming*', - somewhat limiting the top-level directory only (in case - directories would be matched by the wildcard expression). - -* It would be nice if it also handled - - - - which should correspond to `B nntp RET sunsite.auc.dk' in *Group*. - - [done] - -* Take a look at w3-menu.el in the Emacs-W3 distribution - this - works out really well. Each menu is 'named' by a symbol that - would be on a gnus-*-menus (where * would be whatever, but at - least group, summary, and article versions) variable. - - So for gnus-summary-menus, I would set to '(sort mark dispose ...) - - A value of '1' would just put _all_ the menus in a single 'GNUS' - menu in the main menubar. This approach works really well for - Emacs-W3 and VM. - -* nndoc should take care to create unique Message-IDs for all its - articles. - -* gnus-score-followup-article only works when you have a summary - buffer active. Make it work when posting from the group buffer as - well. (message-sent-hook). - -* rewrite gnus-demon to use run-with-idle-timers. - -* * Enhancements to Gnus: - - Add two commands: - - * gnus-servers (gnus-start-server-buffer?)-enters Gnus and goes - straight to the server buffer, without opening any connections to - servers first. - - * gnus-server-read-server-newsrc-produces a buffer very similar to - the group buffer, but with only groups from that server listed; - quitting this buffer returns to the server buffer. - -* add a command to check the integrity of an nnfolder folder - go - through the article numbers and see that there are no duplicates, - and stuff. - -* `unsmileyfy-buffer' to undo smileification. - -* a command to give all relevant info on an article, including all - secondary marks. - -* when doing `-request-accept-article', the backends should do the - nnmail duplicate checking. - -* allow `message-signature-file' to be a function to return the - value of the signature file. - -* In addition, I would love it if I could configure message-tab so - that it could call `bbdb-complete-name' in other headers. So, - some sort of interface like - - (setq message-tab-alist '((message-header-regexp - message-expand-group) ("^\\(To\\|[cC]c\\|[bB]cc\\)" - bbdb-complete-name))) - - then you could run the relevant function to complete the - information in the header - -* cache the newsgroups file locally to avoid reloading it all the - time. - -* a command to import a buffer into a group. - -* nnweb should allow fetching by Message-ID from servers. - -* point in the article buffer doesn't always go to the beginning of - the buffer when selecting new articles. - -* a command to process mark all unread articles. - -* `gnus-gather-threads-by-references-and-subject' - first do - gathering by references, and then go through the dummy roots and - do more gathering by subject. - -* gnus-uu-mark-in-numerical-order - process mark articles in - article numerical order. - -* (gnus-thread-total-score (gnus-id-to-thread (mail-header-id - (gnus-summary-article-header)))) bind to a key. - -* sorting by score is wrong when using sparse threads. - -* a command to fetch an arbitrary article - without having to be in - the summary buffer. - -* a new nncvs backend. Each group would show an article, using - version branches as threading, checkin date as the date, etc. - -* http://www.dejanews.com/forms/dnsetfilter_exp.html ? This filter - allows one to construct advance queries on the Dejanews database - such as specifying start and end dates, subject, author, and/or - newsgroup name. - -* new Date header scoring type - older, newer - -* use the summary toolbar in the article buffer. - -* a command to fetch all articles that are less than X days old. - -* in pick mode, `q' should save the list of selected articles in the - group info. The next time the group is selected, these articles - will automatically get the process mark. - -* Isn't it possible to (also?) allow M-^ to automatically try the - default server if it fails on the current server? (controlled by a - user variable, (nil, t, 'ask)). - -* make it possible to cancel articles using the select method for - the current group. - -* `gnus-summary-select-article-on-entry' or something. It'll - default to t and will select whatever article decided by - `gnus-auto-select-first'. - -* a new variable to control which selection commands should be - unselecting. `first', `best', `next', `prev', `next-unread', - `prev-unread' are candidates. - -* be able to select groups that have no articles in them to be able - to post in them (using the current select method). - -* be able to post via DejaNews. - -* `x' should retain any sortings that have been performed. - -* allow the user to specify the precedence of the secondary marks. - Also allow them to be displayed separately. - -* gnus-summary-save-in-pipe should concatenate the results from the - processes when doing a process marked pipe. - -* a new match type, like Followup, but which adds Thread matches on - all articles that match a certain From header. - -* a function that can be read from kill-emacs-query-functions to - offer saving living summary buffers. - -* a function for selecting a particular group which will contain - the articles listed in a list of article numbers/id's. - -* a battery of character translation functions to translate common - Mac, MS (etc) characters into ISO 8859-1. - - (defun article-fix-m$word () - "Fix M$Word smartquotes in an article." - (interactive) - (save-excursion - (let ((buffer-read-only nil)) - (goto-char (point-min)) - (while (search-forward "\221" nil t) - (replace-match "`" t t)) - (goto-char (point-min)) - (while (search-forward "\222" nil t) - (replace-match "'" t t)) - (goto-char (point-min)) - (while (search-forward "\223" nil t) - (replace-match "\"" t t)) - (goto-char (point-min)) - (while (search-forward "\224" nil t) - (replace-match "\"" t t))))) - - [done] - -* (add-hook 'gnus-exit-query-functions - '(lambda () - (if (and (file-exists-p nnmail-spool-file) - (> (nnheader-file-size nnmail-spool-file) 0)) - (yes-or-no-p "New mail has arrived. Quit Gnus anyways? ") - (y-or-n-p "Are you sure you want to quit Gnus? ")))) - -* allow message-default-headers to be a function. - -* new Date score match types - < > = (etc) that take floating point - numbers and match on the age of the article. - -* > > > If so, I've got one gripe: It seems that when I fire up gnus 5.2.25 - > > > under xemacs-19.14, it's creating a new frame, but is erasing the - > > > buffer in the frame that it was called from =:-O - > - > > Hm. How do you start up Gnus? From the toolbar or with - > > `M-x gnus-other-frame'? - > - > I normally start it up from the toolbar; at - > least that's the way I've caught it doing the - > deed before. - -* all commands that react to the process mark should push the - current process mark set onto the stack. - -* gnus-article-hide-pgp Selv ville jeg nok ha valgt ,Ae(B slette den - dersom teksten matcher - "\\(This\s+\\)?[^ ]+ has been automatically signed by" - og det er maks hundre tegn mellom match-end og ---linja. Men -det- - er min type heuristikk og langt fra alles. - -* `gnus-subscribe-sorted' - insert new groups where they would have - been sorted to if `gnus-group-sort-function' were run. - -* gnus-(group,summary)-highlight should respect any `face' text - props set on the lines. - -* use run-with-idle-timer for gnus-demon instead of the home-brewed - stuff for better reliability. - -* add a way to select which NoCeM type to apply - spam, troll, etc. - -* nndraft-request-group should tally auto-save files. - -* implement nntp-retry-on-break and nntp-command-timeout. - -* gnus-article-highlight-limit that says when not to highlight - (long) articles. - -* (nnoo-set SERVER VARIABLE VALUE) - - [done] - -* nn*-spool-methods - -* interrupitng agent fetching of articles should save articles. - -* command to open a digest group, and copy all the articles there - to the current group. - -* a variable to disable article body highlights if there's more than - X characters in the body. - -* handle 480/381 authinfo requests separately. - -* include the texi/dir file in the distribution. - -* format spec to "tab" to a position. - -* Move all prompting to the new `M-n' default style. - -* command to display all dormant articles. - -* gnus-auto-select-next makeover - list of things it should do. - -* a score match type that adds scores matching on From if From has - replied to something someone else has said. - -* Read Netscape discussion groups: - snews://secnews.netscape.com/netscape.communicator.unix - -* One command to edit the original version if an article, and one to - edit the displayed version. - -* `T v' - make all process-marked articles the children of the - current article. - -* Switch from initial text to the new default text mechanism. - -* How about making it possible to expire local articles? Will it be - possible to make various constraints on when an article can be - expired, e.g. (read), (age > 14 days), or the more interesting - (read & age > 14 days)? - -* New limit command--limit to articles that have a certain string in - the head or body. - -* Allow breaking lengthy NNTP commands. - -* gnus-article-highlight-limit, to disable highlighting in big - articles. - -* Editing an article should put the article to be edited in a - special, unique buffer. - -* A command to send a mail to the admin-address group param. - -* A Date scoring type that will match if the article is less than a - certain number of days old. - -* New spec: %~(tab 56) to put point on column 56 - -* Allow Gnus Agent scoring to use normal score files. - -* Rething the Agent active file thing. `M-g' doesn't update the - active file, for instance. - -* With dummy roots, `^' and then selecing the first article in any - other dummy thread will make Gnus highlight the dummy root instead - of the first article. - -* Propagate all group properties (marks, article numbers, etc) up to - the topics for displaying. - -* `n' in the group buffer with topics should go to the next group - with unread articles, even if that group is hidden in a topic. - -* gnus-posting-styles doesn't work in drafts. - -* gnus-summary-limit-include-cached is slow when there are many - articles in the cache, since it regenerates big parts of the - summary buffer for each article. - -* Implement gnus-batch-brew-soup. - -* Group parameters and summary commands for un/subscribing to mailing - lists. - -* Introduce nnmail-home-directory. - -* gnus-fetch-group and friends should exit Gnus when the user exits - the group. - -* The jingle is only played on the second invocation of Gnus. - -* Bouncing articles should do MIME. - - [done] - -* Crossposted articles should "inherit" the % or mark from the other - groups it has been crossposted to, or something. (Agent.) - -* If point is on a group that appears multiple times in topics, and - you press `l', point will move to the first instance of the group. - -* A spec for the group line format to display the number of - agent-downloaded articles in the group. - -* Some nntp servers never respond when posting, so there should be a - timeout for all commands. - -* When stading on a topic line and `t'-ing, point goes to the last - line. It should go somewhere else. - -* I'm having trouble accessing a newsgroup with a "+" in its name - with Gnus. There is a new newsgroup on msnews.microsoft.com named - "microsoft.public.multimedia.directx.html+time" that I'm trying to - access as - "nntp+msnews.microsoft.com:microsoft.public.multimedia.directx.html+time" - but it gives an error that it cant access the group. - - Is the "+" character illegal in newsgroup names? Is there any way - in Gnus to work around this? (gnus 5.6.45 - XEmacs 20.4) - - [It works in 5.8.8.] - -* When `#F', do: - - Subject: Answer to your mails 01.01.1999-01.05.1999 - --text follows this line-- - Sorry I killfiled you... - - Under the subject "foo", you wrote on 01.01.1999: - > bar - Under the subject "foo1", you wrote on 01.01.1999: - > bar 1 - -* Allow "orphan" scores in the Agent scoring. - - [done?] - -* - Edit article's summary line. - - End edit - - Sort lines in buffer by subject - - --> the old subject line appears in Summary buffer, not the one that was - just changed to. - -* Remove list identifiers from the subject in the summary when doing - `^' and the like. - -* Have the Agent write out articles, one by one, as it retrieves - them, to avoid having to re-fetch them all if Emacs should crash - while fetching. - -* Be able to forward groups of messages as MIME digests. - - [done] - -* nnweb should include the "get whole article" article when getting - articles. - -* When I type W W c (gnus-article-hide-citation) in the summary - buffer, the citations are revealed, but the [+] buttons don't turn - into [-] buttons. (If I click on one of the [+] buttons, it does - turn into a [-] button.) - - [fixed] - -* Perhaps there should be a command to "attach" a buffer of comments - to a message? That is, `B WHATEVER', you're popped into a buffer, - write something, end with `C-c C-c', and then the thing you've - written gets to be the child of the message you're commenting. - -* Handle external-body parts. - - [done for some access types] - -* When renaming a group name, nnmail-split-history does not get the - group name renamed. - -* Allow mail splitting on bodies when using advanced mail splitting. - - (body "whatever.text") - -* Be able to run `J u' from summary buffers. - -* Solve the halting problem. - - -;; Local Variables: -;; mode: outline -;; coding: iso-2022-7bit -;; paragraph-separate: "[ ]*$" -;; End: -- 1.7.10.4