Question

I am writing a vim plugin in which i need to determine all those files which are currently being diffed. That is the ones for which diff is set. I have been going through the manual but could not find much.

Is it possible to do this.

This question is actually related to question how-to-detect-the-position-of-window-in-vim. In that question i was trying to get the position of window, so as to detect which one of the diffs is the right one and which is left one. The solution i got was to use winnr()

That solution can work only if there are only 2 windows(the ones being diffed). I want to make it generic so that even if multiple windows are open in vim, i can determine which one is on left and which one is right. This is what i was thinking to solve the problem

  1. Get a list of all listed buffers
  2. For each of this buffers determine if diff is 1 for that
  3. If diff is 1 use bufwinnr() to gets it window number.
  4. From the window numbers determine which one is left and which one is right. left one will have smaller window number
  5. And then determine if current buffer(in which alt-left`alt-right` is pressed) is left or right using winnr of current buffer.

Now the pieces that are missing are 1 and 2. For 1 ls can be used but i need to parse its output. Is there a straightfwd way to get list of all listed buffers. And then is there a way to check if for that buffer diff is 1 or not.

Any suggestions for a simpler solution are also appreciated.

Was it helpful?

Solution

  1. Cycle through all possible buffer numbers from 0 to bufnr('$') and check, whether this buffer exists using bufexists(nr).
  2. Save current buffer number using let curbuf=bufnr('%').
  3. For each existing buffer do execute "buffer ".bufnumber and check &diff variable. Remember two numbers, but do not check bufwinnr().
  4. Do execute "buffer ".curbuf.
  5. Finally call bufwinnr(nr) for two numbers found in step 3.

UPD: another solution

let g:wlist={"0": [], "1":[]}
windo call add(g:wlist[&diff], bufnr('%'))
let g:diffbuffers=g:wlist.1
" here you have list of buffers with &diff option set in g:diffbuffers
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top