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