我的目标是编写一个函数,该函数与调用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 / ...但是没有一个组合可以解决这个问题。使用Set-PSReadlineKeyHandler -Key 'Ctrl+P' -ScriptBlock {Invoke-Foo}
将函数作为PsReadline键处理函数调用然后按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}
答案 0 :(得分:1)
您需要使用自定义键处理程序或模拟我认为的键盘输入。
我建议重新绑定回车。如果命令行与您的命令匹配,请运行您的命令并替换命令行。如果没有,只需调用Enter的正常处理程序。