Next Previous Contents

5. Компаньоны Vi

Обычно 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++ кода.

5.1 Ctags для ESQL

Т.к. 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

5.2 Ctags для Javascript программ, оболочек Korn и Bourne

Этот 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

5.3 Дебаггер gdb

Вы почти наверняка захотите использовать 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.

Инструменты для отслеживания "утечек" памяти -


Next Previous Contents
Используются технологии uCoz