Archive for June, 2007

Emacs 版衫设计

Friday, June 29th, 2007

最近 newsmth 的 Emacs 版在征集版衫设计。我不知道这么远是不是能在那里订版衫。不过还是跟风做了一个。 图像处理工具用得也不熟。抽取 simple.el 中的代码帖了一大段到背面,我想也许会看起来 Cool 一点。

My design of Emacs T-shirt


如果太远了订不到的话,有机会不妨在 freecity 也做一个 Emacs 的版衫,这边也有很多人用 Emacs 的。

辞去 cc98 Linux 天地版版主职务了

Friday, June 22nd, 2007

申请过三次版主了,这还是第一次申请辞职。请辞贴发出去以后看到大家都来道别,才发现是如此的伤感。何况 cc98 Linux 天地是我如此喜欢的地方了。

最初 Linux 天地版自从 Lnzju 走后,有一段时间处于无版主状态,人气比较差,也没有人管理。后来站务的阿杆和我联系了下让我去申请版主(我和阿杆也是挺熟的)。我清楚地记得在我申请版主的那个帖子里面,就有人在讨论起是否要关闭 Linux 天地版,说人气太差,而且也没有见到什么实质性的内容在讨论。我当然非常反对,技术版面本来就不应该用人气来衡量,而且也不能指望大家都整天去研读内核源代码。总之颇有一种“奉命于危难之中”的感觉。我也想把 Linux 版面建设好。

同样是 freecity 的 LinuxApp 版主,我在 cc98 使用完全不同的一种管理办法,管理得比较宽松。但是为了避免版面变得太水,我干脆建立了一个“官方水楼”,然后时不时转一些帖子,以及一些原创的东西贴到上面。慢慢的人也开始多起来。我不知道是不是以前大家都在潜水的,好像现在有了一个水楼可以随便讨论了。后来有那么固定的一群人,相互也熟悉起来,在水楼里面不仅仅讨论 Linux 了。因为其实 Linux 爱好者只有一小部分是来自 CS 的,所以水楼里面经常看到数学、物理甚至形而上学的东西。我很高兴,因为我觉得大家都和我一样,已经把这里当做了另一个家了。而这也无疑是我见过的含金量最高的水楼了。

人气渐渐旺起来,讨论也活跃起来。我们一小堆人偶尔还去风味腐败一下,来个版聚。记得上次毅行整整组了三个队伍,可惜我们都很穷,没有相机留下什么照片。不过也有一个问题,大家似乎都喜欢在水楼里面讨论,许多东西很快就被淹没了,我们也讨论过这个问题,想过一些解决办法:

  • 另外开一个楼,专门讨论技术问题。这个是不切实际的,其实闲聊和技术真的是不那么容易分开的
  • 另外开一个楼,用于整理水楼里面的技术贴。这个工作量太大了,而且有些帖子没有上下文的话,又看不懂了
  • 搜索。 cc98 好像没有公开的全文搜索引擎。danran 贡献了一个 Python 脚本用于搜索水楼,不过并没有任何缓存,每次抓取一个页面进行字符串搜索,用起来还算可以了。不过大范围搜索就会非常慢的

总之最后还是默许了“水楼模式”。其实没有什么不好的,我建立官方水楼并加为精华还有一个原因就是想保留一些东西。我有收集一些生活中的小东西的癖好,比如草稿纸,我觉得这些小东西常常带着一些生活中的小片断,没事的时候突然看到,总会有一些记忆浮起来,是非常开心的。没有记忆的人是最悲伤的了。而 cc98 似乎就是一个很“健忘”的“人”了。也许是水太大了吧,它总会定时清理帖子,帖子如果没有加上精华的话,过一阵子就找不到了。我在前一篇 Blog “消失在以太中”里讲到了,这似乎是目前这个虚拟世界的一个通病。我不可能给每一个帖子加上精华,所以只能保存一个水楼了。这个水楼真是一笔财富呢!

这一切都得多谢 Lnzju、丁三、RainFlying、miu、macrohard、pfermat、moonykily、danran、ajian、Ranger、逍遥天地、churchmice、Aspirin 等人的大力支持!谢谢你们造就了这个家! :)

不过这个学期一来好像突然忙了许多,虽然也常在版面上潜水,不过真的关注得比较少了,也很少有时间去回答问题了,以前的一堆人似乎也忙起来,好像不再有以前那种一天水上 1000 贴的气势了。不过让我高兴的是有许多新人加入进来,像 timedcy、quark、撒旦、softyun、mikeandM、寒水远山、w185786775 等。新的力量似乎取代了原来的“水楼模式”,但是热闹的气氛还在。说实话,去年的时候我真的很担心 Linux 版下面的交接工作要怎么做,06 级对 Linux 感兴趣的似乎并不多,要么是太牛了,直接去 freecity 了。可是现在看到这个场面,我就非常放心了!

于是我意识到该辞职的时候到了。一来自己确实没有太多时间管理好版面了,二来是要给新人们让位置了。唉唉!真奇怪,想起我刚进大学那会儿,我才大一呢,现在我竟然马上就要大三了。

深夜写了一个华丽的请辞贴(学当年 Rhythm 的 :)),便这样走了

辞职了

看到这个公告的时候发现自己已经不是版主了。感觉真奇怪,毕竟是第一次卸任。看到大家的道别,还真有些伤感。不过我又不是从此消失了,虽然不是版主了,但是我还是会回来灌水的! :D

消失在以太中

Friday, June 22nd, 2007

The Times 里面有这样一篇文章 History 1980-2000 has disappeared into the ether. Sorry 。我也时常看到这类的讲到如今的电子信息易失的情况。确实,对计算机越了解应该也就越知道这些内幕。存在计算机里面的东西太脆弱了,很容易就丢失了,软件错误、硬件错误、误操作、误删除、病毒等等,而且除非是非常宝贵的信息,否则是不可能使用各种昂贵的办法去找回数据的,而且还不一定能找回来。整理旧时的物品时总能对着小时候写的一些小纸片发笑,而现在每天手机里面大量的短信,恐怕是很难在以后看到它们了。还有各种兼容的问题,以前的存储介质,以前的文件系统,说不定若干年以后就已经没有设备能够读取了。

文章里说道,一个网站的平均寿命是 44 天左右,与普通家蝇的寿命相差无几。

The average life expectancy of a website is about 44 days, roughly the same as the common house fly.

复杂的编码,也许会变得根本无法解读,说不定以后人们会拿到一张磁盘,对磁盘进行解码的方法正是被编码放在了那张磁盘上,他们却毫无办法。

Anyone (with a magnifying glass and patience) can read letters, but there is a real danger that technology will leave much of the electronically written record marooned and illegible. The BBC’s Doomsday Project of 1986, intended to record the economic, social and cultural state of Britain for all time, was recorded on two 12in videodisks. By 2000 it was obsolete, and rescued only thanks to a specialist team working with a single surviving laser disk player.

有时候并不是因为信息丢失,而是如今记录信息太容易了,大量的未经筛选的信息充斥了世界,根本无法管理,甚至与直接删除并无差异。

Since 1945 we have gathered 100 times more information than in the whole of human history up until that point. Entire libraries could be preserved on disks that fitted into a pocket. Paper was dead.

我时常看到类似的文章,自己也经常思考这样的问题。对这个问题我是比较悲观的了。因为我非常害怕死亡──其实应该是消亡,就是好像从来没有存在过一样。我努力留下一些东西,比如生活中的许多零零碎碎的小东西,似乎是想要证明我自己存在过。然而面对这样的一个虚拟世界,我却无能为力了。

不过似乎 Google 这样的公司的出现似乎起到了一定的缓解作用。海量数据的快速搜索功能让管理变得轻松了一些,而且 Google 是一个很大的公司,总让人有一种值得信任的感觉,就算是一种错觉吧,好像觉得数据放到 Google 里面去就绝对不会丢失一样。我有一个 Yahoo 的邮件账户,大概是我的第一个电子邮箱吧,可是许久没有上去了,再去的时候发现是超过几个月没有登录,账户已经被暂时冻结了,而且所有的邮件被删除了。真的让我觉得很伤心。而我总是觉得 Google 有那么多的存储空间,是不会删除用户数据的,连垃圾邮件都会保存一个月的时间,即使是 Google 找到磁盘错误等硬件故障,它也一定会有许多份备份,及时将数据恢复过来。不管这是不是一种错觉,不管 Google 将来是否会倒闭,总之,至少有这样一种错觉,已经很让人感到安慰了。 :)

Tux Factory — 许多可爱的企鹅图标

Friday, June 22nd, 2007

deli.icio.us 上看到 Tux Factory 这个网站,里面有许多很可爱的企鹅图标,个人使用的话是可以随意下载的。比如这个可爱的原始人的 Tux

savage tux

还有这个死神的 Tux ,不知道 sishen 会不会喜欢,哈哈!

死神的 Tux

Drawing with computer

Sunday, June 17th, 2007

我自己很小就对绘画非常感兴趣,不过自从上高中之后一直到现在都很少动笔去话了。后来接触到电脑,发现这个东西也可以绘图,不过除非用那些专业的工具,否则用鼠标来画实在是不如笔来得精细。这里是我前不久用鼠标画的一幅图,相当粗糙,但是还不错。
shana, my drawing

后来听说了矢量图,有一些很有趣的小图标之类的可以利用电脑精确的特性,而不是靠手来勾勒,也一直比较感兴趣,只是都没有太多的时间去关注。其实 Linux 下在设计方面也有许多好用的工具。Inkscape 应该算是比较著名的一个了。今天偶尔看到一些教程,便照着学习了一下,做了一个图标,感觉还是很不错的。 :)
Badge

git and subversion

Thursday, June 14th, 2007

Linus 在 Google 做了他对于版本控制软件的演讲。他似乎非常偏爱分布式版本控制软件,否则宁愿用 tarball+patch (其时 tarball+patch 确确实实是一种分布式的方法呢!)。以至于在 Linux 内核不能试用 BitKeeper 以后,他自己动手写了 git 。他对版本控制软件有许多要求,比如:

  1. 取出来的东西要和放进去的东西一样。如果连数据的完整性都无法保证的话,谁还敢用这样的版本控制软件?不过确实有这样的软件存在呢。
  2. 分布式。我在后面会解释分布式的好处。
  3. 高效率。Linux 内核也算是一个很大的软件了,如果版本控制系统运行起来慢吞吞的,确实是非常让人恼火的呢。
  4. ……

Linus 当时(Linux 2.6.12 的那阵)说现有的版本控制系统都不行,他两个周就能写出一个更好的。结果他 4 月 7 日开始写 git ,在 4 月 20 日的时候内核已经开始使用 git 进行源代码管理了。参见这里的原文:

Linus began writing “git” on April 7’th [story], a rapidly evolving userland filesystem upon which various SCM implementations are being built or adapted. The 2.6 kernel source is already managed in a git repository, with the first succesful git release being 2.6.12-rc3 on April 20’th

当然可用离好用还是有很远的距离的,不过 Linus 确实很厉害了!后来 git 由其他人维护,并且在用户界面上进行了改进,现在已经相当好用了。另外一个有名的开源的分布式版本控制系统是 mercurial ,这个是由 Python 写成的,不知道在效率一条上满不满足 Linus 的要求,呵呵!其时各种分布式版本控制软件在开源社区是很流行的,有时候下载一些软件的时候就看到如果要获取最新代码,就要用作者使用的版本控制系统来进行抓取,像 Arch 、bazaar 、monotone 、darcs 一类的,都是使用得比较多的分布式版本控制系统。

为什么分布式版本控制系统会流行起来呢? sishen 在他的 Blog DistributedSCM or not? 里面提到了传统的版本控制和分布式版本控制模型之间的差别。下面说一下我自己的看法:

  • 更方便的 Merge 。分布式管理必然导致大量的 Branch 和 Merge 操作。因此分布式版本控制系统都特别注意这方面。在传统的 CVS 里面制作 Branch 和 Merge 简直就是噩梦,Subversion 作为一个用于替代 CVS 的系统,专门改进了 Branch 操作,在它的主页上可以看到这样一句话:
    Branching and tagging are cheap (constant time) operations

    There is no reason for these operations to be expensive, so they aren’t.

    Branches and tags are both implemented in terms of an underlying “copy” operation. A copy takes up a small, constant amount of space. Any copy is a tag; and if you start committing on a copy, then it’s a branch as well. (This does away with CVS’s “branch-point tagging”, by removing the distinction that made branch-point tags necessary in the first place.)

    然而似乎人们没有注意到,Branch 是轻松了,可是 Merge 呢?如果不能很方便地 Merge 回来,做 Branch 仍然是噩梦。事实上,我就经历过在开发团队里面由于队友操作不对而在 Merge 的时候把我的许多代码都覆盖掉了。当时正是使用的 subversion 。虽然源代码仍然在历史里面,但是要去一个一个地找出被覆盖掉的文件并恢复过来确实是一件很难忘的事情。

  • 更轻松的管理。传统的版本控制系统使用中央仓库,一些仓库相关的管理就只能在仓库上进行。赋予开发团队每一个人中央仓库的管理权限是非常不好的。但是有时候确实会比较不方便的地方。
  • 更健壮的系统。分布式系统一般情况下总是比单服务端的系统要健壮,因为但服务端一旦服务器挂掉了整个系统就不能运行了。然而分布式系统通常不会因为一两个节点而受到影响。
  • 对网络的依赖性更低。虽然现在网络非常普及,但是并不是随时随地都有高速网络,甚至有时候根本没有网络可以访问。低速的网络会让人心情烦躁,有时候就呆呆地盯着屏幕上的 commit 进度,什么事情也干不了。而没有网络连接更是致命的:你无法 commit !这表示你进行任何改动以前都必须小心翼翼,否则你可能再也找不会你曾经写的一些代码了。
  • 更少的“仓库污染”。我不知道用“仓库污染”这个词是否恰当。有时候你要做一个模块,它不是太大,所以没有必要为它新建一个 branch ,但是它又不是那么小,不可能一次提交就做好。于是便会提交一些不完整的代码到仓库,有时候会导致整个程序无法运行,严重影响团队里其他人的开发。大多数人在这种情况下的解决办法都是写完之后再提交。但是作为习惯了版本控制的人来说,进行不计后果的大幅修改是经常的事情,到后来突然发现自己先前的代码没有提交,就后悔莫及了。如果是分布式系统的话就不会存在这样的问题,因为本地仓库的修改不会影响到别人的仓库。当你完成并测试以后,就可以在邮件列表里面说:我已经把这个模块做好了。然后感兴趣的人就可以从你这里 pull 你的成果了。

然而,不管怎么说,现在传统的版本控制系统仍然是主流。许多源码 Host 站点如 SourceForgeGoogle Code 等都是使用主流的 subversion 作为源代码版本控制的工具。

事实上,有时候我把 subversion 和 git 混合起来用。因为二者都有忽略某些文件的功能,只要在 subversion 的目录属性里面忽略掉 .git 一类的文件,再在 .gitignore 里面忽略 .svn 等文件,两者基本上也能很和谐地合作。通常在本地工作,使用 git 控制,并在适当的时候用 subversion 提交一次。

事实上它们配合得相当不错。即使是像 rm 一类的命令。比如,先用 svn rm foofoo 删掉了。当前目录下已经不存在 foo 了,不过 git rm foo 仍然是能正常工作的。不过这和更改文件内容不一样了,不能自动跟踪,只能每次都在两个版本控制系统下都执行一遍。虽然可以用一些简单的脚本来减少这种重复劳动,但是有时候混用两个东西确实有种提心吊胆的感觉。 :P

郁闷

Tuesday, June 12th, 2007

下午的时候突然就耳鸣起来,真是难受,嗡嗡地响,什么事情都干不了!干脆去冲了一个冷水澡,从头到脚凉快了一遍。可惜还是鸣,在网上搜索了半天也不知道怎么办。似乎偶尔也会耳鸣,但是从来没有如此难受过。 :( 便泡了一杯热腾腾的奶粉来喝。

后来 cerror 拿过来一本《重构》,是微软给俱乐部寄过来的书,可以借来看,他帮我拿过来了。我顺手放到书架上,手撤回来的时候竟然碰到杯子了!洒得到处都是,本本上、身上还有桌子上!听说马铃薯的第一个本本就是牛奶洒进去了把主板烧坏了,我赶紧把电脑关掉,开始清理。

唉,搞了大半天,电脑似乎是没事,不过从此有了一股奶味。还洒了一身,刚洗过澡……耳朵还在鸣,真是郁闷死了…… :(

Yakuake + dtach vs Screen + urxvt

Sunday, June 10th, 2007

Screen 无疑是每一个经常使用终端的用户的必备工具。它拥有许多非常实用的功能:

  • 管理会话,可以 detach 一个会话,让它在后台运行,并在其他时间/地点 attach 原来的会话。这对于经常远程登录的用户来说非常方便。登录以后,运行一些程序, Screen 会保证在你注销以后程序仍然能继续运行,并且下次登录进来可以 attach 到原来的终端会话上 (也许那里正有一个运行了几个月的 Emacs 在等着你) 。
  • 多标签功能。 Screen 可以为一个用户管理多个会话,并且每个会话里面都可以有许多“子会话”,就像许多 Tab 一样,而 Screen 强大的可定制功能让它可以真正显示一个“标签栏”,这正弥补了许多终端模拟器没有多标签功能的缺点。而且这些标签都是在 Screen 会话的管理下的,在另外的地方 attach 到这个会话上会得到同样的一系列标签。并且可以通过 Shell 里面的 Escape Sequence 来动态更改标签的标题。非常方便。
  • 屏幕分割、历史存储、搜索以及复制粘贴。这些功能在一个 X 下的终端模拟器里面可以很轻松地完成,不过如果通过远程登录或者在一个纯字符界面下, Screen 就帮了大忙了。
  • 快捷键、命令以及其他功能。

这里是一个典型的 Screen 会话的截图。这是我很喜欢的 rxvt-unicode 和 Screen 的搭配。

Screen + urxvt

rxvt-unicode (urxvt) 本身是一个非常不错的程序,同时,它还有一个不错的功能,只要开启 secondaryScroll

URxvt.secondaryScroll: true

Screen 的历史就可以进入 urxvt 的历史里,换句话说,既可以使用 Screen 的回滚功能来查看历史,也可以使用 urxvt 提供的可以用鼠标拖拽的滚动条来查看历史。不过这样也有一些不方便的地方,因为 Screen 里面是可以有多个 tab 的,在 Screen 里面切换 tab 对于 urxvt 来说是不可见的 (听说 eterm 能和 Screen 交互,把 screen 的 tab 用 eterm 自己的标签栏表现出来,不过我没有尝试过) ,所以多个 tab 的历史会混杂进同一个 urxvt 的历史。这也是我尝试 yakuake + dtach 来代替 Screen 的一个直接原因。

Yakuake 是 KDE 下的一个基于 Konsole 的非常 Cool 的一个终端程序。它平时隐藏起来,当你按下快捷键 (默认是 F12) 时从屏幕顶端滑下。非常方便,有种呼之即来,挥之即去的感觉。当然这并不是我选择 Yakuake 的主要原因,因为我使用 jump-or-exec 可以在 urxvt 上实现类似的功能 (事实上我为很多程序如 Emacs 、 QTerm 和 Firefox 等都配备了 jump-or-exec 的功能,因为我只需要它们的一个实例就够了) ,虽然不及 Yakuake 那么 Cool 。

Yakuake 基于 Konsole ,也就有了 Konsole 的许多优点:多标签、动态更改编码、字体以及颜色配置等。另外,新版本的 Yakuake 还支持屏幕分割功能。历史回滚和复制粘贴这种基本功能自然也不用说了。这些都实现了 Screen 提供的那些功能,唯一的例外就是会话管理。本来作为一个笔记本用户,很少从别的地方远程登录到自己的笔记本上,而且我也绝大部分时间都使用 X 界面,会话管理并不是必要。不过有时候会做一些奇怪的事情有可能让 X 崩溃掉,如果没有会话管理的话,X 崩溃掉了终端里面的程序自然要跟着退出了。正好有一个叫做 dtach 的程序,专门实现了 Screen 的 detach 和 attach 的功能,而抛弃了 Screen 的其他的“累赘”的功能。

现在看来 Yakuake 和 dtach 搭配起来好像是完美的 Screen + urxvt 的替代品一样。dtach 并不像 Screen 那样管理会话和历史,所以所有终端历史进入 Yakuake 的历史里面,使用 Yakuake 的滚动条来回滚查看。不过也由于 dtach 不管理会话,不能像 Screen 那样维护一个多标签。本来可以让 Yakuake 在每次新开 tab 的时候执行 dtach 新启动一个会话,但是 attach 原有的会话有些麻烦,始终不如 Screen 那样方便。后来我仔细想了想,其实执行重要的任务 (就是 X 崩溃了也要继续运行的) 的话,三个 tab 就够了。

于是我只要在启动的时候加载三个由 dtach 管理的会话即可,如果 shell 不够用了,我可以开更多的 tab ,它们不由 dtach 管理,我只要记住重要的任务在 dtach 会话下运行即可。事实上大部分时候包括重要的和不重要的工作,三个 shell 都够用了。

我使用这样一个脚本来启动 Yakuake

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#!/bin/sh
 
if [ -z "$1" ]
then
    DIR=$PWD
else
    DIR=$1
fi
 
if dcop | grep -q yakuake
then                            # yakuake running
    dcop yakuake DCOPInterface slotAddSession
    dcop yakuake DCOPInterface slotRunCommandInSession "cd $DIR"
else
    yakuake
    # load my dtach sessions
    while ! dcop | grep -q yakuake
    do
        sleep 0.5
    done
    dcop yakuake DCOPInterface slotRunCommandInSession \
        "export DTACH=dtach && dtach -A ~/.dtach/term-0 /bin/zsh"
    sleep 0.5
    dcop yakuake DCOPInterface slotSetSessionTitleText "[kid]"
    dcop yakuake DCOPInterface slotAddSession
    dcop yakuake DCOPInterface slotRunCommandInSession \
        "export DTACH=dtach && dtach -A ~/.dtach/term-1 /bin/zsh"
    sleep 0.5
    dcop yakuake DCOPInterface slotSetSessionTitleText "[kid]"
    dcop yakuake DCOPInterface slotAddSession
    dcop yakuake DCOPInterface slotRunCommandInSession \
        "export DTACH=dtach && dtach -A ~/.dtach/term-2 /bin/zsh"
    dcop yakuake DCOPInterface slotSetSessionTitleText "[kid]"
    dcop yakuake DCOPInterface slotSelectSession 0
fi
 
# show yakuake
if [ "false" = `dcop yakuake 'yakuake-mainwindow#1' shown` ]
then
    dcop yakuake DCOPInterface slotToggleState
fi

如果 Yakuake 已经在运行了,则打开一个 tab , cd 到指定目录或当前目录 (这非常有用,用这个脚本替换掉 konsole 的话,就可以在 konqueror 文件管理器里面按 F4 来快速在 Yakuake 里面开一个新 tab 并转到该目录了) ,如果没有运行则启动它,并加载三个默认的 dtach 会话。其中与 Yakuake 的交互通过 dcop 来进行。KDE 提供的 dcop 让我们可以很轻松地在脚本里面调用 KDE 程序提供的复制功能。我把这个脚本链接到 ~/.kde/Autostart/ 下面,在 KDE 启动的时候自动启动它。

Konsole 同样允许通过 Shell 里面的 escape sequence 来改变标题栏和标签栏。Yakuake 继承了更改标签栏的功能,但是由于 Konsole 内部实现的一些原因 (Konsole 正要经历巨大修整,参见 Konsole 大整修) Yakuake 不能使用 Konsole 的那种方法来设置标签标题。不过可以 hack 一下在更改标题的同时更改标签栏标题,下面是针对 Yakuake 2.8 的 patch :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
diff -ur src/main_window.cpp src.orig/main_window.cpp
--- src/main_window.cpp 2007-06-01 00:29:06.000000000 +0800
+++ src.orig/main_window.cpp  2007-06-01 00:10:27.000000000 +0800
@@ -342,8 +342,6 @@
     connect(session, SIGNAL(destroyed(int)), this, SLOT(slotSessionDestroyed(int)));
     connect(session, SIGNAL(titleChanged(const QString&)), this, SLOT(slotUpdateTitle(const QString&)));
 
-    connect(session, SIGNAL(titleChanged(int)), this, SLOT(slotUpdateTitle(int)));
-
     widgets_stack->addWidget(session->widget());
     sessions_stack.insert(session->id(), session);
 
@@ -783,10 +781,6 @@
     title_bar->setTitleText(title);
 }
 
-void MainWindow::slotUpdateTitle(int id)
-{
-    slotRenameSession(id, sessions_stack[id]->title());
-}
 
 void MainWindow::slotIncreaseSizeW()
 {
diff -ur src/main_window.h src.orig/main_window.h
--- src/main_window.h 2007-06-01 00:12:58.000000000 +0800
+++ src.orig/main_window.h  2007-05-06 08:32:58.000000000 +0800
@@ -217,8 +217,7 @@
         void slotUpdateSize();
         void slotUpdateSize(int new_width, int new_height, int new_location);
         void slotUpdateTitle(const QString& title);
-        void slotUpdateTitle(int id);
-
+
         void slotIncreaseHeight();
         void slotDecreaseHeight();
         void slotSessionDestroyed(int id = -1);
Only in src: Makefile.am
Only in src: Makefile.in
diff -ur src/session.cpp src.orig/session.cpp
--- src/session.cpp 2007-06-01 00:13:48.000000000 +0800
+++ src.orig/session.cpp  2007-05-06 08:32:58.000000000 +0800
@@ -395,7 +395,6 @@
     {
         session_title = title;
         emit titleChanged( session_title);
-        emit titleChanged( session_id);
     }
 }
 
diff -ur src/session.h src.orig/session.h
--- src/session.h 2007-06-01 00:14:11.000000000 +0800
+++ src.orig/session.h  2007-05-06 08:32:57.000000000 +0800
@@ -72,8 +72,8 @@
     signals:
         void destroyed(int id);
         void titleChanged(const QString&);
-        void titleChanged(int);
-
+
+
     private:
         void createInitialSplits(SessionType);
         void split(QWidget* active_terminal, Orientation o);

之后在 Shell 的提示符里面做点手脚就自动更新标签栏了。我用的是 Zsh ,下面的配置可以在标签栏标题里面显示当前目录。如果是在一个 dtach 管理的会话里,则用方括号“[]”括起来 (在前面的启动 Yakuake 的脚本里面设置了 DTACH 环境变量用于识别是否在 dtach 会话里) :

if [[ -z "$DTACH" ]];
then
    P_TITLE=$'%{\e]0;%1/\a%}'
else
    P_TITLE=$'%{\e]0;[%1/]\a%}'
fi

有 Zsh 提供的功能,可以在执行某条命令之前先做一些动作,比如更新标签栏以显示出当前正在执行的命令:

CMD=${1[(wr)^(*=*|sudo|-*)]}
if [[ -z "$DTACH" ]]
then
    echo -n "\e]0;$CMD\a"
else
    echo -n "\e]0;[$CMD]\a"
fi

下面是我的 Zsh 的提示符的完整配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#!/bin/zsh
autoload colors zsh/terminfo
if [[ "$terminfo[colors]" -ge 8 ]]; then
    colors
fi
 
if [[ "$TERM" = "dumb" ]]
then
    prompt='%(?..(%?%))%n@%1/ %(!.#.$) '
else
    local P_GREEN="%{$terminfo[bold]${fg[green]}%}"
    local P_CLEAR="%{$terminfo[sgr0]%}"
    local P_ERROR="%{$terminfo[bold]${fg[red]}%}%(?..(%?%))$P_CLEAR"
    local P_USER="%(!.${bg[green]}${fg[black]}ROOT.%n)$P_CLEAR@"
    local P_DIR="%1/"
    local P_PRO=" %(!.#.$) "
    local P_TITLE
    if [[ "$TERM" = "screen" ]]; then
        P_TITLE=$'%{\ek%1/\e\\%}'
    elif [[ "$TERM" = "xterm" ]]; then
        if [[ -z "$DTACH" ]];
        then
            P_TITLE=$'%{\e]0;%1/\a%}'
        else
            P_TITLE=$'%{\e]0;[%1/]\a%}'
        fi
    else
        P_TITLE=""
    fi
    prompt="$P_ERROR$P_USER$P_GREEN$P_DIR$P_CLEAR$P_PRO$P_TITLE"
fi
preexec () {
    local CMD=${1[(wr)^(*=*|sudo|-*)]}
    if [[ "$TERM" == "screen" ]]; then
        echo -n "\ek$CMD\e\\"
    elif [[ "$TERM" == "xterm" ]]; then
        if [[ -z "$DTACH" ]]
        then
            echo -n "\e]0;$CMD\a"
        else
            echo -n "\e]0;[$CMD]\a"
        fi
    fi
}

如下是一个效果截图。

Yakuake + dtach

我已经用了大约一个周了,感觉非常好,几乎从原来的 Screen + urxvt 平滑过渡过来。不过我也并不能说哪种方案更好。如果你绝大部分时间都是在 X 下渡过 (特别是,如果你使用 KDE) ,而且不经常远程登录的话,推荐使用 Yakuake + dtach 获得更好的用户体验。否则,还是推荐使用 Screen ,因为它具有更强大的会话管理能力。

Emacs 22.1 Released!

Saturday, June 2nd, 2007

经过一而再再而三的跳票,RMS 终于让 Emacs 22.1 Release 出来了。http://www.gnu.org/software/emacs/ 上也更新了最新的 Stable 版本的信息:

  • Current Stable Release
    • Latest stable release: 22.1 (June 2, 2007)
      • Emacs version 22 includes GTK+ toolkit support, enhanced mouse support, a new keyboard macro system, improved Unicode support, and drag-and-drop operation on X, plus many new modes and packages including a graphical user interface to GDB, Python mode, the mathematical tool Calc, the remote file editing system Tramp, and more.
    • For more info read its News file.
    • To download visit the obtaining section.

Emacs 的上一个版本 Release 是在两年以前了,RMS 对 Bug fix 要求很严格,导致 Emacs 22 好几次说要发布结果都跳票了,实际上很多人很早就在使用 CVS 的 Unicode 分支的 Emacs (通常称为 Emacs 23)了,但是 Emacs 22 的发布仍然是非常令人振奋的!而且 22 的发布可以让更多的开发力量转移到 23 上,Emacs 无疑是一个伟大的软件,RMS 也无疑是一个伟大的领袖,但是时代在进步,Emacs 也需要不断吸收新的东西,然而有些人 RMS 似乎有些保守了,多次拖延发布时间也在邮件列表上发生过争吵。确实,试想,如果我参加了一个激动人心的项目,结果过了好几年,却还没有一个版本发布出来,实在是很让人心急呢!有些开发者便转移到其他项目去了。当时好像就是 GNU Emacs 太保守了,才有 XEmacs 这个 fork 吧,不过后来又有 XEmacs fork 出来的 SXEmacs 。唉!总之希望它们集中力量,把 Emacs 做得更好才是啊!

新的 TODO 文件里面也有一些非常令人期待的功能,例如 multi-tty 的支持。现在 multi-tty 分支和 unicode 分支是分开的,短期内是不可能有下一个版本发布了,不过期待两个分支在短期内合并在一起还是有希望的,真是激动人心啊!哈哈!这次我要滥用职权,让这个新闻在 LinuxApp 版上置顶!呵呵,何况现在几个版主都是 Emacs 一派的。

六一儿童节

Friday, June 1st, 2007

小叔叔突然打电话来问我们学校放假没,才想起今天已经是六一儿童节了。 :) 不过如今学校不会因为六一为我们放假罗! :(

六一了,穿上新衣服,心情也要舒畅一些啊!妈妈也出书了,《雪豆》,就是原来的《桥溪庄》:

《雪豆》

不过妈妈写的东西太文学了,我发现我现在离文学是越来越远了。不过“桥溪庄”这个地名的来源我倒是知道在哪里的,从来没有妈妈那样观察得细致,体会得深刻。

《犬夜叉》也仍然在继续连载:

犬夜叉 第 507 话

唉,竟然前面让很重要的一个主角都死掉了,一直以为这个故事要完结了,现在却又开始好像若无其事的样子,故事继续无限期地发展。不过总是这样的,既期待它完结又不希望看到它完结。还是一切顺其自然了。