about_PSReadLine

简短说明

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

详细说明

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

  • 命令行的语法着色
  • 语法错误的可视指示
  • 更好的多行体验 (编辑和历史记录)
  • 可自定义的键绑定
  • Cmd 和 Emacs 模式
  • 许多配置选项
  • Bash 样式完成在 Cmd 模式下 (可选,在 Emacs 模式下默认)
  • Emacs 洋克/杀环
  • 基于 PowerShell 令牌的“word”移动和删除

PSReadLine 需要 PowerShell 3.0 或更高版本。 PSReadLine 可与默认控制台主机、Visual Studio Code和窗口终端配合使用。 它在 PowerShell ISE 中不起作用。

PSReadLine 2.1.0 随 PowerShell 7.2 一起提供,在所有受支持的 PowerShell 版本中都受支持。 可以从PowerShell 库安装它。 若要在受支持的 PowerShell 版本中安装 PSReadLine 2.1.0,请运行以下命令。

Install-Module -Name PSReadLine -RequiredVersion 2.1.0

注意

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

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

基本编辑函数

中止

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

  • Emacs: <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>

BackwardDeleteLine

与 BackwardKillLine 一样 - 删除从点到行开头的文本,但不会将已删除的文本放在终止环中。

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

BackwardDeleteWord

删除上一个单词。

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

BackwardKillLine

清除从输入开始到光标的输入。 清除的文本放置在终止环中。

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

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>

ForwardDeleteLine

与 ForwardKillLine 一样- 删除从行的点到行尾的文本,但不会将已删除的文本放在杀环中。

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

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>

撤消所有

撤消行之前的所有编辑。

  • 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

从光标到单词末尾的扬克 (s) 。

  • 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 类似。 如果多次调用,它会循环访问历史记录,而 arg 设置方向 (负反转方向。)

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

YankNthArg

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

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

YankPop

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

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

光标移动函数

BackwardChar

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

  • Cmd:<LeftArrow>
  • Emacs: <LeftArrow><Ctrl+b>
  • Vi 插入模式: <LeftArrow>
  • Vi 命令模式: <LeftArrow><Backspace><h>

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>
  • Vi 插入模式: <RightArrow>
  • Vi 命令模式: <RightArrow><Space><l>

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>

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>

ViSearchHistoryBackward

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

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

完成函数

完成

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

  • Emacs: <Tab>

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

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

PossibleCompletions

显示可能的完成列表。

  • 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

接受内联或所选建议的下一个字词。

  • 函数未绑定。

AcceptSuggestion

接受当前内联或所选建议。

  • 函数未绑定。

CaptureScreen

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

  • 函数未绑定。

ClearScreen

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

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

DigitArgument

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

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

InvokePrompt

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

  • 函数未绑定。

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

插入密钥。

  • 函数未绑定。

ShowKeyBindings

显示所有绑定键。

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

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>

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 插入模式: <Ctrl+s>
  • Vi 命令模式: <?><Ctrl+s>

自定义键绑定

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)

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

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

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

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

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

void RemoveKeyHandler(string[] key)

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

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

替换部分输入。 此操作支持撤消/恢复。 这优先于删除后插入,因为它被视为撤消的单个操作。

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 维护一个历史记录文件,其中包含从命令行输入的所有命令和数据。 历史记录文件是名为 的文件 $($host.Name)_history.txt。 在 Windows 系统上,历史记录文件存储在 中 $env:APPDATA\Microsoft\Windows\PowerShell\PSReadLine。 在非 Windows 系统上,历史记录文件存储在 $env:XDG_DATA_HOME/powershell/PSReadLine$env:HOME/.local/share/powershell/PSReadLine

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

  • password
  • asplaintext
  • 令牌
  • apikey
  • secret

反馈 & 参与 PSReadLine

GitHub 上的 PSReadLine

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

另请参阅

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