Обычно 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
Эти команда откроет программу на C++, которая содержит функцию foo_function() и разместит
курсор на первой строке функции foo_function().
Вторая команда, отправит вас на строку в которой определена функция main().
Внутри Vim вы можете перейти к функции введя : (двоеточие) tag < имя функции >как показано ниже:
:tag sample_function
Эта команда разместит курсор на первой строке функции sample_function()
Если вы захотите перейти прямо к функции от строки в файле, которая содержит имя этой функции,
поместите курсор перед именем функции и нажмите CTRL+], это
отправит вас прямо на строку где начинается искомая функция.
// example code
switch(id_number) {
Case 1:
if ( foo_function( 22, "abcef") == 3 )
^
|
|
|
Разместите курсор здесь (перед foo_function) и нажмите CTRL+]
Это отправит вас на начало "foo_function". Чтобы вернуться назад нажмите CTRL+t
Чтобы отправиться назад, на исходную строку, нажмите
CTRL+t. Вы можете нажимать CTRL+t несколько раз
чтобы вернуться в точку где вы начали навигацию.
Таким образом можно "пройти" скозь все функции C/C++ кода.
Т.к. 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.
Инструменты для отслеживания "утечек" памяти -
Бесплатный Electric Fence доступный почти в любом дистрибутиве,
Emanual.ru – это сайт, посвящённый всем значимым событиям в IT-индустрии: новейшие разработки, уникальные методы и горячие новости! Тонны информации, полезной как для обычных пользователей, так и для самых продвинутых программистов! Интересные обсуждения на актуальные темы и огромная аудитория, которая может быть интересна широкому кругу рекламодателей. У нас вы узнаете всё о компьютерах, базах данных, операционных системах, сетях, инфраструктурах, связях и программированию на популярных языках!