Srp 17

Inteligentné vyhľadávanie pomocou fzf

V tomto článku sa budeme venovať inteligentnému (fuzzy) vyhľadávaniu v termináli pomocou fzf (fuzzy finder). Čo-to sa o ňom dá dočítať aj na Arch Wiki.

 

 

 

Inštalácia programu

Program sa nachádza v oficiálnych repozitároch:

sudo pacman -S fzf
yay -S fzf-git
yay -S fzf-extras
yay -S fzf-extras-git
yay -S fzf-marks-git

fzf je samotný balíček
fzf-extras je balíček s dodatočnými klávesovými skratkami
fzf-marks-git je balíček na manipuláciu so záložkami

 

Pomoc a manuálová stránka:

man fzf
fzf --help
fzf -h

Manuálová stránka
Manuálová stránka pre tmux
Wiki

 

Konfigurácia fuzzy finder (fzf)

Hneď na úvod si spomenieme, že na vytvorenie aliasu máme dve možnosti. Prvou je priama definícia a druhou je skript. Ja osobne, kvôli prehľadnejšej forme, používať druhú variantu pomocou skriptu.

 

Priama definícia aliasu (jedná sa o skrátenú formu):

Pomocou nejakého textového editoru si otvoríme súbor, kde aliasy “uchovávame”:

gedit ~/.bashrc
gedit ~/.zshrc
gedit ~/.zshrc_aliases

A pridáme tento riadok:

alias fzfs='fzf -i --multi --exact --no-sort --cycle --reverse --ansi --no-hscroll --inline-info --bind=right:half-page-down,left:half-page-up

 

Definícia aliasu pomocou skriptu:

Pomocou nejakého textového editoru si otvoríme súbor, kde aliasy “uchovávame”:

gedit ~/.bashrc
gedit ~/.zshrc
gedit ~/.zshrc_aliases

A pridáme jeden z týchto riadkov riadok:

alias fzfs='/cesta/ku/fzf-skript'
alias fzfs='/cesta/ku/fzf-skript.sh'

/cesta/ku/fzf-skript.sh definuje cestu ku umiestneniu skriptu a jeho názov. Obe možnosti sú samozrejme voliteľné.

 

Skript môže by umiestnený kdekoľvek. Jednou z možností je aj /usr/local/bin či /usr/bin. Na premiestnenie sú potrebné administrátorské práva:

sudo cp /cesta/ku/fzf-skript.sh /usr/local/bin/fzf-skript.sh

 

Pridelenie oprávnení:

Aby sa skript mohol spúšťať ako program, musíme mu prideliť potrebné práva. Buď klikaním alebo cez príkazový riadok:

chmod a+x /cesta/ku/fzf-skript.sh
sudo chmod a+x /cesta/ku/fzf-skript.sh

 

Ukážkový obsah skriptu:

#!/bin/bash

fzf -i --multi --exact --no-sort --cycle --reverse --ansi --no-hscroll --inline-info \
  --bind=right:half-page-down,left:half-page-up \
  --margin="2%,1%,1%,2%" \
  --color=info:107,spinner:167,pointer:144,marker:215,fg+:144 \
  --preview='[[ $(file --mime {}) =~ binary ]] && echo {} "\e[31m\e[1m\nbinárny súbor" ||
     cat {}) 2> /dev/null | head -500'

-i nastavuj, aby sa ignorovali malé a veľké písmená. Opakom je +i.
multi (-m) povolí výber viacerých položiek pomocou tab/shift+tab
exact (-e) povolí presnú zhodu
no-sort (+s) povolí, aby sa výsledky vyhľadávania netriedili
cycle povolí cyklické skrolovanie
reverse umiestni vyhľadávanie pole do hornej časti obrazovky. Synonymum pre --layout=reverse.
ansi povolí spracovanie kódov ANSI farieb
no-hscroll zakáže horizontále skrolovanie
inline-info zobrazí informácie o vyhľadávači v súlade s dopytom
bind nastavuje klávesové skratky. V konkrétnom prípade ľavá šípka posunie kurzov do hornej polovice obrazovky a pravá šípka do dolnej polovice.
color nastavuje parametre pre farby.
preview nastavuje parametre náhľadového okna.

 

Možnosti pre nastavenia farieb:

--color=" "[ZÁKLADNÁ_SCHÉMA][,FARBA:ANSI]
--color=" "[BASE_SCHEME][,COLOR:ANSI]

Názov základnej farebnej schémy je nasledovaný vlastnými farebnými mapovaniami. Ansi kód farby -1 označuje predvolenú koncovú farbu popredia či koncovú farbu pozadia. Môže sa určiť aj pomocou 24-bitového farebného zápisu RRGGBB.

ZÁKLADNÁ TÉMA (BASE SCHEME):

dark je tmavá farebná schéma pre terminál s podporou 256 farebnej palety
light je svetlá farebná schéma pre terminál s podporou 256 farebnej palety
16 je farebná schéma pre terminál s podporou 16 farebnej palety
bw bez farieb

predvolená: dark
v ostatných prípadoch: 16

FARBA (COLOR):

fg je farba textu
bg je farba pozadia
hl je farba zvýraznených podreťazcov
fg+ je farba textu aktívneho riadku
bg+ je farba pozadia aktívneho riadku
hl+ je farba zvýraznených podreťazcov aktívneho riadku
info je farba informácií
border je farba okraju okna náhľadu a horizontálneho oddeľovača
prompt je farba príkazovej výzvy
pointer je farba ukazovateľa
marker je farba značky s viacerými možnosťami
spinner je farba Indikátora streamovaného vstupu
header je farba hlavičky

 

Syntax vyhľadávania pomocou fzf:

"arch"       Položky zodpovedajúce arch
"^arch"      Položky začínajúce arch
"arch$"      Položky končiace arch
"'arch"      Položky obsahujúce arch
"!arch"      Položky neobsahujúce arch
"!-arch$"    Položky nekončiace arch

 

Skript na zobrazenie zoznamu balíčkov podľa veľkosti s náhľadom:

Prebratý z Pacui a čiastočne upravený.
Závislosti: expac, fzf

#!/bin/bash

expac -H M -Q "%12m - \e[1m%n\e[0m %v" $( comm -23 <(pacman -Qq | sort) <(pacman -Qqg base | sort) ) | sort -n -r | \
 fzf -i --multi --exact --no-sort --cycle --reverse --ansi --no-hscroll --inline-info \
   --bind=right:half-page-down,left:half-page-up \
   --margin="2%,1%,1%,2%" \
   --color=info:107,spinner:167,pointer:144,marker:215,fg+:144 \
   --preview='pacman -Qi {4} --color always'

 

Inštalácia programov pomocou skriptu:

Skript stiahnutý od DanielFGray a čiastočne upravený.

#!/usr/bin/env bash

declare esc=$(printf '\033')
declare c_reset="${esc}[0m"
declare c_red="${esc}[31m"
declare c_green="${esc}[32m"
declare c_blue="${esc}[34m"

err() {
 echo -e "${c_red}$@${c_reset}" >&2
}

die() {
 [[ -n "$1" ]] && err "$1"
 exit 1
}

has() {
 command -v "$1" &> /dev/null
}


declare search

has -v fzf || die

fzf() {
command fzf -i --multi --exact --no-sort --cycle --reverse --ansi --no-hscroll --inline-info \
 --bind=right:half-page-down,left:half-page-up \
 --margin="2%,1%,1%,2%" \
 --color=info:107,spinner:167,pointer:144,marker:215 \
 --preview='pacman -Si {2} --color always' "$@"
}

if [[ -f /etc/arch-release ]]; then
 search='pacman'
 out=$(fzf < <( $search -Ss "$@" |
 awk '{
 getline descr;
 sub(/ */,"", descr);
 repo = "[" blue gensub(/\/.*/, "", 1) reset "]";
 name = green gensub(/.*\//, "", 1, $1) reset;
 info = gensub(/[^ ]* /, "", 1);
 print repo, name, info, descr;
 }' blue="$c_blue" green="$c_green" reset="$c_reset"
 )
 )
 mapfile -t pkgs < <(awk '{print $2}' <<< "$out")
 (( ${#pkgs} > 0 )) || exit
 echo "installing ${pkgs[*]}"
 ${search/pacman/sudo pacman} -S "${pkgs[@]}"
fi

 

Voliteľné klávesové skratky a dokončenia pre rôzne shelly

bash

Pomocou nejakého textového editoru si otvoríme .bashrc:

gedit ~/.bashrc

A pridáme tieto dva riadky:

source /usr/share/fzf/key-bindings.bash
source/usr/share/fzf/completion.bash

zsh

Pomocou nejakého textového editoru si otvoríme .zshrc:

gedit ~/.zshrc

A pridáme tieto dva riadky:

source /usr/share/fzf/key-bindings.zsh
source /usr/share/fzf/completion.zsh

fish

Klávesové skratky sa načítajú automaticky a sú v:

/usr/share/fish/functions/fzf.fish

Prepojenia (bindings) sa musia zadefinovať manuálne. Pomocou nejakého textového editoru si otvoríme:

gedit ~/.config/fish/functions/fish_user_key_bindings.fish

Pridajú sa tieto riadky:

function fish_user_key_bindings
 fzf_key_bindings
end

Dokončovanie (completion) sa dá vytvoriť pomocou vlastnej funkcie.

 

Napsat komentář

Your email address will not be published.

%d blogerům se to líbí: