7/15/2008

Reconstruct VIM file organization on Windows

  不大喜欢vim在Windows平台上的默认目录结构,打算重新按照Vim\Runtime, Vim\Bin, Vim\VimFiles三个子目录的结构重新组织Vim。

  需要做的工作:
  1. 建立VIM root dir.
  2. 安装官方方法正常安装vim:解压vim72rt.zip, vim72w32.zip, gvim72.zip;执行install.exe,所有任务全选然后执行.
  2. 在VIM root dir下面建立Runtime, Bin两个个子目录.
  3. 将vim.org上下载的vim72rt.zip里面Vim\Vim72下的所有内容拷贝到Vim\Runtime.
  4. 将vim.org上下载的gvim72.zip, vim72w32.zip里面Vim\Vim72目录下的所有文件拷贝到Vim\Bin.
  5. 给系统Path变量加上$YourDir\Vim\Bin.
  6. 删除vim下的vim72目录.

  现在,一个基本的vim, gvim可以运行了,但是vim系统还需要知道用户的启动脚本.vimrc等用户定制信息($Vim)和自己的runtime($VimRuntime)在什么地方:
  1. 设置环境变量$Vim=$YourDir\Vim.
  2. 设置环境变量$VimRuntime=$yourDir\Vim\Runtime,这个可以忽略,这是系统的默认的位置.

  这时系统基本就绪,但是最初安装时设置的右键环境菜单:"open with vim"还不能正确工作,系统会报告一个错误:"Error creating process: Check if gvim is in your path!"。实际上,我们已经将gvim.exe放入了$Path里面。从出现的对话框来看,应该是gvimext.dll在寻找gvim.exe程序的时候出的问题。

  在vim source code中寻找上面那段错误字符串,很快定位到$src/GvimExt/gvimext.cpp文件的CShellExt::InvokeGvim()函数,在启动gvim.exe时,是通过getGvimName()来定位gvim.exe的位置的。getGvimName()函数位于同一文件中,它首先寻找注册表的"HKEY_LOCAL_MACHINE\Software\Vim\Gvim",如果没有找到,才会使用系统$Path去寻找gvim.exe。至此可以判断是注册表相应的键值在最初运行install.exe时,设置了现在不可用的值。直接将之删除,为安全起见,再搜索替换整个注册表系统中的其它vim相关字段。

  重试右键菜单,一切ok.

  这样,一个干净而清晰的vim就完成了:$vim\Bin下面是所有的可执行文件;$vim\runtime下面是系统的预定义配置、帮助等辅助性文件;$vim\vimfiles是用户自己的定制文件,比如插件等等;用户的启动脚本则放在$vim\_vimrc.

  除了右键菜单,没有任何依赖注册表的信息.另外,需要手动修改一下path变量,设置一下vim变量.

  BTW,看代码时发现gvimext.dll的作者似乎是一位中国人:Tianmiao Hu.

No comments: