Потеря положения курсора с помощью save-excursion после replace-match - PullRequest
1 голос
/ 22 июля 2011

В этом ответе я использую поиск / замену регулярного выражения для преобразования одного типа блока ruby ​​в другой.Однако после выполнения функции ruby-flip-containing-block-type точка перемещается в начало заменяемого текста, хотя вокруг функции save-excursion.

Я даже попытался сохранить точку в регистре.и прыгать обратно к нему после переворота.Сохраненная точка перемещается в начало моих изменений.После некоторых поисков в Google, я думаю, проблема заключается в том, что вызов replace-match обновляет содержимое буфера в исходной точке.

Любые идеи о том, как сохранить / восстановить исходное местоположение точки вэта ситуация?

Ответы [ 3 ]

4 голосов
/ 22 июля 2011

Когда текст заменяется, старый текст удаляется, а новый текст вставляется. Допустим, буфер выглядит так, где -!- указывает положение точки:

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))
1 голос
/ 01 марта 2012

У меня была похожая проблема. Казалось, что моя проблема решена путем сохранения (point) в переменную p перед заменой, а затем вызова (goto-char p) в конце функции.

0 голосов
/ 02 марта 2012

Вы можете использовать (copy-marker (point) t), который будет держать указатель со свойством, что когда что-то вставляется в его положение, оно перемещается в после нового текста, а не остается до новый текст.

...