1

I'd like to use wdiff to compare the contents of the current buffer to a previous version of the file the buffer is visiting. So, this would be a word-level live diff of the current buffer against a given git commit. The shell version of this would look like this:

 wdiff -w "[[delete:" -x "]]" -y "[[insert:"  -z "]]" <(git show "9409c06d816b7c677a4b07b80b76a54d65014257:FILENAME") FILENAME

I'd like to replace the second "FILENAME" with something that pipes the contents of hte current buffer to a shell. Is this possible? The code I am currently stealing from (John Kitchin's scimax package) uses shell-command-to-string but that chokes on the buffer string when it contains quotes & special characters.

Matt
  • 43
  • 6
  • 1
    Why not just save the buffer contents to a file and pass the file to wdiff? – izkon Oct 26 '18 at 01:53
  • I was trying to avoid that step so I could use live updating without adding an I/O bottleneck. But yes, maybe it's the most sensible solution? – Matt Oct 26 '18 at 15:12
  • Does `magit-diff-refine-hunk` help? Setting it to `'all` will show word-granularity differences – Felipe Lema Oct 26 '18 at 17:39
  • Is I/O really going to be a bottleneck here? I'd suggest testing out the simplest solution first to see if works for you. If it's too slow, then explore more creative options. – izkon Oct 27 '18 at 05:48

1 Answers1

0

It looks like you can use echo and argument quoting with the subshell method:

(shell-command-to-string
 (format "wdiff -w \"[[delete:\" -x \"]]\" -y \"[[insert:\"  -z \"]]\" <(git show efc4752:2018-10-27.org) <(echo \"%s\")"
     (with-current-buffer
         (find-file-noselect "2018-10-27.org")
       (shell-quote-argument
        (buffer-substring-no-properties (point-min) (point-max))))))

This worked for me on a buffer containing quotes and & in it.

John Kitchin
  • 11,555
  • 1
  • 19
  • 41