ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

WSL2终端美化:用zsh和powerlevel10k还原iTerm2风格

WSL2终端美化:用zsh和powerlevel10k还原iTerm2风格 把 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 Terminal2.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 安装太慢时的处理手动安装 Ubuntuwsl --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 2022wsl --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] hostnameubuntu-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 与 powerlevel10k3.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-zshsh -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 --depth1 https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k然后在 .zshrc 里把主题改为ZSH_THEMEpowerlevel10k/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_LENGTH3vcs 段负责显示 Git 分支和仓库状态这是 iTerm2 风格提示符的灵魂。如果你在比较大的仓库里明显感觉提示符变慢可以在 vcs 元素里去掉 untracked files 的实时扫描只保留分支信息。3.3 Nerd Font 与配色方案移植没有 Nerd Fontpowerlevel10k 所有的图标都会变成方框。推荐使用 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 的默认前缀键是 Ctrlb和很多人的操作习惯不一致。我把它改成 Ctrla并把分屏和切换快捷键设计成类似 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 bgcolour237,fgcolour250 set -g status-left #[bgcolour28] #S #[bgcolour237] set -g status-right #[fgcolour250]#(uptime) %H:%M set -g pane-border-style fgcolour240 set -g pane-active-border-style fgcolour214配色这里用的是 tmux 的 256 色编号colour237 接近深灰背景colour28 是深绿色正好和 powerlevel10k 的 dir 段色块衔接。如果你用的是前面那个自定义色板颜色编号可以按需微调。4.3 WSL 里 tmux 和 Windows Terminal 的显示协作在 WSL2 里跑 tmux有两个值得注意的小问题。第一个是复制粘贴默认 tmux 使用的剪贴板和 Windows 剪贴板是隔离的在 tmux 里选中文字后按 CtrlShiftC 不一定能复制到 Windows。解决方式是安装 win32yank 或使用 Windows Terminal 自带的选中复制鼠标选中后 CtrlShiftC。更稳的做法是在 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 包安装导入发行版后默认 rootwsl.conf 未配置用户写入 [user] default用户名P10K 图标全变方框字体缺失或字体名不匹配安装 Nerd Font 并核对字体名中文显示乱码locale 未配置 UTF-8dpkg-reconfigure locales背景透明不生效渲染模式不支持 acrylic改用 opacity 或关闭模糊WSL 内存占用太大限制缺失在 %UserProfile%.wslconfig 里设 memorytmux 分屏后目录变了split-window 缺 -c 参数补上-c #{pane_current_path}.wslconfig 是我最后想补的工具它在 Windows 用户目录下用来限制 WSL2 的内存和 CPU[wsl2] memory4GB processors2重启 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 时那种干净清爽的感觉。折腾终端没有标准答案这套配置只是起点后续完全可以根据自己的使用习惯继续裁剪。
返回列表