Sometimes I switch Git branches without closing VIM buffers for files that are unique to the current branch. Those buffers will be hidden, and I'll open new buffers in splits and start making changes for the new branch. Rather than :w
individually on those new buffers, I'd like to :wa
, but that writes to all buffers, including the old ones that are now hidden.
This is frustrating because it writes those old buffers to new files since they don't exist, dirtying my branch.
How do I :wa
, but only for the non-hidden buffers that are actively open in my splits?
Since the buffers you want to write are all displayed in windows you can:
:windo w
or the slightly smarter:
:windo update
See :help :windo
and :help :update
.
There is no native command to do that, but creating your own
is not very difficult. Buffers have attributes, and you are
looking for the ones considered active, which have the
hidden
flag set to false.
You can get a list of buffers with getbufinfo()
. This
functions returns an array of dictionaries containing buffer
information. Then it is a matter of iterating over these
entries and if it does not represent a hidden buffer,
perform the write (or :update
).
As far as I know there is no native way to perform a command in a different buffer without switching to it. We are thus forced to switch to a different buffer to perform a command. This would mess up your current buffer, but can be solved by saving it before looping and restoring later.
The following function does that, and the accompanying
custom command :Wa
just calls it.
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()
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With