2013-11-14 3 views
1

Я пытаюсь выполнить все определения функций в исходном файле C++, ]] должно быть хорошо, если все функции отступов правильно, как требуется, но это может быть неверно для некоторых исходные файлы, такие как функции внутри пространства имен, имеют дополнительный отступ. Я думаю, поиск следующего символа начала функционального блока, который находится на том же уровне, что и текущий (например, второй скользящий скобок верхнего уровня), будет прекрасным обходным решением. Есть ли такая команда или расширение, которое это делает?Перемещение всех записей функций C/C++ в Vim

+0

ли не прямо ответить на этот вопрос, но вы хотели бы проверить плагин TagBar: http://majutsushi.github.com/tagbar/ – Rich

+1

'foldmethod = syntax' также может быть полезным. – Rich

ответ

2

Vim как универсальный текстовый редактор не имеет глубоких знаний о различных языках программирования. В зависимости от требуемой точности регулярное выражение может уже улавливать наиболее распространенные определения функций. Затем вы можете использовать что-то вроде моего CountJump plugin, чтобы сделать отображения движения из шаблонов.

Другим хорошим источником является подсветка синтаксиса, в частности, складной. Если вы сконфигурируете :setlocal foldmethod=syntax, вы можете использовать встроенные команды навигации по стрелке (например, zj/zk) для навигации.

Для лучшей точности вам нужен внешний инструмент, например ctags, для анализа исходного кода на C и определения имен функций. Плагины, такие как TagBar (уже упоминалось в комментариях) и TagList помогут вам перечислить и перемещаться затем.

1

плагин как TagList или Tagbar (в сочетании с Ctags) может помочь, но вы можете сделать что-то вроде:

:vim /^\s*\w\+\s\+\w\+\s*(.*)/ % | cw 

заполнить окно QuickFix с каждым определением функции в текущем файле.

В качестве альтернативы, по умолчанию python ftplugin поставляется с хорошей общей функцией и красивыми сопоставлениями, которые мы можем перепрофилировать. Поместите следующие строки в ~/.vim/after/ftplugin/cpp.vim:

function! Custom_jump(motion) range 
    let cnt = v:count1 
    let save = @/ 
    mark ' 
    while cnt > 0 
    silent! execute a:motion 
    let cnt = cnt - 1 
    endwhile 
    call histdel('/', -1) 
    let @/ = save 
endfunction 

nnoremap <silent> <buffer> ]] :call Custom_jump('/^\s*\w\+\s\+\w\+\s*(.*)')<cr> 
nnoremap <silent> <buffer> [[ :call Custom_jump('?^\s*\w\+\s\+\w\+\s*(.*)')<cr> 
+0

спасибо. Таким образом, было выбрано множество несвязанных круглых скобок. – Thomson

+0

Я не делаю C++, поэтому у меня нет образца реального мира, чтобы проверить его, но он отлично работал на образце с пространством имен, найденным в Интернете. (hmm ... он будет прыгать на 'else if (' также). Если у вас есть файл с образцом, он будет где-то, чтобы я мог проверить его дальше. – romainl

Смежные вопросы