Ответ 1
Вы можете использовать ctags.vim для этого, он покажет текущее имя функции в заголовке или строке состояния.
Я редактирую большой файл C, С++ или Java, скажем, около 15000 строк, с довольно длинными определениями функций, скажем, около 400 строк. Когда курсор находится в середине определения функции, было бы здорово увидеть имя функции в строке состояния Vim.
Когда мы устанавливаем :set ls=2
в Vim, мы можем получить путь к файлу (относительно текущего каталога), номер строки и т.д. Было бы здорово, если бы мы могли увидеть имя функции. Любые идеи, как это получить?
В настоящее время я использую [[
для перехода к началу функции и Ctrl - O, чтобы вернуться к редактируемой строке.
Вы можете использовать ctags.vim для этого, он покажет текущее имя функции в заголовке или строке состояния.
Чтобы показать текущее имя функции в программах на 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", просто сопоставьте функцию с тем, что вам нравится.
На основании ответа @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()
Мое решение таково:
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 на отдельной строке.
Я только сегодня заметил, что он сбой, если он включен в пространство имен {}, даже если он отформатирован в противном случае.
Существует несколько плагинов для строки состояния или по требованию с отображением, например:
Я использую https://github.com/mgedmin/chelper.vim для этого. Ему не нужен файл тегов, вместо этого он анализирует исходный код на лету.