1*6591b493SJosh Triplett" Enable folding for ftrace function_graph traces.
2*6591b493SJosh Triplett"
3*6591b493SJosh Triplett" To use, :source this file while viewing a function_graph trace, or use vim's
4*6591b493SJosh Triplett" -S option to load from the command-line together with a trace.  You can then
5*6591b493SJosh Triplett" use the usual vim fold commands, such as "za", to open and close nested
6*6591b493SJosh Triplett" functions.  While closed, a fold will show the total time taken for a call,
7*6591b493SJosh Triplett" as would normally appear on the line with the closing brace.  Folded
8*6591b493SJosh Triplett" functions will not include finish_task_switch(), so folding should remain
9*6591b493SJosh Triplett" relatively sane even through a context switch.
10*6591b493SJosh Triplett"
11*6591b493SJosh Triplett" Note that this will almost certainly only work well with a
12*6591b493SJosh Triplett" single-CPU trace (e.g. trace-cmd report --cpu 1).
13*6591b493SJosh Triplett
14*6591b493SJosh Triplettfunction! FunctionGraphFoldExpr(lnum)
15*6591b493SJosh Triplett  let line = getline(a:lnum)
16*6591b493SJosh Triplett  if line[-1:] == '{'
17*6591b493SJosh Triplett    if line =~ 'finish_task_switch() {$'
18*6591b493SJosh Triplett      return '>1'
19*6591b493SJosh Triplett    endif
20*6591b493SJosh Triplett    return 'a1'
21*6591b493SJosh Triplett  elseif line[-1:] == '}'
22*6591b493SJosh Triplett    return 's1'
23*6591b493SJosh Triplett  else
24*6591b493SJosh Triplett    return '='
25*6591b493SJosh Triplett  endif
26*6591b493SJosh Triplettendfunction
27*6591b493SJosh Triplett
28*6591b493SJosh Triplettfunction! FunctionGraphFoldText()
29*6591b493SJosh Triplett  let s = split(getline(v:foldstart), '|', 1)
30*6591b493SJosh Triplett  if getline(v:foldend+1) =~ 'finish_task_switch() {$'
31*6591b493SJosh Triplett    let s[2] = ' task switch  '
32*6591b493SJosh Triplett  else
33*6591b493SJosh Triplett    let e = split(getline(v:foldend), '|', 1)
34*6591b493SJosh Triplett    let s[2] = e[2]
35*6591b493SJosh Triplett  endif
36*6591b493SJosh Triplett  return join(s, '|')
37*6591b493SJosh Triplettendfunction
38*6591b493SJosh Triplett
39*6591b493SJosh Triplettsetlocal foldexpr=FunctionGraphFoldExpr(v:lnum)
40*6591b493SJosh Triplettsetlocal foldtext=FunctionGraphFoldText()
41*6591b493SJosh Triplettsetlocal foldcolumn=12
42*6591b493SJosh Triplettsetlocal foldmethod=expr
43