Показать текущую функцию в строке состояния vim

Я трачу 20% своей жизни на написание кода на vim, почти исключительно на javascript и python. Остальные 80% времени я в основном прокручиваю вверх и вниз свой исходный файл, пытаясь вспомнить, какую функцию я в данный момент редактирую и к какому классу принадлежит эта функция.

Это может быть технически невозможно по причинам, которые я не понимаю, но есть ли плагины vim, которые позволяют строке состояния vim показывать функцию, в которой находится курсор для Python и / или Javascript?

Это будет выглядеть так:

Vim статусная строка с местоположением

Возможно, это уже существует, скажем, в SublimeText. Если это так, я мог бы наконец перестать плакать и переключиться.

Некоторые плагины Vim, которые не предлагают эту функциональность:

Обновить

С момента написания этого вопроса я нашел ctags, который делает то же самое для Си, знает такую ​​информацию. Но как мне заставить его отображаться в строке состояния Vim?

6 ответов

Решение

Вы должны попробовать плагин Tagbar, который основан на 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+F12) или команды, определенной выше.

Вместо того, чтобы отображать имя текущего метода / класса в строке состояния, вы можете просто... перейти к объявлению и вернуться назад.

В Python:

?def<Esc>

или встроенный:

[[<C-o>

В JavaScript:

?fun<Esc>

Это не требует настройки... это не зависит от сторонних инструментов... это не зависит от языка... это легко...

FUNC

lightline.vim а также tagbar

на основе 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

Метаданные о том, где каждая функция находится в определенном файле, собираются и хранятся с помощью инструмента командной строки ctags.

Плагин tagbar для Vim управляет ctags звонки, чтобы показать иерархию документа, редактируемого в данный момент.

Наконец, плагин для авиакомпании поставляется с расширением для tagbar который позволяет отображать текущий тег (т.е. имя текущей функции) в строке состояния Vim.

Это можно настроить, чтобы показать всю иерархию тега, добавив эту строку в ваш .vimrc:

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

который выглядит так:

авиакомпания плюс тег

Вдохновение для этого ответа приходит от этого ответа и комментария по этому вопросу.

Просто попробуй [[для перехода к первой скобке функции, где вы можете увидеть имя функции, которую вы редактируете; Затем введите CTRL-Oвозвращаться. :)

Показать контекст в разделенном окне / строке заголовка

Существуют плагины vim / neovim, которые автоматически показывают контекст вашего курсора относительно функции / метода / случая, в котором вы находитесь.

плагин vim

плагин neovim treeitter

Другие вопросы по тегам