Diferenças leves (elisp puro)?

7

Preciso exibir diferenças de palavras de várias seqüências de caracteres pequenas.

Ou seja, eu tenho uma lista de pares semelhante à seguinte:

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

Em cada caso, eu gostaria de destacar o texto alterado ou adicionado. Eu posso fazer isso com muitas chamadas para o comando diff, mas tenho medo do custo.

Existem bibliotecas elisp que eu poderia usar para esse fim?

Clemente
fonte
Você já tentou chamar o comando diff compilado? O custo pode ser menor que a velocidade que você perderia ao passar do código c compilado para o elisp.
Tyler
@ Tyler, não tenho, já que não tenho nada para comparar o custo.
Clément
2
Bem, não, mas se ele sair que já é rápido o suficiente, você não precisa compará-lo com qualquer outra coisa
Tyler
Talvez custo não fosse a palavra certa; além do desempenho, estou interessado em outros aspectos: uma solução lisp seria mais robusta (os usuários do Windows não necessariamente possuem diff instalado, por exemplo) e provavelmente mais fácil de manter. O diff AFAIK requer arquivos, então eu teria que escrever dois arquivos para cada par. São 200 ciclos de leitura e escrita para uma lista de 100 pares para comparar; a menos que eu não tenha outras opções, eu realmente não quero fazer isso.
Clément
O front-end wdiff para diff fará isso, sem exigir que você escreva explicitamente qualquer arquivo: wdiff <(echo "abc def ghi" ) <(echo "abc ghi")=> abc [-def-] ghi. Mas isso depende da instalação do wdiff e diffutils, o que não ajudará se você estiver criando algo para uso geral no Windows, então acho que você precisa de uma solução elisp.
Tyler

Respostas:

3

Não acho que exista uma solução Elisp para isso. Mas se você observar como eu implementei smerge-refine-subst(também usei diff-refine-hunk), isso deve lhe dar uma idéia de como você pode brincar diff.

IOW, você poderá executar um único diffprocesso para manipular todas as suas linhas de uma só vez, concatenando-as e adicionando "linhas de sincronização" no meio. Além disso, para evitar diffconfusões quando as linhas de um par coincidirem com as linhas de outro par, você provavelmente desejará acrescentar um texto (exclusivo para cada par) na frente de cada linha.

Stefan
fonte
Obrigado Stefan! O contexto está diferindo dois objetivos de Coq no PG. Eu me pergunto se eu poderia simplesmente reutilizar diff-refine-hunk? Eu poderia criar um arquivo diff falso com cada par e depois chamar refine-hunk em cada um.
Clément
Melhor usde smerge-refine-subst(que é o que é usado internamente por diff-refine-hunk. Mas isso executa um diffprocesso, por isso, se você quiser executar uma única diferença para todos os pares, precisará massagear sua entrada manualmente.
Stefan