МАКРОСЫ
══════════════════════════
(c) Юрий Буравцов (OneSOFT)
812/01.14
ЯЗЫК ПРОГРАММИРОВАНИЯ
MACROS
ТЕКСТОВОГО РЕДАКТОРА iS-EDIT
Многие со мной согласятся, что редактор
текстов в лучшей в мире операционной среде
для Speccy является самым удобным. Не буду
перечислять всех его достоинств, а тем бо-
лее, недостатков, хотя их перечислить го-
раздо проще. Редактор чрезвычайно удобен
для редактирования больших и малых текс-
тов.
Но помимо очевидных возможностей редак-
тора, существует ещё одна, которой очень
мало уделяется внимания, а стало быть, о
ней имеют представление очень немногие
счастливцы. Речь идет о макросах текстово-
го редактора.
Само понятие макроса или макроопределе-
ния означает, что это есть некоторая пос-
ледовательность символов, которые можно
было бы ввести с клавиатуры, но вместо
этого, последовательность вводится нажати-
ем двух-трёх клавиш. Хранится она в опре-
делённом файле. С самой технологией созда-
ния и использования макросов вообще, поль-
зователи могут быть знакомы по коммуника-
ционной программе Macro-Modem. Правда, в
исдосе это будет несколько посложнее, за-
то, как следствие, и спектр возможностей
побогаче.
Так что же представляет собой этот зага-
дочный макрос iS-EDITOR'а? В принципе, ни-
чего особенного. Только вот при его помощи
можно использовать ВСЕ возможности тексто-
вого редактора, совершенно при этом НЕ КА-
САЯСЬ клавиатуры. Правда перед тем, как
насладиться ленивым созерцанием работы
макроса, вам придётся его создать. Вопро-
сам создания статья и посвящается.
Статья не даром называется "Язык прог-
раммирования...". Ведь заставить машину
думать - это и есть программировать. Язык
этот несколько смахивает на Ассемблер,
только гораздо проще. Конечно, в случае
ошибки машина не повиснет, но текст попор-
тить может. Поэтому, прежде чем записать
макрос, следует выполнить его сначала на
бумажке, потом, так сказать, оттрассиро-
вать и отладить ручным вводом с клавиату-
ры. С приходом достаточного опыта состав-
ления макросов надобность в бумажке от-
падёт.
В системе iS-DOS на рабочем устройстве в
одном каталоге с редактором, т.е. обычно
EDIT\, есть такой файл - ed4(+).ovr. Это
оверлей макросов. Есть ещё один файлец -
ed_mac.txt, в котором и находятся сами це-
почки макросов. Находясь в редакторе, вы
вызываете этот оверлей комбинацией клавиш
Ext/Enter (для драйвера клавиатуры из се-
мейства tt_ext.key), при этом сверху заго-
рается слово "MAC". Оверлей загружает в
память файл с макросами и ожидает нажатия
от вас какой-нибудь клавиши, на одну из
которых "подвешена" определённая цепочка.
Эта цепочка, например, может делать поиск
и замену в тексте, форматировать текст,
изменять настройки редактора, рисовать
псевдографикой и даже менять цвета менюшек
редактора.
Но! Прежде чем начать составлять эти са-
мые цепочки, вам необходимо иметь на руках
хотя бы некоторые коды наиболее часто на-
жимаемых клавиш и реакцию на их нажатие.
Об этом вас проинформирует следующая таб-
лица:
Таблица 1
КОМБИНАЦИИ КЛАВИШ, ИХ КОДЫ И РЕАКЦИИ
╔═══╤══════════════╤═════════════════════╗
║Код│ Комбинация │ Реакция ║
╟───┼──────────────┼─────────────────────╢
║ 04│ CS/3 (Inv) │ Ins/Ovr ║
║ 05│ CS/4 (True) │ Home ║
║ 06│ CS/2 (Caps) │ BIG/small ║
║ 07│ CS/1 (Edit) │ Lat/Рус ║
║ 08│ CS/5 (Left) │ Курсор влево ║
║ 09│ CS/8 (Right) │ Курсор вправо ║
║ 0A│ CS/6 (Down) │ Курсор вниз ║
║ 0B│ CS/7 (Up) │ Курсор вверх ║
║ 0C│ CS/0 (Del) │ BackSpace ║
║ 0D│ Enter │ LineFeed/EndOfInput ║
║ 0E│ Ext/Enter │ Вызов макроса ║
║ 0F│ CS/9 (Graph) │ End ║
║ 10│ SS/A (Stop) │ Escape/PageDown ║
║ 11│ SS/Enter │ Вызов ed0(+).ovr ║
║ 12│ SS/Space │ MainPrefix ║
║ 13│ SS/W (Erase) │ Del справа ║
║ 14│ SS/E (Ins) │ Ins справа ║
║ 15│ SS/Q (PgUp) │ PageUp ║
║ 16│ CS/Space │ ║
║ 17│ CS/Enter │ Tabulation ║
║ 18│ Ext/5 │ На слово влево ║
║ 1A│ Ext/7 │ Выделение блока ║
║ 1B│ Ext/8 │ На слово вправо ║
║ 20│ Space │ Пробел... ║
╚═══╧══════════════╧═════════════════════╝
Если вы забыли код какой-нибудь клавиши,
то вам напомнит о нём программка
S:RES/KEY/ktest.com.
Не буду описывать "горячие" клавиши,
применяемые в различных меню редактора,
вам они должны быть знакомы по хелпам -
там всё о них подробно расписано. Я лишь
приведу несколько примеров использования
макросов при составлении сетевых писем и
при ответах на них.
Пусть нам надо послать кому-нибудь мыль-
це, для этого сформируем "шапку" письма.
Задействуем для этого, например, клавишу
"h" - Head. Вы одним нажатием пишете наз-
вание арии, затем имя одного из ваших лю-
бимых друзей. Десерт - дату и время - пока
трогать не будем, оставим напоследок.
hArea : #0E
││ │└─┴─ запуск оверлея "по новой"
│└─────┴── печать поля арии
└─────── клавиша вызова
1PRIVATE#0E! ┐
2NETMAIL#0E! │
3SPBZXNET.GENERAL#0E! ├ список возмож-
4SPB.CODE#0E! │ ных арий
5HARDWARE.ZX#0E! │
6SPB.SPECCY#0E! ┘
│ │└──┴─ вызов макроса "!"
└────────┴─── название арии
!#0Dfrom : Vasya Pupkin#0Dto : #0E
│ │└─────────────────┼ имя отправителя
│ │ └ "по умолчанию"
└─┴──────────────── "перевод строки"
xSanya Gubkin#0E" ┐
yKolya Shlupkin#0E" ├ список адресатов
zFedya Glupkin#0E" ┘
При необходимости можно дописать поинто-
вые адреса.
"#0Dsubj : Я по жизни крут!#0D#0E@
Можно, конечно, вводить сабж подобно
вводу названия арии и имени адресата, нап-
ример:
7Щас как напугаю!..#0E@
8Пара новостей & Абыдно#0E@
и так далее.
Но вернёмся к автовводу макроса "@":
@#0Ddate : Д#0Dtime : Т#0D#0D#0E$
Здесь мы дату и время условно задали,
чтобы потом записать их при вводе ориджи-
на.
После выполнения последней цепочки, на
экране отобразится следующее:
╔════════════════════════════════════════╗
║Area : NETMAIL - мы нажимали "2"║
║from : Vasya Pupkin ║
║to : Fedya Glupkin - мы нажимали "z"║
║subj : Я по жизни крут! ║
║date : Д ║
║time : Т ║
║ ║
║_ - тут курсор ║
╚════════════════════════════════════════╝
Следующий макрос автовызывается из пре-
дыдущего. А вот теперь проследите внима-
тельно:
$ Hello,#12 qqqqqduaaaaaau
│ ││ ││││ │└ копировать
│ ││ │││└────┴ курсор вниз
│ ││ ││└─── восстановление
│ ││ │└─── удаление строки
│ │└───┴── курсор вверх
└──┴─ комбинация SS/Space + Space
Комбинация клавиш SS/Space + Space - од-
на из основных. Она вызывает главное ко-
мандное меню (префикс), а затем делает его
активным до тех пор, пока не "нажмётся"
пробел.
Курсором вверх мы окажемся в поле "to".
Мы ведь хотим обратиться к своему другу по
имени, которое можно получить из уже гото-
вой "шапки". Как же нам скопировать это
имя? Можно воспользоваться блочным оверле-
ем, но приведённый здесь способ несколько
красивее. Удаляя строку, мы загоняем ее в
буфер, из которого она может быть скопиро-
вана сколько угодно раз. Вот и мы как бы
скопировали её прямо под надпись "Hello,".
Теперь уберем всё лишнее:
#05 #1B#1B#1B#12w#18#08#120
│ │││ ││ ││ ││ │└──┼ удаление слева
│ │││ ││ ││ ││ │ └ от курсора
│ │││ ││ ││ │└─┴ отступаем пробел
│ │││ ││ │└─┴ отступаем слово
│ │││ │└──┼ удалить все, что после
│ │││ │ └ имени
│ ││└───────┴─ шагаем в начало фамилии
│ │└─── выходим из командного меню
└─┴── курсор в начало строки
После выполнения этой цепочки курсор
стоит в начале строки с надписью " Fedya".
Осталось лишь вставить в макрос ещё
кое-что:
#0C#0F!!!#0D#0D
└─┴─ перенос " Fedya" в конец "Hello,"
И вот что получится на экране:
╟────────────────────────────────────────╢
║time : Т ║
║ ║
║ Hello, Fedya!!! ║
║ ║
║_ - тут курсор║
╚════════════════════════════════════════╝
Вот вы и сформировали "шапочку" письма.
Понравилось? Погодите, то ли ещё будет...
Кстати, начиная с версии iS-DOS 4.0 в
макросе появилась возможность повторения
часто встречающихся кодовых последователь-
ностей. Делается это командой:
#R<повторов><длина послед.><послед.>
Например, в вышеприведённой цепочке
вместо "aaaaaa" можно написать "#R61a".
Как видно из примера, новая форма записи
короче исходной на целый байт! А если это,
например, такая последовательность:
$*%$*%$*%$*%$*%$*%$*%
Элемент "$*%" встречается семь раз, сле-
довательно, можно эту последовательность
записать так:
#R73$*%
Выигрыш - восемнадцать байтов.
А теперь скажу одно очень необходимое
условие правильного составления цепочки.
Дело в том, что старый драйвер клавиатуры
имеет буфер длиной 32 байта, а новый -
tt_x+.key - 64 байта. Если ваша цепочка не
уладывается в буфер, то она может быть по-
делена на несколько частей соответствующих
размеру буфера длин, при этом в конце пре-
дыдущей цепочки ставится последователь-
ность: #0E<символ>, а следующая цепочка
должна начинаться с этого символа. Таким
образом, макрос сам себя вызывает. В ка-
честве символа желательно использовать ка-
кой-нибудь нелатинский код, т.к. латинские
коды пригодятся нам для начала других це-
почек.
Ещё один нюанс. При вызове макроса из
себя задавайте выход из префиксов, а потом
заново возобновляйте, т.к. макрос вызыва-
ется только при "чистом" режиме редактиро-
вания текста. Например:
#12 aqduaaqqaaqqawqaq #0EЮ
│└──┼ вызов продол-
│ └ жения цепочки
└ выход из префикса
Ю#12 aqaqaqaqa
└──┴ возобновление префикса
Пусть теперь мы высказали другу всё, что
думаем о себе :), и письмо осталось только
украсить теарлайном, да ориджином. Пусть
это будет делать макрос с названием
"e" - End:
e#05--- iS-DOS v4.5 с макросом#0D * Origi
n: Super Station (812/99.99)#12t#0D#0B
└──┼ курсор в
│ начало
└ файла
Помните, мы отложили напоследок ввод да-
ты и времени? Кажется, настало время это
сделать...
Несколько слов о вводе даты. С версии
4.5 дату вводит команда макроса "#Д" без
параметров. Вещь полезная, но при её про-
изводстве не была учтена возможность
оформления писем, поэтому для нас тут име-
ется недостаточек: например, девятое мая
сего года будет написано так: "9.5.97". То
есть без "тире" и без дополнений нулём.
Поэтому создаётся макрос обработки даты:
0#Д#08#08#0C-#08#08#0C-0#08#08#08#08#0C
Дата должна обрабатываться в самом нача-
ле текста, т.к. в конце макроса произво-
дится удаление с избытком, т.е. если число
у нас - десятое, то наш дополнительный
нуль удалится без особых вопросов. Кстати,
цепочка приведена для периода "Январь -
Сентябрь", а цепочка для периода "Ок-
тябрь - Декабрь" отличается от первой от-
сутствием двух кодов, т.е. выглядит так:
0#Д#08#08#0C-#08#08#0C-#08#08#08#0C
Не забудьте поставить в начале цепочки
макрос "#12t#0D#0B". Он образует пустую
строку над полем "Area".
Ксати, если в файле имеются разные це-
почки, но под одинаковыми названиями, то
выполняется первая встреченная. Такое
свойство позволяет ввести обе наши "дат-
ные" цепочки и менять их местами время от
времени. Подумаешь, два раза в год!..
Теперь перенесём дату на её законное
место:
#20#12 daaaaauq #1B#1B#12w#05#0A#0C
#0A#12w#20
И теперь курсор мигает в поле "time",
предлагая вам ввести время:
╔════════════════════════════════════════╗
║Area : NETMAIL ║
║from : Vasya Pupkin ║
║to : Fedya Glupkin ║
║subj : Я по жизни крут! ║
║date : 09-05-97 ║
║time : _ - тут курсор║
║ ║
║ Hello, Fedya!!! ║
║ ║
║ Не, ну ты на Subj погляди... ║
║ ║
║--- iS-DOS v4.5 с макросом ║
║ * Origin: Super Station (812/99.99) ║
╚════════════════════════════════════════╝
Вот и всё, можно делать "Dry exit".
Теперь поговорим об ответе на письмо.
Пусть мы - адресат, и к нам пришло это
письмо. Прежде всего мы меняем местами со-
держимое полей "from" и "to", затем сос-
тавляем введение-предысторию, квотим при
необходимости, потом отвечаем и ориджиним.
Я назвал эту цепочку "j" - Joy... ;)
j#12t#0A#1B#1B#12 w#R61au #0F#0D#0D#12 u
#R61quq #1B#1B#12 wu#R52aau#R81q0 #0C#0B
#120#0C#12 aaaaduaaaauqqqqqduaaaaauaaa#20
После этих действий на экране творится
такая картина:
╔════════════════════════════════════════╗
║Area : NETMAIL ║
║from : Fedya Glupkin ║
║to : Vasya Pupkin ║
║subj : Я по жизни крут! ║
║date : 09-05-97 ║
║time : 12:34 ║
║ ║
║from : Vasya Pupkin ║
║ ║
║date : 09-05-97 ║
║time : 12:34 ║
║from : Vasya Pupkin ║
║to : Fedya Glupkin ║
║ ║
║ Hello, Fedya!!! ║
║ ║
║ Не, ну ты на Subj погляди... ║
║ ║
║--- iS-DOS v4.5 с макросом ║
║ * Origin: Super Station (812/99.99) ║
╚════════════════════════════════════════╝
Всё это мы накопировали для дальнейшего
"традиционирования" письма. Удалим всё
лишнее, оставив по пробелу слева:
#05#R66#1B#1B#08#120#0B#0A#1B#1B#12w
╟────────────────────────────────────────╢
║time : 12:34 ║
║ ║
║ Vasya Pupkin ║
║ ║
║ 09-05-97 ║
║ 12:34 ║
║ Vasya Pupkin ║
║ Fedya Glupkin ║
║ ║
║ Hello, Fedya!!! ║
╟────────────────────────────────────────╢
Теперь напишем приветствие и предысторию
(всё также автовызовом макроса):
#05 Big friendly hello to you,#0F!!!#0D
#0A "Однажды в студеную..." числа этак
#0A#05#0C#0F ровно в#0A#05#0C#0F #0A#05#0C
#1B#1B#1B#12w писал(а) to#0A#05#0C#1B#1B
#1B#12w#0F:#0A#0A#05
Вот что у нас теперь получилось:
╟────────────────────────────────────────╢
║time : 12:34 ║
║ ║
║ Big friendly hello to you, Vasya!!! ║
║ ║
║ "Однажды в студеную..." числа этак║
║05-04-97 ровно в 12:34 Vasya Pupkin пи-║
║сал(а) to Fedya Glupkin : ║
║ ║
║ Hello, Fedya!!! ║
╟────────────────────────────────────────╢
Ну вот, вроде бы и всё с "шапкой" и
"послешапочным бредом".
В этом примере мы отвечали человеку, ко-
торый написал нам, такой приём - обмен
местами содержимого полей "from" и "to" -
позволяет сохранить поинтовый адрес, если,
конечно, он был. Но если вы участвуете в
эхо-конференции, и вы решили ответить на
письмо одного человека другому, то в поле
"from" надо будет вставлять своё имя. То
есть можно сделать для эх отдельный макрос
со специальной функцией.
Теперь - квотинг. Принцип квотинга мак-
росом основан на помещении в начало цити-
руемой строки редко встречающейся последо-
вательности символов, а при вводе ориджина
она заменяется на инициалы отправителя:
q#05йЫ#0A#12T#0Eq
││ │ │└──┴ зацикливание
││ └──┴ тест на пустую строку
└┴─ согласитесь, редкое слово... :)
Такая цепочка будет квотить фрагмент
текста до первой пустой строки или пока вы
не нажмёте пробел.
Однако, эта цепочка не расчитана на ав-
тоформат текста, и если длина цитируемой
строки превышает длину, определённую в па-
раметрах редактора, а также включен режим
"DOC", то цепочка может совсем зациклить-
ся: она "скинет" строку вниз, а потом сно-
ва перейдёт на неё. В этом случае вы либо
настройте параметры редактора, либо ис-
пользуйте вместо предыдущей следующую це-
почку:
q#05#0D#0BйЫ#05#0A#0C#0A#12T#0Eq
Эта цепочка выполняется несколько мед-
леннее, чем её первый вариант, но зато
можно не лазить в параметры. Кстати, сла-
зить в параметры очень просто:
#12pr100#0D#10
│││ ││ │└─┴─ "нажимаем" SS/A
│││ │└─┴─ "нажимаем" Enter
││└─┴ устанавливаем равную ста символам
│└── "горячая" клавиша правой границы
└── входим в параметры
Не пугайтесь, что письмо "испортилось",
при вводе ориджина всё будет выглядеть са-
мым благопристойным образом.
Если нам надо повторить цитату, то дела-
ем так:
c#05#12fM#0C>#0A>>#0De#0EC
C#12f#05nSe#0A#12T#0EC
Первая цепочка инициализирует оверлей
поиска и зацикливает вторую цепочку до
пустой строки.
Но вот вам лень цитировать целиком всё
письмо, тем более, если оно имеет однотип-
ный характер, то вы удаляете часть текста
и вызываете макрос "s" - Skip:
s#0D[ skipped ]#0D
Или что-то в этом духе. Затем, всё как
обычно, вы пишете ответ и - вот он, орид-
жин с теарлайном:
o#12t#12fM#0C Origin:#0Dne#0B#11mAADD
│ │ │ │
│ │ └────── удаление
└───────────── поиск старого ориджина
Это было удаление старого ориджина вмес-
те с теарлайном, причём удаляется первый
встреченный и всё остальное до конца текс-
та. Удобно при удалении цитированных орид-
жинов писем, пришедших из других сетей.
Длину "до конца текста" определяет коли-
чество символов "A", в нашем случае - со-
рок строк. Но вряд ли дальше этого показа-
теля в письмах может что-либо иметься...
Удаление мы тут делаем безвозвратное, т.е.
файл edit_aux.wet не создаётся.
Продолжим макрос:
#05 С уважением, Fedya.#0D#0D--- iS-DOS v
4.5 с макросом#0D * Origin: GigaStation (8
12/99.98)#12 taaduqqu #1B#1B#08#120#1B#1B
#0D#09#12w#0B#09#12w#05#0A#0C
Здесь мы ещё создали временную строку,
где сформировали инициалы цитируемого. Те-
перь "запихнём" их вместо этого нелепого
"йЫ"-я:
#12 tfM#11> #0AйЫ#0D0,etd #0D#0B
Если вы пишете в Fido, то, вероятно, вам
придётся провести "буква-"Н"-изацию", т.е.
такое мероприятие, которое заменит все
русские буквы "Н" ("эн") на латинские "H"
("аш"), чтоб те не "вылетали". В нашем
случае это удобнее всего сделать после пе-
чати ориджина с помощью поиска с заменой
из конца в начало, т.к. всё равно потом
придётся "прыгать" в начало. Цепочка выг-
лядит так:
#12 fM#0CН#0AH#0D"
│ │ └┬ поиск с заменой
│ │ └ из конца в начало
│ └─ латинская
└─ русская
Сразу после этой цепочки вызываем ту,
которая печатает у нас ориджин.
Осталось только вызвать макрос, который
у нас главный по дате.
Вот и всё, что может макрос. Не так уж
мало, правда? В заключение дам пару-тройку
рекомендаций по составлению своих макрос-
ных цепочек.
1. Создавайте первоначальный вариант на
бумажке. Когда опыт у вас обогатится, то
надобность в бумажке отпадёт (правда, на
Ассемблер смахивает?).
2. То, что вы написали на бумажке, от-
трассируйте и отладьте вручную пошагово,
вводя коды с клавиатуры, естественно :)
3. Если цепочка составлена правильно и
больше редактировать вы её не собираетесь,
то можно трёхсимвольный код вида #<code>
заменить на физический однобайтный код.
Делается это либо оверлеем ed6(+).ovr, ли-
бо через demon.com.
4. Юзайте iS-DOS! Это самая лучшая сис-
тема для обработки писем (и не только,
должно быть... :)
__________________________
────────────────────