Szukam najlepszego sposobu na przeszukiwanie i zastępowanie (z potwierdzeniem) we wszystkich plikach projektu w Vimie. Przez „pliki projektu” rozumiem pliki w bieżącym katalogu, z których niektóre nie muszą być otwarte.
Jednym ze sposobów na to może być po prostu otwarcie wszystkich plików w bieżącym katalogu:
:args ./**
a następnie wyszukaj i zamień na wszystkich otwartych plikach:
:argdo %s/Search/Replace/gce
Jednak kiedy to robię, użycie pamięci Vima skacze z kilkudziesięciu MB do ponad 2 GB, co nie działa dla mnie.
Mam też zainstalowaną wtyczkę EasyGrep , ale prawie nigdy nie działa - albo nie znajduje wszystkich wystąpień, albo po prostu zawiesza się, dopóki nie naciśnę CtrlC. Do tej pory moim preferowanym sposobem wykonania tego zadania jest zatwierdzenie grep dla wyszukiwanego hasła, używając jego okna quickfix otwórz dowolny plik, który zawiera termin i nie był wcześniej otwierany, i na koniec:bufdo %s/Search/Replace/gce
.
Szukam albo dobrej, działającej wtyczki, którą można do tego użyć, albo alternatywnie polecenia / sekwencji poleceń, które byłyby łatwiejsze niż to, którego teraz używam.
Odpowiedzi:
Greplace dobrze mi odpowiada.
Na githubie dostępna jest również wersja gotowa na patogen .
źródło
:Gsearch
i:Gbuffersearch
istnieją, ale kiedy piszę:Greplace
, otrzymujęNot an editor command: Greplace
.:Gsearch [<grep-option(s)>] [[<pattern>] [<filename(s)>]]
więc możesz przeprowadzić wyszukiwanie rekurencyjne, używając na przykład::Gsearch -r pattern dir/
Inną dużą opcją jest po prostu nieużywanie vim:
lub jeśli masz jakiś sposób na wygenerowanie listy plików, być może coś takiego:
i tak dalej!
źródło
sed
wyrażenia regularne, które są zasadniczo podstawowymi wyrażeniami regularnymi POSIX.2, ale nie do końca (jest to na stronie podręcznika) - pozwalają\n
dopasować znaki nowej linii i kilka innych podobnych rzeczy. Dlatego są prawie takie same jakgrep
wyrażenia regularne.find . -type f | LANG=C xargs sed -i '' 's/SEARCH/REPLACE/g'
EDYCJA: Użyj
cfdo
polecenia zamiast,cdo
aby znacznie zmniejszyć liczbę poleceń, które zostaną uruchomione, aby to osiągnąć (ponieważcdo
uruchamia polecenia na każdym elemencie, gdycfdo
uruchamia polecenia na każdym pliku)Dzięki niedawno dodanemu
cdo
poleceniu możesz teraz zrobić to za pomocą dwóch prostych poleceń przy użyciu dowolnegogrep
zainstalowanego narzędzia. Nie są wymagane żadne dodatkowe wtyczki !:(
cdo
wykonuje daną komendę do każdego terminu z listy szybkich poprawek, do której plikgrep
wypełnia polecenie).(Usuń znak
c
na końcu drugiego polecenia, jeśli chcesz zamienić każdy wyszukiwany termin bez potwierdzania za każdym razem)źródło
:cdo update
aby zapisać zmiany we wszystkich plikach.c
na końcu drugiego polecenia (po prostu użyjg
), aby wyszukać i zamienić bez pytania o potwierdzenieupdate
musiałem:cdo %s/<search term>/<replace term>/g | update
Zdecydowałem się użyć polecenia ACK i Perla, aby rozwiązać ten problem, aby skorzystać z potężniejszych pełnych wyrażeń regularnych Perla, zamiast podzbioru GNU.
Wyjaśnienie
ACK
ACK jest niesamowite narzędzie wiersza polecenia, które jest mieszanką
grep
,find
i pełne wyrażenia regularne Perl (nie tylko podzbiór GNU). Jest napisany w czystym Perlu, jest szybki, ma podświetlanie składni, działa w systemie Windows i jest bardziej przyjazny dla programistów niż tradycyjne narzędzia wiersza poleceń. Zainstaluj go na Ubuntu zsudo apt-get install ack-grep
.xargs
Xargs to stare narzędzie wiersza poleceń systemu Unix. Odczytuje elementy ze standardowego wejścia i wykonuje określone polecenie, a po nim elementy odczytane ze standardowego wejścia. W zasadzie lista plików wygenerowanych przez potwierdzenie jest dołączana na końcu
perl -pi -E 's/pattern/replacemnt/g'
polecenia.perl -pi
Perl to język programowania. Opcja -p powoduje, że Perl tworzy pętlę wokół twojego programu, która iteruje po argumentach nazw plików. Opcja -i powoduje, że Perl edytuje plik w miejscu. Możesz to zmodyfikować, aby tworzyć kopie zapasowe. Opcja -E powoduje, że Perl wykonuje jedną linię kodu określoną jako program. W naszym przypadku program jest po prostu podstawieniem wyrażenia regularnego w Perlu. Więcej informacji na temat opcji wiersza poleceń Perla
perldoc perlrun
. Więcej informacji na temat Perla można znaleźć pod adresem http://www.perl.org/ .źródło
może zrób to:
Wyjaśnienie:
:noautocmd vim /Search/ **/*
⇒ lookup (vim
to skrót odvimgrep
) wzorzec we wszystkich plikach we wszystkich podkatalogach cwd bez wyzwalania autocmds (:noautocmd
), ze względu na szybkość.:set hidden
⇒ zezwalaj na wyświetlanie zmodyfikowanych buforów w oknie (może być w twoim vimrc):cfirst
⇒ przejdź do pierwszego wyniku wyszukiwaniaqa
⇒ rozpocząć zapis makra do rejestru a:%s//Replace/gce
⇒ zamień wszystkie wystąpienia ostatniego wzorca wyszukiwania (jeszcze/Search/
w tym czasie) naReplace
:g
flaga)c
flaga)e
flaga):cnf
⇒ przejdź do następnego pliku na liście utworzonej przezvim
polecenieq
⇒ zatrzymaj nagrywanie makra1000@a
⇒ odtwórz makro zapisane w rejestrze 1000 razy:wa
⇒ zapisz wszystkie zmodyfikowane bufory* EDYTOWAĆ * Vim 8 sposób:
Począwszy od Vim 8 jest lepszy sposób na zrobienie tego, ponieważ
:cfdo
wykonuje iteracje na wszystkich plikach na liście quickfix:źródło
vim
przekonał mnie do wielu rzeczy, myślę, że pozostanę przy tym PowerGrep.Wypełnij za
:args
pomocą polecenia powłokiMożliwe jest (w niektórych systemach operacyjnych 1 )) dostarczenie plików za
:args
pomocą polecenia powłoki.Na przykład, jeśli masz zainstalowany program ACK 2 ,
poprosi ACK o zwrócenie listy plików zawierających „wzorzec” i umieszczenie ich na liście argumentów.
Lub zwykłym starym grepem, myślę, że będzie:
Następnie możesz po prostu użyć
:argdo
zgodnie z opisem w OP:Wypełnianie
:args
z listy quickfixSprawdź również odpowiedź nelstroma na powiązane pytanie opisujące proste polecenie zdefiniowane przez użytkownika, które wypełnia arglistę z bieżącej listy szybkich poprawek. Działa to świetnie z wieloma poleceniami i wtyczkami, których wyjście kończy się na liście quickfix (
:vimgrep
,:Ack
3 ,:Ggrep
4 ).Sekwencję wyszukiwania całego projektu można następnie wykonać za pomocą:
gdzie
:Qargs
jest wywołaniem polecenia użytkownika, które wypełnia arglistę z listy quickfix.Linki znajdziesz również w następującej dyskusji do prostych wtyczek, które sprowadzają ten przepływ pracy do 2 lub 3 poleceń.
Spinki do mankietów
źródło
Jeszcze jedna opcja w 2016 roku, wtyczka far.vim :
źródło
Jeśli nie masz nic przeciwko wprowadzeniu zewnętrznej zależności, przygotowałem wtyczkę ctrlsf.vim (zależy od ACK lub AG ), aby wykonać zadanie.
Może formatować i wyświetlać wyniki wyszukiwania z ACK / AG oraz synchronizować zmiany w buforze wyników z rzeczywistymi plikami na dysku.
Może poniższe demo wyjaśnia więcej
źródło
Krok 1 wypełnia listę quickfix żądanymi elementami. W tym przypadku jest on propagowany z wyszukiwanymi hasłami, które chcesz zmienić
grep
.cfdo
uruchamia następujące polecenie dla każdego pliku z listy quickfix. Wpisz:help cfdo
szczegóły.s/<search term>/<replace term>/g
zastępuje każdy termin./g
oznacza zastąpienie każdego wystąpienia w pliku.| update
zapisuje plik po każdej zamianie.Złożyłem to razem w oparciu o tę odpowiedź i jej komentarze, ale uznałem , że zasługuje na własną odpowiedź, ponieważ wszystko jest w jednym miejscu.
źródło
2. :cfdo %s/<search term>/<replace term>/g | update
bez tego%
, tylko pierwsze wystąpienie wzorca jest zastępowane.%s
działa również na zwykłym vimie.Zasadniczo chciałem zastąpić w jednym poleceniu, a co ważniejsze w samym vimie
Na podstawie odpowiedzi @Jefromi utworzyłem skrót klawiaturowy, który ustawiłem w moim pliku .vimrc w ten sposób
teraz z vima, za jednym pociągnięciem lidera + r otrzymuję polecenie załadowane w vimie, które edytuję jak poniżej,
Dlatego zastępuję za pomocą jednego polecenia i, co ważniejsze, w samym vimie
źródło