daily post 09/06/2008

Written by simon on September 6, 2008 – 8:30 pm

Posted under 书读百遍其意自现 | No Comments »

绑定Emacs和mutt,以IMAP方式访问Gmail

Written by simon on September 6, 2008 – 5:25 pm

本文的目的:在Emacs下利用Mutt,以IMAP方式完成Gmail邮箱的绑定。

简单的介绍一下情况:作为一个超级伪Emacs狂热者,我希望打开计算机的一切活动都在Emacs下完成,当然也包括收发Email了。今天的笔记主要涉及到在Emacs-unicode-2下使用mutt,以IMAP的方式完成gmail邮件的相关操作。不用pop3的原因是,imap要比pop3的方式更好更强大。

(为什么不用GUI格式的程序,比如evolution或者thunderbird?evolution我没使用过,基本上此前一直是在用thunderbird的,在debian下它被起名为icedove──关于debian下将firefox thunderbird等mozilla program的程序改名的比较详细的介绍,请参阅wikipedia的Mozilla Software Rebranding辞条──Icedove第一个问题是速度比较慢,配置中文字体和不同的字符编码又比较麻烦,更让人不爽的是,它的imap功能很慢,经常是点选了一封邮件之后程序就会处于较长时间的假死状态,不知道到底是在读取gmail服务器的数据呢,还是什么都没有干。时间长了就颇有些不爽。第三,我需要经常更换计算机,在教研室使用一台,在宿舍使用另一台,而至少从我目前的观点来看,thunderbird程序的配置文件很不方便迁移,要是可以像mutt这样仅仅将一个~/.mutt带走拷贝到别的机器上就能使用,就会方便得多)。

主要分为以下几个步骤来进行。
注1,本文是基于Debian/Ubuntu操作系统的,如果使用其他操作系统,请作出相应的调整。
注2,这只是初步的准备工作,目的仅仅是让mutt跑起来,将mutt和emacs整合起来。更多功能还是要各位自己看文档自己总结和试验,比如邮件分类,等等。

1.前期准备工作:在emacs中配置emacsclient

Mutt是个字符终端的邮件处理程序,如果我们希望用emacs作为处理信件内容的文本编辑器,需要在emacs中设置emacsclient。它的基本工作机理是:将emacs程序设置为emacs server,这样比如mutt等程序在emacsclient模式中需要调用emacs时,以client身份向作为server的emacs发送请求,emacs接受这个client请求,并做出相应处理。

说起来似乎很复杂,做起来一行代码就可以了。在~/.emacs文件中加入

  (server-start)

这一行,保存,退出,重新启动emacs即可。另一个解决方案是可以在emacs中运行M-x start,在每次需要进入emacs server模式的时候运行一遍该命令。

2.mutt的安装和配置

没有mutt?安装一下就可以了

sudo apt-get install mutt

mutt文件主要放置在根目录下的.mutt中。可以自己创建之,并进入该目录下。

mkdir ~/.mutt/
cd ~/.mutt

然后就是~/.mutt/muttrc文件的配置工作了,主要是围绕imap模式访问gmail邮箱而展开。

emacs ~/.mutt/muttrc

加入如下代码:

    ## ~/.mutt/muttrc
    set from=yourusername@gmail.com
# 你在gmail.com的邮箱地址
    set realname="Simon"
# 比如,王小二
    set reverse_name=yes
    set reverse_realname=no
    set imap_user = 'yourusername@gmail.com'
#gmail邮箱的IMAP用户名嗯
    set spoolfile = imaps://imap.gmail.com:993/INBOX
    #set sendmail="/usr/sbin/ssmtp -C$HOME/.mutt/ssmtp.conf"
    set smtp_url="smtp://yourusername@smtp.gmail.com:587/"
#也是要把yourusername替换成相应的你的用户名
    set folder = "imaps://imap.gmail.com:993"
    #set record=+sent-mail-`date +%Y`
    set record="+[Gmail]/Sent Mail"
    set postponed="+[Gmail]/Drafts"
    # previously do:  mkdir -p ~/.mutt/cache/{headers,bodies}
    set header_cache="~/.mutt/cache/headers"
    set message_cachedir="~/.mutt/cache/bodies"
    set certificate_file=~/.mutt/certificates
    set move=no
    set delete=yes
    set edit_hdrs
    set include
    set reply_to
    set abort_nosubject=no
    alternates '(username|altusername)([-+].*)?@.*'
    set hdr_format="%4C %Z %{%m/%d} %-15.15F (%4c) %s" # format of the index

    hdr_order From: Date: User-Agent: X-Mailer To: Cc: Reply-To: Subject:
    ignore *
    unignore From: Date: User-Agent: X-Mailer To: Cc: Reply-To: Subject:
    my_hdr Reply-To:

    # setup gmail filters to apply the corresp. labels:
    mailboxes ! =ml-lug-list =ml-lug-org =[Gmail]/Drafts "=[Gmail]/All Mail"

    set editor="emacsclient %s"
	#在这行设置mutt使用的文本编辑器。我是使用的emacs,所以利用emacsclient来调用emacs,当然,也可以切换成别的:)
  	set alias_file=~/.mutt/mail_aliases
    source ~/.mutt/mail_aliases
    send-hook . 'set realname="Yanyuan Zhu"'
#换成相应的名字
    ## hack to make  $reverse_name and 'my_hdr From:' work ok (eg mlists)
    send-hook . 'set from=yourusername@gmail.com'
    send-hook . 'unmy_hdr From:'
    ###
    send-hook . 'set signature=~/Documents/.email_end'
#这行是email末尾的签名。在你的根目录某个位置下创建一个,并将地址填在上栏即可。或者如果你不需要这个签名,将该行用#注释掉。

以及,在.mutt目录下创建这个文件,是muttrc中需要的。留空即可,因为我暂时还没搞懂它是干什么用的:)

touch ~/.mutt/mail_aliases

3.mutt试验

在一个已经调配好了中文字体支持的字符终端下(比如urxvt, gnome-terminal),输入mutt,回车
mutt会提示输入密码,按照要求照做,imap读取了邮件列表之后,就进入mutt的页面了。
本文假定您已经掌握了基本的mutt操作,如果没有,请阅读mutt文档

是时候检测mutt和emacs的绑定是否成功了。首先确定两点:
1.Emacs和mutt均打开。
2.Emacs的server mode打开。

在mutt窗口下按m,写封信吧。输入对方的邮箱地址(To:),邮件标题(Subject:),回车。看看如果配置正确的话,emacs会出现反应,同时mutt程序窗口里会出现如下字样:

simon@simon:~/.mutt$ mutt
Waiting for Emacs...
Waiting for Emacs...

表示此时mutt在等待文本编辑器Emacs结束工作。

回到Emacs窗口中来,输入邮件正文后,怎么将Emacs中的文件传递回mutt中去呢?
两个方法,第一个很愚蠢,C-x C-c关闭emacs即可(不幸的是,这是我开始一直使用的方法...);第二个是用C-x #来将该buffer传递回给mutt。

现在再回到mutt窗口中,可以看到Attachments部分中有这个文件了。如果还要继续添加其他的附件,比如图片等,还可以用a命令进行后续操作。否则的话,按y发送即可──还需要输入smtp的用户名密码。

补充:mutt以emacsclient方式传递请求给文本编辑器emacs,emacs打开一个新的buffer后,会将该buffer保存在/tmp目录下。可以在/tmp中寻找相应标题的“草稿”来恢复该文档,在没有重新启动的前提下──重启后/tmp中的文件将被删除。

Share/Save/Bookmark

Tags: , , , , , , ,
Posted under linux | No Comments »

emacs tip: 合理利用windmove实现buffer之间的快速切换

Written by simon on September 6, 2008 – 12:10 am

emacs tip:

合理利用windmove实现buffer之间的快速切换

Emacs是个让人越来越爱不释手的好东东,几乎所有功能都能在emacs下完成。初看起来其貌不扬的小软件,用的多了渐渐体会到它的好处来。继续记笔记,随手将一些小功能整理一下发上来,供大家学习学习,共勉。

这次讲讲emacs下的分屏和窗口切换的操作。Emacs tutorial中对这部分的描述比较简单,也很容易能看懂。这里贴出来中文版的tutorial相关部分:

窗口操作

C-x 0 : 关闭当前窗口 C-x 1 : 将当前窗口最大化 C-x 2 : 垂直分割窗口 C-x 3 : 水平分割窗口 M-o (redefined) : 在窗口之间切换; C-x o 是默认命令 C-x 5 1/2/3/0 : 对frame类似的操作 C-x < : 窗口内容右卷 C-x > : 窗口内容左卷(这两个命令在垂直分割窗口后比较有用) (C-u) C-x ^ : 加高当前窗口,如果有C-u,则每次加高4行 (C-u) C-x } : 加宽当前窗口 (C-u) C-x { : 压窄当前窗口 ESC C-v : 在其它窗口进行卷屏操作
发件人 simon

所以本blog上的这张截图就是根据上述操作来作的。这样的好处很明显──可以方便一边看文档(参考资料等)一边写东西记笔记,而不用总是alt+tab切换窗口,切换到眼晕。根据official tutorial,在这几个窗口间迅速切换是用C-x o命令(((顺便提一下,切换不同的buffer用C-x b命令)。但是麻烦之处在于,如果开了四个窗口,很可能要按三次C-x o才能指挥光标到自己想要的那个窗口中去;右手离开键盘去摸鼠标来切换又很费事不方便。所以读文档,还好找到了解决方案:可以用windmove参数来搞定它。

打开~/.emacs文档,加入如下这一行

(windmove-default-keybindings 'meta)

保存,退出。重新打开emacs,就可以实现用Meta键+方向键的上下左右来控制光标迅速进入想进入的窗口了,怎么样,是不是方便多了:)

稍稍解释一下,这段话的作用是在emacs启动时自动将windmove功能键绑定在Meta上(在现在的键盘系统上,就是alt键),如果各位觉得这个不是很方便,也可以绑定到其他键上,这样对应的meta-up meta-down meta-left meta-right作相应的调整就行了。但记得要在终端命令行中运行

emacs --debug-init

检查一下是不是存在着键位冲突的情况。

Share/Save/Bookmark

Tags:
Posted under linux | No Comments »