我好久沒有推薦過一款Emacs外掛了,感覺大部分的Emacs外掛只是設計的非常貼心,但是真的讓我驚訝的Emacs外掛真的很少了。
今天就來推薦一個讓我驚訝的技術:TabNine
網上對 TabNine 的評價:
TabNine是一種基於OpenAI的語言模型(GPT-2)來實現的智慧程式碼補全技術。
它支援23種程式語言、5種編輯器,使用簡單,效果驚豔。
不少使用過的網友說:TabNine是他們用過的最好的程式碼補全工具,這是屬於程式設計師的殺手級應用。
我記得最開始看到TabNine的時候是一個多月前,當時以為只是無腦AI新聞,並沒有太認真去看待它,認為不過是一個噱頭。但是從我短時間的體驗來看,我改變了看法。
我對TabNine的評價
TabNine通過很複雜的技術來學習當前專案的原始碼,
通過研究程式設計師的編碼習慣最終來預測接下來可能會鍵入的單詞或長句。
傳統的程式碼補全主要是基於當前檔案的抽象語法樹來進行上下文語義分析,
現在做的最好的技術就是LSP協議,這些傳統的語法補全技術在補全物件的屬性或者方法的時候很好用。
但是TabNine完全基於一種更為開放的分析方式來實現程式碼補全,
在它分析現有專案的原始碼後,不管是補全模板、方法變數還是程式碼片段,
TabNine會根據它自己的演算法來進行智慧排序, 給出它認為最佳的匹配結果。
打個比方,TabNine在游標處線索不夠的時候,它有點像個精神病人那樣喃喃自語,
但是一旦它預測準確以後,它可以補全非常一長串程式碼,
這段程式碼雖然不是屬性和方法名,但是一旦準確預測,
你可以敲一下Tab鍵就完成當前行的程式碼編寫。
而且這種技術在越大的專案中,程式碼預測補全效果越好。
整體的感覺,就像一個懂你的機器人在幫你找你自己的程式碼思想和程式碼片段,
在必要的時候幫你敲很長很長的程式碼。
說的很玄乎,舉兩個例子:
Elisp程式碼補全
上面是我寫的Emacs外掛aweshell.el,當我敲擊 current-window
的時候,TabNine 的補全建議是:
current-window (selected-window)
current-window (selected-window)
不是一個正常的語法補全結構, 但是當我敲 current-window
這段程式碼的時候,腦袋裡就是希望通過 (selected-window)
方法賦值結果給變數 current-window
TabNine 在這個時候就讓你很爽了,不管他的演算法是怎麼做的,這就是你想要的片段,Tab一下子就補全了。
JavaScript程式碼補全
上面是一段JavaScript的專案程式碼,其中有一段 machineDict[res.data[i].MachineId] = res.data[i].Name
很多時候,我們會通過編寫庫和函式的方式來抽象重複程式碼,但是真實的專案中,對於一些使用一兩次的程式碼片段,往往沒有必要寫函式去過度包裝。
所以當我在另外一個函式中寫下 machineDict[res.data[i].MachineId] = res.data[i]
然後敲擊 . 的時候,TabNine 通過演算法分析出,我很有可能是想寫 res.data[i].Name
, 那也正是我想要的。
注意這個例子中, Name 僅僅只是伺服器返回的JSON結構體的一個屬性值,從傳統的抽象語法樹補全技術看,res.data[i]
僅僅就是臨時變數,除非真實從伺服器請求,否則基於屬性和方法的技術來解析,根本就不知道 res.data[i]
是什麼型別的物件,更不用說程式碼補全了。
而TabNine的技術就是對傳統語法補全技術的一種極好的補充,因為程式設計師每天大部分時間都是在重複自己以前的程式設計思想和程式碼片段,為什麼不讓機器來輔助人從重複的程式碼拷貝中解脫出來呢?
TabNine Emacs補全前端
TabNine的Emacs外掛在 company-tabnine , 裡面有詳細的安裝方法。
最後
從整體上看TabNine就是找各種token來暴力學習,所以效能的表現上比很多LSP伺服器還要好,我在Emacs中使用TabNine補全,非常順滑。
我希望有一天這種技術可以直接感知我的思想,這樣我就不用動手了, 想一想程式碼就自動寫完了,哈哈哈。
manateelazycat.github.io/emacs/201...
禁止 學習某地爬蟲,知乎爬蟲,CSDN 爬蟲。
本文,首發在 learnku 社群。
本作品採用《CC 協議》,轉載必須註明作者和本文連結