Когда текст заменяется, старый текст удаляется, а новый текст вставляется. Допустим, буфер выглядит так, где -!-
указывает положение точки:
abcdefghijklm-!-nopqrstuvwxyz
Предположим, вы заменили jklmnop
на jlkMnop
. Сначала jklmnop
удаляется:
abcdefghi-!-qrstuvwxyz
и затем вставляется jlkMnop
:
abcdefghi-!-jklMnopqrstuvwxyz
Вы можете видеть, что эффект как если бы точка была перемещена.
Способ сохранить точку зрения состоит в том, чтобы быть гораздо более осторожным в отношении замены текста. Вместо замены больших блоков (которые могут содержать точку), заменяйте только те небольшие разделы, которые действительно меняются. В ответе, на который вы ссылаетесь, вместо замены do\(.*\)end
на {\1}
замените do
на {
и end
на }
в отдельных заменах.
Это не должно быть ужасно. Возможно, что-то вроде этого, используя пятый (subexp
) аргумент для replace-match
:
(when (re-search-forward "\\(do\\).*\\(?:\n.*\\)\\(end\\)" nil t)
(replace-match "}" t t nil 2)
(replace-match "{" t t nil 1))