Показать текущую функцию в строке состояния vim
Я трачу 20% своей жизни на написание кода на vim, почти исключительно на javascript и python. Остальные 80% времени я в основном прокручиваю вверх и вниз свой исходный файл, пытаясь вспомнить, какую функцию я в данный момент редактирую и к какому классу принадлежит эта функция.
Это может быть технически невозможно по причинам, которые я не понимаю, но есть ли плагины vim, которые позволяют строке состояния vim показывать функцию, в которой находится курсор для Python и / или Javascript?
Это будет выглядеть так:
Возможно, это уже существует, скажем, в 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>
Это не требует настройки... это не зависит от сторонних инструментов... это не зависит от языка... это легко...
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