Compare commits

..

No commits in common. "master" and "v0.3" have entirely different histories.
master ... v0.3

6 changed files with 81 additions and 419 deletions

View File

@ -1,25 +1,32 @@
# Maintainer: Eric Lay <ericlaytm@gmail.com> # Maintainer: Eric Lay <ericlaytm@gmail.com>
# Contributor: Yochananmarqos
pkgname=fuzzy-pkg-finder pkgname=fuzzy-pkg-finder
pkgver=1.2 pkgver=0.2
pkgrel=1 pkgrel=2
pkgdesc="Simple cli command for using fzf to search and install packages" pkgdesc="Simple cli command for using fzf to search and install packages"
arch=('x86_64' 'aarch64' 'armv7h') arch=(any)
url="https://github.com/ericlay/$pkgname" url="https://github.com/ericlay/$pkgname"
license=('GPL3') license=('GPL')
depends=('pacman' depends=('pacman'
'fzf' 'yay'
'expac' 'fzf')
'curl'
'gzip'
'jq')
makedepends=('git') makedepends=('git')
optdepends=('yay: AUR helper' source=("git+https://gitlab.com/airclay/fuzzy-pkg-finder.git#tag=v$pkgver")
'paru: AUR helper')
source=("git+https://github.com/ericlay/fuzzy-pkg-finder.git#tag=v$pkgver")
md5sums=('SKIP') md5sums=('SKIP')
package() { package() {
cd "$srcdir/$pkgname" cd "$srcdir"
install -Dm755 fpf -t "$pkgdir/usr/bin" install -dm755 $pkgdir/usr/bin
cp -r $srcdir/$pkgname/fpf $pkgdir/usr/bin/
chmod a+x $pkgdir/usr/bin/*
install -dm755 "$pkgdir"/usr/lib/systemd/system/
install -m644 $srcdir/$pkgname/fpf.{service,timer} "$pkgdir"/usr/lib/systemd/system/
echo
echo
echo -------------------------------------
echo 'Please start/enable fpf service'
echo 'See git installation instructions'
echo -------------------------------------
echo
echo
} }

View File

@ -1,82 +1,27 @@
<div align="right"> # fuzzy-pkg-finder
<img src="https://img.shields.io/static/v1?label=Language&message=shell&color=%235BB97E&style=flat-square"/>
<img src="https://img.shields.io/github/license/ericlay/fuzzy-pkg-finder?color=%235BB97E&label=LIC&style=flat-square"/>
</div>
<div align="center"><h1>📦<br>Fuzzy-pkg-finder</h1></div>
**Simple cli utility using fzf to search and install/list/remove packages.**\ **Simple cli command for using fzf to search and install packages.**\
\ \
![Screenshot](https://raw.githubusercontent.com/ericlay/fuzzy-pkg-finder/master/fpf.png) \ Performs live search by package name and presents package information including file list in preview pane. \
\ Includes fpf systemd timer to keep files database up to date automagically.
Leverages the power of fzf to search package names and descriptions then presents complete package information in preview pane. \
On selection will hand off to Pacman or Paru/Yay to complete transaction. \
\ \
*For use with Pacman/Yay/Paru package managers only.*\ *For use with Pacman or Yay package managers only.*\
*Entirely inspired by command found at https://wiki.archlinux.org/index.php/Fzf* \
\ \
There are countless fzf package manager wrappers out there, some much more built out that this. \ Installation:
What separates Fuzzy-pkg-finder? ```bash
- It's mine and it works the way I like it to
- It works as a simple script to wrap pacman/yay/paru, no need to rebuild the wheel
- Searches both package names and descriptions for keyword
- Hide preview window to see only packages and descriptions
- Shows files list and/or missing files for official repo or installed AUR packages
- Toggle between package info view and PKGBUILD view on AUR package preview
- Update feature shows package information and link to recent commits \
\
\
Installation: \
For Arch and arch-based distros, it is available in the AUR. \
Use: `paru -S fuzzy-pkg-finder` or `yay -S fuzzy-pkg-finder` \
\
Manual build and install:
```
git clone https://github.com/ericlay/fuzzy-pkg-finder git clone https://github.com/ericlay/fuzzy-pkg-finder
cd fuzzy-pkg-finder cd fuzzy-pkg-finder
makepkg -sric makepkg
sudo pacman -U fuzzy-pkg-finder-0.1-1-any.pkg.tar.xz
``` ```
\ \
Usage: After installation completes:
```bash
sudo systemctl enable fpf.timer fpf.service
sudo systemctl start fpf.service fpf.timer
``` ```
Syntax: fpf [-a| --aur] [-l| --list-installed] [-la| --list-aur-installed] \
[R| --remove] [-o| --orphans] [-U | --update] [-h | --help] Usage: \
Defaults to Pacman if no options passed Invoke `pacfzf` or `yayfzf` commands to search the respective repositories. Press 'Enter' key to select desired package. Follow Pacman/Yay instructions to complete install.
Searching for a package:
ex: fpf [pkg name] for official repo search
ex: fpf -a [pkg name] for aur search
Options:
-a, --aur
Search/List and install from AUR with Yay
-l, --list-installed
Search/List installed packages from official repo
-la, --list-aur-installed
Search/List installed packages from AUR
-R, -remove
Search/List installed packages for removal
-o, --orphans
Search/List orphaned packages for removal
-U, --update
Shows packages with updates available
-h, --help
Print this help screen
```
\
Keybinds:
```
'ctrl + /' Toggle the preview window
'ctrl + h' Show help in the preview window
'ctrl + k' Show the keybinds in the preview window
'ctrl + n' Move to the next selected item
'ctrl + b' Back to previoius selected item
When browsing AUR or installed Aur pkgs:
'ctrl + p' Preview the highlighted pkgbuild file
'ctrl + x' Return to the highlighted pkg info
```

367
fpf
View File

@ -1,344 +1,39 @@
#!/usr/bin/bash #!/usr/bin/bash
### Help ### Help
Help() { Help() {
helpF="/tmp/fpf-help" echo
{ printf "\n%s\n" "Use fzf to search and install with Pacman or Yay/Paru" echo "Use fzf to search and install with Pacman and Yay"
printf "\n%s\n\t%s\n\t\t%s\n" "SYNTAX" \ echo "Defaults to Pacman if no options passed"
"fpf [-a| --aur] [-l| --list-installed] [-la| --list-aur-installed]" "[R| --remove] [-o| --orphans] [-h | --help]" echo
printf "\n%s\n\t%s\n\t\t%s\n\n\t%s\n\t\t%s\n" "EXAMPLE" "For official repo search:" \ echo "Syntax: fpf -[y|h]"
"fpf [pkg name]" "For AUR search:" "fpf -a [pkg name]" echo
printf "\n%s\n" "OPTIONS" echo "options:"
printf "\t%s\n\\t\t%s\n\n" "-l, --list-installed" "Search/List installed packages from official repo" echo
printf "\t%s\n\\t\t%s\n\n" "-la, --list-aur-installed" "Search/List installed packages from AUR" echo "y Search and install with Yay"
printf "\t%s\n\\t\t%s\n\n" "-a, --aur" "Search/List and install from AUR with Yay" echo
printf "\t%s\n\\t\t%s\n\n" "-R, -remove" "Search/List installed packages for removal" echo "h Print this help screen."
printf "\t%s\n\\t\t%s\n\n" "-o, --orphans" "Search/List orphaned packages for removal" echo
printf "\t%s\n\\t\t%s\n\n" "-U, --update" "Show packages with updates available" echo
printf "\t%s\n\\t\t%s\n\n" "-h, --help" "Print this help screen"; } > "$helpF"
}
KBINDS() {
kbindF="/tmp/fpf-kbinds"
{ printf "\n%s\n\n %s\n" "Keybinds:" "GLOBAL"
printf "\t%s\t%s\n" "'ctrl + h'" "Show help in the preview window"
printf "\t%s\t%s\n" "'ctrl + k'" "Show the keybinds in the preview window"
printf "\t%s\t%s\n" "'ctrl + /'" "Toggle the preview window"
printf "\t%s\t%s\n" "'ctrl + n'" "Move to the next selected item"
printf "\t%s\t%s\n" "'ctrl + b'" "Back to previoius selected item"
printf "\n %s\n" "AUR"
printf "\t%s\t%s\n" "'ctrl + p'" "Preview the highlighted pkgbuild file"
printf "\t%s\t%s\n" "'ctrl + x'" "Return to the highlighted pkg info"; } > "$kbindF"
}
# Check things are up to date
UpdateInfos() {
[ -f /var/lib/pacman/sync/core.files ] || { printf "Syncing files database"; sudo pacman -Fy; }
d1=$(stat -c %y /var/lib/pacman/sync/core.files)
d2=$(stat -c %y /var/lib/pacman/sync/core.db)
d1="${d1:0:10}"
d2="${d2:0:10}"
[[ "${d2///-/}" > "${d1//-/}" ]] && { printf "Files database is out of date\nSyncing now..."; sudo pacman -Fy; }
}
UpdateAurInfos() {
[[ ! -d /tmp/aur ]] && mkdir -p /tmp/aur
zcat <(curl https://aur.archlinux.org/packages-meta-ext-v1.json.gz) |
jq --compact-output '.[] |
{ Name, Description } ' |
awk -F'"' '{ printf "%-20s\t%s\n", $4, $8}' > /tmp/aur/fpf-packages-meta
while IFS= read -r pkgName; do
grep -w "^$pkgName " /tmp/aur/fpf-packages-meta >> /tmp/aur/fpf-installed
done < <(pacman -Qqm)
sort <(comm -23 <(cat /tmp/aur/fpf-packages-meta | sort) <( cat /tmp/aur/fpf-installed | sort)) \
<(comm -12 <( cat /tmp/aur/fpf-packages-meta | sort) <(cat /tmp/aur/fpf-installed | sort) |
awk -F"\t" '{print $1" \033[32m*\033[0m ", $2}') -o /tmp/aur/fpf-packages-meta
}
AurFD() {
[ -f /tmp/aur/packages-meta ] ||
printf "Syncing AUR package information..." && UpdateAurInfos
d1=$(stat -c %y /tmp/aur/fpf-packages-meta)
d1="${d1:0:10}"
d2=$(date -I'date')
[[ "${d2///-/}" > "${d1//-/}" ]] && {
printf "Syncing AUR package information..."; UpdateAurInfos; }
}
# Check AUR helper
AHELPR=""
AHELPRUPDATE=""
if [[ -z "$AHELPR" ]]
then
if [[ -f /usr/bin/paru ]]
then
AHELPR="paru"
AHELPRUPDATE="paru -Sua"
elif [[ -f /usr/bin/yay ]]
then
AHELPR="yay"
AHELPRUPDATE="yay -a"
else
printf "Suitable AUR Helper not found.\nPlease install \"paru\" or \"yay\" to continue."
exit 1
fi
fi
# Create the helper files
Help
KBINDS
### Official Repo
# Get Official package list, sort, mark installed, preview infos and finally hand off to pacman for install
Official() {
printf "Setting things up..."
sort <(comm -23 <(expac -S '%-20n\t%d' | sort) <(expac '%-20n\t%d' | sort)) <(comm -12 <(expac -S '%-20n\t%d' | sort) \
<(expac '%-20n\t%d' | sort) | awk -F"\t" '{print $1"\033[32m*\033[0m ", $2}') &>/dev/null > /tmp/fpf-packages
fzf -q "$1" -e -m \
--preview='cat <(pacman -Si {1}) <(pacman -Fl {1} | awk "{print \$2}")' \
--preview-window=55%:wrap:border-sharp \
--layout=reverse \
--marker='>>' \
--header="$(echo -e '\n Select packages to install\n (use TAB to toggle selection)\n\n')" \
--info=hidden \
--ansi \
--margin="2%,1%,2%,1%" \
--cycle \
--tiebreak=begin,chunk,length \
--bind 'focus:transform-preview-label:echo ⌇ {1} ⌇' \
--bind=ctrl-k:preview:"cat /tmp/fpf-kbinds" \
--bind=ctrl-h:preview:"cat /tmp/fpf-help" \
--bind 'ctrl-/:change-preview-window(hidden|)' \
--bind ctrl-n:next-selected,ctrl-b:prev-selected < /tmp/fpf-packages |
awk '{print $1}' |
sed -e 's/\*$//' |
xargs -ro sudo pacman -S
}
# List installed pkgs
Installed() {
expac '%-20n\t%d' |
fzf -q "$1" -e -m \
--preview='cat <(pacman -Qik {1}) <(echo "") <(pacman -Fl {1} | awk "{print \$2}")' \
--preview-window=65%:wrap \
--layout=reverse \
--marker='>>' \
--header="$(echo -e '\n Select packages to print info\n (use TAB to toggle selection)\n\n')" \
--info=hidden \
--ansi \
--margin="2%,1%,2%,1%" \
--cycle \
--bind 'focus:transform-preview-label:echo ⌇ {1} ⌇' \
--bind=ctrl-k:preview:"cat /tmp/fpf-kbinds" \
--bind=ctrl-h:preview:"cat /tmp/fpf-help" \
--bind 'ctrl-/:change-preview-window(hidden|)' \
--bind ctrl-n:next-selected,ctrl-b:prev-selected |
awk '{print $1}' |
xargs -ro pacman -Qik
}
# Remove installed pkgs
Remove() {
expac '%-20n\t%d' |
fzf -q "$1" -e -m \
--preview='cat <(pacman -Si {1} 2>/dev/null || yay -Qi {1} 2>/dev/null || paru -Qi {1}) <(pacman -Ql {1} | awk "{print \$2}")' \
--preview-window=65%:wrap \
--layout=reverse \
--marker='>>' \
--header="$(echo -e '\n Select packages to remove\n (use TAB to toggle selection)\n\n')" \
--info=hidden \
--ansi \
--margin="2%,1%,2%,1%" \
--cycle \
--bind 'focus:transform-preview-label:echo ⌇ {1} ⌇' \
--bind=ctrl-k:preview:"cat /tmp/fpf-kbinds" \
--bind=ctrl-h:preview:"cat /tmp/fpf-help" \
--bind 'ctrl-/:change-preview-window(hidden|)' \
--bind ctrl-n:next-selected,ctrl-b:prev-selected |
awk '{print $1}' |
xargs -ro sudo pacman -Rsn
}
# Update installed pkgs
Update() (
viewUpdates() {
fzf --preview='cat <(pacman -Si {1}) <(pacman -Fl {1} | awk "{print \$2}")' \
--preview-window=65%:wrap \
--layout=reverse \
--marker='>>' \
--header="$(echo -e '\nPackages with updates available:\n\n')" \
--info=hidden \
--ansi \
--margin="2%,1%,2%,1%" \
--cycle \
--bind 'focus:transform-preview-label:echo \
⌇ Commit History: https://gitlab.archlinux.org/archlinux/packaging/packages/{1}/-/commits/main ⌇' \
--bind=ctrl-k:preview:"cat /tmp/fpf-kbinds" \
--bind=ctrl-h:preview:"cat /tmp/fpf-help" \
--bind 'ctrl-/:change-preview-window(hidden|)' \
--bind ctrl-n:next-selected,ctrl-b:prev-selected < /tmp/fpf-updates > /dev/null
[[ "$(printf '\nWould you like to update? [y/N]> ' >&2; read; echo $REPLY)" == [Nn]* ]] \
&& printf "\nPlease update soon :(\n" || sudo pacman -Syu
}
checkupdates > "/tmp/fpf-updates"
[ -s "/tmp/fpf-updates" ] && viewUpdates ||
printf "\nThere are no available updates :)\n"
)
### AUR
# Get AUR package database, remove unwanted lines, sort, mark installed, preview infos and finally hand off to yay for install
Aur() {
AurFD
fzf -q "$1" -e -m \
--preview='cat <(yay -Si {1} 2>/dev/null || paru -Si {1}) <(pacman -Ql {1} 2>/dev/null | awk "{print \$2}")' \
--preview-window=55%:wrap:border-sharp \
--layout=reverse \
--marker='>>' \
--header="$(echo -e ' Select packages to install\n (use TAB to toggle selection)\n')" \
--info=hidden \
--ansi \
--margin="2%,1%,2%,1%" \
--cycle \
--tiebreak=begin,chunk,length \
--bind 'focus:transform-preview-label:echo ⌇ {1} ⌇' \
--bind=ctrl-k:preview:"cat /tmp/fpf-kbinds" \
--bind=ctrl-h:preview:"cat /tmp/fpf-help" \
--bind ctrl-n:next-selected,ctrl-b:prev-selected \
--bind 'ctrl-/:change-preview-window(hidden|)' \
--bind=ctrl-p:preview:'curl --silent https://aur.archlinux.org/cgit/aur.git/plain/PKGBUILD\?h={1}' \
--bind=ctrl-x:preview:'cat <(yay -Si {1} 2>/dev/null || paru -Si {1}) <(pacman -Ql {1} 2>/dev/null | awk "{print \$2}")' \
< /tmp/aur/fpf-packages-meta |
awk '{print $1}' |
sed -e 's/\*$//' |
xargs -ro $AHELPR -S
}
# List installed pkgs only from AUR
AurInstalled() {
AurFD
while IFS= read -r pkgName; do
grep -w "^$pkgName " /tmp/aur/fpf-packages-meta >> /tmp/aur/fpf-installed
done < <(pacman -Qqm)
fzf -q "$1" -e -m \
--preview 'cat <(pacman -Qik {1}) <(echo "") <(pacman -Ql {1} | awk "{print \$2}")' \
--preview-window=65%:wrap \
--layout=reverse \
--marker='>>' \
--header="$(echo -e ' Select packages to print info\n (use TAB to toggle selection)\n')" \
--info=hidden \
--ansi \
--margin="2%,1%,2%,1%" \
--cycle \
--bind 'focus:transform-preview-label:echo ⌇ {1} ⌇' \
--bind=ctrl-k:preview:"cat /tmp/fpf-kbinds" \
--bind=ctrl-h:preview:"cat /tmp/fpf-help" \
--bind 'ctrl-/:change-preview-window(hidden|)' \
--bind ctrl-n:next-selected,ctrl-b:prev-selected \
--bind=ctrl-p:preview:'curl --silent https://aur.archlinux.org/cgit/aur.git/plain/PKGBUILD\?h={1}' \
--bind=ctrl-x:preview:'cat <(pacman -Si {1} 2>/dev/null || yay -Qi {1} 2>/dev/null ||
paru -Qi {1}) <(pacman -Ql {1} | awk "{print \$2}")' \
< /tmp/aur/fpf-installed |
awk '{print $1}' |
xargs -ro pacman -Qik
}
# Update AUR installed pkgs
UpdateAURpkgs() (
viewAURUpdates() {
fzf --preview='cat <(yay -Si {1} 2>/dev/null || paru -Si {1}) <(pacman -Ql {1} 2>/dev/null | awk "{print \$2}")' \
--preview-window=65%:wrap \
--layout=reverse \
--marker='>>' \
--header="$(echo -e '\nPackages with updates available:\n\n')" \
--info=hidden \
--ansi \
--margin="2%,1%,2%,1%" \
--cycle \
--bind 'focus:transform-preview-label:echo ⌇ {1} ⌇' \
--bind=ctrl-k:preview:"cat /tmp/fpf-kbinds" \
--bind=ctrl-h:preview:"cat /tmp/fpf-help" \
--bind 'ctrl-/:change-preview-window(hidden|)' \
--bind=ctrl-p:preview:'curl --silent https://aur.archlinux.org/cgit/aur.git/plain/PKGBUILD\?h={1}' \
--bind=ctrl-x:preview:'cat <(pacman -Si {1} 2>/dev/null || yay -Qi {1} 2>/dev/null ||
paru -Qi {1}) <(pacman -Ql {1} | awk "{print \$2}")' < "/tmp/aur/fpf-updates" > /dev/null
[[ "$(printf '\nWould you like to update? [y/N]> ' >&2; read; echo $REPLY)" == [Nn]* ]] \
&& printf "\nPlease update soon :(\n" || $AHELPRUPDATE
rm /tmp/aur/fpf-updates
}
while true; do printf "Reading updates" & eval "$(yay -a > /tmp/aur/fpf-yay & sleep ${1:-3})"; break; done
touch "/tmp/aur/fpf-updates"; grep '^[0-9]' "/tmp/aur/fpf-yay" | cut -c 8- > "/tmp/aur/fpf-updates"
[ -s "/tmp/aur/fpf-updates" ] && viewAURUpdates ||
printf "\nThere are no available updates :)\n"
)
### ORPHANS
# List orphaned packages and remove selected
Orphans() {
[ -f /tmp/fpf-orphans ] ||
while IFS= read -r pkgName; do
expac '%-20n\t%d' "$pkgName" >> /tmp/fpf-orphans
done < <(pacman -Qtdq)
fzf -q "$1" -e -m \
--preview='cat <(pacman -Qik {1} 2>/dev/null || yay -Qi {1} 2>/dev/null ||
paru -Qi {1}) <(pacman -Ql {1} | awk "{print \$2}")' \
--preview-window=65%:wrap \
--layout=reverse \
--marker='>>' \
--header="$(echo -e ' Select packages to remove\n (use TAB to toggle selection)\n')" \
--info=hidden \
--ansi \
--margin="2%,1%,2%,1%" \
--cycle \
--bind 'focus:transform-preview-label:echo ⌇ {1} ⌇' \
--bind=ctrl-k:preview:"cat /tmp/fpf-kbinds" \
--bind=ctrl-h:preview:"cat /tmp/fpf-help" \
--bind ctrl-n:next-selected,ctrl-b:prev-selected \
--bind 'ctrl-/:change-preview-window(hidden|)' \
< /tmp/fpf-orphans |
awk '{print $1}' |
xargs -ro sudo pacman -Rsn
} }
### MAIN ### MAIN
# Update the files database while getopts ":yh" option; do
UpdateInfos case $option in
# Test for AUR option, if not run with pacman
if [[ ! "$1" =~ ^- ]]; then y) yay -Sl | awk '{print $2($4=="" ? "" : " *")}'| fzf -e -m --preview 'cat <(yay -Si {1}) <(yay -Fl {1} | awk "{print \$2}")' --layout=reverse | xargs -ro -n1 yay -S
Official "$1" exit;;
else
for opt in "$@"; do h) Help
case $opt in exit;;
-a|--aur)
Aur "$2" \?) echo "Error: Invalid option"
;; exit;;
-l|--list-installed)
Installed "$2" esac
;; done
-la|--list-aur-installed)
AurInstalled "$2" pacman -Sl | awk '{print $2($4=="" ? "" : " *")}'| fzf -e -m --preview 'cat <(pacman -Si {1}) <(pacman -Fl {1} | awk "{print \$2}")' --layout=reverse | xargs -ro -n1 sudo pacman -S
;;
-o|--orphans)
Orphans "$2"
;;
-R|--remove)
Remove "$2"
;;
-U|--update)
Update
;;
-Ua|--update-aur)
UpdateAURpkgs "$2"
;;
-h|--help)
Help
cat "/tmp/fpf-help"
;;
-*)
Help
sed -i "2s/.*/Invalid Usage/" /tmp/fpf-help
head -n 13 "/tmp/fpf-help"
;;
esac
done
fi

BIN
fpf.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 MiB

7
fpf.service Normal file
View File

@ -0,0 +1,7 @@
[Unit]
Description=Sync files database
[Service]
Type=oneshot
User=root
ExecStart=/usr/bin/sh -c 'pacman -Fy'

8
fpf.timer Normal file
View File

@ -0,0 +1,8 @@
[Unit]
Description=Periodically sync files database
[Timer]
OnUnitInactiveSec=24hours
[Install]
WantedBy=multi-user.target