原鏈接 此文為使用 DeepL 機翻並進行了略微的調整。
在10.4中,我們重新實現了代碼完成和其他功能,這是IDE十年來最重要的變化之一。
什么是 Code Insight
首先是一些背景。如果你對Code Insight很熟悉,請跳過前面……
Code Insight 是我們對編輯器中的一組 IDE 生產力功能的命名。在這篇博文中,這些功能是這樣的:
- 代碼完成:下拉列表框,預測你要輸入的內容。當你在標識符后面輸入一個句號(.),或者按Ctrl+Space鍵時出現。
- 參數完成:顯示一個方法的參數的提示,包括重載方法的多個變體。Ctrl+Shift+空格在方法的括號()內。
- 查找聲明:右鍵單擊標識符,點擊查找聲明,會帶你到該方法、變量、類型等定義的地方。你也可以按住Control鍵,在編輯器中移動鼠標,適用的標識符會變成超鏈接,你可以點擊它來查找它們的聲明,這就是所謂的代碼瀏覽。
- Tooltip Insight:將鼠標懸停在一個變量或類型上,就會顯示出有關它的信息。有時這包括了XMLDoc,被稱為幫助洞察(Help Insight)。(我們需要在doc中明確名稱)。 Error Insight:在你編譯之前顯示你的代碼中的錯誤。這些錯誤也被稱為 “紅色方格線”,很多人喜歡用的術語–你的代碼下面的紅色人字形線。錯誤也會在結構視圖中的 “錯誤 “節點中顯示。
這些功能在Delphi中已經有很多年了。像這樣的功能是你在IDE中編碼時的一個重要好處。尤其是代碼的完成,可以節省大量的打字時間,而錯誤的洞察力可以幫助你在花時間編譯之前,確保你的代碼正常工作。
經典代碼洞察力
隨着語言的發展和時間的流逝,這些功能已經不再像我們所希望的那樣,能發揮出應有的作用。當它被引入的時候,技術是最前沿的,但今天我們可以做一些明確的改進。
我們經常看到關於虛假錯誤的bug報告(即在編輯器或結構視圖中報告的錯誤,而源代碼實際上是完全正確的代碼)。或者是IDE在主線程中工作,所以在工作時不會響應按鍵顯示代碼完成列表。(你只能按Escape取消。)有時候,對於巨大的項目,計算代碼完成的數據可能會占用IDE中大量的內存。此外,這些功能是用多個代碼解析器來實現的:代碼完成和錯誤洞察各自對代碼的理解不同。最后,代碼洞察在調試時被禁用了,所以如果你在調試時寫代碼,就沒有生產力的幫助。
我們不希望這樣的情況繼續下去。我們對10.4的目標是:
- 使Code Insight異步運行,即在另一個線程上或在另一個進程中運行(或兩者兼而有之),這樣,當你輸入代碼時,即使IDE在后台工作,它也能始終響應
- 減少甚至完全消除(你可以看到這一點),從IDE中完成代碼的潛在內存使用量(你可以看到這一點)。
- 確保Error Insight始終給出正確的結果—-也就是說,它應該准確地給出編譯器的錯誤,而正確的代碼應該不會顯示錯誤。
- 幫助我們更接近於在IDE中擁有一個單一的Delphi源代碼解析器,以便在IDE中對Delphi代碼的含義有一個 “單一的真理之源 “或單一的理解。
- 使Delphi的代碼工具化方法現代化,使用現代技術。
- 同時解決一些代碼完成中的BUG
- 至少增加一個代碼完成功能…… 等等!同時增加兩個新的代碼完成功能!這兩個新的代碼完成功能是什么?
所有這些都是在Delphi 10.4中。
興奮了嗎?我們很興奮。這是Delphi IDE十五年來最大、最好的變化之一。
(別擔心–如果你需要的話,經典的代碼洞察力仍然存在,並且有一些新的bug修復,如果你想的話,可以在10.4中打開)。
Delphi 10.4中的代碼洞察技術
在10.4中,上述代碼洞察功能是通過 “LSP服務器 “來實現的。你可能聽說過這個技術,如果沒有聽說過,LSP指的是語言服務器協議,它是一種為許多語言實現類似代碼洞察功能的標准化方式。一個IDE與 “語言服務器 “對話,它是一個小型的輔助程序,負責計算並生成IDE顯示的信息。它使用一個定義的協議來實現,這就是語言服務器協議。
換句話說,當你做一些事情,比如打開一個項目,或者在文件中鍵入一個按鍵時,IDE現在會和一個輔助程序對話,IDE可以定期向它提出問題,比如。’這個位置的完成結果是什么?”。這個輔助程序會跟蹤你的代碼,並將問題的答案,以及在代碼中遇到的任何錯誤發回。
我們的服務器應用是圍繞着編譯器構建的,將編譯器作為一種服務來提供LSP結果。這意味着IDE顯示給你的,包括 “紅色方塊狀 “錯誤,都是來自於編譯器本身的數據。
這意味着一些事情。
- 與另一個進程的通信是異步的。在IDE中,它是在另一個線程中實現的。你可以繼續打字,甚至關閉你的文件或打開另一個項目,而IDE正在等待它所請求的數據的反饋。
- 工作是在另一個進程中完成的。這意味着所有用於計算結果的內存使用量都不再是IDE本身。IDE有了更多的內存,幫助程序可以使用其全部的內存空間專門用於提供結果
- 它使用一種適用於多種語言的現代標准化協議。 你在屏幕上看到的就是編譯器看到的。這意味着它應該是准確的。如果你的代碼能夠編譯,你就不會看到任何 Error Insight 錯誤;反之,如果你在代碼中或結構視圖中看到紅色的下划線,你的代碼將無法編譯。
- 你可以在調試的同時繼續使用代碼完成功能。
這些都是非常好的東西。
但是文字已經夠多了。讓我們來看看它在實際操作中的樣子吧!
現代 Delphi Code Insight 動作
在博客中很難表現出響應性。在這些靜態的截圖中,只要想象一下,你在打字的時候,永遠看不到Windows的等待光標。
當我們在10.4版本出貨后,想象力將成為現實!
調試時的 Code Insight
第一個新功能是一個大功能,不需要多說什么。你可以在調試的同時使用Code Insight。
想一邊調試你的APP,一邊輸入代碼,並獲得代碼完成度?你可以。
是的,你所看到的是正確的–這就是在你主動調試應用程序的同時,代碼完成和錯誤洞察都在工作。
完整結果
獲取代碼完成的方式和10.3.3中一樣,只是在10.4中IDE仍然是響應式的。但我們增加了另一個新的功能,讓你可以更容易地通過代碼完成找到你想要的東西。在10.4中,代碼完成將比過去顯示更多有用的結果–但同時仍然將10.3.3.3的項目保留在結果列表的最前面。
下面是10.3.3.3的代碼完成,在VCL TButton實例后鍵入 “act”。
請注意,10.3.3.3顯示的結果很少–實際上只有一個。經典的代碼完成,只列出了以你輸入的內容開頭的項目。
下面是10.4的動作(雙關語),同樣的完成方式。
在 10.4 版本中,代碼完成后會列出所有包含你輸入的內容的項目。其他IDE也是這樣做的,例如 Visual Studio,但直到現在 Delphi 還顯示了一個比較有限的列表。這很有用,因為它允許你通過完成度搜索。
例如,假設你記得一個控件有一個something-Rect屬性,但你不記得它叫什么。在10.3.3.3中,你得去搜索。在10.4中,只要輸入’rect’,你就會看到。
你可以通過鍵盤來探索你的代碼。
擁有更多的結果可能並不總是你所追求的,你可能只期待以你輸入的東西開頭的項目。默認情況下,為了保持與你熟悉的10.3.3中的行為接近,我們會對完成列表進行排序,使所有以標識符開頭的項目都放在所有包含標識符的上方。換句話說,這個列表將給出與10.3.3.3相同的結果,但附加了額外的結果。如果你不想使用這些結果,你不需要使用這些結果;它們位於10.3.3.3會顯示給你的項目之后。
如果你想像其他IDE一樣,把所有結果一起列出,我們有一個設置:目前是注冊表鍵,但我們可能會把它作為UI顯示出來。這意味着,如果你更習慣於 VSCode 提供的東西,你也可以得到它。
在10.4中,將所有以你輸入的內容開頭的項目一起排序,放在列表的最前面。這是你在10.3.3中看到的,也是10.4中的默認情況。
在10.4中,僅按范圍排序,這樣,所有包含你輸入的內容的項目都會一起顯示。這與Visual Studio或其他IDE比較相似,默認情況下是關閉的。
在完成列表中的選取
代碼完成后會自動為你選擇列表中最好的項目(所以你只需按回車鍵或空格鍵或’.’或類似於’.’或類似於選擇該項目並繼續編碼),順序如下。
- 與你輸入的內容完全匹配。如果沒有匹配,那么就按下面的順序來選擇。
- 在以你輸入的內容開頭的項目中,選擇最短的標識符。如果沒有開頭的項目,那么就用最短的標識符。
- 在包含您輸入的內容的項目中,最短的標識符。
優先選擇從頭開始而不是包含表示完成列表將自動選擇 ‘Parent’ 而不是 ‘SetParent’。選擇最短的匹配意味着它將選擇’Parent’而不是’ParentFont'(你可以在上面的截圖中看到)。一般來說,我們發現這與你最可能輸入的內容相匹配。當然,你可以滾動並按上下箭頭來選擇你想要的任何東西。
Error Insight
請注意,在這些屏幕截圖中,你可以看到實時的錯誤洞察,它會隨着你的輸入而更新。部分鍵入的標識符’pare’是無效的代碼,它被正確地用紅色下划線標示出來(當你從完成列表中選擇一個項目時,下划線會消失)。Error Insight的結果來自於編譯器本身,它准確地反映並報告了編譯器所看到的錯誤。
你不應該在編輯器或結構窗格中看到不正確的錯誤。你在屏幕上看到的是准確的。
多進程架構
下面的內容對於功能來說並不重要,但在技術層面上可能會讓你感興趣。
我提到了LSP服務器作為一個獨立的進程運行,這有很多好處,包括專門的4GB內存地址空間用於代碼洞察。如果你看一下10.4在Windows任務管理器中運行,你會看到多個DelphiLSP進程。第一個控制多個代理,我們有一個代理專門負責提供完成和其他結果,一個代理專門負責提供錯誤洞察。
就我所知,我們是唯一一個使用多進程架構的LSP服務器。
質量
在實施的同時,我們也發現並修復了一些過去影響代碼完成的問題。
下一步
新的代碼完成方式與10.3.3及更早的代碼完成方式不同。我們努力使其盡可能的相似,包括調整諸如將開始項排序在其他項目之上,讓你在第一次使用時就能熟悉它。我們希望在幾分鍾內,你會習慣於它,以至於你永遠不想回到10.3.3.3的版本。但是,我們不想把它表現得一模一樣:你會發現其中的不同之處。
Delphi 10.4 中的新的 Code Insight 解決了很多問題,讓你在使用 IDE 時也能有更愉快和更快的響應速度。更不用說額外的結果了,這可能是非常有用的。我們計划繼續努力,按照上面寫的目標前進。雖然在 10.4 中,我們和我們的beta測試人員都發現它是IDE的一個很好的補充。
此外,我們甚至還增加了兩個新的功能:允許你通過代碼完成探索代碼,以及在調試時使用包括代碼完成和其他 Code Insight 功能在內的Code Insight功能。
我們對這個功能真的很興奮,異步、響應式IDE、現代協議、對其他語言的支持、在調試的同時完成代碼。這是偉大的東西。我們已經迫不及待地等着你拿到10.4,並親自試用。
新的基於 LSP 的 CodeInsight 非常棒,這將會徹底改變產品。
Nick Hodges,他已經使用了一個 Beta 預覽版
如果你有更新訂閱,其中一個好處是可以獲得即將發布的測試版。現在還有時間加入我們的10.4測試版計划!
這是即將發布的RAD Studio的預覽版。可能會有最后一分鍾的bug或更改。在正式發布之前,這里的內容都不是最終版本。