ファイルが見つからないと言う代わりに、実行可能ファイルを検索できる場所を説明するようにzshを設定するにはどうすればよいですか?

ファイルが見つからないと言う代わりに、実行可能ファイルを検索できる場所を説明するようにzshを設定するにはどうすればよいですか?

基本構成強く打つ存在するUbuntu、インストールされていないソフトウェアの名前を入力すると、強く打つ実行可能ファイルがある場合はインストールする方法、ない場合は非常に似た名前の実行可能ファイルをインストールする方法について説明します。例えば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

command-not-foundDebian(およびおそらくUbuntu)のデフォルトのzsh設定には、基本パッケージのサポートは含まれていません。

同じ機能を使用するには、次の方法で/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を使用するのではなく、.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

関連情報