我目前正在开发一个elisp函数,它移动到另一个位置,执行一个函数,然后返回到该位置。我唯一的问题是,如果函数插入文本,我保存的位置不再是我想要的位置。例如,假设我有以下字符串:
Hello World
让我们说我在第6位的'W'。让我们说我想在开头插入另一个“Hello”,如下所示:
Hello Hello World
我现在正在这样做,我会在变量中存储6,插入hello,然后返回到位置6.但是,现在第二个问候是在第6位,我回到了错误的位置!
现在我正在做这样的事情:
(setq my-retloc (point))
(move-function)
然后在move-function的结尾处:
(do-stuff)
(goto-char my-retloc)
不幸的是,在最后一个钩子中执行此操作并不是真的可以避免。在elisp中是否有办法确保我会回到正确的位置?
答案 0 :(得分:9)
这是elisp中非常常见的需求,因此,有一种特殊形式可以自动执行:save-excursion
。像这样使用它:
(save-excursion
;; move about and modify the buffer
(do-stuff))
;; position restored
答案 1 :(得分:1)
如果您不能像@ataylor建议的那样使用save-excursion
,请执行以下操作。 (如果返回不是来自原始函数调用的函数,大概你也不能使用unwind-protect
。)
将point
保存在全局变量中。将point
保存为标记,以防当前缓冲区更改或修改缓冲区文本,使保存的整数位置无效。
如果可能,请使用point
包装保存catch
的代码,并在所有情况下恢复原始位置(与unwind-protect
一样)。
完成游览后使用throw
,返回恢复代码(进入标记)。