参考http://www.cnblogs.com/chijianqiang/archive/2012/11/06/vim-3.html
之所以说Vim形成了自己的生态环境,就是因为Vim具备开放的插件体系,开发者为了提升开发效率,为Vim编写了数以万计的插件,我们可以根据需要任意选择,也可以基于Vimscript语言开发自己的专属插件。
每个插件都是以Vim为后缀的脚本文件,编写插件的语言一般采用Vimscript。Vimscript是Vim自己的编程语言,我们在后续会介绍到它。尽管Vimscript几乎为可以Vim做任何事,但还是会存在一些场景,用其他语言更好更快。考虑到这一点,Vim的开发者为其他脚本语言设计了接口,用来编写Vim插件,比如Perl,Python和Ruby,后续我们会演示如何使用python语言为Go语言编写Vim插件,在Vim中执行Go程序。
常用插件分为四种:
:CommandT
即可启动该功能,对任何类型都适用。该类插件一般放置在.vim/plugin/目录下。
,当完成了最后的>
时,xmledit会自动为你添加闭合标签,
,如果输入了最后一个>
,标签会自动展开,方便输入子标签或文本内容。这时如果你用Vim打开一个txt文件,这些功能就消失了。当然,xmledit功能远不止这么简单,我们稍后再详细介绍。:make
可以编译正在编辑的文件。了解了Vim插件的基本概念,再来讲下面的这些常用插件,就比较容易理解了。
我们首先来介绍这款用来管理插件的插件——pathogen。
https://github.com/tpope/vim-pathogen
一个插件包往往具备多种功能,每个文件根据Vim的路径约定会放置到不同的目录下,通用插件放到plugin下,语法高亮插件放到syntax下,自动加载插件放到autoload下,文件类型插件放到ftplugin下,编码格式插件的放到indent下......如果你是重度插件用户,你会发现在.vim主目录下会有一堆文件夹,无论是你想要安装新插件,还是想删除旧插件,都非常麻烦,你不得不在每个文件夹下找相关的vim文件。
pathogen是管理插件的插件,主要用来解决上述问题。pathogen采用了bundle的概念来管理插件,如果你熟悉OSGi或OS X,那么对bundle就不会陌生。OSGi以bundle的形式封装Java程序和资源文件,而OS X中的大部分应用程序都是bundle,正是bundle的概念让OSGi可以动态管理Java组件,OS X安装大部分程序都是“绿色安装”。
pathogen在.vim
目录下建立bundle文件,所有的插件都会在该目录下管理。当Vim启动时,会自动执行runtimepath(rtp)列表中所包含文件夹下的vim脚本,pathogen会在启动时把./vim/bundle
下的文件夹中的插件按照一定顺序递归加载到rtp中,这样Vim启动时,通过pathogen管理的插件就生效了。
有了pathogen之后,一般.vim
文件夹下只有三个文件夹:autoload、bundle和doc,其他插件将被安装在bundle文件夹下,如图所示:
如无特殊说明,后面提到的插件都采用pathogen方式安装,我会以NERDTree插件为例说明安装方式。
.vim
文件夹下建立autoload和bundle目录在.vimrc
文件中增加如下代码:
call pathogen#infect()
无
新插件安装到bundle目录下后,如果插件中包含doc,则需要在Vim中运行:Helptags
来生成在线帮助tags。
我们在介绍pathogen的时候,用一张图展示了插件的目录结构,这个目录结构就是基于NERDTree插件实现的。
https://github.com/scrooloose/nerdtree
NERDTree是Vim最常用的插件之一,可以在Vim运行时显示目录和文件结构,类似TextMate左侧的文件浏览器,但操作起来更为方便,你可以在手不离开键盘的情况下快速浏览文件,并在文件和文件夹之间进行切换。
.vim/bundle
目录git clone git://github.com/scrooloose/nerdtree.git
:Helptags
来生成NERDTree的在线帮助tags打开Vim,输入:NERDTree
,即可呼出执行Vim命令的当前目录的文件目录。为了方便使用,我在.vimrc中定义了快捷键,可以用Ctrl+t打开NERDTree,你可以定义自己习惯的快捷键。
NERDTree提供了丰富的键盘操作方式来浏览和打开文件,我简单介绍一些常用的快捷键:
和编辑文件一样,通过h j k l移动光标定位
o 打开关闭文件或者目录,如果是文件的话,光标出现在打开的文件中
go 效果同上,不过光标保持在文件目录里,类似预览文件内容的功能
i和s可以水平分割或纵向分割窗口打开文件,前面加g类似go的功能
t 在标签页中打开
T 在后台标签页中打开
p 到上层目录
P 到根目录
K 到同目录第一个节点
J 到同目录最后一个节点
m 显示文件系统菜单(添加、删除、移动操作)
? 帮助
q 关闭
想了解更多操作方式,可以通过? 查看详细的帮助信息。
https://wincent.com/products/command-t
Command-T是一个基于Ruby和C扩展实现的快速文件浏览的插件,类似TextMate的Go to File(Command+T呼出)功能,或Eclipse的Open Resource(Command+Shift+r)功能,可以通过模糊匹配快速定位并打开文件。
~/.vim/bundle
目录下创建文件夹command-t:UseVimball ~/.vim/bundle/command-t
进入ruby目录下编译C扩展
cd ~/.vim/bundle/command-t/ruby/command-t
ruby extconf.rb
make
输入:CommandT可进入文件快速定位功能,如图所示:
该插件还有个常用命令,:CommandTBuffer
,可以浏览缓冲区的文件,并重新打开。操作方式同上。
Vim版本需要支持ruby扩展。我们可以在Vim中输入:ruby 1
检查,如果出现E319: Sorry, the command is not available in this version
就表示不支持。
如果出现上述情况,我们就需要自己去编译能够支持ruby的Vim,嫌麻烦的话可以直接安装vim-nox,自带Ruby支持,在Ubuntu下安装命令如下:sudo apt-get install vim-nox
。
执行ruby extconf.rb
命令时如果出现找不到mkmf包的情况,说明你需要安装ruby-dev的包,在Ubuntu下安装命令如下:sudo apt-get install ruby1.8-dev
。
系列4主要为大家介绍使用Vim实现代码浏览、索引、标签、标记、检索等功能,主要包括ctags、taglist和visualmark,尤其是ctags,是后续各种插件的基础,能够熟练的掌握和理解为佳。下面进入正文:
http://ctags.sourceforge.net
严格意义上来说,ctags并不是Vim的插件,而是Linux/Unix下的标签命令。通过ctags -R
命令可以对当前目录下源代码中的类、函数、方法、变量、宏等元素进行索引处理,并生成索引文件。Vim使用ctags生成的tag文件,即可实现IDE中常用的代码跳转功能,实乃居家旅行代码索引的常备利器。ctags不仅支持c/c++/java等静态语言,还支持python/perl/php/jsp等动态脚本语言,就目前我的使用情况,ctags基本不支持Objective-C,对Ruby支持的也很糟糕,随着这些语言的普及和发展,希望后续版本的ctags会对更多的编程语言有更好的支持。
对于Ubuntu,可以使用如下命令安装:sudo apt-get install ctags
,安装完成后在终端键入ctags --help
,看到正常的帮助信息就说明安装成功了。
对于Mac用户来说,OS X自带了ctags命令,但这并不是vim所需要的ctags,要重新安装:sudo port install ctags
。由于OS X自带的ctags位于/usr/bin目录下,一般在PATH中是优先加载的,所以安装完成后,还需要设置一下环境变量,确保你在命令行使用的是新安装的ctags。如果没做特殊设置,安装的ctags一般在/opt/local/bin下,在当前用户的.profile中增加如下代码:export PATH=/opt/local/bin/:$PATH
,在终端执行source .profile
可立即生效。
创建标签索引
前面我们提到过,ctags主要是用来创建Vim可以使用的tag索引文件,使用ctags -R
即可对当前目录下的代码递归建立索引文件,文件保存在当前目录下,默认文件名为tags,文件大小和你要索引的代码量有关。
如果想自己指定tag文件的位置和索引代码的位置,可以使用如下命令实现:ctags -R -o ~/.vim/ctags/pythontags /somepythondir/
设置索引文件的位置
Vim在运行过程中需要知道tag的索引文件位置,如果不指定的话,Vim会在当前目录下寻找名为tags的文件作为tag索引文件。
如果想使用某个目录下的索引文件,在该目录下启动Vim即可。也可以在启动后通过如下命令设置或改变索引文件的位置:set tags=/home/xxx/xx/tags, xxxx/tags,......
当然,你也可以把这条命令写到.vimrc中。
vim -t class | method | variable
vim -t loadCache
:ts
会列出所有包含loadCache标签的文件,输入文件序号可以打开文件并定位到loadCache标签,通过j和k可以上下滚屏。如果只是通过vim命令打开文件,那么可以使用如下命令进行文件检索和浏览:
:ta tagname 跳转到标签tagname定义的地方
:stag tagname 在分割窗口中查看包含tagname的文件
:tags 查看到达当前位置所经过的标签路径
:ts tagname 列出匹配tagname的标签,如为空,则使用标签栈中最后的标签
:tf 跳转至第一个匹配的标签
:tl 跳转至最后一个匹配的标签
跳转快捷键:
ctrl-] :跳转至光标所在对象定义之处
ctrl-t :返回跳转前位置
[n]ctrl-t :[n]为数字,向回跳转n次;等价于重复n次ctrl-t操作
确认vim在打开文件时能够找到相关的标签文件tags。
https://github.com/vim-scripts/taglist.vim
taglist是Vim的一个代码浏览的插件,类似IDE中的Outline视图,可以根据不同语言的代码显示代码中的包、类、接口、方法、函数、变量、属性等内容,是Vim浏览代码的一个必备工具。
如图:
taglist同样需要依赖ctags命令生成tag。
~/.vim/bundle
目录执行: git clone git://github.com/vim-scripts/taglist.vim.git
在.vimrc
文件设置taglist的配置信息,以下是我的偏好设置
"taglist{
let Tlist_Show_One_File = 1 "只显示当前文件的taglist,默认是显示多个
let Tlist_Exit_OnlyWindow = 1 "如果taglist是最后一个窗口,则退出vim
let Tlist_Use_Right_Window = 1 "在右侧窗口中显示taglist
let Tlist_GainFocus_On_ToggleOpen = 1 "打开taglist时,光标保留在taglist窗口
let Tlist_Ctags_Cmd='/opt/local/bin/ctags' "设置ctags命令的位置
nnoremap tl : Tlist "设置关闭和打开taglist窗口的快捷键
"}
taglist参数介绍,大家可以根据自己的偏好在.vimrc
中设置:
当使用vim打开某个程序文件时,我们可以用:Tlist
打开taglist窗口,如果该程序具备类、接口、属性等元素,就会在taglist窗口显示出来。我们可以通过以下这些常用快捷键来操作taglist:
确认在.vimrc
中使用Tlist_Ctags_Cmd定义了正确的ctags命令的位置,否则会出现找不到tag的错误信息。
---------------------------------------------------------还有一个很牛逼的插件叫cscope-----------------------------------
号称超频过的ctag
1、Cscope介绍
Cscope是类似于ctags一样的工具,但可以认为她是ctags的增强版,因为她比ctags能够做更多的事。在Vim中,通过cscope的查询,跳转到指定的地方就像跳转到任何标签;她能够保存标签栈,所以通过合适的键盘映射绑定,你能够在函数向后或向前跳转,就像通常使用的tags一样。
首次使用Cscope时,他会根据源文件生成符号数据库。然后在以后的使用中,cscope只是在源文件有改动或源文件列表不同时才会重建数据库。当在重建数据库时,未改动过的文件对应的数据库信息会从旧的数据库中拷贝过来,所以会使重建数据库快于一开始的新建数据库。
当你在命令行下调用cscope时,你会获得一个全屏选择窗口,能够使你查询特定的内容。然而,一旦你查询的有匹配,那么就会用你默认的编辑器来编辑该源文件,但是你不能够简单的使用Ctrl+]或者:tag命令来从一个标签跳转到另一个标签。
Vim中的cscope接口是通过以命令行形式调用完成的,然后解析查询返回的结果。最终的结果就是cscope查询结果就像通常的tags一样,这样你就可以自由跳转,就像在使用通常的tags(用ctrl+]或者:tag跳转)。
以下内容转自:http://blog.sina.com.cn/s/blog_7ce2cb410100rm6b.html
标签: 杂谈 |
分类: Linux |
为什么要使用它们?
利用它们可以实现sourceinsight的代码阅读功能,而且可以让人觉得你很cool。
Ctag和Cscope有什么区别?
我的感觉是配置更简单,功能更好用。
书归正传。
Vim支持plugin来扩展功能,插件放在~/.vim/plugin下,一个插件就是一个.vim文件。
0. 安装vim
不用安装,一般Ubuntu装好后就有。我的版本是7.2
1.安装taglist包
下载地址: http://www.vim.org/scripts/script_search_results.php?order_by=downloads
然后解压到~/.vim
这时候plugin目录看起来像这样
ls ~/.vim/plugin
taglist.vim
2.安装Cscope
sudo apt-get install cscope
3. 安装cscope_maps.vim
下载地址: http://cscope.sourceforge.net/cscope_vim_tutorial.html
下载这个文件,拷贝到~/plugin
这时候plugin目录看起来像这样
ls ~/.vim/plugin
cscope_maps.vim taglist.vim
4. 配置taglist
在~/.vim/.vimrc中加入
:let Tlist_Auto_Open=1 “打开vi时自动打开函数列表窗口(才像si嘛)
:let Tlist_Exit_OnlyWindow = 1 “如果最后一个窗口是函数列表窗口,自动关闭它
map
5. 配置cscope
对于C代码,在代码的顶层目录执行
cscope –Rb
在当前目录生成cscope.out,这就是Cscope的索引数据库,以后混,全靠它了。
如果是C++
find ~/xxxx/xxxx -name "*.h" -o -name"*.c" -o -name "*.cc" -o -name "*.cpp" >cscope.files
cscope -bkq -i cscope.files
ctags -R
find 后面要给绝对路径。
6. 基本使用
在有cscope.out的目录执行vi –tmain定位到主函数(或其他函数)开始浏览代码
6.1 查找符号
移动光标到某符号,按CTRL+\,同时放开它们,然后按s(后面将表述为CTRL+\s)
6.2 跳转到符号定义处
移动光标到某符号,按CTRL+],
6.3 跳到函数被调用处
移动光标到函数,按CTRL+\ c
6.4 跳到一个头文件里
移动光标到#include头文件名处,按CTRL+\f
6.5 返回上次查看处
CTRL+t
6.6 在左右窗口移动光标
CTRL+w 箭头
6.7 关闭窗口
移动光标到某个窗口,按CTRL+w c
6.8 拆分窗口
CTRL+w s
CTRL+w v
6.9 打开文件浏览窗口
F3
6.10在所有的c文件中查找字符串“an error”
vimgrep /an error/ **/*.c
------------------------------------------------------有时需要同时打开多个标签-------------------------------------
转自:http://www.cnblogs.com/kuainiao/archive/2013/02/05/2892665.html
1.vim还没有启动的时候:
在终端里输入
vim file1 file2 ... filen便可以打开所有想要打开的文件
2.vim已经启动
输入
:open file
可以再打开一个文件,并且此时vim里会显示出file文件的内容。
同时显示多个文件:
:split
:vsplit
在文件之间切换:
1.文件间切换
Ctrl+6—下一个文件
:bn—下一个文件
:bp—上一个文件
对于用(v)split在多个窗格中打开的文件,这种方法只会在当前窗格中切换不同的文件。
2.在窗格间切换的方法
Ctrl+w+方向键——切换到前/下/上/后一个窗格
Ctrl+w+h/j/k/l ——同上
Ctrl+ww——依次向后切换到下一个窗格中
在多个个文件之间复制:
1.在第一个文件中使用可视模式,就是VISUAL,然后选中要复制的文本,执行命令 "+y,或者“*y这就把内容复制到剪贴板。这里可以三个字符,而且一定要在可视化模式中,并存选中你要复制的代码以后,输入上面的命令,这时在VIM中的下面并不显示你输入的这条命令。
2.在另一个文件中,执行命令"+p,或者"*p。就能复制过来,+指的是寄存器的意思,似乎也是操作系统的剪贴板,复制了之后,在别的地方,例如文本文件里就可以用ctrl+v了。这里也是在可视模式下,不需要输入冒号:,这里输入的命令也是看不到的。
安装airline
在.vim下的bungle目录下,运行
git clone https://github.com/bling/vim-airline ~/.vim/bundle/vim-airline
即可。
powerline不如这个轻量,而且有乱码的现象。
在.vimrc中添加命令:
set laststatus=2 " Always show 将命令栏和状态栏分开