@Malabarba wspomniał o użyciu wgreppakietu do edycji wyników grep / ack / ag.
Chciałbym napisać szczegółowe omówienie tego, w jaki sposób korzystam z agpakietu i wgrep-agpakietów, aby uzyskać edycję wyników wyszukiwania za pomocą multiple-cursorspakietu.
Te pakiety są dostępne za pośrednictwem Melpy. Musisz także mieć agaka 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 agznaleziono.
Zainstaluj agw swoim systemie i wyżej wspomnianych pakietach emacs.
agobsługuje wyszukiwanie plików z zawartością pasującą do podanego wyrażenia regularnego. Najprostszym sposobem na wskazanie, aggdzie jest katalog główny projektu, umieścić tam pusty .gitfolder. 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-modelub użyj wgreppowią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-editlub używania domyślnego wiązania C-c C-e. Możesz także użyć tego query-replace-regexpdo zamiany wyszukiwania.
Wolę używać multiple-cursorsdo 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-thisa 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-eaby „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-mapna bind-to-my-mapw moim ~/.emacs.d/.
Kiedy szukam bind-to-modi-mapw moim folderze instalacyjnym emacsa, pojawia się następujący „ag” wynik:
Ten bufor jest tylko do odczytu.
Po M-x wgrep-change-to-wgrep-modezaznaczeniu -modi-mapzaznaczam wszystkie wystąpienia tej selekcji za pomocą, M-x mc/mark-all-like-thisa 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-emożesz zobaczyć zmianę odzwierciedloną w rzeczywistym pliku na tym zrzucie ekranu:

Następnie zapisałbym wszystkie zmodyfikowane pliki za pomocą C-x s !.