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 打開這個文件,

定位到 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 文件做了如下修改:
<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 ,找個文件測試:

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章