最近周末都有游泳,泳池的人不算多,天气也都很好,锻炼身体,不亦乐乎。得益 于公司发的福利券,一张可以免两个人的入场费,我的那张早就去看电影消耗掉 了,如今都是蹭我那可爱的同事们的,其实是有任务在身,务必要教会他们游泳…… 想起大学期间,只游过一次泳,那还是在大二新区的时候,场内一片几乎都是男 生,相当地壮观。
游完了泳,全身又累又软,坐下一起吃饭的时候,聊到了公司的事情,说起了各自 将来可能的发展和规划,可是想起如今自己的生活和计划,混乱不堪,都不知道或 近或远的明天,会是怎样,尽是些伤心的话题。
这个星期,来了一次救火行动,简单版的 MISSION IMPOSSIBLE,感觉我都快变成技 术支持了。
周二早上刚上班没多久,我还准备去看看昨晚提交的测试结果会如何,接着头头过 来跟我说,某个产品在上海那边,最近不怎么行,那边的技术支持解决不了问题, 估计得改代码,客户抱怨得厉害,快签不下了。
又是上海,不是我的福地。打了个电话过去,简单跟某个负责人了解了一下情况, 头头说可能今天就得过去了,那还有什么办法,定了机票马上就走,还得先刷自己 的信用卡,没能从公司先借钱出来,惨。
下午六点到上海,打的花了一个多小时才到分公司,技术支持都在外面了,只留了 一个守家的,说要不要先测试一下这边的产品,我说好,结果一下子就到了八九 点,因为各种其它的问题,测不出结果。才发觉肚子饿得厉害,先去吃个饭吧,一 眨眼就到十点多了。
这时候负责人才回来,我跟他说因为各种原因,这边测不出结果,要先去现场看看 怎么回事才成,他说要等到十二点左右,才可能过去,现在人家那边还要做生意 呢,我说好吧。
等到快十二点,坐着车穿越了大半个安静而空旷的上海,用了一个多小时,才到达 了问题地点。我也才知道,为了避免上下班交通拥挤的高峰,他们都是中午上班, 晚上迟点下班,反时间工作,否则大半时间都是花在走路上。
跑了一下我们的程序,大概知道问题所在了,得改代码,可是问题不在我这部分。 还好对其他部分还是有所了解的,郁闷的是负责这份代码的人是个实习生,早就离 开公司了,留下来的代码似乎不是之前提交的最终代码。对这个我是所准备,来之 前已经有所修改了,可以跑起来,没想到关键部分居然 OK 了,可是仔细一查,协 议错了,服务器上的东东未修改。就差一点点,还得接着改。不知不觉时间指向了 凌晨四点,感觉修改得差不多,测试了一下,终于 OK,舒了一口气。
大家说现在去宾馆住很不合适,要不过来家里这边找张床睡一觉就好,我说好,到 了他们租的地方,随便找了张床躺了下来。这呼呼的就到了中午十二点,头头打电 话过来问,“怎么样了?”“应该 OK 了。”“什么时候回来?”我说下午就可以走。
又是火速通过 12580 订了票,赶到了机场,等到进了候机厅,才发现我的电子客 票不见了,没那个东西可怎么报销,我记得在安检的时候是有看到的,于是过去询 问,居然也找不到。看来报销只能想想其他的办法。
而且这一次又遭遇晚点,是上了飞机才开始通知说要延迟起飞的,我都快晕倒了。 每次在这边都会出问题,或多或少……
前段时间“凤凰”过福州,也没感觉到周围有啥大风大雨的,倒是之前来了一次冰 雹,本来火热的艳阳天,突然间乌云密布,接着狂风暴雨的,只听到窗户上噼里啪 啦地响,大家好奇,接着看到小小的冰粒落在窗台上,白花花的。下班时雨已停 了,地上也都变干,去坐公车时,才发现车站旁的一棵小树,被吹歪了不少,已经 隐约可以看到被拔起来的根部和露出的黄土了。
那棵树现在都还是歪着,“凤凰”来了又走,它还是那样。“凤凰”没带来多少风,而 是带来了好多雨水,下了整整一个星期,本来 37。+ 的平常天,因为“凤凰”的到 来,下降了十度都有。一次我坐公车,那种空调型的,因为车窗内外温度差别的 缘故,窗内都泛出了水汽,模模糊糊的一片,跟春天似的。
昨晚跟在成电读研的大学室友聊天,他就说最近又来了一次十一楼跑,因为实验室 在十一楼,每次风吹草动,活动起来成本都很高。大家就在 QQ 群里笑,不过当真 的地震到来,其实大家心里都笑不起来。
想起一个月之前,偷空回了一次合肥,那是跟大学室友们的一年之约,成电的那位 兄弟,因为地震影响了课程,还得在学校多呆好几天,就缺他没有成行。
我盘算先着坐飞机到上海,到交大室友那边逛一圈,再跟他一起去合肥,时间是蛮 紧的,但意外还在后头。飞机延误了,不知道是上海那边的天气情况还是福州这边 的交通管制,总之飞机延误了两个小时之后才起飞。到了上海,是完全不一样的情 景,从虹桥出来,是一路飞奔的状况,他在南站等我,我一路短信报着军情,交换 者公车、地铁前进,虽然有着五年前对上海交通的认识,实际上还是低估了……火车 开动前十分钟左右,我终于在南站找到了阿闹同学,就差抱头痛哭了……
后来发现我跟他穿的 T-shirt 衫居然是一样的,我的是 361。黑色,他的是白色, 款式都相同,活脱脱一个黑白配。这种小概率的撞衫事件都会发生,DAMN。。。
在火车上聊了六个小时之后,终于到了合肥,已是晚上十点多。打车的过程中碰到 了超有性格的师弟,跟他发生了点小摩擦。因为看他很像小混混,不怎么想搭理他 的样子,但他希望和我们一起搭伙打车,之后又坚持要付自己的那份款,架势很像 打架的样子,拉着我的手,一定要我收下,这么耿直的孩子,我都快感动得哭了, 费了好大的劲才把他给踢走。
合肥刚下了一阵雨,凉风习习,想找个地方住却越发困难了,跟阿闹同学转了许久 都没有合适的,周六的晚上,在学校周围找地方住总是很困难的。还好有我们当年 的书记在,骑着自行车从工大出来,给我们指出了一条康庄大道,在学校北门往 西,有家新开的旅馆。果然是新开的旅馆,我跟阿闹走进房间的时候,还有很重的 装修味。晚上没啥活动,到北门对面吃了一顿饭就回去睡觉了。记得还是那家炒饭 的大排档,当年有一次我在那跟老板神聊,后来拿了炒饭转身就走了,回到寝室才 想起来,钱款未付呢,霸王餐就是这样发生的……神聊容易误事,这次是阿闹同学买 的单,还好。
第二天又有两位同学到了,阿辽同学跟艺术家同学、七妹,加上还在工大以及科大 读研的兄弟,敏生和 K 娃,差不多有十个人了,热热闹闹的。中午大吃了一顿,下 午如了阿辽同学的愿,逛了包公祠,门票已经涨到 ¥25 了,记得五年以前进去的 时候,才 ¥15 而已,门票也会通货膨胀的么,五年就要翻一翻?可里面还是老样 子,感觉挺不值的。晚饭是书记同学请客,到不倒翁吃了一顿,可惜 K 娃明天还要 考试,晚上又少了一个人。我们几个穿着拖鞋就进去了,见到了书记的女朋友,大 家如今都有主乐……
晚上 K 歌,阿辽同学给我点的第一首,居然是已经反反复复听了无数次的工厂测试 歌曲,这让我又想起了撞衫事件……我发现因为工作关系接触到的测试歌曲给我带来 了不少好处,虽然唱功不行,可歌曲的调子都还记得,反正歌词可以看,怎么都哼 得下去。麦霸就是这样产生的,发现如果对谁不满,就邀他一起去 K 歌,我绝对可 以让他吐着出来。实话说,这方面,还是艺术家的声音最好,其次是书记,两个人 合作的《ONE NIGHT IN BEIJING》无敌的。
怎么少得了龙虾大餐呢,当年大四的夜晚,大家最期待的就是弄一顿小龙虾了,这 一顿吃得大家满嘴通红,手也通红,火辣辣的。夜深了,这是我合肥之行的最后一 个晚上,明早逛一圈工大,就准备回去了。为了照顾我的最后一晚,阿辽同学跟阿 闹同学,两位最瘦的兄弟同睡一床,我独占了一床,大家又猛聊了一阵,许久才闭 上眼睛。
第二天太阳挺大的,几个人说好到工大食堂吃一顿早饭,意外碰到了 HY 同学,又 可以刷饭卡了,而且是别人的饭卡,那个兴奋啊。接着给 L 同学寄了一张明信片, 那张 ¥25 的包公祠门票,翻过来就是给你留念的,不用白不用。阿闹同学之前撕 掉了他的那张,顿时抓狂。都说现在斛兵塘臭,可再怎么臭也是工大的一大景点 吧,而且,在工大的,谁没吃过斛兵塘的鱼呢,都吃下去了还有什么好怕的。借了 艺术家的相机狂拍,照片有时间再上传吧。走在熟悉的校园里,回想当年的读书的 事情,往昔依旧,可一年就这样过去了,脱学一年了……“是不是该走了,十点四十 了!”阿辽催我了。赶紧回去收拾东西,告别了 HY 同学,准备告别合肥了……
可没想到在工大门口,十五分钟都打不到车,看着车子嗖嗖地过去,可里面都坐着 人啊。好不容易拦下来一辆,我说“到火车站。”接着师傅跟我急了,“我这车气不 够,我还要去加气呢。”赶人了。完了,不行,再拦,终于拦到了一辆车,已经十一 点十五了,十一点二十七的火车啊,师傅看得出来我急,也下狠劲往前赶,可惜, 还是可惜,一路上遇到了四个红灯,而且我已经不是一年前的我,有那么好的运气 伴随,即便飞快地挤进了候车室,可连车屁股都看不到。不死心,问了一位工作人 员,被白了一眼,“几点了?”“十一点半……”推脱了一阵,才心急火燎地走开。
我定了十九点四十分的飞机,在上海虹桥,可合肥到上海最快的公共交通工具,就 这一趟 T 字头的旅游列车了,我怎么不能早点意识到这一点呢?从火车站出来,一 路上看着合肥新建起来的高楼大厦,什么心情都没有。接着马上到了长途汽车站, 问了一阵,最早的车是下午一点走,到上海七个小时左右,问了阿闹同学,他说, 如果下车地点是南站的话,应该还来得及,买票吧,已经没有选择了。
上了这辆车,横竖就看天了。看旁边坐的是一副学生样,玩弄着巨眩的惠普电脑, 全屏手写,屏幕还可以拆下来玩,于是忍不住问了一下,“这车到上海大概几 点?”“七点半左右吧”“不是说六个小时能到吗”“七点半算是早的了,其实我 今晚还有课呢,我也急。”可他哪有我急!MD,长途汽车站的时间靠不住。
一路上,都有乘客在骂这车走得慢,说晚上八点都到不了,我死了心了,什么都不 理,没想到死心还有效果。车子走着走着,怎么感觉就像时光倒流的样子,往后退。 看着就被后边的车一辆一辆地超,真是什么车都能超它,面包车也有、皮卡、还有 大卡车,也不知道是运钢筋还是什么别的。接着,车子闹脾气,空调不转了,车内 骤然升温,大家反而坐得住了,安静了下来,终于知道这不是师傅的问题,这种车 子是很经骂的。我是一直都坐得住的,心都死了,坐不住才怪。
没想到进了上海收费站,也才七点多而已,天开始变黑。我相机而动,在车没到终 点站的时候下了车,也不知自己在哪,跑到了一个招牌比较亮的店门口,招了辆 的,“麻烦师傅快点,虹口机场。”,“虹桥吧,看你急得,几点的飞机啊?”我都不 敢跟他说几点的,就说让他开快点就成。师傅打开了 GPS,然后用手机拨通了某个 号码,开始用上海话问该怎么走,我真后悔,看他对这一带也不是很熟的样子,功 夫不够,还出来混。不幸被我言中,这位师傅开着语音导航的 GPS,还是上错了 路,只听到他不停地跟我说,“这条路应该是最快的……”可我怎么感觉就不快呢。然 后转过了一个路口,他是真的为我急吧,居然闯了红灯,于是他坐不住了,一边跟 我说闯红灯严重了,一边拨通某个号码,又开始问了……“要是没按时把你送到,我心 里过不去。”这个服务态度,就是好啊,要是功夫好就更好了。其实我心里是有个期 盼,希望这趟飞机跟之前延误的那趟一样,悠着点,总得给我点机会吧。
十九点五十,到了虹桥。我跑了进去,可希望落空,这趟飞机没有延误,已经在天 上飞着了。问了厦航,那边今晚已经没有飞机了,但告诉我,机票可以退,“在哪买 就在哪退。”我心里稍稍放宽了一些,她们又告诉我,东航那边今晚还有回福州的。 我赶紧过去问,是晚上十点钟的飞机。看来今晚还有戏,不至于在上海过夜。
匆匆把随身带的东西吃完,赶紧排队进了候机室。打开《体坛》,本以为是在火车 上可以看的,这会儿直到现在才翻得开。讨厌的喇叭开始响了,最怕听到的就是延 误的消息,还好,这次是汕头的。接近十点,人群开始骚动起来,小道消息说福州 那边飞机还没起飞呢……完了,为什么赶上飞机延误的都是我?果然,不多时,讨厌 的广播开始宣布飞往福州航班延误的消息。这年头,什么都靠不住。
老妈打电话过来,问我在哪,好奇我为什么不坐火车呢,然后用一个进了候车室三 天后才飞得走的故事告诫我,坐火车就会更好。谁受得了,我说我手机快没电了, 安慰她说没事的,就要离开了,待会儿会给她电话。
我手机是真的快没电了,只带了两块电池,支撑了三天。但想起当年就是她带着我 坐飞机的,现在转变得也够快的,我想我是一直跟不上时代。候车室人越来越少, 就剩我们这个航班的了,周围有从国外回来的,说二十四小时都没睡过觉,接着高 声谈论、对比着国内外的差距,有儿女在外头,出来的声音就是不一样,周围又是 一阵附和,想睡觉都难。讨厌的喇叭又开始吵了,还好,这次是利好消息,零点可 以起飞。
东航的飞机要比厦航的好,空姐也都漂亮很多,可惜了,没有心情。想睡觉却没有 空间,看大家都很兴奋的样子。郁闷的是,如今哪儿都有小孩子的身影,汽车、火 车上……在你最想休息,最希望安静的时候,她会来一阵啼哭,冲破宁静;或者小吵 大闹的,随处可见他们活力四射的叫喊着,撕扯着,躲都躲不开。
凌晨两点四十五,终于到家了。路上的士司机告诉我,刚才的雨下得好大,看着干 净的道路,迎着雨后的清新,这种感觉,真是让人受不了。
每当和 LX 同学谈起一年之前的那个傍晚,俩人都忍不住地笑,我们离开学校的方 式,总有些特别,而这特别于我,又有些戏剧的色彩。
那天下午,在工大北门对面的小雅饭馆,我和室友们饭都没吃完,就赶紧冲了出来。 从合肥开往福州的火车,时间卡得就是那么紧,之前刚送走了一位好友,接着在寝 室收拾了点东西,大家都还在送别的状态,寝室人都不齐,等到人快齐的时候,赶 紧先聚着吃个饭吧,可是要把这个饭吃完,时间好像不大够,眨眼间就到了我要离 开合肥的时候了。
正当我和室友们急急忙忙地冲出饭馆,抬头一看,前面那黑压压的一堆人,不就是 要和我一同赶往福州的 LX 同学吗,我们这边好歹也把饭清扫得差不多了,他们菜 都没上全,不得不整班人马,全部撤退,送人要紧。。。
我和他时间观念都不强,行李都还在宿舍呢,于是室友们就跟我说,他们留在学校 北门负责打车,我还是赶紧先回宿舍拿行李去。我急啊,和 LX 同学以迅雷不及掩 耳盗铃之势冲到了宿舍楼下,推开拥挤、围剿在大门前,焦急着等待收购二手耐用 品的大妈们,气喘吁吁地回到了宿舍。
本以为按照我的风格,要带走的东西早已收拾得干干净净,绝无遗漏,随时都可以 拎包走人,但到后来我才发现我遗忘了一件很重要的物品,从玉高就开始跟随着 我,一直到离开学校前已经整整七年的大口盅。当我迈着匆忙的脚步离开了宿舍, 把钥匙交给楼管大妈,开始深情的对这个学校说再见的时候,却没有意识到我把它 永远地留在了合肥。
话说等 LX 同学也收拾完了东西,大家一起冲出宿舍楼,他的同学已经把的士喊道 楼下了,我还没完全反应过来,人和行李就被塞到了的士里,这的士司机时间观念 比我们强多了,我们都还没坐稳呢,他一加油门,感觉车都没热起来,已经快开出 学校西门了。
我的头一直朝着学校北门,我的室友们还在北门呢,我还没跟他们说再见呢,我的 肚子里都还憋着一大堆话呢……这不是不辞而别吗?
车子在马路上飞奔,我只好用手机一个个地拨通室友们的号码,跟他们道别。我没 有想过我会这样地离开,我也没想过我会这样地说再见……
我和 LX 同学还是按时赶到了火车站,月台上已经没人了,因为时间太赶,让在火 车站等待的 B 同学焦急了好一阵子,因为票在我们手上,错就错在我和 LX 同学 都太过慵懒了。好在我们终于还是赶上,等到火车开动的那一幕,无数的思绪涌上 了心头……
上次有提到过这个故事,最近更是有在饭桌上听到了领导回顾当年的感慨,我也有些 感慨,我心里面也有些故事,我只好把它写了出来。
xcscope.el 的搜索实在是太慢了,慢到我用 grep 都可以立马定位到的东西,它却 还要搜索半天,在定位匹配到的 buffer 里,几乎是看着它一条一条打印出来的, 而我要搜索的代码,又哪里算是大工程。
与 xcscope.el 相反的是,gtags.el 的搜索是相当快的,之前我也有说过 CSCOPE 和 GTAGS 相比较的问题,当时对 gtags.el 的感觉就是使用太不人性化 了,在搜索结果的条目里面,我总要 C-e 才能看到上下文,对我来说是太不方便 了,但是它的性能我是觉得很满意的。
还好让我找到了 xgtags.el,让我不需要在 xcscope.el 和 xgtags.el 中做出抉 择,它有着 xcscope.el 界面,但却使用 gtags 做 tag 搜索引擎,兼顾 xcscope.el 的界面人性化和 gtags.el 的效率。
接着我把当年呼出 xcscope 的按键绑定都移到了 xgtags 上。一部分定义在 c-mode-base-map 中,另外一部分定义在 xgtags-mode-map 中,要不然似乎会引 起冲突。
我设置成在 c-mode 或 c++-mode 下按 F7 后,于当前文件夹下生成 GTAGS 和相关 文件。注意最好是在项目的顶层目录,因为 gtags 默认一层一层往上查找 GTAGS 的,若你在项目的子目录中生成 GTAGS,它不会往上层目录查找 GTAGS,因此会失 去一些 tag 索引。
在 c-mode 或 c++-mode 中的按键安排如下:
在我设定的 xgtags 输出查找结果的小 buffer 中,按键安排如下:
(require 'xgtags) (add-hook 'c-mode-common-hook (lambda () (xgtags-mode 1) ;; c base mode keys ;; (define-key c-mode-base-map [f7] 'sucha-generate-gtags-files) (define-key c-mode-base-map [(meda .)] 'xgtags-find-symbol) (define-key c-mode-base-map (kbd "M-p") 'xgtags-pop-stack)) t) (defun sucha-generate-gtags-files () "Generate gtags reference file for global." (interactive) (cd (read-from-minibuffer "directory: " default-directory)) (shell-command "gtags --gtagslabel gtags") (xgtags-make-complete-list)) ;; xgtags mode map ;; (define-key xgtags-mode-map [(control .)] 'xgtags-find-tag-from-here) (define-key xgtags-mode-map [(control ,)] 'delete-other-windows) (define-key xgtags-mode-map [(meta .)] 'xgtags-find-symbol) (define-key xgtags-mode-map [(meta ,)] 'xgtags-find-pattern) (define-key xgtags-mode-map (kbd "C-M-.") 'xgtags-find-rtag) (define-key xgtags-mode-map (kbd "C-M-,") 'grep-find) (define-key xgtags-mode-map (kbd "C-M-/") 'xgtags-find-tag) (define-key xgtags-mode-map (kbd "M-p") 'xgtags-pop-stack) ;; xgtags-select-mode-hook ;; (add-hook 'xgtags-select-mode-hook '(lambda () (define-key xgtags-select-mode-map [(control f)] 'forward-char) (define-key xgtags-select-mode-map [(control b)] 'backward-char) (define-key xgtags-select-mode-map [(meta p)] 'xgtags-pop-stack) (define-key xgtags-select-mode-map (kbd "SPC") 'sucha-xgtags-select-tag-other-window)) ) (defun sucha-xgtags-select-tag-other-window () "Selete gtag tag other window." (interactive) (xgtags-select-tag-near-point) (delete-other-windows) (split-window-vertically 12) (switch-to-buffer "*xgtags*"))还对 xgtags 的界面做了一些设置,突出匹配的 tag 上下文。
(custom-set-faces ;; xgtags faces ;; '(xgtags-file-face ((t (:foreground "salmon3" :weight bold)))) '(xgtags-match-face ((((class color) (background dark)) (:foreground "green3")))) '(xgtags-line-number-face ((((class color) (background dark)) (:foreground "maroon3")))) '(xgtags-line-face ((((class color) (background dark)) (:foreground "yellow3")))) '(xgtags-file-selected-face ((t (:foreground "salmon3" :weight bold)))) '(xgtags-match-selected-face ((t (:foreground "green2" :weight bold)))) '(xgtags-line-selected-face ((t (:foreground "yellow2" :weight bold)))) '(xgtags-line-number-selected-face ((t (:foreground "maroon2" :weight bold)))) )贴完了配置代码,不得不提一下 company-mode,非常炫的补全前端,
建议访问一下company-mode 的主页,点击“preview demo”观看演示视频。作为一个 补全前端,它可以利用诸如 dabbrev、elisp、semanticdb、或是其他自建的分析后 端作为当前缓冲区搜索补全的引擎,我在我的 c-mode 或c++-mode 中,设置使用 xgtags 生成的 completes-list 作为 company-mode 的后端。
请访问 emacs-wiki 中利用 gtags 作为 company-mode 的后端,将这部分拷贝作为 文件,命名为 company-gtags-completions.el,放在 emacs 的 load-path 中,可 以和 company-mode 的文件放在一起,我就是这样做的。
以下部分需要打开 gtags.el 的支持,按键配置如下:
;; company mode, better completion ;; (add-to-list 'load-path (expand-file-name "~/.elisp/company/")) (require 'company-mode) (require 'company-bundled-completions) ; mass install (require 'company-gtags-completions) ;; 我自己的 completion rules ;; (defun sucha-install-company-completion-rules () "gtags and dabbref completions for C and C++ mode" (company-clear-completion-rules) ;; (company-install-dabbrev-completions) (company-install-file-name-completions) (eval-after-load 'company-gtags-completions '(company-install-gtags-completions)) ) (add-hook 'c-mode-common-hook (lambda () (company-mode 1) (sucha-install-company-completion-rules) ; refers to the function ) t) ;; company mode map ;; (define-key company-mode-map [(tab)] 'indent-for-tab-command) (define-key company-mode-map [(meta j)] 'company-cycle) (define-key company-mode-map [(meta k)] 'company-cycle-backwards) (define-key company-mode-map [(backtab)] 'company-expand-common) (define-key company-mode-map (kbd "M-SPC") 'company-expand-anything) (define-key company-mode-map [(meta return)] 'company-expand-common)company-mode 的主页上说需要使用 emacs22,实际上 company-mode 在 emacs23 中也是可以使用的,至少我也是这样用的。在使用 emacs 的过程中,当有新的想 法,或出现问题的时候,除了 google,TheEmacsWiki 也应该是最先考虑的,毕竟 里面货多啊。
[1] 是 xgtags.el 的主页,不是 xcscope.el 的,2008/06/17
地震过去一段时间了,只感觉能做的非常有限,仅仅是捐了力所能及的钱物。说起 地震的那天,在福州是一点感觉都没有,那时因为上班时间,忙着弄手头的事情, 都没时间上网看报道。
下班回到家才发现事情的严重性,赶紧联系各地的同学,还好,大家都平安,虽然 成都、西安的同学在短信联系的时候还睡在操场上,但听到他们平安的消息,心里 稍稍安定下来。之后是上网看新闻以及视频报道,看得夜深了都睡不着……
前段时间在福州感觉到了一次地震,那时我正在洗澡,突然间头晕目眩,有那么一 两秒的时间,当时我以为自己晕掉了,怀疑是上班太累,平常睡得太晚,身体憔悴 所致,之后我甚至自己晃了几下,都未能重复之前的感觉,那种怪怪的味道。直到 第二天,在公司听他们说起昨晚的地震,才联系起来。
地震似乎是不可预测的,在地震发生期间那么短的时间里,人的反应、人的思考, 能做的很有限,或者只能期望于预防性的建筑设计了,否则都只是事后的事情。
本来答应同事一起去看奥运火炬的,无奈昨晚睡得太迟,今天醒来的时候发现火炬 已经到了马尾,坐公车是追不上了,早饭还没吃呢,算了,晚上看新闻算了。
之前公司有发邮件召集奥运火炬助跑手,才收到这封邮件五分钟不到,接着马上来 了另一封,说名额已满,大家不用再继续报名了……刚开始还真的以为是可以助跑 的,后来发现其实只是到那儿做啦啦队而已,跟小学时候参加某某大会凑人数喊“热 烈欢迎”是一样的。不过没能到现场看一看,还是有点小遗憾。
发现我是越来越懒了,这可不是一个好兆头。
上周的五一长假,公司只放了三天,在这仅有的三天里面,去加了两天班,因为之 前被拉到了一个具有“悠久历史”的半截子项目里面,手头事情很紧很急,不加班都 不行。还好,终于把事情搞定,项目最终也按时完成。要是下次再被拉到一个半截 子项目中,一定要牢记于心,没有什么半截子项目,这绝对是一个比新项目还要棘 手的老项目,在文档不全的日子里,把当年负责这坨项目的头头找到,才是最要紧 的事情。
剩下的一天节日时间,跟几个同事一块玩蹦极去了,尝一尝惊险刺激的感觉……终于 知道跳楼的感觉是什么样了,那种速度,会让你感觉窒息、感觉无助。反而刚跳下 去倒不会让人害怕,虽然跳的地方很高。
让我印象最深的是刚跳下去速度最快那阵子还有第一次反弹到高空停滞那会儿,虽 然知道自己被一根绳子拽着,安全没有问题,但是在高空上弹来弹去,茫然四顾, 无依无靠,身体的姿态都无法控制,只能靠着那根弹来弹去的绳子时,相当地无奈。
这次蹦极,也让大家“丑态毕露”。有猫扑下跳,怀疑是被人家不耐烦直接踢下去 的;也有下去之后,猛蹬腿,以为可以高空踩单车腾云驾雾的;还有就是下去之后 抱紧绳子,生怕救命之绳会断,玩真空蹦极的……
只可惜大家手头都只有百把万像素的手机,再努力基本上也只能是看到一个物体下 落,谁谁谁做了什么就不清楚了。所以大家该怎么下去的怎么下去,该怎么玩的怎 么玩,上来之后,谢天谢地再说。
在 cs#EmacsWikiJournal 的下载介绍部分做了更新。
最近将将 emacs 更新到了 version 23,但在和以前的一些旧软件配合的过程中遭 遇了不小的问题,emacs-wiki-journal 在 emacs 23 上面需要 emacs-wiki-2.72 的支持才能正常发布,而之前的 emcs-wiki-2.70 配合 emacs 23 已经不能使用 了,中间版本 emacs-wiki-2.71 还没尝试过,省点力气,不想再尝试了。
而 emacs-wiki-journal 配合 emacs-wiki-2.72 在 emacs 23 上发布文件的时候, 还是会遇到 warning 的问题。后来发现是 emacs-wiki-srctag.el 文件中的一条语 句引起的,因为在发布的文件中恰好包含了 <src> tag,只要将这条语句 comment 掉就可以了,具体的语句是:
;; (search-forward "</pre>")文件中仅有的一条 search-forward 语句,在使用到 <src> 的时候会造成 search 失败,后果是无法发布 index.html,整个发布过程就无法自动化了。
这部分也在 cs#EmacsWikiJournal 做了更新。
本以为清明可以放假,后来发现这只是一个小小的奢望,现实中的我被强制窝在某 个地方听讲座去了。
整整两天时间,都在听关于职业素养方面的讲座,收获倒也很大。对我来说,从学 校出来,从学生变成一个职业人是那么漫长的一个过程。都说工作难找,但当你找 到了工作,才发现万里长征,仅仅只开始了第一步而已。
路还很长。
最近弄代码巨不爽,因为不得不用 Source Insigh 了,可是 Source Insigh 只是 个代码浏览器而已,用它来编辑简直要让人发疯,而之前一直使用的 emacs + ETAGS 的方式功能实在有限,虽然它支持的编程语言是那么的多。
于是好好武装了一下我的 emacs。先找到的是 cscope,相比 etags,只能说不是一 个档次的,其中实用的功能在你修改代码却不得不用 Source Insigh 的时候就知道 了。同时有比较过 xref,因为使用不惯而放弃,虽然看起来它的功能更为强大些, 不过对于我,还是够用就好。
也有下载了 GTAGS 尝试,相比 cscope,显得不那么人性化,索引显示的时候没法 显示调用这个符号的函数,不过这还能让人接受,只是后来当我试着在 c-mode 中 将这些功能函数替换之前使用的 etags 函数时,发现 cscope 更为符合我的要求。
实话说,gtags 索引的速度真的是飞快,特别是在索引大量引用的符号时,差别就 出来了,我这是说在使用 emacs 作为前端的时候,另外 gtags 还有和 etags 一样 的补全功能。还好我需要索引文件不多,hippie-expand 也足够我的使用了,无情 的现实只是让我不得不用 Source Insigh 了而已。
我是看上了 cscope 更加人性化的表现,但是要把它融合到我的 emacs 中才好。下 面贴的配置,大部分都是一些按键绑定,还有一些辅助功能的实现,那完全是我的 习惯,替换了之前一直使用 etags 的功能函数。另外,我发现在 cscope 中,用 cscope-find-this-symbol 将函数当成符号来搜索,其第一个匹配项,就是 cscope-find-global-definition 所实现的,只不过其另外的一个无 mini-buffer 提示的版本 cscope-find-global-definition-no-prompting 显得更为简洁而已。 因此,我将 cscope-find-global-definition 系列函数无情地抛弃了。
下面还用列出了 bookmark,在需要的时候记录一些关键的地方,方便以后回查。跟 Source Insigh 的 mark 功能不一样,那个是关了页面或是工程之后就消失了的, 这也是让我一直郁闷的地方,而 emacs 的 bookmark 可是一直存在的。不过,鉴于 工程繁多,建议一个工程一个 bookmark,反正使用上也是很简单的,不会造成繁 琐。
关于下面的按键绑定,一般我的查看操作都是这样,遇到函数,就 "C-.",使用 cscope-find-this-symbol 来查找,cscope 会把索引到的输出到一个 11 行的小窗 中,窗口的高度在下面定义的注释为 height 地方调整。然后光标定位到 cscope 的结果窗口,n 或 p 就可以上下跳转 tag 并在大窗中查看具体的上下文,如果查 看结束,"C-", 关闭窗口,pop-mark,回到之前的位置。
如果有多次跳转,可以一直 "M-,",做 pop-mark 的动作。反正可以按照你的习惯 来定义按键,下面列出的只是一个方案而已。
;; for C and C++ programming (add-hook 'c-mode-common-hook (lambda () ;; (define-key c-mode-base-map [(shift tab)] ;; 'complete-tag) (define-key c-mode-base-map [(control .)] 'cscope-find-this-symbol) ; symbol (define-key c-mode-base-map [(control ,)] 'delete-other-windows) ; end search (define-key c-mode-base-map [(meta .)] 'cscope-find-this-text-string) ; text string (define-key c-mode-base-map [(meta ,)] 'cscope-pop-mark) ; come back (define-key c-mode-base-map (kbd "C-M-.") 'cscope-find-functions-calling-this-function) (define-key c-mode-base-map (kbd "C-M-,") 'cscope-find-called-functions) (define-key c-mode-base-map (kbd "C-M-/") 'cscope-find-files-including-file) (define-key c-mode-base-map [f7] 'sucha-generate-cscope-files) ; generate cscope file (define-key c-mode-base-map [f9] 'bookmark-load) ; load special project bookmark (define-key c-mode-base-map [f10] 'bookmark-write) ; load special project bookmark )) ;; keymap in cscope result buffer (add-hook 'cscope-list-entry-hook (lambda () (sucha-cscope-set-list-entry-window-height 11) ; 11, height (define-key cscope-list-entry-keymap [(control ,)] 'sucha-cscope-close-window-and-pop-mark) ))下面贴的是一些支持函数,是上面绑定按键代码需要用到的,因此最好放到一起, 注意下面注释后面出现的关键字,有 win 和 linux 的区别。cscope 生成索引的脚 本文件 cscope-indexer 在 win 下是不管用的,因为没有好用的 shell 的支持, 不过我们的源代码一般都是堆在 /src 下面,因此用 cscope 的 -Rb 选项就好了。 不过 cscope-indexer 的作用可不止这些,里面的注释有说到,如果你的是大工程 的文件,并且文件堆在好几个地方,不得不用 cscope.files 来标明,可以将这个 脚本放在 cron 里面,定时增量更新 cscope.files 列出的文件。
算了,这么高级的功能暂时还用不上,权且将其绑定在一个按键上偷偷懒吧。
(defun sucha-generate-cscope-files () "Generate cscope.files for cscope." (interactive) (cd (read-from-minibuffer "directory: " default-directory)) ;; (shell-command "cscope -Rb")) ; for win (shell-command "cscope-indexer")) ; for linux (defun sucha-cscope-set-list-entry-window-height (wanted-height) "set cscope-list-entry-window height." (interactive) (shrink-window (- (window-height) wanted-height)) (recenter 1)) (defun sucha-cscope-close-window-and-pop-mark () "close cscope-list-entry-window and pop-mark. only use in cscope-list-entry-mode." (interactive) (other-window 1) (delete-other-windows) (cscope-pop-mark) (recenter))上面的按键绑定只是在 c 和 c++ mode 里面起作用,因为 cscope 支持的语言有 限,etags 还是有作用的。
都说忙是一个借口,时间嘛,“只要愿挤,总还是有的”,话是没错,但也要因人而 异,因为有些人,譬如我,总会在不知不觉中,把自己的时间,都挤到了工作上……
闹得最近没天没夜的是一个三个人合作的小项目,其实也没啥大需求,目的只是考 察大家的协作能力,简言之,为转换部门之后的第二阶段培训项目……项目虽小,五 脏俱全,包括项目时间上的安排、文档的编写、以及程序的功能模块划分,等等。 对于之前只懂得单打独斗的我,是一个大大的考验。
在学校的时候哪里有项目的说法,大不了千把行程序,交上去就行。
可是在公司,东西都正规化了,为了让来自五湖四海不同部门的人,有一个交流的 基础,产生了培训的说法,然后是产品生命周期的管理,文档也要配备起来……
一开始项目遇到的最大障碍,是对实现本身的不了解,是技术上的问题,而需求, 在大家的努力下,在很早的时候就形成了文档,已经不存在盲目的说法。之后是一 步一步地摸索,寻找可行的实现方法,然后再一起讨论,流程、分工……我那部分代 码,到今天已经完成得差不多,而今天最开心的事情,是和另外一位同事的代码成 功整合在一起了,不过周日还有得忙,到那个时候,三个人的代码都要揉合在一起, 在我们无尽的想象当中,那是很美好的一天。
今天还在上班的时候,突然接到家人急急的电话,听筒的那一端不停地在诉说电脑 如何不好用的问题,速度变得如何慢,打开页面都要好久,然后是一串详细的叙述 ……每当此时,我总是很无言,为设么总是假期之后,我不在场,才发生了这样的事 情呢。记得还在大学的时候,每次假期结束回到学校,总是有接到这样的电话,难 道我才是系统的破坏神?杀毒似乎不管用,重装才是唯一的办法,不过即便这样, 速度还是有一点慢,我在这边都可以感觉得出来。
春节回家的时候没有从广州过,我想我是有点小运气的,在买票的最后关头,决定 还是回南宁保险一点,这一次倒是抽到了一张好票,即便从深圳转也才花了十几分 钟,一路上真的是顺风顺水,晴天伴我行,天晴到了玉林,走的时候才下雨……广州 给我的印象,除了长长的地铁,还有就是记忆中的那个广场,那个不夜城。
离好运只是差一点点,3 号那天下午 PIECE 踢球,那时我还在从南宁返回玉林的途 中,错过了那场全明星赛,虽然在踢球方面我是门外汉,可是能上场露个脸也好啊, 毕竟是有录像转播的。也怪我托堂哥买的票时间比较迟,之前是有考虑了天气、堵 车等等的问题,怕赶不上,当发现考虑得太多了的时候,已经迟了。
玉林没什么变化,因为我快认不得路了……在来福州之前,有和 PIECE 们去看《长江 七号》,虽然坐得很近,但总感觉不值,因为那个模糊的镜头,让人明显感觉是枪 版,还有那个平凡的中国 E.T 故事,浪费了我的十五块钱还有那个好位子。在玉林 多少年没看电影了,小时候总是学校带头组织,等我们自己组织起来的时候,却遇 到了枪版,DAMN...
准备回福州的时候,天气已经好转了,这回还是从广州过,买到了很便宜的票,打 折打得厉害,而且还遇到了小说般的故事。我本来想自己去买票的,跟家人打听好 门面地点,但逛了一圈居然没有找到,反正是没有找到挂着大大牌子的什么售票处 之类的。后来还是家里人买到了票,当时我不在场,在帮填单的时候,售票员突然 说,这个是不是就是那个谁谁谁啊,家人一攀谈,居然是我的小学同学,然后小学 班主任的名字,还有当时班里的那些公众人物,全被搬了出来。毕业十一年了,跟 她还没见过面,玉林城真的是很小,无数的故事说明了这个事实。
说到小学,自从去年成功举办毕业十周年聚会以来,今年似乎又有新的计划,因为 去年的那个时候,一些兄弟姐妹因为各种原因未能到场,比如上文说到那位同学, 我去年似乎就没有见到。但今年似乎应者寥寥,若经常见面,就失去那种珍惜、怀 念的意义了。
闲下来的时候总喜欢去爬山,有亲近自然的感觉,而且还可以锻炼身体,呼吸新鲜 空气,在没日没夜的生活当中,算是一种放松吧。