Vyhľadávanie. Ako jednoduché to môže byť.
Keď som pred cca 20-timi rokmi založil firmu a začal podnikať, veľmi rýchlo som pochopil, že polovica pracovného času podnikateľa je vyplnená - hľadaním. Nejakého dokumentu, potvrdenia, dokladu.
A tak je to aj dnes
Dnes to nie je omnoho lepšie, ba andimistratívna záťaž sa určite zvýšila, ale všetko, čo existuje v papierovej podobe, máme i v digitálnej. Skenujem aj rukou robené poznámy a nákresy a tiež faktúry, ktoré niektorí stále posielajú poštou.
Mám nejaký systém triedenia, ktorý kupodivu aj funguje. A v tomto systéme je však potrebné informácie, súbory, vyhľadávať. Niečo je v "kastlíkoch" Zettelkasten (https://linuxos.sk/blog/richard/detail/druhy-mozog-so-zettelkasten/), ale väčšina vecí nie je nejako "dátabazovo" utriedených.
Bežné prostriedky
Kto má rád GUI, tak si pomôže s vyhľadávacími nástrojmi, napríklad zabudovanými do súborových manažérov, napr. v Double Commander-i. Alebo dedikované nástroje ako SearchMonkey.
V emulátore terminálu je zaužívaný supermocný nástroj find. Ak človek obsiahne jeho syntax, poradí si všade.
Len na osvieženie pamäte si môžeme ukázať jeden príklad:
find . -type f -iname *alegria*
kde .
definuje aktuálny adresár, type f
hľadá len v súboroch a iname
hľadá podľa názvu, a to s ignorovaním veľkých/malých písmen.
Obr. 0: starý dobrý find
v akcii
find má samozrejme veľa iných a silných parametrov.
Ale tento zápis nebude o find-e, načo aj, keď tutoriálov o ňom je habadej.
fd
Dlhé roky som používal find, až som raz natrafil na fd (https://github.com/sharkdp/fd). A je k dispozícií aj v bežných repozitároch, niekde pod názvom fdfind. Nie je to žiadna novinka, ale nejako ušla mojej pozornosti.
V skratke sa jedná o vyhľadávač, ktorého syntax je jednoduchšia a príjemnejšia na používanie. Z hlavných výhod, ako ich uvádza autor na githube, možno uviesť:
- intuitívnejšia syntax (takže
fd <hľadaný_výraz>
namiestofind -iname '*<hľadaný_výraz>*'
, - predvolené hľadanie pomocu regulárnych výrazov,
- vyššia rýchlosť vďaka paralelnému prehľadávaniu adresárov,
- používanie farieb,
- predvolene ignoruje skryté adresáre a súbory a .gitignore,
- a samotný príkaz fd má polovicu znakov ako find ☺.
Takže analogický príkaz ako vyššie uvedený by vyzeral:fd -t f alegria
Obr. 1: fd
v akcii
A to je už zásadné skrátenie. A fd má všetky pokročilé funkcie ako samotný find, ako regulárne výrazy, hľadanie presnej cesty, vykonávanie príkazov (napr fd -j 1 alegria -x mpv
, parameter -j 1
spôsobí, že sa vyhľadané súbory spustia pomocou mpv
nie naraz (paralelne), ale sériovo), vynechávanie súborov/adresárov,…
Takže fd je veľmi návykový a ľahko sa mu podľahne.
Triky s Emacsom
Find, /fd/… to všetko je v prostredí emulátora terminálu super. Ale kto je rozmaznaný interaktivitou Emacsu, bude "krútiť nosom". Akoby aj nie, keď shellové prostredie Emacsu dokáže takéto zázraky:
find-dired
find-dired
je akýmsi základom. Jedná sa o nadstavbu find-u, pričom je užívateľ vyzvaný k zadávaniu parametrov. Takže parametre find-u je potrebné poznať. Ale odmenou je vytvorenie bufferu s nájdenými výskytmi, ktoré je plne interaktívne, tak, ako v bežnom správcovi súborov a teda je možné na vyhľadné súbory či adresáre aplikovať kdejaké príkazy, úkony.
Obr. 2…4: find-dired
- Emacsová efektívnosť
Upresnením find-dired je príkaz find-name-dired
, kde sa automaticky použije parameter name príkazu find.
sr-find-file + sr-find-name + sr-find
Užívatelia farebných televízorov Emacsu a jeho nadstavby Sunrise Commander (https://linuxos.sk/blog/richard/detail/sunrise-commander-aka-dired-ortodoxne/) môžu využiť ďalšie rozšírenia, ktoré akoby z oka vypadly skôr uvedeným príkazom. Ale ich výhodou je, že výsledky sa otvoria v tzv. virtuálnom bufferi, ktorý sa tvári ako jeden adresár s výskytmi (opäť, analógia s find-dired), ale tento buffer je jedným z panelov Sunrise Commander-a.
Takto napísané to znie zmätočne, ale obrázok napovie:
Obr. 5: sr-find-file
- výsledky hľadania do panelu komandéra
Nad vylistovanými súbormi vidíme, aké parametre za nás tento príkaz (funkcia) doplnil. No kto by si to pamätal.
Tri uvedené príkazy sa líšia v parametroch, ktoré sú predávané do find-u. Takže nie je to žiadna kozmická veda, vždy na pozadí "maká" find, ale to, že výsledky sú poruke a sú interaktívne, to je neoceniteľná výhoda.
locate
Príkaz locate
vyhľadáva v databáze súborov, tá sa vytvára pomocou príkazu updatedb
manuálne, alebo to robí nejaký automatizovaný plánovač. Jeho výhodou je, že toto vyhľadávanie je nepomerne rýchlejšie, ale zase hľadá len podľa názvu súboru a vracia jeho umiestnenie.
Tu ani nie je veľmi o čom písať. Preto len uvediem, že ak je príkaz volaný z emacsu (locate
), tak výsledky sú opäť interaktívne vylistované v špeci bufferi; jeho analógiou je sr-locate
, kde platí to isté čo pri príkaze find. A nakoniec napríklad nadstavba helm má parádičku helm-locate
, ktorá umožňuje "fuzzy" hľadanie v spomínanej databáze.
Obr. 6: Príkaz locate
v shelle Emacsu
A čo to ovocie?
Teda konkrétne grep. To je tiež silný a dennodenne používaný nástroj, ktorý vyhľadáva priamo v obsahoch súborov. Len na pripomenutie, základné použitie je nejaké takéto:grep -i -r <text> <súbor(y)>
Teda bez rozlišovania písmen hľadá výskyt textového reťazca v súbore, a to aj rekurzívne v podadresároch.
Opäť nič nové, ani vzrušujúce, ale veci sa zlepšia s týmito rozšíreniami Emacsu:
grep
Hm, spustenie funkcie s týmto názvom zobrazí dialóg, v ktorom stačí doplniť vyhľadaávaný reťazec, prípadne -r
pre rekurzívne hľadanie. Opäť obrázky:
Obr. 7, 8: Príkaz grep
v Emacse
Výsledky sú nielen farebné, ale fungujú aj ako hyperlinky, ktoré nás presunú do konkrétneho súboru na konkrétny riadok. Vidno, že v porovnaní s klasickým terminálovým grep-om je to iný citrus!
Okrem toho existujú ešte tieto varianty:
lgrep
vyhľadáva len v aktuálnom adresári,rgrep
vyhľadáva rekurzívne, bez toho aby to bolo potrebné povoľovať parametrom-r
a súčasne rozpoznáva verzovacie systémy, takže sa "vyhýba" prehľadávaniu nepotrebných adresárov.
Pre Sunrise Commander existuje funkcia sr-find-grep
, ktorá to integruje do neaktíveho panelu súborového manažéra.
Vyhľadávanie v projekte
V rámci jedného súboru Emacs exceluje v dynamickom hľadaní textových reťazcov. Na prevažne slúži occur
, resp. jeho vylepšená verzia helm-occur
. Vyzerá to nejako takto:
Obr. 7, 8: Príkaz helm-occur
dynamicky zobrazuje nájdené výskyty, pričom zvolený riadok ukazuje v náhľade
Ak chceme hľadať vo všetkých otvorených bufferoch, vtedy siahneme po multi-occur
resp. multi-occur-in-matching-buffers
.
Ešte spomeniem, že v okne s výskytmi je možné tieto priamo editovať!
V rámci hľadania v adresári projektu existuje (napr.) rozšírenie noccur (https://github.com/NicolasPetton/noccur.el/tree/fa91647a305e89561d3dbe53da002fff49abe0bb). Toto robí podobnú prácu, ale vyhľadáva i v ostatných súborov v rámci adresára alebo projektu.
Obr. 7, 8: Príkaz noccur
hľadá v projekte: na obrázku vidno výskyt vo viacerých súboroch
Záver
Tých utilít na vyhľadávanie je nepomerne viac, ale ja si vystačím len s tu uvedenými.
Napr. existujú nástroje pre Emacs, ktoré uľahčujú hľadanie v git-e, sofistikovanejšie "fuzzy" hľadanie v projektoch, rozšírenia pre ripgrep,…
Ale aj v tomto príspevku je ukázané, že ak si človek raz zvykne na nejaký "ekosystém" (čo je nepekné a sprofanované slovo), ťažko sa prispôsobí inému.
To je požehnaním i prekliatím súčasne.
Pre pridávanie komentárov sa musíte prihlásiť.
takýchto návodov nie je nikdy dosť, ďakujem za príspevok :)
situácia 1:
otázka 1:
teraz čo? ako ho otvorím k editácii?
---
robím to tak, že zadám:
XED 45 (tu, ak treba, dám TABULÁTOR, nech mi doplní názov) a ENTER
#miesto XED tam môže byť hociktorý editor alebo najlepšie XDG-OPEN, tu si môžete vytvoriť alias open=xdg-open :)
otázka 1.1:
je aj nejaký efektívnejší spôsob?
>>>>>>>>>>>>>>>>>>>>>>>>>>
situácia 2:
otázka 2:
teraz čo? ako ho otvorím k editácii?
---
robím to tak, že skopírujem celú tú cestu a zadám:
XED - vložím celú tú CESTU (pridám úvodzovky, ak treba) - ENTER
otázka 2.1:
je aj nejaký efektívnejší spôsob?
>>>>>>>>>>>>>>>>>>>>>>>>>>
možno je to úplne banálna vec, možno to patrí medzi základy práce s terminálom, možno ....
ale ja nemám na to školy, učím sa "za jazdy", a teraz som došiel sem, tak sa pýtam :)
Ad 1.1:
Ak človek nie je v príjemnom a nerušenom a relaxačnom (má i vstavaného psychológa) :) prostredí Emacsu, potom sa zdá ako najlepšia forma toto:
1. Nainštalovať si FZF (program na fuzzy hľadanie, listovanie a nejakú interaktivitu)
(býva v repozitároch, napr. sudo apt install fzf)
2. Nainštalovať si fd (ale ako som zistil, niekde sa to volá fd-find alebo i fdfind, veď prečo nie :) )
(napr. sudo apt install fd-find)
3. Potom som skúšal: nano $(fdfind hladany_retazec | fzf)
(v tvojom prípade teda asi xed $(fdfind hladany_retazec | fzf)
vďaka za odpoveď
fd mám nainštalovaný, pridal som si aj fzf
ci pána, do pána, prepisujem to už tretí krát, správne naformulovať otázku alebo odpoveď, to dá zabrať :)
tvoja odpoveď je v poriadku, robí presne to, čo má, vyhľadá zadaný reťazec a otvorí ho v xed ale ...
hľadaný reťazec, teda vlastne názov dokumentu, nesmie obsahovať medzery !!!
ak mám napr.:
to je hľadaný dokument.txt
tak v xed sa mi otvárajú 4 záložky samozrejme s prázdnymi stránkami
dá sa ten príkaz ošetriť týmto smerom?
Treba poslať výstup z fzf do xed-u uzavretý v úvodzovkách:
xed $echo "\"$(fdfind hľadaný_text | fzf)\""
A teda je rozumné spraviť si nato aj alias:
alias fdxed='xed $echo "\"$(fdfind $1 | fzf)\""'
Takže vyhľadávanie bude v tvare:
fdxed <hľadaný súbor>
Hm, takto to asi nefunguje dobre - lebo to aj vytvorí súbor s " v názve. Zrejme by tochcelo nejaký pidi skript, kde zoberie vstup z FZF a pospája reťazce a toto predá pre textový editor.
Porozmýšľam.
Takže oprava:
Nakoniec stačí, ak je to takto:
xed "$(fdfind hľadaný_súbor | fzf)"
áno, toto je funkčné :)
a nakoľko mi to vyhľadá súbory v rôznych formátoch, prepísal som si ten začiatok:
xdg-open "$(fd hľadaný_súbor | fzf)"
možeš to prosí ešte zapísať ako alias?
trápim sa s tými úvodzovkami a nijak mi to nefunguje :(
Hm, ten alias nejde ani mne, logicky by to malo byť:
xdg-open "$(fd $1 | fzf)"
Čo ale prakticky spôsobí, že do xdg-open nie je posunutý výstup z fd (teda názov súboru), ale práve $1, čo je ten hľadaný reťazac.
Musím to zvážiť, resp. možno niekto prispeje svojim nápadom.