关于作者

姓名:TangLei

性别:男

出生日期:1981-09-15

地区:常州

联系电话:13775111384

QQ:4170524婚否:未婚
用户名:JustinLei
笔名:JustinLei
地区: 常州
行业:其他

日历  

快速登录

+ 用户名:
+ 密 码:

在线留言



Open Source

Java BBS

访问统计:
文章个数:25
评论个数:6
留言条数:0




Powered by BlogDriver 2.1

Love World

 

文章

VIM
什么人适合使用 VIM ?
追 求编 辑 效 率的 程序员
VIM 的作者是程序员
他为程序员开发了许多有用的功能
其 它经 常 处 理纯 文本的 人 员
中小型企业 Web 开发人员
编写 LaTeX 文档的研究人员
Unix / Linux 系统管理员

什么人不适合使用 VIM ?
生 活、 工 作 和学 习无需 和 纯 文本 打 交道 的 人
处理其它类型的文件有专门的工具
打 字速 度 慢 于智 能感知 运 行 速度 的 人
VIM 目前暂不支持智能感知
被强大的 IDE 惯坏了的人
强大顺手的 IDE 比方便快捷的编辑器更重要


Linux 下中文处理
编 辑时 不 能 输入 中文
:set encoding=cp936
菜 单显 示 是 乱码
:so $VIMRUNTIME/delmenu.vim
:so $VIMRUNTIME/menu.vim


选择喜欢的字体
通 过菜 单 与 对话 框选择 字 体
编辑 ­­> 选择字体
只有等宽字体可以被选中
适合程序员使用的字体基本原则
Bitstream Vera Sans Mono
0Oo 1Il
记 住选 中 的 字体 名称
:set guifont?
将显示结果抄下来备用


VIM 基本操作
VIM 是一个有模式的编辑器
Normal 模式下按键序列对应命令
按 i 键进入 Insert 模式
按 : 进入 command 模式
Insert 模式下可以输入文本
按 ESC 回到 Normal 模式
Command 模式下输入命令
有模式导致 VIM 快捷键长度较短


使用 hjkl
VIM 支持使用方向键移动光标
在 insert 状态下移动光标会比较方便
使 用 h jk l 移 动 光 标 编 辑 效 率 更 高
距离近,按键方便,眼睛无需离开屏幕


vimtutor
vimtutor 是 VIM 入门非常好的学习材料
Linux 用户
在终端中输入 vimtutor
启动字符界面的 vimtutor
W in d o ws 用 户
在开始菜单中找 vimtutor 快捷方式
启动后出现乱码,重新选择一个中文字体即可


查找替换
准 备工 作
打开 VIM ,按 i ,输入:
this is a test
查 找替 换
按 ESC 回到 normal 状态,输入:
:%s/ /^M/g
其中 ^M 使用 Ctrl­v Ctrl­m 的方式输入
将所有空格替换为回车,文本变为 4 行


行的拼接
查 找 \n 替 换 为 空 格 可 以 实 现 拼 接
这 里使 用 j 命 令拼 接 行
按 ggVG ,全选
按 : ,此时命令行显示为:
:'<,'>
在其后输入 j ,回车
拼接完毕


复制粘贴与重复动作
在 normal 状态下按 yy ,复制当前行
按 1 2 p , 屏幕 上 即 出现 1 3 行 上述 字 样
12 表示将其后的命令执行 12 次
p 表示粘贴到当前行之后
VIM 里大部分命令都可以加上数字表明执行次数


列操作
选 中全 文 第 一列
按 gg 跳到开头
按 Ctrl­v 进入列选择状态
按 G 跳到末尾
将 每行 第 一 列变 为大写
按 U 表示把选中内容变大写
按 u 表示把选中内容变小写
按 ~ 表示翻转原有大小写
在 每行 前 面 加一 个星号 和 一 个空 格
选中第一列
按 I 进入插入状态
输入 * ,按 ESC
选 中前 两 列 后按 x , 可以 进 行 列删 除
编程时可以用于批量注释和批量解注释


宏的录制
将 所 有 偶 数 行 的 a 改 成 an o th er
录 制宏
按 gg 进入第一行
按 qm 进入宏录制状态,录制到寄存器 m
按 j 进入第二行,按 $ 跳到行末
按 2b ,光标停在字母 a 上
按 caw ,输入 another ,按 ESC ,按 j 进入下一行
按 q 结束宏的录制


宏的播放
单 次播 放
按下 @m ,执行 m 寄存器中的宏
可以发现第 4 行的 a 也变成了 another
多 次播 放
输入 1000@m
可以发现所有偶数行的 a 都变成了 another
到达文件底部时宏执行出错,会自动停止
最终并没有真的执行 1000 次


点命令
在 每行 末 尾 添加 一个感 叹 号
执 行次 数 不 多的 简单操 作 无 需使 用 宏
按 gg 进入第一行,按 A 进入行尾添加状态
输入 ! ,按 ESC ,按 j 进入第二行
按 . 表示重复前一个操作,即行尾添加 !
反复按 j.j.j.j.
推荐大家左手鼠标
:%s/$/!/g


VIM 入门
2 1 天 学习 计 划
多读文档,少走弯路
第一周:每天一遍 vimtutor
熟悉基本操作,做到随心所欲
第 二周 、 第 三周 :通读 用 户 手册
读用户手册的同时修订出适合自己的 .vimrc
目前手册有中文版译本可供下载

- 作者: JustinLei 2005年11月13日, 星期日 20:42  回复(0) |  引用(1) 加入博采

Thread类和Runnable接口
在创建java.lang.Thread类的一个实例时就会"诞生"一个新线程。Thread对象表示Java
解释器中一个实际的线程,并作为控制和协调其执行的一个句柄。利用Thread对象,可以启动线程、
等待其完成、要求它睡眠一段时间,或者时中断其活动。Thread类的构造函数可接受线程应当在哪里
开始执行等等有关的信息。从概念上说,我们只希望告诉它所要运行的方法,但是由于Java中不存在
方法指针(至少没有这种意义的方法指针),因此我们并不能直接指定方法。与此不同,必须采取一种
迂回线路,即使用java.lang.Runnable接口来创建一个对象,此对象中包含一个“可运行”的方。
Runnable接口只定义了唯一的一个通用方法。
 public interface Runnable {
 abstract public void run();
}
 每个线程的生命周期都始于执行Runnable对象中的run()方法。此对象是传递给线程构造函
数的“目标对象”。run()方法可以包含任何代码、但它必须是公共的,不仅没有任何实参,而且也没
有返回值,另外不会抛出任何受查异常。
 任何包含有合适的run()方法的类都可以声明它实现了Runnable接口。此类的实例就是一个
可运行的对象,它可以作为一个线程的目标。如果不希望将run()直接放在对象中(而且通常不会这样
做),则可以建立一个适配器类,由它作为一个Runnable类。适配器的run()方法则能够在线程启动
后调用任何需要的方法

- 作者: JustinLei 2005年11月13日, 星期日 14:12  回复(0) |  引用(1) 加入博采

让Ubuntu默认显示MAC风格的圆体字体
UBUNTU默认显示的是XP风格的字体,所以就算安装了圆体,9~13号字显示的还是新宋字体,要让UBUNTU默认显示MAC圆体

1.下载圆体 ttf-vera-yuan_0.10-3ubuntu1_all.deb
ubuntu.cn99.com有下载

2.修改/etc/fonts/fonts.conf
内容:
注释掉XP风格字体
<!-- Win XP 效果 
<match target="font">
   <test name="family"><string>Vera Sans YuanTi</string></test>
   <edit name="globaladvance"><bool>false</bool></edit>
</match>
 
<match target="font">
   <test name="family"><string>Vera Sans YuanTi Mono</string></test>
   <edit name="globaladvance"><bool>false</bool></edit>
</match>
 
<match target="font">
   <test qual="any" name="family"><string>Vera Sans YuanTi</string></test>
   <edit name="antialias" mode="assign"><bool>true</bool></edit>
   <edit name="hinting" mode="assign"><bool>false</bool></edit>
   <edit name="autohint" mode="assign"><bool>false</bool></edit>
   <edit name="hintstyle" mode="assign"><const>hintnone</const></edit>
   <edit name="rh_prefer_bitmaps" mode="assign"><bool>false</bool></edit>
</match>
 
 
<match target="font">
   <test qual="any" name="family"><string>Vera Sans YuanTi</string></test>
   <test compare="more_eq" name="pixelsize" qual="any" ><double>12</double></test>
   <test compare="less_eq" name="pixelsize" qual="any" ><double>16</double></test>
   <edit name="antialias" mode="assign"><bool>false</bool></edit>
   <edit name="hinting" mode="assign"><bool>true</bool></edit>
   <edit name="autohint" mode="assign"><bool>false</bool></edit>
   <edit name="hintstyle" mode="assign"><const>hintfull</const></edit>
   <edit name="rh_prefer_bitmaps" mode="assign"><bool>true</bool></edit>
</match>
 
<match target="font">
   <test qual="any" name="family"><string>Vera Sans YuanTi Mono</string></test>
   <edit name="antialias" mode="assign"><bool>true</bool></edit>
   <edit name="hinting" mode="assign"><bool>false</bool></edit>
   <edit name="autohint" mode="assign"><bool>false</bool></edit>
   <edit name="hintstyle" mode="assign"><const>hintnone</const></edit>
   <edit name="rh_prefer_bitmaps" mode="assign"><bool>false</bool></edit>
</match>
 
<match target="font">
   <test qual="any" name="family"><string>Vera Sans YuanTi Mono</string></test>
   <test compare="more_eq" name="pixelsize" qual="any" ><double>12</double></test>
   <test compare="less_eq" name="pixelsize" qual="any" ><double>16</double></test>
   <edit name="antialias" mode="assign"><bool>false</bool></edit>
   <edit name="hinting" mode="assign"><bool>true</bool></edit>
   <edit name="autohint" mode="assign"><bool>false</bool></edit>
   <edit name="hintstyle" mode="assign"><const>hintfull</const></edit>
   <edit name="rh_prefer_bitmaps" mode="assign"><bool>true</bool></edit>
</match>
-->

开启MAC风格字体

<!-- Mac OS X 效果 -->
<match target="font">
   <test name="family"><string>Vera Sans YuanTi</string></test>
   <edit name="globaladvance"><bool>false</bool></edit>
</match>
 
<match target="font">
   <test name="family"><string>Vera Sans YuanTi Mono</string></test>
   <edit name="globaladvance"><bool>false</bool></edit>
</match>
 
<match target="font">
   <edit name="antialias" mode="assign"><bool>true</bool></edit>
   <edit name="hinting" mode="assign"><bool>false</bool></edit>
   <edit name="autohint" mode="assign"><bool>false</bool></edit>
   <edit name="hintstyle" mode="assign"><const>hintnone</const></edit>
   <edit name="rh_prefer_bitmaps" mode="assign"><bool>false</bool></edit>
</match>
 


- 作者: JustinLei 2005年11月11日, 星期五 10:16  回复(1) |  引用(1) 加入博采

让kpdf支持中文
1.下载XPDF和中文插件

2.修改~/.xpdfrc
内容:

#========================================================================
#
# System-wide xpdfrc file
#
# The Xpdf tools look for a config file in two places:
# 1. ~/.xpdfrc
# 2. /etc/xpdf/xpdfrc
#
# Note that if ~/.xpdfrc exists, Xpdf will NOT read the system
# configuration file /etc/xpdf/xpdfrc. You may wish to include it
# from your ~/.xpdfrc using:
#    include /etc/xpdf/xpdfrc
# and then add additional settings.
#
# For complete details on config file syntax and available options,
# please see the xpdfrc(5) man page.
#
# http://www.foolabs.com/xpdf/
#
#========================================================================

#----- display fonts

# These map the Base-14 fonts to the Type 1 fonts that ship with
# ghostscript (gsfonts package).

displayFontT1 Times-Roman        /usr/share/fonts/type1/gsfonts/n021003l.pfb
displayFontT1 Times-Italic        /usr/share/fonts/type1/gsfonts/n021023l.pfb
displayFontT1 Times-Bold        /usr/share/fonts/type1/gsfonts/n021004l.pfb
displayFontT1 Times-BoldItalic        /usr/share/fonts/type1/gsfonts/n021024l.pfb
displayFontT1 Helvetica            /usr/share/fonts/type1/gsfonts/n019003l.pfb
displayFontT1 Helvetica-Oblique        /usr/share/fonts/type1/gsfonts/n019023l.pfb
displayFontT1 Helvetica-Bold        /usr/share/fonts/type1/gsfonts/n019004l.pfb
displayFontT1 Helvetica-BoldOblique    /usr/share/fonts/type1/gsfonts/n019024l.pfb
displayFontT1 Courier            /usr/share/fonts/type1/gsfonts/n022003l.pfb
displayFontT1 Courier-Oblique        /usr/share/fonts/type1/gsfonts/n022023l.pfb
displayFontT1 Courier-Bold        /usr/share/fonts/type1/gsfonts/n022004l.pfb
displayFontT1 Courier-BoldOblique    /usr/share/fonts/type1/gsfonts/n022024l.pfb
displayFontT1 Symbol            /usr/share/fonts/type1/gsfonts/s050000l.pfb
displayFontT1 ZapfDingbats        /usr/share/fonts/type1/gsfonts/d050000l.pfb

# If you need to display PDF files that refer to non-embedded fonts,
# you should add one or more fontDir options to point to the
# directories containing the font files.  Xpdf will only look at .pfa,
# .pfb, and .ttf files in those directories (other files will simply
# be ignored).

#fontDir        /usr/local/fonts/bakoma

#----- PostScript output control

# Set the default PostScript file or command.

psFile            "|lpr"

# Set the default PostScript paper size -- this can be letter, legal,
# A4, or A3.  You can also specify a paper size as width and height
# (in points). Xpdf uses the paper size in /etc/papersize by default.

#psPaperSize        letter

#----- text output control

# Choose a text encoding for copy-and-paste and for pdftotext output.
# The Latin1, ASCII7, and UTF-8 encodings are built into Xpdf.  Other
# encodings are available in the language support packages.

#textEncoding        UTF-8

# Choose the end-of-line convention for multi-line copy-and-past and
# for pdftotext output.  The available options are unix, mac, and dos.

#textEOL        unix

#----- misc settings

# Enable Type 1 font rasterizing with t1lib. Default "yes".

#enableT1lib        no

# Enable TrueType and Type 1 font rasterizing with FreeType. Default "yes".

#enableFreeType        no

# Enable anti-aliasing of fonts. Default "yes".

#antialias        no

# Set the command used to run a web browser when a URL hyperlink is
# clicked.

urlCommand    "sensible-browser '%s'"

# Include the language configuration file list generated by update-xpdfrc
include /etc/xpdf/includes

- 作者: JustinLei 2005年11月11日, 星期五 10:07  回复(0) |  引用(1) 加入博采

Debian输入法 SCIM 配置文件
下载scim

(root权限):apt-get install scim.*

(root权限):在/etc/X11/Xsession.d目录下创建文件95xinput

内容:
export XMODIFIERS=@im=SCIM ; export GTK_IM_MODULE=scim ; scim -d

- 作者: JustinLei 2005年11月11日, 星期五 10:02  回复(0) |  引用(1) 加入博采

Make File
1、使用 Make File编译-连结:

           Prompt> make –f <makefile >↵

2、Make File 规则 (与Turbo C++同)

   (i)   扩展名:*.mak

   (ii) 文本

   (iii) 格式,例如:

         one : one.o two.o three.o four.o       (执行one依赖于one.o,two,o,three.o,four.o)

           cc -o one one.o two.o three.o four.o   (只要有一个依赖项被更新,就执行)

         one.o : one.c                            (目标文件one.o依赖于one.c)

           cc -c one.c                            (只要依赖项更新,就执行)

         two.o : two.c                            (目标文件two.o依赖于two.c)

           cc -c two.c                            (只要依赖项更新,就执行)

         three.o : three.c                        (目标文件three.o依赖于three.c)

           cc -c three.c                          (只要依赖项更新,就执行)

         four.o : four.c                          (目标文件four.o依赖于four.c)

           cc -c four.c                           (只要依赖项更新,就执行)


- 作者: JustinLei 2005年11月11日, 星期五 09:36  回复(0) |  引用(1) 加入博采

Emacs基本命令(移动)
移动命令:
C-f 向右移动一个字符
C-b 向左移动一个字符

M-f 向右移动一个词【中文是移动到下一个标点符号】
M-b 向左移动一个词【中文是移动到上一个标点符号】

C-n 移动到下一行
C-p 移动到上一行

C-a 移动到行首
C-e 移动到行尾

M-a 移动到句首
M-e 移动到句尾



上一行 C-p
:
:
向左移 C-b .... 目前光标位置 .... 向右移 C-f
:
:
下一行 C-n

删除命令:
删除光标前的一个字符
C-d 删除光标后的一个字符

M- 移除光标前的一个词
M-d 移除光标后的一个词

C-k 移除从光标到“行尾”间的字符
M-k 移除从光标到“句尾”间的字符

- 作者: JustinLei 2005年11月10日, 星期四 10:22  回复(0) |  引用(1) 加入博采

用gnus 收发邮件、泡新闻组

设置新闻服务器

启动 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.

- 作者: JustinLei 2005年11月8日, 星期二 21:48  回复(1) |  引用(1) 加入博采

Eclipse家族法则(促成者)

促成者:

1.邀请法则(Invitation Rule):尽可能的邀请别人为你的作品做出贡献

2.懒加载法则(Lazy Loading Rule):只有在真正需要的时候才加载插件

3.安全平台法则(Safe Platform Rule):作为扩展点的提供者,你必须保护好自己,不要让扩展者的误操作给你造成损失

4.公平竞赛法则(Fair Play Rule):所有使用者遵守同样的游戏规则,包括我自己

5.明确扩展法则(Explicit Extension Rule):明确说明平台的什么地方可供扩展

6.发散性法则(Diversity Rule):一个扩展点接纳多个扩展

7.良好防御法则(Good Fences Rule):如果要交出程序的控制权,首先保护好你自己

8.用户决定法则(User Arbitration Rule):如果有多个选择,由用户决定使用哪个

9.明确API法则(Explicit API Rule):将API与插件内部使用的类分开

10.稳定性法则(Stability Rule):如果你已经开始邀请其他人作出贡献,就不要再改变规则

11.保守API法则(Defensive API Rule):只暴露你有信心的API,但同时也要做好准备暴露更多的API,因为使用者会邀请你这样做

- 作者: JustinLei 2005年11月8日, 星期二 13:53  回复(1) |  引用(1) 加入博采

传递和返回对象:传递句柄

将句柄传递进入一个方法时,指向的仍然是相同的对象。

public class PassHandles {
          static void f(PassHandles h) {
          System.out.println("h inside f(): " + h);
}
          public static void main(String[] args) {
                    PassHandles p = new PassHandles();
                    System.out.println("p inside main(): " + p);
          f(p);
         }
}


toString 方法会在打印语句里自动调用,而PassHandles 直接从Object 继承,没有toString 的重新定义。
因此,这里会采用toString 的Object 版本,打印出对象的类,接着是那个对象所在的位置(不是句柄,而
是对象的实际存储位置)。输出结果如下:
p inside main(): PassHandles@1653748
h inside f() : PassHandles@1653748
可以看到,无论p 还是h 引用的都是同一个对象。这比复制一个新的PassHandles 对象有效多了,使我们能
将一个参数发给一个方法。但这样做也带来了另一个重要的问题:别名问题

- 作者: JustinLei 2005年11月8日, 星期二 12:57  回复(0) |  引用(1) 加入博采