能否异步更新PowerShell提示符?

6
我喜欢在PowerShell提示符中包含Mercurial/Git仓库状态。有时这会严重减慢prompt()函数的速度,导致你必须长时间等待才能在shell中开始输入。我想知道,是否可以异步更新提示符?
理想情况下应该是:
  1. Write-Host 当前目录(典型的提示符)
  2. 在后台开始收集仓库状态。
  3. 当收集到仓库状态时,假设没有再次调用prompt,将仓库状态插入提示符中。
有人做过这个吗?

我想它应该像这样工作。 1.prompt() 中使用 Start-Job(取消任何已经运行的提示作业),并且 2. 将光标位置传递给作业,以便作业知道在 shell 中插入文本的位置。我只是不确定它如何处理用户在提示出现后可能键入的重新格式化文本。 - joshuapoehls
2
我喜欢这个想法;重新排版看起来需要花费很多功夫。一个小技巧是使用两行提示符。第一行用于显示状态等信息,而第二行则用于获取实际用户输入... - John Weldon
我完全可以接受两行。好想法。也许要试一试... - joshuapoehls
1
您也可以考虑将信息放在标题中 - 当您输入时不会受到影响,因此应该更容易实现。 - BartekB
你看过这个吗?http://www.hanselman.com/blog/PromptsAndDirectoriesEvenBetterGitAndMercurialWithPowerShell.aspx - Andy Arismendi
1个回答

5
并非完全如此。由于提示只返回文本,并且在每次完成顶级命令时在主机中调用,因此无法异步更新提示。
您可以重写提示以执行诸如检查数据源或异步更新的变量之类的操作。因此,在运行命令时,提示不会保持更改,但它也不会挂起一段时间,因为它只会查找数据。
更棘手的问题是,这涉及尝试事后窥视执行结果的游戏。 PowerShell 不会保存它们,除非将它们分配给某些内容。 因此,要正确执行此操作,必须覆盖 Out-Default(仅在 ISE、PowerGUI 等中有效,而不是 powershell.exe)。 覆盖它并不难,但需要了解大量 PowerShell 术语,即使对于我来说也很印象深刻。
好消息是,我已经考虑了很多,并编写了一个模块来执行大部分操作,我正在确定我将如何处理它以及它是否加入我们构建的其他模块。
我会在完成后进行更新,但此路线图应该会有所帮助。
简短的回答是,您无法异步更新提示,但您可以使其非常快速,并且执行此操作所需的技巧打开了许多更酷的门。
希望这可以帮助您。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接