Данный файл является частью Руководства по TADS для авторов игр.
Copyright © 1987 - 2002 Майкл Дж. Робертс
(Michael J. Roberts). Все права защищены.
Руководство было преобразовано в формат HTML Н. К. Гайем (N. K. Guy), компания tela design.
Перевод руководства на русский язык - Валентин Коптельцев
Приложение E
С появлением мультимедийной версии TADS (HTML-TADS) Майкл Робертс включил в состав дистрибутива платформы мощный отладчик - программу TADS Workbench (в несколько вольном переводе Мастерская TADS). Первоначально у нее было существенное ограничение - она не содержала встроенного редактора, однако в последних версиях этот недостаток исправлен. Данная глава посвящена основам работы в Мастерской TADS.
Однако прежде, чем начать описание собственно функций интегрированной среды разработки, коротко остановимся на том, что такое отладчик.
Сам термин "отладчик" не совсем корректен, поскольку описывает не столько функционал программы, сколько то, для чего ее обычно используют. К сожалению, отладчики не способны самостоятельно отыскивать и устранять ошибки в коде вашей программы, как это вроде бы следует из названия; скорее они представляют собой набор инструментов, облегчающих эту задачу для программиста (то есть вас).
Собственно, отладчик позволяет вам детально анализировать состояние программы в ходе ее выполнения. Используя отладчик, можно выполнять эту программу построчно, отслеживая каждое ее действие. Вы также можете задать так называемые точки останова, которые обеспечат приостановку выполнения программы на определенных строках; эти точки можно, в частности, использовать для анализа того, когда и почему выполняются (или не выполняются) определенные строки кода. Вы также можете просматривать значения переменных и свойств на каждом шаге выполнения программы и даже менять эти значения.
Если вы только начали изучать TADS, то, возможно, отладчик поможет вам лучше понять принципы работы системы. Например, при пошаговом выполнении вы сможете увидеть, как происходит вызов функций в вашей программе, как работает механизм наследования и другие вещи, которые могут поначалу показаться непонятными даже после прочтения документации.
Когда вы запустите Мастерскую TADS в первый раз после ее установки, на экране появится окно приветствия со следующими органами управления:
кнопкой Create a new project from scratch (создать новый проект с нуля);
кнопкой Open a project (открыть существующий проект);
кнопкой Re-open the last project (открыть последний проект);
флажком Show this dialog again the next time you run TADS Workbench (показать это окно при следующем запуске Мастерской TADS). По умолчанию данный флажок выбран. Если его сбросить, при последующих запусках программы окно приветствия отображаться не будет. Чтобы включить его снова, потребуется включить соответствующую опцию в окне настроек программы.
кнопкой Close (закрыть), при нажатии на которую программа прекращает свою работу.
При выборе кнопки создания проекта с нуля открывается основное окно программы, на фоне которого высвечивается диалог ассистента по созданию новой игры. Этот диалог информирует пользователя, что поможет создать ему новую игру на основе несложного шаблона, и что сам по себе этот шаблон не очень интересен, но позволит сразу же скомпилировать игру. Далее содержится предостережение о том, чтобы пользователь не использовал этого ассистента, если он собирается открыть существующую игру. Внизу диалогового окна расположена (неактивная) кнопка Назад и кнопка Далее, которую и следует нажать (ну, или кнопку Отмена, если пользователь передумал работать с ассистентом).
В следующем окне игрок может назначить папку, в которой будут размещаться файлы его игры (настоятельно не рекомендуется использовать для этого системные папки TADS), а также назначить имя для основного файла. Делается это нажатием кнопки Browse (пролистать), по которому открывается стандартное диалоговое окно операционной системы для выбора файла (единственная особенность состоит в том, что имя файла можно ввести в соответствующем поле вручную). Файлу исходного кода TADS-игры автоматически присваивается расширение .t.
После выбора кнопки Далее пользователь может аналогичным образом назначить местоположение и имя для файла скомпилированной игры. По умолчанию оно совпадает с именем файла исходного кода, однако расширение заменяется на .gam.
После этого пользователю предоставляется возможность выбрать шаблон для вновь создаваемого файла игры. Можно выбрать из трех вариантов:
В последнем интерактивном окне можно задать информацию об игре: ее название, имя и электронную почту автора, а также короткое описание. В заключение остается нажать кнопку "Готово", после чего откроется основное окно программы, а в нем - только что созданный файл игры (при этом библиотеки, включенные директивой include, открыты не будут).
В каталоге с игрой будут созданы файлы с расширением .tdc и именами, соответствующими именам основного исходного файла и файла скомпилированной игры. Если имена файлов скомпилированной игры и исходного совпадают, будет создан один файл .tdc.
Если в окне приветствия выбрать кнопку открытия существующего проекта, можно будет выбрать файл существующей игры (один из трех типов - с исходным кодом (расширение .t), файл игры (.gam) или файл настроек отладки .tdc - последний создается автоматически). Если открыть файл с исходным кодом, программа попросит указать имя и расположение файла скомпилированной игры, после чего создаст файл настроек.
При выборе кнопки открытия последнего проекта в основном окне программы автоматически откроется тот проект, с которым пользователь работал в прошлый раз (при этом будут восстановлены и пользовательские настройки для этого проекта).
Как вы, наверное, уже поняли из предыдущего раздела, "Мастерская TADS" изначально "не заточена" под создание русскоязычной игры (все поставляемые в дистрибутиве шаблоны англоязычные), поэтому, если вы начинаете работу над игрой с нуля, рекомендуется выполнить следующие подготовительные шаги.
#define USE_HTML_STATUS /* Определение, необходимое для правильного форматирования переноса строк в HTML-TADS */ #include <advr.t> /* включить файл с основными определениями объектов для текстовых квестов (русская версия) */ #include <generator.t> /* включить файл с генератором падежных форм - доступен, начиная с версии 26 библиотек RTADS */ #include <stdr.t> /* включить файл определений стандартных функций, вызываемых при старте (русская версия) */ #include <errorru.t> /* включить файл с русскими сообщениями об ошибках */ startroom: room /* по умолчанию, игра начинается в комнате с названием startroom */ ;
После этих шагов ваша игра может быть скомпилирована.
При запуске программы на самом деле откроются сразу два окна: одно (активное при старте) - собственно окно "Мастерской TADS" (которое дальше будем называть рабочим окном), другое - окно проигрывателя, в котором вы в ходе работы над своей игрой сможете увидеть ее в том виде, в каком она предстанет глазам игрока.
По умолчанию в рабочем окне присутствуют три вкладки: с главным файлом исходного кода игры; вкладка "Debug Log" (журнал отладки), в которую выводятся информационные сообщения и сообщения об ошибках при компиляции игры и ее отладке; наконец, вкладка с краткой справочной информацией (англоязычной).
Для начала попробуйте скомпилировать и запустить игру в режиме отладки. Для этого выберите пункт Compile and Run (компилировать и запустить) меню Build. Если в ходе компиляции возникнут проблемы, информация о них будет выведена во вкладке журнала отладки, при этом данная вкладка станет активной. Сообщение о каждой ошибке будет содержать ее код (по которому можно справиться о ней в соответствующем разделе документации), краткое англоязычное описание, а также указание на файл и номер той строки этого файла, к которой относится сообщение. При двойном щелчке по сообщению об ошибке файл с ошибкой будет открыт в рабочем окне на нужном месте. Если же в коде игры синтаксических ошибок нет, игра будет скомпилирована и начнется ее выполнение в окне проигрывателя, которое автоматически станет активным. При этом в рабочем окне вкладка журнала отладки закроется, вместо нее появится вкладка "Stack" (цепочка вызовов), о которой подробнее будет рассказано далее.
Как уже говорилось выше, при первом открытии нового проекта для редактирования будет доступен только главный файл исходного кода игры. Выбрать для редактирования другие файлы можно через пункт Open Game Source File (открыть файл с исходным кодом игры) меню File (файл). При выборе этого пункта откроется список всех файлов с исходным кодом. Однако следует учесть, что этот список будет сформирован только после первой успешной компиляции игры. До этого момента там будут присутствовать только главный файл исходного кода, а также стандартные англоязычные библиотеки TADS adv.t и std.t (даже если в вашей игре они не используются). Если по каким-то причинам вам нужно отредактировать какой-то другой файл, не включенный в код игры директивой #include, воспользуйтесь командой Open File (открыть файл) того же меню File.
При (корректном) завершении работы Мастерской программа запоминает параметры проекта и, когда вы вновь вернетесь к работе над своей игрой, откроет те же файлы, которые у вас были открыты в последний раз.
Встроенный редактор по своей сути и приемам работы не слишком отличается от аналогичных программ, распространенных среди пользователей Windows (например, "Блокнота"). Однако есть некоторые особенности, на которые стоит сразу обратить внимание.
Первая из них - это подсветка синтаксиса. Благодаря ей анализировать исходный код игры и искать ошибки становится намного проще (особенно это касается таких ошибок, как пропущенные замыкающие кавычки, точки с запятой и фигурные скобки). По умолчанию основные функциональные элементы языка программирования выделяются следующими цветами:
Второй важный момент - это автоматическое форматирование вводимого текста. По умолчанию редактор настроен так, что пытается "интеллектуально" выбирать отступы строк, исходя из собственных представлений о читабельности кода; для некоторых пользователей это может оказаться неудобным. Самостоятельность программы в этом вопросе можно ограничить, выбрав пункт Options меню Tools. В левой части открывшегося диалогового окна, содержащего древовидную структуру, выберите категорию Text Formatting, подпункт Indenting. После этого в правой части вы сможете настроить величину отступа (Indent Size) и количество пробелов, соответствующих символу табуляции (Tab Size). При сброшенном флажке Use tabs to represent runs of whitespace (используйте табуляцию для отображения последовательностей пробелов) символы табуляции будут автоматически преобразовываться в последовательности пробелов соответствующей длины, а при выбранном флажке будут оставаться без изменений. В ниспадающем списке Auto-Indent (авто-отступ) имеется три значения: Syntax-based (именно оно действует по умолчанию) - тот самый "интеллектуальный" выбор отступов; Off - отступы отключены (при переводе строки курсор вернется в начало новой строки); Same as previous line - у новой строки отступ будет таким же, как у предыдущей. При выборе флажка Auto-Format Comments (автоформат комментариев) автоматически будет осуществляться следующее преобразование комментария: при вводе
/* Ввели многострочный комментарий */
строки будут объединяться, а в начале каждой из промежуточных строк будет автоматически поставлена звездочка:
/* Ввели многострочный комментарий * */
Если вы пишете развернутые комментарии к коду, это действительно удобно, однако бывают случаи, когда надо просто временно закомментировать несколько строк кода - в этом случае автоматическое форматирование будет нежелательным.
Дать рекомендации относительно того, какие именно настройки автоматического форматирования будут оптимальными, невозможно - здесь все зависит от конкретного пользователя. Поэтому просто поэкспериментируйте и выберите те, которые будут наиболее удобны именно для вас.
Одновременно можно редактировать сразу несколько файлов, они будут размещаться в отдельной вкладке каждый. Сверху у каждой вкладки имеется ярлычок, содержащий имя соответствующего файла. Если вы внесли в файл изменения, но еще не сохранили их, после имени файла в ярлычке будет высвечиваться звездочка.
Когда вы редактируете исходный код игры, то для того, чтобы проверить поведение игры после очередной корректировки, ее необходимо перекомпилировать. Если эта игра в данный момент проигрывается в окне интерпретатора, будет выдан запрос Compile requires that the game be terminated. Do you wish to terminate the game and proceed with compilation? (компиляция требует завершения игрового сеанса. Хотите завершить игру и продолжить компиляцию?) с вариантами ответа "Да" или "Нет". Если при перекомпиляции обнаружится, что имеется хотя бы один файл с исходным кодом, который был изменен, но не сохранен, будет выведено диалоговое окно Save changes to <имя файла с полным путем> (сохранить изменения в...) со следующими вариантами ответа:
Save (сохранить) - сохраняет текущий измененный файл. Если далее встретится еще один файл с измененным, но не сохраненным содержимым, этот запрос будет выдан снова;
Save All (сохранить все) - будут сохранены изменения во всех файлах, запрос более выдаваться не будет;
Don't Save (не сохранять) - отказ от сохранения текущего файла, для остальных измененных файлов запрос будет выдаваться снова;
Save None (не сохранять ничего) - отказ от сохранения всех файлов, запрос больше выдаваться не будет;
Cancel (отказ) - отказ от компиляции.
Основные инструменты отладки в Мастерской - это пошаговое выполнение программы, средства просмотра и изменения значений переменных, а также окно стека вызовов. Рассмотрим их здесь коротко.
В случае, если игра реагирует на команды пользователя не так, как предполагал ее автор, огромную помощь может оказать пошаговое отслеживание выполнения программы (или режим отладки). В этом режиме при каждом нажатии пользователем определенных клавиш выполняется одна инструкция. Строка кода, которая должна быть выполнена при очередном нажатии клавиши, помечается желтой стрелкой в ее начале.
Переход в режим пошагового выполнения может осуществляться двумя способами. Первый - это выбор команды Break into Debugger (перейти в режим отладки) меню Debug (отладка). Система при этом ведет себя точно так же, как если бы в пошаговом режиме была введена пустая команда. При этом в пошаговом режиме можно просмотреть весь цикл обработки команды.
Недостатком такого способа активации режима отладки является то, что пошаговый прогон в этом случае займет достаточно много времени (сначала придется пройти полный цикл обработки пустой команды, и только после этого можно будет проверить работу той команды, которая, собственно, нуждается в отладке, причем придется проходить в том числе и самые ранние стадии обработки, как то считывание введенной строки, подбор глагола и т. п., которые, как правило, не являются основным источником ошибок). Для более эффективной отладки пошаговый режим можно активировать, установив точку останова в той функции (методе), работа которой требует проверки. Точка останова включается и отключается путем подведения курсора в нужную строку с последующим нажатием клавиши F9. Активная точка останова помечается красным кружком вначале соответствующей строки. Точку останова нельзя установить в местах кода, не предусматривающих пошагового выполнения инструкций (например, в комментариях, заголовках функций и объектов, объявлениях перменных, пустых строках и строках, содержащих только служебные символы). При попытке установить точку останова в такой строке эта точка будет автоматически перенесена на ближайшую "законную" строку. В ходе выполнения программы при передаче управления на строку с активной точкой останова автоматически будет активирован пошаговый режим. Число точек останова в программе не ограничено. Просмотреть весь список точек останова можно при помощи команды Edit Breakpoints (редактировать точки останова) меню Debug (отладка).
Для управления выполнением программы в пошаговом режиме служат следующие команды меню Debug:
Если пользователь не менял настроек по умолчанию, то в пошаговом режиме в левом нижнем квадранте основного экрана программы высвечивается окно с отслеживаемыми переменными и/или выражениями (заголовок окна Watch Expressions), а в правом нижнем квадранте - окно локальных переменных (заголовок Locals).
В окне локальных переменных имеется две вкладки: собственно Locals, в которой отображается информация обо всех локальных переменных, определенных в той функции (методе), которая выполняется в данный момент, и self, посвященная одноименному системному объекту. Обе вкладки устроены одинаково: слева располагается имя переменной, справа - ее значение. Объект self представлен в виде древовидной структуры, содержащей значения всех его свойств (и их подсвойств). В процессе пошагового прогона игры у пользователя есть возможность самому задавать значения переменных - для этого достаточно щелкнуть мышью в правом столбце (с заголовком Value).
Окно отслеживаемых переменных и выражений в принципе устроено точно так же. Сюда автор игры может помещать переменные, выражения, объекты и их свойства, значения которых ему необходимо иметь перед глазами в ходе всего процесса пошагового прогона. Этим и определяются те небольшие отличия, которые имеются по сравнению с окном локальных переменных: вкладок здесь не две, а четыре (это позволяет лучше организовать работу при наличии большого количества отслеживаемых переменных - если размещать их в едином списке, его придется постоянно пролистывать вперед-назад, что неудобно). Кроме того, редактировать здесь можно не только правую колонку (со значениями), но и левую (с идентификаторами переменных, объектов и выражений). Чтобы поместить переменную в данное окно, необходимо найти ее идентификатор в исходном коде, поместить на него курсор и выбрать команду Add to Watch Expressions (отслеживать значения) меню Debug.
Пользователь имеет также возможность разово проверить значение того или иного выражения без постоянного его отслеживания. Для этого нужно поместить курсор в идентификатор/выражение, значение которого требуется проверить, и выбрать команду Evaluate (вычислить значение) меню Debug. Если выражение простое (например, переменная или свойство объекта), можно просто выделить его в тексте целиком - тогда рядом с курсором мыши появится ярлычок-подсказка, в котором будет указано значение выделенной переменной.
Вкладка окна стека вызовов (Stack) автоматически добавляется при перекомпиляции и запуске игры в Мастерской. В этом окне (только в режиме отладки) отображаются названия функций/методов, выполняемых в данный момент, со значениями аргументов в момент вызова. При этом чем больше уровень вложенности вызываемой функции/метода, тем выше ее название будет стоять в списке в окне стека вызовов. Т. е. если вы отлаживаете программу, в которой вызывается функция a(), которая, в свою очередь, вызывает функцию b(), а та - функцию c(), то в окне стека вызовов мы увидим следующее:
c()
b()
a()
При этом напротив функции, выполняющейся в данный момент, будет отображаться желтая стрелка.
Окна журнала отладки, стека вызовов, локальных и отслеживаемых переменных, а также справки являются "плавающими". Это означает, что вы можете перемещать их и изменять их размер, как у обычных окон, а также "пристыковывать" их к краю основного окна Мастерской. В пристыкованном состоянии такое окно так и останется прикрепленным к краю при изменении размера и перемещении основного окна. Кроме того, плавающие окна всегда располагаются поверх обычных окон с исходным кодом.
Плавающее окно может находиться в одном из трех состояний:
Переключение режимов отображения плавающего окна можно осуществить несколькими способами. Чтобы перевести его в режим обычного окна (или вывести его
из этого режима), наведите курсор на его область заголовка (или - в пристыкованном состоянии - боковую панель для перетаскивания) и нажмите правую кнопку
мыши. В раскрывшемся меню сбросьте галочку напротив пункта Docking Mode (режим плавающего окна) для того, чтобы окно стало обычным (или
установите галочку для обратной операции). При выборе в этом меню пункта Dock (пристыковать) окно вернется в свое последнее пристыкованное
состояние. Если окно уже пристыковано, этот пункт переименовывается в Undock (отстыковать) и выполняет обратное действие. Кроме того,
отстыковать окно можно двойным щелчком по его боковой панели, либо перетащив его за эту панель подальше от краев основного окна программы. Наконец,
чтобы пристыковать окно в нужном вам месте, перетащите его за область заголовка к краю основного окна. Если при этом держать нажатой клавишу
При перетаскивании плавающего окна в момент, когда вы приближаетесь к возможному положению для его фиксации, на экране появится серая рамка, показывающая расположение окна при будущем пристыковывании. Если цветовая схема вашего компьютера предусматривает отображение фона основного окна Мастерской в сером цвете, эту рамку не всегда легко разглядеть; простым решением будет максимизировать размер окон редактора с исходным кодом, чтобы весь фон был заполнен цветом этого окна (чаще всего белым). Механизм пристыковывания настроен так, что плавающее окно "охотнее" фиксируется к верхней или нижней кромке окна Мастерской, чем к боковым. Поэтому при стыковке к боковым кромкам необходимо перемещать указатель мыши ближе к середине соответствующей кромки.
Вы можете разместить два и более плавающих окон на одной и той же кромке главного окна программы. Сделать это можно двумя способами.
Первый способ - поделить кромку между окнами. Для этого необходимо пристыковать сначала одно окно, а следующее пристыковывать поверх него. При этом кромка разделится пополам, после чего вы сможете распределить занимаемое окнами пространство, сдвигая при нажатой левой кнопке мыши разделительную линию между ними. Последующие окна на ту же кромку пристыковываются аналогично.
Второй способ - размещение окон друг над другом (либо рядом друг с другом), при этом оба окна будут иметь длину (высоту), равную длине (высоте) кромки, к которой они пристыкованы. Для этого второе окно после пристыковки первого надо подвести так, чтобы указатель мыши оказался внутри рамки первого окна.
Мастерская TADS хранит все настройки для конкретной игры в так называемых конфигурационных файлах. Для каждого проекта создается отдельный конфигурационный файл. Он располагается в том же каталоге, что и скомпилированный файл игры, и совпадает с последним по названию (только с расширением TDC, а не GAM). В конфигурационном файле сохраняется информация о расположении и размерах окон редактора, установленных точках останова, опциях и параметрах компиляции и т. п. Соответственно, при удалении данного файла все настройки будут утеряны.
При загрузке существующей игры Мастерской можно указать файл TDC вместо GAM (с точки зрения загрузки игры эти файлы абсолютно равноценны). Пользователю не требуется ни специально создавать, ни редактировать вручную файл TDC - все нужные действия осуществляются автоматически через Мастерскую.
В качестве встроенного редактора Мастерская использует программу с открытым кодом Scintilla. У проекта Scintilla есть собственный сайт с большим объемом документации. К сожалению, почти вся эта документация предназначена для программистов, которые хотят "встроить" Scintilla в свои проекты, а не для "конечных пользователей", которым эта программа нужна в качестве редактора. К счастью, все основные операции по редактированию - перемещение курсора, выбор текста мышью, ввод символов, вырезание и вставка и т. п. - в Scintilla выполняются примерно так же, как в большинстве текстовых редакторов под Windows. Выполнение этих операций не должно вызвать у вас трудностей, поэтому останавливаться на них мы не будем. Однако Scintilla умеет несколько больше, чем обычный текстовый редактор: это текстовый редактор для программистов. В связи с этим здесь есть ряд функций, которые можно назвать развитыми или странноватыми (обычно подходят оба этих определения). О них стоит поговорить подробнее.
Настройка клавиатуры
Есть много вещей, отличающих специализированный текстовый редактор для программиста от обычного, но одна из важнейших - это возможность индивидуальной настройки. Программисты печатают очень много и поэтому обычно высоко ценят эффективность - не только в той программе, которую они пишут, но и в процессе ее написания. Желание максимально сократить объем рутинной работы для них вполне естественно. Одним из путей добиться этого является подстройка клавиатуры под ваш стиль работы (а не наоборот). Таким образом, возможность для пользователя легко изменить "поведение" клавиатуры - одно из основных требований к редактору для программистов.
В Мастерской TADS настраивать клавиатуру можно не только для редактора, но и для всей интегрированной среды разработки. Подробнее процесс настройки описан здесь.
Клавиши управления курсором
Scintilla предлагает несколько вариантов использования основных клавиш управления курсором. Выбор того или иного варианта - во многом дело вкуса или привычки.
Назначение команды для той или иной клавиши осуществляется в рамках общей настройки, специальной опции для этого нет.
Переход к началу строки: обычно эта команда "повешена" на клавишу Home. Scintilla предлагает следующий набор родственных команд: перемещение к началу строки (Edit.Home), к первому символу в строке, отличному от пробела/табулятора (Edit.IndentHome). Если строка не помещается на экране и автоматически переносится в окне редактора, то команда Edit.HomeDisplay переместит курсор не к началу всей длинной строки, а к началу текущего перенесенного на экране отрезка. Действие Edit.HomeWrap будет аналогичным, с той лишь разницей, что если курсор уже находится в начале перенесенного отрезка, он будет переведен к началу всей длинной строки. Команда Edit.IndentHomeWrap представляет собой комбинацию Edit.IndentHome и Edit.HomeWrap.
Переход к концу строки: чаще всего для этого действия используется клавиша End. Команда Edit.LineEnd перемещает курсор к концу строки. Edit.LineEndDisplay перемещает его к концу перенесенного отрезка строки на экране (для длинных строк, которые не помещаются в окне редактора). Действие команды Edit.LineEndWrap аналогично действию предыдущей, за исключением того, что она перемещает курсор к концу всей длинной строки, если он уже стоит в конце одного из перенесенных отрезков.
Переход на страницу вверх, вниз (клавиши PageUp и PageDown): команды Edit.PageUp и Edit.PageDown перемещают текст в окне редактора на страницу (т. е. примерно на высоту экрана) вверх или вниз соответственно, перемещая при этом и курсор. Команды Edit.StutteredPageUp и Edit.StutteredPageDown сначала смещают курсор на первую (или, соответственно, последнюю) строку из видимых на экране; если курсор уже стоит в этой строке, они действуют аналогично Edit.PageUp и Edit.PageDown.
Редактор поддерживает так называемые языковые режимы - фактически наборы настроек разметки текста, характерные для разных языков программирования. Набор настроек выбирается для файла автоматически на основе расширения этого файла. Например, файлы с расширением ".t" или ".h" будут считаться файлами на языке TADS, а с расширением ".htm" или ".html" - файлами HTML. Однако пользователь может в любой момент изменить языковой режим для файла, используя подменю Language Mode (языковой режим) меню Edit. При этом программа запомнит выбранный вручную режим для данного файла, и при последующем его открытии этот режим будет устанавливаться автоматически.
Изначально редактор Scintilla поддерживает наборы настроек для десятков языков программирования и позволяет добавлять неограниченное число пользовательских наборов. В Мастерской с целью упрощения пользовательского интерфейса оставлена поддержка только для тех языков, которые могут пригодиться пользователям TADS - это, естественно, сам язык TADS, а также HTML, XML и язык сценариев TADS.
Языковой режим влияет прежде всего на подсветку синтаксиса и автоматическое форматирование при вводе.
Средства быстрого форматирования отступов и комментариев
Помимо автоматического форматирования отступов при вводе, вам может понадобиться заново отформатировать фрагменты уже существующего кода (например, когда вы переносите инструкции копированием из одной функции в другую, или когда добавляете условный оператор для существующего набора инструкций). Чтобы выполнить такое форматирование, выберите нужный блок текста и нажмите комбинацию клавиш Ctrl+I. (В конфигурации по умолчанию так вызывается команда Ext.Edit.SyntaxIndent; если вы меняли настройки программы, то, возможно, у вас она будет вызываться другой комбинацией клавиш). Эта команда отформатирует весь выбранный фрагмент текста точно так же, как если бы вы вводили его вручную.
Об автоматическом форматировании комментариев уже говорилось выше. Здесь необходимо только добавить информацию о некоторых дополнительных правилах в работе данного инструмента: формат строк, начинающихся с символа "." (или с "*."), изменяться не будет; звездочки, расположенные рядом с открывающими (/*) или закрывающими (*/) комментарий символами, считаются частью "рамки" вокруг комментария и также не меняются. Как и для отступов, форматирование комментария можно произвести задним числом. Для этого следует воспользоваться комбинацией клавиш Ctrl+Q. В "умолчальной" конфигурации ей соответствует универсальная команда Edit.FillParagraph, которая автоматически выбирает, что подлежит форматированию - отступы в коде, комментарии или строка (в зависимости от текущего положения курсора). Впрочем, если в момент ее вызова выбран фрагмент текста, то ее действие полностью аналогично команде Ext.Edit.SyntaxIndent. Перенос строк осуществляется в соответствии с установленным значением максимального количества символов в строке, однако для отдельно взятой операции форматирования его можно изменить, предварительно указав количество повторов команды. Любое количество, большее единицы, будет восприниматься как максимальное число символов в строке. Если указать ноль, то весь участок текста будет вытянут в одну длинную строку.
Примечание переводчика: справедливости ради, мне так и не удалось заставить данную функцию работать корректно с использованием механизма повторов. Возможно, это баг, либо я не разобрался до конца в механизме ее работы.
Существует также специализированная команда для форматирования комментариев - Ext.Edit.FormatComment, однако по умолчанию ей не соответствует никакой комбинации клавиш. Связано это с тем, что для подавляющего большинства пользователей возможностей универсальной команды форматирования Edit.FillParagraph совершенно достаточно, и им нет необходимости запоминать еще одну комбинацию клавиш.
Средства форматирования текстовых строк
Исходный код на TADS, как правило, содержит много "закавыченного" текста, поскольку написание текстовой игры предполагает (как бы банально это ни звучало) ввод больших объемов текста. Часто эти текстовые фрагменты растягиваются на несколько строк, и каждый раз при их редактировании вам потребуется заново проставлять переносы строк с тем, чтобы текст не вылезал за ширину экрана. Вместо того, чтобы делать это вручную, можно вызвать команду Edit.FillParagraph комбинацией клавиш Ctrl+Q. При этом будут заново расставлены переносы строк с учетом отступов. Если курсор располагается внутри вложенного строкового выражения, форматирование будет применено не только к этому выражению, но и ко всей содержащей его строке. При форматировании строк переносы внутри вложенного выражения устанавливаться не будут. Кроме того, не будет устанавливаться перенос строки для пробела в конце строки (установка пробела в конце строки - обычный способ для того, чтобы воспрепятствовать "слипанию" выводимого следующим оператором текста с текущей строкой). Кроме того, при автоматическом форматировании строки распознаются последовательности символов, "отвечающие" за вставку переноса строк: \n, \b, <br>, <p>, </p>. Соответствующие символы переноса строк сохраняются.
Для этих же целей существует и специализированная команда - Ext.Edit.FormatString, однако в конфигурации по умолчанию ей не соответствует никакой комбинации клавиш. Связано это с тем, что подавляющее большинство пользователей универсальная команда форматирования полностью устраивает.
Редактор позволяет помечать место в файле с исходным кодом, чтобы в любой момент можно было быстро к нему вернуться. Это осуществляется при помощи так называемых "закладок". В редакторе существует три способа работы с закладками.
Пролистывание: первый способ - это просто пометить несколько мест в коде и затем последовательно пролистывать закладки для того, чтобы вернуться к одной из этих точек.
Чтобы установить закладку, поместите курсор в то место, которое хотите пометить, и нажмите Alt+/ (это сочетание соответствует команде Edit.ToggleBookmark в стандартной раскладке). Для пролистывания установленных закладок используйте сочетание клавиш Ctrl+Shift+J (соответствует команде Edit.JumpToNextBookmark). При этом курсор перескочит к следующей определенной пользователем закладке. Если закладка определена в другом файле, курсор перейдет в этот файл. Когда будет достигнута последняя закладка, курсор вернется к первой закладке в последовательности.
Именованные закладки: второй способ - присваивать закладкам названия. В этом случае вместо того, чтобы перелопачивать все закладки, можно просто обратиться к нужной по названию. Название закладки ограничено одной латинской буквой (от A до Z), таким образом, можно определить до 26-ти именованных закладок. Чтобы установить именованную закладку, нажмите Alt+Shift+/ (соответствует команде Edit.SetNamedBookmark) и наберите букву, которая будет с ней ассоциироваться. Чтобы перейти к именованной закладке, нажмите Ctrl+J (Edit.JumpToNamedBookmark) и наберите ее букву-имя.
Во всех остальных отношениях именованные закладки ничем не отличаются от безымянных (в частности, они также перебираются при перелистывании).
Стек: третий способ - так называемый стек, термин, заимствованный из программирования, и обозначающий выборку данных в обратном порядке по сравнению с тем, как они были записаны в хранилище (последние становятся первыми). Этот способ наиболее эффективен в случаях, если вам приходится просматривать код по взаимосвязанным ссылкам, ведущим в разные части одного файла, а то и в разные файлы. В этом случае может оказаться полезным впоследствии "распутывать клубок" в обратном порядке (возможно, периодически отвлекаясь при этом на другие ссылки). Для того, чтобы обеспечить стековый механизм работы, при установке закладок в системе запоминается порядок их определения, и используется команда перехода к самой "новой" закладке. Закладка добавляется обычным способом, переход к последней установленной закладке осуществляется при нажатии Alt+J (Edit.PopBookmark). При повторной активации этой команды осуществляется переход к предпоследней закладке и т. д.
Для удаления закладки необходимо перевести курсор в строку, в которой она определена, и нажать Alt+/ (Edit.ToggleBookmark) (т. е. это та же команда, которая используется для установки неименованной закладки). На полях слева от строки, где определена закладка, редактор высвечивает небольшой синий ромб. Закладки сохраняются вместе с текущей конфигурацией, т. е. когда вы заново открываете проект после перерыва, закладки в нем уже будут расставлены так, как вы это сделали в ходе последнего рабочего сеанса.
Поиск определения элемента программы
Редактор содержит команду, которая позволяет искать определение в тексте программы. Установите курсор на идентификатор, чье определение вы ищете, и нажмите клавишу F6 (в конфигурации по умолчанию она соответствует команде Edit.FindDefinition). После этого будут просмотрены все файлы с исходным кодом проекта. Если определение будет найдено, редактор автоматически откроет файл, где оно расположено, и выделит искомый идентификатор. Некоторым идентификаторам соответствует более одного определения. В этом случае вы можете продолжить поиски других определений, повторно нажимая F6. Поскольку при каждом успешном поиске курсор перемещается к найденному определению, повторный поиск ведется от текущего положения курсора.
В редакторе имеется средство для так называемого "свертывания кода", позволяющее выборочно скрывать части исходного текста с тем, чтобы лучше была видна общая блоковая структура программы. Аналогичным образом некоторые текстовые редакторы позволяют по выбору скрывать и показывать структурные части текста или его содержания: скажем, если имеется текст, разбитый на пункты и подпункты нескольких уровней, пользователь может, например, скрыть все подпункты, чтобы они не отвлекали от проверки основных пунктов. В исходном коде TADS уровни свертывания определяются лексической структурой кода: объекты находятся на первом уровне, свойства и методы внутри объекта находятся на следующем подуровне, внутри методов подуровни образуют операторы, а внутри некоторых операторов также имеются блоки инструкций, заключенных в фигурные скобки.
Для использования свертывания кода необходимо вначале включить элементы управления свертыванием. Для этого в меню Edit (правка) необходимо активировать пункт Show Folding Controls (показать элементы управления свертыванием). После этого слева от окна с текстом появятся небольшие символы плюсов и минусов. Их действие аналогично символам плюса и минуса, использующимся при просмотре древовидных структур в операционных системах семейства Windows (например, в окне папок в "Проводнике"). Каждый такой символ представляет собой точку свертывания, соответствующую первой строке лексического блока. Эти символы появятся напротив определения каждого объекта, каждого метода и каждого блока из фигурных скобок внутри метода (при условии, что эти определения и блоки занимают более одной строки), а также напротив многострочных комментариев. Вначале показывается весь текст - все управляющие символы являются минусами, ничего не скрыто. Если щелкнуть по символу минуса мышью, соответствующий фрагмент кода будет скрыт, а символ будет изменен на плюс. При повторном выборе этого символа фрагмент кода вновь появится на экране, а символ станет минусом.
Идея свертывания кода состоит в том, чтобы скрыть лишние детали длинного блока инструкций при просмотре общей структуры кода. В некоторых случаях это удобно - например, при наличии большой последовательности инструкций внутри метода для просмотра того, какому именно условному оператору соответствует блок else, или что происходит после завершения выполнения длинной инструкции switch.
В редакторе предусмотрен удобный способ повтора символа или введенной с клавиатуры команды заданное число раз. Для этого используется команда Edit.RepeatCount, которой в раскладке по умолчанию соответствует сочетание клавиш Ctrl+U. После их нажатия необходимо ввести число, соответствующее необходимому количеству повторов. Например, если надо ввести восемьдесят тире, можно использовать следующую последовательность нажатия клавиш:
Ctrl+U 8 0 -
Повтор применяется только к той команде или символу, которая будет введена непосредственно вслед за ним. Отказаться от повтора можно, щелкнув мышью в любом месте экрана или выполнив команду Edit.Cancel (в стандартной раскладке соответствует клавише Esc).
Если необходимо использовать повтор для ввода символа-цифры, используется команда Edit.QuoteKey (сочетание клавиш Ctrl+Q). Вслед за ней вводится цифровой символ, который требуется повторить. Например, для ввода ста нулей последовательность нажатия клавиш будет выглядеть так:
Ctrl+U 1 0 0 Ctrl+Q 0
Повтор применим лишь к ограниченному кругу команд, а именно к вводу символов, перемещениям курсора (при помощи клавиш-стрелок, клавиш перемещения на страницу вверх или вниз и т. п.), а также различным командам удаления символов или слов. Для всех остальных команд повтор будет просто игнорироваться.
Ввод специальных символов
Мастерская TADS интерпретирует нажатия сочетания клавиш вида Ctrl+символ как команду. Если никакой команды сочетанию клавиш не сопоставлено, это нажатие будет просто проигнорировано.
Однако, с другой стороны, вне Мастерской такие сочетания клавиш служат для ввода так называемых "управляющих символов", которые представляют собой специальные символы ASCII, выполняющие различные задачи в зависимости от конкретного приложения. Некоторые из таких управляющих символов используются довольно часто - например, конец каждой строки обычного текстового файла обозначается парой символов Ctrl+M и Ctrl+J, соответствующих возврату каретки и переводу строки. Значение большинства других управляющих символов зависит от конкретного приложения.
В любом случае тот факт, что Мастерская TADS "монополизирует" обработку таких сочетаний клавиш, может приводить к затруднениям, поскольку иногда бывает необходимо ввести управляющую последовательность непосредственно в текст файла. К счастью, в Мастерской есть средство для этого, а именно команда Edit.QuoteKey, которой в раскладке по умолчанию соответствует сочетание клавиш Ctrl+Q.
Работает это следующим образом: необходимо активировать команду Edit.QuoteKey, после чего набрать комбинацию для управляющего символа, который должен присутствовать в текстовом файле. Например, для ввода символа, соответствующего комбинации клавиш Ctrl+C, необходимо ввести следующее:
Ctrl+Q Ctrl+C
Обратите внимание, что редактор Scintilla использует для отображения управляющих символов в тексте специальные сокращения, унаследованные еще со времен начала цифровой эры. Ниже для справки приведены управляющие символы и соответствующие им сокращения.
Код ASCII | Сочетание клавиш | Отображаемое сокращение |
---|---|---|
0 | Ctrl+@ | NUL |
1 | Ctrl+A | SOH |
2 | Ctrl+B | STX |
3 | Ctrl+C | ETX |
4 | Ctrl+D | EOT |
5 | Ctrl+E | ENQ |
6 | Ctrl+F | ACK |
7 | Ctrl+G | BEL |
8 | Ctrl+H или Забой | BS |
9 | Ctrl+I или Tab | HT |
10 | Ctrl+J | LF |
11 | Ctrl+K | VT |
12 | Ctrl+L | FF |
13 | Ctrl+M или Ввод | CR |
14 | Ctrl+N | SO |
15 | Ctrl+O | SI |
16 | Ctrl+P | DLE |
17 | Ctrl+Q | DC1 |
18 | Ctrl+R | DC2 |
19 | Ctrl+S | DC3 |
20 | Ctrl+T | DC4 |
21 | Ctrl+U | NAK |
22 | Ctrl+V | SYN |
23 | Ctrl+W | ETB |
24 | Ctrl+X | CAN |
25 | Ctrl+Y | EM |
26 | Ctrl+Z | SUB |
27 | Ctrl+[ или Esc | ESC |
28 | Ctrl+\ | FS |
29 | Ctrl+] | GS |
30 | Ctrl+^ | RS |
31 | Ctrl+_ | US |
Обратите внимание, что редактор использует часть управляющих символов под свои собственные нужды. Например, это уже упоминавшиеся выше Ctrl+M (возврат каретки) и Ctrl+J (перевод строки), использующиеся для обозначения конца строк, а также Ctrl+I, соответствующий горизонтальной табуляции. Scintilla в любом случае будет интерпретировать их обычным образом, даже если вводить их при помощи команды Edit.QuoteKey, так что сокращения для этих символов отображаться не будут.
Наряду с обычной командой поиска, работающей так же, как и в большинстве приложений для Windows, Мастерская позволяет использовать так называемый "уточняющий" поиск.
Запуск уточняющего поиска осуществляется командой Edit.SearchIncremental, которой соответствует комбинация клавиш Ctrl+F3 в раскладке по умолчанию. При этом в строке состояния появится командная строка с запросом "I-Search:", в которой пользователь может вводить искомый текст.
Уточняющий поиск называется так потому, что он осуществляется по мере ввода образца текста. При вводе каждого следующего символа редактор немедленно подсвечивает ближайший участок текста, совпадающий с обновленным образцом. При удалении символа клавишей забоя выделение будет тут же возвращено на участок, совпадающий с более коротким образцом.
Если вы хотите перейти к следующему совпадающему с образцом участку текста, необходимо еще раз нажать комбинацию клавиш, активирующую уточняющий поиск. Если нужно перейти к предыдущему такому участку, используйте комбинацию клавиш Ctrl+R (от слова "Reverse" - обратно).
Выйти из режима уточняющего поиска можно, нажав клавишу Esc, при этом выделение последнего найденного участка будет сохранено. Другой способ выхода из режима - комбинация клавиш Ctrl+G, после нажатия которой курсор будет возвращен в первоначальное положение - таким образом, как если бы поиск не производился вообще.
В ходе уточняющего поиска можно использовать комбинацию клавиш Ctrl+C для того, чтобы переключать режим регистрозависимости. По умолчанию поиск образца ведется без учета регистра.
Нажатие клавиш Ctrl+W в ходе поиска приведет к тому, что образцы будут искаться только среди целых слов (т. е. последовательностей символов, отделенных пробелами или другими разделителями).
Комбинация Ctrl+W служит для включения/отключения поиска с использованием шаблонов (регулярных выражений, регэкспов). По умолчанию этот режим отключен.
В общем и целом уточняющий поиск служит тем же целям, что и обычный, но для некоторых пользователей он предпочтительнее, поскольку этим видом поиска можно управлять только с клавиатуры, не переключаясь на мышь и манипуляции с диалоговым окном.
Уточняющий поиск можно также использовать для задания области выделения. Для использования этой возможности необходимо вначале переместить курсор в начало будущей области выделения и затем активировать "режим выделения" (например, для раскладки в стиле редактора Epsilon для этого надо использовать комбинацию клавиш Ctrl+пробел). После этого осуществляется уточняющий поиск. Когда искомый образец будет найден, следует выйти из режима поиска обычным образом (в раскладке по умолчанию и раскладке в стиле Epsilon для этого служит клавиша Esc). В результате будет выделен участок текста от начальной точки до найденного образца.
И последняя особенность уточняющего поиска, которая может оказаться удобной. Для того, чтобы повторно провести поиск по тому же образцу, что и в предыдущий раз, достаточно дважды нажать комбинацию клавиш, инициирующую поиск (для раскладки по умолчанию это будет Ctrl+F3 Ctrl+F3). Очень часто возникает необходимость искать один и тот же образец несколько раз подряд, внося правки для каждого вхождения образца. Описанный режим в этом случае позволяет ускорить работу.
Использование шаблонов при поиске
Команда поиска и замены Edit.Replace (комбинация клавиш Ctrl+R) позволяет осуществлять поиск с использованием шаблонов (если активирована соответствующая опция в диалоговом окне). Если образец для поиска задан с использованием шаблонов, то в тексте подстановки можно использовать так называемые "группы" исходного текста-образца.
Группа представляет собой просто выражение в круглых скобках, содержащееся в поисковом шаблоне. Каждой группе присваивается номер; первая открывающая круглая скобка (считая слева) начинает группу номер 1, следующая - группу номер 2 и т. д. Нумерация осуществляется именно по левым (открывающим) скобкам, при этом вложенность групп не учитывается.
Каждый раз, когда система поиска и замены находит текст, совпадающий с шаблоном в образце, она "вспоминает" и ту часть текста, которая соответствует каждой из групп в шаблоне. Когда осуществляется замена найденного образца на новый текст, система просматривает этот новый текст на наличие последовательностей \1, \2, \3 и т. д. (т. е. обратный слэш со следующей за ним цифрой). Вместо каждого из таких символов подставляется участок найденного исходного текста, соответствующего группе шаблона с совпадающим номером. Пусть, например, задан поисковый шаблон (<alpha>+)Room, а в качестве текста для подстановки указано \1Комната. Если в файле будет найден текст DarkRoom, он будет заменен на DarkКомната, поскольку текст, соответствующий первой группе шаблона - это Dark. А если, например, указать в тексте для подстановки Комната\1, то будет вставлен текст КомнатаDark.
Ниже приведены базовые сведения о шаблонах. Синтаксис поисковых шаблонов в редакторе аналогичен используемому в TADS 3 (еще не переведенному на русский язык).
При помощи шаблонов можно задавать поиск образцов текста по заданным критериям, при этом по одному и том же шаблону могут находиться разные образцы, необязательно буквально совпадающие с шаблоном. Шаблон представляет собой просто строку, в которой ряд символов может иметь особый смысл. Простейшим шаблоном является просто последовательность символов для поиска, например
abc
Основные символы, которые имеют специальное назначение при использовании шаблонов:
| . ? + * ^ $ % [] {} () <>
Остальные символы являются "обычными", т. е. если их указать в шаблоне, то они и будут искаться в тексте.
Символ | соответствует логической операции "или". По шаблону
abc|def
будет искаться как текст "abc", так и текст "def".
Точка означает единичное вхождение любого символа. По шаблону
d.
будет искаться как текст "da", так и "db", и "dc".
Вопросительный знак означает, что предшествующий ему символ шаблона может отсутствовать. По шаблону
abcd?
будут найдены фрагменты "abc" и "abcd".
Плюс указывает на то, что непосредственно предшествующий ему символ должен встречаться не менее одного раза. По шаблону
abc+
будут найдены фрагменты "abc", "abcc", "abccc" и т. д. без ограничения длины.
Звездочка имеет почти тот же смысл, за исключением того, что предшествующий ей символ может в тексте и отсутствовать, т. е. по шаблону
abc*
будут найдены фрагменты "ab", "abc", "abcc", "abccc" и т. д.
Знак вставки или степени (^) означает, что указанный образец ищется в начале строки (знак ставится первым в шаблоне). По шаблону
^abc
фрагмент "abc" будет найден только в тех строках, которые он начинает (в частности, фрагменты " abc" или "xabc" найдены не будут).
Знак доллара означает, что указанный образец ищется в конце строки (этот знак должен стоять последним в шаблоне). По шаблону
abc$
будет найдены только те строки, где abc стоит непосредственно перед их концом (например, "abcd" найден не будет).
Знак процента служит для того, чтобы отменить специальную функцию следующего за ним служебного знака. Например, если при поиске в тексте точки задать шаблону ".", то будет искаться не точка, а любой одиночный символ. Для правильного поиска в этом случае надо указать в качестве шаблона
%.
Отметим, что для поиска самого знака процента шаблон строится аналогичным образом, т. е. имеет вид "%%".
Квадратные скобки служат для указания интервалов (диапазонов) искомых символов. По шаблону
[abc]
будет искаться любой из символов "a", "b" и "c". При помощи тире можно задавать интервалы символов - например, по шаблону
[a-q]
будет искаться любой одиночный символ, чей код ASCII лежит между таковыми для букв "a" и "q".
Чтобы включить в диапазон сам знак дефиса, необходимо указать его самым первым символом диапазона, например, так:
[-a]
Большинство специальных символов теряют свои особые свойства при размещении их внутри квадратных скобок. Например, по шаблону
[*%$]
будет искаться одиночный символ, представляющий собой звездочку, знак процента или знак доллара. Исключением является знак степени: если его разместить в начале диапазона, будут искаться символы, не входящие в этот диапазон. Скажем, по шаблону
[^a-zA-Z]
будут искаться одиночные символы, не являющиеся одной из латинских букв. При размещении знака степени не в начале диапазона он также воспринимается, как обычный (не специальный) символ.
Фигурные скобки позволяют указать заданное число повторений предшествующего им символа. По шаблону
a{3}
будет искаться последовательность "aaa". В фигурных скобках через запятую можно указать максимальное количество повторений; например, по шаблону
a{3,5}
будут искаться последовательности "aaa", "aaaa" и "aaaaa". Наконец, если указать запятую, но не указывать после нее вторую цифру - вот так:
a{3,}
, то искаться будет любая последовательность, в которой буква "a" повторяется три или более раз.
Круглые скобки, как уже говорилось выше, используются для выделения групп в шаблоне.
Угловые скобки служат для указания в шаблоне поиска так называемых именованных образцов символов. Список таких именованных образцов с соответствующими им символами приведен ниже. Отметим, что для поиска самих угловых скобок указывать перед ними в шаблоне знак процента не нужно (т. е. достаточно просто включить их в шаблон, как обычный символ).
<lparen> | ( |
<rparen> | ) |
<lsquare> | [ |
<rsquare> | ] |
<lbrace> | { |
<rbrace> | } |
<langle> | < |
<rangle> | > |
<vbar> | | |
<caret> | ^ |
<period> | . |
<dot> | . |
<squote> | ' |
<dquote> | " |
<star> | * |
<plus> | + |
<percent> | % |
<question> | ? |
<dollar> | $ |
<backslash> | \ |
<return> | возврат каретки (Уникод u000D) |
<linefeed> | перевод строки (Уникод u000A) |
<tab> | табуляция (Уникод u0009) |
<nul> | символ "null" (Уникод u0000) |
<alpha> | любая буква или цифра |
Обратим внимание на одну особенность использования шаблонов именно в текстовом редакторе: в программах на TADS 3 поиск с шаблонами по умолчанию ведется с учетом регистра символов. В редакторе же все зависит от того, установлен ли флажок Exact case match (учитывать регистр) в окне поиска: если он не установлен, то и регистр символов при поиске не будет играть роли.
И еще один момент: с буквами кириллицы шаблоны поиска, похоже, работают неправильно (или вообще не работают).
Изложенный выше материал не охватывает всех особенностей и возможностей использования регулярных выражений, однако с учетом целей данной главы (описывающей не применение регулярных выражений в игровых программах на TADS, а всего лишь средства текстового редактора) этого будет вполне достаточно.
Выделение, копирование и вставка текста в стиле редактора Emacs
Редактор Мастерской TADS поддерживает выполнение ряда базовых операций работы с текстом (выделение, копирование, вставка) не только привычным для пользователей приложений Windows способом, но и в стиле редактора Emacs.
Одно из наиболее наглядных проявлений этого стиля - возможность выбора многострочной области текста без привязки к началу и концу строк (так называемая прямоугольная область выделения). Выглядит это примерно так:
И они посидели еще немного. А потом еще немного. А потом и еще немного. И еще немного. Пока, наконец, у Кролика совсем ничего не осталось. И тут Пух вспомнил об одном важном деле...
Для выделения такой области используются команды семейства Edit.xxxRectExtend, которым в раскладке по умолчанию соответствуют комбинации клавиш, состоящие из Alt+Shift+какая-либо клавиша управления курсором (со стрелками, Home, End, Page Up или Page Down). Для выделения прямоугольной области текста разместите курсор в ее верхнем левом или правом нижним углу и, удерживая нажатыми клавиши Alt и Shift, используйте управляющие клавиши для перемещения противоположного угла области выделения. (Альтернативный способ - нажать клавишу Alt и выделить прямоугольную область мышью, нажав левую кнопку последней). После того, как клавиши Alt и Shift будут отпущены, область выделения останется на экране, и к ней можно будет применять все обычные операции редактирования (такие, как вырезание, копирование и вставка).
Сам процесс выбора участка текста, помимо "классических" способов, принятых в приложениях Windows, также может осуществляться следующим образом: позиция курсора на определенный момент запоминается путем нажатия специальной комбинации клавиш, после этого при перемещениях курсора при помощи клавиш управления весь текст между сохраненной и его текущей позицией будет выделенным (при использовании мыши сохраненная позиция будет "теряться"). Этот способ также характерен для редактора Emacs. Команда, служащая для фиксации текущей позиции курсора - Edit.SelectionMode; в раскладке по умолчанию ей не соответствует никакая комбинация клавиш, а в раскладке в стиле редактора Epsilon - Ctrl+пробел и Ctrl+@. В этой раскладке определена также комбинация клавиш для команды Edit.RectSelectMode, которая действует точно так же, однако задает начальную точку для прямоугольной области выделения. Это комбинация клавиш Ctrl+X # (набирается в два приема - сначала (Ctrl+X, затем дополнительно нажимается #). Выйти из режима выделения в стиле Emacs можно, нажав Esc или выбрав новую позицию курсора при помощи мыши; кроме того, редактор автоматически выходит из этого режима после выполнения большинства команд, которые этот режим используют (таких, например, как копирование в буфер).
Позиция курсора, зафиксированная при переходе в режим выбора текста, может использоваться в качестве своеобразной временной закладки. Позиция курсора запоминается при командах выбора Edit.SelectionMode, Edit.RectSelectMode, Edit.LineSelectMode, при перемещении к началу или концу текущего файла (команды Edit.DocumentStart, Edit.DocumentStartExtend, Edit.DocumentEnd и Edit.DocumentEndExtend), а также вначале обычного или уточняющего поиска. Для перехода к зафиксированной позиции используется команда Edit.SwapMark (ей соответствует комбинация клавиш Alt+X в раскладке по умолчанию и Ctrl+X Ctrl+X в раскладке Epsilon). По этой команде курсор перемещается в зафиксированную позицию, а его текущая позиция запоминается, так что при повторном применении данной команды курсор вернется в исходное положение. Кроме того, при помощи команды Edit.SelectToMark (комбинация клавиш Alt+Shift+X в раскладке по умолчанию и Ctrl+X Ctrl+H в раскладке Epsilon) можно выделить весь текст между текущим положением курсора и зафиксированным положением.
Вырезание, копирование в буфер и вставка текста в Мастерской TADS в общем случае работают так же, как и в большинстве приложений Windows, однако здесь также присутствуют дополнительные возможности, перекочевавшие из редактора Emacs.
Команда Edit.CutLineRight работает аналогично команде "kill" редактора Emacs. По этой команде вырезается текст от позиции курсора до конца строки (исключая перевод строки). Если курсор стоит в конце строки, вырезается только перевод строки. Если применить команду несколько раз подряд, никуда не сдвигая курсор, вырезанные фрагменты текста будут объединяться в буфере воедино. Конечный эффект будет таким же, как если бы пользователь выбрал весь участок текста и вырезал его в буфер обмена обычным образом. Данной команде соответствует комбинация клавиш Ctrl+K в раскладке Epsilon, раскладка по умолчанию не предусматривает комбинации клавиш для этой команды.
При копировании-вставке через буфер обмена в Мастерской TADS можно организовать доступ не только к последнему занесенному в буфер фрагменту, но и к девяти предыдущим. Хранение этих фрагментов организовано в виде стека или своеобразной "стопки"; когда количество операций вырезания/копирования в буфер превышает десять, самые старые по времени фрагменты удаляются из стопки, вместо них добавляются новые.Обычная команда вставки из буфера (Edit.Paste) обращается к самому новому ("верхнему") фрагменту в стопке. Обратиться к нижележащим фрагментам можно при помощи команды Edit.PastePop. Эту команду можно вызвать непосредственно после вставки из буфера (Edit.Paste) или предыдущего использования Edit.PastePop; во всех остальных случаях (даже после простого перемещения курсора) данная команда будет игнорироваться. Работает она следующим образом: удаляет только что вставленный из буфера фрагмент текста, перемещает этот фрагмент на дно стопки и вставляет вместо него фрагмент, ставший верхним в стопке после перемещения предыдущего на дно. Если применить Edit.PastePop несколько раз подряд, можно циклически вызвать все фрагменты из буфера вплоть до самого старого. При этом стопка фрагментов в буфере остается в том состоянии, которое она приняла в результате последнего применения Edit.PastePop. Т. е. если вы вставите текст из буфера, затем примените один или несколько раз Edit.PastePop для вставки более старого фрагмента и после этого воспользуетесь вставкой из буфера где-то в другом месте файла, то вставлен будет тот же самый более старый фрагмент. Данной команде не соответствует никакой комбинации клавиш в раскладке по умолчанию; в раскладке Epsilon для ее вызова используется комбинация Alt+Y.
В подразделе Margins & Wrapping page (поля и переносы) диалогового окна настроек Мастерской (вызывается через пункт Options меню Tools) можно задать для редактора правое поле (точнее, максимальное количество символов в строке). При выборе флажка Wrap text on typing past the right margin (переносить текст при заходе на правое поле) текст в процессе ввода будет автоматически переноситься на следующую строку при превышении заданного числа символов, а флажок Show guide line for right margin (показать границу правого поля) "отвечает" за отображение границы правого поля.
Максимальное количество символов в строке оказывает влияние на работу утилит автоматического форматирования текста - они будут вставлять переносы строк в форматируемом фрагменте текста, ориентируясь именно на это значение.
"Правое поле" не следует путать с опциями переноса текста, содержащимися в подменю Long Lines (длинные строки) меню Edit - Scroll (не переносить), Wrap Anywhere (переносить без учета слов) и Word Wrap (переносить по словам). Эти опции относятся исключительно к отображению на экране строк, превышающих ширину окна редактора.
Окна редактора можно разделить по вертикали на две части, чтобы можно было работать одновременно с двумя удаленными друг от друга фрагментами файла. Для этого служит небольшой прямоугольник в правом верхнем углу окна редактора (непосредственно над линейкой вертикальной прокрутки). Для расщепления окна надо навести на этот прямоугольник курсор мыши (ее указатель при этом сменит вид) и либо осуществить двойной щелчок левой кнопкой (при этом окно окажется разделенным по вертикали на два равных по размеру подокна), либо, удерживая нажатой левую кнопку мыши, перетащить его вниз до тех пор, пока верхнее и нижнее подокна не примут нужные вам размеры. Таким же образом можно изменить размеры подокон и впоследствии. Двойной щелчок мышью по прямоугольнику в то время, когда активны два подокна, приведет к возвращению в однооконный режим (скрыто будет верхнее подокно).
Расширение возможностей редактора
В Мастерской TADS предусмотрена система плагинов, позволяющая добавлять новые средства редактирования. Основное назначение данной системы - добавление новых языковых режимов, однако у нее есть и еще одна полезная особенность: все дополнительные возможности редактирования языкового режима TADS реализованы через плагины, поэтому для их модификации не требуется копаться в недрах исходников Мастерской, а достаточно изменить тот или иной плагин.
Полное описание системы плагинов содержится в файле addins\itadsworkbench.h, который входит в состав дистрибутива TADS. Данный файл содержит интерфейсы плагинов и инструкции по написанию новых плагинов.
Исходный код плагина для языкового режима TADS хранится в файле addins\tads3addin.cpp (а также соответствующих файлах с расширениями .h и .rc). Исходный код для языкового режима HTML/XML хранится в addins\htmladdin.cpp. После внесения изменений в эти файлы необходимо перекомпилировать библиотеки DLL плагинов, используя Microsoft Visual C++. Существует бесплатная версия этого программного продукта - Visual C++ Express Edition, которую можно скачать с сайта Microsoft. Чтобы осуществить сборку плагина, используйте утилиту NMAKE, указав в качестве сборочного файл addins/make-addins.vc:
cd addins nmake -f make-addins.vc
Если вы пишете новый плагин языкового режма с нуля, обратите внимание на файл addins\wb_addin.h. В нем определяется набор базовых классов, упрощающих процесс создания плагина.
Хотя все плагины, входящие в дистрибутив Мастерской, написаны на C++, для их создания можно использовать практически любой язык программирования, доступный под Windows. Система плагинов построена на основе COM - стандартного механизма Windows для обеспечения возможности взаимодействия программ. Практически все компиляторы Microsoft поддерживают данный стандарт, то же самое справедливо и для компиляторов от других производителей.
Использование внешнего редактора
Работа со встроенным редактором во многих случаях дает ряд преимуществ, однако, если пользователь предпочитает использовать другой редактор, Мастерская TADS дает ему такую возможность. Эта возможность сохранилась еще с тех времен, когда собственного редактора в Мастерской не было.
Прежде, чем вы сможете использовать внешний редактор, необходимо указать программе, где этот редактор искать. После этого можно будет автоматически запустить внешний редактор и открыть в нем текущий файл исходного кода, используя команду Open имя файла in External Editor меню Edit (в раскладке по умолчанию ей соответствует комбинация клавиш Ctrl+T). После внесения правок, сохранения их в редактируемом файле и возвращении в Мастерскую все изменения будут ею автоматически учтены и загружены.
По умолчанию в качестве внешнего редактора используется Блокнот - просто потому, что это единственный редактор, который практически гарантированно установлен на любом компьютере с операционной системой Windows. Чтобы указать программе другой внешний редактор, выберите пункт Options меню Tools. В левой части открывшегося диалогового окна, содержащего древовидную структуру, выберите категорию System, подпункт External Editor. В правой части окна в поле Editor Program (программа-редактор) необходимо ввести полное (включая путь) имя исполняемого файла внешнего редактора. Вместо того, чтобы печатать его вручную, можно воспользоваться кнопкой Browse (пролистать), при нажатии которой открывается стандартное окно Windows для выбора файлов. В поле Command Line (командная строка) указываются аргументы командной строки, передаваемые программе-редактору при ее запуске. Параметр %f служит для передачи названия редактируемого файла, который автоматически будет открыт во внешнем редакторе. Для большинства редакторов этот параметр следует заключить в двойные кавычки (чтобы корректно обрабатывались названия файлов и пути, содержащие пробелы), однако бывают и исключения (например, тот же Блокнот), поэтому лучше свериться с документацией на соответствующий редактор. Многие редакторы для программистов поддерживают автоматический переход к текущей строке и колонке; для передачи этих данных необходимо указать параметры %n и %c соответственно. Если внешний редактор начинает нумерацию строк и/или столбцов с нуля (т. е. первая строка в файле у него считается нулевой), то для соответствующего параметра нужно указать ноль: %0n или %0c. Другие параметры командной строки целиком и полностью определяются внешним редактором. Единственное, о чем еще нужно упомянуть - если требуется передать в качестве параметра командной строки символ процента, необходимо указать в поле Command Line сдвоенный символ процента: %%.
Ниже приведен пример заполнения текстовых полей для работы с популярным бесплатным редактором Programmer's File Editor (PFE):
Поле Editor Program: c:\pfe\pfe32.exe
Поле Command Line: /g %n "%f"
Использование механизма DDE при работе с внешним редактором
Некоторые текстовые редакторы "общаются" с другими программами посредством так называемого динамического обмена данными (DDE) - специального механизма Windows, предназначенного для организации взаимодействия приложений. Основной причиной, по которой пользователю может потребоваться лезть в соответствующие настройки, является "привычка" некоторых программ-редакторов каждый раз запускать новый экземпляр приложения при открытии очередного файла; зачастую при помощи механизма DDE можно добиться, чтобы для открытия нескольких файлов использовался один и тот же экземпляр приложения. Вы можете установить, требуется ли настраивать DDE, либо изучив документацию на внешний редактор, либо осуществив экспериментальную проверку.
Чтобы использовать динамический обмен данными, вам потребуется узнать название DDE-сервера (DDE server name), тип данных DDE (DDE topic name), а также командную строку DDE для открытия файла. Эти параметры зависят от конкретного приложения - для их выяснения обращайтесь к документации по вашему внешнему редактору. Чтобы правильно настроить взаимодействие Мастерской с этим редактором через механизм DDE, вновь вызовите диалоговое окно настройки внешнего редактора, как было описано выше. Однако на этот раз не вводите название редактора, а нажмите кнопку Advanced (дополнительные настройки). В результате появится еще одно диалоговое окно, служащее для ввода параметров DDE. Активируйте флажок Use DDE (использовать DDE), в поле Server Name введите название сервера DDE, в поле Topic - тип данных DDE, а в поле Executable введите (или выберите при помощи расположенной рядом кнопки) имя исполняемого файла внешнего редактора. После нажатия на кнопку OK вы вновь окажетесь в основном окне настроек внешнего редактора, только в поле Editor Program будет указано:
"DDE:" имя сервера DDE тип данных DDE>.
В завершение введите соответствующую командную строку для открытия файла в поле Command Line в соответствии с описанными немного ранее соглашениями.
Например, для редактора Epsilon фирмы Lugaru настройки будут иметь следующий вид:
Use DDE yes DDE Server Epsilon DDE Topic open Command Line +%n "%f"
Ниже приведено описание команд меню Мастерской TADS. Команды сгруппированы по отдельным меню в том же порядке, в каком они расположены в самой программе.
В этом меню собраны команды, с помощью которых осуществляется манипуляция с файлами с исходным кодом и скомпилированной игры.
Это меню в основном составлено из команд для редактирования исходного кода.
Описание команд этого меню приведено в главе, посвященной компилятору.
В меню сосредоточены команды для управления выполнением программы в пошаговом режиме, а также для отображения отладочной информации.
Команды данного меню позволяют открывать вспомогательные окна с информацией.
С помощью команд данного меню можно осуществлять тонкую настройку Мастерской TADS.
Из данного меню можно открывать, закрывать и менять расположение открытых окон на рабочем столе.
Команды этого меню служат для просмотра справочной документации и поиска по ней.
Дайте нам инструменты, и мы закончим работу.
УИНСТОН ЧЕРЧИЛЛЬ (WINSTON CHURCHILL), Выступление на радио (1941)
Приложение D | Содержание | Приложение F |