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=7
但tabstop=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
中加入slash
和unix
,前者把文件名中
的\
替换为/
,后者会把会话文件的换行符保存成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文件
太棒了,又恢复到昨天退出时的状态了!继续工作~~~~
不过,每次都要手工修改sessionoptions
或viminfo
太麻烦。可以结合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会调整自己的窗口大小来适应字体的变化。