設置新聞服務器
啟動 gnus 非常簡單,在你的 Emacs 里執行 M-x
gnus 命令就可以了,如果你想在另一個 frame 里啟動 gnus,那就執行 M-x gnus-other-frame
。但是,現在先別啟動,因為我們先得進行一些配置。 gnus 啟動的時候會去讀你寫在 ~/.gnus.el 里的內容,就像 Emacs
啟動時要讀 ~/.emacs 一樣。當然你也可以把對 gnus 的配置寫在 ~/.emacs 里,但是最好還是使用 gnus 自己的配置文件。
首先,我們要設置新聞服務器,也就是 nntp 服務器, nntp 是 Network
News Transfer Protocal 的縮寫,國內提供 nntp 服務的主機不多,教育網內能訪問的nntp 服務器,我只找到了一個:
news.cn99.com,好了,現在就在 ~/.gnus.el 里加上這一句:
(setq gnus-select-method '(nntp "news.cn99.com"))
;; or news.yaako.com
設置郵件服務器
現
在,我們進行接收郵件的設置。玩*nix 的老鳥都知道,*nix 的哲學是每個程序"Only do one thing, and do it
well." 因此就有了 sendmail, fetchmail, mailreader 等等一大票程序來干收發郵件這個活兒。嚴格地說
Emacs(gnus) 的分工是做 mailreader,也就是說我們用 emacs 來寫信,然后由另一個程序,比如sendmail
來把信發出去;收信的過程也是類似的,由一個程序(比如 fetchmail) 負責把信取回來,放在一個 spool 里面,然后我們用 Emacs
來讀信。你先別跑,我不是讓你去配置 sendmail 這樣的大怪物,我們平常發發信、收收信這點小活兒,用不著勞 sendmail
老人家的大駕。
我們用的最多的郵件收發方式是這樣的,有個 POP3 服務器,收信時我們到那里去取;有個 SMTP 服務器,發信時我們把信送到那里去。這點小活兒,現在 emacs 自己就可以搞定了。現在我們看看怎么設置:
首先我們設置 POP3 服務器:
(setq mail-sources
'((pop :server "pop.163.com" ;; 在這里設置 pop3 服務器
:user "brep" ;; 用戶名
:port "pop3"
:password "mypasswd"))) ;; 密碼
然后我們還要告訴 gnus 如何存放接收來的郵件, gnus 把這個叫做 backend,最常用的方式是 nnfolder,另外還有 nnmbox, nnml 等其它幾種方式,我們選擇其中一種就可以了:
(setq gnus-secondary-select-methods '((nnfolder "")))
然
后我們設置 SMTP 服務器,采用 smtp 方式發送郵件需要一個小程序 smtpmail.el, 這個程序現在已被納入了官方的
Emacs,如果你用的是最新的 CVS Emacs,比如 Emacs22, Emacs23 等,就已經包含了這個程序。你可以檢查一下
emacs 的安裝目錄中 lisp/mail/ 目錄下有沒有這個文件,如果沒有的話,就只好自己下載、安裝了。現在我們看看如何設置:
(setq user-full-name "Brep") ;; 外發的郵件采用這個名字
(setq user-mail-address "brep@example.com") ;;外發的郵件采用這個地址
(setq smtpmail-auth-credentials
'(("smtp.163.com" ;; SMTP 服務器
25
"brep" ;; 用戶名
"mypasswd"))) ;; 密碼
(setq smtpmail-default-smtp-server "smtp.163.com")
(setq smtpmail-smtp-server "smtp.163.com")
(setq message-send-mail-function 'smtpmail-send-it)
中文設置
中文!中文!永遠都是頭痛的事兒。把下面這些加在 .gnus.el 里面吧:
(set-language-environment 'Chinese-GB)
(setq gnus-default-charset 'chinese-iso-8bit
gnus-group-name-charset-group-alist '((".*" . chinese-iso-8bit))
gnus-summary-show-article-charset-alist
'((1 . chinese-iso-8bit)
(2 . gbk)
(3 . big5)
(4 . utf-8))
gnus-newsgroup-ignored-charsets
'(unknown-8bit x-unknown iso-8859-1))
另外,有些用 web 方式發出的郵件里有 html,加入下面的設置,只看其中的plain text 部分:
(eval-after-load "mm-decode"
'(progn
(add-to-list 'mm-discouraged-alternatives "text/html")
(add-to-list 'mm-discouraged-alternatives "text/richtext")))
訂閱新聞組
現在我們可以選擇幾個自己喜歡的新聞組,作為默認的新聞組:
(setq gnus-default-subscribed-newsgroups
'("gnu.emacs.help" ;; 這里不錯噢,有關 emacs 使用的問題都在這里討論
"cn.comp.os.linux")) ;; 這里也有一個 emacs 小團伙,
;; 有空去湊個熱鬧吧,中文的喲
啟動 gnus
現在到了關鍵時刻,成敗在此一舉:
M-x gnus
嘿嘿,傻眼了吧, Emacs 沒反應了!!! 沒關系,表擔心,這是正常現象,
gnus 是個單線程程序, nntp
服務器又慢的要命(你要是在公網,說不定能好點兒),多等一會兒就好了,一般也就兩三分鐘,運氣不好的話還要長些,什么?你等不及了,要編輯文件?那就只
好麻煩您老再開一個 Emacs 吧!
Group buffer
如果一切正常, gnus 啟動完成的時候,我們就會看到 group buffer,這里列出了我們訂閱的新聞組,類似這樣:
49: gnu.emacs.help
6: cn.comp.os.linux
8: nndoc+gnus-help:gnus-help
0: nndraft:queue
0: nndraft:drafts
新聞組前面的數字,表示這個組里還有多少帖子沒讀過。現在,只要把光標移動到要讀的新聞組上面,敲下回車鍵就可以讀帖子了。
不要 kill 掉這個 buffer 喲,我們經常需要回到這個 buffer 。如果你讀完了新聞、信件,想退出 gnus,只要在這個 buffer 里按下 q 鍵就可以了。
Summary buffer
當我們閱讀某個新聞組的時候,就會進入 summary buffer,其中列出了作者和帖子的標題,如果是跟帖,會縮進表示,象下面這樣:
[ 51: 空殼殼 ] 已調試好的 Emacs 下載(WIN 版本)
[ 283: 空殼殼 ] 這個包的.emacs 配置文件
[ 5: Brep ]
< 4: watercloud > Re: 已調試好的 Emacs 下載(WIN 版本)
[ 9: It's me FKtPp ;) ]
[ 2: 空殼殼 ]
[ 7: It's me FKtPp ;) ]
如果要讀貼子,只要按下空格鍵就行了。按下 q 鍵將返回到 Group buffer.
發帖、回帖
在 newsgroup 里發帖子叫 post article, 發貼子很簡單,只要我們按下 a 這一個鍵就可以了,寫完后 C-c C-c 發出,如果寫了一半兒想取消,則鍵入 C-c C-k 。
在 newsgroup 回帖子叫 follow up,按下 f 鍵就行了,但是這樣回帖并不引用原作者的文章,如果你想引用原作者的文章,那就用 F 鍵。
如果你想和文章的作者私下聊聊,那就用 r 或者 R 鍵,給原作者回信叫做reply to, 這時只有原作者一個人能收到信,與 follow up 不同, follow up 的時候,凡是訂閱了新聞組的人都能讀到信。
我的信箱哪里去了?
按照手冊中的說法,我們通過 POP3 接收到的信件會被送到一個叫做 mail.misc 的組里, gnus 會自己建立這個組,但是我找了好幾天也沒找到。怎么辦?沒關系,我們自己建一個:
在 Group buffer 里,鍵入 G m,系統提示我們輸入組名: mail.misc,然后提示我們輸入 server 名,此時我們輸入: nnfolder,注意,服務器名要與你選擇的 backend 一致。
建
立完成之后,我們可以在 Group buffer 里鍵入 ^,此時我們將進入 Server buffer,
在這里我們將看到自己選擇的服務器,比如: news.cn99.com 。其中, nnfolder 服務器里應該有我們新建的 mail.misc
組。我們在服務器名上輸入回車,這樣就能看到這個服務器中的組,在想要訂閱的組上面按下'u'鍵即可訂閱這個組,取消訂閱同樣也是用這個鍵。
發信
用 gnus 發信極其簡單,隨時都可以,按 m 一鍵搞定, gnus 會新建一個buffer 讓我們寫信
To: 在這里添上收件人的 email
Subject: 在這里寫上標題
From: Brep <brep@example.com>
--text follows this line-- 千萬不要刪除這一行
寫完信后 C-c C-c 發出, 不想要了就 C-c C-k 。
大功告成了嗎?
現在我們已經完成基本任務了,但是大功告成了嗎?
沒有!苦難才剛剛開始......
我看到一篇很好的帖子,怎么才能保存下來?
我想備份自己發出的所有信件,怎么辦?
我想刪除信箱里的信件,怎么辦?
我的聯系人很多,我想建個地址簿,怎么辦?
我想把不同的人發來的信,分別放在不同的信箱里,怎么辦?
給帖子加標記
你可能已
經注意到了,當你讀過一個帖子之后, Gnus 會自動在帖子的最左邊加上一個 R ,這就是標記。這些標記有些是我們自己加上的,有些是 Gnus
自動加上的。標記不止 R 一個,還有很多符號被 Gnus 用來當作標記符號。這些標記表明了帖子的狀態,比如 R 表示這個帖子你已經讀過了。
現
在我們來看看常見的標記是什么意思。標記分為兩大類,一類是“已讀(read)”標記,一般用字母表示,比如 R, r, O, E
等等;另一類是“未讀(unread)”標記,一般用特殊符號表示,比如 !, ?,
*等等。標記的數量比較多,但我們只要了解常見的幾個標記是什么意思就行了。
Gnus
之所以要把帖子分為“已讀”和“未讀”兩類,是因為對這兩類帖子,Gnus
采取的處理方式不同。如果一個帖子別標記為“已讀”,那么當你離開這個group(用 q
命令)以后,下次再進入的時候,你就不會再見到它了(除非你要求gnus
把老帖翻出來給你看),只有那些被標記為“未讀”的帖子和新帖才會顯示給你看。
已讀標記
- R
- 這個符號表示這篇帖子你的確已經讀過了,每次你讀完一篇帖子之后, Gnus 就會自動加上這個標記。
- r
- 這個標記表示是你自己手動把帖子標記為已讀的,但實際上你可能并沒讀過。你可以用d 命令加這個標記。
- O
- 表示這是個老帖,上次進來的時候你已經讀過了。那么怎么才能看到老貼呢,用 / o 命令,就可以把所有老貼翻出來看。
未讀標記
- !
- 保
留(ticked)標記,帶有這個標記的帖子將一直保持可見,如果你對某個貼子感興趣,想留著以后讀,可以加上這個標記,用 !
命令就行了。但是請注意,并不是說這種帖子就永久保留下來了,如果這個帖子被從管理員從 nntp 服務器上刪除了,那么你就再也看不到它了。
nntp 服務器按照相應的設置,定期刪除過期( expired )的老貼。
- ?
- 休眠(dormant)標記,這個標記比較有意思,所謂一個帖子進入“休眠狀態”,指的是除非有人跟帖,否則你以后不會見到這個帖子,也就是說,平常這個帖子和已讀沒有差別,但是一旦有人跟帖,它就會跳出來,用 ? 命令可以加上這個標記。
- 空格
- 如果一個帖子前面什么符號也沒有,就表示這是一個“未讀”的帖子。
清除所有標記
用 M c 或者 Meta-u 清除所有標記,也就是說標記為“未讀(unread)”。
保存有價值的帖子
要想永久保存有價值的帖子,也就是說把帖子拷貝到自己的機器上保存起來,那么可以打開 gnus 的 cache 功能,在 .gnus.el 中加入:
(setq gnus-use-cache 'passive)
以后看到有價值的帖子,只要按下 * 鍵,這篇帖子就會被拷貝到本地的 cache 中保存起來,這樣即使服務器那邊刪除了這篇帖子,也沒關系了。如果你又不想要了,用 Meta-* 就可以把帖子從緩存中刪掉。
如果你想查看自己保存在緩存里的帖子,只要在 summary buffer 中用 'Y c' 命令即可。
郵件分類
可能你每天都要收到大量的郵件,有的是親朋好友寄來的,有的是你訂閱的maillist 寄來的。如果這些郵件都放在 mail.misc 這一個組里,那么很快這里就會擁擠不堪了,說不定有些重要的信件會被漏看。
在 Gnus 里,我們可以對收到的郵件進行分類,比如把所有來自 tsinghua.edu.cn 的信都放在 mail.tsinghua 這個組里。我們可以這樣做:
首
先我們建一個 mail.tsinghua 組,在 Group buffer 里鍵入 G m , 然后輸入 "mail.tsinghua",
接著系統會讓我們選擇 Method,此時輸入"nnfolder",這樣 mail.tsinghua 這個組就建立好了。
然后我們設置 nnmail-split-methods 變量,在 .gnus.el 中加入:
(setq nnmail-split-methods
'(("mail.tsinghua" "^From:.*tsinghua.edu.cn")
("mail.misc" "")))
這
樣以后凡是來自 tsinghua.edu.cn 的信件都會被放到 mail.tsinghua 這個組里去。這個變量的值是一個由 list
組成的 list,每個 list 由兩個部分組成,前面的是組名,比如"mail.tsinghua", 后面的是個正則表達式, Gnus
會按這個正則表達式的要求到郵件里去搜索,然后把找到的郵件放在指定的組里面。
這是一種簡單的分類方式,如果你覺得不過癮,可以試試 nnmail-split-fancy,那是一種更靈活的分類方式。
需要注意的一點是,我們剛才用的術語都是“組(group)”,而沒有說“郵件夾”。實際上,在 Gnus 里面組就是郵件夾,郵件夾就是組,我們說過, Gnus 采用同樣的方式處理信件和新聞,因此它并不對組和郵件夾進行區分。
既然是 group,那么你就可以取消訂閱,假如你把女朋友的來信都放在mail.lovers 組里面,隨后不小心 unsubscribe 了這個組,那么你就讀不到她們的來信了,要是你的女朋友跟你分了手,千萬別怪 Gnus,就像 Gnus 的手冊里說的:
Gnus gives you all the opportunity you could possibly want for shooting yourself in the foot.
保存自己發送的郵件
基本上所有的郵件客戶端都有一個“已發送郵件”或是“ sent ”的郵件夾,你自己寫的信發送出去的同時,都會在這里都有一個備份,因為我們有時候需要看看自己發出去的信件。
在 Gnus 里做到這一點很容易,而且它還可以自動把你發出去的郵件分分類,比如把發出去的信放在一個組里,把你在 newsgroup 里 post 的帖子放在另一個組里。
現在我們看看怎么做到這一點,比如我們想把自己發的信備份到 mail.sent.mail 組里,把自己 post 的帖子備份到在 mail.sent.news 組里,那么首先我們建立這兩個組:
在 group buffer 里鍵入 G m ,然后輸入組名"mail.sent.mail", 接著是輸入 "nnfolder", 這個組就建好了,然后用同樣的方式建立"mail.sent.news"組。
最后在.gnus.el 里加入:
(setq gnus-message-archive-group
'((if (message-news-p)
"nnfolder:mail.sent.news"
"nnfolder:mail.sent.mail")))
搞定了。
刪除郵件
當你想刪除一個郵件的時候,你先得搞清楚它是個 news 還是個 mail, 因為你是沒有權力刪除新聞組里的文章的,就象你上 BBS 的時候一樣,就算你看到一篇不爽的帖子,你也刪不了它,除非你是版主。
在
這里我還要多一句嘴, newsgroup 管理的不像 bbs 那樣嚴格, bbs
的每個版都有若干版主進行管理,刪除無關的文章,封禁不按規矩發帖的人等等,象 joke 這種大板,有8個版主嚴陣以待,隨時準備刪貼封人。
newsgroup 是沒有版主管理的,一般只有 nntp 服務器的管理員才有刪帖的權力,但是一個 nntp 服務器上有成千上萬的
group,管理員才沒時間管刪帖這種事兒呢,他們一般是制定一些規則,讓系統自動刪除一些過期的帖子。因此,如果你在 newsgroup
上發了個垃圾帖子,它就有可能在那里呆上好幾年。
正因為如此,我們在
newsgroup
上發帖子一定要慎重,不要發垃圾郵件什么的。更嚴重的是,如果你發了這種郵件,那么訂閱這個組的人就會認為你很不禮貌,不懂規矩,他們可能就會在自己的
Gnus 里增加一條規則,從此以后凡是你發表的帖子,他們都不下載、不看。
好了,言歸
正傳,我們談談怎么刪除郵件。有兩種方法可以刪除郵件,一種是使用郵件專用命令` B DEL',
也就是現鍵入'B',然后再按'Delete'鍵,這時系統會詢問你是否真的要刪除什么的,回答 yes 就可以了。但是這種方法太暴力了,在Gnus
里有一種更好的方法刪除郵件,那就是給郵件加上“保質期”,也就是說,讓Gnus
替你干刪除郵件這個活兒,它會忠實地按照你的要求,刪除“過了保質期”的郵件。
怎樣給郵件加上“保質期”呢,很簡單,在郵件組的 summary buffer 里,用 E 鍵就可以給光標所在的郵件貼上 expirable 的標簽,此時帖子前面會出現一個字母 E 作為標記,然后你就不用管了,到了期限, gnus 就會自動刪除它們。
你也可以用 E 命令,給新聞組里的帖子加上 expirable 的標簽,但是這毫無意義,因為不論是你還是 Gnus 都無權刪除新聞組里的帖子。
Gnus 默認的保質期是7天,如果你覺得時間不合適,可以自己設置,更改變量
nnmail-expiry-wait 的值就行了,在 .gnus.el 里加入:
(setq nnmail-expiry-wait 3)
這樣就把保質期設成3天了。
你還可以給不同的組設置不同的保質期,象下面這樣:
(setq nnmail-expiry-wait-function
(lambda (group)
(cond ((string= group "mail.tsinghua")
31)
((string= group "mail.misc")
3)
((string= group "mail.lovers")
'never)
(t
6))))
這
樣就把 mail.tsinghua 這個組的保質期設為31天, mail.misc 組設為3天等等。除了數字,還有另外兩個符號可以用,一個是
immediate ,表示立即刪除標為過期的郵件;另一個是 never ,表示永不刪除過期的郵件,“如果你一定要加個期限, Gnus
希望是一萬年。”
地址簿
如果你的聯系人比較多,沒辦法全部記住這些人的 email 地址,想建個地址簿,該怎么辦呢?
有兩個種方法可以完成這個任務,一種是簡單的,但是不太靈活;另一種麻煩點兒,但是功能很強。
先說簡單的,實際上這是一種很古老的方法了,那就是采用 mail alias (地址別名),你只要把聯系人的郵件地址和別名都寫在 ~/.mailrc 文件里就行了,語法很簡單,每個聯系人占一行,像下面這樣:
alias brep "Brep <brep@newsmth.org>"
alias heyyy "和伊有約 <heyyy@who.knows.where>"
alias EOF "EOF <EOF@god.knows>"
alias ilovecpp "ilovecpp <ilovecpp@please.tellme.ifyouknow>"
發信的時候,在 To: 后面輸入別名,比如 heyyy,然后按空格鍵, Gnus 會自動把全名替你插進去。
然后我們再說復雜點兒的,其實也不復雜,只是麻煩點兒,要自己去下載一個軟件包,到這里:
http://bbdb.sourceforge.net/
去下載一個叫做 bbdb 的軟件包,全名是 "Insidious Big
Brother Database"。不知怎么搞的,現在一提數據庫我就開始反胃,不過這個 bbdb 只是個 Emacs 擴展,全都是用
elisp 寫成的,并不是那種巨無霸似的操作繁瑣的數據庫管理系統。bbdb 很小,壓縮包只有300多 k 。 bbdb
只是建立了一個~/.bbdb 文件,然后把你的聯系人每個一行地寫在里面罷了,這是個純文本文件,不過最好不要自己編輯這個文件,可以用 bbdb
的命令往里添加聯系人。
下載回來以后解開,然后 make 一下,象這樣:
$ tar xzf bbdb-2.35.tar.gz
$ cd bbdb-2.35
$ ./configure --with-emacs=emacs --with-gnus-dir=/usr/share/emacs/23.0.0/lisp/gnus/
$ make gnus
然后把 bbdb-2.35 目錄下的 lisp 子目錄整個扔到 site-lisp 下面就行了:
$ cp -r lisp/ /usr/share/emacs/23.0.0/site-lisp/
還有文檔,如果你要看的話也要自己裝:
$ cd texinfo/ && make
$ cp bbdb.info /usr/share/info
$ cd /usr/share/info
$ install-info bbdb.info
如果你覺得太麻煩了,也可以解開壓縮包后,直接把 lisp/ 子目錄整個扔到 site-lisp 下面, bbdb 的手冊中說可以這樣,不過我沒試過。
好了,把下面這些寫在 .gnus.el 里面:
(require 'bbdb)
(bbdb-initialize 'gnus 'message)
;; bbdb 自己檢查你填寫的電話是否符合北美標準,
;; 如果你不是生活在北美,應該取消這種檢查
(setq bbdb-north-american-phone-numbers-p nil)
;; 把你的 email 地址告訴 bbdb
(setq bbdb-user-mail-names
(regexp-opt '("brep@example.com"
"brep@newsmth.org")))
;; 補全 email 地址的時候循環往復
(setq bbdb-complete-name-allow-cycling t)
;; No popup-buffers
(setq bbdb-use-pop-up nil)
然后重新啟動 Gnus, 或者是在 Group buffer 中用 r 鍵,讓 Gnus 重新讀入~/.gnus.el
bbdb
使用起來很簡單,第一次用的時候,要用"M-x bbdb-create"命令創建聯系人,此時 bbdb 會問你一些相關的問題,比如聯系人的
Name, company, Network Address(這里要添 email 地址)等等,你如實回答就是了。然后 bbdb
會創建一個~/.bbdb 文件,并把你的聯系人加進去。
以后你可以隨時用"M-x bbdb-create"命令添加聯系人,也可以用 `M-x bbdb RET RET' 命令讓 bbdb 把所有聯系人顯示給你看。
不過, bbdb 最方便的地方在于你寫信的時候,只要在 To: 面用 TAB 鍵, bbdb 就會把聯系人替你填好,如果不對,就繼續按 TAB 鍵, bbdb 會填下一個,循環往復。
還有一個方便的地方,如果你在 Summary buffer 中的某個郵件或帖子上按 : 建, bbdb 將自動把發信人替你加到地址簿里,方便吧!
結束語
說了這么多,也只是把Gnus最基本的功能介紹了一下,實際上,Gnus還有很多高級的功能可以發掘。那就去讀 Gnus 的 manual 吧,我覺得 Gnus 的手冊寫的真不錯,語言詼諧幽默,讀起來趣味盎然。
當你用了一段時間 Gnus 以后,你就很難再離開它了,那時候你就會理解下面這句話:
No Gnus is bad news.