LINUX.ORG.RU

Как сохранить выделение текста после replace-string/regexp?

 ,


0

2

После replace-string/regexp, выделение текста пропадает, а я хочу например последовательно сделать несколько замен, как этого добиться?

Я попробывал написать функцию но она не работает:
1) Замена происходит только если point меньше mark(начали выделять регион и пошли вверх)
2) текст после замены не выделяется
Хотя если протыкать функции последовательно через M-x, все работает

(defun my-replace-string ()
  (interactive)
  (when (use-region-p)
    (setq from-string (read-string "from-string: ")
          to-string (read-string "to-string: "))
    (narrow-to-region (point) (mark))
    (replace-regexp from-string to-string)
    (mark-whole-buffer)
    (widen))
  )

Где я накосячил и может быть есть другие способы добиться нужного поведения?

есть другие способы добиться нужного поведения?

ЯННП. А почему просто руками не включить narrow-to-region, сделать свои дела и снять сужение?

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

А какая разница буду я в режиме сужения или нет, если после первой замены регион сбросится и придется опять выделять либо перескакивать в начало буфера, чтобы сделать вторую замену?

Apanzer
() автор топика

Возможно я не так понял, но хочется, чтобы после замены остался регион?

Документация по `replace-regexp` говорит:

This function is for interactive use only; in Lisp code use `re-search-forward' and `replace-match' instead.

Мне кажется у `interactive` могут быть параметры для региона. И еще я смотрю на `save-excursion` (и, как оказалось, его поменяли и теперь для сохранения марка нужен `save-mark-and-excursion`).

AlexKiriukha ★★★★
()
Ответ на: комментарий от AlexKiriukha

Да, я хочу чтобы после замены регион остался.

Я пытался заменить 'replace-regexp' на цикл с 're-search-forward' и 'replace-match', но ничего не изменилось=)

И 'save-excursion' я как понимаю мне не подходит, ведь после замены в тексте, значения point или mark могут измениться из-за увеличения или уменьшения текста?

Apanzer
() автор топика
Ответ на: комментарий от Apanzer

после первой замены регион сбросится и придется опять выделять

Зачем?

перескакивать в начало буфера, чтобы сделать вторую замену?

Да, и в чём проблема? Прям так сильно ломает нажать M-<-% вместо M-% ?

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

Ну не очень удобно=)
Ломает не только нажимать на лишнюю кнопку, но еще и запускать/закрывать narrow
Не ну просто нельзя чтоли такое реализовать, в чем ошибка в моей функции?

Apanzer
() автор топика
Ответ на: комментарий от Apanzer

Насколько я понял, save-excursion учитывает изменения текста. И ещё есть подозрение, что регион остаётся, просто его не видно (C-x C-x дважды показывает его снова). Попробовал несколько разных вариантов - что-то ничего не получилось, нужен elisp гуру.

AlexKiriukha ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.