English 中文(简体)
Vim和Ctags的技巧和窍门 [已关闭]
原标题:
  • 时间:2009-02-19 01:37:11
  •  标签:
Locked. This question and its answers are locked because the question is off-topic but has historical significance. It is not currently accepting new answers or interactions.

我刚刚安装了Ctags(用于帮助C++开发),并希望了解您与其配套使用的最喜爱的命令、宏、快捷键和技巧……

分享你的最佳武器。你还推荐哪些Vim插件用于C++在Vim上开发?

编辑 添加到 Ctags 中的其他插件有哪些?

编辑2 你用的gVim版本带有标签吗?这会有影响吗?

编辑3 你如何提升你在大型和小型项目中的编程经验?

最佳回答

Ctrl+] - go to definition
Ctrl+T - Jump back from the definition.
Ctrl+W Ctrl+] - Open the definition in a horizontal split

Add these lines in vimrc
map <C-> :tab split<CR>:exec("tag ".expand("<cword>"))<CR>
map <A-]> :vsp <CR>:exec("tag ".expand("<cword>"))<CR>

Ctrl+ - Open the definition in a new tab
Alt+] - Open the definition in a vertical split

生成标签后,您可以使用以下键将其标记到函数中并退出函数:

Ctrl+Left MouseClick - Go to definition
Ctrl+Right MouseClick - Jump back from definition

问题回答

一行总是写在我的 .vimrc 文件中:

set tags=./tags;/

这将在当前目录中查找“tags”,并向根目录方向工作,直到找到一个。 换句话说,您可以在源树中的任何位置,而不仅仅是在其根目录。

Another useful plugin for C development is cscope Just as Ctags lets you jump to definitions, Cscope jumps to the calling functions.

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

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一样——您必须生成(并定期更新)数据库。我使用以下脚本。

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文件中添加了以下内容:

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

以上所有的以及...

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

taglist.vim:源代码浏览器(支持C/C ++、Java、Perl、Python、Tcl、SQL、PHP等)

我使用ALT+左箭头和ALT+右箭头来弹出/推入标签栈。

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

如果您使用 hjkl 进行移动,您可以将 <M-h><M-l> 进行映射代替。

相同名字的几个定义。

<C-w>g<C-]> 打开定义的拆分窗口,并执行 :tjump,该命令要么跳转到定义,要么如果有多个定义,则呈现出可供选择的定义列表。

我经常使用的命令是C-],它可以跳转到游标下函数的定义处。您可以频繁使用它来跟进更多的调用。之后,C-o将会使您回到上一层,C-i则会再次深入。

我发现 taglist 插件是必不可少的。它在单独的窗口中列出了所有它知道的标签(您打开的文件),并且使得浏览更大的文件非常容易。

我主要用它进行Python开发,但对于C/C++开发也会更好。

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

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

我已经调整了我使用的Vim插件两年时间以支持足够大的C++项目,您可以看看它们。

他们使用ctags和cscope。

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

我将以下内容放入我的.gvimrc文件中,在gvim启动时从任何位置向上搜索标签文件:

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()

然后,我会定期使用类似的脚本在我的源代码树顶部重新生成标签文件:

#!/bin/bash

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

I use vim in macos, and the original ctags doesn t work well, so I download newest and configure make make install it. I install ctgas in /usr/local/bin/ctags(to keep original one)

"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>

我改编了上面的SetTags()搜索函数(应该替换为等效的set tags+=./tags;/),让它适用于cscope。看起来运作良好!

"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()

上面SetCscope()函数的另一个迭代。它将cscope预路径设置为在没有在“cscope.out”所在的目录的情况下获得匹配项:

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




相关问题
热门标签