如何使 PowerShell 选项卡完成像 Bash 一样工作

假设我的工作目录中有以下文件:

buildBar.bat
buildFoo.bat
buildHouse.bat

然后在命令提示符 ./buTAB中键入以下内容。

  • 在 Bash 中,它被扩展为 ./build

  • 在 PowerShell 中,它被展开为 ./buildBar.bat——列表中的第一项。

  • 在 Cmd 中,行为与 PowerShell 相同。

我更喜欢 Bash 的行为——有没有办法让 PowerShell 像 Bash 一样行为?

68228 次浏览

看看这里,不是你真正想要的:

PowerTab

但我认为这是 PowerShell 控制台最好的选项卡扩展特性! ! !

修改 Tab 达到您想要的效果。请记住,也许它完成,直到结束,如果你再次按标签页的新建议修改从您最初按下的关键。我非常喜欢实际的行为,我希望行写得越快越好。最后,不要忘记通配符扩展,例如: bu * h [ Tab ]自动完成到 buildHouse.bat

现在可以使用 PSReadline 让 PowerShell 执行 Bash 风格的完成。

看看博客文章 在 PowerShell 中类似 Bash 的 tab 补全

PowerShell 的新版本包括 PSReadline,它可以用来实现以下功能:

Set-PSReadlineKeyHandler -Key Tab -Function Complete

或者,使其更像 bash,您可以使用箭头键导航可用选项:

Set-PSReadlineKeyHandler -Key Tab -Function MenuComplete

要使其永久化,请将此命令放入您的 powershell 配置文件中,该配置文件由 $PROFILE(通常为 C:\Users\[User]\Documents\WindowsPowerShell\profile.ps1)定义。

tab只完成命令名,而不是它以前的参数/参数。

还可以自动完成带有历史参数的完整命令,请设置以下键绑定。

Set-PSReadlineKeyHandler -Key UpArrow -Function HistorySearchBackward
Set-PSReadlineKeyHandler -Key DownArrow -Function HistorySearchForward

现在,键入几个命令名字符并使用向上/向下箭头从历史记录中自动完成该命令(带参数)。

节省时间。


详见: 启动你的 PowerShell

使用 Powershell Core,我们可以将 PSReadLine 的 PrejectionSource 属性设置为 历史,以获得自动建议。更多细节请参考 YouTube 视频 Https://youtu.be/i0iize0dunw

# keep or reset to powershell default
Set-PSReadlineKeyHandler -Key Shift+Tab -Function TabCompletePrevious


# define Ctrl+Tab like default Tab behavior
Set-PSReadlineKeyHandler -Key Ctrl+Tab -Function TabCompleteNext


# define Tab like bash
Set-PSReadlineKeyHandler -Key Tab -Function Complete

实际上,bash 行为是由 /etc/inputrc控制的,每个发行版都有很大的不同。

因此,下面介绍如何使 PowerShell 的行为更像一个具有正常默认值的 bash (Gentoo,CentOS)

# Press tab key to get a list of possible completions (also on Ctrl+Space)


Set-PSReadlineKeyHandler -Chord Tab -Function PossibleCompletions




# Search history based on input on PageUp/PageDown


Set-PSReadlineKeyHandler -Key PageUp -Function  HistorySearchBackward
Set-PSReadlineKeyHandler -Key PageDown -Function HistorySearchForward




# If you feel cursor should be at the end of the line after pressing PageUp/PageDown (saving you an End press), you may add:


Set-PSReadLineOption -HistorySearchCursorMovesToEnd


# Set-PSReadLineOption -HistorySearchCursorMovesToEnd:$False to remove