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 打开这个文件,
定位到 meta.function.lua 这里,接下来是重点中的重点:
key-string,看起来很熟悉的样子,我们不用去管。 我们需要关注的是 <key>match</key> <string>\b(function)\s+([a-zA-Z_.:]+[.:])?([a-zA-Z_]\w*)\s*(\()([^)]*)(\))</string> 是的,<string> ... </string>里的内容是个正则表达式,它匹配的就是Lua的function,再仔细看一下,就会注意到,这个正则表达式里用"()"括号捕获的内容正好是6个,刚好对应了上面 <key>captures</key> 后面跟着的数组长度。 以 \b(function)\s+([a-zA-Z_.:]+[.:])?([a-zA-Z_]\w*)\s*(\()([^)]*)(\)) 为例, 我们捕获出来的第一个组是 function,它对应的是 <key>1</key> <dict> <key>name</key> <string>keyword.control.lua</string> </dict> 哦,这样我们明白了,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)的。 |
-------------------------------------------------------------------------------------------------------------------------
【接下来,修改】
找到了正则表达式,就要做相应的修改。
这里推荐一个在线测试正则表达式的网站:
作者就是在这个网站里慢慢测试出来的。
哦对了,sublime text 是用的 python 做脚本,上面的正则表达式也是 python 里的,如果不懂的话,可以去
里学习一下。
有了上面的工具和python正则表达式的基础,作者就对 Lua.tmLanguage 文件做了如下修改:
|
注意:原来的那个我们不去替换,我们只是增加了新的在原来的后面。
然后删除 Lua.tmLanguage.cache 文件,重启 sublime text ,找个文件测试:
【大功告成】
-------------------------------------------------------------------------------------------------------------------------