Jade Dungeon

vim 安装配置

安装

关于vim的Python支持:

官网上的windows安装文件为32位,只能调用系统上安装的32位python2和python3。

32位的dll文件如果找不到的话,配置一下参数:

set pythondll=C:/Windows/SysWOW64/python27.dll
set pythonthreedll=C:/Windows/SysWOW64/python36.dll

手动编译

卸载gvim(或vim-gtk, 大多都是这两个版本,如果不是的话自己查看一下):

sudo apt-get remove vim-gnome

安装编译依赖

sudo apt-get install libncurses5-dev libgnome2-dev libgnomeui-dev \
    libgtk2.0-dev libatk1.0-dev libbonoboui2-dev \
    libcairo2-dev libx11-dev libxpm-dev libxt-dev python-dev \
    python3-dev ruby-dev lua5.1 lua5.1-dev git

安装mercurial

sudo apt-get install mercurial

下载gvim源码:http://www.vim.org/sources.php

hg clone https://vim.googlecode.com/hg/ gvim
cd gvim
hg pull
hg update

设置编译选项,我的配置是:

./configure --with-features=huge \
  --enable-multibyte \
  --enable-fontset \
  --enable-xim  \
  --with-x  \
  --enable-gui=gtk2 \
  --enable-luainterp=dynamic  \
# vim Python2与Python3有可能冲突,一般只在编译时加入python3模块支持
  --enable-pythoninterp=no \
  --enable-python3interp=dynamic \
  --enable-rubyinterp=dynamic \
  --enable-perlinterp \
  --enable-cscope \
  --with-compiledby=erocpil  \
# python 配置目录位置
# vim Python2与Python3有可能冲突,一般只在编译时加入python3模块支持
# --with-python-config-dir=/usr/lib/python2.7/config-x86_64-linux-gnu \
  --with-python3-config-dir=/usr/lib/python3.6/config-3.6m-x86_64-linux-gnu \
# 安装的位置
  --prefix=/opt/morganstudio/gvim

详细选项参见./configure --help

  --sbindir=DIR           system admin executables [EPREFIX/sbin]
  --enable-luainterp=OPTS     Include Lua interpreter.  default=no OPTS=no/yes/dynamic
  --enable-mzschemeinterp   Include MzScheme interpreter.
  --enable-perlinterp=OPTS     Include Perl interpreter.  default=no OPTS=no/yes/dynamic
  --enable-pythoninterp=OPTS   Include Python interpreter. default=no OPTS=no/yes/dynamic
  --enable-python3interp=OPTS   Include Python3 interpreter. default=no OPTS=no/yes/dynamic
  --enable-tclinterp      Include Tcl interpreter.
  --enable-rubyinterp=OPTS     Include Ruby interpreter.  default=no OPTS=no/yes/dynamic
  --enable-cscope         Include cscope interface.
  --disable-netbeans      Disable NetBeans integration support.
  --enable-sniff          Include Sniff interface.
  --enable-multibyte      Include multibyte editing support.
  --enable-hangulinput    Include Hangul input support.
  --enable-xim            Include XIM input support.
  --enable-fontset        Include X fontset output support.
  --enable-gui=OPTS     X11 GUI default=auto OPTS=auto/no/gtk2/gnome2/motif/athena/neXtaw/photon/carbon

  --with-features=TYPE    tiny, small, normal, big or huge (default: normal)
  --with-lua-prefix=PFX   Prefix where Lua is installed.
  --with-plthome=PLTHOME   Use PLTHOME.
  --with-python-config-dir=PATH  Python's config directory
  --with-python3-config-dir=PATH  Python's config directory
  --with-tclsh=PATH       which tclsh to use (default: tclsh8.0)
  --with-ruby-command=RUBY  name of the Ruby command (default: ruby)
  --with-x                use the X Window System

检查vim支持的模块

在vim程序中使用:version检查当前版本的vim支持那些模块。

vimrc

应用配置

立即更新配置::so %

模板

从模块复制一份:

cp /usr/share/vim/vim70/vimrc_example.vim ~/.vimrc

http://www.amix.dk/vim/vimrc.html有一个非常强大的vimrc,有人戏称为 「史上最强的vimrc」,或许有些言过其实。不过,如果你通读了这个vimrc,相信能 从中学到很多……

这里有一个 redguardtoo修改过的版本,可以对照参考一下。

我的vimrc也是基于Amix的模板,然后自已做了很多修改。

建议:不要照拷这个vimrc!可能这个文件的设定并不符合你的习惯。另外, 这个文件的设定,可能也不能在你的工作环境中运行。

判断当前操作系统

定义一个MySys()函数可以得到当前操作系统。

" Platform
function! MySys()
  if has("win32")
    return "windows"
  else
    return "linux"
  endif
endfunction

如果是Win的话,可以要加载额外的内容:

" For windows version
if MySys() == 'windows'
    source $VIMRUNTIME/mswin.vim
    behave mswin
endif 

同一个方法在Win下和lin下可能有不同的逻辑:

"Fast edit vimrc
if MySys() == 'linux'
    "Fast reloading of the .vimrc
    map <silent> <leader>ss :source ~/.vimrc<cr>
    "Fast editing of .vimrc
    map <silent> <leader>ee :call SwitchToBuf("~/.vimrc")<cr>
    "When .vimrc is edited, reload it
    autocmd! bufwritepost .vimrc source ~/.vimrc
elseif MySys() == 'windows'
    " Set helplang
    set helplang=cn
    "Fast reloading of the _vimrc
    map <silent> <leader>ss :source ~/_vimrc<cr>
    "Fast editing of _vimrc
    map <silent> <leader>ee :call SwitchToBuf("~/_vimrc")<cr>
    "When _vimrc is edited, reload it
    autocmd! bufwritepost _vimrc source ~/_vimrc
endif

注意:我在windows中也定义一个HOME环境变量,然后把_vimrc放在HOME环境变量 所指向的目录中。如果你打算在windows中使用上面的设定,也需要这样做!

tab显示与转换

  • tabstop:tab就是tab,显示宽度为多少个空格。
  • softtabstop:默认是0如果修改了tabstop的话建议这一个值设置为和tabstop相同的值 ,表示当你输入一个Tab的时候Vim会自动变成对应的Tab和空格的组合,例如: 设置为softtabstop=7tabstop=4的话,当输入一个Tab的时候会自动变成一个 Tab和3个空格的组合。
  • expandtab:Tab会被自动替换成空格
  • shiftwidth这个需要和expandtab联合在一起使用,用来表示输入一个Tab的时候 Vim会自动替换成多少个Space。

如果你希望你的程序中没有真正的Tab,但是输入的时候还是通过按Tab来缩进, 且希望所有的缩进显示为4个空格的话,可以使用以下组合:

:set tabstop=4
:set shiftwidth=4
:set expandtab

定义映射

设置mapleader变量,当mapleader为未设置或为空时,使用缺省的\来作为mapleader。 在这里,被作为mapleader:

"Set mapleader
let mapleader = ","

当定义一个映射时,可以使用<leader>前缀。而在映射生效时,vim会把<leader> 替换成mapleader变量的值。

例,把<leader>ss,映射为命令:source ~/.vimrc<cr>

"Fast reloading of the .vimrc
map <silent> <leader>ss :source ~/.vimrc<cr>

我们这里定义的<leader>ss在使用时就变成了,ss,当输入这一快捷方式时,就会 source一次~/.vimrc文件(也就是重新执行一遍.vimrc文件)。

定义,ee操作为编辑vimrc:

"Fast editing of .vimrc
map <silent> <leader>ee :e ~/.vimrc<cr>

绑定自动操作

每次保存时自动执行:source ~/.vimrc<cr>

"When .vimrc is edited, reload it
autocmd! bufwritepost .vimrc source ~/.vimrc 

保存环境

使用会话(session)和viminfo,可以把你编辑环境保存下来,然后你在下次启动vim后, 可以再恢复回这个环境。

  • 会话信息中保存了所有窗口的视图,外加全局设置。
  • viminfo信息中保存了命令行历史(history)、搜索字符串历史(search)、输入行历史、 非空的寄存器内容(register)、文件的位置标记(mark)、最近搜索/替换的模式、 缓冲区列表、全局变量等信息。

会话

我们可以使用:mksession [file]命令来创建一个会话文件,如果省略文件名的话, 会自动创建一个名为Session.vim的会话文件。会话文件,其本质上是一个vim脚本, 你可以使用上述命令生成一个session文件,然后再查看其中的内容,就会对session文件 有一个深入的认识。

会话文件中保存哪些信息,是由sessionoptions选项决定的。缺省的sessionoptions 选项包括: blank,buffers,curdir,folds,help,options,tabpages,winsize, 也就是 会话文件会恢复当前编辑环境的空窗口、所有的缓冲区、当前目录、折叠(fold)相关的 信息、帮助窗口、所有的选项和映射、所有的标签页(tab)、窗口大小。

如果你使用windows上的vim,并且希望你的会话文件可以同时被windows版本的vim和UNIX 版本的vim共同使用的话,在sessionoptions中加入slashunix,前者把文件名中 的\替换为/,后者会把会话文件的换行符保存成unix格式。

如果你不希望在session文件中保存当前路径,而是希望session文件所在的目录自动成为 当前工作目录,那么,需要在sessionoptions去掉curdir,加入sesdir,这样每次 载入session件时,此文件所在的目录就被设为vim的当前工作目录。在你通过网络访问 其它项目的session文件时,或者你的项目有多个不同版本(位于不同的目录),而你想 始终使用一个session文件时,这个选项比较有用:你只需要把session文件拷贝到不同的 目录,然后使用就可以了。设置此选项后,session文件中保存的是文件的相对路径,而 不是绝对路径。

在vim手册里有这样一段话:(:help 'sessionoptions')

Don’t include both 「curdir」 and 「sesdir」. When 「curdir」 nor 「sesdir」 is included, file names are stored with absolute paths.

应该在sessionoptions设置curdir时,去掉sesdir。关于sesdir的含义在手册里有明确 说明。

我们在上面使用:mksession命令创建了会话文件,那么怎么使用会话文件恢复编辑环境 呢?很简单,你只需要使用:source session-file来导入会话文件。因为会话文件是 一个脚本,里面保存的是Ex命令,所以source命令只是把会话文件中的Ex命令执行一遍 。

你在mksession时,要把那些由插件动态生成的窗口关掉(例如MiniBufExplorer窗口、 FileList窗口等),因为vim在恢复会话时,没法恢复这些动态的窗口。

viminfo

使用:wviminfo [file]命令,可以手动创建一个viminfo文件。

其实,在vim退出时,每次都会保存一个.viminfo文件在用户的主目录。我们使用 :wviminfo命令则是手动创建一个viminfo文件,因为缺省的.viminfo文件会在每次 退出vim时自动更新,谁知道你在关闭当前软件项目后,又使用vim做过些什么呢? 这样的话,.viminfo中的信息,也许就与你所进行的软件项目无关了。还是手动保存 一个保险。

:wviminfo命令保存哪些内容,以及保存的数量,由viminfo选项决定,这个选项的值 在windows上和在linux上的缺省值不同,具体含义参阅手册。

要读入你所保存的viminfo文件,使用:rviminfo [file]命令。

现在,回到我们的例子,依旧是上篇文章中的抓图,先看一下我们当前目录,执行:pwd ,显示/home/easwy/src/vim70,接下来,执行下面的命令:

:cd src                            "切换到/home/easwy/src/vim70/src目录
:set sessionoptions-=curdir        "在session option中去掉curdir
:set sessionoptions+=sesdir        "在session option中加入sesdir
:mksession vim70.vim               "创建一个会话文件
:wviminfo vim70.viminfo            "创建一个viminfo文件
:qa                                "退出vim

退出vim后,在命令行下执行gvim &,再次进入vim,这时看到的是一个空白窗口。 然后执行下面的命令:

:source ~/src/vim70/src/vim70.vim  '载入会话文件
:rviminfo vim70.viminfo            '读入viminfo文件

太棒了,又恢复到昨天退出时的状态了!继续工作~~~~

不过,每次都要手工修改sessionoptionsviminfo太麻烦。可以结合vimrc使用。

以项目为单位管理配置

vimrc定义了vim通常的行为。然而,每个项目都有其特殊的定义,虽然我们也可以在 vimrc中对每个项目进行定制,但这样一来,vimrc会变得很大,使vim启动速度变慢; 另外也会使vimrc变得难以维护。

因此,我们使用其它的方法来保存项目相关的信息,这就是本文的主要内容。我们将以 path选项的设置为例进行讲解。

path选项定义了一个目录列表,在使用gf,find,以及CTRL-W f等vim命令时,如果 使用的是相对路径,那么就会在path选项定义的目录列表中查找相应的文件。

path选项以逗号分隔各目录名。我们依旧以vim 7.0的源代码为例(源代码放在 ~/src/vim70/目录中)。

对于这个项目,我们的path选项设置如下:

set path=.,/usr/include,,~/src/vim70/** 

稍微解释一下各项的含义,更详细的信息,请查看path选项的帮助页:

  • .:在当前文件所在目录中搜索
  • /usr/include:在/usr/include目录中搜索
  • ,,:在当前工作路径中搜索
  • ~/src/vim70/**:在~/src/vim70的所有子目录树中进行搜索

我们把光标定位到src/main.c文件第22行的fcntl.h单词上,然后在Normal模式下按 gf。咦,vim打开了/usr/include/fcntl.h文件!

现在我们按CTRL-^回到刚才的位置,光标仍旧定位在第22行的fcntl.h单词上,然后按 CTRL-W f。这次vim打开了一个水平分隔窗口,在此窗口中打开了 /usr/include/fcntl.h

尽管在src/main.c中未指定fcntl.h的路径,但vim会在path选项定义的路径中搜索 此文件,方便吧!

现在我们看一下find命令,输入:

:find netrw.vim 

vim打开了~/src/vim70/runtime/autoload/netrw.vim文件。用这种方法打开文件真是 太方便了,你不用输入文件的路径,vim会自动在path选项定义的路径中搜索。不过find 命令也有缺陷,如果你只记得文件名的一部分,那么就没有办法用find命令打开这个 文件了。而且find命令也不允许使用正则表达式。没关系,我们还有更好的方法来打开 文件,我将在Lookupfile插件中介绍这些方法。

path选项介绍完了,我们进入正题,如何把本项目相关的配置保存起来,下次打开 本项目时自动恢复这些配置呢?我们有两种方法做到这一点。

方法一:

我们在~/src/vim70/目录下建立一个文件,假定文件名为workspace.vim,文件内容为 :

"set project path
set path+=~/src/vim70/** 

这个文件中保存了项目相关的信息,例如选项值,键映射,函数定义,自动命令,等等。 我们的例子中只定义的path选项,我们没有使用set path=…语句,在vim手册中建议使用 set path+=…set path-=…格式。

接下来,在你的vimrc文件中加入下面的语句:

" execute project related configuration in current directory
if filereadable("workspace.vim")
    source workspace.vim
endif 

以后,每次你在~/src/vim70/目录中启动vim时,vim都会自动载入workspace.vim, 恢复项目的配置信息。

方法二:

前面介绍了使用session文件和viminfo保存项目环境的方法。如果你使用了会话文件, 那么选项值,键映射,和其它很多信息都已经保存了。但会话的功能毕竟有限,不能把 项目相关的配置全部保存下来,怎么办呢?

vim的作者已经想到了这个问题,并提供了解决办法。

在vim载入会话文件的最后一步,它会查找一个额外的文件并执行其中的ex命令。查找的 规则是,把会话文件名的后缀去掉,然后在后面加上x.vim,。假设你的会话文件名为 example.session,vim就会查找是否有examplex.vim,如果找到,就会执行此文件中的 ex命令。

好了,我们先创建我们的会话文件:

:cd ~/src/vim70
:set sessionoptions-=curdir        '在session option中去掉curdir
:set sessionoptions+=sesdir        '在session option中加入sesdir
:mksession vim70s.vim              '创建一个会话文件 

然后再编辑一个名为~/src/vim70/vim70sx.vim的文件,文件的内容为(当然,你可以 在这个文件中加入更多内容):

"set project path
set path+=~/src/vim70/** 

退出vim后,在命令行下执行gvim &,再次进入vim,这时看到的是一个空白窗口。然后执行下面的命令:

:source ~/src/vim70/vim70s.vim  '载入会话文件 

原来的会话环境已经恢复,并且项目相关的配置也设置好了。

更新帮助文件索引

:helptags $VIMFILES/doc

字符编码

" =====================
" 多语言环境
" 默认为 UTF-8 编码
" =====================
if has("multi_byte")
    set encoding=utf-8
    set fileencoding=utf-8
    set termencoding=utf-8
    " English messages only
    "language messages zh_CN.utf-8
  
    if has('win32')
        language english
        let &termencoding=&encoding
    endif
  
    set fencs=ucs-bom,utf-8,gbk,cp936,latin1
    set formatoptions+=mM
    set nobomb " 不使用 Unicode 签名
  
    if v:lang =~? '^\(zh\)\|\(ja\)\|\(ko\)'
        set ambiwidth=double
    endif
else
    echoerr "Sorry, this version of (g)vim was not compiled with +multi_byte"
endif

配色主题

位置在:

/usr/share/vim/vim73/colors/

字体

在控制台下的VIM是不能够改变字体的,因为字体的改变是随着终端字体的变化而变化的, 但是在GVIM中,你却有权力将字体改变成自己想要的样子。

在Linux下设置字体的命令是:

:set guifont=Courier\ 14

而在Windows下则是:

:set guifont=Courier:h14

当然,如果需要设置多个字体,则我们可以在各个字体之间添加逗号,来设置多个字体, 如:

:set guifont=Courier\ New\ 12, Arial\ 10

如果字体名字中含有空格,则我们需要将其使用\进行转义,而在windows下则可以将空格 转换为:字符。当然,这样设置之后只会对当前会话有效,而如果想每次都使用的话,则 需要将其加入到其gvimrc设置文件中(将命令中前面的:去掉)。

如果你不知道可用的字体名字,使用下面的命令可以得到一个字体名字的列表:

:set guifont=*

如果需要想对特定的文件类型使用特定的字体,则可以将下面的语句加入到vimrc文件中去 :

autocmd BufEnter *.txt set guifont=Arial\ 12

这样,在下次打开.txt文件的时候,就会设置字体Arial 12字体。

需要注意的是,每次改变字体大小的时候,GVim会调整自己的窗口大小来适应字体的变化。