非同期RPROMPT?

非同期RPROMPT?

私の友人はこう書いています。スタックオーバーフローで、私の考えでは、ここで答えを得る可能性が高いようです。彼の記事ではスピードが言及されていますが、私たちはgitの状態を解析するために使用するPythonスクリプトが遅いことを知っており、ある時点でそれをより速くするために書き直すつもりです。しかし、非同期設定の問題はRPROMPTまだ興味深いので、ここに彼の質問を引用したいと思います。

gitの使用を開始して以来、現在のブランチを表示するようにRPROMPTを設定しました。私は最近、un / stagedファイルの数やその他の有用な情報を一目で見るために「クール」スクリプトを使用しています。 (https://github.com/olivierverdier/zsh-git-prompt/tree/master)

1〜2週間ほど使用した後は、パフォーマンスが私を悩ませ始めました。

この情報を取得するより高速な方法はありますか、それともRPROMPTに非同期的に書き込む方法はありますか? RPROMPTが計算されている間にコマンドが入力されるのを待ちたくないので、デフォルトのプロンプトより少し遅くなるのはとても嬉しいです。

上記のスクリプトに対する攻撃はありません。私は辛抱強くない。

ベストアンサー1

以下は、バックグラウンドタスクとシグナルを使用してメッセージを非同期的に更新するソリューションです。

アイデアは、プロンプト関数がプロンプトをビルドし、それをファイルに書き込んでから親シェルに完了シグナルを送信するバックグラウンドタスクを生成することです。親シェルがシグナルを受け取ったら、ファイルからプロンプトを読み取り、プロンプトを再描画します。

プロンプト機能に次のように入力します。

function async-build-prompt {
    # Simulate a function that takes a couple seconds to build the prompt.
    # Replace this line with your actual function.
    sleep 2 && RPROMPT=$(date)

    # Save the prompt in a temp file so the parent shell can read it.
    printf "%s" $RPROMPT > ${TMPPREFIX}/prompt.$$

    # Signal the parent shell to update the prompt.
    kill --signal USR2 $$
}

# Build the prompt in a background job.
async-build-prompt &!

.zshrcに次のように入力します。

function TRAPUSR2 {
    RPROMPT=$(cat "${TMPPREFIX}/prompt.$$")

    # Force zsh to redisplay the prompt.
    zle && zle reset-prompt
}

おすすめ記事