@Malabarba wspomniał o użyciu wgrep
pakietu do edycji wyników grep / ack / ag.
Chciałbym napisać szczegółowe omówienie tego, w jaki sposób korzystam z ag
pakietu i wgrep-ag
pakietów, aby uzyskać edycję wyników wyszukiwania za pomocą multiple-cursors
pakietu.
Te pakiety są dostępne za pośrednictwem Melpy. Musisz także mieć ag
aka the_silver_searcher zainstalowany w systemie.
Ten przewodnik dotyczy przypadków, w których szukasz sposobu na edycję pojedynczej linii we wszystkich / wybranych lokalizacjach, które ag
znaleziono.
Zainstaluj ag
w swoim systemie i wyżej wspomnianych pakietach emacs.
ag
obsługuje wyszukiwanie plików z zawartością pasującą do podanego wyrażenia regularnego. Najprostszym sposobem na wskazanie, ag
gdzie jest katalog główny projektu, umieścić tam pusty .git
folder. Następnie wykonaj wyszukiwanie za pomocą M-x ag-project-regexp
.
Bufor wyników wyszukiwania ag domyślnie nie jest edytowalny. Aby go edytować, wykonaj M-x wgrep-change-to-wgrep-mode
lub użyj wgrep
powiązania -default C-c C-p
.
Teraz, jeśli chcesz zmienić „abcdef” na „ghijkl” we wszystkich swoich plikach, wyszukaj „abcdef”, a bufor wyników ag wyświetli wszystkie linie zawierające ten ciąg. Następnie możesz edytować ten bufor i ręcznie zmienić te ciągi, a zmiany te zostaną odzwierciedlone w rzeczywistych buforach plików podczas wykonywania M-x wgrep-finish-edit
lub używania domyślnego wiązania C-c C-e
. Możesz także użyć tego query-replace-regexp
do zamiany wyszukiwania.
Wolę używać multiple-cursors
do szybkiego refaktoryzacji, dzięki czemu mogę zobaczyć informacje zwrotne w czasie rzeczywistym o tym, gdzie moje wielokrotne zmiany odbywają się jednocześnie. Podkreśl ciąg, który chcesz zastąpić w buforze wyników ag i wywołaj go, M-x mc/mark-all-like-this
a następnie edytuj w zachwycie, gdy zobaczysz, że rzeczy są edytowane w wielu punktach jednocześnie.
Kiedy będziesz zadowolony z edycji, jak wspomniałem powyżej, rób, C-c C-e
aby „odzwierciedlić” zmiany w rzeczywistych buforach. Bufory nie są jeszcze zapisane.
Aby zapisać wszystkie bufory, zwykle robię to za jednym razem, używając domyślnego C-x s !
wiązania emacs .
Oto przykładowy przypadek użycia ze zrzutami ekranu:
Pokazuje proces zamiany wszystkich instancji bind-to-modi-map
na bind-to-my-map
w moim ~/.emacs.d/
.
Kiedy szukam bind-to-modi-map
w moim folderze instalacyjnym emacsa, pojawia się następujący „ag” wynik:
Ten bufor jest tylko do odczytu.
Po M-x wgrep-change-to-wgrep-mode
zaznaczeniu -modi-map
zaznaczam wszystkie wystąpienia tej selekcji za pomocą, M-x mc/mark-all-like-this
a po edycji tych selekcji do -my-map
, wygląda to tak:
Niebieskie podświetlenie pokazuje, które linie zostaną zmodyfikowane po naciśnięciu C-c C-e
.
Po uderzeniu C-c C-e
możesz zobaczyć zmianę odzwierciedloną w rzeczywistym pliku na tym zrzucie ekranu:
Następnie zapisałbym wszystkie zmodyfikowane pliki za pomocą C-x s !
.
Nie musisz konwertować bufora wyników grep na cokolwiek, istnieje już tryb do edycji danych wyjściowych grep (i oczywiście odzwierciedlający zmiany w plikach).
(require 'wgrep)
w twoim pliku init.C-c C-p
i edytuj!C-c C-e
Działa nawet z ack i ag.
źródło
Ta funkcja istnieje w ramach pocisku (
projectile-replace
). Użyje ag / ack / git grep / grep, jeśli są dostępne (w tej kolejności), aby znaleźć wystąpienia itags-query-replace
wykonać zapytanie-zamień.źródło
M-g n C-x e
(tj. Używaćnext-error
do przewijania wystąpień).Oto inne podejście, wykorzystujące Sople .
W
*grep*
buforze wyjściowym Emacsa naciśnij Cc `(to cytat w Cc), który w trybie Sopla jest związany z buforem*grep*
do poleceniaicicle-compilation-search
. Umożliwia to szybkie poruszanie się między dowolnymi wybranymi trafieniami (grep
trafieniami) w dowolnej kolejności.Wprowadzane przez Ciebie dane w minibuforze dynamicznie filtrują (zawężają) zestaw wyników wyszukiwania, a możesz używać progresywnego uzupełniania do zawężania poprzez sukcesywne dopasowywanie wielu wzorców (np. Podciągów, wyrażeń regularnych).
Poruszając się między trafieniami wyszukiwania, możesz zamienić dowolne z nich na żądanie - albo całe trafienie (linia), albo tylko część pasującą do twojego aktualnego wejścia minibufora.
Zobacz Wyszukiwanie sopli - Kompiluj lub Grep . Wstęp do wyszukiwania Sopli jest tutaj , a informacje o zastępowaniu dopasowań podczas wyszukiwania Sopli są tutaj .
źródło
Używam tego narzędzia, napisałem xah_find.el
Napisałem to, ponieważ:
To użycie elisp jest może 5 do 10 razy wolniejsze niż wywoływanie uniksa grep w emacsie, ale dla mnie działało dobrze.
źródło