:: СОДЕРЖАНИЕ НОМЕРА
:: Газетные рубрики
:: АВТОРЫ
:: Поиск
:: Поддержка проекта
Webmoney:
|
:: №9 (14.12.2001) Просмотров: 4641
Автор: Сергей Колесников / KEEPER. Рубрика: Читатель читателю. Номер: №9 (14.12.2001). Макросы в IS-DOSВ IS-DOS`е я работаю уже давно, целых пять лет, и, что называется, собаку съел в этом деле. А вот макросами заинтересовался и стал применять их совсем недавно. Виной тому недостаток информации: в helpах о них упомянуто как-то поверхностно, неконкретно, да и кто мог знать, что с их помощью можно значительно облегчить себе жизнь, поручив компьютеру выполнение трудоемких работ?! Только имейте в виду, что работать с текстовыми файлами в IS-DOSе имеет смысл только на электронном диске, иначе все преимущества этого редактора сойдут на нет.Начнем с того, что макросы вызываются из текстового редактора нажатием «EXTEND MODE». В верхней строке экрана появится слово «MAC». После этого программа будет ждать нажатия клавиши, вызывающей макрос. В файле EDIT\ed_mac.txt должно находиться описание действий, которые должен произвести макрос, причем это описание должно начинаться с символа, его вызывающего. Ну, вот конкретный пример: Вы ведете большую переписку и некоторые слова, наиболее часто употребляемые, можете закрепить за макросами и вызывать их нажатием всего двух клавиш - EXTEND MODE и еще одной ключевой. Вот так: zЗдравствуй, В первом примере после вызова макроса и нажатия «z» компьютер напишет с позиции курсора слово «Здравствуй,», во втором слово «До свидания», в третьем - SPECTRUM. Только надо иметь в виду, что символов в строке должно быть не более 32 (именно столько помещается в буфер драйвера). Если надо написать больший по объему текст, можно связать макросы в цепочки, вызвав в конце первого следующий, например: 1Спектрумисты,#0E2 Код #0E как раз служит для замыкание макросных строк. После него надо только указать, какую строку «привязать» к вызываемой. Цепочку макросов можно замыкать и саму на себя, т.е. если вы напишете такой макрос: 1SPECTRUM#0E1, то программа будет непрерывно печатать SPECTRUM, пока Вы не нажмете пробел. Именно «space» и служит для прерывания цепочки макросов. Можно также в качестве признака конца цепочки использовать пустую строку - символ «T» латинское на префиксе SS/SPACE (код #12). Следует еще упомянуть о комбинации #R (Repeat) - повторитель. После него должны стоять две цифры, первая из которых число повторов, вторая - длина повторяемого участка. Пример: #R38SPECTRUM - этот макрос напечатает слово SPECTRUM три раза (по 8 букв). #R51#0A - а этот переместит курсор на пять строк вниз. Я в своей практике использую макрос для распечатки «титула» письма (по другому - углового штампа), вот его текст: 1.dw1(с) SKL-KEEPER.dw0.ds1#0D#0E@ А теперь подробное объяснение. Макрос вызывается нажатием «1» (после EXTEND MODE, естественно). .dw1, .dw0, .ds1, .ds0 - это коды управления принтером, позволяющие печатать разными шрифтами, я на них останавливаться не буду. После печати первой строки в конце ее стоит код #0D, что равнозначно нажатию «ENTER», т.е. следующую строку будем печатать с новой строчки. Далее вызывается строчка с символом «@», печатается, опять переводится строка и вызывается следующая по символу «ш». После нее - дважды перевод строки и вызов следующей по символу «щ», ну и так далее. Последняя строка макроса сообщает программе, что надо девять раз выполнить печать двух пробелов, затем слова «Здравствуй,» и напечатать еще один пробел. С помощью макросов можно давать редактору конкретные задачи. Рассмотрим некоторые из них. Вот, например, изменение параметров редактора, таких, как длина строки форматирования: 3#12pr31#0Ds ;31 символ в строке Вызывая макрос под символом «3», мы указываем программе, что необходимо вызвать функцию главного префикса (SS/SPACE), код которой #12, затем вызвать функцию «p» - настройка параметров редактора, установить правую границу форматирования «r» равной 31 символу, «нажать» ENTER и записать это дело выполнением функции «s» (SAVE) в файле edit.com. Как видите, все очень просто: поочередно указывайте, что надо делать программе, и все! И писать макросы не так трудно, как кажется на первый взгляд. Просто сначала выполните установленную Вами задачу вручную, записывая при этом, какие клавиши нажимаете, а затем оформите все это в виде макроса. Для справки вот некоторые коды клавиш, которые могут Вам пригодиться: Клавиша/Код/Функция CS/1 07 RUS/LAT CS/2 06 BIG/smal 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 Результатом его работы станет целый раздел со строками, содержащими слово «DEMOMUSIC». Постойте, а зачем нам раздел, в каждой строчке которого стоит это слово? Это уже не rules:-) Мы лучше обзовем этот самый раздел «Демки» или что-нибудь в этом роде, а слово DEMOMUSIC уберем, но не вручную и даже не отдельным макросом, а лучше пусть этот же макрос в процессе своей работы еще и удаляет это слово! А чтобы это сделать, надо лишь немного усовершенствовать уже созданный нами макрос. Но предварительно надо будет в начале его работы, когда мы задаем модель, задать еще и замену (нажатием клавиши «M») в виде девяти пробелов (по числу букв в слове DEMOMUSIC). Доработка макроса будет заключаться только в добавлении трех операций: после того, как комп восстановил ранее найденную и стертую строчку, нам надо будет войти опять в оверлей поиска и замены («f»), «нажать» «n» (поиск следующей модели), программа, естественно, «найдет» эту же самую строчку, на которой стоит курсор, и мы с помощью режима «S» (S/Cs) произведем замену найденной модели на девять пробелов! Вот теперь макрос примет окончательный вид: 2#12t#12fn #12 dbufnS #0E2 Поясню только, почему перед #0E2 появилось два пробела: первый - выход из режима поиска и замены, второй - снятие фиксации макроса. Ну вот, как видите, не так все и сложно:-) Нужную нам задачу мы решили. А теперь давайте попробуем решить задачку посложнее: а если нам понадобится сделать просто выборку программ из каталога по какому-то признаку, не стирая их? В принципе, можно воспользоваться вышеприведенным способом, сохранив потом то, что мы нашли, а исходный каталог стереть (на дискете-то он все равно останется). Но можно решить этот вопрос и с помощью макроса, правда, работать он будет значительно дольше, чем рассмотренный выше. Остроумную идею решения такой задачи предложил Краснодарский электронный журнал «Одиссей» (ныне почивший:-( ). Итак, каковы наши действия? Загрузим в редактор файл-каталог. Вызываем главный префикс SS/SPACE, затем оверлей поиска и замены «f», вводим модель для поиска и замену - равное модели по количеству символов число знаков «@» (можно и другие значки, но желательно пореже-употребляемые). Нажимаем SPACE, переходим в начало файла (#12t), вызываем оверлей поиска и замены (#12f) и делаем глобальную замену модели во всем файле на ту замену, что мы ввели раньше («g»). Затем меняем модель и замену местами, что производится вводом «0» и выходим из оверлея кодом #10: Макрос вызывается по клавише «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 Попробуйте, работает отлично! А Вы в это время пойдите попейте чайку. Ну, и напоследок еще один макрос, который, во-первых, позволит Вам еще больше разобраться в этом деле, а во-вторых, имеет практическое значение в работе. Иногда бывает необходимо разбить текст на страницы, особенно если в тексте есть таблицы и не хочется, чтобы, к примеру, шапка ее была на одной странице, а остальное - на другой. На стандартном листе бумаги формата A4 помещается 62 строки текста, если печатать в полтора интервала. Напишем макрос, который разобьет наш текст по страницам, а вызывать его будем, например, буквой «r». Итак, прежде всего необходимо перейти в начало файла, т.к. вдруг Вам понадобится разбить на страницы wet-файл? Затем перейдем на вторую строку макроса, вызываемую по символу «<«, где трижды переведем курсор на страницу вниз (а это три раза по 20 строк) и еще два раза на строку вниз. Теперь повторно вызываем префикс SS/SPACE и ставим значок разделителя страниц «l». Чтобы процесс продолжался, зацикливаем эту строку макроса на самоё себя, а первая строчка нам нужна только раз в начале работы макроса. Вот что получилось в итоге: r#12t#0E< И в заключение - самый короткий макрос, который позволит Вам распечатать дату: d#Д Я надеюсь, при загрузке системы Вы еще в autoexec.bat включили строчку вызова date.com и в самом начале работы поставили дату. Вот эта дата и распечатается! |