[gull] Truc et astuces: ( fzf + batcat ) / apt-cache

Félix Hauri felix at f-hauri.ch
Sun Jan 12 09:50:31 CET 2025


Je vous avais parlé de fzf, `Fuzzy Finder', qui permet de créer des
listes interactives...

   https://f-hauri.ch/vrac/fzfDbDemo.tzst
   ## Cette demo DB dépends des paquets suivants:
   ##     catimg, coreutils, fzf, ncurses-bin, sed et sqlite3.

   $ mkdir /tmp/fzfDemo; cd $_;
   $ wget -qO - f-hauri.ch/vrac/fzfDbDemo.tzst | tar --zstd -x
   $ fzfDbDemo/fzfDbDemo.sh       # Simple demo DB SQLite
   $ fzfDbDemo/fzfDbDemoBack.sh   # SQLite en background (connexion db unique)

   # Les touches <Up> <Down> <Return> et <Esc> pour navigation et
   # <Shift+Up> et <Shift+Down> pour la navigation dans la fenêtre "preview".

Voici une application simple et utile pour les paquets Debian (et Ubuntu):
(Je chechais à lister les paquets ``elpa-*'')

   $ mapfile -t arry < <(
        fzf -m --preview 'read -r nam _ <<<{};
                          apt-cache show $nam |
                             fold -s -w 80 |
                             batcat --color=always -l YAML -p
           ' --preview-window 80 < <(
         apt-cache search elpa
     ));printf ' - deb pak: %s\n' "${arry[@]%% *}"

   # Les touches <Up> <Down> <Return> et <Esc> pour navigation,
   # La touche <tab> pour sélectionner/déselectionner un paquet
   # <Shift+Up> et <Shift+Down> pour la navigation dans la fenêtre "preview".

Cette commande génère une chaîne `arry` qui contient chaque lignes
sélectionnée (complête). La syntaxe `"${arry[@]%% *}"` permet d'obtenir
une chaîne de chaînes limitées au premier *espace*.

Petite fonction:

   aptFzfSel() {
       local arry yesno;
       mapfile -t arry < <( fzf -m --preview '
           read -r nam _ <<<{}; apt-cache show $nam |
           fold -s -w 80 | batcat --color=always -l YAML -p
             ' --preview-window 80 < <(
           apt-cache search "$1"
       ));
       ((${#arry[@]})) || return 0;
       echo Install following packages:; printf ' - : %s\n' "${arry[@]}";
       printf 'Yes no (Y/n)? ';while [[ -z $yesno ]];do
           IFS= read -rsn 1 yesno;
           case ${yesno,} in
               [yn] ) ;;
               $'\e') yesno=n ;;
               '' ) yesno=y;;
               * ) yesno=;;
           esac;
       done;
       if [[ ${yesno,} == y ]];
           then echo Yes; sudo apt install "${arry[@]%% *}";
           else echo No;
       fi;
   }

   $ aptFzfSel elpa
   $ aptFzfSel '^catimg$|^fzf$|^sqlite3$|^ncurses-bin$|^coreutils$|^sed$'

A+!

-- 
 Félix Hauri  -  <felix at f-hauri.ch>  -  http://www.f-hauri.ch


More information about the gull mailing list