В предыдущей главе обсуждались команды 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*’ к этому сообщению и нажав hRETi (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 также переопределяет ключи hSPCi и hDELi для прокрутки по целому экрану, а M-n и M-p — для перемещения к следующему или предыдущему сообщению об ошибке. Вы также можете использовать M-{ и M-} для перемещения вверх и вниз к сообщению об ошибке для другого исходного файла.
Возможности режима Compilation также доступны во второстепенном режиме, называемом Compilation Minor. Он позволяет вам разбирать сообщения об ошибках в любом буфере, а не только в обычном буфере для вывода протокола компиляции. Для включения этого второстепенного режима наберите M-x compilation-minor-mode. Это определит ключи hRETi и 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 hRETi файл hRETi
Запускает GDB как подпроцесс Emacs. Эта команда создает буфер для ввода и вывода GDB и переключает в него. Если буфер GDB уже существует, она просто переключает в этот буфер.
M-x dbx hRETi файл hRETi
Аналогично, но запускает DBX вместо GDB.
M-x xdb hRETi файл hRETi
Аналогично, но запускает XDB, а не GDB. Используйте переменную gud-xdbdirectories для задания каталогов поиска исходных файлов.
M-x sdb hRETi файл hRETi
Аналогично, но запускает SDB, а не GDB.
Некоторые версии SDB не называют в своих сообщениях имена исходных файлов. Когда вы используйте их, у вас должна быть создана правильная таблица тегов (см. Раздел 22.13 [Теги], с. 224), чтобы GUD мог найти функции в исходных файлах. Если вы не обращались к таблице тегов или таблица тегов не содержит одну из функций, вы получите сообщение, говорящее ‘The sdb support requires a valid tags table to work’.2 Если это случилось, создайте в рабочем каталоге правильную таблицу тегов и попробуйте снова.
Источник: Ричард Столмен, Руководство по GNU Emacs

March 19th, 2012
admin
Опубликовано в рубрике
Метки: