
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
总结
生产力工具这个事情, 最好是自己动手, 这样才能真正适合自己的使用习惯.