about_PSReadLine

简短说明

PSReadLine 在 PowerShell 控制台中提供了改进的命令行编辑体验。

详细说明

PSReadLine 2.1.0 随附的 PowerShell 7.2。 有较新版本可用。 可以在 Windows PowerShell 5.1 及更新版本上安装和使用 PSReadLine 的当前版本。 对于某些功能,需要运行 PowerShell 7.2 或更高版本。

PSReadLine 为 PowerShell 控制台提供了强大的命令行编辑体验。 提供以下功能:

  • 命令行的语法着色
  • 语法错误的可视指示
  • 更好的多行体验 (编辑和历史记录)
  • 可自定义的键绑定
  • Cmd 和 Emacs 模式
  • 许多配置选项
  • Cmd 模式下的 Bash 样式完成 (可选,emacs 模式默认为)
  • Emacs 洋克/杀环
  • 基于 PowerShell 令牌的“word”移动和删除
  • 预测 IntelliSense
  • 控制台中帮助的动态显示,而不会丢失命令行上的位置

PSReadLine 需要 PowerShell 5.1 或更高版本。 PSReadLine 适用于默认的 Windows 控制台主机、窗口终端和Visual Studio Code。 它在 Windows PowerShell ISE 中不起作用。

可以从PowerShell 库安装 PSReadLine。 若要在受支持的 PowerShell 版本中安装 PSReadLine,请运行以下命令。

Install-Module -Name PSReadLine -AllowClobber -Force

备注

从 PowerShell 7.0 开始,如果检测到屏幕阅读器程序,PowerShell 将跳过在 Windows 上自动加载 PSReadLine。 目前,PSReadLine 不适用于屏幕阅读器。 Windows 上 PowerShell 7.0 的默认呈现和格式设置正常工作。 如有必要,可以手动加载模块。

预测 IntelliSense

预测 IntelliSense 是选项卡完成的概念的补充,可帮助用户成功完成命令。 它使用户能够基于用户历史记录和其他特定于域的插件的匹配预测发现、编辑和执行完整命令。

启用预测 IntelliSense

预测性 IntelliSense 默认禁用。 若要启用预测,只需运行以下命令:

Set-PSReadLineOption -PredictionSource History

PredictionSource 参数还可以接受特定于域和自定义要求的插件。

若要禁用预测 IntelliSense,只需运行:

Set-PSReadLineOption -PredictionSource None

以下函数在 Microsoft.PowerShell.PSConsoleReadLine 类中可用。

基本编辑函数

中止

中止当前操作,例如:增量历史记录搜索。

  • Emacs: <Ctrl+g>
  • Vi 插入模式: <Ctrl+g>
  • Vi 命令模式: <Ctrl+g>

AcceptAndGetNext

尝试执行当前输入。 如果它可以像 AcceptLine) 这样的 (执行,则在下次调用 ReadLine 时,请从历史记录中召回下一个项目。

  • Emacs: <Ctrl+o>

AcceptLine

尝试执行当前输入。 如果当前输入不完整 (例如缺少右括号、括号或引号) 则延续提示将显示在下一行,PSReadLine 等待键编辑当前输入。

  • Cmd:<Enter>
  • Emacs: <Enter>
  • Vi 插入模式: <Enter>

AddLine

延续提示显示在下一行上,PSReadLine 等待键编辑当前输入。 即使单行本身完成输入,这也有助于将多行输入作为单个命令输入。

  • Cmd:<Shift+Enter>
  • Emacs: <Shift+Enter>
  • Vi 插入模式: <Shift+Enter>
  • Vi 命令模式: <Shift+Enter>

BackwardDeleteChar

删除光标前的字符。

  • Cmd: <Backspace>``<Ctrl+h>
  • Emacs: <Backspace>, , <Ctrl+Backspace>``<Ctrl+h>
  • Vi 插入模式: <Backspace>
  • Vi 命令模式: <X>``<d,h>

BackwardDeleteInput

与 BackwardKillInput 一样 - 将文本从输入的点删除,但不将已删除的文本置于杀伤圈中。

  • Cmd:<Ctrl+Home>
  • Vi 插入模式: <Ctrl+u>``<Ctrl+Home>
  • Vi 命令模式: <Ctrl+u>``<Ctrl+Home>

BackwardDeleteLine

与后退线一样 - 从点到行开头删除文本,但不将已删除的文本置于杀伤圈中。

  • Vi 命令模式: <d,0>

BackwardDeleteWord

删除上一个单词。

  • Vi 命令模式: <Ctrl+w>``<d,b>

BackwardKillInput

清除从输入开头到光标的文本。 清除的文本放置在杀伤圈中。

  • Emacs: <Ctrl+u>``<Ctrl+x,Backspace>

BackwardKillLine

清除从当前逻辑行开头到光标的文本。 清除的文本放置在杀伤圈中。

  • 函数未绑定。

BackwardKillWord

清除从当前单词开头到光标的输入。 如果光标位于单词之间,则从上一个单词的开头清除输入到光标。 清除的文本放置在杀伤圈中。

  • Cmd: <Ctrl+Backspace>``<Ctrl+w>
  • Emacs: <Alt+Backspace>``<Escape,Backspace>
  • Vi 插入模式: <Ctrl+Backspace>
  • Vi 命令模式: <Ctrl+Backspace>

CancelLine

取消当前输入,在屏幕上留下输入,但返回主机,以便再次评估提示。

  • Vi 插入模式: <Ctrl+c>
  • Vi 命令模式: <Ctrl+c>

复制

将所选区域复制到系统剪贴板。 如果未选择任何区域,请复制整行。

  • Cmd:<Ctrl+C>

CopyOrCancelLine

如果选择文本,请复制到剪贴板,否则取消该行。

  • Cmd:<Ctrl+c>
  • Emacs: <Ctrl+c>

剪切

删除在系统剪贴板中放置已删除文本的选定区域。

  • Cmd:<Ctrl+x>

DeleteChar

删除光标下的字符。

  • Cmd:<Delete>
  • Emacs: <Delete>
  • Vi 插入模式: <Delete>
  • Vi 命令模式:<Delete>、、<x><d,l>``<d,Spacebar>

DeleteCharOrExit

删除光标下的字符,或者如果行为空,请退出进程。

  • Emacs: <Ctrl+d>

DeleteEndOfBuffer

删除到多行缓冲区的末尾。

  • Vi 命令模式: <d,G>

DeleteEndOfWord

删除到单词末尾。

  • Vi 命令模式: <d,e>

DeleteLine

删除多行缓冲区的当前逻辑行,启用撤消。

  • Vi 命令模式: <d,d>``<d,_>

DeletePreviousLines

删除上一个请求的逻辑行和多行缓冲区中的当前逻辑行。

  • Vi 命令模式: <d,k>

DeleteRelativeLines

从缓冲区的开头删除到多行缓冲区中的当前逻辑行。

与大多数 Vi 命令一样, <d,g,g> 该命令可以前面加上一个数值参数,该参数指定绝对行号,以及当前行号,构成要删除的行范围。 如果未指定,则数值参数默认为 1,该参数引用多行缓冲区中的第一个逻辑行。

要从多行中删除的实际行数计算为当前逻辑行号与指定数值参数之间的差异,因此可以是负数。 因此,方法名称的 相对 部分。

  • Vi 命令模式: <d,g,g>

DeleteNextLines

删除多行缓冲区中的当前逻辑行和下一个请求的逻辑行。

  • Vi 命令模式: <d,j>

DeleteLineToFirstChar

从多行缓冲区中当前逻辑行的第一个非空白字符中删除。

  • Vi 命令模式: <d,^>

DeleteToEnd

删除到行尾。

  • Vi 命令模式: <D>``<d,$>

DeleteWord

删除下一个单词。

  • Vi 命令模式: <d,w>

ForwardDeleteInput

与 KillLine 一样 - 从输入的点到末尾删除文本,但不将已删除的文本放入终止圈。

  • Cmd:<Ctrl+End>
  • Vi 插入模式: <Ctrl+End>
  • Vi 命令模式: <Ctrl+End>

ForwardDeleteLine

从当前逻辑行的点到末尾删除文本,但不将已删除的文本置于终止圈中。

  • 函数未绑定

InsertLineAbove

无论光标位于当前行上的位置如何,都会在当前行上方创建新的空行。 光标移动到新行的开头。

  • Cmd:<Ctrl+Enter>

InsertLineBelow

无论光标位于当前行上的位置如何,都会在当前行下方创建新的空行。 光标移动到新行的开头。

  • Cmd:<Shift+Ctrl+Enter>

InvertCase

反转当前字符的情况,并移动到下一个字符。

  • Vi 命令模式: <~>

KillLine

清除从光标到输入末尾的输入。 清除的文本放置在杀伤圈中。

  • Emacs: <Ctrl+k>

KillRegion

终止光标和标记之间的文本。

  • 函数未绑定。

KillWord

清除从光标到当前单词末尾的输入。 如果光标位于单词之间,则输入将从光标清除到下一个单词的末尾。 清除的文本放置在杀伤圈中。

  • Cmd: <Alt+d><Ctrl+Delete>
  • Emacs: <Alt+d><Escape,d>
  • Vi 插入模式: <Ctrl+Delete>
  • Vi 命令模式: <Ctrl+Delete>

粘贴

粘贴系统剪贴板中的文本。

  • Cmd: <Ctrl+v><Shift+Insert>
  • Vi 插入模式: <Ctrl+v>
  • Vi 命令模式: <Ctrl+v>

重要

使用 Paste 函数时,剪贴板缓冲区的整个内容将粘贴到 PSReadLine 的输入缓冲区中。 然后,输入缓冲区将传递给 PowerShell 分析程序。 使用控制台应用程序的 右键单击 粘贴方法粘贴的输入一次复制到输入缓冲区一个字符。 复制换行符时,输入缓冲区将传递给分析器。 因此,输入一次分析一行。 粘贴方法之间的差异会导致不同的执行行为。

PasteAfter

将剪贴板粘贴到光标后,将光标移动到粘贴文本的末尾。

  • Vi 命令模式: <p>

PasteBefore

将剪贴板粘贴到光标前,将光标移动到粘贴文本的末尾。

  • Vi 命令模式: <P>

PrependAndAccept

追加“#”并接受该行。

  • Vi 命令模式: <#>

重做

撤消撤消。

  • Cmd:<Ctrl+y>
  • Vi 插入模式: <Ctrl+y>
  • Vi 命令模式: <Ctrl+y>

RepeatLastCommand

重复最后一个文本修改。

  • Vi 命令模式: <.>

RevertLine

将所有输入还原到当前输入。

  • Cmd:<Escape>
  • Emacs: <Alt+r>``<Escape,r>

ShellBackwardKillWord

清除从当前单词开头到光标的输入。 如果光标位于单词之间,则从上一个单词的开头清除输入到光标。 清除的文本放置在杀伤圈中。

函数未绑定。

ShellKillWord

清除从光标到当前单词末尾的输入。 如果光标位于单词之间,则从光标清除输入到下一个单词的末尾。 清除的文本放置在杀伤圈中。

函数未绑定。

SwapCharacters

交换当前字符和前一个字符。

  • Emacs: <Ctrl+t>
  • Vi 插入模式: <Ctrl+t>
  • Vi 命令模式: <Ctrl+t>

撤消

撤消以前的编辑。

  • Cmd:<Ctrl+z>
  • Emacs: <Ctrl+_>``<Ctrl+x,Ctrl+u>
  • Vi 插入模式: <Ctrl+z>
  • Vi 命令模式: <Ctrl+z>``<u>

UndoAll

撤消以前对行所做的所有编辑。

  • Vi 命令模式: <U>

UnixWordRubout

清除从当前单词开头到光标的输入。 如果光标位于单词之间,则从上一个单词的开头清除输入到光标。 清除的文本放置在杀伤圈中。

  • Emacs: <Ctrl+w>

ValidateAndAcceptLine

尝试执行当前输入。 如果当前输入不完整 (例如缺少右括号、括号或引号) 则延续提示将显示在下一行,PSReadLine 等待键编辑当前输入。

  • Emacs: <Ctrl+m>

ViAcceptLine

接受行并切换到“插入”模式。

  • Vi 命令模式: <Enter>

ViAcceptLineOrExit

就像 Emacs 模式下的 DeleteCharOrExit 一样,但接受行而不是删除字符。

  • Vi 插入模式: <Ctrl+d>
  • Vi 命令模式: <Ctrl+d>

ViAppendLine

新行插入到当前行下方。

  • Vi 命令模式: <o>

ViBackwardDeleteGlob

仅使用空格作为单词分隔符删除上一个单词。

  • Vi 命令模式: <d,B>

ViBackwardGlob

将光标移回上一个单词的开头,仅使用空格作为分隔符。

  • Vi 命令模式: <B>

ViDeleteBrace

查找匹配的大括号、括号或方括号,并删除其中的所有内容,包括大括号。

  • Vi 命令模式: <d,%>

ViDeleteEndOfGlob

删除到单词末尾。

  • Vi 命令模式: <d,E>

ViDeleteGlob

删除下一个 glob (空格分隔字) 。

  • Vi 命令模式: <d,W>

ViDeleteToBeforeChar

删除到给定字符为止。

  • Vi 命令模式: <d,t>

ViDeleteToBeforeCharBackward

删除到给定字符为止。

  • Vi 命令模式: <d,T>

ViDeleteToChar

删除到给定字符为止。

  • Vi 命令模式: <d,f>

ViDeleteToCharBackward

向后删除,直到给定字符。

  • Vi 命令模式: <d,F>

ViInsertAtBegining

切换到“插入”模式,并将光标定位在行的开头。

  • Vi 命令模式: <I>

ViInsertAtEnd

切换到“插入”模式,并将光标定位在线条的末尾。

  • Vi 命令模式: <A>

ViInsertLine

新行插入到当前行上方。

  • Vi 命令模式: <O>

ViInsertWithAppend

从当前行位置追加。

  • Vi 命令模式: <a>

ViInsertWithDelete

删除当前字符并切换到“插入”模式。

  • Vi 命令模式: <s>

ViJoinLines

联接当前行和下一行。

  • Vi 命令模式: <J>

ViReplaceLine

清除整个命令行。

  • Vi 命令模式: <S>``<c,c>

ViReplaceToBeforeChar

替换到给定字符为止。

  • Vi 命令模式: <c,t>

ViReplaceToBeforeCharBackward

替换到给定字符为止。

  • Vi 命令模式: <c,T>

ViReplaceToChar

删除到给定字符为止。

  • Vi 命令模式: <c,f>

ViReplaceToCharBackward

替换到给定字符为止。

  • Vi 命令模式: <c,F>

ViYankBeginningOfLine

从缓冲区开头到光标的洋基。

  • Vi 命令模式: <y,0>

ViYankEndOfGlob

从光标到 WORD () 末尾的洋基。

  • Vi 命令模式: <y,E>

ViYankEndOfWord

从光标到单词末尾的洋 () 。

  • Vi 命令模式: <y,e>

ViYankLeft

扬克字符 (光标左侧的) 。

  • Vi 命令模式: <y,h>

ViYankLine

将整个缓冲区扬开。

  • Vi 命令模式: <y,y>

ViYankNextGlob

从光标到下一个 WORD () 的开头的洋基。

  • Vi 命令模式: <y,W>

ViYankNextWord

将光标后面的单词 () 扬开。

  • Vi 命令模式: <y,w>

ViYankPercent

扬克到/从匹配大括号。

  • Vi 命令模式: <y,%>

ViYankPreviousGlob

从 WORD 开头 () 到光标的扬克。

  • Vi 命令模式: <y,B>

ViYankPreviousWord

将光标前的单词 () 扬开。

  • Vi 命令模式: <y,b>

ViYankRight

洋克字符 (光标下方和右侧的) 。

  • Vi 命令模式: <y,l>``<y,Spacebar>

ViYankToEndOfLine

从光标到缓冲区末尾的洋基。

  • Vi 命令模式: <y,$>

ViYankToFirstChar

从第一个非空格字符到光标的扬克。

  • Vi 命令模式: <y,^>

美国 佬

将最近终止的文本添加到输入。

  • Emacs: <Ctrl+y>

YankLastArg

从上一历史记录行中扬开最后一个参数。 使用参数时,第一次调用它时的行为就像 YankNthArg 一样。 如果多次调用,则循环访问历史记录并设置方向 (负反转方向。)

  • Cmd:<Alt+.>
  • Emacs: <Alt+.>, , <Alt+_><Escape,.>``<Escape,_>

YankNthArg

从上一历史记录行) 命令后, (ิ下第一个参数。 使用参数时,从 0) 开始 (第 n 个参数,如果参数为负,则从最后一个参数开始。

  • Emacs: <Ctrl+Alt+y>``<Escape,Ctrl+y>

洋克流行

如果上一个操作是 Yank 或 YankPop,请将以前被延边的文本替换为终止环中的下一个已终止文本。

  • Emacs: <Alt+y>``<Escape,y>

游标移动函数

BackwardChar

将光标移到左侧的一个字符。 这可能会将光标移动到上一行多行输入。

  • Cmd:<LeftArrow>
  • Emacs: <LeftArrow>``<Ctrl+b>

BackwardWord

将光标移回当前单词的开头,或者在单词之间移动,则移动上一个单词的开头。 Word 边界由一组可配置字符定义。

  • Cmd:<Ctrl+LeftArrow>
  • Emacs: <Alt+b>``<Escape,b>
  • Vi 插入模式: <Ctrl+LeftArrow>
  • Vi 命令模式: <Ctrl+LeftArrow>

定义单词边界的字符在 PSConsoleReadLineOptions 对象的 WordDelimiters 属性中配置。 若要查看或更改 WordDelimiters 属性,请参阅 Get-PSReadLineOptionSet-PSReadLineOption

BeginningOfLine

如果输入具有多行,则移动到当前行的开头,或者如果已在行的开头,则移动到输入的开头。 如果输入有一行,请移动到输入的开头。

  • Cmd:<Home>
  • Emacs: <Home>``<Ctrl+a>
  • Vi 插入模式: <Home>
  • Vi 命令模式: <Home>

EndOfLine

如果输入具有多行,则移动到当前行的末尾,或者如果已在行末尾,则移动到输入的末尾。 如果输入有一行,请移动到输入的末尾。

  • Cmd:<End>
  • Emacs: <End>``<Ctrl+e>
  • Vi 插入模式: <End>

ForwardChar

将光标移到右侧的一个字符。 这可能会将光标移动到下一行多行输入。

  • Cmd:<RightArrow>
  • Emacs: <RightArrow>``<Ctrl+f>

ForwardWord

将光标向前移动到当前单词的末尾,或者在单词之间移动至下一个单词的末尾。 Word 边界由一组可配置字符定义。

  • Emacs: <Alt+f>``<Escape,f>

定义单词边界的字符在 PSConsoleReadLineOptions 对象的 WordDelimiters 属性中配置。 若要查看或更改 WordDelimiters 属性,请参阅 Get-PSReadLineOptionSet-PSReadLineOption

GotoBrace

转到匹配的大括号、括号或方括号。

  • Cmd:<Ctrl+]>
  • Vi 插入模式: <Ctrl+]>
  • Vi 命令模式: <Ctrl+]>

GotoColumn

移动到由 arg 指示的列。

  • Vi 命令模式: <|>

GotoFirstNonBlankOfLine

将光标移动到行中的第一个非空字符。

  • Vi 命令模式: <^>``<_>

MoveToEndOfLine

将光标移动到输入的末尾。

  • Vi 命令模式: <End>``<$>

NextLine

将光标移动到下一行。

  • 函数未绑定。

NextWord

将光标向前移动到下一个单词的开头。 Word 边界由一组可配置字符定义。

  • Cmd:<Ctrl+RightArrow>
  • Vi 插入模式: <Ctrl+RightArrow>
  • Vi 命令模式: <Ctrl+RightArrow>

定义单词边界的字符在 PSConsoleReadLineOptions 对象的 WordDelimiters 属性中配置。 若要查看或更改 WordDelimiters 属性,请参阅 Get-PSReadLineOptionSet-PSReadLineOption

NextWordEnd

将光标向前移动到当前单词的末尾,或者在单词之间移动至下一个单词的末尾。 Word 边界由一组可配置字符定义。

  • Vi 命令模式: <e>

定义单词边界的字符在 PSConsoleReadLineOptions 对象的 WordDelimiters 属性中配置。 若要查看或更改 WordDelimiters 属性,请参阅 Get-PSReadLineOptionSet-PSReadLineOption

PreviousLine

将光标移动到上一行。

  • 函数未绑定。

ShellBackwardWord

将光标移回当前单词的开头,或者在单词之间移动,则移动上一个单词的开头。 Word 边界由 PowerShell 令牌定义。

  • 函数未绑定。

ShellForwardWord

将光标向前移动到下一个单词的开头。 Word 边界由 PowerShell 令牌定义。

  • 函数未绑定。

ShellNextWord

将光标向前移动到当前单词的末尾,或者在单词之间移动至下一个单词的末尾。 Word 边界由 PowerShell 令牌定义。

  • 函数未绑定。

ViBackwardChar

在 Vi 编辑模式下将光标一个字符移到左侧。 这可能会将光标移动到上一行多行输入。

  • Vi 插入模式: <LeftArrow>
  • Vi 命令模式: <LeftArrow>, , <Backspace>``<h>

ViBackwardWord

将光标移回当前单词的开头,或者在单词之间移动,则移动上一个单词的开头。 Word 边界由一组可配置字符定义。

  • Vi 命令模式: <b>

定义单词边界的字符在 PSConsoleReadLineOptions 对象的 WordDelimiters 属性中配置。 若要查看或更改 WordDelimiters 属性,请参阅 Get-PSReadLineOptionSet-PSReadLineOption

ViForwardChar

在 Vi 编辑模式下将光标一个字符移到右侧。 这可能会将光标移动到下一行多行输入。

  • Vi 插入模式: <RightArrow>
  • Vi 命令模式: <RightArrow>, , <Spacebar>``<l>

ViEndOfGlob

将光标移动到单词末尾,仅使用空格作为分隔符。

  • Vi 命令模式: <E>

ViEndOfPreviousGlob

移动到上一个单词的末尾,仅使用空格作为单词分隔符。

  • 函数未绑定。

ViGotoBrace

类似于 GotoBrace,但基于字符而不是基于令牌。

  • Vi 命令模式: <%>

ViNextGlob

移动到下一个单词,仅使用空格作为单词分隔符。

  • Vi 命令模式: <W>

ViNextWord

将光标向前移动到下一个单词的开头。 Word 边界由一组可配置字符定义。

  • Vi 命令模式: <w>

定义单词边界的字符在 PSConsoleReadLineOptions 对象的 WordDelimiters 属性中配置。 若要查看或更改 WordDelimiters 属性,请参阅 Get-PSReadLineOptionSet-PSReadLineOption

历史记录函数

BeginningOfHistory

移动到历史记录中的第一项。

  • Emacs: <Alt+<>

ClearHistory

清除 PSReadLine 中的历史记录。 这不会影响 PowerShell 历史记录。

  • Cmd:<Alt+F7>

EndOfHistory

移动到历史记录中当前输入) 的最后一项 (。

  • Emacs: <Alt+>>

ForwardSearchHistory

通过历史记录执行增量转发搜索。

  • Cmd:<Ctrl+s>
  • Emacs: <Ctrl+s>
  • Vi 插入模式: <Ctrl+s>
  • Vi 命令模式: <Ctrl+s>

HistorySearchBackward

将当前输入替换为 PSReadLine 历史记录中的“上一个”项,该项与开始和输入和游标之间的字符匹配。

  • Cmd:<F8>

HistorySearchForward

将当前输入替换为 PSReadLine 历史记录中的“下一步”项,该项与开始和输入和游标之间的字符匹配。

  • Cmd:<Shift+F8>

NextHistory

将当前输入替换为 PSReadLine 历史记录中的“下一步”项。

  • Cmd:<DownArrow>
  • Emacs: <DownArrow>``<Ctrl+n>
  • Vi 插入模式: <DownArrow>
  • Vi 命令模式: <DownArrow>, , <j>``<+>

PreviousHistory

将当前输入替换为 PSReadLine 历史记录中的“上一个”项。

  • Cmd:<UpArrow>
  • Emacs: <UpArrow>``<Ctrl+p>
  • Vi 插入模式: <UpArrow>
  • Vi 命令模式: <UpArrow>, , <k>``<->

ReverseSearchHistory

通过历史记录执行增量向后搜索。

  • Cmd:<Ctrl+r>
  • Emacs: <Ctrl+r>
  • Vi 插入模式: <Ctrl+r>
  • Vi 命令模式: <Ctrl+r>

ViSearchHistoryBackward

提示输入搜索字符串,并在 AcceptLine 上启动搜索。

  • Vi 命令模式: </>

完成函数

完成

尝试对光标周围的文本执行完成。 如果有多个可能的完成,则最长的明确前缀用于完成。 如果尝试完成最长的明确完成,则会显示可能的完成列表。

  • Emacs: <Tab>

尝试对光标周围的文本执行完成。 如果有多个可能的完成,则最长的明确前缀用于完成。 如果尝试完成最长的明确完成,则会显示可能的完成列表。

  • Cmd: <Ctrl+@>``<Ctrl+Spacebar>
  • Emacs: <Ctrl+Spacebar>

可能的Completions

显示可能的完成列表。

  • Emacs: <Alt+=>
  • Vi 插入模式: <Ctrl+Spacebar>
  • Vi 命令模式: <Ctrl+Spacebar>

TabCompleteNext

尝试完成光标周围的文本,并完成下一个可用完成。

  • Cmd:<Tab>
  • Vi 命令模式: <Tab>

TabCompletePrevious

尝试完成光标周围的文本,并完成以前的可用完成。

  • Cmd:<Shift+Tab>
  • Vi 命令模式: <Shift+Tab>

ViTabCompleteNext

根据需要结束当前编辑组,并调用 TabCompleteNext。

  • Vi 插入模式: <Tab>

ViTabCompletePrevious

根据需要结束当前编辑组,并调用 TabCompletePrevious。

  • Vi 插入模式: <Shift+Tab>

预测函数

AcceptNextSuggestionWord

用作 InlineView 预测视图样式时,接受内联建议的下一个单词。

  • 函数未绑定。

AcceptSuggestion

用作 InlineView 预测视图样式时,接受当前的内联建议。

  • 函数未绑定。

NextSuggestion

用作 ListView 预测视图样式时,请导航到列表中的下一个建议。

  • 函数未绑定。

PreviousSuggestion

用作 ListView 用于预测的视图样式时,请导航到列表中的上一个建议。

  • 函数未绑定。

SwitchPredictionView

切换用于预测的 InlineView 视图样式和 ListView

  • Cmd:<F2>

其他函数

CaptureScreen

启动交互式屏幕捕获 - 向上/向下箭头选择行,输入所选文本作为文本和 HTML 复制到剪贴板。

  • 函数未绑定。

ClearScreen

清除屏幕并在屏幕顶部绘制当前线条。

  • Cmd:<Ctrl+l>
  • Emacs: <Ctrl+l>
  • Vi 插入模式: <Ctrl+l>
  • Vi 命令模式: <Ctrl+l>

DigitArgument

启动要传递给其他函数的新数字参数。 可以将它用作键压调用的下一个函数的乘数。 例如,按将 <Alt+1> <Alt+0> 数字参数 值设置为 10。 然后,按 # 键会将 10 # 个字符 (##########) 发送到输入行。 同样,可以将此操作与其他操作一起使用,例如 <Delete>Left-Arrow

  • Cmd:<Alt+0>、、<Alt+1>、、<Alt+2>``<Alt+3><Alt+5>``<Alt+6>``<Alt+4><Alt+7>``<Alt+8>、、、 <Alt+9>``<Alt+->
  • Emacs:<Alt+0>、、、<Alt+1><Alt+4>``<Alt+6>``<Alt+2>``<Alt+5>``<Alt+7>``<Alt+3>``<Alt+8>、、、 <Alt+9>``<Alt+->
  • Vi 命令模式:<0>、、<1><3>``<5>``<4>``<6>``<2><7>、、 <8>``<9>

InvokePrompt

擦除当前提示并调用提示函数以重新播放提示。 适用于更改状态的自定义键处理程序。 例如,更改当前目录。

  • 函数未绑定。

ScrollDisplayDown

滚动显示一个屏幕。

  • Cmd:<PageDown>
  • Emacs: <PageDown>

ScrollDisplayDownLine

向下滚动显示一行。

  • Cmd:<Ctrl+PageDown>
  • Emacs: <Ctrl+PageDown>

ScrollDisplayToCursor

将显示器滚动到光标。

  • Emacs: <Ctrl+End>

ScrollDisplayTop

将显示器滚动到顶部。

  • Emacs: <Ctrl+Home>

ScrollDisplayUp

滚动显示一个屏幕。

  • Cmd:<PageUp>
  • Emacs: <PageUp>

ScrollDisplayUpLine

向上滚动显示一行。

  • Cmd:<Ctrl+PageUp>
  • Emacs: <Ctrl+PageUp>

SelfInsert

插入键。

  • 函数未绑定。

ShowCommandHelp

提供完整 cmdlet 帮助的视图。 当光标位于完全展开的参数的末尾时,命中 <F1> 键将帮助显示在该参数的位置。

使用 Microsoft.PowerShell.Pager 中的 Pager 在备用屏幕缓冲区上显示帮助。 退出寻呼器时,会返回到原始屏幕上的原始光标位置。 此寻呼器仅适用于新式终端应用程序,例如Windows 终端

  • Cmd:<F1>
  • Emacs: <F1>
  • Vi 插入模式: <F1>
  • Vi 命令模式: <F1>

ShowKeyBindings

显示所有绑定键。

  • Cmd:<Ctrl+Alt+?>
  • Emacs: <Ctrl+Alt+?>
  • Vi 插入模式: <Ctrl+Alt+?>

ShowParameterHelp

通过在当前命令行 MenuComplete下面显示参数,提供动态帮助。 按下 <Alt+h> 键时,光标必须位于完全扩展的参数名称的末尾。

  • Cmd:<Alt+h>
  • Emacs: <Alt+h>
  • Vi 插入模式: <Alt+h>
  • Vi 命令模式: <Alt+h>

ViCommandMode

将当前操作模式从 Vi-Insert 切换到 Vi-Command。

  • Vi 插入模式: <Escape>

ViDigitArgumentInChord

启动一个新的数字参数,以在 vi 的和弦之一中传递给其他函数。

  • 函数未绑定。

ViEditVisually

在由 $env:EDITOR 或 $env:VISUAL 指定的文本编辑器中编辑命令行。

  • Emacs: <Ctrl+x,Ctrl+e>
  • Vi 命令模式: <v>

ViExit

退出 shell。

  • 函数未绑定。

ViInsertMode

切换到“插入”模式。

  • Vi 命令模式: <i>

WhatIsKey

阅读密钥并告诉我密钥所绑定到的内容。

  • Cmd:<Alt+?>
  • Emacs: <Alt+?>

选择函数

ExchangePointAndMark

光标放置在标记的位置,标记将移动到光标的位置。

  • Emacs: <Ctrl+x,Ctrl+x>

SelectAll

选择整行。

  • Cmd:<Ctrl+a>

SelectBackwardChar

调整当前所选内容以包含上一个字符。

  • Cmd:<Shift+LeftArrow>
  • Emacs: <Shift+LeftArrow>

SelectBackwardsLine

调整当前所选内容,以从光标包含到行的开头。

  • Cmd:<Shift+Home>
  • Emacs: <Shift+Home>

SelectBackwardWord

调整当前所选内容以包含上一个单词。

  • Cmd:<Shift+Ctrl+LeftArrow>
  • Emacs: <Alt+B>

SelectCommandArgument

选择命令参数。 选择参数的范围在脚本块内。 根据游标位置,它会从最内部的脚本块搜索到最大的脚本块,并在找到脚本块范围中的任何参数时停止。

此函数遵循 DigitArgument。 它将正或负自变量值视为当前选定参数的正向或向后偏移,或者在未选择任何参数时从当前游标位置。

  • Cmd:<Alt+a>
  • Emacs: <Alt+a>

SelectForwardChar

调整当前所选内容以包含下一个字符。

  • Cmd:<Shift+RightArrow>
  • Emacs: <Shift+RightArrow>

SelectForwardWord

使用 ForwardWord 调整当前所选内容以包含下一个单词。

  • Emacs: <Alt+F>

SelectLine

调整当前所选内容,以便从光标到行的末尾。

  • Cmd:<Shift+End>
  • Emacs: <Shift+End>

SelectNextWord

调整当前所选内容以包含下一个单词。

  • Cmd:<Shift+Ctrl+RightArrow>

SelectShellBackwardWord

使用 ShellBackwardWord 调整当前所选内容以包含上一个单词。

  • 函数未绑定。

SelectShellForwardWord

使用 ShellForwardWord 调整当前所选内容以包含下一个单词。

  • 函数未绑定。

SelectShellNextWord

使用 ShellNextWord 调整当前所选内容以包含下一个单词。

  • 函数未绑定。

SetMark

标记光标的当前位置,以便在后续编辑命令中使用。

  • Emacs: <Ctrl+@>

预测 IntelliSense 函数

备注

需要启用预测 IntelliSense 才能使用这些函数。

AcceptNextWordSuggestion

接受预测 IntelliSense 中内联建议的下一个词。 可以通过运行以下命令通过 Ctrl+F 绑定此函数。

Set-PSReadLineKeyHandler -Chord "Ctrl+f" -Function ForwardWord

AcceptSuggestion

当光标位于当前行的末尾时,通过按 RightArrow 接受预测 IntelliSense 中的当前内联建议。

搜索函数

CharacterSearch

读取字符并向前搜索该字符的下一个匹配项。 如果指定了参数,则为第 n 个匹配项的负) ,则 (或向后搜索。

  • Cmd:<F3>
  • Emacs: <Ctrl+]>
  • Vi 插入模式: <F3>
  • Vi 命令模式: <F3>

CharacterSearchBackward

读取字符并向后搜索该字符的下一个匹配项。 如果指定了参数,则为第 n 个匹配项的负) ,则向后搜索 (或向前搜索。

  • Cmd:<Shift+F3>
  • Emacs: <Ctrl+Alt+]>
  • Vi 插入模式: <Shift+F3>
  • Vi 命令模式: <Shift+F3>

RepeatLastCharSearch

重复最后一次录制的字符搜索。

  • Vi 命令模式: <;>

RepeatLastCharSearchBackwards

重复最后一次录制的字符搜索,但方向相反。

  • Vi 命令模式: <,>

RepeatSearch

按照之前相同的方向重复最后一次搜索。

  • Vi 命令模式: <n>

RepeatSearchBackward

按照之前相同的方向重复最后一次搜索。

  • Vi 命令模式: <N>

SearchChar

阅读下一个字符,然后找到它,前进,然后返回一个字符。 这是针对“t”功能。

  • Vi 命令模式: <f>

SearchCharBackward

阅读下一个字符,然后找到它,向后移动,然后返回一个字符。 这是针对“T”功能。

  • Vi 命令模式: <F>

SearchCharBackwardWithBackoff

阅读下一个字符,然后找到它,向后移动,然后返回一个字符。 这是针对“T”功能。

  • Vi 命令模式: <T>

SearchCharWithBackoff

阅读下一个字符,然后找到它,前进,然后返回一个字符。 这是针对“t”功能。

  • Vi 命令模式: <t>

SearchForward

提示输入搜索字符串,并在 AcceptLine 上启动搜索。

  • Vi 命令模式: <?>

自定义密钥绑定

PSReadLine 支持使用 cmdlet Set-PSReadLineKeyHandler的自定义密钥绑定。 大多数自定义键绑定调用上述函数之一,例如

Set-PSReadLineKeyHandler -Key UpArrow -Function HistorySearchBackward

可以将 ScriptBlock 绑定到密钥。 ScriptBlock 几乎可以执行所需的任何操作。 一些有用的示例包括

  • 编辑命令行
  • 例如,打开新窗口 (帮助)
  • 更改目录而不更改命令行

ScriptBlock 接收两个参数:

  • $key - 一个 [ConsoleKeyInfo] 对象,该对象是触发自定义绑定的键。 如果将同一 ScriptBlock 绑定到多个密钥,并且需要根据密钥执行不同的操作,则可以检查$key。 许多自定义绑定都忽略此参数。

  • $arg - 任意参数。 通常,这是用户从键绑定 DigitArgument 传递的整数参数。 如果绑定不接受参数,则忽略此参数是合理的。

让我们看看一个示例,该示例在不执行的情况下将命令行添加到历史记录中。 当你意识到忘记执行某些操作时,这很有用,但不想重新输入已输入的命令行。

$parameters = @{
    Key = 'Alt+w'
    BriefDescription = 'SaveInHistory'
    LongDescription = 'Save current line in history but do not execute'
    ScriptBlock = {
      param($key, $arg)   # The arguments are ignored in this example

      # GetBufferState gives us the command line (with the cursor position)
      $line = $null
      $cursor = $null
      [Microsoft.PowerShell.PSConsoleReadLine]::GetBufferState([ref]$line,
        [ref]$cursor)

      # AddToHistory saves the line in history, but does not execute it.
      [Microsoft.PowerShell.PSConsoleReadLine]::AddToHistory($line)

      # RevertLine is like pressing Escape.
      [Microsoft.PowerShell.PSConsoleReadLine]::RevertLine()
  }
}
Set-PSReadLineKeyHandler @parameters

可以在 PSReadLine 模块文件夹中安装的文件中 SamplePSReadLineProfile.ps1 查看更多示例。

大多数键绑定使用一些帮助程序函数来编辑命令行。 下一部分将记录这些 API。

自定义密钥绑定支持 API

以下函数在 Microsoft.PowerShell.PSConsoleReadLine 中公开,但不能直接绑定到密钥。 大多数在自定义密钥绑定中都很有用。

void AddToHistory(string command)

在不执行历史记录的情况下将命令行添加到历史记录。

void ClearKillRing()

清除杀手圈。 这主要用于测试。

void Delete(int start, int length)

从头开始删除长度字符。 此操作支持撤消/重做。

void Ding()

根据用户首选项执行 Ding 操作。

void GetBufferState([ref] string input, [ref] int cursor)
void GetBufferState([ref] Ast ast, [ref] Token[] tokens,
  [ref] ParseError[] parseErrors, [ref] int cursor)

这两个函数检索有关输入缓冲区当前状态的有用信息。 第一种情况更常见于简单情况。 如果绑定使用 Ast 执行更高级的内容,则使用第二个值。

IEnumerable[Microsoft.PowerShell.KeyHandler]
  GetKeyHandlers(bool includeBound, bool includeUnbound)

IEnumerable[Microsoft.PowerShell.KeyHandler]
  GetKeyHandlers(string[] Chord)

这两个函数由以下两个 Get-PSReadLineKeyHandler函数使用。 第一个用于获取所有密钥绑定。 第二个用于获取特定密钥绑定。

Microsoft.PowerShell.PSConsoleReadLineOptions GetOptions()

此函数由Get-PSReadLineOption使用,在自定义键绑定中可能不太有用。

void GetSelectionState([ref] int start, [ref] int length)

如果命令行上没有选择,则函数在开始和长度中返回 -1。 如果命令行上有选定内容,则返回所选内容的开始和长度。

void Insert(char c)
void Insert(string s)

在光标处插入字符或字符串。 此操作支持撤消/重做。

string ReadLine(runspace remoteRunspace,
  System.Management.Automation.EngineIntrinsics engineIntrinsics)

这是 PSReadLine 的主要入口点。 它不支持递归,因此在自定义密钥绑定中不起作用。

void RemoveKeyHandler(string[] key)

此函数由Remove-PSReadLineKeyHandler使用,在自定义键绑定中可能不太有用。

void Replace(int start, int length, string replacement)

替换某些输入。 此操作支持撤消/重做。 这是首选于删除后跟 Insert,因为它被视为撤消的单个操作。

void SetCursorPosition(int cursor)

将光标移动到给定偏移量。 未跟踪游标移动以撤消。

void SetOptions(Microsoft.PowerShell.SetPSReadLineOption options)

此函数是 cmdlet Set-PSReadLineOption 使用的帮助程序方法,但对于想要暂时更改设置的自定义键绑定可能很有用。

bool TryGetArgAsInt(System.Object arg, [ref] int numericArg,
  int defaultNumericArg)

此帮助程序方法用于遵循 DigitArgument 的自定义绑定。 典型的调用如下所示

[int]$numericArg = 0
[Microsoft.PowerShell.PSConsoleReadLine]::TryGetArgAsInt($arg,
  [ref]$numericArg, 1)

说明

命令历史记录

PSReadLine 维护一个历史记录文件,其中包含从命令行输入的所有命令和数据。 The history files is a file named $($host.Name)_history.txt. 在 Windows 系统上,历史记录文件存储在 $env:APPDATA\Microsoft\Windows\PowerShell\PSReadLine. 在非 Windows 系统上,历史记录文件存储在或以下$env:HOME/.local/share/powershell/PSReadLine位置$env:XDG_DATA_HOME/powershell/PSReadLine

历史记录可以包含敏感数据,包括密码。 PSReadLine 尝试筛选出敏感信息。 包含以下字符串的任何命令行都不会写入历史记录文件。

  • password
  • asplaintext
  • 令牌
  • apikey
  • secret

PSReadLine 2.2.0 通过以下方式改进了敏感数据的筛选:

  • 使用已分析命令行的 PowerShell 抽象语法树 (AST) 查找敏感数据。
  • 使用 SecretManagement 模块中安全 cmdlet 的允许列表允许将这些命令添加到历史记录中。 允许列表包含:
    • Get-Secret
    • Get-SecretInfo
    • Get-SecretVault
    • Register-SecretVault
    • Remove-Secret
    • Set-SecretInfo
    • Set-SecretVaultDefault
    • Test-SecretVault
    • Unlock-SecretVault
    • Unregister-SecretVault

例如,允许将以下命令写入历史记录文件:

Get-Secret PSGalleryApiKey -AsPlainText # Get-Secret is in the allowlist
$token = Get-Secret -Name github-token -Vault MySecret
[MyType]::CallRestAPI($token, $url, $args)
$template -f $token

以下命令不会写入历史记录文件:

$token = 'abcd' # Assign expr-value to sensitive variable name.
Set-Secret abc $mySecret # Set-Secret is not in the allowlist.
ConvertTo-SecureString stringValue -AsPlainText # '-AsPlainText' is an alert.
Invoke-WebRequest -Token xxx # Expr-value as argument to '-Token'.
Get-ResultFromTwo -Secret1 (Get-Secret -Name blah -AsPlainText) -Secret2 sdv87ysdfayf798hfasd8f7ha # '-Secret2' has expr-value argument.

OnIdle 事件的行为

当 PSReadLine 正在使用时,当ReadKey()超时时会触发 OnIdle 事件, (不会键入 300 毫秒) 。 当用户处于编辑命令行的中间时,可能会发出该事件信号,例如,用户正在阅读帮助来确定要使用的参数。

从 PSReadLine 2.2.0-beta4 开始, OnIdle 行为已更改为仅在出现 ReadKey() 超时且当前编辑缓冲区为空时才向事件发出信号。

PSReadLine 发布历史记录

自 Windows PowerShell 5.1 中随附的版本以来,PSReadLine 有许多更新。

  • PSReadLine 2.2.5 随附的 PowerShell 7.3-preview.5
  • PSReadLine 2.1.0 随附的 PowerShell 7.2.5
  • PSReadLine 2.0.4 随附的 PowerShell 7.0.11
  • PSReadLine 2.0.0 附带 PowerShell 5.1

有关更改的完整列表,请参阅 PSReadLine ChangeLog

  • PSReadLine 2.2.6

    在此版本中,预测 IntelliSense 功能默认启用,具体取决于以下条件:

    • 如果支持虚拟终端 (VT) ,并且 PowerShell 7.2 或更高版本中运行的 PSReadLine, 则 PredictionSource 设置为 HistoryAndPlugin
    • 如果支持 VT,并且 PSReadLine 在 7.2 之前的 PowerShell 中运行, 则 PredictionSource 设置为 History
    • 如果不支持 VT, 则 PredictionSource 设置为 None
  • PSReadLine 2.2.5

    此版本汇总了自 2.1.0 版本以来添加的以下增强功能:

    • PSReadLine 添加了两个新的预测 IntelliSense 功能:
      • 添加了 PredictionViewStyle 参数以允许选择新的 ListView值。
      • 将 PSReadLine 连接到 CommandPrediction PowerShell 7.2 中引入的 API,以允许用户导入可呈现自定义源建议的预测器模块。
    • 已更新为使用 1.0.0 版本的 Microsoft.PowerShell.Pager 动态帮助
    • 改进了敏感历史记录项的清理
    • 大量的 bug 修复和较小的改进
  • PSReadLine 2.1.0

    此版本汇总了自 2.0.4 版本以来添加的以下增强功能:

    • 从命令历史记录中添加预测 IntelliSense 建议
    • 许多 bug 修复和 API 增强功能
  • PSReadLine 2.0.4

    此版本汇总了自 2.0.0 版本以来添加的以下增强功能:

    • 添加了用于-Chord``Get-PSReadLineKeyHandler允许搜索特定密钥绑定的参数

参与 PSReadLine 的反馈&

GitHub 上的 PSReadLine

随时在 GitHub 页面上提交拉取请求或提交反馈。

另请参阅

  • PSReadLine 受到 GNU 读线 库的严重影响。