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
							 |