Necesito la diferencia de dos amortiguadores. Una forma sería crear archivos temporales que contengan el contenido de estos búferes y usar la diff
función. Sin embargo, los buffers contienen información confidencial y preferiría no tener esa información en texto claro en el disco.
Pensé en usar ediff, que puede comparar buffers directamente, pero ediff inicia una sesión interactiva y quiero usar esto en un script.
ediff-buffers
muy breve, parece guardar buffers en archivos temporales en el disco, luego llamar a la utilidad diff del sistema en esos archivos, por lo que no habría ninguna diferencia práctica de llamarse adiff
sí mismo.Respuestas:
@tmalsburg, el siguiente comando llama a diff en 2 buffers sin la creación de archivos temporales. Utiliza tuberías con nombre como sugirió anteriormente:
Cuando se llama desde Lisp, devuelve el código de salida del programa diff; es decir, 0 si los búferes tienen el mismo contenido, 1 de lo contrario.
Probado para Emacs versión 24.3 en una máquina que ejecuta Debian GNU / Linux 9.0 (stretch).
El código anterior parece funcionar cuando se llama desde Lisp. Desafortunadamente, la mayoría de las veces muestra una diferencia truncada en las llamadas interactivas.
La siguiente versión usa la biblioteca asíncrona de terceros ; no trunca las diferencias.
fuente
AFAIU Emacs toma programas externos para hacer la diferencia. Por ejemplo
ediff-make-diff2-buffer
, que compararía dos buffers, internamente llamaDonde
ediff-diff-program
podría representar el GNU / Linuxdiff
. Con la nueva FFI, el sistemadiff
podría ser accesible. También una implementación diferencial de Emacs Lisp podría hacer el trabajo.fuente
¿Qué tal si usas el comando shell para llamar a diff, pasándole un buffer de salida? O, shell-command-to-string para obtener el diff en una cadena
fuente
Si está de acuerdo con Ediff, esto hará:
y llámalo así:
fuente
(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))