Абзац
:: Поиск
:: Поддержка проекта
Webmoney:
  • Z610389805629
  • R427996570517
  • E023541002978
  • :: №9 (14.12.2001) Просмотров: 4546

    Автор: Сергей Колесников / KEEPER.

    Рубрика: Читатель читателю.

    Номер: №9 (14.12.2001).



    Макросы в IS-DOS

    В  IS-DOS`е я работаю уже давно, целых пять лет, и, что называется, собаку съел в этом деле. А вот макросами заинтересовался и стал применять их совсем недавно. Виной тому недостаток информации: в helpах о них упомянуто как-то поверхностно, неконкретно, да и кто мог знать, что с их помощью можно значительно облегчить себе жизнь, поручив компьютеру выполнение трудоемких работ?! Только имейте в виду, что работать с текстовыми файлами в IS-DOSе имеет смысл только на электронном диске, иначе все преимущества этого редактора сойдут на нет.

    Начнем с того, что макросы вызываются из текстового редактора нажатием «EXTEND MODE». В верхней строке экрана появится слово «MAC». После этого программа будет ждать нажатия клавиши, вызывающей макрос. В файле EDIT\ed_mac.txt должно находиться описание действий, которые должен произвести макрос, причем это описание должно начинаться с символа, его вызывающего.

    Ну, вот конкретный пример: Вы ведете большую переписку и некоторые слова, наиболее часто употребляемые, можете закрепить за макросами и вызывать их нажатием всего двух клавиш - EXTEND MODE и еще одной ключевой. Вот так:

    zЗдравствуй,
    dДо свидания
    sSPECTRUM

    В первом примере после вызова макроса и нажатия «z» компьютер напишет с позиции курсора слово «Здравствуй,», во втором слово «До свидания», в третьем - SPECTRUM.

    Только надо иметь в виду, что символов в строке должно быть не более 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 MODE, естественно). .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/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#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 и в самом начале работы поставили дату. Вот эта дата и распечатается!

    © 2004-2013 Perspective group