在状态行中显示函数名 我编辑了一个大的C、C++或java文件,比如说,大约15000行,长的函数定义,比如说,大约400行。当光标位于函数定义的中间时,在Vim状态行中看到函数名会很酷
当我们在Vim中设置在状态行中显示函数名 我编辑了一个大的C、C++或java文件,比如说,大约15000行,长的函数定义,比如说,大约400行。当光标位于函数定义的中间时,在Vim状态行中看到函数名会很酷,vim,Vim,当我们在Vim中设置:设置ls=2时,我们可以得到文件路径(相对于当前目录)、行号等。如果我们也能看到函数名,那就太酷了。有什么办法吗 目前,我使用[[转到函数的开头,使用Ctrl-O返回我正在编辑的行。您可以使用它,它将在标题或状态栏中显示当前函数名 来源:有几个用于状态行或按需映射的插件,例如: 我的解决方案如下: set stl=%f%h%m%r\ %{Options()}%=%l,%c-%v\ %{line('$')} fu! PlusOpt(opt) let option
:设置ls=2
时,我们可以得到文件路径(相对于当前目录)、行号等。如果我们也能看到函数名,那就太酷了。有什么办法吗
目前,我使用[[
转到函数的开头,使用Ctrl-O返回我正在编辑的行。您可以使用它,它将在标题或状态栏中显示当前函数名
来源:有几个用于状态行或按需映射的插件,例如:
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
set stl=%f%h%m%r\%{Options()}%=%l%c-%v\%{line('$')}
fu!PlusOpt(可选)
let option=a:opt
如果选项
返回“+”
其他的
返回“-”
恩迪夫
endf
傅!选项()
让opt=“ic”。PlusOpt(&ic)
让opt=opt.“&ff
让opt=opt.“&ft
如果&ft==?“cpp”|&ft==?“perl”
let text=“{”.FindCurrentFunction()。”}”
让opt=opt.text
恩迪夫
返回选项
fu!FindCurrentFunction()
让文本=“”
让save_cursor=getpos(“.”)
让左括号=searchpair('{','''}','bWr','''','100)
如果打开大括号>0
让oldmagic=&magic
设&magic=1
让运算符='operator\s*\%((\s*)\\[]\\\\\\[+*/%^&&&&&&&&&+-]\{2}\\\\\\\\>=\\\\\\\\\\\\\\\\[+%^&&&&&+-]\{2}\\\\\\\\\\\\\\\>=\\\\\\(\s*)\s*'
让类\u func\u string='\([[:alpha:]\uw*\)\s*::\s*\)*\s*\%(\~\2\\\)。运算符
让class\u func\u string=class\u func\u string.\\\[:alpha:][uw*\)\ze\s*('
让searchstring='\\\^\S.\{-}\%('.运算符)
让searchstring=searchstring.\\\[:alpha:][\uw*\)\s*(.*\n\%(\\\u^\ s.*\n\)*\\u^{
设l=search(searchstring'bW',第(“.”)行-20)
如果l!=0
让line_text=getline(l)
让matched_text=matchstr(行_text,类_func_string)
让matched_text=替换(matched_text,'\s',''g')
让文本=匹配的文本
恩迪夫
调用setpos('.',保存光标)
让&magic=oldmagic
恩迪夫
返回文本
端功能
实际上,我正在尝试为函数匹配C/C++/Java允许的名称。这通常对我有效(包括重载运算符),但假设开口{本身位于一行的第0列
我今天刚刚注意到,如果包含在命名空间{}中,即使按照预期的格式格式化,它也会失败。要在C程序中显示当前函数名
fun!ShowFuncName()
设lnum=直线(“.”)
设col=col(“.”)
echohl ModeMsg
echo getline(搜索(“^[^\t\\/]\\{2}.[^:]\s*$”,'bW'))
无回声
调用搜索(“\\%.”.lnum.l.“\\%.”.col.c”)
结束
映射f:调用ShowFuncName()
或者,如果您需要“f”键,只需将函数映射到您喜欢的任何位置。我使用它。它不需要标记文件,而是动态解析源代码。基于@manav m-n的答案
search()
中的“n”标志不会移动光标,因此具有相同功能的较短版本如下:
fun! ShowFuncName()
echohl ModeMsg
echo getline(search("^[^ \t#/]\\{2}.*[^:]\s*$", 'bWn'))
echohl None
endfun
map f :call ShowFuncName() <CR>
fun!ShowFuncName()
echohl ModeMsg
echo getline(搜索(“^[^\t\\/]\\{2}.[^:]\s*$”,'bWn'))
无回声
结束
映射f:调用ShowFuncName()
参考:基于@solidak solution(已基于另一个:)运行帮助搜索() 我希望始终在终端底部显示函数名。 但我在很大的功能上遇到了一些问题,我通过这种方式解决了这些问题:
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
在研究了这一点和公认的解决方案后,我认为最简单的解决方案是:
:set statusline=%_你当前的方法有什么问题?他想要更快、更简单的东西…总是显示这些信息。如果他不总是看,那么总是显示和更新这些信息有什么意义?@jahroy,是的,我希望它总是显示,这样每当我想看它时,我都可以看,这是你的权利作为Vim用户!尝试了大多数其他选项,对我来说,这是最好、最快的。不需要ctags更新,因为我的代码流只有几百个文件,每个文件只有10k行。search()
中的“n”标志不会移动光标,因此具有相同功能的较短版本应该是:fun!ShowFuncName()echohl ModeMsg echo getline(搜索(“^[^\t\\/]\\{2}.[^:]\s*$”,'bWn'))echohl None endfun映射f:call ShowFuncName()参考:运行:帮助搜索()
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