ERC使用简介
作者: xwl

ERC, emacs irc client, 即是 emacs 里登录 irc 的客户端。irc 是什么? internet relay chat, 简单地说,就是用于群聊的。一帮无聊的 geeks 成天没事干,就在上面灌水,所以上面的 channel 技术类的占绝大数,比如 emacs, c++, debian, scheme 等等。
好,开始 ERC 之旅,先让我们登录到 #emacs-cn 上去:
a) M-x erc-select
host: irc.debian.org
port: 6667 到 7000 随便用一个
username: 先随便填一个,比如 foo
password: 还没注册的可以直接回车
b) 这时候你就进入了一个名字类似 “irc.debian.org:6669″ 的 server buffer. 接着执行:
ERC> /join #emacs-cn
就进入 #emacs-cn channel 啦!
c) 如何注册
切换到刚才那个 server buffer, 输入:
ERC> /msg nickserv help register
按着提示一步一步来就行,根据 irc server 的不同,有些会需要你用有效邮箱来确认一下。注册 id 的好处就是,这个 id 就不会被别人抢走了,比如有人已经用 foo 登录了,但这被你注册了,你连进去的时候,就能把名字抢过来,而对方可能会变成 foo` 之类的别名。
以上其实对于所有 irc client 来讲都是通用的。接下来是我的 ERC 一些配置供参考:
1. 基本设置
编码,尽量 utf-8 (#emacs-cn 也是用 utf-8):
(setq erc-default-coding-system '(utf-8 . utf-8)) |
如果某个 channel 是别的编码,也可以单独设置,例如国内某个 irc server 上 #linuxfire 就是用 gbk 编码,我们单独为它设置:
(setq erc-encoding-coding-alist '(("#linuxfire" . chinese-iso-8bit)) |
设置 nick, 全名: nick 就是登录时用的,full name 是别人查询你的时候显示的信息。(类似BBS 的 C-a )
1 2 | (setq erc-nick "xwl" erc-user-full-name "William Xu") |
2. 登录后自动加入预定的 channels
1 2 3 4 5 | (erc-autojoin-mode 1) (setq erc-autojoin-channels-alist '(("oftc.net" ; debian.org 是它的别名 "#debian-zh" "#emacs-cn"))) |
3. 连接服务器或进入聊天室后自动执行预设操作
ERC 提供各种各样的 hook 让你在某个操作(登入 server, 进入channel等)之后执行一些你预设的操作。比如如果你有某个 channel 的管理员权限,可以在加入聊天室时自动转换到管理员身份:
1 2 3 4 5 6 | (defun xwl-erc-auto-op () (let ((b (buffer-name))) (when (string= b "#emacs-cn") (erc-message "PRIVMSG" (concat "chanserv op " b))))) (add-hook 'erc-join-hook 'xwl-erc-auto-op) |
4. 过滤信息
如果你对某些消息或者某个人说的话特别感兴趣,我们可以通过关键字匹配对相关信息进行高亮。例如:
1 2 3 | (erc-match-mode 1) (setq erc-keywords '("emms" "python")) (setq erc-pals '("rms")) |
相反地,如果你对某些消息不感兴趣,比如有人进来啦,有人出去啦,如此这般一下就不会看到了:
1 2 3 | (setq erc-ignore-list nil) (setq erc-hide-list '("JOIN" "PART" "QUIT" "MODE")) |
5. 新信息提醒
信息一般可分为三种:
1) 某人悄悄跟你说话(即所谓的 private message),这会打开一个新小窗,即 buffer.
ERC>/msg NICK how are you doing
2) 某人公开地跟你说话,即别的在 channel 里的人也能看到。一般来说,习惯用 nick加 `:’ 表示。(要输入某人 nick 的时候,首字母加 TAB 就能帮你补全,一次不行,多 TAB 几次可以选择)
<xwl> ahei: 你可以 match regexp,
3) 别的情形。
ERC 会通过 erc-modified-channels-object 来设置 mode line,提示有新消息,类似:
[#o: 38, #emacs-cn: 5]
为什么要区分以上三种情形呢? 因为我们可以对不同信息,用不同的颜色在mode line 来提示,这样方便你决定是不是要及时地去查阅这条消息。
ERC 本身只在 mode line 提示新消息,如果你切换到别的程序去了,比如在firefox 里看 ppmm,还想被提醒的话,可以借助一些外部工具来实现。mac 下用 growl,linux 可以用 zenity,windows 不知有什么类似工具? 给个例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | (defun xwl-erc-text-matched-hook (match-type nickuserhost message) "Shows a growl notification, when user's nick was mentioned. If the buffer is currently not visible, makes it sticky." (when (and (erc-match-current-nick-p nickuserhost message) (not (string-match (regexp-opt '("Users" "User" "topic set by" "Welcome to " "nickname" "identified" "invalid" )) message))) (let ((s (concat "ERC: " (buffer-name (current-buffer))))) (case system-type ((darwin) (xwl-growl s message)))))) (add-hook 'erc-text-matched-hook 'xwl-erc-text-matched-hook) (defun xwl-growl (title message) (start-process "growl" " growl" growlnotify-command title "-a" "Emacs") (process-send-string " growl" message) (process-send-string " growl" "\n") (process-send-eof " growl")) |
6. 时间戳
(erc-timestamp-mode 1) |
下面这个变量可以控制时间戳的显示方式,比如位置什么的,默认值:
(setq erc-insert-timestamp-function 'erc-insert-timestamp-left) |
7. log
我们可以将 channel 里的聊天记录都保存下来,方便日后查询,或者有时候你的 emacs 突然挂掉的时候,还能找到挂之间有没有人对你说了什么。
1 2 3 4 5 6 7 8 9 10 | (require 'erc-log) (erc-log-mode 1) (setq erc-log-channels-directory "~/var/erc/" erc-save-buffer-on-part t erc-log-file-coding-system 'utf-8 erc-log-write-after-send t erc-log-write-after-insert t) (unless (file-exists-p erc-log-channels-directory) (mkdir erc-log-channels-directory t)) |
最后,ERC 上 irc 还是蛮舒服的,因为所有的、你熟悉的 emacs 编辑命令都在那里! 国内 irc 用户还是少了点,对岸台湾倒是蛮多的。大家有空就上来玩吧~ 要是想看我的配置可以在 github.com 上看我的配置文件:
http://github.com/xwl/xwl-emacs-config/blob/master/.emacs.d/site-lisp/config/xwl-erc.el
贴个图:

loading...
Good,真详细,用emacs上erc就可以少装个erc软件了。
[回复]
@d 回复:
十月 21st, 2010 at 5:00 下午
@Meteor Liu, 少装个erc软件是个什么意思?erc不就是emacs上的那个irc软件嘛?
[回复]
更正:”3. 对于已经注册的 ID,我可不想每次都要输入密码,用下面的方法可自动认证: (pwerc 存的是你的密码)”
例子不太好,实际上 erc-select 的时候正确输入密码的话,已经验证过了。更好的例子是,比如进入一个 channel 后,如果自己是管理员,自动完成身份转换:
(defun xwl-erc-auto-op ()
(let ((b (buffer-name)))
(when (string= b “#emacs-cn”)
(erc-message “PRIVMSG” (concat “chanserv op ” b)))))
(add-hook ‘erc-join-hook ‘xwl-erc-auto-op)
[回复]
嗯,讲得细致好懂
贴两个简单的:
; 设置滚动,保持输入在当前窗口的最后一行
(add-hook ‘erc-mode-hook ‘erc-add-scroll-to-bottom)
;;设定聊天时的行宽,方便阅读
(setq erc-fill-column 70)
[回复]
使用erc不可少的彩色昵称:
http://www.emacswiki.org/emacs/ErcNickColors
[回复]
ahei 回复:
三月 25th, 2010 at 1:34 上午
@hezhit, 不错不错。
[回复]
不错,最近每天都挂erc,有个问题,就是不知道怎么调出历史输入,就像很多shell下up方向键的功能
ps. 很感谢这个blog,希望这里能一直活跃下去。
[回复]
ahei 回复:
三月 25th, 2010 at 3:57 下午
M-n和M-p Emacs下使用类似bash的软件, 原C-n和C-p等调用历史输入的快捷键都变成M-n和M-p
ps. 我很感谢本站的作者,只能靠他们本站才能一直活跃下去,也要感谢众emacser们的支持,也很希望众emacser们学习到了新东西后能投稿,和大家一起分享。只有靠大家一起努力,本站才能一直保持活跃,也才能为让emacs在国内流行起来尽绵薄之力。
[回复]
请问Emacs默认自带的的中文输入法字符集很小,好多字不能输入,是gb2312的吧,怎么才能扩大一点呢,使用Linux的时候有需要在console下输入汉字,所以只好使用Emacs里的.Vim的输入法插件倒是很牛的,字符集比较大,生僻字也能输入.
另外,在Windows上使用ERC的时候,会有乱码的,博主怎么解决的?
[回复]
ahei 回复:
三月 25th, 2010 at 3:51 下午
console?完全的终端环境吗?如果只是用模拟终端软件登录的话, 可以使用系统的输入法啊. 虽然我没用过emacs输入法, 但是现在emacs已经内置Unicode啦. erc乱码? 是你的编码和irc服务器的编码不一致吧, 文章里有介绍怎样设置你的erc编码.
[回复]
tmpistemp 回复:
三月 26th, 2010 at 3:43 上午
@ahei, 完全终端环境,控制台上,所以只能使用
Emacs自带的输入法,请问怎么扩展下?或者说,有没有字符集比较大一点的输入法呢?
另外,ERC是部分乱码,不是全乱,而且一个人说话的时候有时候乱码,有时候不乱码.
[回复]
ahei 回复:
三月 26th, 2010 at 3:46 上午
@tmpistemp, 完全控制台阿,那我就不清楚了,没有用过emacs自带的输入法,不过控制台下不也有汉字输入法吗,你可以试试阿,或者你去水木Emacs版问问emacs输入法吧。
乱码的问题,就等作者来回答你吧。我也不清楚了。
[回复]
tmpistemp 回复:
三月 26th, 2010 at 4:28 上午
@ahei, 水木清华那里我不能发言啊,邮件也验证了,是不是要清华的学生才行?
[回复]
ahei 回复:
三月 26th, 2010 at 4:54 上午
@tmpistemp, 不是的,你只要注册下就行了,不过注册的时候要用相对真实的资料。
[回复]
tmpistemp 回复:
三月 26th, 2010 at 3:54 上午
@ahei, 对了,另外,你找到比较好的行号插件没?我现在
使用的行号插件不能智能的按行号字符个数控制显示宽度,必须预定义,定义为4位的话,即使现在
只有个位数,也会占据4个列,请问有没有比较智能的,1位的行数就占据一列,2,3…位的时候就智能
扩展列数的?我看其他软件,Vim或者gedit之类都是能这样的.
而且当命令输入框的文字太长,以至于达到两行的时候,Emacs就会死循环,关也关不掉.
我使用的是wb-line-number.el.
[回复]
ahei 回复:
三月 26th, 2010 at 6:08 上午
@tmpistemp, 用linum吧,linum在Emacs 23里面已经成为内置的行号显示插件了,所以它的bug应该是行号显示插件中最少的。你说的那个,目前我还没见过,我会试着改下linum看能不能搞定,到时候搞定的话会告诉你的。
[回复]
tmpistemp 回复:
三月 26th, 2010 at 9:14 上午
@ahei, 好啊,谢谢了!
[回复]
tmpistemp 回复:
三月 26th, 2010 at 9:22 上午
@ahei, 很感谢,发现linum非常好用,还能自动扩展.
发现”与时俱进”果然很重要,没事也要多逛逛Emacswiki了.
[回复]
ahei 回复:
三月 26th, 2010 at 9:30 上午
@tmpistemp, 自动扩展?是你上面说的像vi那样吗?对了,我突然发现vi也不是自动扩展的,如果文件最大行行号是4位数的话,那么它显示文件第一行的时候,也需要占4列的,我记得有软件可以实现真正的自动扩展的,比如当前屏幕的最大行号是2位数,即使文件最大行行号位数是4的话,也只会显示2列的,貌似是ultraedit。linum默认的就是和vi显示行号的功能是一样的,我说我要改linum就是改成我说的那种真正的“自动扩展”。
[回复]
ahei 回复:
三月 26th, 2010 at 9:30 上午
@tmpistemp, 对了,你说的那个minibuffer里面,输入命令太长的话,emacs会死掉的现象,我没有碰到过,你可以通过“二分调试法”来查下问题。
[回复]
tmpistemp 回复:
三月 26th, 2010 at 9:59 上午
@ahei, 我原来使用Perl脚本启动Emacs,还以为是Perl的问题,后来直接启动也有问题,才知道是行号脚本的问题,去掉后已经没有这个问题了,反正现在有更好的行号,不用以前那个了.
期待你的改进快成功.
[回复]
tmpistemp 回复:
三月 26th, 2010 at 9:30 上午
@ahei, 哈哈,我贪得无厌,如果能按显示的区域的行号的位数来显示列数就更好了.
[回复]
ahei 回复:
三月 26th, 2010 at 9:31 上午
@tmpistemp, 哈哈,我想改成的目标就是这个。
[回复]
tmpistemp 回复:
三月 27th, 2010 at 8:24 上午
@ahei, 进展怎么样?
[回复]
ahei 回复:
三月 28th, 2010 at 1:28 上午
还没弄,表急,我弄好了会告诉你的, 弄不好也会告诉你的.
[回复]
ahei 回复:
四月 2nd, 2010 at 5:48 上午
@tmpistemp, 弄好了,看Emacs才是世界上最强的IDE - 用linum+智能显示行号
[回复]
xwl 回复:
三月 26th, 2010 at 4:25 上午
@tmpistemp, 关于 windows 上 erc 乱码:我也同时在 windows 上使用 erc, 使用的是相同的配置。是不是你的字体问题?这句话的有?(setq erc-default-coding-system ‘(utf-8 . utf-8))
[回复]
tmpistemp 回复:
三月 26th, 2010 at 4:29 上午
@xwl, 有这句
[回复]
恩,这个文件要放到那里呢,怎么使用?
[回复]
ahei 回复:
四月 11th, 2010 at 10:01 上午
@notgoogd, erc是Emacs内置的, 无需你自己安装.
[回复]
请问怎么查询某个房间的编码是utf8还是gbk?
[回复]
ahei 回复:
四月 22nd, 2010 at 1:15 下午
@tmpistemp, 我不怎么用erc,你可以直接去问作者
[回复]
tmpistemp 回复:
四月 23rd, 2010 at 4:26 上午
@ahei, 我发现了,Windows下utf8的时候使用ERC才会乱码的,Linux上就不会乱码,显示的很好.
[回复]
halida 回复:
八月 2nd, 2010 at 7:55 上午
@tmpistemp, 这个问题如何解决呢?
[回复]
tmpistemp 回复:
十月 19th, 2010 at 6:25 下午
@halida, 唉,到现在还是没有解决这个问题,好烦
[回复]
像截图显示那样的nickname和消息对齐是怎么弄的?
看过xwl-erc.el,没看明白哪部分是相关的配置
[回复]
xwl 回复:
三月 3rd, 2011 at 12:42 下午
@Louis.Wen,
(erc-fill-mode 1)
(setq erc-fill-function ‘erc-fill-static
erc-fill-static-center 10
erc-fill-prefix nil)
[回复]
Louis.Wen 回复:
三月 3rd, 2011 at 4:03 下午
@xwl,
嗯,范围缩小好查看一些,明白了
另,
(defun xwl-erc-format-nick (&optional user channel-data)
“Like `erc-format-nick’ but trim nick to a fixed length. ”
(let ((nick (erc-format-nick user channel-data)))
(when (> (length nick) 7)
(setq nick (concat (substring nick 0 4)
“..”
(substring (substring nick 7) -1))))
nick))
中(substring nick 7)一句是否可以拿掉?
只取最后一个字符
[回复]
xwl 回复:
三月 3rd, 2011 at 4:17 下午
@Louis.Wen, 可以,并且应该拿掉,替换成 nick..
[回复]
为什么emacs-cn上基本就没有人出没,还是去emacs把。。。汗
[回复]