我正在编写一个插件,标记特定的行,并试图在代码编辑器上为特定行绘制高亮标记。为此,我需要计算特定代码行(即缓冲区中的行)在屏幕上的位置。
Delphi代码编辑器可以通过IOTAEditView的BottomRow和TopRow属性访问屏幕上哪些行是可见的。然而,在较新的IDE版本中,代码区域和方法可以折叠--也就是说,将几行折叠成一行。行高亮显示的第一步是知道哪些行是可见的,它们位于哪里,为此,我可能需要跟踪编辑器的哪些部分折叠,哪些不折叠。似乎有OTAPI方法调用代码折叠(省略),但不知道何时发生。
然而,一些插件,如Castalia,确实管理这一点。怎么做呢?
发布于 2014-12-27 16:27:29
IDE编辑器控件有一个方法,IsLineElided。省略*是IDE的内部术语,用于表示当一行是折叠区域、方法或其他结构的一部分时隐藏的。在UI中,这被称为“折叠”,就像在“代码折叠”中一样,但是内部术语与呈现给用户的UI术语不同是很常见的。
此方法不可公开访问;它是内部TEditControl类的方法。要使用它,需要调用IDE方法。与许多IDE黑客不同,您不需要将其挂钩,因为您不需要改变它的行为--只需调用它即可。
@Editorcontrol@TCustomEditControl@LineIsElided$qqriTLineIsElidedProc = function(Self: TObject; LineNum: Integer): Boolean;例如,
PFLineIsElided := GetProcAddress(CoreIDEHandle, StrIDELineIsElidedName);您可以通过读取加载模块获得核心IDE BPL句柄。第一个参数应该是编辑器窗口--不是ToolsAPI编辑视图,而是内部编辑器。本文展示了编辑器控件与IOTAEditView的关系。
您现在可以问行是否被删除(也就是说,它是否隐藏?)你的插件是这样的:
if PFLineIsElided(FCodeEditor, 123) then ...然而,将这些区域组合起来看哪些区域被折叠--或者更确切地说,由于任何折叠区域的顶部仍在绘制,找到一条或多条线被省略后的线--需要稍微多一点的逻辑。最好的方法是在视图IOTAEditView.TopRow和BottomRow中遍历屏幕上的行。如果你看的后面的线是折叠的,但你看的不是,那么你看的是折叠区域的代表线(在阴沟里有+/-符号的线)。
请注意,如果要在代码编辑器上绘制代码,那么逻辑行号(代码槽中打印的行号)和标称行号(在视图中可见的行)之间的区别对您来说是很重要的,代码省略是控制这一点的因素。当代码折叠时,逻辑行号和标称行号将不匹配:编辑视图总是按照顺序绘制标称行号,但如果中间有折叠区域,则逻辑行号将有空隙。
进一步阅读:--一个大型关于与代码编辑器集成的文章,其中一节讨论代码折叠和处理行号。这是Delphi插件/向导与Parnassus博客上的代码编辑器集成的两个主题之一。虽然它所涵盖的不仅仅是折叠的代码,但是如果您正在编写一个需要处理此类内容的IDE插件,那么就会有很多有用的材料。(免责声明:我的博客。)
*顺便说一句,省略是一个自动反义词:一个词有两个相反的意思(常见的例子是‘cleave’)。射影的一个含义是省略或删除,另一个含义是连接或合并。
https://stackoverflow.com/questions/23121475
复制相似问题