10. ЭКРАННЫЙ РЕДАКТОР ТЕКСТА

       После небольшого, запланированного перерыва мы снова встретились с Алешей у ДВК. Он уже освоил редактор EDIT (а как Вы?) и готов к новым боям. Опыт показывает, что для освоения редактора EDIT требуется не более недели при ежедневной работе за терминалом около 3 часов. Опыт работы с текстовым редактором EDIT должен был показать, что непосредственное редактирование текста (из головы) за экраном не очень эффективно, даже с появлением экранных редакторов. Главная причина в том, что при редактировании текста на бумаге можно одним взглядом охватить несколько страниц, а на экране только 24 строки. Кроме того, в дальнейшем мы получим дополнительные доводы в пользу редактирования старым, дедовским способом на бумаге. Главное же преимущество редакторов текста в писательской деятельности в том, что после исправления старых ошибок, новые не появляются. Кроме того, получение чистого, после изменений, экземпляра рукописи возможно в 20-25 раз быстрее и без существенных эмоциональных и других затрат для автора.
       Экранный редактор KED был создан фирмой DEC для писателей, хотя в дальнейшем программисты настояли на своем. Как бы то ни было, но сегодня это штатный экранный редактор для всех операционных систем фирмы DEC, хотя в начале он создавался для операционных систем RT-11 V4.0, RSX-11M V3.2, RSX-11M/Plus V1. Основные его возможности реализуются при помощи дополнительной цифровой клавиатуры, имеющейся на терминалах VT100, VT52, VT55 и др., которая используется как управляющая. В обычном режиме эта клавиатура дублирует цифровые клавиши основной алфавитно-цифровой клавиатуры. А так как многие фирмы спешно копируют терминал VT100, ставший стандартным в отрасли, то можно с большой вероятностью встретить этот редактор (возможно и под другим названием) в системах других фирм.
       Как любое обожествляемое существо, редактор KED един в трех лицах, т.е фирма DEC поставляет его в трех вариантах:
       — KED — экранный редактор для терминала VT100. Так как на ПЭВМ Professional ("Электроника-85") эмулируется именно этот терминал, то пользователи "Электроники-85" в более выгодном положении.
       — KEX — тот же экранный редактор KED, но предназначенный для использования с монитором расширенной памяти RT11XM. В этом случае рабочие буферы редактора могут быть существенно больше, и тем самым уменьшается число обращений к диску.
       — K52 — более ранние терминалы VT52, VT55 обладали меньшими возможностями, чем VT100, хотя и совместимы с ним по своей концепции. Распространены терминалы VT52 настолько широко (только в соцстранах — это MERA-7953, Videoton-52130, 15ИЭ-00-013), что фирма DEC не могла это не учитывать. Таким образом, редактор K52 — это чуть сокращенная версия редактора KED для терминалов VT52, VT55 и им подобных.
       Так как редактор KED более полный, то изучать мы будем именно его, но по ходу дела мы укажем те шесть команд, которые отсутствуют в редакторе K52.
       Кроме того, следует отметить еще одно обстоятельство — экранный редактор KED много сложнее EDIT (хотя работать с ним много проще) и запомнить все его возможности практически невозможно. К тому же большинство операций, встречающихся на практике, можно выполнить многими различными способами. Поэтому рекомендуется прочитать и попробовать все, что написано здесь про возможности редактора, чтобы представлять пределы его действий. Затем ограничиться основным набором команд, которого, как правило, более чем достаточно, и только после их полного освоения постепенно включать в свой арсенал новые функции и команды.

 

10.1. Загрузка редактора

       — А загружать его нужно так же, как EDIT?— спрашивает Алеша.
       — И да и нет,— отвечаю я,— так как KED внедрялся уже в живую систему, то этот процесс происходил постепенно.
       Во-первых, уже по редактору EDIT ты понял, что основной командой для вызова редактора текстов является EDIT, ключи которого мы сейчас напомним.

       EDIT/CREATE        - создать файл вновь
           /OUTPUT:SPFILE - результат вывести в файл SPFILE
           /INSPECT       - только читать файл
           /ALLOCATE:NN   - зарезервировать для выходного
                            файла NN блоков

       При этом, если не указан ни один из ключей, создается новый файл с тем же именем и типом, а старый переименовывается в файл с типом .BAK. Если указан ключ /OUTPUT со спецификацией файла отличной от исходного, то создается новый файл и исходный остается без изменений (в том числе и спецификации).
       Ключ ALLOCATE используется, если известно, сколько места может занять файл после редактирования. Если он не указан, то память на носителе распределяется стандартным для системы образом. Максимальный размер файла, с которым может работать редактор, равен 16383. блокам. Это примерно в 10 раз больше, чем размер этой книги.
       Во-вторых, также в связи с редактором EDIT мы упоминали, что реально система по этой команде вызывает тот редактор, который установлен по умолчанию. Поэтому, начиная с версии 5.2, для мониторов RT11SJ, RT11FB, RT11AI, RT11BL по умолчанию используется редактор KED; для монитора RT11XM — редактор KEX.
       В-третьих, для ранних версий, начиная с RT-11 V4.0 и далее, можно в команде EDIT с помощью ключей /K52, /KED, /KEX, /TECO (еще один редактор фирмы DEC) явно указать системе, какой редактор мы хотим использовать.
       — И кроме того, напоминает Алеша,— у нас всегда есть силовой прием — вызвать редактор, как обычную программу пользователя:

       .RUN DEV:K52

       После чего редактор вызывает интерпретатор командной строки и ждет ввода спецификации файла. После спецификации файла могут быть указаны ключи:

     /C    - создать файл вновь
     /I    - просмотреть файл (только чтение)
     /A:NN - зарезервировать для файла NN блоков

       В этом случае после закрытия редактируемого файла редактор снова выходит на звездочку, и можно вводить следующую спецификацию файла.

Примечание. Все установленные режимы, а также содержимое всех буферов в таком случае сохраняются. Конец примечания.

       Спецификация файла для вывода редактируемого файла на другое устройство (например, если на одном устройстве не хватает места) задается в формате CSI обычным образом:

       Специф.Выходн.Файла=Специф.Входн.Файла

       Для ОС RT-11 V5.0 и выше, а также для ФОДОС-2 допустимы следующие команды:

       .KED DEV:INPNAM.TYP

если файл существует

       .KED DEV:NAME.TYP/C/A:NN

если файл необходимо создать вновь,

       .KED DEV:INPNAM.TYP DEV:OUTNAM.TYP/A:NN

если выходной файл должен создаваться на другом устройстве или с другим именем.
       — Но в данном случае,— продолжаю я,— разговор о файлах, с которыми работает редактор, на этом закончить нельзя. Дело в том, что KED позволяет пользователю открыть еще два вспомогательных файла.
       — Это что же,— пугается Алеша,— я, кроме указателя текущей позиции, должен держать в голове еще и пути взаимодействия четырех файлов.
       — Ну, во-первых, это не так много,— успокаиваю я его,— в операционной системе Unix редактор Vi позволяет открывать до 10 файлов и все на одном экране — вот это уже много. Кроме того, мы сейчас дадим определения всех файлов и по картинке объясним все пути их взаимодействия, как ты правильно их назвал.

РАБОЧИЙ ФАЙЛ (входной файл)
       — тот, который редактируется. Физически всегда остается без изменения. Если в командной строке не была указана спецификация выходного файла, по завершению сеанса редактирования рабочий файл переименовывается в файл с типом .BAK (запасной), а его имя и тип получает временный файл.

ВРЕМЕННЫЙ ФАЙЛ (выходной файл)
       — файл, в котором происходит редактирование. В этот файл вносятся все изменения. По завершению сеанса редактирования, если результаты должны быть сохранены, получает имя и тип рабочего файла и в следующем сеансе редактирования становится рабочим.

ВСПОМОГАТЕЛЬНЫЙ ВХОДНОЙ ФАЙЛ
       — файл, находящийся на устройстве с произвольным доступом, и может быть открыт для чтения. Информация из этого файла может быть переписана во временный файл в то место, на которое указывает курсор. Курсор устанавливается в конце прочитанного сегмента.

ВСПОМОГАТЕЛЬНЫЙ ВЫХОДНОЙ ФАЙЛ
       — свободная зона на устройстве с произвольным доступом, которая может быть объявлена пользователем как файл для записи, в который записываются выбранные пользователем элементы редактирования из временного или рабочего файлов. Информация в выходной вспомогательный файл записывается всегда в конец, после существующей. По окончании работы с этим файлом его можно закрыть, сохранив при этом информацию, или освободить, оставив при этом свободную зону. Для того чтобы открыть этот файл для чтения, его необходимо сначала закрыть, сделав постоянным.

       И теперь приведем общую картинку для четырех файлов и разберем все случаи открытия файлов, которые мы упоминали.

  +-----------------+     +------------+     +-----------------+
  ! ВСПОМОГАТЕЛЬНЫЙ !     ! КЛАВИАТУРА !     ! ВСПОМОГАТЕЛЬНЫЙ !
  ! ВЫХОДНОЙ   ФАЙЛ !     +------------+     ! ВХОДНОЙ    ФАЙЛ !
  +-----------------+           ! !          +-----------------+
     /  \   / \   ^             ! !             ^        !  !
    /!  !\ /! !\   \           \! !/           /         !  !
     !  !   \ \     \           \ /           /          !  !
     !  !    \ \     +-----------------------+           !  !
     !  !     \ +----!   Ш  Ш  ШШШШ  ШШШШ    !           !  !
     !  !      +-----!   Ш Ш   Ш      Ш  Ш   !------+    !  !
     !  !    +-----\ !   ШШ    ШШШ    Ш  Ш   !>>>>>>>\   !  !
     !  !   />>>>>>>>!   Ш Ш   Ш      Ш  Ш   !---+!!!!\  !  !
     !  !  /!!!!+--/ !   Ш  Ш  ШШШШ  ШШШШ    !    \!!!!\ !  !
     !  ! /!!!!/     +-----------------------+     \!!!!\!  !
     !  !/!!!!/                 / \                 \!!!!!  !
     !  !!!!!/                 /! !\              \ !!!!!!  !/
     !  !!!!!!                  \ \                \!!!!!!/ /
  +-----------------+            \ \         +-----------------+
  !  РАБОЧИЙ  ФАЙЛ  !             \ +--------! ВРЕМЕННЫЙ  ФАЙЛ !
  !    (входной)    !              +---------!    (выходной)   !
  +-----------------+                        +-----------------+

       — Действительно, этот паучок,— говорит Алеша,— показывает, какими путями в какой файл можно попасть. Я уже вижу несколько путей.
       Если мы создаем текст командой EDIT/CREATE, то у нас открыт только один временный файл. Текст в него может попасть, во-первых, из клавиатуры, и, во-вторых, если мы откроем вспомогательный входной файл, то информация из него может быть также переписана во временный файл. В любом случае если мы хотим вставлять свой текст или смотреть вспомогательный входной файл, то должен быть открыт временный файл.
       Если же мы вызвали редактор командой EDIT/INSPECT, то наши возможности ограничиваются только левой частью рисунка. Т.е. у нас открыт только входной файл, из которого мы можем выбирать отдельные куски и, не редактируя, переписывать во вспомогательный выходной файл, если это необходимо.
       Вспомогательный выходной файл,— поясняет Алеша,— получается в таком случае вроде записной книжки. Рабочий файл не изменяется, а выписки собираются вместе.
       — Ну, а какие у нас возможности,— спрашиваю я Алешу,— когда мы просто редактируем рабочий файл, вызывая редактор командой EDIT.
       — Самый простой способ дает самые богатые возможности,— каламбурит Алеша,— с одной стороны, у нас есть главный путь, выделенный толстой полосой, передачи информации — из рабочего файла во временный файл с изменениями, которые вносит редактор по командам с клавиатуры. С другой стороны, мы можем открыть сразу оба вспомогательных файла. Таким образом мы можем отредактировать рабочий файл, записав результаты во временный, и, одновременно, сформировать второй выходной файл, который может, например, содержать конспект нашего доклада, находящегося во временном файле. И во время всего редактирования мы можем брать информацию из наших старых статей, находящихся во вспомогательном входном файле.
       — Но ты не сказал еще об одной возможности,— добавляю я,— когда у нас нет рабочего файла.
       — Т.е. как это?— не понял Алеша.
       — Например,— поясняю я,— мы открываем временный файл, читаем в него информацию из вспомогательного входного файла, немного изменяем ее и выводим во вспомогательный выходной файл, например на печатающее устройство, после чего освобождаем временный файл.
       — Этот пример доказывает,— вступает в дискуссию Алеша,— что временный файл действительно временный. Но подобную операцию можно выполнить и другим способом. Например, входной файл открыть, как рабочий, а после редактирования временный файл освободить.
       — Совершенно верно,— отвечаю я,— но, несмотря на очевидную схожесть этих двух приемов, они применяются в различных ситуациях.
       Первый случай применяется, когда из большого входного файла нужно выбрать небольшую по объему информацию и только после этого вносить изменения. Как правило, в таких случаях нет места для открытия такого же по размеру, как входной, файла.
       Второй случай применяется, когда в рабочем файле хранится какая-либо заготовка, например отписка редакции газеты своему не очень любимому читателю и в нее нужно только вставить фамилию и распечатать.
       В любом случае нужно запомнить, что информация добавляется или изменяется только в выходных файлах. Входные файлы всегда остаются без изменений.

 

10.2. Дополнительная клавиатура

       Так как экранный редактор KED может выполняться на терминалах различной конструкции, то управляющие клавиши на каждом терминале будут располагаться по-разному. Поэтому далее приведены рисунки с обозначением управляющих (функциональных) клавиш на дополнительной клавиатуре дисплеев VT52, VT100, VDT52130, 15ИЭ-00-013.
       На каждой клавише в первой или третьей строке приведено ее функциональное название, в соответствии с описанием редактора KED. Во второй строке по возможности приведены надписи, имеющиеся на клавишах дополнительной клавиатуры указанных дисплеев.

                           Клавиатура терминала VT100
                  +-----------+-----------+-----------+-----------+
                  !   GOLD    !    HELP   ! FIND NEXT !  DELLINE  !
                  !        PF1!        PF2!        PF3!        PF4!
                  !           !           !   FIND    ! UNDELLINE !
                  +-----------+-----------+-----------+-----------+
                  !  PAGE     !  SECTION  !  APPEND   !  DELWORD  !
                  !          7!          8!          9!          ,!
                  !  COMMAND  !   FILL    !  REPLACE  ! UNDELWORD !
                  +-----------+-----------+-----------+-----------+
                  !  ADVANCE  !  BACKUP   !    CUT    !  DELCHAR  !
                  !          4!          5!          6!          -!
                  !   BOTTOM  !   TOP     !   PASTE   ! UNDELCHAR !
                  +-----------+-----------+-----------+-----------+
                  !   WORD    !   EOL     !   CHAR    !   ENTER   !
                  !          1!          2!          3!           !
                  ! CHNGCASE  !  DELEOL   ! SPECINS   !           !
                  +-----------+-----------+-----------+           !
                  !       BLINE           !   SELECT  !           !
                  !                      0!          .!           !
                  !       OPENLINE        !   RESET   !   SUBS    !
                  +-----------------------+-----------+-----------+

 
                        Клавиатура ПЭВМ "Электроника-85"
                  +-----------+-----------+-----------+-----------+
                  !   GOLD    !    HELP   ! FIND NEXT !  DELLINE  !
                  !        PF1!        PF2!        PF3!        PF4!
                  !           !           !   FIND    ! UNDELLINE !
                  +-----------+-----------+-----------+-----------+
                  !  PAGE     !  SECTION  !  APPEND   !  DELWORD  !
                  !          7!          8!          9!          ,!
                  !  COMMAND  !   FILL    !  REPLACE  ! UNDELWORD !
                  +-----------+-----------+-----------+-----------+
                  !  ADVANCE  !  BACKUP   !    CUT    !  DELCHAR  !
                  !          4!          5!          6!          -!
                  !   BOTTOM  !   TOP     !   PASTE   ! UNDELCHAR !
                  +-----------+-----------+-----------+-----------+
                  !   WORD    !   EOL     !   CHAR    !  SELECT   !
                  !          1!          2!          3!          .!
                  ! CHNGCASE  !  DELEOL   ! SPECINS   !  RESET    !
                  +-----------+-----------+-----------+-----------+
                  !       BLINE           !         ENTER         !
                  !                      0!                       !
                  !       OPENLINE        !         SUBS          !
                  +-----------------------+-----------+-----------+

 
                      Клавиатура терминала VT52, MERA-7953
                  +-----------+-----------+-----------+-----------+
                  !   GOLD    !   HELP    !  DELLINE  !     ^     !
                  !         BL!         RD!         GY!     !     !
                  !           !           !UNDELLINE  !  REPLACE  !
                  +-----------+-----------+-----------+-----------+
                  !   PAGE    ! FIND NEXT !  DELWORD  !     !     !
                  !          7!          8!          9!     V     !
                  !  COMMAND  !   FIND    !UNDELWORD  !  SECTION  !
                  +-----------+-----------+-----------+-----------+
                  !  ADVANCE  !   BACKUP  !  DELCHAR  !  ---->    !
                  !          4!          5!          6!           !
                  !  BOTTOM   !    TOP    !UNDELCHAR  !  SPECINS  !
                  +-----------+-----------+-----------+-----------+
                  !   WORD    !   EOL     !    CUT    !   <----   !
                  !          1!          2!          3!           !
                  ! CHNGCASE  !  DELEOL   !   PASTE   !   APPEND  !
                  +-----------+-----------+-----------+-----------+
                  !         BLINE         !   SELECT  !   ENTER   !
                  !                      0!          .!           !
                  !       OPENLINE        !   RESET   !   SUBS    !
                  +-----------------------+-----------+-----------+

 
                  Клавиатура терминала 15ИЭ-00-013, 15ИЭ-00-17
  +--------+--------+---------+        +--------+--------+---------+
  ! PAGE   !FINDNEXT! DELWORD !        !////////!   ^    !  ENTER  !
  !       7!       8!        9!        !////////!   !    !         !
  !COMMAND !  FIND  !UNDELWORD!        !////////!REPLACE !  SUBS   !
  +--------+--------+---------+        +--------+--------+---------+
  !ADVANCE ! BACKUP ! DELCHAR !        !  <---  !////////!  --->   !
  !       4!       5!        6!        !        !////////!         !
  ! BOTTOM !   TOP  !UNDELCHAR!        ! APPEND !////////! SPECINS !
  +--------+--------+---------+        +--------+--------+---------+
  ! WORD   !  EOL   !   CUT   !        !////////!   !    !/////////!
  !       1!       2!        3!        !////////!   V    !/////////!
  !CHNGCASE! DELEOL !  PASTE  !        !////////!SECTION !/////////!
  +--------+--------+---------+        +--------+--------+---------+
  !     BLINE       !  SELECT !        !  GOLD  !  HELP  ! DELLINE !
  !                0!        ,!        !   =    !   !    !         !
  !   OPENLINE      !  RESET  !        !   !    !   *    !UNDELLINE!
  +-----------------+---------+        +--------+--------+---------+

 
                         Клавиатура терминала VDT-52130
  +---------+---------+---------+    +---------+---------+---------+
  !  GOLD   !  HELP   ! DELLINE !    !//CLEAR//!//CLEAR//!//CLEAR//!
  !       F1!       F2!       F3!    !////ALL//!///PAGE//!///LINE//!
  !         !         !UNDELLINE!    !/////////!/////////!/////////!
  +---------+---------+---------+    +---------+---------+---------+

  +---------+---------+---------+              +---------+
  !  PAGE   !FIND NEXT! DELWORD !              !    ^    !
  !        7!        8!        9!              !    !    !
  ! COMMAND !  FIND   !UNDELWORD!              ! REPLACE !
  +---------+---------+---------+    +---------+---------+---------+
  ! ADVANCE ! BACKUP  ! DELCHAR !    !  <----  !/////////!  ---->  !
  !        4!        5!        6!    !         !//HOME///!         !
  !  BOTTOM !   TOP   !UNDELCHAR!    !  APPEND !/////////! SPECINS !
  +---------+---------+---------+    +---------+---------+---------+
  !  WORD   !  EOL    !    CUT  !              !    !    !
  !        1!        2!        3!              !    V    !
  !CHNGCASE ! DELEOL  !  PASTE  !              ! SECTION !
  +---------+---------+---------+              +---------+
  !  BLINE  ! SELECT  !  ENTER  !
  !        0!        ,!         !
  !OPENLINE !  RESET  !  SUBS   !
  +---------+---------+---------+

       — Это красивые картинки,— заторопился Алеша,— я их перерисую к себе в тетрадь. На сколько я понимаю, заштрихованные на этих картинках клавиши редактор в своей работе не использует. А вот две клавиши выделяются из всех тем, что на них только по одной надписи: это <GOLD> — золото и <HELP> — помощь. К чему бы это?
       — А к тому, чтобы ты не торопился,— отвечаю я Алеше,— несмотря на то что этот редактор много сложнее и мощнее, чем EDIT, запоминать и тем более записывать в конспект практически ничего не надо.
       Кроме той картинки о файлах, которую мы с тобой разобрали, и которую нужно понять, необходимо запомнить только назначение этих двух клавиш. И начнем по порядку:

<GOLD>
       — основная функция этой клавиши увеличить — объем дополнительной клавиатуры в два раза. Функции, написанные на остальных управляющих клавишах, выполняются следующим образом: если перед нажатием клавиши была нажата клавиша <GOLD>, то выполняется функция, написанная на нижней строчке, в противном случае — функция, написанная на верхней строчке.
       Кроме того, если после нажатия на клавишу <GOLD>, нажата цифровая клавиша на основной алфавитно-цифровой клавиатуре, то появляется возможность передать редактору десятичное число от 1 до 65535, которое будет использовано в последующей функции;

<HELP>
       — клавиша, позволяющая не иметь пользователю других справочников. При ее нажатии пользователь в любой момент может обратиться к краткому справочнику по функциям редактора, не прерывая его работы. Кроме того, если редактор не смог выполнить какую-либо фунцию, то подается звуковой сигнал, и по нажатию клавиши <HELP> в нижней строке экрана выводится сообщение, поясняющее причину ошибки.

       — Вот здорово,— загорелся Алеша,— а можно посмотреть?
       — Конечно,— отвечаю я,— только для этого нужно открыть какой-нибудь файл, например, твоих премудрых.
       Не долго думая, Алеша набирает команду.

  +---------------
  !  .KED DX1:VERSE.TXT<ВК>
  !

       Экран очистился и редактор показал наше стихотворение.
       — А что это за прямоугольничек внизу?— спрашивает Алеша.
       Действительно, редактор KED в отличие от других полузаштрихованным прямоугольничком (а K52 буквой А) обозначает конец редактируемого файла. Если он вас раздражает, то можно ввести несколько пустых строк, чтобы отодвинуть его от редактируемого текста.
       — А теперь,— предлагаю я Алеше,— можно поэкспериментировать с клавишей <HELP>.
       — Это мы быстро,— отреагировал Алеша,— и сразу буду объяснять.
       При первом нажатии на клавишу <HELP> на экран выводится картинка расположения функциональных клавиш для терминала VT100 (VT52, если используется редактор K52).

                  KED V01.20
           Lower Function is GOLD
  +--------+-------+---------+---------+
  !  GOLD  ! HELP  !FIND NEXT! DELLINE ! DELETE   Erase char left
  !     PF1!    PF2!      PF3!      PF4! LINEFEED Erase word left
  !        !       !  FIND   !UNDELINE ! CTRL/U   Erase line left
  +--------+-------+---------+---------+ CTRL/C   Cancel
  ! PAGE   !SECTION! APPEND  ! DELWORD ! CTRL/Z   Cancel
  !       7!      8!        9!        ,! CTRL/W   Restore screen
  ! COMMAND!  FILL ! REPLACE !UNDELWORD!              and keypad
  +--------+-------+---------+---------+ CTRL/R   Restore screen
  ! ADVANCE! BACKUP!   CUT   ! DELCHAR !              and keypad
  !       4!      5!        6!        -!
  ! BOTTOM !  TOP  !  PASTE  !UNDELCHAR! <GOLD>nnn     Repeat
  +--------+-------+---------+---------+ <GOLD>DEL     UNDELCHAR
  !  WORD  !  EOL  !  CHAR   !  ENTER  ! <GOLD>LF      UNDELWORD
  !       1!      2!        3!         ! <GOLD>CTRL/U  UNDELLINE
  !CHNGCASE! DELEOL!SPECINS  !         !
  +--------+-------+---------+         ! To return to display,
  !    BLINE       !  SELECT !         ! press ENTER or use any
  !               0!        .!         ! function.
  !    OPENLINE    !  RESET  !  SUBS   !
  +----------------+---------+---------+

       Но кроме рисунка клавиатуры,— комментирует Алеша,— здесь рассказывается про некоторые другие функции. Я про все говорить не буду, но то, что теперь символы CTRL/C, CTRL/Z не действуют, как обычно, нужно упомянуть.
       — Это не совсем так,— подсказываю я Алеше,— действительно, прервать работу редактора и выйти в монитор этими символами нельзя. Но если редактор выполняет какую-либо продолжительную по времени функцию, то вводом этих символов можно его остановить и продолжить редактирование.
       — Поехали дальше,— продолжает Алеша,— появился новый управляющий символ CTRL/W, который восстанавливает содержимое экрана.
       — Так как терминал, как правило, отделен от процессора,— поясняю я,— то возможны нарушения в его работе, которые не сказываются на работе процессора. Например, кто-то нечаянно выдернул сетевую вилку терминала из розетки. В таком случае нарушается соответствие между информацией в памяти процессора и ее отображением на экране. И вводом этого управляющего символа можно перерисовать экран и восстановить состояние клавиатуры, если она программируемая. Можно еще добавить, что в последних версиях такую же функцию выполняет символ CTRL/R.
       — Здесь же нам сообщается,— говорит Алеша,— что возврат в режим дисплея происходит по нажатию клавиши <ENTER> или по использованию любой другой функции.
       При втором нажатии на клавишу <HELP> на экран выводится полный список команд редактора в командном режиме. Если при этом перейти в командный режим, то картинка на экране сохраняется за исключением верхних двух строк, что позволяет не запоминать точное написание команды, а вызывать его на экран при необходимости.

                Summary of KED Commands
 
                                          SET [ENTITY] PAGE "string"
   EXIT                                   SET [ENTITY] PAGE integer [LINES]
   QUIT                                   SET [ENTITY] SECTION "string"
                                          SET [ENTITY] SECTION integer [LINES]
   [OPEN] INPUT filespec
   [OPEN] OUTPUT filespec                 SET [SEARCH] GENERAL
   CLOSE                                  SET [SEARCH] EXACT
   PURGE                                  SET [SEARCH] BEGIN
   WRITE SELECT                           SET [SEARCH] END
   WRITE option                           SET [SEARCH] BOUNDED
   INCLUDE option                         SET [SEARCH] UNBOUNDED
   SKIP option
   "Option" can be: integer PAGES         SET [SCREEN] 80
                    integer [LINES]       SET [SCREEN] 132
                    REST                  SET [SCREEN] DARK
   CLEAR PASTE                            SET [SCREEN] LIGHT
 
   LEARN                                  SET QUIET
   LOCAL [starting_value [increment]]     SET NOQUIET
 
   SET TABS [indent]                      SET WRAP [column_number]
   SET NOTABS                             SET NOWRAP
   [TABS] ADJUST [+-]level                FILL

       — Войти в командный режим,— говорит Алеша,— можно, последовательно нажав клавиши <GOLD>,<COMMAND>. Это мы видели по предыдущей картинке.
       — При этом название команды,— добавляю я,— нужно набрать на основной, алфавитно-цифровой клавиатуре и завершить ее ввод нажатием клавиши <ENTER> — ввод.
       — И наконец,— Алеша опять нажимает клавишу <HELP>,— при третьем нажатии на клавишу <HELP> на экран выводится список специальных функций, которые выполняются с помощью клавиши <GOLD>.

                        Gold Keyboard Functions
 
 
       <GOLD><S>     Terminate a macro without executing it.
       <GOLD><X>     Execute the currently defined macro.
 
 
       <GOLD><A>     Align structured tabs to the cursor.
       <GOLD><E>     Extend the level counter for structured tabs.
       <GOLD><D>     Decrease the level counter for structured tabs.
 
       <GOLD><L>     Lower case selected area
 
       <GOLD><U>     Upper case selected area

       Неужели там еще что-то есть,— говорит Алеша, еще раз нажимая на клавишу, но увы. При дальнейшем нажатии на клавишу <HELP> процесс повторяется. А как выйти из этого режима я уже говорил. Но я нажму на нее еще раз и попробую выполнить какую-нибудь команду.
       — Итак, мы снова во второй картинке режима HELP. Какие первые команды мы должны узнать?
       — Как правильно завершить редактирование,— говорит Алеша.— И эти команды стоят первыми в первом столбике. Их две. "EXIT" — выход — мы ее уже знаем. Она завершает редактирование нормальным образом с переименованием рабочего файла в тип .BAK. А вторая "QUIT" — оставить — по смыслу прекращает редактирование, не оставляя никаких следов.
       — Прекрасно,— говорю я Алеше,— вот и заверши редактирование нормальным образом, чтобы могли поговорить.
       И Алеша нажал клавиши:

   <GOLD><COMMAND> Command: EXIT<ENTER>
                  ----------

       На экране в левом углу появилась надпись Command:, в ответ на которую Алеша ввел команду EXIT и затем нажал клавишу <ENTER>. И система спокойненько поставила точку.

10.3. Элементы редактирования

       А перерыв нам нужен для обсуждения некоторых принципиальных вопросов.
       KED — большая система, которая с полным правом может называться ортогональной системой. Связь с Евклидовой геометрией здесь чисто визуальная. Представим себе, что мы имеем некоторый набор объектов — СИМВОЛ, СЛОВО, СТРОКА, СТРАНИЦА, СЕКЦИЯ, СЕГМЕНТ. А также имеем некоторый набор операций над этими объектами — ДВИЖЕНИЕ ВПЕРЕД, ДВИЖЕНИЕ НАЗАД, УДАЛИТЬ, ВОССТАНОВИТЬ, НАЙТИ, ВСТАВИТЬ, ЗАПИСАТЬ, ПРОПУСТИТЬ. Тогда можно составить прямоугольную (ортогональную) таблицу соответствия объектов и операций над ними.

                          CHAR WORD STRING PAGE SECTION SEGMENT
                         +----+----+------+----+-------+-------+
      ADVANCE            !  * ! *  ! *  * ! *  !   *   !///////!
      -------------------+----+----+------+----+-------+-------+
      BACKUP             !  * ! *  ! *  * ! *  !   *   !///////!
      -------------------+----+----+------+----+-------+-------+
      DELETE             ! ** ! ** ! * * *!    !       !   *   !
      -------------------+----+----+------+----+-------+-------+
      UNDELETE           ! ** ! ** ! * * *!    !       !   *   !
      -------------------+----+----+------+----+-------+-------+
      FIND               !(*) ! (*)!  (*) !////!///////!   *   !
      -------------------+----+----+------+----+-------+-------+
      INCLUDE            !    !    !   *  ! *  !       !///////!
      -------------------+----+----+------+----+-------+-------+
      WRITE              !    !    !   *  ! *  !       !   *   !
      -------------------+----+----+------+----+-------+-------+
      SKIP               !    !    !   *  ! *  !       !///////!
      -------------------+----+----+------+----+-------+-------+

       — Насколько я понимаю,— рассуждает Алеша,— эта таблица представляет систему функций редактора KED. И клетки, отмеченные в ней звездочками, показывают, что над данным объектом указанная операция существует, и даже в нескольких видах. Но она не очень-то ортогональная.
       — Это естественно,— отвечаю я,— потому что не все операции можно выполнить над тем или иным объектом. Некоторые операции невозможно выполнить в силу природы самого объекта, его начального определения. Такие операции в таблице показаны заштрихованными клетками.
       Кроме того, могут быть операции, которые можно каким-либо образом выполнить над объектом другого типа и получить при этом тот же результат. Это позволяет не перегружать пользователя лишними подробностями и сэкономить на разработке и объеме программы. Такие операции на таблице показаны пустыми клетками.
       Таким образом, создать полностью ортогональную систему, т.е. у которой заполнены все клетки таблицы, очень трудно, но эти затраты себя оправдывают. Поэтому разработчики стремятся к созданию таких систем. Единообразие операций для всех объектов в ортогональных системах облегчает их запоминание и обучение работе с такими системами. По крайней мере из известных редакторов у редактора KED наиболее заполненная таблица.
       — Тогда нужно сначала сказать про объекты,— говорит Алеша,— и затем можно описывать операции над ними.
       — Именно поэтому,— продолжаю я,— дальше мы приведем точные определения элементов редактирования, с которыми работает редактор.
       ТЕКСТ — это последовательность байтов, имеющих для пользователя смысл символов в коде ASCII. Так как среди символов имеются символы управления печатающим устройством, такие, как "ПЕРЕВОД СТРОКИ"<ПС> и "ВОЗВРАТ КАРЕТКИ"<ВК>, то внешне текст имеет прямоугольную форму. Отсюда: если нужно раздвинуть слова или буквы, то между ними необходимо вставить символы "ПРОБЕЛ"; если нужно раздвинуть сроки, то между ними необходимо вставить символы <ВК>. Таким же образом правая граница текста отодвигается, если перед символами <ВК><ПС> вставляются необходимые символы.
       СИМВОЛ — это байт перед курсором или после него. Следует учитывать, что символы <ВК><ПС> считаются одним символом, но занимают в буфере два байта.

  Пример:    5А
              ^   - здесь: 5 - символ перед курсором
                           А - символ после курсора

       Опять необходимо напомнить, что, несмотря на то что курсор на экране изображается под символом или прямоугольником, охватывающим символ, во всех определениях считается, что он находится МЕЖДУ символами и перед тем символом, под которым он изображен.
       СЛОВО — это цепочка байтов от курсора до символов <Пробел>, <ВК><ПС>, <ГТ> или <ПФ> в ту или другую сторону от курсора.

  Пример:   Петя Катя<ВК><ПС>
                   ^          - здесь: Ка - слово до курсора
                                       тя - слово после курсора

       СТРОКА — это цепочка байтов от курсора до символов <ВК><ПС> или <ПФ> в ту или другую сторону от курсора.
       СТРАНИЦА — это цепочка байтов от курсора до символа <ПФ>. Возможно переопределение страницы как цепочки байтов, содержащей заданное количество строк или имеющей в качестве ограничивающего символа заданную строку.
       СЕКЦИЯ — это то же, что и страница, но определенная по умолчанию как цепочка байтов, содержащая 16 строк. Также может быть переопределена как имеющая другой размер или имеющая в качестве ограничителя заданную строку, в том числе и <ПФ>. Секцией удобно просматривать текст в любом направлении, так как ее размер по умолчанию равен 2/3 экрана.
       СЕГМЕНТ РЕДАКТИРОВАНИЯ — это часть файла, в пределах которой осуществляется редактирование. Предназначен для ограничения области действия таких команд, как контекстный поиск, установка уровня табуляции и многих других. Сегмент редактирования определяется следующим образом:
       — установить курсор в начало задаваемого сегмента редактирования;
       — нажать клавишу <SELECT>;
       — установить курсор в конец сегмента редактирования;
       — выполнить функцию редактирования.

 

10.4. Передвижение по файлу

       — А теперь мы займемся операциями над объектами,— спрашивает Алеша,— которые только что определили?
       — Да,— отвечаю я,— и в первую очередь передвижением по файлу.
       В отличие от редактора EDIT здесь пользователь уже не должен думать о чтении и записи какого-то текстового буфера. Передвижение может осуществляться по всему файлу. Это может быть достаточно продолжительная операция, если файл очень большой, например 10-15 тысяч блоков. Оптимальный размер файла для редактирования 100-200 блоков, при котором длительность операции передвижения не мешает работе.
       Во-вторых, нужно отметить, что в KED существуют два средства для передвижения. Первое — самые обычные клавиши со стрелками, предназначенные для управления курсором. Они имеются практически на всех терминалах и работают автономно, перемещая курсор на одну позицию или строку влево, вправо, вверх или вниз. Эти клавиши не влияют на другие установленные режимы. Следует также помнить, что при перемещении вверх или вниз текущая позиция курсора запоминается автоматически, несмотря на то что промежуточные строки могут оказаться короче той, с которой началось перемещение.
       Второе средство более мощное. KED позволяет перемещаться по файлу такими шагами, как элемент редактирования.
       — Если мы определили шаг перемещения,— говорит Алеша,— то нужно указать редактору и направление перемещения. Наверное, для этого и служат клавиши <ADVANCE> — продвинуться вперед — и <BACKUP> — вернуться наверх.
       — Да, только нужно отметить,— продолжаю я,— что при нажатии на эти клавиши ничего не происходит. KED просто запоминает, в какую сторону нужно будет двигаться в дальнейшем. Причем это направление влияет не только на перемещение курсора, но и на направление контекстного поиска.
       — Но этими же клавишами можно и переместиться,— говорит Алеша,— если мы их будем нажимать после клавиши <GOLD>, то можно переместиться сразу в конец файла после нажатия <GOLD><BOTTOM> — в основание — или сразу в начало файла после нажатия <GOLD><TOP> — в верхушку.
       — Кроме того,— добавляю я,— так как в редакторе KED (но не в K52) клавиши со стрелками свободны от других функций, имеется возможность более естественного перемещения в начало или конец файла. Если после нажатия клавиши <GOLD> нажать клавишу со стрелкой вниз, то курсор переместится сразу в конец файла, а при нажатии клавиши со стрелкой вверх, курсор переместится сразу в начало файла. Таким же образом используются клавиши со стрелками влево и вправо. Если они нажимаются после нажатия клавиши <GOLD>, то перемещают курсор сразу в конец или начало строки соответственно.
       — И после указания направления,— говорю я,— можно двигаться любыми шажками — большими и маленькими. Их названия написаны на клавишах в первой картинке HELP.
       — <CHAR> — символ,— читает Алеша,— т.е. движение по символам, если мы представим весь текст как длинную цепочку символов.
       — Замечу только, что в редакторе K52 этого варианта движения нет. Но это несущественно, так как можно двигаться по символам, используя обычные стрелки, что дает такой же результат.
       — <WORD> — слово,— продолжает Алеша,— передвигает курсор по словам, так как мы их определили.
       — С небольшим уточнением,— поправляю я,— эта функция рассматривает несколько подряд идущих пробелов как один. Но символы горизонтальной табуляции "ГТ" считаются словами, поэтому с ее помощью можно двигаться по табуляциям, как по словам.
       — А вот со строкой уже сложнее,— задумался Алеша,— тут много LINE-ов, но какие что означают сразу не поймешь.
       — А ты вдумайся, что такое строка,— помогаю я ему,— это объект протяженный, и двигаться по серединам строк мы не можем, потому что такое понятие не определено. А вот начало и конец строки всегда определены.
       — Тогда стали понятны названия некоторых клавиш,— продолжает Алеша.
       — <BLINE> — от слов Begin LINE, т.е. движение осуществляется по началам строк в ту сторону, куда мы указывали клавишами <ADVANCE> или <BACKUP>.
       <EOL> — от слов End Of Line, т.е. движение осуществляется по концам строк.
       — Ты все правильно сказал,— говорю я Алеше,— но здесь нужно понимать, что обычно курсор стоит на середине строки, и после первого нажатия на эти клавиши курсор может встать в начало или конец текущей строки. Это зависит от установленного направления движения.
       — А названия следующих элементов редактирования,— продолжает Алеша,— написаны на клавишах:
       <PAGE> — нажатием на эту клавишу можно передвигаться по страницам. А нажатием на клавишу <SECTION> или <GOLD><SECTION> (для редактора K52) можно передвигаться по секциям.
       — Нужно помнить,— добавляю я,— начальные определения страницы (символ "ПФ") и секции (16 строк) и то, что по существу это два одинаковых альтернативных объекта, но страница может участвовать в операциях между файлами.
       Таким образом, если у нас в тексте нет ни одного символа "ПФ", то редактор (и печатающее устройство также) воспринимает его как одну большую страницу. Полная длина стандартной страницы, как правило, равна 72 строкам. Количество реально печатаемых строк обычно лежит в пределах 62-64. Это позволяет размечать текст на страницы вставкой символа "ПФ", шагая по четыре секции. Можно также установить размер страницы и размечать, используя клавишу <PAGE>. Разметка таким образом текста объемом 100 страниц занимает несколько минут.
       — Значит,— замечает Алеша,— при передвижении по файлу редактор постоянно осуществляет поиск либо разделителя слов, либо признака строки, либо некоторого контекста, определяющего страницу или секцию.
       — Это ты заметил правильно,— отвечаю я,— только к чему такое уточнение?
       — А к тому,— развивает свою мысль Алеша,— что в данном случае контекстный поиск можно также рассматривать как перемещение по файлу, используя в качестве шага некоторый образ для поиска.
       — Тогда рассказывай, какими командами или клавишами это можно сделать,— передаю я бразды правления Алеше. Для читателей напомню, что мы сейчас смотрим пока только на расположение клавиш (первая картинка HELP).
       — Как и в редакторе EDIT,— начал Алеша,— мы должны сообщить редактору, что нужно искать. Клавиша <FIND> — искать у нас на виду. Поэтому нажмем:

   <GOLD><FIND>Model:
               -------

       и увидим в левом верхнем углу экрана приглашение "Model:", в ответ на которое нужно, наверное, ввести модель поиска, после чего нажать клавишу, указывающую направление поиска.
       — При этом модель поиска будет запоминаться автоматически,— дополняю я,— она будет действовать на все время сеанса редактирования или до следующего определения модели поиска. Кроме того, можно отметить, что нажатие клавиши <ENTER> после ввода модели поиска приводит просто к ее запоминанию.
       — И после этого можно шагать по файлу,— продолжает Алеша,— нажимая на клавишу <FINDNEXT> — искать дальше — в том направлении, которое было указано раньше. При желании можно поменять направление движения и шагать снова.
       — Все это прекрасно,— замечаю я,— но в KED существенно больше возможностей поиска. То, что ты в редакторе EDIT делал особым приемом — установить указатель в начало модели поиска, — здесь делается по умолчанию.
       — А если мне нужно найти точку в начале строки?— спрашивает Алеша.— Получается такая странная (но допустимая) комбинация символов как "ВК", "ПС", "ТОЧКА". Редактор, найдя такую модель, установит курсор в конце предыдущей строки, а не на точке, которая мне нужна.
       — Тогда нужно сказать редактору о твоих желаниях,— отвечаю я,— и установить режим END — в конец модели поиска.
       — Т.е. у меня есть два альтернативных режима поиска,— повеселел Алеша,— при обнаружении модели поиска курсор устанавливается либо в ее начало (BEGIN), либо в ее конец (END).
       — Я бы сказал, что ты имеешь пару альтернативных режимов поиска,— уточняю я,— подчеркнув, таким образом, что эти два режима связаны между собой. Кроме того, есть еще две таких же альтернативных пары режимов.
       — Это, наверно, связано,— говорит Алеша,— с тем генералом, которого мы видели во второй картинке HELP.
       — Не генерал, а общий,— поправляю его я,— это слово происходит от латинского generalis — общий, главный. Т.е. в данном случае это общий поиск. Когда ты ищешь в обычном тексте слово "премудрые", для тебя не имеет значения, на верхнем регистре (прописными символами) или на нижнем регистре (строчными буквами) записано слово.
       — Действительно,— подтверждает Алеша,— премудрые и в том и другом случае останутся премудрыми.
       — Вот такой поиск,— продолжаю я,— когда символы верхнего и нижнего регистров не различаются, называется общим.
       — Тогда поиск,— догадался Алеша,— при котором символы верхнего и нижнего региста различаются, можно назвать точным.
       — Совершенно верно,— отвечаю я,— у тебя появилась еще одна пара альтернативных режимов поиска — GENERAL (общий)/ EXACT (точный).
       — Тогда во второй картинке HELP,— говорит Алеша,— я вижу еще одну пару и попробую объяснить ее сам. В той же группе режимов BEGIN/END, GENERAL/EXACT есть пара BOUNDED/UNBOUNDED. Bounded в переводе с английского означает "граница". Граница файла здесь смысла не имеет, так как за пределами файла мы все равно редактировать не умеем. А вот сегмент редактирования, который мы определяли раньше, имеет границы. Таким образом, при установленном режиме BOUNDED поиск ведется в границах сегмента редактирования. А режим UNBOUNDED позволяет вести поиск по всему файлу, игнорируя границы сегмента редактирования.
       — В завершении этого разговора,— заканчиваю я,— нужно только сказать, что по умолчанию в начале сеанса редактирования установлены режимы BEGIN, GENERAL, UNBOUNDED.

 

10.5. Удаление и восстановление элементов редактирования

       — Вот теперь можно обводить твое стихотворение в рамочку из звездочек,— предлагаю я Алеше,— только ты мне объясни, что теперь для нас означает понятие РЕДАКТИРОВАНИЕ.
       — Это действительно интересно,— говорит Алеша,— если при работе с редактором EDIT нашей основной задачей было чтение очередной порции из входного файла, удаление или вставка символа и запись этой порции в выходной файл, то теперь пользователь избавлен от необходимости следить за входным и выходным файлами. Это делает сам редактор, а пользователь "гуляет" по файлу, как ему хочется. Правда, вставлять он может также только по одному символу, но для удаления появился целый набор объектов, которые мы назвали элементами редактирования.
       — И не только удаления,— добавляю я,— но и восстановления. В редакторе KED принят принцип, по которому все что удаляется, может быть восстановлено. Т.е. если удалил слово, то его можно восстановить (т.е. вставить обратно в файл) в любом месте файла и любое число раз.
       — Но восстанавливается, наверное, последнее удаленное слово,— замечает Алеша,— ведь буфер не может быть бесконечным.
       — Не только из-за буфера,— отвечаю я,— у нас просто нет средств для нумерации удаленных элементов редактирования.
       Кстати о буферах. Так как они фиксированные, то сразу приведем их размеры.
       При удалении элемент редактирования запоминается в соответствующем буфере, размеры которых следующие:
       — Буфер символа — 2 байта, так как символы <ВК><ПС> при редактировании считаются за один символ, а в действительности занимают два байта.
       — Буфер слова — 80 байт, так как длина строки, введенной с терминала без символов "Пробел" или "ВК""ПС", не может быть более 80 символов. При наличии символа "Пробел" редактор может автоматически перенести слово на следующую строку.
       — Буфер строки — 132 байта, т.е. максимальная длина строки на экране в соответствующем режиме.
       — Буфер сегмента редактирования — не менее 512 байт, т.е. один блок в формате RT-11. Верхний размер определяется доступной памятью в момент редактирования.
       А теперь начнем удалять.
       — Ну, символ удаляется, как обычно,— говорит Алеша,— клавишей <DEL> на основной клавиатуре.
       — Допустим,— отвечаю я,— но это символ перед курсором. А как удалить символ после курсора?
       — А для этого есть клавиша <DELCHAR>,— говорит Алеша,— на дополнительной клавиатуре. И по этому же рисунку мы видим, как восстанавливать символ. Для этого нужно последовательно нажать клавиши <GOLD><UNDELCHAR>.
       — И при этом символ будет вставлен так же, как он удалялся,— продолжаю я,— т.е. до или после курсора. Однако, начиная с версии KED V1.20 произошло уточнение — все восстановления элементов редактирования могут быть выполнены той же клавишей, которой выполнялось удаление, но после нажатия клавиши <GOLD>, что улучшило ортогональность системы команд редактора. Таким образом, восстановление символа нажатием клавиш <GOLD>,<DEL> теперь также справедливо.
       — А для удаления слова,— говорит Алеша,— я уже нашел клавишу <DELWORD>. И теперь я удалю слово "ПЛАВНО" и напишу "БУРНО".

  ------+---------------
        !        ВОДЫ  ГЛУБОКИЕ
        !
        !        ПЛАТЕКУТ
        !           ^
        !        ЛЮДИ ПРЕМУДРЫЕ
        !
        !        ТИХО     ЖИВУТ
        !
        !                А.ПУШКИН

       Да, но удалилась только половина слова от курсора вправо вместе с последующими пробелами.
       — Вот где пригодилось определение элементов редактирования,— говорю я Алеше,— т.е. мы можем удалить как часть слова справа, так и часть слова слева. И здесь клавиша <LINEFEED> ==> <ПС> используется не по своему прямому назначению. С ее помощью теперь можно удалять часть слова до курсора.
       — А восстанавливать удаленное слово,— говорит Алеша,— можно, нажимая последовательно клавиши <GOLD>,<UNDELWORD> или, если удаляли клавишей <ПС>, последовательно нажимая клавиши <GOLD>,<ПС>. Поэтому восстановим слово ПЛАВНО и не будем исправлять Пушкина.
       — А вот для строки у нас возможностей больше,— замечаю я.
       — Почему?— не понимает Алеша,— нажимаешь <DELLINE> и удаляется строка после курсора.
       — Да, и вместе с символами <ВК><ПС>,— добавляю я,— в результате чего следующая строка как бы приклеивается к остатку текущей. Это удобно, но не всегда нужно. Поэтому имеется возможность удалять конец строки, оставляя на месте символы <ВК><ПС>. Для этого нужно последовательно нажать клавиши <GOLD>,<DELEOL>.
       — И у нас остается возможность,— вставляет Алеша,— удалять часть строки от ее начала до курсора, используя служебный символ CTRL/U. А для восстановления всегда можно использовать клавиши <GOLD>,<UNDELLINE> или, в последней версии для восстановления начальной части строки, последовательно нажимая клавиши <GOLD><CTRL/U>. В любом случае строка восстанавливается в таком же виде, как удалялась.
       — Но еще больше возможностей,— продолжаю я,— у сегмента редактирования. После установки границ сегмента, его можно удалить, нажав клавишу <CUT> — вырезка и, соответственно, восстановить в любом месте последовательным нажатием клавиш <GOLD>,<PASTE> — выдавить.
       Но так как размер удаляемого сегмента может быть существенно меньше размера буфера, то появляется возможность добавлять к содержимому буфера удаляемые сегменты.
       — Я уже нашел эту клавишу,— вставляет Алеша,— это Append — прилагать. Т.е. нажатием на клавиши <GOLD>,<APPEND> можно добавить удаляемый сегмент к содержимому буфера.
       — Правильно,— говорю я,— но если посмотреть внимательно, то модель поиска также представляет собой сегмент редактирования. А это дает возможность заменить найденную модель поиска на содержимое буфера сегмента редактирования. Сделать это можно последовательным нажатием клавиш <GOLD>,<REPLACE>.
       Это удобная функция, но для большого файла при многократных заменах требуется поочередное повторение двух функций REPLACE и FINDNEXT. Чтобы облегчить автоматизацию такой работы введена комбинированная функция SUBSTITUTE — подстановка, которая выполняется последовательным нажатием клавиш <GOLD>,<SUBS>. При этом сначала выполняется функция REPLACE, а затем FIND-NEXT.
       Осталось только научиться очищать буфер сегмента.
       — А во второй картинке HELP,— вспоминает Алеша,— была команда CLEAR PASTE. Скорее всего, она и очищает буфер сегмента, но выполнять ее нужно в командном режиме. Вот так:

   <GOLD><COMMAND>Command: CLEAR PASTE<ENTER>
                  ---------

       — И наконец,— говорю я,— все эти функции были бы мало эффективны, если бы не было функции повторения.
       — Это то, что в редакторе EDIT,— говорит Алеша,— позволяли делать числовые аргументы перед командами и угловыми скобками.
       — Да, но то был несколько искусственный прием,— продолжаю я,— здесь все проще и указывается явно. Если после нажатия на клавишу <GOLD> ввести цифру на основной клавиатуре, то в левом верхнем углу печатается слово "Repeat:" и KED принимает число повторений от 1 до 65535 (десятичное). После ввода числа нужно нажать клавишу, повторение которой необходимо. Если команда включает в себя нажатие клавиши <GOLD>, то эти две клавиши считаются за одну. Именно для обеспечения этой возможности была ввендена комбинированная функция SUBSTITUTE.
       Нужно понимать, что повторяется именно нажатие клавиши, независимо на дополнительной (командной) клавиатуре она расположена или на основной. В число допустимых клавиш не входят только клавиша <DEL> и цифровые клавиши на основной клавиатуре. Может быть ты объяснишь почему,— обращаюсь я к Алеше.
       — Попробую,— отвечает он,— клавиша <DEL> служит для удаления последнего введенного символа, и если ее включить в функцию повторения, то нельзя будет исправить ошибочно введенное число повторений. Цифровыми клавишами вводится число повторений, и именно нажатие отличной от них клавиши, служит признаком окончания ввода числа.
       — Вот и отлично,— говорю я,— но с помощью функции Repeat можно выполнить и другую интересную операцию — вставку специального символа.
       Под специальным символом будем понимать байт с кодом от 1 до 127., который можно вставить в произвольное место текста. Байт с кодом 000 вставлять нельзя. Например, для вставки символа с кодом 007 — звонок необходимо ввести следующую последовательность

   <GOLD>,Repeat: 7<GOLD>,<SPECINS>
          --------

       Если после этого выводить текстовой файл на терминал командой TYPE, то в этом месте незримый символ 007 подаст звуковой сигнал.
       Следует отметить, что код символа (как и все числа, вводимые после нажатия клавиши <GOLD>) должен быть в десятичной системе счисления.
       — И больше с символами,— спрашивает Алеша,— ничего нельзя сделать?
       — Ну, почему же,— отвечаю я,— если мы осуществляли поиск, различая символы верхнего и нижнего регистров, то можно и поменять регистр на противоположный.
       Символы верхнего и нижнего регистра (в ISO — это латинские прописные и строчные, в КОИ-7 — латинские и русские прописные) отличаются только значением 5 бита в коде символа. Редактор предоставляет возможность групповой смены (инвертирование 5 бита) регистра. Для этого нужно последовательно нажать клавиши:

  <GOLD>,<CHNGCASE>

при этом:
       — Если был определен сегмент редактирования, то смена регистра произойдет по всему тексту в пределах сегмента редактирования.
       — Если курсор был установлен в результате контекстного поиска заданной модели, то замена регистра произойдет в пределах модели поиска.
       — Если не было никаких определений, то смена регистра произойдет у одного символа после курсором. При этом курсор переместится на одну позицию в соответствии с установленным направлением движения.
       — А в третьей картинке HELP,— вставил Алеша,— я видел две команды, также позволяющие манипулировать нижним (Lower case) и верхним (Upper case) регистрами. Если мы последовательно нажмем клавиши <GOLD><L>, то в пределах сегмента редактирования все символы будут переведены в нижний регистр. После нажатия клавиш <GOLD><U> все символы в пределах сегмента редактирования будут переведены в верхний регистр.
       — Нужно только отметить,— добавляю я,— что эти команды были введены в версии KED V1.20.
       — И я вижу на дополнительной клавиатуре еще одну команду, введенную для удобства,— догадался Алеша,— часто бывает необходимым вставить пустую строку в место, указанное курсором. Простой способ заключается в том, чтобы ввести символы "ВК","ПС", а затем подняться на одну строку вверх с помощью стрелки. Однако для многократной вставки пустой строки с помощью функции повторения можно использовать клавишу <OPENLINE> — открыть строку. Например, следующим образом:

   <GOLD>,Repeat: XXX,<GOLD>,<OPENLINE>
          --------

положение курсора при этом не изменится.
       — Прекрасно,— говорю я,— тогда можно обвести стихотворение в рамку из звездочек и разобрать основные команды из командного режима.
       — Чтобы было понятно как это сделать,— говорит Алеша,— я буду пояснять.
       Сначала сделаем три пустые строки, нажав клавиши:

   <GOLD>Repeat: 3<GOLD><OPENLINE>
         --------

и спустимся на одну строку, нажав клавишу <BLINE>.
       Длина строки стихотворения — 14 символов и она начинается с 9 колонки, так как в начале строки стоит символ <ГТ>. Поэтому, чтобы рамка была симметричная, длина горизонтальной стороны должна быть 30 символов (8+14+8). Что мы и сделаем командой:

   <GOLD>Repeat: 30<*>
         --------

и спустимся еще на строку вниз, нажав клавишу со стрелкой вниз, и нарисуем вторую строку рамки:

   <*><GOLD>Repeat: 28<Пробел><*>
            --------

       А дальше, наверное, проще сделать следующим образом — так как в начале следующих строк стоит символ <ГТ>, то можно спокойно вставлять звездочку, не боясь, что строка отодвинется. Поэтому повторим необходимое число раз последовательность <*><BLINE>. И затем нарисуем нижнюю часть рамки так же, как и верхнюю:

   <*><GOLD>Repeat: 28<Пробел><*><ВК>
            --------
   <GOLD>Repeat: 30<*><ВК>
         --------

       Теперь у нас осталась только правая часть рамки. Здесь у нас строки разной длины — одни содержат только звездочку, другие ее и строку стихотворения. Наша задача вставить необходимое число пробелов и звездочку перед символами <ВК><ПС>. Курсор устанавливается в необходимое положение с помощью клавиш <EOL>, но так как мы находимся в конце файла, то нужно сменить направление движения и "пятиться назад".
       Кроме того, мы сначала заполним строки одного типа, а затем другого и, чтобы не нажимать 140 раз на клавишу <Пробел>, сделаем так:

   <BACKUP>,<BLINE>,<BLINE>
   =>,<GOLD>,<DELEOL>,<GOLD><UNDELLINE>

       Таким образом, у нас в буфере строки оказался текст, который мы должны вставлять в остальные строки. Что и проделаем:

   <EOL>,<EOL>,<GOLD>,<UNDELLINE>
   <EOL>,<EOL>,<GOLD>,<UNDELLINE>
   <EOL>,<EOL>,<GOLD>,<UNDELLINE>
   <EOL>,<EOL>,<GOLD>,<UNDELLINE>

       Осталось вставить только короткие кусочки, и также поместим такой кусочек в буфер, переместившись в конец предыдущей строки нажатием клавиши <EOL>, и затем, нажав клавишу со стрелкой вверх, окажемся в необходимой точке готовой строки. Удалим этот остаток и восстановим его снова:

   <GOLD>,<DELEOL>,<GOLD>,<UNDELLINE>

       В результате опять в буфере нужный нам остаток строки. Поменяем направление движение на обратное и также, шагая по концам строк, будем восстанавливать текст из буфера:

   <ADVANCE>
   <EOL>,<GOLD>,<UNDELLINE>,<EOL>,<EOL>
   <EOL>,<GOLD>,<UNDELLINE>,<EOL>,<EOL>
   <EOL>,<GOLD>,<UNDELLINE>,<EOL>,<EOL>
   <EOL>,<GOLD>,<UNDELLINE>,<EOL>,<EOL>
   <EOL>,<GOLD>,<UNDELLINE>

       Но так как слово "ПУШКИН" вылезает из общего ряда, подогнав курсор в необходимое место, удалим два пробела перед звездочкой в этой строке.
       И вот что у нас получилось.

  ------+---------------
        !
        !******************************
        !*                            *
        !*       ВОДЫ  ГЛУБОКИЕ       *
        !*                            *
        !*       ПЛАВНО   ТЕКУТ       *
        !*                            *
        !*       ЛЮДИ ПРЕМУДРЫЕ       *
        !*                            *
        !*       ТИХО     ЖИВУТ       *
        !*                            *
        !*               А.ПУШКИН     *
        !*                            *
        !******************************
        !

 

10.6. Основной набор команд

       — Как ты уже понял,— говорю я Алеше,— в редакторе KED есть несколько форм управления.
       — Да, одну мы уже разобрали,— отвечает Алеша,— это управление с помощью дополнительной клавиатуры. Нажимая на клавиши этой клавиатуры, мы управляем редактором, как тракторист управляет ковшом навесного экскаватора, двигая рычаги.
       Но мы уже знаем и вторую форму,— продолжает Алеша,— это командный режим. Как с его помощью выходить из редактора, мы уже разобрали.
       — Если продолжить твою аналогию с трактористом,— добавляю я,— этот режим можно сравнить со сменой или установкой различных приспособлений на тракторе. И начнем мы со второго столбика во второй картинке HELP.
       Все команды на этой картинке разделены на группы, обобщающие объекты или действия, к которым они относятся. Первые объекты, которые мы изучали, — это страница и секция.
       — Для них есть такая странная команда,— как знаток английского языка говорит Алеша,— которая в дословном переводе означает "установить сущность". Т.е. это не значит, что, например, страница равна "строке". В данном случае строка, заключенная в кавычки, является признаком, позволяющем отделить одну страницу от другой. Таким же образом и количество строк лишь описывает страницу, а не является этой страницей.
       — Но слово [ENTITY] мы можем опустить при вводе команды,— продолжаю я его объяснение,— так как оно заключено в квадратные скобки и является необязательным элементом.
       Таким образом команды из этой группы можно прочитать следующим образом: "Установить, что признаком границы для объекта "PAGE" является "STRING"", или "Установить, что размер объекта "PAGE" есть ЦЕЛОЕ ЧИСЛО строк". И так как слово [LINE] также заключено в квадратные скобки, то и оно является необязательным элементом команды.
       Следует также отметить, что в качестве STRING может выступать строка, содержащая любые символы, в том числе и служебные, например CTRL/L, кроме кавычек, которые ограничивают ее. Кавычки могут быть одинарными или двойными. Таким образом определения "СТРОКА" и 'СТРОКА' равносильны.
       — И, как мы говорили,— вставляет Алеша,— страница и секция являются идентичными объектами, и все, что было сказано о странице, справедливо и для секции.
       А выполнить это можно следующим образом:
       Для задания границы в виде символьной строки необходимо дать команду:

  +---------------
  !  Command: SET SECTION "string"<ENTER>
  !  ---------
  !

       Для задания размера секции в целое число строк необходимо дать команду:

  +---------------
  !  Command: SET SECTION NN<ENTER>
  !  ---------
  !

где NN - число строк в секции.

       Таким же образом можно задать границы страницы, дав соответствующие команды

  +---------------
  !  Command: SET PAGE "string"<ENTER>
  !  ---------
  !

и

  +---------------
  !  Command: SET PAGE NN<ENTER>
  !  ---------
  !

       — А про установку режимов поиска,— предлагаю я Алеше,— ты расскажешь без меня.
       — Конечно,— обрадовался самостоятельности Алеша,— здесь же все очень ясно написано — УСТАНОВИТЬ ПОИСК ОБЩИЙ или ТОЧНЫЙ, какой мы выберем. Нужно, конечно, помнить, что установка режима точного поиска отменяет режим общего поиска, и так для каждой пары режимов. А делается это так.
       Общий поиск без различия символов верхнего и нижнего регистров устанавливается командой

  +---------------
  !  Command: SET GENERAL<ENTER>
  !  ---------
  !

       Точный поиск с различием символов верхнего и нижнего регистров устанавливается командой

  +---------------
  !  Command: SET EXACT<ENTER>
  !  ---------
  !

       Для того чтобы при обнаружении модели курсор устанавливался в начало найденной модели поиска, нужно дать команду:

  +---------------
  !  Command: SET BEGIN<ENTER>
  !  ---------
  !

       Для того чтобы при обнаружении модели курсор устанавливался в конец найденной модели поиска, нужно дать команду:

  +---------------
  !  Command: SET END<ENTER>
  !  ---------
  !

       Поиск может осуществляться в пределах сегмента редактирования, для чего необходимо дать команду:

  +---------------
  !  Command: SET BOUNDED<ENTER>
  !  ---------
  !

       Если поиск должен осуществляться по всему файлу, то нужно дать команду:

  +---------------
  !  Command: SET UNBOUNDED<ENTER>
  !  ---------
  !

       Режимы поиска устанавливаются командами в командном режиме и сохраняются до конца сеанса редактирования или до следующей установки.
       — А в конце второго столбика,— Алеша перескочил через несколько команд,— какая-то интересная команда — SET WRAP — установить обертку. Чтобы это значило?
       — Во-первых, не обертка, а завертывать,— поправляю я его,— во-вторых, эта группа команд предложена специально для писателей.
       Редактор KED позволяет работать со строками произвольной длины, и писатели должны постоянно следить за тем, чтобы длина строки не превышала бы ширины страницы. Как правило она составляет 60-65 символов в строке (по стандарту — 60). Эту функцию можно поручить редактору, и он "завернет" слово, вылезающее за заданную границу, на новую строку.
       — А как же быть с переносом слов,— удивился Алеша,— ведь он же не знает грамматики.
       — А редактор и не будет их переносить,— отвечаю я,— мы сообщаем ему номер колонки (позиции) в строке, за которую он не должен переходить. Поэтому он постоянно сравнивает текущую позицию курсора с заданной. Когда курсор достигнет границы редактор возвращается до ближайщего пробела слева и перед началом слова вставляет символы "ВК","ПС". И слово-нарушитель начинается уже с новой строки. Как показали исследования, использование только этой функции увеличивает производительность машинистки на 10%.
       — Да, но если я между словами,— спрашивает Алеша,— в качестве разделителя поставлю запятую, а не пробел, то редактор эти два слова воспримет как одно?
       — В соответствии с тем определением, которое мы дали выше,— подтверждаю я,— поэтому нужно следить, чтобы после знаков препинания был символ "Пробел". Конечно, можно создать систему, которая понимает все варианты разделителей между словами (кто бы взялся их все описать?!), но тогда нужно будет привязать редактор текста к грамматике определенного языка, и объем программного обеспечения вырастет в несколько (а может и несколько десятков) раз. Поэтому легче приучить писателей к некоторой дисциплине при использовании знаков препинания. Это будет полезно и при дальнейшей обработке текста.
       — Естественно,— продолжает Алеша,— установленная граница сохраняется на все время сеанса редактирования, или до новой установки. А отменить этот режим можно командой SET NOWRAP. Но там есть еще команда FILL — заполнять. Это еще для чего?
       — Раз ты установил правую границу текста,— объясняю я,— то можно в пределах сегмента редактирования заполнить текстом страницу на всю ширину. Это, как правило, нужно после вставок или исправлений в абзаце, в результате которых строки стали либо выходить за установленную границу, либо слишком коротки. Однако редактор не может отличить конец одного абзаца и начало другого. Поэтому операцию заполнения можно производить только в пределах абзаца.
       — Стоит только заметить,— говорит Алеша,— что функция FILL в редакторе KED выполняется как в командном режиме, так и с помощью дополнительной клавиатуры, нажатием клавиш <GOLD><FILL>. В редакторе K52 используется только командный режим. А как выполнить эти команды, я покажу ниже и для примера использую этот абзац.

  +---------------
  !  Command: SET WRAP NN<ENTER>
  !  ---------
  !

где NN - номер колонки, которая является границей строки, или, проще, количество символов в строке.

       Отмена данного режима выполняется командой:

  +---------------
  !  Command: SET NOWRAP<ENTER>
  !  ---------
  !

       Если установлена граница строки, то можно отформатировать текст в пределах сегмента редактирования командой FILL:

  +---------------
  !  Command: FILL<ENTER>
  !  ---------
  !

       Например, при наборе текста предыдущего абзаца правая граница текста была установлена на 60 колонке следущей командой:

   <GOLD><COMMAND>Command: SET WRAP 60<ENTER>
                  ---------

и в файле этот текст выглядел так:

Если установлена граница строки, то можно отформатировать
текст в пределах сегмента редактирования командой FILL:

       — Стоит только заметить,— говорит Алеша,— что функция FILL в редакторе KED выполняется как в командном режиме, так и с помощью дополнительной клавиатуры, нажатием клавиш <GOLD><FILL>. В редакторе K52 используется только командный режим. А как выполнить эти команды, я покажу ниже и для примера использую этот абзац.
       Но потом мне показалось, что абзац будет лучше выглядеть, если ширину страницы установить равной 45 символам, и переформатировать текст. Для этого установим правую границу командой:

   <GOLD><COMMAND>Command: SET WRAP 45<ENTER>
                  ---------

       И определим сегмент редактирования от начала абзаца и до его конца (а можно и наоборот) и нажмем клавиши <GOLD><FILL> или (для K52) введем команду:

   <GOLD><COMMAND>Command: FILL<ENTER>
                  ---------

       И вот что получилось:

  - Стоит только заметить,- говорит Алеша,- что
  функция FILL в редакторе KED выполняется
  как в командном режиме, так и с помощью
  дополнительной клавиатуры, нажатием клавиш
  <GOLD><FILL>. В редакторе K52 используется
  только командный режим. А как выполнить эти
  команды, я покажу ниже и для примера использую
  этот абзац.

       Дальше больше. Захотелось мне посмотреть, как будет выглядеть абзац на узенькой полоске с границей на 30 колонке. И проделал это таким же образом:

   <GOLD><COMMAND>Command: SET WRAP 30<ENTER>
                  ---------
   <GOLD><COMMAND>Command: FILL<ENTER>
                  ---------

И вот что получилось:

  - Стоит только заметить,-
  говорит Алеша,- что функция FILL в
  редакторе KED выполняется
  как в командном режиме, так и
  с помощью дополнительной
  клавиатуры, нажатием клавиш <GOLD><FILL>.
  В редакторе K52 используется
  только командный режим. А как
  выполнить эти команды, я покажу
  ниже и для примера использую
  этот абзац.

       — А теперь мы подошли к командам,— продолжаю я,— которые отсутствуют в редакторе K52, потому что связаны с особенностями терминала VT100.
       — А я буду их пробовать,— стремится в бой Алеша,— и рассказывать, что у меня получилось. Итак, по порядку:

   <GOLD><COMMAND>Command: SET SCREEN 80<ENTER>
                  ---------

       И ничего не произошло. Скорее всего, этот режим установлен по умолчанию, и мы опять столкнулись с альтернативной парой. Тогда попробуем следующую команду:

   <GOLD><COMMAND>Command: SET SCREEN 132<ENTER>
                  ---------

       — Ой, что это случилось,— Алеша даже подпрыгнул от неожиданности,— буквы сжались, стали маленькими. Если посчитать, то можно убедиться, что на экране теперь вмещается 132 символа в строке. Значит, можно изменять размеры символов на экране, и соответственно их число, которое может быть 80 или 132 символа в строке.
       Тогда со второй парой команд становится более ясно. Они позволяют отображать либо светлые буквы на темном фоне, либо темные буквы на светлом фоне. По умолчанию, как мы видим установлен режим SET SCREEN DARK, т.е. установить экран темный. Для того чтобы поменять изображение на обратное, нужно дать команду:

   <GOLD><COMMAND>Command: SET SCREEN LIGHT<ENTER>
                  ---------

       Некоторым такое изображение кажется более приятным. И, как в предыдущих случаях, слова, заключенные в квадратные скобки, при вводе команды можно опустить. Но вот команда SET QUIET — "установить тишину" — меня ставит в тупик.
       Для того чтобы ее понять,— поясняю я,— нужно вспомнить, что в случае ошибочно введенной команды или другой ошибки редактор подает звуковой сигнал. Вот этот звуковой сигнал можно отменить командой SET QUIET, а восстановить командой SET NOQUIET. Иначе говоря, командой SET QUIET устанавливается режим "РАБОТАТЬ МОЛЧА".

 

10.7. Работа с файлами

       — То, что мы до сих пор разбирали,— говорит Алеша,— относилось к обычному редактированию и, наверное, имеется в любом современном редакторе текстов. А вот то, что мы говорили о работе со вспомогательными файлами, уже позволяет сделать работу писателя по принципу "ножниц и клея". Очень интересно, как это осуществляется на практике?
       — А про это ты можешь прочитать во второй картинке HELP,— отвечаю я,— если ты помнишь, в редакторе EDIT мы должны были явно указывать спецификации входного и выходного файла, которые теперь называются рабочим и временным соответственно. Здесь же мы должны указать спецификацию входного и выходного вспомогательных файлов.
       — А в HELPе,— замечает Алеша,— прямо указан текст команды OPEN INPUT DEV:INPFIL.TYP — если читать ее полностью, то получится: "Открыть файл INPFIL.TYP на устройстве DEV:". И точно также открывается файл для вывода.
       — Здесь нужно напомнить,— замечаю я,— что спецификация файла понимается в стандартном для RT-11 виде. И, например, спецификация файла для вывода "LP:" будет правильна. Такой файл позволяет распечатывать отдельные фрагменты текста без изменения рабочего файла.
       — А я покажу как обычно открываются файлы,— продолжает Алеша,— для открытия входного и выходного вспомогательных файлов необходимо дать соответственно команды:

  +---------------
  !  Command: OPEN INPUT DEV:INPFIL.TYP<ENTER>
  !  ---------
  !
 
  +---------------
  !  Command: OPEN OUTPUT DEV:OUTFIL.TYP<ENTER>
  !  ---------
  !

       И нужно сказать, что необязательно открывать сразу оба файла. Каждый файл открывается по мере необходимости и независимо от другого.
       А вот закрывается?!
       — Входной вспомогательный файл закрывается автоматически,— прихожу я ему на помощь,— если при чтении будет обнаружен конец файла или при выходе из редактора. Вернуться в начало входного вспомогательного файла нельзя.
       Что же касается выходного файла, то это зависит от его назначения. Выходной вспомогательный файл может быть закрыт командой:

  +---------------
  !  Command: CLOSE<ENTER>
  !  ---------
  !

если информация в нем должна быть сохранена, или освобожден командой:

  +---------------
  !  Command: PURGE<ENTER>
  !  ---------
  !

если информация в нем не нужна.
       — А когда необходимый файл открыт,— Алеша продолжает разбирать команды из первого столбика второй картинки HELP,— можно и выполнять операции с элементами редактирования. Самая простая команда WRITE SELECT — записать выбранное. А "выбранным" у нас может быть только сегмент редактирования.
       Это наиболее естественная операция для писателя, делающего выписки. При движении по файлу фрагмент текста, который нужно записать во вспомогательный выходной файл (выписка), определяется как сегмент редактирования, и затем дается команда:

  +---------------
  !  Command: WRITE SELECT<ENTER>
  !  ---------
  !

       Выбранный сегмент редактирования будет записан в конец вспомогательного выходного файла.
       При этом курсор устанавливается в конец сегмента редактирования, который не изменяется. И так можно выбирать по всему файлу и в произвольном порядке.
       — Но здесь есть маленький подводный камень,— замечаю я,— запись в выходной файл происходит через внутренний буфер. Поэтому для того, чтобы распечатать выбранный фрагмент текста на принтере, после вывода его командой WRITE SELECT нужно закрыть вспомогательный файл командой CLOSE. При этом внутренний буфер освободится и выбранный фрагмент текста будет распечатан полностью. Если нужно сделать еще выписки — распечатки, то вспомогательный выходной файл на LP: открывается снова.
       — Но если мы знаем, что в выходной файл нужно записать целое число страниц,— продолжает Алеша,— часто на печатающее устройство, то можно так и указать в команде — записать целое число страниц

  +---------------
  !  Command: WRITE NN PAGES<ENTER>
  !  ---------
  !

для записи NN страниц

       или записать целое число строк, дав команду

  +---------------
  !  Command: WRITE NN [LINES]<ENTER>
  !  ---------
  !

для записи NN строк. Причем слово LINES можно не вводить.

       И наконец, мы можем записать остаток (REST) файла командой

  +---------------
  !  Command: WRITE REST<ENTER>
  !  ---------
  !

       для записи оставшейся части файла
       — Но это ты рассказал о записи во вспомогательный выходной файл,— говорю я,— а как же прочитать информацию из вспомогательного входного файла?
       — С одной стороны, так же, как и писать,— отвечает Алеша,— ведь объекты у нас одинаковые, исключен только сегмент редактирования, потому что его нельзя определить во вспомогательном входном файле. Значит, и синтаксис команд останется тем же. Изменится только название команды INCLUDE — включать.
       — И не только,— добавляю я,— кроме включения текста из другого файла, тебе нужно пропустить ненужный фрагмент, чтобы не удалять его во временном файле.
       — И такая команда есть,— продолжает Алеша,— SKIP — пропуск (текста при чтении). И так как эти команды имеют одинаковый синтаксис, то во второй картинке HELP (первый столбец) они приведены без перечисления элементов редактирования. Сами элементы обозначены словом "option", которое в данном случае означает — выбираемый элемент, который может быть: целое число страниц (PAGES), целое число строк (LINES) и остаток (REST).
       И выполнены эти команды могут быть следующим образом:

  +---------------
  !  Command: INCLUDE NN PAGES<ENTER>
  !  ---------

или

  !  Command: SKIP NN PAGES<ENTER>
  !  ---------

для вставки или пропуска из входного файла NN страниц

  +---------------
  !  Command: INCLUDE NN [LINES]<ENTER>
  !  ---------

или

  !  Command: SKIP NN [LINES]<ENTER>
  !  ---------

для вставки или пропуска из входного файла NN строк.

  +---------------
  !  Command: INCLUDE REST<ENTER>
  !  ---------

или

  !  Command: SKIP REST<ENTER>
  !  ---------

для вставки или пропуска остатка входного вспомогательного файла.

 

10.8. Макрокоманды

       — И после команд работы с файлами,— спрашивает Алеша,— идет команда LEARN — учить, учись. Это кто кого будет учить? Он (редактор) меня или я его?
       — А ты испугался, что еще один учитель на твою голову свалился,— подтруниваю я над ним,— успокойся, это ты можешь обучить его целой последовательности команд и затем исполнять ее нажатием только двух клавиш.
       Удобство команды LEARN, по сравнению с такими же средствами в редакторе EDIT, в том, что пользователю не нужно запоминать какой-либо синтаксис. После ввода команды LEARN, которая не имеет аргументов, редактор просто начинает запоминать все последующие действия пользователя, включая и ошибочные, до тех пор пока не будут последовательно нажаты клавиши <GOLD>,<S> — если нужно только запомнить (Storage) эту последовательность команд, или <GOLD>,<X> — если нужно запомнить и сразу выполнить (eXecute).
       — Это, действительно много проще, чем в редакторе EDIT,— говорит Алеша,— и, главное, наглядно видно, что ты делаешь.
       — Вот и попробуй сообразить, что нужно сделать,— предлагаю я ему,— чтобы заменить многочисленные пробелы на одиночные.
       — Сначала нужно определить, что такое многочисленные пробелы, анализирует поставленную задачу Алеша,— наверное, более точно можно сказать, что это два и более символа "Пробел" идущих подряд. Тогда я могу в качестве модели поиска задать два пробела

   <GOLD><FIND>Model: <Пробел><Пробел><BACKUP>
               -------

       И после этого вернуться в начало файла, так как искать нужно будет по всему тексту, и начать учить редактор.

   <GOLD><TOP><ADVANCE>                       - вернулись наверх
   <GOLD><COMMAND>Command: LEARN<ENTER>       - начало обучения
   <NEXTFIND>                     - найти следующий образ
   <DELCHAR>                      - удалить пробел после курсора
   <GOLD><X>                      - запомнить и выполнить эту
                                    последовательность команд

       И дальше выполнять эту короткую последовательность просто нажатием клавиш.

   <GOLD><X>

       — А ведь ты ничего не сэкономил,— говорю я Алеше,— было два нажатия на клавиши и осталось два.
       — А вот и сэкономил,— хитро проговорил Алеша, который уже догадался, где зарыта собака,— по нажатиям клавиш действительно экономии не получилось, а вот функция теперь получилась одна, и я могу удалить все двойные и кратные пробелы в достаточно большом файле следующим образом:

   <GOLD>Repeat: 50000<GOLD><X>
         --------

       Правда, я за это время, наверное, успею попить чаю.
       — Это верно,— подтверждаю я его предположение,— маленькая операция, но при таком количестве повторений может выполняться долго.
       Может быть ты тогда найдешь подводный камень и во втором нашем примере — удалить пробелы перед точкой.
       — Попробую,— начал Алеша,— для этого, наверное, нужно проанализировать, что произойдет, если мы будем выполнять нашу последовательность команд несколько раз подряд.
       Модель поиска нам ясна — это символ "Пробел", за которым следует точка. Если мы начнем поиск от начала файла к его концу и будем удалять пробел до или после курсора, то следующий пробел мы будем удалять уже у следующей точки, несмотря на то что у текущей еще есть пробелы.
       Выход из положения видится в том, чтобы начинать поиск с конца файла и двигаться в его начало. При этом если установлен режим SET BEGIN, т.е. курсор устанавливается в начало модели поиска, то удалять нужно пробел после курсора. Можно попробовать установить режим SET END, но тогда придется дополнительно перемещаться вперед на один символ, чтобы не удалить точку.
       Для примера я возьму распечатку какого-нибудь каталога в одну колонку, которая приведена ниже.

   AS    .SAV
   BINCOM.SAV
   CC    .SAV
   CREF  .SAV
   DIR   .SAV
   DOC   .SAV
   DUMP  .SAV
   DUP   .SAV
   DW    .SYS
   DZ    .SYS
   IND   .SAV
   KED   .SAV
   LD    .SYS
   LET   .SAV
   LP    .SYS
   NL    .SYS
   PI    .SYS
   PIP   .SAV
   RESORC.SAV
   RT11FB.SYS
   SETUP .SAV
   SL    .SYS
   STARTF.COM
   SWAP  .SYS
   TT    .SYS
   VM    .SYS
   XC    .SYS
   ZERO  .BLK

       А конкретно, вот что я сделал:

   <GOLD><FIND>Model: <Пробел>.<ADVANCE>
   <GOLD><BOTTOM><BACKUP>
   <GOLD><COMMAND>Command: LEARN<ENTER>
                  --------
   <FINDNEXT>
   <DELCHAR>
   <GOLD><X>

       И опять, используя функцию Repeat:, выполним эту последовательность много много раз:

   <GOLD>Repeat: 50000<GOLD><X>
         --------

и в результате получилось:

   AS.SAV
   BINCOM.SAV
   CC.SAV
   CREF.SAV
   DIR.SAV
   DOC.SAV
   DUMP.SAV
   DUP.SAV
   DW.SYS
   DZ.SYS
   IND.SAV
   KED.SAV
   LD.SYS
   LET.SAV
   LP.SYS
   NL.SYS
   PI.SYS
   PIP.SAV
   RT11FB.SYS
   SETUP.SAV
   SL.SYS
   STARTF.COM
   SWAP.SYS
   TT.SYS
   VM.SYS
   XC.SYS
   ZERO.BLK

       Но это все короткие макрокоманды,— говорит Алеша,— хотя и дают большие удобства. А что можно сделать еще?
       — Наш список файлов, например,— отвечаю я,— можно преобразовать в более сложный текст (для чего он нужен, мы пока промолчим). Итак, имея в каждой строке только имя и тип файла, преобразуем строку в команду копирования.

   COPY LD0:FILNAM.TYP LD4:FILNAM.TYP

       Я сейчас попробую это сделать,— засучил рукава Алеша. Сначала нужно занять исходную позицию:

   <GOLD><TOP><ADVANCE>

и сказать редактору — "Учись"

   <GOLD><COMMAND>Command: LEARN<ENTER>
                  ---------
   <GOLD><DELEOL>              - удалить остаток строки _
   COPY LD0:<GOLD><UNDELLINE> LD4:<GOLD><UNDELLINE>
   <BLINE>                     - перейти на следущую строку _
   <GOLD><X>
   <GOLD>Repeat: 1000<GOLD><X>
         --------

       — Вот и все,— доложил Алеша,— даже при таком маленьком тексте мы получили большое удобство и экономию. И результат у нас получился такой.

   COPY LD0:AS.SAV LD4:AS.SAV
   COPY LD0:BINCOM.SAV LD4:BINCOM.SAV
   COPY LD0:CC.SAV LD4:CC.SAV
   COPY LD0:CREF.SAV LD4:CREF.SAV
   COPY LD0:DIR.SAV LD4:DIR.SAV
   COPY LD0:DOC.SAV LD4:DOC.SAV
   COPY LD0:DUMP.SAV LD4:DUMP.SAV
   COPY LD0:DUP.SAV LD4:DUP.SAV
   COPY LD0:DW.SYS LD4:DW.SYS
   COPY LD0:DZ.SYS LD4:DZ.SYS
   COPY LD0:IND.SAV LD4:IND.SAV
   COPY LD0:KED.SAV LD4:KED.SAV
   COPY LD0:LD.SYS LD4:LD.SYS
   COPY LD0:LET.SAV LD4:LET.SAV
   COPY LD0:LP.SYS LD4:LP.SYS
   COPY LD0:NL.SYS LD4:NL.SYS
   COPY LD0:PI.SYS LD4:PI.SYS
   COPY LD0:PIP.SAV LD4:PIP.SAV
   COPY LD0:RT11FB.SYS LD4:RT11FB.SYS
   COPY LD0:SETUP.SAV LD4:SETUP.SAV
   COPY LD0:SL.SYS LD4:SL.SYS
   COPY LD0:STARTF.COM LD4:STARTF.COM
   COPY LD0:SWAP.SYS LD4:SWAP.SYS
   COPY LD0:TT.SYS LD4:TT.SYS
   COPY LD0:VM.SYS LD4:VM.SYS
   COPY LD0:XC.SYS LD4:XC.SYS
   COPY LD0:ZERO.BLK LD4:ZERO.BLK

       Но мы что-то говорили о распечатке текста по страничкам?
       — Проблема состоит в том,— поясняю я Алеше,— что с персональными компьютерами и ДВК поставляются маленькие принтеры, которые умеют печатать только по страничкам. Команда PRINT не умеет печатать по страничкам, так как опирается на команду COPY. Вот теперь попробуй облегчить жизнь пользователей и расскажи, как напечатать текст по страничкам, используя макрокоманды и вспомогательный выходной файл.
       — Я не думаю, что будет очень сложно,— говорит Алеша,— потому что подводные камни мы уже обсудили. Сначала, как всегда, мы должны занять исходную позицию. В данном случае — это начало файла. И нужно подготовить принтер к работе

   <GOLD><TOP><ADVANCE>

и сказать редактору

   <GOLD><COMMAND>Command: LEARN<ENTER>
                  ---------

и после этого начать печатать.

   <GOLD><COMMAND>Command: OUT LP:<ENTER>
                  ---------
   <GOLD><COMMAND>Command: WRITE PAGES<ENTER>
                  ---------

       Количество страниц мы не указываем, потому что по умолчанию оно считается равным единице. И подождав, когда принтер напечатает текст и остановится, закроем выходной вспомогательный файл.

   <GOLD><COMMAND>Command: CLOSE<ENTER>
                  ---------

       Принтер допечатает остаток страницы и, вставив новый лист бумаги, запоминаем эту последовательность, одновременно напечатав следущую страницу.

   <GOLD><X>

       Нажимая клавиши <GOLD><X>, можно выдавать на принтер любую страницу по своему желанию и не торопясь менять бумагу в принтере. Нужно только помнить, что если курсор будет установлен посередине страницы, то напечатана будет часть страницы, от курсора и до ее конца.
       — Прекрасно,— хвалю я Алешу,— нужно только заметить, что примерно так же можно выводить текст на графопостроитель ЭМ-7052, который поставляется с "Электроникой-85", но в качестве элемента для вывода использовать строку, а не страницу.
       Мы разобрали типичные случаи использования макрокоманд и команд редактора KED из писательского набора. После достаточно продолжительной работы, как правило, у пользователя остается в арсенале только часть команд редактора и приемов работы, которая соответствует его основным видам работ, привычкам и психологии. Это нормально, поэтому не следует пытаться вызубрить все команды.

(c) 1992г Архангельский Андрей Германович




Поддержите культуру
ЯндексЯндекс. ДеньгиХочу такую же кнопку

Google
 
Web azdesign.ru az-libr.ru


Дата последнего изменения:
Wednesday, 06-Nov-2013 08:33:58 UTC