Vim和Ctags提示和技巧

Vim and Ctags tips and tricks

我刚刚安装了Ctags(以帮助C++开发)与我的VIM(或更确切地说GVIM),并想找出你喜欢的命令,宏,快捷方式,提示与它一起去…

分享你最好的武器。对于VIM开发,你会推荐什么其他的VIM插件呢?

编辑与ctags一起使用的其他附加组件?

edit2什么版本的gvim与标签一起使用?有什么区别吗?

edit3如何提高大项目和小项目的编程经验?


ctrl+]-转到定义ctrl+t-从定义跳回来。ctrl+w ctrl+]-在水平拆分中打开定义

在VIMRC中添加这些行map :tab split:exec("tag".expand(""))map :vsp :exec("tag".expand(""))

ctrl+-在新选项卡中打开定义alt+]-以垂直拆分方式打开定义

在生成标签之后。您可以使用以下键标记函数和标记函数:

ctrl+Left MouseClick-转到定义ctrl+Right MouseClick—从定义跳回来


我的.vimrc中总是有一行:

1
set tags=./tags;/

这将在当前目录中查找"tags",并向上搜索树,直到找到根目录为止。看,你可以在你的源代码树中的任何地方,而不仅仅是它的根。


C开发的另一个有用的插件是CScope正如ctags允许您跳到定义,cscope跳到调用函数。

如果您的~/bin/目录中有cscope,请将以下内容添加到.vimrc中,并使用g^]转到调用函数(请参见:help cscope)。

1
2
3
4
5
6
7
8
9
10
11
12
13
if has("cscope")
    set csprg=~/bin/cscope
    set csto=0
    set cst
    set nocsverb
   " add any database in current directory

    if filereadable("cscope.out")
        cs add cscope.out
       " else add database pointed to by environment

    elseif $CSCOPE_DB !=""
        cs add $CSCOPE_DB
    endif
endif

差点忘了…就像ctags一样-您必须生成(并定期更新)数据库。我用下面的脚本

1
2
3
4
select_files > cscope.files
ctags -L cscope.files
ctags -e -L cscope.files
cscope -ub -i cscope.files

其中"select_files"是从makefile中提取c和头文件列表的另一个脚本。这样,我只索引项目实际使用的文件。


您可以将目录添加到CTags查找中。例如,我为qt4构建了一个ctags索引,并在我的.vimrc中有这个索引:

1
set tags+=/usr/local/share/ctags/qt4

以上所有的和…

代码完成:函数参数完成,代码片段等等。

  • http://www.vim.org/scripts/script.php?Script PTId=1764

Vistm:源代码浏览器(支持C/C++,Java,Perl,Python,TCL,SQL,PHP等)

  • http://www.vim.org/scripts/script.php?Script PTId=273


我使用alt-left和alt-right来弹出/推送标签堆栈。

1
2
3
" Alt-right/left to navigate forward/backward in the tags stack
map <M-Left> <C-T>
map <M-Right> <C-]>

如果使用hjkl进行移动,则可以映射


同一名称的几个定义

g在拆分中打开定义,但也执行:tjump操作,该操作要么转到定义,要么(如果有多个定义)向您提供一系列定义供您选择。


我使用最多的命令是C-]跳转到光标下函数的定义。您可以更频繁地使用它来跟踪更多的呼叫。在那之后,C-O会把你带回到一个水平,C-I会再深入一步。


我发现了一个必备的标签列表插件。它在一个单独的窗口中列出它知道的所有标记(您打开的文件),使导航较大的文件变得非常容易。

我主要使用它来进行Python开发,但是它只能对C/C++更好。


我已经调整了我的VIM插件两年来支持足够大的C++项目。你可以看看它们。

他们使用ctags和cssope。

http://www.vim.org/scripts/script.php?Script PTId=1638http://www.vim.org/scripts/script.php?Script PTId=2507


我已经在我的一个实验插件中封装了标签操作。

关于VIM中的C++开发,我已经回答了:我使用我自己的套件和一些其他插件。


我将以下内容放入.gvimrc文件中,该文件在gvim启动时从任意点搜索树中的标记文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function SetTags()
    let curdir = getcwd()

    while !filereadable("tags") && getcwd() !="/"
        cd ..
    endwhile

    if filereadable("tags")
        execute"set tags=" . getcwd() ."/tags"
    endif

    execute"cd" . curdir
endfunction

call SetTags()

然后,我会定期在源代码树顶部重新生成一个标记文件,脚本如下:

1
2
3
#!/bin/bash

find . -regex".*\.\(c\|h\|hpp\|cc\|cpp\)" -print | ctags --totals --recurse --extra="+qf" --fields="+i" -L -


我在MacOS中使用VIM,而原来的CTags不能很好地工作,所以我下载最新的并配置make make安装它。我在/usr/local/bin/ctags中安装ctgas(保留原始版本)

1
2
3
4
5
6
7
8
"taglist
let Tlist_Ctags_Cmd ="/usr/local/bin/ctags"
let Tlist_WinWidth = 50
map <leader>ta :TlistToggle<cr>
map <leader>bta :!/usr/local/bin/ctags -R .<CR>
set tags=tags;/
map <M-j> <C-]>
map <M-k> <C-T>

上面的setcscope()函数的另一个迭代。设置cscope pre-path以获取匹配,而不在目录中,其中"cscope.out"是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function s:FindFile(file)
    let curdir = getcwd()
    let found = curdir
    while !filereadable(a:file) && found !="/"
        cd ..
        let found = getcwd()
    endwhile
    execute"cd" . curdir
    return found
endfunction

if has('cscope')    
    let $CSCOPE_DIR=s:FindFile("cscope.out")
    let $CSCOPE_DB=$CSCOPE_DIR."/cscope.out"
    if filereadable($CSCOPE_DB)
        cscope add $CSCOPE_DB $CSCOPE_DIR
    endif

    command -nargs=0 Cscope !cscope -ub -R &
endif


我修改了上面的settags()搜索函数(应该用等效的set tags+=./tags;/)来为cscope工作。似乎起作用了!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
"cscope file-searching alternative
function SetCscope()
    let curdir = getcwd()

    while !filereadable("cscope.out") && getcwd() !="/"
            cd ..
                endwhile

    if filereadable("cscope.out")
            execute"cs add" . getcwd() ."/cscope.out"
                endif

    execute"cd" . curdir
    endfunction

call SetCscope()