Leichte (reine Elisp) Unterschiede?

7

Ich muss Wortunterschiede einiger kleiner Zeichenfolgen anzeigen.

Das heißt, ich habe eine Liste von Paaren ähnlich der folgenden:

"aaa bbb ccc" . "aaa vv ccc"
"abcd ef ghkl" . "ghkl"
"a (u -> h)" . "(a -> g) (u -> h)"

In jedem Fall möchte ich geänderten oder hinzugefügten Text hervorheben. Ich kann dies mit vielen Aufrufen des Befehls diff tun, habe aber Angst vor den Kosten.

Gibt es Elisp-Bibliotheken, die ich für diesen Zweck verwenden könnte?

Clément
quelle
Haben Sie tatsächlich versucht, den kompilierten diff-Befehl aufzurufen? Die Kosten sind möglicherweise geringer als die Geschwindigkeit, die Sie beim Übergang von kompiliertem C-Code zu Elisp verlieren würden.
Tyler
@ Tyler habe ich nicht, da ich nichts habe, mit dem ich die Kosten vergleichen könnte.
Clément
2
Nun nein, aber wenn sich herausstellt, dass es bereits schnell genug ist, müssen Sie es mit nichts anderem vergleichen
Tyler
Vielleicht waren die Kosten nicht das richtige Wort. Neben der Leistung interessieren mich auch andere Aspekte: Eine Lisp-Lösung wäre robuster (Windows-Benutzer müssen beispielsweise nicht unbedingt diff installiert haben) und wahrscheinlich einfacher zu warten. AFAIK diff erfordert Dateien, daher müsste ich für jedes Paar zwei Dateien schreiben. Das sind 200 Lese- und Schreibzyklen für eine Liste von 100 zu vergleichenden Paaren. Wenn ich keine anderen Optionen habe, möchte ich das nicht wirklich tun.
Clément
Das wdiff-Frontend zu diff erledigt dies, ohne dass Sie explizit Dateien schreiben müssen: wdiff <(echo "abc def ghi" ) <(echo "abc ghi")=> abc [-def-] ghi. Dies hängt jedoch davon ab, ob wdiff und diffutils installiert sind. Dies hilft nicht, wenn Sie etwas für den allgemeinen Gebrauch unter Windows erstellen. Ich denke, Sie benötigen eine elisp-Lösung.
Tyler

Antworten:

3

Ich glaube nicht, dass es dafür eine Elisp-Lösung gibt. Aber wenn Sie sich ansehen, wie ich implementiert habe smerge-refine-subst(auch in verwendet diff-refine-hunk), sollte es Ihnen eine Vorstellung davon geben, wie Sie damit spielen können diff.

IOW Sie sollten in der Lage sein, einen einzelnen diffProzess auszuführen , um alle Ihre Zeilen gleichzeitig zu verarbeiten, indem Sie sie verketten und dazwischen "Synchronisationszeilen" hinzufügen. Um zu vermeiden diff, dass Zeilen eines Paares mit Zeilen eines anderen Paares übereinstimmen, sollten Sie wahrscheinlich vor jeder Zeile einen Text (der für jedes Paar eindeutig ist) voranstellen.

Stefan
quelle
Danke Stefan! Der Kontext unterscheidet zwei Coq-Ziele in PG. Ich frage mich, ob ich einfach wiederverwenden könnte diff-refine-hunk? Ich könnte mit jedem Paar eine gefälschte Diff-Datei erstellen und dann bei jedem Paar refine-hunk aufrufen.
Clément
Besser usde smerge-refine-subst(was intern verwendet wird diff-refine-hunk. Aber das führt einen diffProzess aus. Wenn Sie also einen einzelnen Diff für alle Paare ausführen möchten, müssen Sie Ihre Eingabe von Hand massieren.
Stefan