在PSReadline中重新绑定转换为Vi模式

时间:2016-09-17 13:22:47

标签: powershell psreadline

我已经为PowerShell安装了PSReadline模块,以便在PowerShell中从Bash获取Keybindings。我启用了Vi-Mode,它运行良好。

问题是:在Vim中我总是使用j,k来退出插入模式。这意味着:首先我输入j然后k非常快。如果我真的想输入j和k,那么我只需在输入j后等待超时。

如何在PSReadline的Vi模式下执行相同的操作?我已经尝试过:Set-PSReadlineKeyHandler -Chord 'j', 'k' ViCommandMode,但我再也无法输入jk了。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

要实现此目的,请将以下内容放入$ Profile中:

Set-PSReadLineKeyHandler -Chord 'j' -ScriptBlock {
  if ([Microsoft.PowerShell.PSConsoleReadLine]::InViInsertMode()) {
    $key = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
    if ($key.Character -eq 'k') {
      [Microsoft.PowerShell.PSConsoleReadLine]::ViCommandMode()
    }
    else {
      [Microsoft.Powershell.PSConsoleReadLine]::Insert('j')
      [Microsoft.Powershell.PSConsoleReadLine]::Insert($key.Character)
    }
  }
}

但是,这可能会导致粘贴'j'时出现问题。

答案 1 :(得分:1)

我很惊讶这个问题没有得到普及。 Corben答案的问题在于,按下“ j”后,如果按下的下一个键是return或ctrl之类的修饰符,则会插入文字而不是您期望使用的键。

我重新编写了解决这两个问题的答案,并将其转换为使重用更加容易的功能(例如,在绑定两个不同的字母(例如jk)时)。

{($.errorCode="*UnauthorizedOperation") || (($.errorCode="AccessDenied*") && (($.userIdentity.type!="AssumedRole") || ($.userAgent!="[AWSConfig]")))}