languageclient.vim 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. " MIT License. Copyright (c) 2013-2021 Bjorn Neergaard, hallettj et al.
  2. " Plugin: https://github.com/autozimu/LanguageClient-neovim
  3. " vim: et ts=2 sts=2 sw=2
  4. scriptencoding utf-8
  5. let s:error_symbol = get(g:, 'airline#extensions#languageclient#error_symbol', 'E:')
  6. let s:warning_symbol = get(g:, 'airline#extensions#languageclient#warning_symbol', 'W:')
  7. let s:show_line_numbers = get(g:, 'airline#extensions#languageclient#show_line_numbers', 1)
  8. " Severity codes from the LSP spec
  9. let s:severity_error = 1
  10. let s:severity_warning = 2
  11. let s:severity_info = 3
  12. let s:severity_hint = 4
  13. " After each LanguageClient state change `s:diagnostics` will be populated with
  14. " a map from file names to lists of errors, warnings, informational messages,
  15. " and hints.
  16. let s:diagnostics = {}
  17. function! s:languageclient_refresh()
  18. if get(g:, 'airline_skip_empty_sections', 0)
  19. exe ':AirlineRefresh!'
  20. endif
  21. endfunction
  22. function! s:record_diagnostics(state)
  23. " The returned message might not have the 'result' key
  24. if has_key(a:state, 'result')
  25. let result = json_decode(a:state.result)
  26. let s:diagnostics = result.diagnostics
  27. endif
  28. call s:languageclient_refresh()
  29. endfunction
  30. function! s:get_diagnostics()
  31. if !exists('#airline')
  32. " airline disabled
  33. return
  34. endif
  35. call LanguageClient#getState(function("s:record_diagnostics"))
  36. endfunction
  37. function! s:diagnostics_for_buffer()
  38. return get(s:diagnostics, expand('%:p'), [])
  39. endfunction
  40. function! s:airline_languageclient_count(cnt, symbol)
  41. return a:cnt ? a:symbol. a:cnt : ''
  42. endfunction
  43. function! s:airline_languageclient_get_line_number(type) abort
  44. let linenumber_of_first_problem = 0
  45. for d in s:diagnostics_for_buffer()
  46. if has_key(d, 'severity') && d.severity == a:type
  47. let linenumber_of_first_problem = d.range.start.line
  48. break
  49. endif
  50. endfor
  51. if linenumber_of_first_problem == 0
  52. return ''
  53. endif
  54. let open_lnum_symbol = get(g:, 'airline#extensions#languageclient#open_lnum_symbol', '(L')
  55. let close_lnum_symbol = get(g:, 'airline#extensions#languageclient#close_lnum_symbol', ')')
  56. return open_lnum_symbol . linenumber_of_first_problem . close_lnum_symbol
  57. endfunction
  58. function! airline#extensions#languageclient#get(type)
  59. if get(b:, 'LanguageClient_isServerRunning', 0) ==# 0
  60. return ''
  61. endif
  62. let is_err = a:type == s:severity_error
  63. let symbol = is_err ? s:error_symbol : s:warning_symbol
  64. let cnt = 0
  65. for d in s:diagnostics_for_buffer()
  66. if has_key(d, 'severity') && d.severity == a:type
  67. let cnt += 1
  68. endif
  69. endfor
  70. if cnt == 0
  71. return ''
  72. endif
  73. if s:show_line_numbers == 1
  74. return s:airline_languageclient_count(cnt, symbol) . <sid>airline_languageclient_get_line_number(a:type)
  75. else
  76. return s:airline_languageclient_count(cnt, symbol)
  77. endif
  78. endfunction
  79. function! airline#extensions#languageclient#get_warning()
  80. return airline#extensions#languageclient#get(s:severity_warning)
  81. endfunction
  82. function! airline#extensions#languageclient#get_error()
  83. return airline#extensions#languageclient#get(s:severity_error)
  84. endfunction
  85. function! airline#extensions#languageclient#init(ext)
  86. call airline#parts#define_function('languageclient_error_count', 'airline#extensions#languageclient#get_error')
  87. call airline#parts#define_function('languageclient_warning_count', 'airline#extensions#languageclient#get_warning')
  88. augroup airline_languageclient
  89. autocmd!
  90. autocmd User LanguageClientDiagnosticsChanged call <sid>get_diagnostics()
  91. augroup END
  92. endfunction