All patches and comments are welcome. Please squash your changes to logical
commits before using git-format-patch and git-send-email to
patches@git.madduck.net.
If you'd read over the Git project's submission guidelines and adhered to them,
I'd be especially grateful.
3 let s:change_timer = -1
6 function! asyncomplete#utils#_on_change#timer#init() abort
7 call s:setup_if_required()
10 \ 'register': function('s:register'),
11 \ 'unregister': function('s:unregister'),
15 function! s:setup_if_required() abort
16 augroup asyncomplete_utils_on_change_timer
18 autocmd InsertEnter * call s:on_insert_enter()
19 autocmd InsertLeave * call s:on_insert_leave()
20 autocmd TextChangedI * call s:on_text_changed_i()
24 function! s:register(cb) abort
25 call add(s:callbacks , a:cb)
28 function! s:unregister(obj, cb) abort
29 " TODO: remove from s:callbacks
32 function! s:on_insert_enter() abort
33 let s:previous_position = getcurpos()
34 call s:change_tick_start()
37 function! s:on_insert_leave() abort
38 unlet s:previous_position
39 call s:change_tick_stop()
42 function! s:on_text_changed_i() abort
43 call s:check_changes()
46 function! s:change_tick_start() abort
47 if !exists('s:change_timer')
48 let s:last_tick = s:change_tick()
49 " changes every 30ms, which is 0.03s, it should be fast enough
50 let s:change_timer = timer_start(30, function('s:check_changes'), { 'repeat': -1 })
54 function! s:change_tick_stop() abort
55 if exists('s:change_timer')
56 call timer_stop(s:change_timer)
62 function! s:check_changes(...) abort
63 let l:tick = s:change_tick()
64 if l:tick != s:last_tick
65 let s:last_tick = l:tick
66 call s:maybe_notify_on_change()
70 function! s:maybe_notify_on_change() abort
71 " enter to new line or backspace to previous line shouldn't cause change trigger
72 let l:previous_position = s:previous_position
73 let s:previous_position = getcurpos()
74 if l:previous_position[1] ==# getcurpos()[1]
75 for l:Cb in s:callbacks
81 function! s:change_tick() abort
82 return [b:changedtick, getcurpos()]