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

时间:2014-02-21 22:39:53

标签: emacs elisp

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

2 个答案:

答案 0 :(得分:9)

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

 (save-excursion
   ;; move about and modify the buffer 
   (do-stuff))
 ;; position restored

答案 1 :(得分:1)

如果您不能像@ataylor建议的那样使用save-excursion,请执行以下操作。 (如果返回不是来自原始函数调用的函数,大概你也不能使用unwind-protect。)

  1. point保存在全局变量中。将point保存为标记,以防当前缓冲区更改或修改缓冲区文本,使保存的整数位置无效。

  2. 如果可能,请使用point包装保存catch的代码,并在所有情况下恢复原始位置(与unwind-protect一样)。

    < / LI>
  3. 完成游览后使用throw,返回恢复代码(进入标记)。