43 строки
1.3 KiB
VimL
43 строки
1.3 KiB
VimL
|
" 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
|