如何让函数仅在当前缓冲区首次触发JavaScript FileType事件时执行一次?
Vim 函数仅触发一次的问题解析与解决
为什么按键映射能局部生效,函数却重复触发?
你用的 nmap <buffer> 是给当前缓冲区创建局部按键映射——每个JavaScript缓冲区都会生成自己的映射,但这和「仅执行一次」是不同逻辑。而默认的 autocmd FileType javascript 会在每一个缓冲区被设置为JavaScript类型时触发,不管是第一次打开JS文件还是后续新开的,所以函数会被重复调用。
实现函数仅全局触发一次的方法
方法1:用autocmd的once修饰符
Vim的autocmd支持once选项,让命令仅触发一次,触发后自动移除该autocmd:
autocmd FileType javascript once call s:ExecuteHook('ft==javascript triggered.')
第一个JS缓冲区加载时函数执行,后续再打开JS文件不会再触发。
方法2:自定义全局变量标记状态
如果需要灵活重置触发状态,可以用全局变量记录是否已执行:
if !exists('g:javascript_hook_executed') let g:javascript_hook_executed = 0 endif autocmd FileType javascript call s:RunJSHook() function! s:RunJSHook() if g:javascript_hook_executed == 0 call s:ExecuteHook('ft==javascript triggered.') let g:javascript_hook_executed = 1 endif endfunction
之后如果想重新触发,只需把g:javascript_hook_executed设为0即可。
额外需求:每个缓冲区仅执行一次
如果是想让函数在每个JS缓冲区首次加载时执行一次(切换回缓冲区不再触发),可以用缓冲区局部变量:
autocmd FileType javascript call s:RunPerBufferJSHook() function! s:RunPerBufferJSHook() if !exists('b:hook_executed') call s:ExecuteHook('ft==javascript triggered for buffer ' . bufnr('%')) let b:hook_executed = 1 endif endfunction
内容的提问来源于stack exchange,提问作者mbilyanov
相关产品推荐
相关产品推荐

