Редакторы Форта
Одной из важнейших частей любого языка программирования для ЭВМ является редактор, который служит для ввода и видоизменения программы, в этом отношении Форт не исключение. Удобной особенностью Форта является то, что редактор написан на Форте и может, как и всякая другая программа, легко изменяться с целью адаптации к вашим нуждам и вкусам. Так как редактор - это программа, которую вы будете использовать при программировании на форте наиболее часто, имеет смысл изменить его, если вы не удовлетворены редактором, который вам достался вместе с системой.
Попыток стандартизировать Форт-редактор не предпринималось, за исключением того, что слово EDITOR используется в качестве имени словаря редактирующих операторов (словари рассмотрены в гл.14). При таком разнообразии на рынке аппаратуры (в дополнение к разнообразию мнений о том, что такое хороший редактор), достаточно бессмысленна попытка навязать редактор, приемлемый для всех.
Существует два типа редакторов, поставляемых обычно с Фортом (часто с одной и той же системой). Первый из них строчный редактор, который в соответствии с названием дает возможность модифицировать содержимое блоков форта строчка за строчкой (предполагается, что блок Форта содержит 16 строк по 64 символа). Хотя строчный редактор занимает мало места в памяти и обладает высоким быстродействием, ему свойственны ограничения, связанные с тем, что вы не видите изменений, которые вносите в текст блока в целом. Вторым типом Форт-редактора является экранный редактор, где модификации происходят в месте текста, отмеченном курсором, который можно переместить куда угодно в пределах блока, отображенного на экране. Экранный редактор проще использовать, чем строчный, хотя и за счет большего объема занимаемой памяти.
В этой главе мы рассмотрим типичный, но довольно простой строчный редактор, а затем предложим исходный текст экранного редактора. Если у вас имеется только строчный редактор, вы сможете его использовать для написания предложенного здесь экранного редактора.
Владея работающим экранным редактором, вы можете его использовать для упражнений, предлагаемых в книге, так же как и для совершенствования самого редактора. Даже если вы вполне удовлетворены вашим редактором (многие версии Форта снабжены редакторами, более совершенными, чем приведенный здесь нами). вам следует рассмотреть некоторые наши идеи, прежде чем переходить к гл.13, где описана структура редактора.
Основы редактирования для Форта
Как было показано в гл.10, ввод-вывод для диска осуществляется через резервные зоны памяти, называемые блочными буферами. Как вы знаете, ключевым словом для ввода с диска служит BLOCK, которое загружает содержимое блока с диска в свободный блочный буфер и заносит в стек адрес первого байта этого буфера. Напомним также, что ключевыми словами для спасения блоков информации на диске являются UPDATE, которое помечает буфер блока, чтобы он был спасен, и FLUSH (или SAVE-BUFFERS), которое записывает на диск содержимое буферов, помеченных UPDATE.
Редактирование производится путем переноса содержимого блока с диска в буфер, изменения содержимого этого буфера и пометки буфера таким образом, что его измененное содержимое будет снова записано на диск. В действительности при работе с экранным редактором текст из буфера переносится в другую область памяти, где производится редакторская правка до возвращения текста обратно в буфер. В этом случае измененный текст из буфера редактора переносится в блочный буфер только при условии, что сделанные редактором изменения следует занести на диск. Если текст всегда редактируется непосредственно в блочном буфере, вы будете вынуждены использовать EMPTY-BUFFERS каждый раз , когда вы решите отменить некоторые редакционные исправления. Измененный текст в буфере редактора должен быть перенесен в блочный буфер прежде, чем он сможет быть записан на диск, таким образом уменьшится вероятность занесения на диск нежелательных изменений.
Строчное редактирование
Строчный редактор Форта состоит из набора слов, которые используются для изменения содержимого блоков Форта строчка за строчкой.
Строчный редактор не является "унифицированной" программой, в которой каждое слово, предназначенное для редактирования строки, применяется независимо для изменения отдельной строки текста. Команда n LIST в начале процедуры редактирования присваивает номер блока переменной SCR и отображает содержимое блока, который будет редактироваться (SCR не нужно для системы Форт-83, но большинство диалектов ее используют).
Слова строчного редактора используют число в SCR для идентификации блока, который должен редактироваться, и, кроме того, многие из них требуют при исполнении наличия в стеке номера строки. В табл. 12.1 представлены некоторые типичные команды строчного редактора, которые использовались в устаревшей версии MMSFORTH V 1.9 (MMSFORTH в настоящее время поставляется с мощным экранным редактором). Вы сами можете описать эти слова, основываясь на знаниях, приобретенных в гл.10.
Таблица 12.1. Команды строчного редактора MSFORTHV 1.9.
n A текст Добавить строку, сдвинуть вниз остальные строки: строка помещается в PAD-буфер n D Стереть строку, сдвинуть вверх остальные строки; строка помещается в PAD-буфер n I Ввести строку, сдвинув остальные строки вниз; строка извлекается из PAD-буфера n P текст Поместить текст, следующий за "Р", в строку n n R Заменить строку n строкой из PAD-буфера S Выйти из редактора и спасти все изменения n Т Отобразить на экране строку n; поместить строку в PAD-буфер Q Выйти из редактора без спасения внесенных изменений
При выполнении команды LIST номер блока запоминается в SCR, а его содержимое заносится в буфер. Большинство операторов строчного редактора используют последовательность SCR @ BLOCK для получения адреса памяти, куда был загружен блок с диска (блочный буфер). Редактирование производится непосредственно в блочном буфере, и дополнительно требуется только 64 байта памяти сразу за словом PAD. Эта память служит для размещения строки, которая стерта или введена, так что она может быть позднее использована для ввода или замещения фрагмента текста в блочном буфере.
Простота этого редактора привлекательна, но его возможности, очевидно, весьма ограничены.
Более мощные строчные редакторы снабжены командами для поиска, добавления или замещения фрагмента текста в пределах строки, блока или серии блоков. Эти или другие улучшения могут сделать строчное редактирование более гибким и эффективным. Простой строчной редактор занимает очень мало места в памяти и работает на любом дисплее. Но даже после улучшения строчный редактор не сможет сравниться в простоте использования с экранным редактором.
Экранное редактирование
Экранный редактор представляет собой программу (в противоположность совокупности слов, составляющих строчный редактор), которая загружает содержимое блока в буфер, отображает текст и позволяет изменить текст в соответствии с положением курсора на экране. Все вводы с клавиатуры перехватываются редактором, который распознает вводимый код и выделяет коды, генерируемые командными клавишами, в то время как все прочие "печатные" символы используются для изменения текста. Экранный редактор просто использовать, так как измененный текст всегда на экране, а применение курсора для отметки места, где надлежит что-то изменить, является вполне естественным. Экранный редактор может быть дополнен многими новыми возможностями, такими как дополнительные строчные буферы, так называемые "теневые блоки" для обширных комментариев (см.гл.10), автоматическая простановка даты (дата ставится на верхней строке), средства для чтения и ввода двоичных величин при редактировании блоков данных и многое другое.
Экранный редактор
Наш экранный редактор требует, чтобы ваша версия Форта и (или) ваш видеотерминал имели некоторый контроль над тем, что отображается на экране. Как минимум, вы должны быть способны очистить экран и поместить курсор в верхний левый угол, а также установить курсор в указанную точку экрана. Способы реализации этих функций сильно варьируются от ЭВМ к ЭВМ и от терминала к терминалу. Большинство удаленных терминалов воспринимают последовательности управляющих символов, посланных оператором EMIT, и за счет этого управляют изображением на экране.
Многие ЭВМ со встроенными дисплеями также воспринимают управляющие символы, и кроме того, работают со словами Форта, предназначенными для перемещения курсора и управления экраном. Например, MMSFORTH использует слово PAGE для очистки экрана и РТС для перемещения курсора в позицию, заданную числами в стеке. Мы написали этот редактор для работы с терминалом Lear-SiegeI ADM-31, и если вы используете другой терминал, вам надо модифицировать программу в блоке 2.
Кроме минимальных возможностей по очистке экрана и перемещению курсора многие терминалы (встроенные дисплеи) имеют много других функций. Например, часто бывает предусмотрена возможность стирания символов в интервале от места, отмеченного курсором, до края строки перемещения курсора вверх или вниз на одну строку и т.д. Если ваш дисплей позволяет делать такие вещи, то вы можете сделать работу редактора более удобной, хотя эти усовершенствования, строго говоря, и не являются обязательными. Мы дадим вам советы, как выполнить эти модификации. Наконец, некоторые встроенные дисплеи имеют ЗУ, в которых изображение хранится в виде ASCII символов и которые непрерывно опрашиваются с помощью схемотехнических средств, а их содержимое отображается на экране. Если ваша ЭВМ работает таким образом, можно сделать намного более эффективный редактор. Мы дадим вам некоторые предложения по поводу такого редактора в гл.13, где обсудим структуру этого редактора.
Приведенный ниже текст программы редактора содержит различные советы по модификациям, которые могут сделать его использование более удобным и эффективным. Программа составлена, однако, с тем расчетом, чтобы максимально упростить ее применение и сделать это возможным на максимальном числе ЭВМ. Мы полагаем, что вы используете ее сначала только с совершенно необходимыми, которые совершенно необходимыми, т.е. изменив лишь
0 ( 20 июля 85 Экранный редактор NS 01 из 10) 1 : TASK ; DECIMAL 2 3 32 CONSTANT BL 102/1 CONSTANT 1K 4 64 CONSTANT 64 63 CONSTANT 63 5 10000 CONSTANT PDELAY 5000 CONSTANT SDELAY 6 VARIABLE SCR VARIABLE ROW 7 VARIABLE COL VARIABLE I/R 8 VARIABLE LOWBLK VARIABLE HIGHBLK 9 ( запоминание первого и последнего блоков, которые можно редактировать на вашей ЭВМ) 10 1 LOWBLK ! 169 HIGHBIK ! 11 ; --- ; ( слово, не выполняющее никакой работы) 12 : MODE ( -- ) I/R @ 0= I/R ! ; ( выбор ввод-замещение ) 13 : DELAYS ( n -- ) 0 DO LOOP ; ( задержка на n циклов ) 14 : PAUSE ( -- ) PDELAY DELAYS ; ( длинная задержка) 15 : SPAUSE ( -- ) SDELAY DELAYS ; ( короткая задержка )
0 ( 20 июля 85 Экранный редактор NS 02 из 10) 1 : PADDR ( n--) CREATE , DOES> @ PAD + ; 2 1K 2 * PADDR BLINE ( последняя строка кольцевого буфера) 3 1K 2 * 64 + PADDR LBUFF ( адрес строки для копирования-замещения) 4 : CONTROL ( с--) CREATE DEPTH DUP С, 0 DO DEPTH ROLL С, 5 LOOP DOES> DUP DUP C@ + SWAP DO I 1+ C@ EMIT LOOP ; 6 27 42 CONTROL ( очистка экрана, курсор вверх влево) 7 : 27 EMIT 61 EMIT ROW @ 32 + EMIT COL @ 32 + EMIT ; 8 ( положение курсора в строке Х и столбце Y) 9 ( : PAGE ; : ROW @ COL @ PTC ;)
10 ( Чтобы использовать далее , , , и ) 11 ( необходимо описать их здесь, используя лишь в случае 12 отсутствия прямого позиционирования курсора) 13 ( 28 CONTROL ( перемещение курсора вверх влево) 14 ( : ROW @ ?DUP IF 0 DO LOOP THEN ) 15 ( COL @ ?DUP IF 0 DO LOOP THEN ;)
описания и в блоке 2. Вы можете позднее использовать сам редактор для внесения последующих модификаций, которые допускает ваша ЭВМ, ваша версия Форта и ваш дисплей.
Хотя это весьма простой редактор, он включает в себя некоторые функции, которые полезны и в то же время необычны. Даже если вы удовлетворены редактором, поставленным с вашей версией Форта, для вас будет, вероятно, полезно изучить эту программу, особенно в связи с тем, что мы используем ее в качестве примера того, как следует укладывать и комментировать исходный текст программы.
Если ваша версия Форта содержит пользовательскую переменную SCR, вам следует удалить описание SCR со строки 6. Вы должны также заменить числа 1 и 169 в строке 10 на номера первого и последнего блоков, которые может модифицировать редактор в вашей системе. CONTROL представляет собой слово-описатель, которое формирует слова, предназначенные для генерации последовательностей управляющих символов, число которых задается числом в стеке. Хотя это слово используется здесь только один раз (для в строке 9), оно включено в текст, чтобы позволить вам описать другие управляющие последовательности. Слово определено так, что оно посылает на терминал символ 27, за которым следует код 42.
Описания и в строках б, 7 и 8 выполнены для терминала ADM- 31 и, вероятно, должны быть изменены для вашего оборудования. Описание в строке 7 показывает типовой способ прямого позиционирования курсора. ADM-31 требует ESC- последовательности из четырех символов вида
ESC "=" (строка) + 32 (столбец) + 32,
где строка (row) и столбец (column) равны номерам строки и столбца, куда должен быть установлен курсор (0 - 23 и 0 - 79).
Когда ESC и "=" (ASCII коды 27 и 61) переданы, к кодам строки и столбца добавляется 32, после чего они посылаются на терминал. Редактор использует переменные ROW и COL для отслеживания положения курсора.
Если ваша версия Форта содержит слова для очистки экрана и перемещения курсора, вы захотите использовать описания на строке 9 (не забывайте поместить в скобки прежние описания). В MMSFORTH слово PAGE очищает экран и устанавливает курсор в верхний левый угол, в то время как PTC устанавливает курсор в положение, заданное кодами в стеке. Вам следует подставить эквивалентные слова из вашей версии Форта. Если у вас нет средств для непосредственного управления положением курсора с помощью слова типа PTC или управляющих кодовых последовательностей, вы можете использовать строки 13 и 14,
0 ( 20 июля 85 Экранный редактор NS 03 из 10) 1 : @CURSOR ( --r с ) ROW @ COL @ ; ( вызов строки и столбца ) 2 : ! CURSOR ( r c--) COL ! ROW ! ; ( запоминание столбца и строки) 3 ( Опишите здесь, если возможно, и и используйте в блоках 3 и 4) 4 : 0 COL ! ; ( перемещение курсора в начало строки ) 5 : 0 0 !CURSOR ; ( перемещение курсора вверх влево ) 6 : BABOVE ( --n ) ROW @ 64 * ; ( число байтов в рядах выше курсора ) 7 : BBELOW ( --n ) 16 ROW @ - 64 * 1К + ; ( байт ниже курсора ) 8 : OFFSET ( --n ) BABOVE COL @ + ; ( число байт в буфере перед курсором ) 9 10 : CPOS ( --адр ) PAD OFFSET + : ( адрес курсора ) 11 : LSTART ( --адр ) PAD BABOVE + ; ( адрес начала строки ) 12 : LEND ( --адр ) LSTART 63 + ; ( адрес конца строки ) 13 14 : BLEFT ( --n ) LEND CPOS - ; ( число байтов в строке слева от курсора) 15
но вам нужно сначала описать слова для перемещения курсора в верхний левый угол (без стирания чего-либо), для сдвига курсора вниз на одну строку и для перемещения курсора на одну позицию. Эти слова могут быть описаны с помощью управляющих кодовых последовательностей, которые описаны с привлечением CONTROL. Эти модификации программы для и - единственное, что необходимо, чтобы заставить редактор работать на любом дисплее, который отображает по крайней мере 16 строк по 64 символа в каждой. Изменения, предлагаемые для других блоков, являются чисто рекомендательными, но сделают работу с редактором
0 ( 20 июля 85 Экранный редактор NS 04 из 10 ) 1 ( Если возможно, Опишите ,,, здесь ) 2 ( для того, чтобы использовать вместо в описаниях ) 3 ( в строках 4, 5, 6 и 7. ) 4 : LEFT COL @ 0 > IF -1 COL +! ( или ) THEN ; 5 : RIGHT COL @ 63 < IF 1 COL +! ( или ) THEN ; 6 : UP ROW @ 0 > IF -1 ROW +! ( или ) THEN ; 7 : DOWN ROW @ 15 > IF 1 ROW +! ( или ) THEN ; 8 : ( -- ) BLEFT SPACES : ( стереть конец строки ) 9 : NEWLINE ( -- ) DOWN ; ( курсор в начало следующей строки ) 10 : SHOWLINES ( -- ) @CURSOR 16 ROW @ ( отображение строк ) 11 DO I ROW ! LSTART 64 -TRAILING TYPE LOOP 12 ! CURSOR ; 13 : SHOWBLK ( -- ) @CURSOR SHOWLINES ! CURSOR ; 14 : TYPELINE ( -- ) CPOS BLEFT 1+ OVER OVER TYPE -TRAILING 15 SWAP DROP BLEFT 1+ - SPACES ;
удобнее и производительнее.
Ваш видеодисплей или терминал может воспроизводить управляющие кодовые последовательности для перемещения курсора в начало строки или в верхний угол экрана. Если это так, то вам следует использовать CONTROL для описания так, чтобы перемещать курсор в начало строки, и для установки его вверх влево. Эти слова могут затем использоваться вместо в описаниях и в строках 4 и 5. Это сделает редактирование более удобным и быстрым.
Редактор будет более быстрым и удобным, если ваше оборудование позволяет и вы можете заменить в строках 4-7 словами, описанными в строках с 1-й по 3-ю или ранее. должно перемещать курсор на предшествующую позицию, - на одну позицию вперед.
Аналогично слово должно перемещать курсор вверх на одну строку. Эти слова могут, вероятно, быть описаны с помощью CONTROL. Ваше оборудование может также позволять замену описания в строке 8 на управляющую последовательность, описанную через CONTROL.
0 ( 20 июля 85 Экранный редактор NS 5 из 10 ) 1 2 ; BCLEAR ( -- ) PAD 1K + 1152 BL FILL ; ( очистка буфера ) 3 : SCLEAR ( -- ) PAD 1K BL FILL SHOWBLK ; ( Очистка экрана ) 4 5 6 : LOADBLK ( -- ) SCR @ BLOCK PAD 1K CMOVE ; ( загрузка блока ) 7 : RESTORE ( -- ) LOADBLK SHOWBLK ; 8 9 : (UPDATE) ( -- ) PAD SCR @ BLOCK 1K CMOVE UPDATE ; ( пометка для спасения ) 10 11 : +BLK ( -- ) SCR @ HIGHBLK @ < IF 1 SCR +! RESTORE THEN ; 12 : -BLK ( -- ) SCR @ LOWBLK @ > IF -1 SCR +! RESTORE THEN ; 13 14 : CLRTOP ( -- r c ) @CURSOR ; 15 : WRITETOP ( r c--) TYPELINE !CURSOR ;
0 ( 20 июля 85 Экранный редактор NS 06 из 10 ) 1 : ?BLK# ( -- ) CLRTOP ." * * * BLOCK#Ж " SCR @ . ( блок# ) 2 PAUSE WRITETOP ; 3 4 : UPDATES ( -- ) (UPDATE) ( пометить блок и показать это ) 5 CLRTOP , " * * * UPDATED Block#: " SCR @ . SPAUSE WRITETOP ; 6 7 : ?CLEAR ( --) CLRTOP ." * * *" X-OUT: (B)uffer, (S)creen ?" 8 KEY DUP 66 = IF DROP BCLEAR 9 ELSE 83 = IF SCLEAR !CURSOR EXIT THEN 10 THEN WRITETOP ; 11 : ?EXIT ( f--) CLRTOP ." * * * EXIT:(S)ave. (Q)uit ?" 12 KEY DUP 83 = 13 IF DROP DROP DROP UPDATE FLUSH 1+ EXIT 14 ELSE 81 = IF DROP DROP EMPTY-BUFFERS 1+ EXIT THEN 15 THEN WRITETOP ;
0 ( 20 июля 85 Экранный редактор NS 07 из 10) 1 : OPENUP ( -- ) ( раздвинуть текст в месте буфера, куда указывает курсор) 2 COL @ 64 < IF CPOS DUP 3 1+ BLEFT ) BL CPOS C! THEN ; 4 5 : OPEN ( -- ) OPENUP TYPELINE ; ( раздвинуть текст в месте, указанном курсором) 6 : TRUNC ( - ) CPOS BLEFT BL FILL ; ( укоротить строку) 7 8 : OVERTYPE ( СИМВ-- ) COL @ 64 < ( заместить символ, на который указывает курсор) 9 IF DUP EMIT CPOS С! COL +! ELSE DROP THEN ; 10 11 : INSERT ( СИМВ-- ) OPENUP OVERTYPE TYPELINE ; ( ввести символ ) 12 : DELETE ( -- ) COL @ 64 < ( стереть символ ) 13 IF CPOS 1+ CPOS BLEFT CMOVE BL LEND C! 14 TYPELINE 15 THEN ;
0 ( 20 июля 85 Экранный редактор NS 08 из 10) 1 : CLINE ( -- ) LSTART LBUFF 64 CMOVE ; ( копирование строки в буфер) 2 3 : PLINE ( -- ) LBUFF LSTART 64 CMOVE ; ( выложить строку буфера) 4 @CURSOR TYPELINE !CURSOR ; 5 6 : KLINE ( -- ) ( стереть строку, занеся ее в кольцевой буфер) 7 LSTART BLINE 64 CMOVE ( перенос текущей строки ) 8 LSTART 64 + LSTART BBELOW CMOVE ( сдвинуть буфер вверх ) 9 SHOWLINES ; ( отображение измененных строк ) 10 11 : ILINE ( -- ) ( ввести строку из кольцевого буфера ) 12 LSTART DUP 64 + BBELOW ) ( сдвинуть буфер ) 13 BLINE LSTART 64 CMOVE ( перенести строку с низа буфера ) 14 SHOWLINES ; ( отображение измененных строк ) 15
0 ( 20 июля 85 Экранный редактор NS 09 из 10) 1 CREATE KEYVECTORS ] ( исполнительный вектор команд редактора) 2 LEFT ( А курсор влево ) BLK# ( в номер блока ) 3 CLINE ( С копирует строку ) DELETE ( D стирает символ ) 4 ?ЕХIТ ( Е уход из редактора ) --- ( F ) 5 MODE ( G перевод в новый режим ) --- ( H ) 6 ILINE ( I ввод строки ) --- ( J ) 7 KLINE ( К стирание строки ) -BLK ( L последний блок ) 8 NEWLINE ( М или ENTER, CR+LF ) +BLK ( N следующий блок ) 9 OPEN ( O раздвинуть текст ) PLINE ( Р вставить строку ) 10 ( Q курсор на место ) RESTORE ( R восстановить экран ) 11 RIGHT ( S курсор вправо ) TRUNC ( Т укоротить строку ) 12 UPDATES ( U пометить буфер )----( V ) 13 UP ( W курсор вверх ) ?CLEAR ( X очистить буфер экрана ) 14 --- ( Y ) DOWN ( Z курсор вниз ) [ 15 : KEYDO ( n -- ) 1- 2* KEYVECTORS + @ EXECUTE ;
0 ( 20 июля 85 Экранный редактор NS 10 из 10) 1 : EDITCASE ( флаг симв -- флаг ) 2 DUP 27 < OVER 0 > AND ( легальный управляющий символ? ) 3 IF KEYDO ( если так. то исполняем команду ) 4 ELSE DUP 31 > OVER 127 < AND ( если нет, печатный символ ?) 5 IF I/R @ ( если да - смотрим, каков режим ) 6 IF INSERT ELSE OVERTYPE THEN ( и вводим или замещаем ) 7 ELSE DROP --- ( но, если символ непечатный, игнорируем ) 8 THEN 9 THEN ; 10 11 : EDINIT ( blk -- ) SCR ! EMPTY-BUFFERS LOADBLK SHOWBLK ; 12 : EDITLOOP ( -- ) edinit 0 BEGIN KEY EDITCASE DUP UNTIL 13 DROP ; 14 : EDIT ( blk- ) EDITLOOP ; 15 : E SCR @ EDIT :
Многие терминалы и ЭВМ позволяют описать слово, которое генерирует звуковой сигнал. Это часто делается путем выдачи кода CTRL G или ASCII 7, называемого BEL. Вы можете описать как 7 CONTROL
или что-нибудь эквивалентное. Если это так, вы можете заменить "---" в блоках 9 и 10 словом , и ваша ЭВМ выдаст вам звуковой сигнал, если вы напечатаете неописанный управляющий или другой символ, который нельзя использовать.
Использование экранного редактора
Теперь поговорим об использовании редактора. Загрузите блоки редактора и, чтобы отредактировать блок с номером "n", выдайте команду n EDIT. Оформленный соответствующим образом блок появится на экране, курсор будет помещен в верхнем левом углу. Раз SCR содержит номер нужного блока (а так должно быть после выполнения вами процедур EDIT или LIST для этого блока), вы просто нажимаете "Е" для редактирования данного блока. Используя команды, перечисленные в табл. 12.2, вы сможете изменить содержимое блока различными способами, пока не получите удовлетворительного результата путем спасения этих изменений или игнорируя их. Экспериментируйте с редактором, чтобы привыкнуть к нему.
Таблица 12.2. Команды экранного редактора, клавиши и их функции
Команды позиционирования курсора Q Курсор на место - в верхний левый угол. W Курсор вверх на одну строку. S Курсор вправо. Z Курсор вниз. А Курсор влево. М Курсор в начало следующей строки (клавиша делает то же самое).
Команды редактирования символов
О Раздвижка текста, смещение остальной строки на один символ. D Стирание, смещение остальной строки на один символ влево). Т Укорачивание, стирание строки справа от курсора. G Установка режима переключения между режимами ввода и замещения. В режиме замещения буква, на которую указывает курсор, заменяется напечатанной буквой. В режиме ввода напечатанная буква вводится в текст, остальная часть строки смещается вправо.
Команды редактирования строк
С Копирование текущей строки в буфер строки. Р Извлечение строки из буфера и укладка ее на место текущей строки.
К Стирание строки и помещение ее в кольцевой буфер (строка не теряется). I Вывод строки из кольцевого буфера.
Команды редактирования блока
U Перемещение буфера редактора в блочный буфер и пометка его для записи на диск (UPDATE), R Восстановление буфера редактора (стирание изменений, восстановление последней записанной версии). L Переход к редактирований последнего (предшествующего) блока. N Переход к редактированию следующего блока. В Отображение номера блока, редактирование которого производится. Х Заполнение пробелами (X-out) кольцевого буфера или экранного или никакого. Е Уход из редактора с (без) записи на диск текста (вам будет предоставлен выбор).
Необычной особенностью редактора является наличие так называемого "кольцевого буфера", который позволяет не терять строки текста, подлежащего уничтожению (стиранию). Когда очередная строка удаляется, она копируется в область "ниже" экрана, и, если стерто достаточно много строк, они могут снова появиться на экране снизу. Если вы поупражняетесь с процедурами стирания и восстановления строк, станет понятно, что на экране отображается только верхняя половина главного буфера, используемого редактором. Часть ниже экрана никогда не отображается непосредственно, но ее содержимое может быть просмотрено путем стирания 16 строк (при курсоре на верхней строке), чтобы содержимое буфера попало на экран. Теперь исходное содержимое экрана находится в буфере. Стирание или ввод 16 новых строк "вращает" буфер в прямом или обратном направлении, что позволяет восстановить исходное состояние буфера. Буфер редактора имеет кольцевую структуру, так что строки не могут быть потеряны. Эта мера облегчает стирание до 16 строк, чтобы избавиться от них или чтобы переместить их в другой блок, введя их туда.
Существуют два способа, чтобы подавить заполнение "скрытого" буфера стертыми строками, которые вы не желаете хранить. Команда X-out заполнит все 16 строк скрытого буфера пробелами, если в ответ на запрос вы нажмете клавишу "В". (Если же вы откликнетесь, нажав клавишу "S", пробелами будет заполнен экран.
При нажатии любых других клавиш ничего не произойдет.)
Если вы хотите избавиться от одной строки, укоротите ее перед стиранием, что исключит загромождение буфера ненужными строками. Использование кольцевого буфера станет вполне простым после того, как вы поупражняетесь с ним.
Существует много способов улучшить редактор, но за счет усложнения текста программы и увеличения требуемой памяти. Некоторые модификации будут предложены в гл.13, но кое-что следует упомянуть здесь. Как уже было сказано, чисто косметической является замена "---" в блоках 9 и 10 на , после чего редактор будет сигнализировать вам, если нажата неописанная управляющая клавиша или поступил символ, который не может быть отображен на дисплее. Вы можете использовать управляющие символы из нижнего регистра путем добавления нескольких битов в маску (см. гл.З).
Если вы можете заменить символ курсора на вашем терминале, вам следует изменить описание MODE в блоке 1, чтобы использовать курсор для индикации действующего режима ввод-замещение. А если вы хотите сменить функции командных клавиш редактора, поменяйте местами слова в массиве KEYVECTORS.
Существуют и другие улучшения, которые можно добавить, если ваш дисплей может отображать 24 строки по 80 символов. Например, блок, подлежащий редактированию, может размещаться в центре экрана. Границы блока могут быть выделены, а неиспользуемая область вокруг блока может быть использована для отображения номера блока, режима ввода и даже меню команд редактирования. Редактор может быть модифицирован (с определенным трудом) для использования на терминалах, которые отображают менее 1024 символов, но многие преимущества экранного редактора при этом будут утрачены, так как весь блок не будет отображен на экране.
Ясно, что используемый вами редактор будет сильно влиять на ваше отношение к Форту. В равной мере верно и то, что свойства редактора, кажущиеся одним важными, могут рассматриваться другими как излишние (и наоборот), так как редактирование в высшей степени индивидуальный процесс.В гл.13 исследуются причины, почему редактор написан так, а не иначе, даются комментарии и оригинальные тексты программы. После прочтения главы вы должны знать достаточно о написании редактора, для того чтобы модифицировать то, что мы предложим, или чтобы добавить функции к редактору, поставленному вместе с вашим Фортом. Если вы почувствовали, что некоторые свойства вашего редактора вас не устраивают, вы не должны проклинать Форт - в ваших руках средства, чтобы написать редактор, который удовлетворит вас в полной мере.