2

我的目标是编写一个函数,该函数的行为类似于调用 PsReadline 的 Ctrl-R 功能时发生的情况:在当前命令行上插入文本,但不接受该行,这样当函数返回时光标仍然在同一行线。我尝试了以下

function Invoke-Foo() {
  [Microsoft.PowerShell.PSConsoleReadLine]::Insert('foo')
}

但是当调用它时,结果是:

PS> Invoke-Foo foo
PS> <cursor position>

如果在插入文本后光标停留在该行上,那么我想要什么

PS> Invoke-Foo foo<cursor position>

我查看了其他 PSConsoleReadLine 函数(因为我认为它们是 PsReadline 处理控制台的方法?),例如 AddLine/CancelLine/... 但没有一个组合可以解决问题。起作用的是将函数调用为 PsReadline 键处理程序,Set-PSReadlineKeyHandler -Key 'Ctrl+P' -ScriptBlock {Invoke-Foo}然后按 Ctrl-P 正是我想要的。所以问题可能是:如何连接到 PsReadline 来模仿一个被调用的函数作为它的关键处理程序?

更新解决方案相当简单,感谢 Jason 的提示:只需绑定 Enter,如果正在调用 Invoke-Foo,则不要接受该行

function DealWithEnterKey() {
  $line = $null
  $cursor = $null
  [Microsoft.PowerShell.PSConsoleReadline]::GetBufferState([ref]$line, [ref]$cursor)

  if($line -match 'Invoke-Foo') {
    Invoke-Foo
  } else {
    [Microsoft.PowerShell.PSConsoleReadLine]::AcceptLine()
  }
}

Set-PSReadlineKeyHandler -Key 'Enter' -ScriptBlock {DealWithEnterKey}
4

1 回答 1

1

我认为您需要使用自定义键处理程序或模拟键盘输入。

我建议重新绑定 Enter。如果命令行与您的命令匹配,请运行您的命令并替换命令行。如果没有,只需调用 Enter 的正常处理程序。

于 2017-05-03T14:59:36.757 回答