如果你经常在 PowerShell 里敲命令,大概经历过这些场景:输错一个字母只能重敲、补全菜单超出屏幕直接失效、git 的分支和 npm 的脚本永远补不出来。PowerShell 自带的 Tab 补全能用,但离“好用”还有一段距离。
PSCompletions 是一个补全管理器,基于 Rust + Lua 构建,为 PowerShell 带来更完善的 Tab 补全菜单。它和 PSReadLine 配合,可以显著改善命令行的补全体验。下面是一份从零开始的配置指南。
先理解一个关键点
PSCompletions 的官方文档只规定了三步核心流程:直接 Import-Module PSCompletions、运行 psc update 同步补全库、用 psc add 启用具体补全。它本身不要求你配置 PSReadLine。
本文涉及的 PSReadLine 配置(历史搜索、行内预测等)是补充增强,让补全体验更完整,并非 PSCompletions 的硬性依赖。如果你只想快速用上 PSCompletions,看完安装部分就可以直接跳到最后。
安装 PSCompletions
假设你已经装好 Scoop 并配置了基础 bucket。官方推荐的 Scoop 途径是通过 abyss bucket 安装:
scoop bucket add abyss https://github.com/abgox/abyss
scoop install abyss/abgox.PSCompletions
安装完成后,Scoop 会自动完成三件事:把模块链接到 Scoop 的 modules 目录、将 modules 目录写入用户级 PSModulePath、建立持久化数据目录。
注意:不要同时安装 extras bucket 的 pscompletions 和 abyss 的 abgox.PSCompletions,两者提供同一个模块,会冲突。选一个即可。
配置 $PROFILE
核心原则:直接导入,不要包装
这是 PSCompletions 最关键的约束:Import-Module PSCompletions 必须直接调用。
以下写法都会导致模块失效:
# ❌ 包在函数里
function Load-Module { Import-Module PSCompletions }
Load-Module
# ❌ 用变量传路径
$path = "D:\scoop\modules\PSCompletions\PSCompletions.psd1"
Import-Module $path
# ✅ 只有这一种是正确的
Import-Module PSCompletions
官方 FAQ 明确说明了这一点,嵌套调用或相对导入顺序不当都会出问题。
完整的 profile 配置
打开 $PROFILE(PowerShell 7 路径通常是 Documents\PowerShell\Microsoft.PowerShell_profile.ps1),加入以下内容:
# ==================== PSReadLine 增强 ====================
# PSCompletions 的补全菜单构建在 PSReadLine 之上,先配置基础。
# 行内历史预测:输入时显示灰色建议,右方向键接受。
# 需要终端支持虚拟终端(Windows Terminal / VS Code 终端均可)。
try {
Set-PSReadLineOption -PredictionSource HistoryAndPlugin
# 保持 InlineView;ListView 会与 PSCompletions 的 Tab 菜单抢屏幕空间
Set-PSReadLineOption -PredictionViewStyle InlineView
}
catch { }
# 关闭 Tab 触发补全菜单时的提示音
Set-PSReadLineOption -BellStyle None
# 上下键按前缀搜索历史(空前缀时等同于逐条翻历史)
Set-PSReadLineKeyHandler -Key UpArrow -Function HistorySearchBackward
Set-PSReadLineKeyHandler -Key DownArrow -Function HistorySearchForward
# ==================== PSCompletions ====================
# 官方要求:必须直接调用,不要包在函数或脚本块里。
Import-Module PSCompletions
关于 try/catch 的说明
预测功能在不支持虚拟终端的终端里会抛异常。$Host.UI.SupportsVirtualTerminal 这个判据不太可靠——实测它可能返回 True 但 PSReadLine 仍然报错。所以直接用 try/catch 包住,以 PSReadLine 自己的行为为准。
同步与启用补全
配置好 profile 后,新开一个终端(PSModulePath 的变更需要新会话才能生效),然后执行:
# 同步内置补全库(首次必做)
psc update
# 启用单个补全
psc add git
# 查看已启用的补全
psc list
批量启用:按实际安装的工具匹配
如果你不想盲目全装,只启用本机 PATH 里真实存在的命令对应的补全,可以用这段脚本:
$idx = Get-Content "D:\scoop\persist\pscompletions\data\temp\completions.json" -Raw | ConvertFrom-Json
$names = $idx.update.PSObject.Properties.Name
$target = @($names | Where-Object {
(Get-Command $_ -ErrorAction SilentlyContinue) -and $_ -ne "psc" -and $_ -ne "git"
})
psc add @target
PSCompletions 内置补全库覆盖数百个常用命令,按需启用是最省心的做法。
补全菜单的用法
过滤语法
菜单默认使用通配匹配(不区分大小写):
| 输入 | 效果 |
|---|---|
co |
匹配包含 co 的项,如 config、completion |
a*d |
* 匹配任意字符,匹配 add、and |
^add |
只匹配以 add 开头的项 |
*vscode |
单个 * 开头切换为子序列匹配,匹配 Visual Studio Code |
如果想默认使用子序列匹配:
psc config menu filter_mode subsequence
常用按键
| 操作 | 按键 |
|---|---|
| 选中上一个/下一个 | Up/Down,或 Tab 循环 |
| 选用当前项 | Space 或 Enter |
| 退出菜单 | Esc 或 Ctrl+c |
菜单支持鼠标滚轮浏览、单击选中、双击选用。
路径补全
用路径标识符显式获取路径补全:/、./、../、~/、\、.\ 等。
验证配置
新开终端后,执行以下命令确认一切正常:
# 模块加载 + 补全数量
Get-Module PSCompletions | Select-Object -Last 1 -ExpandProperty Version
(psc list | Measure-Object).Count
# PSReadLine 设置
Get-PSReadLineOption | Select-Object PredictionSource, PredictionViewStyle, BellStyle
# Tab 键应被 PSCompletions 接管,显示为 CustomAction
Get-PSReadLineKeyHandler | Where-Object { $_.Key -eq "Tab" } | Select-Object Key, Function
预期看到:
PredictionSource : HistoryAndPlugin
PredictionViewStyle : InlineView
BellStyle : None
Key Function
--- --------
Tab CustomAction
最后
PSCompletions 的价值在于它把“补全”这件事从零散的工具脚本提升到了统一管理的层面——动态补全(git 分支、npm 脚本按需生成)、滚动菜单、通配符过滤、按历史排序,这些都是原生 Tab 补全缺失的能力。
配合 PSReadLine 的历史搜索和行内预测,整个命令行交互的流畅度会上一个台阶。
原文 https://blog.csdn.net/2301_79518550/article/details/166012228