`set -o emacs` と `bindkey -e` の違いは何ですか?

`set -o emacs` と `bindkey -e` の違いは何ですか?

私が見たところ、set -o emacsと は両方ともbindkey -e、ターミナル ライン エディターの動作を変更して をエミュレートするために使用されますemacsが、set -o viと はキーバインドbindkey -vをエミュレートするために使用されますvi。 とset -oはどちらもbindkey同じことを行うように見えるので、この 2 つの違いは何なのか、また違いがまったくないのか疑問に思いました。

set -oはほとんどのシェルで機能するようです。一方、 は特定のコマンドbindkeyですzle。これが唯一の違いですか? また、同じキーがバインドされていますか、それともset -o異なるbindkey操作にバインドされているキーがいくつかありますか?

答え1

bindkey -v/-eは構文ですtcsh(bindkey組み込みは 1990 年に 5.19PL2 で tcsh に追加されました)。set -o vi/emacsは ksh 構文です (ksh85 にすでに存在していましたが、ksh には少なくとも 1983 年には emacs/vi モードがあったため、おそらくそれより前から存在していました)。

ではzshbindkey1991 年に zle の最初のバージョンに付属していた 2.0 で追加されました (以前のバージョンで使用されていた 1.0readlineは から借用されましたbash)。

zsh、最初の 1.0 バージョンではオプションを設定する必要があったため( /Bournesetoptのようにコマンドラインで渡されるオプションに加えて)、 とは代わりに特殊変数を使用していました。2.0 では、 との互換性のためにオプション (インタープリタと組み込みの両方に) が追加されました(自体は、特殊変数を 2.0 の新しい組み込みで 1996 年に設定されるオプションに変換しました。これは、 で設定されるオプションとは別のセットです。サポートは 1990 年頃に追加されました)。csh(t)cshbash-osetkshbashshoptset -oset -o

および「オプション」viemacs2003年までzshに追加されましたemacsただし、バージョン 4.1.1 では、オプションを設定するとモードが無効になるため、「オプション」パラダイムはこれにはあまり適していませんvi

zsh -o emacs起動時にzshが報告する内容がzsh -o vi現在正しく動作していないことに気づくでしょうzsh: invalid module name `zsh/zle'バグ)。

を含むほとんどのシェルは、および環境変数zshの値に基づいてデフォルトの編集モードを選択し、行編集モードをユーザーのエディター設定に一致させようとします。$EDITOR$VISUAL

関連情報