debug.vim 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. let s:plugin_dir = expand('<sfile>:p:h:h:h').'/'
  2. let s:log_file = s:plugin_dir.'gitgutter.log'
  3. let s:channel_log = s:plugin_dir.'channel.log'
  4. let s:new_log_session = 1
  5. function! gitgutter#debug#debug()
  6. " Open a scratch buffer
  7. vsplit __GitGutter_Debug__
  8. normal! ggdG
  9. setlocal buftype=nofile
  10. setlocal bufhidden=delete
  11. setlocal noswapfile
  12. call s:vim_version()
  13. call s:separator()
  14. call s:git_version()
  15. call s:separator()
  16. call s:grep_version()
  17. call s:separator()
  18. call s:option('updatetime')
  19. endfunction
  20. function! s:separator()
  21. call s:output('')
  22. endfunction
  23. function! s:vim_version()
  24. redir => version_info
  25. silent execute 'version'
  26. redir END
  27. call s:output(split(version_info, '\n')[0:2])
  28. endfunction
  29. function! s:git_version()
  30. let v = system(g:gitgutter_git_executable.' --version')
  31. call s:output( substitute(v, '\n$', '', '') )
  32. endfunction
  33. function! s:grep_version()
  34. let v = system(g:gitgutter_grep.' --version')
  35. call s:output( substitute(v, '\n$', '', '') )
  36. let v = system(g:gitgutter_grep.' --help')
  37. call s:output( substitute(v, '\%x00', '', 'g') )
  38. endfunction
  39. function! s:option(name)
  40. if exists('+' . a:name)
  41. let v = eval('&' . a:name)
  42. call s:output(a:name . '=' . v)
  43. " redir => output
  44. " silent execute "verbose set " . a:name . "?"
  45. " redir END
  46. " call s:output(a:name . '=' . output)
  47. else
  48. call s:output(a:name . ' [n/a]')
  49. end
  50. endfunction
  51. function! s:output(text)
  52. call append(line('$'), a:text)
  53. endfunction
  54. " assumes optional args are calling function's optional args
  55. function! gitgutter#debug#log(message, ...) abort
  56. if g:gitgutter_log
  57. if s:new_log_session && gitgutter#async#available()
  58. if exists('*ch_logfile')
  59. call ch_logfile(s:channel_log, 'w')
  60. endif
  61. endif
  62. execute 'redir >> '.s:log_file
  63. if s:new_log_session
  64. let s:start = reltime()
  65. silent echo "\n==== start log session ===="
  66. endif
  67. let elapsed = reltimestr(reltime(s:start)).' '
  68. silent echo ''
  69. " callers excluding this function
  70. silent echo elapsed.expand('<sfile>')[:-22].':'
  71. silent echo elapsed.s:format_for_log(a:message)
  72. if a:0 && !empty(a:1)
  73. for msg in a:000
  74. silent echo elapsed.s:format_for_log(msg)
  75. endfor
  76. endif
  77. redir END
  78. let s:new_log_session = 0
  79. endif
  80. endfunction
  81. function! s:format_for_log(data) abort
  82. if type(a:data) == 1
  83. return join(split(a:data,'\n'),"\n")
  84. elseif type(a:data) == 3
  85. return '['.join(a:data,"\n").']'
  86. else
  87. return a:data
  88. endif
  89. endfunction