程序锅

  • 首页
  • 分类
  • 标签
  • 归档
  • 关于

  • 搜索
基础知识 Etcd LeetCode 计算机体系结构 Kubernetes Containerd Docker 容器 云原生 Serverless 项目开发维护 ELF 深入理解程序 Tmux Vim Linux Kernel Linux numpy matplotlib 机器学习 MQTT 网络基础 Thrift RPC OS 操作系统 Clang 研途 数据结构和算法 Java 编程语言 Golang Python 个人网站搭建 Nginx 计算机通用技术 Git

Vim神器 | vim+ctags+cscope+Taglist+Nerdtree打造成sourceinsight

发表于 2019-07-24 | 分类于 Linux | 0 | 阅读次数 1748

听说vi很强大?是的,最近笔者需要在Linux下编写一些C代码和查看一些C源码,但是默认的vi并不支持函数之间的跳转、查看函数的定义等等,所以笔者就将vi打造成了一个ide(可以勉强称得上吧)。首先我们来看一下搭建完成之后的样子:

再来看一段简单的操作:

那么下面我们通过ctags+cscope+Taglist+Nerdtree将vi/vim打造成一个ide。

0.环境描述

Linux版本:ubuntu 16.04_64 LTS

vi版本:vi/vim v7.4

所用用户:root

1.安装配置ctags

ctags可以实现找到这个函数的定义处,也可以退回到上一步。那么要想使用ctags,首先使用下面的命令安装

$ sudo apt-get install ctags

当然也可以选择源码包方式进行安装,https://sourceforge.net/projects/ctags/files/,解压缩之后,在源代码目录中依次执行下述命令即可

$ ./configure
$ make 
$ make install

安装完成之后,想要使用ctags,那么必须在你想要调试或者查看的代码目录中有tags文件,使用如下语句即可生成tags文件,当用户在当前目录中运行vi时,会自动载入此tags文件。

$ ctags -R --c++-kinds=+p --fields=+iaS --extra=+q

-R表示递归创建,也就包括源代码根目录(当前目录)下的所有子目录;

--c++-kinds=+ps是为c/c+语言添加函数原型信息;

--fields=+iaS是为标签添加继承信息(inheritance),访问控制信息(access)和函数特征(Signature)如参数表或原型等;

--extra=+q是为类成员添加标签;

假如你想让你当前目录文件中的函数名在其他目录中打开vim时也能被定位到的话,那么可以把当前目录的tags文件路径添加到~/.vimrc中,如下所示

set tags+=/root/mit6.828/jos/tags

tags包括以下文件:

  • #define定义的宏
  • 枚举型变量的值
  • 函数的定义、原型和声明
  • 名字空间(namespace)
  • 类型定义(typedefs)
  • 变量(包括定义和声明)
  • 类(class)、结构(struct)、枚举类型(enum)和联合(union)类
  • 结构和联合中成员变量或函数

个人的理解,ctags能定位函数主要是将上述的信息存储到了tags文件中,当我们使用ctags一些命令时,它都会从设置tags路径中查找相应的值,然后跳转过去。下面的cscope同理。

2.安装配置cscope

cscope可以说是ctags的升级版,他可以在代码中实现快速切换到函数的定义处、查找某个函数被使用的情况等等。假如没有安装cscope可以使用下述命令先安装:

$ sudo apt-get install cscope 

同样也可以使用源码包进行安装,https://sourceforge.net/projects/cscope/files/,安装命令同上。接下去就是配置cscope,因为使用cscope查找函数定义等,需要用到cscope.out数据库,通过下面命令即可递归所有源码文件生成.out文件:

$ cscope -Rbkq

当然我们也可以将相关文件汇集到某一个文件(如cscope.files),然后再使用cscope -bkq -i cscope.files生成out文件,如下:

生成.out文件之后,我们需要在当前用户的用户目录中的.vimrc文件中把.out数据库的路径配置进去,假如不配置的话,cscope无法查找.out所在目录文件中的函数等,使用cs add命令添加.out的路径,即在~/.vimrc文件中添加下面这些内容即可

cs add /home/jackie/fragmetation/linux-4.12.1/linux/cscope.out

当然我们也可以在vim打开的文件中,在底线命令模式下输入上述内容,但是底线命令模式的话,重新打开vim之后,要想再次使用该路径下的cscope.out,那么得再次添加。同ctags,假如将当前目录A中的.out文件的路径添加到了~/.vimrc文件中的话,那么在其他地方打开vim,也可以定位目录A中文件的内容了。

.vimrc文件不存在的话,那么自己创建一下;

当前用户的用户目录:比如root用户那么就是在/root目录下

3.安装配置Taglist

Taglist其实是一个vim的插件,能将当前vim打开的文件中函数名、变量名等在一个窗口中列出来,并支持通过列出的函数名实现跳转。将Taglist下载下来的压缩包解压缩,将解压缩出来的doc里面的taglist.txt复制到~/.vim/doc/下面,plugin里面的taglist.vim文件拷贝到~/.vim/plugin目录下。这就相当Taglist这个插件安装完成了。

接下来是使用Taglist,在vim打开的文件中,切换到底线命令模式,输入Tlist即可使用该插件了。当然你想设置快捷键也可以,如下就是将F2设置为打开Taglist的快捷键了:

 " Tlist 的快捷键
 map <F2> :Tlist <CR>

附:Taglist下载地址:https://www.vim.org/scripts/script.php?script_id=273

4.安装配置Nerdtree

Nerdtree其实也是一个vim插件,他是列出当前目录的文件结构。同安装Taglist类似,先下载压缩包,将解压缩的文件拷贝到~/.vim/中即可,但是你会发现下载来的压缩包东西有点多,你可以把压缩包的东西都拷贝到~/.vim/中。

Nerdtree使用方式也跟Taglist一样,在vim打开的文件中,切换到底线命令模式,输入NERDTree ,回车就可以了,当然你也可以设置快捷键方式。考虑到Nerdtree和Taglist共同显示的问题,我们可以将NERDTree设置到vim窗口的右侧(默认为左侧),在~/.vimrc文件中添加如下内容

let NERDTreeWinPos="right"

当你想打开NERDTree窗口的时候,自动显示书签,那么在~/.vimrc文件中添加如下内容

let NERDTreeShowBookmarks=1

当你想在vim启动的时候默认开启NERDTree,那么在~/.vimrc文件中添加如下内容,其中autocmd可以缩写为au

autocmd VimEnter * NERDTree

附:Nerdtree的下载地址:https://www.vim.org/scripts/script.php?script_id=1658

5.上述工具的简单使用

这篇先讲一下上述工具的简单基本的使用,更加详细的工具介绍以后还会推出。

ctags的简单使用

当前目录生成tags文件之后,在当前目录vim一个文件,只有就可以操作了:

:ta x(ta是tag的缩写)跳转到符号x的定义处,如果有多个符号,直接跳转到第一处
:ts x列出符号x的定义
:tj x可以看做上面两个命令的合并,如果只找到一个符号定义,那么直接跳转到符号定义处,如果有多个,则让用户自行选择
:tn/:tp在符号的多个定义之间跳转
Ctrl+]跳转到当前光标下符号的定义处,和ta类似
Ctrl+t退到跳转之前

cscope的简单使用

cscope用的比较多的是在vim底线命令模式中输入如下格式的内容:

:cs find {querytype} {name}

其中内容如下:

querytype含义
0或者s查找这个C符号
1或者g查找这个定义
2或者d查找被这个函数调用的函数(们
3或者c查找调用这个函数的函数(们)
4或者t查找这个字符串
6或者e查找这个egrep匹配模式
7或者f查找这个文件
8或者i查找#include这个文件的文件(们)

比如我想查找main这个函数的定义,那么在底线命令行中输入

cs find g main

附:本文参考

源代码查看工具:vim中ctags的使用(跳转查定义)

利用ctag+cscope+taglist+Nerdtree打造功能等价于sourceinsight的内核代码阅读神器

Vim+ctags+cscope+Nerdtree+Taglist入门

卷死我
dawnguo 微信支付

微信支付

dawnguo 支付宝

支付宝

  • 本文作者: dawnguo
  • 本文链接: /archives/118
  • 版权声明: 本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0 许可协议。转载请注明出处!
# Linux # Vim
人生苦短 | 列表和元组的进阶-列表和元组的性能以及存储方式等
Nginx简单操作 | Nginx配置SSL证书
  • 文章目录
  • 站点概览
dawnguo

dawnguo

215 日志
24 分类
37 标签
RSS
Creative Commons
© 2018 — 2025 程序锅
0%