是否有列出给定缓冲区中标记的 Elisp 函数?

Are there Elisp functions that list markers in a given buffer?

我看到 buffer-has-markers-at 至少会告诉是否有标记指向一个位置,但它不仅自 24.3 以来被标记为过时,而且它没有提供一种实际获取标记的方法对象。

正在查看 the C source, I can see that buffer to buffer_text structs point to a singly linked list of Lisp_marker structs, but I can't find any Elisp functions to access them. Also, there's a related thread from 1999

扩展我的评论:确实没有函数可以为您提供缓冲区中存在的标记集。

部分原因是,虽然在实现级别每个缓冲区都包含其标记列表,但在概念级别,标记指向缓冲区而不是相反:如果未引用标记任何数据都将被垃圾收集。

因此,您可以在 C 源代码中找到的标记列表包含 "real markers" 以及 "zombie markers",即变得无法访问并将在下一次 GC 中消除的标记。

将此暴露给 Elisp 意味着其中一些僵尸标记可能是 "resuscitated"。也许可以在不引入任何技术问题的情况下完成,但这确实意味着这样一个功能的语义会有点难看。

所以我想提供这个作为调试辅助工具可能没问题(并让函数首先调用 GC,以便去除僵尸),但不清楚它是否非常有用:一些这些标记纯粹是由 save-excursion.

之类的人临时引入的内部事物

也许更好的选择是让您的代码使用(0 长度)覆盖而不是标记,这样您就可以使用 overlays-in,这样您就可以在这些覆盖上设置属性,从而更容易找出每个叠加层的用途。