ZX-News
#27
08 апреля 1997 |
|
Макросы - Язык программирования 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! Это самая лучшая сис- тема для обработки писем (и не только, должно быть... :) __________________________ ────────────────────
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября