zshにクロージャのようなものがありますか?

zshにクロージャのようなものがありますか?

私はoh-my-zshでzshを試すことにしましたが、precmd最後の行に正しいプロンプトがない2行のプロンプトをエミュレートしようとしています。

だから基本テーマを複製してインスピレーションを得ました。この投稿(私はそれをたくさん学ぶためにも使います)、私は次のようにしました(後で色を追加します):

function precmd {
    local cwd="${(%):-[%~]}"
    local who_where="${(%):-%n@%m}"
    local git_info=${(%)$(git_prompt_info)}
    local right_prompt="     $git_info [$who_where]"
    local left_prompt="${(r:(($COLUMNS - ${#${right_prompt}})):: :)cwd}"

    echo "$left_prompt$right_prompt"
}

効果があるしかし、不思議ではありません。 precmdが呼び出されるたびにzshはこれらすべての変数を定義しますか?

私はzshに関連するクロージャ、スコープ、名前空間についてインターネット検索を行っており、変数を毎回上書きする必要がないようにローカル変数をprecmdにデータとして追加したいと思いましたが、何も見つかりませんでした。私がやっていることをする方法がありますか、それともあきらめなければなりませんか?

参考までに関連性がある場合にのみ、「関数のロード」とはどういう意味ですか?

ベストアンサー1

Zshにはクロージャ、パッケージ、名前空間などはありません。 Zshには、実際のクロージャを実装するために必要なものがありません。

  • 機能は最高レベルではありません。関数を他の関数に引数として渡すことはできず、関数は他の関数を返すことはできません。 (これは次の方法で行うことができます。名前呼び出す関数の名前ですが、関数自体を渡すのとは異なります。

  • 入れ子になった関数はありません。 zshのすべての機能はグローバルです。競合を避けるには、関数名の前にプレフィックスを付ける必要があります。特に、この機能は同じ名前の外部プログラムを隠すことに注意してください。という関数があると、lsプログラムの代わりにその関数が呼び出されますls。間違えない限り、これは役に立ちます。

  • 変数の範囲は、ほとんどの現代言語のように静的ではなく動的です。入れ子になった関数があっても、内部関数は通常予想される方法で外部関数のローカル変数を閉じません。人々がJavascriptを使用するようにモジュールを作成するために使用することはできません。

  • ジッシュする匿名関数もありますが、他に何もなければあまり役に立ちません。

したがって、基本的に最善の方法は、すべての関数とグローバル変数に接頭辞を付けることです。

precmdまた、次のように定義する必要があることを指摘したいと思います。

% autoload -Uz add-zsh-hook
% add-zsh-hook precmd my_precmd_function

add-zsh-hookprecmdリンクしたい他の関数を上書きせずに関数をリンクできますprecmd

関数のロードが何を意味するかは別の質問です。 Zshには、実際に呼び出されたときにのみディスクから関数をロードする自動ロード機能があります。これにより、autoload -Uz foobar名前付き関数を呼び出すことができます。foobar実際に呼び出すと、foobar定義はディスクからロードされます。

おすすめ記事