gvimext.dll 是一个为 Windows 里任意文件的右键菜单 (context menu) 添加“用 Vim 编辑”菜单项的 shell 扩展,随 gVim 一起安装。

但是无论是官方的安装版本,还是我自己编译的版本,在使用 UTF-8 locale 时 (比如设置环境变量 LANG 为 zh_CN.UTF-8) 这个右键菜单项都会显示乱码。其实原因很简单,Windows 并不原生支持 UTF-8 编码,所以直接使用 TextOut() 之类的 API 输出 UTF-8 编码的消息文本肯定会显示乱码。

曾经尝试修改 gvimext.cpp,在里面覆盖环境变量 LANG 的值,去掉末尾的 .UTF-8,但这样做的结果是导致 gvimext.dll 寄生进程 explorer.exe 或 TotalCmd.exe (如果是在 Total Commander 中使用右键菜单的话) 的 LANG 也被修改,造成由 explorer 启动的 gVim 的 LANG 也成了被去掉 .UTF-8 的值 (因为子进程默认会继承父进程的环境变量)。后来又想起了 Cygwin 里的 OUTPUT_CHARSET 环境变量,可以在 gvimext 里将获取到的 UTF-8 消息文本使用 iconv() 转换为 OUTPUT_CHARSET 设定的编码,这样问题就可以圆满的解决了。

直到今天打算来实施这个想法时,又回头去看了一下以前 Google 到的这篇 The Unicode HOWTO: Locale setup,才发现原来 glibc 本来就有这样的自动编码转换能力,并且 2.2 以后的版本也不再需要设定 OUTPUT_CHARSET 了。偶太无知无畏了……

那么 gVim 安装版里的 libintl.dll 肯定不是 gcc 编译的,所以没有自动编码转换能力导致乱码,用 PEiD 看了一下果然是 MS VC 6.0 编译。接下来就简单了,去 GnuWin32LibIntl 页面下载 Binaries 和 Dependencies 两个压缩包,取得其中的 libintl3.dll 和 libiconv2.dll,前者改名为 libintl.dll (gVim 被硬编码为只尝试载入 libintl.dll 这个文件,想了想没必要改源代码,因为以后 LibIntl 出了新版本 libintl3.dll 里的 3 还会变化)。然后将这两个文件放到 PATH 环境变量中列出的任意一个目录里,最后删掉 gVim 安装目录下的 libintl.dll,OK,一切都是那么完美了。:p

标签:, , ,

Vim 用户都应该知道 Vim 的 Normal 模式下 operator + motion 组合的便利,比如

  • daw 删除光标下的普通单词以及其后的空格
  • ciW 删除光标下的以空格分隔的“单词”并进入插入模式 (i 表示 inner,不删除单词后的空格)
  • yis 复制光标下的句子到默认寄存器

确实这几个都比较平淡无奇,不过请看以下这些

  • ci[ 删除一对 [] 中的所有字符并进入插入模式
  • ci( 删除一对 () 中的所有字符并进入插入模式
  • ci< 删除一对 <> 中的所有字符并进入插入模式
  • ci{ 删除一对 {} 中的所有字符并进入插入模式
  • cit 删除一对 HTML/XML 的标签内部的所有字符并进入插入模式
  • ci” ci’ ci` 删除一对引号字符 (” 或 ‘ 或 `) 中所有字符并进入插入模式

怎么样?ci[ ci< cit 在编辑 PHP 或者 HTML 源码时简直太爽了 (当然 matchit 插件增强的 motion % 也是必不可少的),ci” ci’ ci` 几乎在编辑任何语言的源代码时修改字符串都会非常方便。不过可惜的是以上这些严格的说只能叫文本对象选择,不是 motion,因此只能跟在 v 命令或者某个 operator 后面。可恨用了两年 Vim 居然今天才想起查 Vim 帮助里的 motion.txt。 -_-b

标签:,

需求:

将 host/item.html?type=test
rewrite 成
host/?q=item&type=test
其中 item 和 test 是可变的,并且 ?type=test 可有可无。

解决:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} ^/[^/]+\.html$
RewriteCond %{QUERY_STRING} ^(type=.*)?$
RewriteRule ^([^/]+)\.html$ /?q=$1&%1 [L]
</IfModule>

解释:

  1. ?type=test 是不会出现在 REQUEST_URI 里的,必须使用 QUERY_STRING 来获得它。
  2. 若有多个 RewriteCond,只能反向引用最后一个 RewriteCond 里的 pattern 的 group。
  3. RewriteRule 后面的 pattern 是用来匹配当前 URL 的,当前 URL 不是 REQUEST_URI。因为(因此?)它会比 REQUEST_URI 少一个前导斜杠 “/”,并且它可能已经被前面的 RewriteRule 改变过。

规则 BT 吧?第一个搞得我差点以为无解,第三个规则也消耗了我大量时间。本以为不用测试就能搞定的一个小问题居然花了 40 分钟左右才完成。-_-b

标签:, ,

Vim 7.0c beta Win32 binary

April 3rd, 2006

偶拿 Microsoft Visual C++ 7.1 编译的,非 OLE 的 GUI 版本和 console 版本。

四个文件保持目录结构解压到某个地方,运行其中的 install.exe 即可。需要注意的是这些压缩包中没有 iconv.dll 和 diff.exe。如果你认为自己解决这些问题比较麻烦,或许你应该等待偶发布 NSIS 的安装程序的版本。

下载: gvim70c.zip vim70clang.zip vim70crt.zip vim70cw32.zip

附上偶的 .vimrc 文件: .vimrc

标签:, ,

◆ 丁健 张万 江南

安装信息(Setup Information)文件是Windows系统支持的一种安装信息存放文件,一般以INF作为扩展名,因此也叫INF文件。安装信息INF文件与 Windows内建的安装服务引擎(API函数库)紧密协同工作,基于其严格的编写语法制作而成的INF文件在拷贝、删除文件,增、删注册表键,更改系统设置等方面都有优秀的表现,完全可以用来实现应用程序文件安装的目标,而且价格免费,透明度高,安装程序小,可完全定制。INF文件是文本文件,可在任何文本编辑器内查看、创建、修改,普通用户使用Windows系统本身提供的记事本、写字板即可进行文件安装脚本的编写。 Read the rest of this entry »

标签:,
Page 3 of 812345...Last »