IzhNews
#0D
28 февраля 2003 |
|
IS-DOS - Макросы в IS-DOS.
Макросы в 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 и в самом начале работы постави- ли дату. Вот эта дата и распечатается! ──────────────────────────────────────────
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября