首页 > 中级, 其他 > ERC使用简介

ERC使用简介

2010年3月22日 ahei 发表评论 阅读评论

作者: 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

贴个图:

Emacs中的IRC

分享家:Addthis中国
GD Star Rating
loading...
ERC使用简介, 9.3 out of 10 based on 8 ratings 标签:ahei, ann, C/C++, Emacs, emms, erc, IDE, irc, org, python, screenshot, text, windows, 补全, 配色, 配色, 颜色

相关日志

分类: 中级, 其他
  1. Meteor Liu
    2010年3月22日06:22 | #1

    Good,真详细,用emacs上erc就可以少装个erc软件了。

    [回复]

    @d 回复:

    @Meteor Liu, 少装个erc软件是个什么意思?erc不就是emacs上的那个irc软件嘛?

    [回复]

  2. 2010年3月22日07:26 | #2

    更正:”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)

    [回复]

  3. 2010年3月23日12:24 | #3

    嗯,讲得细致好懂

    贴两个简单的:

    ; 设置滚动,保持输入在当前窗口的最后一行
    (add-hook ‘erc-mode-hook ‘erc-add-scroll-to-bottom)

    ;;设定聊天时的行宽,方便阅读
    (setq erc-fill-column 70)

    [回复]

  4. hezhit
    2010年3月24日17:27 | #4

    使用erc不可少的彩色昵称:
    http://www.emacswiki.org/emacs/ErcNickColors

    [回复]

    ahei 回复:

    @hezhit, 不错不错。

    [回复]

  5. pubby
    2010年3月25日12:05 | #5

    不错,最近每天都挂erc,有个问题,就是不知道怎么调出历史输入,就像很多shell下up方向键的功能

    ps. 很感谢这个blog,希望这里能一直活跃下去。

    [回复]

    ahei 回复:

    M-n和M-p Emacs下使用类似bash的软件, 原C-n和C-p等调用历史输入的快捷键都变成M-n和M-p
    ps. 我很感谢本站的作者,只能靠他们本站才能一直活跃下去,也要感谢众emacser们的支持,也很希望众emacser们学习到了新东西后能投稿,和大家一起分享。只有靠大家一起努力,本站才能一直保持活跃,也才能为让emacs在国内流行起来尽绵薄之力。

    [回复]

  6. tmpistemp
    2010年3月25日14:58 | #6

    请问Emacs默认自带的的中文输入法字符集很小,好多字不能输入,是gb2312的吧,怎么才能扩大一点呢,使用Linux的时候有需要在console下输入汉字,所以只好使用Emacs里的.Vim的输入法插件倒是很牛的,字符集比较大,生僻字也能输入.
    另外,在Windows上使用ERC的时候,会有乱码的,博主怎么解决的?

    [回复]

    ahei 回复:

    console?完全的终端环境吗?如果只是用模拟终端软件登录的话, 可以使用系统的输入法啊. 虽然我没用过emacs输入法, 但是现在emacs已经内置Unicode啦. erc乱码? 是你的编码和irc服务器的编码不一致吧, 文章里有介绍怎样设置你的erc编码.

    [回复]

    tmpistemp 回复:

    @ahei, 完全终端环境,控制台上,所以只能使用
    Emacs自带的输入法,请问怎么扩展下?或者说,有没有字符集比较大一点的输入法呢?

    另外,ERC是部分乱码,不是全乱,而且一个人说话的时候有时候乱码,有时候不乱码.

    [回复]

    ahei 回复:

    @tmpistemp, 完全控制台阿,那我就不清楚了,没有用过emacs自带的输入法,不过控制台下不也有汉字输入法吗,你可以试试阿,或者你去水木Emacs版问问emacs输入法吧。
    乱码的问题,就等作者来回答你吧。我也不清楚了。

    [回复]

    tmpistemp 回复:

    @ahei, 水木清华那里我不能发言啊,邮件也验证了,是不是要清华的学生才行?

    [回复]

    ahei 回复:

    @tmpistemp, 不是的,你只要注册下就行了,不过注册的时候要用相对真实的资料。

    [回复]

    tmpistemp 回复:

    @ahei, 对了,另外,你找到比较好的行号插件没?我现在
    使用的行号插件不能智能的按行号字符个数控制显示宽度,必须预定义,定义为4位的话,即使现在
    只有个位数,也会占据4个列,请问有没有比较智能的,1位的行数就占据一列,2,3…位的时候就智能
    扩展列数的?我看其他软件,Vim或者gedit之类都是能这样的.
    而且当命令输入框的文字太长,以至于达到两行的时候,Emacs就会死循环,关也关不掉.
    我使用的是wb-line-number.el.

    [回复]

    ahei 回复:

    @tmpistemp, 用linum吧,linum在Emacs 23里面已经成为内置的行号显示插件了,所以它的bug应该是行号显示插件中最少的。你说的那个,目前我还没见过,我会试着改下linum看能不能搞定,到时候搞定的话会告诉你的。

    [回复]

    tmpistemp 回复:

    @ahei, 好啊,谢谢了!

    [回复]

    tmpistemp 回复:

    @ahei, 很感谢,发现linum非常好用,还能自动扩展.
    发现”与时俱进”果然很重要,没事也要多逛逛Emacswiki了.

    [回复]

    ahei 回复:

    @tmpistemp, 自动扩展?是你上面说的像vi那样吗?对了,我突然发现vi也不是自动扩展的,如果文件最大行行号是4位数的话,那么它显示文件第一行的时候,也需要占4列的,我记得有软件可以实现真正的自动扩展的,比如当前屏幕的最大行号是2位数,即使文件最大行行号位数是4的话,也只会显示2列的,貌似是ultraedit。linum默认的就是和vi显示行号的功能是一样的,我说我要改linum就是改成我说的那种真正的“自动扩展”。

    [回复]

    ahei 回复:

    @tmpistemp, 对了,你说的那个minibuffer里面,输入命令太长的话,emacs会死掉的现象,我没有碰到过,你可以通过“二分调试法”来查下问题。

    [回复]

    tmpistemp 回复:

    @ahei, 我原来使用Perl脚本启动Emacs,还以为是Perl的问题,后来直接启动也有问题,才知道是行号脚本的问题,去掉后已经没有这个问题了,反正现在有更好的行号,不用以前那个了.
    期待你的改进快成功.

    [回复]

    tmpistemp 回复:

    @ahei, 哈哈,我贪得无厌,如果能按显示的区域的行号的位数来显示列数就更好了.

    [回复]

    ahei 回复:

    @tmpistemp, 哈哈,我想改成的目标就是这个。

    [回复]

    tmpistemp 回复:

    @ahei, 进展怎么样?

    [回复]

    ahei 回复:

    还没弄,表急,我弄好了会告诉你的, 弄不好也会告诉你的.

    [回复]

    ahei 回复:

    @tmpistemp, 弄好了,看Emacs才是世界上最强的IDE - 用linum+智能显示行号

    [回复]

    xwl 回复:

    @tmpistemp, 关于 windows 上 erc 乱码:我也同时在 windows 上使用 erc, 使用的是相同的配置。是不是你的字体问题?这句话的有?(setq erc-default-coding-system ‘(utf-8 . utf-8))

    [回复]

    tmpistemp 回复:

    @xwl, 有这句

    [回复]

  7. notgoogd
    2010年4月11日09:05 | #7

    恩,这个文件要放到那里呢,怎么使用? :oops:

    [回复]

    ahei 回复:

    @notgoogd, erc是Emacs内置的, 无需你自己安装.

    [回复]

  8. tmpistemp
    2010年4月22日12:16 | #8

    请问怎么查询某个房间的编码是utf8还是gbk?

    [回复]

    ahei 回复:

    @tmpistemp, 我不怎么用erc,你可以直接去问作者

    [回复]

    tmpistemp 回复:

    @ahei, 我发现了,Windows下utf8的时候使用ERC才会乱码的,Linux上就不会乱码,显示的很好.

    [回复]

    halida 回复:

    @tmpistemp, 这个问题如何解决呢?

    [回复]

    tmpistemp 回复:

    @halida, 唉,到现在还是没有解决这个问题,好烦

    [回复]

  9. Louis.Wen
    2011年3月3日11:14 | #9

    像截图显示那样的nickname和消息对齐是怎么弄的?
    看过xwl-erc.el,没看明白哪部分是相关的配置

    [回复]

    xwl 回复:

    @Louis.Wen,

    (erc-fill-mode 1)
    (setq erc-fill-function ‘erc-fill-static
    erc-fill-static-center 10
    erc-fill-prefix nil)

    [回复]

    Louis.Wen 回复:

    @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 回复:

    @Louis.Wen, 可以,并且应该拿掉,替换成 nick.. :)

    [回复]

  10. sinners
    2012年1月14日18:47 | #10

    为什么emacs-cn上基本就没有人出没,还是去emacs把。。。汗

    [回复]

  1. 2010年8月4日03:19 | #1
:wink: :-| :-x :twisted: :) 8-O :( :roll: :-P :oops: :-o :mrgreen: :lol: :idea: :-D :evil: :cry: 8) :arrow: :-? :?: :!: