为什么要自己费力再做一个Vim的Portable版?

  • 学习Vim对配置文件的处理

    《Hacking Vim 7.2》一书中“Where are the configuration files?”一节对此剖析的非常详尽

  • 做到自己的充分自定义配置

    例如:去掉Console方式,去掉gvimext.dll右键菜单的方式,完全配置好自己的插件,自定义自己的多个右键菜单等

  • 方便升级

    每次升级时,只需要从官方网站下载相关文件进行替换就可以了。

  • 最后,不想自己折腾的可以去这里下载一个非官方的Portable版,发布日期是:2013-08-11

准备过程

  • Vim当前(2014-01-08)的最新版本为7.4,发布日期是:2013-08-10

  • 这里下载这几个文件:gvim74ole.zipgvim74.zipvim74w32.zipvim74rt.zip

  • 打开gvim74ole.zip,阅读README_bindos.txt,然后我们知道:

    vim74w32.zip    Windows 95/98/NT/etc. console version
    gvim74.zip      Windows 95/98/NT/etc. GUI version
    gvim74ole.zip   Windows 95/98/NT/etc. GUI version with OLE
    另外还有一个必选项:You MUST also get the runtime archive (vim74rt.zip)
    

    那gvim74ole.zip和gvim74.zip有什么不同呢?

    来到这里,得到答案:A GUI version with OLE support. This offers a few extra features, such as integration with Visual Developer Studio. But it uses quite a bit more memory.

    另外,gvim74ole.zip中带有对Python 2.7、Python 3、Ruby、Perl、Tcl等语言的支持,而gvim74.zip中是不带有这些的。(使用:version命令查看输出中是否存在Python相关内容即可进行区分)

    说道Vim对Python的支持,此处再多说几句,如果要在Vim中使用Python,当前机器上安装的Python版本和Vim中内置的Python版本必须一致起来才行,例如:

    Python:
    >>> import sys
    >>> sys.version
    '2.7 (r27:82525, Jul  4 2010, 09:01:59) [MSC v.1500 32 bit (Intel)]'
    
    Vim:
    :python import sys; print sys.version
    2.7 (r27:82525, Jul  4 2010, 09:01:59) [MSC v.1500 32 bit (Intel)
    

    当Vim内建支持的Python版本和本机安装的Python版本不一致时:

    :python import sys; print sys.version
    E370: Could not load library python27.dll
    E263: Sorry, this command is diabled, the Python library could not be loaded.
    

    BTW1,官方的Self-installing executable gvim74.exe中使用的gvim.exe程序是OLE版的。

    BTW2,gvim74ole.zip版对中文输入法的支持比较好,已知谷歌拼音输入法对gvim74.zip的支持是有问题的,某些时候容易出现按Shift键不能切换中英文的问题。

  • 根据上面的信息,因为不需要console支持,所以去掉vim74w32.zip;因为gvim74ole.zip版的优点太多,所以,最终我们需要的只有gvim74ole.zip和vim74rt.zip这两个文件。

  • 32位版还是64位版?

    上面我们选出来的gvim74.zip和vim74rt.zip以及官方的Self-installing executable gvim74.exe都是32位版的,当然,用在64位OS上完全没有问题,那是否在64位的OS上用64位的Vim更好一些呢?

    首先,官方是没有64位版的,官网上给出的64位版链接是这个

    这个64位版有什么特点呢?

    1. Editing files >4GB in size; rare I know, but still.
    2. 64-bit WinPE does not have a WOW64 subsystem, hence you cannot run a 32-bit executable.
    3. Windows Server 2008 R2 (i.e. Win7 Server) also does not have the WOW64 subsystem, by default, although it is an optional component you can install.
    4. Potential for perf gains, particularly in heavy memory operations like memcpy and memcmp which can be optimized for the 64-bit word size.
    

    基本上,上面这4种情况遇到的机会非常少,所以就不必选择64位版了。

Portable版制作步骤

  • 新建一个主目录,命名为Vim,在Vim目录下再建一个子目录,命名为vim74,必须命名为vim74,否则gvim.exe会找不到配置文件

  • 将gvim74ole.zip中vim\vim74下的所有的文件解压缩到刚才新建的vim74目录下

  • 将vim74rt.zip中vim\vim74下的所有的文件、文件夹解压缩到刚才新建的vim74目录下

  • 将已经完全配置好的_vimrc文件放到Vim目录下,下面是我的简单配置:

    set nocompatible
    source $VIMRUNTIME/vimrc_example.vim
    source $VIMRUNTIME/mswin.vim
    behave mswin
    
    filetype plugin indent on
    
    syntax on
    set nohls
    set nobackup
    set nowritebackup
    set noswapfile
    set paste
    set ruler
    set showcmd
    set showmatch
    set incsearch
    set autoindent
    set expandtab
    set smarttab
    set wrap
    set mouse=a
    set tabstop=4
    set softtabstop=4
    set shiftwidth=4
    set backspace=indent,eol,start
    set history=1000
    set fileencodings=utf-8,usc-bom,gbk,utf16le
    colorscheme desert
    winpos 380 385
    "alex added, avoid chinese double quotes question
    set ambiwidth=double
    "alex added, avoid 'dw' delete the whole line.
    set encoding=utf-8
    "alex added, ignore case
    set ignorecase
    "set number
    "alex comennted 2 options, avoid autoindent while editing text.
    "set cindent
    "set smartindent
    "
    "folding settings
    set foldmethod=indent   "fold based on indent
    set foldnestmax=10      "deepest fold is 10 levels
    set nofoldenable        "dont fold by default
    set foldlevel=1         "this is just what i use
    
    "Toggle Menu and Toolbar
    set guioptions-=m
    set guioptions-=T
    map <silent> <F2> :if &guioptions =~# 'T' <Bar>
            \set guioptions-=T <Bar>
            \set guioptions-=m <bar>
        \else <Bar>
            \set guioptions+=T <Bar>
            \set guioptions+=m <Bar>
        \endif<CR>
    
    :set guitablabel=%N\ %t
    au BufNewFile,BufRead *.html,*.htm,*.shtml,*.stm set ft=jinja
    
    set autochdir
    
    set diffexpr=MyDiff()
    function MyDiff()
      let opt = '-a --binary '
      if &diffopt =~ 'icase' | let opt = opt . '-i ' | endif
      if &diffopt =~ 'iwhite' | let opt = opt . '-b ' | endif
      let arg1 = v:fname_in
      if arg1 =~ ' ' | let arg1 = '"' . arg1 . '"' | endif
      let arg2 = v:fname_new
      if arg2 =~ ' ' | let arg2 = '"' . arg2 . '"' | endif
      let arg3 = v:fname_out
      if arg3 =~ ' ' | let arg3 = '"' . arg3 . '"' | endif
      let eq = ''
      if $VIMRUNTIME =~ ' '
        if &sh =~ '\<cmd'
          let cmd = '""' . $VIMRUNTIME . '\diff"'
          let eq = '"'
        else
          let cmd = substitute($VIMRUNTIME, ' ', '" ', '') . '\diff"'
        endif
      else
        let cmd = $VIMRUNTIME . '\diff'
      endif
      silent execute '!' . cmd . ' ' . opt . arg1 . ' ' . arg2 . ' > ' . arg3 . eq
    endfunction
    
  • 修改Vim\vim74下的配置文件vimrc_example.vim,注释掉以下语句:

    autocmd FileType text setlocal textwidth=78
    

    上述语句会导致Vim将要编辑的文本自动回车换行并断句为78个字符。

  • 因我只需要英文菜单和英文提示信息等,所以将Vim\vim74目录下的lang目录重命名为langa或者直接删掉lang目录。另外,这样还可以防止菜单、提示信息等出现乱码。

    如果确实希望保留lang而又不想出现乱码,可以参考这里

  • 增加对Jinja模板文件的语法支持

    下载jinja.vim文件
    下载vim-jinja文件
    把vim-jinja.zip文件中ftdetect、indent目录下的文件分别放到Vim\vim74下的ftdetect、indent目录下
    把jinja.vim放到Vim\vim74\syntax目录下

  • 增加右键菜单“Vim”(只开一个Vim窗口,新文件会在新的Tab窗口中打开)

    shell_Vim.reg:

    Windows Registry Editor Version 5.00
    
    [HKEY_CLASSES_ROOT\*\shell\Vim\command]
    @="\"D:\\Vim\\vim74\\gvim.exe\" -p --remote-tab-silent \"%1\""
    
  • 增加右键菜单“wVim_New_Window”(每个文件都在单独的Vim窗口中打开)

    shell_wVim_New_Window.reg:

    Windows Registry Editor Version 5.00
    
    [HKEY_CLASSES_ROOT\*\shell\wVim_New_Window\command]
    @="\"D:\\Vim\\vim74\\gvim.exe\" \"%1\""
    
  • 修改.txt文件的默认关联程序为Vim

    txtfile_shell_open_command.reg:

    Windows Registry Editor Version 5.00
    
    [HKEY_CLASSES_ROOT\txtfile\shell\open\command]
    @="\"D:\\Vim\\vim74\\gvim.exe\" -p --remote-tab-silent \"%1\""
    
  • 从右键菜单中删除Restore Previous Versions项(因为Restore Previous Versions项的快捷键V会和Vim右键菜单的快捷键V发生冲突)

    Remove_Previous_Versions_Context_Menu.reg:

    Windows Registry Editor Version 5.00
    
    [-HKEY_CLASSES_ROOT\AllFilesystemObjects\shellex\ContextMenuHandlers\{596AB062-B4D2-4215-9F74-E9109B0A8153}]
    
    [-HKEY_CLASSES_ROOT\CLSID\{450D8FBA-AD25-11D0-98A8-0800361B1103}\shellex\ContextMenuHandlers\{596AB062-B4D2-4215-9F74-E9109B0A8153}]
    
    [-HKEY_CLASSES_ROOT\Directory\shellex\ContextMenuHandlers\{596AB062-B4D2-4215-9F74-E9109B0A8153}]
    
    [-HKEY_CLASSES_ROOT\Drive\shellex\ContextMenuHandlers\{596AB062-B4D2-4215-9F74-E9109B0A8153}]
    

    如果想恢复Restore Previous Versions项,可以编写下面内容至reg文件并执行:

    Restore_Previous_Versions_Context_Menu.reg:

    Windows Registry Editor Version 5.00
    
    [HKEY_CLASSES_ROOT\AllFilesystemObjects\shellex\ContextMenuHandlers\{596AB062-B4D2-4215-9F74-E9109B0A8153}]
    
    [HKEY_CLASSES_ROOT\CLSID\{450D8FBA-AD25-11D0-98A8-0800361B1103}\shellex\ContextMenuHandlers\{596AB062-B4D2-4215-9F74-E9109B0A8153}]
    
    [HKEY_CLASSES_ROOT\Directory\shellex\ContextMenuHandlers\{596AB062-B4D2-4215-9F74-E9109B0A8153}]
    
    [HKEY_CLASSES_ROOT\Drive\shellex\ContextMenuHandlers\{596AB062-B4D2-4215-9F74-E9109B0A8153}]
    
  • 将shell_Vim.reg、shell_wVim_New_Window.reg、txtfile_shell_open_command.reg、Remove_Previous_Versions_Context_Menu.reg、Restore_Previous_Versions_Context_Menu.reg复制到Vim目录下,方便在不同的机器上快速设置右键菜单和.txt文件关联等操作

  • 为Vim\vim74\gvim.exe创建快捷方式,命名为mvim,将此快捷方式放入C:\Windows\System32\wbem目录中(注意,快捷方式的名称不要命名为Vim,因为这样会与其他程序,例如Git里自带的Vim程序相冲突)

    这样做的目的是:使用Win + R打开“运行对话框”,然后输入“Vim”,即可打开Vim程序。

参考