本文来自依云's Blog,转载请注明。
snipMate 是Vim的片断扩展插件之一,介绍网上很多,实在不想Google的话可以看看这里,我就不多言了。
我经常会把一些网站链接连同其标题写到自己的wiki或者邮件中,于是有个这个snippet:
snippet link [`@*` `system('getTitle '''.@*.'''')`]${1}
扩展 * 寄存器(也就是X选择区)中的URL,并使用getTitle这个我自己用Python写的程序获取标题。这个snippet大多数情况下工作良好,只是偶尔会使Vim停止响应,只能Ctrl-C中止。今天在扩展 http://larrupingpig.zoka.cc/?p=197 这个URL时又遇到这个问题,实在受不了了,于是自己看源代码。`...`
的扩展在这里:
if stridx(snippet, '`') != -1 while match(snippet, '`.\{-}`') != -1 let snippet = substitute(snippet, '`.\{-}`', \ substitute(eval(matchstr(snippet, '`\zs.\{-}\ze`')), \ "\n\\%$", '', ''), '') endw let snippet = substitute(snippet, "\r", "\n", 'g') endif
问题就出在substitute
中的substitute
上。:help substitute()
可以看到,其第三个参数中有些特殊字符,比如前边那个网页标题中的&
,会被特殊对待。
知道问题出在哪儿了,也就有改的办法了,我在Google Code上报告了bug,并提交了补丁。但看看那么多的issue和Github上的Pull Request,我感觉被采纳的可能性好小啊。。。