軽量(純粋なelisp)diff?


7

多数の小さな文字列の単語差分を表示する必要があります。

つまり、次のようなペアのリストがあります。

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

どちらの場合も、変更または追加されたテキストを強調表示します。diffコマンドを何度も呼び出すことでこれを行うことができますが、そのコストを恐れています。

この目的に使用できるelispライブラリはありますか?


コンパイルされたdiffコマンドを実際に呼び出してみましたか?コストは、コンパイル済みのcコードからelispに移行するときに失う速度よりも低い場合があります。
Tyler

@タイラー私はコストを比較するものがないので、持っていません。
クレメント2016年

2
いいえ、でも、それがすでに十分に速いことが判明した場合は、それを他のものと比較する必要はありません
タイラー

コストは正しい言葉ではなかったかもしれません。パフォーマンスを超えて、私は他の側面に興味があります。lispソリューションはより堅牢で(たとえば、Windowsユーザーは必ずしもdiffがインストールされている必要はありません)、おそらくメンテナンスがより簡単です。AFAIK diffにはファイルが必要なので、各ペアに2つのファイルを書き込む必要があります。これは、100ペアのリストを比較するための読み取りと書き込みの200サイクルです。他に選択肢がない限り、本当にそうしたくありません。
クレメント2016年

diffへのwdiffフロントエンドはこれを行います。ファイルを明示的に書き込む必要はありません:wdiff <(echo "abc def ghi" ) <(echo "abc ghi")=> abc [-def-] ghi。しかし、それはwdiffとdiffutilsがインストールされているかどうかに依存します。これは、Windowsで一般的な使用のために何かを構築する場合には役に立ちません。そのため、elispソリューションが必要だと思います。
Tyler

回答:


3

そのための既存のElispソリューションはないと思います。しかし、私がどのように実装したかsmerge-refine-subst(これもで使用されていますdiff-refine-hunk)を見ると、いかにして遊ぶことができるかがわかるはずですdiff

IOWでは、単一のdiffプロセスを実行して、すべての行を連結し、その間に「同期行」を追加することで、一度にすべての行を処理できるはずです。また、diff1つのペアの行が別のペアの行と一致するときに混乱しないように、すべての行の前にテキスト(各ペアに固有)を追加することもできます。


ステファンありがとう!コンテキストは、PGの2つのCoq目標を比較しています。単純に再利用できるdiff-refine-hunkかな?私は各ペアで偽のdiffファイルを作成し、それぞれにrefine-hunkを呼び出すことができました。
クレメント2016

より良いUSDE smerge-refine-substによって内部的に使用されているものである(diff-refine-hunkしかし、その実行1つの。diffプロセス、あなたはすべてのペアのための単一の差分を実行したい場合ので、あなたが手で、あなたの入力をマッサージする必要があります。
ステファン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.