说实话,第一次看到那条热搜“想要安装superpowers”的时候,我愣了一下。大部分人听到“超能力”,第一反应是游戏模组或者科幻电影里的设定,可我当时手上正好在配置一台新工作电脑,脑子里瞬间闪过的完全是另一个画面:终端里敲两下就能跳到任何目录,编辑器里一个快捷键整行复制,浏览器里脚本自动把表单填好、把重复页面刷完——这种“想什么就来什么”的手感,才是最真实、可安装的超能力。这篇文章想分享的,就是一套我从日常工作中攒出来的、人人都能手动“安装”的开发者效率工具箱。它不依赖某种奇遇,也不要求你有多高的技术水平,只要照着装、照着配,你也能获得同样的加成。适合那些每天在命令行、编辑器和浏览器之间来回切换,但总觉得大量时间花在重复操作上的人。
1. 先搞清楚你要超能力做什么——工作流瓶颈诊断
1.1 效率工具不是越多越好
我见过太多人一上来就装十几个终端工具、几十个编辑器插件,结果真正常用的只有两三个,剩下的不仅占用内存,还让快捷键互相冲突、命令提示刷屏,最后效率反而更低了。这不是工具的问题,而是安装顺序出了问题。正确的做法是先诊断自己在工作流里最费力的那几个瞬间,再针对性地装工具。
举个例子。我之前有个项目,需要在十几个配置文件里反复改动同一个模块的引用路径。当时我装了四五个“自动化重构”插件,以为能一劳永逸——结果插件之间互相打架,动不动就弹窗报错。后来冷静下来,把流程拆开一看,真正浪费时间的点有三个:一是切换到目标目录太慢,二是在文件里定位关键词太慢,三是每个文件开头的公共头注释要重复粘贴。针对这三个点,我只保留了三个轻量工具,问题立刻解决。所以,别急着下载东西,先花两天时间记录自己的操作。
1.2 四种最常见的“费力时刻”
用一个简单的方法就能找到你的瓶颈:连续三天,记录下自己每天重复超过三次的操作。根据我观察,绝大多数人的重复劳动集中在以下四类。
| 费力时刻 | 具体表现 | 可用的超能力 |
|---|---|---|
| 路径切换 | 每次都要输入一长串 cd 进入深层目录 | zoxide + zsh 自动记忆跳转 |
| 编辑重复 | 同样一段代码/文本反复手打,或者同样的格式反复调整 | 编辑器多光标 + 代码片段 |
| 网页填表 | 每天打开同一个后台页面,填同样的用户名、备注、日期 | Tampermonkey 用户脚本 |
| 批量操作 | 几十个文件改名、移动、压缩 | 写一个一次性 Python 脚本 |
注意,这四类不是并列的优先级,而是按成本从低到高排的。终端改造的投入最小、见效最快;网页自动化稍微有点写代码的门槛,但收益也最直接;批处理脚本需要一定的编程基础,不过一旦掌握,几乎能解决所有“手足无措”的重复劳动。
1.3 给超能力分类:按需安装,而不是全盘吞下
很多人看到“超能力”这个词,会默认它是一套全能的魔法,装一个就什么都会了。但现实中的效率工具更像“被动技能”,每一样都只解决一个问题。我的建议是把它们分成四个用途:
- 命令跳转类:解决“找不到/进不去”的问题,典型代表是 zoxide、fzf。
- 编辑辅助类:解决“手速跟不上脑速”的问题,典型代表是多光标和代码片段。
- 网页自动化类:解决“浏览器里的机械劳动”,典型代表是油猴脚本。
- 脚本批处理类:解决“一个动作要做一百次”的问题,典型代表是 Python 小脚本。
在往下读之前,你可以先拿一张纸写下:哪一类是你今天最想解决的?如果真的很迫切,你甚至可以跳过其他章节,直接跳到对应的部分。但如果你有耐心,我建议全部看完,因为这几项能力叠加起来才能形成真正的“工作流超能力”。
2. 终端超能力:给命令行装加速器
2.1 为什么先改终端
终端是所有开发者和运维绕不开的入口,也是重复操作密度最高的地方。改终端相当于给高速公路铺路,你之后用 git、用包管理器、用脚本,所有命令都会受益。更重要的是,终端的改造不会影响任何业务代码,试错成本极低,也不怕搞坏项目。
有人纠结于选 zsh 还是 bash,我的建议很简单:如果你的系统默认是 bash,不用急着换;如果已经支持 zsh,那就直接用 zsh。本文的配置基于 zsh,因为它的生态最成熟,补全和主题都好看。不过下面的工具大多也兼容 bash,只是初始化方式略有区别。
2.2 核心装备:zoxide、fzf、eza
这三样是我现在终端里的“三件套”,分别解决目录跳转、历史搜索和文件列表三个最常用的场景。
第一件是zoxide,它是 cd 命令的智能升级版。你只要去过某个目录一次,它会根据访问频率和最近使用时间记住路径,下次想跳转,输入z 关键词就能直接过去。比如你经常访问/home/user/work/project/backend/src,以后只需要:
z backend就能自动跳到那个目录。如果出现多个候选,它还会列出选项让你选。实际用下来,这类命令帮我省掉了我大概 70% 的历史指令翻找时间。
第二件是fzf,一个模糊搜索工具。它可以跟 Ctrl+R 绑定,把原来的“翻历史”变成“模糊搜索”,输入几个字母就能命中任何一条历史命令。还能跟vim、git等工具配合,做文件搜索、分支切换、进程选择,可以说是终端里的“万能选择器”。
第三件是eza,ls 命令的现代化替代品。它支持彩色输出、文件类型图标、git 状态显示和树形结构,让目录列表一眼就能看清。配置方式也很简单:
eval "$(zoxide init zsh)" eval "$(fzf --zsh)" alias ls="eza --icons --group-directories-first"把这三行写进~/.zshrc,再执行source ~/.zshrc就生效了。如果你用的是 bash,把第二行换成source <(fzf --bash)即可。
2.3 在真实工作流里用起来
光配置好不算完,关键是把它融入日常操作。我举一个典型的场景:假设你同时在维护三个项目,目录结构都是~/project/a/scripts、~/project/b/scripts、~/project/c/scripts,以前你要切到 b 项目,得把绝对路径打一遍,或者反复 tab 补全。现在你只需要:
z b如果目录名有冲突,比如 a 和 b 都有scripts,用z b scripts会优先跳到你最近访问的那个scripts。这时再配合 fzf 的历史命令搜索,你想执行npm run build,直接Ctrl+R输入“build”回车即可,连打都不用打。
我还有一个更进阶的用法:在/etc/hosts里给常用服务器起短名,然后在~/.zshrc里写几个 alias,把ssh s1这种命令缩短成to1。这些看起来很小,但每次省几秒钟,一天几十次操作累积下来,节省的时间非常可观。
2.4 配置时容易翻车的两个点
第一点是初始化顺序。如果你的.zshrc里之前就有alias cd=...之类的重定向,一定要让 zoxide 的初始化语句放在别名定义之后,否则 zoxide 可能被旧的 cd 覆盖,产生“感觉没生效”的问题。检查方法是打开一个新的终端窗口,输入type cd,看看显示的是什么。
第二点,也是最容易踩的坑:eza 的图标需要系统安装 Nerd Font 字体才能正常显示,否则会出现一堆方框乱码。你需要在终端软件里也把字体切换成 Nerd Font 版本,比如JETBRAINS MONO NURD FONT。重点不是去折腾图标本身,而是先确保字体装好、选对。我第一次配置就是因为忽略了这一步,结果显示异常,还以为是 eza 坏了。
3. 编辑器超能力:让编辑器记住你的习惯
3.1 把重复操作变成肌肉记忆
终端管的是“往哪去”,编辑器管的是“怎么改”。如果说终端超能力是跳得远,编辑器超能力就是手速快。VS Code 是目前插件生态最丰富、学习成本也相对友好的编辑器,所以我下面的例子都用它。但思路对其他编辑器同样适用。
先想一个最普通的场景:你要把一段 JSON 里的十个字段都加上双引号;或者把一段文本里的五个相同单词改成另一个词;或者同时注释掉多行代码。如果用鼠标一个一个选,既慢又容易漏。VS Code 的多光标功能就是专门解决这个问题的:选中目标词后按Ctrl+Shift+L(macOS 上是Cmd+Shift+L),所有相同词都会同时出现光标,你只需要改一次,其余全部同步变好。
另一个高频操作是移动代码行。很多人喜欢切到鼠标去拖,其实选中整行后用Alt+↑/↓就能上下移动,在重排函数顺序时特别顺手。这些快捷键属于“一次记住、终身受益”的类型,我强烈建议把它们写在便利贴上贴到显示器旁边。
3.2 自定义代码片段的力量
快捷键解决“操作”,代码片段解决“内容”。比如我经常需要写调试日志,以前每次都要敲console.log,再手动带上文件名和行号,写多了非常烦躁。我现在用 VS Code 的用户代码片段功能,在keybindings.json旁边的snippets里加了一段配置:
{ "Log with location": { "scope": "javascript,typescript", "prefix": "clog", "body": [ "console.log('[$TM_FILENAME_BASE$TM_LINE_NUMBER] $1', $2);", "$0" ], "description": "Log with file and line number" } }保存后,在任何 JS 文件里输入clog,再按 Tab,编辑器会自动补全成一行带当前文件名和行号的日志。$TM_FILENAME_BASE和$TM_LINE_NUMBER是 VS Code 内置的变量,分别代表当前文件名和行号,不需要额外插件。类似的片段可以扩展到很多东西:创建 React 组件、写 HTML 骨架、插入常见的数据结构模板。
这背后的逻辑是:不要每次从空文件开始,而是把“套路化”的内容交给代码片段,把精力留给真正需要思考的部分。很多人误以为写代码必须从零开始,实际上老手都在用片段和模板搭脚手架,只是他们不说而已。
3.3 如何保证三台设备上的体验一致
我平时在办公室台式机、笔记本和家里电脑之间切换,如果不做配置同步,每台机器的快捷键、片段、主题可能完全不一样,那超能力就白装了。VS Code 自带的 Settings Sync 功能可以把设置、键位、片段、插件列表都同步到账号里。开启方法很简单:登录微软账号后,左下角齿轮菜单里选择“打开设置同步”,确认要同步的项目。
但这里有一个非常关键的坑:如果你用 Git 存储一些配置文件在项目里,千万别把.vscode/目录下的个人设置一并提交到公共仓库,尤其不要把包含内网地址、密钥信息的文件标成同步项。一次不小心,可能就把敏感信息带出去了。我的经验是,用官方 Settings Sync 只同步界面配置和插件列表,真正跟业务相关的配置一律放在项目目录下并走版本控制的白名单,这样既稳定又安全。
同步完成后,再检查一下:换一台机器,新建一个文件,输入clog,如果片段能弹出来,说明设置同步成功了。别小看这一步,很多人在新机器上花半天重新配置忘了备份,等到急用某个快捷键时才发现内容不对,非常耽误进度。
4. 浏览器超能力:用脚本接管重复网页操作
4.1 油猴脚本比浏览器插件更可控
接下来讲浏览器里的超能力。你要是有“每天重复填表单”“每次都要点同一个按钮”“需要自动等页面刷新再点击”这类操作,浏览器扩展一般做不到这么细,但你完全可以自己写油猴脚本。Tampermonkey(中文常叫油猴)是这类用户脚本管理器里最主流的宿主,它允许你在指定网站上注入 JS,实现自动点击、填表、翻页、数据提取等操作。
有人问,为什么不直接用浏览器自带的“自动填充”?因为真正麻烦的往往不在字段值,而在于触发条件:有的表单是动态加载的,要等 AJAX 完成才能填;有的按钮只有在特定元素出现后才能激活;有的页面刷新之后需要连续执行两步操作。这些复杂的时序控制,只能用代码实现。
脚本要想写得稳,首先要理解@match规则。它决定了你的脚本在哪些网站生效,格式类似*://example.com/*。只给自己需要处理的站点加匹配,不要写得太大,否则会在无关页面上报错甚至干扰浏览。默认情况下,授权字段@grant none表示不申请额外权限,这符合最小权限原则。
4.2 一个最简单的自动填表脚本
假设你每天要登录某个内部系统,页面上有用户名、邮箱和备注三个字段,你想让脚本在页面加载完成后自动填好。这时用户脚本可以长这样:
// ==UserScript== // @name AutoFill Internal Form // @namespace http://tampermonkey.net/ // @version 0.1 // @description auto fill demo form // @match https://my-internal-system.example.com/* // @grant none // ==/UserScript== (function () { 'use strict'; function autoFill() { const fields = { 'username': 'demo_user', 'email': 'demo@example.com', }; for (const [key, value] of Object.entries(fields)) { const el = document.querySelector(`input[name="${key}"], input#${key}`); if (el) { el.value = value; el.dispatchEvent(new Event('input', { bubbles: true })); } } } window.addEventListener('load', autoFill); })();这里最关键的一行是el.dispatchEvent(new Event('input', { bubbles: true }))。很多框架(如 Vue、React)不会监听原生input事件,你直接改变el.value后界面上的数据可能没有更新,所以必须手动派发事件告诉框架“输入框的值变了”。这个细节决定了脚本能不能真正生效。
4.3 动态页面和跨域问题的处理
填表脚本如果只管一次性加载,往往还能跑,但遇到“页面先加载框架、再异步拉数据”的情况,window.load触发的时候表单可能还没生成。这时需要用到MutationObserver来监听 DOM 变化,等目标元素出现时再执行填充。简单说就是轮询改成了“观察员”,页面只要插入新的节点,脚本就能立刻响应。
跨域问题则是用户脚本的另一个边界。Tampermonkey 默认的沙盒环境允许脚本访问页面资源,但如果你的脚本想去请求另一个域名的数据,就会受到浏览器 CORS 限制。比如我在一个数据看板页面上想拉取另一个服务的 API,无水印页面会直接报错。解决方案有三种:一是让目标 API 开启 CORS;二是通过服务端代理转发;三是在脚本的@connect声明白名单。对于内部系统,我通常优先和服务端约定好 CORS 配置,这比在脚本端绕来绕去可靠得多。
4.4 脚本来源的安全边界
使用油猴脚本始终要牢记一条:脚本本质上是能访问你当前网页全部内容的代码,甚至可以拿到你在页面里输入的敏感信息。所以,不要装来路不明的脚本,尤其是那些声称能“刷金币”“自动签到领会员”的脚本。在安装任何用户脚本之前,至少做两件事:一看作者是否长期活跃、是否有公开源码仓库;二看脚本里有没有奇怪的fetch请求,有没有把数据发送到第三方域名。如果看不懂代码,宁可放弃也不要装。
我自己的习惯是,自己能写的脚本尽量自己写,哪怕写出来的代码笨一点,但至少知道它在做什么。如果实在需要现成脚本,先装到一个不重要的浏览器测试用户里跑几天,观察它的网络请求,没有任何异常再正式启用。
5. 全局超能力:把日常动作写成一次脚本
5.1 从“手工重复”到“脚本闭环”的例子
最后这一层超能力,是把你整个人从重复劳动里解放出来的关键。它不需要你写多复杂的程序,一个五行的 Python 脚本就能解决大多数批量操作。
说个真实案例。有一次我从一个系统里导出了三十多张图片,文件名全是IMG_20250312_xxxx.tmp,需要全部改成带日期前缀的正规文件名。如果用鼠标一个一个改,少说也要十分钟,而且容易手滑。我写了一个 Python 脚本:
from pathlib import Path folder = Path("~/Downloads/imports").expanduser() for old in folder.glob("*.tmp"): new = old.with_suffix(".txt") if not new.exists(): old.rename(new) print(f"{old.name} -> {new.name}")这个脚本做的事情很简单:遍历目标文件夹下所有.tmp文件,改成.txt后缀;如果目标文件已存在,就跳过,避免覆盖。with_suffix是Path对象自带的替换后缀方法,不需要手动拼接字符串。看似简单,但已经解决了最棘手的问题。
我特别建议给自己的批量操作脚本加上一个“试运行”模式(dry-run)。在脚本开头加一个DRY_RUN = True,运行时只打印出来会改成什么,不真正移动文件。确认无误后再把DRY_RUN改成False。这一步能帮你避免绝大多数因为手误造成的灾难性覆盖或丢失。
5.2 让脚本可复用:参数、配置和回滚
批量脚本最大的痛点是“只适用一次”。如果下周要换一批文件名,之前不是白写了?所以第二个版本我会加入命令行参数,让脚本不再硬编码文件夹名和规则:
import argparse from pathlib import Path parser = argparse.ArgumentParser(description="重命名工具") parser.add_argument("--folder", required=True, help="目标文件夹") parser.add_argument("--suffix-from", default=".tmp", help="原后缀") parser.add_argument("--suffix-to", default=".txt", help="新后缀") parser.add_argument("--dry-run", action="store_true", help="只预览不执行") args = parser.parse_args() folder = Path(args.folder).expanduser() for old in folder.glob(f"*{args.suffix_from}"): new = old.with_suffix(args.suffix_to) if args.dry_run: print(f"DRY RUN: {old.name} -> {new.name}") elif not new.exists(): old.rename(new) print(f"{old.name} -> {new.name}")这样我以后处理类似任务,只需要一条命令:
python3 rename.py --folder ~/Downloads/imports --suffix-from .jpeg --suffix-to .jpg --dry-run执行前先看预览,再拿掉--dry-run正式运行。更稳妥的做法是,在执行前把旧文件名列表写进一个日志文件,万一出错还能回滚。脚本并不聪明,但在你做危险操作之前,多留一条退路就是最重要的“超能力”。
5.3 定时执行的边界
脚本写好了,能解决“现在”的重复,但如果这个操作是每天固定要做的,还可以把它交给系统定时任务。Linux/macOS 上的 cron 就是一个好选择。比如你每天凌晨两点需要把某个目录下超过七天的日志移入归档区,可以配置一条 cron:
0 2 * * * cd /home/user/bin && ./archive_logs.py > /tmp/archive_logs.log 2>&1这里的cd /home/user/bin非常重要,否则脚本里用相对路径肯定找不到文件。我见过太多例子,脚本在预览时正常、手动运行时正常,唯独放进 cron 就报“找不到文件”,多半就是忘了把工作目录切到脚本所在位置,或者忘了把环境变量引入到 cron 环境里。在写 cron 任务时,记得所有路径都用绝对路径,并且把错误输出重定向到日志文件,这样排查起来才不费劲。
当然,定时任务不是万能的。如果一次任务执行时间超过几小时,或者依赖外部网络服务,一定要充分考虑超时和重试策略。我会在脚本里加一个简单的锁文件,防止同一个任务在上一次还没跑完时又被启动,避免资源竞争。
5.4 版本管理与回滚
脚本写多了,最怕的是“改坏了原来的功能”。我的做法是把所有较大一点的工具脚本放在一个 Git 仓库里,每次改动都提交,并写好 commit message。这样万一新改动引入了 bug,可以用git revert瞬间回到之前的版本。对于运行期超过一分钟的脚本,我还会在开头打印时间戳和版本号,方便定位问题。
有人觉得拿 Git 管这种小脚本有点小题大做,但我个人的经验是,只要写过一次“改坏了又不知道改了什么”的脚本,你就会明白版本管理的价值。成本很低,收益却极高。
6. 安装超能力之前的避坑清单
6.1 常见翻车场景与对策
工具装得越多,翻车方式就越五花八门。下面这张表是我这些年遇到的最常见的几类问题,以及对应的排查思路:
| 症状 | 可能原因 | 对策 |
|---|---|---|
| 终端打开特别慢,输入命令要延迟几秒 | zshrc 里工具初始化太多,且互相有顺序依赖 | 逐个注释掉初始化命令,用zsh -x调试看耗时 |
| eza 显示一串方框 | 没装或没选 Nerd Font 字体 | 换用支持图标的字体,重新设置终端字体 |
| 脚本手动运行正常,cron 里不工作 | 工作目录、环境变量缺失 | 所有路径写绝对路径,在 cron 前加source ~/.profile |
| Tampermonkey 脚本不生效 | @match没覆盖实际 URL,或者触发的页面时机太早 | 打开控制台看是否报错,调整匹配规则或用 MutationObserver |
| VS Code 片段前缀不弹出 | 片段 scope 写错,或编辑器设了禁止建议 | 检查 snippet JSON 格式;在文件里手动 Ctrl+Space 调出建议 |
| 导入别人的配置后一堆报错 | 插件版本不兼容或插件之间有冲突 | 最小化配置,先禁用一半插件二分定位 |
如果你在装某个工具后出现了多个症状,不要急着卸载。先记录现象,再对照上面表格检查,基本都能解决。最大的坑往往是“不会看错误信息”,而不是工具本身。
6.2 三分钟自检法
我给自己定了一个规矩:每装一个“超能力”工具,三分钟内要能回答三个问题。第一,它有没有让我的某个高频操作变快?如果感觉不到变化,那它可能只是摆设。第二,它有没有引入新的心智负担?每天要记很多快捷键,反而容易忘掉关键操作。第三,它回滚容不容易?如果不能一条命令卸载、一份配置恢复原样,那就说明方案太复杂了。
说白了,“超能力”应该是你习惯的一部分,而不是额外记的负担。我见过有人为了减少切换窗口安装了空间网格、一堆窗口管理软件,结果每天要花五分钟想按键,最后效率不升反降。好的工具应该像z跳转一样,你不需要思考,它就自动带你到想去的地方。
6.3 我的保留原则
最后分享一个我长期坚持的保留原则:在终端、编辑器、浏览器这三个层面的超能力,每个层面最多保留四个核心工具,额外增加一个必须能说出“最近两周用了超过五次”。这个原则听起来很死板,但它有效抑制了我“下插件一时爽,用起来全淡忘”的毛病。
保留名单也不是一直不变的。比如说,我最早用的是autojump,后来发现它记忆逻辑不够清晰,才换成zoxide;我最早用的是ls加别名,后来才换成eza。工具在演进,配置也要跟着调整。每隔三个月,我会花一个下午把所有配置文件过一遍,删掉用不上的东西,更新过时的版本。这种“配置整备”的仪式感,往往能让工作流保持在一个轻快稳定的状态。
如果你也想拥有属于自己的 superpowers,我的建议很简单:从今天最烦的三个重复动作开始,逐个击破,先不要贪多。等这三点解决完,你会发现工作流已经顺畅了一大截。剩下的,都是水到渠成的事。