ITADN
PowerShell/PSReadLine
PowerShell/PSReadLine · 文件 下载 ZIP
文件最后提交记录最后更新时间
README.md
以下内容由 AI 翻译,如有问题请点此提交 issue 反馈

appveyor-build-status

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)
    }
}

在本示例中,当您输入单引号或双引号时,可能会发生两种情况。 如果光标后的字符不是所输入的引号,则会插入一对匹配的引号,并将光标置于匹配的引号内部。 如果光标后的字符是所输入的引号,则光标仅移动到引号之后,而不插入任何内容。 如果您使用 VSCodeResharper 或其他智能编辑器,这种体验会让您感到熟悉。

请注意,以这种方式编写的处理程序能正确处理撤销 - 一次撤销操作即可撤销两个引号。

示例配置文件 包含许多值得查看的优秀示例。 安装 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 模块 InvokeBuildplatyPS

构建脚本 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

构建完成后,生成的工件可在 <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 许可。

行为准则

在参与本项目之前,请参阅我们的行为准则

安全策略

如有任何安全问题,请参阅我们的安全策略