1. 为什么我建议把 Windows Terminal 当默认终端用
说实话,以前用 Windows 自带的那个老终端(conhost),我是能忍则忍。界面粗糙不说,开一个窗口就是一个窗口,调试前端要开三四个,标题栏上全是乱码一样的路径名。每次要复制一段命令还得先右键选标记,再框选,一不小心选多了又得重来,真的耽误时间。直到 Windows Terminal 出现,我才觉得 Windows 上终于有了一个“像样”的终端。
Windows Terminal 本质上是一个现代终端宿主程序,它负责把各种命令行 shell——比如 PowerShell、CMD、WSL、SSH 会话——统一装进一个支持 GPU 加速渲染的图形界面里。你可以把它理解成:给命令行套上了一层“现代化皮肤”,但又不只是皮肤,因为它从渲染、标签管理、分屏布局到配色字体,全部都是可配置的。以前打开一个终端就是孤零零一个黑窗口,现在打开的是一个具备多标签、多窗格能力的“命令行工作台”。
这套配置适合谁?我觉得覆盖面很广。如果你天天跟 Git、Node、Python、Docker 打交道,那终端就是你的主战场,值得花半小时把环境调顺手;如果你只是偶尔跑一下命令,一套合理的配置也能让你少踩很多莫名其妙的坑,比如中文乱码、字体发虚、复制粘贴失灵。就算你是运维或者数据分析岗,天天要连服务器、跑脚本,把本地终端调好,效率提升也是肉眼可见的。
说实话,这套东西没什么学习门槛,配置文件也不复杂,核心就两块:一个是 Windows Terminal 的界面配置文件 settings.json,另一个是 PowerShell 的启动脚本 profile.ps1。把这两块吃透,你就掌握了 Windows 终端的“半壁江山”。下面我按实际操作顺序,一步步讲清楚。
2. 先把 Windows Terminal 的配置文件吃透
2.1 配置文件的藏身之处,以及怎么打开
Windows Terminal 的配置都集中在一个 JSON 文件里,叫 settings.json。你不需要记住它的完整路径,最简单的办法是打开终端,按Ctrl + ,(逗号),或者点击标题栏的下拉箭头,选择“设置”,终端会自动帮你打开这个文件。
如果你喜欢用编辑器直接改,它在磁盘上的位置通常在:
%LOCALAPPDATA%\Packages\Windows Terminal 安装目录\LocalState\settings.json这个路径每个机器可能不太一样,所以我一直建议用Ctrl + ,打开,省事又保险。这个文件是实时生效的——你保存之后,已经打开的终端窗口会立刻重载配置,不需要重启程序。这个特性非常友好,改坏了大不了把内容回滚,不用反复开关窗口。
文件内容分为几个大块:profiles里定义每个 shell 的独立配置,actions里是快捷键,schemes里是配色方案,还有一些全局设置在最外层。新手最容易犯的错误是直接在defaults里写配色、写字体,结果发现其他 profile 没生效,原因就是没搞清楚“全局默认”和“单个 profile”的层级关系。
2.2 核心字段解读:字体、背景、启动目录
我建议你优先关注这几个字段,因为它们的收益最直接。
字体设置。font对象里的face字段控制字体。默认的 Cascadia Code 已经不错了,但我更推荐装一个带 Nerd Font 补丁的等宽字体,比如 JetBrainsMono Nerd Font 或者 MesloLGM Nerd Font。为什么要带 Nerd Font?因为 Oh My Posh 这类工具在提示符里会显示 Git 分支图标、文件夹图标、电源符号,普通字体没有这些字形,装完不匹配的字体,屏幕上就是一堆“口口口”小方块。字体这块的坑我踩得很扎实,后面常见问题里细说。
"profiles": { "defaults": { "font": { "face": "JetBrainsMono Nerd Font", "size": 12 } } }背景效果。Windows Terminal 支持亚克力材质和透明度调节。我喜欢把背景调成半透明,眼睛不至于长时间盯着纯黑屏幕发酸。关键字段是opacity和useAcrylic:
"defaults": { "useAcrylic": true, "opacity": 92 }这个值你可以按环境光线自己调,如果白天在亮一点的环境写代码,透明度低一点(比如 95)更舒服;晚上暗光环境,透明度太高反而会看到底下窗口的内容,干扰视线。
启动目录。很多人刚配置终端的时候都犯过这个毛病:每次打开都是C:\Users\你的用户名,然后要一路cd进项目。不如直接指定某几个常用 project 目录作为不同 shell 的起始位置:
"profiles": { "list": [ { "name": "PowerShell", "commandline": "pwsh.exe", "startingDirectory": "D:\\Projects" } ] }这里有个细节:路径里的反斜杠在 JSON 里必须写成\\,否则 JSON 解析直接报错。我第一次就漏了这个,保存后终端罢工,排查半天才想起来。
2.3 快捷键规划:把常用操作变成肌肉记忆
Windows Terminal 的快捷键系统非常灵活,在actions数组里可以给任意命令绑定组合键。以下是我常年保留的一组配置,实测下来比鼠标点击快得多:
| 功能 | 快捷键 | 备注 |
|---|---|---|
| 新建标签页 | Ctrl + Shift + T | 默认就有,但我重绑了 |
| 关闭标签页 | Ctrl + Shift + W | 手快点错也能撤销?不能,但无妨 |
| 左右分屏 | Alt + Shift + D | 原先是 Duplicate,我改成分屏 |
| 在分屏窗格间切换 | Alt + ←→↑↓ | 比鼠标点选顺手 |
| 搜索终端内容 | Ctrl + Shift + F | 长日志场景必备 |
| 打开设置 | Ctrl + , | 习惯和老 VS Code 一致 |
| 切换标签页 | Ctrl + Tab | 循环切换,不翻车 |
自定义快捷键时要注意别和系统级快捷键冲突。比如Win + 数字键是切换任务栏应用,你最好别绑这种键。我也试过把Ctrl + Alt + 数字用来切标签,结果在某些远程桌面环境下被系统抢走了,最后还是用回Ctrl + Tab这套最省心的方案。
2.4 我的一个经验:别把所有配置写死在全局
很多教程会把所有配置都塞到defaults里,但如果你和我一样,既用 PowerShell 又用 WSL 甚至偶尔用 CMD,就应该利用 profile 的继承特性:公共设置写在defaults,每个 shell 独有的设置写在各自的 profile 里。比如 WSL 里的主题我更喜欢用暗色,而 Windows PowerShell 里我想要浅色,那就分开配置colorScheme。这样后续要调整某一个 shell,不会影响其他的,出错概率小很多。
3. PowerShell 环境调校:从能用变成好用
3.1 第一关:解决脚本执行策略问题
每次重装系统或者换新机器,第一件事不是美化提示符,而是把 PowerShell 的执行策略调整到可用状态。默认策略下,运行本地脚本会直接报“禁止运行脚本”。这是因为 Windows 出于安全考虑,默认只允许运行签名的脚本。
我一般这样设置,只对当前用户生效,不需要管理员权限:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUserRemoteSigned的含义是:本地创建的脚本可以直接运行,从网络下载的脚本必须带有受信任的签名。这个策略既保证了日常使用的自由,又不会让系统彻底不设防。设置完可以用Get-ExecutionPolicy验证一下,输出是RemoteSigned就成了。
3.2 认识 $PROFILE:你的命令中心
PowerShell 每次启动都会执行一个特殊的脚本文件,叫 profile。它相当于 bash 里的.bashrc,你希望每次打开终端都生效的东西,都可以写在这里。
先看一眼这个文件的真实路径:
$PROFILE每个人的结果不一样,常见是Documents\PowerShell\Microsoft.PowerShell_profile.ps1(PowerShell 7)或者Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1(Windows PowerShell 5.1)。注意,PowerShell 7 和 Windows PowerShell 的 profile 路径是分开的,各自维护各自的。如果文件不存在,先创建:
if (!(Test-Path $PROFILE)) { New-Item -ItemType File -Path $PROFILE -Force }建议给 profile 也建立一个符号链接或者快捷方式,方便你在 VS Code 里快速编辑。我自己习惯用code $PROFILE打开,配合 PowerShell 插件,写配置的时候有语法高亮和智能提示,比记事本强太多。
3.3 PSReadLine:让补全和搜索变得流畅
PSReadLine 是 PowerShell 自带的命令行编辑模块,默认就有,但你多半没把它配置到最好用的状态。我最离不开的几个功能是:
- 历史预测:按下方向键下键,会基于历史命令自动补全后续内容。
- 菜单补全:按 Tab 时如果选项多个,会弹出一个菜单供你选,不用反复按键。
- 字符搜索:
Ctrl + R搜索历史命令,输入几个字母就过滤。
在你的 profile 里加上这几行,体验立刻不一样:
Set-PSReadLineOption -PredictionSource History Set-PSReadLineOption -PredictionViewStyle InlineView Set-PSReadLineKeyHandler -Key Tab -Function MenuComplete Set-PSReadLineOption -HistorySearchCursorMovesToEnd有一个细节:PredictionViewStyle的InlineView模式会在你打字的时候,以灰色半透明字体在光标后面显示预测命令,Enter 就执行,方向键右接受,这个交互我第一次用就回不去了。如果你不习惯这种“预言家”模式,也可以改成ListView,在下方弹出列表,更像 IDE 的自动补全。
3.4 提示符美化:一条命令看出当前项目状态
默认的 PowerShell 提示符会显示一个完整路径,又长又占地方。我改造的目标是:左侧显示当前目录简写、Git 分支名、分支是否干净;右侧显示上一条命令的执行耗时。实现这种效果,我强烈推荐直接用 Oh My Posh,而不是自己手写 promise 函数。原因很简单:它已经把各种符号、颜色、主题都封装好了,你要做的只是选一个喜欢的主题,然后在 profile 里初始化它。
安装 Oh My Posh 的步骤大概是:
winget install --name "Oh My Posh" --exact或者用官方推荐的安装脚本也可以。装完后,在 profile 里加一行:
oh-my-posh init pwsh --config "$env:USERPROFILE\.config\oh-my-posh\theme.omp.json" | Invoke-Expression--config指向你想用的主题文件,Oh My Posh 自带了几十个主题,存放位置在你安装目录的themes文件夹里。我最常用的几个主题是jandedobbeleer、powerlevel10k_rainbow和atomic。如果不想指定主题,可以直接用oh-my-posh init pwsh,默认会加载一个内置的精简主题,但我实测下来,这种默认主题的信息密度偏低,不太够用。
这句配置看起来像魔法咒语,其实拆开很简单:oh-my-posh init pwsh会生成一段初始化代码,这段代码通过Invoke-Expression在当前会话里执行。它的作用是注册一个函数,每次显示提示符时,Oh My Posh 会计算并渲染出你看到的那些分支、耗时、路径信息。
还想提一点:如果你同时装过 posh-git,建议不要和 Oh My Posh 的 Git 模块叠加使用,两者都渲染 Git 信息会导致提示符刷得很慢,明显发卡。我后来把 posh-git 卸载了,只靠 Oh My Posh 的 Git segment,速度很稳。
4. 可以直接抄作业的配置片段
4.1 Windows Terminal settings.json 关键片段
下面这段是我当前在用的配置的核心部分,去掉了无关紧要的注释,直接看关键设置:
{ "profiles": { "defaults": { "font": { "face": "JetBrainsMono Nerd Font", "size": 12 }, "opacity": 92, "useAcrylic": true, "colorScheme": "One Half Dark", "padding": "8, 8, 8, 8" }, "list": [ { "name": "PowerShell", "commandline": "pwsh.exe", "startingDirectory": "D:\\Projects", "colorScheme": "One Half Dark" }, { "name": "Windows PowerShell", "commandline": "powershell.exe", "startingDirectory": "D:\\Projects", "colorScheme": "One Half Dark" } ] }, "actions": [ { "command": { "action": "splitPane", "split": "right" }, "keys": "alt+shift+d" }, { "command": { "action": "find" }, "keys": "ctrl+shift+f" } ] }注意几个容易踩的坑:padding设置为字符和像素混合?不是,padding的单位是像素,四个值分别是上右下左。设成 8 像素,视觉上不会太挤,也不会浪费空间。useAcrylic开启后如果发现 CPU 占用偏高,可以关掉它,只用纯透明背景,效果也还行。colorScheme的值必须和文件里schemes数组里定义的名称完全一致,大小写都敏感,写错一个字终端就直接忽略。
配色方案我喜欢用 One Half Dark,比纯黑柔和,长时间看代码眼睛没那么累。窗口标题栏和背景的对比度也够,不至于看不清文字。
4.2 PowerShell profile.ps1 推荐片段
下面是我精简后的 profile,不是最全的,但每个函数都是高频使用:
# 基础初始化 Set-PSReadLineOption -PredictionSource History Set-PSReadLineOption -PredictionViewStyle InlineView Set-PSReadLineKeyHandler -Key Tab -Function MenuComplete Set-PSReadLineOption -HistorySearchCursorMovesToEnd # Oh My Posh 提示符 oh-my-posh init pwsh --config "$env:USERPROFILE\.config\oh-my-posh\jandedobbeleer.omp.json" | Invoke-Expression # 常用别名 Set-Alias ll Get-ChildItem Set-Alias g git Set-Alias k kubectl Set-Alias d docker # 快速进入常用目录 function dev { Set-Location D:\Projects }这一小段配置足以应付日常八成需求。别在 profile 里放太多花哨的东西,尤其是那些“每次打开都要运行的命令”——模块加载、网络请求、日志写入,都会拖慢启动速度。我见过一个配置,光是加载一堆模块就花了 3 秒,体验比默认终端还差。
4.3 我的两套方案:最小化和进阶
如果你是新手,我建议先用“最小化方案”:只配置字体、配色、PSReadLine 和两三个别名,跑两周熟悉了再慢慢加。
如果你追求一步到位,可以在最小化方案基础上加上 oh-my-posh、复制到剪贴板的函数、快速新建 SSH 会话的函数、以及 zoxide(目录跳转工具)。zoxide 这个工具可以说是我用过的跳转效率神器,它记录你的历史目录,然后z pro就会带你到D:\Projects这类匹配最频繁的目录。Windows Terminal 配 zoxide,路径切换基本靠肌肉记忆。
注意一点:zoxide 需要和 profile 集成,官方给出的做法是在 profile 里写一句Invoke-Expression (& { (zoxide init powershell | Out-String) })。这句代码每次启动都会执行,但由于 zoxide 本身是个轻量工具,启动开销很小,实测不影响感受。
5. 常见问题与排查技巧实录
5.1 图标变方块、中文变乱码,怎么破
这是配置过程中最头痛的问题,没有之一。症状是提示符里原本应该是 Git 分支图标的区域变成了一个个空心方块,或者中文文件名显示成乱码。
大部分情况下,这是字体不支持这些字形导致的。解决思路分两步:
- 安装一个 Nerd Font 字体,比如 JetBrainsMono Nerd Font 或 MesloLGM Nerd Font。
- 在 Windows Terminal 的设置里,把字体 face 修改为对应的字体名,同时把终端环境的代码页切到 UTF-8,或者统一使用
chcp 65001。
还有个隐蔽的问题是,某些第三方 SSH 客户端或远程服务器不支持 UTF-8,导致你连上去之后显示乱码。这就不是你本机的锅了,应该检查服务器端编码,或者在你本机的 shell 配置里使用兼容性更好的字体 fallback 策略。
我在排查时一般先做一个最小化测试:新建一个 profile,把字体设为Consolas(系统自带),如果图标恢复了方块,那就说明是字体问题;如果还是乱码,重点检查环境变量里的LANG或代码页。这个方法能快速定位问题方向。
5.2 提示“禁止运行脚本”,怎么处理最稳妥
第一次跑 profile 或者运行某个脚本,PowerShell 报错:禁止运行脚本。这个问题的根因就是执行策略。
最省心的做法是我上文提到的:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser但这里有个细节:如果你当前的 PowerShell 是以管理员身份运行的,而你要设置的是 LocalMachine 级别的策略,那么作用范围要写对。很多人在LocalMachine作用域设置时发现依然不生效,是因为策略被组策略覆盖了。检查方法是运行:
Get-ExecutionPolicy -List会看到几个作用域的执行策略,从上到下按优先顺序排列。如果最上面显示Undefined,那就放心设置CurrentUser;如果显示Restricted且来源是组策略,那就得改组策略或者联系管理员,靠命令行是改不掉的。
5.3 启动变慢了,到底是谁拖的后腿
你可能会遇到这种情况:Windows Terminal 打开很快,但等 PowerShell 真正准备好可以输入命令,要等好几秒。排查思路按嫌疑从大到小排列:
- profile 里加载的模块太多。每一条
Import-Module或有网络请求的操作都会增加启动时间。用Measure-Command { . $PROFILE }可以量化启动耗时。 - Oh My Posh 配置的主题包含大量自定义脚本。个别主题会执行 Shell 集成脚本、Python 环境探测,慢得很明显。换一个精简主题试试。
- 反病毒软件扫描。这个最玄学,但确实存在。终端启动时疯狂读写文件会触发实时扫描,把 PowerShell 目录添加到排除列表会有缓解。
- PowerShell 7 首次启动时的初始化。有时候是模块分析缓存问题,可以在 PowerShell 7 里执行
$PSNativeCommandArgumentPassing等命令看提示,或者更新到最新版本。
我现在的做法是:保持 profile 只做“声明”,不做“执行”。也就是说,只定义函数和别名,不在启动时加载复杂的第三方模块。需要某个功能时,手动调用函数再动态加载。这样启动时间稳定在 500 毫秒左右,体感上基本是秒开。
5.4 改了配置却没变化,八成是这些原因
改 settings.json 保存后,终端窗口应该立刻刷新。如果发现没有变化,先检查这几件事:
- 保存到了错误的文件。有人用记事本打开了另一个同名 JSON,改完保存到一个副本里。建议用
Ctrl + ,打开,避免路径混淆。 - JSON 语法错误。一个多余逗号、一个缺失引号,都会导致配置文件解析失败,终端会忽略这次改动。解决办法是看看有没有弹窗提示解析错误,或者用 VS Code 打开 JSON 文件,观察是否有红色波浪线。
- 字段名拼写错误。Windows Terminal 的 JSON 字段是大小写敏感的。比如
fontFace不对,正确的是嵌套在font对象里的face。我见过太多人把这两个搞混。 - profile 的继承覆盖。你在
defaults里设置了colorScheme,但某个具体 profile 内部又写了一个colorScheme,后者会覆盖前者。检查一下是否被“局部配置”盖了。
这里有个排查技巧:在 Windows Terminal 里打开“命令面板”(Ctrl + Shift + P),搜索“设置”,选择“打开 JSON 文件”,确保你能看到当前真实的配置内容,再用代码编辑器检查语法。这样基本能解决 80% 的“改了不生效”。
5.5 快捷键不响应,可能不是终端的问题
如果你发现某个快捷键在终端里怎么按都没反应,先别急着改配置。试试在普通 Windows 窗口里按同样的组合键,看是不是被系统全局程序抢占了。我用Alt + Shift + D分屏时,就曾经和某个截图工具的全局快捷键冲突过,导致按下去一直弹截图界面。解决办法有两个:要么在 Windows Terminal 里换一个组合键,要么在冲突的那个软件里取消全局热键。
另外,如果你用远程桌面(RDP)连接到另一台机器,终端里收到的按键和本地是不一样的,个别 Ctrl+ 组合键会被远程桌面协议吞掉。这种情况下建议改用更冷门的组合键,比如Ctrl + Alt + D,避免系统级干扰。
6. 最后一点实操心得
整套配置折腾下来,我最深的感受是:工具链的复杂度一定要和自己的使用频率匹配。刚开始我也学别人把配置堆得很满,结果每次打开终端都要等两秒,提示符花里胡哨,但真正常用的也就是那二十来个命令。后来又花了半天精简,最后留下来的都是高频实用的功能:PSReadLine 智能补全、Oh My Posh 的分支和耗时显示、zoxide 的目录跳转,以及一套不会冲突的快捷键。
如果你也是第一次配,建议先跑两周默认配置,把自己平时高频操作记下来,再针对性地加功能。这样配置出来的终端才是为你服务的,而不是为了截图好看。另外,所有配置文件都建议用 Git 管理起来,万一改坏了,随时可以回滚。这些看起来都是小细节,但积累起来,就是每天省下几分钟、少烦几次心的差距。