Ich brauche den Unterschied von zwei Puffern. Eine Möglichkeit wäre, temporäre Dateien zu erstellen, die den Inhalt dieser Puffer enthalten, und die diff
Funktion zu verwenden. Die Puffer enthalten jedoch vertrauliche Informationen, und ich würde es vorziehen, diese Informationen nicht im Klartext auf der Festplatte zu haben.
Ich habe über die Verwendung von ediff nachgedacht, mit dem Puffer direkt verglichen werden können, aber ediff startet eine interaktive Sitzung und möchte diese in einem Skript verwenden.
ediff-buffers
ganz kurz betrachten, werden anscheinend Puffer in temporären Dateien auf der Festplatte gespeichert und anschließend das Systemdiff-Dienstprogramm für diese Dateien aufgerufen, sodass es keinen praktischen Unterschied gibt, sichdiff
selbst aufzurufen .Antworten:
@tmalsburg, Folgende Befehlsaufrufe unterscheiden sich in 2 Puffern ohne die Erstellung temporärer Dateien. Es werden Named Pipes verwendet, wie Sie oben vorgeschlagen haben:
Beim Aufruf von Lisp wird der Exit-Code des diff-Programms zurückgegeben. Das heißt, 0, wenn die Puffer denselben Inhalt haben, andernfalls 1.
Getestet für Emacs Version 24.3 auf einem Computer mit Debian GNU / Linux 9.0 (Stretch).
Der obige Code scheint zu funktionieren, wenn er von Lisp aufgerufen wird. Leider zeigt sich bei interaktiven Anrufen meistens ein abgeschnittener Unterschied.
In der folgenden Version wird die asynchrone Bibliothek eines Drittanbieters verwendet . Die Unterschiede werden nicht abgeschnitten.
quelle
AFAIU Emacs benötigt externe Programme, um den Diff zu machen. Zum Beispiel
ediff-make-diff2-buffer
, die zwei Puffer vergleichen würde, ruft intern aufWo
ediff-diff-program
könnte die GNU / Linux darstellendiff
. Mit dem neuen FFI ist das Systemdiff
möglicherweise zugänglich. Auch eine Emacs Lisp Diff-Implementierung könnte den Job erledigen.quelle
Wie wäre es, wenn Sie den Befehl shell verwenden, um diff aufzurufen und ihm einen Ausgabepuffer zu übergeben? Oder Shell-Befehl-zu-Zeichenfolge, um den Unterschied in einer Zeichenfolge zu erhalten
quelle
Wenn Sie mit Ediff einverstanden sind, reicht dies aus:
und nenne es so:
quelle
(defun my/diff-buffers (buffer-A buffer-B) "Run Ediff on a pair of buffers, BUFFER-A and BUFFER-B." (interactive (list (read-buffer "buffer1: " (current-buffer)) (read-buffer "buffer2: " (current-buffer)))) (ediff-buffers-internal buffer-A buffer-B nil nil 'ediff-buffers))