Czy istnieje odpowiednik komend zastępczych w stylu sed z vima?

14

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?

Larry Coleman
źródło

Odpowiedzi:

7

evilzapewnia uproszczoną wersję ex, więc prawdopodobnie najlepiej jest założyć, że nie jest to dokładna wpadka. Jednak podany przykład działa natychmiast po wyjęciu z pudełka, pod warunkiem, że punkt znajduje się przed pierwszą linią (tj. beginLinią w twoim przykładzie).

Dan
źródło
W vimie wyszukiwanie rozpocznie się również w punkcie, więc to brzmi jak to, czego szukałem. Dzięki!
Larry Coleman
8

Oto jeden ze sposobów, w jaki wykorzystuje się tylko wbudowane funkcje:

  1. Po punkcie w wierszu, który zawiera pierwsze wystąpienie begin, naciśnij C-SPC.

  2. Przejdź do następnego wystąpienia end:

    C-s end RET

  3. Wymienić fooz bar:

    M-% foo RET bar RET !

Wykorzystuje to fakt, że query-replacebędzie działać na aktywnym regionie zamiast na całym buforze, jeśli taki istnieje.


Oczywiście możesz również zdefiniować niestandardowe polecenie:

(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))))

To polecenie będzie zawsze wyszukiwać od początku bufora, więc punkt może znajdować się za begin/ foo/ endpodczas jego wywoływania.

Ustaw dla niego powiązanie klucza za pomocą:

(global-set-key (kbd "C-c r") 'replace-from-to)
itsjeyd
źródło
5

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 wpisz M-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 widenaby przywrócić zawartość bufora.

Elias Mårtenson
źródło
4
Jeśli begin/ endsą ogranicznikami w języku programowania, prawdopodobnie możesz użyć, C-M-Spaceaby uruchomić mark-sexpregion w jednym poleceniu.
zdiagnozowano
1
Domyślne powiązania: C-x n n( narrow-to-region) i C-x n w( widen).
itsjeyd