1. ctags+cscope配合使用的原因:
为什么要配合,因为,比如cscope能提供更多的查找功能等功能。但是ctags远比cscope支持更多的文件。比如要访问一个java工程文件,那么cscope是能力低下的,比如对类识别不行,但是我们仍然可以利用其一些功能,比如找到什么函数调用了这个函数。
另外,还有点注意,ctags不能利用QuickFix窗口,而cscope可以利用,这也是cscope的好处。一般,如果仅仅有C/C++文件,用cscope更多,如果是其他文件,则用ctags更多。
不管是用ctags还是cscope,都可以用WinManager和Taglist,来实现左边上面是文件列表,下面是Taglist,右边是文件浏览窗口的效果!但是Taglist依赖ctags,如果用cscope,ctags还是要用的。具体的让WinManager和Taglist配合的方法,见vim配置文件。
2. 生成数据库并让vim使用:
一般的做法是:在最上层目录,生成这些文件。然后vim在最上层打开,并利用下面提到的WinManager来导航到里面目录。
(1) ctags生成tags文件:
ctags -R . 可以搜索目录下所有的文件,并生成 tags 文件。
为了生成最多的tags:
C/C++这样:ctags --extra=+q --fields=+Saim --c++-kinds=+lpx --c-kinds=+lpx -R .
Java这样:ctags --java-kinds=+l -R .
(主要是--xx-kinds控制着要分析出哪些东西,如--java-kinds=+l表示要加上(+)local variable,默认的有哪些,没有哪些,用ctags --list-kinds 可以知道,off的都是默认不分析的,否则是分析的)
cscope只能分析C/C++/lex/yacc文件!
然后在vim里 :set tags=path/to/tags(用,分隔,可以多个)
(2) cscope生成cscope.in.out cscope.out cscope.po.out文件:
由于cscope默认不看非.c .yacc .lex外的文件,所以,假设你要找C和C++其他文件,要这样:
find . -name "*.h" -o -name "*.c" -o -name "*.cc" > cscope.files
cscope -bkq -i cscope.files
(找java文件同理)
而,对于纯C文件,你可以:
cscope -Rbkq ./ 即可。
然后在vim里 :cs add path/to/cscope.out
如果要重新生成,用:!cscope -Rbkq,再用 :cs reset重新读入.
3. ctags 管理跳转栈:
ctags设计来找到各种希望找的东西,如类定义处,函数定义处。对各种语言都有支持,但原设计就是针对function定义的,所以,ctags对寻找functions定义特别有效,像函数原型是默认不做tag的。
(1) vim的支持tags的命令:(这些命令在编译时要加进ctags支持才能用)
vim靠内置的命令,来支持使用ctags得到的tags文件。
:tags 列出目前你跳转的栈,可以得知当前位置 (可惜不能用QuickFix窗口)
:tag 跳到:tags列表的顶部(栈底)
:tag tagname 跳到tagname的定义处
Ctrl+] 压栈(跳到标记定义处) Ctrl+W ] 在横着的新窗口打开(:stag tagname)
n Ctrl+t 出栈(后跳n次,会使你的:tags列出的表缩短) ── 跨文件时,用 Ctrl + o才能跳回去。
:tselect tagname 可以列出所有的相同的tagname,你按数字可以跳到对应条目。
:tnext 跳到下一个相同tagname处
:tprevious 同理
:tfirst 同理
:tlast 同理
匹配用/ /来括起来,让vim知道里面的是正则式
如 :tselect /^write_ 可以匹配以 write 开头的
:set ignorecase 可以在任何时候忽略大小写,比如在:tag tagname时。如果设置了这个,又想case有效,则在表达式后加\C
但如果想某次有效,则在表达式后面加\c
上面的表达式都用//包起来。
4. cscope看vim配置文件和以前的文档即可。
5. 使用Path:
有时,我们要定义额外的Path,以访问某些文件。且方便gf(goto file,在normal模式下,按gf,会打开光标下的文件,它会在Path下去搜),find(不支持正则式的搜索,用法 :find netrw.vim)等命令。
path选项定义了一个目录列表,在使用gf,find,以及CTRL-W f等命令时,如果使用的是相对路径,那么就会在path选项定义的目录列表中查找相应的文件。path选项以逗号分隔各目录名。我们依旧以VIM 7.0的源代码为例(源代码放在~/src/vim70/目录中)。
对于这个项目,我们的path选项设置如下:
set path=.,/usr/include,,~/src/vim70/**
稍微解释一下各项的含义,更详细的信息,请查看path选项的帮助页:
. 在当前文件所在目录中搜索
/usr/include 在/usr/include目录中搜索
,, 在当前工作路径中搜索
~/src/vim70/** 在~/src/vim70的所有子目录树中进行搜索!!
6. 多文件浏览采用 MiniBufExplorer:
因为使用了WinManager和Taglist,所以tabe显得不好用了,用buffer会更方便。
但是vim自带的buffer管理工具只有:ls, :bnext, :bdelete 等的命令,这里用MiniBufExplorer.好处是在顶上可视化列出了各个buffer。仍然用:bnext等命令。
然后,在vim中设置了,用shift+Tab来切换buffer,挺方便。
关闭一个buffer,而不退出窗口,在标签上按d,这是MiniBufExplorer的命令。个
7. Taglist
提醒用 s 来切换按名字排序(大写,再小写,每个里面按首字母)还是出现次序排序
用 u 来更新list(默认可以再次调用ctags)
另外,在vimrc中设置了单击来打开对应位置
8. WinManager
s来切换按xx排序,r做反排序
另外,在各个窗口间切换,用 Ctrl+方向键 更快~~~
9. vimgrep查找文本 或 Grep插件查找文本:
ctags找到了--list-kinds中指示的东西,你可以用:tag tagname找出这些tags,cscope也找了它可以找的东西,可以用:cs find g/d/c/t/e tagname找到相应的东西,其中t表示找那个文本,尤其是e表示用egrep查找。单都是在cscope的数据库中查找。
但是,很多时候,仍需要对文件本身搜索,或者想到某个特定子目录搜索,并支持正则式。
(1) 可以用 :vimgrep命令:
:vimgrep是vim内置的grep,如果你用:grep等,则是让vim调用外部的系统的grep。用:vimgrep的好处是,不依赖于系统的,使得各个系统上都可以用。但是会慢点,因为它会把每个文件,放入buffer,再分析。
用法简单:
:vimgrep /pattern/ path
其中 pattern为正则式,如 \<main\>表示main单词
path 为shell元字符式,如 ./SSF/**/*.java 表示搜索SSF目录下,所有子目录,及所有嵌套子目录的 java文件。
(2) 也可以用Grep插件,下面命令都支持正则式:
:Grep 在指定的文件查找
:Rgrep 递归查找
:Bgrep 在打开的缓冲区中查找
他会问你更多信息,比如哪些文件中查找,在哪个目录中查找,很方便。
如:
Search for pattern: 时可以填 \<get_real_path\> (匹配单词,而不是字符串)
Search in files: 时可以填 *.java
10. 高亮文本:
:colorscheme 可以选择某个主题。
在.vim里,自己创建colors doc plugin syntax 四个目录,doc和plugin用户放plugin的文件和doc文件,syntax用于放置指导语法加亮的文件,而colors就用于放置高亮主题。目前我用的是desert主题。
11. 目前用到的插件:
a.vim
color_sample_pack.vim
minibufexpl.vim
taglist.vim
winmanager.vim (winfileexplorer.vim wintagexplorer.vim)
code_complete.vim #这个好好看看它的代码体吧,很简单,却很高效的用tab补全很多东西,如调用函数时,在(后按tab,就可补出各个参数的类型。比如很方便自动生成main,for,while,#define等。
grep.vim
NERD_commenter.vim
12. 颜色相关:
首先,在vim中输入 :runtime syntax/colortest.vim 可打印出目前你可以使用的颜色。只有那么几种。包括粗体。所以,这就是终端里使用vim没有gvim颜色多,或者没有gvim颜色正常的原因。但是,你好好调整一下,还是能够满足自己要求的。
另外,各种颜色主题,是不能让,如函数,单独高亮的,因为这需要语法帮助。这需要你单独找语法文件,就是什么东西是函数,并应该高亮为什么颜色。把语法文件放到 ~/.vim/syntax中。
我是从官网下了cpp.vim放到~/.vim/syntax目录中,于是.cpp文件可以有更多的高亮了。
但是,c.vim是我从别的地方找的,官网上找的c.vim不起作用,我又不好改。目前用的c.vim如下,主要加亮了函数名和C关键字。而cpp.vim是使用c.vim的,所以默认也就让cpp.vim支持同样的效果了。
要读懂和改这个简单文件,需要知识如下:
:hi 命令时一直都是以图形介面(gui)为例设置前景和背景色。由于命令终端对颜色显示的限制,Vim在命令行下可以使用的颜色相对gui 要少得多,所以使用:hi命令时图形介面和命令行介面的颜色是分开设置的。对于黑白终端来说就无所谓颜色了,而彩色终端用cterm来表示,前景色就是 “ctermfg”,而背景色是“ctermbg”。下面是一个表格:
终端类型 前景色 背景色 注释
term - - 黑白终端
cterm ctermfg ctermgb 彩色终端
gui guifg guibg 图形介面
为什么要配合,因为,比如cscope能提供更多的查找功能等功能。但是ctags远比cscope支持更多的文件。比如要访问一个java工程文件,那么cscope是能力低下的,比如对类识别不行,但是我们仍然可以利用其一些功能,比如找到什么函数调用了这个函数。
另外,还有点注意,ctags不能利用QuickFix窗口,而cscope可以利用,这也是cscope的好处。一般,如果仅仅有C/C++文件,用cscope更多,如果是其他文件,则用ctags更多。
不管是用ctags还是cscope,都可以用WinManager和Taglist,来实现左边上面是文件列表,下面是Taglist,右边是文件浏览窗口的效果!但是Taglist依赖ctags,如果用cscope,ctags还是要用的。具体的让WinManager和Taglist配合的方法,见vim配置文件。
2. 生成数据库并让vim使用:
一般的做法是:在最上层目录,生成这些文件。然后vim在最上层打开,并利用下面提到的WinManager来导航到里面目录。
(1) ctags生成tags文件:
ctags -R . 可以搜索目录下所有的文件,并生成 tags 文件。
为了生成最多的tags:
C/C++这样:ctags --extra=+q --fields=+Saim --c++-kinds=+lpx --c-kinds=+lpx -R .
Java这样:ctags --java-kinds=+l -R .
(主要是--xx-kinds控制着要分析出哪些东西,如--java-kinds=+l表示要加上(+)local variable,默认的有哪些,没有哪些,用ctags --list-kinds 可以知道,off的都是默认不分析的,否则是分析的)
cscope只能分析C/C++/lex/yacc文件!
然后在vim里 :set tags=path/to/tags(用,分隔,可以多个)
(2) cscope生成cscope.in.out cscope.out cscope.po.out文件:
由于cscope默认不看非.c .yacc .lex外的文件,所以,假设你要找C和C++其他文件,要这样:
find . -name "*.h" -o -name "*.c" -o -name "*.cc" > cscope.files
cscope -bkq -i cscope.files
(找java文件同理)
而,对于纯C文件,你可以:
cscope -Rbkq ./ 即可。
然后在vim里 :cs add path/to/cscope.out
如果要重新生成,用:!cscope -Rbkq,再用 :cs reset重新读入.
3. ctags 管理跳转栈:
ctags设计来找到各种希望找的东西,如类定义处,函数定义处。对各种语言都有支持,但原设计就是针对function定义的,所以,ctags对寻找functions定义特别有效,像函数原型是默认不做tag的。
(1) vim的支持tags的命令:(这些命令在编译时要加进ctags支持才能用)
vim靠内置的命令,来支持使用ctags得到的tags文件。
:tags 列出目前你跳转的栈,可以得知当前位置 (可惜不能用QuickFix窗口)
:tag 跳到:tags列表的顶部(栈底)
:tag tagname 跳到tagname的定义处
Ctrl+] 压栈(跳到标记定义处) Ctrl+W ] 在横着的新窗口打开(:stag tagname)
n Ctrl+t 出栈(后跳n次,会使你的:tags列出的表缩短) ── 跨文件时,用 Ctrl + o才能跳回去。
:tselect tagname 可以列出所有的相同的tagname,你按数字可以跳到对应条目。
:tnext 跳到下一个相同tagname处
:tprevious 同理
:tfirst 同理
:tlast 同理
匹配用/ /来括起来,让vim知道里面的是正则式
如 :tselect /^write_ 可以匹配以 write 开头的
:set ignorecase 可以在任何时候忽略大小写,比如在:tag tagname时。如果设置了这个,又想case有效,则在表达式后加\C
但如果想某次有效,则在表达式后面加\c
上面的表达式都用//包起来。
4. cscope看vim配置文件和以前的文档即可。
5. 使用Path:
有时,我们要定义额外的Path,以访问某些文件。且方便gf(goto file,在normal模式下,按gf,会打开光标下的文件,它会在Path下去搜),find(不支持正则式的搜索,用法 :find netrw.vim)等命令。
path选项定义了一个目录列表,在使用gf,find,以及CTRL-W f等命令时,如果使用的是相对路径,那么就会在path选项定义的目录列表中查找相应的文件。path选项以逗号分隔各目录名。我们依旧以VIM 7.0的源代码为例(源代码放在~/src/vim70/目录中)。
对于这个项目,我们的path选项设置如下:
set path=.,/usr/include,,~/src/vim70/**
稍微解释一下各项的含义,更详细的信息,请查看path选项的帮助页:
. 在当前文件所在目录中搜索
/usr/include 在/usr/include目录中搜索
,, 在当前工作路径中搜索
~/src/vim70/** 在~/src/vim70的所有子目录树中进行搜索!!
6. 多文件浏览采用 MiniBufExplorer:
因为使用了WinManager和Taglist,所以tabe显得不好用了,用buffer会更方便。
但是vim自带的buffer管理工具只有:ls, :bnext, :bdelete 等的命令,这里用MiniBufExplorer.好处是在顶上可视化列出了各个buffer。仍然用:bnext等命令。
然后,在vim中设置了,用shift+Tab来切换buffer,挺方便。
关闭一个buffer,而不退出窗口,在标签上按d,这是MiniBufExplorer的命令。个
7. Taglist
提醒用 s 来切换按名字排序(大写,再小写,每个里面按首字母)还是出现次序排序
用 u 来更新list(默认可以再次调用ctags)
另外,在vimrc中设置了单击来打开对应位置
8. WinManager
s来切换按xx排序,r做反排序
另外,在各个窗口间切换,用 Ctrl+方向键 更快~~~
9. vimgrep查找文本 或 Grep插件查找文本:
ctags找到了--list-kinds中指示的东西,你可以用:tag tagname找出这些tags,cscope也找了它可以找的东西,可以用:cs find g/d/c/t/e tagname找到相应的东西,其中t表示找那个文本,尤其是e表示用egrep查找。单都是在cscope的数据库中查找。
但是,很多时候,仍需要对文件本身搜索,或者想到某个特定子目录搜索,并支持正则式。
(1) 可以用 :vimgrep命令:
:vimgrep是vim内置的grep,如果你用:grep等,则是让vim调用外部的系统的grep。用:vimgrep的好处是,不依赖于系统的,使得各个系统上都可以用。但是会慢点,因为它会把每个文件,放入buffer,再分析。
用法简单:
:vimgrep /pattern/ path
其中 pattern为正则式,如 \<main\>表示main单词
path 为shell元字符式,如 ./SSF/**/*.java 表示搜索SSF目录下,所有子目录,及所有嵌套子目录的 java文件。
(2) 也可以用Grep插件,下面命令都支持正则式:
:Grep 在指定的文件查找
:Rgrep 递归查找
:Bgrep 在打开的缓冲区中查找
他会问你更多信息,比如哪些文件中查找,在哪个目录中查找,很方便。
如:
Search for pattern: 时可以填 \<get_real_path\> (匹配单词,而不是字符串)
Search in files: 时可以填 *.java
10. 高亮文本:
:colorscheme 可以选择某个主题。
在.vim里,自己创建colors doc plugin syntax 四个目录,doc和plugin用户放plugin的文件和doc文件,syntax用于放置指导语法加亮的文件,而colors就用于放置高亮主题。目前我用的是desert主题。
11. 目前用到的插件:
a.vim
color_sample_pack.vim
minibufexpl.vim
taglist.vim
winmanager.vim (winfileexplorer.vim wintagexplorer.vim)
code_complete.vim #这个好好看看它的代码体吧,很简单,却很高效的用tab补全很多东西,如调用函数时,在(后按tab,就可补出各个参数的类型。比如很方便自动生成main,for,while,#define等。
grep.vim
NERD_commenter.vim
12. 颜色相关:
首先,在vim中输入 :runtime syntax/colortest.vim 可打印出目前你可以使用的颜色。只有那么几种。包括粗体。所以,这就是终端里使用vim没有gvim颜色多,或者没有gvim颜色正常的原因。但是,你好好调整一下,还是能够满足自己要求的。
另外,各种颜色主题,是不能让,如函数,单独高亮的,因为这需要语法帮助。这需要你单独找语法文件,就是什么东西是函数,并应该高亮为什么颜色。把语法文件放到 ~/.vim/syntax中。
我是从官网下了cpp.vim放到~/.vim/syntax目录中,于是.cpp文件可以有更多的高亮了。
但是,c.vim是我从别的地方找的,官网上找的c.vim不起作用,我又不好改。目前用的c.vim如下,主要加亮了函数名和C关键字。而cpp.vim是使用c.vim的,所以默认也就让cpp.vim支持同样的效果了。
要读懂和改这个简单文件,需要知识如下:
:hi 命令时一直都是以图形介面(gui)为例设置前景和背景色。由于命令终端对颜色显示的限制,Vim在命令行下可以使用的颜色相对gui 要少得多,所以使用:hi命令时图形介面和命令行介面的颜色是分开设置的。对于黑白终端来说就无所谓颜色了,而彩色终端用cterm来表示,前景色就是 “ctermfg”,而背景色是“ctermbg”。下面是一个表格:
终端类型 前景色 背景色 注释
term - - 黑白终端
cterm ctermfg ctermgb 彩色终端
gui guifg guibg 图形介面