Starship 替代 Oh My Zsh:解决终端启动慢与提示符卡顿的实战迁移指南

发布时间:2026/9/9 12:14:09

Starship 替代 Oh My Zsh:解决终端启动慢与提示符卡顿的实战迁移指南
每次新开一个终端窗口提示符总要过个一两秒才肯出来光标在那儿闪半天敲进去的字符全都挂在半路。这个场景用过 Oh My Zsh 的人应该不陌生。我换到 Starship 之后启动延迟基本消失了日常输入时提示符的渲染也几乎感觉不到卡顿。如果你也正在纠结是不是该放弃 Oh My Zsh或者只是想把终端弄得更快一点这篇迁移记录应该对你有用。文章以 macOS 环境为主但 Linux 和 Windows 终端里的操作思路完全一样。先说明一个前提Starship 并不是 Oh My Zsh 的完整替代品它只替换掉“提示符渲染”这一层。但提示符恰恰是 Oh My Zsh 最影响手感、也最容易被忽略性能问题的地方。下面我会从慢的根源讲起再解释 Starship 的设计差异最后给出可复现的迁移步骤和配置经验。1. Oh My Zsh 的启动卡顿根子不在 zsh 本身1.1 先用数字确认一下问题在哪很多人觉得 zsh 天生就慢其实这是个误解。你可以先在自己的终端里跑一下这个命令time zsh -i -c exit-i表示以交互模式启动-c exit表示启动后立刻退出。这个命令测的是“启动一个交互式 zsh 并退出”的耗时。我迁移前测出来的结果大概是这样zsh -i -c exit 0.42s user 0.18s system 0.75s total一个交互式 shell 启动就要 0.75 秒体感上就是“打开了终端但还要等”。作为对比bash 通常只要 0.02 秒左右。这多出来的时间绝大部分不是 zsh 自己消耗的而是启动时加载的脚本。1.2 Oh My Zsh 的框架级开销Oh My Zsh 本质上是一个脚本集合它会按照固定的流程加载内容。在.zshrc里source $ZSH/oh-my-zsh.sh这一行就会把框架核心拉起来然后依次处理lib/目录下的基础函数库包括补全、git、历史记录、主题支持等plugins(...)里列出的每个插件主题文件也就是定义prompt相关函数的脚本。这些全部是 zsh 脚本解释执行逐行跑下来。插件只要被 source 进来就会占用启动时间不管你用不用到它。装了十几个插件之后启动时间从 0.2 秒涨到 0.8 秒甚至更高是很正常的事。1.3 真正的性能黑洞是提示符渲染启动慢只是一部分更难受的是“每次敲完回车提示符要重新渲染”。这时候主题函数会被重新执行。如果主题函数里做了 git 状态检测那么每敲一次回车都会触发一次git status或git branch这类命令。在大型 Git 仓库里git status要做的事情很多对比索引、工作区、HEAD还要扫描 untracked 文件。仓库文件一多这个开销是实打实的。我切到公司一个大仓库之后明显感觉每次命令执行完都要顿一下提示符才出现。再加上 zsh-autosuggestions 和 zsh-syntax-highlighting 这类“实时”插件输入每一个字符都会有计算和渲染卡顿感会被进一步放大。这些插件本身很有用但它们和复杂的主题叠加在一起就容易把一个本可以很快的终端拖得很重。2. Starship 凭什么快定位、原理和取舍2.1 Starship 到底是个什么Starship 是一个用 Rust 写的跨 Shell 提示符渲染器。它支持 zsh、bash、fish、powershell、cmd、nu 等常见 Shell。注意它的定位它不是 Shell 框架不提供别名不管理插件只负责一件事——在你需要的时候把提示符的内容渲染出来。也就是说Starship 和 Oh My Zsh 其实不在同一个维度。Oh My Zsh 是“整个 zsh 环境的配置框架”Starship 只替代其中的“主题”和“提示符渲染”这一层。这也是为什么很多人即使在用 Starship依然会搭配 zinit、antibody 这类插件管理器来加载 zsh 插件。2.2 从解释执行到并行检测Oh My Zsh 的提示符是在 zsh 脚本里逐行执行渲染逻辑的Starship 则把检测工作移到了一个独立的 Rust 程序里。Starship 在检测当前目录、git 状态、语言版本、包版本等信息时多个模块是并行执行的而不是一个个串行等待。比如一次渲染过程中git_branch和git_status可以同时进行目录模块、Node.js 版本模块也可以并行检测。所有结果收集齐之后再统一生成提示符字符串。这种并行模型的效率显然比 zsh 脚本里一个接一个调用外部命令要高。2.3 异步渲染不让 Shell 等着Starship 在 zsh 中的集成方式很有特点。当你在.zshrc里写下eval $(starship init zsh)之后Starship 会向当前 Shell 注入一小段 zsh 代码里面主要定义了一个 prompt 函数并注册了 precmd 钩子。也就是说zsh 每次要显示提示符时会调用这段注册好的函数由 Starship 程序去完成实际渲染。这里有个容易被忽略的点Starship 的提示符渲染并不阻塞整个 Shell 的核心功能。即使某个模块检测比较慢或者遇到超时它也不会让终端完全卡住。与其追求“一次都不慢”Starship 选择的是“就算有慢的模块也不拖垮整体体验”。2.4 配置是纯数据不是可执行代码Oh My Zsh 的配置本质是 zsh 脚本写的每一行内容在启动时都会被执行。Starship 的配置是~/.config/starship.toml里面只有样式、开关、格式这些纯数据没有执行脚本的能力。所以配置再复杂也不会拖慢 Shell 启动。这个设计还有个附带好处配置文件不会因为某个函数写错而把整个 Shell 搞挂。脚本配置只要你写错一个语法启动就会报错提示符就出不来TOML 配置最多是某个模块不生效渲染还是正常的。2.5 和 Oh My Zsh 的简单对比维度Oh My ZshStarship定位zsh 配置框架跨 Shell 提示符渲染器实现语言主要是 zsh 脚本Rust启动加载加载 lib、插件、主题脚本只注入一小段 init 代码提示符渲染主题函数每次执行 zsh 脚本独立程序并行检测配置方式zsh 脚本TOML 数据扩展性插件体系非常强内置模块加自定义命令模块跨 Shell仅 zshbash、zsh、fish、powershell 等从表格能看出来Oh My Zsh 的插件体系是它的优势Starship 并不打算替代这一点。所以如果你离不开某些 zsh 插件完全可以继续用只是把提示符渲染这件事交给 Starship。3. 动手迁移把提示符换成 Starship 的完整过程3.1 安装 StarshipmacOS 上最简单的方式是用 Homebrewbrew install starshipLinux 用户可以用官方安装脚本curl -sS https://starship.rs/install.sh | shWindows 用户可以用 scoop 或 winget。装完先确认版本starship --version如果你的机器里没有 Rust 环境也不影响Starship 是编译好的二进制发行包安装完直接就能用。3.2 在 .zshrc 里接管提示符在.zshrc末尾追加一行eval $(starship init zsh)很多人第一次看到eval $(...)这种写法会觉得有点“黑魔法”。其实你可以先手动执行一下starship init zsh看看它到底输出了什么。里面不过是一段 zsh 函数定义和 precmd 钩子的注册代码用来告诉 zsh“渲染提示符的时候调用 starship”。明白了这一点你就知道它不是魔法只是个标准的 Shell 初始化方式。加完这一行之后保留 Oh My Zsh 的其余配置重新打开一个终端窗口或者执行source ~/.zshrc。如果一切正常提示符应该已经变成 Starship 的默认样式说明接管成功。3.3 彻底移除 Oh My Zsh 的主题和框架脚本确认 Starship 没问题之后就可以把.zshrc里的这些内容清理掉了export ZSH$HOME/.oh-my-zsh ZSH_THEMErobbyrussell plugins(git z zsh-autosuggestions ...) source $ZSH/oh-my-zsh.sh我的建议是先把原来的.zshrc复制一份备份比如cp ~/.zshrc ~/.zshrc.oh-my-zsh.bak这一步不是多余的。有些人在.zshrc里写了不少自定义函数和别名如果直接删掉整个文件后面再想找回某个配置就麻烦了。保留备份后面用不到了再删也不迟。3.4 保留你真正需要的插件Oh My Zsh 的插件体系本身很好用很多功能其实可以脱离框架单独加载。以我自己为例迁移后依然保留了两个插件zsh-autosuggestions 和 zsh-syntax-highlighting。我用 zinit 来加载它们这样既拿到了插件功能又不用承受整个 Oh My Zsh 框架的开销。如果你还没用过 zinit可以参考这个极简配置source $HOME/.zinit/bin/zinit.zsh zinit light zsh-users/zsh-autosuggestions zinit light zsh-users/zsh-syntax-highlighting当然用你自己熟悉的插件管理器也行。核心思路是把“提示符渲染”从 Oh My Zsh 里抽出来交给 Starship但保留日常开发真正依赖的那些 zsh 插件。3.5 安装 Nerd Font 字体这是迁移过程中最容易踩的坑。Starship 默认配置里包含很多图标符号比如 Git 分支、版本管理器的小图标、目录分隔符等这些符号大多需要 Nerd Font 才能正常显示。如果你没有装对应字体打开终端看到的就是一堆方块和问号。macOS 上可以直接用 Homebrew 安装brew install --cask font-meslo-lg-nerd-font然后在终端偏好设置里把字体切换成 MesloLGS NF。这一步最好在安装 Starship 的同时做省得看到方块时误以为 Starship 渲染出了问题。3.6 验证迁移结果重新打开终端执行和之前一样的命令time zsh -i -c exit我迁移之前是 0.8 秒左右迁移之后降到了 0.1 秒左右。不同机器、不同插件组合的差异会比较大但方向基本一致去掉 Oh My Zsh 的框架加载后启动时间大幅缩短。4. 按需定制写一份属于自己的 Starship 配置4.1 配置文件从哪来Starship 的默认配置其实已经足够好用。如果你想进一步定制路径是~/.config/starship.toml文件不存在就自己创建。有人会担心“每次渲染提示符都要读配置文件会不会慢”。实际上这份 TOML 文件非常小解析开销可以忽略不计。相比 Oh My Zsh 里“每次启动执行一堆脚本”的方式Starship 的做法要轻量得多。4.2 先做减法关掉不常用的模块Starship 默认会显示不少模块但不一定每个都适合你。我最初把 python、nodejs、java 这些语言模块都留着后来发现很多项目根本用不到反而让提示符变得很喧闹。关闭某个模块很简单[nodejs] disabled true我个人比较喜欢的原则是让提示符只显示你真正关心的信息。如果你平时主要在写 Python保留 python 模块如果你经常切换 Node 版本保留 nodejs 模块。其余的一律关掉提示符干净渲染也更省事。4.3 用 format 控制显示顺序format是 Starship 配置里最重要的一个字段它决定了提示符的整体结构。比如我只想显示用户名、目录、Git 分支、Git 状态和输入符号可以这样写format $username\ $hostname\ $directory\ $git_branch\ $git_status\ $character反斜杠用来连接同一行整体用三引号包起来。这样写的好处是你能一眼看出提示符从左到右会显示什么而不是被默认配置牵着走。4.4 一个够用的示例配置下面是我自己用了很久的一份配置不算复杂但日常开发足够[directory] style bold cyan truncation_length 3 [git_branch] symbol style bold purple [git_status] style green [cmd_duration] min_time 2000 style yellow [character] success_symbol [❯](bold green) error_symbol [❯](bold red) [nodejs] symbol style yellow简单解释一下directory的truncation_length 3表示目录只显示最后三级路径避免提示符被超长路径占满cmd_duration的min_time 2000表示命令执行超过 2 秒才显示耗时character是输入提示符success_symbol和error_symbol让上一条命令成功时显示绿色箭头、失败时显示红色箭头nodejs模块我保留了因为平时会频繁切换 Node 项目看到当前版本号比较方便。4.5 扩展自定义命令模块内置模块覆盖不了你的场景时可以用[custom.xxx]定义自定义命令模块。比如我想在提示符里显示当前 Python 虚拟环境名称[custom.python_venv] command echo $VIRTUAL_ENV | xargs basename when test -n \$VIRTUAL_ENV\ format venv: $output 这里when条件很关键。它决定了什么时候才执行这个自定义命令。如果不写whenStarship 每次渲染提示符都会去执行command那这个模块本身就可能成为性能瓶颈。自定义模块虽然是“开挂”的好工具但要谨慎使用注意别让外部命令拖慢整体渲染。4.6 调试工具Starship 提供了几个很好用的调试命令starship config快速打开配置文件starship explain解释某个模块为什么没有显示starship timings统计每个模块的渲染耗时。如果你发现某个模块没按预期出现或者提示符整体变慢了先用starship explain和starship timings定位问题比盲目改配置高效得多。5. 迁移之后避坑记录、保留的习惯和实测数据5.1 旧 PROMPT 变量覆盖问题迁移过程中最容易遇到的一个问题.zshrc里以前手动设置过PROMPT或RPROMPT这些赋值可能会覆盖掉 Starship 注册的 prompt 函数。如果你之前写过类似PROMPT%n%m %~这样的配置迁到 Starship 之后就要把这些行删掉或者确认它们不会在eval $(starship init zsh)之后再次执行。否则你会看到 Starship 配置了个“假”提示符实际显示的却是旧内容。5.2 zsh-syntax-highlighting 的加载顺序如果你用 zinit 加载 zsh-syntax-highlighting 这类插件最好让它靠着.zshrc末尾加载。因为语法高亮插件需要注册 zle 钩子如果它在比较早的位置被加载后面的某些设置可能会把它覆盖掉。Starship 的 init 代码也一样放在文件靠后位置、在插件加载完成之后再执行是最稳妥的做法。这个顺序问题在 Oh My Zsh 时代也存在只是迁移到 Starship 之后因为原来的框架加载结构变了更容易踩到。保持“环境变量 - 插件管理器 - 插件 - Starship init - 别名”这个顺序基本不会出错。5.3 大型 Git 仓库里的 git 状态检测很多人误以为用了 Starship 之后git 状态检测就完全不耗时了。其实 Starship 的 git 状态模块依然需要跑 git 命令来获取工作区状态。在超大型仓库里这个检测还是有开销的。Starship 提供了timeout配置项来控制检测的时间上限。比如[git_status] timeout 50单位是毫秒。设置了超时之后如果仓库太大检测不出来提示符会少显示部分 git 状态但不会卡住你的输入。对我来说这是一个非常可接受的取舍与其每敲一次回车都要等 git 状态检测完不如让它超时后直接显示核心信息。5.4 tmux 和终端字体的配合如果你在 tmux 里使用 Starship图标显示可能会和终端里不一样。需要在 tmux 配置里设置终端类型set -g default-terminal screen-256color并且确保 tmux 使用的字体也支持 Nerd Font。如果你发现某个图标显示成方块或者问号优先检查字体而不是怀疑 Starship 渲染有问题。这个排查思路能帮你省不少时间。5.5 我最终留下的 .zshrc 骨架迁移完成之后我的.zshrc变成了下面这样整体非常短# 环境变量 export EDITORnvim # 插件管理器 source $HOME/.zinit/bin/zinit.zsh zinit light zsh-users/zsh-autosuggestions zinit light zsh-users/zsh-syntax-highlighting # Starship eval $(starship init zsh) # 别名 alias gsgit status alias llls -la这个骨架虽然短但日常开发完全够用。启动时间从原来的 0.8 秒降到了 0.1 秒左右而且提示符在大型仓库里的渲染延迟也明显减轻了。5.6 实测数据最后说下我自己的对比数据仅供参考因为机器配置、仓库大小、插件数量都会影响结果场景Oh My ZshStarshipzsh -i -c exit启动耗时约 0.8s约 0.1s大型 Git 仓库里每次回车后的提示符渲染肉眼可见的顿一下基本无感日常输入时的延迟偶尔卡顿没有明显感知如果你现在还在犹豫要不要折腾我的建议是别急着删 Oh My Zsh先装上 Starship 感受两天用starship timings看看各模块的渲染耗时再决定要不要做完整迁移。配置上先默认、再减法、最后加自定义模块基本不会踩到什么大坑。我自己迁移完之后终端打开速度直接回到“秒开”的状态这种体验上的提升还是相当明显的。

相关新闻

KGG/KGM转MP3教程:电脑手机6种实测方法详解

KGG/KGM转MP3教程:电脑手机6种实测方法详解

2026/9/9 12:14:09

前一阵子帮人处理车载音乐,发现不少人在问:从音乐平台下载下来的歌曲明明是音频,后缀却是 .kgg 或者 .kgm,插到车载U盘、旧的MP3播放器或者想导入智能音箱,根本读不出来。这类格式是部分音乐平台为了保护版权做的专属加…

AI会议纪要工具横评:讯飞听见、通义听悟、飞书妙记、腾讯会议怎么选

AI会议纪要工具横评:讯飞听见、通义听悟、飞书妙记、腾讯会议怎么选

2026/9/9 12:04:09

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

8款AI电脑助手实测对比:从Claude Code到豆包,谁才是生产力神器?

8款AI电脑助手实测对比:从Claude Code到豆包,谁才是生产力神器?

2026/9/9 12:04:09

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

词袋模型(Bag of Words):文本数值化入门与工程实践

词袋模型(Bag of Words):文本数值化入门与工程实践

2026/9/9 12:54:11

词袋模型(Bag of Words)—— 文本数值化的第一步刚接触自然语言处理的朋友,第一个绕不开的概念大概率就是词袋模型(Bag of Words,简称 BoW)。不管你是要做垃圾短信识别、舆情分析,还是给搜索系统…

动态电压恢复器DVR的Simulink建模与仿真验证

动态电压恢复器DVR的Simulink建模与仿真验证

2026/9/9 12:54:11

电力行业的朋友对电压暂降应该都不陌生,生产线莫名其妙停机、变频器跳闸、精密仪器误动作,查到最后往往都是电网电压跌了那么零点几秒。动态电压恢复器(DVR)就是专门对付这类问题的装置,在配电端串联在电源和敏感负载之…

Figma MCP服务器:打通设计稿与AI工具链的实战指南

Figma MCP服务器:打通设计稿与AI工具链的实战指南

2026/9/9 12:54:11

Figma 设计稿和 AI 工具链之间有一条绕不过去的断桥:Figma 里的数据是结构化 JSON,但大多数 AI 助手的输入只有文本、代码和图片。设计交付时要么人工截图、要么手动复制 JSON、要么写一次性的导出脚本。这次我们来看一个把这座桥直接架起来的实战项目&a…

hermes-agent实战:构建多Agent协作的通信与编排底座

hermes-agent实战:构建多Agent协作的通信与编排底座

2026/9/9 12:54:11

我最早注意到这个项目,是因为团队里一套多Agent系统老是“打架”。业务Agent、数据分析Agent、定时任务Agent各自为政,互相调用全靠一堆定制接口,加一个新Agent要改半圈代码,排查一条跨Agent调用链能查到怀疑人生。当时我就在想&a…

Claude Code(Claude Opus 4.8)系统提示词深度拆解:主 Agent 指令、子代理、技能与 32 个工具契约全解析

Claude Code(Claude Opus 4.8)系统提示词深度拆解:主 Agent 指令、子代理、技能与 32 个工具契约全解析

2026/9/9 12:54:11

Claude Code(Claude Opus 4.8)系统提示词深度拆解:主 Agent 指令、子代理、技能与 32 个工具契约全解析 【免费下载链接】system_prompts_leaks Extracted system prompts from Anthropic - Claude Fable 5.1, Opus 5, Claude Design, Claude…

WSA 安装完整指南:Windows 10/11 零基础装好带 Google Play 的安卓子系统

WSA 安装完整指南:Windows 10/11 零基础装好带 Google Play 的安卓子系统

2026/9/9 12:44:11

WSA 安装完整指南:Windows 10/11 零基础装好带 Google Play 的安卓子系统 【免费下载链接】WSABuilds Run Windows Subsystem For Android on your Windows 10 and Windows 11 PC using prebuilt binaries with Google Play Store (MindTheGapps) and/or Magisk or …

中国人民大学杨琳团队《Nature Communications》 | 全球潮汐湿地土壤有机碳时空格局与环境驱动:一项2009-2020年的全球评估

中国人民大学杨琳团队《Nature Communications》 | 全球潮汐湿地土壤有机碳时空格局与环境驱动:一项2009-2020年的全球评估

2026/9/9 1:14:29

本文首发于“生态学者”!从“湿地面积”到“土壤碳密度”:为什么需要重新认识潮汐湿地蓝碳变化?潮汐湿地位于陆地与海洋的交汇地带,包括红树林、盐沼和潮滩,是全球重要的蓝碳生态系统。其土壤能够长期储存大量有机碳&a…

adb抓包

adb抓包

2026/9/8 4:55:53

前言 本文介绍如何通过 tcpdump 在 Android 手机上抓取网络数据包,并在电脑端使用 Wireshark 进行分析。适用于需要排查 App 网络请求、分析接口调用或调试网络问题的开发与测试场景。1. 手机要有 root 权限2. 下载 tcpdump3. adb push C:\Users\zhangkuixun\Downlo…

大模型推理镜像极简瘦身:从 25GB 巨无霸到 3GB 精简镜像实战

大模型推理镜像极简瘦身:从 25GB 巨无霸到 3GB 精简镜像实战

2026/9/8 22:37:26

大模型推理镜像极简瘦身:从 25GB 巨无霸到 3GB 精简镜像实战 在云原生基础设施中,容器镜像体积直接决定了服务的部署速度与弹性扩容敏捷度。对于传统的 Go / Java 微服务,镜像体积通常被严格控制在 50MB 到 200MB 以内,拉取镜像只…

扩散模型图像恢复实战:从DDPM原理到PyQt5可视化系统

扩散模型图像恢复实战:从DDPM原理到PyQt5可视化系统

2026/9/9 0:03:36

简介:面向毕业设计场景的PyQt5扩散模型图像恢复项目,提供完整Python源码与项目说明,适合图像处理、深度学习方向的高年级本科生与研究生参考。项目在模块设计上覆盖图像处理、扩散模型、参数配置、用户界面与结果评估五部分,具体涉…

开关电源环路裕量测试实战:相位裕量与增益裕量详解

开关电源环路裕量测试实战:相位裕量与增益裕量详解

2026/9/9 0:03:36

1. 项目概述:为什么环路裕量测试是电子工程师绕不开的“体检项目”“从零开始的电子工程师生活(6)——环路裕量测试”,这个标题一出来,老电源工程师可能已经下意识摸了摸示波器探头,新同事则大概率在想&…

定时插座芯片怎么选?专用定时IC与单片机MCU选型对比

定时插座芯片怎么选?专用定时IC与单片机MCU选型对比

2026/9/9 0:03:36

拆开市面上不同价位的定时插座,你会发现一个有意思的现象:有的里面躺着一颗黑色的软封装芯片,丝印都看不清;有的则是一块小小的蓝色或绿色PCB,上面赫然印着STM8或者STC的字样。同样叫"定时插座",…

远程协作的工作台整理

远程协作的工作台整理

2026/9/8 4:23:39

远程协作的工作台整理远程协作的核心不是再加一个工具,而是让交接信息足够完整。异步任务要写明目标、输入位置、完成标准和需要决策的人。 工作台的最小配置 将日程、待办、代码和沟通入口收拢到少数固定位置;通知按紧急程度分层。工作台不需要模仿办公…

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

2026/9/8 3:19:39

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

2026/9/8 4:00:23

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…