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 在 解析器实现
2,006 次每月下载
用于 2 crates
491MB
15M SLoC
Difftastic 是一个结构化差异工具,它根据文件的语法来比较文件。
基本示例
在这个 JavaScript 示例中,我们可以看到
(1) Difftastic 理解嵌套。它突出显示匹配的 {
和 }
,但理解尽管有前导空白,foo()
没有改变。
(2) Difftastic 理解哪些行应该对齐。它将左边的 bar(1)
与右边的 bar(2)
对齐,尽管文本内容并不相同。
(3) Difftastic 理解换行没有意义。 "eric"
现在在新的行上,但它没有改变。
一分钟演示
这个一分钟的屏幕录像展示了使用独立文件和 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