Предполагая, что вы можете записать буфер, вы можете сделать что-то вроде
:let @a=system('diff ' . shellescape(expand('%')) . ' ' . shellescape(expand('%')) . '~')
например сравните buffer.txt с buffer.txt ~ и поместите результат в регистр a
В противном случае попробуйте
:let @a=""
:redir @A
:%w !diff - "%~"
:redir END
В моем предварительном тесте это, похоже, не работает на Win32 GVIM. Возможно, вам придется пройти через временный файл, чтобы это работало
Я понимаю, что все это похоже на то, что вы пробовали. Надеюсь, в любом случае это поможет, возможно, подтвердит ваши мысли