【问题标题】:How to diff 2 notebooks at the source level?如何在源代码级别区分 2 个笔记本?
【发布时间】:2011-06-30 00:29:12
【问题描述】:

有人知道在源代码级别找到两个笔记本之间差异的工具吗?

工作台 2 中的比较笔记本工具似乎在内部数据结构级别上工作,这对我没有用处。我正在寻找在源代码级别查看差异的工具(查看笔记本时看到的内容,即不是 FullForm)。

我在 Windows 上使用 Mathematica V8。

编辑1:

如何以更易读的形式显示 NotebookDiff 的输出/报告?

【问题讨论】:

  • “源代码级别”是指原始文本级别吗?如果是这样,那么您可以使用普通的差异工具,前提是您已关闭 FileOutlineCacheTrackCellChangeTimes,它们会产生太多噪音。还有一些脚本会在差异之前删除这些东西(不修改笔记本)。请参阅 Version control of Mathematica notebooksaccepted answer 中的 cmets。
  • 我的意思是我在屏幕上看到的源代码。正常的源代码。不是原始文本或 FullForm 或任何其他内容。我试图找出笔记本的 2 个版本之间进行了哪些代码更改。在 Mathematica 中如何做到这一点? Workbench 比较笔记本会查看难以阅读的原始数据。
  • 糟糕,我应该仔细阅读。你只是在“你所看到的”这一个模糊的概念和不同的鱼锅有什么不同。也许你应该试试旧的AuthorTools 包中的NotebookDiff
  • 顺便说一句,我已经使用 Git 对笔记本进行版本控制(包括经常检查差异),遵循我第一条评论中链接中的所有提示,它对我来说效果很好。
  • AuthorTools 不再出售。我查看了您那里的链接,按照指向 perl 脚本的链接,但它导致现在我害怕。谢谢

标签: wolfram-mathematica


【解决方案1】:

此答案基于 cmets 对此问题其他部分的讨论。 如果要定期使用它,它也可以(并且应该)自动化。 这可以通过标记您要比较的单元格并使用NotebookFind 来查找要提取和比较的单元格来完成。


比较单个大代码单元格的解决方案(有时在制作demonstrations 时会发生)是从两个笔记本复制InputForm 中的代码

并将其粘贴到一个简单的差异工具中,例如Quick Diff Online 然后将为您显示标准差异:

以上代码取自one of Nasser's demonstrations


另一种选择是使用AuthorTools 包中的CellDiff

Needs["AuthorTools`"];
CellDiff[Cell["Some text.", "Text"], 
         Cell["Some different text.", "Text"]]

要在您的演示中使用,您可以通过右键单击单元方括号来复制两个版本中的单元格表达式:

【讨论】:

    【解决方案2】:

    内置插件($InstallationDirectory/AddOns/Applications)中有一个未记录的包,名为AuthorTools。加载后,它会公开一个NotebookDiff 函数,该函数提供一些基本的差异功能:

    Needs["AuthorTools`"];
    
    nb1 = NotebookPut[
      Notebook[{Cell["Subsection heading", "Subsection"], 
        Cell["Some text.", "Text"]}]];
    
    nb2 = NotebookPut[
      Notebook[{Cell["Edited Subsection heading", "Subsection"], 
        Cell["Some different text.", "Text"]}]];
    
    NotebookPut@NotebookDiff[nb1, nb2]
    

    由于此软件包未记录在案,请注意它可能存在错误并且不被视为受支持的功能,但希望您仍然觉得它有用。

    请注意,您还可以通过以下方式获取笔记本的句柄:

    nb1 = NotebookOpen["path/to/a/notebook.nb"]
    

    以及当前在前端打开的笔记本列表

    Notebooks[]
    

    【讨论】:

    • 我试过你上面显示的方法。我需要做什么才能以某种可读的形式读取结果?请在我的编辑 1 中查看屏幕截图。
    • @Nasser:用NotebookPut 包装对NotebookDiff 的调用。
    • 谢谢布雷特。我现在看到了。但是结果根本没有用。我有 2 个不同版本的笔记本,所有代码都包含在一个单元格中(这是一个演示,所以操作代码必须在一个单元格中)。当我收到报告并单击单元格的“查看差异”时,它所做的就是并排显示每个笔记本中那个大单元格的代码,但没有指示差异在哪里!没有红线或其他差异工具中的其他指示来告诉我差异在哪里,即使我可以看到一些差异。这只是说细胞不同。但不是在哪里!
    • @Nasser:如果一切都在一个单元格中(这对于演示来说不是必需的),那么纯文本差异就足够了。你甚至可以使用online one。当然,您需要将您的大 Manipulate 复制为 InputText - 但这没什么大不了的。
    • @Simon,感谢您提供指向差异网页的链接。我试过了,它确实按我的意愿工作。我从两个笔记本中复制了单元格内容并将其粘贴到那里,它确实使用颜色显示了差异。我想我会从现在开始使用它。也易于使用。
    【解决方案3】:

    如果您必须使用笔记本,那么 AuthorTools 中的 NotebookDiff 可能是您最好的选择。如果这是您工作流程的重要组成部分(由于版本控制或其他限制)并且您具有一定的灵活性,您可能需要考虑将代码从现有笔记本 (.nb) 移动到包文件 (.m) 中,这将保存为纯文本。您仍然可以在 Mathematica 笔记本前端打开和编辑包文件,但您可以获得额外的好处,即能够使用现有的文本比较工具对它们进行比较。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-24
      • 1970-01-01
      • 2021-02-17
      • 2021-12-31
      • 2020-08-22
      • 1970-01-01
      相关资源
      最近更新 更多