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