
原站网页截图,页面可能随时间更新。
sem 是一个运行在 Git 之上的命令行工具,将传统按代码行查看变更的方式提升为按函数、类、方法和类型查看。它面向需要理解代码结构、追踪变更影响或为自动化工具提供更有组织的代码上下文的开发者。
用途与适用场景
sem 用代码实体而不是单纯的文本行来呈现 Git 仓库中的变化。使用者可以查看哪些函数被新增、修改或删除,追踪某个实体最后由哪个提交改动,并分析一个函数的依赖项、调用方和传递影响范围。对于需要审查提交、理解陌生代码、定位变更波及范围以及整理特定函数的历史记录等场景,这种视角能够把结构信息集中展示出来。
工具也提供面向代码上下文的输出:指定实体后,可以获得该实体、依赖项和调用方组成的上下文,并设置令牌预算,适合需要把有限代码上下文交给外部处理工具的工作流。
准备与上手
sem 是命令行程序,官网给出的安装方式包括通过 Homebrew 安装 sem-cli,也可以通过 Cargo 从其代码仓库安装。安装后,在任意 Git 仓库中运行相应命令即可使用,官网强调不需要配置文件或插件。
执行 sem setup 可以创建包装脚本、设置 Git 的全局外部 diff 配置,并安装提交前钩子,使仓库中的 git diff 使用 sem 的差异展示。若要撤销这一设置,可运行 sem unsetup。不使用该集成时,也可以直接调用 sem 的各项命令。
主要功能
sem diff 提供实体级差异,支持重命名识别、结构哈希和行内词级高亮,并显示文件中新增、修改或删除的函数等实体。sem blame 按实体标记最后修改每个函数、类或方法的提交;sem log 则查看单个实体经历过的提交和变化。
sem impact 展示跨文件依赖关系,包括目标实体依赖的内容、使用它的实体、传递影响数量以及受影响的测试。sem entities 列出指定路径下的函数、类、方法和类型及其行号范围。sem context 根据令牌预算整理目标实体、依赖项和调用方的上下文。所有命令都支持 --json,用于生成机器可读输出。
覆盖范围与限制
官网列出的支持范围包括 TypeScript、JavaScript、Python、Go、Rust、Java、C、C++、C#、Ruby、PHP、Swift、Kotlin、Elixir、Bash、HCL、Fortran、Vue、Svelte、XML、ERB、Dart、Perl、OCaml、Scala 和 Zig,共 26 种语言;同时支持 JSON、YAML、TOML、CSV 和 Markdown 等数据格式。
sem 依赖对代码结构的解析来识别实体,因此结果围绕可识别的函数、类、方法、类型及其关系展开,并不只是原始文本差异。官网发布的 0.29.0 版本说明提到,该版本扩展了 C、C++、C#、Rust、Java、Kotlin 和 Elixir 的实体类型,支持将 .h 文件按 C++ 读取,并能恢复 tree-sitter 无法解析区域中的定义。官网还展示了典型差异耗时为 8 毫秒,但实际表现会随仓库内容和运行环境变化。
sem 能否输出适合程序处理的结果?
可以。所有命令都支持 --json,可生成机器可读输出。
sem 是否只能分析一种编程语言?
不是。官网列出 26 种支持的语言,覆盖 TypeScript、JavaScript、Python、Go、Rust、Java、C++ 等多种常见语言,并支持若干数据格式。