43 lines
		
	
	
	
		
			1.3 KiB
			
		
	
	
	
		
			VimL
		
	
	
	
	
	
		
		
			
		
	
	
			43 lines
		
	
	
	
		
			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 |