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

如何在vimscript中保存所有缓冲区?,vim,Vim,我正在vimscript中编写一个函数,该函数需要保存从当前工作目录开始的所有已更改、列出的缓冲区。此操作需要在后台进行,如果可能,无需更改当前活动缓冲区或光标位置 function! SaveChangedBuffers() for buf in getbufinfo({'buflisted':1}) if but.changed && buf.name =~ getcwd() echo buf.name "

我正在
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
函数!SaveChangedBuffers()
对于getbufinfo中的buf({'buflisted':1})
如果but.changed&&buf.name=~getcwd()
回音buf.name

“write buf.name看起来我能够通过以下方式实现我的既定目标:

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
代表“写更改”):


我知道这不是您要求的,但是
:wall
对您来说是否足够好?如果不行,我想您必须保存当前的缓冲区编号,请执行
:bufdo
保存,然后恢复buffer@PeterRincker我已经看过了。
:wall
保存所有文件,我只想将保存操作限制为在项目文件夹中。我随机打开各种文件,不想意外地更改和写入它们。
:bufdo
可以工作,但我必须返回到原始缓冲区(如果打开了150个文件,这会很麻烦).也许我应该在脚本中记住我当前的缓冲区,然后在
:bufdo
之后返回到它。。。
command! Wc execute SaveChangedBuffers()