Обычно Vim используется совместно с другими мощными инструментами такими как ctags и gdb. Ctags для быстрой навигации сквозь миллионы строк "C/C++" кода и gdb для отладки "C/C++" кода. Эта глава посвящена именно этим двум незаменимым инструментам.
Ctags - это самая мощная и нужная команда для написания программ на C, C++, Java, Perl, Korn/Bourne shell scripts или Fortran. Разработчики широко используют ctags для навигации в тысячах функций программ на C/C++. (Смотрите 'man ctags'). Очень важно, чтобы вы научились использовать ctags. Это позволит вам эффективно писать программы на C/C++,Java и т.д. Навигации в море кода - одна из самых важных задач во время разработки программ на C/C++. Использование ctags позволит вам решать эту задачу быстро и эффективно. Ctags - позволяет очень быстро читать код, просматривать функции, перескакивая от одной функции к другой.
Без такой навигации, вы скорее всего заблудитесь в коде ! Ctags - компас для программиста.
Использование ctags :
ctags *.cpp gvim -t foo_function gvim -t main
Внутри Vim вы можете перейти к функции введя : (двоеточие) tag < имя функции >как показано ниже:
:tag sample_function
Если вы захотите перейти прямо к функции от строки в файле, которая содержит имя этой функции, поместите курсор перед именем функции и нажмите CTRL+], это отправит вас прямо на строку где начинается искомая функция.
// example code switch(id_number) { Case 1: if ( foo_function( 22, "abcef") == 3 ) ^ | | | Разместите курсор здесь (перед foo_function) и нажмите CTRL+] Это отправит вас на начало "foo_function". Чтобы вернуться назад нажмите CTRL+t
Т.к. ctags не поддерживают языка Embedded SQL/C (ESQL), то ,для создания тэгов для этого языка, необходим приведенный ниже shell script. ESQL/C - это команды SQL, для управления базой данных,встроенные в C программу. Oracle ESQL/C называется Pro*C и Sybase;для Infomix есть ESQL/C;для PostgreSQL есть "ecpg".
Сохраните этот файл как "sqltags.sh" и выполните chmod a+rx tags_gen.sh.
#!/bin/sh # Программа для создания ctags для ESQL, C++ и C файлов ESQL_EXTN=pc tag_file1=tags_file.1 tag_file2=tags_file.2 which_tag=ctags rm -f $tag_file1 $tag_file2 tags aa=`ls *.$ESQL_EXTN` #echo $aa for ii in $aa do #echo $ii jj=`echo $ii | cut -d'.' -f1` #echo $jj if [ ! -f $jj.cpp ]; then echo " " echo " " echo "***********************************************" echo "ESQL *.cpp не существуют.. " echo "Вы должны сгенерировать *.cpp из файла *.pc " echo "используя Oracle Pro*C пре-компилятор или Sybase" echo "либо Informix esql/c пре-компилятор." echo "А затем перезапустить эту программу" echo "***********************************************" echo " " exit fi rm -f tags $which_tag $jj.cpp kk=s/$jj\.cpp/$jj\.pc/g #echo $kk > sed.tmp #sed -f sed.tmp tags >> $tag_file1 #sed -e's/sample\.cpp/sample\.pc/g' tags >> $tag_file1 sed -e $kk tags >> $tag_file1 done # Теперь обработаем все C++/C файлы, исключая ESQL *.cpp файлы rm -f tags $tag_file2 bb=`ls *.cpp *.c` aa=`ls *.$ESQL_EXTN` for mm in $bb do ee=`echo $mm | cut -d'.' -f1` file_type="NOT_ESQL" # Exclude the ESQL *.cpp and *.c files for nn in $aa do dd=`echo $nn | cut -d'.' -f1` if [ "$dd" = "$ee" ]; then file_type="ESQL" break fi done if [ "$file_type" = "ESQL" ]; then continue fi rm -f tags $which_tag $mm cat tags >> $tag_file2 done mv -f $tag_file2 tags cat $tag_file1 >> tags rm -f $tag_file1 # Чтобы все работало правильно необходимо отсортировать файл с тэгами .... sort tags > $tag_file1 mv $tag_file1 tags
Этот shell скрипт может быть использован для генерации тэгов для очень большого количества программ написанных на JavaScript,PHP/FI скрипты,Korn shell,C shell,Bourne shell и многих других. Это очень "стандартный" модуль.
Сохраните этот файл как tags_gen.sh и выполните chmod a+rx tags_gen.sh.
#!/bin/sh tmp_tag=tags_file tmp_tag2=tags_file2 echo " " echo " " echo " " echo " " echo " " echo "Генерируем тэги для ...." while : do echo " Введите расширение файлов, для которых вы хотите сгенерировать тэги." echo -n " Расширения файлов должны быть заданы как sh, js, ksh, etc... : " read ans if [ "$ans" == "" ]; then echo " " echo "Неверный ввод. Попробуйте еще раз!" else break fi done \rm -f $tmp_tag aa=`ls *.$ans` for ii in $aa do jj=`echo $ii | cut -d'.' -f1` #echo $jj cp $ii $jj.c ctags $jj.c echo "s/$jj.c/$ii/g" > $tmp_tag2 sed -f $tmp_tag2 tags >> $tmp_tag \rm -f tags $jj.c done sort $tmp_tag > tags \rm -f $tmp_tag $tmp_tag2
Вы почти наверняка захотите использовать gdb (смотрите 'man gdb') вместе с Vim. Отладка - один из наиболее сложных и трудоемких процессов в программировании.
Чтобы использовать gdb, вы должны компилировать программу с опцией -g3. Например:
gcc -g3 foo.c foo_another.c sample.c
Чтобы легко настроить псевдонимы, сделайте следующее -
Настройте псевдоним в вашем:
~/.bash_profile
alias gdb='gdb -directory=/home/src -directory=/usr/myname/src '
Выполните -
gdb foo.cpp
gdb> dir /hom2/another_src
Это добавит некоторые файлы к пути поиска
gdb> break 'some_class::func<TAB><TAB>
Это позволит дополнять имена функции -
gdb> break 'some_class::function_foo_some_where(int aa, float bb)'
Двойное нажатие TAB приведет к автоматическому завершению командной строки, что сохранит вам массу времени.
Чтобы получить помощь во время работы -
gdb> help
Выдает на экран помощь
gdb> help breakpoints
Выдает более детальную помощь о breakpoints.
Для установки breakpoints и входа в отладку
unixprompt> gdb exe_filename
gdb> b main
Это поместит breakpoint на функции main()
gdb> b 123
Это поместит breakpoint на 123й строке текущего файла
Чтобы проанализовать core используйте -
unixprompt> gdb exe_filename core
gdb> bt
Начинает трассировку тех строк программы где произошла ошибка
gdb> help backtrace
Выдает более детальную помощь о режиме backtrace.
Вы также можете использовать GUI версию gdb называемую xxgdb.
Инструменты для отслеживания "утечек" памяти -