| Josh Triplett | 6591b49 | 2009-08-06 07:57:01 -0700 | [diff] [blame] | 1 | " Enable folding for ftrace function_graph traces. | 
 | 2 | " | 
 | 3 | " To use, :source this file while viewing a function_graph trace, or use vim's | 
 | 4 | " -S option to load from the command-line together with a trace.  You can then | 
 | 5 | " use the usual vim fold commands, such as "za", to open and close nested | 
 | 6 | " functions.  While closed, a fold will show the total time taken for a call, | 
 | 7 | " as would normally appear on the line with the closing brace.  Folded | 
 | 8 | " functions will not include finish_task_switch(), so folding should remain | 
 | 9 | " relatively sane even through a context switch. | 
 | 10 | " | 
 | 11 | " Note that this will almost certainly only work well with a | 
 | 12 | " single-CPU trace (e.g. trace-cmd report --cpu 1). | 
 | 13 |  | 
 | 14 | function! FunctionGraphFoldExpr(lnum) | 
 | 15 |   let line = getline(a:lnum) | 
 | 16 |   if line[-1:] == '{' | 
 | 17 |     if line =~ 'finish_task_switch() {$' | 
 | 18 |       return '>1' | 
 | 19 |     endif | 
 | 20 |     return 'a1' | 
 | 21 |   elseif line[-1:] == '}' | 
 | 22 |     return 's1' | 
 | 23 |   else | 
 | 24 |     return '=' | 
 | 25 |   endif | 
 | 26 | endfunction | 
 | 27 |  | 
 | 28 | function! FunctionGraphFoldText() | 
 | 29 |   let s = split(getline(v:foldstart), '|', 1) | 
 | 30 |   if getline(v:foldend+1) =~ 'finish_task_switch() {$' | 
 | 31 |     let s[2] = ' task switch  ' | 
 | 32 |   else | 
 | 33 |     let e = split(getline(v:foldend), '|', 1) | 
 | 34 |     let s[2] = e[2] | 
 | 35 |   endif | 
 | 36 |   return join(s, '|') | 
 | 37 | endfunction | 
 | 38 |  | 
 | 39 | setlocal foldexpr=FunctionGraphFoldExpr(v:lnum) | 
 | 40 | setlocal foldtext=FunctionGraphFoldText() | 
 | 41 | setlocal foldcolumn=12 | 
 | 42 | setlocal foldmethod=expr |