我听说PHP开发人员在开发时采用IDE的一个原因是能够单击类或函数名称并跳转到声明。听起来很神奇,这绝对是我想要的东西。
我解决这个问题的一种方法是采用PEAR编码标准来命名我的类。由于它们定义了类名到文件系统的一对一映射(用目录分隔符替换下划线字符(_
)),我通常可以非常快速和轻松地打开类文件,特别是如果我从项目安装的基本目录开始。
然而,今天,我发现了exuberantctags,该库可用于生成索引文件,将语言对象映射到源文件以及源文件中声明它们的行。与其名称相反,它不仅适用于C语言;它目前支持33种不同的编程语言,包括PHP。
我决定今天在ZendFramework核心库上试用它。第一次运行时,它非常有用。然而,它只是映射类,此外,只有那些用单个词“类”定义的类——抽象类和接口完全被排除在外。因此,我查看了文档,看看是否可以改变这种行为。
而且,作为一个Unix程序,我当然可以。首先,您可以使用一个简单的标志向它索引的项目添加功能。此外,您可以使用POSIX正则表达式来优化它搜索的内容。
我编写了以下脚本来创建我的标签索引:
#!/bin/bash cd /path/to/framework/library exec ctags-exuberant -f ~/.vim/mytags/framework \ -h \".php\" -R \ --exclude=\"\.svn\" \ --totals=yes \ --tag-relative=yes \ --PHP-kinds=+cf \ --regex-PHP='/abstract class ([^ ]*)//c/' \ --regex-PHP='/interface ([^ ]*)//c/' \ --regex-PHP='/(public |static |abstract |protected |private )+function ([^ (]*)//f/'
此脚本在文件$HOME/.vim/mytags/framework
中创建标签索引。它通过树递归地扫描PHP文件,排除在.svn
目录中找到的任何文件(我正在使用来自subversion存储库的签出)。索引中的文件路径是相对于标签文件创建的;这很重要,因为如果没有提供,vim无法跳转到该文件,因为它找不到它。--PHP-kinds=+cf
告诉它索引类和函数。接下来,我有三个正则表达式。第一个告诉它匹配以“抽象类”开头的类作为类。第二个告诉它把接口作为类来匹配。最后一点是让以可见性运算符开头的PHP5方法作为函数进行匹配。
索引文件生成后(不到一秒),您在vim中需要做的就是告诉它加载它::settags=~/.vim/mytags/framework
.在这一点上,你可以做各种有趣的事情。将光标放在类名或方法名的任意位置,然后按Ctrl-]
,您将跳转到文件及其声明行;Ctrl-T
然后带你回去。如果将调用更改为Ctrl-W]
,它将拆分当前窗口并在新窗格中打开声明。(如果您熟悉帮助如何与Vim一起工作,这应该看起来很熟悉。)
坚持使用Vim来满足您的PHP编辑需求的另一个原因。:-)