Похоже, я смог достичь поставленной цели с помощью следующего:
function! SaveChangedBuffers()
set lazyredraw
let cur_buffer = bufnr('%')
for buf in getbufinfo({'buflisted':1})
if buf.changed && buf.name =~ getcwd()
execute 'buffer' . buf.bufnr
update
" echo buf.name
endif
endfor
execute 'buffer' . cur_buffer
set nolazyredraw
endfunction
lazyredraw
отключает изменения экрана во время работы скрипта.На медленных терминальных соединениях это может даже не понадобиться.Затем я запоминаю текущий буфер с bufnr('%')
и восстанавливаю его в конце скрипта из переменной.
Цикл просто изменяется на каждый буфер, который соответствует критериям и выполняет :update
(который также может быть :write
, потому что я знаю, что мой буфер был изменен).
И для завершения полного опыта vim можно сопоставить его с командой Ex (Wc
означает «запись изменена»):
command! Wc execute SaveChangedBuffers()