vim的配色方案
tags的使用技巧
直接查看一个tag,跳到其定义处。
:tag snprintf 直接查看snprintf的原型
:tselect tagname 当有多个匹配的时候,查看所有匹配
:tnext 下一个匹配,更多查看帮助
:tags 查看跳转的栈
修改vimrc配置, 使ctrl+]变得智能.
"让CTRL-]只有一个选择时自动跳转,多个选择时,出现选择列表
map <C-]> :tselect <C-R>=expand("<cword>")<CR><CR>
map <C-]> g<C-]>
在刚才跳转过的地方跳转 (除了C-] 和 C-T之外的选择)
C-I C-O
助记 O:old,很久很久以前的跳往的地方
I:来自的地方
为新项目生成tags
set tags+=/home/nemo/code/trunk_20101224/tags 追加tags
:set tags=./tags,./../tags,./*/tags 也可以直接设置多个tags
CTAGS的使用技巧 生成tags时的技巧
当前目录以及子目录的所以文件包好php,cpp,java等全生成tags
ctags -R *
为特定的语言的文件生成tags (这样ctags不会为解析其他语言的文件)
eg --languages=c,c++
查看ctags程序默认的语言对应的扩展名
ctags --list-maps
生成tags,修改特定语言的的扩展名
eg 将.h识别为c语言文件
--langmap=c:+.h
指定生成的tags文件名字
-f ~/.vim/sys_tags
同时搜索多个目录下的文件
ctags [options] /usr/include /usr/local/include
man ctags 会得到 ctags [options] [file(s)], 可见最后面就是文件了,可以是多个文件。并且是可选的,如果没有提供文件,默认就是当前文件夹了。
查看ctags针对不同语言支持的生成tag的语法元素,
比如,对于c++,支持对宏,函数名,类名,结构体名等生成tag
ctags --list-kinds
C++
c classes
d macro definitions
e enumerators (values inside an enumeration)
f function definitions
g enumeration names
l local variables [off]
m class, struct, and union members
n namespaces
p function prototypes [off]
s structure names
t typedefs
u union names
v variable definitions
x external and forward variable declarations [off]
红色部分[off]是默认ctags 不生成tag的语法元素,也就是对于c++语言,默认不生成本地变量,函数原型,前置声明以及extern声明的变量。
如果要生成需指定参数:--<LANG>-kinds
为c++的函数原型也生成tag,对与extern变量以及前置声明变量也生成tag
--c++-kinds=+px
指定其他的一些扩展选项(有一些插件比如echofunc可能依赖此项)
--fields=+iaS :ctags要求描述的信息,其中
i表示如果有继承,则标识出父类;
a表示如果元素是类成员的话,要标明其调用权限(即是public还是private);
S表示如果是函数,则标识函数的signature。
--extra=+q:强制要求ctags做如下操作—如果某个语法元素是类的一个成员,ctags默认会给其记录一行,可以要求ctags
ctags使用的完整举例:
ctags为系统头文件目录生成tags
ctags -I __THROW --file-scope=yes --langmap=c:+.h --languages=c,c++ --links=yes --c-kinds=+p -R -f ~/.vim/systags /usr/include /usr/local/include
其关键是
1)-I __THROW部分和--c-kinds=+p部分。为了不让__THROW干扰ctags,需要在运行ctags时使用-I选项。我一般使用下面的命令生成系统头文件tags
设置-I后,ctags会在处理文件时,就会忽略-I后面写出来的符号。
2)而--c-kinds=+p则告诉ctags需要为函数原型的声明也生成tag。--langmap=c:+.h表示.h视为c文件而不是c++文件。
一个生成ctags的脚本
#! /bin/bash
ctags -I __THROW --file-scope=yes --fields=+iaS --extra=+q --langmap=c:+.h --languages=c,c++ --links=yes --c-kinds=+p -R -f ~/.vim/systags /usr/include /usr/local/include
更多ctags参考:
1)ctags为系统头文件目录生成tags
http://hi.baidu.com/%B2%BB%D5%FD%D6%B1%B5%C4%C8%CB/blog/item/7f55080382c5a9e708fa93bf.html
2)man ctags
cscope以及在vim中使用cscope
我的vim版本7.2.330
我的cscope版本:15.7a
如何生成cscope索引数据库
1) 先通过find命令生成源文件名字列表my_cscope.files
(如果有多个目录,可以分别为不同的目录生成源文件列表,然后在合并)
2) cscope -bkq -i my_cscope.files
如何让vim支持cscope,以及设定cscope生成的索引数据库?
网上下载cscope_maps.vim插件,放在.vim/plugin目录下即可。
如果你的vim默认不支持cscope,可能需要重新编译vim使其支持哦。
如何在vim中设置连接cscope的生成的数据库
1)
你需要在vim中连接cscope的索引数据库,使用命令:
:cs add /usr/src/linux/cscope.out
2)默认vim会在工作目录下搜索是否有cscope.out文件存在。
3)您可以检查当前连接的索引数据库,确保设置ok
:cs show
4)您也可以重置索引数据库
:cs reset
cscope的用法举例
1)我想用cscope查看当前光标下的函数的调用信息
ctrl+/ s /是]符号右边的/ 就像ctags的ctrl+]一样 (cscope的快速查询方法)
同时按下ctrl和/, 然后按下s键.
2)通过输入命令查询
查找符号snprintf的出现的地方
:cs find 0 snprintf
更多含义:
0 or s: Find this C symbol
1 or g: Find this definition
0 or s: Find this C symbol
1 or g: Find this definition
2 or d: Find functions called by this function
3 or c: Find functions calling this function
4 or t: Find this text string
6 or e: Find this egrep pattern
7 or f: Find this file
8 or i: Find files #including this file
综合了cscope和ctags的命令
:cstag snprintf
相当于 :cs find g snprintf 或 :tjump snprintf
当cscope查找失败时自动用ctags查找
cscope程序的更多选项的含义
-R: 在生成索引文件时,搜索子目录树中的代码
-b: 只生成索引文件,不进入cscope的界面
-q: 生成cscope.in.out和cscope.po.out文件,加快cscope的索引速度
-k: 在生成索引文件时,不搜索/usr/include目录
-i: 如果保存文件列表的文件名不是cscope.files时,需要加此选项告诉cscope到哪儿去找源文件列表。可以使用“-”,表示由标准输入获得文件列表。
-I dir: 在-I选项指出的目录中查找头文件
-u: 扫描所有文件,重新生成交叉索引文件
-C: 在搜索时忽略大小写
-P path: 在以相对路径表示的文件前加上的path,这样,你不用切换到你数据库文件所在的目录也可以使用它了。
如何使用cscope的独立GUI模式
启动:cscope -d
使用:tab在不同的选项间切换
退出:CTRL-D (我因为不知道这个快捷键,搞了好久退不出来)
问题:
为何我的cscope不能查找成员函数,甚至连snprintf, printf都查看不了?
我先生成文件列表,再通过文件列表生成索引数据库,在vim中我也正确的指定了cscope.out索引数据库,
可能的原因
1)我在生成cscope的时候,没有指定 -i参数,导致生成了错误的 cscope。out
如果你的 源文件列表的文件名字不是 cscope.file, 那么需要带上-i参数
2) 在生成cscope.out时是否出现告警?
比如:
nemo@ubuntu:~/.vim$ cscope -b -q -k -i cscope_trunk.file
cscope: cannot find file /home/nemo/code/trunk_20101224/outerlib/apppayclient/api/apppackage.cpp
上面的代码出现告警, 导致我生成的文件总是用不了。郁闷。
如果我的代码更新了,如果让cscope的索引数据库也更新?
重新执行一遍生成cscope的命令.cscope不会像souceinsight那样自动更新执行.
更多帮助:
1)Vim+cscope+ctags+tags阅读源代码
作者:许振文
http://blog.csdn.net/amicablehj/archive/2010/07/10/5725981.aspx
直接把当前光标下的单词送到命令行里面!!
nmap <C-@>d :cs find d <C-R>=expand("<cword>")<CR><CR>
这个方法真的非常非常好用,可以扩展到其他插件的使用上,真的非常非常好用!!!!!!!
比如:查找当前光标下的函数的所有tag标签。 这样就省的手动输入tselect 函数名字了。自定义快捷键。牛XX。
153 nmap <C-@>d :tselect <C-R>=expand("<cword>")<CR><CR>
参考易水博客更详细的cscope的配置!
http://easwy.com/blog/archives/advanced-vim-skills-cscope/
echofunc 自动提示函数原型
echofunc是这样的一个插件:当你输入函数名字,然后在输入(之后,自动的会在界面最下面提示函数的原型(signature)
安装方法:
1)下载echofunc.vim插件到.vim/plugin/目录下
2)生成echofunc.vim所必须的tags。 要求生成tags时必须加上 --fields=+iS 选项。
否则可能无法显示函数原型。
参考:
http://edyfox.codecarver.org/html/vimplugins.html
code_complete自动提示函数原型,自动输入代码模板
自动提示函数原型
code_complete也可以实现自动提示函数原型,类似于echofunc。当你输入函数名字,然后再输入(之后,然后按tab,自动的会提示函数原型让你选择。
使用方法类似与echofunc,但有所不同。
1)下载code_complete.vim插件到.vim/plugin/目录下
2)生成code_complete.vim所必须的tags。 要求生成tags时必须加上 --fields=+iS ,以及--c-kinds=+p选项。
否则可能无法显示函数原型。
参考:
http://www.vim.org/scripts/script.php?script_id=1764
自动输入代码模版(代码片段)
1)当你直接输入函数名字,(此时不要输入‘(’)就按tab,就会自动的帮你输入代码片段,并且将光标定位在第一个参数处,可以直接修改参数。继续按tab,可以切换到不同的参数。
2)对与if,for,while等标准结果,也支持代码模版
if( `<...>` )
{
`<...>`
}
--------------------------------------------------------------------------------------------------------------------------------
OmniCppComplete插件,自动提示成员函数,成员变量等
----------------------------------------------------------------------------------------------------------------------------------
强烈建议看OmniCppComplete的帮助文档,非常详尽的资料!!Omni支持那些特性,不支持哪些特性,讲的非常的详尽。
使用好omnifunc的关键点
1)生成合适的ctags.否则omni的功能无法使用或无法正常使用.
使用如下的方式可以正常使用omnifunc的功能.
ctags -I __THROW --file-scope=yes --fields=+iaS --extra=+q --languages=c++ --links=yes --c++-kinds=+p --c-kinds=+p -R -f ~/.vim/trun
ktags /home/nemo/code/trunk_20101224
--------------------------------------------------------------------------------------------------------------------------------
taglist插件,像IDE一样,在左侧窗口中显示类成员函数,成员变量列表等。
----------------------------------------------------------------------------------------------------------------------------------
按照方法以及注意事项,参考taglist的帮助文档。
:TlistToggle 调出窗口
:TlistClose 关闭窗口
如下设置可以保证当Tlist是最后一个窗口时可以自动关闭
let Tlist_Show_One_File=1
let Tlist_Exit_OnlyWindow=1
http://edyfox.codecarver.org/html/vimplugins.html
设置快捷键打开tlist
noremap <F4> :TlistToggle<CR>
--------------------------------------------------------------------------------------------------------------------------------
winManager插件,想windows的资源管理器一样,浏览文件夹的工具。
----------------------------------------------------------------------------------------------------------------------------------
:WMToggle 调出窗口
// 当wmtoggle是最后一个窗口时,退出
let g:persistentBehaviour=0
:map <c-w><c-t> :WMToggle<cr> 设置按键映射调出该窗口。
重复<c-w><c-t> 关闭窗口
--------------------------------------------------------------------------------------------------------------------------------
NERD Tree插件,想windows的资源管理器一样,浏览文件夹的工具。(比winManager要好用)
----------------------------------------------------------------------------------------------------------------------------------
具有目录树的功能
傻瓜是安装。 把vimcopy到plugin目录即可。
:NERDTree 可以呼出界面。
--------------------------------------------------------------------------------------------------------------------------------
代码注释插件The NERD Commenter
----------------------------------------------------------------------------------------------------------------------------------
简单介绍下NERD Commenter的常用键绑定,以C/C++文件为例,详析的使用方法,请:h NERDCommenter。在Normal或者Visual 模式下:
参考
http://www.dutor.net/index.php/2010/05/vim-the-nerd-commenter/