(一)安装Python 2.7
在官网下载Python,并安装,我的安装路径是D:\Program Files\Python。安装完成后编辑环境变量Path,在其后添加;D:\Program Files\Python。(注意前面的分号)
(二)安装Vim
在官网下载gvim,并安装,我的安装路径是D:\Program Files\Vim。安装完成后编辑环境变量Path,在其后添加;D:\Program Files\Vim\vim73。
(三)安装Exuberant Ctags
Ctags用于生成tags文件,Vim可用其实现跳转功能,也可被其他插件调用。所谓跳转就是可以随时转到自己想要的函数、类型、结构体、类等等的定义处。比如光标处于任意位置时可以普通模式下输入
:ta func_name
就可以直接将光标定位到func_name寒暑处。当然,其他的命名也可以使用这种方法进行快速定位。另外就是可以在光标指向一个函数名称时按下Ctrl+],马上跳转到这个函数的定义。在跳转到定义位置后,可以按下Ctrl+o快速返回原来的编辑位置。需要明确一下ctags和tags的区别:ctags是一个exe文件,用于生成tags文件,tags文件是当前目录下所有源文件的标签链接文件。在一个没有ctags的Vim中只是无法生成新的tags文件,但已有的tags文件依然可以使用。
通常我们不会单独使用Ctags,一般是配合Taglist等插件使用。
在官网下载Ctags,将文件夹内的ctags.exe放到任意文件夹,如D:\OpenSource\Vim(注意文件路径不能有空格或中文字符,否则Taglist等插件不能找到ctags.exe的位置)。最好是放到D:\Program Files\Vim\vim73,这样后面就不需要复杂的设置了。
(四)安装Taglist
在官网上下载Taglist,将taglist.vim放入安装目录的plugin文件夹下,我的是D:\Program Files\Vim\vim73\plugin。
有了Ctags和Taglist,我们就可以轻松查看文件中包含的函数、类、变量等。
(五)安装代码自动补全工具Pydiction
在官网上下载Pydiction,将python_pydiction.vim、complete_dict和pydiction.py三个文件放到D:\Program Files\Vim\vim73\ftplugin。使用时Tab键就可以进行自动补全。
(六)配置_vimrc
一般该文件在安装目录的上一层,我的在D:\Program Files\Vim。我们需要让Taglist找到ctags.exe,并设置其为默认打开。
设置Pydiction的complete-dict位置,并设置默认高度为20。
添加如下几句:
let Tlist_Ctags_Cmd='D:\OpenSource\Vim\ctags.exe'
let Tlist_Auto_Open=1
let g:pydiction_location = 'D:\Program Files\Vim\vim73\ftplugin\complete-dict'
let g:pydiction_menu_height = 20
如果将ctags.exe放到了D:\Program Files\Vim\vim73,那需将第一句改为
let Tlist_Ctags_Cmd='ctags.exe'
(七)添加Python快捷键
由于gvim的2.73版本已经集成了Python的语法高亮插件python.vim,所以至此我们有了Python的编辑器,接下来就是设置快捷键以实现python的编译。可通过以下语句实现:
map <F12> :!python.exe %
这样就可以在Vim中直接调用python.exe运行py脚本。对于一个脚本,可以按F12键,并按Enter键运行程序。
vim + taglist + ctags
==================================
在windows下安装:
1.
2. 打开vim
这时就可以看taglist的帮助内容了。
3. 下载Exuberant Ctags
编辑_vimrc,在里面加入以下两句:
如果不加入这两个语句,那么有的宏定义,还有一些就找不到了。
4. 同时按下win + R , 键入cmd,打开dos窗口,在所要看的源代码根目录下运行:
这里可以设置关联的文件类型:
例如:ctags --languages=c --langmap=c:+.ec:+.h -R
如果不能运行,可能是ctags.exe的路径没有设置。
在这个目录下会生成一个tags文件。可以看看里面的内容。
5. 打开源文件,键入
这时可以看到两个窗口(要改变窗口的位置,可以修改taglist.vim或是在_vimrc中修改)
==================================
最常用的几个命令:
==================================
ctags参数设置
==================
因为学习使用Vim,遇到ctags这样一个东东,花了一天时间大致搞清楚了一点,记下来,和大家分享。我写的匆忙,大家也就随便看看好了。希望有用。
一.
ctags的功能:扫描指定的源文件,找出其中所包含的语法元素,并将找到的相关内容记录下来。
我用的是Exuberant Ctags,在Windows上使用,就一个可执行文件,非常绿色,可在sourceforge下载。
二.
ctags识别很多语言,可以用如下命令来查看:
ctags --list-languages
还可以识别自定义语言,具体没研究过。
ctags --list-maps
还可以指定ctags用特定语言的分析器来分析某种扩展名的文件或者名字符合特定模式的文件。例如如下命令告知ctags,以inl为扩展名的文件是c++文件。
ctags --langmap=c++:+.inl –R
三.
可以用如下命令查看ctags可以识别的语法元素:
ctags --list-kinds
或者单独查看可以识别的c++的语法元素
ctags --list-kinds=c++
ctags -R --c++-kinds=+px
四.
不管一次扫描多少文件,一条ctags命令把记录的内容都记到一个文件里去,默认是当前目录的tags文件,当然这是可以更改的。
每个语法元素对应文件里的一行,学名叫tag entry。
1)
2)
3)
4)
5)
6)
ctags -R --fields=+aiKSz
ctags –R --extra=+f
ctags -R --extra=+q
五.
估计vi是这样使用tags文件的:我们使用vi来定位某个tag时,vi根据我们输入的tag的名字在tags文件中一行行查找,判断每一行tag entry的tag名字(即每行的开头)是否和用户给出的相同,如果相同就认为找到一条记录,最后vi显示所有找到的记录,或者根据这些记录直接跳转到对应文件的特定位置。
考虑到ctags记录的内容和方式,出现同名的tag entry是很常见的现象,例如函数声明和函数定义的tag名字是一样的,重载函数的tag名字是一样的等等。vi只是使用tag名字来搜索,还没智能到可以根据函数的signature来选择相应的tag entry。vi只能简单的显示tag entry的内容给user,让user自行选择。
ctags在记录成员函数时默认是把函数的名字(仅仅是函数的名字,不带任何类名和namespace作为前缀)作为tag的名字的,这样就导致很多不同类但同名的函数所对应的tag entry的名字都是一样的,这样user在vi中使用函数名来定位时就会出现暴多选择,挑选起来十分麻烦。user可能会想在vi中用函数的全路径名来进行定位,但这样做会失败,因为tags文件中没有对应名字的tag entry。要满足用户的这种心思,就要求ctags在记录时针对类的成员多记录一条tag entry,该tag entry和已有的tag entry的内容都相同,除了tag的名字不同,该tag entry的名字是类的成员的全路径名(包括了命名空间和类名)。这就解释了ctags的--extra=+q这样一条命令行选项(见四)。
六.
ctags -R --languages=c++ --langmap=c++:+.inl -h +.inl --c++-kinds=+px --fields=+aiKSz --extra=+q --exclude=lex.yy.cc --exclude=copy_lex.yy.cc
命令太长了,折成两行了,可以考虑把命令的各个参数写到文件里去了(具体做法就不谈了)。
1.
-R
表示扫描当前目录及所有子目录(递归向下)中的源文件。并不是所有文件ctags都会扫描,如果用户没有特别指明,则ctags根据文件的扩展名来决定是否要扫描该文件——如果ctags可以根据文件的扩展名可以判断出该文件所使用的语言,则ctags会扫描该文件。
2.
--languages=c++
只扫描文件内容判定为c++的文件——即ctags观察文件扩展名,如果扩展名对应c++,则扫描该文件。反之如果某个文件叫aaa.py(python文件),则该文件不会被扫描。
3.
--langmap=c++:+.inl
告知ctags,以inl为扩展名的文件是c++语言写的,在加之上述2中的选项,即要求ctags以c++语法扫描以inl为扩展名的文件。
4.
-h +.inl
告知ctags,把以inl为扩展名的文件看作是头文件的一种(inl文件中放的是inline函数的定义,本来就是为了被include的)。这样ctags在扫描inl文件时,就算里面有static的全局变量,ctags在记录时也不会标明说该变量是局限于本文件的(见第一节描述)。
5.
--c++-kinds=+px
记录类型为函数声明和前向声明的语法元素(见第三节)。
6.
--fields=+aiKSz
控制记录的内容(见第四节)。
7.
--extra=+q
让ctags额外记录一些东西(见第四、五节)。
8.
--exclude=lex.yy.cc --exclude=copy_lex.yy.cc
告知ctags不要扫描名字是这样的文件。还可以控制ctags不要扫描指定目录,这里就不细说了。