如何配置 zsh 让它向我解释在哪里可以检索可执行文件而不是说找不到文件?

如何配置 zsh 让它向我解释在哪里可以检索可执行文件而不是说找不到文件?

在默认配置下巴什乌班图,当您键入未安装的软件名称时,巴什解释了如何安装可执行文件(如果存在),或者如何安装名称非常接近的可执行文件(如果不存在)。例如与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

相关内容