跳过正文

从 Powerlevel10k 迁移到 Oh My Posh

·1944 字·4 分钟
锦李本鲤
作者
锦李本鲤
光锥之内,皆为命运。

为什么迁移?
#

之前我的 Shell 配置使用 Oh My ZshPowerlevel10k。它精致而且速度 很快,但提示符绑定在 Zsh 上。我希望在 macOS、Linux、HPC 集群和 Windows PowerShell 中使用同一套视觉风格,因此将提示符迁移到了 Oh My Posh

Oh My Posh 将提示符主题与 Shell 分离,所以同一个 JSON 配置可以由 Zsh 和 PowerShell 初始化。现在使用的是锦鲤主题 jinli.omp.json, 配色基于 Catppuccin。

Jinli Oh My Posh 主题演示

Jinli 主题展示什么?
#

这个主题希望在不让提示符变得拥挤的前提下,始终显示有用的上下文信息:

  • 路径区会根据上下文显示家目录、不可写目录、GitHub、Git、npm、Downloads、 Pictures 和普通目录图标;
  • Git 区显示仓库、分支、工作区状态和变更数量;
  • 当前项目相关时,在右侧显示 Python 和 Node 版本;
  • SSH 会话会显示远程图标,方便识别当前 Shell 是否位于远程机器;
  • 电池、时间、命令耗时和退出状态会根据机器环境自适应,并保持右对齐;
  • 同一个主题可用于 Zsh 和 PowerShell,周边配置也支持 Linux、macOS、Windows 和 NixOS。

当前配置结构
#

现在最重要的变化,是将稳定的公共配置与工具可以修改的本地配置分开:

  • 仓库中的 .zshrc.common 保存共享的 Zsh 配置;
  • ~/.zshrc 是安装脚本创建的普通本地文件。它会先加入 Oh My Posh 的可执行 文件目录,再加载 .zshrc.common
  • Conda、OpenClaw 等工具可以向 ~/.zshrc 追加配置,而不会修改 Git 管理的 公共文件;
  • 为兼容旧版安装,如果已有 ~/.zshrc.local,它会在公共配置之后继续被加载;
  • 在 macOS/Linux 上,主题会链接到 ~/.config/oh-my-posh/jinli.omp.json

机器专属配置应放在 ~/.zshrc 中,例如:

1
2
export PATH="$HOME/.local/bin:$PATH"
alias connect-hpc='ssh [email protected]'

这样私有变量、集群 module、工作站专属别名和本地工具路径就不会进入共享仓库。

Oh My Zsh 仍然是可选的
#

Oh My Posh 是提示符引擎,并不取代所有 Zsh 插件。共享配置会启用 zsh-autosuggestionsfast-syntax-highlighting

如果已经安装 Oh My Zsh,脚本会将两个插件安装并加载到它的自定义插件目录; 否则会将插件安装到 ~/.local/share/zsh/plugins 并直接加载。为了使用这些插件, 不需要额外安装 Oh My Zsh。

共享 Zsh 配置还提供不区分大小写、支持子串匹配的补全。例如输入 cd dev<Tab>,可以补全为 itrip-dev-doc。配置还通过 AUTO_PUSHDPUSHD_IGNORE_DUPS 维护目录栈,可以使用 cd -<数字>dirs -v 浏览历史目录。

安装
#

macOS 和 Linux
#

请以普通用户运行。macOS 请先安装 Homebrew

1
2
3
curl -fsSLO https://raw.githubusercontent.com/jin-li/ShellConfig/main/install-oh-my-posh.sh
chmod +x install-oh-my-posh.sh
./install-oh-my-posh.sh

脚本会询问仓库目录。直接按 Enter 使用 ~/Documents/GitHub/ShellConfig,也可以 输入其他目录。运行前设置 SHELL_CONFIG_DIR 时,它会作为建议的安装目录。

脚本会安装 Oh My Posh 和 Zsh 依赖,安装插件,创建主题链接,创建本地 ~/.zshrc,并询问是否安装 Meslo Nerd Font。完成后请重启终端,或运行 exec zsh

已有安装请从仓库目录运行更新脚本:

1
2
cd /path/to/ShellConfig
./update.sh

更新脚本使用自身所在目录定位仓库,因此即使仓库不在默认目录也可以正常更新。 它会更新仓库和主题链接,同时保留本地 ~/.zshrc

Windows PowerShell
#

以普通用户运行:

1
2
3
Set-ExecutionPolicy -Scope Process Bypass
Invoke-WebRequest https://raw.githubusercontent.com/jin-li/ShellConfig/main/install-oh-my-posh.ps1 -OutFile install-oh-my-posh.ps1
.\install-oh-my-posh.ps1

PowerShell 脚本会在缺少 Oh My Posh 或 Git 时通过 WinGet 安装,询问仓库目录, 并且只更新 $PROFILE 中由 ShellConfig 管理的区块,保留用户和其他工具的配置。 主题直接从所选仓库目录加载;Windows 不使用 Unix 风格的 ~/.config 主题链接。

NixOS
#

本仓库也通过 Flake 提供 NixOS 模块:

1
2
3
4
5
inputs.shell-config.url = "github:jin-li/ShellConfig";

modules = [ inputs.shell-config.nixosModules.default ];
programs.shellConfig.enable = true;
users.users.<username>.shell = pkgs.zsh;

然后重建系统并启动新的会话:

1
2
sudo nixos-rebuild switch --flake .#<host>
exec zsh

字体与终端设置
#

主题使用 Nerd Font 图标。请在终端配置中安装并选择 MesloLGM Nerd Font, 否则图标可能显示为方框。使用 WSL 时,请在 WSL 内运行 Linux 安装脚本,但在 Windows 中安装并配置字体。

没有 sudo 权限的 HPC 集群
#

macOS/Linux 安装脚本会在尝试安装系统软件前询问 sudo,并检查 curlgitunzipzsh。如果没有 sudo 且只有 Zsh 缺失,脚本可以将 ncurses 和 Zsh 编译到默认的 ~/.local,也可以通过 $SHELL_CONFIG_PREFIX 指定其他目录。编译器 和 make 必须已经可用,通常可以通过集群 module 加载。

其他缺失依赖需要由集群提供,或由用户安装到自己的环境中。可以在本地 ~/.zshrc 中加载 module,并将用户目录下的可执行文件目录加入 PATH

Neovim 保持独立
#

LazyVim 安装脚本与提示符安装脚本保持独立:Oh My Posh 负责 Shell 提示符,LazyVim 负责管理 Neovim 配置和编辑器插件。

1
2
3
curl -fsSLO https://raw.githubusercontent.com/jin-li/ShellConfig/main/install_LazyVim.sh
chmod +x install_LazyVim.sh
./install_LazyVim.sh

脚本会检查 Neovim 版本是否为 0.11.2 或更高,备份已有的 Neovim 配置和数据, 并将 LazyVim starter 克隆到 ~/.config/nvim。它不再管理旧版 ~/.vimrc。之后 启动 nvim 安装插件,并运行 :checkhealth:LazyHealth

最终效果
#

现在 Zsh 和 PowerShell 使用同一个主题,共享配置保存在 Git 中,机器专属工具可以 安全地修改本地 ~/.zshrc。这样配置就能更容易地在个人电脑、Linux 工作站、HPC 集群和 Windows 之间迁移,同时避免机器专属改动与公共配置发生冲突。