function! tagbar#prototypes#normaltag#new(name) abort let newobj = tagbar#prototypes#basetag#new(a:name) let newobj.isNormalTag = function(s:add_snr('s:isNormalTag')) let newobj.strfmt = function(s:add_snr('s:strfmt')) let newobj.str = function(s:add_snr('s:str')) let newobj.getPrototype = function(s:add_snr('s:getPrototype')) return newobj endfunction " s:isNormalTag() {{{1 function! s:isNormalTag() abort dict return 1 endfunction " s:strfmt() {{{1 function! s:strfmt() abort dict let typeinfo = self.typeinfo let suffix = get(self.fields, 'signature', '') if has_key(self.fields, 'type') let suffix .= ' : ' . self.fields.type elseif has_key(get(typeinfo, 'kind2scope', {}), self.fields.kind) let suffix .= ' : ' . typeinfo.kind2scope[self.fields.kind] endif return self._getPrefix() . self.name . suffix endfunction " s:str() {{{1 function! s:str(longsig, full) abort dict if a:full && self.path !=# '' let str = self.path . self.typeinfo.sro . self.name else let str = self.name endif if has_key(self.fields, 'signature') if a:longsig let str .= self.fields.signature else let str .= '()' endif endif return str endfunction " s:getPrototype() {{{1 function! s:getPrototype(short) abort dict if self.prototype !=# '' let prototype = self.prototype else let bufnr = self.fileinfo.bufnr if self.fields.line == 0 || !bufloaded(bufnr) " No linenumber available or buffer not loaded (probably due to " 'nohidden'), try the pattern instead return substitute(self.pattern, '^\\M\\^\\C\s*\(.*\)\\$$', '\1', '') endif let line = getbufline(bufnr, self.fields.line)[0] let list = split(line, '\zs') let start = index(list, '(') if start == -1 return substitute(line, '^\s\+', '', '') endif let opening = count(list, '(', 0, start) let closing = count(list, ')', 0, start) if closing >= opening return substitute(line, '^\s\+', '', '') endif let balance = opening - closing let prototype = line let curlinenr = self.fields.line + 1 while balance > 0 let curline = getbufline(bufnr, curlinenr)[0] let curlist = split(curline, '\zs') let balance += count(curlist, '(') let balance -= count(curlist, ')') let prototype .= "\n" . curline let curlinenr += 1 endwhile let self.prototype = prototype endif if a:short " join all lines and remove superfluous spaces let prototype = substitute(prototype, '^\s\+', '', '') let prototype = substitute(prototype, '\_s\+', ' ', 'g') let prototype = substitute(prototype, '(\s\+', '(', 'g') let prototype = substitute(prototype, '\s\+)', ')', 'g') " Avoid hit-enter prompts let maxlen = &columns - 12 if len(prototype) > maxlen let prototype = prototype[:maxlen - 1 - 3] let prototype .= '...' endif endif return prototype endfunction " s:add_snr() {{{1 function! s:add_snr(funcname) abort if !exists('s:snr') let s:snr = matchstr(expand(''), '\d\+_\zeget_snr$') endif return s:snr . a:funcname endfunction " Modeline {{{1 " vim: ts=8 sw=4 sts=4 et foldenable foldmethod=marker foldcolumn=1