@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 !
.