Вільний інструментарій роботи з текстом

Обробка «плоских» (нерозмічених) текстів — одна з перших (після обчислювальних завдань і управління приладами) і винятково пропрацьована область застосування комп'ютера.

Робота з текстами критична для багатьох користувацьких програм. Електронна пошта — це текст. Формати розмітки, за допомогою яких представлені форматований текст, векторна графіка, ноти і т.п. (практично всі дані, за винятком растрової графіки і хвильового представлення звуку) — в основі своїй також текст.

Навіть картинки і звукові файли, розміщені в WWW, передаються непомітно для користувача між машинами в закодованій текстовій формі, хоча в даному випадку текст і не є «власною» формою представлення даних.

Команди, за допомогою яких користувач спілкується з системою, — це текст. Скільки б не популяризували і не нав'язували графічні інтерфейси, для серйозної і продуктивної роботи, як правило, не обійтися без повноцінного тестового діалогу, так само як при серйозній предметній розмові складно обійтися жестами і мімікою у відповідь. Більш того, робота з текстом критична і для розвитку самих обчислювальних і комунікаційних систем, оскільки самі програми в початковій своїй формі — тексти. Для програм на мовах, що інтерпретуються, тексти є і виконуваною формою, так що такі програми — тексти удвічі (а типова стандартна ОС майже наполовину складається з «сценаріїв», тобто програм, написаних на мовах, що інтерпретуються).

Ефективні методи і прийоми роботи з текстом — невід'ємна частина комп'ютерної грамотності, але в переважній більшості випадків вони виявляються незасвоєними вчасно. Часто в курсі середньої школи знайомство з обробкою «плоских» текстів обмежується вбудованими редакторами в середовищі програмування і електронно-поштовій програмі, а навики — простими прийомами набору і виправлення. Абстрактніші і загальніші операції вивчаються як частина word-процесінгу, і хоча іноді при цьому і демонструються можливості вбудованих в word-процесори мов програмування, область обробки текстів залишається «річчю в собі» і ніяк не інтегрується з іншими областями, що освоюються в курсі інформатики.

Розмічений і «чистий»

Вододіл між текстовими редакторами і word-процесорами, як це обговорювалось в попередній лекції, проходить за способом відображення розміченого (що має деякі атрибути, такі, як колір, зображення і кегль (розмір) символів, вирівнювання і розташування абзаців, оформлення сторінки і т.п.) тексту.

Word-процесор певним чином інтерпретує розмітку, візуалізуючи вказані атрибути.

Текстовий редактор відображає текст «як є», хоча він цілком може бути «в курсі» синтаксису мови розмітки (якщо текст розмічений, наприклад, XML, HTML або TEX) або навіть самого тексту (наприклад, синтаксису мови програмування) і якимсь чином на нього реагувати (наприклад, розмальовувати теги розмітки HTML або зарезервовані слова Pascal). У принципі, він може бути «в курсі» синтаксису, граматики і лексики навіть природної мови, хоча для роботи з природними мовами «чистий», нерозмічений текст використовується все рідше, або, принаймні, нерозмічений текст все рідше використовується як первинна форма представлення тексту природною мовою.

Відмовитися зовсім від роботи з «чистим» текстом скрутно по давно відомій ергономістам причині: використання візуалізації «дозволяє демонструвати лише результат форматування, по ньому неможливо визначити завдання форматування, поставлені користувачем системі. Наприклад, якщо користувач помічає, що система не робить перенесень ... неможливо визначити ... чи є це простим збігом або ж при форматуванні даного розділу перенесення заборонено» .

Редактори

Коли комп'ютери були великими і дорогими, мова про їх використання для автоматизації процесу редагування програм або інших текстів йти не могла: це завдання вирішувалося набагато простішими пристроями.

Із здешевленням комп'ютерної техніки і розробкою багатокористувацьких систем з'явилася можливість посадити оператора за підключений до машини телетайп. Для зручності операторів (часто ними виявлялися самі програмісти) розроблялися програми редагування текстів (або, просто, текстові редактори), які як правило виводили текст порядково і чекали на клавіатурну команду (часто на особливій витонченій мові), що повідомляла, залишити рядок незмінним, чи внести в нього якісь зміни.

Наступний крок був зроблений, коли телетайп як термінальний пристрій змінив дисплей з ЕПТ. Це перетворило текст перед очима оператора в динамічний і дозволило зробити революцію, упровадивши так звані «повноекранні» (або просто «екранні») редактори, взаємодіючи з якими, оператор дістав можливість, хоч і маніпулюючи клавіатурою, застосовувати техніку, швидше схожу на прийоми роботи з листом паперу письменника, котрий повертається до раніше написаному, витирає і виправляє текст нелінійно (представники деяких шкіл в інформатиці досі вважають, що це негативно вплинуло на стиль програмування).

Vi і Emacs

Цікаво, що два, мабуть, перших екранних редактори, що були створені на початку сімдесятих, і стали родоначальниками «сімейств» таких програм, досі є найпопулярнішими в професійному середовищі. Це vi Біла Джоя (тоді аспіранта Університету Каліфорнії в Берклі, а потім засновника Sun Microsystems) і Emacs Річарда Столлмена (тоді співробітника Лабораторії штучного інтелекту Массачуссетського технологічного інституту, а нині — президента Фонду вільного програмного забезпечення і лідера проекту GNU). Обидва вони, по суті, походять від екранних режимів роботи популярних тоді редакторів ed і TECO, відповідно.

Мила Олена!
Ти не проти повечеряти зі мною в ніч з п'ятниці на неділю?
- Максим
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
-- INSERT --                                          3,1           All

Редактор vi

Перший нині стандартизований і, в тій або іншій реалізації (найбільш популярна, мабуть, vim Брама Мооленаара) доступний у складі будь-якої стандартної операційної системи (зокрема, вільних). Другий під назвою GNU Emacs підтримується Фондом вільного ПО і витримав з тих пір більше двадцяти видань (релізів).

Початкова ідеологія і ергономічна модель цих двох видатних розробок серйозно відрізняються, що служить приводом для жартівливої «священної війни» між їх прихильниками. Vi(m) відноситься до так званих «багаторежимних» редакторів. У режимі редагування оператор вводить і виправляє текст. Переміщення по тексту, контекстний пошук і заміна, складніші операції виконуються в командному режимі. Між цими режимами (а також, успадкованим від ed і рідковживаним режимом порядкового редагування) потрібне явне перемикання натисненням клавіатурної комбінації. Зате більшість команд прив'язані до натиснень однієї клавіші, і навіть переміщатися по тексту в командному режимі можна, не скидаючи кисть на додаткову клавіатуру із стрілками, а натискаючи алфавітні клавіші в центрі клавіатури. Адепти vi — програмісти і системні адміністратори — дуже серйозно відносяться до економії часу і енергії за рахунок мінімізації руху пальців. Emacs — приклад «безрежимного» або, якщо завгодно, «однорежимного» редактора: користувач завжди знаходиться в режимі безпосереднього редагування тексту в точці курсора, а команди видає, натискаючи складні поєднання клавіш і, при необхідності, вводячи параметри команд в окремому вікні. Із-за прагнення забезпечити пряму клавіатурну прив'язку якомога більшій кількості команд і складності використовуваних клавіатурних поєднань, що випливає з неї, була навіть пущена плітка про те, що Emacs розшифровується як «Esc-Meta-Alt-Ctrl-Shift» (хоча насправді, звичайно, клавіатурні акорди все ж таки не так складні, а Emacs — це просто Editing MACroS, тобто «макрокоманди редагування»).

Насправді відмінність ця швидше ідеологічна, аніж прагматична: у сучасних версіях vi в більшості випадків також можна здійснити прив'язку часто вживаних команд до клавіатурних комбінацій і виконувати їх з режиму редагування, а в Emacs можна достатньо точно (якщо комусь це буде потрібно) зімітувати командний режим, характерний для багаторежимних редакторів.

Дидактика редакторів

Реальна дуже значуща відмінність полягає в тому, що по своїй архітектурі vi — більш менш монолітна програма (з витікаючою звідси компактністю), а Emacs — насправді, розширювана (програмована) колекція макрокоманд редагування, написаних на Emasc Lisp (діалекті відомої мови функціонального програмування). Лише невелика кількість часто виконуваних і вимогливих до ресурсів команд вбудовані в саму програму і написані на компільованому C, більшість же команд написані на Lisp і можуть змінюватися або доповнюватися користувачами (або професійними програмістами за замовленням користувачів).

За чверть століття існування Emacs, завдяки вільній моделі ліцензування і відкритій моделі розробки, обріс неймовірною кількістю макрокоманд, що «заточують» його під синтаксичні особливості різних формальних мов (включаючи, але не обмежуючись мовами програмування і мовами розмітки), а також що реалізовують застосування, традиційно слабо асоційовані «просто редакторами». Наприклад, не виходячи з Emacs, можна працювати з електронною поштою і службами новин USENET (а також з гіпертекстом із сторінок WWW).

Або — що не менш цікаво — не виходячи з Emacs, можна прогнати текст програми через компілятор і підсвітити синтаксичні помилки або попередження, скористатися символьним відладчиком або профілювальником (реально Emacs утворює оболонку інтегрованого середовища розробки програм, і в цій якості є натхненником і попередником таких рідних для шкільного люду інтегрованих середовищ, наприклад, від Borland). І це лише декілька прикладів. Фактично, регулярно використовуваний Emacs дозволяє реалізувати (чисто в текстовому режимі) метафору «робочого столу», більш відому по пізніших графічних пакетах. Він реалізує множинність вікон (що не перекриваються) на одному екрані («фреймі»), а в графічному середовищі здатний працювати з багатьма «фреймами» (вікнами в термінах менеджера вікон). Пакет Emacspeak додає до функціональності Emacs мовний вивід, надаючи могутню підтримку для незрячих і слабкозрячих користувачів.

Все це (доступність, розширюваність, інтегрованість) робить його серйозним претендентом на організацію навчального робочого місця програміста .

Нам невідомі такі (орієнтовані на середовище на основі Emacs) курси для шкіл взагалі. А що стосується Росії (і російськомовного співтовариства), то нам невідомі приклади шкільних курсів, що вводять на достатньо ранньому етапі ідеї функціонального програмування (якщо вони все ж таки є, нам було би вкрай цікаво почути об них). А без останнього — на жаль — розширюваність Emacs залишається чисто теоретичною.

Проте як інтегроване середовище саме для програмування (зокрема, на директивних мовах, що зазвичай вивчаються в школі, наприклад, Pascal) Emacs використовувати, безумовно, можна. Слід тільки врахувати, що горезвісна «крива навчання» для нього значно увігнутіша, ніж для простіших (але і менш могутніх) засобів редагування, що зазвичай використовуються у подібного роду середовищах. Грубо кажучи, може знадобитись декілька занять до того, щоб учень почав впевнено себе почувати при наборі і редагуванні програм, зате потім ці завдання вирішуватимуться значно ефективніше.

Чому в звичайних навчальних курсах vi вивчається раніше за Emacs? Річ у тому, що vi, по-перше, стандартизований (і доступний у всіх без виключення відкритих системах), а по-друге, компактний. Адміністратор системи може опинитися в середовищі, де йому з екранних редакторів доступний тільки vi. Тому для сисадминів базові навички роботи з ним обов'язкові (незалежно від особистих переваг).

У навчальній обстановці, не орієнтованій на професійну підготовку, такого імперативу, будемо вважати, немає, тому методисти і викладачі можуть вибрати найбільш адекватний інструмент для демонстрації можливостей текстових редакторів, якщо завдання полягає тільки в знайомстві учнів з останніми.

Редагування «без редакторів»

Далеко не завжди відкривати файл і редагувати його вручну є оптимальним способом роботи з текстом, що міститься в ньому. Чим більше формалізований текст, і більш типовим є редагування, яке необхідно виконати, тим більші шанси, що існує спосіб «малою кров'ю» оптимізувати цей процес.

Розглянемо дуже формальне завдання. Припустимо, у файлі note збережений текст записки:

Мила Олена!
Ти не проти повечеряти зі мною в ніч з п'ятниці на неділю?
- Максим

Якщо життя пішло по діагоналі, і плани різко змінилися (і ми усвідомлюємо, як саме), можна відкрити файл з цим текстом в текстовому редакторі, наприклад, vi, і видати команду:

:s/Олена/Іра/g

Текст (передбачено) придбає вигляд:

Мила Іра!
Ти не проти повечеряти зі мною в ніч з п'ятниці на неділю?
- Максим

Проте, ту ж саму дію можна виконати і «без редактора», а точніше, без інтерактивного редактора, за допомогою редактора потокового. Стандартний потоковий редактор називається sed, і синтакис його команд схожий з синтаксисом командного режиму стандартного інтерактивного редактора vi, команда при цьому видається безпосередньо з командного рядка:

$sed -n 's/Олена/Таня/g' note

Якщо у нас підготовлений не один файл, а множина (наприклад, note.1, note.2, note.3), і потрібно внести в них одноманітні заміни (і нічого не пропустити, і ніде не помилитися), ми обійдемося також всього однією командою.

$sed -n 's/Олена/Віра/g' note.*

Якщо файлів буде тисяча, а необхідні зміни будуть дещо складнішими, нам, швидше за все, знадобиться знову-ж таки всього лише одна команда (хоча, можливо, знадобиться серйозне вивчення синтаксису). Це називається потоковим редагуванням, і воно інтенсивно застосовується, наприклад, для накладення латок на початкові тексти програм (проте, як було продемонстровано, може використовуватися і для обробки тексту на природній мові).

Автоматизована обробка текстів

UNIX був багато в чому «народжений для обробки текстів» (перш за все, це була система для програмістів, а програми — з чого ми почали сьогоднішню лекцію — це тексти). Набір службових програм (утиліт) сучасних стандартних ОС продовжує цю традицію, і в їх складі можна знайти десятки програм, орієнтованих на роботу з текстом. Багато які з них (але не всі) є порядковий-орієнтованими, тобто текст сприймається як послідовність рядків. Докладне обговорення цих можливостей див. в лекції 6 «Рядок довжиною життя».

Ресурси

Дистрибутив будь-якої сучасної стандартної ОС (включаючи вільні) містить всі згадані програми. Багато з них портовані (перенесені) і в альтернативні ОС.

Для Microsoft Windows рекомендується установка пакету Cygwin, що містить утиліти GNU (включаючи призначені для роботи з текстом) і деякі інші програми (включаючи редактор vim), що дозволяють організувати стандартне робоче середовище. Слід врахувати, що при роботі у версіях MS Windows, заснованих на MS-DOS (MS Windows 95/98/Me), у багатьох програм виникають складнощі через відсутність контролю за правами доступу до файлів і каталогів (версії, засновані на NT, — MS Windows NT/00/XP, позбавлені цього недоліку), а також те, що локалізована для російського середовища збірка Cygwin в даний час не поставляється. Для підтримки кирилічних символів необхідно в каталозі користувача створити файл з ім'ям «.inputrc», що містить рядки:

set meta-flag on
set convert-meta off
set output-meta on

Альтернативою Cygwin (з ряду причин менш бажаною) є використання системи Interix UNIX Tools for Windows, що також містить утиліти GNU (її можна придбати через Microsoft на диску або викачати з їх сайту). GNU Emacs для MS Windows можна викачати з сайту GNU.

Хороший опис стандартних утиліт (зокрема, для роботи з текстом) міститься в недавно перекладеній книзі , та й майже в будь-якому товстому підручнику, посібнику або довіднику по Unix або Linux. Серйозних відмінностей при їх використанні в контексті інших ОС немає.

Те ж саме відноситься і до інтерактивних редакторів. Крім того, в 1999 р. виданий російський переклад шістсотсотрінкового Посібника по GNU Emacs , його текст можна знайти і на сайті GNU; як і сам Emacs, ця книга вільна.