如何在vim中获取当前正在进行比较的文件列表

3
我正在编写一个vim插件,需要确定当前正在进行diff的所有文件。也就是那些设置了diff的文件。我一直在查阅手册,但没有找到太多信息。
请问这个有可能实现吗?
这个问题实际上与如何检测vim窗口位置相关。在那个问题中,我试图获取窗口位置,以便检测哪一个是右边的diff,哪一个是左边的diff。我得到的解决方案是使用winnr()。
该解决方案仅适用于只有两个窗口(正在进行diff的窗口)。我想让它通用,即使在vim中打开了多个窗口,也可以确定哪个是左边的,哪个是右边的。
这是我考虑解决问题的方式:
1. 获取所有列出的缓冲区列表 2. 对于每个缓冲区,确定是否为其设置了diff 3. 如果为该缓冲区设置了diff,则使用bufwinnr()获取其窗口号。 4. 从窗口号确定哪个是左边的,哪个是右边的。左边的窗口号较小。 5. 然后使用当前缓冲区的winnr确定当前缓冲区(按下alt-left`alt-right`)是左边还是右边。
现在缺少的是1和2。对于1,可以使用ls,但我需要解析其输出。有没有一种简单的方法来获取所有列出的缓冲区列表?然后有没有一种方法来检查该缓冲区是否设置了diff
也欢迎提供更简单的解决方案的建议。
1个回答

3
  1. 0bufnr('$')循环遍历所有可能的缓冲区编号,并使用bufexists(nr)检查该缓冲区是否存在。
  2. 使用let curbuf=bufnr('%')保存当前缓冲区编号。
  3. 对于每个现有的缓冲区,执行execute "buffer ".bufnumber并检查&diff变量。记住两个数字,但不要检查bufwinnr()
  4. 执行execute "buffer ".curbuf
  5. 最后为步骤3中找到的两个数字调用bufwinnr(nr)

更新:另一种解决方案

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接