把 Windows 上的 WSL Ubuntu 终端美化成 macOS 上 iTerm2 那样的风格,并不只是为了截图好看。我自己是重度终端用户,天天要在 Windows 上做 Linux 开发和运维排查,盯着默认的黑框白字工作,效率和心情都会打折。折腾了大概一周,我最终用 Windows Terminal + WSL2 + Ubuntu + zsh/oh-my-zsh + powerlevel10k + tmux 这套组合,把命令行整理成了接近 iTerm2 的观感:半透明背景、左对齐电源线风格状态栏、分屏窗格、彩色语法高亮。这篇文章会从 WSL 安装讲起,一直写到最终视觉呈现,完全照着做就能得到一套可以长期使用的配置,适合所有想在 Windows 下获得接近原生 Linux 开发体验的人。
1. 先拆开 iTerm2 风格到底包含什么
1.1 别急着复制配置,先建立目标画面
很多人一上来就搜“iTerm2 美化配置”,整段 JSON 往 Windows Terminal 里一贴,结果要么图标变方框,要么背景透明度没生效,最后不了了之。我在折腾时先把 iTerm2 的观感拆成了四个元素,按这个思路逐项实现,基本不会乱:
- 半透明背景加轻微模糊:iTerm2 的玻璃质感靠的是 Transparency 和 Blur 两个参数,Windows Terminal 通过 opacity 和 acrylic 也能做到。
- 高信息密度状态栏:打开终端就应该知道当前目录、Git 分支、Python 虚拟环境、上条命令执行时间,而不是只看到一个孤零零的光标。
- 分屏窗格与快捷键记忆:iTerm2 的左右分屏、上下分屏、窗格切换手感,tmux 可以几乎一比一复刻。
- 字体与配色统一:没有 Nerd Font 的终端图标全是空心方框,配色不统一的话,终端和编辑器放在一起会像两个时代的产物。
这四个元素里,最容易翻车的其实是第一个和第三个,因为 Windows Terminal 和 tmux 各有自己的“默认世界”,不做桥接就会出现配置互相覆盖的问题。
1.2 方案选型:为什么最终留在 Windows Terminal + WSL2
我并不是一开始就用这套方案,先后试过 Git Bash、ConEmu、Tabby、Hyper。简单说下对比:Git Bash 轻量但缺少真正的 Linux 内核,跑 Docker 和依赖系统调用的工具会碰壁;ConEmu 是老牌终端,但配置项太散,界面风格偏老旧;Tabby 和 Hyper 都是 Electron 壳,安装插件确实方便,但启动速度和内存占用在长期使用中会让人很不舒服。Windows Terminal 是微软官方维护,渲染性能好,对 WSL 分发有原生支持,配置文件是纯 JSON,可以放进 dotfiles 仓库做版本管理,这一点对我这种经常换机器的人非常友好。
WSL2 相比 WSL1 最大的不同是它跑在真正的轻量虚拟机里,拥有完整 Linux 内核,系统调用兼容性高。这意味着 Ubuntu 的 apt 包可以直接装,Docker Desktop 可以以后端模式跑在 WSL2 上,PyTorch 的 CUDA 环境也能在 WSL 里配置。既然最终目标是“在 Windows 上获得接近 macOS + Linux 的开发体验”,WSL2 是当前最合理的底座。
2. 从零搭建基础环境:WSL2、Ubuntu 与 Windows Terminal
2.1 安装 WSL2 最省心的命令以及常见报错
建议在全新的 Windows 10 22H2 或 Windows 11 上操作。以管理员身份打开 PowerShell,直接执行:
wsl --install这条命令会帮你启用 Windows Subsystem for Linux、虚拟机平台,并自动下载最新 WSL2 内核,默认还会装一个 Ubuntu 发行版。如果默认发行版不是你想要的,可以追加参数:
wsl --install -d Ubuntu-22.04安装完成后重启系统,Ubuntu 会弹出第一次初始化窗口,设置 Linux 用户名和密码。这里我提醒一句:Linux 用户名会体现在终端的提示符里,尽量用全小写字母加数字,别用大写,避免后面一些工具出现大小写相关的奇怪问题。
装完后确认版本信息:
wsl --status wsl -l -v如果发行版版本显示是 1,就手动升级:
wsl --set-version Ubuntu-22.04 2每次重装系统后我还会顺手执行一次wsl --update,把 WSL 内核组件更新到最新,避免旧内核与新版 Windows 的安全更新出现兼容性摩擦。
2.2 安装太慢时的处理:手动安装 Ubuntu
wsl --install 最常见的抱怨就是“太慢了”。慢的环节通常在两个地方:一个是启用功能后的组件下载,一个是发行版镜像的下拉。如果卡了很久,可以换手动路线。先到 Ubuntu 官网下载 WSL 专用的镜像包(后缀一般是 .appx 或 .msixbundle),下载完成后在管理员 PowerShell 里执行:
Add-AppxPackage -Path .\Ubuntu2204.appx这能绕开 Store 的分发网络,速度会明显好转。还有一种情况是系统提示wsl/installdistro/service/registerdistro/createvm/hcs/error_file_not_found,这个错误我遇到过两次,基本都和“虚拟化相关组件虽然启用了,但没有重启生效”有关。处理方式是重启,并进 BIOS 确认虚拟化技术处于开启状态,然后在管理员终端里执行:
bcdedit /set hypervisorlaunchtype auto再重启一次。如果你用的是 Windows Server 2022,wsl --install 的自动流程可能不完整,更建议手动打开“适用于 Linux 的 Windows 子系统”功能后再安装。
2.3 把 WSL 整体迁移到 D 盘
C 盘空间不够是催生这个需求的头号原因。WSL2 的虚拟磁盘文件是 vhdx,平时看着不大,跑几个 Docker 镜像、装些编译依赖后会迅速膨胀。迁移步骤不复杂,但要按顺序执行:
wsl --shutdown wsl --export Ubuntu-22.04 D:\wsl\ubuntu-22.04.tar wsl --unregister Ubuntu-22.04 wsl --import Ubuntu-22.04 D:\wsl\ubuntu-22.04 D:\wsl\ubuntu-22.04.tar --version 2执行到第二行时,发行版可能会在列表里消失,这是正常现象,不用慌。导入成功后,原来的用户名和密码还在,但默认登录用户会变成 root。为了变回自定义用户,进入 Ubuntu 后编辑 /etc/wsl.conf:
[user] default=你的用户名 [network] hostname=ubuntu-dev保存后在 PowerShell 里执行wsl --shutdown,再重新进入 Ubuntu,提示符用户名就正常了。这也是为什么我建议一开始就用一个正式的英文用户名,迁移后省去很多检查步骤。
2.4 Windows Terminal 的基础样式配置
Windows Terminal 的配置文件位置比较深,但快捷方式很直接:打开 Windows Terminal,按 Ctrl+逗号,或者点击标题栏下拉箭头选择“设置”,左下角就能打开 JSON 文件。核心配置集中在 profiles 里,我最常用的是 defaults 段,让所有终端子会话继承同一套风格:
{ "profiles": { "defaults": { "font": { "face": "JetBrainsMono Nerd Font", "size": 12 }, "opacity": 85, "useAcrylic": true, "colorScheme": "iTerm2-Color-Scheme", "cursorShape": "bar" } } }opacity 和 useAcrylic 搭配使用时,窗口背景会有轻微模糊,像 iTerm2 那种玻璃感。不过我实际用下来建议透明度不要低于 80,否则长时间盯着终端代码,眼睛很容易疲劳。
3. 终端美化的灵魂:zsh、oh-my-zsh 与 powerlevel10k
3.1 安装 zsh 与 oh-my-zsh
进入 Ubuntu 终端后,先更新源再安装基础包:
sudo apt update sudo apt install -y zsh git curl chsh -s $(which zsh)chsh 改的是默认 shell,改完后新开的终端就会进入 zsh。接着安装 oh-my-zsh:
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"如果下载脚本时卡顿,可以先在浏览器里打开这个脚本地址,保存为 install.sh,再sh install.sh执行。脚本运行时会检测到已有 .zshrc,默认会把它备份成 .zshrc.pre-oh-my-zsh,不用担心覆盖。
oh-my-zsh 提供了插件系统,让我日常使用体感提升最大的是两个插件:zsh-autosuggestions 和 zsh-syntax-highlighting。前者会基于历史命令给出灰色建议,按右方向键即可补全;后者让合法命令显示为绿色,非法命令显示为红色。安装方式:
git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions git clone https://github.com/zsh-users/zsh-syntax-highlighting ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting然后在 ~/.zshrc 中修改插件列表:
plugins=(git zsh-autosuggestions zsh-syntax-highlighting)记得每次修改 .zshrc 后执行source ~/.zshrc,让配置立即生效。
3.2 Powerlevel10k 主题:关键参数和配置心得
iTerm2 风格里最显眼的,其实是左侧那种带色块的提示符,颜色一路铺开,不同段之间有斜面转折。这个效果在 Zsh 生态里对应的是 powerlevel10k 主题。安装:
git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k然后在 .zshrc 里把主题改为:
ZSH_THEME="powerlevel10k/powerlevel10k"重新打开终端或 source 后,会出现 powerlevel10k 的配置向导。里面几个关键选择我说明一下:Prompt Style 建议选 Rainbow,这个最接近 iTerm2 默认配色的丰富感;Prompt Height 选两行,第一行放目录和 Git 状态,第二行留出干净输入区;Ornaments 选 Unicode,配合 Nerd Font 才能显示完整;时间显示如果不想让右侧状态栏太拥挤,选 None 即可。
配置向导生成的 ~/.p10k.zsh 才是真正的配置核心。我最常调整的是左右两栏元素:
typeset -g POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=( os_icon dir vcs newline prompt_char ) typeset -g POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=( status command_execution_time python_env time )dir 段默认只显示最近几层路径,如果希望路径完整展示,可以调整:
typeset -g POWERLEVEL9K_DIR_MAX_LENGTH=3vcs 段负责显示 Git 分支和仓库状态,这是 iTerm2 风格提示符的灵魂。如果你在比较大的仓库里明显感觉提示符变慢,可以在 vcs 元素里去掉 untracked files 的实时扫描,只保留分支信息。
3.3 Nerd Font 与配色方案移植
没有 Nerd Font,powerlevel10k 所有的图标都会变成方框。推荐使用 JetBrainsMono Nerd Font,安装后在 Windows Terminal 的 settings.json 中将它设为默认字体,名称必须写“JetBrainsMono Nerd Font”,而不是“JetBrains Mono”。如果字体名称不匹配,终端会悄悄 fallback 到默认字体,你就会看到图标乱飞。
配色方案我直接移植了 iTerm2 的经典色板,加到 Windows Terminal 的 schemes 数组中。贴一份我目前使用的近似配置:
{ "name": "iTerm2-Color-Scheme", "background": "#2B2B2B", "foreground": "#F2F2F2", "cursorColor": "#F2F2F2", "selectionBackground": "#214283", "black": "#000000", "red": "#CC0000", "green": "#3E999F", "yellow": "#C4A000", "blue": "#729FCF", "purple": "#75507B", "cyan": "#06989A", "white": "#D3D7CF", "brightBlack": "#555753", "brightRed": "#EF2929", "brightGreen": "#8AE234", "brightYellow": "#FCE94F", "brightBlue": "#729FCF", "brightPurple": "#AD7FA8", "brightCyan": "#34E2E2", "brightWhite": "#EEEEEC" }实际使用中,终端里跑 htop、vim、tmux 时颜色都会沿用这套逻辑。想让终端和编辑器配色彻底统一,还可以直接把同一套色板导入 Neovim 主题,后续我会简单说到。
4. 终端复用:把 tmux 调教成 iTerm2 的分屏手感
4.1 为什么一定要上 tmux
终端美化的最后一个大件是终端复用。只调整外观不解决实际问题:日常开发经常需要同时开日志、编辑器、测试进程,Windows Terminal 本身支持多标签页,但多标签页不能断线重连;闭合并不会保留会话状态。tmux 能让一个终端窗口里运行多个独立的窗格和会话,即使 Windows 重启,重新进入 WSL 执行 tmux attach 就能回到之前的现场。这个能力在服务器上远程排查问题时尤其重要,WSL 只是把同一套肌肉记忆复制到了本地。
安装:
sudo apt install -y tmux4.2 配置文件:从快捷键到状态栏
tmux 的默认前缀键是 Ctrl+b,和很多人的操作习惯不一致。我把它改成 Ctrl+a,并把分屏和切换快捷键设计成类似 iTerm2 的肌肉记忆:
set -g prefix C-a unbind C-b bind C-a send-prefix # 分屏 bind | split-window -h -c "#{pane_current_path}" bind - split-window -v -c "#{pane_current_path}" # 窗格切换 bind h select-pane -L bind j select-pane -D bind k select-pane -U bind l select-pane -R # 开启鼠标 set -g mouse on # 避免进入 vim/vi 模式时键盘响应延迟 set -sg escape-time 10注意 split-window 里的-c "#{pane_current_path}",这表示新分屏会继承当前窗格所在目录,而不是回到 HOME。没有这个参数的话,每次分屏都要重新 cd,很打断节奏。状态栏和边框颜色我也做了调整,让它不跳脱出整体配色:
set -g status-style bg=colour237,fg=colour250 set -g status-left "#[bg=colour28] #S #[bg=colour237] " set -g status-right "#[fg=colour250]#(uptime) %H:%M" set -g pane-border-style fg=colour240 set -g pane-active-border-style fg=colour214配色这里用的是 tmux 的 256 色编号:colour237 接近深灰背景,colour28 是深绿色,正好和 powerlevel10k 的 dir 段色块衔接。如果你用的是前面那个自定义色板,颜色编号可以按需微调。
4.3 WSL 里 tmux 和 Windows Terminal 的显示协作
在 WSL2 里跑 tmux,有两个值得注意的小问题。第一个是复制粘贴:默认 tmux 使用的剪贴板和 Windows 剪贴板是隔离的,在 tmux 里选中文字后按 Ctrl+Shift+C 不一定能复制到 Windows。解决方式是安装 win32yank 或使用 Windows Terminal 自带的选中复制(鼠标选中后 Ctrl+Shift+C)。更稳的做法是在 tmux.conf 里绑定一个键来复制当前窗格:
bind y run-shell "tmux show-buffer | clip.exe"第二个问题是背景色不一致。Windows Terminal 的背景是半透明的,tmux 的默认背景色是黑色,两者叠加会让 pane 边框看起来一块深一块浅。解决办法是在 tmux.conf 里明确设置 background 为 terminal 背景色,或者直接把 tmux 的状态栏和窗格边框颜色统一到前面定义的三类颜色里,避免出现突兀色块。
5. 常见问题排查与避坑技巧
5.1 WSL 启动失败与安装错误
我在还原环境和帮朋友排查时,遇到最多的是这几种情况。提示WSL 需要更新,直接管理员终端执行wsl --update然后重启终端即可。提示找不到指定的文件或error_file_not_found,优先检查 BIOS 虚拟化开关和 hypervisorlaunchtype 设置,再把 Windows 更新到最新。还有一种情况是安装多个发行版后 WSL 默认进入错误的分发,可以用:
wsl --set-default Ubuntu-22.04固定住默认发行版。Windows Terminal 下拉菜单里的 Ubuntu 图标没出现时,也可以在 settings.json 的 profiles 列表里手动添加:
{ "guid": "{自己的GUID}", "name": "Ubuntu-22.04", "commandline": "wsl.exe -d Ubuntu-22.04", "source": "Windows.Terminal.Wsl" }GUID 可以用任意一段唯一字符串,比如{11111111-2222-3333-4444-555555555555}。
5.2 图标变方框和中文字体乱码
图标变方框基本就是字体问题。确认已经安装 Nerd Font 后,进入 Windows Terminal 设置确认 font.face 写的和字体安装名完全一致。Windows Terminal 不会像 vim 那样自动扫描所有字体,填错名字只会静默 fallback。中文字体乱码则常见于旧版 shell 工具,在 Ubuntu 里执行:
sudo dpkg-reconfigure locales勾选 en_US.UTF-8 和 zh_CN.UTF-8,再把默认 locale 设置为 en_US.UTF-8。中文显示字体由 Windows Terminal 统一接管,编码层面保持 UTF-8 就能避免大多数乱码。
5.3 端口占用和 WSL 网络互通的排查
开发中免不了在 WSL 里启动服务,再从 Windows 浏览器访问。如果出现 Windows 访问localhost:8080失败,先确认 WSL 内部的防火墙是否放行,或者直接查看端口占用情况:
netstat -ano | findstr :8080这是 Windows 侧的排查命令。如果是 WSL 里的服务占用了端口,在 Ubuntu 内执行:
sudo lsof -i :8080 kill -9 <PID>如果 WSL 里启动的服务只能在 WSL 内部访问,而在 Windows 侧无法通过 localhost 访问,通常和 WSL2 的网络地址转换模式有关,最简单的方法是使用 WSL 的 IP 地址:
wsl hostname -I拿到地址后在 Windows 浏览器里用这个 IP 访问。顺带一提,Elasticsearch 这类服务在 WSL 里启动时,默认绑定 127.0.0.1 会导致外部访问不到,需要修改启动参数绑定到0.0.0.0。
5.4 常见问题速查表
| 症状 | 可能原因 | 解决方式 |
|---|---|---|
| wsl --install 卡住 | 组件下载慢,分发下载慢 | 手动下载 .appx 包安装 |
| 导入发行版后默认 root | wsl.conf 未配置用户 | 写入 [user] default=用户名 |
| P10K 图标全变方框 | 字体缺失或字体名不匹配 | 安装 Nerd Font 并核对字体名 |
| 中文显示乱码 | locale 未配置 UTF-8 | dpkg-reconfigure locales |
| 背景透明不生效 | 渲染模式不支持 acrylic | 改用 opacity 或关闭模糊 |
| WSL 内存占用太大 | 限制缺失 | 在 %UserProfile%.wslconfig 里设 memory |
| tmux 分屏后目录变了 | split-window 缺 -c 参数 | 补上-c "#{pane_current_path}" |
.wslconfig 是我最后想补的工具,它在 Windows 用户目录下,用来限制 WSL2 的内存和 CPU:
[wsl2] memory=4GB processors=2重启 WSL 后生效。
6. 进阶扩展:把新终端融入日常开发流
6.1 VS Code 与 Windows Terminal 的 WSL 联动
装了 Remote-WSL 扩展后,VS Code 会直接在 WSL 内部工作,底部的集成终端也自动变成 zsh + powerlevel10k 的环境。这一步非常简单:VS Code 里按 F1,输入 Remote-WSL: Open Folder in WSL,选择 WSL 里的项目目录。这样终端配置、文件读写、git 操作全部在 Linux 环境中完成,Windows 侧只需要负责渲染窗口和输入法。很多人忽略了 Windows Terminal 和 VS Code 集成终端共享同一套 shell 配置,只要 .zshrc、.p10k.zsh、.tmux.conf 都在,两边的外观和快捷键习惯是统一的。
6.2 Python 与深度学习环境的自然接入
既然走到这一步,顺手在 WSL 里搭一套 Python 环境非常自然。Ubuntu 自带 Python3,但建议用 venv 或 uv 管理项目虚拟环境,不要在系统 Python 里乱装全局包。给一个最小可用的流程:
sudo apt install -y python3-venv python3-pip mkdir ~/venvs python3 -m venv ~/venvs/ml source ~/venvs/ml/bin/activate之后会看到 powerlevel10k 右侧出现 python_env 段,标明当前虚拟环境名称。这种即时反馈正是 iTerm2 风格终端的价值之一。PyTorch 和 CUDA 的搭建也可以完全在 WSL 内完成,Windows 侧什么都不用装,我目前的主力模型调试环境就是在这套 WSL Ubuntu 里跑的。
6.3 一个让体验再进一步的细节
如果你和我一样经常开多个窗口处理不同项目,可以为不同项目建不同的 Windows Terminal 标签页配置。比如在 settings.json 里增加一个 profile,启动时直接进入指定目录:
{ "name": "Backend", "commandline": "wsl.exe -d Ubuntu-22.04 --cd /home/user/code/backend", "icon": "C:\\icons\\backend.ico" }这样 Windows Terminal 下拉菜单里多了常用项目入口,点一下就进入对应工作目录,省掉每次 cd 的时间。配置文件本身是文本文件,可以直接放进 Git 仓库,换新机器时拉下来就能恢复整套视觉和操作习惯。
我个人在实际使用中最大的体会是:美化终端这件事,真正提升效率的不是颜色,而是被颜色吸引过来的注意力。当你愿意天天对着终端工作,就会顺手把别名、插件、分屏快捷键都打磨好,形成一个正向循环。最后再分享一个小技巧:如果你觉得 powerlevel10k 的右侧状态栏信息太杂,编辑 ~/.p10k.zsh 时把时间、执行时间这些元素删掉,只保留左侧的目录、Git 分支和 prompt_char,看起来会更接近我最初看到 iTerm2 时那种干净清爽的感觉。折腾终端没有标准答案,这套配置只是起点,后续完全可以根据自己的使用习惯继续裁剪。