config/.vim/plugin/WhatFunction.vim

64 lines
1.7 KiB
VimL
Raw Normal View History

2011-05-26 14:01:52 +02:00
" Display current function in status bar
"
" Use WhatFunction could create some problems with lines longer that the
" screen size. WhatFunction could be interesting for C++ function
function! GetProtoLine()
let ret = ""
let line_save = line(".")
let col_save = col(".")
let top = line_save - winline() + 1
let so_save = &so
let &so = 0
let istypedef = 0
" find closing brace
let closing_lnum = search('^}','cW')
if closing_lnum > 0
if getline(line(".")) =~ '\w\s*;\s*$'
let istypedef = 1
let closingline = getline(".")
endif
" go to the opening brace
normal! %
" if the start position is between the two braces
if line(".") <= line_save
if istypedef
let ret = matchstr(closingline, '\w\+\s*;')
else
" find a line contains function name
let lnum = search('^\w','bcnW')
if lnum > 0
let ret = getline(lnum)
endif
endif
endif
endif
" restore position and screen line
exe "normal! " . top . "Gz\<CR>"
call cursor(line_save, col_save)
let &so = so_save
return ret
endfunction
function! WhatFunction()
if &ft != "c" && &ft != "cpp"
return ""
endif
let proto = GetProtoLine()
if proto == ""
return "?"
endif
if stridx(proto, '(') > 0
let ret = matchstr(proto, '\w\+(\@=')
elseif proto =~# '\<struct\>'
let ret = matchstr(proto, 'struct\s\+\w\+')
elseif proto =~# '\<class\>'
let ret = matchstr(proto, 'class\s\+\w\+')
else
let ret = strpart(proto, 0, 15) . "..."
endif
return ret
endfunction
" set statusline=%<%f\ %h%w%m%r%3.(\ %)%{fugitive#statusline()}%=%([%{Tlist_Get_Tagname_By_Line()}%{WhatFunction()}]%)%3.(\ %)%-14.(%l,%c%V%)\ %P