Конструктор для макросов © Smitis

Здесь обсуждается всё, что касается макросов.
mi3antrop
Posts: 49
Joined: Tue 15 Nov, 2005 18:31
Contact:

Конструктор для макросов © Smitis

Post by mi3antrop »

Глубокоуважаемые Плагинописатели!

В связи с появлением "макроязыка" возникает необходимость
в наличии удобного редактора для макросов.
Ну, типа, многострочное редактирование с разбором конструкций
if-else-end, while-end,...

Даже пользователю (я не программист) будет полезно.

Может улучшить FAR Macro browser или субплагин к Dialog Manager, или новый плагин...
Ну, не мне вас учить.

Вот такая вот Идея.

Примечание модератора
Связанные темы:
User avatar
[e]Bu$ter
Posts: 792
Joined: Mon 30 May, 2005 23:05
Location: Беларусь, Минск
Contact:

Post by [e]Bu$ter »

Идея не нова. Это уже обсуждалось и вроде даже пришли к какому-то решению, но на этом всё и закончилось. :(
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

Post by Smitis »

Как вариант - макросы можно хранить в обычных текстовых файлах.
Достоинства:
- Все возможности встроенного редактора, вплоть до подсветки синтаксиса (colorer)
- Нормальный поиск (Alt-F7, плагины)
- Тексты можно нормально коментировать
- Хранить макросы в разных файлах и папках, группируя по темам, подтемам и т.д.
- Не нужны "лишние" плагины (и так уже до фига)
- Файлы легко копируются на другой компьютер, передаются другому и т.д.
- Простое добавление хоткеев для плагинов
- Бонусы: быстрое обновление настроек мультиарка, быстрое обновление кодовых таблиц и т.п.

Недостатки:
- Требуется один раз напрячься и всё настроить
- Для обновления ФАР приходиться закрывать (закрытие/обновление макросов/запуск осуществляется на полном автомате по макросу)
- Срабатывает только для текущей запущенной копии ФАРа (т.е. необходимо все остальные либо закрыть, либо и в них выполнить обновление)

Реальный пример:

Code: Select all

; Переключение на другую панель, даже если они обе выключены
! Tab
# Shell
+ DisableOutput
$If (!APanel.Visible)
  CtrlO Tab CtrlO
$Else
  Tab
$End
З.Ы. Вполне реальная рабочая схема. Работает у меня уже более 7 (семи) лет. В последнее время добавились новые "структурные" макросы.
mi3antrop
Posts: 49
Joined: Tue 15 Nov, 2005 18:31
Contact:

Post by mi3antrop »

и как эта схема реализуется?
как из файла читать?
у меня с помощью PostMacro как-то не очень получается
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

Post by Smitis »

mi3antrop wrote:и как эта схема реализуется?
как из файла читать?
у меня с помощью PostMacro как-то не очень получается
PostMacro сдесь не причём.
Схема такая:
- Запускаем ФАР через командный файл примерно такого содержания (всё под ХР и т.п.):

Code: Select all

set fardir=%~dp0
:far_run
"%fardir%Far.exe" %*
:: При выходе из ФАРа проверяется наличие FarRestart.bat.
:: Если его нет - завершение работы.
if not exist "%fardir%FarRestart.bat"  exit
:: Иначе - выполняем...
call "%fardir%FarRestart.bat"
:: Удаляем...
del "%fardir%FarRestart.bat"
:: И перезапускаем ФАР
goto far_run
- Далее где-нибудь в меню ФАРа создание нужного файла FarRestart.bat, в частности, обновляющего макросы в реестре. Раздел реестра с макросами предварительно удаляется.
- И наконец макрос, который сначала выполняет этот пункт меню, затем закрывает ФАР. ФАР закрывается и через секунду-другую открывается снова.

Все макросы в текстовых файлах двух типов в одном месте (папка FAR\Macros и подпапки по тематике):
*.fmac - старые макросы, по сути куски файлов *.reg без начальной строки REGEDIT4, с коментариями.
*.fmex - новые, расширенные (структурные) макросы.
В них же прописаны горячие клавиши для меню плагинов.

Так как файлы текстовые, они прекрасно редактируются встроенным редактором. Со всеми фичами и прибамбасами (плагинами). Можно настроить colorer для подсветки синтаксиса. Приспособить TrueTemplate для ввода структурных операторов. И т.д. Обновление у меня нажатием клавиш CtrlShift- (макрос для обновления). Заодно преконфигурируется MultiArc - как реестр (файлы *.farc), так и Custom.ini (файлы *.fcst). Быстрое изменение некоторых настроек для тестирования (в основном те, которые в TechInfo). Недавно добавил перезагрузку кодовых таблиц.

В общем, фокус в том, что записать в FarRestart.bat. У моих знакомых, те кто пользуется ФАРом, подобные "скрипты" энтузиазма не вызвали - сказали слишком сложно. Если сдесь кого-нибудь заинтересует - выложу.
User avatar
Skirda
Posts: 3475
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 8 times

Post by Skirda »

Smitis, а... рестарт зачем?

Тебе достаточно сделать (в меню):
1. Прописать макрос в реестре
2. Перезагрузить ВСЕ макросы из реестра - macro:load

После п.2 FAR будет знать о твоем макросе.

Можно, между п.1 и п.2 сделать "macro:save", на тот случай, если...

Для противников FARCmds - читаем про команду ACTL_KEYMACRO
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

Post by Smitis »

Skirda
Хмм... Дествительно зачем? Привычка...
Сегодня поэксперементирую.

П.С.
На самом деле у меня попутно и некоторые другие настройки меняются. Надо бы мне второй способ добавить - только макросы без закрытия ФАРа.
wolf
Posts: 1030
Joined: Fri 08 Apr, 2005 12:54
Location: Moscow

Post by wolf »

Smitis
ты бы поделился своим FarRestart.bat и macro\*.fmex что-ли.
раз уж это
Вполне реальная рабочая схема. Работает у меня уже более 7 (семи) лет.
Тяжело это дело всё запаковать и приатачить к очередному сообщению, что-ли?
В основном конечно интересует компилятор тектовика *.fmex в регфайл.
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

Post by Smitis »

wolf wrote:ты бы поделился своим FarRestart.bat и macro\*.fmex что-ли.
Ну вот. Шедевр скриптотворчества. Сильно прошу не пинать.
Подредактировал, причесал...
FAR_ReloadMacros.cmd
Связка CMD+KIXTART в одном файле. Почему kixtart? Просто он был под рукой в командировке, когда в голову пришла эта дурацкая идея. Работает ТОЛЬКО под XP (2000, 2003, etc.). В принципе, можно адаптировать под 9х. Собственно, под неё первоначально и делалось, только расширенных макросов тогда не было. Но желания адаптировать нет. И системы 9х под рукой для экспериментов тоже нет.
Будучи запущенный без параметром /R, создаст FAR_Restart.bat куда пропишет сам себя с параметром /1 (это если используется с перезапуском ФАРа).
С параметром /M обновляет только макросы и клавиши плагинов. Запускать через меню; следующей командой должна быть macro:load (должен быть установлен плагин FarCmds.dll).
Без параметров ничего в реестр не пишет, создаёт в ТЕКУЩЕЙ папке два файла freg.tmp и fmex.tmp с результатами своей работы.

Kixtart можно взять сдесь: http://kixtart.org/
Специальная установка не требуется. Можно взять из архива один файл kix32.exe и кинуть куда-нибудь, где ось его найдёт. Например в %windir%\system32. По идее, должно работать и в папке с ФАРом.

В начале проверяется переменная среды %fardir%. У меня она устанавливается в командном файле, через который запускается ФАР. Можно поменять её на farhome, те, кто использует одноимённый плагин. Если этой переменной нет - она устанавливается равной пути, откуда запущен скрипт.

Используемая структура папок (в папке ФАРа):
  • Macros - Основная папка с файлами макросов (*.fmax, *.fmex)
  • Macros\First - Эти макросы будут загружены в первую очередь и сдесь не дожно быть файлов *.fmex (они могут быть, но особого смысла в этом нет). В последствии, эти макросы могут быть переопределены в других файлах. У меня сдесь заглушки для отключения хоткеев для вызова Tree (ну не люблю я этот режим), заглушки для отключения Alt-буква и Alt-Shift-буква. Раньше было больше...
  • Macros\Editor и другие - макросы по темам
  • Macros\Local - макросы, зависимые от компьютера (переменная %CompName%, устанавливаю сам)
  • Archivers - для настройки MultiArc-а
  • CodeTables - для настройки кодовых таблиц
  • Config, Config\Once - для экспериментов (в текущей версии временно убрал)
Принцип работы:
  • Из файлов *.fmac *.ftab *.farc *.ftab командами copy собирается рег-файл. Попутно собирается новый custom.ini. С ключом /M собирается только рег-файл из *.fmac. В начало рег-файла помещаются строки для удаления необходимых разделов.
    Внимание! Скрипт удаляет разделы HKCU\Software\Far\KeyMacros и HKCU\Software\Far\PluginHotKeys. Все необходимые настройки горячих клавиш для плагинов должны быть сделаны в файлах макросов! Без ключа /M также удаляются разделы HKCU\Software\Far\Plugins\MultiArc, HKLM\Software\Far\Plugins\MultiArc и HKCU\Software\Far\CodeTables.
  • Из файлов *.fmex собирается общий "fmex" файл со структурными макросами
  • Kixtart обрабатывает этот файл, дописывая результат в общий рег-файл.
  • Импортируется рег-файл через regedit
Структура fmex достаточно проста. Скрипт определяет тип строки по первому символу, отличному от пробела.
Типы строк:
  • ; - Коментарий (строка пропускается).
  • [ - Тоже коментарий (так сложилось исторически).
  • ! - Начало макроса. В этой строке перечисленны названия клавиш (может быть несколько), разделённые пробелами. После ! пробел не обязателен.
  • # - В этой строке перечислены через пробелы разделы реестра (области действия), в которых будут определены макросы.
    Пример:
    # Shell, Search, Editor, Common
  • > - Так же, как и # определяет области действия, но глобальные. Если для какого-то макроса область дествия специально не задана, будут использованы значения, заданные такой строкой. По умолчанию содержит одно значение Shell. Каждая такая строка определяет новые глобальные значения. Эти строки не привязываются к какому-то конкретному макросу, заданому строкой !.
  • + - Строка с параметрами через пробелы, значения которых будут установлены в 1 - в реестр будут добавлены строки вида "NotEmptyCommandLine"=dword:1 Всегда добавляется параметр "DisableOutput"=dword:1, даже если он не указан. Для его отключения существует псевдо параметр EnableOutput.
    Пример:
    + EmptyCommandLine NoPluginPanels Selection
  • & - Строка задаёт горячие клавиши для меню плагинов.
    Пример:
    & 7ZIP/7-ZIPFAR.DLL <7> <7>
    & 7ZIP/7-ZIPFAR.DLL%1 <8>
    Первый символ в угловых скобках - для меню плагинов F11. Второй - для меню настроек. Если нужен только второй, вместо первого необходимо поставить <> (то же можно поставить и вместо второго). Строки с горячими клавишами не должны "залезать" в макрос.
    Вообще, мне кажется, горячие клавиши плагинов - неотъемлемая часть макросов. Поэтому им сдесь уделено столько внимания.
  • - Все остальные непустые строки от строки ! до следующей строки ! или & собираются в одну строку, которая будет помещена в реестр в параметр Sequence.
Символ "", который требовался для файлов реестра перед символом "" и кавычками не требуется.

ToDo:
- Макросы для разных пользователей (подраздел реестра FAR\Users)
- FAR\Macros\Vars
Attachments
FAR_ReloadMacros.rar
(2.6 KiB) Downloaded 667 times
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

Post by Smitis »

Парочка переделаных примеров со страницы
http://api.farmanager.com/ru/macro/examples.html

Code: Select all

; Создание папки с именем = текущей дате
! CtrlShiftF7
# Shell Search
+ NoPluginPanels
%folder=date("%d.%m0.%Y");
$If (!fexist(%folder))
  F7 CtrlY $Text %folder Enter
$End

; Искать тот же файл на другой панели что и на активной
; F5 ShiftEnter CtrlIns - применено чтобы получить имя файла вне зависимости
; пусто/непусто в cmdline и сколько выделено на панели файлов
! CtrlAltLeft CtrlAltRight
# Shell Search
$IClip
$If (((Bof && APanel.Root) || !Bof) && PPanel.Visible)
  $If (fexist(PPanel.Path+"\\"+APanel.Current) == 1)
    F5 ShiftEnter CtrlIns Esc
    Tab Home
    Alt< ShiftIns Esc
  $End
$End

; DisableOutput везде включается по умолчанию

wolf
Posts: 1030
Joined: Fri 08 Apr, 2005 12:54
Location: Moscow

Post by wolf »

Smitis
Так всю папку macro - выложить постеснялся, или жаба душит?
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

Post by Smitis »

wolf wrote:Smitis
Так всю папку macro - выложить постеснялся, или жаба душит?
Постеснялся. Вот только чуток в порядок приведу :)

А пока более универсальная новая версия 2.00 (неспится, что-то :) )
Использование: FAR_Macros folders user
user пока не используется
folders список папок с макросами ОТНОСИТЕЛЬНО папки, в которой находится скрипт. Предполагается, скрипт находится в папке с макросами. Папки перечисляются через точку с запятой. Вложенные папки не обрабатываются. Если где-то есть пробел, весь список заключить в кавычки. Для задания папки, в которой находится скрипт, использовать точку. Если список не задан, будет использован мой :) т.е. как если бы использовался вызов FAR_Macros First;.;Utils;Editor;Files;Plugins;Apps

Кому не нравятся непонятные значки в начале строк, теперь можно использовать:
- вместо ! использовать .m или .macro или .macros (отделять пробелами от остального);
- вместо # - .s или .sections
- вместо + - .p или .params или .parameters
- вместо & - .h или .hotkey
- вместо > - .g или .global

Те же примеры могут начинаться так:

Code: Select all

.M CtrlShiftF7 
.S Shell Search 
.P NoPluginPanels 

.macros CtrlAltLeft CtrlAltRight 
.sections Shell Search 
Attachments
FAR_Macros.rar
FAR_Macros.cmd v.2.00
(2.31 KiB) Downloaded 664 times
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

Post by Smitis »

Кто хотел в моих макросах покопаться - разгребайте ;)
Attachments
Macros.rar
(16.76 KiB) Downloaded 740 times
Rek>pth
Posts: 16
Joined: Wed 09 Nov, 2005 05:08

Post by Rek>pth »

Вот бы плагин, который читал описания в макросах и представлял их в виде помощи по горячим клавишам!
User avatar
HaRT
Moderator
Posts: 10858
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

Post by HaRT »

Rek>pth
Если не гнаться за минимальным числом нажатий, то по клавише узнать описание макроса и так несложно:
1. Средствами самого Фара узнать, назначен ли макрос на данную клавишу.
2. В Реестре посмотреть описание макроса.

Продолжение
Last edited by HaRT on Thu 01 Jan, 1970 01:00, edited 0 times in total.
Reason: Продолжение
Post Reply

Return to “Обсуждение макросов”