zshウィジェットで呼び出される関数にいつ「emulate -LR zsh」を含める必要がありますか?

zshウィジェットで呼び出される関数にいつ「emulate -LR zsh」を含める必要がありますか?

~/.zshrc以下のコードに含めました。

fancy-ctrl-z () {
  if [[ $#BUFFER -eq 0 ]]; then
    bg
    zle redisplay
  else
    zle push-input
  fi
}
zle -N fancy-ctrl-z
bindkey '^Z' fancy-ctrl-z

...私は今回答この問題について何かを確認するときに半分だけ入力されたコマンドを覚えておいてください

動作しますが、元のコードには次の文が含まれています。

emulate -LR zsh

理解し、オプションを見つけるためにemulate内部コマンドを探しています。man zshbuiltins-L-R

emulate -R zshすべてのオプションをデフォルト値にリセットしているようです。これを確認しました。

vimdiff <(setopt) <(emulate -R zsh; setopt)

ただし、emulate -R zsh対話型シェルで実行するとオプションが明示的にリセットされるため、オプションの新しい値を現在の関数(存在する場合)にローカルにするために-Lフラグが必要な場所だと思います。

これは、オプションがグローバルオプションに加えてローカル値を持つことができ、競合が発生した場合にローカルオプションが優先されるという意味にも見えます。

したがって、emulate -LR zshウィジェットの作成者が関数が呼び出されたときにオプションが何であるか疑問に思ったり(関数の先頭から)保存してから復元(関数の先頭で)する必要のないデフォルトおよび予測可能なオプション値でローカル環境を再作成するために使用されます。 。 end)ウィジェットの期待される動作を変更できるすべてのオプション。

その行がなくても動作しているようで、コピーしませんでした。しかし、このコマンドの私の理解が正しいこと、そして誰かがemulate -LR zsh副作用を避けるべき簡単な例や2つを提供できるかどうかを知りたいです。

ベストアンサー1

あなたの理解は正しいです。

emulate -R zshすべてのオプションをzshデフォルトにリセットします。この-Lフラグは、それを含む関数に対してローカルにします(より一般的には、すべてのオプションの変更をその関数に対してローカルにします)。

emulate -LR zshオプションが異なる可能性があるコンテキスト(特に対話型シェル)で関数を使用する必要がある場合は、関数定義を始めの近くに配置するのが衛生的です。

この特別なケースでは、emulate -LR zshコードはオプションの影響を受けないため、必要ありません。しかし、それは何の害もありません。

以下は、ユーザーが初期化ファイルで設定したり、関数を呼び出したり潜在的に関数を中断したりする周辺コードによって無効にできるオプションの例です。

  • 閉鎖bare_glob_qualglob修飾子の誤った使用。
  • 閉鎖care_globまたはcase_match関数内で意味がなくても、特定のパターンマッチングでは大文字と小文字が区別されません。
  • null_globそしてcsh_null_globどのファイルとも一致しない glob パターンの動作に影響を与えます。
  • numeric_glob_sortアルファベット順に拡張されたパターンを必要とする機能が中断される可能性があります。
  • err_exitそしてunset関数のコードがデフォルトの動作(コマンドの状態を無視し、未定義の変数を空白として扱う)を実行しようとすると、エラーが発生する可能性があります。

おすすめ記事