我正在编写一个标记特定行的插件,并将尝试在代码编辑器上为特定行绘制高亮标记。为此,我需要计算特定代码行的屏幕位置,即缓冲区中的行。
Delphi代码编辑器可以通过IOTAEditView
的{{1}}和BottomRow
属性访问屏幕上可见的行。但是,在较新的IDE版本中,代码区域和方法可以折叠 - 也就是说,几行折叠为一行。线条高亮绘画的第一步是知道哪些线条可见以及它们位于何处,为此,我可能需要跟踪编辑器的哪些部分折叠,哪些部分不折叠。似乎有OTAPI方法来调用代码折叠(elision)但不知道它何时发生。
然而,一些插件,如Castalia,确实可以解决这个问题。怎么办呢?
答案 0 :(得分:4)
IDE编辑器控件有一个方法IsLineElided
。 Elision [*]是IDE在折叠区域,方法或其他结构的一部分时被隐藏的内部术语。在UI中,这被称为“折叠”,就像在“代码折叠”中一样,但是内部术语对于呈现给用户的UI术语来说是很常见的。
此方法无法公开访问;它是内部TEditControl类的一种方法。要使用它,您需要调用IDE方法。与许多IDE hacks不同,你不需要挂钩它,因为你不需要改变它的行为 - 只需要调用它。
@Editorcontrol@TCustomEditControl@LineIsElided$qqri
TLineIsElidedProc = function(Self: TObject; LineNum: Integer): Boolean;
例如,
PFLineIsElided := GetProcAddress(CoreIDEHandle, StrIDELineIsElidedName);
您可以通过reading loaded modules获取核心IDE BPL句柄。第一个参数应该是编辑器窗口 - 不是ToolsAPI编辑视图,而是内部编辑器。本文将介绍the relationship between the editor control and IOTAEditView。
您现在可以从插件中询问是否省略了一行(即隐藏了吗?):
if PFLineIsElided(FCodeEditor, 123) then ...
然而,将它们放在一起以查看哪些区域被折叠 - 或者更确切地说,由于仍然绘制了任何折叠区域的顶线,找到一条或多条线被省略的线 - 需要更多的逻辑。最好的方法是在视图中IOTAEditView.TopRow
和BottomRow
遍历屏幕上的线条。如果您正在查看的那条线之后的线被折叠,但是您正在查看的那条线不是,那么您正在查看的线是折叠区域的代表线(具有+ /的线) - 阴沟中的符号。)
请注意,如果您在代码编辑器上绘画,逻辑行号(代码装订线中打印的行号)与标称行号(视图中屏幕上可见的行)之间的差异对您来说非常重要,并且代码省略是什么控制了这一点。折叠代码时,逻辑和标称行号不匹配:编辑视图总是按顺序绘制标称行号,但如果中间有折叠区域,则逻辑行号将有间隙。
进一步阅读:大article about integrating with the code editor,其中一节讨论代码折叠和处理行号。这是与Parnassus博客上的代码编辑器集成的Delphi插件/向导主题中的两个。虽然它涵盖的不仅仅是折叠代码,但如果你正在编写一个需要处理这类东西的IDE插件,那里有很多有用的资料。 (免责声明:我的博客。)
[*]顺便说一下, elision 是一个自动反义词:一个具有两个相反含义的词(常见的例子是'cleave'。){{3}的一个含义是遗漏或删除,另一个意思是加入或合并。