在vim状态行中显示当前功能

时间:2015-11-13 18:00:49

标签: vim ctags

我花了20%的时间在vim中编写代码,几乎完全是javascript和python。 另外80%的时间我主要是在我的源文件中上下滚动,试图记住我正在编辑哪个函数以及该函数属于哪个类。

由于我不明白的原因,这在技术上可能是不可能的,但有没有任何vim插件允许vim状态行显示光标当前用于Python和/或Javascript的功能?

看起来像这样:

Vim status line with location

这可能已经存在于SublimeText中。如果是这样,我可能最终会停止哭泣并进行切换。

某些的Vim插件提供此功能:

更新

自写这个问题以来,我发现ctags哪个对C 做同样的事情就知道这种信息。但是如何让它显示在Vim状态行中?

6 个答案:

答案 0 :(得分:3)

你应该试试Tagbar plugin,这是基于ctags的。如果您检查该链接上的屏幕截图,您会注意到状态行显示当前方法的名称,完全按照您的要求。

插件文档说明了如何设置状态行;以下是我在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 + < kbd> F12 )或上面定义的命令。

答案 1 :(得分:3)

您可以简单地跳转到声明并跳回来,而不是在状态行中显示当前方法/类的名称。

在Python中:

?def<Esc>

或内置:

[[<C-o>

在JavaScript中:

?fun<Esc>

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

func

答案 2 :(得分:2)

有关每个函数驻留在特定文件中的位置的元数据由名为ctags的命令行工具收集和存储。

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

最后,airline插件附带tagbar的扩展名,允许当前标记(即当前函数的名称)显示在Vim状态行中。

这可以配置为通过将此行添加到.vimrc来显示代码的整个层次结构:

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

看起来像这样:

airline plus tagbar

此答案的灵感来自this answer和对this question的评论。

答案 3 :(得分:2)

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

答案 4 :(得分:1)

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

答案 5 :(得分:0)

在拆分窗口/标题行中显示上下文

有 vim/neovim 插件可以自动显示光标的上下文。您所在的函数/方法/案例。

vim 插件

neovim treeitter 插件