| 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 |