[an error occurred while processing this directive]
.сс
.лв
2 Редактор СП "Паскаль"
_______________________________________________________________
.ов
Как упоминалось в предыдущей главе, программы на Паскале должны быть подготовлены с помощью текстового редактора для компиляции перед выполнением. Эта глава описывает использование команды EDIT, которая доступна в командном режиме СП "Паскаль".
2.1 Вход в редактор
Имеется два способа входа в редактор - с или без имени файла. Если введена команда:
EDIT
на экране редактором будет отбражаться текст, находившийся в памяти машины до входа в редактор. Если в памяти не было никакого текста, редактор отобразит пустой экран, на котором можно будет набрать текст новой программы.
Второй способ вызова редактора - набрать за командой имя файла, например:
EDIT agat
где 'agat' может быть любой файл, содержащий текст программы. В этом случае текст программы загрузится в память, и его можно будет отредактировать.
Так как минимальное сокращение EDIT - E., то в последнем случае будет достаточно набрать 'E.agat'.
Далее предполагается, что во время ввода команды EDIT в памяти нет текста программы.
Как только команда EDIT введена, экран очищается кроме верхней и нижней строк. На верхней строке отображен знак '*' ('ъ' для MODE 7). Тот факт, что он расположен в начале первой строки, говорит о том, что в памяти нет текста. Прямо под маркером конца текста расположен мигающий курсор, показывающий, где будет помещен символ, нажатый на клавиатуре.
2.2 Строка состояния
Нижняя строка экрана отображает информацию о различных режимах редактирования. При первом входе в редактор строка состояния выглядит так:
#Insert0 mark(s)
Это означает, что редактор находится в режиме вставки, копирование не активизировано и ни одного маркера не установлено (объясняется ниже). Когда редактор находится в режиме исправления, копирование активизировано и два маркера установлены, строка состояния выглядит следующим образом:
#Over * 2 mark(s)
символ '*' означает активизацию копирования.
2.3 Работа в режиме вставки
Когда пользователь впервые входит в редактор, установлен режим вставки, т.е. при нажатии клавиши на месте курсора появляется символ, а все символы, находящиеся в той же строке, справа от курсора смаещаются на одно знакоместо вправо. Режим исправления описывается в разделе 2.9. Для иллюстрации некоторых возможностей редактора ниже приведен пример программы на Паскале, который мы наберем вместе с Вами:
.сс
.лв
program charSet(output); { Prints the ASCII character set } var ch:char; begin forch:=chr(32) to chr(126) do write(ch); writeln end.
.ов
Сначала наберите верхнюю строку, как показано выше. Если вы нажали не ту клавишу, нажмите f. (точка на функциональной клавиатуре), чтобы удалить ненужный символ после курсора. Если вы благополучно добрались до конца строки, нажмите <ВВОД>. В тех строках, где сделаны отступы от левого края надо нажать несколько раз стрелку 'вправо'.
Думаю, что оставшиеся строки уже не вызовут затруднений, даже если они были вначале.
2.3.1 Выполнение программы
На данном этапе, если текст набран правильно, можно приступить к компиляции. Для этого надо сделать следующее:
Нажмите f4''(см. раздел 2.4)
Система перейдет в командный режим и напечатает промпт '%'. Наберите COMPILE <ВВОД>.
.сс
.лв
%COMPILE <ВВОД> ISO-Pascal compiler V. 1.00 1 0 - program charSet(output); 2 0 - { Prints the ASCII character set } 3 0 - var 4 0 -ch : char; 5 0 - 6 0 - begin 7 0 -for ch:=chr(32) to chr(126) do 8 0 -write(ch); 9 0 -writeln 10 0 - end.
0 Compilation error(s) Code size = 72 bytes
%GO <ВВОД> !"#¤%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ %EDIT <ВВОД>
Нажатие f4'' приводит к выходу из редактора в командный режим. Редактируемый текст при этом не портится. Команда COMPILE - простейшая форма компиляции (из памяти в память), при этом исходный текст программы выбирается из памяти и объектный код помещается в память. Значение отдельных полей листинга компиляции объясняется в следующей главе.
Если компилятор не обнаружил ошибок в исходном тексте, объектную программу можно выполнить с помощью команды GO. В нашем примере это приведет к печати последовательности символов.
После исполнения программы вы можете изменить ее, вернувшись в редактор командой EDIT (или E.). Оставшаяся часть этой главы посвящена более подробному изучению возможностей редактора СП "Паскаль".
2.4 Использование курсорных клавиш
.лв
КлавишаДействие ВВЕРХ'Перемещение вверх на одну строку ВНИЗ'Перемещение вниз на одну строку ВЛЕВО'Перемещение влево на один символ ВПРАВО'Перемещение вправо на один символ ВВЕРХ''Перемещение вверх на один экран ВНИЗ''Перемещение вниз на один экран ВЛЕВО''Перемещение в начало строки ВПРАВО''Перемещение в конец строки ВВЕРХ'''Перемещение в начало текста ВНИЗ'''Перемещение в конец текста
.ов
Теперь, когда мы имеем текст для редактирования, можно начинать изучение различных функций редактора. Прежде всего, надо освоиться с перемещением курсора по тексту программы. Для этого используются четыре стрелки - клавиши управления курсором.
Действие, вызываемое нажатием любой стрелки определяется не только тем, какую стрелку вы нажали, но и тем, в каком состоянии находится функциональная клавиатура (это относится и к функциональным клавишам 0-9). Возможны три режима 1, 2, и 3. Выбор режима осуществляется нажатием клавиш F1, F2, F3 в нижней части клавиатуры. В принятой системе обозначения для ОС "Оникс", если режим функциональной клавиатуры имеет значение, он показывается количеством штрихов после наименования клавиши, например f5''' означает нажатие функциональной пятерки, при этом, если функциональная клавиатура не находится в третьем режиме, нужно сначала нажать клавишу F3.
Действие клавиш управления курсором описано в таблице вначале данного раздела.
2.5 Режим редактирования курсором
Использование клавиши f= в редакторе отлично от ее использования в командном режиме. Обычно, для копирования какого либо текста при наборе команды, стрелки служат для перемещения копирующего курсора в требуемую точку экрана, затем для копирования используется клавиша f=.
В редакторе активизация процесса копирование осуществляется нажатием f=''. Затем курсор перемещается в требуемое место, и нажатием f=' производится копирование требуемого текста. Выход из режима копирования осуществляется нажатием РЕД.
Когда активизирован режим копирования, редактор помещает символ '*' в строке состояния.
Другое практическое применение режима копирования заключается в возможности использования функциональных клавиш для ввода последовательностей символов, также как и в командном режиме. Например, если предварительно была выполнена команда '*key0begin', то последовательность нажатий f='' f0' вызовет ввод слова begin в текст программы.
2.6 Дополнительные функции редактора
Может показаться, что выше сказанного вполне достаточно, чтобы редактировать и набирать тексты программ. Однако редактор СП "Паскаль" предоставляет дополнительные возможности делающие общение с редактором более эффективным. Эти функции активизируются нажатием той или иной функциональной клавиши.
Так как одна и та-же функциональная клавиша может выполнять различные действия, выше было введено понятие режима функциональной клавиатуры. Например, нажатие клавиши f0' вызывает поиск строки с требуемым номером, в то время как f0'' включает или выключает индикацию концов строк.
2.7 Запись, чтение и вставка текстов
При работе с редактором невозможно обойтись без записи и чтения файлов. Предоставляется три функции работы с файлами в редакторе:
f2' Чтение файла f3' Запись файла f2'' Вставка фрагмента
Кроме того имеются дополнительные функции:
f4'' Выход в командный режим f8' Печать текущего текста f9' Восстановление старого текста f9'' Удаление текста
Нажатие f3' вызывает печать промпта:
#Save [prog1]:
В ответ Вы должны ввести имя файла, под которым текст должен быть записан на диск. В случае ошибки, система выдаст сообщение и предолжит нажать пробел для продолжения работы.
Если вы нажмете ВВОД без имени, редактор будет использовать 'текущее' имя, т.е. имя, использованное в последней функции чтения файла. Оно отображается в квадратных скобках после '#Save'. Текущее имя изменяется при каждой новой загрузке файла.
Можно записать только фрагмент редактируемого текста. Для этого надо поставить маркер в начале записываемового фрагмента, переместить курсор в конец фрагмента и нажать f3'. Как ставить и убирать маркеры объясняется в разделе 2.11.
Для загрузки текста используется функция f2'. В этом случае промпт будет иметь следующий вид:
#Load []:
В данном случае нет 'текущего' имени, и оно обязательно должно быть введено до нажатия ВВОДа. Эта функция удаляет текст находящийся в памяти. Реакция на ошибку аналогично предыдущей функции. Если файл слишком большой и не помещается в памяти, выдается сообщение 'File too long'.
f2'' вставляет фрагмент начиная с указанного места редактируемого текста. Теперь промпт имеет вид:
#Insert [pas_1]:
на который надо ответить вводом имени файла. Содержимое файла вставится, начиная с места курсора. При этом текст до курсора окажется нетронутым, а текст после курсора, сдвинется таким образом, что будет помещен сразу после конца вставленного фрагмента. Эта функции особенно эффективна при наборе часто используемых процедур. Обратите внимание, что после вставки фрагмента 'текущее' имя изменится.
Нажатие f4'' приводит к выходу в командный режим. При этом текст программы остается в памяти, и если вы забыли его записать, еще не поздно вернуться в редактор и сделать это. (Команды LOAD и RUN вызывают потерю текста программы.)
Для выдачи текста программы на принтер следует нажать f8'.
Нажатие клавиши f9'' вызывает потерю текста. В случае случайного нажатия f9'' или клавиш СБР+УПР можно восстановить потерянный текст нажав f9' (в последнем случае необходимо повторно войти в редактор командой EDIT).
2.8 Режим вставки и исправления
f1'' служит переключателем режимов вставки/исправления.
Выше рассматривался режим вставки. После входа в редактор, текст, набираемый на клавиатуре вставляется в документ, а все символы, находящиеся правее курсора сдвигаются вправо. Чтобы исправить какое нибудь слово, надо удалить его, а затем набрать новое. Иногда бывает удобнее сразу набрать новое слово поверх имеющегося.
В редакторе можно переключиться из режима вставки в режим исправления и наоборот нажатием f1''.
Строка состояния при этом показывает текущий режим редактирования: 'Insert' или 'Over'. Нажмите несколько раз f1'', чтобы посмотреть реакцию строки состояния.
Чтобы лучше почувствовать разницу между режимами вставки и исправления нажмите f1'' (строка состояния должна отображать слово 'Over') и переместите курсор в начало строки, содержащей текст. Теперь наберите что нибудь.
2.9 Специальные символы в тексте
f0'' служит для включения и выключения отображения символов перевода строки.
Вначале, редактор не отображает переводы строк, однако нажатие f0'' делает их видимыми. Повторное нажатие этой клавиши снова делает переводы строк невидимыми.
Сделав переводы строк видимыми можно увидеть, где есть ненужные пробелы, т.е. те пробелы, которые отделяют перевод строки от ее символьной части.
Символы с кодами от 127 до 255 (т.е. русские) могут отображаться, если они есть в загруженном тексте, однако нет возможности набрать их в редакторе, для этого надо воспользоваться обычным текстовым редактором фирмы 3SL.
2.10 Манипулирование блоками текста
Имеется три функции редактора, оперирующих с блоками текста:
f8'' Удалить блок f7' Скопировать блок f7'' Переместить блок
Кроме того, необходимо иметь возможность отмечать границы блоков маркерами. Для этого предназначены следующие функции:
f6' Поставить маркер f6'' Удалить маркер(ы)
.сс
2.10.1 Удаление блока
Чтобы удалить блок текста, необходимо указать начало и конец удаляемого блока. Одним указателем служит курсор, а другим маркер. Рассмотрим пример:
The quick brown fox jumps over the lazy dog.
Предположим, что надо удалить две средних строки. Это делается так: переместить курсор к символу 'b' в слове 'brown'. Нажать f6'. Это ставит 1-й маркер на месте курсора. Затем переместите курорсор к символу 'l' слова 'lazy' и нажмите f8''. Это приведет к удалению требуемых строк.
Заметьте, что удалился фрагмент начиная с символа, помеченного маркером и до символа перед курсором. Символ вместе курсора уже не удаляется.
Можно сделать и наоборот, поставить маркер сразу после последнего символа фрагмента, а курсор переместить в начало.
Как только маркер поставлен, Вы не можете ввводить или удалять символы, в противном случае будет выдано сообщение 'Bad marking'.
2.10.2 Копирование блока
Как говорилось выше, можно копировать текст используя клавишу f=. Это может показаться утомительным при копировании больших фрагментов текста. Чтобы использовать функцию копирования блока нам опять потребуется два указателя границ копируемого блока и еще один для указания 'пункта назначения'.
Предположим требуется скопировать следующий фрагмент:
lda #ASC">" jsr oswrch
Это делается следующим образом: переместить курсор к символу 'l' слова 'lda' и нажать f6''. Этим мы поставим первый маркер. Переместить курсор в точку под символом 'j' слова 'jsr' и снова нажать f6'', теперь поставлен второй маркер. Теперь осталось переместить курсор в ту точку текста, куда мы хотим скопировать указанный блок и нажать f7'. Если попытаться скопировать внутрь копируемого блока, т.е поставить курсор между маркерами и нажать f7', система выдаст сообщение об ошибке 'Bad marking'.
2.10.3 Перемещение блока
Эта операция эквивалентна копированию с последующим удалением оригинала. Поэтому не будем на ней останавливаться.
2.10.4 Удаление маркеров
Три операции, описанные выше автоматически удаляют поставленные маркеры по завершении. Однако, может возникнуть необходимость удаления маркеров без манипуляции с фрагментом. Нажатие f6'' удалит поставленный маркер(ы).
Следует отметить, что несколько функций редактора недоступны до тех пор, пока в тексте присутствуют маркеры. Это: набор текста, вставка файла и использование интерактивного поиска и замены.
Строка состояния показывает, сколько маркеров поставлено.
2.11 Скроллинг
Возможно Вы заметили, что как только курсор перемещается близко к верхнему или нижнему краю экрана, текст сдвигается вверх или вниз, а курсор остается на месте. Обычно, это используется, когда до границы экрана (верхней или нижней) остается четыре строки. Эти строки называются 'границами скроллинга'.
Нижняя строка используется в различных операциях поиска. Например, функции f0' и f4', действие которых описывается позднее, отображают критерий поиска в нижнией строке.
2.12 Поиск и замена теста
Здесь описывается одна из наиболее полезных функций редактора. Когда редактируешь большой файл, часто бывает нужно найти какое то слово или фразу и, возможно, изменить их. Просмотр текста вручную очень утомителен и не исключает ошибок. Другая вероятная потребность - перейти к какой либо строке. Это бывает нужно довольно часто, так как компилятор сообщает номера строк, в которых были обнаружены ошибки.
Редактор обеспечивает возможность перехода к требуемой строке, поиска и управляемой замены одной группы симолов на другую, а также замены автоматической замены. Вот эти функции:
f0' Переход к строке по номеру
f4' Найти и заменить группу символов
f5' Подсчитать/заменить группу символов по всему тексту
2.12.1 Переход к строке
Нажатие f0' вызывает печать промпта:
#Line:
после которого надо ввести номер строки, к которой нужно перейти. Если введен номер больший общего количества строк, печатается сообщение 'Not found'. В противном случае на экране отображается фрагмент текста с требуемой строкой на нижней границе скроллинга.
2.12.2 Поиск и ручная замена
Редактор позволяет находить как отдельные слова типа 'begin', так и любые другие последовательности символов, например все переменные, начинающиеся с А. Функция f4' осуществляет поиск групп символов с возможностью их замены.
На нажатие f4' редактор печатает промпт:
#Find and replace:
Вам надо ввести или только искомую группу символов, или искомую группу симолов отделенную от замещающей группы симолов знаком '/'. Например:
begin<ВВОД> for/FOR<ВВОД> =/:=<ВВОД> then/<ВВОД>
В последнем примере слово 'then' будет просто удаляться из текста.
Поиск начинается с места текущего положения курсора, поэтому Вам надо переместить курсор в начало текста, если вы не хотите пропустить что нибудь. Как только редактор найдет запрошенную группу символов в тексте, в нижней части экрана появится строка:
#R(eplace), C(ontinue) or ESCAPE
Если Вы нажмете 'R', будет произведена замена найденной группы сиволов. В случае, если вы не ввели замещающую группу символов, редактор попросит Вас сделать это, напечатав промпт:
#Replace by:
Нажатие 'С' продолжает поиск, а 'РЕД' вызывает прекращение поиска. В случае отрицательного результата поиска выдается сообщение 'Not found'.
2.12.3 Автоматическая замена и подсчет
Функция f5' аналогична f4', но при этом замена осуществляется автоматически от начала и до конца текста. Если замещающая группа символов не введена, производится подсчет повторений введенной группы символов. При нажатии f5' печатается промпт:
#Global replace:
Обычно используются такие варианты:
FRED/JOHN<ВВОД> HELLO/<ВВОД> for<ВВОД>
Заметьте, что в последнем случае производится просто подсчет. Автоматическая замена и подсчет начинается с начала текста, независимо от текущего положения курсора. По окончании операции строка состояния дополняется информацией о результатах поиска (замены), например:
1234 found
Можно ограничить действие автоматической замены установив маркер. Если это сделано, то будет просматриваться только текст между маркером и курсором. Это может оказаться нужным, например в случае замены имени переменной внутри процедуры.
2.12.4 Критерии поиска
Критериями поиска, используемыми в операциях поиска могут быть не только заменяемыме группы символов, но и более сложные выражения. Они могут состоять из постоянных (текста) и переменных частей.
В приведенных ранее примерах в качестве критериев поиска выступали заменяемые группы символов. Однако, используя специальные символы, можно задавть более сложные критерии поиска. При задании критерия поиска можно использовать следующие специальные символы:
. должен быть любой символ @ должна быть любая цифра или буква (0-9, A-Z, a-z и _) # должна быть любая цифра (0-9) [xyz] должна быть любая из 'x', 'y', 'z' a-z должна быть любая от a до z ¤ должен быть перевод строки |c должна быть УПР-с |? должен быть символ DELETE (ASCII 127) |!с должен быть символ с кодом с+128 ~c должен быть любой символ кроме c \¤ должен быть ¤ *c может быть несколько c
Символ '.' допускает наличие любого одиночного символа в пределах от ASCII0 до ASCII255. Все специальные символы могут повторяться, например '..' означает 'два любых символа'.
Пример. Подсчитать количество символов в программе:
#Global replace: '.'<ВВОД>
Символ '@' допускает наличие только тех символов, использование котрых разрешено в именах идентификаторов. Символ '#' допускает наличие любой из десяти цифр от '0' до '9'.
Пример. Найти трехзначные константы:
#Find and replace: ###<ВВОД>
Если ни '@' ни '#' не обеспечивают требуемый диапазон символов, можно установить свой собственный, воспользовавшись симолом '-'. Так 'A-F' допускает наличие любой шестнадцатиричной цифры. Другой способ - поместить возможные варианты в квадратные скобки. Только в случае наличия одного из перечисленных символов, слово будет найдено.
Можно комбинировать диапазоны и варианты. Например, для поиска любой шестнадцатиричной цифры можно использовать строку '[0-9 A-F]'. Также можно помещать как вариант и другие специальные символы, например предыдущее выражение можно записать следующим образом: '[#A-F]'. Можно также смешивать диапазоны и обычные символы, например '[a-zA-Z_]' означает: любая латинская буква или символ '_'.
'¤' - способ поместить символ перевода строки в критерий поиска. (Клавиша <ВВОД> не может быть использована по понятным причинам.)
Символ '~' допускает наличие любого символа, кроме указанного. Так '~A' допускает наличие любого символа кроме 'A', '~#' - наличие любого символа кроме цифры, '~A-Z' - наличие любого символа кроме прописной буквы.
Символ '\' отменяет специальное действие следующего за ним символа. Например, '\¤' означает просто символ '¤', а не перевод строки, а '\.' просто точку.
Символ '*' допускает наличие нескольких символов, отвечающих условию, стоящему после него. Так '*.' допускает наличие любых символов, '* ' - наличие нескольких пробелов, а '*A-Z' - наличие нескольких прописных букв.
Пример. Удалить все ненужные пробелы в концах строк:
#Global replace: * ¤/¤<ВВОД>
Это означает 'несколько пробелов, заканчивающихся переводом строки на перевод строки'.
2.12.5 Замещающие группы символов
Также как и критерии поиска, замещающие группы символов могут содержать специальные символы:
¤ означает перевод строки |c означает 'УПР c' |? означает DELETE |!c означает 'символ с кодом c+128' \¤ означает '¤' & означает 'найденный символ' %n означает поле номер n
В приведенном списке, 'c' обозначает символ а 'n' цифру. Действие первых пяти специальных символов аналогично действию в критерии поиска.
Амперсенд '&' имеет специальное значение только в замещающей строке. При замене, вместо него в текст помещается символ из найденной строки, это имеет смысл, если в соответствующем месте критерия поиска использован специальный символ или их группа. Предположим, что нам надо удвоить все цифры в тексте, так, чтобы '1' превратилась в '11', а '123' стал '112233'. Этого можно достичь следующим образом:
#Global replace: #/&&<ВВОД>
Последний специальный символ '%' имеет более ограниченное действие по сравнению с '&'. Символ процента должен сопровождаться цифрой от 0 до 9. Эта комбинация означает 'n-е поле критерия поиска'. Под словом 'поле' подразумевается специальный символ или их группа. Поля нумеруются начиная с нуля. Следующие примеры должны помочь до конца понять выше сказанное.
#Find and replace: A*@+.<ВВОД>
Символы найденного текста, соответствующие группе '*@' являются полем 0, а символ после знака '+', полем 1.
#Find and replace: ##~@* <ВВОД>
Здесь четыре поля: '#', '#', '~@', и '* ' соответственно.
#Finl and replace: *~##*#/<ВВОД>
Находит группу нецифр, за которой идет одна или несколько цифр. Первое поле - это '*~#', второе - '#' и третье - '*#'.
Ниже приведено несколько примеров с использованием специальных символов в замещающей строке:
'Поменять два символа местами'
#Global replace: ../%1%0<ВВОД>
'Убрать знак % из целых переменных Бейсика'
#Global replace: [a-zA-Z_]*@\%/%0%1<ВВОД>
'Поместить знак ¤ после имен всех переменных, начинающихся на S_ и удалить S_'
#Global replace: S_*@~@/%0\¤%1<ВВОД>
2.13 Использование макрокоманд
f1' Выполнение команды операционной системой.
Как упоминалось ранее, можно генерировать последовательность символов нажатием одной функциональной клавиши в режиме редактирования. Так как командам редактора соответстуют коды начиная со 127, их можно поместить в виде определения функциональной клавиши.
Наиболее эффективно это в случае необходимости частого использования операции замены. Код операции автоматической замены - 133. Для его обозначения используется строка '|!|E'. Таким образом, чтобы создать макрокоманду удаления ненужных прлбелов нужно выполнить следующую процедуру:
Сначала нажать f1' для входа в режим выполнения команды операционной системой. Затем набрать следующее:
KEY0|!|E* ¤/¤|M<ВВОД> <ВВОД>
Последовательное нажатие f='' и f0' вызовет выполнение запрограммированной макрокоманды. Ниже приводится список строк, эквивалентных функциям редактора.
Функция'''''' f0|!|@|!|P|!<ПРОБЕЛ> f1|!|A|!|Q|!! f2|!|B|!|R|!" f3|!|C|!|S|!# f4|!|D|!|T|!¤ f5|!|E|!|U|!% f6|!|F|!|V|!& f7|!|G|!|W|!' f8|!|H|!|X|!( f9|!|I|!|Y|!) f.|?|?|? f=|!|K|!|[|!+ <ВЛЕВО>|!|L|!|\|!, <ВПРАВО>|!|M|!|]|!- <ВНИЗ>|!|N|!|^|!. <ВВЕРХ>|!|O|!|_|!/
Заметьте, что можно генерировать не толко выполнение последовательности функций редактора, но и управление перемещением курсора.
.ст pascal.3
[an error occurred while processing this directive]