Emacs 替换匹配后保存偏移丢失光标位置

Emacs 替换匹配后保存偏移丢失光标位置,emacs,elisp,Emacs,Elisp,在中,我使用正则表达式search/replace将一种类型的ruby块转换为另一种类型。但是,在包含block type的函数ruby flip完成后,该点将移动到替换文本的开头,即使该函数有保存偏移 我甚至试着把这一点保存到一个寄存器中,然后在翻转后跳回寄存器。保存的点将重新定位到“我的更改”的开头。在一些google搜索之后,我认为问题在于替换匹配调用在原始点更新缓冲区内容 关于在这种情况下如何保留/恢复点的原始位置,有什么想法吗?替换文本时,删除旧文本,插入新文本。假设缓冲区看起来像这样

在中,我使用正则表达式search/replace将一种类型的ruby块转换为另一种类型。但是,在包含block type的函数ruby flip完成后,该点将移动到替换文本的开头,即使该函数有保存偏移

我甚至试着把这一点保存到一个寄存器中,然后在翻转后跳回寄存器。保存的点将重新定位到“我的更改”的开头。在一些google搜索之后,我认为问题在于替换匹配调用在原始点更新缓冲区内容


关于在这种情况下如何保留/恢复点的原始位置,有什么想法吗?

替换文本时,删除旧文本,插入新文本。假设缓冲区看起来像这样,其中-!-指示点的位置:

abcdefghijklm-!-nopqrstuvwxyz
假设用jlkMnop替换jklmnop。首先,删除jklmnop:

abcdefghi-!-qrstuvwxyz
然后插入jlkMnop:

abcdefghi-!-jklMnopqrstuvwxyz
可以看到,效果就像点被移动一样

保留要点的方法是在替换文本时更加小心。与其替换可能包含点的大块,不如只替换实际发生变化的小部分。在链接到的答案中,不要将do\.\end替换为{\1},而是将do替换为{,将end替换为}

这不一定是丑陋的。可能是这样的,使用第五个subexp参数:


替换文本时,将删除旧文本,并插入新文本。假设缓冲区看起来像这样,其中-!-指示点的位置:

abcdefghijklm-!-nopqrstuvwxyz
假设用jlkMnop替换jklmnop。首先,删除jklmnop:

abcdefghi-!-qrstuvwxyz
然后插入jlkMnop:

abcdefghi-!-jklMnopqrstuvwxyz
可以看到,效果就像点被移动一样

保留要点的方法是在替换文本时更加小心。与其替换可能包含点的大块,不如只替换实际发生变化的小部分。在链接到的答案中,不要将do\.\end替换为{\1},而是将do替换为{,将end替换为}

这不一定是丑陋的。可能是这样的,使用第五个subexp参数:


我也有类似的问题。我的问题似乎是通过在替换之前将点保存到变量p,然后在函数末尾调用goto char p来解决的

我也有类似的问题。我的问题似乎是通过在替换之前将点保存到变量p,然后在函数末尾调用goto char p来解决的

您可以使用复制标记点t,它将保留一个指针,该指针具有以下属性:当在其位置插入内容时,它将移动到新文本之后,而不是停留在新文本之前。

您可以使用复制标记点t,它将保留一个指针,该指针具有以下属性:当在其位置插入内容时,它移动到新文本之后,而不是停留在新文本之前。

我尝试过,但当函数开始变差时放弃了。如果我找不到任何其他解决方案,我可以这样做,或者让光标移动。请参阅修改后的答案以获得一个相当简洁的方法。啊,感谢修改后的信息。我会看看我是否能用它得到一个不那么可怕的函数。我试过了,但当函数开始变得丑陋时,我放弃了。如果我找不到任何其他解决方案,我可以这样做,或者让光标移动。请参阅修改后的答案以获得一个相当简洁的方法。啊,感谢修改后的信息。我会看看我是否能用它得到一个不那么可怕的函数。这是一个合理的方法。唯一的问题是,替换可能会更改光标do->之前的字符数{,这可能需要也可能不需要从p中减去1。结尾应该有类似的逻辑。另一个方向也是如此。处理它的合理方法。唯一的问题是,替换可能会改变光标do->之前的字符数{,这可能需要也可能不需要从p中减去1。结尾应该有类似的逻辑。另一个方向也一样。