Vim和Ctags提示和技巧

我刚刚在我的Vim(或者更确切地说是gVim)中安装了Ctags(以帮助c++开发),并希望找到您最喜欢的命令,宏,快捷方式,提示……

分享你最好的武器库。对于Vim开发中的c++,您还推荐哪些Vim附加组件?

你还会用什么附加组件来配合Ctags?

你使用标签的gVim的哪个版本?有区别吗?

你如何提高你的编程经验,无论是大项目还是小项目?

304985 次浏览

我使用ALT-left和ALT-right从标签堆栈中弹出/推送。

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

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

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

我使用最多的命令是C-],它跳转到光标下的函数定义。你可以更经常地使用它来跟踪更多的电话。在那之后,C-o会带你回到一级,C-i会继续深入。

Ctrl+ -去定义
Ctrl+T -从定义中跳回 Ctrl+W Ctrl+ -以水平分割的方式打开定义

在vimrc
中添加这些行 map <C-\> :tab split<CR>:exec("tag ".expand("<cword>"))<CR> < br > map <A-]> :vsp <CR>:exec("tag ".expand("<cword>"))<CR> < / p >

Ctrl+ -在新选项卡中打开定义
Alt+ -以垂直分割的方式打开定义

标签生成完成后。您可以使用以下键标记进入和标记出函数:

Ctrl+Left MouseClick -转到definition
Ctrl+Right MouseClick -从定义返回

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

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

C语言开发中另一个有用的插件是cscope 就像Ctags让你跳转到定义一样,Cscope跳转到调用函数

如果您的~/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文件和头文件列表的脚本。这样我只索引项目实际使用的文件。

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

我主要在Python开发中使用它,但它只适合C/ c++。

我已经调整我的vim插件两年了,以支持足够大的c++项目。你可以看一下。

他们使用ctags和cscsopx。

< p > http://www.vim.org/scripts/script.php?script_id=1638 < br > http://www.vim.org/scripts/script.php?script_id=2507 < / p >

以上所有的……

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

标记列表。vim:源代码浏览器(支持C/ c++, java, perl, python, tcl, sql, php等)

在我的。vimrc中总是有一行:

set tags=./tags;/

这将在当前目录中查找“标签”,并沿着树的根向上查找,直到找到一个。IOW,你可以在源树的任何位置而不仅仅是根结点。

我在我的.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 -

同一名称的多个定义

<C-w>g<C-]>打开定义,但也要执行:tjump,它要么进入定义,要么(如果有多个定义)为你提供一个定义列表供你选择。

我在macos中使用vim,原始的ctags不太好,所以我下载了最新的并配置make make安装它。 我在/usr/local/bin/ctags中安装ctgas(以保留原来的一个)

"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. conf”所在的目录。”是:

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