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.

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

- Бесплатный Electric Fence доступный почти в любом дистрибутиве,
- Коммерческий Purify http://www.rational.com
- Insure++ http://www.insure.com

Next Previous Contents