mirror of
https://github.com/beyondx/Notes.git
synced 2026-02-09 05:15:12 +08:00
330 lines
21 KiB
Plaintext
330 lines
21 KiB
Plaintext
Content-Type: text/x-zim-wiki
|
||
Wiki-Format: zim 0.4
|
||
Creation-Date: 2011-05-07T10:01:10+08:00
|
||
|
||
====== Emacs Gnus 的基本配置与使用 ======
|
||
http://www.ibm.com/developerworks/cn/linux/l-cn-emacsgnus/index.html
|
||
林绪虹 (WaterLin1999@gmail.com), 软件工程师, 西艾(广州)软件开发有限公司
|
||
|
||
简介: 本文将详细介绍用 Emacs Gnus 上新闻组、收发邮件的基本配置方法,基本的使用技巧等。通过这篇文章,对 Gnus 建立起基本的概念,并能满足日常的 Gnus 使用。
|
||
|
||
===== 导言 =====
|
||
|
||
Emacs Gnus 是 Emacs 用来收发邮件与上新闻组的一个模式。你也许会问,现在漂亮的邮件客户端程序非常多,比如 Thunderbird,Outlook 等,使用起来非常方便,为什么还要用 Emacs Gnus 这样黑乎乎的老怪物呢?
|
||
|
||
和 Emacs 的其他模式一样,Gnus 初一看上去并没有让人喜欢它的理由。但是,如果你喜欢使用 Emacs,**喜欢 Emacs 快速便捷的编辑功能与高定制性**,日常工作中也需要处理大量的邮件与新闻组阅读,那么你一定得试一试 Emacs Gnus 这个以灵活性著称的工具。
|
||
|
||
和 Emacs 一样,Gnus 的入门曲线有点陡峭,本文的目的就是为你提供一个最基本的中文 Gnus 学习指南。在学习本文之前,你必须能熟练使用 Emacs,了解最基本的 elisp 语法,以及明白新闻组的基本理念。
|
||
|
||
现在的 Emacs 版本已经自带了 Gnus 模式,直接用命令 __M-x gnus __就可以启动 Gnus 模式了,你还可以用命令 __M-x gnus-other-frame__ 新开一个 Emacs 窗口来单独处理 Gnus 有关的操作。
|
||
|
||
Emacs 是一个**单线程**程序,而 Gnus 在网络 I/O 上要花费大量的时间,在运行 Gnus 的时候可能会导致你的 Emacs 无法动弹、假死掉,所以如果你的邮件或是新闻组比较多,那就最好重开一个 Emacs 专门用来处理类似的事情。
|
||
|
||
不过先别着急启动 Gnus,我们需要对 Gnus 做一些基本的配置。
|
||
|
||
|
||
===== Emacs Gnus 的基本配置 =====
|
||
|
||
默认情况下,Gnus 的所有配置都是放到__ ~/.gnus.el__这个文件里,这个文件对于 Gnus 的作用,就像是 .emacs之于 Emacs 的作用一样,Gnus 根据文件 ~/.gnus.el里的配置进行相关的定制与操作。
|
||
|
||
我们现在就通过 .gnus.el文件来对 Gnus 进行一些最基本的配置。
|
||
|
||
==== 配置读取新闻组的服务器 ====
|
||
|
||
首先,我们应该配置从哪个服务器来读取新闻组的信息。把下面这一行放到 ~/.gnus.el文件里:
|
||
|
||
__ (setq gnus-select-method '(nntp "news.somewhere.cn"))__
|
||
|
||
|
||
这表明我们想从 news.somewhere.cn 这个服务器读取新闻组的信息。
|
||
|
||
如果是在国内,可以使用 news.cn99.com 这个新闻组服务器,我觉得还不错。
|
||
|
||
==== 配置显示的用户名与邮箱 ====
|
||
|
||
相信你在新闻组回帖或是跟帖的时候,想让别人能看到你的名字以及 Email 吧?否则别人怎么知道你是谁、怎么跟你联系呢?
|
||
|
||
可以把下面的语句放到 .gnus.el里来设置在 Gnus 里显示的用户名与邮箱:
|
||
|
||
__(setq user-full-name "yourname") __
|
||
__ (setq user-mail-address "yourname@email.com") __
|
||
|
||
|
||
注意,这里填写的 Email 要求是有效的 Email 地址,否则 Emacs 在启动 Gnus 的时候会提示出错信息。
|
||
|
||
==== 配置 Gnus 来收取邮件 ====
|
||
|
||
既然我们在上面设置好了邮箱,最好能配置好 Gnus 通过 smtp 来发信以及通过 pop3 来收信,这样当我们想发信给某个作者的时候,就可以直接在 Gnus 里发邮件给作者。
|
||
|
||
如果你只需要用 Gnus 来读新闻组而不用收发邮件,则可以省略这一步,只需要用上面配置好的用户名与邮箱名就可以了。
|
||
|
||
配置的代码如下,你需要把相关的 pop3 和 smtp,以及用户名与密码等,改成你自己真实的信息,然后放到 .gnus.el文件里:
|
||
|
||
;; set email reader ;;告诉 Gnus 如何存放接收的邮件
|
||
(setq gnus-secondary-select-methods '((nnml "")))
|
||
|
||
;; set pop server
|
||
(setq mail-sources
|
||
'((pop :server "POP.MAIL.YAHOO.COM" ;; 在这里设置 pop3 服务器
|
||
:user "waterlin@ymail.com" ;; 用户名
|
||
:port "pop3"
|
||
:password "password"))) ;; 密码
|
||
|
||
;; set smtp
|
||
(setq smtpmail-auth-credentials
|
||
'(("SMTP.MAIL.YAHOO.COM" ;; SMTP 服务器
|
||
25 ;; 端口号
|
||
"waterlin@ymail.com" ;; 用户名
|
||
"yourpassword"))) ;; 密码
|
||
|
||
(setq smtpmail-default-smtp-server "SMTP.MAIL.YAHOO.COM")
|
||
(setq smtpmail-smtp-server "SMTP.MAIL.YAHOO.COM")
|
||
(setq message-send-mail-function 'smtpmail-send-it)
|
||
|
||
|
||
这里需要说明的是,通过第一行代码,我们告诉 Gnus 如何存放接收的邮件,Gnus 把这个叫做__后台 ( back end )__,最常用的方式是 nnfolder,另外还有 nnmbox, nnml等其它几种方式,我们选择其中一种就可以了,更详细的信息可以参考 Gnus 的官方手册。
|
||
|
||
|
||
==== Gnus 里缓冲区的基本结构 ====
|
||
|
||
通过上面最简单、最基本的配置,我们已经可以使用 Gnus 了。用命令 M-x gnus开始进行新闻组、邮件阅读。
|
||
|
||
一启动,就可以看到如下默认的 Group Buffer 了:
|
||
|
||
图 1. Gnus 默认分组
|
||
图 1. Gnus 默认分组
|
||
|
||
总的来说,Gnus 分为三大缓冲区 ( Buffer ):
|
||
|
||
Group 缓冲区,Summary 缓冲区以及 Article 缓冲区,分别显示为 *Group*,*Summary*, *Article* 这样三个名称。
|
||
|
||
*Group* 缓冲区用来显示新闻组以及邮件分组的列表,而 *Summary* 缓冲区则显示特定新闻组或邮件文件夹里的文章列表,*Article* 缓冲区则显示指定文章的全部内容。
|
||
|
||
总的来说,我们每次都是按 Group Buffer --> Summary Buffer --> Article Buffer 这样的顺序来进行新闻组或邮件阅读。
|
||
|
||
和在 Emacs 里进行文本编辑一样,在 *Group* 缓冲区里,你可以把光标上 ( C-p) 下 ( C-n) 移动到某个 group 上面,按回车就可以进入该新闻组或邮件文件夹进行阅读。上下移动的操作和一般的 Emacs 编辑操作完全相同。
|
||
|
||
在 *Summary* 缓冲区里,会显示出一长串的帖子列表,如果要读某个帖子,只要这个帖子的标题上按下空格或回车键就行了。按下 q键将返回到 *Group* 缓冲区里。
|
||
|
||
回页首
|
||
|
||
订阅新的新闻组
|
||
|
||
熟悉了 Gnus 的基本结构与操作后,我们需要添加一些新的、自己感兴趣的新闻组。
|
||
|
||
在 *Group* 缓冲区里,用命令 AA可以列出所有的新闻组列表,如图 2 所示:
|
||
|
||
图 2. Gnus 显示的新闻组列表清单
|
||
图 2. Gnus 显示的新闻组列表清单
|
||
|
||
如果想订阅某个新闻组,只要把光标放到你想要订阅的新闻组上,用命令 u就可以订阅该新闻组了。
|
||
|
||
订阅完了你需要的新闻组后,按 L则可以回到普通的 *Group* 缓冲区里;如果你只需要 Gnus 显示包含有未读邮件或文章的组,则用小写的 l即可。
|
||
|
||
如果你读了一段时间,觉得这个新闻组对你来说没有价值了,按 u则可以退订该新闻组。
|
||
|
||
这里值得提醒的是,当你按 u来退订某个新闻组时,并没有把它从你的列表里删除,只是让它处于“僵尸”状态(即哪怕有新的未读文章出现,Gnus 也不会让它打扰你),而你用命令 L依然能在列表里看到它,只是前面标记了一个大写的 U符号。如果你想彻底把这个新闻组从 *Group* 列表里删除的话,则要用 C-k命令。
|
||
|
||
回页首
|
||
|
||
新闻组里的发帖、回帖
|
||
|
||
在 *Group* 缓冲区里订阅了新闻组后,我们就可以通过 *Group* 缓冲区进入 *Summary* 缓冲区里进行新闻组阅读。
|
||
|
||
在新闻组里发帖子叫 post article,即相当于把文章贴到一个公告栏里供大家检索。发帖子的操作很简单,只要我们在 *Summary* 里按下 a这个键,Emacs 即会自动根据当前的状态设定相关参数,我们需要做的,只是填写帖子的标题 (subject) 和内容。写完后用快捷键 C-c C-c发出,如果写了一半想取消,则键入 C-c C-k删除。
|
||
|
||
在新闻组里回帖子叫 follow up,按下 f键就可以进入到回帖的编辑状态。但是用小写的 f 回帖并不引用原作者的文章,而在大多数情况下,为了方便别人承前启后的阅读,我们需要在回帖里引用原文,这时可以用 F这个命令。
|
||
|
||
如果你对某个文章很感兴趣,想回复或是联系作者,但是你并不想让别人知道这些内容(相信我,很多情况下是这样的),这时你就可以用 r或者 R键通过邮件来和作者私下聊聊,这个给原作者回信的动作叫做 reply to。这个操作与 follow up 不同,follow up 的时候,相当于你把你的回复贴在了一个公告栏里,凡是订阅了该新闻组的人都能读到你发出的帖子。这里要注意的是,你在回信给作者的时候,一定要记得确认他的邮件地址是否正确,因为很多人会用 伪装的地址邮件来发文章到新闻组里。
|
||
|
||
在 *Group* 和 *Summary* 缓冲区里上下移动的操作是相同,你还可以用 n移动到下一个未读新闻组或未读文章,用 p来移动到上一个未读文章或新闻组,用 C-n移动到下一个文章或是新闻组,用 C-p移动到上一个文章或是新闻组。
|
||
|
||
回页首
|
||
|
||
给帖子加标记
|
||
|
||
当你进行了一段时间的 Gnus 新闻组阅读后,相信你已经注意到了,当你读过一个帖子之后,Gnus 会自动在帖子的最左边加上一个或多个字母、符号,这就是标记。类似的标记还有好多种,这些标记有些是我们自己加上的,有些是 Gnus 自动加上的。这些标记表明了帖子的状态,是为了方便你判断帖子的状态而设计的,简洁高效。
|
||
|
||
要熟练、高效地用 Gnus 来进行新闻组阅读,就必须熟练掌握一些常用标记。总的来说,标记分为两大类,一类是“已读 (read)”标记,一般用字母表示,比如 R,r, O,E等等;另一类是“未读 (unread)”标记,一般用特殊符号表示,比如 !, ?, *等等。Gnus 针对帖子的状态,采取的处理方式截然不同。如果一个帖子被标记为“已读”并且没有保留标志,那么当你离开这个 group(用 q命令)以后,下次再进入的时候,你就不会再见到它了(当然,你可以要求 Gnus 把已读的帖子翻出来给你看),只有那些被标记为“未读”的帖子、新帖以及一些带有保留标记的帖子等才会显示给你看。
|
||
|
||
这些标记数量虽多,但和 Emacs 的其他功能一样,只要掌握了 20% 的内容,我们就可以胜任平时 80% 的工作,现把常用的标记及其含义整理如表 1 和表 2 所示。
|
||
|
||
表 1. 已读标记
|
||
命令 解释
|
||
R 每次你读完一篇帖子之后,Gnus 就会自动加上这个标记,表示这篇帖子你已经读过了,并且下次你再进入这个新闻组,默认并不显示该帖子。
|
||
r 表示当前帖子已读,但这个标记是你自己手动用 d 命令添加的,实际上你可能并没读过。有些文章,你一看到标题就没有阅读的胃口了,那就用 d 把它标记成已读吧,省时省力!
|
||
O 表示这是个老帖,上次新闻组阅读的时候你已经读过了。默认情况下,Gnus 并不会显示老帖,只有当你用 / o 命令时,才可以让 Gnus 把老贴翻出来。
|
||
|
||
|
||
表 2. 未读标记
|
||
命令 解释
|
||
! 保留 (ticked) 标记,带有这个标记的帖子将一直保持可见,如果你对某个帖子感兴趣,想留着方便以后的查阅,可以加上这个标记;如果有某个帖子,你想一直追踪与它相关的文章,那就可以把它标记为 !。注意:帖子标记为 ! 状态,并不是说这个帖子就永久保留下来了,如果这个帖子被管理员从新闻组服务器上删除了,那么你就再也看不到它了。新闻组服务器按照相应的设置,定期删除过期(expired)的老帖。对于一些真正有价值的文章,安全起见,你需要把它们保存到本地的硬盘里。
|
||
? 休眠 (dormant) 标记,标记当前的帖子进入“休眠状态”,即除非有人跟帖,否则你以后不会见到这个帖子。也就是说,平常这个帖子和标记为 R 的帖子没有差别,但是一旦有人跟帖,它就会自动显身,方便你联系上下文进行阅读。用 ? 命令可以加上这个标记。
|
||
空格 如果一个帖子前面什么符号也没有,就表示这是一个“未读”的帖子。
|
||
|
||
回页首
|
||
|
||
退出缓冲区
|
||
|
||
在任何一个缓冲区里(编辑邮件或是新闻组帖子的缓冲区除外),都可以按 q退出,如果是在 *Group* 缓冲区里,则会提示是否退出整个 Gnus。
|
||
|
||
回页首
|
||
|
||
基本操作的整理
|
||
|
||
不管是邮件还是新闻组里的操作,大体上基本相同,现在把上面提到的快捷键总结整理一下。
|
||
|
||
在 *Group* 缓冲区里,详细的操作命令如表 3 所示。
|
||
|
||
表 3. Group 缓冲区命令列表
|
||
命令 解释
|
||
RET 进入缓冲区
|
||
g 查看新的邮件或新闻组消息
|
||
q 退出
|
||
c 把当前光标所在组的所有文章标记为已读
|
||
C 把所有的组都标记为已读
|
||
l 显示带有未读消息的新闻组
|
||
L 显示已订阅的所有分组,包括不包含未读消息的分组
|
||
m 创建一个新邮件
|
||
a 创建一个新的新闻组帖子
|
||
u 订阅或取消订阅一个新闻组
|
||
AA 列出服务器上所有可读的新闻组
|
||
C-k 从订阅列表里删除某个新闻组
|
||
|
||
在 *Summary* 里,详细的操作命令如表 4 所示。
|
||
|
||
表 4. Summary 缓冲区命令列表
|
||
命令 解释
|
||
RET 进入当前文章
|
||
n 下一个未读文章
|
||
p 上一个未读文章
|
||
SPACE 向下翻页
|
||
DEL 向上翻页
|
||
F/f 跟帖 ( 引用原文 / 不引用原文 )
|
||
R/r 回复原作者 ( 引用原文 / 不引用原文 )
|
||
m 创建一个新邮件
|
||
a 创建一个新帖子
|
||
c 把所有的文章标记为已读
|
||
|
||
另外,如果当前的 *Summary* 缓冲区是一个邮件分组,则可以用 B DEL来删除当前的邮件;如果当前的 *Summary* 缓冲区是一个新闻组的话,你则没有权限来删除任何帖子(管理员除外)。
|
||
|
||
在 *Article* 缓冲区里,即在写新的邮件或是新闻组帖子的时候,详细的操作命令如表 5 所示。
|
||
|
||
表 5. Article 缓冲区命令列表
|
||
命令 解释
|
||
C-c C-c 发送正在编写的稿件
|
||
C-c C-d 把当前编辑的稿件保存为草稿
|
||
C-c C-k 删除当前正在编写的稿件
|
||
C-c C-m f 粘贴附件
|
||
M-q 重新排版段落
|
||
|
||
如果需要帮助,则用 C-h i gnus可以获得详细的帮助。
|
||
|
||
回页首
|
||
|
||
定制 Gnus ,添加更多特色功能
|
||
|
||
通过上面的基础教程,我们已经可以把 Gnus 用起来了,当然,我们不能仅仅满足于会用 Gnus,我们还可以定制更多我们喜欢的参数,从而把 Gnus 用好。
|
||
|
||
添加签名档
|
||
|
||
签名档几乎是新闻组里必不可少的一部分,通过签名档,可以让别人更快速地了解有关你的信息。你可以在签名档里添加有关对你自己的介绍,或是解释一下你的 Email,或者仅仅是写上几句牢骚。
|
||
|
||
如果我们需要为中文新闻组设定中文签名档,为英文新闻组设定英文签名档,则可以用 下面的代码来实现:
|
||
|
||
(setq gnus-posting-styles
|
||
'(
|
||
(".*" (signature-file "~/emacs/gnus/.signature_english"))
|
||
("cn.*" (signature-file "~/emacs/gnus/.signature_chinese"))
|
||
))
|
||
|
||
|
||
上面的代码用正则表达式来把新闻组和签名文件绑定起来,对于符合 cn.* 这样正则表达式的新闻组,则发帖的时候会自动在未尾加上文件 ~/emacs/gnus/.signature_chinese 里的内容;而对于其他的新闻组,则用英文签名档,即文件 ~/emacs/gnus/.signature_english 里的内容。这里注意,签名档不要太长,一来系统可能不允许,二来也的确是影响他人的阅读。
|
||
|
||
给邮件分组
|
||
|
||
如果你的邮件量巨大的话,把它们一股脑地放在同一个文件夹里,查阅起来太不方便了,也可能会错过重要的邮件。这个时候,我们需要做的就是利用正则表达式,把拣回来的邮件进行自动分组 ( splitting )。这里以用 nnml 方式收信为例,简单介绍一下 Gnus 的邮件分组技术。可以把下面的代码放到 .gnus.el 里:
|
||
|
||
;; set mail folder
|
||
(setq nnmail-split-methods
|
||
'(
|
||
("Emacs.org-mode" "^To:.emacs-orgmode@gnu.org")
|
||
("Emacs.general" "^Subject:.*emacs")
|
||
("Email.personal" "^To:.waterlin@ymail.com")
|
||
("Email.errors" "^From:.*\\(mailer.daemon\\|postmaster\\)")
|
||
))
|
||
|
||
|
||
在上面的代码里,我们把邮件列表里 emacs-orgmode@gnu.org 来的邮件都扔到组 nnml:Emacs.org-mode 里,把私人邮件都放到 nnml:Email.personal 里,把退信之类的错误邮件都放到 nnml:Email.errors 分组里。这样,我们一收回邮件,就可以先跑去集中查阅一下私人邮件,剩下有时间再看看 emacs-orgmode@gnu.org 邮件列表,最后有空再处理一下退回来的邮件。这对于提高我们的工作效率,大有帮助。
|
||
|
||
当然,有的时候我们也需要手工把邮件分组,用命令 B m(gnus-summary-move-article),然后输入 group 的名称就可以移动邮件到该组了。如果该组不存在,则会根据输入的名称创建。
|
||
|
||
如果需要移动多个邮件,则可以把它们都标记为 #(gnus-summary-mark-as-processable) ,然后再输入 B m(gnus-summary-move-article)。如果有一个消息标记错了,则可以用 M-#(gnus-summary-unmark-as-processable) 来取消。如果要取消所有已经标记成 #的消息,用命令 M P U(gnus-summary-unmark-all-processable) 即可。
|
||
|
||
Gnus 的邮件分组技术还有着更灵活的使用技巧,有兴趣深入了解的可以查阅一下 官方文档。
|
||
|
||
新闻组的刷新
|
||
|
||
当你在 *Summary* 缓冲区里(不管是邮件或是新闻组)阅读了一段时间以后,你可能想看看本组里有没有新的文章或邮件,这时用命令 M-g 就可以刷新该 *Summary* 缓冲区。
|
||
|
||
在 *group* 里,需要重新从服务器读取、刷新分组信息,按 g 就可以了。
|
||
|
||
设定更顺手的 Summary 缓冲区阅读操作
|
||
|
||
当你在 *Summary* 缓冲区里阅读帖子的时候,按了空格或是回车,即会把窗口分裂成上下两格(如图 3 所示),上面依然是 *Summary* 缓冲区,下面用来显示该帖子的具体内容。有的时候,下面的内容太长了不能在一个屏幕里显示出来,这个时候,你并不需要把焦点切换到下面的窗口,只需要用空格键来进行翻页。同时,可以用 DEL 键来往上翻页。很酷吧~~
|
||
|
||
图 3. Summary 分成上下两格
|
||
图 3. Summary 分成上下两格
|
||
|
||
当然,我们还可以干一件更酷的事,把下面这一行加到 .gnus.el里:
|
||
|
||
(define-key gnus-summary-mode-map (kbd "Backspace")
|
||
'gnus-summary-prev-page)
|
||
|
||
|
||
我们就可以用 Backspace键来向上翻动文章了,再也不用在键盘上找那个可怜的 Del键了。
|
||
|
||
Emacs Gnus 用假地址后带来的问题
|
||
|
||
如果你经常在 Usenet 上留下足迹,那么你可能会收到大量的垃圾邮件。很多垃圾邮件制造程序,会自动收集新闻组里的邮件地址并发送数量可观的垃圾邮件。要解决这个问题,只有对你留在 Usenet 上的邮件地址作文章了。
|
||
|
||
如果我们用一些方法 伪装了我们的 Email 地址,则我们很可能也不能用 Gnus 来发邮件了,因为你已经更新了默认的 email 地址。
|
||
|
||
我们可以通过设置不同的 发布风格来解决这个问题,可以通过正则表达式,用类似下面的发布风格来对新闻组的发信与普通邮件的发信给予区分,从而让留在新闻组里的邮件是一个假的邮件地址。把下面的代码放到你的 .gnus.el里:
|
||
|
||
(setq gnus-posting-styles
|
||
'(
|
||
(".*"
|
||
(signature-file "~/emacs/gnus/.signature_english")
|
||
(address "WaterLin@ymail.invalid"))
|
||
("cn.*"
|
||
(signature-file "~/emacs/gnus/.signature_chinese")
|
||
(address "WaterLin@ymail.invalid"))
|
||
("nnml:.*"
|
||
(signature-file "~/emacs/gnus/.signature_english")
|
||
(address "WaterLin@ymail.com"))
|
||
))
|
||
|
||
|
||
当然,如果你留了一个假地址在新闻组上,别忘了在你的签名档里解释一下。
|
||
|
||
回页首
|
||
|
||
实践
|
||
|
||
上面讲述了这些 Gnus 的基础知识后,和其他 Emacs 模式一样,只有通过大量的肌肉训练才能熟记这些命令,从而让操作变得高效起来。如果你跟着本文一直走到这里,相信你已经能熟练地应付 Gnus 的日常使用。如果你还有疑问,不妨学以致用,直接上 Gnus 的新闻组 gnu.emacs.gnus 上参与讨论吧!
|
||
|
||
参考资料
|
||
|
||
有关 Emacs 中的邮件功能请参考: http://sachachua.com/notebook/wickedcool/wc-emacs-06-gnus.html。
|
||
|
||
请参考一篇不错的教程:用 gnus 收发邮件、泡新闻组。
|
||
|
||
在 developerWorks Linux 专区寻找为 Linux 开发人员(包括 Linux 新手入门)准备的更多参考资料,查阅我们 最受欢迎的文章和教程。
|
||
|
||
在 developerWorks 上查阅所有 Linux 技巧和 Linux 教程。
|
||
|
||
关于作者
|
||
|
||
林绪虹是一名有着5年开发经验并有着 7 年 Emacs 使用经验的开发人员,过去的 7 年时间里,他利用 Emacs 进行写文档、个人知识管理以及基本的编程工作,Emacs 使他能高效地完成他的工作。他拥有机械电子工程专业硕士学位,技术兴趣广泛并喜欢技术写作,并拥有自己的技术博客。
|