轉自:http://blog.csdn.net/wtyqm/article/details/9346863
享受指令碼語言靈活、更新方便、免於編譯的好處,但也不能忍受離開那些方便的IDE特性(跳轉、自動完成)。
搜集整理了一些使用Sublime Text編輯cocos2dx-lua工程的資料,希望能給大家帶來協助。
一、自動完成(auto-completion)
A.輸入過的單詞
本檔案內輸入過的單詞,ST(sublime text)均會給出補全提示。這點甚至比大多數IDE都要強(一般只給出符號提示,對於字串這類純文字不提示)
B.跨檔案函數調用
跨檔案的文本提示,ST需要外掛程式支援。目前使用的一個外掛程式MySignaturePlugin,支援跨檔案的函數補全,提示參數資訊。這個外掛程式只有一個python源檔案,100多行代碼。原本只支援js。我對它進行了一些lua支援的小修改 cocos2dx-lua-tools / mysign.py
C.cocos2dx api,自訂API
指令碼中經常會調用一些匯出的cocos2dx api,或者我們自訂的一些c++擴充API
cocos2d_lua_snippets,這個外掛程式通過cocos2dx的tolua++ pkg檔案,產生了一堆ST snippet(程式碼片段),達到了自動提示API的目的
產生指令碼 我對它也進行了一些修改:a.匯出pkg檔案裡的枚舉定義 b.非static函數,自動補全時,不補全類名
D.ST補全機制簡介
以上的幾種補全方法,充分利用了ST提供的補全擴充機制。ST補全時,會按以下次序考慮補全選項
a.snippet(程式碼片段):指定關鍵字到一大段代碼的映射,每個snippet要儲存為一個單獨的檔案。cocos2d_lua_snippets採用的是這種方式
b.API-injected completions:python外掛程式裡可以註冊回呼函數,返回可能的補全選項,可以有邏輯,更靈活一些。MySignaturePlugin採用的是這種方式
c.completion file:我理解就是用一個檔案儲存體大量簡短的snippet。我寫的cocos2dx枚舉值補全採用的是這種方式
d.buffer:就是ST內建的本檔案單詞補全
E.缺憾
以上的補全方法,都只是簡單的文本級的匹配,無法像IDE對靜態語言那樣,進行文法分析後,根據當前上下文限制補全的內容。似乎動態語言的智能感知,本就比較困難,一個變數的類型,往往是運行時才可以知道,並且是可以變化的。
在一個討論lua編輯器補全的文章裡,我看到一個Glider(一款商業lua IDE)員工的回帖。好像他們採用編輯器內建lua虛擬機器的方式,可以實現更加強大的補全功能。
ST方面,更有潛力,更加強大的重量級外掛程式有:
SublimeCodeIntel 、completion
但是這兩個外掛程式目前都不支援lua,代碼量也比較大,不太便於修改
同樣是動態語言的js,這方面的支援就好得多,除了上面提到的SublimeCodeIntel,就連Visual Studio都提供了對js的智能感知。相比大量應用js的web開發,大量應用lua的遊戲開發只能說是小弟弟了。若不是對精心設計的lua語言有好感,放不下它的coroutine機制,我想在cocos2dx裡直接使用js綁定更加方便呢(幾個zynga的老外全力搞js綁定,導致後起的js綁定在很多方面都已經領先lua綁定了)
二、跳轉
這裡推薦Sublime Text 3的跳轉功能。除了繼承二代的檔案內符號跳轉,三代更是加入了檔案間符號跳轉
感覺ST的符號跳轉,比IDE的功能還要好用,全程鍵盤操作,預覽-返回,誰用誰知道
不過ST3的檔案間跳轉似乎還不支援預覽-返回
求助:
在github上看到好用的倉庫,自己不確定會不會修改,一般會選擇clone操作。但是這樣萬一以後修改了,不像fork那樣,可以pull request,很難貢獻代碼。不管是否修改,直接fork的話,感覺又有些重度了。不知有沒有其它的操作流程。
----------------------------------------------------------------------------------------------------------------------------------
3樓 Meteoric_cry 2013-07-29 18:01發表 [回複] function ABC::aa()
end
輸入ABC有提示"ABC::aa",但是輸入斷行符號後,ABC沒有了,只輸入aa Re: wtyqm 2013-07-29 19:12發表 [回複] 回複Meteoric_cry:你指的是lua裡自己定義的函數,還是cocos2dx的api。如果是後者的話,使用我修改後的外掛程式,效果是static函數補全成類名:函數名的形式,非static函數只補全函數名 2樓 chinesetree2013 2013-07-18 20:15發表 [回複] 找了好久找到樓主這篇文章,很感動,在學習cocos2dx lua部分,找個好用的編輯器找的我好辛苦。
看了樓主的文章後,嘗試了一下,跨檔案調函數這個弄不起來,使用JS來弄也不行。希望樓主大哥說明的詳細點 Re: wtyqm 2013-07-18 21:17發表 [回複] 回複u011446040:跨檔案調用的那個外掛程式,需要把你lua原始碼的目錄拖到ST裡。然後存一下盤,它是每次存檔時,分析開啟目錄下所有檔案裡的函數簽名的。還不行得話,可以view->show console,看看有沒有什麼錯誤發生 Re: chinesetree2013 2013-07-19 09:43發表 [回複] 回複wtyqm:感謝樓主回複。
cocos2d api 的自動補全 時有幾點小疑惑:
1.比如CCDirector 這個關鍵字,必須使用大寫打"CC"才能,打"cc" 則不會彈出補全提示,這種情況正常麼。
2.擷取visiblesize時,API的補全是 CCDirector:getVisibleSize()
這樣運行起來會報錯,正確的應該是CCDirector:sharedDirector():getVisibleSize(),而我輸入“CCDirector_sh”後會補全成CCDirector:sharedDirector() 卻沒辦法繼續做補全。請問樓主使用時也是這種情況麼。
3.cocos2dx的引擎常常更新,如何通過pkg產生snippet ,原理或者方法樓主可以分享一下麼。 Re: wtyqm 2013-07-20 10:09發表 [回複] 回複u011446040:1.cocos2d api補全這個外掛程式,使用的是snippet(程式碼片段)的方式。我實驗了下,在ST裡,程式碼片段是大小寫敏感的。這樣確實不太方便。我修改了下這個外掛程式,採用completion-file的方式,這種方式是大小寫不敏感的。
2.原版的外掛程式,補全的結果總是"類名:函數名"的形式,我修改成static函數才這樣輸出,非static函數只輸出函數名。對於您舉得那個例子,先輸入CCDirector_sh,補全成CCDirector:sharedDirector(),再手動輸入冒號,再輸入一些補全提示符(例如ccdgetvis),就可以繼續補全了。這裡輸入"getvis"也可以,但因為是基於文本的補全,可能會補全到其它類裡的方法,這個不知道有沒有更好的方式。
3.這個外掛程式主要是一個python指令碼build.py,把它與cocos2dx目錄下的tools/tolua++目錄放到一起,然後運行這個指令碼,產生的就是最新版的api了。
我修改這個外掛程式也主要是修改build.py這個指令碼和一些模板,你需要上面那些功能的話,可以到這個地址下載
https://github.com/wtyqm/cocos2dx-lua-tools Re: chinesetree2013 2013-07-21 22:58發表 [回複] 回複wtyqm:樓主好人啊,根據樓主方法,現在跨檔案調用補全函數這個功能可以正常作用了。
關於
1.補全忽略大小寫
2.更加智能的補全cocos2dx api
3.cocos2dx api 引擎更新時獲得最新的api
這3個功能的解決方案是否可以理解成只需要使用樓主修改過後的bulid.py 與 pkg檔案重建一下。然後將所得到的替換
Sublime Text 2/Packages/cocos2d lua api 目錄下的檔案即可。 Re: wtyqm 2013-07-22 05:50發表 [回複] 回複u011446040:是的。從https://github.com/wtyqm/cocos2dx-lua-tools,拷貝build.py、三個template檔案,從cocos2dx裡拷貝最新的pkg檔案,重建,再拷貝到ST目錄裡即可 Re: chinesetree2013 2013-07-22 18:12發表 [回複] 回複wtyqm:樓主給你反饋一個小BUG和建議。
根據樓主提供的方法,在snippets檔案夾裡面會產生
api.sublime-completions和enum.sublime-completions這2個檔案使用這2個進行補全,不過在產生的檔案末尾都多出了一個逗號,這導致補全功能的喪失,起初我手動刪除這2個逗號,後重啟ST,發現還是不行,看了一下,原來又重新運行了bulid.py導致那2個逗號又出現了。後來是去掉這個build.py 才能正常的補全,不過可以補全了還是很給力的。
另一個小問題是我用的是mac 系統內建python版本是2.7.2導致指令碼裡面一些參數無法識別,而升級內建python又很麻煩而且容易引起其他問題。
我的使用方式是:把樓主提供的build.py,template_completions_item.sublime-completions,template_completions.sublime-completions,template.sublime-snippet 放到ST裡面,然後把最新的 tolua++也一起放入ST裡面。然後運行python 指令碼。
總的來說,樓主還是很給力的。十分感謝,就是關於反饋給你的這些小問題,如果樓主有時間也順便最佳化掉吧。這樣使用起來就會好很多。期待樓主的回複。 Re: wtyqm 2013-07-22 22:15發表 [回複] 回複u011446040:您說的逗號,是指api.sublime-completions檔案裡最後一個表項後面的逗號麼。
我這裡類似這個樣子:
{ "trigger": "x", "contents": "x" },
]
}
不過在我的系統上(mac os x , st2\st3),是可以正常補全的。
我的使用方法是,在非st目錄下產生補全檔案,只把補全檔案拷貝到st目錄裡。如果把build.py也拷貝過去的話,很可能導致每次啟動ST都重建一遍補全檔案,不知道有沒有可能引起錯誤。
我的mac系統也是最近才安裝python3.3的,直接從python官網下載安裝包。安裝後2.7.2和3.3可以並存。預設的python命令是2.72版本。終端視窗輸入python3.3則是3.3版本。感覺升級還是很方便的。
您可以按我上面說的方式(補全檔案外部產生,安裝python3.3)試一下,如果還有逗號的問題,歡迎您把您那邊的補全檔案發給我,進一步確定問題 Re: chinesetree2013 2013-07-23 22:43發表 [回複] 回複wtyqm:根據樓主提示安裝了python3.3.2很不錯,不會和系統內建的衝突,2個版本並存。指令碼都很順利的在python3.3下運行起來了。
之前查了一些網上的,不少人說一些系統依賴於內建python,升級後怕引起一些不必要的麻煩。現在看了好像沒這問題哈。
逗號指的是enum.sublime-completions和api.sublime-completions檔案中的最後一行。
像這樣有個逗號 ","
"kCCTextAlignmentRight",
]
}
如果不去除這個逗號貌似是格式錯誤,查閱了ST關於completions的格式上是這樣的。這個地址http://sublimetext.info/docs/en/extensibility/completions.html
我使用的是ST2.不知道為什麼我這裡有逗號不能正常的補全。而樓主的卻可以。我只有手動去掉逗號才能補全成功。
另外我不知道怎麼傳送檔案。。。。 Re: wtyqm 2013-07-28 23:03發表 [回複] 回複u011446040:很抱歉很久才回複。最後一個逗號的問題,雖然不知道確切的原因,但我已經修改了build.py,去掉了這個逗號,歡迎試用。另外實際使用中有什麼問題和改進,也可以隨時交流。
我在實際使用中,感覺API的補全,容錯性太強,會阻礙本檔案內已輸入單詞補全的出現速度,有些不爽。 Re: chinesetree2013 2013-08-02 09:35發表 [回複] 回複wtyqm:嗯 。這幾天也比較慢,剛剛有空。看到樓主回複修複了這個問題。去試試先。
是有些不爽,不過正常開發,這些功能算是足夠了。 1樓 lihei12345 2013-07-18 12:26發表 [回複] [引用] [舉報] 跟樓主一樣,我之前也是fork,結果最後都刪掉了,現在一般都是直接star。
另外,求老大能否將tolua++的原理再講的更細節點,加上程式碼分析之類的。我最近剛接觸cocos2d-x中,也想使用lua,但是由於不掌握原理還有剛接觸遊戲開發,不敢使用,想瞭解一下tolua++的綁定原理再開始使用,又功力不足。。。很糾結,求大哥幫忙寫一下分析過程,跪謝 Re: wtyqm 2013-07-18 21:36發表 [回複] [引用] [舉報] 回複lihei12345:看了下您介紹的star功能,似乎用來關注感興趣的項目不錯。
tolua++綁定原理的話,推薦您閱讀下http://dualface.github.io/blog/2012/08/25/tolua-plus-plus-implement/
其實看明白Programming In Lua裡,關於匯出c函數到lua的章節後,tolua++的綁定原理還是很容易理解的。cocos2dx的lua綁定也比較成熟了,時間緊的話感覺可以先試著用,邊用邊加深理解吧 Re: lihei12345 2013-07-19 00:10發表 [回複] [引用] [舉報] 回複wtyqm:樓主真是好人。以後一定要持續關注您的部落格,加油。