I am trying to find (in Vim script) if the 2 files open using vimdiff are same or different? Is there a way to do that? (a variable like &diff perhaps?)
2 Answers
The easiest option is not to make vim do any work at all: diff -q
reports if files are different, and diff -s
if they are the same. According to this answer if you don’t need output, cmp -s
works.
So in vimscript you might do
let l:files = [ get_file_names() ] " left as an exercise
call system('cmp -s ' . join(l:files, ' '))
" do something with v:shell_error
-
Thanks for the reply. I am looking for any sort of native solution. Don't want to depend on external programs for better portability. If nothing comes up, will use this :) Mar 29, 2019 at 13:04
-
1@AnkitJain, I think you should depend on external dependencies in this case, because vimdiff is supposed to be used for resolving merge conflicts and such, not calculation stuff. I skimmed through the help docs for vimdiff, and found nothing related to what you want. As I said, it is supposed to be interactive. But if you have constraints to fulfill, then you should be able to build up a vimscript function that ultimately checks itself if contents of two files are same or not. But I doubt you can do it with
vimdiff
itself.– 3N4NMar 29, 2019 at 13:46 -
@klaus you may be able to use the fact that vimdiff folds sections of the file that are the same, but as I learned creating auto-origami this kind of fold detection is hard– D. Ben Knoble ♦Mar 29, 2019 at 13:50
-
1
-
1@klaus I guess I will accept this answer since there is nothing that can be done by Vim itself. Mar 29, 2019 at 15:17
Okay, this is a very hacky approach. You really should check the result of diff
using e.g. a custom diffexpr
. But you asked for it, so here we go:
let a=win_getid()|exe "windo let g:diff=(get(g:, 'diff', 1) && foldclosed(1) && foldclosedend(1)==line('$'))"|if g:diff |echomsg 'no differences found' |else |echomsg 'there are some differences!' |endif|call win_gotoid(a)
(one line).
This assumes, that all windows are in diff mode and basically checks, whether each window contains only a single folded line.
-
As you said this is a hacky. Let me check it out nonetheless and see if this can work. Thank you. Mar 29, 2019 at 15:19
-
1