| " Enable folding for ftrace function_graph traces. |
| " |
| " To use, :source this file while viewing a function_graph trace, or use vim's |
| " -S option to load from the command-line together with a trace. You can then |
| " use the usual vim fold commands, such as "za", to open and close nested |
| " functions. While closed, a fold will show the total time taken for a call, |
| " as would normally appear on the line with the closing brace. Folded |
| " functions will not include finish_task_switch(), so folding should remain |
| " relatively sane even through a context switch. |
| " |
| " Note that this will almost certainly only work well with a |
| " single-CPU trace (e.g. trace-cmd report --cpu 1). |
| |
| function! FunctionGraphFoldExpr(lnum) |
| let line = getline(a:lnum) |
| if line[-1:] == '{' |
| if line =~ 'finish_task_switch() {$' |
| return '>1' |
| endif |
| return 'a1' |
| elseif line[-1:] == '}' |
| return 's1' |
| else |
| return '=' |
| endif |
| endfunction |
| |
| function! FunctionGraphFoldText() |
| let s = split(getline(v:foldstart), '|', 1) |
| if getline(v:foldend+1) =~ 'finish_task_switch() {$' |
| let s[2] = ' task switch ' |
| else |
| let e = split(getline(v:foldend), '|', 1) |
| let s[2] = e[2] |
| endif |
| return join(s, '|') |
| endfunction |
| |
| setlocal foldexpr=FunctionGraphFoldExpr(v:lnum) |
| setlocal foldtext=FunctionGraphFoldText() |
| setlocal foldcolumn=12 |
| setlocal foldmethod=expr |