diff --git a/autoload/denops/_internal/echo.vim b/autoload/denops/_internal/echo.vim index 704bdced..a5b6d56e 100644 --- a/autoload/denops/_internal/echo.vim +++ b/autoload/denops/_internal/echo.vim @@ -1,3 +1,8 @@ +const s:DELAYED_INTERVAL = 100 + +let s:delayed_messages = [] +let s:delayed_timer = 0 + function! denops#_internal#echo#deprecate(...) abort if g:denops#disable_deprecation_warning_message return @@ -17,15 +22,15 @@ function! denops#_internal#echo#debug(...) abort endfunction function! denops#_internal#echo#info(...) abort - call s:echomsg('Title', a:000) + call s:echomsg_delay('Title', a:000) endfunction function! denops#_internal#echo#warn(...) abort - call s:echomsg('WarningMsg', a:000) + call s:echomsg_delay('WarningMsg', a:000) endfunction function! denops#_internal#echo#error(...) abort - call s:echomsg('ErrorMsg', a:000) + call s:echomsg_delay('ErrorMsg', a:000) endfunction function! s:echomsg(hl, msg) abort @@ -35,3 +40,21 @@ function! s:echomsg(hl, msg) abort endfor echohl None endfunction + +function! s:echomsg_delay(hl, msg) abort + call add(s:delayed_messages, [a:hl, a:msg]) + call timer_stop(s:delayed_timer) + let s:delayed_timer = timer_start(s:DELAYED_INTERVAL, {-> s:echomsg_batch()}) +endfunction + +function! s:echomsg_batch() abort + let l:counter = 0 + for l:message in s:delayed_messages + call s:echomsg(l:message[0], l:message[1]) + let l:counter += len(split(join(l:message[1]), '\n')) + endfor + let s:delayed_timer = 0 + let s:delayed_messages = [] + " Forcibly show the messages to the user + call feedkeys(printf("\%dmessages\", l:counter), 'n') +endfunction