vim + ctags + cscope

代码插件管理工具:

(24条消息) Ubuntu 搭建强大的 IDE —— Vim + Vundle + 插件(上)_ubuntu安装vundle_阿基米东的博客-CSDN博客

(26条消息) Ubuntu 搭建强大的 IDE —— Vim + Vundle + 插件(下)_ubuntu vundle_阿基米东的博客-CSDN博客

常用插件:

(转)Vim十大必备插件 - shanql - 博客园 (cnblogs.com)

如何在vim中快捷地使用ctags以及cscope

我们知道在每个账户的根目录下可以用 .vimrc 文件进行对vim的配置,同时不影响其他账户使用vim。同样的在 .vimrc 中可以进行对 ctags 以及 cscope 的配置,让使用方式的第2步在vim开启时刻就完成。
此外还可以运用 nmap 映射一个快捷键,在 vim 中运行 shell 命令以完成关键词文件的生成,也就是上述第1步。


1 快捷生成tags以及cscope.out

vim .vimrc

首先再用户根目录下进入 .vimrc文件。在其中添加以下语句。

"Generate tags and cscope.out from FileList.txt (c, cpp, h, hpp)
nmap <C-@> :!find -name "*.c" -o -name "*.cpp" -o -name "*.h" -o -name "*.hpp" > FileList.txt<CR>
                       \ :!ctags -L -< FileList.txt<CR>
                       \ :!cscope -bkq -i FileList.txt<CR>

将 find,ctags, cscope 命令映射到 ctrl + @ 快捷键上。

find具体实现的是查找当前目录以及子目录下所有 .h, .hpp, .c, .cpp文件,将找到的文件名放到 FileList.txt 文件中。如果你需要 java 文件,或是 hidl 文件,或是 .xml 文件,则将想要的文件后缀添加到 find 命令中即可。

ctags -L 是采用指定文件生成 tags,用这个命令生成 tags 会让它只包含 FileList.txt 文件中所列的文件。以这种方式过滤特定后缀的文件,使得 tags 大大减小。(tags的大小直接影响跳转的效率。有时包含一些编译生成文件.bin ,.so 等会让 tags 变得特别大,在跳转时非常卡顿,会列出许多无效的索引。)

cscope -bkq -i 同理会使用指定文件提供的文件列表生成 cscope.out。

编辑完成退出后,就可以使用 ctrl + @ 快捷生成 tags 以及 cscope.out 了。
 

cd xxxxxxx
vim ./

:qa!

进入工程相关代码目录(非工程根目录,不然你会为整个工程生成插件文件。有的工程非常大,导致生成插件文件会非常卡,并且不根本不需要无关的代码索引,所以你只需要进入你负责的代码目录就行),vim 打开本目录,然后 ctrl + @ 生成插件文件。
生成后输入:qa! 强制退出 vim ,此时插件所需文件就完全准备好了。

2 配置vim开启时加载插件所需文件


再次回到用户根目录,进入 .vimrc 文件。在里面添加如下配置。
 

if has("cscope")
    set csto=0
    set nocsverb
    " add any database in current directory
    if filereadable("cscope.out")
        cs add cscope.out
    endif
    set csverb
    "set cst  这两句会将cscope当作tag,当找不到时会卡住,因此注释掉
    "set cscopetag
endif

nmap zs :cs find s <C-R>=expand("<cword>")<CR><CR>
nmap zg :cs find g <C-R>=expand("<cword>")<CR><CR>
nmap zc :cs find c <C-R>=expand("<cword>")<CR><CR>
nmap zt :cs find t <C-R>=expand("<cword>")<CR><CR>
nmap ze :cs find e <C-R>=expand("<cword>")<CR><CR>
nmap zf :cs find f <C-R>=expand("<cfile>")<CR><CR>
nmap zi :cs find i ^<C-R>=expand("<cfile>")<CR>$<CR>
nmap zd :cs find d <C-R>=expand("<cword>")<CR><CR>

vim 打开时会自动加载当前目录下的 tags 文件,因此 tags 不用配置了。但 cscope.out 需要配置才能在 vim 打开时加载。

如上的配置将在当前目录执行 cs add cscope.out 以完成加载,并将 cscope.out 当作 tags 使用。此外映射了 cs 的快捷建。其中 z + c 和 z + t 两个快捷操作可以实现跳转到定义,以及搜索光标所在字符串出现的所有位置。

最后保存退出,那么所有的快捷配置就完成了。
 

3 快捷使用


每当拿到新的工程代码,进入相关代码目录,利用 vim ./ 打开当前目录, 然后 crtl + @ 生成插件所需文件,最后退出 vim。此步只需进行一次。
在此目录中打开任意代码文件或任意子目录代码文件,
利用 crtl + ] 跳转到定义。
利用 z + c 跳转到调用。
利用 z + t 查找光标所在的字符串出现的所有位置。
利用 crtl + t 跳转回到上次的位置。
至此我们强大的IDE快捷使用方式就介绍完了。需要完善你的 IDE 使其超越 VS,那么你可以多多去了解其他 vim 的插件,诸如 Tlist,Minibuffer,omnifunc等。

4. cscope快捷键.vimrc中配置

快捷鍵設定

1
2
3
4
5
6
7
8
9
noremap <leader>cs :cs find s 
noremap <C-\>s :cs find s <C-R>=expand("<cword>")<CR><CR>
noremap <C-\>g :cs find g <C-R>=expand("<cword>")<CR><CR>
noremap <C-\>c :cs find c <C-R>=expand("<cword>")<CR><CR>
noremap <C-\>d :cs find d <C-R>=expand("<cword>")<CR><CR>
noremap <C-\>t :cs find t <C-R>=expand("<cword>")<CR><CR>
noremap <C-\>e :cs find e <C-R>=expand("<cword>")<CR><CR>
noremap <C-\>f :cs find f <C-R>=expand("<cfile>")<CR><CR>
noremap <C-\>i :cs find i <C-R>=expand("<cfile>")<CR><CR>

這邊將:cs出現的所有指令全部設定快捷鍵。假設有個hello()函數,欲查詢他的定義,只要將游標移動到函數名稱任何一個字元上,按下Ctrl+\再按g,則可跳轉到他的定義,依此類推。使用Ctrl+T可以跳回上一個位置,無論中間指標移動幾次,非常方便。

或者:

  1. nmap<leader>sa:csadd cscope.out<cr>
  2. nmap<leader>ss:cs find s<C-R>=expand("<cword>")<cr><cr>
  3. nmap<leader>sg:cs find g <C-R>=expand("<cword>")<cr><cr>
  4. nmap<leader>sc:cs find c <C-R>=expand("<cword>")<cr><cr>
  5. nmap<leader>st:cs find t <C-R>=expand("<cword>")<cr><cr>
  6. nmap<leader>se:cs find e <C-R>=expand("<cword>")<cr><cr>
  7. nmap<leader>sf:cs find f<C-R>=expand("<cfile>")<cr><cr>
  8. nmap<leader>si:cs find i<C-R>=expand("<cfile>")<cr><cr>
  9. nmap<leader>sd:cs find d <C-R>=expand("<cword>")<cr><cr>

    nmap表示在vim的普通模式下映射,当然相对与编辑模式和可视模式而言的,我们不多说。
     <C-R>=expand("cword")总体是为了得到:光标下的变量或函数。cword 表示:cursor word, 类似的还有:cfile表示光标所在处的文件名。
    <header>这个键在我的vim中对应的是逗号,  所以,上面的意思就 只要光标在我们关心的变量或者函数下,命令行模式敲 ,sc 就相当与执行:cs find c 光标处函数名,注意,只需,sc三个键,不要敲冒号: 其他的键的映射也是类似的。    

    有了这个快捷键,我们使用cscope的效率就提升了,加上 ctrl+] , ctrl+o , ctrl+t  我们看项目代码基本就比较舒服了。

===============================================================

cscope需要包含多个目录时,可以先将目录导入到一个文件中,然后再使用cscope命令

具体参考文档

vim+ctags+cscope+Taglist+Nerdtree打造成sourceinsight - 知乎 (zhihu.com)

ctrlp模糊查找文件插件的使用:

(45条消息) Vim插件推荐--模糊搜索插件ctrlp使用方法_ctrlp vim_tboqi1的博客-CSDN博客

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值