Emacs QuickTip #2 – przeszukiwanie projektu

Podczas pracy nad projektem mamy czasem potrzebę wyszukania tekstu w całym drzewku plików.

Natchnieniem do napisania tego posta było uaktualnianie starego projektu z PHP5 do PHP7. W PHP7 (od 7.2 AFAIR) funkcja each() jest oznaczona jako przestarzała. Muszę więc znaleźć wszystkie jej wystąpienia w projekcie i czymś ją zastąpić.

Emacs ma sprytny pakiet do zarządzania projektami. Oczywiście jak to pod Emacsem – dowolnymi projektami w dowolnym języku. Pakiet ten nazywa się Projectile i pewnie jeszcze nie raz zagości na tym blogu. Jednak na potrzeby tego posta zakładamy, że jestem świeżak i mam surowego Emacsa.

Szukam więc.

Wydaję polecenie: M-x rgrep

To uruchomi Emacsową wersję grepa.

Dostaję pytanie:

Search for:

podaję: " each(" i Emacs dopytuje dalej:

Search for " each(" in files matching wildcard (default *.php):

podaję: "*.php". Emacs dalej:

Base directory: ~/Projekty/moj-projekt/

Tu daję Enter bo jestem akurat w projekcie.

Jako wynik szukania dostaję bufor *grep* wyglądający mniej więcej tak:

rgrep.png

Poruszam się po nim jak po każdym buforze – czyli normalna nawigacja, szukanie w przód i wstecz, itp. itd.

Jak ktoś z nowoinformatycznych programistów to może sięgnąć po myszkę i myszką klikać 🙂

Klik/Enter na linku przenosi mnie do odpowiedniej linii w każdym z plików.

Edytuję co trzeba i zamykam plik albo wracam do bufora z wynikami za pomocą C-x b *grep*.

Za pomocą g w tym buforze mogę powtórzyć wyszukiwanie z tymi samymi parametrami i patrzeć jak zmniejsza się liczba wystąpień each() w projekcie.

Szybki PHP Tip, czyli na co to cholerstwo zamienić.

Sam nie jestem taki mądry ale fajną podpowiedź znalazłem na StackOverflow:

each() bez wartości

jeżeli mam jakoś tak:

[sourcecode language=”php” title=”” ]
while (list($key, ) = each($array)) {
[/sourcecode]

zamieniam na:

[sourcecode language=”php” title=”” ]
foreach(array_keys($array) as $key) {
[/sourcecode]

each() bez klucza

Mam:

[sourcecode language=”php” title=”” ]
while (list(, $value) = each($array)) {
[/sourcecode]

zamieniam na:

[sourcecode language=”php” title=”” ]
foreach($array as $value) {
[/sourcecode]

pełny each() z kluczem i wartością

Mam:

[sourcecode language=”php” title=”” ]
while (list($key, $value) = each($array)) {
[/sourcecode]

zamieniam na:

[sourcecode language=”php” title=”” ]
foreach($array as $key => $value) {
[/sourcecode]

Winda, czyli „czemu ja mam zawsze pod górkę”

No soraski, jesteś programistą, wybrałeś Windowsa więc sam jesteś sobie winien 😀

rgrep korzysta ze starego, dobrego, POSIXowego grepa. Ruszy więc bez niczego pod MacOS X i pod każdym Linuksem.

Pod Windowsem musimy doinstalować find.exe i grep.exe albo (najlepiej) zainstalować CygWina i mieć wszystkie potrzebne narzędzia.

Te i inne opcje uzyskania grep.exe są opisane tu: https://www.emacswiki.org/emacs/GrepMode#toc4