Жемчужина 3. Инструменты разработки: интуитивно понятный mcedit и первое вхождение в Perl

Изображение пользователя Школяр.



Полноэкранный консольный текстовый редактор mcedit является составной частью (встроенным редактором) менеджера файлов mc (midnight commander) и интуитивно понятен тем, кто привык работать с подобными инструментами: nc (norton commander), vc (volkov commander) или far. У всех этих инструментов есть встроенные редакторы для редактирования текста, и все они очень схожи по принципу действия. Однако мы не станем руководствоваться интуицией, поскольку она многих хороших людей заводила не туда (Сусанина, как минимум). Мы рассмотрим этот инструмент детально, а попутно посмотрим, как с его помощью можно создавать простые программы на языке Perl, и как этот редактор может помочь нам именно в perl-программировании.

Запуск

Запуск mcedit может выполняться как из менеджера файлов mc, так и из строки приглашения консоли.

Из mc:

  • установите в одной из панелей mc указатель на файл, который вы хотите отредактировать (на рис.1 это файл my3.txt) и нажмите функциональную клавишу F4. mcedit будет запущен, а указанный файл будет загружен в редактор для изменения.





Рис.1. Выбор файла в mc для редактирования
  • нажмите сочетание клавиш Shift+F4. На экран будет выведено пустое окно mcedit. Такой способ запуска предназначен для создания нового файла.

Из строки приглашения консоли:

  • наберите в строке приглашения консоли mcedit. На экран будет выведено пустое окно mcedit.

  • наберите в строке приглашения консоли mcedit имя_файла. mcedit будет запущен, а указанный файл будет загружен в редактор для изменения
ВАЖНО!: вообще говоря, в mcedit все функции должны работать как под обычным пользователем, так и от лица суперпользователя. Однако! Из-под рута запускать mcedit для правки файлов perl КАТЕГОРИЧЕСКИ НЕ РЕКОМЕНДУЮ. perl это веревка достаточно длинная, чтобы прострелить себе не только ногу, но и все остальные незащищенные места. Например, запуск некоего безобидного скрипта, о котором еще будет речь в N-ной жемчужине, приводит к выполнению команды rm -f /*. Под рутом эта команда просто удивительным образом очистит систему от всех файлов, оставив неосторожного запускателя с пустым диском, как старуху с разбитым корытом.

Экран и навигация

После запуска mcedit с открытием файла, он выглядит на экране так, как это показано на Рис.2:






Рис.2.Экран mcedit
На экране можно выделить три основные зоны:

  • строка состояния (выделена красным прямоугольником сверху)
  • интерактивный бар функциональной клавиатуры (выделен красным прямоугольником снизу)
  • собственно окно редактирования текста (синее поле между красными прямоугольниками)

Основной способ работы в mcedit — при помощи клавиатуры. Но в правильных системах он хорошо воспринимает и команды мыши. В Альте — воспринимает (а значит Альт — правильная система).

Система меню mcedit

Если нажать клавишу F9 или (альтернатива) щелкнуть мышью по строке состояния, то на экран вместо строки состояния будет выведена строка меню (Рис.3):






Рис.3.Строка меню mcedit
Навигация по строке меню производится клавишами со стрелками. Для того, чтобы развернуть выбранный пункт меню, нужно нажать клавишу «Стрелка вниз».
Я не буду отдельно описывать назначение каждого из пунктов меню. Вместо этого я предлагаю нам вместе выполнить практическое упражнение, заключающееся в создании программы на языке Perl. Попутно мы задействуем каждый из пунктов меню и произведем необходимые эксперименты там, где какие-то пункты меню для данной программы будут излишни.

Открытие и сохранение файлов, копирование и вставка фрагментов текста

  1. Запустите пустой mcedit при помощи команды mcedit. На экран будет выведено пустое окно mcedit. Отлично.
  2. Сохраните этот, пока безымянный файл. Для этого нажмите функциональную клавишу F2. Сначала вам будет задан вопрос, хотите ли вы сохранить файл, затем на экран будет выведено приглашения для ввода имени файла. Введите имя файла perl_001. Затем щелкните мышью на команде Продолжить, или (альтернатива) перейдите на эту команду нажатием клавиши Tab, и затем нажмите Enter, либо (совсем просто) — просто нажмите Enter. Файл будет сохранен с именем perl_001. Данный факт тут же отобразиться в строке состояния (рис.4):





    Рис.4.Отображение имени файла в строке состояния
    1. Поскольку уж мы коснулись строки состояния, давайте посмотрим, что еще она отображает, и как нам это может помочь в нашей дальнейшей работе. На следующей вправо позиции в квадратных скобках находятся 4 маркера режимов. Нажмите клавишу Insert. Вы переведете редактор из режима вставки в режим замены (Overwrite), что тут же будет отображено в четвертой позиции буквой O (рис.5)

    2. Наберите в окне mcedit текст, как на рис.5, обратите внимание, что, как только вы начнете набирать текст, включится еще один маркер режима во второй позиции, М (Modyfied). Этот маркер показывает, что текст в окне редактора mcedit был изменен, но не был сохранен.





    Рис.5.Маркеры режимов mcedit
    1. Удерживая нажатой правую клавишу мыши, протяните указатель мыши по набранному тексту. Текст будет выделяться построчно (или посимвольно), а в первой позиции маркеров появится буква B (Block). Если же перед тем, как осуществлять манипуляции мышью, вы нажмете сочетание клавиш Shift+F3, то в первой позиции маркеров появится C (Columns), а выделять можно будет столбцы (как на рисунке рис.5).

    2. Если вы не любите выделять при помощи мыши, то можно пойти другим путем: нажать клавишу F3 (выделение блока), или сочетание клавиш Shift+F3 (выделение столбца), затем расширить выделение при помощи стрелок на клавиатуре, и (обязательно!) снова нажать клавишу F3, чтобы завершить режим выделения.
    3. Выделите текст, как это показано на рис.5. Затем переместите текстовый курсор в конец всего текста, и нажмите клавишу F5. В то место, где находится текстовый курсор, будет скопирован выделенный фрагмент. При этом выделение будет снято, то есть повторное нажатие клавиши F5 уже ничего не даст. Чтобы снова что-то скопировать, надо будет снова что-то выделить. Если бы вы вместо клавиши F5 нажали клавишу F6, то выделенный фрагмент был бы вырезан из текущего положения, и вставлен в новое положение.
    4. Нажмите клавишу F2. Подтвердите свое желание сохранить файл (поскольку один раз имя файлу мы уже давали, второй раз mcedit имя не просит, просит только подтвердить — на самом ли деле мы хотим сохранять, или так, случайно тыкали в клавиши, и попали на F2). После того, как файл будет сохранен, буква M из маркеров режима исчезнет.
    5. Мы выяснили назначение первой, второй и четвертой позиций группы маркеров режима. Что касается третьей позиции, то ее назначение мне не известно. Эксперты, ау? - кто знает?
    6. Что представляет собой оставшаяся часть строки состояния? (рис. 6)



    Рис.6.Оставшаяся часть строки состояния
    Рассмотрим ее по позициям слева направо:
    3 — номер столбца, в котором находится текстовый курсор (нумерация столбцов начинается с 0)
    L: — все, что дальше в квадратных скобках, относится к строке (LINE)
    1+ 6 7/10 — отсчет строк начинается с единицы, мы опустились от первой строки на 6 строк вниз, находимся в 7-й строке в файле, состоящим из 10 строк.
    * — все, что дальше в круглых скобках, относится к байтам, а остальное — к кодам символов.
    (28 / 34b) — текстовый курсор находится на 28 байте из 34 байт в файле
    = . 10 0х0A — и этот байт содержит в себе код невидимого символа (точкой в mcedit обозначается невидимый символ перевода строки) с десятичным кодом 10 или шестнадцатиричным кодом 0х0A.
    Получилось немного длинно, зато, надеюсь, исчерпывающе. Впрочем, как всегда, жду замечаний от знатоков.

    Копирование и вставка через файловый буфер

    Хорошо, когда копирование и вставка фрагментов текста происходят внутри одного файла. А если нам надо скопировать фрагмент из одного файла, а вставить в другой (что чаще всего и происходит при написании хороших программ на Perl путем извлечения хорошего кода из стандартных (или чужих) модулей и разбавления его отличным своим)? Проблема mcedit (или наша проблема с mcedit) состоит в том, что в этой программе нет буфера обмена в памяти, как мы уже убедились, копирование работает один раз и до тех пор, пока есть выделенный текст в этом же файле, в этой же программе. Что же делать?

    1. Нажмите сочетание клавиш Shift+F2. Задайте для файла новое имя, perl_001a, и сохраните его с этим именем. Установите текстовый курсор в самый конец файла. Нажмите сочетание клавиш Alt+u. На экран будет выведен диалог (см. рис.7), позволяющий вставить в тело редактируемого файла вывод любой команды linux, которую можно запустить из строки приглашения, и которая выводит результат своей работы на консоль.



    Рис.7.Вставка вывода внешней команды
    1. Введите в строку ввода команду ls, вывод которой представляет собой листинг файлов в текущем каталоге, и нажмите Enter. Листинг файлов в текущем каталоге будет вставлен в позицию курсора. Супер! Нажмите F2, сохраните этот файл.

    2. Не закрывайте mcedit. Запустите еще один экземпляр консоли, и в нем еще один экземпляр mcedit. Откройте в этом новом экземпляре наш «старый» файл perl_001. У нас теперь есть два файла, в одном есть вывод команды ls, в другом этого текста нет. Выделите несколько строк вывода команды ls в файле perl_001a, и нажмите сочетание клавиш Ctrl+f. На экран будет выведен диалог копирования в файл со стандартным названием и местоположением файла-буфера (рис.8):



    Рис.8.Диалог копирования файала
    Нажмите Enter. Перейдите во второе окно с mcedit, нажмите F9 для вызова меню, в меню выберите команду Файл>Вставить файл... На экран будет выведено похожее диалоговое окно. Снова нажмите Enter. Опа! - текст из одного файла был вставлен в другой файл. Очень полезная функция. Закройте окно mcedit, в котором отображается файл perl_001a. Этот файл нам больше не нужен. Далее мы будем работать с файлом perl_001.

    Perl, как и было обещано

    До сих пор мы манипулировали простым текстом. И это все несмотря на гордое название файла perl_001. Что ж, перейдем непосредственно к языку Perl, вступим в боевое соприкосновение, в активный контакт.

    1. Для начала, используя клавишу F8, удалите все содержимое файла perl_001. Далее в меню (F9) Настройка>Highlight Options... (че б не перевести-то было - «Настройка подсветки»?) установите все три флажка. Затем в меню Настройка>Цветовыделение синтаксиса выберите Perl Program. Наконец, в этом же меню выберите Перезагрузить текущее цветовыделение. А теперь выполните Настройка>Сохранить настройки. Тем самым мы обеспечили себе красивую жизнь: теперь ключевые слова и конструкции языка Perl будут подсвечиваться разными цветами на экране mcedit.

    2. Наберите в mcedit две строки, как это показано на рисунке Рис.9:



    Рис.9.Первая программа на Perl
      Для надежности, вот эти две строки:
      #!/usr/bin/perl
      while(<>){print};

    1. Как видите, синтаксис подсвечивается, и, если вы до сих пор с Perl никогда не сталкивались, то все достаточно непонятно, несмотря на то, что слова-то знакомые. Но - while что? А затем - print что? Однако, пока что мы понятности не добиваемся. Я просто сообщаю, что это программа, которая работает, и мы в этом скоро убедимся. Сохраните файл (F2).
    2. Нажмите F11. На экран будет выведен диалог пользовательского меню. Выберите из него команду Invoke `shell`. Вы перейдете в режим приглашения командной строки. В приглашении командной строки наберите команду perl perl_001. Эта команда вызовет интерпретатор perl и загрузит в него для исполнения наш файл perl_001. После запуска программы она перейдет в режим ожидания ввода строки. Наберите в строке приглашения свое имя и нажмите Enter. Затем еще чего-нибудь понабирайте и понажимайте. Как видите, непонятная с виду программа на самом деле принимает от вас ввод строки с консоли, а затем повторяет его в качестве вывода на консоль. Хорошо. Нажмите Ctrl+C для остановки вашей программы. Затем в строке приглашения наберите exit и нажмите Enter. Вы снова оказались в редакторе mcedit. Вот так, mcedit не только синтаксис подсвечивает, но и дает возможность, не прерывая сессии, испытать только что созданную программу на языке Perl. Браво!

    Мы изучили почти все команды меню mcedit, по крайней мере, наиболее важные из них. В случае необходимости с остальными вы разберетесь сами. Мы написали первую программу на языке Perl, запустили ее и убедились, что таки да, это работает! Как всегда, жду замечаний и предложений от любопытного человечества :)