私が見たところ、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 モードがあったため、おそらくそれより前から存在していました)。
ではzsh
、bindkey
1991 年に zle の最初のバージョンに付属していた 2.0 で追加されました (以前のバージョンで使用されていた 1.0readline
は から借用されましたbash
)。
zsh
、最初の 1.0 バージョンではオプションを設定する必要があったため( /Bournesetopt
のようにコマンドラインで渡されるオプションに加えて)、 とは代わりに特殊変数を使用していました。2.0 では、 との互換性のためにオプション (インタープリタと組み込みの両方に) が追加されました(自体は、特殊変数を 2.0 の新しい組み込みで 1996 年に設定されるオプションに変換しました。これは、 で設定されるオプションとは別のセットです。サポートは 1990 年頃に追加されました)。csh
(t)csh
bash
-o
set
ksh
bash
shopt
set -o
set -o
および「オプション」vi
はemacs
2003年までzshに追加されましたemacs
ただし、バージョン 4.1.1 では、オプションを設定するとモードが無効になるため、「オプション」パラダイムはこれにはあまり適していませんvi
。
zsh -o emacs
起動時にzshが報告する内容がzsh -o vi
現在正しく動作していないことに気づくでしょうzsh: invalid module name `zsh/zle'
(バグ)。
を含むほとんどのシェルは、および環境変数zsh
の値に基づいてデフォルトの編集モードを選択し、行編集モードをユーザーのエディター設定に一致させようとします。$EDITOR
$VISUAL