2016-04-28 45 views
4

我发现buffer-has-markers-at至少会告诉我们标记是否指向某个位置,但不仅仅是它自24.3开始已经被标记为废弃,它还没有提供一种实际获得标记对象的方法。是否有列出给定缓冲区中的标记的Elisp函数?

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

+0

正如在1999年的讨论:“我敢肯定你不能那样做”,目前。你有一个不同于我在1999年提到的那个用例吗? – Stefan

+0

@Stefan我想我想了解yasnippet。我希望我可以迭代缓冲区域中的所有标记,并查看它们的插入类型。更一般地说,我希望能够“看到”缓冲区某个区域内的所有隐藏对象,而不必知道在适用模式中查询哪些变量。 –

回答

0

为了扩展我的评论:确实没有任何功能可以为您提供缓冲区中存在的标记集。

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

因此,您可以在C源程​​序中找到的标记列表包含“真实标记”以及“僵尸标记”,即标记已经变得无法到达并将在下一个GC中消除。

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

所以我想可以把它作为一个调试辅助工具(并且首先调用GC函数来去掉僵尸),但是它并不清楚它会非常有用:其中一些标记是由save-excursion之类的临时引入的纯内部事物。

也许更好的选择是让你的代码使用(0长度)覆盖而不是标记,所以你可以使用overlays-in,所以你可以设置这些覆盖的属性,使得更容易弄清楚每一个这些覆盖是为了。

+0

感谢您的扩展。尽管我感谢您提出更好的选择,但代码通常不受我的控制(通常需要耗费时间才能理解)。我的愿望是看到一个缓冲模型,确保它和它的内容之间有明确的映射。希望成为事件可以通过查看状态之前/之后的状态来理解,而不必理解多种模式之间的代码和交互。 –

相关问题