在VIM中,如何写入所有非隐藏缓冲区(:wa),但只针对非隐藏缓冲区?

5
有时我会在不关闭当前VIM缓冲区的情况下切换Git分支,这些缓冲区与当前分支唯一相关。那些缓冲区将被隐藏,然后我会在新的拆分窗口中打开新的缓冲区并开始为新的分支进行更改。我想对这些新的缓冲区进行:wa操作,而不是逐个运行:w命令,但这会将所有缓冲区(包括旧的隐藏缓冲区)都写入文件。
这很令人沮丧,因为它会将旧的缓冲区写入新文件中,从而污染我的分支。
我如何仅对当前活动拆分窗口中未隐藏的缓冲区执行:wa命令?
3个回答

8

由于您想要写入的缓冲区都显示在窗口中,因此您可以:

:windo w

或者稍微聪明一些的做法:
:windo update

请查看`:help :windo`和`:help :update`。

太好了。当然我会过度设计一个解决方案,不是吗?但我不会删除它,因为这样可以让我有些东西可以笑一笑 :) 我唯一能发现的区别是 :windo 只在当前标签页上操作,所以从技术上讲并不像我手动选择的方式那样作用于所有活动缓冲区。如果使用选项卡,则可能或可能不可取。 - sidyll

3
没有原生命令可以实现这个功能,但是自己创建并不难。缓冲区有属性,你需要找到被认为是“活动”的那些,它们的hidden标志设置为false。
你可以使用getbufinfo()来获取缓冲区列表。该函数返回一个包含缓冲区信息的字典数组。然后只需遍历这些条目,并且如果它不表示隐藏缓冲区,则执行写入(或:update)。
据我所知,没有本地方法可以在不切换到另一个缓冲区的情况下执行命令。因此,我们必须切换到另一个缓冲区才能执行命令。这会破坏当前缓冲区,但可以通过在循环之前保存并稍后恢复来解决。
以下函数实现了这一点,并且附带的自定义命令:Wa只是调用它。
function! WriteActiveBuffers()
  " Save current buffer number
  let current = bufnr('%')
  for buffer in getbufinfo({'buflisted':1})
    if !buffer["hidden"]
      " Found an active buffer
      " Switch to it
      execute 'buffer' buffer["bufnr"]
      " Write if modified
      update
    endif
  endfor
  " Restore current buffer
  execute 'buffer' current
endfunction

command! Wa call WriteActiveBuffers()

0
嗯,稍微改变一下字面上的问题并考虑使用情况,我建议你只需使用:
autocmd BufEnter * setlocal bufhidden=delete

在你的 .vimrc 文件中,可能需要稍微限制一下 *,然后只需使用纯粹的 :wa 命令,因为你不再有任何隐藏的缓冲区了。:| 这样或许会起作用。


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