27

Can the zsh shell be configured to show what bash shows when a command does not exist, similarly to this:

kahless:~$ sysv-rc-conf  
The program 'sysv-rc-conf' is currently not installed.  You can install it by typing:  
sudo apt-get install sysv-rc-conf

rather than the ZSH prompt:

[kahless /home/teward]% sysv-rc-conf  
zsh: command not found: sysv-rc-conf

Note I do not want to change the prompt itself, but I want to change the result from zsh: command not found to a bash-like output of The program 'progname' is currently not installed. You can install it by typing: or similar.

Is this possible with ZSH?

Braiam
  • 67,791
  • 32
  • 179
  • 269
Thomas Ward
  • 74,764

5 Answers5

26

This feature is provided by the command-not-found Install command-not-found package. Ubuntu installs it by default, and makes it active by default in bash but not in zsh. Just add this line to your ~/.zshrc:

. /etc/zsh_command_not_found
Seth
  • 58,122
  • This solution worked. Is there a way to get rid of a line in the output, then? (note that it was included in the output, as was the The program 'progname' is currently not installed. You can install it by typing: part) zsh: command not found: sysv-rc-conf – Thomas Ward Apr 14 '11 at 23:01
  • @EvilPhoenix: Anywhere would do (except inside a function or something obviously). I don't know about removing the zsh: command not found line. – Gilles 'SO- stop being evil' Apr 14 '11 at 23:05
  • Okay, i can probably ignore the "command not found part". Because the suggest installation part is nice, and its nice to knokw that it came up because a command didnt exist ;) – Thomas Ward Apr 14 '11 at 23:56
  • to turn of the command not found message you can add exit at the end of the function command_not_found_handler in /etc/zsh_command_not_found. – jens_bo Jan 22 '13 at 08:12
4

Note that you might want to add a check if the file exists if you are sharing your .zshrc across distributions that do not have a /etc/zsh_command_not_found file:

[[ -a "/etc/zsh_command_not_found" ]] && . /etc/zsh_command_not_found

Also, in case you're using oh-my-zsh, there already is a plugin, command-not-found, that you can add to your plugins variable that does the same thing.

zgerd
  • 141
3

If you are using oh-my-zsh, you can just instead look for "plugins" inside your .zshrc.

Add the command-not-found plugin to the list of plugins to autoload (this plugin is already installed by default).

Like this:

# Which plugins would you like to load? (plugins can be found in ~/.oh-my-zsh/plugins/*)
# Custom plugins may be added to ~/.oh-my-zsh/custom/plugins/
# Example format: plugins=(rails git textmate ruby lighthouse)
# Add wisely, as too many plugins slow down shell startup.
plugins=(git command-not-found)
Pablo Bianchi
  • 15,657
qaisjp
  • 131
0

The way it works is through the command_not_found_handle() function in bash. bash provides a hook which is basically a function that is invoked when a command is not found. Ubuntu's bash implementation traps it and does a package search, while Debian's bash does not (and same with zsh). You may want to check out zsh's manpage to see if that has a similar function.

Here is how you can get started, hoping zsh is similar.

mpandit@mpandit-ubuntu:~$ command_not_found_handle() {echo 'Handler: Command not found!';}
mpandit@mpandit-ubuntu:~$ ddaadada
'Handler: Command not found!
mpandit@mpandit-ubuntu:~$
  • This isn't a difference in Debian and Ubuntu's bash. The difference is that Ubuntu installs command-not-found by default and Debian doesn't. The feature already exists for zsh as well, it's just not activated by default. – Gilles 'SO- stop being evil' Apr 14 '11 at 22:49
  • This assumes that command_not_found is not included in the system. However it is not what I'm looking for. Having said that, the answer from @Gilles is more along the lines of what i'm looking for, i'm just trying to figure out where to include the line he specified. – Thomas Ward Apr 14 '11 at 22:57
  • It's called command_not_found_handler in zsh. See http://zsh.sourceforge.net/Doc/Release/Command-Execution.html. – Mikel Aug 12 '14 at 17:20
0

Also if you don't want zsh to have this behavior 100% of the time you can just manually do something like:

/usr/lib/command-not-found urxvt

or add command-not-found to your $PATH