不知道是不是我的 emacs-wiki-journal 初始化文件有错误,当我使用 emacs-wiki-journal-add-entry 函数写 blog 的题目时,我无法使用像 readline 一样的功能去补全程序要求的 Category(分类),而只能一个一个字母地把我的 category 打上去,太不方便了,而我觉得程序本身应该提供。于是我查了一下源代码,发现程序是这样工作的:
先用 emacs-wiki-journal-prompt-for-category-wiki 函数从用户那里读取 category 信息,在函数内部定义了两个变量 file-alist 和 emacs-wiki-default-page, file-alist 就是 emacs-wiki-journal-directory 里具有 category 前缀的文件清单,而 emacs-wiki-defualt-page 则是默认的 category,然后调用 emacs-wiki.el 里的 emacs-wiki-read-name 读取 category,而在 emacs-wiki-read-name 内部,具体的由 emacs 内建的 completing-read 函数来完成。此函数的功能是从一个 minibuffer 里读取并完成(补全)数据,也就是说 completing-read 函数拥有 "readline" 功能。程序有补全的意思,肯定是参数错了。
据我的观察,错误就出在 file-alist 里,而这个数据是由 emacs-wiki-journal-category-alist 函数得到的。
此函数如下:
(defun emacs-wiki-journal-category-alist (&optional no-check-p)
"Return possible category index Wikis in
`emacs-wiki-journal-directory'.
If NO-CHECK-P is non-nil, then don't check for changes in the
directories to decide whether to re-read the cached alist, just
re-read the disk."
(let ((file-alist
(cadr (assoc emacs-wiki-journal-project
emacs-wiki-file-alist)))
(category-alist nil))
(save-match-data
(mapc
(lambda (file)
(if (string-match emacs-wiki-journal-category-regexp
(car file))
(setq category-alist (cons file category-alist))))
file-alist))
category-alist))
我看了一下,但还是搞不懂它的 NO-CHECK-P 是什么意思,似乎并没有用到。而且如果只是实现简单的功能(返回具有 category 前缀的文件清单),则完全不需要这么长的代码。
如下面我的代码,是能够返回具有 category 前缀的 file-alist 的:
(directory-files emacs-wiki-journal-directory
nil
emacs-wiki-journal-category-regexp
'true)
实话说,改写后这个程序实现了原有的功能,能够从简单的敲击下补全应有的字母了,省了不少力气。郁闷的是虽然搞清楚了程序的想法,但是具体的函数还是看得不大懂,只能等到出了问题再说了。
今天实在是太忙了,早上为了办银行卡,不得不走了趟明珠广场的农行,但是挂失卡号却需要身份证复印件。就为了这个复印件,让我走了趟新区,花了 N 多时间去复印才搞定。
下午的才让人痛心。我的手机连同 SIM 卡在五月份就丢了,但我就是赖着不去销号。结果到了今天,有了新手机了,想办新卡,才不得不面对。
到了工大对面的移动充值点,才知道我那个卡号已经被停,不能再办理新卡了,然后让我到移动大厅去销号。在她的指点下,我穿着拖鞋,上了 109 在大钟楼下,却找不到移动大厅。我凭着直觉,硬是在陌生的街道走了好长一段路。结果我的方向是对的,问了好几个移动点,他们都告诉我还要往前走。在离移动大厅最近的那个移动点,他们告诉我大厅就在合肥百货大楼对面。结果我上了天桥,花了好些时间才找到那个庞大的建筑。
我下午 4:00 出的门,到了大厅已是差 10 分 到 5 点,然后是排队,里面真是人山人海啊。花了几乎一个小时才到我的份,晕死,为了这个号,我什么都忍下来了。
然后是销号,我还以为销号和办号是两不误的,问了才知道不行,如果想马上用,就得用原来那个。可是原来那个已经欠费 75RMB,真是气人,不过也没有办法,要不是自己懒惰,就不会如此下场了。
终于大三了,来到了南区这个陌生的地方。
今天才是学校官方的搬家时间,但是绝大部分的班级都在昨天就雇了车开始搬家,我们班是借别班的东风才找到车的,所以搭车时间好紧,得看别班的脸色。
老天爷也太不给面子,竟然下起了小雨。我们从早上 9:00 一直忙到下午 3:00 才把班里人所有的行李从新区搬到了南区,而后面的重建工作则一直持续到现在。我们系还算不错,分到了 6 人间,有阳台,有卫生间,相比新区,是挤了些,但也热闹了不少。
今天终于买了电脑桌,架起了电脑,在这个忙乱的世界中,开始我的大三旅程,:)
到了学校,上外国网站始终是个问题,好不容易才找到了一个不错的代理,费力装好了 Linux 下有名的文本浏览器 w3m 和 w3m 的 emacs 前端 emacs-w3m。
W3m 确实快,就像它自己说的那样,启动要比 lynx 快。而且 lynx 虽然说支持网页的多种编码,但是大概是我不懂设置吧,浏览我自己的主页,符合 XHTML 1.1 编码为 utf-8 的网页,却显示不出来,真是恼人。
而 w3m 却不用设置,直接就能显示。
Emacs-w3m 是 emacs 上的文本浏览器,w3m 的前端,速度也是非常快,浏览我的主页没有问题,一切正常,但是浏览 Sir 却不能正常显示汉字,也许是因为 Sir 的网页编码是 GBK 的缘故,反正刚刚试过浏览 163 编码为 gb2312 的也没有问题。不过我用 emacs-w3m 主要还是想浏览外文网页或本地的外文资料,配合之前配置好的 dict,浏览的时候遇到不懂的单词可以直接查找含义,哈哈哈,太爽了。
昨天鼠标出了问题,左键坏了,在浏览网页的时候发现的,根本打不开链接,复制东西也不行。因为一开始启动的是我的 SLK,还以为是系统问题,毕竟隔了两个月才第一次动这个系统,难说被谁碰过了什么东西,反正心里疑问重重。没想到重启上了 Windows,还是这个问题,而且明朗化了,因为在那里不用鼠标可不行。
自己拆开来看了下,根本发现不了问题,而且我的罗技套装才过保修期,真是气人。于是决计买个新鼠标。
舍不得买贵的东西,于是刚来合肥第二天就开始东转西转,想找个便宜的卖点。三孝口电脑城罗技的 MX310 开价只要 130RMB,听着心里都害怕。接着到了百脑汇,那里开价离谱,而且摆的那几摊水平太次,说 MX310 竟然听不懂,而且都是到另到同一家问货,问过了好几家都是这样,搞得我们心都凉了。最后到了科大对面的装机店,才感觉踏实一点。
最后敲定了买微软极动鲨,换换口味,160RMB 的价格,在一个小店购买的,不算便宜了,不过 2 年包换,可以安全度过大学四年了。
从玉林再到广州,然后合肥,整整 36 个小时,累死了。睡了一个下午,才感觉好一些。
不过一路上倒是很愉快,因为一路上遇到的朋友,都很有意思。大家都有说有笑,谈一些很有趣的事情。 我也是第一次遇到这么健谈的朋友,以前我一般是不说话,默默地看自己的书,可是这一次,我的书都没来得及拿出来。
想起昨晚上也蛮心寒的,空调硬座,好冷。我没有夏天乘坐的经验,短袖短裤顶了一个晚上,别人都是长衫,还有的拿出了专门的御寒衣物。好伤人心啊,这种经验,一次就够了。
今晚的车,先到广州,然后直上合肥。开学大三了,要搬到“男”校区,所以不得不早点离开,到那里打点东西做准备。
最后一天总是很惆怅,可也说不上为什么,呆在这里没事干,可是要我离开也很不情愿。总觉得家人似乎有些话要跟我讲,但一直忍着不肯说,也许要到离开前的最后一秒,才开始嘱咐。
现在我还好,不过我知道一旦上了火车,到了更无聊的地方,我肯定会没事干然后开始怀念,想想哪些事情还没有做,哪些做不好。记忆里的某些地方,那里色彩斑斓很快乐。想起同学,想起伙伴,想起城市的变化……
反正就是这样浪费时间,因为到了学校,就没有那种让你惆怅的环境了。
快收假了,家里人老是督促快看书快看书,毕竟有些课程还放不下。可是哪有心情啊,好不容易回趟家,可不能仅仅为了功课,再说放假目的不就是为了躲功课嘛~
心里虽然这么想,行动却不能太违背,离开了电脑桌,只好委曲求全,看点别的什么课外书。
因为前段时间猛扎电脑影响太坏,近段时间老被家人驱逐,所以几天来也看了不少旧书,也算是好好地温习了以前的功课,没有太浪费时间。不过今天摸到的这本《第三十九级台阶》却是我以前没有看过的,中英文对照的改写本,不用花太多时间就可以看完。
本打算看中文的,但没想到我的四级英文水平竟然可以应付里面的简单文字,只是速度慢了些。改编者竟然用这么简单的英文表达了这么复杂的事情,想想当初在考场上的英语作文,如何花费了大量的人力物力才构筑完成,还很兴奋勒,真是丢人啊。
故事够惊险够刺激,要不然也就不会有被搬上银幕的本钱。特别是在平原上如何逃、躲、攻击,那些镜头,很吸引人。只是这本小书的最后,描写主人公心里斗争,揣度该不该逮捕这些看似简单的人物时,感觉到那些线索和推测的联系很勉强。因为改编去掉了很多细节,压缩了文章,人物的思想变化幅度太大了,看起来很不舒服。要是能看电影就好多了。
今天有去刚搬好家的图书城,兴奋的是看到了不少计算机类的书籍,Linux 的也不少;失望的是转了大半圈,竟然没有英文原著,一两本摆摆样子都好啊,除了那些类似课堂练习的英文读物,别的什么都没有,什么都没有……
昨天晚上才将 EmacsWikiJournal 的配置文件整理得差不多,然后开始写配置过程。具体的跟原来的 EmacsWikiJournal 没什么大的差别,相对来说只需要增加一些用户自定义——用于产生 RSS 种子的文件头,blog 地址等等。
同时还需要在相应的页眉或页脚为页面增加日历和存档连接做好准备。如果你对配置 EmacsWiki 或 EmacsWikiJournal 很熟悉,就几乎不用作什么改变,虽然许多原来 EmacsWikiJournal 的变量都用不到了,但是留着它们也没有大碍。李宇维护的 EmacsWiki 中文站中有非常多 EmacsWiki 的资源,他提供的配置模板对刚接触 EmacsWiki 的新用户非常有帮助,所以我的配置过程是紧接着他模板的屁股后面开始的,由于相同的部分太多,所以不再一一累赘,具体的请看 EmacsWikiJournal。
由于原程序是 GPL 授权,所以修改过后的版本也仍然是 GPL 授权,而各个人贡献者都拥有自己相应的版权(我没说错吧?)。按照 GPL 的定义,你可以任意查看源代码,分发或作为了需要作相应的修改,不过请注意要在 GPL 允许的范围内。
Hack 完了 emacs-wiki-journal,生成了导航栏,多了日历等等的其他东西。于是简单的 journal 摇身一变,成了 blog。为此很多元素都得重新调整,新生成的元素还得给它腾出位子来。
我手中的 emacs-wiki-journal 所拥有的特性,大部分都来自于 Ganesh Swami 的版面(对他的版面很是赞赏啊~),他编写的 emacs-wiki-blog 也给了我很多帮助,特别对于是 calendar 的生成,需要用到 Emacs 的 calendar 的包,我很不熟悉,这些都是看了他的程序,才慢慢了解的。
现在程序已基本完成,在处理页面时,我还是第一个想到了他的 blog。于是“东挪西就”别人的 css。老实说是参考,颜色搭配方面肯定都是我自己处理(有意见?),但是字体大小等等方面太过麻烦,我自已用的是 Opera,但是我相信现阶段大部分的人都还在用IE,我自己本身并不是 Web 标准 的研究者,要调和这两方面实在是很麻烦。再说我已经用 emacs-wiki 搭建好了主页,所以 blog 怎么说都已经有了很大的限制了。
现在 blog 页面的 css 只抄袭了关于 div 位置关系的部分,还有参考了下别人的字体搭配,其他都是自己的,看起来还好了。
我 hack 的 emacs-wiki-journal 来自日本 Yamagata Yoriyuki 的包,和上面说到的 emacs-wiki-blog 都是 GPL 授权,可以很方便地查看源代码,不过对软件所作的修改都必须以 GPL 限制的方式提供出来,所以我肯定要 GPL hack 过的 emacs-wiki-journal 了,不过这还需要一些时间,因为很多东西都还没有准 备好。
除了 emacs-wiki-blog、emacs-wiki-journal 提供使用 Emacs 来构建 blog 的写作环境,另外还有功能更为强大的 planner 等等;除了以 Emacs 为平台构建,如果你的服务器支持 PHP 和 MySOL,还可以使用大名鼎鼎的 WordPress;还有仅仅需要命令行的 nanoblogger;还有……
非常多的选择,看你的需要,看你的喜欢了……
花了将近一个星期,将 emacs-wiki-journal.el hack 得“千疮百孔”,看现在这个样子,应该叫做 emacs-wiki-blosxom.el 更好一些:
非常感谢 emacs-wiki 以及 emacs-wiki-journal 的创建者以及贡献者们,没有他们的努力,根本就没有我 hack 的基础,:)同时还得感谢 Ganesh Swami,他的 emacs-wiki-blog 给了我很多帮助,我是看了他用自己写的 emacs-wiki-blog 创建的站点后才萌生了想法的。本来只是想修改一下 emacs-wiki-journal 缺乏时间逻辑的文件管理,但是后来变得一发不可收拾——只怪暑假太长了……
对 emacs-wiki-journal 改动得太多,除了 publish 这一方面没有修改,其他的地方几乎都做了修改,有些东西去掉了,更多的东西增添了上去。现在它勉勉强强地运行了。对于我这样刚接触 elisp 的 newbie,不能希望(奢望)代码有多好,只是希望能运行就够了,现在正寻找 bug 及不断修改中。