某天twitter上参与了一次关于emacs的讨论,当时ahei便立刻找我说让我写点关于emacs的东西。但是我也只是拿emacs作为一个顺手的编辑器而已,要真是说让我憋点文字出来,估计即便写出来了也没有什么人爱看的 ╮( ̄▽ ̄)╭ 。话说最近倒也是碰上了一两个问题,现在也就顺手一记吧。
一个是万年头疼的字词设置。要说到编程,等宽字体肯定是首选,不过之前也就要求的是做到0Oo和1lI得有明显的区分,中文的要求不是那么高,可是当用到rst时,中英文对齐就显得非常重要了。特别是需要制作表格的时候,中文如果无法恰好与两个西文字符等宽,制作的时候非得让人为了对齐崩溃不可。要说这中文字体吧,也还真找不到什么满足上述要求的。如果本身是等宽字体,那很好,后面的要求满足了,比如说文泉驿的等宽正黑和微米黑,可是很不幸的,上面要求的0Oo和1lI怎么咋看都分不出来呢。Windows下我一直用的是雅黑和Consolas的混合字体,这玩儿在win下显示得挺好,可偏偏跑到linux下又给我掉链子,中英文无法做到等宽,煞是苦闷。还好emacs是支持自定义fontset的,可以为不同的字符集定义不同的字体,但是很不幸的,由于不同字体的行高字宽都有区别,要调成字宽一样的话,行高就无法一致了,比如说现在用的Dejavu Mono加上WenQuanyi Micro Hei,要协调字宽的话,如果前者是15px,那么后者就得调成18px才行了。造成的后果是如果在一个有纯英文行和中英文混搭行的文件中做光标上下移动时,如果打开了高亮当前行的设定,就会看到高亮区一会儿高一会儿低的,有视觉洁癖的人应该是无法忍受的。不过由于暂时找不到什么好的字体替代,也就只能将就用了。
这个配置也一直用的好好的,可直到最近又出现了问题——字体设置突然失灵了!这件事是比较奇怪的,因为我没有升级emacs,也没有改动过什么配置文件,所以当发现这个问题的时候真是抓狂了。我用的是在.Xdefaults里面定义fontset的方式,在一次次的改动和xrdb之后却又发现其实啥都不改最终也能正常显示。这问题是莫名奇妙的,直到我在重启了机器之后发现问题依旧,这才想起应该和最近换过桌面环境有关。以前使用的是Slim + Openbox,现在用的是gdm + gnome + compiz,启动时读取的文件并不一样,找了找gdm启动session的默认配置(在ArchLinux下是/etc/gdm/Xsession这个文件),这才发现gdm默认读的并不是.Xdefaults而是.Xdefaults……于是这个问题也便终于在ln之后解决了。
第二个问题是关于Emacs的菜单的。Emacs的不同模式是可以使用不同的自定义菜单的,比如Lisp就有一个叫做Lisp-Interaction的,而Python则有一个叫IM-Python的Imenu。现在碰到的问题是,当使用不同的mode后,再去点击这些菜单项,你会发现这些都变成了空白菜单了。这是只在ArchLinux下碰到的问题,Gentoo和Win7都一切正常,emacs版本都是23.1。虽然一般也很少用到,但是明摆着一个bug在那儿心里总是不爽的。网上看了一下,这也确实是emacs在新版gdk下的一个bug,变通的方法是在需要使用菜单的时候调用M-x accelerate-menu。当然如果要完全解决这个问题,还是得安装vcs中的版本了,比如AUR里面的emacs-git和emacs-bzr。不过,像emacs这样的庞然大物,我就不拖累公司这可怜的带宽了,也就还是将就着用吧……
嗯,差不多了,最后贴个小配置,我习惯于用C-F4来关闭buffer的。由于emacs在server或daemon模式下调用kill-this-buffer需要额外确认,所以写了个自定义函数来处理。不过之前调试字体时发现的原先的版本在直接启动的emacs下居然无法工作,主要是于server-buffer-clients没有定义,是小修改了一下。虽然没啥东西的,但是最后贴上来总归还是能小小增加一点本文的技术含量的吧XD
(global-set-key [(control f4)] (lambda ()
(interactive)
(if (and (boundp 'server-buffer-clients)
server-buffer-clients)
(server-kill-buffer)
(kill-this-buffer))))

