Подтвердить что ты не робот

Показать имя функции в строке состояния

Я редактирую большой файл C, С++ или Java, скажем, около 15000 строк, с довольно длинными определениями функций, скажем, около 400 строк. Когда курсор находится в середине определения функции, было бы здорово увидеть имя функции в строке состояния Vim.

Когда мы устанавливаем :set ls=2 в Vim, мы можем получить путь к файлу (относительно текущего каталога), номер строки и т.д. Было бы здорово, если бы мы могли увидеть имя функции. Любые идеи, как это получить?

В настоящее время я использую [[ для перехода к началу функции и Ctrl - O, чтобы вернуться к редактируемой строке.

4b9b3361

Ответ 2

Чтобы показать текущее имя функции в программах на C добавить следующее в свой 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", просто сопоставьте функцию с тем, что вам нравится.

Ответ 3

На основании ответа @manav m-n

Флаг 'n' в search() не будет перемещать курсор, поэтому более короткая версия с такой же функциональностью будет:

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

Ссылка: запустить :help search()

Ответ 4

Мое решение таково:

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/С++/Java для функций. Обычно это работает для меня (в том числе для перегруженных операторов), но предполагает, что открытие {находится в столбце 0 на отдельной строке.

Я только сегодня заметил, что он сбой, если он включен в пространство имен {}, даже если он отформатирован в противном случае.

Ответ 6

Я использую https://github.com/mgedmin/chelper.vim для этого. Ему не нужен файл тегов, вместо этого он анализирует исходный код на лету.