Одна из вещей, которые я пропускаю в vim - это возможность ввести команду подстановки, которая будет работать в несколько строк, например:
:/begin/,/end/s/foo/bar/g
Приведенная выше команда заменяет «foo» на «bar», начиная с первой строки, содержащей «begin», и заканчивая следующей строкой после той, что содержит «end».
Есть ли способ сделать что-то подобное в Emacs?
regular-expressions
replace
evil
vim-emulation
Ларри Коулман
источник
источник
Вот один из способов сделать это, который использует только встроенную функциональность:
С точкой в строке, которая содержит первое вхождение
begin
, нажмите C-SPC.Перейти к следующему появлению
end
:C-s
end
RETЗаменить
foo
наbar
:M-%
foo
RETbar
RET !Это использует тот факт, что
query-replace
будет работать с активной областью вместо целого буфера, если таковой имеется.Конечно, вы также можете определить пользовательскую команду:
Эта команда всегда будет искать с начала буфера, поэтому точка может быть после
begin
/foo
/,end
когда вы ее вызываете.Установите для него привязку ключа:
источник
В общем, это то, что вы бы использовали
narrow-to-region
.Вы перемещаете курсор (например, с помощью поиска) в начало региона и нажимаете
C-SPC
, затем перемещаетесь в конец региона и вводитеM-x narrow-to-region
. Теперь вы можете выполнять любые команды поиска и замены, которые вы хотите, и они будут применяться только к суженной части буфера. Как только вы закончите, введите,M-x widen
чтобы восстановить содержимое буфера.источник
begin
/end
являются разделителями на языке программирования, вы можете использовать командуC-M-Space
runmark-sexp
для выбора региона в одной команде.C-x n n
(narrow-to-region
) иC-x n w
(widen
).