ZX-News #27
08 апреля 1997
  Софт  

Макросы - Язык программирования MACROS-текстового редактора IS-Edit.

<b>Макросы</b> - Язык программирования MACROS-текстового редактора IS-Edit.
                 МАКРОСЫ
        ══════════════════════════

               (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! Это  самая лучшая сис-
тема  для  обработки  писем  (и не только,
должно быть... :)

        __________________________
           ────────────────────



              



Другие статьи номера:

Oт редакции - Появилась новая газета на BBS - XA-Xafon.

Лит.страничка - Дневник. Дон Громкий. (продолжение)

Макросы - Язык программирования MACROS-текстового редактора IS-Edit.

Обмен опытом - Управляющие символы и последовательности управляющих символов в принтерах стандарта Epson.

Объявления - Реклама и объявления ...

Список BBS - Список BBS. Открылась новая Creative Station.


Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Gamedev - 3D проецирование пола/трассы в играх.
Рассказ - Большое космическое Трахание.
Нострадамус - Гонь от Мишеля Нострадамуса (часть 9).
BBS - список станций BBS ZXNet.
С миру по биту - аналитическая статья на тему игр "Я вас раньше нигде не видел?" (о плагиате).

В этот день...   20 апреля