我目前正在研究一个elisp函数,它移动到另一个位置,执行一个函数,然后返回到该位置.我唯一的问题是,如果函数插入文本,我保存的位置不再是我想要的位置.例如,假设我有以下字符串:
Hello World
Run Code Online (Sandbox Code Playgroud)
让我们说我在位置6的'W'.让我们说我想在开头插入另一个"Hello",如下所示:
Hello Hello World
Run Code Online (Sandbox Code Playgroud)
我现在这样做的方式,我会在变量中存储6,插入hello,然后返回到位置6.但是,现在第二个hello在第6位,我回到了错误的位置!
现在我正在做这样的事情:
(setq my-retloc (point))
(move-function)
Run Code Online (Sandbox Code Playgroud)
然后在move-function的最后一个钩子中:
(do-stuff)
(goto-char my-retloc)
Run Code Online (Sandbox Code Playgroud)
不幸的是,在最后一个钩子做这个并不是真的可以避免.在elisp中是否有办法确保我会回到正确的位置?
这是elisp中非常常见的需求,因此,有一种特殊的形式可以自动完成:save-excursion.像这样使用它:
(save-excursion
;; move about and modify the buffer
(do-stuff))
;; position restored
Run Code Online (Sandbox Code Playgroud)