26

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)
Bhaskar Kandiyal
  • 978
  • 1
  • 10
  • 20

2 Answers2

25

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

peterh
  • 11,875
  • 18
  • 85
  • 108
Bhaskar Kandiyal
  • 978
  • 1
  • 10
  • 20
  • 4
    Just to be clear. I already had command-not-found installed and all I needed add was the following to.zshrc `source /etc/zsh_command_not_found` – Sam Feb 03 '14 at 11:43
0

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

Aldo Bassanini
  • 475
  • 4
  • 16