SubLime Text 列出Lua的函数列表

Sublime text Lua functions

【说些废话】
Sublime text是我个人比较偏好的一款编辑器,它的扩展性非常好,最最重要的是,它能非常方便的实现跳转。这对于脚本开发者来说,至少对于我来说,是最好用的一个功能。
【常用命令】
我个人最常用的命令是:
ctrl + p:跳转到文件。对于自己负责的模块,切换起来非常方便。
ctrl + g:跳转到指定行。主要是根据Lua的traceback里的信息,跳转到响应行里去。
ctrl + r:列出Lua的函数列表。
【但是】
ctrl + r 这个功能只有在你按如下的 pattern 来书写 function 时,才会列出该方法的名字。
-- 1
function A(param1, param2)

-- 或者

function A:B(param2, param2)
之前我在的公司,大部分函数都是向上面那样写的,但现在到新单位了,他们的写法不是这样的,为了风格统一,我也只有舍弃之前的写法。
-- 2
A = function(param1, param2)

-- 或者

A.B = function(param1, param2)
如果你也是按照第二种写法的话,而且你也是使用 sublime text 来开发的话,你就会苦恼的发现,ctrl + r 不能识别通过第二种写法定义的function了。
是啊!!很头疼!!!特别是一个文件七八百行,然后又列不出 function 来,那样找个函数都要拖来拖去!真麻烦!
所以,我就想到了去改 sublime text 的插件。
下面就介绍我是如何修改 sublime text 的插件,使得 ctrl + r 可以列出两种写法的function的。
-------------------------------------------------------------------------------------------------------------------------
【重点来了】
首先,通过 menu --> Preferences  -->  Browse packages...  进入到 sublime text 的 package 文件夹,打开 Lua 的package文件夹。

找到这两个文件,其中一个是缓存文件,我们主要要修改 Lua.tmLanguage 文件,修改完后,需要删除.cache缓存文件,然后重启 sublime text .(上图的 Lua.tmLanguage 文件是作者已经修改过的,所以大小是 8kb。)
然后,
就用 sublime text 打开这个文件,
SubLime Text 列出Lua的函数列表_第1张图片
定位到 meta.function.lua 这里,接下来是重点中的重点
key-string,看起来很熟悉的样子,我们不用去管。
我们需要关注的是

match
\b(function)\s+([a-zA-Z_.:]+[.:])?([a-zA-Z_]\w*)\s*(\()([^)]*)(\))

是的, ... 里的内容是个正则表达式,它匹配的就是Lua的function,再仔细看一下,就会注意到,这个正则表达式里用"()"括号捕获的内容正好是6个,刚好对应了上面 captures 后面跟着的数组长度。

以 \b(function)\s+([a-zA-Z_.:]+[.:])?([a-zA-Z_]\w*)\s*(\()([^)]*)(\)) 为例,
我们捕获出来的第一个组是 function,它对应的是 
1
name
keyword.control.lua
哦,这样我们明白了,function是关键字,关键字对应的是 keyword.control.lua 。
第二组:
([a-zA-Z_.:]+[.:])?   对应   entity.name.function.scope.lua     -->  scope 是范围的意思。
第三组:
([a-zA-Z_]\w*)\s*  对应   entity.name.function.lua      --> 这里的内容就是 function 的名字,
第四组 - 第六组 是参数的开始和参数的结束。
看懂了上面这个,再来结合例子:
function A.B(param1, param2)
end

其匹配的 pattern 如下:
\b(function)\s+([a-zA-Z_.:]+[.:])?([a-zA-Z_]\w*)\s*(\()([^)]*)(\))

在这个例子里,
"function "匹配 上面 pattern 里的 "\b(function)\s"
"A." 匹配 pattern 里的 "([a-zA-Z_.:]+[.:])?"
"B"  匹配 pattern 里的 "([a-zA-Z_]\w*)"
参数的暂时不去理会。
按照这个正则表达式, 是没法匹配:
local A.B = function(param1, param2)的。
-------------------------------------------------------------------------------------------------------------------------
【接下来,修改】
找到了正则表达式,就要做相应的修改。
这里推荐一个在线测试正则表达式的网站:
http://www.regexr.com/
作者就是在这个网站里慢慢测试出来的。
哦对了,sublime text 是用的 python 做脚本,上面的正则表达式也是 python 里的,如果不懂的话,可以去
http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html
里学习一下。

有了上面的工具和python正则表达式的基础,作者就对 Lua.tmLanguage 文件做了如下修改:
captures
1
name
keyword.control.lua
2
name
entity.name.function.scope.lua
3
name
entity.name.function.lua
4
name
keyword.control.lua
5
name
keyword.control.lua
6
name
entity.name.function.scope.lua
7
name
entity.name.function.lua
8
name
punctuation.definition.parameters.begin.lua
9
name
variable.parameter.function.lua
10
name
punctuation.definition.parameters.end.lua
match
\b(local)?\s*([a-zA-Z0-9]*[.])?(\w*)\s*(=)?\s*\b(function)\s?+([a-zA-Z_.:]+[.:])?([a-zA-Z_]\w*)?\s*(\()([^)]*)(\))
name
meta.function.lua
注意:原来的那个我们不去替换,我们只是增加了新的在原来的后面。
然后删除 Lua.tmLanguage.cache 文件,重启 sublime text ,找个文件测试:

【大功告成】
-------------------------------------------------------------------------------------------------------------------------

你可能感兴趣的:(Lua,基础)