Elisp:保存位置,在其前面插入文本,然后返回到同一位置

use*_*179 5 emacs elisp

我目前正在研究一个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中是否有办法确保我会回到正确的位置?

ata*_*lor 9

这是elisp中非常常见的需求,因此,有一种特殊的形式可以自动完成:save-excursion.像这样使用它:

 (save-excursion
   ;; move about and modify the buffer 
   (do-stuff))
 ;; position restored
Run Code Online (Sandbox Code Playgroud)