ctags 寻找方法定义处

ctags这个是vim的一个插件,它可以用来生成一个检索文件,里面保存有一些索引信息。例如,一些类跟方法、变量等的定义位置
当我们对一个路径执行ctags -R的时候,就会自动生成一个ctags,然后我们就可以使用一些快捷键来是实现跳转、搜索等操作了
其中

<C-]>-这个命令可以使我们跳转到光标所在位置变量定义的地方

感觉这个ctags生成索引的时候,应该是对变量定义有一定的语法识别的。
比如,对于下面一段代码

private int a = 35;
a =56;

当我们把光标放到第二行的a上,然后我们进行<C-]>的时候,光标就会跳到第一行
上面的情况是,我们的a定义跟调用的是同一个文件,即使不在同一个文件,上面也是可以跳转的。
例如
我们在test_2.java 中有如下内容

if (aaa == 40) {
    aaa = 40;
}

在test_3.java中有如下内容

private aaa = 67;

然后我们执行ctags -R *.java以后。然后我们把光标放到aaa == 40的aaa上,然后我们进行<C-]>的时候,光标就会跳转到test_3.java的 private aaa = 67;上
上面说的是变量只在一个地方定义,那如果我们变量定义的地方不止一处,又会怎么样呢?
我们还是以上面的例子为例,不过,这次我们添加一个test_4.java。它里面的内容也是 private aaa = 67;这时候我们执行同样的操作,会发现跳转到了test_3.java处了。如果我们这时候再看tags文件就不难理解为什么会这样了。

aaa     test_4.java     /^private int aaa = 67;$/;"     external variable declarations
aaa     test_3.java     /^private int aaa = 67;$/;"     external variable declarations

所以,它应该是从tags中搜索,当第一次搜索到这个变量的时候,就会跳转了。为了验证猜想的是否正确,我特意把上面两行在tags中的位置调换了一下,然后重>复上面的操作,光标就跳转到test_4.java上了。你还可以发现,如果当前缓冲文件中有这个变量定义的话,它的优先级是最高的。
那如果我们不想直接跳转到它默认定义的地方,而是想自己选择,这时候我们就可以使用

g<C-]>

命令了。
既然ctags支持的是索引,搜索结果是一个列表,这个就不仅让我们联想到vim操作结果的常用方式next prev等。具体如下

tselect-调出最后一次C-]搜索结果.如果我们已经有了搜索记录,那么堆栈中会保留记录
tnext-搜索结果下一条
tprev-搜索结果前一条
tfirst-搜索结果第一条
tlast-搜索结果最后一条

当然,这些命令,还是建议配置快捷键的
除了我们把光标放到目的字符串上来调用<C-]>,我们还可以直接使用命令行

:tag {keyword} -等效于<C-]>

:tjump{keyword}-等效于g<C-]>

命令行更有优势的一点是,它还可以支持正则表达式搜索。这时候命令为

:tag /{keyword}

:tjump/{keyword}

时间: 2024-10-14 07:55:12

ctags 寻找方法定义处的相关文章

C# 方法定义,return的使用方法

1.goto语句 lable:标签goto lable;//跳转到标签处 2.常量 const 数据类型 常量名=值;a.声明的同时必须赋值b.不允许重复赋值c.常量名用全大写 3.方法定义方法:访问修饰符 可选修饰符 返回类型 方法名(参数列表){方法体} 访问修饰符:private(私有的)public(公有的)可选修饰符:static(静态的)abstract(抽象的)virtual(虚方法)override(重写)sealed(密封)返回类型:void.数据类型方法名:帕斯卡命名法(每个

004.参数、方法定义

1.goto语句 lable:标签goto lable;//跳转到标签处 2.常量 const 数据类型 常量名=值;a.声明的同时必须赋值b.不允许重复赋值c.常量名用全大写 3.方法定义方法:访问修饰符 可选修饰符 返回类型 方法名(参数列表){方法体} 访问修饰符:private(私有的)public(公有的)可选修饰符:static(静态的)abstract(抽象的)virtual(虚方法)override(重写)sealed(密封)返回类型:void.数据类型方法名:帕斯卡命名法(每个

将 main 方法定义为:public static void main(String[] args)的理由

1.没有public修饰符或者其他修饰符 错误: 在类...中找不到 main 方法, 请将 main 方法定义为: public static void main(String[] args) 否则 JavaFX 应用程序类必须扩展javafx.application.Application 2.没有static 错误: main 方法不是类 ... 中的static, 请将 main 方法定义为: public static void main(String[] args) 3.返回值不是v

(原创)c#学习笔记10--定义类成员05--部分方法定义

10.5  部分方法定义 部分类也可以定义部分方法.部分方法在部分类中定义,但没有方法体,在另一个部分类中包含实现代码.在这两个部分类中,都要使用partial关键字. public partial class MyClass { partial void MyPartialMethod(); } public partial class MyClass { partial void MyPartialMethod() { // Method implementation } } 部分方法也可以

在java中为什么要把main方法定义为一个static方法?

我们知道,在C/C++当中,这个main方法并不是属于某一个类的,它是一个全局的方法,所以当我们执行的时候,c++编译器很容易的就能找到这个main方法,然而当我们执行一个java程序的时候,因为java都是以类作为程序的组织单元,当我们要执行的时候,我们并不知道这个main方法会放到哪个类当中,也不知道是否是要产生类的一个对象,为了解决程序的运行问题,我们将这个main方法定义为static,这样的话,当我们在执行一个java代码的时候,我们在命令提示符中写:java Point(Point为

面向对象(类,实例变量,方法定义,方法重载,构造方法,this,string类)

面向对象 类是由属性和方法组成 类是所有创建对象的模板 实例变量有默认值 实例变量至少在本类范围中有效 实例变量与局部变量冲突时,局部变量优先 类中方法定义类似于函数定义 修饰符 返回值类型 方法名(参数1,参数2) 异常{ 方法体 } 方法重载 参数个数不同 参数类型不同 参数类型相同但是顺序不同 传入参数的不同自动选取相应方法:典型例子system.out.println(整形,字符串等); 构造方法 1.构造方法无返回值 2.不定义的情况下,有默认的空构造方法 3.在对象构造时,被自动调用

错误: 在类 com.zs.container.CollectionData 中找不到主方法, 请将主方法定义为: public static void main(String[] args)

错误: 在类 com.zs.container.CollectionData 中找不到主方法, 请将主方法定义为: public static void main(String[] args) package com.zs.container; import java.util.ArrayList; import com.java.array.generator.CountingGenerator.String; import com.java.array.generator.CountingG

关于“幽灵架构”的补充说明1:协议中的方法定义

承接上一篇博文,上一篇的篇幅有点太长了,我觉得有一些相关的技术点需要说明,所以重新写几篇博文.这个系列的文章将要说明以下几个问题: 1.giveData和getData在各自协议中的位置 2.使用struct代替class的好处 3."幽灵架构"为什么不会产生循环引用 4.协议的应用场景与局限性 5.运用面向协议编程思想改造控制器 让我们来简单回顾下这个架构,如果不明白的可以参考上一篇博文: 核心只有两个协议: //视图使用的协议 protocol ViewType{ func get

Spring Data JPA方法定义规范

Spring Data Jpa方法定义的规则: (1)简单条件查询 简单条件查询:查询某一个实体类或者集合. 按照Spring Data的规范的规定,查询方法以find | read | get开头,涉及查询条件时,条件的属性用条件关键字连接,要注意的是:条件属性以首字母大写. 例如:定义一个Entity实体类: classPeople{ private String firstName; private String lastName; } 以上使用and条件查询时,应这样写:findByLa