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