¿Diferencias de peso ligero (elisp puro)?

7

Necesito mostrar diferencias de palabras de varias cadenas pequeñas.

Es decir, tengo una lista de pares similar a la siguiente:

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

En cada caso, me gustaría resaltar el texto modificado o agregado. Puedo hacer esto con muchas llamadas al comando diff, pero tengo miedo del costo.

¿Hay bibliotecas elisp que podría usar para este propósito?

Clemente
fuente
¿Realmente has intentado llamar al comando diff compilado? El costo puede ser menor que la velocidad que perdería al pasar del código c compilado a elisp.
Tyler
@Tyler no lo he hecho, ya que no tengo nada con lo que comparar el costo.
Clément
2
Bueno, no, pero si resulta que ya es lo suficientemente rápido, no necesitas compararlo con nada más
Tyler el
Tal vez el costo no era la palabra correcta; más allá del rendimiento, me interesan otros aspectos: una solución lisp sería más robusta (los usuarios de Windows no necesariamente tienen diff instalado, por ejemplo) y probablemente sea más fácil de mantener. AFAIK diff requiere archivos, por lo que tendría que escribir dos archivos para cada par. Son 200 ciclos de lectura y escritura para una lista de 100 pares para comparar; a menos que no tenga otras opciones, realmente no quiero estar haciendo eso.
Clément
El front-end de wdiff para diff hará esto, sin requerir que escriba explícitamente ningún archivo: wdiff <(echo "abc def ghi" ) <(echo "abc ghi")=> abc [-def-] ghi. Pero eso depende de tener instalados wdiff y diffutils, lo que no ayudará si está creando algo para uso general en Windows, por lo que supongo que necesita una solución elisp.
Tyler el

Respuestas:

3

No creo que exista una solución de Elisp para eso. Pero si miras cómo lo implementé smerge-refine-subst(también lo utilicé diff-refine-hunk), debería darte una idea de cómo puedes jugar diff.

IOW debería poder ejecutar un solo diffproceso para manejar todas sus líneas a la vez, concatenando y agregando "líneas de sincronización" en el medio. Además, para evitar diffconfundirse cuando las líneas de un par coinciden con las líneas de otro par, es probable que desee anteponer algún texto (exclusivo de cada par) delante de cada línea.

Stefan
fuente
Gracias Stefan! El contexto está diferenciando dos objetivos de Coq en PG. Me pregunto si podría simplemente reutilizar diff-refine-hunk? Podría crear un archivo diff falso con cada par, y luego llamar a refine-hunk en cada uno.
Clément
Mejor usde smerge-refine-subst(que es lo que utiliza internamente diff-refine-hunk. Pero eso ejecuta un diffproceso, por lo que si desea ejecutar un único diferencial para todos los pares, deberá masajear su entrada a mano.
Stefan