Jedną z rzeczy, za którymi tęsknię za vimem, jest możliwość wpisania polecenia podstawienia, które będzie działać w wielu liniach, na przykład:
:/begin/,/end/s/foo/bar/g
Powyższe polecenie zamienia „foo” na „bar” zaczynając od pierwszego wiersza zawierającego „początek” i kończąc na następnym wierszu po tym, który zawiera „koniec”.
Czy istnieje sposób na zrobienie czegoś podobnego w emacs?
regular-expressions
replace
evil
vim-emulation
Larry Coleman
źródło
źródło
Oto jeden ze sposobów, w jaki wykorzystuje się tylko wbudowane funkcje:
Po punkcie w wierszu, który zawiera pierwsze wystąpienie
begin
, naciśnij C-SPC.Przejdź do następnego wystąpienia
end
:C-s
end
RETWymienić
foo
zbar
:M-%
foo
RETbar
RET !Wykorzystuje to fakt, że
query-replace
będzie działać na aktywnym regionie zamiast na całym buforze, jeśli taki istnieje.Oczywiście możesz również zdefiniować niestandardowe polecenie:
To polecenie będzie zawsze wyszukiwać od początku bufora, więc punkt może znajdować się za
begin
/foo
/end
podczas jego wywoływania.Ustaw dla niego powiązanie klucza za pomocą:
źródło
Ogólnie rzecz biorąc, jest to coś, czego możesz użyć
narrow-to-region
.Przesuń kursor (na przykład przez wyszukiwanie) na początek regionu i naciśnij
C-SPC
, a następnie przejdź na koniec regionu i wpiszM-x narrow-to-region
. Teraz możesz wydawać dowolne polecenia wyszukiwania i zamieniać, a będą one dotyczyć tylko zwężonej części bufora. Po zakończeniu wpisz,M-x widen
aby przywrócić zawartość bufora.źródło
begin
/end
są ogranicznikami w języku programowania, prawdopodobnie możesz użyć,C-M-Space
aby uruchomićmark-sexp
region w jednym poleceniu.C-x n n
(narrow-to-region
) iC-x n w
(widen
).