Макросы в IS-DOS.
"Ловите ветер всеми парусами!.."
"Ну, если я чего решил,
то выпью обязательно..."
В. Высоцкий
(c) Колесников Сергей (SKL-KEEPER)
──────────────────────────────────────────
┌┐
├┴┐
└─┘ IS-DOSе я работаю уже давно - целых
пять лет - и, что называется, собаку съел
в этом деле. А вот макросами заинтересо-
вался и стал применять их совсем недавно.
Виной тому недостаток информации: в help-
ах о них упомянуто как-то поверхностно,
неконкретно, да и кто мог знать, что с их
помощью можно значительно облегчить себе
жизнь, поручив компьютеру выполнение тру-
доемких работ?! Только имейте в виду, что
работать с текстовыми файлами в IS-DOSе
имеет смысл только на электронном диске,
иначе все преимущества этого редактора
сойдут на нет.
Начнем с того, что макросы вызываются
из текстового редактора нажатием "EXTEND
MODE". В верхней строке экрана появится
слово "MAC". После этого программа будет
ждать нажатия клавиши, вызывающей макрос.
В файле EDITed_mac.txt должно находиться
описание действий, которые должен произ-
вести макрос, причем это описание должно
начинаться с символа, его вызывающего.
Ну, вот конкретный пример: Вы ведете
большую переписку и некоторые слова, наи-
более часто употребляемые, можете закре-
пить за макросами и вызывать их нажатием
всего двух клавиш - EXTEND MODE и еще од-
ной ключевой. Вот так:
zЗдравствуй,
dДо свидания
sSPECTRUM
В первом примере после вызова макроса
и нажатия "z" компьютер напишет с позиции
курсора слово "Здравствуй,", во втором -
слово "До свидания", в третьем - SPECT-
RUM.
Только надо иметь в виду, что символов
в строке должно быть не более 32 (именно
столько помещается в буфер драйвера). Если
надо написать больший по объему текст,
можно связать макросы в цепочки, вызвав в
конце первого следующий, например:
1Спектрумисты,#0E2
2объединяйтесь!
Код #0E как раз служит для замыкания
макросных строк. После него надо только
указать, какую строку "привязать" к вызы-
ваемой. Цепочку макросов можно замыкать и
саму на себя, т.е. если вы напишете такой
макрос:
1SPECTRUM#0E1,
то программа будет непрерывно печатать
SPECTRUM, пока Вы не нажмете пробел.
Именно "space" и служит для прерывания
цепочки макросов. Можно также в качестве
признака конца цепочки использовать пустую
строку - символ "T" латинское на префиксе
SS/SPACE (код #12).
Следует еще упомянуть о комбинации #R
(Repeat) - повторитель. После него должны
стоять две цифры, первая из которых - чис-
ло повторов, вторая - длина повторяемого
участка. Пример:
#R38SPECTRUM - этот макрос напечатает
слово SPECTRUM три раза (по 8 букв).
#R51#0A - а этот переместит курсор на
пять строк вниз.
Я в своей практике использую макрос для
распечатки "титула" письма (по другому -
углового штампа), вот его текст:
1.dw1(с) SKL-KEEPER.dw0.ds1#0D#0E@
@ aka КОЛЕСНИКОВ Сергей#0D#0Eш
ш Михайлович.ds0#0D#0D#0Eщ
щ355042, Ставрополь,#0D#0Eъ
ъул.Доваторцев 53/2-8#0D#0D#0Eт
ттел. (8652) 77-55-95#0D#0Eю
ю 18.00-22.00 МСК#0D#0D#0Ez
z#R92 Здравствуй,#20
А теперь подробное объяснение. Макрос
вызывается нажатием "1" (после EXTEND MO-
DE, естественно). .dw1, .dw0, .ds1, .ds0
- это коды управления принтером, позволяю-
щие печатать разными шрифтами, я на них
останавливаться не буду. После печати пер-
вой строки в конце ее стоит код #0D, что
равнозначно нажатию "ENTER", т.е. следую-
щую строку будем печатать с новой строчки.
Далее вызывается строчка с символом "@",
печатается, опять переводится строка, и
вызывается следующая по символу "ш". После
нее - дважды перевод строки и вызов следу-
ющей по символу "щ", ну и так далее. Пос-
ледняя строка макроса сообщает программе,
что надо девять раз выполнить печать двух
пробелов, затем слова "Здравствуй,", и на-
печатать еще один пробел.
С помощью макросов можно давать редак-
тору конкретные задачи. Рассмотрим некото-
рые из них. Вот, например, изменение пара-
метров редактора, таких, как длина строки
форматирования:
3#12pr31#0Ds ;31 символ в строке
4#12pr41#0Ds ;41 -"-
5#12pr42#0Ds ;42 -"-
6#12pr62#0Ds ;62 -"-
7#12pr75#0Ds ;75 -"-
Вызывая макрос под символом "3", мы
указываем программе, что необходимо выз-
вать функцию главного префикса (SS/SPACE),
код которой #12, затем вызвать функцию "p"
- настройка параметров редактора, устано-
вить правую границу форматирования "r"
равной 31 символу, "нажать" ENTER и запи-
сать это дело выполнением функции "s"
(SAVE) в файле edit.com. Как видите, все
очень просто: поочередно указывайте, что
надо делать программе, и все!
И писать макросы не так трудно, как ка-
жется на первый взгляд. Просто сначала вы-
полните установленную Вами задачу вручную,
записывая при этом, какие клавиши нажимае-
те, а затем оформите все это в виде мак-
роса.
Для справки вот некоторые коды клавиш,
которые могут Вам пригодиться:
Клавиша Код Функция
CS/1 07 RUS/LAT
CS/2 06 BIG/small
CS/3 04 Ins/ovr
CS/4 05 Home
CS/5 08 Left
CS/6 0A Down
CS/7 0B Up
CS/8 09 Right
CS/9 0F End
CS/0 0C Delete
ENTER 0D
SPACE 20
CS/SS 0E Macro
SS/Q 15 Page UP
SS/A 10 Page DOWN
SS/ENTER 11 Prefix
SS/SPACE 12 Prefix
SS/W 13 Erase
SS/E 14 Insert
CS/SPACE 16
CS/ENTER 17
Только имейте в виду, что ноль для де-
сятков писать обязательно!
Поехали дальше.
Расскажу Вам о конкретном случае из
моей практики. Дело в том, что я сваппер,
мой каталог составлялся постепенно в тече-
нии многих лет и сейчас достигает 460 сек-
торов, или около 120 kB. Но я допустил
ошибку, и демки у меня были не в отдельном
разделе, а вперемешку с играми... Неудоб-
но, согласен! Передо мной встала задача
отсортировать демки от игр, занеся их в
отдельный раздел. Задача немного облегча-
лась тем, что в названии демок я писал
DEMOMUSIC (а иначе как бы я отличал демки
от игр?). Я все время откладывал сортиров-
ку, т.к. вручную это заняло бы слишком
много времени, а этого я себе позволить не
мог :-). И вот, когда я стал изучать мак-
росы, я подумал: "А почему бы не поручить
всю эту работу им?"
Как же составить текст макроса? Ну,
давайте по порядку. Прежде всего, надо
дать задание оверлею поиска, что мы соби-
раемся сортировать (напоминаю, что отличи-
тельная черта демок - это запись в той же
строке слова DEMOMUSIC, а в играх этого
слова нет).
Оверлей поиска (и замены, кстати) вызы-
вается нажатием "F" на главном префиксе
(SS/SPACE). Войдя в этот оверлей, дадим
форму модели - "DEMOMUSIC", а затем выйдем
из него. Эта модель теперь в буфере овер-
лея.
Что бы мы делали, если бы нам надо было
делать эту работу вручную? Сначала мы вой-
дем в главный префикс SS/SPACE код #12
(см. таблицу выше), затем на всякий случай
переместимся в начало файла, т.е. нажмем
"t", далее опять войдем в главный префикс
и нажмем "f" для поиска модели в тексте,
затем "n" (поиск следующей модели). Нач-
нется поиск, компьютер найдет строку, в
которой стоит слово"DEMOMUSIC", далее нам
надо будет выйти из этого режима нажатием
пробела, опять войти в главный префикс,
зафиксировать его пробелом, стереть строч-
ку "d" (delete), переместиться в конец
файла и восстановить стертую строчку нажа-
тием "u" (undelete). Ну и, наконец, выйти
из префикса нажатием пробела. Сделаем эту
программу циклической, иначе она найдет
одну строку, перенесет ее в конец файла и
остановится. А сделать это можно, замкнув
эту цепочку саму на себя кодом #0E. В ко-
нечном итоге вот, что у нас получилось
(макрос вызывается нажатием цифры "2"):
2#12t#12fn #12 dbu #0E2
Результатом его работы станет целый
раздел со строками, содержащими слово "DE-
MOMUSIC". Постойте, а зачем нам раздел, в
каждой строчке которого стоит это слово?
Это уже не rules :-) Мы лучше обзовем этот
самый раздел "Демки" или что-нибудь в этом
роде, а слово DEMOMUSIC уберем, но не
вручную и даже не отдельным макросом, а
лучше пусть этот же макрос в процессе сво-
ей работы еще и удаляет это слово! А чтобы
это сделать, надо лишь немного усовершенс-
твовать уже созданный нами макрос. Но
предварительно надо будет в начале его ра-
боты, когда мы задаем модель, задать еще и
замену (нажатием клавиши "M") в виде девя-
ти пробелов (по числу букв в слове DEMOMU-
SIC). Доработка макроса будет заключаться
только в добавлении трех операций: после
того, как комп восстановил ранее найденную
и стертую строчку, нам надо будет войти
опять в оверлей поиска и замены ("f"),
"нажать" "n" (поиск следующей модели),
программа, естественно, "найдет" эту же
самую строчку, на которой стоит курсор, и
мы с помощью режима "S" (S/Cs) произведем
замену найденной модели на девять пробе-
лов! Вот теперь макрос примет окончатель-
ный вид:
2#12t#12fn #12 dbufnS #0E2
Поясню только, почему перед #0E2 появи-
лось два пробела: первый - выход из режима
поиска и замены, второй - снятие фиксации
макроса.
Ну вот, как видите, не так все и сложно
:-) Нужную нам задачу мы решили.
А теперь давайте попробуем решить за-
дачку посложнее: а если нам понадобится
сделать просто выборку программ из катало-
га по какому-то признаку, не стирая их? В
принципе, можно воспользоваться вышеприве-
денным способом, сохранив потом то, что мы
нашли, а исходный каталог стереть (на дис-
кете-то он все равно останется). Но можно
решить этот вопрос и с помощью макроса,
правда, работать он будет значительно
дольше, чем рассмотренный выше. Остроумную
идею решения такой задачи предложил Крас-
нодарский электронный журнал "Одиссей"
(ныне почивший:-( ).
Итак, каковы наши действия? Загрузим в
редактор файл-каталог. Вызываем главный
префикс SS/SPACE, затем оверлей поиска и
замены "f", вводим модель для поиска и за-
мены, равное модели(!) по количеству сим-
волов число знаков "@" (можно и другие
значки, но желательно пореже употребляе-
мые). Нажимаем SPACE, переходим в начало
файла (#12t), вызываем оверлей поиска и
замены (#12f) и делаем глобальную замену
модели во всем файле на ту замену, что мы
ввели раньше ("g"). Затем меняем модель и
замену местами, что производится вводом
"0" и выходим из оверлея кодом #10:
a#12t#12fg0#10#0Eb
Макрос вызывается по клавише "a", а в
конце строки вызываем вторую строку. В ней
для проверки на завершение макроса прове-
ряем наличие пустой строки ("T"), снова
вызываем оверлей поиска и замены и даем
ему установку найти первую модель в текс-
те, т.к., выполнив глобальную замену, мы
вернулись в точку входа в редактор, т.е. в
начало файла:
b#12T#12fn
Снимаем оверлей SS/A и, вызвав оверлей
блочных операций, маркируем строку, где
стоит курсор:
b#12T#12fn#10#11mm
Выходим в конец файла и снова использу-
ем код #0E для вызова следующей строки
макроса по букве "c", получаем:
b#12t"12fn#10#11mm#12b#0Ec
Возвращаемся в оверлей блочных опера-
ций, вызываем функцию копирования, снимаем
отметку и вызываем следующую строку:
c#11c#10#11o#0Ee
А вот две следующих строки макроса вы-
полняют более сложные функции. Первая,
вызываемая по букве "e", запускает оверлей
поиска и замены, который ищет первую мо-
дель от конца файла, а т.к. это - только-
что скопированная нами строка, то, естест-
венно, она и выбирается. Затем оверлей
производит обратную операцию, возвращая
предыдущую модель и убирая введенную в
первой строке макроса замену. Затем снима-
ем оверлей и возвращаемся в начало файла:
e#12fp#53#10#12t#0Ef
Последняя строка, вызываемая по букве
"f", опять-таки запускает оверлей поиска
и замены, ищет первую модель от начала
файла и производит ту же, что и предыдущая
строка, операцию, т.е. обмен замены и мо-
дели, возвращая ее исходное значение.
Снимаем оверлей и зацикливаем созданный
макрос на строку по букве "b", т.к. первая
нужна нам только раз.
f#12fn#53#10#0Eb
В итоге вот что у нас получилось:
a#12t#12fg0#10#0Eb
b#12t#12fn#10#11mm#12b#0Ec
c#11c#10#11o#0Ee
e#12fp#53#10#12t#0Ef
f#12fn#53#10#0Eb
Попробуйте, работает отлично! А Вы в
это время пойдите попейте чайку или поку-
рите в подъезде (курить вредно! :-) ).
Ну и напоследок еще один макрос, кото-
рый, во-первых, позволит Вам еще больше
разобраться в этом деле, а во-вторых, име-
ет практическое значение в работе.
Иногда бывает необходимо разбить текст
на страницы, особенно если в тексте есть
таблицы и не хочется, чтобы, к примеру,
шапка ее была на одной странице, а осталь-
ное - на другой.
На стандартном листе бумаги формата A4
помещается 62 строки текста, если печа-
тать в полтора интервала. Напишем макрос,
который разобьет наш текст по страницам,
а вызывать его будем, например, буквой
"r".
Итак, прежде всего необходимо перейти
в начако файла, т.к. вдруг Вам понадобится
разбить на страницы wet-файл? Затем перей-
дем на вторую строку макроса, вызываемую
по символу "<", где трижды переведем кур-
сор на страницу вниз (а это три раза по 20
строк) и еще два раза на строку вниз. Те-
перь повторно вызываем префикс SS/SPACE и
ставим значок разделителя страниц "l".
Чтобы процесс продолжался, зацикливаем эту
строку макроса на самоё себя, а первая
строчка нам нужна только раз в начале ра-
боты макроса. Вот что получилось в итоге:
r#12t#0E<
<#R31#10#0A#0A#12l#0E<
И в заключение - самый короткий мак-
рос, который позволит Вам распечатать да-
ту:
d#Д
Я надеюсь, при загрузке системы Вы еще
в autoexec.bat включили строчку вызова
date.com и в самом начале работы постави-
ли дату. Вот эта дата и распечатается!
──────────────────────────────────────────