PSReadLine

about_PSReadLine

简短说明

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

详细说明

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

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

PSReadLine 需要 PowerShell 3.0 或更高版本以及控制台主机。 它在 PowerShell ISE 中不起作用。 它在 Visual Studio Code 控制台中正常工作。

注意

从 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>
  • 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,Space>

DeleteCharOrExit

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

  • Emacs: <Ctrl+d>

DeleteEndOfWord

删除到单词末尾。

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

DeleteLine

删除当前行,启用撤消。

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

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:<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,Space>

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>

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>

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>

NextWordEnd

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

  • Vi 命令模式: <e>

PreviousLine

将光标移动到上一行。

  • 函数未绑定。

ShellBackwardWord

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

  • 函数未绑定。

ShellForwardWord

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

  • 函数未绑定。

ShellNextWord

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

  • 函数未绑定。

ViBackwardWord

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

  • Vi 命令模式: <b>

ViEndOfGlob

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

  • Vi 命令模式: <E>

ViEndOfPreviousGlob

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

  • 函数未绑定。

ViGotoBrace

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

  • Vi 命令模式: <%>

ViNextGlob

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

  • Vi 命令模式: <W>

ViNextWord

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

  • Vi 命令模式: <w>

历史记录函数

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+Space>
  • Emacs: <Ctrl+Space>

PossibleCompletions

显示可能完成的列表。

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

TabCompleteNext

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

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

TabCompletePrevious

尝试使用上一个可用完成来完成光标周围的文本。

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

ViTabCompleteNext

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

  • Vi 插入模式: <Tab>

ViTabCompletePrevious

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

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

其他函数

CaptureScreen

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

  • 函数未绑定。

ClearScreen

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

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

DigitArgument

启动要传递给其他函数的新数字参数。

  • 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+5><Alt+4><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+>'

搜索函数

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 - 任意参数。 大多数情况下,这将是用户从 Key 绑定 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)

此函数由 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 维护一个历史记录文件,其中包含从命令行输入的所有命令和数据。 这可能包含敏感数据,包括密码。 例如,如果使用 ConvertTo-SecureString cmdlet,密码将作为纯文本记录在历史记录文件中。 历史记录文件是名为 的文件 $($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

GitHub 上的 PSReadLine

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

另请参阅

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