log.vim 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. if exists('g:loaded_syntastic_log_autoload') || !exists('g:loaded_syntastic_plugin')
  2. finish
  3. endif
  4. let g:loaded_syntastic_log_autoload = 1
  5. let s:save_cpo = &cpo
  6. set cpo&vim
  7. let s:one_time_notices_issued = []
  8. " Public functions {{{1
  9. function! syntastic#log#info(msg) abort " {{{2
  10. echomsg 'syntastic: info: ' . a:msg
  11. endfunction " }}}2
  12. function! syntastic#log#warn(msg) abort " {{{2
  13. echohl WarningMsg
  14. echomsg 'syntastic: warning: ' . a:msg
  15. echohl None
  16. endfunction " }}}2
  17. function! syntastic#log#error(msg) abort " {{{2
  18. execute 'normal! \<Esc>'
  19. echohl ErrorMsg
  20. echomsg 'syntastic: error: ' . a:msg
  21. echohl None
  22. endfunction " }}}2
  23. function! syntastic#log#oneTimeWarn(msg) abort " {{{2
  24. if index(s:one_time_notices_issued, a:msg) >= 0
  25. return
  26. endif
  27. call add(s:one_time_notices_issued, a:msg)
  28. call syntastic#log#warn(a:msg)
  29. endfunction " }}}2
  30. " @vimlint(EVL102, 1, l:OLD_VAR)
  31. function! syntastic#log#deprecationWarn(old, new, ...) abort " {{{2
  32. if exists('g:syntastic_' . a:old) && !exists('g:syntastic_' . a:new)
  33. let msg = 'variable g:syntastic_' . a:old . ' is deprecated, please use '
  34. if a:0
  35. let OLD_VAR = g:syntastic_{a:old}
  36. try
  37. let NEW_VAR = eval(a:1)
  38. let msg .= 'in its stead: let g:syntastic_' . a:new . ' = ' . string(NEW_VAR)
  39. let g:syntastic_{a:new} = NEW_VAR
  40. catch
  41. let msg .= 'g:syntastic_' . a:new . ' instead'
  42. endtry
  43. else
  44. let msg .= 'g:syntastic_' . a:new . ' instead'
  45. let g:syntastic_{a:new} = g:syntastic_{a:old}
  46. endif
  47. call syntastic#log#oneTimeWarn(msg)
  48. endif
  49. endfunction " }}}2
  50. " @vimlint(EVL102, 0, l:OLD_VAR)
  51. function! syntastic#log#debug(level, msg, ...) abort " {{{2
  52. if !s:_isDebugEnabled(a:level)
  53. return
  54. endif
  55. let leader = s:_log_timestamp()
  56. call s:_logRedirect(1)
  57. if a:0
  58. " filter out dictionary functions
  59. echomsg leader . a:msg . ' ' .
  60. \ strtrans(string(type(a:1) == type({}) || type(a:1) == type([]) ?
  61. \ filter(copy(a:1), 'type(v:val) != type(function("tr"))') : a:1))
  62. else
  63. echomsg leader . a:msg
  64. endif
  65. call s:_logRedirect(0)
  66. endfunction " }}}2
  67. function! syntastic#log#debugShowOptions(level, names) abort " {{{2
  68. if !s:_isDebugEnabled(a:level)
  69. return
  70. endif
  71. let leader = s:_log_timestamp()
  72. call s:_logRedirect(1)
  73. let vlist = copy(type(a:names) == type('') ? [a:names] : a:names)
  74. let add_shell = index(vlist, 'shell') >= 0 && &shell !=# syntastic#util#var('shell')
  75. if !empty(vlist)
  76. call map(vlist, "'&' . v:val . ' = ' . strtrans(string(eval('&' . v:val))) . (s:_is_modified(v:val) ? ' (!)' : '')")
  77. if add_shell
  78. call add(vlist, 'u:shell = ' . strtrans(string(syntastic#util#var('shell'))) . ' (!)')
  79. endif
  80. echomsg leader . join(vlist, ', ')
  81. endif
  82. call s:_logRedirect(0)
  83. endfunction " }}}2
  84. function! syntastic#log#debugShowVariables(level, names) abort " {{{2
  85. if !s:_isDebugEnabled(a:level)
  86. return
  87. endif
  88. let leader = s:_log_timestamp()
  89. call s:_logRedirect(1)
  90. let vlist = type(a:names) == type('') ? [a:names] : a:names
  91. for name in vlist
  92. let msg = s:_format_variable(name)
  93. if msg !=# ''
  94. echomsg leader . msg
  95. endif
  96. endfor
  97. call s:_logRedirect(0)
  98. endfunction " }}}2
  99. function! syntastic#log#debugDump(level) abort " {{{2
  100. if !s:_isDebugEnabled(a:level)
  101. return
  102. endif
  103. call syntastic#log#debugShowVariables( a:level, sort(keys(g:_SYNTASTIC_DEFAULTS)) )
  104. endfunction " }}}2
  105. function! syntastic#log#ndebug(level, title, messages) abort " {{{2
  106. if s:_isDebugEnabled(a:level)
  107. return
  108. endif
  109. call syntastic#log#error(a:title)
  110. if type(a:messages) == type([])
  111. for msg in a:messages
  112. echomsg msg
  113. endfor
  114. else
  115. echomsg a:messages
  116. endif
  117. endfunction " }}}2
  118. " }}}1
  119. " Private functions {{{1
  120. function! s:_isDebugEnabled_smart(level) abort " {{{2
  121. return and(g:syntastic_debug, a:level)
  122. endfunction " }}}2
  123. function! s:_isDebugEnabled_dumb(level) abort " {{{2
  124. " poor man's bit test for bit N, assuming a:level == 2**N
  125. return (g:syntastic_debug / a:level) % 2
  126. endfunction " }}}2
  127. let s:_isDebugEnabled = function(exists('*and') ? 's:_isDebugEnabled_smart' : 's:_isDebugEnabled_dumb')
  128. lockvar s:_isDebugEnabled
  129. function! s:_logRedirect(on) abort " {{{2
  130. if exists('g:syntastic_debug_file')
  131. if a:on
  132. try
  133. execute 'redir >> ' . fnameescape(expand(g:syntastic_debug_file, 1))
  134. catch /\m^Vim\%((\a\+)\)\=:/
  135. silent! redir END
  136. unlet g:syntastic_debug_file
  137. endtry
  138. else
  139. silent! redir END
  140. endif
  141. endif
  142. endfunction " }}}2
  143. " }}}1
  144. " Utilities {{{1
  145. function! s:_log_timestamp_smart() abort " {{{2
  146. return printf('syntastic: %f: ', reltimefloat(reltime(g:_SYNTASTIC_START)))
  147. endfunction " }}}2
  148. function! s:_log_timestamp_dumb() abort " {{{2
  149. return 'syntastic: ' . split(reltimestr(reltime(g:_SYNTASTIC_START)))[0] . ': '
  150. endfunction " }}}2
  151. let s:_log_timestamp = function(has('float') && exists('*reltimefloat') ? 's:_log_timestamp_smart' : 's:_log_timestamp_dumb')
  152. lockvar s:_log_timestamp
  153. function! s:_format_variable(name) abort " {{{2
  154. let vals = []
  155. if exists('g:syntastic_' . a:name)
  156. call add(vals, 'g:syntastic_' . a:name . ' = ' . strtrans(string(g:syntastic_{a:name})))
  157. endif
  158. if exists('b:syntastic_' . a:name)
  159. call add(vals, 'b:syntastic_' . a:name . ' = ' . strtrans(string(b:syntastic_{a:name})))
  160. endif
  161. return join(vals, ', ')
  162. endfunction " }}}2
  163. function! s:_is_modified(name) abort " {{{2
  164. if !exists('s:option_defaults')
  165. let s:option_defaults = {}
  166. endif
  167. if !has_key(s:option_defaults, a:name)
  168. let opt_save = eval('&' . a:name)
  169. execute 'set ' . a:name . '&'
  170. let s:option_defaults[a:name] = eval('&' . a:name)
  171. execute 'let &' . a:name . ' = ' . string(opt_save)
  172. endif
  173. return s:option_defaults[a:name] !=# eval('&' . a:name)
  174. endfunction " }}}2
  175. " }}}1
  176. let &cpo = s:save_cpo
  177. unlet s:save_cpo
  178. " vim: set sw=4 sts=4 et fdm=marker: