把VIM打造成一个真正的IDE(2)

OK,上一篇文章,我们已经配置好了一个可以正常使用的VIM,那么在我们真正来到程序员的VIM世界之前,希望你能在VIM里面再多加下面几个配置。

set go= "无菜单、工具栏"

对,让我真正抛弃鼠标,进入美妙的VIM之旅吧!

首先说说一个IDE应该有的几个功能:

1)源代码结构及函数列表

2)变量定义支持跳转等

3)代码自动补全

当然VIM还给了我们几个小惊喜:

4)快速批量注释与反注释

5)由注释直接生成文档

6)文件头作者信息自动添加

7).cpp和.h文件之间的快速切换

那么接下来,我们久来看看我们将会用到的插件列表。

首先介绍一下一些必备知识,我们需要下面两样东西,来辅助完成vim成为IDE的大业--ctags和cscope,这两样东西不是vim的插件而是可执行程序,linux和windows下都有。ctags主要实现了c、c++、java、c#等语言的智能分析,并声称tags文件,后面所有的包括函数列表显示,变量定义跳转,自动补全等,都要依赖于他。有了tags文件后,只需要在变量上按下 CTRL + ]键,就可以自动跳到变量定义的位置。而cscope据说诞生就是为了来替代ctags的,因为他有着比ctags更加强大的功能,举个例子,ctags只能分析出这个函数在哪里被定义,而cscope除了这一点之外,还能分析出这个函数再哪里被调用。当然cscope目前还是有不少bug的,但是也不影响我们的使用。

1)taglist.vim 实现了源代码结构和函数列表的展示,功能非常强大

2)有了tags就自动支持了

3)omnicppcomplete.vim 实现写C/C++语言时自动补全

4)NERD_commenter.vim 注释插件

5)DoxygenToolkit.vim 由注释生成文档,并且能够快速生成函数标准注释

6)这段配置是本人自己写的稍后贴出。

7)a.vim 实现.cpp和.h快速切换

下面一个个的讲解配置:
注意,请先检查是否有如下配置,如果没有请添加:

1
2
3
4
5
6
if(has("win32") || has("win95") || has("win64") || has("win16"))
    let g:vimrc_iswindows=1
else
    let g:vimrc_iswindows=0
endif
autocmd BufEnter * lcd %:p:h

首先确认安装了ctags和cscope,并且确认这两个可执行程序所在的目录已经放进环境变量里面。(必须做,否则后边都无法操作)

在vimrc中配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
map <F12> :call Do_CsTag()<CR>
nmap <C-@>s :cs find s <C-R>=expand("<cword>")<CR><CR>:copen<CR>
nmap <C-@>g :cs find g <C-R>=expand("<cword>")<CR><CR>
nmap <C-@>c :cs find c <C-R>=expand("<cword>")<CR><CR>:copen<CR>
nmap <C-@>t :cs find t <C-R>=expand("<cword>")<CR><CR>:copen<CR>
nmap <C-@>e :cs find e <C-R>=expand("<cword>")<CR><CR>:copen<CR>
nmap <C-@>f :cs find f <C-R>=expand("<cfile>")<CR><CR>:copen<CR>
nmap <C-@>i :cs find i ^<C-R>=expand("<cfile>")<CR>$<CR>:copen<CR>
nmap <C-@>d :cs find d <C-R>=expand("<cword>")<CR><CR>:copen<CR>
function Do_CsTag()
    let dir = getcwd()
    if filereadable("tags")
        if(g:iswindows==1)
            let tagsdeleted=delete(dir."\\"."tags")
        else
            let tagsdeleted=delete("./"."tags")
        endif
        if(tagsdeleted!=0)
            echohl WarningMsg | echo "Fail to do tags! I cannot delete the tags" | echohl None
            return
        endif
    endif
    if has("cscope")
        silent! execute "cs kill -1"
    endif
    if filereadable("cscope.files")
        if(g:iswindows==1)
            let csfilesdeleted=delete(dir."\\"."cscope.files")
        else
            let csfilesdeleted=delete("./"."cscope.files")
        endif
        if(csfilesdeleted!=0)
            echohl WarningMsg | echo "Fail to do cscope! I cannot delete the cscope.files" | echohl None
            return
        endif
    endif
    if filereadable("cscope.out")
        if(g:iswindows==1)
            let csoutdeleted=delete(dir."\\"."cscope.out")
        else
            let csoutdeleted=delete("./"."cscope.out")
        endif
        if(csoutdeleted!=0)
            echohl WarningMsg | echo "Fail to do cscope! I cannot delete the cscope.out" | echohl None
            return
        endif
    endif
    if(executable('ctags'))
        "silent! execute "!ctags -R --c-types=+p --fields=+S *"
        silent! execute "!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q ."
    endif
    if(executable('cscope') && has("cscope") )
        if(g:iswindows!=1)
            silent! execute "!find . -name '*.h' -o -name '*.c' -o -name '*.cpp' -o -name '*.java' -o -name '*.cs' > cscope.files"
        else
            silent! execute "!dir /s/b *.c,*.cpp,*.h,*.java,*.cs >> cscope.files"
        endif
        silent! execute "!cscope -b"
        execute "normal :"
        if filereadable("cscope.out")
            execute "cs add cscope.out"
        endif
    endif
endfunction

1)taglist.vim

先截个图给大家看下:

taglist

把taglist.vim放在plugin目录下后,在vimrc中添加如下的配置:

1
2
3
4
5
6
7
8
9
10
"进行Tlist的设置
"TlistUpdate可以更新tags
map <F3> :silent! Tlist<CR> "按下F3就可以呼出了
let Tlist_Ctags_Cmd='ctags' "因为我们放在环境变量里,所以可以直接执行
let Tlist_Use_Right_Window=1 "让窗口显示在右边,0的话就是显示在左边
let Tlist_Show_One_File=0 "taglist可以同时展示多个文件的函数列表,如果想只有1个,设置为1
let Tlist_File_Fold_Auto_Close=1 "非当前文件,函数列表折叠隐藏
let Tlist_Exit_OnlyWindow=1 "taglist是最后一个分割窗口时,自动推出vim
let Tlist_Process_File_Always=0 "是否一直处理tags.1:处理;0:不处理。不是一直实时更新tags,因为没有必要
let Tlist_Inc_Winwidth=0

2)已经在上面解释过,所以这里不再做赘述

OK,到这里,我们已经能够成功的显示函数列表和查看函数定义了,阅读代码已经没有问题了,剩下的就是要在写代码过程中用到的插件啦,我们在把VIM打造成一个真正的IDE(3)中继续~

版权所有,转载请注明出处。 http://www.vimer.cn





原创文章,版权所有。转载请注明:转载自Vimer的程序世界 [ http://www.vimer.cn ]

本文链接地址: http://www.vimer.cn/?p=114

155 个评论 在 “把VIM打造成一个真正的IDE(2)”

  1. bingoboy 说:

    博主。。那个环境变量是指PATH吗

    [回复]

    Dante 回复:

    是的哈

    [回复]

    bingoboy 回复:

    谢咯。。我回去试下。。。

    [回复]

  2. vimrc配置小建议 说:

    在1)taglist.vim 那段的vimrc配置代码中,第9行的注释( “是否一直处理tags.1:处理;0:不处理)最好并到上一行行尾;或者在之前的配置代码中加入set paste命令。
    不然vimer们在复制这一段到vimrc时最后两行会被自动注释掉。

    楼主的文章写得很好,非常实用,大赞一个!!!

    [回复]

    Dante 回复:

    感谢提醒,已经修改!

    [回复]

  3. bughou 说:

    一个ctags / cscope问题请教:
    我们的c++代码里有很多类,每个类都有一些同名的方法,比如:Initialize(),Resume()之类的,这样在CTRL+] 对这些方法调用进行跳转的时候 这些类一下子都弹出来了,几十个让我选,有没有什么方法,可以根据方法前面的类名或者对象名,智能识别出是哪个类的方法啊?就像vs那样。这个问题一直困扰着我和身边的同事,望赐教。

    [回复]

    Dante 回复:

    这个问题的确是这样。。目前我也没有找到很好的解决方法。。

    [回复]

  4. ccheng 说:

    博主,你之前也用vim开发过java吗?那你用代码补全吗,我现在一直没在vim里面找到好的java补全插件

    [回复]

    Dante 回复:

    嗯, 很早很早了。。有一个叫 Vim Intellisense 貌似可以做到,当时还测试过。

    [回复]

  5. [...] 另外,tags必须在vim运行的当前目录,才能在vim里面正确跳转,当然也不是没有办法解决:settags=”tags的文件路径”即可,不过如果像我前面文章说的那样定义了F12来快速生成tags的话(快速连接),也不会经常用到更改路径吧,哈哈。 [...]

  6. lemon 说:

    这个都是在linux下的么?我下载的ctags-5.8居然是rpm文件,windows下不会用.请教一下,因为我刚接触vim

    [回复]

    Dante 回复:

    windows下也有ctags的,google一下吧,地址我记不清了。。

    [回复]

    lemon 回复:

    呵呵,谢谢回复~这几天一直在弄,已经都整好了,再次感谢

    [回复]

  7. happypeter 说:

    http://happycasts.net/episodes/1
    一个ctags视频

    [回复]

    Dante 回复:

    看了一下,讲的太浅了,不过对入门的朋友很有帮助。

    [回复]

    happypeter 回复:

    感谢关注,在revised版里我会在丰富一些内容的。

    [回复]

    Dante 回复:

    不客气,加油!欢迎分享!

    [回复]

  8. wayn 说:

    ls好,我问下,有没有哪个补全插件能提示整个tags文件中的function,我现在用的acp阿,neocomplcache阿,都是只能自动提示vim打开的文件中的function阿。求助ing.

    [回复]

    Dante 回复:

    C-X C-O 不行么?

    [回复]

  9. JLQSheenero 说:

    为什么我在.vimrc中加入autocmd BufEnter * lcd %:p:h之后,重启vim,编辑一个文件,用pwd查看当前目录,发现还是启动vim时的目录。但是如果在vim中直接执行autocmd…之后效果是正常的

    [回复]

    Dante 回复:

    加上echo看看是否执行了?

    [回复]

  10. [...] [1] 把VIM打造成一个真正的IDE(1) [2] 把VIM打造成一个真正的IDE(2) [3] 把VIM打造成一个真正的IDE(3). [4] Vim的快速注释插件NerdCommenter 此条目由 [...]

  11. xxx 说:

    请问按不显示C代码函数列表只显示一个窗口,但-vimrc文件可以显示函数列表是怎么回事啊??

    [回复]

    xxx 回复:

    少打了个F3

    [回复]

我要评论

*

*