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