首页
/ Oh My Zsh bower 插件:用别名与 Tab 补全完善 Bower 命令行工作流

Oh My Zsh bower 插件:用别名与 Tab 补全完善 Bower 命令行工作流

2026-09-03 23:55:50作者:郜逊炳

bower 插件是 Oh My Zsh 中面向前端包管理工具 Bower 的官方插件,它为 bower 命令提供原生的 zsh 补全函数,并预置了一批常用命令的短别名。阅读本文后,你将掌握:如何启用该插件、插件提供的全部别名清单(包括文档未逐一列出的部分)、其补全函数 _bower 的参数解析与子命令分发机制,以及如何获取“已安装包列表”这一动态补全项。

插件能做什么

根据 plugins/bower/README.md 的说明,该插件为 Bower 提供两样东西:

  • 命令补全(completion):基于 zsh 补全系统(compinit)编写,而非依赖 bash-completion 移植方案;
  • 常用命令别名:为 bower installbower listbower search 等高频命令提供短缩写。

需要说明的是,插件本身不负责安装 Bower,它只是对已安装的 bower 命令做 shell 层的增强。若环境中没有 Bower,别名执行时会得到命令找不到的报错。

启用插件

按照 README 的指引,只需在 ~/.zshrcplugins 数组中加入 bower

plugins=(... bower)

保存后重新加载 shell(source ~/.zshrc)或新开终端即可生效。

从加载机制看,oh-my-zsh.sh 会遍历 plugins 数组,对每个插件调用:

_omz_source "plugins/$plugin/$plugin.plugin.zsh"

也就是说,加入数组后实际被加载的是 plugins/bower/bower.plugin.zsh 这一个文件。另外,_omz_source 有一个值得了解的细节:它优先检查 $ZSH_CUSTOM 下是否存在同名文件(custom/bower/bower.plugin.zsh),若存在则加载自定义版本而不是仓库内置版本(见 oh-my-zsh.sh#L175-L180)。这意味着你可以在不改 Oh My Zsh 的前提下用 $ZSH_CUSTOM 覆盖插件行为。

同一个函数还支持按插件粒度关闭别名:若设置了 zstyle ":omz:plugins/bower" aliases false,插件加载完成后其引入的别名会被逐一撤销(见 oh-my-zsh.sh#L165-L194)。对于 bibs 这类极短别名可能与个人习惯冲突的场景,这是一个干净的退出机制。

别名清单

README 中给出的别名表如下:

别名 命令 说明
bi bower install 安装 bower.json 中声明的项目依赖
bl bower list 列出本地已安装包及可更新项
bs bower search 搜索全部包或指定包

而对照源码 bower.plugin.zsh#L1-L5,插件实际还定义了两个与“保存依赖”相关的别名,完整清单应为:

别名 命令 说明
bi bower install 安装 bower.json 中声明的依赖
bis bower install --save 安装并将包写入 bower.json 的 dependencies
bisd bower install --save-dev 安装并将包写入 bower.json 的 devDependencies
bl bower list 列出本地包与可能的更新
bs bower search 按名称搜索包

bisbisd 的区别对应 bower install--save / --save-dev 两个参数:前者把依赖记入正式依赖,后者记入开发依赖,与后端生态中“生产依赖/开发依赖”的划分方式一致。

补全函数 _bower 的实现解析

启用插件后,bower 命令的补全由 bower.plugin.zsh 中定义的同名函数 _bower 接管,最后一行通过 compdef _bower bower 完成注册(bower.plugin.zsh#L84)。该函数采用与 npm 补全脚本相同的 _arguments 风格组织(文件头注释也标注了这一点,见 plugins/bower/_bower 的说明),整体可分为三段逻辑。

第一段:收集通用参数与子命令

函数开头声明了若干可复用参数数组(bower.plugin.zsh#L12-L42):

_no_color=('--no-color[Do not print colors (available in all commands)]')

_dopts=(
    '(--save)--save[Save installed packages into the project"s bower.json dependencies]'
    '(--force)--force[Force fetching remote resources even if a local copy exists on disk]'
)

几个细节值得注意:

  • 每个选项形如 (--save)--save[描述],前半段 (--save) 表示互斥组——补全过 --save 后不会再提示同名选项;
  • 描述文字直接复用了 bower 官方 help 文本(如“Force fetching remote resources even if a local copy exists on disk”),所以按下 Tab 看到的提示与 bower --help 的语义一致;
  • _1st_arguments 数组罗列了 11 个可补全的子命令:cache-cleanhelpinfoinitinstalllinklookupregistersearchuninstallupdate,以及 ls/list 二合一项 {ls,list}bower.plugin.zsh#L29-L42)。

随后函数先用 _arguments "$_no_color" '*:: :->subcmds' 尝试解析,若解析成功即直接返回;当 CURRENT == 1(即刚输入 bower 后的第一级补全)时,通过 _describe -t commands "bower subcommand" _1st_arguments 展示带描述的子命令菜单(bower.plugin.zsh#L43-L50)。

第二段:按子命令分发参数

当输入已经包含子命令时,函数用 case "$words[1]" 按不同命令给出不同的参数集合(bower.plugin.zsh#L52-L80):

子命令 可补全的参数 额外补全
install --save--force--save-dev--force-latest--no-color--production
update --save--force--no-color--force-latest 已安装包名
uninstall --no-color--save--force 已安装包名
其他 --no-color

这与 bower 各子命令的实际接受参数是吻合的:例如 --production(跳过 devDependencies)只对 install 有意义,而 --force-latest 用于冲突时强制取最新版本。

第三段:已安装包的动态补全

updateuninstall 两个分支在参数补全之外还额外追加了一层补全——当前项目实际已安装的包名。其实现位于 bower.plugin.zsh#L7-L9

_bower_installed_packages () {
    bower_package_list=$(bower ls --no-color 2>/dev/null| awk 'NR>3{print p}{p=$0}'| cut -d ' ' -f 2|sed 's/#.*//')
}

这条管道依次做了三件事:

  1. 执行 bower ls --no-color,并把 stderr 丢弃,保证补全过程不产生杂音;
  2. awk 'NR>3{print p}{p=$0}' 跳过前 3 行表头,并打印“上一行”——从解析逻辑看,这是为了处理包名与其依赖说明跨行排列的输出格式,把包名行与描述行错开一行取回;
  3. cut -d ' ' -f 2 取每行第 2 个字段(包名所在列),再用 sed 's/#.*//' 截断 # 之后的版本号等后缀。

处理结果存入 bower_package_list,两个分支随后以 compadd "$@" $(echo $bower_package_list) 把包名作为候选项补出(bower.plugin.zsh#L66-L74)。也就是说,输入 bower uninstall 再按 Tab,候选列表就是当前项目安装的包,而不需要手动回忆包名。

仓库中的另一份 _bower 文件

bower 插件目录里还有一个 plugins/bower/_bower 文件,内容是一段“classic”风格的补全脚本:它设置 COMP_WORDBREAKS,然后分别针对 bash 的 complete、zsh 的 compdef 和 ksh 的 compctl 三种机制调用 bower completion -- 这一 Bower 内置的补全接口。

从源码结构看,Oh My Zsh 加载插件时只 source bower.plugin.zsh(见上文 oh-my-zsh.sh#L204-L207 的加载规则),_bower 并不会被自动执行,它更像是随插件保留下来的参考实现/历史脚本,文件内注释也表明它基于 npm 的补全工具思路并保留了 bower completion 的官方安装说明。若你想对比两种补全路线:仓库采用的 compsys 方案能按子命令精确给出参数与已安装包补全,而 _bower 中的 bower completion -- 方案则是把补全请求整体委托给 bower 自身处理。

补全体验的配套前提

Oh My Zsh 的全局补全配置在 lib/completion.zsh 中完成,其中几项配置会直接影响 bower 补全的手感:

小结与注意事项

  • 启用方式是在 ~/.zshrcplugins 数组中加入 bower,实际加载 plugins/bower/bower.plugin.zsh
  • 别名共 5 个:bibisbisdblbs,其中 bis/bisd 对应 --save/--save-dev
  • 补全按子命令区分:install 提供 6 个参数,update/uninstall 提供参数加“已安装包名”的动态补全,包名解析来自 bower ls --no-color 的输出;
  • 如需定制插件,可在 $ZSH_CUSTOM/bower/ 放置 bower.plugin.zsh 覆盖默认实现,或用 zstyle ":omz:plugins/bower" aliases false 关闭别名;
  • 仓库中的 plugins/bower/_bower 属于基于 bower completion 接口的参考脚本,正常启用插件时并不会被加载。

由于 Bower 如今已属相对成熟(维护趋缓)的包管理方案,本插件更适合作为 Oh My Zsh 插件开发范式的学习样本:一个插件如何同时提供别名、compsys 补全函数与 compdef 注册,这三者在短短 84 行内都有完整体现。

登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
33
18
ops-transformerops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
1.12 K
2.72 K
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
528
590
ops-nnops-nn
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
904
1.82 K
pytorchpytorch
作为 Ascend for PyTorch 社区的核心组件,TorchNPU 是昇腾专为 PyTorch 打造的深度学习适配插件,使 PyTorch 框架能够直接调用昇腾 NPU,为开发者提供昇腾 AI 处理器的超强算力。
Python
854
1.34 K
docsdocs
暂无描述
Markdown
889
5.78 K
jiuwenswarmjiuwenswarm
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
3.52 K
1.01 K
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.33 K
1.45 K
cann-learning-hubcann-learning-hub
CANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。
Jupyter Notebook
982
503
AscendNPU-IRAscendNPU-IR
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
540
384