3

我正在编写一个标记特定行的插件,并将尝试在代码编辑器上为特定行绘制一个突出显示标记。为此,我需要计算特定代码行在屏幕上的位置,即缓冲区中的行。

IOTAEditViewDelphi 代码编辑器可以通过'sBottomRowTopRow属性访问哪些行在屏幕上可见。然而,在较新的 IDE 版本中,代码区域和方法可以折叠——也就是说,多行合并为一行。线条高光绘制的第一步是知道哪些线条可见以及它们的位置,为此我可能需要跟踪编辑器的哪些部分折叠,哪些不折叠。似乎有 OTAPI 方法可以调用代码折叠(省略),但不知道它何时发生。

但是,某些插件(例如 Castalia)确实可以管理此问题。怎么做到呢?

4

1 回答 1

4

IDE 编辑器控件有一个方法,IsLineElided. Elision[*] 是 IDE 的内部术语,表示当它是折叠区域、方法或其他结构的一部分时隐藏的行。在 UI 中,这称为“折叠”,就像在“代码折叠”中一样,但内部术语与呈现给用户的 UI 术语不同是很常见的。

此方法不可公开访问;它是内部 TEditControl 类的方法。要使用它,您需要调用 IDE 方法。与许多 IDE hack 不同,您不需要挂钩它,因为您不需要更改其行为 - 只需调用它即可。

  • 乱七八糟的名字:@Editorcontrol@TCustomEditControl@LineIsElided$qqri
  • 使用方法原型:TLineIsElidedProc = function(Self: TObject; LineNum: Integer): Boolean;
  • 位于 coreide*.bpl 文件中。

例如,

PFLineIsElided := GetProcAddress(CoreIDEHandle, StrIDELineIsElidedName);

您可以通过读取加载的模块来获取核心 IDE BPL 句柄。第一个参数应该是编辑器窗口——不是 ToolsAPI 编辑视图,而是内部编辑器。本文展示了编辑器控件和 IOTAEditView 之间的关系

您现在可以询问是否从您的插件中省略了一行(也就是说,它是否隐藏了?),如下所示:

if PFLineIsElided(FCodeEditor, 123) then ...

但是,将它们放在一起查看哪些区域被折叠 - 或者更确切地说,由于任何折叠区域的顶线仍然被绘制,找到一条或多条线被省略的线 - 需要更多的逻辑。最好的方法是在视图中遍历屏幕上的线条,IOTAEditView.TopRow并且BottomRow. 如果您正在查看的那一行是折叠的,而您正在查看的那一行不是,那么您正在查看的那一行就是折叠区域的代表线(带有 +/ 的线) - 排水沟中的符号。)

请注意,如果您在代码编辑器上绘制,逻辑行号(打印在代码槽中的行号)和标称行号(视图中屏幕上可见的行)之间的差异对您来说很重要,并且代码省略是控制的这个。代码折叠时,逻辑行号和标称行号不匹配:编辑视图总是按顺序绘制标称行号,但如果中间有折叠区域,则逻辑行号会有间隙。

进一步阅读:一篇关于与代码编辑器集成的大型文章,其中一部分讨论了代码折叠和处理行号。它是关于 Delphi 插件/向导与 Parnassus 博客上的代码编辑器集成的两个主题之一。尽管它涵盖的内容远不止折叠代码,但如果您正在编写需要处理此类内容的 IDE 插件,那么那里有很多有用的材料。(免责声明:我的博客。)

[*]顺便说一句,省略是一个自动反义词:一个有两种相反含义的词(常见的例子是“劈开”。)省略的一个含义省略或删除,另一个含义是连接或合并。

于 2014-12-27T16:27:29.837 回答