3

我正在编写一个 vim 插件,我需要在其中确定所有当前正在区分的文件。那是那些diff被设置的。我一直在阅读手册,但找不到太多。

是否有可能做到这一点。

这个问题实际上与问题how-to-detect-the-position-of-window-in-vim 相关。在那个问题中,我试图获取窗口的位置,以便检测哪个差异是右边的,哪个是左边的。我得到的解决方案是使用 winnr()

只有当只有 2 个窗口(有差异的窗口)时,该解决方案才能工作。我想让它通用,这样即使在 vim 中打开了多个窗口,我也可以确定哪个在左侧,哪个在右侧。这就是我想解决的问题

  1. 获取所有列出的缓冲区的列表
  2. 对于每个缓冲区,确定是否diff适用1于该缓冲区
  3. 如果diff用于1获取bufwinnr()它的窗口号。
  4. 从窗口编号确定哪个是左边的,哪个是右边的。左边的窗口号会更小
  5. 然后使用当前缓冲区的 winnr 确定当前缓冲区(在其中alt-left按下 `alt-right`)是左还是右。

现在缺少的部分是 1 和 2。对于 1 ls 可以使用,但我需要解析它的输出。是否有一种直接的方法来获取所有列出的缓冲区的列表。然后有没有办法检查该缓冲区diff是否为 1。

任何有关更简单解决方案的建议也值得赞赏。

4

1 回答 1

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

UPD:另一种解决方案

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
于 2010-03-21T09:42:40.263 回答