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 获取字符串下标 lua获取函数名_lua 获取字符串下标


找到这两个文件,其中一个是缓存文件,我们主要要修改 Lua.tmLanguage 文件,修改完后,需要删除.cache缓存文件,然后重启 sublime text .(上图的 Lua.tmLanguage 文件是作者已经修改过的,所以大小是 8kb。)



然后,



就用 sublime text 打开这个文件,



lua 获取字符串下标 lua获取函数名_lua 获取字符串下标_02



定位到 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)的。



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



【接下来,修改】



找到了正则表达式,就要做相应的修改。



这里推荐一个在线测试正则表达式的网站:



http://www.regexr.com/



作者就是在这个网站里慢慢测试出来的。



哦对了,sublime text 是用的 python 做脚本,上面的正则表达式也是 python 里的,如果不懂的话,可以去





里学习一下。






有了上面的工具和python正则表达式的基础,作者就对 Lua.tmLanguage 文件做了如下修改:




<dict>


<key>captures</key>


<dict>


<key>1</key>


<dict>


<key>name</key>


<string>keyword.control.lua</string>


</dict>


<key>2</key>


<dict>


<key>name</key>


<string>entity.name.function.scope.lua</string>


</dict>


<key>3</key>


<dict>


<key>name</key>


<string>entity.name.function.lua</string>


</dict>


<key>4</key>


<dict>


<key>name</key>


<string>keyword.control.lua</string>


</dict>


<key>5</key>


<dict>


<key>name</key>


<string>keyword.control.lua</string>


</dict>


<key>6</key>


<dict>


<key>name</key>


<string>entity.name.function.scope.lua</string>


</dict>


<key>7</key>


<dict>


<key>name</key>


<string>entity.name.function.lua</string>


</dict>


<key>8</key>


<dict>


<key>name</key>


<string>punctuation.definition.parameters.begin.lua</string>


</dict>


<key>9</key>


<dict>


<key>name</key>


<string>variable.parameter.function.lua</string>


</dict>


<key>10</key>


<dict>


<key>name</key>


<string>punctuation.definition.parameters.end.lua</string>


</dict>


</dict>


<key>match</key>


<string>\b(local)?\s*([a-zA-Z0-9]*[.])?(\w*)\s*(=)?\s*\b(function)\s?+([a-zA-Z_.:]+[.:])?([a-zA-Z_]\w*)?\s*(\()([^)]*)(\))</string>


<key>name</key>


<string>meta.function.lua</string>


</dict>


注意:原来的那个我们不去替换,我们只是增加了新的在原来的后面。



然后删除 Lua.tmLanguage.cache 文件,重启 sublime text ,找个文件测试:


lua 获取字符串下标 lua获取函数名_Lua_03


【大功告成】



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