`
isiqi
  • 浏览: 16027468 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Linux编辑器--vim的tag29.1

阅读更多

vim是Linux下一款功能十分强大的编辑器。将vim打造成编程利器,不仅仅需要学习vim的用法,还需要使用一些插件。

首先介绍vim中标签的用法。以下是对vim帮助的29章进行的翻译:

29.1使用tags

tags是定义标识符的地方。例如在c和c++程序中的函数定义。tags的列表在一个tags文件中维护。这个可以被vim用以直接的从任何地方跳转到tag,也就是定义了标识符的地方。

如果要成成所有当前目录下的C文件的tags文件,使用如下命令:

ctags *.c

ctags是一个独立的程序。多数Unix系统已经自动安装了它。如果没有安装,请访问如下地址:

http://ctags.sf.net

现在当你在vim中并且希望到达一个函数定义的时候,你可以使用如下命令进行跳转了:

:tag startlist

这个命令将会发现函数“startlist”,即使该函数在另外一个文件中。这使得查看混乱的C代码变得非常简单。例如,你在查看函数“write_block”,而该函数中调用了“write_line”。但是“write_line”做了什么呢?将光标移动到“write_line”上,并且使用CTRL_J,你就可以跳转到这个函数的定义了。

函数“write_line”调用了“write_char”。你需要查看这个函数做了什么。你将光标位置放到write_char上,然后按下CTRL_J即可跳转到函数的定义。

命令“:tags”可以显示使用的tags的列表。

如果要回去,使用CTRL-T即可跳转到之前的tag。这个命令有一个count参数作为其前缀,可以表明回转的tags数。再一次向前跳转,可以使用:tag到list的最上边。如果要跳转过数个tags,可以使用一个count参数,例如:"3tag"。CTRL-T也可以以一个count为前缀使用。

这些命令允许你使用CTRL-J正向查看调用树,然后使用CTRL-T回退。并且使用":tags"查看你在哪里。

分屏显示

”:tag“命令将会使用包含新函数的文件,替换当前window显示的文件。但是假设你不仅仅想看原来的函数,也想看到新的函数,应该怎么办?你可以分屏显示,在":tag"命令前,使用":split"命令。Vim有一个简单的命令,可以做到这一点:

:stag tagname

这样分屏,并且跳转到光标下的tag,可以使用CTRL-W J。

如果指定一个count,新的window的高度,将会是那样的。

更多的TAGS文件

当你在很多目录下有文件,你可以在每个目录下创建一个tags文件。vim将会仅仅能够跳转到这一个目录下的tags,而不能跳转到其他目录下的tags。

让vim查找更多tags文件,使用set tags命令做到。例如:

:set tags=./tags,./../tags,./*/tags

这将使得vim在上层、本次和所有子层下进行查找。你可以使用完全目录树来进行定义。

整合成一个TAGS文件

vim在不得不在多个目录下搜索tags文件的时候,将会变得较低效。这种情况下,最好做一次产生一个大的tags文件的操作。

ctags -R . 可以对当前目录下,所有目录递归的进行搜索,产生一个tags文件。

一个非常好的事情是,ctags程序能够识别多种文件类型。不仅仅对于C和C++程序,对于Eiffel甚至vim 脚本都是。了解更多请参考ctags帮助文档。

现在你仅仅需要告知vim 你的大的tags文件的目录,就可以了。

多匹配

当一个函数多次被定义的时候(或者一个类中的方法),":tag"将跳转到第一个。如果在当前文件中有匹配,则这个就是第一个。你可以使用如下命令跳转到另外一个匹配tag上:

:tnext

如果匹配很多,你可以选择一个跳转。

:tselect tagname

这样,vim将给你显示一个选择的表。

表中的第一列是匹配号。输入这个号,你就可以跳转到这个匹配上。

在匹配tags中进行转换,你可以使用如下命令:

:tfirst :[count]tprevious :[count]tnext :tlast。count默认是1.

猜测TAG名字

使用tab键可以进行tag名字补足。tab将会先产生第一个匹配,继续tab即可切换到下一个。你也可以使用模糊匹配。例如,

:tag /block ,跳转到有block的tag。

现在,使用tab,vim将会查找所有包含block的匹配,并使用第一个。

在tag名字前的/告诉vim,跟随的是模式匹配。你可以使用模式匹配的方式使用任何命令。例如选择,

:tselect /^write_ 是告诉vim选择以”write_“开始的tag。^表示以其开头,$表示以其结尾。

TAGS的浏览

CTRL-J带你跳转到光标指定tag的定义,你可以将标识符名称作为一个表格的内容。这是个例子。

首先,创建一个标识符列表,这需要ctags。

ctags --c-types=f -f functions *.c

现在开启vim,并不使用file作为参数。在vim中编辑这个文件,以垂直分屏方式。

vim

:vsplit functions

Windows包含所有函数的列表。当然,还有更多你可以忽略的东西。使用:setlocal ts=99可以整理下。在这个Window,定义一个映射:

:nnmoremap <buffer> <CR> 0ye<C-W>w:tag <C-R>"<CR>

将鼠标移到包含你想跳转的函数的哪行,输入回车。vim将会跳转到另外一个window并且跳转到选择的函数。

相关选项

你可以 设置 ‘ignorecase’使得tag名字的大小写被忽略。

tagbsearch选项告知,是否tags文件被排序或者不排序。默认是假定是一个排序的tags文件,这使得匹配更快,但是如果没排序,则没有什么用了。

taglength则可以告知vim在一个tag中忽略的标识符多少。

当你使用SNiFF+程序,你可以使用vim提供给sniff的接口。SNiFF+是一个商业程序。

Cscope是一个免费程序。它不仅仅发现标识符在哪声明,也可以发现在哪被使用。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics