原链接 此文为使用 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或更改。在正式发布之前,这里的内容都不是最终版本。