2012-05-31 16 views
6

私はPowerShellプロンプトにMercurial/Git repoステータスを含めるのが好きです。場合によってはprompt()の機能がかなり遅くなるため、シェルでの入力を開始するまでに時間がかかります。私はそれが非同期プロンプトを更新することは可能ですか?PowerShellのプロンプトを非同期に更新することはできますか?

理想的には、希望:

  1. Write-Hostカレントディレクトリ(典型的なプロンプト)
  2. スタートがバックグラウンドでレポ状況を収集。
  3. レポステータスが収集されると、promptが再度呼び出されなかったと仮定して、プロンプトにrepoステータスを挿入します。

誰もこれまでに行ったことはありますか?

+0

このようなことが起こると思います。 ** 1。** 'prompt()'の '' Start-Job'(既に実行中のプロンプトジョブのキャンセル)、** ** 2。**カーソルの位置をジョブに渡して、ジョブがテキストをどこに挿入するかを知るようにします。シェル。プロンプトが表示された後にユーザーが入力した可能性のあるテキストのリフローを処理する方法がわかりません。 – joshuapoehls

+2

私はこの考えが好きです。リフロー部分をするのはたくさんの仕事のようです。 1つのハックは、2行のプロンプトを持つことです。最初の行はステータスなどで、2行目は実際のユーザー入力が行くところです... –

+0

私は間違いなく2行で大丈夫でしょう。良い考え。これを試してみる必要があるかもしれません... – joshuapoehls

答えて

5

それ自体ではありません。

プロンプトがテキストを返すだけなので、プロンプトを非同期に更新することはできません。また、トップレベルのコマンドが実行されるたびにホストで呼び出されます。

データソース、または非同期に更新する変数を確認するようなプロンプトを書き直すことができます。したがって、コマンドが実行されている間はプロンプトは変更されず、データを参照するだけなので、しばらくはハングしません。

これより難しいのは、事実の後に実行結果を覗いてみるというゲームに入るということです。 PowerShellは、何かに割り当てられていない限り、それらを保持しません。このためにはOut-Defaultをオーバーライドする必要があります(これは、powershell.exeではなく、ISE、PowerGUIなどでのみ有効です)。これを無効にすることはそれほど難しいことではありませんが、私の印象的な標準によっても、多くのPowerShellブードゥーを知る必要があります。

明るい側では、私は明らかにこれをたくさん考えてきましたが、これを多く行うモジュールを持っています。私はそれをどうしたらいいのか、独自のモジュールにとどまるか、または構築する他のモジュールの1つに結合します。

私はこれを更新する際にこれを更新しますが、このロードマップはかなり役立ちます。

短い答えは、非同期のプロンプトを更新することはできませんが、速くすることができ、そうするために必要なトリックが多くのクーラードアを開くことです。

希望します。

関連する問題