自动命令执行只有一次后,许多文件保存(:WA)

我已经在我的插件自动命令的BufWritePost里。 (我更新标签在此自动命令,这是插件Indexer.tar.gz整个项目)自动命令执行只有一次后,许多文件保存(:WA)

有时候我需要保存多个文件(我愿意“:WA”)。当然,我的autocmd被称为每个文件。

我想使它打电话只是毕竟filesaves。比方说,如果我有20个未保存的缓冲区,我这样做:wa,并且在最后一个缓冲区被保存后,我的autocmd被调用一次。 有什么办法可以做到吗?

其实这个插件是足够聪明,它开始在CTAGS背景如果有可能,但无论如何,这是一个有点讨厌。没有自动命令

回答:

方式一:

function! MyFunction() 

"" Save all buffers.

bufdo wa

"" Run your command once.

... your command ...

endfunction

nnoremap ,wa :call MyFunction()<CR>

,wa在正常模式(无需冒号)和所有的缓冲区将被保存,以后它会运行命令。

编辑:修改函数返回前一个缓冲区,因为bufdo改变它:

function! MyFunction() 

"" Save number of current buffer.

let l:current_buffer = bufnr("%")

"" Save all buffers.

bufdo wa

"" Bufdo probably changed the buffer, so return to where we were before running previous command.

execute "buffer " . l:current_buffer

"" Run your command once.

... your command ...

endfunction

回答:

有此CursorHold事件,即触发“当用户没有按下的一个关键时间由'updatetime'指定“(默认为4秒)。保存文件后,该事件将在触发updatetime毫秒后触发,除非用户继续输入。 A BufWrite自动命令可以暂时使此settimg非常低,比如说50ms,并为CursorHold添加一个自动禁用自动命令。 BufWrite自动命令可以检查它是否已经配置了CursorHold处理程序,以避免多次添加它。

为了让它有点灵活,我使这个构造触发器自定义()事件:当检测到第一次保存时,然后针对“保存批处理”中的每个文件,最后触发超时。这样我的其他脚本就可以独立处理任何这些事件。

实现:

function! s:WriteTimeoutSchedule() 

if !exists("#WriteTimeout#CursorHold")

let s:oldUpdateTime = &ut

set updatetime=50

augroup WriteTimeout

au CursorHold * call s:WriteTimeoutFire()

augroup END

do User WriteTimeoutPre

endif

do User WriteTimeoutEach

endfunction

function! s:WriteTimeoutFire()

do User WriteTimeoutPost

au! WriteTimeout

let &ut=s:oldUpdateTime

endfunction

aug WriteTimeoutSupport

au!

au BufWrite * call s:WriteTimeoutSchedule()

aug END

用例:toucher.vim。

以上是 自动命令执行只有一次后,许多文件保存(:WA) 的全部内容, 来源链接: utcz.com/qa/260969.html

回到顶部