自动命令执行只有一次后,许多文件保存(: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