近期的失败

最近,在使用 Linux 的时候,经历了两个失败。目前依旧没有解决问题,记录在这里。

第一个是 Shell 编程相关的。我有一台家用 NAS,连在我家的无线路由器上。平时可以用 NFS 正常挂在,不过,如果可以自动挂在岂不是更好。我一开始把信息写进了 /etc/fstab 里,看似正常,不过一次我在单位开机,因为找不到我描述的地址,所以直接卡在了那里,至少有五分钟。之后我立刻删除了里面的内容。

前几天,我看到了一篇 udev 自动挂在优盘的博客文章,按照里面的说明,添加规则,成功了。我想时不时可以用这种方法来实现自动挂在 NAS 呢?但是如何判断当前连接到的 SSID 就是一个问题。我查了文档,也上论坛询问,渐渐意识到,udev 仅仅是针对 /dev 的,应该做不到检测 SSID 的功能。不过,NetworkManager 有 dispatch.d 目录,里面的脚本在连接或断开网络后会自动运行。然后,在脚本里面,通过 iwconfig 等工具来判断当前 SSID 是不是我要的就可以了。然后就是编写脚本,在我一开始的想法中,这应该是一个很简单的工作,判断当前 SSID 可以调用外部命令,并通过 grep 来判断,如过有输出,就说明是我需要的 SSID,就执行挂载命令,否则就不动。但我之前没有写过 Shell 脚本,执行起来简直要了我的老命,总是无法正常判断,总是提示说 if 那一行参数太多,我还没有查明原因,不过目前暂时放弃。

另一个是 Emacs 的字体调整。我修改了 /usr/bin/emacs 的内容,让 Emacs 可以和 Fcitx 配合输入中文,不过中文字体我不大喜欢。这种宋体字显得太黑,而且如果句中有英文,就更加明显,英文被反衬的过细,整体效果不好,我希望可以换到我安装好的思源黑体或者文泉驿 Unibit。过去,我也调整过 Emacs 的字体,本以为这次也没有问题,不过找了一些文章照着执行,一点反映都没有。而且根据 xlsfonts 的结果,似乎可以被 Emacs 使用的字体都没有包含我安装的思源黑体等。所以,目前也是只好先把它放一放,先这么凑合着用吧。

歧路?

昨天要写一个简单的 Ruby 小程序,来快速的对一些数据做出统计。之前用的 Atom 来写的 Java 程序,缩紧方面的设置还需要重新调整。我觉得有些烦了,就干脆关了,用 Emacs 来写。

我的电脑上一直装着 Emacs,结果不成想,可能是因为近期升级了操作系统版本的缘故,在 Emacs 里的汉字字体都变成了隶书,看起来太别扭了。我于是赶紧搜索字体设定办法,结果要编辑 elisp 了,却发现我竟然需要从 org-mode 的文档里进行调整。后来,我想上 USENET 上看看,发现 Gnus 的设定也没了,再想重新设定,却发现也不算容易。最终,我还是解决了问题,但却让我觉得,之前的一些 fancy 的东西,也许对我来说是一种歧途?

之前我用了 Mac OS X 后,同时也渐渐的从每天写程序的日子里退了下来,渐渐的觉得既然用了 Mac 系统,那再用 Emacs 也许有点不合时宜——毕竟从界面、快捷键上,都与 Mac 系统不大一致。而且,我又看了一些关于 Sublime Text、特别是 Atom 等编辑器的文章,觉得也想试试这些东西,于是在一段时间里,我有意的使用这些编辑器来工作,包括编辑文档还有写程序。

但是,我渐渐的发现,我也许已经过了可以随便学习一个新的编辑器的阶段。没有了学习一个新的编辑器的热情。想起在高中阶段,我对 Emacs 的痴迷劲儿,常常读相关的文章,对着其中的配置来弄自己的 .emacs 文件,每知道了一个新的功能,我就可以兴奋好几天。从那个时候,我一直把 Emacs 当做自己的首要编辑器。这也让我放弃了学习其它编辑器的机会,比如 Vim,我虽然会用,但没法把它用好,真让我用它来写代码,我也真做不到。所以,其它的编辑器,我都只是停留在试试而已。

刚开始是 SublimeText,很多人把它捧得很高,因为它是用 Python 写的,Python 程序员可以自己来扩展。它也同样有一个扩展机制来扩充功能。后来有文章又把 Atom 捧上了天,说是很了不起的创意,用了 web 技术来写编辑器。等我用了下来,我发现除了是用 web 技术来渲染文档之外,其它的跟 Emacs 的差别,从思想上来说,不算太大。不同的是 Emacs 使用 ELisp 语言来扩展功能,而 Atom 用了 Nodejs。不过我想既然 Nodejs 这些年来大火了一把,我跟着这个潮流来学习一二,也挺不错。后来终究因为时间忙、注意力差而没有坚持下来,反而让我更加的思念 Emacs 了。

今天我重新打开了 Emacs,莫名的发现中文字体变样了。过去正常的字体,现在成了隶书。不是不能看,但是在是别扭。当中我升级了操作系统,估计跟这个有关系。找到了设置默认中文字体的方法,把默认字体设置成苹方,能正常显示了,可重启 Emacs 后就又回到了原样。我着手进行修改,可发觉原本觉得真了不起的 Emacs Starter Kit 也不太好用。模仿高德纳的文学式编程,实际进行修改起来,一是文档造成了一定的干扰,不如直接面对代码方便。二是编辑器有了一定的偏差,原本可以轻易的进入一种模式来编辑块中的代码,但现在配置有了偏差,这个功能失效了,代码一下子变得比较难看,最终勉强的才修正了代码。

到了晚上,我因为启动了 Emacs,就想起了 ERC,想上 IRC 上去看看。上了一些过去的讨论组,发现在2012年还非常繁荣的 #gentoo-cn、#ubuntu-cn 等,现在都门可罗雀,没有人上去讨论了。也就是英文群组 #emacs 还算有人发言,让我一阵忧伤。之后又想起了那时上新闻组的日子,于是想上去看看,才发现我的 Gnus 还没有配置。想着重新配置,Emacs Starter Kit 里 Gnus 那一部分又让我挠头了。

我开始觉得用 Emacs Starter Kit 对我来说是一种歧途。原本我自己的 Emacs 配置文件长年不用变,无论怎么升级都可以用的好好的。但 Emacs Starter Kit 给这一切增加了复杂度,有一些我不知道怎么运作的代码,不搞清楚它们,我在修改功能的时候,就非常的受到限制。我决定要重新整理相关配置,弄成之前的那个样子。可之前的配置文件不知道被我备份到什么地方去了。想自己重新写,路径那一关就是个问题,我花费了两天业余时间,才把它配置的跟过去相似。要想恢复过去的样子,真不知道还要多少时间。

我想,我在之前的那条歧路上,走的有些远了。像一些便利的东西,偶尔玩玩可以,但因为它而荒废了自己的根本,在长远上看有些得不偿失。

计划重新配置 Emacs

Emacs 是我最喜欢用的编辑器。最早我是在大约 2005 年从王垠的网站上知道它的,同时听说的还有 VIM,后来经过尝试,我觉得 Emacs 更加符合我的口味,用起来更为自然,因此从很早起我就用 Emacs 来写程序。

我最早的 .emacs 配置文件的内容也是从王垠的文章中获得的,王垠为此写过两篇文章,一篇是基础的配置,另一篇是讲各种好用的 Elisp 包,我从两篇文章中选取了我需要的内容,放进了我自己的配置文件中。这个配置文件我用的非常久,中间也经历了我从 Windows 到 Linux 到 Mac OS X 这个操作系统替换的过程。

后来我得知了有 Emacs Starter Kit 这么一个 Emacs 配置的项目后,立马对其动心了。主要原因是它使用 Org Babel 来把配置文件写成了 Literate Programming 的形式,可以在配置文件中大段的写入对于某一部分代码的想法,而 Org Babel 会在启动时自动提取出所有配置的代码,非常方便。Starter Kit 还有一个好处,就是它把很多相关的配置提取出来,放进了不同的文件中。我过去的 .emacs 是一个大文件,所有的东西都在里面。Starter Kit 则不是,它给了很多模块,需要的时候可以调用。这样的配置文件更加的清晰了。

不过 Starter Kit 也有让我不满意的地方。首先它对我来说有点大,很多配置在我看来有些过了,反而让我一下子有点措手不及。在我看来 Emacs 主要还是一款编辑器,写项目的时候可以有些项目管理的功能,但并不意味着它就要做一个 IDE。我更喜欢比较简单的东西,够用即可,过犹不及。另外就是它的效率问题,它让我的 Emacs 启动速度减慢了许多,今天我又往里面加入了一些 Ruby 相关的配置,速度又一次变慢了。今天我也看到了这篇文章,讲优化 Emacs 配置的,对我很有启发,里面很多的东西在我的配置文件中还没有被用上,于是我计划要整理一下这些配置。

我开始的想法是采用 Starter Kit 的思想,但不要直接用它的代码。首先我很喜欢文学编程,尤其是对于 Emacs Lisp 这种我不能完全掌控的语言来说,有了相关的文字解释可以省去我很大的功夫。另外,这样做的好处是我可以真正的掌控 Emacs 的配置,目前 Starter Kit 中又好多代码我不知道是做什么用的,但又不敢胡乱修改,只好让它们运行。这次借着重写的机会要好好筛选了解以下。

不过 Starter Kit 有一些好的设计,我还没有把握能自己实现出来。比如说它对于第三方插件的管理,我还需要看一下它的代码。另外,Starter Kit 自己也在演进中,我自己配置就意味着要与 Starter Kit 社区断裂,不知道是好是坏。总之目前我有这个想法,但是否能实现出来,我还有些惴惴。

Emacs 24.3 全屏和奇怪的 NEWS

Emacs 24.3 比 Emacs 24.2 好了多少?其实我说不清。Emacs 主要是在 Linux 环境下开发的,到了 Mac 平台能增色多少功能,其实很少。但从源代码编译安装习惯了之后,我常常看到有了新版本就忍不住要更新,这其实是一个不好的习惯,可惜改起来挺困难啊。

当然用新版本的软件并不总是愉快的,因为你经常会遇到没有被修改的问题。比如我前几天安装了当时代码库中最新的代码,发现平时好好的 CJK 支持居然没了,中文都成了小方框,最后只好用回了稳定版本。再就是 Emacs24 Starter Kit 如果在最新代码的 Emacs 中,会因为不能自动载入 org 所以找不到 org-babel-load-file,导致整个的配置都失效了(因为所有的配置都是用 Org-Babel 实现的文学化编程)。

Emacs 24.3 对 Mac OS X 的全屏模式有了改进。过去没有实现这个功能,我们安装的时候是使用了 typester 的全屏补丁,所以有了 ns-toggle-fullscreen 函数。我这些年一直是这么用的,Homebrew 里也集成了这个补丁,安装的时候会自动打上这个补丁。后来有消息说 24.3 开始集成了原生的 Mac 平台下的全屏功能。我看了之后,就想试一试。

等安装完了之后,我发现全屏功能失效了。不仅如此,过去 typester 的全屏补丁也很源代码冲突了。所以我只好用回了 24.2。Mac 的全屏我到现在还没有弄清楚到底是哪一种全屏。因为很多文件中都提到 Emacs 支持了 Mountain Lion 的全屏,而 Mountain Lion 本身弄了一个全屏,也就是窗口右上角多了一个按钮,点一下就进入了全屏模式。而 24.3 如果用的是这种全屏,那我在 Snow Leopard 下是不是就没法用了呢?还是 Emacs 24.3 实际上支持的是过去那种给我门提供 ns-toggle-fullscreen 函数的那种全屏模式呢?

我因为这次失败,所以看了一下 etc/NEWS 文件里的描述。发现在它的 Changes in Emacs 24.4 on Non-Free Operating Systems 一节里提到了这么一段:

** Improved fullscreen support on Mac OS X.
Both native (>= OSX 10.7) and “old style” fullscreen are supported. Customize `ns-use-native-fullscreen’ to change style. For >= 10.7 native is the default.

也就是说,在 24.4 中,Mountain Lion 的那种全屏和过去我们用的这种全屏都支持了。这是一个好消息。

然后我开始寻找 24.4,发现代码中最新的还只是 24.3,难道 24.4 还没有开始实现?或者说这个 NEWS 文件实际上记录的是 TODO 的内容?这让我很困惑了。

不过,至少它给了我一个希望,到了 24.4,我们就有 Mac 下比较完美的全屏了。

TextMate 2.0 出来了

Textmate2 icon这个月初,我偶然去了 TextMate 的官方 blog,看到了 TextMate 2.0 要在圣诞节前推出测试版的消息。昨天我又看了一下它的 blog,看到 2.0 Alpha 几天前就已经放出来了。我马上下载下来试了一下,发现中文字体可以正常显示了,之后就把它束之高阁了,因为我发现我没有学会用它。

在 2008 年年初的时候,我当时的室友买了一台 MacBook 玩。之后我的那台 DELL 笔记本显卡坏掉了,我室友就把 MacBook 借给我用。那时快到了要交作业的时候了,我发现那台 Mac 没有一个代码编辑器。在那之前我没有接触过 Mac 系统,因此对它的常用软件一点都不了解。那阵子正好 Rails 流行,带着 Mac 下的 TextMate 编辑器火起来了。我于是就下载了它来用。TextMate 里有很多 bundles 被人们津津乐道,不过对于我当时写的 Java 程序帮助不大,我也没有花功夫去学那些 bundles 的用法。除了这个,TextMate 真的是一个比较朴实的编辑器,没有花哨的工具条,很多功能都弄到快捷键上了,剩下的就是它的一些配色很好看。我忘了我第一次用它来写 Java 作业的时候是什么感觉了,似乎是发现在里面可以用 Emacs 的快捷键来移动光标,让我稍微兴奋了一下,后来我发现很多 Mac 程序都这样。其它的感觉,我现在真的记不清了。

TextMate 是商业软件,使用版本只给用 30 天。30 天之后我买了一个 license,有学生折扣,然后 TextMate 陪了我挺长时间。除了我的编程课的作业,我之后写作课的论文我也是用它来编辑的 TeX 文件,TextMate 都很好的完成了任务。

2.0 之前的 TextMate 不支持双字节字符,像是中文之类的要占用两个格子的文字,TextMate 只给它分配一个格子,这样导致 TextMate 根本没法编辑中文。有人弄出了一个凑合的方法,弄一个字体文件把中文弄窄,这样中文就不会重叠了,不过实在是太难看了,我受不了。为了有一个可以编辑中文的编辑器,我开始时用 TextEdit 凑合一下,后来我对于 Mac 的软件了解的多了,也开始在机器里放一个 MacVim 来备用。

Emacs icon后来我知道了有 Carbon Emacs 这个软件包,里面集成了很多功能,不用配置就可以很好的显示中文,是当时在 Mac 上跑的最好的 Emacs 了(其它的比如 Aquamacs 都有各种各样的问题)。我用了一阵子 Carbon Emacs,马上就投降了,把它设定为我的主要的编辑器。我恢复了我之前用 Linux 的习惯:写程序或文档的时候用 Emacs,打开文档的时候用 Vim。至于 TextMate,已经没有用了,只是可惜了我买的那个 License。

我发现 Carbon Emacs 的版本只到 22,查了一下资料发现 Emacs 23 版本后就不支持 Carbon 了,改为了 Cocoa。官方就可以在 Mac 下编译和正常使用。为了使用一些新功能,我从那时候就开始自己编译 Emacs 24 用。尽管有全屏等问题,到后来也已经一一解决了,我现在使用的很舒服。

也许是因为有了 Emacs,我没有下功夫去学习 TextMate 的用法,因此到现在我只能像普通的编辑器一样来用 TextMate。关键是我太习惯 Emacs 的快捷键了,尽管 Mac 程序支持一部分快捷键(比如 C-npfb),但支持的不全,我就不大习惯,比如我想删除光标后面的一个单词,按 option-d 后却输入了一个怪字符,这让我十分不爽。

TextMate 2.0 出来后我下载了一份,替换了原先的 1.5。我原先的 License 还可以用,这让我比较欣慰。但也只有如此了,我是不可能用它来替换 Emacs 的,不过我倒是准备用它来替换 Vim 的位置。查了一下我之前的 blog 文章,我发现我在 2009 年 4 月份还在期待 TextMate 2.0,之后估计我就放弃了。也许 2.0 版本早出来一点,或者早一点支持国际语言,我就会一直使用 TextMate?

Emacs 我现在是离不开了,除了日常要写一些东西外,我还用它来收发电子邮件。Mails.app 在邮件多了之后实在是太慢了,我已经放弃了它。Emacs 的 Gnus 就好多了,虽然不是图形界面,但电子邮件能有多复杂的功能?最多我在 Wiki 的 Emacs 笔记里记录了保存和添加附件的命令来备忘。

用 Emacs LISP 写程序

Mac OS X 下我常用的终端程序中,Terminal.app 和 iTerm 都有一个 command+k 的快捷键,作用是清除终端里的字符,回到只显示一个 shell 提示符的状态。这个操作是终端软件自己的,而不是执行 clear 命令,因此效率上会高一些,在远程终端里尤其明显。而且按两个键远比输入五个字符再按回车要舒服,因此我很快就习惯了这个快捷键了。

我平时喜欢用 emacs 来编辑东西,因此 emacs 经常开着。有时需要使用终端时,我回直接在 emacs 执行 M-x shell 打开一个终端来用。这样一方面方便快捷,另一方面可以像操作 emacs buffer 那样来用 emacs 快捷键移动光标,编辑命令,用起来反而更顺。

但在 emacs 中就没有了 command+k 快捷键可以用了。不仅如此,在 emacs 的shell 里执行 clear 命令也不会清空 shell buffer。所以唯一的办法就是选中全部的文字,然后执行 yank,不过这样也太麻烦了一点。今天我终于觉得忍无可忍,于是就像给 emacs 添加这么个功能。

之前我看过 Xah Lee 写的关于 emacs lisp 的一些文章,Xah 对 elisp 比较推崇,说是用它来做字处理等操作十分方便。原话我找不到了,但 Xah 的意思好像是 elisp 比 Perl 还来得好用。我也看过一些相关的文档,但我自己没有实际用 elisp 写过东西。

我要的功能其实很好实现,在 .emacs 里面加一个 shell-mode 的 hook,设定一个快捷键 M-k,绑定一个清空 buffer 的函数就好了。然后就是这个函数了。我本来以为 emacs 应该有个类似 clear-buffer 之类的函数,但我没有找到,于是就上网找了一个,也放在 .emacs 文件里面。我找的那个函数只是把 buffer 内容都清空了,勉强符合要求。我希望在清空了 buffer 之后还要显示 shell 的提示符。虽然清空后按一下回车键或者直接输入命令也无所谓,但我还是希望稍微完美一些。

在 emacs 中写操作 elisp 的程序很方便。emacs 的操作是由一个一个的 elisp 函数组成的,因此只要把相关的函数给找出来加到 clear-buffer 函数中就行。要找按键对应的函数,用 C-h k 就可以办到了。很容易的,我就得到了最后的结果,也就是在 .emacs 中加入如下代码就达到要求了:


;; M-k clear buffer of shell-mode like Terminal.app
(defun clear-buffer()
  "Kill all of the text in the current buffer."
  (interactive)
  (clipboard-kill-region 1 (point-max))
  (comint-send-input)
  (previous-line)
  (kill-line)
  (end-of-buffer))

(add-hook 'shell-mode-hook
          (lambda ()
            (local-set-key (kbd "M-k") 'clear-buffer)))

我感觉这个 clear-buffer 函数有些琐碎,像为了要实现清空 buffer 后显示 shell 的提示符,我让函数执行一次回车,然后回到上一行,删除这一行,再回到 buffer 的结尾,感觉上做了很多琐碎的工作似的,不知道对于效率有没有影响,不过我测试了之后感觉可以接受,而且我也不知道有没有更好的方式来解决这个问题。

几个星期前我看 RubyConf 2010 的时候,有个视频探讨了用 Ruby 来写一个 Ruby 编辑器的,当中提到用一门语言来写这种语言的编辑器的好处。emacs 就是一个典型的例子,用 elisp 来完成各种操作,用 elisp 很简单的就可以完成各种配置,而且不用重启编辑器,写完了代码后 eval 一下就好了。估计也只有 LISP 可以做到这种效果了吧。

Magit 找不到 git 的问题

虽然 Mac OS X 的底层是 BSD,但它的一些问题还是用的特殊方法解决,而不是标准的 UNIX 解决方案,有时让人非常困惑。其中一项就是默认搜索路径的设定。UNIX 下的标准方法是在 .profile 文件中设定 PATH 变量,但 Mac OS X 还有另外一种方法,就是写在 ~/.MacOSX/environment.plist 里。

我之前忘了因为什么原因,使用过第二种方法。上个月重装系统的时候,我也备份了 HOME 目录下的隐藏文件。等重装结束后往回复制的时候,我觉得系统运行一切正常,不用那个 plist 文件也没有什么问题,所以就没有把这个文件夹给复制回去,只是改了个名字备份到了硬盘里。前几天我整理硬盘的时候,感觉没有什么问题,于是就把这个目录给彻底删除了。

今天我准备搞一下小组的学期项目。我们用 git 来管理代码,我编码喜欢用 Emacs,所以就一直用 magit。重装系统之后我还是装了 magit,但一直没有机会用过,这次需要用的时候,出了问题了。执行 M-x magit-status 的时候,Emacs 总是提示说:

Searching for program: No such file or directory, git

我系统里的 git 是用 Homebrew 安装的,平时用着一切正常,PATH 路径也正确,Emacs 里面我还单独的设定了 PATH,也没有问题。我的配置文件都是重装系统之前备份的,那时用着没问题,现在应该也正常才对。为了找出问题,我重装了 magit,升级到了最新版本,又重装了一遍 git,都没有解决。后来我才想到了 plist 文件的问题。

我的那个目录已经删除了,好在我有 Time Machine 备份,找回来之后,我把目录又复制到了根目录下,试验 magit 问题依旧。后来我觉得这个问题和 Mac OS X 系统有关,或许应该重新登录一下,就重启了一下机器,之后就正常了。

Gnus 最简配置

可能是因为我的邮箱 INBOX 里的邮件太多的缘故吧,我目前使用的 Apple Mail 在使用了比较长的一段时间之后速度会非常满。每次与服务器同步的时候也会把 CPU 的占用率提升到很高的程度,导致风扇很烦人的不停的转。

更严重的是,我搞不清楚发送邮件的状态,特别是 Gmail,当提示发送邮件完毕的时候,Draft 文件夹里面会有一封新邮件,就是我刚才发送的那封。按照常识理解应该是说发送失败了,刚刚撰写的邮件被保存到了草稿箱里。可我再重新发送了几次之后,去 web 版的界面上看到竟然把这封邮件发送了好几次,这就实在是太糟糕了。

我日常用 Gnus 读 USENET,于是就想在日常使用 Gnus 来处理邮件,Apple Mail 当作备用的好了。这样就不必让风扇不停的转,也不用担心重复的发送了邮件了。

我的 .gnus.el 文件是好几年前配置的。当时还在用 Linux,后来转换系统之后也一同同步过来了,用着一直不错。我在查了一些文档之后,成功的配置好了 IMAP 取信的功能。但 SMTP 服务器我只配置好了学校的邮件服务器,Gmail 的 SMTP 我没有配置成功。尽管我安装了 gnutls-cli 包,但 Gnus 似乎一直找不到,总是给一些 protocol error 的信息,让我很苦恼。后来我也只好吧这个问题先放一放,先用学校的 SMTP 服务器发信。这样做唯一的缺点是发送的邮件不会到 Gmail 账户的“已发送”信箱里,不过应该不是什么大问题。

后来我的 Gnus 出问题了。我不知道 Gnus 有没有类似“emacs –debug-init”之类的调试命令,所以只好把旧的配置文件改名,一部分一部分的复制到新建的配置文件里,逐步的排查错误。借着这个机会,我把比较杂乱的 .gnus.el 文件给整理了一下。而且本着先放必要的东西,再放附加功能的想法,我最后发现我的配置文件里必要的部分竟然如此的简单。我目前的最简配置如下:


(gnus-agentize)

(setq smtpmail-default-smtp-server "mail.cc.umanitoba.ca")
(setq smtpmail-smtp-server "mail.cc.umanitoba.ca")
(setq smtpmail-smtp-service 587)
(setq message-send-mail-function 'smtpmail-send-it)
(setq send-mail-function 'smtpmail-send-it)

(setq gnus-select-method '(nntp "news.cc.umanitoba.ca"))
(setq gnus-secondary-select-methods
      '((nnimap "gmail"
                (nnimap-address "imap.gmail.com")
                (nnimap-server-port 993)
                (nnimap-stream ssl))
        (nnimap "uofm"
                (nnimap-address "mail.cc.umanitoba.ca")
                (nnimap-server-port 993)
                (nnimap-stream ssl))
        (nntp "freenews.netfront.net")
        ))

这个其实还不是完全最简的。首先 agent 不是必须的。而且 smtpmail-default-smtp-server 和 smtpmail-smtp-server 其实只要一个就行。然后如果只想用 Gnus 来处理新闻组的话,就不许要那几行的 IMAP 的设定。在这里我设定了两个服务器,一个是 Gmail 的,一个是我们学校的。当然,为了安全起见,我把用户名和密码都存到了 .authinfo 文件里了,所以在 .gnus.el 里面也节省了这方面的空间。

根据我使用 Gnus 阅读新闻组的经验,其实这当中最难的是找一个好的新闻组服务器。网上很多免费的新闻组服务器都是只读的,所以你没法发表文章。好在我们学校还有一个新闻组服务器,速度也还不错。不过我们学校的服务器上没有 cn.* 组,所以我又添加了 netfront 作为第二个服务器。不过就这么几行就可以基本上完成了所有的功能了,倒让我很吃惊呢。因为之前在学习使用 Gnus 的时候,看的那些中文文档,总是指点我们配置一个比较 fancy 的设定文件,一条一条解释下来让人感觉乍一接触比较迷惑,其实刚开始只需要不足 10 行就可以了。

另外,为了研究 Gnus 的 SMTP 服务器设定,我阅读了 Gnus Manual 英文原文。文章写的很不错,没有什么难词,而且也相当幽默,一点都不感觉到读大部头英文书的压力,作者文笔功力可见一斑。

Emacs 24 的 magit commit 问题

Magit 是 Emacs 的 git 前端,想对于在 Emacs 当中写完代码再切换到终端去 commit 代码,或者去做一些 diff 之类的操作,把一切都放在 Emacs 当中比较方面一些。而且想对于命令行来说,这种方式也更加直观。

想对于集中式的代码管理外,我感觉对于个人来说,分布式的代码管理更加灵活一些。我目前用 git 的功能也不多,很多高级功能我也还没有掌握。我主要是把 git 用来记录 log 更多一些,有时候建几个分支罢了。我目前主要的编码活动是用 Java 来写面向对象课程的作业,作业本身不算难,但弄出来的代码很多。几部分不能一下子就完成,所以我会完成了一部分之后就 commit 一下。我这学期的面向对象作业都是这么做的,从第一次就开始,感觉一直很好。

有一天我发现 Magit 突然不能 commit 了。每当我写完 commit log 之后,按下 C-c C-c 之后,就没有任何反应了。后台可以看到 git 进程,但 CPU 使用率是 0.0%,也只能手动杀死。杀死之后运行一下 git status 看看,根本没有任何提交,这就让人非常苦恼了。我目前使用 Magit 的感觉来说,其中最爽的一步就是提交了。写好了 log 之后看到之前的工作都进入了 repo 的那一刻,成就感是无与伦比的。这下子不能 commit 了,就让这种快感打了折扣了。

这个问题发生在我写第一次和第二次作业之间,当中我也没注意到发生了什么,突然就发生了这种问题。结果做第二次作业的时候感觉就不如第一次作业时那么顺了。不过那段时间比较紧张,我也没有去找到底是哪里出了问题。我印象里好像是把 Magit 从 0.7 升级到了 0.8 才有了这个问题。于是就尝试重装了几遍,但问题是依旧。我觉得这应该是一个 bug,于是就耐心等待看看下一个版本。

今天看到了 Magit 0.8.1 发布的消息,正好看到 Homebrew 里面也有了 Magit 的 formula,就安装了。安装好后我发现还是有这个问题,就去 issues 去看了一下,发现已经有人报告了同样的 bug report。底下有人回复说是 Emacs trunk 的问题,不过我印象里没有记得那阵子编译安装过最新版 Emacs。

第二条回复里说:“Setting ‘magit-process-connection-type’ to nil resolves this for me.”,我于是就试了一下,在 .emacs 文件里面加了这么一行:

(set 'magit-process-connection-type nil)

再在 Magit 里面运行了一下 commit,发现久违的 commit 又回来了。

Cocoa Emacs 23 全屏

在 Mac OS X 下编译 Emacs 非常简单,从 BZR 上下载(记得要用“--stacked”参数)最新的源代码后,运行

./configure --with-ns
make
make install

就可以生成 .app 程序包。自从我知道了这个方法之后,我一直在用最新的 Emacs。

过去我用 CarbonEmacs 的时候,曾经设置过 Emacs 的全屏功能,用着一直感觉不错。后来自己编译使用 Emacs 23 后,就再也无法全屏了。上网查了一下原因,知道是因为从 Carbon 升级的 Cocoa 的过程中,有一些功能还没有完全实现,而全屏功能就是其中之一,因此我不得不遗憾的暂时放弃了这个功能。后来我发现点两次窗口最大化键也可以勉强达到全屏效果,于是就这么一直凑合着。

今天在浏览 Emacs Wiki 时看到了一篇 blog 文章的链接,文章介绍了在 Cocoa 环境下全屏的方法。按照文章中的办法,略微变通一下,果然成功了。

文章中说,日本黑客 Daisuke Murase 给 Emacs 23 添加了全屏功能。他在 github 上放了一个 Emacs 分支,但除了他添加的新功能之外,这个分支一直没有跟着主分支一起更新。所以文章的作者 Steve 从一个“官方”的 Emacs git 分支 clone 了最新的代码,并合并这两个版本,但在合并的时候发生了冲突。于是 Steve 提取了这个更新(a3585f6c2a)的 patch 并成功的更新了代码。

我在 clone Steve 提供的 Emacs git repo 时速度非常缓慢,已经超出了可以忍受的范围,只好放弃,改用从官方的 BZR repo 来下载代码。但这样我就无法(不会)用 git 来合并 Daisuke 的分支了。不过我在看 Daisuke 的 git repo 的时候,发现他提到了他的分支与主流分支的合并冲突问题,并给出了 patch 文件。把这个 patch 下载下来后,在下载下来的 Emacs trunk 目录下,运行 cat feature-fullscreen.patch | patch -p1 后就按照上面的方法正常编译 Emacs 就好了。编译完成后,用 M-x ns-toggle-fullscreen RET 就可以像过去一样全屏了。

我照样喜欢把全屏功能绑定在 command+return 键上,在 .emacs 文件中加上一行

(global-set-key (kbd "M-RET") 'ns-toggle-fullscreen)

搞定。

既然说道改动 .emacs 文件了,我前两天刚刚也修改了一下功能,就是 set-mark-command 的键位绑定。Emacs 默认对这个函数的绑定是 control+space,但在 Windows 和 Linux 系统上一般被用来切换输入法,在 Mac OS X 下我又把这个组合键设定成了 QuickSilver 的快捷键,所以这个键绑定就失效了。因为我一直用的笔记本电脑,所以我之前在选定文字的时候,就干脆用鼠标板来手动划定,勉强可用。如果要选定整个 buffer,就干脆把光标送到开头,再送到结尾也算是变相的选定了全文,操作起来就是按住 Meta 和 Shift 键,在迅速的分别按 ,. 一下就好了(或许有“正确”的全文选定办法,不过这么多年了,习惯了:-))除了用 control+space 来选定外,默认情况下用 C-@ 也可以同样的呼叫 set-mark-command,但我一直以来都觉得这个组合键的反人体工学达到了变态的程度。而 M-@ 这个组合键虽然同样需要三个键,但却更加顺手一些。M-@ 默认的绑定是 mark-word,就是选定一个词组,这些年来我从来没有用过这个功能。于是前天我“痛定思痛”,决定彻底解决这个问题,就是把这两个键绑定切换一下。于是在 .emacs 里面加上了这么两行

(global-set-key (kbd "M-@") 'set-mark-command)
(global-set-key (kbd "C-@") 'mark-word)

于是世界清净了。