深夜提醒

现在是深夜,建议您注意休息,不要熬夜哦~

🏮 🏮 🏮

新年快乐

祝君万事如意心想事成!

2024 桐庐半程马拉松
00:00:00
时间
0.00
距离(公里)
--:--
配速
--
步频
--
心率 (bpm)
--
配速
步频
|
share-image
ESC

从 Oh My Zsh 到 Starship:我的终端提示词迁移之路

上周末整理开发环境时,我盯着终端看了半天。那个陪伴我三年的 Oh My Zsh,加载项目目录时总要卡个两秒。作为一个每天打开终端上百次的人,这两秒的累积,足够让我重新审视自己的工具链。

这就是我开始了解 Starship 的契机。

Starship 终端效果图

为什么不是 Oh My Zsh?

说实话,Oh My Zsh 曾经是神器。

280+ 插件、150+ 主题开箱即用,一句 sh -c "$(curl -fsSL ...) 就能把终端装扮得花里胡哨。我当年也是主题换得不亦乐乎,agnoster、powerlevel10k、robbyrussell 轮着试。

但用久了,一些问题浮出水面:

  • 启动慢:每次新开终端,要加载几十个插件,git 状态检测尤其耗时
  • 配置黑盒:很多功能封装得太好,想微调却无从下手
  • 跨平台差异:Mac 上配好的主题,到 Linux 服务器上经常变形

Powerlevel10k 确实快了很多,但它本质上还是在 Zsh 的框架里打转。而真正让我决定换掉的,是某次在 Docker 容器里调试时,发现 Alpine Linux 上装 Oh My Zsh 简直是灾难。

Starship 是什么?

简单说,它是用 Rust 写的跨 Shell 提示词工具。

官网的描述很精准:”The minimal, blazing-fast, and infinitely customizable prompt for any shell”。三个关键词:轻量极速无限可定制

核心差异在于架构设计:

特性 Oh My Zsh Powerlevel10k Starship
语言 Shell 脚本 Zsh 脚本 Rust
启动时间 200-500ms 50-100ms <10ms
跨 Shell ❌ 仅 Zsh ❌ 仅 Zsh ✅ 10+ Shell
配置方式 插件化 主题化 声明式 TOML
内存占用 较高 中等 极低
云端同步 原生支持

Rust 带来的不只是速度。Starship 把提示词渲染做成了一门「显学」——每一个模块都是独立可配置的,你想显示什么、怎么显示、什么条件下显示,完全可控。

安装:比想象中简单

安装只需一行:

curl -sS https://starship.rs/install.sh | sh

然后在你用的 Shell 配置里加一句初始化:

# ~/.zshrc
eval "$(starship init zsh)"

# ~/.bashrc
eval "$(starship init bash)"

# ~/.config/fish/config.fish
starship init fish | source

支持 Bash、Zsh、Fish、PowerShell、Nushell 等主流 Shell,甚至包括 Ion、Elvish、Tcsh 这类小众选择。

唯一的前置条件:需要安装 Nerd Font。Starship 重度依赖图标符号来展示 git 状态、语言版本等信息。

# macOS
brew tap homebrew/cask-fonts
brew install --cask font-jetbrains-mono-nerd-font

# 然后在终端设置里启用这个字体

配置:我的最佳实践

Starship 的配置是单文件 ~/.config/starship.toml,用 TOML 语法,比 JSON 友好得多。

以下是我沉淀下来的一套配置,兼顾实用与性能:

# 基础设置:显示时间戳和换行
format = """
[](#3B4252)\
$time\
[](fg:#3B4252 bg:#434C5E)\
$directory\
[](fg:#434C5E bg:#4C566A)\
$git_branch\
$git_status\
[](fg:#4C566A bg:#2E3440)\
$fill\
$nodejs$rust$golang$python\
[](#2E3440)
$character"""

# 命令提示符
[character]
success_symbol = "[❯](bold green)"
error_symbol = "[❯](bold red)"

# 时间显示
[time]
disabled = false
format = '[  $time ]($style)'
style = "fg:#D8DEE9 bg:#3B4252"
time_format = "%H:%M"

# 目录显示
[directory]
truncation_length = 3
truncate_to_repo = true
format = "[  $path ]($style)"
style = "fg:#D8DEE9 bg:#434C5E"
truncation_symbol = "…/"

# Git 状态
[git_branch]
symbol = ""
format = "[ $symbol $branch ]($style)"
style = "fg:#D8DEE9 bg:#4C566A"

[git_status]
format = '[($all_status$ahead_behind)]($style)'
style = "fg:#D8DEE9 bg:#4C566A"
conflicted = " ="
ahead = " ⇡"
behind = " ⇣"
diverged = " ⇕"
untracked = " ?"
stashed = " $"
modified = " !"
staged = " +"
deleted = " ✘"

# 编程语言版本显示(只在有对应文件时显示)
[nodejs]
format = "[ 󰎙 $version ](fg:#D8DEE9 bg:#2E3440)"
detect_files = ["package.json", ".node-version"]
detect_folders = ["node_modules"]

[rust]
format = "[ 󱘗 $version ](fg:#D8DEE9 bg:#2E3440)"
detect_files = ["Cargo.toml"]

[golang]
format = "[ 󰟓 $version ](fg:#D8DEE9 bg:#2E3440)"
detect_files = ["go.mod"]

[python]
format = "[ 󰌠 $version ](fg:#D8DEE9 bg:#2E3440)"
detect_files = ["requirements.txt", "pyproject.toml", "Pipfile"]

# 禁用不常用的模块减少干扰
[package]
disabled = true

[aws]
disabled = true

[gcloud]
disabled = true

[azure]
disabled = true

几个显著提升体验的技巧

1. 条件渲染

Starship 的 detect_filesdetect_folders 很强大。比如上面的配置,node 版本只在有 package.jsonnode_modules 时显示,避免进入系统目录时满屏版本号。

2. 命令执行时间提示

[cmd_duration]
min_time = 2000
format = "[ ⏱ $duration ](yellow)"

超过 2 秒的命令会显示耗时,排查性能问题时很直观。

3. 与 Direnv 配合

如果你用 direnv 管理项目环境变量,Starship 的 [env_var] 模块可以把当前激活的环境直接显示在提示词里:

[env_var.VIRTUAL_ENV]
format = "[ 🐍 $env_value ](cyan)"

4. 云配置同步

Starship 原生支持将配置存到云端,多设备同步很方便:

starship config sync

迁移过程的真实感受

从 Oh My Zsh 切过来,第一周有些不适应。少了那些「智能」的插件,很多功能需要自己配置。

但第二周开始体会到好处:

  • 新终端窗口几乎是秒开,没有那种「等等,让我加载一下」的顿挫感
  • 配置文件的每一个选项都心知肚明,调试问题时不再抓瞎
  • SSH 到服务器上只需要复制一个 toml 文件,环境就一致了

最意外的是,因为配置过程需要主动思考「我到底需要什么信息」,反而让我对终端提示词有了更深的理解。以前用 Oh My Zsh,是别人告诉我什么重要;现在用 Starship,是我自己决定什么重要。

什么时候不该用 Starship?

实事求是地说,Starship 并非银弹:

  • 如果你重度依赖 Oh My Zsh 的某个特定插件,而 Starship 没有对应模块,迁移成本可能不低
  • 如果你喜欢开箱即用的体验,不愿意花时间调配置,Oh My Zsh 的主题生态依然更丰富
  • 如果你在 Windows 上用 CMD,Starship 需要配合 Clink 使用,配置相对麻烦

但对大多数开发者,尤其是跨平台工作的后端或全栈工程师,Starship 的简洁和一致性确实值得一试。

写在最后

工具迁移从来不是目的,提升效率才是。

Starship 让我重新思考了「终端提示词」这件事的本质:它不该是炫技的装饰,而应该是高效获取信息、快速决策的入口。Rust 重写带来的性能提升只是表象,真正的价值在于那种「一切尽在掌控」的确定感。

如果你也受够了 Oh My Zsh 的启动延迟,或者想尝试一种更现代、更透明的 Shell 体验,不妨花半小时给 Starship 一个机会。

毕竟,我们每天打开终端的次数,可能比打开微信还多。值得为它投入一点优化。


参考链接

文章作者:阿文
文章链接: https://www.awen.me/post/9f5afc46.html
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 阿文的博客

评论

0 条评论
😀😃😄 😁😅😂 🤣😊😇 🙂🙃😉 😌😍🥰 😘😗😙 😚😋😛 😝😜🤪 🤨🧐🤓 😎🥸🤩 🥳😏😒 😞😔😟 😕🙁☹️ 😣😖😫 😩🥺😢 😭😤😠 😡🤬🤯 😳🥵🥶 😱😨😰 😥😓🤗 🤔🤭🤫 🤥😶😐 😑😬🙄 😯😦😧 😮😲🥱 😴🤤😪 😵🤐🥴 🤢🤮🤧 😷🤒🤕 🤑🤠😈 👿👹👺 🤡💩👻 💀☠️👽 👾🤖🎃 😺😸😹 😻😼😽 🙀😿😾 👍👎👏 🙌👐🤲 🤝🤜🤛 ✌️🤞🤟 🤘👌🤏 👈👉👆 👇☝️ 🤚🖐️🖖 👋🤙💪 🦾🖕✍️ 🙏💅🤳 💯💢💥 💫💦💨 🕳️💣💬 👁️‍🗨️🗨️🗯️ 💭💤❤️ 🧡💛💚 💙💜🖤 🤍🤎💔 ❣️💕💞 💓💗💖 💘💝💟 ☮️✝️☪️ 🕉️☸️✡️ 🔯🕎☯️ ☦️🛐 🆔⚛️🉑 ☢️☣️📴 📳🈶🈚 🈸🈺🈷️ ✴️🆚💮 🉐㊙️㊗️ 🈴🈵🈹 🈲🅰️🅱️ 🆎🆑🅾️ 🆘 🛑📛 🚫💯💢 ♨️🚷🚯 🚳🚱🔞 📵🚭 ‼️⁉️🔅 🔆〽️⚠️ 🚸🔱⚜️ 🔰♻️ 🈯💹❇️ ✳️🌐 💠Ⓜ️🌀 💤🏧🚾 🅿️🈳 🈂🛂🛃 🛄🛅🛗 🚀🛸🚁 🚉🚆🚅 ✈️🛫🛬 🛩️💺🛰️
您的评论由 AI 智能审核,一般1分钟内会展示,若不展示请确认你的评论是否符合社区和法律规范
加载中...

留言反馈

😀😃😄 😁😅😂 🤣😊😇 🙂🙃😉 😌😍🥰 😘😗😙 😚😋😛 😝😜🤪 🤨🧐🤓 😎🥸🤩 🥳😏😒 😞😔😟 😕🙁☹️ 😣😖😫 😩🥺😢 😭😤😠 😡🤬🤯 😳🥵🥶 😱😨😰 😥😓🤗 🤔🤭🤫 🤥😶😐 😑😬🙄 😯😦😧 😮😲🥱 😴🤤😪 😵🤐🥴 🤢🤮🤧 😷🤒🤕 🤑🤠😈 👿👹👺 🤡💩👻 💀☠️👽 👾🤖🎃 😺😸😹 😻😼😽 🙀😿😾 👍👎👏 🙌👐🤲 🤝🤜🤛 ✌️🤞🤟 🤘👌🤏 👈👉👆 👇☝️ 🤚🖐️🖖 👋🤙💪 🦾🖕✍️ 🙏💅🤳 💯💢💥 💫💦💨 🕳️💣💬 👁️‍🗨️🗨️🗯️ 💭💤❤️ 🧡💛💚 💙💜🖤 🤍🤎💔 ❣️💕💞 💓💗💖 💘💝💟 ☮️✝️☪️ 🕉️☸️✡️ 🔯🕎☯️ ☦️🛐 🆔⚛️🉑 ☢️☣️📴 📳🈶🈚 🈸🈺🈷️ ✴️🆚💮 🉐㊙️㊗️ 🈴🈵🈹 🈲🅰️🅱️ 🆎🆑🅾️ 🆘 🛑📛 🚫💯💢 ♨️🚷🚯 🚳🚱🔞 📵🚭 ‼️⁉️🔅 🔆〽️⚠️ 🚸🔱⚜️ 🔰♻️ 🈯💹❇️ ✳️🌐 💠Ⓜ️🌀 💤🏧🚾 🅿️🈳 🈂🛂🛃 🛄🛅🛗 🚀🛸🚁 🚉🚆🚅 ✈️🛫🛬 🛩️💺🛰️