notepad++ 查找引用(Find Reference)(适用于c c++及各类脚本比如lua、python等)

在程序开发过程中,程序员经常用到的一个功能就是查找引用(Find Reference),Visual Studio里面的对应功能是“查找所有引用”(Find All References)。

    我在使用notepad++写代码的时候一开始一直因为找不到类似的功能而苦恼。只好每次使用“在文件中查找”(Find in files)来找到所有引用。

    但是这样每次查找都需要遍历目标目录的整个文件系统,文件多的话会耗费很长时间。

    notepad++有插件可以实现查找引用的功能。相比于搜索整个文件系统,这种插件只需要执行一次生成关键词索引,后面就只需要在关键词索引里面查找就行了。速度很快,出结果是瞬间的。而且后面即使你修改了文件也不需要重新生成关键词索引数据库,因为在保存该文件的同时就会自动更新关键词索引数据库。

    这个插件就是NppGTags。NppGTags的默认解析器是只针对C, C++, Yacc, Java, PHP4和汇编的源文件的,但是稍微改一下配置就可以支持lua、Python或者其他类型的语言了。

    在NppGTags目录下面(取决于你的notepad++安装目录,我的是C:\Program Files (x86)\Notepad++\plugins\NppGTags)有一个文件gtags.conf有一个文件gtags.conf

    这里面指定了在使用非默认的解析器时对不同的语言用不同的解析器文件(dll)。往上翻发现在使用build-in的解析器的时候指定了不同的语言对应的文件后缀名!于是我猜想这里添加.lua就能支持lua文件的关键词索引数据库创建。如下所示:

   接下来(确保在setting里面切回默认解析器,而不是pygments或ctags。如果没有改过setting那么就肯定是默认解析器,不需要做切换。),然后点击插件->NppGtags->Create Database创建索引数据库,然后选中关键词后就可以查找引用(点击插件->NppGtags->Find Reference)了,结果如下图所示(查找结果在最下面的窗口,这里是查找对”rect“的引用):

 

    配合快捷键使用就很方便了。我一般对Find Reference设置快捷键ctrl+shift+G,选中关键词后按快捷键就能得到查找引用的结果了。从查找结果中双击可以进入源文件对应位置进行查看修改。

    将光标定位在单词上(不需要选中)也能进行该单词的查找引用,如果想要对某个关键字查找引用,但不知道该关键字出现在哪个文件里,只需要将光标定位在任意非单词处(比如空行处,或者一个括号结束的地方等等),再进行查找引用(快捷键或者菜单进入),就会出现查找引用的窗口,这里还会有关键字代码提示功能。

 

    同理,其他语言只需要将对应源文件的后缀名按同样的方法加入gtags.conf就可以使用查找引用了(比如只需要在gtags.conf相应位置加入.py就能支持python文件的查找引用了)。怎么样,还是很酷的吧 :D

 

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    下面是找到如何处理非c c++文件(我这里是尝试lua文件)之前的一些尝试,仅作记录:

    这个插件的官方声明里是这样说的:GTags built-in code parser supports C, C++, Yacc, Java, PHP4 and Assembly. Other languages are supported through Pygments + CTags parser.就是说默认的(内建的)语法解析器只支持C C++ Yacc Java PHP4和汇编语言,而可选的Pygments和CTags parser这两个解析器是可以支持其他语言的。我用notepad++是开发lua脚本的,所以看来只能选择后两种解析器了。可是CTags parser实际上只能用到Find Definitions而Find Reference(查找引用)这个功能没有用。Pygments这个一直不能成功使用,提示"gtags: cannot open shared object 'pygments-parser.dll'.

    发现lua不能被支持挺沮丧的。不过后来试了一下将.lua后缀名改成.c后竟然能用!于是想了一下将整个工程文件下的.lua重命名为.c或.hpp来支持lua的查找引用。我也实际写了个脚本这么做了,可以这样查找所有的引用,但是运行的时候还是需要.lua。如果复制一份并修改复制的.lua为.c或.hpp,则无法在完美支持查找引用的同时进行修改,因为修改了以后需要将相应的修改应用到修改了后缀名的文件上,并且查找引用里面的点击跳转无法跳转到.lua文件,只能跳转到改了后缀名的文件里面,这样无法及时对相应lua文件进行修改。

    最后在查找pygments不能使用(因为网上有人说跳出提示说pygments-parser.dll打不开的原因是指定的路径不对)的过程中发现修改gtags.conf文件可以达到我们想要的目的。:)

    另外一个同类型的插件在plugin manager里面叫“Gtags Search",安装好后叫做"gtagfornplus"。但是经过试用,我发现在当前最新版本(6.7.9.2)的notepad++中无法使用。使用方法参见:http://sourceforge.net/p/gtagfornplus/code/HEAD/tree/

时间: 2024-11-18 11:28:32

notepad++ 查找引用(Find Reference)(适用于c c++及各类脚本比如lua、python等)的相关文章

Java内存管理之软引用(Soft Reference)

软引用(Soft  Reference)的主要特点是具有较强的引用功能.只有当内存不够的时候才回收这类内 存,因此在内存足够的时候,他们通常不被回收.另外,这些引用对象还能保证在Java  抛出 OutOfMemory异常之前,被设置为null.他可以用于实现一些常用资源的缓存,实现Cache的功能,保证最大限 度的使用内存而不引起OutOfMemory异常. 下面是软引用的实现代码: import java.lang.ref.SoftReference; public class softRe

Google C++ Coding Style:右值引用(Rvalue Reference)

右值引用是一个C++11特性,标记为T&&.GSG中定义:只为移动建构函数(Move constructor)和移动赋值操作(Move assignment)使用右值引用.并且不要使用std::Forward(提供的完美转发特性). C++中右值指表达式结束时就不再存的临时对象.在C++11中,右值分为纯右值(即原始字面量,表达式产生的临时变量等),以及一个将亡值(expiring value, 使用<<深入应用C++11>>中的译法,指的是与右值引用相关的表达式,

C++引用(Reference)

引用(Reference)是C++语言相对于C语言的又一个扩充,类似于指针,只是在声明的时候用&取代了*.引用可以看做是被引用对象的一个别名,在声明引用时,必须同时对其进行初始化.引用的声明方法如下: 类型标识符 &引用名 = 被引用对象 [例1]C++引用示例: int a = 10; int &b = a; cout<<a<<" "<<b<<endl; cout<<&a<<&qu

Linux下查找后门程序 CentOS 查后门程序的shell脚本_linux shell

每个进程都会有一个PID,而每一个PID都会在/proc目录下有一个相应的目录,这是linux(当前内核2.6)系统的实现. 一般后门程序,在ps等进程查看工具里找不到,因为这些常用工具甚至系统库在系统被入侵之后基本上已经被动过手脚(网上流传着大量的rootkit.假如是内核级的木马,那么该方法就无效了). 因为修改系统内核相对复杂(假如内核被修改过,或者是内核级的木马,就更难发现了),所以在/proc下,基本上还都可以找到木马的痕迹. 思路: 在/proc中存在的进程ID,在 ps 中查看不到

C++标准之(ravalue reference) 右值引用介绍_C 语言

1.右值引用引入的背景 临时对象的产生和拷贝所带来的效率折损,一直是C++所为人诟病的问题.但是C++标准允许编译器对于临时对象的产生具有完全的自由度,从而发展出了CopyElision.RVO(包括NRVO)等编译器优化技术,它们可以防止某些情况下临时对象产生和拷贝.下面简单地介绍一下CopyElision.RVO,对此不感兴趣的可以直接跳过: (1)CopyElision CopyElision技术是为了防止某些不必要的临时对象产生和拷贝,例如: 复制代码 代码如下: structA{ A(

漫谈C++11利器之右值引用(move语义&amp;Perfect Forwarding)

该文章来自阿里巴巴技术协会(ATA) 作者:空溟  C++11(2011)标准推出已经很长时间了,最接地气的特性就要属"右值引用"了(Rvalue Reference),它实现了move语义和完美转发(Perfect Forwarding),一开始觉得不好理解,所以一直想对其做一个总结.网上也有很多牛人已经做了细致的分析,但基本都是讲原理的多,本文就从Rvalue Reference引入动机入手,举例说明右值引用的使用场景,从而引出move语义和完美转发. 1. 右值引用动机: 从一个

转 MongoDB数据库关系表示和设计:(1)嵌套文档和引用链接

使用数据的时候,一个数据项常常和另外的一个或多个数据项产生关系,比如一个"人"对象,有一个名字,可能有多个电话号码,以及多个子女,等等.   在传统的SQL数据库中,关系被分为一个个表(table),在表中,每个数据项以主键(primary key)标识,而一个表的主键又作为另一个表的外键(reference key),在两个表之间引用.当遇上多对多关系的时候,还需要一个额外的关联表(reference table),将多对多关系转化成两个一对多关系.   而在MongoDB中,表示关

C++必知必会(五) 引用是别名而非指针

引用(reference)是一个现有对象的别名.用对象来初始化引用之后,那么对象的名字或引用的名字都可以用于指向(refer to)该对象: int a = 12; int &ra = a; --ra; // a == 11; a = 10; // ra = 10; int *ip = &ra; 人们常常会将引用和指针相混淆,原因大概在于C++编译器通常采用指针的方式实现引用,但引用其实不是指针,其行为和指针并不相同. 在引用和指针之间存在三大区别:其一,不存在空引用(NULL Refer

More Effective C++:通过引用捕获异常

当你写一个catch子句时,必须确定让异常通过何种方式传递到catch子句里.你可以有三个选择:与你给函数传递参数一样,通过指针(by pointer),通过传值(by value)或通过引用(by reference). 我们首先讨论通过指针方式捕获异常(catch by pointer).从throw处传递一个异常到catch子句是一个缓慢的过程,在理论上这种方法的实现对于这个过程来说是效率最高的.因为在传递异常信息时,只有采用通过指针抛出异常的方法才能够做到不拷贝对象,例如: class