9
5
2010
2

mutt 带附件转发

mutt带附件转发还真不容易。设置mime_forward_rest变量根本无效,死活就是不带上附近;设置mime_forward倒是把整个邮件都打包成message/rfc822格式的附件发出去了,但叫人怎么读呢?bounce倒是可以,但是不能修改邮件了,大约连原收件人也被bounce给对方了吧。

Google之后,在这里发现了个好办法:

<Esc>e      resend-message         用这封信件作为新信件的模板

这样就可以既编辑信件,又不漏掉附件了。

另外,如果只需要转发附件, 那篇文章还介绍了一个办法,就是在查看附件界面按f转发。这么intuitive的办法我当初怎么没想到呢。。。

Category: Linux | Tags: mutt mail
9
3
2010
5

Vim7.3: 爱你不容易

Vim7.3b出来后我就急不可耐地体验了把,但因为它的ruby支持中$curbuf.number始终返回零,不仅影响到了Command-T插件,也严重影响了我非常喜欢+常用的LustyExplorer插件——时不时地SEGSEGV一下可不行。

等正式版终于出来后,我又立即下载编译了,结果问题依旧。无奈,我只好自己动手,把LustyExplorer中用到$curbuf.number的地方都换成VIM::evaluate('bufnr("%")')了,但之后还是在调用此插件时经常SEGSEGV,郁闷了,于是换回Vim7.2。

但是Vim7.3真的有些很好的特性啊。此前介绍过的就不重复了,下面说说后来发现的两个我很喜欢的特性。

strwidth()函数

strlen()大家都知道,但它求的是字符串的字节数,而不一定等于字符串的宽度,比如中文就是如此。这会造成无法将内容对齐。于是,用于对齐代码的Align插件在处理CJK字符时(设置let g:Align_xstrlen = 3时)使用了一种很耗时的办法来求字符宽度:将字符串显示在Vim里,然后看它占用了多少虚拟列。

有了Vim7.3的strwidth()等函数就不必这么麻烦了。我去改了相关代码,执行效率提升N倍。

setf补全

setf是设置文件类型的指令。这个我很常用,比如写php文件的HTML部分时为了正确地缩进HTML,我会把文件类型设置成HTML,写PHP部分时还要切回去。写新脚本时由于通常没有文件扩展名,所以Vim无法识别文件类型。这些情况我只好手动:setf xxx了。Vim7.3增加了对此的补全支持,可以少敲点字母了。


所以——

所以为了用上Vim7.3,同时又不放弃LustyExplorer插件,我前不久又开始折腾Vim7.3的源代码,最后连gdb都用上了,在段错误时得到以下backtrace结果:

#0  __memset_sse2 () at ../sysdeps/i386/i686/multiarch/memset-sse2.S:160
#1  0x00d1d6ac in Perl_sv_upgrade () from /usr/lib/libperl.so.5.10
#2  0x00d1ea6a in Perl_sv_magicext () from /usr/lib/libperl.so.5.10
#3  0x00d1fc11 in Perl_sv_magic () from /usr/lib/libperl.so.5.10
#4  0x00d21882 in Perl_sv_setiv () from /usr/lib/libperl.so.5.10
#5  0x08203691 in perl_buf_free (bp=0x847b890) at if_perl.xs:638
#6  0x080742e3 in free_buffer (buf=0x847b890) at buffer.c:613
#7  0x08073fec in close_buffer (win=0x0, buf=0x847b890, action=4)
    at buffer.c:468
#8  0x08074de8 in do_buffer (action=4, start=0, dir=1, count=0, forceit=1)
    at buffer.c:1136
#9  0x0807465e in do_bufdel (command=4, arg=0x84b8aa1 "", addr_count=0, 
    start_bnr=12, end_bnr=1, forceit=1) at buffer.c:834
#10 0x080cbb2c in ex_bunload (eap=0xbfff9f8c) at ex_docmd.c:4939
#11 0x080c817d in do_one_cmd (cmdlinep=0xbfffa140, sourcing=1, 
    cstack=0xbfffa148, fgetline=0, cookie=0x0) at ex_docmd.c:2656
#12 0x080c5a56 in do_cmdline (cmdline=0x837c2d0 "bwipeout!", getline=0, 
    cookie=0x0, flags=11) at ex_docmd.c:1122
#13 0x080c5110 in do_cmdline_cmd (cmd=0x837c2d0 "bwipeout!") at ex_docmd.c:728
#14 0x0820cf98 in vim_command (self=3084803600, str=3084486540) at if_ruby.c:731
#15 0x010619a3 in ?? () from /usr/lib/libruby1.8.so.1.8
---Type  to continue, or q  to quit---

接着我很快发现了问题——明明是个ruby写的插件,最上面怎么调用到Perl了呢?遂关闭+perl特性重新编译,几天已经过去了,Vim7.3依旧运行良好,没有再出现以下烦人的提示了:

Vim: 拦截到致命信号(deadly signal) SEGV
Vim: 结束。
zsh: segmentation fault  vim

现在我一直在关注 ftp://ftp.vim.org/pub/vim/patches/7.3/,期待着这个问题从根本上解决……

Category: Vim | Tags: vim ruby
9
1
2010
0

Ubuntu网络连接显示“设备未托管”解决了

几天前的一次开机,突然上不了网了,再一看,网络连接的图标也没了。郁闷地运行ifconfig,发现是eth0没有分配IPv4的地址。这个我同学曾经遇到过,所以我很淡定地执行sudo dbclient,网络连上了。

本以为问题就此结束,但再次开机时发现,情况依旧,于是再次运行sudo dbclient,同时也加到/etc/rc.local里开机自动运行。OK,万事大吉了。不过,偶尔想到这个,我很疑惑为什么会这样呢?

终于,曙光出现了!一次从挂起的状态恢复后,我惊奇地看到网络连接的图标再次出现,显示的是未连网状态,但我是可以上网的。好奇地点了它一下,只见到以前的连接都没有显示,只有行灰色的“设备未托管”。好了,线索有了,Google一下,我就知道了(这里):

编辑/etc/NetworkManager/nm-system-settings.conf,把里边的managed=false改成managed=true,重启OK!

Category: Linux | Tags: ubuntu 网络
7
28
2010
4

Vim7.3 beta体验手记

昨天在LinuxToy上看到Vim 7.3b放出的消息,看到增加了Python3支持和持久性撒消(persistence undo)功能,于是忍不住从ftp.vim.org下了源码,编译到临时目录中体验了一下,觉得非常不错,遂卸载了前不久才编译安装的带有所有已发布补丁的Vim7.2,打上我自己的修改补丁,正式安装了。

持久性撒消

持久性撒消(persistence undo)是经常按u的人的福音,它把撒消树保存到文件中,从而即使文件被关闭再打开多次,就好像其间没有关闭过一样,所有的修改都可以u回去(当然不能超过'undolevel'的限制)。

要使用此功能,需要设置'undofile'选项。'undodir'指定撒消树保存的目录,默认是当前目录。会扩展'~',但是对于不存在的目录不会自动建立,这点有点不方便。文件名是所编辑的文件完整路径,(在Linux上)其中的'/'被换成了'%'

撒消树文件中会包含这个文件内容的hash值,这样当一个文件有了撒消树文件后,如果它被其他程序编辑过,Vim会忽略撒消树文件,而不会因此让撒消使文件乱掉。

命令:earlier:later也增加了一个单位:f——写入写入次数。比如说,我打开了一个配置文件,编辑N久,保存并测试后不满意,想恢复到原来的样子。怎么办呢?以前我会一直按着u键直到Vim告诉我不能撒消了,或者用备份文件(*~)来覆盖当前文件。现在可以使用命令:earlier 1f直接恢复到上次写入时了。

目前Vim只会去创建撒消树文件,而永远不会去删除它们,需要手动删除。因此,我只好把它们放到自己的tmpfs临时目录中,关机自动清除好了。

Python3接口支持

说实话,这个很令我失望。我是一直希望Vim支持Python3的,但是Python2也需要支持,因为有好些插件会用到的。所以,我同时编译了Python2和Python3特性进去,结果测试时Vim告诉我在同一会话中只能使用其中之一:

E999: Python: Cannot use :py and :py3 in one session

竟然错误号是999。。。

看来启动过程中就有某个脚本调用过:py了。看来我是没希望在Vim中用python3了。。。

相对行号

这个曾经有插件(效率很低地)实现过,什么意思应该很好理解,选项名称为'rnu',和'nu'(显示行号)不相容的。放图:

相对行号

+cursorbind

在比较文件的时候,有个scrollbind功能,可以让被比较的文件同步滚动。但是,在之前的版本中,光标经常并不在同一行。从一个窗口跳转到另一个窗口时,我经常找不到光标的位置了。。。现在好了,有了这个特性,光标的位置也同步了。

PS:这个新特性:help version-7.3中没有提到我太激动了,所以没有看完文档(囧。。。),是我自己对照:ver命令的输出结果发现的哦~~

其它

其它新特性还有:

  • +conceal隐藏文字
  • 增加强度更高的Blowfish加密
  • lua接口

这些我目前还不甚关心,所以没太关注。不过conceal text的确让帮助文件整洁漂亮了:-)。

Category: Vim | Tags: vim
7
26
2010
8

旧曲赋新词:《不用QQ》

Vim Talks群的tigee lee说:每个在linux下上QQ的同学,上辈子都是折翼的。。。


那天傍晚我再次上线 忍受着唯利是图的疼讯
想起曾经走过的岁月 想起曾经热爱的你
我有我想去的地方 但是我 不能离去
只因为你依然在这里 我憎恨却无能为力
我想哭 却流不出眼泪
我相喊 却发不出声音
我愿意 抛弃我的所有
如果能 不用QQ
夕阳洒在我的脸上 风儿拔动我的心弦
我多想你离开我的身旁 没有你我有多幸福
我想哭 却流不出眼泪
我想喊 却发不出声音
我愿意 抛弃我的所有
如果能 不用QQ
我想哭 却流不出眼泪
我想喊 却发不出声音
我愿意 抛弃我的所有
如果能 不用QQ
如果能 不用QQ
如果能 不用QQ

改编自汪峰演唱的《时光倒流》,墙内的朋友可在这里试听或下载这首歌。

Category: 文学 | Tags: 音乐 linux QQ 腾讯
7
22
2010
5

GM 脚本:和WebQQ的滚动标题栏说再见

作为一名中国的Linuxer,我没能像一些幸福者那样摆脱QQ,尽管我一直在见缝插针地推广Gtalk,但收效甚微。在相当长的一段时期内,我还是不得不使用WebQQ。WebQQ有一个特点让我觉得*非常非常*烦人——在来消息后就那么一直一直一直一直地滚动标题栏,似乎有天大的事需要我立即处理否则就性命难保似的。非常非常讨厌。像Gmail或者twitter那样只是在标题栏上加个括号号个数字不行吗?。。。

我再也不要默默忍受下去了!于是,点击GreaseMonkey图标,打开Vim,开始写脚本。

脚本其实很简单,只是我今天才想到可以这样子而已。WebQQ当点击聊天对话框后标题就会变正常。于是,我用Javascript模拟点击。不好监测标题栏的改变,干脆每隔几秒去点一下算了。代码如下:

// ==UserScript==
// @name           quiet WebQQ
// @namespace      http://lilydjwg.is-programmer.com/
// @description    来消息时不要滚动标题栏
// @include        http://web.qq.com/main.shtml?*
// ==/UserScript==

window.clicker = function(){
  var evt = document.createEvent("MouseEvents");
  evt.initMouseEvent("click", true, false, window,
    0, 0, 0, 0, 0, false, false, false, false, 0, null);

  var edits = document.getElementsByClassName('editArea');
  for(var i=0, len=edits.length; i<len; i++){
    edits[i].dispatchEvent(evt);
  }
};

//最多滚动三秒好了
setInterval(window.clicker, 3000);

这里clicker函数需要作为window的一个属性,否则会在页面加载完,脚本执行过后就消失了。


点击此处安装

7
9
2010
1

中键关闭GVim的标签

今天在Vim Talks群群地址)上看到闲耘™问到GVim能否像其它很多程序那样使用中键关闭对应的标签。虽然我自己在Vim鼠标用得比较少,但也曾想过这个问题。现在刚刚考试完毕,所以就去试着改了下Vim的源代码。没想到只需要加六行代码呵~~

#ifndef HAVE_GTK2
	    else
		gtk_notebook_set_page(GTK_NOTEBOOK(gui.tabline),
							    clicked_page - 1);
#endif
	}
	/* The following if is added by lilydjwg, to enable closing tab by
	 * middle-clicking. */
	else if (bevent->button == 2)
	{
	    send_tabline_menu_event(clicked_page, (int)(long)TABLINE_MENU_CLOSE);
	    if (gtk_main_level() > 0)
		gtk_main_quit();
	}
    }

    /* We didn't handle the event. */
    return FALSE;
}

以上的代码包含了上下文。把原本不存在的部分添加到gui_gtk_x11.c的3303行附近,然后重新编译即可~

PS: 这个只支持GTK版的GVim,所以不适用于Windows平台。

在此还要感谢Ubuntu大学群的Edward提供帮助。

Category: Vim | Tags: vim gtk C代码
6
30
2010
1

GM 脚本:转换QQ空间的Javascript链接为普通链接

为什么要访问难用的QQ空间我就不说了,相信各Linuxer能够理解。那为什么要把Javascript链接转换成普通链接呢?因为我喜欢用中键去点链接,让它在新标签页中打开,并且还是在后台打开。这样,在列表页面,我可以用鼠标中键选取自己感兴趣的链接,全部打开,选完好基本上第一篇也就加载好了,不需要等待加载。

无奈QQ空间特别喜欢使用Javascript,以至于我以为QQ空间里的文章都没有可以指向它的URL。后来看到QQ空间支持RSS了,才发现原来每篇文章都是有ID的,像这样可以访问:http://QQ号.qzone.qq.com/blog/文章ID。于是,此问题有解!

Firebug查看下就可以知道文章ID如何获取,然后利用强大的GreaseMonkey写个脚本转换之。思路很简单,但做起来还是遇到了点小问题——貌似在页面加载完毕之前脚本就已经执行过了。怎么办呢?我首先想到了延时,但觉得不太好控制。无意中在GreaseMonkey的右键菜单项中看到了“用户脚本命令”一项,遂Google之,获得此文。于是就用这个了,虽说每次要先去点下这个菜单项有点麻烦,但毕竟我QQ空间看得不是很多,而且这比之前要省事不少。好了,贴代码:

// ==UserScript==
// @name           QQ空间链接转换
// @namespace      http://lilydjwg.is-programmer.com/
// @description    将QQ空间链接从Javascript转换到普通链接
// @include        http://*.qzone.qq.com/*
// ==/UserScript==

var changeLinks = function(links){
  for(var i=0, len = links.length; i<len; i++){
    var link = links[i];
    if(link.href == 'javascript:;'){
      var id = link.getAttribute('onclick').match(/\d+/)[0];
      link.href = 'http://' + window.location.host + '/blog/' + id;
      console.log(link.href);
    }
  }
}

var do_it = function(){
  try{
    var links = document.getElementById('tblog').contentDocument.getElementsByClassName('blog_link');
    changeLinks(links);
    var links = document.getElementsByClassName('tx_fix');
    changeLinks(links);
  }catch(e){
    GM_log(e);
  }
}

GM_registerMenuCommand("转换js链接", do_it, '', '', 'j');

点击此处安装

6
15
2010
5

垃圾武汉电信换广告了

几天没见着这样的推送广告了,现在终于知道为什么了——

整页被电信替换了

网页源代码如下:

<html><head><!--title>... 信息推送,请等候 30 秒,或按刷新键继续 ...</title--></head><script language=JScript><!-- function killErrors(){return true;} window.onerror = killErrors; --></script><frameset rows=*><frame src=http://www.wuhan.net.cn/2010/dx/201005273/2mkd.html noresize></frameset></html>
Category: 反广告 | Tags: 反广告 垃圾电信
6
10
2010
0

多篇Word课件打印,我这样省纸

我需要六个共21页Word文档的课件以供开卷考试时使用。可是打印成21页也太浪费了!字号可不需要那么大,于是使用Ooo调整字号,结果令我郁闷的是,除了大部分文字位于左边而右边很多空白之外,我发现项目符号依旧是很大的字号。这样可不行。而且,一个个文件处理太没效率——我马上就要去应考了啊!考虑过LaTeX,结果因为不会调字体而放弃。于是想起了前些天发现的Google Docs使用的prince。于是开始工作——

首先把Word转成txt。我使用的是wvText这个位于wv包的工具。只能一个个文件转,不过我使用的是shell脚本(因为要手动给那些Word排序),这个就没关系了。然后把内容cat到一起,成为一个大的纯文本文件。然后打开这个文件,用Vim删去空行,然后在利用正则表达式\v第.章|^(一|二|三|四|五|六|七|八|九|十)加上Vim的宏给标题前空一行免得到时候不好找答案。prince是处理HTML的,所以还要把它改成HTML。这个手动就可以了,写上head标签,meta指明编码,正文前后加上<pre>标签,再写点样式表:

pre {
  font-size: 11px;
  font-family: 'Adobe Song Std';
  -moz-column-count: 2;
  -moz-column-gap: 20px;
  -webkit-column-count: 2;
  -webkit-column-gap: 20px;
  column-count: 2;
  column-gap: 20px;
  white-space: pre-wrap;
}

这里用到了我最近学到的多栏布局的CSS,prince认识它。然后使用prince转成PDF,打开一看效果灰常不错,而且只有六页了!

注意,CSS里的white-space是必须的,不然不会自动折行,左栏的过长文字会叠加到右栏。

PS: prince共享版会在每个生成的文件的第一页的右上角加个图标,但打印时并没有打印出来。

Category: 未分类 | Tags: shell prince

部分静态文件存储由又拍云存储提供。 | Theme: Aeros 2.0 by TheBuckmaker.com