Emacs lisp:替换缓冲区内容时保持光标位置

时间:2015-02-25 14:32:59

标签: emacs elisp

我正在尝试修复web-beautify包中的问题。

elisp函数使用外部工具重新格式化缓冲区的内容。 然后执行以下操作,尝试保持光标位置:

(let ((p (point)))
   (save-excursion
     (with-current-buffer (current-buffer)
       (erase-buffer)
       (insert-buffer-substring outputbuf)))
   (goto-char p)
   ...

如果在该点之前添加了任何行,则(goto-char p)会导致缓冲区滚动不正常。

关注this后,我尝试将p替换为(create-marker (point) t);它通常似乎更好地处理缓冲区开头添加的文本;但是在这种情况下,它根本不起作用(大概是因为缓冲区的内容完全被替换了。)

你会怎么攻击这个?

2 个答案:

答案 0 :(得分:2)

我认为这个问题不能得到完全一般的答案。新文本中对应于原始文本中特定位置的位置的概念完全取决于我们人类对文本是什么以及如何修改以及重要和不重要的理解。

因此,您需要查看外部工具所操作的更改类型,并尝试找出一种方法来查找您认为是相应位置的内容。例如。如果工具没有添加/删除线条,那么你可以保留线条位置,相反如果工具只添加/删除线条,那么你可以查看周围点的文本并尝试在新文本中再次找到它

答案 1 :(得分:0)

看起来像replace-buffer应该可以解决问题。

来源:https://emacs.stackexchange.com/a/47889/10669