vim 在状态行中显示函数名

pcrecxhr  于 12个月前  发布在  其他
关注(0)|答案(9)|浏览(144)

我编辑一个很大的C、C++或Java文件,比如说,大约15000行,其中有相当长的函数定义,比如说,大约400行。当光标位于函数定义的中间时,在Vim状态行中看到函数名会很酷。
当我们在Vim中设置:set ls=2时,我们可以获得文件路径(相对于当前目录),行号等。如果我们也能看到函数名,那就太酷了。有什么想法吗?
目前,我使用[[去开始的功能和Ctrl-O回到我正在编辑的行。

i2loujxw

i2loujxw1#

我的解决方案如下:

set stl=%f%h%m%r\ %{Options()}%=%l,%c-%v\ %{line('$')}
fu! PlusOpt(opt)
  let option = a:opt
  if option
    return "+"
  else
    return "-"
  endif
endf

fu! Options()
  let opt="ic".PlusOpt(&ic)
  let opt=opt." ".&ff
  let opt=opt." ".&ft
  if &ft==?"cpp" || &ft==?"perl"
    let text = " {" . FindCurrentFunction() . "}"
    let opt= opt.text
  endif
  return opt

fu! FindCurrentFunction()
  let text =''

  let save_cursor = getpos(".")

  let opening_brace = searchpair('{','','}','bWr', '', '', 100)
  if opening_brace > 0
    let oldmagic = &magic
    let &magic = 1

    let operators='operator\s*\%((\s*)\|\[]\|[+*/%^&|~!=<>-]=\?\|[<>&|+-]\{2}\|>>=\|<<=\|->\*\|,\|->\|(\s*)\)\s*'
    let class_func_string = '\(\([[:alpha:]_]\w*\)\s*::\s*\)*\s*\%(\~\2\|'.operators
    let class_func_string = class_func_string . '\|[[:alpha:]_]\w*\)\ze\s*('

    let searchstring = '\_^\S.\{-}\%('.operators
    let searchstring = searchstring.'\|[[:alpha:]_]\w*\)\s*(.*\n\%(\_^\s.*\n\)*\_^{'

    let l = search(searchstring, 'bW', line(".")-20 )

    if l != 0
      let line_text = getline(l)
      let matched_text = matchstr(line_text, class_func_string)
      let matched_text = substitute(matched_text, '\s', '', 'g')
      let text = matched_text
    endif

    call setpos('.', save_cursor)

    let &magic = oldmagic
  endif

  return text
endfunction

字符串
我实际上试图匹配C/C++/Java允许的函数名。这通常对我有用(包括重载运算符),但假设开头的{本身位于第0列。
我今天才注意到,如果包含在名称空间{}中,即使按预期的格式设置,它也会失败。

mrphzbgm

mrphzbgm2#

我使用https://github.com/mgedmin/chelper.vim,它不需要标记文件,而是动态解析源代码。

r1zhe5dt

r1zhe5dt3#

基于@solidak解决方案(已经基于另一个解决方案:)
我想总是在终端的底部显示函数名。但我有一些问题,非常大的函数,我解决了这种方式:

fun! ShowFuncName()
  echohl ModeMsg
  echo getline(search("^[^ \t#/]\\{2}.*[^:]\s*$", 'bWn'))[:winwidth('%')-3]
  echohl None
endfun

augroup show_funcname
  autocmd CursorMoved * :call ShowFuncName()
augroup end

字符串

baubqpgj

baubqpgj4#

基于其他人的解决方案,这里有一个Vim9版本,进一步扩展到python:

def ShowFuncName(): string
  var n_max = 20 # max chars to be displayed.
  var filetypes = ['c', 'cpp', 'python']
  var text = "" # displayed text

  if index(filetypes, &filetype) != -1
      # If the filetype is recognized, then search the function line
      var line = 0
      if index(['c', 'cpp'], &filetype) != -1
          line = search("^[^ \t#/]\\{2}.*[^:]\s*$", 'bWn')
      elseif &filetype ==# 'python'
          line = search("^ \\{0,}def \\+.*", 'bWn')
      endif
      var n = match(getline(line), '\zs)') # Number of chars until ')'
      if n < n_max
          text = "|" .. trim(getline(line)[: n])
      else
          text = "|" .. trim(getline(line)[: n_max]) .. "..."
      endif
  endif
  return text
enddef

augroup show_funcname
  autocmd!
  autocmd BufEnter,BufWinEnter,CursorMoved * b:current_function = ShowFuncName()
augroup end

set statusline+=%#StatusLineNC#\%{b:current_function}\ %*

字符串

nkoocmlb

nkoocmlb5#

C程序中显示当前函数名add following in your vimrc:

fun! ShowFuncName()
  let lnum = line(".")
  let col = col(".")
  echohl ModeMsg
  echo getline(search("^[^ \t#/]\\{2}.*[^:]\s*$", 'bW'))
  echohl None
  call search("\\%" . lnum . "l" . "\\%" . col . "c")
endfun
map f :call ShowFuncName() <CR>

字符串
或者,如果你需要"f"键,只需将函数Map到你喜欢的任何东西。

unguejic

unguejic6#

你可以使用ctags.vim,它会在标题或状态栏中显示当前函数的名称。
SOURCE:Jackie Chan

vq8itlhq

vq8itlhq7#

基于@manav m-n的回答
search()中的'n'标志不会移动光标,因此具有相同功能的简短版本是:

fun! ShowFuncName()
  echohl ModeMsg
  echo getline(search("^[^ \t#/]\\{2}.*[^:]\s*$", 'bWn'))
  echohl None
endfun
map f :call ShowFuncName() <CR>

字符串
参考:运行:help search()

hgtggwj0

hgtggwj08#

在研究了这个问题和公认的解决方案之后,我认为最简单的解决方案是:
1.安装通用Ctags https://ctags.io/
1.安装Tagbar https://github.com/preservim/tagbar
1.在设置状态行时调用tagbar#currenttag(),例如.vimrc:
:set statusline=%<%f\ %h%m%r%=%{tagbar#currenttag('%s\ ','','f')}%-.(%l,%c%V%)\ %P
请注意:

  • 在你传递给currenttag()的字符串中,空格必须是斜杠转义的.在Vim中运行命令和把它放在你的.vimrc中甚至是不同的,无论如何,空格可能很奇怪,它们可能是你在输出函数名时想要的东西。
  • 我花了点功夫但默认状态是

:set statusline=%<%f\ %h%m%r%=%-14.(%l,%c%V%)\ %P

相关问题