注: 本文第一次写作时没有进行全面的测试,由于 svn update 操作更新文件时会破坏 NTFS 上的硬链接而导致第一次的方法无法正常使用。现在你看到的已经是新的方法。在此为我的疏忽向大家道歉。

现在我的生活早已离不开 Vim 了,无论是在公司还是在家里,无论是在本地计算机还是远程服务器上,Vim 必定是我使用得最多的程序之一。当然了,Vim 虽好,也一定要有符合自己习惯的 .vimrc 和插件集才能发挥出更大的潜能,让我们用得更爽。也就是说,.vimrc 肯定是会被经常修改的,插件集也应该会时常添加新成员或进行版本更新。显然,要在家里和公司以及一些远程服务器之间频繁地同步这些修改是件很烦人的事。幸好,我们有 Subversion 可以让这一切变得简单。

让我们从公司的 Linux 桌面机上开始。

# 将 $HOME 里的 .vimrc 和 .vim 目录放到 vimfiles 目录里以便进行 SVN 导入操作
cd ~
mkdir vimfiles
mv .vimrc vimfiles
mv .vim vimfiles
svn import vimfiles http://svn.rainux.org/vimfiles/trunk
# 从 SVN 里 checkout 出一份 working copy 到 $HOME 里,
# 并且设置忽略掉 $HOME 里其他所有文件
svn co http://svn.rainux.org/vimfiles/trunk .
svn ps svn:ignore '*' .
svn ci -m "Let's ignore all files those not managed by Subversion in $HOME."
# 用来进行导入操作的 vimfiles 目录已经不再有任何存在的意义了
rm -rf vimfiles

好了,我们的 .vimrc 和插件集已经版本化了,下班回家。

# 先备份一下家里 Windows 上的文件,这假设我们没有使用 Cygwin
CD %HOME%
MOVE .vimrc .vimrc.backup
MOVE vimfiles vimfiles.backup
svn co http://svn.rainux.org/vimfiles/trunk .

现在我们遇到问题了,Vim 在 Windows 上会尝试从 %HOME%\vimfiles 目录加载用户脚本,而不会理会 %HOME%\.vim 目录。我的解决办法是为 .vim 目录建立符号链接 vimfiles,这需要 %HOME% 所在分区必须是 NTFS 文件系统。新的问题是 Windows 本身并没有附带创建符号链接的工具,需要用 Sysinternals 提供的命令行工具 junction.exe 或者 Windows 2000 Resource Kit 里的 linkd.exe 来创建。

CD %HOME%
junction vimfiles .vim

OK,开始享受 Subversion 为我们带来的便利吧!不仅仅可以方便的同步在公司和在家里对 .vimrc 及插件集的修改,在远程服务器上要取得这些最新的修改也变得非常容易。什么,某个服务器上还在使用古老的 Vim 6.3 ?没有关系,为 http://svn.rainux.org/vimfiles 创建一个名为 6.x 的 branch,删掉无法用于 6.x 的插件即可。

最后,如果你对我的 Vim 配置感兴趣,可以从上面提到的 URL 里 checkout 一份出来看看,是的,它是真实的 URL。:)

Update: 作为狂热的 Git 爱好者,我已经使用 Git 来管理我的 Vim 配置文件了,请访问我的 Vim 配置文件页面。

标签:, , , ,

Vim? Emacs!

November 3rd, 2007

我: Hmmm,你的 Emacs 编辑 Rails 项目明显没有偶的 Vim 爽嘛,连 RHTML 里的 Ruby 代码都没法语法高亮。

W 君: (看了偶演示 Vim + rails.vim 后)确实不太方便。

我: 那何不转过来用 Vim?反正 Vim 你也经常用(W 是 Linux 系统管理员)。

W 君: 不行,我用 Emacs 是有很特殊的原因地。

我: ?

W 君: ……

我: ……?

W 君: …… 因为 Emacs 的图标是牛啊。(同事 W 君是股民 -_-b)

我: …… 狂晕!

标签:, , , ,

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

标签:,

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

标签:, ,
Page 1 of 212