在默认配置下巴什在乌班图,当您键入未安装的软件名称时,巴什解释了如何安装可执行文件(如果存在),或者如何安装名称非常接近的可执行文件(如果不存在)。例如与emacs(我的机器上没有安装):
$ emacx
No command 'emacx' found, did you mean:
Command 'emacs' from package 'emacs23-lucid' (universe)
Command 'emacs' from package 'e3' (universe)
Command 'emacs' from package 'emacs23-nox' (main)
Command 'emacs' from package 'emacs24' (main)
Command 'emacs' from package 'emacs24-nox' (main)
Command 'emacs' from package 'emacs23' (main)
Command 'emacs' from package 'jove' (universe)
Command 'emacs' from package 'emacs24-lucid' (universe)
emacx: command not found
$ emacs
The program 'emacs' can be found in the following packages:
* emacs23
* emacs23-nox
* emacs24
* emacs24-nox
* e3
* emacs23-lucid
* emacs24-lucid
* jove
Try: sudo apt-get install <selected package>
根据我当前的 zsh 配置,我得到:
$ emacx
zsh: command not found: emacx
$ emacs
zsh: command not found: emacs
当已安装软件的名称出现错误时,行为也会有所不同。说我要启动编辑器代替克编辑。和巴什,我得到:
$ kedit
No command 'kedit' found, did you mean:
Command 'xedit' from package 'x11-apps' (main)
Command 'edit' from package 'mime-support' (main)
Command 'nedit' from package 'nedit' (universe)
Command 'gedit' from package 'gedit' (main)
Command 'jedit' from package 'jedit' (universe)
Command 'medit' from package 'medit' (universe)
Command 'ledit' from package 'ledit' (main)
kedit: command not found
使用 zsh 时我得到:
$ kedit
zsh: correct 'kedit' to 'edit' [nyae]?
所以,我的问题是:
- 是否有可能有类似的行为嘚与巴什当尝试启动尚未安装的可执行文件时?如果是,怎么办?
- 当出现打字错误时,是否可以显示所有可能性,而不是给出一个可能错误的更正?
答案1
Debian(可能还有 Ubuntu)的默认 zsh 配置只是不包含对command-not-found
默认软件包的支持。
为了拥有相同的功能,您只需通过以下方式获取/etc/zsh_command_not_found
默认~/.zshrc
值:
[ -f /etc/zsh_command_not_found ] && . /etc/zsh_command_not_found
这应该加载并command-not-found
启用zsh
.
答案2
我想指出的是
[[ -e /etc/zsh_command_not_found ]] && source /etc/zsh_command_not_found
几乎是正确答案。然而,有一个小问题。
对于某些命令,它绝对不返回结果。例如,在 bash 中尝试以下命令:
$ muxy
muxy: command not found
$ mury
mury: command not found
但对于 zsh 你什么也得不到。没有错误消息。
$ muxy
$ murez
不用担心,解决方案就在/etc/zsh_command_not_found
文件中。
if [[ -x /usr/lib/command-not-found ]] ; then
if (( ! ${+functions[command_not_found_handler]} )) ; then
function command_not_found_handler {
[[ -x /usr/lib/command-not-found ]] || return 1
/usr/lib/command-not-found --no-failure-msg -- ${1+"$1"} && :
}
fi
fi
这里的问题在于--no-failure-msg
.把它去掉,问题就解决了。
我所做的是,[[ -e /etc/zsh_command_not_found ]] && source /etc/zsh_command_not_found
我不使用 ,而是将以下几行放入 .zshrc 文件中。
if [[ -x /usr/lib/command-not-found ]] ; then
if (( ! ${+functions[command_not_found_handler]} )) ; then
function command_not_found_handler {
[[ -x /usr/lib/command-not-found ]] || return 1
/usr/lib/command-not-found -- ${1+"$1"} && :
}
fi
fi