2016-04-28 48 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

感謝您的擴展。儘管我感謝您提出更好的選擇,但代碼通常不受我的控制(通常需要耗費時間才能理解)。我的願望是看到一個緩衝模型,確保它和它的內容之間有明確的映射。希望成爲事件可以通過查看狀態之前/之後的狀態來理解,而不必理解多種模式之間的代碼和交互。 –

相關問題