Makefile completion on steroids!
I had 2 problems with the normal completions:
Problem #1
Sometimes you have targets you want to call like make greet:hi and make greet:hola sort of like namespacing Makefile target names. So your Makefile ends up looking like:
greet\:hola:
echo "hola world"
# OR a .PHONY target
.PHONY: greet\:hi
greet\:hi:
echo "hi world"
In this case the auto-completions after : don't show up as it uses \: in the Makefile as shown above.
Problem #2
There wasn't a way to navigate through the list of all Makefile targets that match my input using arrow keys (or CTRL-p / CTRL-n) in my bash shell.
Basically, I wanted to use fuzzy search like approach on the targets (i.e. fzf).
FZF Repo: https://github.com/junegunn/fzf
Solution
Install FZF Dependency
Using Homebrew
You can use Homebrew (on macOS or Linux)
to install fzf.
brew install fzf
$(brew --prefix)/opt/fzf/install
Using Linux package managers
| Package Manager |
Linux Distribution |
Command |
| APK |
Alpine Linux |
sudo apk add fzf |
| APT |
Debian 9+/Ubuntu 19.10+ |
sudo apt-get install fzf |
| Conda |
|
conda install -c conda-forge fzf |
| DNF |
Fedora |
sudo dnf install fzf |
| Nix |
NixOS, etc. |
nix-env -iA nixpkgs.fzf |
| Pacman |
Arch Linux |
sudo pacman -S fzf |
| pkg |
FreeBSD |
pkg install fzf |
| pkgin |
NetBSD |
pkgin install fzf |
| pkg_add |
OpenBSD |
pkg_add fzf |
| XBPS |
Void Linux |
sudo xbps-install -S fzf |
| Zypper |
openSUSE |
sudo zypper install fzf |
FZF and : compatible auto-complete command
Put this in your .bashrc
complete -W "\`grep -oE '^[a-zA-Z0-9_.-]+[\\:]*[a-zA-Z0-9_.-]+:([^=]|$)' ?akefile | sort | uniq | sed 's/[^a-zA-Z0-9_.-]*$//' | sed 's/[\]//g' | fzf\`" make
Now just typing make and then hitting the key will work!
DEMO: in action!
Then you can use as following:
make using fzf