【问题标题】:How can I get and patch diffs in ace-editor?如何在 ace-editor 中获取和修补差异?
【发布时间】:2014-08-01 15:05:07
【问题描述】:

我听说 Ace 提供了获取和修补差异的功能,但我搜索了 Ace 的文档,尝试了谷歌搜索但找不到如何做到这一点。

Ace 是否提供功能来创建和修补正在编辑的文档的差异?

根据我的研究,我认为这样做的方法是使用 google-diff-match-patch 库 (https://code.google.com/p/google-diff-match-patch/)。但我更喜欢使用 Ace 的内置机制,如果它有的话。

【问题讨论】:

    标签: diff ace-editor


    【解决方案1】:

    我们正在处理的项目正是需要这个选项,所以我为它创建了一个库:http://ace-diff.github.io/ace-diff/ - 它建立在 google-diff-match-patch 之上,正如“用户”所说的那样.

    该站点包含一些演示,代码+文档在github上。希望这会有所帮助!

    【讨论】:

    • 是否可以让您创建的这个 ace-diff 在 ace 的独立(无节点)安装上运行?
    【解决方案2】:

    No Ace 不提供修补差异的功能。你需要使用diff-match-patch,

    例如,对值进行差异化,将补丁应用于 ace 文档使用

    var Range = require("ace/range").Range;
    var dmplib = require("diff_match_patch");
    
    var dmp = new dmplib.diff_match_patch();
    var diff = dmp.diff_main(oldValue, newValue, true);
    
    
    var offset = 0;
    diff.forEach(function(chunk) {
        var op = chunk[0];
        var text = chunk[1];
    
        if (op === 0) {
            offset += text.length;
        } else if (op === -1) {
            doc.remove(Range.fromPoints(
                doc.indexToPosition(offset),
                doc.indexToPosition(offset + text.length)
            ));
        } else if (op === 1) {
            doc.insert(doc.indexToPosition(offset), text);
            offset += text.length;
        }
    });
    

    【讨论】:

    • 这个indexToPosition 似乎是未定义的。知道如何或在哪里找到它吗?
    • doc 可以用editor.session.doc检索
    【解决方案3】:

    我今天需要将差异的捕获和合并添加到项目中。完整的分屏库对我的需求来说太过分了。

    以下是基于上面a_user的代码,但用简洁的es语法编写:

        import dmplib from 'diff_match_patch';
    
        export const getDiffs = (oldValue, newValue) => {
          const dmp = new dmplib.diff_match_patch();
          return dmp.diff_main(oldValue, newValue, true);
        };
    
       // Uses the output from above
        export const mergeDiffs = diffs =>
          diffs
            .filter(([op]) => op > -1)
            .map(([_, text]) => text)
            .join('');
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多