PSReadLine
此模块替换了 PowerShell 3 及以上版本的命令行编辑体验。 它提供:
- 语法着色
- 简单的语法错误通知
- 良好的多行体验(包括编辑和历史记录)
- 可自定义的按键绑定
- Cmd 和 emacs 模式(两者均未完全实现,但均可使用)
- 许多配置选项
- Bash 风格的补全(在 Cmd 模式下为可选,在 Emacs 模式下为默认)
- Bash/zsh 风格的交互式历史记录搜索(CTRL-R)
- Emacs yank/kill ring
- 基于 PowerShell 令牌的“单词”移动和删除
- 撤销/重做
- 自动保存历史记录,包括在实时会话之间共享历史记录
- “菜单”补全(类似于 Intellisense,使用箭头选择补全项),通过 Ctrl+Space 触发
“开箱即用”的体验旨在让 PowerShell 用户感到非常熟悉——不应需要学习任何新的按键。
关于 PSReadLine 的一些优质资源:
- Keith Hill 撰写了一篇关于
PSReadLine的精彩介绍 (2013)。 - Ed Wilson (Scripting Guy) 撰写了一个关于
PSReadLine的系列 (2014-2015)。 - John Savill 有一个视频 (2021),涵盖了安装、配置以及将
PSReadLine定制为您喜欢的样子。
安装和升级
您需要 1.6.0 或更高版本的 PowerShellGet 来安装或升级到 PSReadLine 的最新预发布版本。
PowerShell 6+ 已经内置了更高版本的 PowerShellGet。
然而,Windows PowerShell 5.1 附带了一个旧版本的 PowerShellGet,它不支持安装预发布模块。
因此,Windows PowerShell 用户需要通过从提升权限的 Windows PowerShell 会话中运行以下命令来安装最新的 PowerShellGet(如果尚未安装):
Install-Module -Name PowerShellGet -Force; exit
安装 PowerShellGet 后,通过运行以下命令安装或升级到 PSReadLine 的最新预发布版本
Install-Module PSReadLine -Repository PSGallery -Scope CurrentUser -AllowPrerelease -Force
如果你只想获取最新稳定版本,请运行:
Install-Module PSReadLine -Repository PSGallery -Scope CurrentUser -Force
[!NOTE] 预发布版本将包含更新的功能和错误修复,但也可能引入新的问题。
用法
要使用 Emacs 键绑定,你可以使用:
Set-PSReadLineOption -EditMode Emacs
要查看当前的按键绑定:
Get-PSReadLineKeyHandler
有许多配置选项,请参阅 Set-PSReadLineOption 中的选项。
PSReadLine 也提供了其 cmdlet 的帮助以及一个 about_PSReadLine 主题 - 请参阅这些主题以获取更详细的帮助。
要设置您自己的自定义键绑定,请使用 cmdlet Set-PSReadLineKeyHandler。
例如,为了获得更好的历史记录体验,请尝试:
Set-PSReadLineKeyHandler -Key UpArrow -Function HistorySearchBackward
Set-PSReadLineKeyHandler -Key DownArrow -Function HistorySearchForward
使用这些绑定后,如果当前命令行为空,上箭头/下箭头将像 PowerShell/cmd 一样工作。 但是,如果你已经输入了一些文本,它将搜索以当前输入文本开头的历史命令。
要在不使用 Emacs 模式的情况下启用 bash 风格的补全,你可以使用:
Set-PSReadLineKeyHandler -Key Tab -Function Complete
这是一个更有趣的示例,展示了可以实现的功能:
Set-PSReadLineKeyHandler -Chord '"',"'" `
-BriefDescription SmartInsertQuote `
-LongDescription "Insert paired quotes if not already on a quote" `
-ScriptBlock {
param($key, $arg)
$line = $null
$cursor = $null
[Microsoft.PowerShell.PSConsoleReadLine]::GetBufferState([ref]$line, [ref]$cursor)
if ($line.Length -gt $cursor -and $line[$cursor] -eq $key.KeyChar) {
# Just move the cursor
[Microsoft.PowerShell.PSConsoleReadLine]::SetCursorPosition($cursor + 1)
}
else {
# Insert matching quotes, move cursor to be in between the quotes
[Microsoft.PowerShell.PSConsoleReadLine]::Insert("$($key.KeyChar)" * 2)
[Microsoft.PowerShell.PSConsoleReadLine]::GetBufferState([ref]$line, [ref]$cursor)
[Microsoft.PowerShell.PSConsoleReadLine]::SetCursorPosition($cursor - 1)
}
}
在本示例中,当您输入单引号或双引号时,可能会发生两种情况。
如果光标后的字符不是所输入的引号,则会插入一对匹配的引号,并将光标置于匹配的引号内部。
如果光标后的字符是所输入的引号,则光标仅移动到引号之后,而不插入任何内容。
如果您使用 VSCode、Resharper 或其他智能编辑器,这种体验会让您感到熟悉。
请注意,以这种方式编写的处理程序能正确处理撤销 - 一次撤销操作即可撤销两个引号。
示例配置文件 包含许多值得查看的优秀示例。 安装 PSReadLine 时会包含此文件。
查看 [Microsoft.PowerShell.PSConsoleReadLine] 的公共方法,以了解您可以修改的其他内置功能。
如果您想在自定义键绑定中以某种未实现的方式更改命令行,可以使用以下方法:
[Microsoft.PowerShell.PSConsoleReadLine]::GetBufferState
[Microsoft.PowerShell.PSConsoleReadLine]::Insert
[Microsoft.PowerShell.PSConsoleReadLine]::Replace
[Microsoft.PowerShell.PSConsoleReadLine]::SetCursorPosition
开发与贡献
请参阅[贡献指南][]了解如何开发和贡献。
构建
要在 Windows、Linux 或 macOS 上构建 PSReadLine,
必须安装以下内容:
- .NET 6.0 或更新版本
- PowerShell 模块
InvokeBuild和platyPS
构建脚本 build.ps1 可用于引导、构建和测试该项目。
- 引导:
./build.ps1 -Bootstrap - 构建:
./build.ps1 -Configuration Debug - 测试:
- 针对 .NET 4.7.2(仅限 Windows):
./build.ps1 -Test -Configuration Debug -Framework net472 - 针对 .NET 6.0:
./build.ps1 -Test -Configuration Debug -Framework net6.0
- 针对 .NET 4.7.2(仅限 Windows):
构建完成后,生成的工件可在 <your-local-repo-root>/bin/Debug 找到。
为了将导入的模块隔离为本地构建的版本,请确保运行
pwsh -NonInteractive -NoProfile 以避免自动加载已安装的默认 PSReadLine 模块。
然后通过 Import-Module <your-local-repo-root>/bin/Debug/PSReadLine/PSReadLine.psd1 加载本地构建的 PSReadLine 模块。
变更日志
变更日志可在此处查看。
许可
PSReadLine 采用 2-Clause BSD License 许可。
行为准则
在参与本项目之前,请参阅我们的行为准则。
安全策略
如有任何安全问题,请参阅我们的安全策略。