W odpowiedzi na to pytanie próbuje dowiedzieć się, jak zrobić coś takiego, co powinno być łatwe, co szczególnie powstrzymuje mnie przed przyzwyczajeniem się do korzystania z Emacsa i zamiast tego uruchomieniem edytora, który już znam. Korzystam z tego przykładu dość często podczas edycji wielu plików.
W Ultraedit zrobiłbym Alt + s, a następnie p, aby wyświetlić okno dialogowe z opcjami: Znajdź (obejmuje użycie wyrażeń regularnych w wielu wierszach), Zamień na, W plikach / typach, Katalogu, Dopasuj wielkość liter, Dopasuj tylko całe słowo, Lista Zmienione pliki i podkatalogi wyszukiwania. Zwykle najpierw użyję myszy, aby przeciągnąć i zaznaczyć tekst, który chcę zastąpić.
Używając tylko samego Emacsa (w systemie Windows XP), bez wywoływania jakiegokolwiek zewnętrznego narzędzia, jak zamienić wszystkie foo \ nbar na bar \ nbaz w *.c
i *.h
pliki w niektórych folderach i wszystkich folderach pod nim. Może Emacs nie jest najlepszym narzędziem do zrobienia tego, ale jak można to łatwo zrobić za pomocą minimalnego polecenia?
C-x s !
aby zapisać wszystkie pliki jednocześnie.M-,
aby kontynuować wyszukiwanie i zamienić (na przykład po monicie „przywróć plik”, jeśli plik został zmieniony na dysku).M-x find-name-dired RET
M->
), ażfind finished
pojawi się „ ”, aby upewnić się, że wszystkie zostały załadowanet
aby „przełączyć znacznik” dla wszystkich znalezionych plikówQ
„Zamień zapytanie w plikach ...”: pojawi się monit o wyrażenie regularne zapytania / podstawienia.y
celu zastąpienia i przejścia do następnego dopasowania, n, aby pominąć dopasowanie itp.N
pomiń wszelkie możliwe zamiany na resztę bieżącego pliku. (N
tylko emacs 23+)Y
.C-x C-b
jeśli jest powiązany z ibuffer lubM-x ibuffer RET
), aby wyświetlić listę wszystkich otwartych plików.* u
aby zaznaczyć wszystkie niezapisane pliki, wpisz,S
aby zapisać wszystkie zaznaczone pliki* * RET
aby odznaczyć wszystkie znaki, lub wpisz,D
aby zamknąć wszystkie zaznaczone plikiTa odpowiedź jest połączona z tą odpowiedzią , z tej strony i z moich własnych notatek. Korzystanie z Emacsa 23+.
źródło
ibuffer
nie jestC-x C-b
domyślnie związany.C-x C-b
sięibuffer
, bo to o wiele lepsze niż wiązania domyślnie. Po prostu dodaj(global-set-key (kbd "C-x C-b") 'ibuffer)
do pliku .emacs. W przeciwnym razie skorzystajM-x ibuffer RET
z powyższych instrukcji.bla-bla-bla
jest odwiedzany tylko do odczytu i zatrzymuje się na wyszukiwaniu. Jak tego uniknąć / zignorować i ciągle wymieniać? Dzięki.ibuffer
kiedy możeszC-x s
(save-some-buffers
) i pisać!
? Nie chcę być wściekły, tylko ciekawy. PS Plus do opisania!
,N
iY
.Odpowiedzi są świetne, ale pomyślałem, że dodam nieco inne podejście.
Jest to metoda bardziej interaktywny i wymaga
wgrep
,rgrep
iiedit
. Zarównoiedit
iwgrep
musi być zainstalowany przez MELPA lub Marmalade (za pomocąM-x package-list-packages
)Najpierw biegnij,
M-x rgrep
aby znaleźć szukany ciąg.Będziesz mógł określić typy plików / wzorzec i folder do ponownego wykorzystania.
Następnie musisz uruchomić,
wgrep
zacznij odC-s C-p
.Wgrep pozwoli Ci edytować
rgrep
wyników, więc ustawić region na ciąg dopasować i rozpocząćiedit-mode
zC-;
(w zależności od terminala może być konieczne ponowne wiążą ten temat)Wszystkie wystąpienia będą edytowalne jednocześnie.
C-x C-s
popełnićwgrep
. Następnie,C-x s !
aby zapisać zmienione pliki.Główną zaletą tej metody jest to, że można jej użyć
iedit-mode
do przełączania niektórych dopasowańM-;
. Możesz także użyć wyników w,rgrep
aby przejść do plików, na przykład, jeśli masz nieoczekiwane dopasowanie.Uważam, że jest to bardzo przydatne do edycji źródeł i zmiany nazw symboli (zmiennych, nazw funkcji itp.) W całym projekcie.
Jeśli jeszcze nie znasz / nie używasz trybu iedit, jest to bardzo przydatne narzędzie, zdecydowanie zalecamy, abyś rzucił okiem.
źródło
wgrep
jest przyC-c C-p
okazji.Pocisk jest naprawdę ładny: Cc pr uruchamia polecenie zamień pocisk
źródło
Zasadniczo używam innych narzędzi do wykonania tego zadania i wydaje się, że wiele podejść wymienionych w EmacsWiki w powłoce wejściowej Znajdź i zamień pliki jest obecnie dostępna, ale pakiet Findr wygląda bardzo obiecująco.
Kradzież części pliku źródłowego :
źródło
Źródło informacji: 1
Dla użytkowników emacs pro:
Przewodnik krok po kroku dla początkujących graczy Emacsa
Wybierz pliki docelowe
Uruchom emacsa, wpisując „emacs” w wierszu poleceń interfejsu wiersza poleceń. (Lub kliknij dwukrotnie ikonę Emacsa, jeśli jesteś w środowisku graficznego interfejsu użytkownika)
Wybieranie plików w katalogu
Najpierw musisz wybrać pliki, które chcesz zastąpić. Skorzystaj z menu graficznego 〖Plik ▸ Otwórz katalog〗. Emacs poprosi cię o ścieżkę do katalogu. Wpisz ścieżkę katalogu, a następnie naciśnij klawisz Enter.
Teraz zostanie wyświetlona lista plików, a teraz musisz zaznaczyć pliki, na których ma działać regex find / replace. Zaznacz plik, przesuwając kursor do żądanego pliku, a następnie naciśnij m. Usuń zaznaczenie, naciskając u. (Aby wyświetlić listę podkatalogów, przenieś kursor do katalogu i naciśnij i. Zawartość podkatalogu zostanie wyświetlona na dole.) Aby oznaczyć wszystkie pliki za pomocą wyrażenia regularnego, wpisz 【% m】, a następnie wpisz wzorzec wyrażenia regularnego. Na przykład, jeśli chcesz oznaczyć wszystkie pliki HTML, wpisz 【% m】, a następnie .html $. (Listę komend oznaczania można znaleźć w menu graficznym „Mark” (to menu pojawia się, gdy jesteś w trybie dired).)
Wybieranie plików w katalogu i wszystkich jego podkatalogach
Jeśli chcesz znaleźć / zamienić na pliki w katalogu, w tym setki podkatalogów, oto metoda wyboru wszystkich tych plików.
Zadzwoń znajdź-dired. (wywołujesz polecenie, naciskając 【Alt + x】) Następnie wpisz nazwę katalogu ⁖ / Users / mary / myfiles
Uwaga: jeśli używasz emacsa na nie graficznym terminalu tekstowym unix, a jeśli 【Alt + x】 nie działa, równoważne naciśnięcie klawisza to 【Esc x】.
Emacs poprosi cię o komunikat „Uruchom znajdź (z argumentami):”. Aby zastąpić wszystkie pliki HTML, wpisz -name „* html”. Jeśli nie obchodzi Cię, jakiego rodzaju plik, ale po prostu wszystkie pliki w tym katalogu, podaj „-type f”.
Teraz zaznacz pliki zgodnie z powyższym opisem.
Interaktywne wyszukiwanie / zamiana
Teraz jesteś gotowy, aby zastąpić wyszukiwanie interaktywne. Dla uproszczenia załóżmy, że chcesz po prostu zastąpić słowo „szybki” słowem „super”. Teraz wywołaj dired-do-query-replace-regexp. Poprosi Cię o ciąg wyrażenia regularnego i ciąg zastępujący. Wpisz „szybkie”, wpisz, a następnie „super”.
Teraz emacs użyje twojego wzorca i sprawdzi pliki, zatrzyma się i pokaże za każdym razem, gdy wystąpi dopasowanie. Kiedy tak się stanie, emacs wyświetli monit, a Ty możesz dokonać zmiany lub pominąć zmianę. Aby wprowadzić zmianę, wpisz y. Aby pominąć, wpisz n. Jeśli po prostu chcesz, aby emacs kontynuował i wprowadził wszystkie takie zmiany w bieżącym pliku, wpisz!
Jeśli chcesz anulować całą operację bez zapisywania wprowadzonych zmian, wpisz 【Ctrl + g】, a następnie zakończ emacsa za pomocą menu 〖Plik ▸ Wyjdź z Emacsa〗.
Zapisywanie zmienionych plików
Teraz, po przejściu powyższej próby, musisz zrobić jeszcze jeden krok, a mianowicie zapisać zmienione pliki.
Jeśli używasz emacsa w wersji 22 lub nowszej, wywołaj ibuffer, aby przejść do trybu listy buforów, a następnie wpisz type * u】, aby zaznaczyć wszystkie niezapisane pliki, a następnie wpisz S, aby je wszystkie zapisać. (to zmiany)
Jeśli używasz emacsa w wersji 21, możesz to zrobić: wywołać bufory listy, a następnie przesunąć kursor do pliku, który chcesz zapisać i wpisać s. Zaznacza plik do późniejszego zapisania. Wpisz u, aby odznaczyć. Po zakończeniu wpisz x, aby uruchomić zapisywanie wszystkich plików oznaczonych do zapisania. (w emacs otwarty plik nazywa się „buforem”. Pomiń inne rzeczy.)
Alternatywnie do powyższych opcji możesz także wywołać save-some-buffers 【Ctrl + xs】. Następnie emacs wyświetli każdy niezapisany plik i zapyta, czy chcesz go zapisać.
Uwaga: wyrażenie regularne emacsa nie jest takie samo, jak Perl lub Python, ale podobne. Aby uzyskać podsumowanie i typowe wzorce, zobacz: Emacs Regex.
źródło
Używanie dired do rekurencji w głębokim drzewie katalogów będzie nieco powolne w przypadku tego zadania. Możesz rozważyć użycie tagu-query-replace . Oznacza to, że można utworzyć tabelę znaczników, ale i tak jest to często przydatne i jest szybkie.
źródło
W przypadku otwartych buforów robię to:
źródło
M-X Dired
, oraz t, aby zaznaczyć wszystkie pliki iQ
wysłać zapytanie o zamianę tekstu we wszystkich. Możesz rozwinąć podkatalog za pomocąi
polecenia przed zastąpieniem zapytania. Kluczowe informacje, które dodaję, to to, że jeśli podasz prefiks (control-u) komendzie i, poprosi cię o arg, a argument -R rekurencyjnie rozszerzy wszystkosubdirs
dodired
bufora. Teraz możesz wyszukiwać w każdym pliku w całym katalogu.źródło
Inną opcją jest użycie wyszukiwania Sople . Jest to inny rodzaj wyszukiwania przyrostowego, który wykorzystuje uzupełnienie danych wejściowych minibufora względem wyników wyszukiwania. Po zmodyfikowaniu bieżącego wejścia zestaw pasujących trafień jest aktualizowany w buforze
*Completions*
.Możesz przeszukiwać dowolną liczbę plików, buforów lub lokalizacji zakładek, które możesz wybrać za pomocą dopasowania wzorca minibufora (np. Regexp).
Podczas odwiedzania wyszukiwania możesz zastąpić na żądanie całe trafienie lub tylko jego część pasującą do Twojego aktualnego wejścia do minibufora. Zastąpienie na żądanie oznacza, że nie jesteś pytany o każde trafienie z kolei; masz dostęp do trafień, które chcesz bezpośrednio, w dowolnej kolejności. Takie podejście może być bardziej skuteczne niż zamiana zapytań, jeśli masz ograniczoną liczbę zamienników do wykonania: pomijasz wyczerpujące
y/n
pytania.Wyszukiwanie obejmuje zdefiniowane konteksty wyszukiwania - nie jesteś ograniczony do przeszukiwania całego tekstu w plikach docelowych (np. Możesz pominąć komentarze lub poszczególne rodzaje sekcji programu). Prostym przykładem kontekstu wyszukiwania jest linia, jak w
grep
, ale kontekstem może być dowolny blok tekstu dopasowany do wzorca. Zazwyczaj definiujesz konteksty wyszukiwania za pomocą wyrażenia regularnego, ale zamiast tego możesz użyć funkcji. Oprócz definiowania własnego, istnieją predefiniowane polecenia wyszukiwania w Soplach dla różnych rodzajów kontekstów: bloki właściwości tekstu lub właściwości nakładki, rzeczy w punkcie itp.Możesz także sortować wyniki wyszukiwania w różnych porządkach sortowania dla łatwiejszego dostępu / nawigacji.
źródło
find-name-dired
jest OK, ale:find-dired
jest pod tym względem bardziej elastyczny, ale również służy do stosowania ogólnych zasad (nawet jeśli mogą być dowolnie złożone). I oczywiściefind
ma swój własny, złożony język.find(-name)-dired
buforze, musisz je zaznaczyć lub usunąć / pominąć wiersze tych, na których nie chcesz działać.Alternatywą jest użycie poleceń Dired + , które działają na (a) zaznaczone pliki i (b) wszystkie zaznaczone pliki (lub wszystkie pliki, jeśli żaden nie jest zaznaczony) w zaznaczonych podkatalogach ... znalezione rekurencyjnie . Daje to zarówno ogólność, jak i łatwą kontrolę nad wyborem pliku. Te polecenia „tu i poniżej” są na kluczu prefiksu
M-+
w trybie Dired.Na przykład
M-+ Q
jest taki sam jakQ
--- zamień zapytanie, ale wszystkie pliki docelowe są wszystkie oznaczone w bieżącym katalogu i we wszystkich zaznaczonych podkatalogach, w dół, w dół, w dół ...Tak, alternatywą dla używania takich tu i poniżej poleceń jest rekurencyjne wstawianie wszystkich podkatalogów i ich podkatalogów, a następnie użycie polecenia najwyższego poziomu, takiego jak
Q
. Ale często wygodne może być nie zawracanie sobie głowy wstawionymi podkatalogami.Aby to zrobić, i tak potrzebujesz szybkiego sposobu na rekursywne wstawienie wszystkich takich podkatalogów . Również tutaj Dired + może pomóc.
M-+ M-i
wstawia rekurencyjnie wszystkie zaznaczone podkatalogi i własne oznaczone podkatalogi. Oznacza to, że jest jakM-i
(który wstawia zaznaczone podkatalogi w Dired + ), ale działa rekurencyjnie na podkatalogach.(Wszystkie takie polecenia „tu i poniżej” Dired + znajdują się w menu Wiele > Zaznaczone tutaj i poniżej .)
Możesz także wykonywać operacje Dired na zestawie plików Emacsa , który jest zapisanym zestawem nazw plików znajdujących się w dowolnym miejscu. A jeśli używasz Sople wtedy można otworzyć Dired bufor dla zaledwie plików w zestawu plików lub innych typów plików zapisanych list.
Możesz także dodać do zakładek dowolny bufor Dired, w tym bufor utworzony za pomocą
find(-name)-dired
. To daje szybki sposób na powrót do takiego zestawu (np. Zestawu projektu) później. A jeśli użyjesz Zakładki +, dodaj do zakładek Dired bufor zapisuje (a) jegols
przełączniki, (b) które pliki są zaznaczone, (c) które podkatalogi są wstawione i (d) które (podk) katalogi są ukryte. Wszystko to jest przywracane, gdy „przeskakujesz” do zakładki. Zakładka + pozwala także dodać do zakładek całe drzewo Dired buforów --- przejście do zakładki przywraca wszystkie bufory w drzewie.źródło
Chciałbym zasugerować jeszcze jedno świetne narzędzie, o którym jeszcze nie wspomniano, mianowicie Helm .
Jest doskonałym zamiennikiem wielu standardowych operacji Emacsa obejmujących uzupełnianie, wyszukiwanie itp. W szczególności
helm-find-files
umożliwia wykonywanie zamiany zapytań (w tym wyrażeń regularnych) w wielu wybranych plikach.Wystarczy otworzyć
helm-find-files
, zaznaczyć odpowiednie pliki za pomocą,M-SPC
a następnie użyćF6
lub,F7
aby uruchomić zamianę zapytania lub zastąpić zapytanie regexp w wybranych plikach.źródło
helm-find-files
zamiast regexp można oznaczyćM-SPC
?To nie jest Emacs, ale xxdiff jest wyposażony w narzędzie o nazwie xx-rename, które zrobi to dla wielu ciągów naraz (np. From To od do FROM TO), z interaktywnym monitowaniem, zapisz kopie zapasowe wszystkich zmodyfikowanych plików i wygeneruj krótki dziennik zmian dokonanych w kontekście. Tego właśnie używam, gdy dokonuję dużych / globalnych zmian nazw.
źródło