SCM Breeze 平替与泛化: 打造更灵活的命令行增强工具

SCM Breeze 平替与泛化: 打造更灵活的命令行增强工具


app 效率 命令行

简介

SCM Breeze 是一个 git 命令行的增强工具, 其核心功能是给 git status 返回的文件加上数字编号, 后续的 git add 等命令可以直接使用这个编号, 而无需复制/粘贴文件名.

使用原生 git 命令行:

git add assets/git_breeze/config* assets/git_breeze/install.sh

使用 SCM Breeze 则是 (下面三种都可以):

ga $e2 $e3 $e11
ga 2 3 11
ga 2-3 11

为什么要替代 SCM Breeze

SCM Breeze 有如下痛点:

  • 它预先定义了过多的 alias, 而如果恰好你用 Oh My Zsh 这种方案, 会有大量的冲突
  • 它无法自由地跟系统指令进行组合, 仅限于 git 一个场景
  • 其实现过于复杂, 想进行扩展非常困难

而在看到 Migrating away from SCM Breeze 这篇文章以后, 我发现这个博主给的解决方案非常优雅, 而且极具扩展性.

开启替代之旅

先睹为快

定义核心诉求

  • 核心框架要足够简单, 并且可以自由扩展
  • 可以扩展到日常高频的使用场景 (ls, grep…)
  • 所有指令、别名都可以自定义, 符合个人使用习惯

原理解析

以下面的命令为例:

function l {
    { __print-path-argument $@; eza -lah --time-style=long-iso --color=always $@ } \
        | add-index --input-type eza_list --print-indexables | set-index-variables
}
compdef _ls l

第一部分是原始命令的输出 (__print-path-argument 这个可以先忽略):

第二部分则是给原有信息加上类似 [1] 这种数字序号, 再追加 @@indexables@@ 元信息.

NOTE: add-index 这个适配了 ag, git, ls, eza, tree 等专用命令, 以及一个通用的 list 格式.

第三部分则去掉元信息部分, 并且设置环境变量 ($e1 这种形式):

经过上面的步骤, 在执行特定的指令以后, 环境变量里会设置 e1 ... eN, 保存的是相应文件的路径.

接下来是展开部分的魔法:

function expand-indexes-or-expand-or-complete {
    # ...
}
zle -N expand-indexes-or-expand-or-complete

注册好这个自定义补全方法后, 会自动展示命令行输入的序号等信息.

# 输入 ls 1-2 按 Tab 键, 会被自动展开成
ls /Users/mdl/Code/NsLib/blog-code-snippet/scm-breeze-alternative/add-index /Users/mdl/Code/NsLib/blog-code-snippet/scm-breeze-alternative/README.md

完整方案

代码见: https://github.com/NsLib/blog-code-snippet/tree/master/scm-breeze-alternative

这里不是一个开箱即用的完整方案, 而是需要你自行整合进自己现有的 zsh 配置中:

  • add-index 文件放到自己喜欢的 bin 目录, 例如:
    • ~/.local/bin/add-index
    • /usr/local/bin/add-index
  • theme.yml 文件放到 ~/.config/eza/theme.yml (注意: eza 适配了这个主题的配色, 想用其他的要自行适配)
  • zshrc 则整合进自己的 ~/.zshrc

总结

生产力工具这个事情, 最好是自己动手, 这样才能真正适合自己的使用习惯.

© 2025 凝霜