2009年6月19日星期五

EmacsWiki: init-gnus.el

EmacsWiki: init-gnus.el: "init-gnus.el

Download

;;; init-gnus.el --- Configuration file for gnus

;; Filename: init-gnus.el
;; Description: Configuration file for gnus
;; Author: Andy Stewart lazycat.manatee@gmail.com
;; Maintainer: Andy Stewart lazycat.manatee@gmail.com
;; Copyright (C) 2008, 2009, Andy Stewart, all rights reserved.
;; Created: 2008-12-08 23:25:43
;; Version: 0.1
;; Last-Updated: 2008-12-08 23:25:45
;; By: Andy Stewart
;; URL:
;; Keywords: gnus
;; Compatibility: GNU Emacs 23.0.60.1
;;
;; Features that might be required by this library:
;;
;;
;;

;;; This file is NOT part of GNU Emacs

;;; License
;;
;; 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 3, 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., 51 Franklin Street, Fifth
;; Floor, Boston, MA 02110-1301, USA.

;;; Commentary:
;;
;; Configuration file for gnus
;;

;;; Installation:
;;
;; Put init-gnus.el to your load-path.
;; The load-path is usually ~/elisp/.
;; It's set in your ~/.emacs like this:
;; (add-to-list 'load-path (expand-file-name '~/elisp'))
;;
;; And the following to your ~/.emacs startup file.
;;
;; (require 'init-gnus)
;;
;; No need more.

;;; Change log:
;;
;; 2008/12/08
;; First released.
;;

;;; Acknowledgements:
;;
;;
;;

;;; TODO
;;
;;
;;

;;; Require


;;; Code:

;; 存储设置
(setq gnus-startup-file '~/MyEmacs/Gnus/.newsrc') ;初始文件
(setq gnus-default-directory '~/MyEmacs/Gnus/') ;默认目录
(setq gnus-home-directory '~/MyEmacs/Gnus/') ;主目录
(setq gnus-dribble-directory '~/MyEmacs/Gnus/') ;恢复目录
(setq gnus-directory '~/MyEmacs/Gnus/News/') ;新闻组的存储目录
(setq gnus-article-save-directory '~/MyEmacs/Gnus/News/') ;文章保存目录
(setq gnus-kill-files-directory '~/MyEmacs/Gnus/News/trash/') ;文件删除目录
(setq gnus-agent-directory '~/MyEmacs/Gnus/News/agent/') ;代理目录
(setq gnus-cache-directory '~/MyEmacs/Gnus/News/cache/') ;缓存目录
(setq gnus-cache-active-file '~/MyEmacs/Gnus/News/cache/active') ;缓存激活文件
(setq message-directory '~/MyEmacs/Gnus/Mail/') ;邮件的存储目录
(setq message-auto-save-directory '~/MyEmacs/Gnus/Mail/drafts') ;自动保存的目录
(setq mail-source-directory '~/MyEmacs/Gnus/Mail/incoming') ;邮件的源目录
(setq nnmail-message-id-cache-file '~/MyEmacs/Gnus/.nnmail-cache') ;nnmail的消息ID缓存
(setq nnml-newsgroups-file '~/MyEmacs/Gnus/Mail/newsgroup') ;邮件新闻组解释文件
(setq nntp-marks-directory '~/MyEmacs/Gnus/News/marks') ;nntp组存储目录
(setq mml-default-directory '~/.gnus/') ;附件的存储位置
;; 接收邮件或新闻
(setq user-full-name my-full-name) ;全名
(setq user-mail-address my-mail) ;邮件地址
(setq gnus-select-method '(nntp 'localhost')) ;首要选择方法, 从本地缓冲文件中读取新闻 (leafnode抓取)
(setq gnus-refer-article-method '(nntp 'localhost')) ;抓取文章的方法, 和 `gnus-select-method' 一样
(setq gnus-secondary-select-methods ;次要选择方法
'(
(nnmaildir 'Gmail' ;nnmaildir后端, 从本地文件中读邮件 (getmail 抓取)
(directory '~/MyEmacs/Mail/')) ;读取目录
))
(setq mail-sources ;邮件源设置
'((maildir :path '~/MyEmacs/Mail/' ;本地邮件存储位置
:subdirs ('cur' 'new' 'tmp')))) ;本地邮件子目录划分
;; 发送邮件
(setq send-mail-function 'sendmail-send-it ;设置邮件发送方法
message-send-mail-function 'sendmail-send-it ;设置消息发送方法
sendmail-program '/usr/bin/msmtp' ;设置发送程序
mail-specify-envelope-from t ;发送邮件时指定信封来源
mail-envelope-from 'header) ;信封来源于 header
(setq gnus-message-archive-group ;设置消息归档的组
'((if (message-news-p)
'nnfolder+archive:nnfolder' ;新闻归档
'nnmaildir+Gmail:inbox'))) ;邮件归档
;; 常规设置
(gnus-agentize) ;开启代理功能, 以支持离线浏览
(setq gnus-inhibit-startup-message t) ;关闭启动时的画面
(setq gnus-novice-user nil) ;关闭新手设置, 不进行确认
(setq gnus-expert-user t) ;不询问用户
(setq gnus-show-threads t) ;显示邮件线索
(setq gnus-interactive-exit nil) ;退出时不进行交互式询问
(setq gnus-use-dribble-file nil) ;不创建恢复文件
(setq gnus-always-read-dribble-file nil) ;不读取恢复文件
(setq gnus-asynchronous t) ;异步操作
(setq gnus-large-newsgroup 100) ;设置大容量的新闻组默认显示的大小
(setq gnus-large-ephemeral-newsgroup nil) ;和上面的变量一样, 只不过对于短暂的新闻组
(setq gnus-summary-ignore-duplicates t) ;忽略具有相同ID的消息
(setq gnus-treat-fill-long-lines t) ;如果有很长的行, 不提示
(setq message-confirm-send t) ;防止误发邮件, 发邮件前需要确认
(setq message-kill-buffer-on-exit t) ;设置发送邮件后删除buffer
(setq message-from-style 'angles) ;`From' 头的显示风格
(setq message-syntax-checks '((sender . disabled))) ;语法检查
(setq nnmail-expiry-wait 7) ;邮件自动删除的期限 (单位: 天)
(setq nnmairix-allowfast-default t) ;加快进入搜索结果的组
;; 窗口布局
(gnus-add-configuration
'(article
(vertical 1.0
(summary .35 point)
(article 1.0))))
;; 显示设置
(setq mm-text-html-renderer 'w3m) ;用W3M显示HTML格式的邮件
(setq mm-inline-large-images t) ;显示内置图片
(auto-image-file-mode) ;自动加载图片
(add-to-list 'mm-attachment-override-types 'image/*') ;附件显示图片
;; 概要显示设置
(setq gnus-summary-gather-subject-limit 'fuzzy) ;聚集题目用模糊算法
(setq gnus-summary-line-format '%4P %U%R%z%O %{%5k%} %{%14&user-date;%} %{%-20,20n%} %{%ua%} %B %(%I%-60,60s%)\n')
(defun gnus-user-format-function-a (header) ;用户的格式函数 `%ua'
(let ((myself (concat '<' my-mail '>'))
(references (mail-header-references header))
(message-id (mail-header-id header)))
(if (or (and (stringp references)
(string-match myself references))
(and (stringp message-id)
(string-match myself message-id)))
'X' '│')))
(setq gnus-user-date-format-alist ;用户的格式列表 `user-date'
'(((gnus-seconds-today) . 'TD %H:%M') ;当天
(604800 . 'W%w %H:%M') ;七天之内
((gnus-seconds-month) . '%d %H:%M') ;当月
((gnus-seconds-year) . '%m-%d %H:%M') ;今年
(t . '%y-%m-%d %H:%M'))) ;其他
;; 线程的可视化外观, `%B'
(setq gnus-summary-same-subject '')
(setq gnus-sum-thread-tree-indent ' ')
(setq gnus-sum-thread-tree-single-indent '◎ ')
(setq gnus-sum-thread-tree-root '● ')
(setq gnus-sum-thread-tree-false-root '☆')
(setq gnus-sum-thread-tree-vertical '│')
(setq gnus-sum-thread-tree-leaf-with-other '├─► ')
(setq gnus-sum-thread-tree-single-leaf '╰─► ')
;; 时间显示
(add-hook 'gnus-article-prepare-hook 'gnus-article-date-local) ;将邮件的发出时间转换为本地时间
(add-hook 'gnus-select-group-hook 'gnus-group-set-timestamp) ;跟踪组的时间轴
(add-hook 'gnus-group-mode-hook 'gnus-topic-mode) ;新闻组分组
;; 设置邮件报头显示的信息
(setq gnus-visible-headers
(mapconcat 'regexp-quote
'('From:' 'Newsgroups:' 'Subject:' 'Date:'
'Organization:' 'To:' 'Cc:' 'Followup-To' 'Gnus-Warnings:'
'X-Sent:' 'X-URL:' 'User-Agent:' 'X-Newsreader:'
'X-Mailer:' 'Reply-To:' 'X-Spam:' 'X-Spam-Status:' 'X-Now-Playing'
'X-Attachments' 'X-Diagnostic')
'\\|'))
;; 用 Supercite 显示多种多样的引文形式
(setq sc-attrib-selection-list nil
sc-auto-fill-region-p nil
sc-blank-lines-after-headers 1
sc-citation-delimiter-regexp '[>]+\\|\\(: \\)+'
sc-cite-blank-lines-p nil
sc-confirm-always-p nil
sc-electric-references-p nil
sc-fixup-whitespace-p t
sc-nested-citation-p nil
sc-preferred-header-style 4
sc-use-only-preference-p nil)
;; 线程设置
(setq
gnus-use-trees t ;联系老的标题
gnus-tree-minimize-window nil ;用最小窗口显示
gnus-fetch-old-headers 'some ;抓取老的标题以联系线程
gnus-generate-tree-function 'gnus-generate-horizontal-tree ;生成水平树
gnus-summary-thread-gathering-function 'gnus-gather-threads-by-subject ;聚集函数根据标题聚集
)
;; 排序
(setq gnus-thread-sort-functions
'(
(not gnus-thread-sort-by-date) ;时间的逆序
(not gnus-thread-sort-by-number))) ;跟踪的数量的逆序
;; 自动跳到第一个没有阅读的组
(add-hook 'gnus-switch-on-after-hook 'gnus-group-first-unread-group) ;gnus切换时
(add-hook 'gnus-summary-exit-hook 'gnus-group-first-unread-group) ;退出Summary时
;; 自动更新新消息
(add-hook 'gnus-summary-exit-hook 'gnus-notify+) ;退出summary模式后
(add-hook 'gnus-group-catchup-group-hook 'gnus-notify+) ;当清理当前组后
(add-hook 'mail-notify-pre-hook 'gnus-notify+) ;更新邮件时
;; 斑纹化
(setq gnus-summary-stripe-regexp ;设置斑纹化匹配的正则表达式
(concat '^[^'
gnus-sum-thread-tree-vertical
']*'))
;; 最后设置
(gnus-compile) ;编译一些选项, 加快速度

(provide 'init-gnus)

;;; init-gnus.el ends here"

2009年6月13日星期六

Configuration of Gmail on Gnus/Emacs (Ubuntu Gutsy)

I tried configuring Gnus/Emacs to send/receive mails through Gmail using IMAP/SMTP protocol on my Ubuntu-Gutsy Linux Box.

Emacs Version: 22.1.1
Gnus Version: 5.11

I performed the following steps:

  • I had to install sendmail and starttls programs using apt-get first and start sendmail service.

  • Enable IMAP support for your Gmail account online as described here :
    http://mail.google.com/support/bin/answer.py?answer=77695


  • Create a file named .gnus.el in your home directory and copy the configuration as given below:


    ;; Configuration of ~/.gnus.el

    ;; Customize the next three lines with your ISP information.
    (load "starttls")
    (load-library "smtpmail")

    (setq user-mail-address "username@gmail.com")
    (setq user-full-name "User Name")

    ;; Configure incoming mail (IMAP)
    (setq gnus-select-method '(nnimap "gmail"
    (nnimap-address "imap.gmail.com")
    (nnimap-server-port 993)
    (nnimap-authinfo-file "~/.imap-authinfo")
    (nnimap-stream ssl)))

    ;; Configure outbound mail (SMTP)
    (setq smtpmail-starttls-credentials '(("smtp.gmail.com" 587 nil nil))
    smtpmail-smtp-server "smtp.gmail.com"
    smtpmail-default-smtp-server "smtp.gmail.com"
    send-mail-function 'smtpmail-send-it
    message-send-mail-function 'smtpmail-send-it
    smtpmail-smtp-service 587
    smtpmail-auth-credentials '(("smtp.gmail.com" 587 "username@gmail.com" nil))
    smtpmail-debug-info t
    smtpmail-debug-verb t
    )
    (setq smtpmail-local-domain nil)
    (setq gnus-permanently-visible-groups "gmail")
    (executable-find starttls-program)

  • Create another file named .imap-authinfo in your home directory with the following line:

    machine imap.gmail.com login username@gmail.com password my_password port 993

  • Now, start Emacs, and type M-x gnus to launch Gnus. Gnus should automatically check for email on Gmail.com. After a while, when gnus process completes it displays a list of subscribed mailboxes. By default, you are subscribed to nndoc+gnus-help:gnus-help mailbox only.

  • To add your Gmail INBOX and other Gmail Labels you need to add them as mailboxes. Type 'U' in the Gnus Group Buffer and type the name of the Gmail Label or type INBOX to subscribe that Label to Gnus. You can also use auto-completion feature here to list all labels.

  • Now, you should see the subscribed Mailboxes in the Groups buffer. You can press 'Enter' on any mailbox to read mails under that label.

  • To send an email, type 'm'. You should get a buffer to send email. Remember here that it will prompt you to enter your password to send emails every time. If you wish to skip this step, change the value of smtpmail-auth-credentials variable in .gnus.el file you just created :

    smtpmail-auth-credentials '(("smtp.gmail.com" 587 "username@gmail.com" "password"))

  • You can change the permissions on the file .gnus.el and .imap-authinfo to restrict the access to your username only.

  • chmod 700 ~/.gnus.el ~/.imap-authinfo
All the above steps must configure Emacs to send and receive email using Gmail successfully. Hope this helps!

2009年6月12日星期五

Gnus 中文FAQ

Gnus 中文FAQ[王春宇 译]

常见问题 (Frequently Asked Questions)

$Id: gnus-faq-cn.txt,v 1.5 2003/11/25 12:32:16 spr Exp $

Copyright (c) 1995, 1996 Free Software Foundation.

Copyright (c) 1995, 2001 Free Software Foundation, Inc.

----------------------------------------------------------------------

目录

译注
摘要
更改
简介
常见问题及解答
术语表


译注

来源:http://my.gnus.org/FAQ/
翻译:王春宇 <dddkk(at)sina(dot)com>
日期:2003-08-23

摘要 (Abstract)

新 Gnus 常见问题列表。用 Web 浏览器,可以看到正式的超文本版本:
http://my.gnus.org/FAQ/,源文件 Docbook 可以从这里得到:
http://sourceforge.net/projects/gnus/

意见和建议请送至FAQ discussion list
(mailto:faq-discuss@my.gnus.org)。 这个列表用qconfirm
(http://smarden.org/qconfirm/index.html)设置了反垃圾邮件的保护。但
作为订阅者,你的消息可以通过该设置。给
faq-discuss-subscribe@my.gnus.org 发送一个空邮件来订阅还可以在这里:
http://mail1.kens.com/cgi-bin/ezmlm-browse?command=monthbythread%26list=faq-discuss
访问存档。

更改

This file is Id: gnus-faq.xml,v 1.24 2003/04/13 22:30:34 fschmitt Exp.

* Updated FAQ to reflect release of Gnus 5.10.

简介(Introduction)

Gnus 常见问题(Frequently Asked Questions)列表。

Gnus 是 Emacs 的一部分,是 Usenet 新闻阅读器,电子邮件客户端。 出
现至今已近十年,而且成为 Emacs 标准部分已经很长时间了。Gnus 5 是最
新的(也是最好的)化身。最初的版本称为 GNUS,由 Masanobu UMEDA 所编
写。94年入秋的时候,Lars Magne Ingebrigtsen 觉着无聊遍决定重写
Gnus。

Gnus 的最大的实力在于异乎寻常的可定制的能力。初看上去似乎很具威胁性,
但实际上可以忽略其中多半复杂的东西,直到你准备利用它。所以,无论接
收的邮件数量适中(在几个邮件列表中),还是去阅读邮件数目很大的列表
甚至难以跟得上,或者所在的新闻组帖子很多,使你却觉着有些累,Gnus都
能满足你的需求。

这份 FAQ 由 Justin Sheehy 维护直至 2002年3月。他曾对在他之前维护这
份列表的 Steve Baur 和 Per Abrahamsen 表示感谢。我们在这儿同样如此:
谢谢,Justin!

正式的超文本版本可以在这里看到:http://my.gnus.org/FAQ/。这一版本要
好于其他的非正式的版本,那些于Utrecht,Oxford,Smart Pages,Ohio
State,或者其他的 FAQ 存档。 如果你需要有关得到其他格式的信息,参看
下面有关资源的问题部分。

这里所包含的内容,来自于 Gnus 开发邮件列表,任何的错误或者印刷错误
请归咎于 my.gnus.org 小组,抱歉!(译注:当然,如果你看的是译文,或
许更多的是译者的错误)


常见问题及解决方法(Frequently Asked Questions with Answers)

1. Gnus 的安装

1.1 最新版本的 Gnus 是什么?
1.2 版本 5.10.0 有什么新特性?
1.3 如何、在哪里得到 Gnus?
1.4 得到了 tar 包,又该如何呢?
1.5 我需要的是哪个 Emacs 版本?
1.6 如何使 Gnus 在 Emacs 和 XEmacs 中都能运行?

2. 启动问题,Gnus 的第一个 Buffer

2.1 每次启动 Gnus 时,总有一个消息"Gnus auto-save file exists. Do
youwant to read it?",什么意思?如何去掉?
2.2 Gnus 没有记住我所订阅的组,怎么回事?
2.3 如何改变 Group buffer 中的行的格式?
2.4 我的 group buffer 变得有些拥挤,如何分类?
2.5 如何在 Group buffer 中用手来排序?如何排序某个主题下的组啊?

3. 用 Gnus 读取邮件和新闻

3.1 刚刚装好 Gnus,并且通过 `M-x gnus' 开启了它,却出现了"nntp
(news) open error",如何处理?
3.2 我在Windows环境中,~/.gnus是什么意思。
3.3 我的新闻服务器需要验证,如何保存用户名和密码?
3.4 Gnus 好像已经运行起来了,但是我不知道如何订阅一个组。
3.5 Gnus 不能显示所有组/Gnus说我不允许在这个组上发帖子,为什么?
3.6 我想让 Gnus 在多个的服务器上取新闻,可能吗?
3.7 本地缓冲中的文件呢?
3.8 OK,能读新闻,可是我也想用 Gnus 读邮件,怎么做到?
3.9 IMAP 怎么处理?
3.10 我们的办公室中,使用的是一个 MS Exchange Server,我能用 Gnus 读
取上面的邮件吗?
3.11 通过 POP3 取信时,能不让 Gnus 删除服务器上面的邮件吗?

4. 有效地阅读消息

4.1 当我进入一个组,所有的已读消息都没有了,我如何再看到它们?
4.2 如何在每次我进入一个组的时候,让 Gnus 总是显示某个重要的消息,即
使即使是已读的。
4.3 如何看消息的头信息?
4.4 如何查看没有格式的原始信息?
4.5 如何改变 Gnus 在 Article buffer 顶部显示的头信息?
4.6 不想让 Gnus 显示 HTML 邮件,但是如果有,则显示文本部分。如何做到?
4.7 除 w3 之外可以用其他的的浏览器显示 HTML 邮件吗?
4.8 格式糟糕的邮件有办法更易读吗?
4.9 是否有办法自动的忽略由某个人发的文章或者含有某个词的文章呢?以及
我怎样突出我所感兴趣的文章?
4.10 如何在一些组(比如邮件组)里面取消主题显示,或者如何为指定的组
设定变量?
4.11 我能把自己写的文章和所跟的文章高亮显示吗?
4.12 在一个 Group buffer 中的显示的消息是按照序号由小到大的顺序排列
的,特别是在邮件组里面,这是不是一个bug?
4.13 不喜欢 Summary buffer 和 Article buffer 的版面,如何改变?或者
三个窗口的显示?
4.14 不喜欢 Summary buffer 的样子,如何调整?
4.15 如何把邮件分为几个组?

5. 写邮件或 Usenet 帖子

5.1 需要掌握的发送邮件和贴帖子的基本命令都有哪些?
5.2 写消息时如何打开自动折行 (word-wrap) ?
5.3 如何设定这些东西:From, Organization, Reply-to, signature...?
5.4 可以根据组名来设定不同的 Form, Signature 等等吗?
5.5 有没有拼写检查器?甚至自由(on-the-fly)拼写检查?
5.6 可以设置所投递的组相应的字典吗?
5.7 有没有类似于地址簿的东西,我就不必记忆太多地址了?
5.8 有时候在 Article buffer 顶部有个小小的图片,是什么?我发的帖子如
何加上?
5.9 在新闻组中,有时候想按 f 却按了 r。当我在新闻组中的时候通过邮件
回复的时候,Gnus 能否警告一下?。
5.10 如何让 Gnus 不要产生 sender header?
5.11 如何在本地保存我发送的邮件和帖子的复本?
5.12 有人告诉我说,我的 Message-ID 不正确,为什么,如何修改?

6. 引入, 存档, 搜索, 删除消息

6.1 如何把我的旧邮件引入 Gnus?
6.2 如何存档有趣的消息?
6.3 如何搜索特定的消息?
6.4 如何删除不想要的邮件?
6.5 我想所有已读消息都是过期的(至少一些组里这样),如何做?
6.6 我不想删除已过期的邮件,只想转移到另一个组。

7. 离线阅读邮件和新闻

7.1 我这里不是始终在线的,如何使得我的连接时间最小?
7.2 那么,Gnus Agent 如何呢?
7.3 如果也想把消息保存在本地呢?
7.4 离线时如何不让 Gnus 发送邮件/帖子?

8. 如果这个 FAQ 不足以解决问题

8.1 如何在 Emacs 中找到信息和帮助?
8.2 如何在 Gnus 手册中找到某某内容(例如,附件,PGP,MIME……),没
有文档?
8.3 应该知道哪些网站?
8.4 有那些邮件列表和新闻组呢?
8.5 向什么地方报告bug?
8.6 需要一个实时的帮助,如何得到啊?

9. 如何使 Gnus 速度快些

9.1 开始 Gnus,真的很慢,如何快些?
9.2 如何加快进入某个组的速度?
9.3 发送邮件变得越来越慢,怎么了?



1. Gnus 的安装

1.1 最新版本的 Gnus 是什么?

Gnus 5.10.0 已经发布了,尽管在版本号上面的变化相当的小,
Gnus 5.10 却有很多很多不容错过的新特性,当然,如果你谨慎得很,或许
宁愿使用 5.8.8 或 5.9(二者基本一样),直到 bugfix 版出来。

1.2 版本 5.10.0 有什么新特性?

当然,先去看看 Gnus 的 tarball 里面的 GNUS-NEWS 文件吧,主要的改变
都列在里面了。这里是一个我认为重要/有趣的简短列表。

* Gnus agent的重写,Gnus agent现在缺省为启动。

* 很多处理格式混乱的邮件的方法。

* 垃圾邮件处理特性。

* 包含了message-utils。

* Summary line的新的格式指定符号,比如 %B 为复杂的trn-style线索树。

1.3 如何、在哪里得到 Gnus?

最新的发行版尚未包含在 Emacs 21 中,到目前为止也不能通过 XEmacs
21.4 的 package system 中得到,因此你需要从
`http://www.gnus.org/dist/gnus.tar.gz' 或匿名ftp
`ftp://ftp.gnus.org/pub/gnus/gnus.tar.gz' 得到。

1.4 得到了 tar 包,又该如何呢?

通过 `tar vzf gnus.tar.gz' 解开然后如通常一样 `./configure; make;
make install'。(在MS-Windows中,可以先从http://www.cygwin.com 得到
Cygwin环境,用tar 解开;或者使用其他的打包程序)如果你不想或者不能
在系统里面安装 Gnus,你还可以把它装在你的home目录里面,并且在你的~
/.xemacs/init.el或者~/.emacs文件里面加入如下的行:

(add-to-list 'load-path "/path/to/gnus/lisp")
(if (featurep 'xemacs)
(add-to-list 'Info-directory-list "/path/to/gnus/texi/")
(add-to-list 'Info-default-directory-list "/path/to/gnus/texi/"))

并确定在这几行之前没有任何和 Gnus 有关的东西,在 MS Windows 上面使
用如 "C:/path/to/lisp" 的路径(没错,是 "/")。

1.5 我需要的是哪个 Emacs 版本?

Gnus 5.10.0 需要的 Emacs 版本要大于或等于 Emacs 20.3 或者 XEmacs
20.1。

1.6 如何使 Gnus 在 Emacs 和 XEmacs 中都能运行?

你不能在两者之间共享一个 Gnus 的拷贝,因为两者的 Lisp 文件的字节码
并不兼容。因此请给 Emacs 和 XEmacs 分别做一个拷贝。



2 启动问题,Group Buffer

2.1 每次启动 Gnus 时,总有一个消息"Gnus auto-save file exists. Do
youwant to read it?",什么意思?如何去掉?

这个提示意味着,上次使用 Gnus 的时候没有恰当的退出,因此没能把一些
信息写入磁盘(例如,哪些消息已读),询问你是否从自动存盘文件中恢复
这些信息。

为防止出现这个提示,每次退出 Gnus 的时候在 Group Buffer 中用`q' 退
出,不要直接 killing Emacs。

2.2 Gnus 没有记住我所订阅的组,怎么回事?

启动 Gnus 的时候有一个上一问题的提示,对吧?基本是同一个问题,看看
上一问的回答吧。

2.3 如何改变 Group buffer 中的行的格式?

你需要调整变量 gnus-group-line-format 的值。参考手册 "Group Line
Specification"节点中相关信息。例如(某个人的 .gnus 文件中:-)):

(setq gnus-group-line-format "%P%M%S[%5t]%5y : %(%g%)\n")

2.4 我的 group buffer 变得有些拥挤,如何分类?

Gnus 提供了主题模式 (topic mode),允许你把组分类。例如所有关于
Linux 的组都放入 Linux 主题下,关于音乐的放入音乐的主题下,关于
scottish 音乐的放入音乐主题下的 scottish 音乐子题目下。

进入主题模式,在 Group buffer 中按 t。这时可以用 `T n' 在point 位置
创建一个主题,`T m' 移动一个组到某个主题下。其他命令参考手册或者菜
单。 可能你的 gnus-group-line-format 变量需要在开始处放一个%P 标记
符来缩进。

2.5 如何在 Group buffer 中用手来排序?如何排序某个主题下的组啊?

把 point 移动到某个组上,按 `C-k',再移动到想放这个组的地方按`C-y'。



3 用 Gnus 读取邮件和新闻

3.1 刚刚装好 Gnus,并且通过 `M-x gnus' 开启了它,却出现了"nntp (news) open error",如何处理?

你还没有告诉 Gnus 到哪里去取新闻。参考文档中相应内容。首先需要在~
/.gnus 文件中放入如下的行:

(setq gnus-select-method '(nntp "news.yourprovider.net"))
(setq user-mail-address "you@yourprovider.net")
(setq user-full-name "Your Name")

3.2 我在Windows环境中,~/.gnus是什么意思。

~/ 意思是 home 目录,Gnus 和 Emacs 在这里寻找配置文件。其实不用知道
这些,Emacs 知道如何去做,按 `C-x C-f ~/.gnus RET'(没错,即使在
Windows 上,也可以使用斜线字符),并且 Emacs 会为你打开正确的文件。
(很有可能是个新文件,所以是空的。)可是,我并不推荐你这么做,因为
Emacs 所选择的目录很有可能不是你想要的,因此你可以这样:首先,创建
一个合适的目录(目录名中不要有空格),如 C:\myhome;然后设定一个环
境变量HOME 到这个目录。在 Win9x 或 Me 系统中,在你的 autoexe.bat 文
件中放入如下行后重新启动:

SET HOME=C:\myhome

在 NT、2000 和 XP 系统中,按 Winkey+Pause/Break 进入系统选项(不好
使就在控制面板中找到系统)。这里可以找到设定环境变量,新建一个名字
为 HOME 值为 C:\myhome 的变量,不需要重新启动。

现在在 Emacs 中创建~/.gnus,就是 `C-x C-f ~/.gnus RET C-x C-s'。

3.3 我的新闻服务器需要验证,如何保存用户名和密码?

创建一个文件 ~/.authinfo, 文件中每一个服务器对应如下的行:

machine news.yourprovider.net login YourUserName password YourPassword

如果你的操作系统允许,请确保这个文件对于别的用户来说是不可读的(比
如Unix 中,执行 shell 命令:

chmod 600 ~/.authinfo

3.4 Gnus 好像已经运行起来了,但是我不知道如何订阅一个组。

如果你知道那个组的名字,在 Group buffer 区中输入 `U name.of.group
RET'。否则按字符 ^,转到 Server buffer。把光标移动到有你想要的组的
服务器上,回车,再移动光标到你想订阅的组的名字上,按`u',就订阅了该
组。

3.5 Gnus 不能显示所有组/Gnus说我不允许在这个组上发帖子,为什么?

一些服务提供商限制匿名访问的用户,要在验证之后才可以有完全的访问权
限。为了使 Gnus 总是发送验证信息到这些服务器,在 ~/.authinfo 文件中
这个服务器上那行的行尾加入:

force yes

3.6 我想让 Gnus 在多个的服务器上取新闻,可能吗?

当然。你可以在变量 gnus-secondary-select-methods 中指定多个源。在~
/.gnus 文件中加入类似的行:

(add-to-list 'gnus-secondary-select-methods '(nntp "news.yourSecondProvider.net"))
(add-to-list 'gnus-secondary-select-methods '(nntp "news.yourThirdProvider.net"))

3.7 本地缓冲中的文件呢?

没问题,这只多了一个称为 nnspool 的选择方法(select method),比如:

(add-to-list 'gnus-secondary-select-methods '(nnspool ""))

或者,如果你不想让 NNTP 服务器作为一个主要的新闻源,像这样:

(setq gnus-select-method '(nnspool ""))

Gnus 将在 /usr/spool/news 中寻找缓冲文件,如果不想这样,把这行改为:

(add-to-list 'gnus-secondary-select-methods
'(nnspool "" (nnspool-directory "/usr/local/myspoolddir")))

这样只设定了本地的缓冲目录。或许你需要设定更多的东西,比如发帖子的
程序等等,请参考 Gnus 手册。

3.8 OK,能读新闻,可是我也想用 Gnus 读邮件,怎么做到?

这个有一点困难,因为对于邮件来说,会有许多可能的邮件来源,很多保存
邮件的方法以及不同的发送邮件的方法。最通常的情况是:1、你从一个
pop3 服务器读取邮件而且通过一个 SMTP 邮件服务器发送;2、一些程序比
如Fetchmail 将你的邮件取回,保存在本地磁盘上,Gnus 再从那里读取。
即将发出的邮件是由Sendmail、Postfix 或者其他的 MTA 程序发送的。又使,
你可能需要结合上面的这些情况。

然而,首先需要告诉 Gnus 用哪种方式保存邮件,用 Gnus 的术语来说,就
是"使用哪种后端(Back End)"。Gnus 支持多种后端,最普遍的是 nnml。
它把每一个邮件保存在一个文件中,从而速度很快。如果你的文件系统处理
多个小文件有问题,你更喜欢每个组使用一个文件,那么后端 nnfolder 或
许是你的更好的选择。在 ~/.gnus 中加入如下的行,使用 nnml:

(add-to-list 'gnus-secondary-select-methods '(nnml ""))

使用 nnfolder:

(add-to-list 'gnus-secondary-select-methods '(nnfolder ""))

现在告诉 Gnus 到哪里取邮件。如果是 POP3 服务器:

(eval-after-load "mail-source"
'(add-to-list 'mail-sources '(pop :server "pop.YourProvider.net"
:user "yourUserName"
:password "yourPassword")))

不要让其他用户读到你的密码文件。如果想读取本地机器上的传统邮件:

(eval-after-load "mail-source"
'(add-to-list 'mail-sources '(file :path "/path/to/spool/file")))

如果是一个 Maildir, 像 Postfix Qmail 或者 Fetchmail 等使用的一个文
件一条消息的目录中,这样:

(eval-after-load "mail-source"
'(add-to-list 'mail-sources '(maildir :path "/path/to/Maildir/"
:subdirs ("cur" "new"))))

最后,如果你想从一个目录中读取几个文件,例如由于 Procmail 已经把你
的邮件分割了:

(eval-after-load "mail-source"
'(add-to-list 'mail-sources
'(directory :path "/path/to/procmail-dir/"
:suffix ".prcml")))

这里的 :suffix ".prcml" 告诉 Gnus 仅仅使用带有前缀 .prcml 的文件。

现在你只需要告诉 Gnus 如何发送邮件了。如果你想通过 Sendmail (或者
你的系统中任何的和 Sendmail 同样作用的 MTA 程序),你不需要做任何事。
但是,如果使用一个 SMTP 服务器,需要在 ~/.gnus 加入下面的行:

(setq send-mail-function 'smtpmail-send-it)
(setq message-send-mail-function 'smtpmail-send-it)
(setq smtpmail-default-smtp-server "smtp.yourProvider.net")

3.9 IMAP 怎么处理?

用 Gnus 有两种方法使用 IMAP。一个是如同 POP3 一样来使用 IMAP,就是
说Gnus 从 IMAP 服务器取邮件,保存在磁盘上,如果你想这样(不是真想这
样吧)在 ~/.gnus 中加入:

(add-to-list 'mail-sources '(imap :server "mail.mycorp.com"
:user "username"
:pass "password"
:stream network
:authentication login
:mailbox "INBOX"
:fetchflag "\\Seen"))

或许你不得不改变 stream 和(或)验证的变量的值,其他可能值,请参考
Gnus 手册中,节点 "Mail Source Specifiers"。

如果想使用 IMAP 本身的方式,就得用不同的方法。需要在选择方法中放入
nnimap 后端,并且同时给出服务器的信息。

(add-to-list 'gnus-secondary-select-methods
'(nnimap "Give the baby a name"
(nnimap-address "imap.yourProvider.net")
(nnimap-port 143)
(nnimap-list-pattern "archive.*")))

而且,验证的时候如果 Gnus 没能猜测出正确的方法,你不得不指定清楚,
其中细节请参考手册中 "IMAP" 节点。

3.10 我们的办公室中,使用的是一个 MS Exchange Server,我能用 Gnus 读取
上面的邮件吗?

你可以贿赂你的管理员一双新运动鞋,让他在服务器上开通 IMAP 服务,然
后看上一个问题。

3.11 通过 POP3 取信时,能让 Gnus 不删除服务器上面的邮件吗?

首先,这不是 POP3 服务推荐的使用方式,如果有可能,使用 IMAP 协议以
使你的信息保持在服务器上。你可能正处在需要这个特性的境地,可惜,不
幸的是Gnus 本身没有这个功能。

然而,Gnus 的天地里有其他的可以保存你的消息的方法。最简单的方法是用
一个外部程序来取回你的邮件并存储在本地磁盘上,这样 Gnus 可以从那里
读取。 Unix 系统上,你可以使用,比如 Fetchmail 来达到这个目的,在
MS Windows 系统上,你可以使用 Hamster,一个很好的本地新闻邮件服务器。

其他的解决方法,用一个能够把邮件保持在服务器上的方法替换 Gnus 从
POP3 上面读取邮件的方法。如果你使用的是 XEmacs,可以取得 mail-lib
包,其中包含一个增强的 pop3.el 文件,文件中有如何让 Gnus 使用,并且
不删除已经取得的邮件的方法。GNU Emacs,可以参考 epop3.el 文件,可以
达到同样的目的。也可以让 Gnus 使用外部程序(如 Fetchmail)取邮件,
参看 info 节点Mail Source Specifiers"。

4 阅读消息

4.1 当我进入一个组,所有的已读消息都没有了,我如何再看到它们?

当你通过 `RET' 进入一个 Summary buffer 时,只有未读邮件和标记的邮件
被加载。用 `C-u RET' 来取得所有可用邮件。如果只想读最新的300 个,用
`C-u 300 RET'。

如果开启了主题视图,只看未读邮件是令人讨厌的,在 ~/.gnus 里面加如这
行:

(setq gnus-fetch-old-headers 'some)

可以保留同主体中已读邮件,把 'some 改为t可以下载所有文章(注意:当
你进入某个组的时候,这两个设置,都会增大从服务器读取的数据量,从而
使得这个过程变慢)。

如果你用的是 Gnus 5.10.0,可以在 Summary buffer 中通过 `/o N' 来取
得后 N 个消息,版本 5.8.8 的 Gnus 里面没有这个功能。

不想要所有的就消息,只想要正读的这篇的上一篇,可以用 `^' 来取得;如
果想找回当前主题的全部消息,`A T'。

4.2 如何在每次我进入一个组的时候,让 Gnus 总是显示某个重要的消息,即使
即使是已读的。

重要信息做上 tick 标记。 Summary buffer 中按 `u' 做 tick 标记。 按
`d' 去掉标记(去掉标记,并且设为已读),或者按 `M c' (去掉任何标
记)。

4.3 如何看消息的头信息?

按 `t' 显示所有头信息,再按一下 `t' 隐藏头信息。

4.4 如何查看没有格式的原始信息?

用 `C-u g' 显示未经处理的原始信息,`g' 回到正常状态。

4.5 如何改变 Gnus 在 Article buffer 顶部显示的头信息?

变量 gnus-visible-headers 控制显示哪些头信息,变量值是个正则表达式,
匹配的头信息被显示。因此,如果你想要 author,subject,date,以及如
果存在的 Followup-To 和 MUA / NUA,在 ~/.gnus 中加入:

(setq gnus-visible-headers
"^\\(From:\\|Subject:\\|Date:\\|Followup-To:\\|X-Newsreader:\\|User-Agent:\\|X-Mailer:\\)")

4.6 不想让 Gnus 显示 HTML 邮件,但是如果有,则显示文本部分。如何做到?

在 ~/.gnus 中,这样写:

(eval-after-load "mm-decode"
'(progn
(add-to-list 'mm-discouraged-alternatives "text/html")
(add-to-list 'mm-discouraged-alternatives "text/richtext")))

即使没有文本部分,也不想显示转换的部分,加入这行

(setq mm-automatic-display (remove "text/html" mm-automatic-display))

4.7 除 w3 之外可以用其他的的浏览器显示 HTML 邮件吗?

除非使用 Gnus 5.10.0。这样可以在 w3, w3m, links, lynx 和 html2text
几者之间选择。通过变量 mm-text-html-renderer 指定:

(setq mm-text-html-renderer 'links)

4.8 格式糟糕的邮件有办法更易读吗?

Gnus 提供了几个函数来"清洗(Wash)"收到的邮件,可以通过菜单找到他们,
Article->Washing。最有趣的几个可能是"折长行(Wrap long lines)"(`W
w'),"ROT13解码(Decode ROT13)"(`W r')和"Outlook Deuglify"(`W
k') 这个修复被 Microsoft 产品的很多使用者使用的哑引用,不幸的是这个
只存在于 Gnus 5.10.0 中。

4.9 是否有办法自动的忽略由某个人发的文章或者含有某个词的文章呢?以及我
怎样设置组参数?

你想要的可能是得分(Scoring)。得分的意思是,定义一些规则,给每一个消
息赋一个整数值。根据这个值,在 Summary buffer 中来突出显示(如果分
数高,比如+2000)或者自动标记为已读(如果分数低,比如-800),或者用
其他的方法处理。

给消息赋分值,有三种基本的方法。一个最简单的方法是,基于当前正读的
文章设定一个规则。假设你正在读一个总是写些无用的内容的人的消息,以
后想忽略他的消息。按 `L',设定一条规则,降低得分。Gnus 会问你降低到
什么标准。 按两次 `?',看看所有的可能,我们所要的是作者那个(From
头)。 Gnus 需要知道想要哪种匹配方式。精确匹配按 `e',字串匹配按
`s',删除出名字以外的所有内容。然后设定这个规则使用多长时间,例如按
`p',会一直有效。如果想提高帖子的分数,类似的,按 `I'。

也可以手动设定规则。在 Summary buffer 中按 `V f',会提示输入得分文
件名,仅对一个组有效的为 name.of.group.SCORE,对所有组有效的文件名
为all.SCORE。精确的语法规则参照 Gnus 手册,基本上是一个大的列表
(list),其中元素也是列表,这些列表中的第一个元素是给分的邮件头,之
后的一个或多个列表给出匹配内容和赋予的分数以及时间。例如,如果你对
我很感兴趣,可以在你的 all.Score 文件中加入下面这些行:

(("references" ("hschmi22.userfqdn.rz-online.de" 500 nil s))
("message-id" ("hschmi22.userfqdn.rz-online.de" 999 nil s)))

这个会在我写的消息上加上 999 分,在回应我的消息上加 500 分。当然有
一个健全的大脑的任何人,都不会这么做的,:-)

第三种方法是适应性的给分。意思是 Gnus 观察着你并试图发现你所感兴趣
和讨厌的事情,然后设定规则以反映。当你所读的组的流量很高,适应性给
分可能给你很大帮助。如果想使用这种给分方式:

(setq gnus-use-adaptive-scoring t)

4.10 如何在一些组(比如邮件组)里面取消主题显示,或者如何为指定的组设定
变量?

在 Group buffer 中,移动光标到一个组,按 `G c',开启一个Buffer ,设
置那个组的变量。Buffer 底部,可以找到所有为那个组设定的本地变量。
取消主题显示,到 gnus-show-threads 的变量里面,值设为 nil,结束后按
Buffer 底部的done 按纽。

4.11 我能把自己写的文章和所跟的文章高亮显示吗?

不要在问"我能……"的问题了,在 Gnus 的国度里,回答往往都是 yes,
三步:首先,指定如何显示(摘要行看起来什么样子)那些文章。之后给一
些特别的分数,最后告诉 Gnus 使用新的显示方式。可以在
[http://my.gnus.org/Members/dzimmerm/HowTo%2C2002-07-25%2C1027619165012198456/view]
找到具体细节。

4.12 在一个 Group buffer 中的显示的消息是按照序号由小到大的顺序排列的,
特别是在邮件组里面,这是不是一个bug?

不是。这是 Gnus 的设计,如果修改意味着重新实现 Gnus 的后端的主要部
分。Gnus 认为"highest-article-number - lowest-article-number =
total-number-of-articles"。对于新闻组来说这样没什么问题,但是如果
在邮件组里删除和移动了邮件,就不再成立了。为了避免这种情况,使用
`C-u RET' 进入新闻组(这样 Gnus 会取得所有消息),之后敲 `M P b' 来
标记所有消息,再用`B m name.of.group' 把所有消息移动到原来的组里面,
这样所有消息得到了新的序号,计数正确(直到再次的删除或移动到其他
组)。

4.13 不喜欢 Summary buffer 和 Article buffer 的版面,如何改变?或者三个
窗口的显示?

可以通过调用函数 gnus-add-configuration 来控制窗口的配置。语法有点
复杂,不过在手册 "Windows Layout" 中解释得很清楚,一些比较流行的例
子:

用 35% 的 Summary 比 65% 的 Article 替换原来的 25% 比 75%(其中的
1.0 意思是"占满剩余空间"):

(gnus-add-configuration '(article (vertical 1.0 (summary .35 point) (article 1.0))))

三个窗口显示。左边是 Group buffer,右上是 Summary buffer,右下是
Article buffer:

(gnus-add-configuration
'(article
(horizontal 1.0
(vertical 25
(group 1.0))
(vertical 1.0
(summary 0.25 point)
(article 1.0)))))
(gnus-add-configuration
'(summary
(horizontal 1.0
(vertical 25
(group 1.0))
(vertical 1.0
(summary 1.0 point)))))

4.14 不喜欢 Summary buffer 的样子,如何调整?

那么你需要和变量 gnus-summary-line-format 玩一玩,它得值是一个符号
串,比如作者,日期,主题等。手册 "Summary Buffer Lines" 中有可用的
符号列表和常被忘记的节点 "Formatting Variables" 和它的子节点。其中
有很多有用的东西,像指定光标和制表符的位置等。

从 5.10.0 起,Gnus 新提供了一些很不错的标志符,例如,%B 可以形成一
个线索树,%&user-date 根据帖子给出时间细节。例子如下:

(setq gnus-summary-line-format ":%U%R %B %s %-60=|%4L |%-20,20f |%&user-date; \n")

得到:

:O Re: [Richard Stallman] rfc2047.el | 13 |Lars Magne Ingebrigt |Sat 23:06
:O Re: Revival of the ding-patches list | 13 |Lars Magne Ingebrigt |Sat 23:12
:R > Re: Find correct list of articles for a gro| 25 |Lars Magne Ingebrigt |Sat 23:16
:O \-> ... | 21 |Kai Grossjohann | 0:01
:R > Re: Cry for help: deuglify.el - moving stuf| 28 |Lars Magne Ingebrigt |Sat 23:34
:O \-> ... | 115 |Raymond Scholz | 1:24
:O \-> ... | 19 |Lars Magne Ingebrigt |15:33
:O Slow mailing list | 13 |Lars Magne Ingebrigt |Sat 23:49
:O Re: `@' mark not documented | 13 |Lars Magne Ingebrigt |Sat 23:50
:R > Re: Gnus still doesn't count messages prope| 23 |Lars Magne Ingebrigt |Sat 23:57
:O \-> ... | 18 |Kai Grossjohann | 0:35
:O \-> ... | 13 |Lars Magne Ingebrigt | 0:56

4.15 如何把邮件分为几个组?

Gnus 提供了两种分类邮件方法,简单的 nnmail-split-methods 和功能强大
的Fancy Mail Splitting。这里只介绍前者,后者请参考手册中"Fancy
Mail Splitting"一节。

nnmail-split-methods 的值是一个列表,其中每个元素是表示分割的规则。
每个规则的形如 "匹配的邮件的去处", "正则表达式",逐次匹配。最后一条
规则一定总是通用规则(正则表达式 .*),指明如果规则都没有匹配,邮件
应该到哪里。 如果邮件到来是相应目录不存在,会立即创建。几个规则同
时匹配,缺省是放入所有匹配的组里面。如果不想这样:

(setq nnmail-crosspost nil)

放入 ~/.gnus。

举个例子胜过千言,这里是我的 nnmail-split-methods。注意我把复本放入
特殊的组中的,缺省的组是垃圾组(spam),因为此前我滤出一些订阅的列表
或直接发送给我的所有邮件。这些规则去除了大约 80% 垃圾邮件(例子中的
地址已经做了改动,为防止被垃圾邮件爱好者看到):

(setq nnmail-split-methods
'(("duplicates" "^Gnus-Warning:.*duplicate")
("XEmacs-NT" "^\\(To:\\|CC:\\).*localpart@xemacs.bla.*")
("Gnus-Tut" "^\\(To:\\|CC:\\).*localpart@socha.bla.*")
("tcsh" "^\\(To:\\|CC:\\).*localpart@mx.gw.bla.*")
("BAfH" "^\\(To:\\|CC:\\).*localpart@.*uni-muenchen.bla.*")
("Hamster-src" "^\\(CC:\\|To:\\).*hamster-sourcen@yahoogroups.\\(de\\|com\\).*")
("Tagesschau" "^From: tagesschau <localpart@www.tagesschau.bla>$")
("Replies" "^\\(CC:\\|To:\\).*localpart@Frank-Schmitt.bla.*")
("EK" "^From:.*\\(localpart@privateprovider.bla\\|localpart@workplace.bla\\).*")
("Spam" "^Content-Type:.*\\(ks_c_5601-1987\\|EUC-KR\\|big5\\|iso-2022-jp\\).*")
("Spam" "^Subject:.*\\(This really work\\|XINGA\\|ADV:\\|XXX\\|adult\\|sex\\).*")
("Spam" "^Subject:.*\\(\=\?ks_c_5601-1987\?\\|\=\?euc-kr\?\\|\=\?big5\?\\).*")
("Spam" "^X-Mailer:\\(.*BulkMailer.*\\|.*MIME::Lite.*\\|\\)")
("Spam" "^X-Mailer:\\(.*CyberCreek Avalanche\\|.*http\:\/\/GetResponse\.com\\)")
("Spam" "^From:.*\\(verizon\.net\\|prontomail\.com\\|money\\|ConsumerDirect\\).*")
("Spam" "^Delivered-To: GMX delivery to spamtrap@gmx.bla$")
("Spam" "^Received: from link2buy.com")
("Spam" "^CC: .*azzrael@t-online.bla")
("Spam" "^X-Mailer-Version: 1.50 BETA")
("Uni" "^\\(CC:\\|To:\\).*localpart@uni-koblenz.bla.*")
("Inbox" "^\\(CC:\\|To:\\).*\\(my\ name\\|address@one.bla\\|adress@two.bla\\)")
("Spam" "")))

5 写消息

5.1 需要掌握的发送邮件和贴帖子的基本命令都有哪些?

在 Group buffer 或者 Summery buffer 中按 `m' 可以开启一个新的邮件;
按 `a' 开启新帖子,Group buffer 中按 `a' 需要填写组名,Summery
buffer 中则不用。回复邮件时,用 `r' 没有引文回复,用`R' 则引用原文。
跟贴(相应于 `r' 和 `R')为 `f' 和`F'。

写有 "--text follows this line --" 行之上写入头信息,其下写内容。
写完之后按 `C-c C-c' 来发送消息,想过一会儿再写完,按 `C-c C-d' 保
存到草稿组,之后可以到那里用 `D e' 继续编辑。

5.2 写消息时如何打开自动折行 (word-wrap) ?

~/.gnus 中这样写:

(add-hook 'message-mode-hook
(lambda ()
(setq fill-column 72)
(turn-on-auto-fill)))

也可以和通常一样使用 `M-q'。

5.3 如何设定这些东西:From, Organization, Reply-to, signature...?

除了下面这个需要用 posting styles 的方法外,也有其他方法。这个例子
可以做个语法参考:

(setq gnus-posting-styles
'((".*"
(name "Frank Schmitt")
(address "me@there.bla")
(organization "Hamme net, kren mer och nimmi")
(signature-file "~/.signature")
("X-SampleHeader" "foobar")
(eval (setq some-variable "Foo bar")))))

其中的 ".*" 意思是这些设定为缺省值,其后列表中的第一个元素的有效值
有signature,signature-file,organization,address,name 或者body。
属性名也可以是字符串,这时,被作为邮件头的名,其值被写入贴子的头中;
如果值为nil,该头被去掉。也可以是 (eval (foo bar)) 形式,此时,将以
参数 bar 调用函数 foo 并且抛弃其结果。

5.4 可以根据组名来设定不同的 Form, Signature 等等吗?

正是 posting styles 的能力所在。前面,我们用 ".*" 设定了对所有组的
缺省值。你可以通过如 "^gmane" 的正则表达式来和其后的设置来设定投到
gmane 层下的帖子,用 ".*binaries" 设定投到包含有 binaries 的组的帖
子。

也可以用一个将被求值的函数代替正则表达式,仅当返回真时,相应设置有
效。两个有用的候选函数是 message-news-p 和 message-mail-p,分别在发
帖子和邮件时为真。

注意所有匹配的项都会被应用,就是说,下面这个例子中,如果我发了一个
到gmane.mail.spam.spamassassin.generate 的帖子,".*"中的设置、
"^gmane" 中的以及 message-mail-p 和 "^gmane\\.mail\\...."中的设置都
被应用。正因为如此,把一般性的规则放在上面,特别的放在下面。

(setq gnus-posting-styles
'((".*" ;;default
(name "Frank Schmitt")
(organization "Hamme net, kren mer och nimmi")
(signature-file "~/.signature") )
((message-news-p) ;;Usenet news?
(address "mySpamTrap@Frank-Schmitt.bla")
("Reply-To" "hereRealRepliesOnlyPlease@Frank-Schmitt.bla"))
((message-mail-p) ;;mail?
(address "usedForMails@Frank-Schmitt.bla") )
("^gmane" ;;this is mail, too in fact
(address "usedForMails@Frank-Schmitt.net")
("Reply-To" nil) )
("^gmane.mail.spam.spamassassin.general$"
(eval (setq mail-envelope-from "Azzrael@rz-online.de"))
(address "Azzrael@rz-online.de")) ))

5.5 有没有拼写检查器?甚至 on-the-fly 拼写检查?

你可以使用 Emacs 中的 ispell.el 来进行拼写检查。首先确定你已经安装
了二者之一:ispell
(http://fmg-www.cs.ucla.edu/fmg-members/geoff/ispell.html) 或这
aspell (http://aspell.sourceforge.net/) 。其次需要ispell.el
(http://www.kdstevens.com/~stevens/ispell-page.html) 来进行
on-the-fly 拼写检查。 flyspell.el
(http://www-sop.inria.fr/mimosa/personnel/Manuel.Serrano/flyspell/flyspell.html).
Ispell.el 是 Gnus Emacs 的一部分,而且可以从 Emacs 的 package
system 中得到, flyspell.el 也是 Emacs 的一部分,而且是 XEmacs
text-modes package 中的一部分,可以从 package system 中得到。因此,
不需要你自己来手工安装。

Ispell.el 假设你使用 ispell,如果你用的是 aspell,在你的 Emacs 配置
(~/.emacs) 文件中这样写:

(setq ispell-program-name "aspell")

如果你想检查你发出的消息,在你的 ~/.gnus 中这么写:

(add-hook 'message-send-hook 'ispell-message)

如果你喜欢 on-the-fly 拼写检查:

(add-hook 'message-mode-hook (lambda () (flyspell-mode 1)))

5.6 可以设置所投递的组相应的字典吗?

是的,~/.gnus 中差不多这样:

(add-hook 'gnus-select-group-hook
(lambda ()
(cond
((string-match
"^de\\." (gnus-group-real-name gnus-newsgroup-name))
(ispell-change-dictionary "deutsch8"))
(t
(ispell-change-dictionary "english")))))

当然,把 "^de\\." 和 "deutsch8" 改成你想要的。

5.7 有没有类似于地址簿的东西,我就不必记忆太多地址了?

最基本的解决方法,是 mail aliases。把你的地址用如下格式保存到~
/.mailrc 文件:

alias al "Al <al@english-heritage.bla>"

在 message buffer 中 在 To: 或 Cc: 之后按你(所设置)的别名,接着空
格或标点,gnus 则会给你自动插入完全的地址。细节请参考 Message (不
是Gnus )手册,"Mail Alliases"一节。

可是,你真正想要的可能是 Insidious Big Brother Database bbdb. 可以
从XEmacs 的 package system 或bbdb's homepage
(http://bbdb.sourceforge.net/) 得到。之后在~/.gnus 为 Gnus 启动
bbdb:

(require 'bbdb)
(bbdb-initialize 'gnus 'message)

现在,你可能需要一个通用的 bbdb 配置,把这些放入 ~/.emacs 中:

(require 'bbdb)
;;If you don't live in Northern America, you should disable the
;;syntax check for telephone numbers by saying
(setq bbdb-north-american-phone-numbers-p nil)
;;Tell bbdb about your email address:
(setq bbdb-user-mail-names
(regexp-opt '("Your.Email@here.bla"
"Your.other@mail.there.bla")))
;;cycling while completing email addresses
(setq bbdb-complete-name-allow-cycling t)
;;No popup-buffers
(setq bbdb-use-pop-up nil)

你已经准备好了。`M-x bbdb RET RET' 打开一个显示所有记录的缓冲。
`c' 创建新记录,`b' 搜索,`C-o' 在某条记录上添加新域。 Summary
buffer 中,如果想把某个发送者加入到 bbdb,按 `:'就可以。写邮件时,
按 `TAB' 可以在已知的收件人里循环。

5.8 有时候在 Article buffer 顶部有个小小的图片,是什么?我发的帖子如何加上?

那些图片称为 X-Face,是一些 48*48 的黑白图片,被编码为一行邮件头
(header line),如果你也想加一个,需要把图片转换X-Face。用一个图片处
理程序(比如 gimp),打开你想要的图片,剪切相应部分,将颜色降低为
1bit,改变大小到 48*48,另存为位图(bitmap)。从this site
(ftp://ftp.cs.indiana.edu:/pub/faces/) 取来 compface 包,通过如下命
令,创建一个 X-face:

cat file.xbm | xbm2ikon |compface > file.face
cat ./file.face | sed 's/\\/\\\\/g' | sed 's/\"/\\\"/g' > ./file.face.quoted

如果不能使用 compface,还有另一个 X-face 转换器:
http://www.dairiki.org/xface/. 如果在MS Windows 上,也可以用
WinFace 程序:http://www.xs4all.nl/~walterln/winface/. 然后只需要
在 ~/.gnus 中告诉Gnus 在你的帖子里面加入 X-face:

(setq message-default-headers
(with-temp-buffer
(insert "X-Face: ")
(insert-file-contents "~/.xemacs/xface")
(buffer-string)))

5.9 在新闻组中,有时候想按 f 却按了 r。当我在新闻组中的时候通过邮件回复
的时候,Gnus 能否警告一下?

放到 ~/.gnus:

(setq gnus-confirm-mail-reply-to-news t)

不过,这是在 Gnus 5.10 中。如果你用的还是 5.8.8 或 5.9 试试这个:

(defadvice gnus-summary-reply (around reply-in-news activate)
(interactive)
(when (or (not (gnus-news-group-p gnus-newsgroup-name))
(y-or-n-p "Really reply? "))
ad-do-it))

5.10 如何让 Gnus 不要产生 sender header?

Gnus 从 5.10.0 起,缺省不再产生 sender header。对于旧版本的 Gnus,
在~/.gnus 中这样:

(eval-after-load "message"
'(add-to-list 'message-syntax-checks '(sender . disabled)))

5.11 如何在本地保存我发送的邮件和帖子的复本?

通过设置变量 gnus-message-archive-group 来达到目的。可以设为一个保
留复本的组名的字串或如下所示,用一个函数来返回所用的组名。

(setq gnus-message-archive-group
'((if (message-news-p)
"nnml:Send-News"
"nnml:Send-Mail")))

5.12 有人告诉我说,我的 Message-ID 不正确,为什么,如何修改?

Message-ID 是你所发送的消息的唯一的标志符。为了使其唯一,Gnus 需要
知道用来放在 "@" 后的你的机器名。如果运行 Gnus 的机器的名字并不恰当,
你可以告诉 Gnus 用什么名字:

(defun message-make-message-id()
(concat "<"(message-unique-id)"@yourmachine.yourdomain.tld>"))

如果你也不知道 "yourmachine.yourdomain.tld" 这个地方该放什么。有几
个办法,问问你的供应商他是否允许你使用诸如
yourUserName.userfqdn.provider.net 的名字。或者到免费提供 FQDN 的地
方注册一个,例如:
http://www.stura.tu-freiberg.de/~dlx/addfqdn.html。(可惜这个是德文
的,如果你知道那个类似的英文站点,给我丢个条。)

当然,也可以告诉 Gnus 不要产生 Message-ID (让服务器去做吧):

(setq message-required-news-headers
(remove' Message-ID message-required-news-headers))

也可以不让 Gnus 产生邮件的 Message-ID:

(setq message-required-mail-headers
(remove' Message-ID message-required-mail-headers))

然而,一些邮件服务器也不能产生适当的 Message-ID,给自己发个邮件,看
看Message-ID,测试一下你的邮件服务器是否工作良好。

6 处理旧消息

6.1 如何把我的旧邮件引入 Gnus?

最简单的是让你原来的邮件程序把信件导出为 mbox 格式。多数 Unix 邮件
程序都可以做到,如果你来自 MS Windows 世界,或许能在这里找到工具:
http://mbx2mbox.sourceforge.net/

现在需要把 mbox 文件引入 Gnus。因此,需要在 Group buffer 通过`G f
/path/file.mbox RET' 创建一个基于这个 mbox 文件的 nndoc 组。 此时,你
可以只读访问你的邮件。如果想把这些放入通常的 Gnus 邮件组中,用`C-u
RET'进入刚刚建的 nndoc 组(这样可以看到所有邮件),标记所有邮件`M P b',
`B c name.of.group RET',复制到某个邮件组,或者用`B r'通过
nnmail-split-methods (respool) 分类邮件。

6.2 如何存档有趣的消息?

例如在 gnu.emacs.gnus 中,你偶然发现一个有趣的消息,想要存档,有好
几种方法。第一种,也是最简单的,另存为文件`O f'。但是,从 Gnus 访问
这样的存档文件并不方便。把 Frank Haun <pille3003@fhaun.de> 的这个代
码片断放入 ~/.gnus:

(defun my-archive-article (&optional n)
"Copies one or more article(s) to a corresponding `nnml:' group, e.g.
`gnus.ding' goes to `nnml:1.gnus.ding'. And `nnml:List-gnus.ding' goes
to `nnml:1.List-gnus-ding'.

Use process marks or mark a region in the summary buffer to archive
more then one article."
(interactive "P")
(let ((archive-name
(format "nnml:1.%s"
(if (featurep 'xemacs)
(replace-in-string gnus-newsgroup-name "^.*:" "")
(replace-regexp-in-string "^.*:" "" gnus-newsgroup-name)))))
(gnus-summary-copy-article n archive-name)))

此时,可以在 summary buffer 中用 `M-x my-archive-article' 把光标处
的文章存档到一个 nnml 组(当然,可以改为你想要的其他后端)。

当然,也可以使用缓冲:

(setq gnus-use-cache t)

这样,你只需设置 tick 或者 dormant 标记来保存,在缓冲中设置已读标记
可以删除(文章)。

6.3 如何搜索特定的消息?

也是有几种方法。Usenet 上的帖子,最简单的可能是访问
http://groups.google.com,如果在那儿找到了帖子,显示原始内容查看
message-id,之后在 Summary buffer 中 `M-^ the@message.id RET'。
Gnus 5.10.0 之后Gnus 也有了一个 groups.google.com 的界面,Group
buffer 中 `G W' 来启动。

另一种方法,对于 mail 和 news 组都有效,进入一个组中,用 Emacs 的标
准搜索命令 `C-s',也可以查看相应线索。如果想搜索文章内容,不妨试试
`M-s'。还有 gnus-summary-limit-to-foo 系列的函数也可能有用。

你可以用 grep 搜索你的本地邮件,但对于大的存档可能即慢又不方便,
因为不能在 Gnus 中显示找到的邮件。使用 nnir。nnir 是一个 swish-e 或
swish++ 之类的搜索引擎的前端。你可以给你的邮件用那些搜索引擎之一来
建立索引,借助 nnir 来搜索邮件,产生一个暂时的存放被搜索到的邮件的
组。如果挺起来很cool,取 nnir.el 自
ftp://ls6-ftp.cs.uni-dortmund.de/pub/src/emacs/或
ftp://ftp.is.informatik.uni-duisburg.de/pub/src/emacs/。 使用方法
在这个文件的开始处。

6.4 如何删除不想要的邮件?

你当然可以用 `#' 标记上不想要的文件再 `B DEL' 永久删除。 你也可以
用 `B m nnml:trash-bin' 把它们放到一个可以随时删除的垃圾组。 但是,
这两种都不是 Gnus 中建议的方法。

Gnus 中,我们让邮件如同帖子在新闻组服务器上一样过期。这意味着,在
summary buffer中,用 `E',告诉 Gnus 光标处这个消息过期的。当你离开
这个组的时候,Gnus 检查所有的被标记为过期的消息,如果足够 old(缺省
一星期),则删除。

6.5 我想所有已读消息都是过期的(至少一些组里这样),如何做?

如果你想所有已读消息为过期的(例如,在有存档的邮件列表组里),两个
选择:auto-expire和total-expire。Auto-expire意味着,所有的没有标记
并已经阅读了的邮件标记为过期的,Gnus 在你每次阅读一个消息的时候,为
你按一下`E'。Total-expire稍有不同,所有的有已读标记的消息标记为过期。

使用 auto-expire,在组参数(Group parameter)里设置上 auto-expire
(summary buffer 中在这个组上按 `G c')。Total-expire 同样。

选择哪个,只是你的喜好。Auto-expire更快些,但不能配合自适应赋分
(adaptive scoring),如果需要,则要用 total-expire。

如果自动或全部过期已经启用,却需要取消某个消息过期标记,通过设置一
个tick 标记(`u')或 dorman 标记(`?')。如果用的是auto-expire,也
可以通过设已读标记(`d')。

6.6 我不想删除已过期的邮件,只想转移到另一个组。

在 ~/.gnus 中如下写:

(setq nnmail-expiry-target "nnml:expired")

(如果想改变 nnmail-expiry-target 基于组的,参看问题"如何取消一些(例
如邮件的)组,或为这些组设置其他变量?")

7 拨号时用 Gnus

7.1 我这里不是始终在线的,如何使得我的连接时间最小?

基本上,两种选择:或者使用 Gnus Agent(见下文),或者安装可以取新闻
和邮件到本地磁盘的程序,让 Gnus 在本地读取。

如果想用第二种方法,需要一个能够取的新闻并能够提供给 Gnus 的程序,
一个类似的邮件程序,而且能够在你连线的时候发送你的消息。

先来说说 Unix 系统:新闻部分,最简单的办法是一个小的 nntp 服务器,
比如:Leafnode (http://www.leafnode.org/) 或sn
(http://infa.abo.fi/~patrik/sn/),当然,也可以安装一个功能齐全的新
闻服务器,比如:inn (http://www.isc.org/products/INN/)。 然后,取
邮件,流行的是:fetchmail (http://www.catb.org/~esr/fetchmail/) 和
getmail (http://www.qcc.ca/~charlesc/software/getmail-3.0/). 告诉
他们把邮件送到本地磁盘,Gnus则可以从那里读取。最后,不是必须的,发
送邮件部分:每个MTA 都可以sendmail (http://www.sendmail.org/)
postfix (http://www.qmail.org/),exim (http://www.exim.org/) 或
qmail (http://www.qmail.org/)。

Windows 机器上,我推荐:Hamster (http://www.tglsoft.de/), 这是一个
免费的,开放源码的小软件,可以从远端取邮件和新闻,并通过 nntp 以及POP3
或 IMAP 提供给 Gnus (或者其他任何邮件和/或新闻客户端)。它也包括一个
smtp 服务器,能够从 Gnus 接收邮件。

7.2 那么,Gnus Agent 如何呢?

Gnus Agent 是 Gnus 的一部分,可以把新闻和邮件取到本地,以后离线阅读。
它是像 Fort Agent 一样的离线新闻组客户端的模仿。如果你用的是 5.8.8
或 5.9,在 ~/.gnus 中加下面这行,如果是 5.10.0,这已经是缺省的:

(setq gnus-agent t)

选择哪些服务器可以被存储到本地。在 Group buffer 用 `^' 打开Server
buffer,移动光标选中一个服务器。最后,用代理管理这个服务器,按`J
a'。如果弄错了,或者改变主意了,用 `J r' 来撤销。按 'q' 回到 Group
buffer。下次进入一个代理管理的服务器中的组时,消息头将被存储到本地
磁盘,再下次再进这个组时,将从这里读取。

7.3 如果也想把消息保存在本地呢?

你可以让代理自动的取得满足一定谓词条件的帖子,这些在一个特别的组里
面完成,可以从 Group buffer 中通过 `J c' 转到。哪个谓词合适,如何做
到等内容请参考文档。

还有,可以手动告诉 Gnus 保存那个帖子。两种方法:其一,在 Summary
buffer 中,在需要保存的帖子上做 process 标记(`#')后,按`J s'。其
二,还是在 Summary buffer 中设置 downloadable 标记 (%)(用`@')后,
按 `J u'。有什么不同呢?process 标记在你退出这个组的时候就没了,而
downloadable 标记是永久的。你实际上可以在几个组里面设置
downloadable 标记,然后用取片断(Group buffer 中'J s' )取得所有那
些邮件。唯一的缺点,取片断要取得每个被选中的组的所有消息头。依其组
的大小,第一次或许会很长时间。

7.4 离线时如何不让 Gnus 发送邮件/帖子?

你所需做的只是要告诉 Gnus 你什么时候在线(plugged)和不在线
(unplugged),其他的都是自动的。Group buffer 中用 `J j' 转换
plugged/unplugged 状态。开始 Gnus 时,用 `M-x gnus-unplugged' 代替
`M-x gnus'。 注意,Gnus agent 需要已启用。

8 需要帮助

8.1 如何在 Emacs 中找到信息和帮助?

首先,应该是 Gnus 手册,从 `C-h i d m Gnus RET' 开始。完全的搜索,
用 `s'。其次,通用的以 C-h 开始的 Emacs 帮助命令,按`C-h ? ?' 可
以得到一个命令列表及其含义。最后,`M-x apropos-command' 可以从所有
命令中搜索,`M-x apropos'搜索绑定的变量。

8.2 如何在 Gnus 手册中找到某某内容(例如,附件,PGP,MIME……),没有文档?

不是只有 Gnus 手册,还有 message 手册,emacs-mime 手册,sieve 手册
以及pgg 手册。这些都作为 Gnus 的一部分一并发布,因为不是 Gnus 的核
心部分,所以都被放在不同的文档中,不过,你也应该看看这些文档。

8.3 应该知道哪些网站?

两个最重要的是:official Gnus website (http://www.gnus.org)。 以及
其姐妹站:my.gnus.org (MGO) (http://my.gnus.org)。这里放着lisp 片断
的存档,howtos,一个(并未完成)的tutorial,和这个faq。

告诉我其它有趣的站点。

8.4 有那些邮件列表和新闻组呢?

新闻组 gnu.emacs.gnus 讨论一般问题,ding 邮件列表(ding@gnus.org),
讨论 Gnus 的开发。你可以通过 nntp 阅读这个列表,在 news.gnus.org
的gnus.ding 组。

如果你想呆在 big8 中,news.software.newssreaders中也有 Gnus 用户
(但是,上面的组里面得到有用帮助的机会更多)。如果你用德语,还有
de.comm.software.gnus。

8.5 向什么地方报告bug?

`M-x gnus-bug',开启一个到gnus bug mailing list
(mailto:bugs@gnus.org) 的消息,已经包含有你的环境信息,使你报告
bug 变得容易些。。

8.6 如果需要一个实时的帮助,如何得到?

把你的 IRC 客户端设置到 irc.my.gnus.org 上的 #mygnus 频道。不要担心
那些说德语的人,当有人从别处来他们都愿意并且能够转为英语。

9 调整 Gnus

9.1 开始 Gnus,真的很慢,如何快些?

原因可能是 Gnus 读取它的 active 文件的方式,参考 Gnus 手册中 "The
Active File" 一节,你可能能够加快这一过程。还有个方法,编译你的~
/.gnus (`M-x byte-compile-file RET ~/.gnus RET')。还有,如果你在
.gnus 中使用了 require 语句,可以用 eval-after-load 来替换,此时这
些并不在启动时设置,而是在加载相应的文件时。比如,你的 ~/.gnus 中有:

(require 'message)
(add-to-list 'message-syntax-checks '(sender . disabled))

此时,一起动Gnus,message.el便被加载。如果换为:

(eval-after-load "message"
'(add-to-list 'message-syntax-checks '(sender . disabled)))

只在需要的时候加载。

9.2 如何加快进入某个组的速度?

速度的杀手是设置了变量 gnus-fetch-old-headers 为除 nil 以外的任何值。
如果速度是个问题,不要这么设置。加快 summary 可以通过在 ~/.gnus 文
件底部写这行:

(gnus-compile)

这使得 gnus 编译一些东西,比如 gnus-summary-line-format。然后,你还
可以减少 gc-cons-threshold 的值:

(setq gc-cons-threshold 3500000)

如果不介意 CJK 字符的宽度,或者用 Gnus 5.10.0 和新的 GNU Emacs:

(setq gnus-use-correct-string-widths nil)

(感谢Jesper后两个建议)。如果你是仍然使用 5.8.8 或 5.9 的,并且体验
到了产生 summary buffer 时速度的问题,还是升级到 5.10 吧,因为在这
个上面却有一些改进。

9.3 发送邮件变得越来越慢,怎么了?

可能因为你通过 gnus-message-archive-group 让 Gnus 存档消息了。 试
试用一个 nnml 组代替存档组,这样就会回到正常速度的。


术语表
~/.gnus
~/.gnus 是你的 Gnus 的配置文件,你可以称其为 ~/.gnus.el,或其
他的名字。

后端(Back End)
Gnus 的术语中,一个后端就是一个虚拟服务器,介于 Gnus 核心和实
际的提供给Gnus 标准的界面函数之,如 "get message" 或 "get
Header" 等的NNTP, POP3, IMAP 或任何服务器之间的一层。。

Emacs
这份 FAQ 中所提到的 Emacs,都指 GNU Emacs 或 XEmacs.

消息(Message)
这份 FAQ 中的一个消息(message)意味着一个邮件或者发送(张贴)到
Usenet 新闻组上或某些后端的帖子,无所谓什么后端。

MUA
MUA 是 Mail User Agent 的缩写,用来读写邮件的程序。

NUA
NUA 是 News User Agent 的缩写,用来读写新闻组的程序。

2009年6月10日星期三

发财兄的新地界 转自牛博

发财兄的新地界: "此即狂人宣言,此即白痴呓语。此即一切理性和谐物眼中之狂人白痴的最爱。阅后无须多言,只须发癫,发狂,发疯,但严禁发孬种,发和谐,发废话,发无赖,否则必以狂对之。因为此乃狂人之宣言,此乃狂人之最后活人方,此乃最后关头之疯狂,无切肤体验者速滚离之!!
狂人宣言
昨日狂人如在下者惊闻,某来月倘购新电脑一部,需领一戴绿帽子的爸爸回家,协同巡查。狂人甚为震怒,原因有三,其一,吾有父,无须买时再添一个。其二,此条令违律甚多,先是不允家长自由领养,强卖强领,违消费者大律,其次,窥人隐私,违宪法大律。既已有两条违律在前,恕守法良善如狂人者难以从命也。其三,时下朝廷众多法令皆以爱民始,祸民终,信义全无,寡廉鲜耻。自己对此条令亦难有好感,且甚疑虑,不知其所为如何,是否别有用心,亦不得而知也。虽有某一刚强禽兽官予以坚决释疑,然肉食者鄙之,狐翁者狡之,渐觉难信。遂拟一对策如下,也是三条,送与愿共赴难关之狂人一读,也望其能予以执行之

1. 即日起,凡有qq者改签名,凡有博客者,改标题或写文章,一并改写之为“不要戴绿帽子的爸爸”或“只要一个爸爸,不要戴绿帽子的爸爸来家。”等等即可。也可发此类标题之帖子上bbs,入百科,或做此类传单散发。总而言之,改得越多,写得越多,传播越广越是好。因为多多益善也!!只要你突出绿帽子或是突出戴绿帽子的爸爸,皆可视为同路狂人!!倘有人问起此为何故,答曰,不要绿帽,拒绝低俗也
2. 即日起,拒买一切品牌机,无论其来源何处,名气多大,是洋是华,是优是劣,是比尔黑屏鬼的,还是嘉祥下流鬼的,只要品牌机,一概拒绝。家里若有旧的,请继续使用,若无,可不买,也可去购组装机,并建议亲友也一同这般做。此拒买,时间长度自定。可一月,可数年,可数百年,可数万年,总而言之,须至朝廷心痛,因而久久宜善也。只要拒买,皆为同道。倘有人问此为何故,答曰,节能减排,优化组合也!!
3. 来月首日,倘无改变,则皆不予上网,不予劳作,只须闭门休闲,游山玩水,酒馆茶楼,观阅书碟等等即可。不管当日是否有三令五申,老板财团,特高国安,到时一律以修养身心为主!!倘若此次遇阻力,来日可继续休息,也可扩展至拒买品牌的任何一物,大发传单,大发帖子,也可上街游行。但倘若要游行,须在事前做好足够准备应对,因恐届时将有长城出动,狂人们若不准备,怕有不测。至于准备到何种程度,须Bomb否,须Gun否,须Revolution否,须Urban Guerrilla否,允其自便,不加限制。总而言之,只要不孬种,越火越好是也!!只要参与到第三步,无论所做的是何种行为,皆为超级勇猛之狂人。如有人问此为何故?答曰,无故,中华民族到了最危险的时刻是也!!

赞同此宣言者,不须签名,不须多言,不须形式,只要即日起付诸行动即可,因为狂人家族只尚行动,不尚废话,倘若怀抱啥子理性者,啥子克制者,请速速远离,免得搅扰愿意前来之狂人的清思。只因狂人无此精力与尔等浪费,危机就在眼前是也。自己须得声明,凡参与此次行动之狂人,无论男女老幼,身在何方,是默默无名如在下者,还是鼎鼎大名如 俞天任者,皆有行动之责,只要其一息尚存,无论其做的是第一步,还是更好的第一第二步,或者三者皆作了。都可被视为热心于此之真狂人。此行动之狂人对所为无有任何责任,只对目标和狂乱的良心负责,因为狂人无刑责,倘若有长城欲动用狂人院暴打之,允狂人杀白狗取肉,大快朵颐是也,至于在下,无须担忧,发文毕,但凡三去处,一为狂人院对白狗,二为小黑屋对肥猫,三为某地对豺狼。倘若届时不知吾究竟在哪,可问狐仙和白头翁,他俩若不语,大可放心,因为二十年后必有一新狂人诞生!o(∩_∩)o…虽然在下只信上帝,不信轮回。但难以免俗是也,吼吼也好,免得到时发不出声!!"

2009年6月6日星期六

翻译 w3m 快捷键 --转

翻译 w3m 快捷键

http://bones7456.blog.ubuntu.org.cn/2007/06/02/%E7%BF%BB%E8%AF%91-w3m-%E5%BF%AB%E6%8D%B7%E9%94%AE/
引用:
页面操作
SPC,C-v 向下翻页
b,ESC v 向上翻页
l,C-f 焦点向右
h,C-b 焦点向左
j,C-n 焦点向下
k,C-p 焦点向上
J 向上滚动一行
K 向下滚动一行
^,C-a 到行首
$,C-e 到行尾
w 到下一个单词
W 到上一个单词
> 右移一屏
< 左移一屏
. 屏幕右移一列
, 屏幕左移一列
g,M-< 到首行
G,M-> 到末行
ESC g 到指定行
Z 当前行居中
z 当前列居中
TAB 转到下个超链接
C-u,ESC TAB 到上个超链接
[ 到第一个超链接
] 到最后一个超链接超链接操作
RET 打开超链接
a, ESC RET 链接另存为
u 查看链接url
i 查看图片url
I 查看图片
ESC I 图片另存为
: 标记rul字符串为锚点
ESC : 标记ID串为锚点
c 查看当前页面的URL
= 显示当前页面属性
C-g 查看当前行号
C-h 查看历史记录
F 提交表单
M 用外部浏览器打开当前页面 (use 2M and 3M to invoke second and third browser)
ESC M 用外部浏览器打开链接 (use 2ESC M and 3ESC M to invoke second and third browser)

文件/流 操作
U 打开URL
V 打开文件
@ 执行外部命令并导入
# 执行外部命令并浏览

缓存操作
B 返回
v 查看源代码
s 选择缓存
E 编辑缓存代码
C-l 重画屏幕
R 刷新
S 页面另存为
ESC s 源码另存为
ESC e 编辑图片

缓存选择模式(也就是按了s以后)
k, C-p 上一缓存
j, C-n 下一缓存
D 删除当前缓存
RET 转至选择的缓存

书签操作
ESC b 打开书签
ESC a 添加当前页到书签

搜索
/,C-s 向前搜索
?,C-r 向后搜索
n 下一个
N 上一个
C-w 打开/关闭 循环搜索

标记
C-SPC 设定/取消 标记(这个键一般被输入法占用了)
ESC p 转至上一标记
ESC n 转至下一标记
" 使用正则表达式标记

杂项
! 执行外部命令
H 帮助
o 设置选项
C-k 显示接受到的cookie
C-c 停止
C-z 挂起(退出)
q 退出(需确认)
Q 退出而不确认

行编辑模式
C-f 光标向后
C-b 光标向前
C-h 删除前一字符
C-d 删除当前字符
C-k 删除光标后所有内容
C-u 删除光标前所有内容
C-a 光标到行首
C-e 光标到行尾
C-p 取得历史记录中的前一个词
C-n 取得历史记录中的后一个词
TAB,SPC 自动完成文件名
RETURN 确定

2009年6月4日星期四

Find Tag - GNU Emacs Manual

Find Tag - GNU Emacs Manual: "Finding a Tag

The most important thing that a tags table enables you to do is to find the definition of a specific tag.

M-. tag <RET>
Find first definition of tag (find-tag).
C-u M-.
Find next alternate definition of last tag specified.
C-u - M-.
Go back to previous tag found.
C-M-. pattern <RET>
Find a tag whose name matches pattern (find-tag-regexp).
C-u C-M-.
Find the next tag whose name matches the last pattern used.
C-x 4 . tag <RET>
Find first definition of tag, but display it in another window (find-tag-other-window).
C-x 5 . tag <RET>
Find first definition of tag, and create a new frame to select the buffer (find-tag-other-frame).
M-*
Pop back to where you previously invoked M-. and friends.

M-. (find-tag) is the command to find the definition of a specified tag. It searches through the tags table for that tag, as a string, and then uses the tags table info to determine the file that the definition is in and the approximate character position in the file of the definition. Then find-tag visits that file, moves point to the approximate character position, and searches ever-increasing distances away to find the tag definition.

If an empty argument is given (just type <RET>), the balanced expression in the buffer before or around point is used as the tag argument. See Expressions.

You don't need to give M-. the full name of the tag; a part will do. This is because M-. finds tags in the table which contain tag as a substring. However, it prefers an exact match to a substring match. To find other tags that match the same substring, give find-tag a numeric argument, as in C-u M-.; this does not read a tag name, but continues searching the tags table's text for another tag containing the same substring last used. If you have a real <META> key, M-0 M-. is an easier alternative to C-u M-..

Like most commands that can switch buffers, find-tag has a variant that displays the new buffer in another window, and one that makes a new frame for it. The former is C-x 4 ., which invokes the command find-tag-other-window. The latter is C-x 5 ., which invokes find-tag-other-frame.

To move back to places you've found tags recently, use C-u - M-.; more generally, M-. with a negative numeric argument. This command can take you to another buffer. C-x 4 . with a negative argument finds the previous tag location in another window.

As well as going back to places you've found tags recently, you can go back to places from where you found them. Use M-*, which invokes the command pop-tag-mark, for this. Typically you would find and study the definition of something with M-. and then return to where you were with M-*.

Both C-u - M-. and M-* allow you to retrace your steps to a depth determined by the variable find-tag-marker-ring-length.

The command C-M-. (find-tag-regexp) visits the tags that match a specified regular expression. It is just like M-. except that it does regexp matching instead of substring matching."

CyclingGTagsResult

CyclingGTagsResult

GNU Global is pretty cool as an Emacs tagging tool. However, its gtags.el package integrating GNU Global inside Emacs doesn't support cycling through multiple tag results. I whipped up some Elisp to do the trick. It supports cycling all kinds of GTAGS result: tag, rtag, symbol, etc. Here's in my .emacs file.

(require 'gtags)

(defun ww-next-gtag ()
"Find next matching tag, for GTAGS."
(interactive)
(let ((latest-gtags-buffer
(car (delq nil (mapcar (lambda (x) (and (string-match "GTAGS SELECT" (buffer-name x)) (buffer-name x)) )
(buffer-list)) ))))
(cond (latest-gtags-buffer
(switch-to-buffer latest-gtags-buffer)
(next-line)
(gtags-select-it nil))
) ))

Here's my key binding for using GNU Global.

(global-set-key "\M-;" 'ww-next-gtag)   ;; M-; cycles to next result, after doing M-. C-M-. or C-M-,
(global-set-key "\M-." 'gtags-find-tag) ;; M-. finds tag
(global-set-key [(control meta .)] 'gtags-find-rtag) ;; C-M-. find all references of tag
(global-set-key [(control meta ,)] 'gtags-find-symbol) ;; C-M-, find all usages of symbol.

- WilliamWong

etags 簡介---转

etags 簡介                                    -*- Outline -*-

* 前言
  有許多的 IDE(Integrated Development Environment) 都提供了函數名稱的
  自動完成功能( 亦即,輸入前面幾個字元之後,編輯器可以自動幫你完成後面
  的函數名稱)。Vi 裡面有 ctags 可以做到這件事,那麼 Emacs 呢?答案是
  etags. 在這篇文章裡,我會簡短的介紹如何使用 etags.

* etags 使用方法
** 建立函數及關鍵字列表
   在使用之前,你必須先在你的發展環境目錄底下建立列表; 假設你的發展環
   境目錄名稱叫做 /path/to/developer/, 建立列表的方法如下:

   % cd /path/to/developer/
   % etags *.h *.c

   這樣就建立完成了,根據 etags/ctags 的手冊, etags/ctags 可以處理的語
   言有 C, Objective C, C++, Java, Fortran, Ada, Cobol, Erlang, LaTeX,
   Emacs Lisp/Common Lisp, makefiles, Pascal, Perl, Postscript,
   Python,  Prolog, Scheme  and most assembler-like  syntaxes.
   預設的列表檔名是 TAGS.

** 把函數及關鍵字列表讀進 Emacs
   開始用 Emacs 編輯檔案, 比如說你正在編輯 foo.c, 你先用 C-x C-f 把
   foo.c 讀進來之後,你需要使用 etags 的功能,那麼你就執行
   M-x visit-tags-table <RET> /path/to/developer/TAGS <RET>
   把 /path/to/developer/TAGS 檔案讀進來。註:<RET> 表示 Return 鍵,或
   是在鍵盤上通常標示為 Enter.

** 在 Emacs 中搜尋函數內容
   有的時候我們會想要直接跳到某個函數裡面去修改他的內容,你可以使用
   M-. (沒錯,就是 Meta 跟一個句點) 然後輸入函數名稱就會跳到該函數的
   code 那裡去; 如果你按 M-. 的時候游標指著一個函數名稱,你可以在輸入
   函數名稱的時候直接按 <RET> 即可跳到該函數源碼的地方。跳過去之後,如
   果你想要回來原來地方,你可以用 M-* 來做到。

   如果你想要在另一個視窗內看到該函數源碼,而不是你現在的這個視窗(對照
   方便), 那麼你可以用 C-x 4 . TAG <RET> 來達成這件事。

   如果你要搜尋某些函數與關鍵字,你可以用 M-x tags-search 的功能,這個
   可以用 regular expression 來搜尋。當你用 M-x tags-search <RET>
   REGEXP <RET> 之後,你可以用 M-, (Meta 逗點), 找下一個搜尋到的函數名
   或關鍵字。

** 函數及關鍵字自動完成
   etags 並沒有提供函數及關鍵字自動完成(auto-completion)的功能, 但是
   Emacs 有提供一個功能可以達成這件事,叫做 dynamic abbreviation
   expansion. 這個功能事實上是把去找在開啟的 buffer 裡面有那些字串是你
   輸入字串的完整字串,而 TAGS 列表就在一個 buffer 裡面,所以可以達成
   函數及關鍵字自動列表。當你輸入一個函數名稱或是一個變數名稱的前面幾
   個字母,比如說: foo-, 然後按 M-/, 這時候 Emacs 會把所有可能的字串找
   到,並把第一個可能的字串直接完成,所以你按了一次 M-/ 之後可能會變成
   foo-bar-function, 你繼續按 M-/ 可以變換成其他可能的字串,直到沒有為
   止。或者是你也可以按 C-M-/, 這時候 Emacs 會像其他時候的
   auto-completion 的行為一樣,跳出一個視窗把所有的可能列表列出來給你
   選擇。

* 結語
  當我開始使用 etags 的功能之後,我就沒有辦法不用這個功能了,因為實在
  是太方便了。etags 也可以幫你自動完成標準函式庫裡的名稱,只要你在
  etags 的時候把 /usr/include 裡的表頭檔案也包含進來就可以了。etags 還
  有其他比較進階的功能,我沒有一一列出來,有興趣的人可以去看看 M-x
  info 裡的 Emacs 手冊。最後我做一個這次提到的功能列表,供讀者參考用。

* 按鍵列表
  M-x visit-tags-table <RET> TAGS-file <RET>
      把 TAGS-file 檔案讀進 Emacs
  M-. TAG <RET> 尋找函數或關鍵字定義的源碼
  C-x 4 . TAG <RET> 在另一個視窗尋找函數或關鍵字定義
  M-* 回到尋找關鍵字定義之前的地方
  M-x tags-search <RET> REGEXP <RET> 用正規表示式搜尋函數或關鍵字定義
  M-, 找下一個搜尋到的函數或關鍵字
  M-/ 自動完成可能的函數或關鍵字
  C-M-/ 列出所有函數或關鍵字名稱的自動完成列表
--
Jiun-jie Huang, aka Albert    E-mail: jjhuang AT cm.nctu.edu.tw
黃俊傑                        
Department of Computer Science  
National Tsing Hua University   MIME/ASCII/PDF/PostScript are welcome!
HsinChu, Taiwan                 NO MS WORD DOC FILE, PLEASE!

2009年6月3日星期三

emacs的自动补齐

emacs的自动补齐(智能感应)收藏

   在编写代码时,自动补齐(成员函数变量,以及……)能提高很大的效率,emacs的自动补齐方法有很多种,我参考了很多其他网友的文章,简单总结了下,希 望其他网友不要怪罪我哈,呵呵,我希望把我的学习过程记录下来,能对其他网友有所帮助.以下是几种不同的方法(也可以一块用哈)
1.  Emacs 自带的hippie-expand (参考的是王垠的)
    hippie-expand是 Emacs 自带的功能,
   把M-/ 绑定到 hippie-expand,在.emacs文件中加入
    ;;绑定按键  
    (global-set-key [(meta ?/)] 'hippie-expand)

    hippie-expand 的补全方式。它是一个优先列表, hippie-expand 会优先使用表最前面的函数来补全。通常的设置是:
(setq hippie-expand-try-functions-list 
'(try-expand-dabbrev
try-expand-dabbrev-visible
try-expand-dabbrev-all-buffers
try-expand-dabbrev-from-kill
try-complete-file-name-partially
try-complete-file-name
try-expand-all-abbrevs
try-expand-list
try-expand-line
try-complete-lisp-symbol-partially
try-complete-lisp-symbol))
首先使用当前的buffer补全,如果找不到,就到别的可见的窗口里寻找,
如果还找不到,那么到所有打开的buffer去找,如果还……那么到kill-ring里,
到文件名,到简称列表里,到list,…… 当前使用的匹配方式会在 echo 区域
显示.
确实是非常好用,基本上我M-/就能到达我想要的了.

2 采用etags
etags能像cscope那样,在代码里跳来跳去,比如查找函数,变量等,它还能够自动补齐代码.
1),先生成etags文件
find . /usr/include/ -name "*.c" -or -name "*.cpp" -or -name "*.hpp" -or -name "*.h" |xargs etags --members --language=c++
2).配置.emacs
(setq tags-file-name "~/TAGS")
 3),使用
在emacs中,M-tab 就可以自动补齐了,不过有时候还是不是很好用.
M-. 查找一个tag,比如函数定义类型定义等。
C-u M-. 查找下一个tag的位置
M-* 回到上一次运行M-.前的光标位置。 M-TAB 自动补齐函数名。

3 采用cedet包
1)下载cedet
网址是 http://cedet.sourceforge.net/
2)编译
tar -zxf cedet-1.0pre3.tar.gz
cd cedet-1.0pre3
make
如果make不成功的话,就看看那个说明吧
3)配置
查看emacs的配置文件在哪里
whereis emacs
拷贝编译好了的cedet
cp -r cedet-1.0pre3 /usr/share/emacs/
查看是否有我们需要的那个文件
ls /usr/share/emacs/cedet-1.0pre3/common/cedet.el

配置.emacs文件,在.emacs文件中加入
;;;;;;;;;;cedet
(load-file "/usr/share/emacs/cedet-1.0pre3/common/cedet.el")

;;设置检索范围
(setq semanticdb-project-roots
(list
(expand-file-name "/")));;可以设置为项目的顶级目录

;;绑定按键,ctr+tab,以下三种,任意选择一个,我喜欢第二个
;;(global-set-key [(control tab)] 'senator-complete-symbol);
(global-set-key [(control tab)] ' senator-completion-menu-popup)
;; (global-set-key [(control tab)] 'semantic-ia-complete-symbol-menu)

4)使用
在一个未输入完成的函数上尝试下ctr+tab键
看看效果吧:
http://p.blog.csdn.net/images/p_blog_csdn_net/tangnf/304751/o_Screenshot-2.png