# Технические подробности

### Хранение макросов

Все макрокоманды хранятся в SQLite базе macros.db

Макрокоманды делятся на 17 областей действий (см. Области действия) и 2 области для хранения глобальных переменных и констант:

Область | Назначение
--- | ---
`Shell` | Файловые панели
`Info` | Информационная панель
`QView` | Панель быстрого просмотра
`Tree` | Панель дерева папок
`Search` | Быстрый поиск в панелях
`FindFolder` | Панель поиска папок
`Viewer` | Внутренняя программа просмотра
`Editor` | Редактор
`Dialog` | Диалоги
`Menu` | Прочие меню
`MainMenu` | Основное меню
`UserMenu` | Пользовательское меню
`Disks` | Меню выбора диска
`Shell.AutoCompletion` | Список автодополнения в панелях
`Dialog.AutoCompletion` | Список автодополнения в диалогах
`Help` | Система помощи
`Other` | Режим копирования текста с экрана
`Common` | Макросы из этой области работают везде. Far Manager просматривает эту область последней.
`Vars` | Область для глобальных переменных, которые Far Manager считывает при старте. В эту область можно писать с помощью функции msave().
`Consts` | Область для глобальных констант, которые Far Manager считывает при старте.

Если Far Manager запущен с ключами /e или /v, то не грузятся макросы из следующих макрообластей: `Shell`, `Info`, `QView`, `Tree`, `Search`, `FindFolder`, `MainMenu`, `Disks`, `Shell.AutoCompletion`, `Dialog.AutoCompletion`.

На каждую макрокоманду в базе заводится отдельная запись со следующими полями:

Поле | Описание
--- | ---
`area` | Имя макрообласти
`key` | Назначенная клавиша
`flags` | Флаги для макрополедовательности (перечисленные через символ '|'):
Флаг | Default | Описание
--- | --- | ---
`DisableOutput` | 0 | Запретить на время выполнения вывод на экран. При записи нового макроса значение этого параметра выставляется в 1 (запретить вывод на экран). Если параметр отсутствует, то вывод на экран во время исполнения макроса разрешён.
`RunAfterFARStart` | 0 | Выполнять после запуска Far Manager. Флаг актуален только для макросов, стартующих в области `Shell`.
`EmptyCommandLine` | 0 | Выполнять, только если командная строка пуста
`NotEmptyCommandLine` | 0 | Выполнять, только если командная строка не пуста
`NoFilePanels` | 0 | Не выполнять для файловой панели
`NoFilePPanels` | 0 | Не выполнять если пассивная панель - файловая
`NoPluginPanels` | 0 | Не выполнять для плагиновой панели
`NoPluginPPanels` | 0 | Не выполнять если пассивная панель - плагиновая
`NoFolders` | 0 | Не выполнять если текущий элемент - папка
`NoPFolders` | 0 | Не выполнять если текущий элемент - папка (пассивная панель)
`NoFiles` | 0 | Не выполнять если текущий элемент - файл
`NoPFiles` | 0 | Не выполнять если текущий элемент - файл (пассивная панель)
`Selection` | 0 | Выполнять, только если на панели есть отмеченные файлы/папки или есть выделенный блок в редакторе/программе просмотра
`PSelection` | 0 | Выполнять, только если на панели есть отмеченные файлы/папки (пассивная панель)
`NoSelection` | 0 | Выполнять, если нет отмеченных файлов/папок
`NoPSelection` | 0 | Выполнять, если нет отмеченных файлов/папок (пассивная панель)
`EVSelection` | 0 | Выполнять, если отмечен блок в редакторе, программе просмотра, в строках ввода в диалогах.
`NoEVSelection` | 0 | Выполнять, если не отмечен блок в редакторе, программе просмотра, в строках ввода в диалогах.
`NoSendKeysToPlugins` | 0 | Специальный режим: нажимаемые клавиши при записи и воспроизведении не будут передаваться плагинам.
Например: `DisableOutput|Selection` - не выводить на экран и если есть выделенные файлы/блок.
`description` | Описание макроса
`sequence` | Макропоследовательность

При импорте каждая запись в XML-файле имеет вид:

    <macro area="%AREA%" key="%KEY%" flags="%FLAGS%" description="%DESC%">%SEQUENCE%</macro>

В значениях area, key и description символы `"<>&` должны быть заменены на &quot; &lt; &gt; и &amp;, соответственно.

Если макропоследовательность %SEQUENCE% содержит символы `<>&`, то последовательность должна быть обрамлена в "скобки": `<![CDATA[%SEQUENCE%]]>`

Обязательными являются параметры `area` и `key`, остальные могут отсутствовать и принимать значение по умолчанию.

Если %SEQUENCE% отсутствует, то при импорте xml-файла макрос, заданный параметрами `area` и `key` будет удален из базы.

Последовательность "`sequence`" содержит строковое представление макрокоманды. Каждая клавиша имеет свой строковый эквивалент, разделителем клавиш является пробел, табуляция, или символы конца строки.

При старте Far Manager компилирует последовательность "`sequence`" во внутренний байткод. Если в процессе компиляции обнаружена ошибка, то макрос "отбрасывается".

### Условия запуска макроса

Перед исполнением макроса Far Manager проверяет условия запуска в следующей последовательности:

1. `NoSendKeysToPlugins`
2. `EmptyCommandLine` + `NotEmptyCommandLine`
3. `NoFilePanels` + `NoPluginPanels`
4. `NoFilePPanels` + `NoPluginPPanels`
5. `NoFolders` + `NoFiles`
6. `NoPFolders` + `NoPFiles`
7. если не в `Viewer`, `Editor` и `Dialog`:
   - `Selection` + `NoSelection`
   - `PSelection` + `NoPSelection`
8. если в `Viewer`, `Editor` и `Dialog`:
   - `EVSelection` + `NoEVSelection`

### Дополнительные параметры

Все дополнительные параметры хранятся в SQLite-базе generalconfig.db (key="KeyMacros").

Имя | Тип | Default | Описание
--- | --- | --- | ---
`DateFormat` | `TEXT` | `%a %b %d %H:%M:%S %z %Y` | Формат вывода даты/времени по умолчанию (см. date())
`CONVFMT` | `TEXT` | `%.6g` | Формат преобразования чисел (констант и переменных) с плавающей точкой в строку.
`KeyRecordCtrlDot` | `TEXT` | `Ctrl.` | Имя комбинации клавиш для записи макроса в общем режиме (см. "Запись макроса").
`KeyRecordCtrlShiftDot` | `TEXT` | `CtrlShift.` | Имя комбинации клавиш для записи макроса в специальном режиме (см. "Запись макроса").

Смотрите также:
Общие замечания, Работа с макросами, Макроязык, Примеры