Czy istnieje sposób użycia zamiany zapytań z trybów wyjściowych grep / ack / ag?

31

Wiem find-grep-dired, zaznaczając odpowiednie pliki, a następnie naciskając, Qaby uruchomić dired-do-query-replace-regexpzaznaczone pliki. Niestety wymaga to zrestartowania grep i zaprzestania używania git-grep, ack lub ag i przełączenia na użycie, find-grepktóre ma inną składnię do wyszukiwania.

Jestem również świadomy multi-occuri occur-edit-mode, ale to wymaga ponownego uruchomienia wyszukiwania przy użyciu komend. Wreszcie ag-diredwydaje się pasować do nazwy pliku, a nie do zawartości pliku.

Moje obecne podejście polega na generowaniu wyjścia grep, a następnie uruchomieniu makra, które rozpoczyna się w buforze grep, odwiedza każde dopasowanie i je zmienia. Wolałbym używać query-replacebezpośrednio nad zestawem znalezionych dopasowań.

Co chciałbym zrobić, to albo szybko zbudować DIRED bufor z istniejącym wyjściem grep tak, że mogę zaznaczyć odpowiednie pliki i nazwać zapytań-regexp na nich, albo przekształcić wyjście grep na listę buforów dla multi-occurtak że można używać occur-edit-modedo edytuj go na miejscu i uruchom query-replacena tym buforze.

Czy ta funkcja istnieje, czy istnieje inny przepływ pracy, który rozwiązuje ten problem?

zdeterminowany
źródło

Odpowiedzi:

28

@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:wyniki ag, niezmodyfikowane

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: wyniki ag, zmodyfikowane przy użyciu wielu kursorów

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: wyniki ag, po zakończeniu edycji

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

Kaushal Modi
źródło
To naprawdę najlepszy sposób na zamianę łańcucha. Zawarty w projekcie, z myślą o wykluczeniu, łatwa do wykonania partia, wciąż będąc w stanie zweryfikować, czy zamieniasz właściwą rzecz.
PascalVKooten
13

Chciałbym albo szybko zbudować bufor dired z istniejącego wyjścia grep [...], albo przekształcić wyjście grep w listę buforów dla [...] wielu wystąpień.

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

  1. Zainstalować wgrep pakiet z Melpa.
  2. (require 'wgrep) w twoim pliku init.
  3. Po przeszukaniu grep naciśnij C-c C-pi edytuj!
  4. Zapisz swoje zmiany za pomocą C-c C-e

Działa nawet z ack i ag.

Malabarba
źródło
2
To właśnie robię (z ag.el). W połączeniu z edycją multikursorów Magnars proste refaktoryzacje są naprawdę łatwe.
Tom Regner
4

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 i tags-query-replacewykonać zapytanie-zamień.

shosti
źródło
Ma to te same problemy, co find-grep-dired. Nie używa istniejącego wyjścia grep. Istnieją podobne problemy z pociskami wielokrotnymi. Wolę rozpocząć zamianę zapytania po przejrzeniu listy dopasowań i nie zmieniać metody wyszukiwania. Jest to jednak alternatywny przepływ pracy.
zredagował
To, co opisujesz, brzmi jak można to łatwo osiągnąć, tworząc bardzo szybkie makro, aby zastąpić tekst i wielokrotnie wywoływać M-g n C-x e(tj. Używać next-errordo przewijania wystąpień).
shosti
1

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 polecenia icicle-compilation-search. Umożliwia to szybkie poruszanie się między dowolnymi wybranymi trafieniami ( greptrafieniami) 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 Soplitutaj .

Drew
źródło
0

Używam tego narzędzia, napisałem xah_find.el

Napisałem to, ponieważ:

  • Czysty elisp. Nie martw się o grep w transmisji Windows lub Unicode między emacsem do systemu operacyjnego. emacs grep problem
  • Jeśli jesteś ciężkim użytkownikiem Unicode, narzędzia uniksowe mają kilka błędów. problem z linux uniq
  • Co tydzień znajduję / wymieniam pliki 5k. Przez lata korzystałem z dired-do-query-replace-regexp. Uważam, że interaktywna natura naprawdę pochłonęła mój czas, ale muszę sprawdzić wyniki zmian. Więc moje rozwiązanie jest teraz uruchamiane wsadowo, ale mam ładny raport, który mogę skanować w ogóle znaleźć / zamienić wyniki, z opcją zapisu do pliku.

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.

Xah Lee
źródło