Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在状态行中显示函数名 我编辑了一个大的C、C++或java文件,比如说,大约15000行,长的函数定义,比如说,大约400行。当光标位于函数定义的中间时,在Vim状态行中看到函数名会很酷_Vim - Fatal编程技术网

在状态行中显示函数名 我编辑了一个大的C、C++或java文件,比如说,大约15000行,长的函数定义,比如说,大约400行。当光标位于函数定义的中间时,在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

当我们在Vim中设置
:设置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

在研究了这一点和公认的解决方案后,我认为最简单的解决方案是:

  • 安装通用CTAG

  • 安装标记栏

  • 设置状态行时,调用标记栏#currenttag(),例如在.vimrc中:


    :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