searchcount.vim 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. " MIT License. Copyright (c) 2013-2021 Bailey Ling et al.
  2. " This extension is inspired by vim-anzu <https://github.com/osyo-manga/vim-anzu>.
  3. " vim: et ts=2 sts=2 sw=2
  4. scriptencoding utf-8
  5. if !exists('*searchcount')
  6. finish
  7. endif
  8. function! airline#extensions#searchcount#init(ext) abort
  9. call a:ext.add_statusline_func('airline#extensions#searchcount#apply')
  10. endfunction
  11. function! airline#extensions#searchcount#apply(...) abort
  12. call airline#extensions#append_to_section('y',
  13. \ '%{v:hlsearch ? airline#extensions#searchcount#status() : ""}')
  14. endfunction
  15. function! s:search_term()
  16. let show_search_term = get(g:, 'airline#extensions#searchcount#show_search_term', 1)
  17. let search_term_limit = get(g:, 'airline#extensions#searchcount#search_term_limit', 8)
  18. if show_search_term == 0
  19. return ''
  20. endif
  21. " shorten for all width smaller than 300 (this is just a guess)
  22. " this uses a non-breaking space, because it looks like
  23. " a leading space is stripped :/
  24. return "\ua0" . '/' . airline#util#shorten(getreg('/'), 300, search_term_limit)
  25. endfunction
  26. function! airline#extensions#searchcount#status() abort
  27. try
  28. let result = searchcount(#{recompute: 1, maxcount: -1})
  29. if empty(result) || result.total ==# 0
  30. return ''
  31. endif
  32. if result.incomplete ==# 1 " timed out
  33. return printf('%s[?/??]', s:search_term())
  34. elseif result.incomplete ==# 2 " max count exceeded
  35. if result.total > result.maxcount &&
  36. \ result.current > result.maxcount
  37. return printf('%s[>%d/>%d]', s:search_term(),
  38. \ result.current, result.total)
  39. elseif result.total > result.maxcount
  40. return printf('%s[%d/>%d]', s:search_term(),
  41. \ result.current, result.total)
  42. endif
  43. endif
  44. return printf('%s[%d/%d]', s:search_term(),
  45. \ result.current, result.total)
  46. catch
  47. return ''
  48. endtry
  49. endfunction