是否可以为Powershell添加键盘快捷键?

时间:2017-11-02 15:43:52

标签: powershell keyboard-shortcuts

经过几十年的bash,我已经切换到Powershell,在配置了我的个人资料(并添加了PSCX,openssl和其他一些工具)后,我一般都很开心。

我想念bash的一件事:

mkdir some-very-long-dir-name
cd (hit ESC then hit _ on the keyboard)

Escape下划线是“前一个命令的最后一项”的bash。它非常有用 - 在这个追逐中,我没有输入很长的目录名。

是否可以向PowerShell添加键盘快捷键?怎么样?

如果重要的话,我正在使用ConEmu作为我的终端。

2 个答案:

答案 0 :(得分:3)

简答:

 Set-PSReadlineKeyHandler -Key 'Escape,_' -Function YankLastArg

更长的解释:

感谢@davidbrabant和@TheIncorrigible1指向PSReadLine:它不是答案本身,但了解PSReadLine如何工作是解决这个问题的关键。

虽然vi是每个Linux发行版的默认编辑器,但bash的默认编辑模式为emacs。来自the bash docs

  

要在emacs和vi编辑模式之间交互切换,请使用'set -o emacs'和'set -o vi'命令(请参阅Set Builtin)。 Readline默认为emacs模式。

这意味着'逃避下划线'来自emacs。

奇怪的是,PSReadLine与bash不同,默认情况下不会使用emacs模式。来自the PSREADLine docs

  

要使用Emacs键绑定,您可以使用:   Set-PSReadlineOption -EditMode Emacs

它不是很明确,但这意味着另一种模式是默认的。确认,运行:

get-PSReadlineOption

返回:

EditMode                               : Vi

所以有两种解决方案:

解决方案1:更改模式

Set-PSReadlineOption -EditMode Emacs

您可以看到Get-PSReadlineKeyHandler包含标准转义下划线快捷键的效果:

Escape,_         YankLastArg                   Copy the text of the last argument to the input

逃脱下划线现在有效。

解决方案2:将快捷方式添加到现有模式

而不是改变模式(事实证明我喜欢vi keybindings!),你也可以运行:

 Set-PSReadlineKeyHandler -Key 'Escape,_' -Function YankLastArg

将其添加到现有模式。

答案 1 :(得分:2)

作为ESC+_解决方案的替代方案,PowerShell自动变量$$包含相同的信息,而无需PSReadLine(v5.0之前或没有模块)安装)。

PS C:\> Get-ChildItem -Path 'C:\'

...

PS C:\> $$

C:\

您还可以捕获与$^变量一起使用的命令:

PS C:\> $^

get-childitem