Linux基础(vi,我的最爱)

很多时候我们需要在多个源程序之间实现函数、宏定义、外部变量等的跳转查询,甚至有时候需要到内核或库源代码里窥视他们真面目,这对于windows的各种IDE而言都是基本功能,但是我最爱的vi呢?可不可以提供这个趁手的功能呢?

vi是我的最爱,不仅因为他的高效,还因为他支持插件,今天只讲一款,叫ctag,用来干嘛?当然就是帮我们做代码定义跳转啦。废话少讲,来搞搞:

第一,下载。

vincent@ubuntu:~$ sudo apt-get install ctags

如果不幸系统提示找不到软件包ctags,首先你也许应该update一下你的软件源,还不行的话试试把ctags改成exuberant-ctags。

下载完了你就可以用它来产生我们的标签文件tags 了,tags文件是实现跳转功能的英雄,就是它把我们送到我们想要去的地方的——比如我在我的程序里写了一个库函数printf,在某个时刻我想查看这个库函数本身是怎么实现的?那我只需把光标停在关键词上,再按一下组合键 ( Ctrl + ] )就会立刻帮我跳转到库函数printf的源代码的地方,按一下组合键 ( Ctrl + o ) 就可以跳回来。

当然如果printf是库函数对一个系统调用的封装,你就可以顺着tags 给我们提供的道路跳到内核去查看源代码是怎么写的,当然这期间可能会有不止简单的两层封装定义,但我们一次次跳转就可以深入其里,了解内幕。

第二,准备源码。

事情的开始,你需要库函数的源代码和Linux内核的源代码,我们的目的就是要在需要的时候可以跳转到这些地方的某些文件当中去查看相关的资料信息,有了上面的ctags工具之后,我们就可以在源代码的顶层目录处执行下面这条命令:

vincent@ubuntu:~$ ctags -R

比如我想要我的程序能随时去库函数里查询原型,那我就可以在库函数源代码的顶层目录下执行上面那条命令,假如我的库路径是~/ownloads/glibc-2.9,那代码就如下:

vincent@ubuntu:~$ cd ~/Downloads/glibc-2.9 vincent@ubuntu:~/glibc-2.9$ ctags -R

命令中的选项-R 的意思是:递归地进入当前目录下的所有子目录,把在该目录下的所有文件的关键词(包括函数名、宏、文件名等等关联到一起,并且写入一个tags文件)。当然,你如果想让你的函数可以跳转到内核,那么你应该在内核源代码的顶层目录下执行以上命令。

然后,在/etc/vim/vimrc文件末尾,添加以下信息:

au BufEnter /home/vincent/* setlocal tags+=/home/vincent/glibc-2.9/tags

当然,你要把上面相应的路径换成你自己机器上的具体路径。其中/home/vincent/*的意思是:在该路径下的所有文件(因为用了通配符*)都可以通过tags文件实现跳转(包括其子目录),而这个tags文件,就是由后面这个路径/home/vincent/glibc-2.9/tags指定。也许你会问,那我就干脆写成 /* 就行啦,那么系统中的任何一个文件我都可以跟gilbc-2.9关联,实现跳转,当然你可以这么做,但有时候你也许并不需要这么做。

这就搞定了,你现在就可以斟杯卡布奇诺享受自由跳转的乐趣了,但我们可以加更多的东西,比如把内核源代码也添加进来,必要时我们就跳到内核中去瞧瞧,怎么实现,如法炮制,先在内核源代码顶层目录执行指令ctags -R,然后在/etc/vim/vimrc文件末尾再添加一句话即可,当然添加时要把tags所在的路径替换成内核源代码的路径。例如添加以下信息(注意/home/vincent要换成你自己的系统的家目录路径):

au BufEnter /home/vincent/* setlocal tags+=/home/vincent/Linux-2.6.31/tags

当然你还需要一个非常重要的vim命令ts ,因为你要跳转的关键词可能出现在库函数中,也可能出现在内核源码中,也可能同时都有对此关键字的定义,这时候你就要在vim命令模式下敲入:ts 来罗列出所有出现该声明关键词的地方(显然你应该先把光标停在你想要跳转的关键词上面),然后按相应的序号在进行跳转。罗列的次序跟你在vimrc中写au指令的顺序相关,谁写在上面就先罗列谁。

一不小心又写多了…… 看完的都是真爱! 谢谢你们!

原文发布于微信公众号 - 秘籍酷(mijiku040)

原文发表时间:2019-05-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券