【问题标题】:Are there Elisp functions that list markers in a given buffer?是否有列出给定缓冲区中标记的 Elisp 函数?
【发布时间】:2016-04-28 22:24:41
【问题描述】:

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

查看the C source,我可以看到buffer_text 结构的缓冲区指向Lisp_marker 结构的单链表,但我找不到任何Elisp 函数来访问它们。还有a related thread from 1999

【问题讨论】:

  • 就像在 1999 年的讨论中一样:“我很确定你不能那样做”,目前。您的用例与我在 1999 年的帖子中提到的不同吗?
  • @Stefan 我想我试图理解 yasn-p。我希望我可以遍历缓冲区区域中的所有标记并查看它们的插入类型。更一般地说,我希望能够“看到”缓冲区某个区域内的所有隐藏对象,而不必知道在适用模式中要查询哪些变量。

标签: elisp emacs24


【解决方案1】:

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

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

因此,您可以在 C 源代码中找到的标记列表包含“真实标记”以及“僵尸标记”,即已变得无法访问并将在下一次 GC 时消除的标记。

将其暴露给 Elisp 意味着其中一些僵尸标记可以“复活”。或许可以在不引入任何技术问题的情况下完成,但这确实意味着这样一个函数的语义会有点难看。

所以我想提供它作为调试帮助可能是可以的(并让函数首先调用 GC,以便去除僵尸),但不清楚它是否非常有用:其中一些标记纯粹是由save-excursion之类的人临时引入的内部事物。

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

【讨论】:

  • 感谢您的扩展。虽然我很欣赏您提出的更好选择的建议,但代码通常不受我的控制(通常理解起来很耗时)。我的愿望是看到一个缓冲区模型,以确保它与其内容之间定义明确的映射。可以通过查看之前/之后的状态来理解作为事件的希望,而不是必须了解多种模式的代码和交互。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多