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?
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.Respostas:
Não acho que exista uma solução Elisp para isso. Mas se você observar como eu implementei
smerge-refine-subst
(também useidiff-refine-hunk
), isso deve lhe dar uma idéia de como você pode brincardiff
.IOW, você poderá executar um único
diff
processo para manipular todas as suas linhas de uma só vez, concatenando-as e adicionando "linhas de sincronização" no meio. Além disso, para evitardiff
confusõ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.fonte
diff-refine-hunk
? Eu poderia criar um arquivo diff falso com cada par e depois chamar refine-hunk em cada um.smerge-refine-subst
(que é o que é usado internamente pordiff-refine-hunk
. Mas isso executa umdiff
processo, por isso, se você quiser executar uma única diferença para todos os pares, precisará massagear sua entrada manualmente.