Вот один из способов сделать это, который использует только встроенную функциональность:
С точкой в строке, которая содержит первое вхождение begin
, нажмите C-SPC.
Перейти к следующему появлению end
:
C-s end
RET
Заменить foo
на bar
:
M-% foo
RET bar
RET !
Это использует тот факт, что query-replace
будет работать с активной областью вместо целого буфера, если таковой имеется.
Конечно, вы также можете определить пользовательскую команду:
(defun replace-from-to (beg end str repl)
(interactive "sBegin: \nsEnd: \nsString: \nsReplacement: ")
(save-excursion
(goto-char (point-min))
(let ((start-pos (search-forward beg))
(end-pos (search-forward end)))
(replace-string str repl nil start-pos end-pos))))
Эта команда всегда будет искать с начала буфера, поэтому точка может быть после begin
/ foo
/, end
когда вы ее вызываете.
Установите для него привязку ключа:
(global-set-key (kbd "C-c r") 'replace-from-to)