如何在vimscript中保存所有缓冲区?

时间:2018-05-18 18:42:59

标签: vim

我在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

写入缓冲区列表到磁盘的方法

1 个答案:

答案 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()