58 次重大发布

0.60.0 2024 年 8 月 1 日
0.59.0 2024 年 7 月 20 日
0.58.0 2024 年 5 月 11 日
0.56.1 2024 年 3 月 6 日
0.6.0 2021 年 7 月 28 日

#202解析器实现

Download history 186/week @ 2024-05-03 806/week @ 2024-05-10 337/week @ 2024-05-17 293/week @ 2024-05-24 243/week @ 2024-05-31 235/week @ 2024-06-07 248/week @ 2024-06-14 152/week @ 2024-06-21 127/week @ 2024-06-28 128/week @ 2024-07-05 156/week @ 2024-07-12 750/week @ 2024-07-19 782/week @ 2024-07-26 662/week @ 2024-08-02 266/week @ 2024-08-09 231/week @ 2024-08-16

2,006 次每月下载
用于 2 crates

MIT 许可证

491MB
15M SLoC

C 15M SLoC // 0.0% comments Rust 12K SLoC // 0.0% comments Scheme 6.5K SLoC // 0.1% comments C++ 3.5K SLoC // 0.0% comments

it's difftastic!
English manual Chinese manual crates.io codecov.io

Difftastic 是一个结构化差异工具,它根据文件的语法来比较文件。

有关安装说明,请参阅安装指南中的手册

基本示例

Screenshot of difftastic and JS

在这个 JavaScript 示例中,我们可以看到

(1) Difftastic 理解嵌套。它突出显示匹配的 {},但理解尽管有前导空白,foo() 没有改变。

(2) Difftastic 理解哪些行应该对齐。它将左边的 bar(1) 与右边的 bar(2) 对齐,尽管文本内容并不相同。

(3) Difftastic 理解换行没有意义。 "eric" 现在在新的行上,但它没有改变。

一分钟演示

asciicast

这个一分钟的屏幕录像展示了使用独立文件和 git 的 difftastic 使用方法。

支持的语言

Difftastic 支持 30 多种编程语言,有关完整列表,请参阅手册

如果文件有一个无法识别的扩展名,difftastic 使用带单词高亮的文本差异。

已知问题

性能。Difftastic 在具有大量更改的文件上扩展得相对较差,并且会消耗大量内存。

显示。Difftastic 有一个并排显示,通常工作得很好,但可能会令人困惑。

鲁棒性。Difftastic 定期发布版本,修复崩溃问题。

非目标

修补。Difftastic 的输出旨在供人类阅读,它不会生成可以稍后应用的补丁。如果您需要补丁,请使用 diff

(补丁文件也是以行为单位的,这对 difftastic 来说太有限了。Difftastic 可能会在同一行上找到添加和删除的内容,并且它跟踪旧文件和新文件行号之间的关系。)

合并。AST 合并是一个 difftastic 无法解决的问题。

常见问题解答(FAQ)

这基本上是 --word-diff --ignore-all-space 吗?

单词差异(word diffing)无法做到这一点

Difftastic 解析您的代码。它理解何时空白字符很重要,例如在字符串字面量或像 Python 这样的语言中。它理解在 JS 中 x-1 是三个令牌,但在 Lisp 中是一个令牌。

我可以用 difftastic 与 git 一起使用吗?

当然可以!difftastic 手册 包含了 git 使用说明。您还可以使用它 与 mercurial 一起使用

如果您是 magit 用户,请查看 这篇文章,展示了一种使用 difftastic 与 magit 一起使用的方法。

difftastic 是否可以与我最喜欢的工具集成?

可能不行。difftastic 还很年轻。考虑为您最喜欢的工具编写一个插件,我会在 README 中链接它!

difftastic 能帮我解决合并冲突吗?

是的!从版本 0.50 开始,difftastic 可以理解合并冲突标记(即 <<<<<<<=======>>>>>>>)。

将存在冲突的文件作为单个参数传递给 difftastic。difftastic 将构建两个冲突文件并比较它们。

$ difft file_with_conflicts.js

difftastic 可以执行合并操作吗?

不。AST 合并是一个 difftastic 无法解决的问题。

从文本差异的角度来看,AST 差异是一个有损过程。difftastic 将忽略非语法相关的空白字符,但合并需要跟踪空白字符。

difftastic 可以忽略顺序吗?

不。Difftastic 总是认为顺序很重要,因此比较例如 set(1, 2)set(2, 1) 时的顺序会显示差异。

如果您正在比较 JSON,请在传递给 difftastic 之前对键进行排序。

$ difft <(jq --sort-keys < file_1.json) <(jq --sort-keys < file_2.json)

请参阅手册中的 复杂情况:无序数据类型

我能否使用 difftastic 来检查语法变化而不进行差异比较?

是的。Difftastic 可以检查两个文件是否具有相同的抽象语法树(AST),而不进行差异比较。这比正常比较要快得多,并且对于构建检查变化的工具非常有用。

例如

$ difft --check-only --exit-code before.js after.js

如果文件没有语法变化,则将退出代码设置为 0,如果发现变化,则设置为 1。

为什么我的终端中没有颜色显示?

Difftastic 默认使用 ANSI 亮色,但某些终端主题将亮色显示为灰色。Solarized 是一个流行的主题,它会这样做。

如果您是Solarized用户,可以使用以下命令禁用亮色:export DFT_BACKGROUND=light,或者尝试不同的终端颜色方案。

它是如何工作的?

Difftastic将结构化差异处理为图问题,并使用Dijkstra算法。

我的博客文章描述了设计,手册中也有一个内部部分

翻译

许可证

Difftastic在MIT许可证下是开源的,有关更多详细信息,请参阅LICENSE。

此存储库还包括vendored_parsers/目录中其他作者编写的tree-sitter解析器。这些解析器包括MIT许可证和Apache许可证。有关更多详细信息,请参阅vendored_parsers/*/LICENSE

sample_files/中的文件也受MIT许可证的约束,除非在它们的标题中有其他说明。

依赖关系

约16-30MB
约414K SLoC