在vim状态栏中显示当前函数

7
我在vim中花费了生命的20%来编写代码,几乎完全是用javascript和python。 其余80%的时间,我大多数时间都在源文件上上下下地滚动,试图记住我当前正在编辑的函数以及该函数属于哪个类。
这可能出于我不理解的原因而在技术上是不可能的,但是否有任何vim插件可以允许vim状态行显示Python和/或Javascript光标当前所在的函数?
它应该看起来像这样:

Vim status line with location

可能这已经存在于像SublimeText这样的编辑器中了。

如果是这样的话,我可能会停止哭泣并转换编辑器了。

一些Vim插件提供此功能:

更新

自问这个问题以来,我发现ctags可以知道这种信息,但是我该如何让它在Vim状态栏中显示呢?


看起来你的编辑器比你还老...换一个带有VIM键绑定的新编辑器吧。 - dandavis
@dandavis 哈哈!是的,我很乐意听取建议... - LondonRob
(兴高采烈的)ctags实际上支持JavaScript和Python:http://ctags.sourceforge.net/languages.html。您可能需要明确启用vim插件以支持其他文件类型。 - Felix Kling
4
@FelixKling 在离题一下:如果人们停止推荐未维护的 Exubernt ctags 并改用 universal ctags 将会更好。它是 Exubernt ctags 的一个积极维护的分支(后继者)。 - Sato Katsura
“vim-airline”插件有一个“tagbar”扩展,如果两者都正确配置,则可以完全满足您的需求(即在状态栏中显示当前函数);尽管仅使用“tagbar”可能已经足够。 - VanLaser
显示剩余3条评论
6个回答

8

不要在状态栏中显示当前方法/类的名称,你可以直接跳转到声明并返回。

在Python中:

?def<Esc>

或者使用内置的:
[[<C-o>

在 JavaScript 中:

?fun<Esc>

它不需要配置...不依赖第三方工具...与语言无关...轻量级...

func


我不知道?,所以谢谢你!即使我知道它,这也是一个很棒的用法。 - LondonRob

7

lightline.vimtagbar

基于https://github.com/itchyny/lightline.vim/issues/42

vimrc

let g:lightline = {
      \ 'active': {
      \   'left': [ [ 'mode', 'paste' ], [ 'filename', ], [ 'tagbar' ] ]
      \ },
      \ 'component': {
      \         'tagbar': '%{tagbar#currenttag("%s", "", "f")}',
      \ },
      \ 'component_function': {
      \   'modified': 'LightLineModified',
      \   'readonly': 'LightLineReadonly',
      \   'filename': 'LightLineFilename',
      \   'fileformat': 'LightLineFileformat',
      \   'filetype': 'LightLineFiletype',
      \   'fileencoding': 'LightLineFileencoding',
      \   'mode': 'LightLineMode'}
      \ }
function! LightLineModified()
  return &ft =~ 'help' ? '' : &modified ? '+' : &modifiable ? '' : '-'
endfunction
function! LightLineReadonly()
  return &ft !~? 'help' && &readonly ? 'RO' : ''
endfunction
function! LightLineFilename()
  let fname = expand('%:t')
  return fname == '__Tagbar__' ? g:lightline.fname :
        \ ('' != LightLineReadonly() ? LightLineReadonly() . ' ' : '') .
        \ ('' != fname ? fname : '[No Name]') .
        \ ('' != LightLineModified() ? ' ' . LightLineModified() : '')
endfunction
function! LightLineFileformat()
  return winwidth(0) > 70 ? &fileformat : ''
endfunction
function! LightLineFiletype()
  return winwidth(0) > 70 ? (strlen(&filetype) ? &filetype : 'no ft') : ''
endfunction
function! LightLineFileencoding()
  return winwidth(0) > 70 ? (strlen(&fenc) ? &fenc : &enc) : ''
endfunction
function! LightLineMode()
  let fname = expand('%:t')
  return fname == '__Tagbar__' ? 'Tagbar' :
        \ winwidth(0) > 60 ? lightline#mode() : ''
endfunction
let g:tagbar_status_func = 'TagbarStatusFunc'
function! TagbarStatusFunc(current, sort, fname, ...) abort
    let g:lightline.fname = a:fname
  return lightline#statusline(0)
endfunction

6

您应该尝试使用基于ctags的Tagbar插件。如果您查看链接中的截图,您将注意到状态行显示了当前方法的名称,正如您所要求的那样。

插件文档说明了如何设置状态行;以下是我在vimrc上使用的配置:

command! -nargs=0 TagbarToggleStatusline call TagbarToggleStatusline()
nnoremap <silent> <c-F12> :TagbarToggleStatusline<CR>
function! TagbarToggleStatusline()
   let tStatusline = '%{exists(''*tagbar#currenttag'')?
            \tagbar#currenttag(''     [%s] '',''''):''''}'
   if stridx(&statusline, tStatusline) != -1
      let &statusline = substitute(&statusline, '\V'.tStatusline, '', '')
   else
      let &statusline = substitute(&statusline, '\ze%=%-', tStatusline, '')
   endif
endfunction

由于我有时需要处理非常大的源文件,并且在这些文件之间切换会因为执行ctags而导致小的延迟,所以我更喜欢使用上面定义的映射(Ctrl+F12)或命令来启用和禁用此功能。


太喜欢这个了。我太蠢了,无法从航空公司文档中弄清楚如何添加当前类的部分。然后这个问题就会完全解决了! - LondonRob

2

一个名为 ctags 的命令行工具收集和存储了关于每个函数在特定文件中所在位置的元数据。

Vim 的插件tagbar管理ctags调用,以显示当前正在编辑的文档的层次结构。

最后,airline插件带有一个扩展程序,可以让当前标签(即当前函数的名称)显示在Vim状态栏中。

通过将以下行添加到您的.vimrc中,可以配置它以显示标签的整个层次结构:

let g:airline#extensions#tagbar#flags = 'f'

这是一个类似于这样的内容:

airline plus tagbar

本答案的灵感来自这个回答以及这个问题上的评论。

但是tagbar在更新方法名称时太慢了。 - acerphenix

1

只需尝试使用[[跳转到函数的第一个括号,您可以看到正在编辑的函数名称; 然后输入CTRL-O返回。 :)


这实际上是一个完全合法的建议。虽然它已经在这个答案中被埋没在中间了。 - LondonRob
哦,我没注意到,抱歉~ 顺便说一下,这是我在Stack Overflow上的第一个答案,感谢您的投票 :-) - guo-sj

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接