我在vimscript
编写一个函数,需要保存以当前工作目录开头的所有已更改的列表缓冲区。如果可能,此操作需要在后台进行,而不更改当前活动缓冲区或光标位置。
function! SaveChangedBuffers()
for buf in getbufinfo({'buflisted':1})
if but.changed && buf.name =~ getcwd()
echo buf.name
"write buf.name <-- how to do this correctly?
endif
endfor
endfunction
我无法在vimscript
中找到实际保存缓冲区的函数。我知道我可以为:write
提供文件名或使用其他一些选项。但是我想确保我实际上以&#34; vim本地方式编写所有缓冲区&#34;所以我不会覆盖或破坏任何其他操作或文件。
什么是&#34; vim native&#34;从vimscript
?
答案 0 :(得分:3)
看起来我能够通过以下方式实现我的既定目标:
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
代表&#34;写入已更改&#34;):
command! Wc execute SaveChangedBuffers()