Вам нужно подсчитать глубину рекурсивных вызовов ... и затем выбросить исключение, если глубина рекурсивных вызовов достигает определенного порога.
Например:
void TheMethod(object[] otherParameters, int recursiveCallDepth)
{
if (recursiveCallDepth > 100) {
throw new Exception("...."); }
TheMethod(otherParameters, ++recursiveCallDepth);
}
Ctrl + ] - переходят к определению
Ctrl + T - Переход назад из определения.
Ctrl + W Ctrl + ] - Открываются, определение в горизонтальном разделении
Добавляют, что эти строки в vimrc
map <C-\> :tab split<CR>:exec("tag ".expand("<cword>"))<CR>
map <A-]> :vsp <CR>:exec("tag ".expand("<cword>"))<CR>
Ctrl + \ - Открывают определение на новой вкладке
, Высокий звук + ] - Открывают определение в вертикальном разделении
После того, как теги сгенерированы. Можно использовать следующие ключи для меток в и тег из функций:
Ctrl + Left MouseClick
- Переходят к определению
Ctrl + Right MouseClick
- Переход назад из определения
Я инкапсулировал управление тегами в экспериментальный плагин мой.
Относительно разработки C++ в энергии, я уже ответил там : Я использую свой собственный комплект и несколько других плагинов.
Я использую ALT-left и альтернативных правых для выталкивания/продвижения из/в стопку тега.
" Alt-right/left to navigate forward/backward in the tags stack
map <M-Left> <C-T>
map <M-Right> <C-]>
, Если Вы используете hjkl
для перемещения, можно отобразиться <M-h>
и <M-l>
вместо этого.
Другой полезный плагин для разработки C cscope Так же, как Ctags позволяет Вам перейти к определениям, переходам Cscope к вызов функции.
, Если у Вас есть cscope в Вашем ~/bin/каталог, добавьте следующее к своему .vimrc и используйте g^] для движения в функцию вызова (см.: помогите cscope).
if has("cscope")
set csprg=~/bin/cscope
set csto=0
set cst
set nocsverb
" add any database in current directory
if filereadable("cscope.out")
cs add cscope.out
" else add database pointed to by environment
elseif $CSCOPE_DB != ""
cs add $CSCOPE_DB
endif
endif
Почти забыл... Так же, как ctags - необходимо генерировать (и периодически обновлять), база данных. Я использую следующий сценарий
select_files > cscope.files
ctags -L cscope.files
ctags -e -L cscope.files
cscope -ub -i cscope.files
, Где 'select_files' является другим сценарием, который извлекает список C и заголовочных файлов от Make-файла. Таким образом, я индексирую только файлы, на самом деле используемые проектом.
Команда, которую я использую больше всего, является C-], который переходит к определению функции под курсором. Можно использовать его чаще для следования за большим количеством вызовов. После этого C-o принесет Вам назад один уровень, C-i идет глубже снова.
Можно добавить каталоги к ctags поиску. Например, мне создали индекс ctags для Qt4 и имею это в моем .vimrc:
set tags+=/usr/local/share/ctags/qt4
Я нашел необходимая вещь плагина taglist. Это перечисляет все теги, о которых это знает (файлы, которые Вы открыли) в отдельном окне, и делает очень легким переместиться по большим файлам.
я использую его главным образом для разработки Python, но это может только быть лучше для C/C++.
Все вышеупомянутое и...
code_complete: завершенный параметр функции, фрагменты кода, и многое другое.
taglist.vim: браузер Исходного кода (поддерживает C/C++, Java, жемчуг, Python, tcl, sql, php, и т.д.)
Я поместил следующее в мой файл .gvimrc, который ищет дерево тегов в любой точке для поиска файла тегов при запуске gvim:
function SetTags()
let curdir = getcwd()
while !filereadable("tags") && getcwd() != "/"
cd ..
endwhile
if filereadable("tags")
execute "set tags=" . getcwd() . "/tags"
endif
execute "cd " . curdir
endfunction
call SetTags()
Затем я периодически регенерирую файл тегов в верхней части моего исходного дерева с помощью скрипта, который выглядит лайк:
#!/bin/bash
find . -regex ".*\.\(c\|h\|hpp\|cc\|cpp\)" -print | ctags --totals --recurse --extra="+qf" --fields="+i" -L -
Я адаптировал свои плагины энергии в течение двух лет для поддержки достаточно большого проекта C++. Можно смотреть на них.
Они используют ctags и cscsope.
http://www.vim.org/scripts/script.php?script_id=1638
http://www.vim.org/scripts/script.php?script_id=2507
Одна строка, которая всегда идет в моем .vimrc:
set tags=./tags;/
Это будет искать в текущем каталоге «теги» и поднимите дерево к корню, пока оно не будет найдено. Итак, вы можете находиться где угодно в вашем исходном дереве, а не просто в его корне.
Несколько одноименных определений
открывают определение в разбиении, но также делают : tjump
, который либо переходит к определению, либо, если есть несколько определений, предоставляет вам список определений на выбор.