Сборка  и тестирование программ – ЧАСТЬ 1

В предыдущей главе обсуждались команды Emacs, полезные для внесения изменений в программы. Эта глава имеет дело с командами, которые помогают в обширном процессе разработки и сопровождения программ.

23.1  Запуск компиляторов в Emacs

Emacs может запускать компиляторы для недиалоговых языков, таких как Си и Фортран, как  подчиненные  процессы, подавая протокол ошибок в буфер Emacs.  Он также может произвести разбор сообщений об ошибках и показать вам строки исходных текстов, где произошла ошибка.

M-x compile

Асинхронно запускает компилятор под управлением Emacs, выводя сообщения об ошибках в буфер ‘*compilation*’.

M-x grep    Асинхронно запускает grep  под управлением  Emacs, перечисляя  совпавшие строки в буфере ‘*grep*’.

M-x grep-find

Запускает grep через find с предоставленными  пользователем аргументами,

направляя вывод в буфер ‘*grep*’.

M-x kill-compilation

M-x kill-grep

Уничтожает работающие подпроцессы компиляции или grep.

Чтобы запустить make или другую команду компиляции, выполните M-x compile.  Эта команда считывает командную строку оболочки, используя минибуфер,  и затем выполняет эту командную строку в подчиненной оболочке,  помещая вывод в буфер с именем

‘*compilation*’.  В качестве рабочего каталога для выполнения этой команды используется каталог по умолчанию текущего буфера, следовательно,  компиляция производится в этом каталоге.

Когда  считывается командная строка оболочки, появляется  минибуфер,  содержащий командную строку по умолчанию; это команда, которую вы использовали при последнем применении M-x compile.  Если вы наберете просто hRETi, то снова будет использована та же самая командная строка. Для первой M-x compile по умолчанию используется ‘make -k’. Значение по умолчанию берется из переменной compile-command;  если соответствующая команда компиляции для файла является чем-то другим,  не  ‘make -k’,  то может быть полезно иметь для этого файла локальное  значение compile-command  (см.  Раздел 31.2.5 [Переменные файла], с. 351).

Запуск компиляции показывает буфер ‘*compilation*’ в другом окне,  но не выбирает его. Строка режима этого буфера сообщает вам, закончилась ли компиляция, при помощи слов ‘run’  или ‘exit’ в круглых  скобках.  Вы не обязаны  держать этот буфер видимым, компиляция продолжается в любом случае.  Пока компиляция продолжается, в строках режима всех буферов появляется  слово ‘Compiling’.  Если это слово исчезает, компиляция закончена.

Если вы хотите  видеть протокол компиляции по мере его появления, переключитесь в буфер ‘*compilation*’ и переместите точку  в его конец.  Когда  точка расположена в конце, новый вывод процесса компиляции вставляется перед точкой, и она остается в конце. Если точка не находится в конце  этого буфера, она остается на своем месте,  тогда как дальнейший вывод компиляции добавляется в конец буфера.

Если вы установите переменную compilation-scroll-output в значение, отличное от nil,  то буфер компиляции всегда прокручивается, чтобы показывать вывод по мере его появления.

Чтобы  прекратить  процесс компиляции, выполните  команду M-x kill-compilation. Когда  процесс компиляции будет прерван, строка режима буфера ‘*compilation*’ изменится, и в ней будет слово ‘signal’ вместо ‘run’.  Запуск новой компиляции также уничтожает любую работающую компиляцию, так как в одно время может существовать только одна. Однако M-x compile требует подтверждения перед фактическим  уничтожением уже запущенной компиляции.

23.2  Поиск с Grep под Emacs

Точно так же, как вы запускаете из Emacs компилятор, и затем обращаетесь к строкам, где были ошибки компиляции, вы можете запустить grep и затем обратиться к строкам, где были найдены совпадения.  Это работает путем интерпретации сообщений о совпадениях от grep как сообщений об “ошибках”.

Чтобы сделать это, наберите  M-x grep  и введите  командную строку,  указывающую, как нужно запускать grep.  Используйте те же аргументы, которые вы дали бы grep при обычном запуске:   регулярное выражение в формате grep  (обычно в одиночных кавычках, чтобы отменить особый смысл специальных символов оболочки), за которым следуют имена файлов,  в которых можно использовать  шаблоны.  Вывод из grep  идет в буфер

‘*compilation*’. Вы можете обратиться к совпавшимстрокам при помощи C-x ‘ и hRETi,

как к ошибкам компиляции.

Если вы зададите для M-x grep префиксный аргумент, она найдет в окрестности точки тег (см. Раздел 22.13 [Теги], с. 224) и поместит его в команду grep по умолчанию.

Команда M-x grep-find похожа на M-x grep, но предлагает другую командную строку по умолчанию — строку, которая запускает find и grep, так что поиск производится в каждом файле дерева каталогов. Смотрите также команду find-grep-dired, Раздел 28.15 [Поиск в Dired], с. 300.

23.3  Режим Compilation

В буфере  ‘*compilation*’ используется особый основной режим, режим Compilation, основная цель которого — предоставить удобный способ просмотреть строку исходного текста, где случилась ошибка.

C-x ‘    Обратиться к позиции следующего сообщения об ошибке компиляции или сов-

падения, найденного grep.

hRETi             Обратиться к позиции сообщения об ошибке, в которой находится точка.  Эта команда применяется в буфере компиляции.

Mouse-2    Обратиться к позиции сообщения об ошибке, на котором вы щелкнули.

Вы можете обратиться к исходному тексту для любого конкретного сообщения об ошибке, переместив точку в буфере ‘*compilation*’ к этому сообщению и нажав hRET(compilegoto-error).  Или щелкните на этом сообщении об ошибке Mouse-2; тогда вам не обязательно сначала переключаться в буфер ‘*compilation*’.

Чтобы  последовательно  сделать грамматический разбор сообщений  компилятора об ошибках, набирайте C-x ‘ (next-error).  Знак, стоящий после C-x — это обратная кавычка или “акцент грав”, а не обычная одиночная кавычка. Эта команда доступна во всех буферах, а не только в буфере ‘*compilation*’; она показывает  следующее сообщение об ошибке вверху одного окна и текст, в котором находится эта ошибка, в другом окне.

Когда  C-x ‘ используется первый раз после начала компиляции, она передвигается к положению первой ошибки. Последующие использования C-x ‘ продвигают вниз к следующим ошибкам. Если вы обратились к файлу по какому-то сообщению об ошибке с помощью hRETi  или Mouse-2, последующие команды C-x ‘ продвигаются с этого места. Когда C-x ‘ доходит до конца буфера и не может найти больше сообщений, она завершается неуспехом и Emacs выдает ошибку.

C-u C-x ‘ начинает просмотр буфера ‘*compilation*’ сначала. Это один из способов еще раз обработать один и тот же набор ошибок.

Режим Compilation также переопределяет ключи hSPCи hDELдля прокрутки по целому экрану, а M-n и M-p — для перемещения  к  следующему  или предыдущему сообщению об ошибке.   Вы также  можете  использовать M-{ и M-} для перемещения вверх и вниз к сообщению об ошибке для другого исходного файла.

Возможности режима Compilation также  доступны во второстепенном  режиме,  называемом Compilation Minor.  Он позволяет вам разбирать сообщения об ошибках в любом буфере, а не только в обычном буфере для вывода протокола компиляции. Для включения этого второстепенного режима наберите M-x compilation-minor-mode. Это определит ключи hRETи Mouse-2 как в основном режиме Compilation.

Второстепенный режим Compilation работает в любом буфере, если содержимое этого буфера  имеет понятный ему формат.   В буфере  Rlogin (см.   Раздел 30.2.6 [Удаленная машина], с. 329), второстепенный режим Compilation автоматически получает удаленные исходные файлы по FTP (см. Раздел 14.1 [Имена файлов], с. 105).

23.4  Подоболочки для компиляции

Emacs использует для команды компиляции оболочку, но ей указывается,  что она должна быть неинтерактивной. В частности, это означает, что оболочка  начинается  без подсказки. Если вы обнаружите, что буфер ‘*compilation*’ уродуют ваши обычные подсказки оболочки, то это значит, что вы сделали ошибку в вашем файле инициализации  оболочки, установив подсказку, не учитывая условий, когда она не должна появляться. (Файл инициализации может называться ‘.bashrc’, ‘.profile’, ‘.cshrc’, ‘.shrc’ или еще как-нибудь в зависимости от используемой вами оболочки.) Файл инициализации оболочки должен устанавливать подсказку, только если подсказка уже есть. Покажем, как это нужно делать в csh:

if ($?prompt)  set  prompt = …

А так это делается в bash:

if [ "${PS1+set}"  = set  ]

then  PS1=… fi

Могут  быть и другие вещи, которые вы должны делать только в интерактивной оболочке.  Для проверки условия интерактивного запуска вы можете использовать такой же метод.

“Операционная  система” MS-DOS не поддерживает  асинхронные  подпроцессы;  чтобы как-то  обойти этот недостаток,  M-x compile  в MS-DOS запускает команду компиляции синхронно. Как  следствие, вы должны дождаться завершения этой команды до того, как сможете сделать что-то в Emacs. См. Приложение C [MS-DOS], с. 403.

23.5  Запуск отладчиков в Emacs

Библиотека GUD (Grand Unified Debugger1 ) предоставляет интерфейс к различным сим-

вольным отладчикам из Emacs. Мы рекомендуем отладчик GDB, который распространя-

1  Единый отладчик. (Прим. переводчика)

ется свободно, но вы также можете запускать DBX, SDB или XDB, если они у вас есть. GUD может также служить интерфейсом к отладочному режиму Perl, отладчику Python PDB и JDB, отладчику Java.

23.5.1  Запуск GUD

Существует несколько команд для запуска отладчика, каждая соответствует конкрет-

ной программе-отладчику.

M-x gdb hRETфайл hRETi

Запускает GDB как подпроцесс Emacs. Эта команда создает буфер для ввода и вывода GDB и переключает в него. Если буфер GDB уже существует, она просто переключает в этот буфер.

M-x dbx hRETфайл hRETi

Аналогично, но запускает DBX вместо GDB.

M-x xdb hRETфайл hRETi

Аналогично, но запускает XDB, а не GDB. Используйте переменную gud-xdbdirectories для задания каталогов поиска исходных файлов.

M-x sdb hRETфайл hRETi

Аналогично, но запускает SDB, а не GDB.

Некоторые версии SDB не называют в своих сообщениях имена исходных файлов. Когда вы используйте их, у вас должна быть создана правильная таблица тегов (см.  Раздел 22.13 [Теги], с. 224), чтобы GUD мог найти функции в исходных файлах. Если вы не обращались  к таблице тегов или таблица тегов не  содержит одну из функций, вы получите  сообщение,  говорящее  ‘The sdb support  requires a valid tags table to work’.2   Если это случилось, создайте в рабочем каталоге правильную таблицу тегов и попробуйте снова.

Источник: Ричард Столмен, Руководство по GNU Emacs

Похожие посты:

Вы можете оставить комментарий, или ссылку на Ваш сайт.

Оставить комментарий