首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在代码编辑器中跟踪代码折叠?

如何在代码编辑器中跟踪代码折叠?
EN

Stack Overflow用户
提问于 2014-04-16 22:42:39
回答 1查看 440关注 0票数 3

我正在编写一个插件,标记特定的行,并试图在代码编辑器上为特定行绘制高亮标记。为此,我需要计算特定代码行(即缓冲区中的行)在屏幕上的位置。

Delphi代码编辑器可以通过IOTAEditViewBottomRowTopRow属性访问屏幕上哪些行是可见的。然而,在较新的IDE版本中,代码区域和方法可以折叠--也就是说,将几行折叠成一行。行高亮显示的第一步是知道哪些行是可见的,它们位于哪里,为此,我可能需要跟踪编辑器的哪些部分折叠,哪些不折叠。似乎有OTAPI方法调用代码折叠(省略),但不知道何时发生。

然而,一些插件,如Castalia,确实管理这一点。怎么做呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-27 16:27:29

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

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

  • 破损名称:@Editorcontrol@TCustomEditControl@LineIsElided$qqri
  • 与方法原型:TLineIsElidedProc = function(Self: TObject; LineNum: Integer): Boolean;
  • 位于coreide*.bpl文件中。

例如,

代码语言:javascript
复制
PFLineIsElided := GetProcAddress(CoreIDEHandle, StrIDELineIsElidedName);

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

您现在可以问行是否被删除(也就是说,它是否隐藏?)你的插件是这样的:

代码语言:javascript
复制
if PFLineIsElided(FCodeEditor, 123) then ...

然而,将这些区域组合起来看哪些区域被折叠--或者更确切地说,由于任何折叠区域的顶部仍在绘制,找到一条或多条线被省略后的线--需要稍微多一点的逻辑。最好的方法是在视图IOTAEditView.TopRowBottomRow中遍历屏幕上的行。如果你看的后面的线是折叠的,但你看的不是,那么你看的是折叠区域的代表线(在阴沟里有+/-符号的线)。

请注意,如果要在代码编辑器上绘制代码,那么逻辑行号(代码槽中打印的行号)和标称行号(在视图中可见的行)之间的区别对您来说是很重要的,代码省略是控制这一点的因素。当代码折叠时,逻辑行号和标称行号将不匹配:编辑视图总是按照顺序绘制标称行号,但如果中间有折叠区域,则逻辑行号将有空隙。

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

*顺便说一句,省略是一个自动反义词:一个词有两个相反的意思(常见的例子是‘cleave’)。射影的一个含义是省略或删除,另一个含义是连接或合并。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23121475

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档