我的目标是编写一个函数,该函数的行为类似于调用 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}