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
14function! 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
26endfunction
27
28function! 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, '|')
37endfunction
38
39setlocal foldexpr=FunctionGraphFoldExpr(v:lnum)
40setlocal foldtext=FunctionGraphFoldText()
41setlocal foldcolumn=12
42setlocal foldmethod=expr
43