Zsh Package Suggestion

Viewed 4772

I've just migrated to Zsh from Bash, but I have a bit of a problem in it. In bash on an Ubuntu system, when I type the name of a command which does not exist, Bash searches the apt database for a matching command name and prints out the package names that provide that command. It's a really useful feature, so I was wondering if something like that could be implemented in Zsh using a script or something?

Here's an example:

$>xmms2
The program 'xmms2' is currently not installed.  You can install it by typing:
sudo apt-get install xmms2-client-cli

Or if the command is not an exact match:

$>xmms
No command 'xmms' found, did you mean:
Command 'lmms' from package 'lmms' (universe)
Command 'xmms2' from package 'xmms2-client-cli' (universe)
Command 'xmds' from package 'xmds' (universe)
Command 'xdms' from package 'xdms' (universe)
2 Answers

As suggested by Michał Politowski, I'll answer my own question and mark it as solved :)

To get this functionality in zsh install a package named "command-not-found" (I don't know about other distro's, but in Ubuntu it's in the repositories).

NOTE: In Ubuntu 12.04 this package is installed by default.

sudo apt-get install command-not-found

And then you will need to edit your .zshrc and then source in the file /etc/zsh_command_not_found by adding the following line in your .zshrc

source /etc/zsh_command_not_found

On MacOs, this is the brew formula ;)

brew tap homebrew/command-not-found

And add at the bottom of ~/.zshrc

HB_CNF_HANDLER="$(brew --repository)/Library/Taps/homebrew/homebrew-command-not-found/handler.sh"
if [ -f "$HB_CNF_HANDLER" ]; then
source "$HB_CNF_HANDLER";
fi

Complete reference: https://github.com/Homebrew/homebrew-command-not-found

Related