在 Vim 中使用 Gtags 进行代码导航

Gtags 是什么?

Gtags 是 GNU Global 软件包中的一个程序,因为 GNU Global 中最常用的一个程序就是 Gtags,因此如果没有特别说明,我就用 Gtags 代指 GNU Global。GNU Global 是 GNU 项目组开发的类似于 Ctags 的代码导航工具,可以为 Vim, Emacs 等添加代码跳转功能。GNU Global 内置的解析器支持 C, C++, Java, PHP, ASM, YACC 六种语言,通过 exuberant-ctags 扩展可以支持 Ctags 支持的所有语言。

关于 Gtags 与 Ctags 等其它相关工具的比较可以戳这里 Comparison-with-Similar-Tools

GNU Global 里面最常用的两个程序是 gtags gtags-cscope。分别用来替代 ctags cscope

Gtags 和 Global 的使用

和 Ctags 一样,要使用 Gtags,也需要对源代码进行索引,生成 tags 文件。

Perl 中的 Typeglob 及 Exporter 工作原理

每个包都有一个符号表

Perl 中每个包,都有一个符号表,存放了当前包中定义的变量和子例程。符号表是一个名字为 %PackageName:: 的散列表。散列表的键是变量名。

在默认的包(不属于任何包)里,该符号表为 %main:: 或者 %::

既然符号表是一个散列表,那么就可以遍历它。

1 while (my ($k, $v) = each %::) {
2     say "$k => %v";
3 }

仅有使用 our 定义的变量才会被记录进符号表里,而使用 my 定义的变量不会被记录,没有使用这两个关键词定义的变量默认为 our 定义的,所以会记录进符号表。

Perl 的包加载机制

Perl 中有两个方法加载包: userequire

1 use warnings;
2 require warnings;

use 和 require 的区别

use 只能加载模块

use warnings; 会在 @INC 目录下寻找文件名为 warnings.pm 的模块,并加载它。

require 可以加载模块和文件

1 # 可以用字符串明确表示文件名
2 require 'strict.pm';
3 
4 # 等价于 require 'warnings.pm';
5 require warnings;
6 
7 # 也可以用来执行文件
8 require 'export.pl';