SciTE Extension Interface |
Документация
FAQ
Регулярные выражения
|
Любой заинтересованный человек может создать расширенную версию редактора SciTE, обладающую новыми дополнительными возможностями. Так, например, для редактора, разработанного для специфического окружения, можно добавить возможность выполнения скриптов в среде SciTE или позволить другому процессу управлять SciTE посредством механима IPC.
Приведем два примера расширений. SciTE Director Interface позволяет управлять редактором SciTE из внешнего приложения, такого как менеджер проектов. SciTE Lua Scripting Extension является внедрением скриптового языка Lua в SciTE, выполненное посредством интерфейса расширения.
Расширение должно реализовать интерфейс Расширения, определенный в scite/src/Extender.h. Только первые 4 метода должны быть реализованы, несмотря на то, что их реализация может быть настолько простой, как просто возвращение false. Остальные методы имеют пустую реализацию по умолчанию. Методы, добавляемые к этому интерфейсу впоследствие, должны иметь такую реализацию по умолчанию, которая позволит компилироваться существующим расширениям.
Каждый метод возвращает логическое значение, указывающее, закончил ли метод всю требующуюся обработку, и что дополнительной обработки не требуется. В обычных условиях false возвращается, чтобы показать, что дополнительная обработка может быть проведена.
Расширение может использовать методы Initialise и Finalise для выделения и освобождения выделенных ресурсов. Указатель ExtensionAPI может быть сохранен в методе Initialise чтобы обеспечить расширению связь со SciTE.
Методы Clear и Load используются для поддержки расширений, которым необходимо загружать такие ресурсы, как файлы скриптов при открытии файлов. Когда файл открывается в SciTE, то сначала расширение запрашивает очистку любых данных, связанных с предыдущим файлом, через Clear. Затем SciTE приводит свойство "extension" в соответстие с именем файла, так для x.cpp, ищется extension.*.cpp. Файл с таким именем ищется в стандартном месте для размещения файлов свойств (property file), и, если находится, то вызывается Load с путем в качестве аргумента.
Методы InitBuffer, ActivateBuffer и RemoveBuffer обеспечивают необходимые ловушки, так чтобы расширение имело механизм связывания данных с конкретным буфером, образом сходным с тем, которым сам SciTE запоминает каждого буфера. InitBuffer вызывается в момент открытия нового документа в данном буфере. Буфер может быть вновь выделенным или использованным повторно, если достигнуто максимальное количество буферов. Как только буфер инициализирован, он становится активным. Соответственно, ActivateBuffer вызывается всякий раз когда пользователь переключается на другой загруженный буфер. RemoveBuffer вызывается, когда существующий буфер закрывается. Соответственно, индексы буферов, которые следуют за удаляемым буфером, сдвигаются на 1. После RemoveBuffer, расширение получит InitBuffer или ActivateBuffer, чтобы установить новый активный буфер.
OnExecute вызывается только когда выполняется команда расширения. Это указывается в свойствах как subsystem 3.
OnBeforeSave вызывается перед сохранением файла и расширение может реализоавть сохранение файла само и вернет true, чтобы предотвратить выполнение сохранения файла по умолчанию.
Остальные методы вызываются во время событий, происходящих в SciTE, позволяя расширению отвечать на эти события.
Расширение может выполнить обратный вызов в SciTE, используя этот интерфейс, который является упрощенным способом вызова функциональности SciTE.
Така же как и нормальня панель редактора и панель вывода, этот интерфейс предоставляет возможность будущей особенности, когда третья панель может быть использована для вывода команд поиска. В настоящее время это назначено на панель вывода.
Send позволяет посылать сообщения элементу Scintilla, содержащемуся в каждой панели.
Range возвращает текст панели. Он должен быть удален посредством delete[]. Remove и Insert используются для удаления и вставки текста в панель.
Trace отображает строку в конце панели вывода.
Свойства SciTE можно читать и записывать через Property и SetProperty. Результат, возвращенный методом Property должен быть удален через delete[].
GetInstance является спецификой Windows и возвращает HINSTANCE приложения, который необходим для получения доступа к услугам платформы.
ShutDown является эквивалентом выбора пользователем пункта меню Quit. Если есть несохраненные файлы, пользователю будет выведен запрос на их сохранение, которое может быть отменено из этого диалога. Таким образом, при определенных обстоятельствах, приложение будет продолжать выполняться после вызова ShutDown.
Perform принимает строку, содержащую действие, символ ':' и аргумент. В настоящее время единственным известным действием является открыть, в качестве аргумента передается путь. Это используется в Director extension для передачи команд от других приложений. В будущем возможна передача других действий через этот метод.
Расширение добавляется явно кодом при старте функции. Под Windows DirectorExtension подключается кодом, аналогичным следующему упрощенному примеру:
Было бы лучше сделать механизм неявного подключения сходным со способом, которым лексеры подключаются к Scintilla, определяя, какое расширение используется простым внедрением объектных файлов в SciTE. Также было бы хорошо разрешить подключение расширений во время выполнения расширений, помещенных в DLL или в разделяемые объектные библиотеки.
SciTE допускает использование нескольких расширений одновременно. Расширение уплотнитель (multiplexer) поддерживает список расширений и вызывает каждое по очереди для каждого метода. Как только расширение возвращает true, указывая, что обработку можно прервать, уплотнитель возвращает управление без прохода по остальным элементам списка. Тем не менее, для некоторых методов, таких как Initialise и Finalise, уплотнитель проходит по оставшимся расширениям независимо от значения, возвращенного предыдущим расширением.
В общем случае, SciTE является однопоточным приложением. Тем не менее, под Windows, команды вызывают OnExecute из отдельного рабочего потока. Класс SingleThreadExtension может быть использован для "упаковки" расширения так, чтобы вызовы OnExecute направлялись в основной поток. Конечно, потоко-безопасность вашего расширения не обязательна, или оно не реализует OnExecute, или оно является cпецифичным для GTK.