Emacs для начинающих

         

Transfer interrupted!


преобразования

символ<-->код, то речь идет о CCS : coded character set. Именно этому набору : coded character set

и присваивается имя : KOI8-R,

ISO_8859-1, ASCII. Иногда термин CCS

сокращают до сharset.

    Так например в стандарте MIME

употребляется термин сharset, хотя подразумевается конечно же CCS:

Content-Type: text/plain; charset=koi8-r

Content-Type: text/plain; charset=Windows-1251

Content-Type: text/plain; charset=ibm-866

    Как определяется character repertoire

для определенного charset ?

    Чаще всего набор символов определяется из языка (lang) и соответствующей ему системы письменности (script). Иногда рассматривается набор символов, воспризводимый конкретной аппаратурой ( например DEC VT-100 Character Set).

    Иногда конкретный набор символов является подмножеством другого, более обширного набора символов или же комбинацией

нескольких наборов (или их частей). Например, широко распространенный набор символов для представления русского языка : KOI8-R, содержит в себе символы из наборов LATIN, CYRILLIC, BOX DRAWING, BLOCK ELEMENT и т.д.. А конкурирующий с ним charset

- содержит больше символов из набора CYRILLIC (русские, украинские, белорусские), но меньше - из BOX и BLOCK. Кроме того в KOI8-R

нет например символа EURO.


Старшая половина charset (CCS) и code points символов.

Младшая половина совпадает с US-ASCII.



(см. также описние в формате POSIX.)

    Существует минимальный

(переносимый) (POSIX) - набор символов, который должны поддерживать любые информационные системы (определен в стандарте ISO 646) (он же ). С другой стороны, существует также "универсальный" Universal Character Set (UCS, ) включающий в себя все

возможные символы человеческих языков, технические, картографические и т.д. символы (~40.000 символов) (ISO 10646). Также, для примера, можно упомянуть один из довольно широко распространенных наборов символов : (Czyborra ).


    Каждый charset имеет определенное .

    Теперь насчет кодирования. Каким образом выбирается CES ?

    Выполнить "кодирование" (encoding) довольно легко как для латинских так и для всех (?) индоевропейских языков (фонетическое письмо). Действительно, закодировать 26 латинских (ASCII) или 33 буквы не составляет труда (даже в варианте заглавных и прописных, плюс цифры, плюс знаки препинания). Количество символов (character repertoire) мало, соответственно не велико и code space и получается меньше 256 сode points, что позволяет уместить их в один байт (2^8=256

различных кодовых позиций).

   Для языков, чья письменность построена по идеографическому (иероглифическому) принципу, ситуация несколько сложнее. Например в современном 1850

"официальных" иероглифов, тогда как в китайском их число доходит до 5000. Одного байта мало. Необходимы обширные CCS, например EUC-JP или UNICODE. Для поддержки таких языков в POSIX введены механизмы Multibyte и Wide Class chars.

    В настоящее время в подавляющем большинстве charset-ов применяется 8-ми битное (байтовое) кодирование. Все настолько к этому привыкли, что charset-ы c большим количеством символов (>256) иногда называют large charset.

    Проблемы могут возникнуть лишь при необходимости создания многоязычных

текстов, например русско-японско-английских, или содержащих русский и иврит, e.t.c. В этом случае - практически единственное решение : .

    Также проблемы возникают в том случае, если заранее неизвестна

кодировка текста (потеряна CES), так как в UNIX, да и в других OS не имеет никаких дополнительных атрибутов. Это также актуально для HTTP, в том случае, если кодировка (CES) файла .HTML неизвестна. Это довольно неудобно, поскольку часто единственный способ - это подбор подходящей кодировки... Вывод : указывать кодировку необходимо.


Три части SGML-документа


SGML документ состоит из заголовка и собственно текста. Заголовок делится еще на две дополнительные части - общие SGML-определения и описание типа документа. Различное программное обеспечение по-разному связывает заголовок с основным текстом. В некоторых случаях он может быть жестко "вшит" в программу, как это сделано, например, в HTML-браузерах. В общем же случае заголовок находится в дополнительном файле, на который указывает явная ссылка в тексте SGML-документа. В SGML предусмотрен механизм определения наиболее общих характеристик языка разметки: диалект SGML, используемый для описания языка разметки; набор разделительных символов; ограничение длины идентификаторов и многое другое. Обычно наиболее общие SGML-определения выполнены в форме таблиц, компилируемых SGML-процессором, и не видны пользователю. Тип документа, определенный описанием DTD, позволяет проверять правильность составления основного текста. Как и общие SGML-определения, указание DTD может быть выполнено в виде компилируемых SGML-процессором таблиц или связанного с SGML-документом файла. Во втором случае от пользователя требуется только указать, в каком собственно файле находится описание типа документа. Причем определения, описанные во внешнем файле, можно дополнить новыми командами. В самом простом случае DTD находится в начале основного текста документа. Основной текст состоит из собственно текста, разметки и общих ссылок на ранее определенные сущности. В основном тексте не может быть никаких новых определений. Его можно комбинировать из уже существующих документов, если определить в заголовке текста ссылку на них.



Три носителя


Электронный документ имеет три ипостаси - документ, подготовленный к печати, набранный в текстовом редакторе и распространяемый по сети. Хотя многие текстовые редакторы и имеют широкие возможности по форматированию и разметке документа, но до специализированных программ верстки им еще далеко. Языку же описания документов, который используется для публикаций в Web, присущи более ограниченные функции по форматированию документов.

Сейчас для каждого из перечисленных носителей существует самый распространенный формат. Для печатных документов это PostScript - интерпретируемый алгоритмический язык прорисовки страницы. Этот язык разработан компанией Adobe, он имеет реализации практически на всех платформах и современных принтерах. Он наиболее точно описывает печатную страницу, однако PostScript-файлы имеют очень большой объем. Особенно это относится к русскоязычным текстам, поскольку они, как правило, содержат описание русских шрифтов.

Самый распространенный текстовых редактор - это, безусловно, Word. Его формат документов настолько распространен в России, что его часто используют для обмена документами между организациями. Однако Word имеет меньше возможностей для отображения документов, чем PostScript, и его трудно прочитать другим текстовым редактором. Эти факторы ограничивают применение Word в гетерогенной сети.

Для публикаций в Web используется гипертекстовый язык разметки HTML, который описывает не только внешний вид документов, но и связи между ними и программным обеспечением. Вместе с HTML появился и гипертекстовый транспортный протокол - HTTP, позволяющий передавать HTML-документы по Сети, запускать на сервере программы и поддерживать диалог с пользователем. Благодаря гипертекстовой технологии стало возможным создавать действительно распределенные системы с универсальным пользовательским интерфейсом. Кроме того, по размеру HTML-документ получался не очень большим, что важно для Сети. Однако с развитием Web обнаружились серьезные ограничения HTML в области представления документов и диалогов с пользователем.


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

переносимость на различные платформы; преобразование в три самых популярных формата документов - PostScript, Word и HTML; минимальная цена ПО.

Всем этим требованиям удовлетворяет обобщенный язык разметки SGML (Standard Generalized Markup Language). Документы, подготовленные в этом формате, можно преобразовать во все перечисленные форматы, для него есть программное обеспечение на самых распространенных платформах, и даже бесплатное. SGML позволяет определить новые форматы документов, работать со сложными документами и даже управлять хранилищами информации. Этот язык представляет собой международный стандарт ISO 8879, что гарантирует переносимость документов с одной платформы на другую. Таким образом, SGML - первейший кандидат для корпоративного использования.


Три особенности SGML


Язык SGML относится к структурным языкам разметки и имеет очень богатые возможности по определению структурных элементов текста. Для него характерны следующие три особенности:

структурная, а не визуальная разметка; возможность определения типа документа; независимость представления документа от текстового редактора, в котором он подготовлен.

Структурная разметка, используемая в SGML, представляет собой просто название структурного элемента. Символы разметки, типа <para>, означают, что данная часть документа является параграфом. Визуальная разметка должна была бы определить внешний вид абзаца - отступы и поля, рамку и закраску, тип шрифта и еще многое другое. В SGML же инструкции по обработке документа и его представлении вынесены за пределы текста в отдельные процедуры или программы. Собственно, внешний вид SGML-документа определяет SGML-браузер. Структурная разметка позволяет один документ обрабатывать разными программами, каждая из которых может использовать свои способы работы с текстом. Например, программа анализа контекста может игнорировать сноски, а программа форматирования этого же текста - собирать их вместе для печати в конце каждой страницы. В SGML определено понятие "тип документа", и есть правила, по которым он описывается (document type definition, DTD). Все SGML-документы имеют определенный тип, который формально определяется его частями и структурой. Например, можно указать, что статья должна состоять из заглавия, имени автора, краткого содержания и собственно текста (последовательности абзацев). Согласно этому формальному определению, текст без заглавия уже нельзя считать статьей, хотя человек бы мог рассудить и по-другому. Если документ имеет определенный тип, то его можно разобрать синтаксическим анализатором (parser) и обработать, либо преобразовать с помощью специального программного обеспечения. Причем если разные типы документов имеют схожую структуру, то они могут быть обработаны одинаковыми программами. В общем, поскольку язык SGML определяет не только внешний вид документа, но и его логическую структуру, он позволяет разрабатывать более мощные приложения на своей основе. Собственно, основная цель разработки SGML как раз и состояла в том, чтобы гарантировать переносимость документов на любые платформы без потери разметки и информации. Две описанные выше особенности SGML обеспечивают совместимость на абстрактном уровне. Третья же, механизм подстановки, решает проблемы переносимости текстов на уровне последовательности символов. SGML предоставляет пользователям механизм замены одной строки символов на другую, что позволяет определять для разных платформ одинаковые спецсимволы. Поэтому

даже если в документе использованы символы, которых нет на другой платформе, их всегда можно преобразовать в тот вид, который окажется правильно воспринят на другой платформе. Строки символов, определенные с помощью механизма подстановок, называются сущностями (entity).



Три типа SGML-программ


SGML-технология предполагает наличие трех основных компонентов: редакторов, браузеров и форматеров-конвертеров. Основная цель редакторов - помочь пользователю составить корректный документ в соответствии с указанным типом документа. SGML-редакторы обычно разбирают спецификацию DTD и дают пользователю возможность вставлять в текст только соответствующие теги, ограждая его таким образом от ошибок. Как правило, SGML-редактор может выполнять и роль SGML-браузера, основная цель которого - предоставить пользователю возможность перемещаться по иерархии SGML-документов и просматривать каждый конкретный документ. Кроме того, есть немало конвертеров из одного типа документов в другой. Они строятся на основе специальных синтаксических анализаторов и SGML-ядра, которые предоставляют базовые функции по разбору SGML-документа. Именно возможность простой разработки конвертеров и делает язык SGML наиболее популярным средством для подготовки документов. Если, к примеру, использовать DTD TEI Lite, можно легко преобразовать этот тип документа в формат LaTeX (а затем и в PostScript), RTF (а затем и в Word) и HTML. Таким образом, используя одинаковые средства подготовки документов и управления ими, можно преобразовать их в три наиболее популярных формата. А ведь именно это и требуется для корпоративного формата документов. В пользу SGML говорит еще одно их преимущество - хорошо определенный тип документа навязывает автору логическую структуру текста, что позволяет строго регламентировать обязательные части документа. В тех областях деятельности, где подготовка текста уже превратилась во вполне рутинную работу, это качество SGML наиболее ценно, так как автор оказывается застрахован от возможных ошибок.



Tщпзь, зшНГь ь зчэпщтК


мБп сшпрп ЮпААзпвКрпуБ ч щпячЮпЕ вщпзчр, ьАъчшЛвЦуэКЕ р Emacs тшО ррчтп зчэпщт ь рщЦБЮь Дпышчр, п Бпзжу чяЙОАщОуБ зчщФуъФьь зшНГуы ь зчэпщт, зчБчЮКу щучяЕчтьэК тшО ъчщьэпщьО Бчсч, зпз Emacs рчАъЮьщьэпуБ ррчт А зшпрьпБЦЮК ь эКХь.



Tutorial


  

Учебник по rusconv v.3.11.

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

 Долгое время наиболее популярной была альтернативная кодировка, которая использовалась в операционной системе MS-DOS, другое ее название - кодовая страница 866. С наступлением эпохи Windows первенство захватила windows-кодировка, или кодовая страница 1251 (CP-1251). Все еще сохраняет свои позиции кодировка КОИ-8 (koi8-r), которая была очень полезна на раннем этапе становления Русского Интернета. Изредка попадаются тексты, набранные на компьютерах Macintosh. Предлагались и другие кодировки, но они не получили распространения. Текст, написанный в одной кодировке, невозможно читать в другой. Для борьбы с этим иногда русские буквы заменяют латинскими - latinica (латиница, или транслитерация, или волапюк). Кроме разных кодировок, операционные системы используют разные способы кодирования конца строк. В DOS и Windows для этого применяется два символа, в UNIX - один символ. Из-за этого текст, созданный в UNIX, в DOS/Windows выглядит как одна большая строка. Со всеми трудностями, связанными с несовместимостью кодировок операционных систем, помогает справиться rusconv.

Содержание:

Вывод текста помощи.

Перевод файла из одной кодировки в другую.

Изменение типов концов строк.

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

Перезаписывание файлов.

Перевод сразу в несколько кодировок и задание своих расширений для файлов.

Перевод сразу нескольких файлов.

Задание выходной директории.

Использование длинных имен файлов и сетевых файлов.

Остальные флаги.

Как определить кодировку файла.

Использование rusconv в командных файлах.

Вывод текста помощи.

 Rusconv - программа с большим количеством флагов. Если Вы забудете какой-нибудь из них, то всегда можете получить от rusconv текст помощи. Для этого надо либо просто запустить rusconv без каких-либо аргументов, либо дать флаг '-h'.


 Примеры:

DOS: C:\UTIL>RUSCONV C:\UTIL>rusconv /h UNIX: $rusconv -h $rusconv

  В операционной системе windows использовать rusconv сложнее. Желательно работать в какой-нибудь оболочке типа Norton Commander (рекомендую Windows Commander). Тогда использование rusconv в windows ничем не отличается от его использования в DOS. В любом случае, rusconv можно запустить из меню "Пуск". В этом меню надо выбрать "Выполнить...", написать полный путь к программе (проще воспользоваться кнопкой "Обзор..."), добавить необходимые ключи и имена файлов и нажать кнопку "OK".

 UNIX-версия rusconv, как и большинство утилит этой операционной системы, неразговорчива. В ней выдается только список флагов. Для получения дополнительных сведений можно дать команду

$man rusconv

 Еще лучше воспользоваться HTML-документацией.





Перевод файла из одной кодировки в другую.


 Предположим, что Вы работаете в windows, достали старую программу для DOS и пытаетесь вспомнить, как она работает. Но "Блокнот"(Notepad) вместо описания выводит непечатные символы. Чтобы прочитать текст, его из альтернативной кодировки, используемой в DOS, надо перевести в кодировку windows. Делается это так:

C:\GAMES\WARCRAFT>rusconv -alt +win read.me

** rusconv -- convertor of Russian codepages, v.3.11. ** (c)w_re -- Oleg A. Paraschenko http://beta.math.spbu.ru/~prof/w_re/ .\read.me -> .\read.win: ok. 1 file(s) converted.

 В результате в текущей директории (обычно это та, откуда запущен rusconv, в данном примере - c:\games\warcraft) создается файл с тем же именем, что и у исходного файла, но с другим расширением, которое показывает, какая кодировка в файле.

 Вот список, какое расширение какой кодировке соответствует:

.alt - альтернативная кодировка, используется в DOS .koi - кодировка КОИ-8, используется в UNIX .lat - латиница, русский текст латинскими буквами .mac - кодировка Macintosh .win - кодировка Windows



  Чтобы указать, из какой кодировки переводить, надо дать один из флагов

-alt, -koi, -mac или -win.

 Rusconv не переводит из латиницы. Чтобы указать, в какую кодировку переводить, надо дать один из флагов

+alt, +koi, +lat, +mac или +win.

 UNIX-версия, как и большинство утилит этой системы, неразговорчивая, и по умолчанию выводит только сообщения об ошибках. Чтобы ее "разговорить", надо использовать флаг '-v'.

 В следующем примере создается файл 'test.file', содержащий строку "Проверка флага '-v'.". Файл будет в кодировке КОИ-8, используемой в UNIX. Вначале мы переводим его в кодировку windows, при этом флаг '-v' не используем. Будет создан файл 'test.win', но rusconv на экран ничего не выдаст. Затем мы переводим файл в латиницу, используя этот флаг, и проверяем результаты конвертирования.

$echo Проверка флага '-v'. >test.file

$rusconv -koi +win test.file

$rusconv -v -koi +lat test.file

** rusconv -- convertor of Russian codepages, v.3.11. ** (c)w_re -- Oleg A. Paraschenko http://beta.math.spbu.ru/~prof/w_re/ ./test.file -> ./test.lat: ok. 1 file(s) converted. $cat test.lat

Proverka flaga '-v'.



Изменение типов концов строк.


 Даже то, что текст написан только латинскими буквами, не может гарантировать, что его можно нормально читать во всех операционных системах. В DOS и windows концы строк кодируются двумя символами, в UNIX - одним.

 Допустим, Вы работаете в DOS или windows и скачали из Интернета текст, созданный в UNIX. Тогда для Вас этот текст будет выглядеть как одна большая строка с забавными символами в тех местах, где она должна быть разбита на части. Чтобы привести текст к читаемому виду, надо дать команду

C:\NEW>rusconv -cr2crlf readme.txt

** rusconv -- convertor of Russian codepages, v.3.11. ** (c)w_re -- Oleg A. Paraschenko http://beta.math.spbu.ru/~prof/w_re/ .\readme.txt -> .\readme.crlf: ok. 1 file(s) converted.

 Результат преобразования будет содержаться в файле с таким же именем и расширением .crlf (UNIX и windows) или .crl (DOS). В данном примере - в файле 'readme.crlf'.



  В UNIX при использовании неправильного формата файлов тоже возникает подобная проблема. На концах строк текстовые редакторы выводят лишний символ, некоторые программы из-за этого символа не компилируются. Чтобы исправить положение, используйте флаг '-crlf2cr':

$rusconv -crlf2cr -v files.bbs

** rusconv -- convertor of Russian codepages, v.3.11. ** (c)w_re -- Oleg A. Paraschenko http://beta.math.spbu.ru/~prof/w_re/ ./files.bbs -> ./files.cr: ok. 1 file(s) converted.





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


 Каждая операционная система создает русскоязычные тексты по-разному.

DOS:

Кодировка - альтернативная (cp866). Конец строки - два символа.

Windows:

Кодировка - windows (cp1251). Конец строки - два символа.

UNIX:

Кодировка - КОИ-8. Конец строки - один символ.

 Для правильного преобразования файлов приходится учитывать как кодировку в нем, так и тип строк. Из-за этого надо писать несколько флагов:

Из DOS в UNIX : -alt +koi -crlf2cr

Из UNIX в DOS : -koi +alt -cr2crlf

Из windows в UNIX : -win +koi -crlf2cr

Из UNIX в windows : -koi +win -cr2crlf

Из DOS в windows : -alt +win

Из windows в DOS : -win +alt

 Вероятно, наиболее часто приходится переносить тексты из UNIX в DOS и обратно, а в последнее время - из UNIX в windows и обратно. Преобразовывать файлы из DOS-формата в windows-формат и наоборот обычно не требуется - для windows-текстов можно использовать Notepad, а для просмотра DOS-текстов достаточно запустить программу типа Norton Commander.

 Чтобы не набирать постоянно стандартные наборы флагов, rusconv предлагает использовать сокращения для них:

-dos2unix - то же самое, что '-alt +koi -crlf2cr' -unix2dos - то же самое, что '-koi +alt -cr2crlf' -win2unix - то же самое, что '-win +koi -crlf2cr' -unix2win - то же самое, что '-koi +win -cr2crlf'

 Эти сокращения легки в использовании, но и они могут показаться слишком длинными. Поэтому есть еще более короткие сокращения:

-d2u - то же самое, что '-dos2unix' -u2d - то же самое, что '-unix2dos' -w2u - то же самое, что '-win2unix' -u2w - то же самое, что '-unix2win'



rusconv -w2u index.html

** rusconv -- convertor of Russian codepages, v.3.11. ** (c)w_re -- Oleg A. Paraschenko http://beta.math.spbu.ru/~prof/w_re/ .\index.html -> .\index.koi: ok. 1 file(s) converted.



Перезаписывание файлов.


  При конвертировании rusconv создает новый файл. Но иногда его не требуется, или нужно заменить кодировку в заданном файле. В этом случае можно использовать флаг '-o'. Тогда rusconv вначале создает временный файл, в котором сохраняется результат перевода, а затем перемещает этот временный файл на место исходного. Если в процессе работы случится ошибка, то исходный файл остается нетронутым, а временный файл остается на диске и содержит текст, который был переведен до возникновения ошибки.

 Пример:

D:\HTML>rusconv -o -w2u index.html

** rusconv -- convertor of Russian codepages, v.3.11. ** (c)w_re -- Oleg A. Paraschenko http://beta.math.spbu.ru/~prof/w_re/ .\index.html -> D:\HTML\rcA290.TMP -> .\index.html: ok. 1 file(s) converted.





Перевод сразу в несколько кодировок и задание своих расширений для файлов.


 Иногда, особенно при создании HTML-страниц, файл надо перевести в несколько кодировок. Например, Вы создаете текст в операционной системе DOS, а текст на домашней страничке должен быть в кодировках windows и КОИ. Можно запустить rusconv два раза, но лучше все сделать сразу:

C:\HTML>rusconv -alt +koi +win index-pre.html ** rusconv -- convertor of Russian codepages, v.3.11. ** (c)w_re -- Oleg A. Paraschenko http://beta.math.spbu.ru/~prof/w_re/ .\index-pre.html -> .\index-pre.koi, .\index-pre.win: ok. 1 file(s) converted.

 Результат находится в файлах с тем же именем и с расширениями по умолчанию:

.alt - для альтернативной кодировки .koi - для кодировки КОИ-8 .lat - для латиницы .mac - для кодировки Macintosh .win - для кодировки Windows

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

-aext расширение - для альтернативной кодировки -kext расширение - для кодировки КОИ-8 -lext расширение - для латиницы -mext расширение - для кодировки Macintosh -wext расширение - для кодировки Windows



 Допустим, Вы набрали русский алфавит в кодировке windows и хотите узнать, как он выглядит во всех остальных кодировках. При этом желательно, чтобы результат находился в текстовых файлах. Это возможно так:

E:\EX>dir

Содержимое папки E:\EX . <ПАПКА> 24.10.98 15:27 . .. <ПАПКА> 24.10.98 15:27 .. ALPHABET TXT 66 02.10.98 13:15 alphabet.txt

E:\EX>rusconv -win +alt -aext alt.txt +koi -kext koi.txt +lat -lext lat.txt +mac -mext mac.txt +win -wext win.txt alphabet.txt

** rusconv -- convertor of Russian codepages, v.3.11. ** (c)w_re -- Oleg A. Paraschenko http://beta.math.spbu.ru/~prof/w_re/ .\alphabet.txt -> .\alphabet.alt.txt, .\alphabet.koi.txt, .\alphabet.mac.txt, .\alphabet.lat.txt, .\alphabet.win.txt: ok. 1 file(s) converted.

E:\EX>dir

Содержимое папки E:\EX . <ПАПКА> 24.10.98 15:27 . .. <ПАПКА> 24.10.98 15:27 .. ALPHAB~1 TXT 66 24.10.98 16:24 alphabet.alt.txt ALPHAB~2 TXT 66 24.10.98 16:24 alphabet.koi.txt ALPHAB~3 TXT 66 24.10.98 16:24 alphabet.mac.txt ALPHAB~4 TXT 82 24.10.98 16:24 alphabet.lat.txt ALPHAB~5 TXT 66 24.10.98 16:24 alphabet.win.txt ALPHABET TXT 66 02.10.98 13:15 alphabet.txt

 Если Вы хотите поменять расширение у файлов с результатами, то для этого надо давать одну из команд 'aext', 'kext', 'lext', 'mext' или 'wext'. Но при переводе только в одну кодировку лучше воспользоваться командой

-ext расширение

 В зависимости от того, в какую кодировку Вы переводите, эта команда воспринимается как одна из команд '-aext расширение', '-kext расширение', '-lext расширение', '-mext расширение' или '-wext расширение'.

 С помощью команды '-ext' можно также переопределить стандартные расширения '.cr' и '.crlf', используемые при изменении типов концов строк в файлах:

E:\EX>rusconv -cr2crlf unixtext

** rusconv -- convertor of Russian codepages, v.3.11. ** (c)w_re -- Oleg A. Paraschenko http://beta.math.spbu.ru/~prof/w_re/ .\unixtext -> .\unixtext.crlf: ok. 1 file(s) converted.

E:\EX>rusconv -cr2crlf -ext txt unixtext



** rusconv -- convertor of Russian codepages, v.3.11. ** (c)w_re -- Oleg A. Paraschenko http://beta.math.spbu.ru/~prof/w_re/ .\unixtext -> .\unixtext.txt: ok. 1 file(s) converted.





Перевод сразу нескольких файлов.


  Когда надо перевести несколько файлов из одной кодировки в другую, неудобно переводить по одному файлу. Лучше перевести сразу всю группу. Для этого достаточно написать их имена после флагов. Можно использовать метасимволы - rusconv сам найдет файлы, подходящие под шаблон. В UNIX-версии используйте метасимволы с осторожностью, причины этого можно найти в абзаце "Задание выходной директории".

C:\HTML>rusconv -alt +koi +win -kext koi.html -wext win.html *.txt

** rusconv -- convertor of Russian codepages, v.3.11. ** (c)w_re -- Oleg A. Paraschenko http://beta.math.spbu.ru/~prof/w_re/ .\rusconv.txt -> .\rusconv.koi.html, .\rusconv.win.html: ok. .\readme.txt -> .\readme.koi.html, .\readme.win.html: ok. .\index.txt -> .\index.koi.html, .\index.win.html: ok. 3 file(s) converted.





Задание выходной директории.


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

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

Содержимое текущей директории: $ls -l

-rwxr-xr-x 1 w_re w_re 21394 Oct 25 02:27 file1.html -rwxr-xr-x 1 w_re w_re 21394 Oct 25 02:27 file2.html drwxr-xr-x 2 w_re w_re 1024 Oct 25 02:27 res

Скорее всего, ошибка: $rusconv -v -w2u *

// После раскрытия метасимволов оболочкой: // rusconv -v -w2u file1.html file2.html res ** rusconv -- convertor of Russian codepages, v.3.11. ** (c)w_re -- Oleg A. Paraschenko http://beta.math.spbu.ru/~prof/w_re/ ./file1.html -> res/file1.koi: ok. ./file2.html -> res/file2.koi: ok. 2 file(s) converted.



Чтобы файлы создавались в текущей директории: $rusconv -v -w2u * .

// После раскрытия метасимволов оболочкой: // rusconv -v -w2u file1.html file2.html res . ** rusconv -- convertor of Russian codepages, v.3.11. ** (c)w_re -- Oleg A. Paraschenko http://beta.math.spbu.ru/~prof/w_re/ warning: 'res' is a directory, skipping. ./file1.html -> ./file1.koi: ok. ./file2.html -> ./file2.koi: ok. 2 file(s) converted.





Использование длинных имен файлов и сетевых файлов.


 Версия 3. 0 была для двух операционных систем - для DOS и UNIX. Чтобы использовать длинные имена файлов, в версии 3.11 есть rusconv для windows. Из-за обращения к новым функциям для работы с файлами, его невозможно запустить на машинах, не работающих в среде windows 95/98. Зато доступны длинные имена и сетевые файлы.

 Если надо перевести файл, в имени которого есть пробел, надо использовать кавычки:

C:\HTML>rusconv -win +alt "long file name.txt"

** rusconv -- convertor of Russian codepages, v.3.11. ** (c)w_re -- Oleg A. Paraschenko http://beta.math.spbu.ru/~prof/w_re/ .\long file name.txt -> .\long file name.alt: ok. 1 file(s) converted.

 Большинство оболочек для windows, похожих на Norton Commander, при нажатии клавиш Ctrl+Enter добавляют в командную строку имя файла. Имена файлов, содержащие пробелы, автоматически окружаются кавычками. Если это не так, то надо заменить оболочку. Мы рекомендуем Windows Commander.

 При работе в локальной windows-сети можно (если есть права) переводить файлы на другом компьютере без предварительного подключения сетевого диска. Для этого нужно использовать универсальные имена файлов (\\сервер\ресурс\файл):

rusconv -w2u -ext html \\comp\c\html\*.html "\\comp\c\html\koi version"

** rusconv -- convertor of Russian codepages, v.3.11. ** (c)w_re -- Oleg A. Paraschenko http://beta.math.spbu.ru/~prof/w_re/ \\comp\c\html\tutorial.html -> \\comp\c\html\koi version\tutorial.html: ok. \\comp\c\html\index.html -> \\comp\c\html\koi version\index.html: ok. \\comp\c\html\errors.html -> \\comp\c\html\koi version\errors.html: ok. 3 file(s) converted.







Остальные флаги.


 Осталось рассмотреть флаги '--', '-s', '-v', '-close' и '-noclose'. Обычно они используются при работе в командных файлах.

-- конец флагов

 Rusconv просматривает аргументы слева направо. Первый аргумент, не являющийся флагом, начинает список файлов для перевода. За флаг rusconv считает аргумент, начинающийся с символа '-' или '+' (или '/' в DOS и windows-версиях). Иногда требуется насильно прервать в некотором месте интерпретацию флагов. В этом случае используется сочетание символов '--'. Все, что стоит после него - имена файлов для перевода.

 Допустим, файл с именем '-file.txt' надо перевести из windows-кодировки в КОИ-8:

Неправильно: E:\EX>rusconv -win +koi -file.txt

** rusconv -- convertor of Russian codepages, v.3.11. ** (c)w_re -- Oleg A. Paraschenko http://beta.math.spbu.ru/~prof/w_re/ error: unrecognized flag '-file.txt'. try 'rusconv -h' or read the manual for help.

Правильно: rusconv -win +koi -- -file.txt

** rusconv -- convertor of Russian codepages, v.3.11. ** (c)w_re -- Oleg A. Paraschenko http://beta.math.spbu.ru/~prof/w_re/ .\-file.txt -> .\-file.koi: ok. 1 file(s) converted.

-s работа без вывода сообщений на экран -v вывод всех сообщений на экран

 Флаг '-s' подавляет любой вывод на экран. Флаг '-v', наоборот, делает rusconv разговорчивым. Если задать одновременно и '-s', и '-v', то будет выведено сообщение об ошибке. DOS и windows-версии по умолчанию разговорчивые. UNIX-версия по умолчанию выводит только сообщения об ошибках.

-close позволять windows закрывать окно с результатами работы rusconv -noclose оставлять окно на экране

 Эти флаги имеют смысл только в windows-версии, в остальных версиях они игнорируются. При запуске программы операционная система windows создает для rusconv отдельное окно. Если задан флаг '-close', то это окно закрывается сразу после завершения перевода файлов. По умолчанию, или если задан флаг '-noclose', окно с результатами работы остается на экране. Чтобы его закрыть, можно нажать любую клавишу. Если одновременно написать и '-close', и '-noclose', окно останется на экране и будет содержать сообщение об ошибке.







Как определить кодировку файла.


 Для определения кодировки в файле можно использовать программу whatrus, которая распространяется вместе с rusconv:

C:\UTIL>whatrus \\comp\c\html\index.html

WIN detected.

 За один раз можно распознать кодировку только в одном файле. Если требуется только код возврата, а сообщение не надо, используйте флаг '-s'.

 При запуске программы в среде windows 95/98, операционная система создает для whatrus отдельное окно для вывода результата. Чтобы закрыть его, нажмите любую клавишу. Если требуется, чтобы оно закрывалось автоматически, используйте флаг '-s'.





Использование rusconv в командных файлах.


 Если Вы собираетесь использовать rusconv в командных файлах, воспользуйтесь этими советами.

Ставьте сочетание символов '--' после флагов.

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

  Это особенно важно при работе в UNIX. В этой операционной системе метасимволы раскрывает оболочка, и программе дается уже готовый список файлов. При этом никто не гарантирует, что последним элементом в списке не будет директория. При работе с windows-версией указывайте флаг '-close'.

  Чтобы windows не закрывало автоматически окно с сообщениями, rusconv после завершения перевода всех файлов ждет нажатия любой клавиши. Для командных файлов, скорее всего, такое поведение не требуется. Поэтому используйте флаг '-close', чтобы rusconv завершился сразу после перевода файлов. При работе с windows-версией whatrus указывайте флаг '-s'.

  В windows-версии программы whatrus флаг '-s' служит для того же, что и флаг '-close' в программе rusconv. Используйте коды возврата программ rusconv и whatrus.

 Использование кодов возврата программ rusconv и whatrus делает Ваш сценарий более интеллектуальным. Коды возврата:

rusconv: Количество переведенных файлов.



whatrus: 255 -

произошла ошибка   0 -

кодировка не распознана.  11 -

альтернативная кодировка  12 -

кодировка КОИ-8  13 -

кодировка windows  14 -

кодировка Macintosh

  В качестве примера приводится командный сценарий. На его вход дается некоторый файл, который преобразуется в файл index.html в кодировке windows.

windows-версия, makeindex.bat:

@ECHO OFF

REM Копируем исходный файл в файл с именем 'index'. ECHO COPY %1 index copy %1 index IF EXIST index GOTO TAKEENC ECHO copy failed EXIT

REM Узнаем кодировку, в которой создан файл. :TAKEENC ECHO WHATRUS -s %1 whatrus -s %1

REM Определение кода возврата начинаем с больших чисел, так как REM 'IF ERRORLEVEL = N' на самом деле воспринимается как REM 'IF ERRORLEVEL >= N'. IF ERRORLEVEL = 255 GOTO WRERR IF ERRORLEVEL = 14 GOTO MACENC IF ERRORLEVEL = 13 GOTO WINENC IF ERRORLEVEL = 12 GOTO KOIENC IF ERRORLEVEL = 11 GOTO ALTENC ECHO encoding not recognized EXIT

REM Сообщение об ошибке при исполнении whatrus. :WRERR ECHO whatrus failed EXIT

REM Конвертируем файл index в index.html. :ALTENC ECHO RUSCONV -close -alt +win -ext html index rusconv -close -alt +win -ext html index EXIT :KOIENC ECHO RUSCONV -close -alt +win -ext html index rusconv -close -koi +win -ext html index EXIT :MACENC ECHO RUSCONV -close -alt +win -ext html index rusconv -close -mac +win -ext html index EXIT :WINENC ECHO RUSCONV -win -alt +win -ext html index rusconv -close -alt +win -ext html index EXIT

UNIX-версия для bash, makeindex.sh:

# Копируем исходный файл в файл с именем 'index'. rm -f index cp $1 index if [ ! -f index ] then echo copy failed exit fi

# Узнаем кодировку в файле и конвертируем его в файл index.html whatrus $1 case $? in 255) echo error executing whatrus;; 0) can''t detect encoding;; 11) rusconv -alt +win -ext html index;; 12) rusconv -koi +win -ext html index;; 13) rusconv -win +win -ext html index;; 14) rusconv -mac +win -ext html index;; esac



Приятной работы!

tutorial.html

Документ создан Паращенко Олегом

Последние изменения - 15 ноября 1998 года


Tutorial-e


  

rusconv v.3.11 tutorial.

 Due historical reasons our country does not have standard encoding. So sometimes it is impossible to read content of files. In this cases you should use special programs which convert encodings. We are hope you choose rusconv.

 In past most popular encoding was alternative (or codepage 866) which was used in MS-DOS. Now leader is windows encoding (codepage 1251). But encoding KOI-8 is still important. It was very usefull in first stages of growing of Russian Internet. Very rarely you can find text written in Macintosh. There were a lot of other encodings but they are died. It is impossibe to use one encoding to read text written in another one.To avoid this some people write texts in latinica (transliteracija, volapjuk) - russian text spelled latin letters. More, different operating systems use different methods to code end of line. DOS and Windows code it by two chars, UNIX - by one. So text written in UNIX will be as one long line in DOS/windows.

 All this troubles can be solved by rusconv.

Content:

Printing help.

Converting file from one encoding to another.

Changing type of lines.

Abbreviations of flags for most often tasks.

File overwriting.

Converting to several encodings and specifing own extensions for files.

Converting of several files simultaniously.

Specifing output directory.

Using long file names and network files.

Other flags.

How to recognize file encoding.

Using rusconv in command scripts.

Printing help.

 Rusconv is the program with a lot of flags. If you forget some of them you can get help from rusconv. To do this simple run rusconv without any arguments or give flag '-h'.

 Examples:

DOS: C:\UTIL>RUSCONV C:\UTIL>rusconv /h UNIX: $rusconv -h $rusconv

 Using of rusconv in windows is more difficult than in other operating systems because rusconv is command-line oriented program. It is recommended to use any file manager like Norton Commander (we recommend Windows Commander). Then usage of rusconv in windows will be simpler. Anyway, you can run program from menu "Start". In this menu choose item "Run...", write full path to rusconv (better use button "Browse..."), add flags and files and press button "OK".


  As any other UNIX utility, UNIX version is not verbose. It prints only short list of flags. To get more help try

$man rusconv

 The best way is to use HTML documentation.





Converting file from one encoding to another.


 Suppose, you work in windows, found old DOS program and wish to remember how to run it. But "Notepad" instead of documentation prints unreadable text. To read it you first should convert it from DOS encoding to windows one:

C:\GAMES\WARCRAFT>rusconv -alt +win read.me

** rusconv -- convertor of Russian codepages, v.3.11. ** (c)w_re -- Oleg A. Paraschenko http://beta.math.spbu.ru/~prof/w_re/ .\read.me -> .\read.win: ok. 1 file(s) converted.

 After converting in current directory (usually it is directory from which you run rusconv, here - c:\games\warcraft) will be created file with the same name but with other extension. Extension shows what encoding is in a new file.

 Here a list of extensions for encodings:

.alt - alternative encoding, uses in DOS .koi - KOI-8 encoding, uses in UNIX .lat - latinica, russian text spelled latin letters .mac - Macintosh encoding .win - Windows encoding

 To specify from which encoding to convert use one of flags

-alt, -koi, -mac or -win.

 Rusconv can't convert from latinica. To specify target encoding use some of flags

+alt, +koi, +lat, +mac or +win.

 As any other UNIX utility, UNIX version of rusconv is not verbose. By default it prints only warnings and error messages. To print all messages use flag '-v'.

 In next example will be created file 'test.file' which contains text "оПНБЕПЙЮ ТКЮЦЮ '-v'." (testing '-v' flag.). This file will be in KOI-8 encoding. For begin we convert this file to windows encoding without flag '-v'. File 'test.win' will be created but you don't get any message from rusconv. Then we converts file to latinica using flag '-v'. To finish example, we check content of file 'test.lat'.

$echo оПНБЕПЙЮ ТКЮЦЮ '-v'. >test.file



$rusconv -koi +win test.file

$rusconv -v -koi +lat test.file

** rusconv -- convertor of Russian codepages, v.3.11. ** (c)w_re -- Oleg A. Paraschenko http://beta.math.spbu.ru/~prof/w_re/ ./test.file -> ./test.lat: ok. 1 file(s) converted. $cat test.lat

Proverka flaga '-v'.





Changing type of lines.


  Even if text written in latinica there is no guarantee that it will be possible to read it on any operating system. In DOS and Windows end of line is coded by two chars, in UNIX - by one.

 Suppose, you work in DOS or windows and downloaded from Internet text file created in UNIX. Notepad shows this text as one long line with funny chars where should be line breaks. To convert text to normal view use command

C:\NEW>rusconv -cr2crlf readme.txt

** rusconv -- convertor of Russian codepages, v.3.11. ** (c)w_re -- Oleg A. Paraschenko http://beta.math.spbu.ru/~prof/w_re/ .\readme.txt -> .\readme.crlf: ok. 1 file(s) converted.

 Result of converting will be in file with the same name and with extension .crlf (UNIX and windows) or .crl (DOS). In this example - in 'readme.crlf'.

 If you are in UNIX then incorrect format leads to another problem. At the end of lines text editors print additional char, some programs could not be compiled. To solve this problem use flag '-crlf2cr':

$rusconv -crlf2cr -v files.bbs

** rusconv -- convertor of Russian codepages, v.3.11. ** (c)w_re -- Oleg A. Paraschenko http://beta.math.spbu.ru/~prof/w_re/ ./files.bbs -> ./files.cr: ok. 1 file(s) converted.





Abbreviations of flags for most often tasks.


 Every operating system use own methos of creating russian files.

DOS:

Encoding - alternative (cp866). End of line - two chars.

Windows:

Encoding - windows (cp1251). End of line - two chars.

UNIX:

Encoding - KOI-8. End of line - one char.

 For correct converting you should consider encoding and type of line ends. Here is minimal set of flags to do it:

From DOS to UNIX : -alt +koi -crlf2cr



From UNIX to DOS : -koi +alt -cr2crlf

From windows to UNIX : -win +koi -crlf2cr

From UNIX to windows : -koi +win -cr2crlf

From DOS to windows : -alt +win

From windows to DOS : -win +alt

  Probably most often tasks is converting text from UNIX to DOS, from UNIX to windows and back. Converting between DOS and windows styles usually unnecessary - for windows texts you can use Notepad, for DOS texts use can you old DOS file managers like Norton Commander.

 It is not good idea to type every time this sets of flags. So you can use abbreviations:

-dos2unix - the same as '-alt +koi -crlf2cr' -unix2dos - the same as '-koi +alt -cr2crlf' -win2unix - the same as '-win +koi -crlf2cr' -unix2win - the same as '-koi +win -cr2crlf'

 This abbreviations are usefull but and they are long enough. So you can cut them:

-d2u - the same as '-dos2unix' -u2d - the same as '-unix2dos' -w2u - the same as '-win2unix' -u2w - the same as '-unix2win'

rusconv -w2u index.html

** rusconv -- convertor of Russian codepages, v.3.11. ** (c)w_re -- Oleg A. Paraschenko http://beta.math.spbu.ru/~prof/w_re/ .\index.html -> .\index.koi: ok. 1 file(s) converted.



File overwriting.


 When converting, rusconv creates new files. But sometimes you don't need them or you wish only replace encoding in specified file. In this case use flag '-o'. Then rusconv for begin creates temporary file where results of recoding will be placed and then moves this temporary file on place of source. If any error occurs then source file will be unchanged and temporary file will be contain text converted before error.

 Example:

D:\HTML>rusconv -o -w2u index.html

** rusconv -- convertor of Russian codepages, v.3.11. ** (c)w_re -- Oleg A. Paraschenko http://beta.math.spbu.ru/~prof/w_re/ .\index.html -> D:\HTML\rcA290.TMP -> .\index.html: ok. 1 file(s) converted.





Converting to several encodings and specifing own extensions for files.


 Sometimes, especially when you create web site, file should be converted to several encodings. For example, you write HTML pages in DOS but your homepage is in windows and KOI encodings. You can run rusconv twice but better do so:



C:\HTML>rusconv -alt +koi +win index-pre.html ** rusconv -- convertor of Russian codepages, v.3.11. ** (c)w_re -- Oleg A. Paraschenko http://beta.math.spbu.ru/~prof/w_re/ .\index-pre.html -> .\index-pre.koi, .\index-pre.win: ok. 1 file(s) converted.

  Results are placed in files with the same names and with default extensions:

.alt - for alternative encoding .koi - for KOI-8 encoding .lat - for latinica .mac - for Macintosh encoding .win - for Windows encoding

 Often default extensions are not convenient. Then you can define you own extension. To do this use commands:

-aext extension - for alternative encoding -kext extension - for KOI-8 encoding -lext extension - for latinica -mext extension - for Macintosh encoding -wext extension - for Windows encoding

 For example, you typed russian alphabet in windows encoding and wish to know how it looks in all other encodings. More, you wish that results should be in text files. No problems:

E:\EX>dir

folder E:\EX . <FOLDER> 24.10.98 15:27 . .. <FOLDER> 24.10.98 15:27 .. ALPHABET TXT 66 02.10.98 13:15 alphabet.txt

E:\EX>rusconv -win +alt -aext alt.txt +koi -kext koi.txt +lat -lext lat.txt +mac -mext mac.txt +win -wext win.txt alphabet.txt

** rusconv -- convertor of Russian codepages, v.3.11. ** (c)w_re -- Oleg A. Paraschenko http://beta.math.spbu.ru/~prof/w_re/ .\alphabet.txt -> .\alphabet.alt.txt, .\alphabet.koi.txt, .\alphabet.mac.txt, .\alphabet.lat.txt, .\alphabet.win.txt: ok. 1 file(s) converted.

E:\EX>dir

folder E:\EX . <FOLDER> 24.10.98 15:27 . .. <FOLDER> 24.10.98 15:27 .. ALPHAB~1 TXT 66 24.10.98 16:24 alphabet.alt.txt ALPHAB~2 TXT 66 24.10.98 16:24 alphabet.koi.txt ALPHAB~3 TXT 66 24.10.98 16:24 alphabet.mac.txt ALPHAB~4 TXT 82 24.10.98 16:24 alphabet.lat.txt ALPHAB~5 TXT 66 24.10.98 16:24 alphabet.win.txt ALPHABET TXT 66 02.10.98 13:15 alphabet.txt

 If you wish change extension you can use one of commands 'aext', 'kext', 'lext', 'mext' or 'wext'. But if you converts to only one encoding then it is more better to use command



-ext extension

  Depending on target encoding this command is interpreted as one of commands '-aext extension', '-kext extension', '-lext extension', '-mext extension' or '-wext extension'.

 Using command '-ext' you can also redefine default extensions '.cr' and '.crlf' when you change only type of end of lines:

E:\EX>rusconv -cr2crlf unixtext

** rusconv -- convertor of Russian codepages, v.3.11. ** (c)w_re -- Oleg A. Paraschenko http://beta.math.spbu.ru/~prof/w_re/ .\unixtext -> .\unixtext.crlf: ok. 1 file(s) converted.

E:\EX>rusconv -cr2crlf -ext txt unixtext

** rusconv -- convertor of Russian codepages, v.3.11. ** (c)w_re -- Oleg A. Paraschenko http://beta.math.spbu.ru/~prof/w_re/ .\unixtext -> .\unixtext.txt: ok. 1 file(s) converted.





Converting of several files simultaniously.


 When you wish convert a group of files from one encoding to another it is convenient to convert all group simultaniously. To do this only write all file names after flags. You can use metachars - rusconv will find all appropriate files. In UNIX version use metachars with caution, see "Specifing output directory" for more information.

C:\HTML>rusconv -alt +koi +win -kext koi.html -wext win.html *.txt

** rusconv -- convertor of Russian codepages, v.3.11. ** (c)w_re -- Oleg A. Paraschenko http://beta.math.spbu.ru/~prof/w_re/ .\rusconv.txt -> .\rusconv.koi.html, .\rusconv.win.html: ok. .\readme.txt -> .\readme.koi.html, .\readme.win.html: ok. .\index.txt -> .\index.koi.html, .\index.win.html: ok. 3 file(s) converted.





Specifing output directory.


 By default files with results are created in current directory. Usually it is directory from which you run rusconv. But if last argument is directory name then files will be created in this directory.

 In UNIX use metachars with caution. Here interpretating of metachars is the work of operating system and program get ready list of arguments. There is no any guarantee that last argument is not a directory. So do not forget to specify output directory:



Content of current directory: $ls -l

-rwxr-xr-x 1 w_re w_re 21394 Oct 25 02:27 file1.html -rwxr-xr-x 1 w_re w_re 21394 Oct 25 02:27 file2.html drwxr-xr-x 2 w_re w_re 1024 Oct 25 02:27 res

May be error: $rusconv -v -w2u *

// After interpetating: // rusconv -v -w2u file1.html file2.html res ** rusconv -- convertor of Russian codepages, v.3.11. ** (c)w_re -- Oleg A. Paraschenko http://beta.math.spbu.ru/~prof/w_re/ ./file1.html -> res/file1.koi: ok. ./file2.html -> res/file2.koi: ok. 2 file(s) converted.

To create files in current directory: $rusconv -v -w2u * .

// After interpetating: // rusconv -v -w2u file1.html file2.html res . ** rusconv -- convertor of Russian codepages, v.3.11. ** (c)w_re -- Oleg A. Paraschenko http://beta.math.spbu.ru/~prof/w_re/ warning: 'res' is a directory, skipping. ./file1.html -> ./file1.koi: ok. ./file2.html -> ./file2.koi: ok. 2 file(s) converted.





Using long file names and network files.


 Version 3.0 of rusconv was released for DOS and UNIX. To use long file names version 3.11 has release for windows. Because of use of new operating system functions this version can't be run on computer without Windows 95/98. But now you can use long file names and network files.

 To convert file with space in its name use quotes:

C:\HTML>rusconv -win +alt "long file name.txt"

** rusconv -- convertor of Russian codepages, v.3.11. ** (c)w_re -- Oleg A. Paraschenko http://beta.math.spbu.ru/~prof/w_re/ .\long file name.txt -> .\long file name.alt: ok. 1 file(s) converted.

 Most of file managers for windows like Norton Commander if you press keys Ctrl+Enter add file name to command line. If file name contains spaces then they automatically surround it by qoutes. If it is not so then change your file manager. We recommend Windows Commander.

 Working in local windows network you can (if you have rights) convert files on other computers without drive mapping. To do it use universal file names (\\server\\resource\file):



rusconv -w2u -ext html \\comp\c\html\*.html "\\comp\c\html\koi version"

** rusconv -- convertor of Russian codepages, v.3.11. ** (c)w_re -- Oleg A. Paraschenko http://beta.math.spbu.ru/~prof/w_re/ \\comp\c\html\tutorial.html -> \\comp\c\html\koi version\tutorial.html: ok. \\comp\c\html\index.html -> \\comp\c\html\koi version\index.html: ok. \\comp\c\html\errors.html -> \\comp\c\html\koi version\errors.html: ok. 3 file(s) converted.





Other flags.


  Now it is time to say about flags '--', '-s', '-v', '-close' and '-noclose'. They are usually used in command scripts.

-- end of flags

 Rusconv scans command line from left to right. First argument which is not a flag starts a list of file. Rusconv consider that flag is argument which first char is '-' or '+' (or '/' in DOS and windows versions). Sometimes you need to break flag parsing. To do this use chars '--'. All after them is a file list.

 Suppose, file with name '-file.txt' should be converted from windows encoding to KOI-8 encoding:

Error: E:\EX>rusconv -win +koi -file.txt

** rusconv -- convertor of Russian codepages, v.3.11. ** (c)w_re -- Oleg A. Paraschenko http://beta.math.spbu.ru/~prof/w_re/ error: unrecognized flag '-file.txt'. try 'rusconv -h' or read the manual for help.

Success: rusconv -win +koi -- -file.txt

** rusconv -- convertor of Russian codepages, v.3.11. ** (c)w_re -- Oleg A. Paraschenko http://beta.math.spbu.ru/~prof/w_re/ .\-file.txt -> .\-file.koi: ok. 1 file(s) converted.

-s silent mode, no any message will be printed -v verbose mode, all messages will be printed

 Flag '-s' suppresses printing of messages. Contrary, flag '-v' causes talkative work. If you specify both flags '-s' and '-v' then error message will be printed. DOS and windows versions are talkative by default. UNIX version by default prints only warnings and error messages.

-close close rusconv's window after program finished -noclose do not close window

 Flags '-close' and '-noclose' are used only in windows version. DOS and UNIX versions ignore them. Windows operating system runs rusconv in separate window which should be closed after program finished. To avoid this and to let user to see report rusconv after all files converted waits for key pressed ('-noclose', by default). Behavior can be changed by flag '-close'. With this flag rusconv finishes after all files converted. If you specify both flags '-close' and '-noclose' then error message will be printed.







How to recognize file encoding.


 To recognize file encoding use program whatrus. This program is distributed with rusconv.

C:\UTIL>whatrus \\comp\c\html\index.html

WIN detected.

 You can't specify several file names. If you don't need message and wish only to get return code then use flag '-s'.

 Windows operating system runs whatrus in a separate windows which should be closed after program finished. To keep window and to let user to see result whatrus after recognition waits for key pressed. To avoid this use flag '-s'.





Using rusconv in command scripts.


 If you are going to use rusconv in command scripts then consider this advises.

Write chars '--' after flags.

  This chars breaks flag parsing and prevents error if you script get file name which can be interpreted as rusconv's flag. Specify output directory.

  Is is very impotant when you are working in UNIX because user can use metachars. In UNIX interpretating of metachars is the work of operating system and program get ready list of arguments. There is no any guarantee that last argument is not a directory. In windows version of rusconv use flag '-close'.

  To keep window on the desktop and to let user to see report rusconv after all files converted waits for key pressed. In command scripts you probably don't need such behaviour. So use flag '-close' and rusconv will finish immediately after converting. In windows version of whatrus use flag '-s'.

  In windows version of whatrus flag '-s' is the same as flag '-close' in rusconv. Use return codes of rusconv and whatrus.

 Usage of return codes of rusconv and whatrus makes you script more intelligent.

rusconv: Number of converted files.

whatrus: 255 -

error occured   0 -

encoding not recognized  11 -

alternative encoding  12 -

KOI-8 encoding  13 -

Windows encoding  14 -

Macintosh encoding

 Here is an example of command script. It get any file and convert them to file index.html in windows encoding.



windows version, makeindex.bat:

@ECHO OFF

REM Copy source file to file with name 'index'. ECHO COPY %1 index copy %1 index IF EXIST index GOTO TAKEENC ECHO copy failed EXIT

REM Guess encoding :TAKEENC ECHO WHATRUS -s %1 whatrus -s %1

REM Branching started from big numbers because REM 'IF ERRORLEVEL = N' is indeed REM 'IF ERRORLEVEL >= N'. IF ERRORLEVEL = 255 GOTO WRERR IF ERRORLEVEL = 14 GOTO MACENC IF ERRORLEVEL = 13 GOTO WINENC IF ERRORLEVEL = 12 GOTO KOIENC IF ERRORLEVEL = 11 GOTO ALTENC ECHO encoding not recognized EXIT

:WRERR ECHO whatrus failed EXIT

REM convert file 'index' to 'index.html'. :ALTENC ECHO RUSCONV -close -alt +win -ext html index rusconv -close -alt +win -ext html index EXIT :KOIENC ECHO RUSCONV -close -alt +win -ext html index rusconv -close -koi +win -ext html index EXIT :MACENC ECHO RUSCONV -close -alt +win -ext html index rusconv -close -mac +win -ext html index EXIT :WINENC ECHO RUSCONV -win -alt +win -ext html index rusconv -close -alt +win -ext html index EXIT

UNIX version for bash, makeindex.sh:

# Copy source file to file with name 'index'. rm -f index cp $1 index if [ ! -f index ] then echo copy failed exit fi

# Guess encoding and convert file to 'index.html' whatrus $1 case $? in 255) echo error executing whatrus;; 0) can''t detect encoding;; 11) rusconv -alt +win -ext html index;; 12) rusconv -koi +win -ext html index;; 13) rusconv -win +win -ext html index;; 14) rusconv -mac +win -ext html index;; esac



Have a nice work!

tutorial-e.html

Document created by Oleg A. Paraschenko

Last changes - 15 November 1998


Удаление, перемещение и копирование элементов.


Ранее уже обсуждались возможности редактора Emacs по удалению, копированию и перемещению выделенных блоков текста. Аналогичные операцию можно выполнять с элементами SGML.

Чтобы удалить элемент SGML, можно воспользоваться стандартным способом, т.е. выделить блок от открывающего тэга до закрывающего, а затем нажать C-w. Но есть способ лучше. Команда PSGML sgml-kill-element (комбинация C-M-k) удаляет текст внутри элемента начиная с текущей позиции курсора и до закрывающего тэга. Альтернативный вызов команды из меню Modify - пункт Kill element. При использовании команды sgml-kill-element всегда следует помнить о команде отката - undo (C-_).

Если после удаления текста вторично нажать C-M-k, то в окне минибуфера появится сообщение:

No more elements in название_элемента element

Команду sgml-kill-element можно использовать для перемещения текста. Элемент, помещенный данной командой в буфер обмена, может быть потом вставлен в нужное место командой yank (C-y).

Перед тем, как перейти к рассмотрению вопросов, связанных с копированием элементов, обратим внимание на работу двух команд: sgml-untag-element и sgml-kill-markup.

Команда sgml-untag-element (комбинация C-c -) удаляет открывающий и закрывающий тэги текущего элемента. Альтернативный вызов команды через пункт Untag Element меню Modify.

Команда sgml-kill-markup (комбинация C-c C-k или пункт Markup меню Modify) удаляет в буфер фрагмент текста, заключенного между символами "<" и ">". Эта команда полезна для удаления комментариев, которые PSGML вставляет около элементов, если переменной sgml-auto-insert-required-elements присвоено ненулевое значение.

PSGML не имеет встроенной команды для удаления текста от текущей позиции до конца элемента. Данный пробел можно восполнить, добавив следующий макрос в файл .emacs:

(defun sgml-kill-to-eoelement () ; kill to end of element (interactive) (let ((start (point))) (sgml-end-of-element) (kill-region start (point))))

; assign to ^Ck keystrokes (define-key global-map "^Ck" sgml-kill-to-eoelement)



UNICODE


UNICODE

Unicode 2.1 Character Charts

A short overview of ISO/IEC 10646 and Unicode

Unicode resources on the net.

UNICODE Font

UniEdit UNICODE Etitor



UniPress Emacs 2.20e


Немногим отличается от собрата UniPress Emacs 2.20e, выпущенный компанией UniPress Software. В отличие от GNU Emacs данный редактор поставляется с документацией (хотя и неудачно написанной), обладает более привлекательным интерфейсом, имеет поставляемые за дополнительную плату (от 695 до 995 долларов) языко-ориентированные реализации для С, С++, Fortran и Ada. В целом, различия между GNU Emacs и UniPress Emacs незначительны. Если Вы являетесь поклонником Emacs, то, несомненно, будете удовлетворены обеими реализациями.



Управляющие структуры


Условное предложение:

if ( &lt условие&gt ) &lt предложение&gt

\hskip 1cm [else &lt предложение&gt ]

Предложения цикла:

while ( &lt условие&gt ) &lt предложение&gt

for (&lt выражение&gt ; &lt условие&gt ; &lt выражение&gt )

\hskip 1cm &lt предложение&gt

Например:

for(i=1; i&lt =NF; i++) - Аналогично циклу for в языке ``С''

for (i in array) - Цикл по элементам массива. Но, элементы массива доступны в этом случае в случайном порядке.

break - Немедленный выход из цикла.

continue - Переход к выполнению следующего предложения.

next - Немедленный переход к анализу следующей строки.

exit - Выход из программы (на конец input).

# - Комментарий



Условная трансляция


В разделе мы столкнулись с командами условной трансляции @ifinfo/@end info. Условная трансляция означает, что определенные части документа направляются на вход только одного определенного транслятора (в нашем примере это makeinfo), или же, в случае @ifnotinfo/@end notinfo, что определенный транслятор не используется при обработке части документа.

На одной строке вместе с открывающей (@ifformat) и закрывающей (@end format) последовательностью команд условной трансляции не должно быть больше ничего.

Имеются три парных директивы включения (исключения) части материала при конвертации документа в формат Info, TeX и HTML соответственно.

@iftex

...

@end tex

@ifinfo

...

@end info

@ifhtml

...

@end html

@ifnottex

...

@end nottex

@ifnotinfo

...

@end notinfo

@ifnothtml

...

@end nothtml



Установка


После того как вы скачаете архив с процессором saxon вам нужно распаковать его:

[danguer@perseo xslt]$ unzip saxon6_5_2.zip

Затем, вам нужно добавить файл saxon.jar к пути поиска классов, путь к jar-архиву можно передать с помощью ключа -cp path (можно добавить путь к jar-файлу в переменную окружения CLASSPATH прим. перев.). Я поместил файл saxon.jar в каталог xslt, кроме того необходимо передать Java используемый класс, в случае Saxon 6.5.2 используется класс com.icl.saxon.StyleSheet и затем должны следовать xml-документ и xsl-файл, например:

[danguer@perseo xslt]$ java -cp saxon.jar com.icl.saxon.StyleSheet document.xml tranformation.xsl

Эта команда отправит результат работы процессора на устройство стандартного вывода (STDOUT), перенаправить вывод в файл можно так:

[danguer@perseo xslt]$ java -cp saxon.jar com.icl.saxon.StyleSheet document.xml tranformation.xsl > file_processed.html

Например мы можем преобразовать наш первый пример XSLT с помощью процессора saxon:

[danguer@perseo xslt]$ java -cp saxon.jar com.icl.saxon.StyleSheet hello.xml hello.xsl > hello.html



Установка и настройка Apache с поддержкой PHP и phpMyLingvo.


"Апачи вышли на тропу войны!"

Итак, нам осталась пара пустяков -- установить и настроить Apache. Те, кто этого раньше никогда не делал -- не комплексуйте! Всё очень просто. Нам нужно установить несколько пакетов -- apache, mod_php, php-mysql. Все остальные пакеты (apache-common, php-common, ...) по необходимости. Почему я так невразумительно говорю? Наверное, потому что я "обленился" и переложил работу по отслеживанию зависимостей между пакетами на APT. Хотя APT -- это детище Debian, но он неплохо себя чувствует на дистрибутивах ALT Linux и его несложно настроить под RedHat (думаю, и под Mandrake тоже, как и под любой другой rpm-based дистрибутив).

Установили? Теперь проверьте запущен он или нет, и настроен ли так, чтобы автоматически запускаться после загрузки. Вам нужно повторить все те же операции, что и с mysqld (см. п. 2.1), только в нашем случае название сервиса httpd. Проверьте конфигурационный файл /etc/httpd/conf/httpd.conf -- в конце файла должна быть строка:

Include conf/addon-modules/mod_php4.conf

Эта строка подключает модуль php к apache.

Теперь отправляемся на домашнюю страницу phpMyLingvo и скачиваем оттуда последний вариант программы. Распаковываем его и копируем в /var/www/html/phpMyLingvo (/var/www/html -- это корень, если так можно выразиться, "файловой системы" документов, хранящихся на веб-сервере; см. опцию DocumentRoot в файле /etc/httpd/conf/httpd.conf).

Отредактируйте файл config.php пакета phpMyLingvo -- замените строку:

mysql_connect("localhost", "root", "") or die("MySQL connection error: ".mysql_error());

на

mysql_connect("localhost", "ptkdic_usr", "") or die("MySQL connection error: ".mysql_error());

(Обратите внимание, что здесь в качестве хоста я указал localhost. Сделано это по той причине, что к MySQL будет обращаться php-скрипт, размещённый локально, даже если вы планируете открыть доступ к словарям в сети. В этом случае, за предоставление такого доступа будет отвечать apache.)


А теперь запустите веб-браузер и наберите в нём http://localhost/phpMyLingvo/ или http://имя_хоста/phpMyLingvo/ (если пытаетесь подключиться к веб-серверу с другого компьютера.)

У меня получилось (см. скриншот). А у вас?

Если хотите попробовать в действии phpMyLingvo, не устанавливая его у себя, то вам .

Несколько слов о достоинствах phpMyLingvo (слово автору программы, Сергею Галину):

Может быть установлена на компьютер с любой операционной системой с MySQL и веб-сервером с поддержкой PHP. Одна инсталляция phpMyLingvo может обслуживать целую сеть компьютеров. При этом нет необходимости устанавливать какие-либо программы на клиентские машины, и не нужно открывать внешний доступ к MySQL-серверу. Поддерживается ввод запросов и вывод статей кодировкой UNICODE (в виде HTML entities), что обеспечивает одновременное отображение символов кириллицы и западноевропейских алфавитов. Возможен поиск по нескольким словарям. Полнотекстовый поиск - позволяет находить слова, которые упомянуты в словаре, но не вынесены в заголовок, или использовать словарь "навыворот" - например, переводить с русского на немецкий немецко-русским словарем!. Внешний вид может быть легко модифицирован изменением стилевого файла (CSS2), текста приветствия. Настройки вынесены в отдельный файл. Вам не надо будет полностью переписывать их при обновлении программы до более новой версии. Широкий выбор настроек для ограничения нагрузки на сервер (ограничения по количеству словарей для одновременного поиска, по количеству выводимых статей, сжатие вывода с помощью Zlib). Пользователям не нужно запускать лишнюю программу для работы со словарем - достаточно открыть новое окно или вкладку браузера. Словарь, установленный на сервере, может использоваться слабыми рабочими станциями - с помощью облегченных браузеров, даже из текстовой консоли с помощью достаточно новой версии Links.

Недостатки, недоделки и известные ошибки:

Нужно иметь/установить Web-сервер, PHP и MySQL. Многие люди предпочитают обычный GUI-интерфейс. Формат словарей, позаимствованный у PtkDic, не позволяет создавать словари для азиатских кодировок - используется смесь ISO-8859-1 и KOI8-R, а нужен Юникод. Эта проблема может быть решена в будущих версиях (это проблема всех словарей, описанных здесь, а не только phpMyLingvo). Пока что нет возможности редактирования словарных статей.

Если вы планируете предоставлять услуги веб-сервера в сети и ваша сеть будет подключена к Интернет, то вам следует подумать о безопасности -- ограничить доступ к портам и т.п.


Установка и настройка GtkDic.


Пакет берём , где и ptkdic. Если планируете собирать из "сырцов", то вам придётся установить devel-пакеты соответствующих библиотек (glib-devel, gtk+-devel, libMySQL-devel). К сожалению, GtkDic написан на GTK+ 1.2.x. Можно попытаться собрать его под GTK+ 2.x, но стабильность работы GtkDic в этом случае под вопросом.

Для того, чтобы GtkDic заработал, вы должны установить, как минимум, два пакета: gtkdic и gtkdic-simple. После этого вы должны отредактировать конфигурационный файл /etc/gtkdicrc (для глобальных настроек), либо создать файл ~/.gtkdic/gtkdicrc в домашнем каталоге пользователя. Минимальные изменения, которые нужно внести, это:

host = p4.home dicdb = ptkdic user = ptkdic_usr password =

Остальное по вкусу.

Возможно, вы заметили, что в случае с пользователем gtkdic_usr я оставляю переменную password, даже если пароль отсутствует. Можно, конечно, её убрать или закомментировать. Это не принципиально. Просто есть пользователь, есть пароль. А если пароль отсутствует, то каков он по умолчанию? Вот поэтому я и оставил всё как есть.

Запускаем (см. скриншот). Работает прямой и обратный поиск, а также поиск по частичному вхождению. Работают перевод выделенного текста и обратный перевод, но следует учитывать две вещи: первое -- выделять вы должны только слово (словосочетание или часть слова), встречающееся в словаре, а не целый кусок текста и второе -- у gtk+ свой буфер обмена (clipboard), а работу с system-wide xclipboard автор не доделал, поэтому этой возможностью вы можете воспользоваться, работая только в gtk+ приложениях. Хотя есть другой вариант -- собрать PtkDic под GTK+ 2.0 (./configure --without-old-gtk). Тогда эта проблема будет решена. Хотя я заставить работать GtkDic в таком варианте не смог (почему-то оказался заблокированным ввод в поля "English" и "Russian".).

Кроме этого, интерес представляют пакеты gtkdic-audio и gtkdic-audio_edit. Первый -- это gtkdic с возможностью воспроизведения произношения слова. Решение при этом выбрано простое (см. скрипт /usr/bin/gtkdic-say.sh пакета gtkdic) -- проигрывать mp3-файлы, размещённые в подкаталоге /tmp. Не ахти какой механизм работы со звуком, но как временное решение проблемы вполне подойдёт. Второй пакет вместе с возможностью аудио воспроизведения имеет встроенный редактор, позволяющий добавлять в базу новые словарные статьи (см. пункт меню "Update dictionary"). Если вы хотите отказаться от ввода данных, то воспользуйтесь пунктами меню "Undo last update" или "Undo all updates". (Это единственная из программ, рассматриваемых здесь, которая способна заполнять словарные статьи.)


Принцип работы редактора следующий -- в поле "English" вводите слово, а в окне, где обычно показываются словарные статьи, пишете свою статью. После этого выбираете пункт меню "Update dictionary". Недостаток редактора в том, что он не обновляет статью с таким же именем, а добавляет ещё одну. Так что будьте внимательны, если захотите воспользоваться этой возможностью. Да! И самое главное -- если вы используете предложенный мною вариант работы с базами, основанный на использовании двух пользователей, то напоминаю вам, что для добавления новых словарных статей у пользователя должны быть соответствующие права на это, поэтому замените пользователя gtkdic_usr на gtkdic_adm.

Как и PtkDic, GtkDic корректно работает с европейскими языками, используя тоже два шрифта для вывода на экран плюс автоопределение кодировки и имеет возможность печати.

И ещё. В составе пакета gtkdic есть скрипт, написанный на Perl, который представляет из себя простой веб-интерфейс

для доступа к словарям. Чтобы заставить его работать, вам нужно установить и настроить apache (подробнее об этом читайте дальше в п. 2.6 "Установка и настройка Apache с поддержкой PHP и phpMyLingvo.") и скопировать скрипт webdic.pl в подкаталог /var/www/cgi-bin, предварительно настроив в нём доступ к базе данных:
... my $dbhost = 'p4.home'; my $dbname = 'ptkdic'; my $dbuser = 'ptkdic_usr'; my $dbpass = ''; ... И добавив в скрипт, после определения переменной $q, строку указывающую кодовую страницу для генерируемого html-документа:
... my $q = new CGI; $q->charset('KOI8-R'); # по умолчанию используется iso-8859-1 ... В данный момент проект не развивается, т.к. автор сделал то, что хотел, а желающих продолжить и развивать проект не нашлось. А жаль.


Установка и настройка MySQL.


Нам понадобятся три пакета -- MySQL-server, MySQl-client и libMySQL. Как устанавливать -- сугубо личное дело каждого дистрибутива.

Сразу после того как вы установили MySQL, вы должны для себя решить -- используется MySQL только локально или sql-сервер должен предоставлять доступ к своим ресурсам другим машинам? Если да, то редактируем файл /var/lib/mysql/my.cnf и убираем из него строку

skip-networking

Получаем примерно следующее:

[mysqld] chroot=/var/lib/mysql datadir=/db bdb-logdir=/log log=/log/queries pid-file=/mysqld.pid skip-locking socket=/mysql.sock tmpdir=/tmp user=mysql

Перезапускаем сервис mysqld:

[root@p4 bin]# service mysqld restart

И заодно проверяем будет ли mysqld автоматически грузится при старте системы:

[root@p4 mysql]# chkconfig --list mysqld mysqld 0:off 1:off 2:off 3:off 4:off 5:off 6:off

В моём случае mysqld отключен, поэтому я включаю его:

[root@p4 mysql]# chkconfig mysqld on [root@p4 mysql]# chkconfig --list mysqld mysqld 0:off 1:off 2:off 3:on 4:on 5:on 6:off

Теперь при загрузке в runevel 3,4 или 5 будет автоматически грузиться mysqld. Проверяем запущен ли mysqld:

[root@p4 mysql]# service mysqld status mysqld is stopped

Если нет, запускаем:

[root@p4 mysql]# service mysqld start

Если вы установили MySQL в первый раз, то вам необходимо настроить пароль суперпользователя в MySQL. Изначально для пользователя root пароль не указан. Что делаем? Для любителей GUI советую установить пакет mysqlnavigator и настроить всё через него. Для адептов командной строки у меня есть небольшой набор скриптов для предварительной настройки и установки словарей:

var_mysql_ptkdic.sh -- скрипт, где лежат все переменные, которые используются в скриптах настройки MySQL и установки словарей. Не забудьте пароли и параметры сети поменять под себя. set_mysql_ptkdic.sh -- скрипт, в котором настраивается пароль root, создаётся база ptkdic, пользователи ptkdic_adm и ptkdic_usr и назначаются им права на доступ к базе ptkdic. install_dic.sh -- скрипт, устанавливающий в БД ptkdic словарь, указанный в строке параметров.

Если вы только что установили MySQL, то всё, что от вас потребуется, это сделать следующее (можно не под привилегированным пользователем):

[alex@p4 bin]$ ./set_mysql_ptkdic.sh Установка пароля для root... Создаём базу ptkdic... Создаём новых пользователей, ptkdic_adm и ptkdic_usr, и назначаем им привилегии... Перегружаем mysql...

А теперь давайте объяснимся. Что это за два пользователя, ptkdic_adm и ptkdic_usr? Первый согласно скрипту set_mysql_ptkdic.sh получает полные права над БД ptkdic, где будут храниться таблицы словарей. Второй пользователь, ptkdic_usr, получает возможность делать только выборки из БД ptkdic. Это решение я использовал вместо того, которое предлагалось в описании по установке пакета GtkDic -- создать пользователя ptkdic и присвоить ему все (!) права на базу ptkdic и в дальнейшем использовать его для её заполнения и для работы с ней, что чревато неприятностями. Поэтому для работы с базой словарей я ввёл вместо одного пользователя двух.



Установка и настройка PtkDic.


Пакет берём на . Для работоспособности PtkDic вам необходимо установить Perl и несколько модулей для него: perl-Tk и perl-DBD-mysql. Что ещё за собой потянет установка этих пакетов зависит от того, что у вас уже установлено в системе. В моём случае это были perl-DBI, perl-Net-Daemon и perl-PIRPC. Но это так ... лирика ... вам поможет разобраться с пакетными зависимостями apt или yum (к сожалению, я не в курсе чем отслеживают зависимости пользователи Slackware).

Сам скрипт ptkdic расположите там, куда указывает переменная $PATH или добавьте новый путь. Кроме это, скопируйте файл ptkdicrc.templ в ~/.ptkdic/ptkdicrc и настройте пользователя, ip-адрес или имя хоста MySQL-сервера, код доступа к БД ptkdic и шрифты. С последними, возможно, придётся повозиться -- воспользуйтесь программой xfontsel, она облегчит вам жизнь. Получится примерно следующее:

host = p4.home user = ptkdic_usr passwd = ""

font_lat = -misc-fixed-medium-r-normal--14-130-75-75-c-70-iso8859-1 # 8859-1 font font_latb = -misc-fixed-bold-r-normal--14-130-75-75-c-70-iso8859-1 # 8859-1 bold font font_rus = -rfx-courier-medium-r-normal-*-14-140-75-75-m-90-koi8-r # koi8-r font font_rusb = -rfx-courier-bold-r-normal-*-14-140-75-75-m-90-koi8-r # koi8-r bold font

latex_preamble = "\documentclass[a4paper,10pt]{article} \n \usepackage[koi8-r]{inputenc} \n \usepackage[english,russian]{babel} \n \pagestyle{empty}"

geometry = 800x600+0+0

Запускаем (см. скриншот). Работает прямой и обратный поиск, а также поиск по частичному вхождению. Печать (тут я положусь на слова автора, т.к. принтера поблизости нет и проверить это не могу). При печати в подкаталоге ~/.ptkdic формируются три файла texput.(aux|dvi|log). Несомненный плюс -- корректная работа с европейскими языками (но это можно сказать и о других, описываемых здесь словарях). Для этого используется два шрифта для вывода на экран плюс автоопределение кодировки.



Установка J2RE 1.4 и JaLingo.


Всё просто как "кусок хозяйственного мыла". Нам нужны: а -- пакет J2RE и б -- клиент для доступа к словарям, JaLingo. Пакеты для J2RE можно взять здесь. Я воспользовался Sisyphus (репозиторий пакетов ALT Linux) и взял там два пакета: j2se1.4-sun и j2se1.4-sun-fonts. Их установка потребовала наличия в системе ещё одного пакета -- java-common.

Теперь скачиваем программу-клиент с с домашней страницы проекта. На момент написания статьи это была альфа-версия 0.2. Запускаем (см. скриншот):

[alex@p4 bin]$ java -jar jalingo-0.2a.jar

Интерфейс напоминает старый добрый Lingvo. Работает только прямой поиск. Но есть возможность поиска в процессе ввода слова (так, как это реализовано в Lingvo). Интересен тем, что может подключать словари PtkDic через MySQL-соединение и/или файловый словарь Мюллера или любой другой с таким же форматом (см. скриншот). Программа показывает транскрипцию для словаря Мюллера (если она там есть), форматирует статью, делает подсветку служебных слов и сокращений. Статьи из MySQL-словарей отображаются как есть, без форматирования. Неоспоримое преимущество -- кроссплатформенность. Хотя ещё и сыроват, поэтому, если вас заинтересует этот клиент и вы найдёте в его работе ошибки, не забудьте сообщить о них автору программы, Александру Шишко.



Установка параметров


^X ^N Поставить стоп на next, previous-line ^U ^X ^N Снять truncate-lines=no Не сворачивать строки help-char term-file-prefix keyboard-translate-table scroll-... 1. (мягкий скролл, без прыжков) ctl-arrow nil Представлять CTRL-символы ^? или \xxx



Установка PSGML


Пользователь обычно получает PSGML как совокупность файлов, объединенных в один сжатый файл типа DOS/Windows ZIP или UNIX GNU zip. Файлы, извлеченные из этого дистрибутивного файла относятся к трем главным категориям:

Файлы с расширением .el, которые являются совокупностями функций LISP, подобных файлу .emacs. Файлы с расширением .elc, которые являются откомпилированными версиями файлов .el. Они выполняются быстрее. Все другие файлы, которые содержат информацию относительно установки и использования PSGML.

Пользователи UNIX обнаружат инсталляционные команды и сценарии, включенные в комплект поставки PSGML. Пользователям DOS/Windows придется выполнить важные шаги вручную.

Файлы .elc созданные для какой-либо конкретной версии Emacs или в специфической операционной системе скорее всего не будут работать с другой версией программы или на другой операционной системе. Но файлы .elc всегда можно создать самостоятельно из файлов .el. PSGML может работать и .el-файлами, но это несколько замедлит работу, поскольку перед каждым выполнением такого файла будет проходить процесс его компиляции.

Сначала, поместите все файлы из пакета PSGML в их собственный подкаталог и удостоверьтесь, что Emacs осведомлен об их местоположении. Для этого добавьте следующий LISP-код в файл .emacs:

(setq load-path (append (list nil "/app/emacs/psgml") ; substitute your PSGML directory name load-path))

ПРИМЕЧАНИЕ:Даже при использовании Emacs и PSGML под DOS/Windows, PSGML ожидает, что в имени каталога будет присутствовать прямой слеш ("/"), а не обратный ("\"), как это имеет место в упомянутых операционных системах.

Тем самым переменной Emacs load-path, содержащей имена каталогов, откуда происходит загрузка программ, будет добавлено имя каталога, содержащего файлы PSGML. Переместите файлы PSGML в каталог /app/emacs/psgml.

Затем, нажмите M-x и в командной строке наберите byte-compile-file. Нажмите ввод, и после Byte compile file: введите имя .el-файла. Снова нажмите ввод.


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

Ускорить процесс компиляции можно, если вместо команды byte-compile-file использовать команду byte-force-recompile, которая запрашивает имя каталога, а затем компилирует все .el-файлы из этого каталога.

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

(autoload sgml-mode "psgml" "Major mode to edit SGML files." t )
в файл .emacs.

Помимо программных файлов пакет PSGML включает в себя документацию, которую можно просматривать в Emacs средствами справки. Поместите файл psgml.info в каталог (вероятно, подкаталог главного каталога Emacs называемого info), где лежат все файлы подсказки. Отредактируйте файл dir, находящийся в том же каталоге, включив в него следующую строку:

* PSGML: (psgml). SGML editing.
Если используется многопользовательская система, то возможно потребуется вмешательство системного администратора, чтобы добавить или отредактировать файлы из подкаталога каталога Emacs. Однако можно просматривать информацию, содержащуюся в файле psgml.info, в Emacs, поместив его другой каталог, куда есть доступ. Для этого введите команду

C-h i g (/pathname/psgml.info)
ПРИМЕЧАНИЕ: Не забудьте убрать букву "o" в расширении файла, если используется Emacs и PSGML под DOS, где расширения файла могут содержать не более трех символов.
При определении местоположения файла информации учтите, что DOS/Windows Emacs допускает в названиях каталогов как прямых слешей ("/"), так и обратных ("\")


Установка словарей.


С пользователями мы разобрались, теперь переходим к увеличению словарного запаса -- установке словарей. Лучше сразу идти на страницу проекта phpMyLingvo и взять словари там, т.к. на сайте страницы проекта PtkDic/GtkDic не работает докачка и, во-вторых, Сергей Галин (автор проекта phpMyLingvo) поддерживает набор словарей в актуальном состоянии. Скачайте то, что вас интересует. Обратите внимание на метод сжатия файлов -- gzip или bzip. Зачем? Сейчас поймёте. Дело в том, что файлы словарей представляют из себя огромные, предварительно сжатые, скрипты, которые "скармливаются" MySQL. Для этого воспользуйтесь скриптом install_dic.sh (за основу взят скрипт из пакета PtkDic). Но, чтобы install_dic.sh "не ошибся", помогите ему -- измените значение переменной PACK_PRG в var_mysql_ptkdic.sh на нужное вам: gzip или bzip. После этого можно устанавливать словари:

[alex@p4 tmp]$ ./install-dic.sh eng_rus_slang.bz2 Подождите, пожалуйста. Загружаю словарь eng_rus_slang.bz2 в БД ptkdic... Операция успешно завершена!



Установка xruskb


Установите порт . Добавте в ~/.xinitrc или ~/.xsession следующую команду:

[ -x /usr/local/bin/xrus ] && xrus jcuken-koi8.xmm



Установка заголовка и имени автора.


Это делается с помощью ключевых слов %title и %author . Например,

%title How to create an HTML document
%author D.R. Lorimer

было использовано в этом файле.



Установка значений переменных PSGML.


В разделе "Настройка переменных редактора Emacs" говорилось, что в Emacs существуют переменные, изменяя значения которых можно менять настройки редактора, и что эти переменные сохраняются в файле .emacs. PSGML добавляет к списку переменных несколько новых. Наиболее важные приведены ниже. Все они являются Булевыми переменными и должны иметь значение "t". Это можно сделать добавлением строки в файл .emacs, подобной той, что приведена ниже

(setq sgml-omittag-transparent t)



Вариации на тему emacs


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

Естественно, о emacs написано немало. Достаточно вспомнить книгу Ричарда Столмена "Руководство по GNU Emacs", недавно изданную в русском переводе. Не говоря уже о многочисленных статьях, как в Интернете, так и в традиционных журналах. Однако обычно уделяется внимание использованию emacs как редактора для программистов. Мы же посмотрим, каковы его возможности в написании не исходных, но просто текстов.

Функционально emacs существенно ближе к текстовым редакторам DOS, чем vi. Он имеет один-единственный режим - режим редактирования, включающийся сразу же после запуска редактора. Практически все нем манипуляции осуществляются с помощью управляющих клавиш Control, Escape и Alt в комбинации с буквенными. Что особенно приятно нашему человеку, комбинации эти работают вне зависимости от раскладки клавиатуры.

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

в него может быть считано содержимое уже существующего файла ([Control+x] - общий компонент для всех операций с буферами и окнами, затем [Control+f] - от слова file, как я понимаю); вновь созданный в буфере текст может быть записан как файл ([Control+x], [Control+s] - вероятно, от Save; несколько текстовых файлов могут быть объединены в одном буфере последовательным выполнением команды ([Control+x] i), то есть insert, за которой следует запрос имени файла.

Редактор emacs позволяет работать в одной консоли с несколькими файлами одновременно. С этой целью для каждого файл посредством ([Control+x] b) создается новый буфер со своим именем (которое никакого отношения к имени файла иметь не обязано).

В каждом буфере можно работать с любым количеством окон, сколько их поместится на экране. Разделение экрана на два окна осуществляется командой ([Control+x] 2), переход между окнами командой ([Control+x] o). Фрагменты текста могут переноситься из окна в окно либо штатными командами emacs, либо путем выделения мышью и вставки в позицию курсора щелчком средней ее клавиши.

Очень приятной особенностью emacs является нормальное, с точки зрения пользователя DOS, поведение клавиш Home и End, перемещающих курсор, соответственно, в начало и конец строки. И еще: перенос слов на границе экрана осуществляется без разрыва строки, то есть, в терминологии текстовых процессоров, без образования нового абзаца (который возникает только при нажатии клавиши Enter). Что очень полезно, если в дальнейшем предполагается экспорт в какой-либо текстовый процессор типа Word: искоренение лишних символов возврата каретки, возникающих при переносе слов во многих редакторах, - занятие не из самых жизнерадостных.

Редактор emacs обладает довольно эффективными инструментами для редактирования введенного текста. Они основываются на понятии блока - то есть текстового фрагмента, расположенного между меткой (вводимой комбинацией [Control+@] и текущим положением курсора. Блок может быть изъят (аналог Cut в Windows) командой [Control+w] и вставлен (в текущем окне или буфере, или в ином другом) командой [Control+y]. Имеется также многоуровневая отмена последовательностю команд ([Control+x] u).

В общем, пользователь, имеющий навыки работы со старыми текстовыми процессорами для DOS, основанными на использовании клавишных комбинаций, способен без большого труда освоить emacs. А доведя манипуляцию ими до автоматизма - и эффективно его использовать. Недостаток его (впрочем, характерный почти для всех консольных редакторов Linux) - крайне непривычное, для пользователей DOS использование мыши: с ее помощью можно только выделять фрагменты текста, но на текущую позицию курсора она никакого влияния не оказывает. Кроме того, мерцание последнего раздражает (по крайней мере, меня).

Впрочем, некоторая, скажем так, непривычность интерфейса emacs в известной мере сглаживается, если он запущен в окне терминала системы X Window. Это, как ни странно, не совсем то же самое, что emacs в режиме консольном. Правда, его можно запустить в окне терминала и в первозданном виде - командой emacs -nw (что означает "no window"); правда, не очень понятно, зачем это нужно - тогда уж лучше просто работать в консоли.

Потому что emacs, запущенный в терминальном окне той же командой без параметров, предоставляет многие дополнительные возможности по сравнению с чисто консольным вариантом. Для начала, в нем волшебным образом появляется строка меню, избавляющая от необходимости запоминания немерянного количества клавишных комбинаций (что само по себе не смертельно, но требует постоянной практики). Кроме того, курсор начинает вести себя обычным (для DOS/Windows-мигранта) способом, то есть может позиционироваться мышью. Есть и еще несколько приятных особенностей.

Итак, первое, что бросается в глаза при запуске emacs в окне терминала - это строка меню. Организованное не вполне стандартным, но по своему логичным образом.

Первым пунктом идет Buffers - основополагающее понятие для emacs. Здесь можно, во первых, переключаться между открытыми буферами, во вторых - вывести список буферов. В пункте Files, как это ни странно, помимо открытия, сохранения, переименования и вставки файла, также присутствуют операции с буферами (обращение и уничтожение буфера), а также с фреймами; термин "фрейм" в контексте emacs соответствует понятию окна в большинстве иных приложений.

В пункте Tools - масса всяких опций, от печати и сравнения файлов и буферов до чтения новостей, получения и отправки почты, поиска файлов, компилирования и отладки программ. В пункте Edit - обычный набор инструментов для редактирования (вырезание, копирование и вставка, а также отмена). Здесь же - всякого рода форматирование, именуемое свойствами текста - от шрифтоначертания и выравнивания до отступов и установок цвета фона и текста. В пункте Search - разнообразный поиск, а также работа с закладками (Bookmark).

Все, что не вошло в перечисленные пункты, собрано в пункте Mule (не от мула ли?). Главным образом, однако, он предназначен для установки языкового окружения. Причем язык может быть выбран почти любой - от английского и любого другого европейского до тибетского и эфиопского. Присутствует и русский, причем сразу в четырех своих ипостасях - ISO, Alt, KOI-8R и (да простят меня мои незалежные братья по этносу) KOI-8U.

В общем, через окно терминала наглядно можно видеть величие системы emacs, в которой, теоретически, заложены все мыслимые и немыслимые возможности. Которые в чисто консольном варианте замаскированы длинными списками команд. Однако, не смотря на изобилие возможностей, и для непосредственной задачи, то есть ввода текстов, emacs вполне пригоден.

Правда, для этого требуется некоторая привычка. Начать с того, что открытие файла осуществляется не вполне традиционно: при выборе из меню File - Open File внизу окна появляется нечто вроде командой строки с предложением ввести имя открываемого файла. Сделать это не сложно - поддерживается режим дополнения пути с помощью клавиши табулятора.

Если же на приглашение командной строки просто нажать Enter - появляется список файлов и подкаталогов текущего каталога (по умолчанию - $HOME). Который представляет собой отдельный буфер, видимый в их списке (пункт меню Buffers).

Далее с помощью мыши (или, конечно, курсором управления курсором) можно перейти к подкаталогу с требуемыми файлами. Однако открыть этот подкаталог можно, только нажав Enter. После чего появляется содержимое дочернего каталога, также представляющее собой самостоятельный буфер. В результате, при достаточной вложенности подкаталогов, довольно быстро пункт Buffers заполняется всеми этапами пути до требуемого файла. Так что лучше уж принять приглашение командной строки в самом начале...

Правда, после открытия файла никаких сложностей при его редактировании не возникает. Перемещение по тексту происходит обычным для пользователя DOS способом - с помощью клавиш управления курсором, Home и End, PageUp и PageDown, а также мыши; никаких неожиданных эффектов не возникает.

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

В буфер обмена (не буфер в понимании emacs) автоматически попадают только блоки, выделенные мышью. Для помещения в буфер обмена фрагментов, выделенных клавишами управления курсором, их нужно поместить туда явным образом - через пункт меню Edit - Copy. Как ни странно, за этой операцией не закреплено комбинации горячих клавиш.

Вставка содержащегося в буфере обмена фрагмента, не зависимо от способа его помещения туда, может быть осуществлена щелчком правой клавиши мыши, через меню (Edit - Paste) или комбинацией клавиш Control+y.

Измененные файлы могут быть сохранены - через пункты меню File - Save Buffer или Save Buffer as. По умолчанию устанавливается также автосохранение файлов. Предупреждаю: если вы закрываете родительское для emacs окно терминала, не сохранив изменений - emacs будет закрыт, и никаких предупреждений о необходимости записи измененных файлов не ждите.

Интерактивных способов настройки emacs не предусмотрено. Такие параметры, как размер и гарнитура экранного шрифта, его цвет и цвет фона, изменяются ручным редактированием файла ~/.Xdefaults (в домашнем каталоге пользователя). Относящаяся к emacs его секция имеет примерно такой вид: ! emacs, xemacs


emacs*Background: DarkSlateGray emacs*Foreground: Wheat emacs*pointerColor: Orchid emacs*cursorColor: Orchid emacs*bitmapIcon: on emacs*font: -cronyx-courier-medium-r-*-*-20-*-*-*-*-*-koi8-r !xemacs*font: -etl-fixed-medium-r-*-*-14-*-iso8859-5 emacs.geometry: 80x25

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

Более сложная настройка emacs (нужно сказать, что возможности таковой - почти безграничны) осуществляется редактирование файла инициализации - ~/.emacs, который представляет собой, в сущности, программу на языке LISP. На нем я останавливаться не буду - это описано в упоминавшейся книге Ричарда Столмена.

Следует упомянуть, что существует и собственно графическая модификация emacs - XEmacs. Однако, кроме внешнего вида, никаких впечатлений о нем получить мне не удалось: программа с регулярностью, достойной лучшего применения, слетала после ввода нескольких слов. Не имею оснований для обобщений - вероятно, это особенность моей системы. Поскольку многие множества пользователей XEmacs применяют - и не жалуются. Однако мне про него сказать нечего...

Vi и emacs - далеко не единственные редакторы для текстового режима. Однако в большинстве своем они продолжают одну из двух этих линий. Хотя есть и самостоятельные программы, которые стоит рассмотреть в рубрике


Редакторы семейства VEDIT разработаны фирмой


Редакторы семейства VEDIT разработаны фирмой Greenview Data и предназначены для использования в текстовом режиме под управлением различных операционных систем на платформе Intel (MS-DOS, QNX, XENIX, UNIX 286/386, FlexOS). Редактор целиком написан на ассемблере, что ограничивает его переносимость на другие аппаратные платформы, а также исключает возможность использования в рамках системы Х Window. Интерфейс VEDIT вполне современный (CUA-подобные меню, окна, интенсивное использование цвета, напоминает Borland IDE), функциональная раскладка клавиатуры достаточно интуитивна, возможна эмуляция некоторых известных редакторов и текстовых процессоров. VEDIT может редактировать любые файлы (в том числе двоичные, размером до 2 ГБайт), имеет удобный режим шестнадцатеричного редактирования. Отдельные реализации редактора включают макроязык, который, однако, чрезмерно мнемоничен, что затрудняет написание и понимание программ. Так, например, команда удаления текущей строки выглядит как "0КК". В общем, по своим возможностям VEDIT похож на ранее упомянутый редактор TED, однако поддержка процесса программирования и интерфейс с операционной системой здесь явно слабее. К тому же редактор, не русифицирован.


Vi/Ex


Стандартный дистрибутив OpenBSD содержит nvi/nex версию редакторов vi и ex. Для того чтобы эти редакторы правильно отображали русские буквы, необходимо создать файл ~/.nexrc, содержащий следующие строки:

set print=абвгдежзийклмнопрстуфхцчшщыьъэюяАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЫЬЪЭЮЯ set noprint=

$RuOBSD: howto-cyrillic.html,v 1.49 2002/04/09 20:17:03 dfa Exp $



Vi - классика мира Unix


Vi - редактор, в различных своих версиях (Vim, elvis и другие), модификациях и клонах (сохраняющих полную совместимость между собой) представленный абсолютно во всех Unix- и Unix-подобных системах. В большинстве случаев он является системным редактором по умолчанию. А в критических обстоятельствах может оказаться просто единственным.

Поэтому иметь представление о Vi необходимо любому пользователю Linux. Хотя назвать его чрезвычайно удобными в использовании я бы не рискнул - от него веет какой-то допетровской Русью. Я понимаю его поклонников - это пользователи Unix старого закала. В те времена былинные, после строчного редактора (помните о таких? в DOS это был edline, в Unix - просто ed), vi выглядел как шедевр. И те, кто впитал привычку к нему с молоком матери - никогда от него не откажутся. Тем более, что как редактор исходных текстов или системных файлов - он более чем функционален. Посмотрим же и мы, что это такое.

Основная сложность в освоении Vi для человека, привыкшего к редакторам с более или менее, но все же человеческим лицом, является наличие трех режимов: командного, ввода и построчного редактирования. После запуска программы (а это делается просто: vi имя_файла, существующего или нового) перед вами возникает черный экран с тильдами по левому краю каждой строки.

Пользователь DOS, помнящий еще о WordPerfect версий 4 и 5 (прекрасный был, кстати сказать, процессор), попытается тут же начать ввод текста - и не получит ничего, кроме звукового cигнала. Поскольку находится в режиме командном, ввода не допускающем. То есть нажатия на клавиши интерпретируются не как коды букв, а как команды программы.

Для перехода в режим ввода нужно нажать клавишу a (app) или i (insert); первая позволяет добавлять текст после курсора, вторая - вставлять перед. Теперь-то можно и печатать буквы, как в любом другом редакторе или процессоре.

Можно также и перемещаться по тексту с помощью стрелок управления курсором. Следует помнить только, что нажатие таких клавиш, как End и Home, не даст привычного для пользователя DOS эффекта. И, более того, автоматически переведет редактор в командный режим. Для всякого рода сложных перемещений (на слово влево и в право, в начало и конец строки, на стоку вверх и вниз, и так далее) используются комбинации клавиш в командном режиме. То же относится и к операциям удаления и замены слов и текстовых блоков: клавиши delete или insert не окажут никакого действия на выделенный фрагмент; нужно перейти в командный режим и выполнить соответствующие действия уже там.

А вот сохранение файла и выход из него требуют еще одного режима - построчного редактирования. Для этого нужно перейти из режима ввода в командный режим (нажатием клавиши Escape) и набрать : (то есть двоеточие), а после (без пробела) букву для соответствующего действа; например, w - для сохранения, q - для выхода (если файл был изменен, последует предложение сохранить изменения командой :w) или q! - для выхода без сохранения изменений.

Следует заметить, что далеко не всегда ясен текущий режим редактора. В той версии, к которой я набираю эти строки (Vim), режим ввода маркируется строчкой --INSERT-- внизу экрана; но в общем случае - это не обязательно. Косвенно текущий режим можно определить нажатием клавиши escape: в случае режима ввода это переведет редактор в командный режим, а в командном - просто вызовет звуковой сигнал.

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

Я, конечно, понимаю, что все особенности vi - реликты той далекой эпохи, когда главным средством доступа к вычислительным мощностям компьютеров были текстовые терминалы. Клавиатуры которых не имели, скажем, стрелок управления курсором. Однако немало с тех пор воды утекло. И найти ныне такую (работающую) клавиатуру - посложнее, чем пользователя, помнящего о ее существовании. Для которого применение vi и оправдано долголетней привычкой и доскональным знанием. Ныне же приходящим в Linux - есть что выбрать из иного.

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



Vim


   

Vim. Быть может он действительно - лучший?

[04.09.2001, Владимир Попов, popov_inm@yahoo.com]

 

     За годы общения с вычислительной техникой мне пришлось увидеть множество средств набора и редактирования текста. Консоли "МИРа" и "Саратова", терминалы ЕС, уже вполне "зрелые" редакторы DEC-овских VMS/RSX, "радуга" редакторов под MS DOS и так далее. Менялись платформы и операционные системы, средства вывода и ввода, неизменной оставалась потребность в создании программного обеспечения, а значит - в программах, с помощью которых это ПО создается. Есть, правда, еще IDE (интегрированные среды разработки), есть visual (визуальные) средства, но нет программирования без программ-редакторов. Текстовые процессоры, а тем более издательские системы - принципиально другие продукты, для написания программ явно избыточные с одной стороны и недостаточные с другой. Именно хорошего редактора не хватает в стандартном наборе современного пользователя MS Windows, коих большинство среди сидящих за IBM PC. Можно добавить: к сожалению, но факт от этого фактом быть не перестанет.

Будет неправильно сказать, что написание текстов программ - дело только профессиональных программистов. Даже если не принимать во внимание энтузиастов, то отмахнуться от того обстоятельства, что всякий, задумавший обзавестись своей страничкой в Интернет, попадает в положение программиста - просто невозможно. Число последних неминуемо "стремится" к числу пользователей Сети, имя которым - "легион". Поэкспериментировав какое-то время с MS Word, Adobe Photoshop и FrontPage, большинство таких программистов-"неофитов" приходит к выводу, что лучший инструмент написания html-кода - notepad. Вам не приходилось слышать такое утверждение? Оно не беспочвенно: notepad едва ли не единственный именно редактор среди наиболее распространенных программ для MS Windows. "Именно редактор" означает в данном случае инструмент для эффективного ввода и модификации текста, не отягощенный средствами создания лучшего дизайна, расширенными возможностями печати и тому подобное. Но если такую популярность получил notepad - редактор, уступающий по своим возможностям даже вспомогательным встроенным редакторам интегрированных сред разработки вроде Borland-овских Turbo и оболочек вроде Far, то, может, имеет смысл обратить внимание на редакторы, используемые профессиональными программистами?

В мире UNIX самым заметным в этом классе, безусловно, является vi (VIsual editor) и его современный "потомок" - vim (Vi IMprooved - улучшенный). Он чаще других вызывается по умолчанию, его интерфейс чаще упоминается рядом с определениями "совместимый" и "подобный" и так далее. Но, быть может, это - дань традиции? В большой степени - да. Утверждение о том, что этот редактор - лучший, нуждается в доказательстве. Некоторые доводы в пользу этого и приводятся ниже.

Прежде всего, условием необходимым, хотя и не достаточным, является функциональная полнота редактора: он должен уметь все, что только может потребоваться при работе с текстом. Термин "все" конкретизировать невозможно, но достаточно будет сказать, что vim имеет ограниченное только здравым смыслом количество буферов (фактически - открытых файлов) и окон (в данном случае название "окно" очень точно отражает суть происходящего: есть файл, а есть окно, через которое мы содержимое этого файла рассматриваем). Окно может занимать всю площадь экрана, а может - часть, причем любую, то есть экран может делиться как по горизонтали, так и по вертикали. Переключения - произвольны. Сказанное справедливо как для графического, так и для консольного режимов. Кроме стандартной для "взрослых" редакторов возможности создания макрокоманд (фиксированных последовательностей элементарных команд редактора), есть развитый язык программирования. Редактор имеет 5 режимов (modes):

обычное экранное редактирование, когда нажатие


"Вставки/замены": обычное экранное редактирование, когда нажатие цифробуквенных клавиш вызывает ввод соответствующих символов в редактируемый текст, клавиши позиционирования перемещают указатель, а функциональные клавиши выполняют назначенные (вами или - по умолчанию) действия; "Нормальный": текст не модифицируется, клавиши позиционирования перемещают указатель, все остальные клавиши (или их последовательности) выполняют назначенные действия, опять-таки - вами или по умолчанию; "Визуальный": режим выделения области с помощью мыши, клавиш перемещения курсора или специальных "меток" "Операторный": вводимые символы детализируют введенный непосредственно перед этим оператор. Благодаря вводу в этом режиме оператор удаления, например, удалит N символов, слов, строк или область выделенную в визуальном режиме; "Командный": для ввода команд, а точнее тех из них, которые вы или авторы не сочли нужным связать с функциональными или обычными клавишами и их последовательностями;

По умолчанию <Esc> (иногда - два нажатия) возвращает в "нормальный" режим, <Ins> - переводит в режим "вставки", а из него - в режим "замены". Двоеточие в "нормальном" режиме даст перевод в "командный" режим. Символы операторов из, опять-таки, "нормального" режима переводят в "операторный". Символы <v> и <V> - в "визуальный". Поскольку действия редактора по нажатию любой из клавиш в любом режиме программируются, то, как вы, вероятно, уже догадались, у увлекшегося настройкой vim пользователя, этот редактор вполне может стать воистину неузнаваемым.

Здесь мы подходим ко второй сильной стороне vim - исключительной модифицируемости. Нужно ли это? Берусь утверждать: да. Меняются клавиатуры, хотя их типов, впрочем, и в каждый конкретный период - предостаточно, если говорить не только об IBM PC. Меняются устройства ввода, задачи, наконец. У vim как у достойного члена семейства наиболее типичных UNIX-приложений настройки хранятся в конфигурационном файле, каких, в свою очередь, может быть множество. По одному на тип решаемых задач, например. И название и местоположение конфигурационного файла традиционно для UNIX: .vimrc в "домашнем" каталоге пользователя. Пример (vimrc_example.vim) - в каталоге самого vim (для Linux обычно -/usr/share/vim/vimNN/, где NN - номер версии. Одним словом, если вы "создаете" свой редактор практически сами, то такое решение претендует на звание "решение навсегда": не в смысле неизменности, разумеется, а в смысле постоянной готовности соответствовать вашим новым требованиям.



Впервые познакомившемуся с возможностями конфигурации vim, трудно устоять перед соблазном "подогнать" его под "милый сердцу" прототип: для кого-то - MultiEdit, для кого-то - nedit, а для кого-то - и notepad. Это не сложно. Однако не стоит торопиться: vim имеет возможности, которых, вполне возможно, не было у "прототипа", а познакомившись с ними однажды, вы, быть может, уже не захотите от них отказываться. Перечислить все эти возможности вряд ли удастся уже хотя бы потому, что как всякая открытая система, vim развивается усилиями многих людей и быть в курсе всех разработок просто не реально. Попытаюсь перечислить наиболее известные возможности. Подразумеваются настройки "по умолчанию", ввод в "нормальном" режиме, кроме тех случаев, когда оговаривается иное. Двоеточие говорит о переходе в командный режим.

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

[n]G - переход на строку n, 0G - BOF, $G - EOF ) | ( - следующее | предыдущее предложения } | { - то же для параграфа ]] | [[ - то же для секции, функции % - ответная скобка (matching) `` - предыдущее местонахождение, с точностью до символа '' - то же, с точностью до строки более того, в последних версиях vim все перемещения по файлу в пределах сессии протоколируются, а <Ctrl-O>/<Ctrl-I> позволяют перемещаться по зафиксированным в этом протоколе позициям.

Весьма удобным является механизм меток, к которым всегда можно вернуться:

mx - пометить текущую позицию буквой "x" (буква, разумеется, любая) `x - перейти к метке "x" 'x - перейти к строке с меткой "x"

Еще одна возможность, довольно редко встречающаяся у редакторов, - множество именованных буферов. В последних версиях MS Windows это называется многостраничным clipboard-ом. Буферы, как и метки, метятся одной буквой:

"x - именованный буфер с меткой "x". С таким буфером возможны все стандартные операции:
y - копировать (yank)
d - вырезать (cut)
p - вставить (paste). Причем вставлять можно как перед ( <[p> ), так и после ( <]p> ) позиции под курсором. Если эта позиция - начало или конец строки, то разница довольно существенна. буфер, именованный как "* совпадает с clipboard X-Window.



Разумеется, есть множество средств поиска/замены:

/text - искать "text" ниже ?text - то же, но выше, то есть в предшествующей курсору части текста n - повторить поиск в том же направлении N - то же, но в обратном направлении * - найти слово такое же, как под курсором ниже по файлу # - то же, но выше по файлу :[address]s/text/replacement/[gci] - в адресном пространстве address заменить "text" на "replacement".
Опции: { global-confirm-insensitive case },
что означает: { все-с запросом подтверждения-игнорируя регистр } :g/text/replacement/g - то же для всех совпадений в буфере.
Для тех, кто знает, что такое регулярные выражения, отметим, что они в операторах поиска/замены - работают.
Не нужно пугаться "многословного" синтаксиса: вспомните о программируемых клавишах и вы поймете, что достаточно ввести нужную фразу в .vimrc лишь однажды.

Разумеется, есть полный список файловых операций. Перечислять все вряд ли имеет смысл: в них нет ничего "экзотического". Интереснее упомянуть "автозаполнение": набрав пару-тройку первых символов и не выходя из режима "вставки", нажмите <Ctrl-n> (или <Ctrl-p>): vim начнет предлагать варианты продолжения слова из имеющихся в вашем файле. Для пишущих на С добавлю: и в include-файлах тоже. Меня, в свое время, эта возможность примирила с длинными, информативными метками и именами переменных: я перестал в них ошибаться. Еще один сюрприз: <[i> покажет в командной строке определение переменной, находящейся под курсором, а <[d> - определение макро, если символы под курсором являются переменной или макрокомандой, разумеется. И ещ? "фокус" - справка по поводу кода символа под курсором, причем сразу во всех системах исчисления кроме двоичной, разве что. Последовательное нажатие <ga> даст практически полную информацию по поводу символа под курсором.

Разумеется, можно отказаться от сделанных изменений (undo), введя просто <u>, а можно восстановить сразу всю редактируемую строку: <U>. Иногда бывает нужно отказаться от отмены изменений (undo the undo's). Можно и это: <Ctrl-R>

Можно изменить регистр символа под курсором нажатием <~>. И, напоследок, часто весьма облегчающая жизнь точка <.> - повторить последнюю операцию.



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

Похожая ситуация с предложенными разработчиками для использования по умолчанию клавишами. Для не знакомых с UNIX назначение клавиш для поиска, копирования, вставки кажется непривычным. Однако, если вместе с vim вы будете осваивать, например, Linux, то очень скоро обнаружите, что те же клавиши "работают" и при просмотре man-страниц, и в популярной screen, и даже для стандартного интерпретатора командной строки bash, оказывается, существует vi-подобный режим. Одним словом, в UNIX-среде освоение vim либо проходит легче, если вы не совсем "чайник", либо "пригодится" при дальнейшем знакомстве с системой.

Разумеется, vim имеет подсветку синтаксиса, причем для десятков языков программирования и конфигурационных файлов. Для версии 5.6 подкаталог syntax содержит 189 файлов общим объемом более мегабайта, что, в свою очередь, составляет почти пятую часть объема дистрибутива.

Разумеется, vim прекрасно документирован: без малого 2 мегабайта файлов в текстовом формате, снабженных системой перекрестных ссылок и поиска. Плюс небольшой скрипт, превращающий эти текстовые файлы в универсальные html.

Разумеется, vim портирован практически на все платформы. Включая все известные ОС от MicroSoft, не в упрек будь сказано софтверному гиганту.

И это еще не все. Полтора десятка утилит, разработанных специально для vim, дополняют и без того немалый список возможностей. Среди них средства для создания перекрестных ссылок с файлами других форматов, "рисование" псевдографикой, таблицы, дополняющие форматеры, конвертеры и тому подобное.

Ну, и, разумеется, vim бесплатен. Если быть точным, то за него не обязательно платить. Плата же, если таковая случится, переводится в фонд помощи детям Уганды. Не единичный в мире Open Source, но, тем не менее, весьма благородный жест разработчиков.

Нужно признать, что vim сложен или, по крайней мере, непривычен для пользователей не-UNIX систем. Именно им пригодились бы все возможности конфигурирования, но их изучение кажется в начале пути таким "изнурительным"... Не стоит отчаиваться. Кроме документации в составе дистрибутива vim, стоит познакомиться с сайтом www.vim.org. Там можно обнаружить ссылки на сайты энтузиастов vim, предлагающих свои конфигурационные файлы для разных операционных сред. Очень интересен сайт , где все желающие делятся своим опытом работы с vim. На август 2001-го на сайте - более 100 советов, среди которых нет бесполезных, а тем более неверных.

В заключение нужно сказать о недостатках. Не без этого.

Внутренняя сложность vim может сделать его довольно медлительным на "слабых" машинах. Заметное время уходит на поиск, медленно может перемещаться маркер в "визуальном" режиме. Заметить это можно, повторюсь, только на машинах типа Pentium-166, например, но - можно.

Использование клавиш помимо функциональных предполагает, что включена не "ru"-раскладка. При работе с текстами программ это, как правило, не важно, а вот если обрабатываемый текст - исключительно кириллица, то переключение раскладки каждый раз, когда потребуется команда, вызываемая алфавитными клавишами из "нормального" режима, - раздражает. Быть может, стоит для работы с подобными текстами иметь свой конфигурационный файл с "акцентом" на использование функциональных клавиш, не зависящих от раскладки клавиатуры.

А попробовать, все-таки - стоит. Особенно работающим в разных операционных средах. Если вам действительно нужен редактор, попробуйте и вы, почти наверняка, не пожалеете.



       Парадоксально, но, признав некоторую сложность vim, сейчас я попытаюсь обосновать утверждение о его исключительной простоте. Парадокса, собственно, никакого и нет: все зависит от того, с чьей позиции смотреть. Для пользователя, только что загрузившего дистрибутив vim, он действительно сложен. Достаточно сказать, что в файле index.txt свыше 1200 строк, а ведь этот файл - всего лишь перечень доступных команд с краткими описаниями в одно, максимум два предложения. 1000, пусть 500 команд не способствуют желанию познакомиться с редактором. Не будем торопиться. Во-первых, команды довольно часто дублируются. Во-вторых, часть из них унаследована от vi и предполагает возможность ввода на любом алфавитно-цифровом терминале. Современному пользователю более естественным покажется использование функциональных клавиш и клавиш позиционирования курсора, мыши, наконец. Все эти возможности vim, разумеется, поддерживает, но и старые варианты набора команд не отменяются. Список сокращается: предположим, до 150 команд. Не так уж и много для редактора, который может "все" (уточнять и в этот раз не будем), но есть ли основания говорить об "исключительной простоте"? Как это ни странно, есть. И основания эти следующие:

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

Таким образом сконфигурированный, документированный и дополненный системой меню vim становится "образцом дружественности" к пользователю. Вас что-то не устраивает? Cделайте так, как считаете более удобным! Для этого не нужно обладать какими-то специальными знаниями, но что-то ДЕЛАТЬ - действительно нужно. Здесь придется еще раз признать (и напомнить), что vim написан программистами и для программистов. Но поскольку ряды последних все ширятся, то и круг пользователей также должен расширяться. Если это не так, то, возможно, и потому, что вышеупомянутые более чем 1000 строк одного перечисления команд кого-то "оттолкнули" при знакомстве. Именно на этого кого-то и ориентирован данный материал.

Для начала стоит объяснить, зачем все-таки нужно такое количество команд, если большинство редакторов вполне обходится системой меню. Для примера предлагаю взять части текста, выделяемые для выполнения над ними какой-то операции и называемые, как правило, текстовыми объектами. Можно выделять их мышью, как это и делается во многих редакторах: решение универсальное, но крайне не эргономичное - попробуйте выделить абзацев 5-6. В общем случае текстовым объектом может быть символ, слово, предложение, абзац, текст в целом плюс блоки, которые, в свою очередь, могут быть ограничены угловыми, квадратными, фигурными или круглыми скобками (мы ведь говорим о тексте программы). Курсор (или указатель мыши) в момент выбора также может находиться в начале, конце или внутри текстового объекта. Можно, конечно, "метить" начало и конец текстового объекта - но это бывает так утомительно... Согласитесь, также, что меню, отражающие все эти возможности, выглядело бы весьма громоздким. А вот как это сделано в vim: если курсор в начале объекта, то первая буква команды выделения - <a> (add), а если внутри, то <i> (inner). Теперь осталось указать, что является объектом. Вторая буква - <w>, <s>, <p> или <b>. Нетрудно догадаться об их происхождении : word, sentence, paragraph, block. Не ошибетесь, если предположите, что любая из возможных скобок в качестве второго символа команды, означает, что объект - это блок, ограниченный этим типом скобок. Изящно. И просто. А между тем, это без малого три десятка команд в визуальном режиме.

Логика интерфейса такова, что если вы обнаружили какую-то возможность в одном из режимов, то почти наверняка найдете аналогичную в другом. Упомянутые в первой статье <Ctrl-n> и <Ctrl-p>, обеспечивающие в режиме вставки переход к следующему (next) и предыдущему (previous) вариантам автозаполнения, при автозаполнениях работают практически везде. Одни и те же символы в командах, как правило, несут одну и ту же смысловую нагрузку: <i> - идентификатор, <d> - макроопределение, <f> - файл. Поэтому <[i> - найти первое появление идентификатора (фактически - определение переменной), <[d> - то же для макроопределения. Понятие "первое появление" для файла смысла не имеет, поэтому <[f> идентично <gf> и означает открытие для редактирования файла, имя которого находится под курсором. Если тем же i,d,f предшествует <Ctrl-W> (признак window-команд), то результатом будет открытие нового окна (а для файла - и нового буфера) с переходом к определению переменной или макрокоманды. Если команда имеет "соседей по смыслу", то скорее всего они будут вызываться изменением регистра второго (уточняющего) символа. Так, <[I> и <[D> распечатают все строки с данным идентификатором или макропеременной. Те же символы присутствуют в составе <Ctrl-X> (eXtended - расширенного) подрежима режима вставки. Этот подрежим полностью ориентирован на автозаполнение. Нетрудно догадаться, что символы <I>, <D>, <F> в качестве завершающих (после <Ctrl-X-Ctrl>) инициируют автозаполнение имен переменной, макрокоманды и файла соответственно, а <n> и <p>, как и прежде, будут означать следующий и предыдущий варианты автозаполнения.

"Универсальными" могут быть не только последние символы команд, как в предыдущих примерах, но и первые. Прежде всего, это уже упоминавшиеся <Ctrl-X> - первый символ расширенного подрежима вставки, и <Ctrl-W> - первый символ window-команд. Как правило, команда детализируется вторым символом. Кроме уже названных, для window-команд это: <+> - увеличить, <-> - уменьшить, <=> - сделать равными размеры окон, <s> - разделить (split), <c> - закрыть (close), <n> - открыть новое (new), <r> и <R> - поменять местами (rotate) окна. Еще одним "универсальным" символом может быть символ, идентифицирующий именованный буфер или, в соответствии с документацией, регистр. Если помните, комбинация <"x> (где 'x' - любой символ: a-zA-Z0-9%#:-") означает использование регистра с командами <y>,<d>,<p> - копирование, удаление, вставка (yank, delete, paste). Аналогично, <qx> означает переход в режим записи в регистр, а <q> - выход из него. Записываются как символы, так и управляющие последовательности (фактически - команды редактора). Если в регистр записаны команды редактора, то его содержимое можно выполнить командой <@x>. Но это возможно уже только с регистрами a-z. Содержимое регистра можно вставить командой <Ctrl-R>, причем это допустимо как непосредственно в тексте (режим вставки), так и в командном режиме. На этом список символов - "универсальных составляющих" команд - можно считать исчерпанным, но - не исчерпывающим, поскольку есть и уникальные комбинации, не имеющие аналогов в других режимах. Например, <Ctrl-U> в режиме вставки удаляет строку, а <Ctrl-V> позволяет ввести символ посредством ввода его трехзначного десятичного кода. В нормальном режиме <Ctrl-L> перерисовывает экран, <Ctrl-R> отменяет действия undo (<u>), а <Ctrl-A> и <Ctrl-X> инкрементируют или декрементируют число под курсором. Так же уникальны команды поиска и замены, перечисленные в первой статье. <U> в визуальном режиме переводит выделенный фрагмент в верхний регистр, а <u> - в нижний. <~> поменяет регистр для одного символа в нормальном режиме и для выделенного фрагмента - в визуальном.

Некоторые символы сохраняют свое назначение и в командном режиме: <!> - фильтр, <@x> - выполнить содержимое регистра 'x', '<' и '>' - уменьшить и, соответственно, увеличить "отступ" строк. Вообще, командный режим стоит несколько "особняком", поскольку является практически самодостаточным: в нем доступны практически все действия, инициируемые командами остальных режимов, разве что объем ввода будет больше. Зато текст команд достаточно "прозрачен". Например:

:buffer N - перейти к буферу N;
:Print - распечатать;
:set - показать или установить опции.

А количество вводимых символов уменьшается благодаря допустимым сокращениям и уже неоднократно упоминавшемуся автозаполнению. Перечислять эти самые "EX" команды нет смысла - их без малого три сотни, а вот просмотреть этот список - стоит. Хотя бы для того, чтобы знать, какие еще возможности имеет vim. Кроме команд, дублирующих команды других режимов, мы найдем здесь команды управления буферами (==открытыми файлами), меню, "привязкой" команд к клавиатурным последовательностям (map), средства программирования, индексации (tags), управления редактором и многое, многое другое.<



BR>

Так мы подошли к следующему достоинству vim, обеспечивающему его "простоту" - исключительным возможностям настройки. Прежде всего обратимся к конфигурационному файлу vimrc (для графического режима - gvimrc). На стоит взять vimrc.forall - файл написанный Свеном Гуксом (Sven Guckes) "на все случаи жизни". Файл прекрасно прокомментирован и действительно при некоторых модификациях может устроить многих. Но лучше использовать его как "руководство к действию". Познакомившись для начала с командой map:

map   \\   <C-]>

которая заменяет <Ctrl-]> (переход по ссылке в help (tag)), на более удобную последовательность <\\>, переходим к весьма обширному блоку определения опций (set ...). Автоотступ, автоматическое сохранение копий, размер табуляции и так далее, и так далее: перечисление в рамках статьи представляется невозможным - vimrc.forall имеет объем в 75К. Но одну опцию я все-таки приведу:

set langmap=йцу...ЙЦУ...;qwe...QWE...

Три точки в данном случае означают "все остальные символы на клавиатуре" в нижнем и верхнем регистрах для раскладок ru и us. <;> перед 'qwe' отделяет "подменяемый" набор от "подменяющего". Точку с запятой (в наборе, а не разделяющую) и двойные кавычки нужно исключать (quote) с помощью backslash (\), как обычно. Данная опция делает не нужным переключение раскладки клавиатуры, когда требуется латинский символ в нормальном режиме - несуществующий, как видите, недостаток vim, о котором я писал в первой статье. Спасибо всем указавшим на эту опцию. Что касается Свена Гукса, то, позаботившись о вводе таких необходимых ему умляутов, он действительно не учел нашу привязанность к кириллице - вполне простительно для жителя Берлина. Следующая секция vimrc.forall научит использовать сокращения - abbreviations. Дело вкуса. Занятно использовать сокращения в качестве "автокорректора" опечаток: aslo->also. Или - записной книжки: Ysnail->Sven Guckes<C-M>Pariser Str. 52<C-M>D-10719 Berlin. Обратите внимание, что сокращению команды abbreviate (ab) могут предшествовать символы <i>, <c> и <un> (insert, command, undo). Как Вы, наверное, догадались, это означает актуальность (действенность) сокращения для режимов вставки и команд или отмену сокращения. Если этот небольшой список мы расширим еще символами <a>, <n>, <o> и <v> (all, normal, operator и visual) - то получим список "универсальных" модификаторов, применимых и к некоторым другим командам, таким, как map и menu. Узнаваемая логика, не правда ли? Следующая секция 'MAPings' содержит определения привязки команд к определяемым пользователем клавиатурным последовательностям. Вот где истинный простор для "подгонки" vim под Ваши вкусы. Хотите выходить из редактора по <F10>? Пожалуйста:

map    <F10>   :q<CR>
imap   <F10>   <Esc>:q<CR>
cmap   <F10>   <Esc><Esc>:q<CR>

Последние две команды можно заменить одной: map! <Esc>:q<CR>, но для этого уже нужно знать о существовании map! (map для режимов команд и вставки) Во второй позиции может быть и последовательность символов. Например,

map   <F6>:set number<CR>
map   n<F6>:set nonumber<CR>

будет по <F6> включать нумерацию строк, а по <n><F6> - выключать.
Последующие секции, описывающие применение автокоманд для использования vim в качестве почтового клиента, PGP-шифрование и операции с синтаксисом, очень интересны, но уже не имеют отношения к разговору о "простоте" vim.

Вышеизложенное должно было убедить читателя, что "не так страшен vim..." и изучать устрашающих размеров help может быть, и не придется... У меня, во всяком случае, на каком-то этапе знакомства в этим редактором сложилось впечатление, что имей я под рукой 1-2 странички подсказок... А почему - нет? Поскольку по <F1> vim вызывает файл help.txt из каталога $VIMRUNTIME/doc/ (значение $VIMRUNTIME можно уточнить по :set helpfile), почему бы его не "подменить", сохранив оригинальный help.txt и переименовав в help.txt свой файл? Несколько "варварский", но действенный способ. Изящнее будет вставить свой help в существующую систему помощи: путь к персональному help-у удлинится на пару нажатий клавиш, но зато в Вашем распоряжении всегда будут и свой файл и оригинальная система помощи. Не вдаваясь в тонкости работы со ссылками (tags) приведу краткий рецепт:



Предположим, Ваш файл называется myhelp.txt. Первой строкой в него вставим что-то вроде: *myhelp.txt* . Текст может быть любым - это всего лишь ссылка, на которую будет позиционироваться система поиска в help-файлах. В файле help.txt, в строке, например, второй (чтобы сразу была видна на экране) вставим указатель. Например: |$MyHelp| . Текст, опять-таки значения не имеет, а символ <$> поставлен на первую позицию лишь затем, что бы наша ссылка оказалась поближе к началу индексного файла tags. В индексный файл tags вносим строку:
$MyHelp   myhelp.txt   /*myhelp.txt*
Все элементы строки, надеюсь, понятны: первый - ссылка, второй - имя файла, третий - позиция в этом файле. Файл tags - сортирован по алфавиту и, если не хотите сортировать его заново, строку нужно поместить в соответствующее место. В данном случае между строками, $LANG.... и $VIM...

Готово. Запускаем vim, нажимаем <F1> и переходим по ссылке $MyHelp (<Ctrl-]> - по умолчанию, <\\> - если Вы воспользовались советом Свена, или двойной клик, если предпочитаете мышь).

Ну, а поскольку "эталоном" дружественности интерфейса долгое время считалась система выпадающих меню, то осталось посмотреть, как таковая реализуется в vim. Дистрибутив содержит файл menu.vim, активный по умолчанию только для графической среды. Для появления меню в консольном режиме во все тот же vimrc нужно вставить следующие команды:

source $VIMRUNTIME/menu.vim
set wildmenu
set cpo-=<
set wcm=<C-Z>
map <F9> :emenu <C-Z>

На месте <F9> может быть, разумеется, любая клавиатурная последовательность. Можно иметь личный меню-файл, тогда первая строка должна указывать на него. Меню как меню. Но это - vim, а, значит, его можно модифицировать. Файл menu.vim сравнительно невелик: менее 22К для версии 5.6. Часть его составляют функции, собственно и обеспечивающие функционирование системы меню. Поскольку программирование в vim нас на настоящий момент не интересует, то обратим внимание только на блоки, первым словом строк которых является команда menu с предшествующими ей уже известными модификаторами <a>, <c>, <i>, <n>, <o> и <v> в соответствии с существующими режимами. Плюс tmenu - для организации всплывающих подсказок (tooltips) в графической среде. Обычно строка такого блока выглядит следующим образом:

amenu  10.330  &File.&Close<Tab>:q  :confirm q<CR>

Элементы строки разделяются пробелами. В данном случае первый из них, amenu - команда, обеспечивающая появление данной позиции меню во всех (all) режимах. Второй - число, часть до точки которого определяет позицию в главном (горизонтальном), а после точки - в выпадающем (вертикальном) меню. Подобным образом лексемы до и после точки третьего элемента строки представляют собой текстовое содержание позиции меню. Пробелы и точки в составе этих лексем исключаются (quote) с помощью обратной косой черты (backslash). Допустим только один служебный символ - <Tab>. Ведущим (hot) символам в составе лексем предшествует амперсенд (&). Четвертый элемент - собственно команда, которую нужно выполнить. Просто и эффективно. Если команда предполагает редактирование или если Вам требуется дополнительный контроль над командами - не завершайте строки <CR>. Фактически, система меню просто вводит за вас необходимую "EX"-команду.

Таким образом vim может обретести интерфейс, проще которого (при заданном уровне функциональности) уже не будет. Все желаемые усовершенствования Вы можете сделать сами. Средств для этого - достаточно. Не стану утверждать, что путь к этой "простоте" так уж, извините за тавтологию, прост, но "нет ничего ценнее хорошего инструмента". В том числе и для программиста.

Многих возможностей vim, кстати, ни, первая ни вторая статья даже не касались. Вне рассмотрения остались интеграция с Perl и Python, программирование пользовательских функций, форматирование текста и многие другие темы, достойные отдельного обсуждения.

Vim-2 или "что может быть проще?"



Автор: Владимир Попов
popov_inm@yahoo.com
Опубликовано: 13.09.2001
Оригинал:http://www.softerra.ru/review/oses/linux/12607/

Заметка с размышлениями о vim, опубликованная 04.09.2001, имела некоторый резонанс, в связи с чем разговор об этом мощном редакторе хочется продолжить. Парадоксально, но, признав некоторую сложность vim в прошлый раз, сейчас я попытаюсь обосновать утверждение о его исключительной простоте. Парадокса, собственно, никакого и нет: все зависит от того, с чьей позиции смотреть. Для пользователя, только что загрузившего дистрибутив vim, он действительно сложен. Достаточно сказать, что в файле index.txt свыше 1200 строк, а ведь этот файл - всего лишь перечень доступных команд с краткими описаниями в одно, максимум два предложения. 1000, пусть 500 команд не способствуют желанию познакомиться с редактором. Не будем торопиться. Во-первых, команды довольно часто дублируются. Во-вторых, часть из них унаследована от vi и предполагает возможность ввода на любом алфавитно-цифровом терминале. Современному пользователю более естественным покажется использование функциональных клавиш и клавиш позиционирования курсора, мыши, наконец. Все эти возможности vim, разумеется, поддерживает, но и старые варианты набора команд не отменяются. Список сокращается: предположим, до 150 команд. Не так уж и много для редактора, который может "все" (уточнять и в этот раз не будем), но есть ли основания говорить об "исключительной простоте"? Как это ни странно, есть. И основания эти следующие:

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


Таким образом сконфигурированный, документированный и дополненный системой меню vim становится "образцом дружественности" к пользователю. Вас что-то не устраивает? Cделайте так, как считаете более удобным! Для этого не нужно обладать какими-то специальными знаниями, но что-то ДЕЛАТЬ - действительно нужно. Здесь придется еще раз признать (и напомнить), что vim написан программистами и для программистов. Но поскольку ряды последних все ширятся, то и круг пользователей также должен расширяться. Если это не так, то, возможно, и потому, что вышеупомянутые более чем 1000 строк одного перечисления команд кого-то "оттолкнули" при знакомстве. Именно на этого кого-то и ориентирован данный материал.

Для начала стоит объяснить, зачем все-таки нужно такое количество команд, если большинство редакторов вполне обходится системой меню. Для примера предлагаю взять части текста, выделяемые для выполнения над ними какой-то операции и называемые, как правило, текстовыми объектами. Можно выделять их мышью, как это и делается во многих редакторах: решение универсальное, но крайне не эргономичное - попробуйте выделить абзацев 5-6. В общем случае текстовым объектом может быть символ, слово, предложение, абзац, текст в целом плюс блоки, которые, в свою очередь, могут быть ограничены угловыми, квадратными, фигурными или круглыми скобками (мы ведь говорим о тексте программы). Курсор (или указатель мыши) в момент выбора также может находиться в начале, конце или внутри текстового объекта. Можно, конечно, "метить" начало и конец текстового объекта - но это бывает так утомительно... Согласитесь, также, что меню, отражающие все эти возможности, выглядело бы весьма громоздким. А вот как это сделано в vim: если курсор в начале объекта, то первая буква команды выделения - <a> (add), а если внутри, то <i> (inner). Теперь осталось указать, что является объектом. Вторая буква - <w>, <s>, <p> или <b>. Нетрудно догадаться об их происхождении : word, sentence, paragraph, block. Не ошибетесь, если предположите, что любая из возможных скобок в качестве второго символа команды, означает, что объект - это блок, ограниченный этим типом скобок. Изящно. И просто. А между тем, это без малого три десятка команд в визуальном режиме.

Логика интерфейса такова, что если вы обнаружили какую-то возможность в одном из режимов, то почти наверняка найдете аналогичную в другом. Упомянутые в первой статье <Ctrl-n> и <Ctrl-p>, обеспечивающие в режиме вставки переход к следующему (next) и предыдущему (previous) вариантам автозаполнения, при автозаполнениях работают практически везде. Одни и те же символы в командах, как правило, несут одну и ту же смысловую нагрузку: <i> - идентификатор, <d> - макроопределение, <f> - файл. Поэтому <[i> - найти первое появление идентификатора (фактически - определение переменной), <[d> - то же для макроопределения. Понятие "первое появление" для файла смысла не имеет, поэтому <[f> идентично <gf> и означает открытие для редактирования файла, имя которого находится под курсором. Если тем же i,d,f предшествует <Ctrl-W> (признак window-команд), то результатом будет открытие нового окна (а для файла - и нового буфера) с переходом к определению переменной или макрокоманды. Если команда имеет "соседей по смыслу", то скорее всего они будут вызываться изменением регистра второго (уточняющего) символа. Так, <[I> и <[D> распечатают все строки с данным идентификатором или макропеременной. Те же символы присутствуют в составе <Ctrl-X> (eXtended - расширенного) подрежима режима вставки. Этот подрежим полностью ориентирован на автозаполнение. Нетрудно догадаться, что символы <I>, <D>, <F> в качестве завершающих (после <Ctrl-X-Ctrl>) инициируют автозаполнение имен переменной, макрокоманды и файла соответственно, а <n> и <p>, как и прежде, будут означать следующий и предыдущий варианты автозаполнения.

"Универсальными" могут быть не только последние символы команд, как в предыдущих примерах, но и первые. Прежде всего, это уже упоминавшиеся <Ctrl-X> - первый символ расширенного подрежима вставки, и <Ctrl-W> - первый символ window-команд. Как правило, команда детализируется вторым символом. Кроме уже названных, для window-команд это: <+> - увеличить, <-> - уменьшить, <=> - сделать равными размеры окон, <s> - разделить (split), <c> - закрыть (close), <n> - открыть новое (new), <r> и <R> - поменять местами (rotate) окна. Еще одним "универсальным" символом может быть символ, идентифицирующий именованный буфер или, в соответствии с документацией, регистр. Если помните, комбинация <"x> (где 'x' - любой символ: a-zA-Z0-9%#:-") означает использование регистра с командами <y>,<d>,<p> - копирование, удаление, вставка (yank, delete, paste). Аналогично, <qx> означает переход в режим записи в регистр, а <q> - выход из него. Записываются как символы, так и управляющие последовательности (фактически - команды редактора). Если в регистр записаны команды редактора, то его содержимое можно выполнить командой <@x>. Но это возможно уже только с регистрами a-z. Содержимое регистра можно вставить командой <Ctrl-R>, причем это допустимо как непосредственно в тексте (режим вставки), так и в командном режиме. На этом список символов - "универсальных составляющих" команд - можно считать исчерпанным, но - не исчерпывающим, поскольку есть и уникальные комбинации, не имеющие аналогов в других режимах. Например, <Ctrl-U> в режиме вставки удаляет строку, а <Ctrl-V> позволяет ввести символ посредством ввода его трехзначного десятичного кода. В нормальном режиме <Ctrl-L> перерисовывает экран, <Ctrl-R> отменяет действия undo (<u>), а <Ctrl-A> и <Ctrl-X> инкрементируют или декрементируют число под курсором. Так же уникальны команды поиска и замены, перечисленные в первой статье. <U> в визуальном режиме переводит выделенный фрагмент в верхний регистр, а <u> - в нижний. <~> поменяет регистр для одного символа в нормальном режиме и для выделенного фрагмента - в визуальном.

Некоторые символы сохраняют свое назначение и в командном режиме: <!> - фильтр, <@x> - выполнить содержимое регистра 'x', '<' и '>' - уменьшить и, соответственно, увеличить "отступ" строк. Вообще, командный режим стоит несколько "особняком", поскольку является практически самодостаточным: в нем доступны практически все действия, инициируемые командами остальных режимов, разве что объем ввода будет больше. Зато текст команд достаточно "прозрачен". Например:

:buffer N - перейти к буферу N;
:Print - распечатать;
:set - показать или установить опции.

А количество вводимых символов уменьшается благодаря допустимым сокращениям и уже неоднократно упоминавшемуся автозаполнению. Перечислять эти самые "EX" команды нет смысла - их без малого три сотни, а вот просмотреть этот список - стоит. Хотя бы для того, чтобы знать, какие еще возможности имеет vim. Кроме команд, дублирующих команды других режимов, мы найдем здесь команды управления буферами (==открытыми файлами), меню, "привязкой" команд к клавиатурным последовательностям (map), средства программирования, индексации (tags), управления редактором и многое, многое другое.



Так мы подошли к следующему достоинству vim, обеспечивающему его "простоту" - исключительным возможностям настройки. Прежде всего обратимся к конфигурационному файлу vimrc (для графического режима - gvimrc). На стоит взять vimrc.forall - файл написанный "на все случаи жизни". Файл прекрасно прокомментирован и действительно при некоторых модификациях может устроить многих. Но лучше использовать его как "руководство к действию". Познакомившись для начала с командой map:

map   \\   <C-]>

которая заменяет <Ctrl-]> (переход по ссылке в help (tag)), на более удобную последовательность <\\>, переходим к весьма обширному блоку определения опций (set ...). Автоотступ, автоматическое сохранение копий, размер табуляции и так далее, и так далее: перечисление в рамках статьи представляется невозможным - vimrc.forall имеет объем в 75К. Но одну опцию я все-таки приведу:

set langmap=йцу...ЙЦУ...;qwe...QWE...

Три точки в данном случае означают "все остальные символы на клавиатуре" в нижнем и верхнем регистрах для раскладок ru и us. <;> перед 'qwe' отделяет "подменяемый" набор от "подменяющего". Точку с запятой (в наборе, а не разделяющую) и двойные кавычки нужно исключать (quote) с помощью backslash (\), как обычно. Данная опция делает не нужным переключение раскладки клавиатуры, когда требуется латинский символ в нормальном режиме - несуществующий, как видите, недостаток vim, о котором я писал в первой статье. Спасибо всем указавшим на эту опцию. Что касается Свена Гукса, то, позаботившись о вводе таких необходимых ему умляутов, он действительно не учел нашу привязанность к кириллице - вполне простительно для жителя Берлина. Следующая секция vimrc.forall научит использовать сокращения - abbreviations. Дело вкуса. Занятно использовать сокращения в качестве "автокорректора" опечаток: aslo->also. Или - записной книжки: Ysnail->Sven Guckes<C-M>Pariser Str. 52<C-M>D-10719 Berlin. Обратите внимание, что сокращению команды abbreviate (ab) могут предшествовать символы <i>, <c> и <un> (insert, command, undo). Как Вы, наверное, догадались, это означает актуальность (действенность) сокращения для режимов вставки и команд или отмену сокращения. Если этот небольшой список мы расширим еще символами <a>, <n>, <o> и <v> (all, normal, operator и visual) - то получим список "универсальных" модификаторов, применимых и к некоторым другим командам, таким, как map и menu. Узнаваемая логика, не правда ли? Следующая секция 'MAPings' содержит определения привязки команд к определяемым пользователем клавиатурным последовательностям. Вот где истинный простор для "подгонки" vim под Ваши вкусы. Хотите выходить из редактора по <F10>? Пожалуйста:

map    <F10>   :q<CR>
imap   <F10>   <Esc>:q<CR>
cmap   <F10>   <Esc><Esc>:q<CR>

Последние две команды можно заменить одной: map! <Esc>:q<CR>, но для этого уже нужно знать о существовании map! (map для режимов команд и вставки) Во второй позиции может быть и последовательность символов. Например,

map   <F6>:set number<CR>
map   n<F6>:set nonumber<CR>

будет по <F6> включать нумерацию строк, а по <n><F6> - выключать.
Последующие секции, описывающие применение автокоманд для использования vim в качестве почтового клиента, PGP-шифрование и операции с синтаксисом, очень интересны, но уже не имеют отношения к разговору о "простоте" vim.

Вышеизложенное должно было убедить читателя, что "не так страшен vim..." и изучать устрашающих размеров help может быть, и не придется... У меня, во всяком случае, на каком-то этапе знакомства в этим редактором сложилось впечатление, что имей я под рукой 1-2 странички подсказок... А почему - нет? Поскольку по <F1> vim вызывает файл help.txt из каталога $VIMRUNTIME/doc/ (значение $VIMRUNTIME можно уточнить по :set helpfile), почему бы его не "подменить", сохранив оригинальный help.txt и переименовав в help.txt свой файл? Несколько "варварский", но действенный способ. Изящнее будет вставить свой help в существующую систему помощи: путь к персональному help-у удлинится на пару нажатий клавиш, но зато в Вашем распоряжении всегда будут и свой файл и оригинальная система помощи. Не вдаваясь в тонкости работы со ссылками (tags) приведу краткий рецепт:



Предположим, Ваш файл называется myhelp.txt. Первой строкой в него вставим что-то вроде: *myhelp.txt* . Текст может быть любым - это всего лишь ссылка, на которую будет позиционироваться система поиска в help-файлах. В файле help.txt, в строке, например, второй (чтобы сразу была видна на экране) вставим указатель. Например: |$MyHelp| . Текст, опять-таки значения не имеет, а символ <$> поставлен на первую позицию лишь затем, что бы наша ссылка оказалась поближе к началу индексного файла tags. В индексный файл tags вносим строку:
$MyHelp   myhelp.txt   /*myhelp.txt*
Все элементы строки, надеюсь, понятны: первый - ссылка, второй - имя файла, третий - позиция в этом файле. Файл tags - сортирован по алфавиту и, если не хотите сортировать его заново, строку нужно поместить в соответствующее место. В данном случае между строками, $LANG.... и $VIM...

Готово. Запускаем vim, нажимаем <F1> и переходим по ссылке $MyHelp (<Ctrl-]> - по умолчанию, <\\> - если Вы воспользовались советом Свена, или двойной клик, если предпочитаете мышь).

Ну, а поскольку "эталоном" дружественности интерфейса долгое время считалась система выпадающих меню, то осталось посмотреть, как таковая реализуется в vim. Дистрибутив содержит файл menu.vim, активный по умолчанию только для графической среды. Для появления меню в консольном режиме во все тот же vimrc нужно вставить следующие команды:

source $VIMRUNTIME/menu.vim
set wildmenu
set cpo-=<
set wcm=<C-Z>
map <F9> :emenu <C-Z>

На месте <F9> может быть, разумеется, любая клавиатурная последовательность. Можно иметь личный меню-файл, тогда первая строка должна указывать на него. Меню как меню. Но это - vim, а, значит, его можно модифицировать. Файл menu.vim сравнительно невелик: менее 22К для версии 5.6. Часть его составляют функции, собственно и обеспечивающие функционирование системы меню. Поскольку программирование в vim нас на настоящий момент не интересует, то обратим внимание только на блоки, первым словом строк которых является команда menu с предшествующими ей уже известными модификаторами <a>, <c>, <i>, <n>, <o> и <v> в соответствии с существующими режимами. Плюс tmenu - для организации всплывающих подсказок (tooltips) в графической среде. Обычно строка такого блока выглядит следующим образом:

amenu  10.330  &File.&Close<Tab>:q  :confirm q<CR>

Элементы строки разделяются пробелами. В данном случае первый из них, amenu - команда, обеспечивающая появление данной позиции меню во всех (all) режимах. Второй - число, часть до точки которого определяет позицию в главном (горизонтальном), а после точки - в выпадающем (вертикальном) меню. Подобным образом лексемы до и после точки третьего элемента строки представляют собой текстовое содержание позиции меню. Пробелы и точки в составе этих лексем исключаются (quote) с помощью обратной косой черты (backslash). Допустим только один служебный символ - <Tab>. Ведущим (hot) символам в составе лексем предшествует амперсенд (&). Четвертый элемент - собственно команда, которую нужно выполнить. Просто и эффективно. Если команда предполагает редактирование или если Вам требуется дополнительный контроль над командами - не завершайте строки <CR>. Фактически, система меню просто вводит за вас необходимую "EX"-команду.

Таким образом vim может обретести интерфейс, проще которого (при заданном уровне функциональности) уже не будет. Все желаемые усовершенствования Вы можете сделать сами. Средств для этого - достаточно. Не стану утверждать, что путь к этой "простоте" так уж, извините за тавтологию, прост, но "нет ничего ценнее хорошего инструмента". В том числе и для программиста.

Многих возможностей vim, кстати, ни, первая ни вторая статья даже не касались. Вне рассмотрения остались интеграция с Perl и Python, программирование пользовательских функций, форматирование текста и многие другие темы, достойные отдельного обсуждения.

Конец


Vim: уже шесть!



Автор: Владимир Попов, popov_inm@yahoo.com
Опубликовано: 06.02.2002
Оригинал: http://www.softerra.ru/freeos/15764/

Итак, версия 6 популярного редактора vim вот уже три месяца в разряде стабильных и входит, практически, во все последние дистрибутивы Linux. На настоящий момент количество пользователей vim во всем мире приблизительно оценивается, как превышающее миллион. Vim используется программистами таких компаний как Sun, HP, MicroSoft.
Напомним, что встроенный язык программирования (помимо фактически стандартного для любого «приличного» редактора языка макрокоманд) и практически неограниченные возможности настройки с момента рождения сулили vim долгое и успешное развитие. Зачем же тогда эти новые версии, если редактор как инструмент конечного пользователя, может эволюционировать практически исключительно усилиями его сторонников, склонных в той или иной мере к программированию? И эволюционирует: количество расширений и советов (plugin's & tip's), предложенных пользователями через , измеряется сотнями, а количество «вовлеченных в разработку» все растет. Но и Bram Moolenaar, представьте, никак не «остепенится» (быть может, идеи, предложенные пользователями, оказываются слишком интересными). Налицо факт: автор «сотоварищи» окончательно «перепутались», и если в том, что касается кода самого редактора, последнее слово все-таки за Bram Moolenaar, то расширения vim (собственно, все содержимое архивов runtime) – создаются многими и многими участниками проекта. Время от времени Bram Moolenaar решает, что количество изменений и дополнений предыдущей версии превысили некоторый предел, и – появляется новая версия. Что же нового появилось в 6-й? Данный материал – попытка ответить на этот вопрос.

Одним из самых отмеченных vim-сообществом событий, происшедших между выходами 5-й и 6-й версий, было, издание в апреле 2001 года книги Steve Oualline. Это первая книга, посвященная исключительно vim – впечатляющий фолиант объемом свыше шестисот страниц, говорят, очень живо написанный. Так или иначе, то, что сотрудничество со Steve Oualline повлекло за собой переработку документации vim – очень отрадный факт. Предыдущие версии содержали, фактически, только «reference guide» – описание всех доступных при редактировании функций. Описание полное, но, если можно так сказать, «недружественное». Мало того, что список этих функций у vim и так чрезвычайно обширен, эти функции к тому же дублируют друг друга в разных режимах, наследуют «предков», ориентированных на алфавитно-цифровые терминалы, а иногда и просто избыточны для многих категорий пользователей. Теперь представьте себе эти более чем тысячу клавиатурных последовательностей, разбитых на режимы и отсортированных по алфавиту – ужас! Но теперь это – в прошлом. Не в том смысле, что «изъят» reference guide, а в том, что теперь документация содержит и «user manual» – 46 сравнительно небольших глав, каждая из которых посвящена одной из сторон работы редактора. Получить помощь в vim и раньше было просто: набрал help [что-то] – и получи ответ… Знать бы только, какие бывают эти «что-то» – вот в чем была трудность. Теперь, просмотрев USER MANUAL, можно смело браться за редактирование: если чего-то не вспомнишь – найдешь. А в качестве небольшого, но полезного дополнения – коротенький справочник в отдельном файле – quick reference. Bravo, Bram!

Теперь о «нововведениях» первого порядка. Тех, что, на мой взгляд, существенно дополнили функциональность vim.
Прежде всего это возможность вертикального деления окон (:vsplit или CTRL-W v). На первый взгляд – ничего особенного, тем более – в графической среде. Но это – только возможность. А как ею воспользуется программист с фантазией? Первое следствие – реализация нового режима: diff-mode. Набираем:
vimdiff file1 file2
(файлов может быть до четырех)… и появляются два вертикальных окна, в которых совпадающие строки – скрыты, а отсутствующие или несовпадающие – выделены цветом. С различиями допустимы все мыслимые операции: переходы, удаления, копирования и т.п. Пишущих под unix, трудно этим удивить: замечательная утилита diff тоже очень много умеет, но что бы сам редактор…
Обратите внимание на «скрытие» совпадающих фрагментов в окнах diff-mode. Видите символы «плюс» левее начала строки? Переводим туда маркер, нажимаем «пробел» – текст открылся. Набираем <za> – текст закрылся. Это еще одно новшество – folding («папки»): возможность скрывать несколько строк за одной. Придумано это, конечно, не для diff-mode, а для более рационального представления структурированных текстов (прежде всего программ). Принципов, по которым группируются скрываемые строки, шесть:


вручную; по левому отступу; по результату вычисления заданного выражения; по синтаксическим признакам; по совпадающим строкам (см. выше); с помощью маркеров.

Подробное описание заняло бы слишком много места, но полезность новшества сомнений не вызывает.
Следующее «приобретение» – приведение существовавшего и ранее механизма подключения пользовательских скриптов к популярной форме plugin's. Как программист, я не вижу большой разницы в том, загружается скрипт строкой в конфигурационном файле или помещением в каталог /plugin, но – веление времени. Отныне всякий скрипт, помещенный в каталог /plugin, будет загружаться при запуске vim автоматически.
А вот еще один каталог, которого не было в предыдущей версии – /ftplugin. Это тоже скрипты, но загружаться они будут в зависимости от типа открываемого файла. Раньше типом файла определялась только подсветка синтаксиса, а теперь – и некоторые особенности редактирования. Очень рационально.
Принято считать, что vim создан «программистами для программистов», и предназначен прежде всего для написания текстов программ. То ли «онтогенетическое родство» программистов и Сети сыграло свою роль, то ли слишком многие программисты стали web-master-ами, но посмотрите на новую возможность: vim позволяет редактировать файлы в кодировке UTF-8 – это при том, что еще не все browser-ы и mail-клиенты умеют ее читать!
Как часто адептам unix приходится слышать о «трудностях» работы с командной строкой… Ни авто-заполнение, ни неисчерпаемая «история команд» не убеждают оппонентов, предпочитающих всему на свете «drag'n'drop». И вот еще одна попытка убеждения от vim 6.0: теперь, набрав <q:>, <q\> или <q?> мы попадаем в command-line window (окно командной строки). В этом окне в нашем распоряжении последние 100 (или сколько указано в hystory) команд, фрагменты которых можно совершенно произвольно использовать для составления новой команды.
Использовали ли Вы когда-нибудь выделение вертикальных блоков? Очень удобно при работе с таблицами. Вот если бы еще блок можно было отмечать независимо от того, есть в нужной позиции символ или нет, то есть пустые позиции автоматически заполнялись бы пробелами… Ну, теперь – можно! Разрешаем «виртуальное редактирование» командой:
set virtualedit=block
Вместо block может быть insert, или – all: в зависимости от того в каком режиме нам это требуется, и – пожалуйста.

«Нововведениями» второго порядка, я бы назвал те, которые изменили функциональность vim не так существенно. Это, конечно, вопрос субъективный, так что, прошу не судить слишком строго.
На мой взгляд, это:



Easy Vim – режим после запуска с параметром -y. Очень напоминает notepad для windows; «гибкий» способ задания отступа слева – с помощью indent-скриптов, подобно тому, как это делается для подсветки синтаксиса; расширение множества символов, используемых для составления «шаблонов» поиска – очень полезно, если, конечно, удастся их запомнить; поддержка нескольких языков в сообщениях, меню и т.п. (не сочтите «славянофобом», но, по-моему, это не актуально: многословность vim аналогична многословности языков программирования - их же мы не пытаемся переводить. На мой взгляд, полезнее был бы перевод документации. Впрочем, русского среди предлагаемых languages все равно нет); редактирование по сети – теперь, кроме nfs это возможно и по протоколам rcp, ftp, http; коммуникации между двумя vim по сети (X Window, MS Windows); два новых типа буфера… время покажет; усовершенствована система печати – очень существенное дополнение; дальнейшее улучшение «портированных» версий: 5 из 10-ти улучшений касаются версий для ОС от MicroSoft. Количество пользователей этих версий, участвующих в vim-online по-прежнему растет; у quickfix появилось выделенное окно ошибок – использующие quickfix обязательно это оценят; а вот очень «приятная» мелочь: модификатор ("v", "V" или CTRL-V) между оператором и командой перемещения определят его область действия в символах, словах или блоках; еще одна «дань моде» – возможность выбора «цветовых схем»; появилось 8 новых команд для нормального режима, новые опции, связанные, прежде всего, с печатью и folding-ом, пару десятков новых команд режима командной строки.

«Нововведениями» третьего порядка я бы назвал те, которые не имеют отношения непосредственно к коду vim. Это упоминавшиеся plugin's, файлы описания синтаксиса, вспомогательные утилиты, файлы меню. Среди них есть очень существенные для оценки vim как целостного продукта: «третьестепенность» в данном случае не коррелирует с «не важностью».
Прежде всего это global plugin's:



explorer.vim – полнофункциональный файл менеджер, запускаемый командой :Explore (или любой клавиатурной последовательностью, «привязанной» к этой команде); gzip.vim – возможность редактировать архивированные gzip файлы; netrw.vim и rrhelper.vim, обеспечивающие редактирование по сети.

Количество скриптов, зависящих от типа редактируемого файла пока что на порядок меньше, чем количество файлов-описателей синтаксиса, но и оно впечатляет: 26. Хочется верить, что такое число языков программирования, редактируемых в соответствии с их особенностями, удовлетворит большинство пользователей.
Что касается файлов описания синтаксиса, то он еще более расширился, превысил три сотни и в этом смысле vim, кажется, вне конкуренции.
Из «новичков» каталога /tools можно отметить:

efm_perl.pl – скрипт, позволяющий использовать quickfix при работе с Perl, как будто это транслятор, а не интерпретатор; vimspell.sh – подключающий spellchecker к vim. (Правда, на мой взгляд, использовать непосредственно ispell все же удобнее.)

Отдельно стоит упомянуть menu.vim – этот файл «вырос» относительно предыдущей версии почти вдвое. Функциональность увеличилась соответственно. Все возможности vim он, конечно, не охватывает, но для первого знакомства – вполне достаточно. Полезен также при использования команд, потребность в которых возникает «раз в год».
Осталось упомянуть файлы описания цветовых схем. Их 12, но мне больше всего понравилась схема с незатейливым названием "default". Дело вкуса.

Полное описание отличий версии 6.0 можно найти в /doc/version6.txt. Но пусть Вас не удивляет размер этого файла – без малого 160 кб.

Таким вот образом, идеи и исполнение многих людей «вылились» в новую версию популярного редактора. А жизнь, между тем, не останавливается. Каталог скриптов (теперь – plugin's) на vim-online все пополняется и среди них есть довольно интересные. Например – EasyHtml.vim. Представьте: редактируем html-код, позиционируем маркер на tag-e, нажимаем <F2> – и в левой части экрана открывается узкое вертикальное окно, каждая строка которого – опция, допустимая к использованию с данным tag-ом. Выбрали – вставили. Синтаксис html подсвечивался в vim и ранее. И все это – в UTF-8. Такой «импровизированный» html-редактор вполне может составить конкуренцию специальным средствам web-редактирования, а в разряде консольных, быть может, окажется и вне конкуренции.
Или – colorize.vim. Вы никак не привыкните к переходам из режима в режим? Загрузите colorize.vim, поместите его в каталог /plugin, и цвет фона всегда укажет – находитесь Вы в режиме вставки (insert mode) или нет.
Еще один вариант spellchecker-а с использованием интерпретатора Ruby? Пожалуйста – spellcheck.vim.
А vimtips.vim будет показывать Вам при каждой загрузке по одному совету из базы данных все того же vim-online. Если Вы ему позволите, конечно.


Vito


Редактору vi -- программе и человеку



Компьютерное Обозрение #14, 12 - 18 апреля 2000


URL: 

Первоапрельское настроение, весенний авитаминоз и, наконец, бурный поток информации о программах-однодневках, ориентированных на потребительский рынок, -- вот неполный перечень причин, побудивших взяться за написание этой статьи. Ну а если серьезно, -- предмет нашей беседы представляет собой одно из самых ярких явлений технологической культуры, на протяжении двадцати лет существования которого неоднократно предпринимались попытки "примерить лавровый венок" текстового редактора всех времен и народов. Но... ни одна из существующих на сегодняшний день замечательных, удобных, красивых и каких угодно еще программ для редактирования текста не стала культовой. Тяжеловесные мастодонты, включающие в себя "почти все" возможности и использующие операционную систему "в качестве драйвера", могут быть массовыми, эффективными для решения ряда задач, им посвящаются пудовые книги в "конфетных" суперобложках. Многочисленные легковесные редакторы, соревнующиеся между собой в удобствах и минимализме, также завоевывают симпатии большого числа пользователей. Однако сообщество пользователей "остальных" (не-vi) текстовых редакторов обладает одним примечательным свойством -- здесь принято менять симпатии с невиданной легкостью, "...как перчатки". И только попавшие в "цепкие лапы vi" превращаются в настоящих ортодоксов: "нет редактора, кроме vi, и Билл Джой -- пророк его".

Слабонервным

следует удалиться...

Когда эта статья задумывалась, автор буквально попал в тупик -- ну что можно написать о программке размером всего неполных 260 KB. Даже и стыдно как-то говорить о такой чепухе, когда все, что меньше 10 MB, уже и за программу не считается. Но, как говорится, охота пуще неволи -- и вот, слушайте неправильную сказку о самых неправильных текстовом редакторе и его авторе-хакере. Неправильной сказка будет потому, что она страшно начинается...

Итак, vi. Верьте или не верьте, но это самый ужасный из всех кошмарных пользовательских интерфейсов, в котором совершенно обыденны команды типа "abbr dater^M^[:.!date+\%D^MkJA". Истинная история редактора vi (с трудом найденная в Usenet) утверждает, что его название представляет собой аббревиатуру имени и фамилии разработчика -- известного в узких кругах Vincent Idioth (Винсента Идиоса). Великий и ужасный Винс разработывал vi для очень специфичного круга пользователей -- для... считывателей перфокарт, ведь во времена "больших" ЭВМ настоящими пользователями компьютеров были именно они. Все эти суетящиеся люди, подносившие Самым Главным Устройствам колоды перфокарт, только думали, что Компьютер их замечает. На самом деле они были всего лишь носильщиками с невысокой надежностью, а их досадные ошибки раздражали Самые Главные Устройства... Винс первым понял это и создал по-настоящему дружественную программу для Старших Считывателей Перфокарт. Успех был ошеломляющим, и один из восхищенных Компьютеров сообщил своей знакомой IBM370, возглавляющей тогда еще не очень большую компанию Intel, о талантливом разработчике. Винса пригласили в Команду, и весь свой талант он приложил к разработке архитектуры микропроцессора 8086 -- настолько замечательной, что перенесшая несколько косметических операций IBM360, самая старая и уважаемая в компании IBM, безоговорочно приняла 8086 в качестве основного CPU для будущих персональных компьютеров. После двух особенно ярких успехов Винса на процессорном поприще (естественно, это 80286 и Pentium 60 MHz) уже все Компьютеры знали о Винсенте Идиосе, и его гений наконец-то востребовала Большая Политика (старик Cray X-MP, установленный в Самом Главном Месте, всегда уважал Винса и внимательно следил за его успехами). Дальнейшая судьба Идиоса, конечно же, стала Большой Тайной, но доподлинно известно, что Винсент добился впечатляющих успехов на посту главного PR президента Б. Клинтона...

Правда, некоторые ошибочно полагают, что vi на самом деле означает римскую цифру "шесть", а настоящим автором этой программы являлся знаменитый Демьен Торн, которому посвящен не менее знаменитый роман "Знамение". Однако в некоторых преданиях компьютеров дальнего Севера, например, утверждается, что роман был написан забытой полярниками на дрейфующей льдине PDP-11 с помощью самого редактора vi, так что вопрос первичности дьявола и vi до сих пор остается открытым.

Большой научный интерес представляет эпос Компьютеров-акынов, ведущих кочевой образ жизни. В нем присутствует несколько преломленный образ Винсента Идиоса, витиевато переплетающийся с мотивами индуизма, буддизма и Ислама. В частности, многие ученые, ежедневно работающие с vi, считают достоверными легенды о "Шестируком Винсе" -- по их мнению, именно такое количество рук и обязательная четырехпалость являются однозначно оптимальной комбинацией для нормального пользователя vi.

Самые веселые

в Silicon Valley

Сказки сказками, а компанию, одним из основателей которой по сей день является настоящий автор vi, заслуженно считают в Силиконовой Долине самой забавной. Особенно в Апрельский День Дурака (April Full's Day). Существует даже небольшой исторический материал, позволяющий уверенно утверждать, что богатые не только плачут. В 1985 г. в этой компании 1 апреля взяли, да и потихонечку вывезли... офис своего чуть ли не самого главного начальника. Пришел он на работу -- а работы-то и нет... В следующем, 1986 г., опять же в злополучном офисе "самого", 1 апреля возник из ниоткуда Фольксваген Жук. Ровно через год отметили автора vi, установив его Феррари на пьедестал перед основным административным зданием компании. В 1988 г. разгул достиг апогея (по советским меркам, конечно же) -- кабинет флагмана Компании был превращен в площадку для гольфа. 1 апреля 1989 г. смеялось до упаду все прогрессивное программистское человечество -- Компания объявила борьбу с ошибками в ПО (ошибка по-английски -- bug), для чего... упаковала свой административный корпус в целлофан, провела дезинсекцию и украсила получившееся в результате огромным транспарантом "NO BUGS". В последующие годы Компания запускала в аквариумы свои компьютеры и работала на них в водолазных костюмах, и веселилась, веселилась, веселилась...

И, надо сказать, что поводы для веселья у Компании находились всегда. Хотя бы потому, что "в миру" она известна под названием Sun, а в числе основателей ее значится один из самых ярких хакеров, очень много сделавший для "освобождения" и развития ОС Unix, -- Вильям Джой (William Joy). Да и забавной Sun считают не случайно -- несмотря на все заверения аналитиков и всю статистику рынка дела у Sun идут неплохо, а в своем (корпоративном) секторе ее позицию и авторитет можно считать незыблемыми.

Другой Билл

В программной индустрии "другой Билл" -- это титул. За ним кроются годы работы, заслуженное уважение в кругах профессионалов и, наконец, недюжинные способности в областях, весьма далеких от компьютинга. Хотя Биллу Джою не занимать способностей в своей профессиональной области -- ему мы обязаны существованием и всех версий Берклиевской ветки ОС Unix, и редактора vi, и сетевой файловой системы NFS, и архитектуры микропроцессоров семейства SPARC. К сожалению (с точки зрения журналиста, конечно же), Билл Джой -- очень скромный человек, и найти обширную информацию о нем трудно. Хотя принадлежащие его перу известные труды, в частности самое "свежее" эссе "Почему будущее не нуждается в нас" ("Why the future doesn-t need us"), позволяют достаточно точно представить себе облик настоящего хакера и просто веселого человека, "совсем другого Билла".

В 1975 г. один из авторов ОС Unix, Кен Томпсон, привез в свою альма матер -- Университет Калифорнии в Беркли, новейшую по тем временам версию Unix. Два талантливых студента, Чак Хэйли и Билл Джой, буквально влюбились в новую ОС и приступили к разработке компилятора с языка Pascal. Как и положено в Unix, для начала понадобилось сделать ОС "под себя", и Джой начинает искать подходящие технологические средства. В 1976 г. состоялась, возможно, определяющая всю дальнейшую историю встреча Джоя и британского программиста из Лондонского колледжа Королевы Марии (Queen Mary) Джорджа Колоуриса (George Coulouris), который привез в Беркли свой редактор em. По воспоминаниям Колоуриса, "...однажды за соседним терминалом оказался этот блестящий хакер -- студент Билл Джой, который сообщил мне, что пишет компилятор с Pascal. Я показал ему em, и он сказал: "симпатично, отделу технической поддержки наверняка понравится...". Впоследствии оказалось, что em, созданный с учетом условий маленького ВЦ колледжа, совершенно непригоден в огромной системе Беркли... Примерно через неделю я увидел Джоя за модификацией исходных текстов em... Затем на основе em Джой создал редакторы ex и vi...".

<
Билл Джой. 1985 г.

К началу 1978 г. Джой закончил и компилятор с Pascal, очень быстро получивший распространение, а для нового, растущего круга пользователей, понадобилась полнофункциональная версия инструментальной ОС. В марте 1978 г. Джой создает дистрибутивную магнитную ленту под названием "Unix Pascal System" (в описании указаны авторы -- Б. Джой, С. Грэхем, К. Томпсон). Первый BSD-релиз буквально взорвал университетский мир -- предельно простая и либеральная лицензия, текст которой занимал всего одну машинописную страничку, и стоимость полного дистрибутива $50 привели к тому, что Unix стала самой доступной ОС в мире.

К середине 1978 г. Джой усовершенствовал систему, предопределив еще большую ее популярность, -- работа над vi требовала поддержки самых разных алфавитно-цифровых терминалов (АЦТ), и "другой Билл" создает неотъемлемый элемент любой современной ОС Unix -- интерпретатор специального языка, позволяющий прикладным программистам "навсегда забыть" о различиях всевозможных АЦТ. Знаменитая подсистема termcap жива и здравствует по сей день в любой версии ОС Unix.

Начиная с этого момента, Джой создает "вторую редакцию BSD", которая чуть ли не мгновенно расходится тиражом более 70 экземпляров (не следует думать, что это мало -- в те времена на одной Unix-машине вполне могли работать несколько сотен пользователей). Джой самостоятельно берет на себя практически всю ответственность за "детище": он дает консультации по телефону, вносит изменения в дистрибутив в соответствии с отзывами пользователей и продолжает совершенствование ОС. Все это отнимает кучу времени, и когда в 1982 г. он получает предложение от группы энтузиастов, собирающейся создать компанию, специализирующуюся в проектировании рабочих станций для ОС Unix, Джой с радостью соглашается... Восход "солнца" начинается.

А что же vi?

Первый из них -- Путь, но им

редко пользовались для столь

ничтожной цели.

Р. Желязны. Хроники Амбера



Что же такого магического в этом редакторе двадцатилетней давности? Почему в любой конференции, посвященной любой версии ОС Unix, от вас обязательно потребуют знание этого редактора? Почему свирепый модератор конференции беспощадно прервет флейм по поводу недостатков vi? И наконец, почему никто из профессионалов не сможет кратко и быстро ответить на первый из этого короткого перечня вопрос "почему"?

Давайте попробуем разобраться по порядку. Для начала уясним, как выглядит (с точки зрения пользователя) vi. Даже такая простая попытка знакомства уже вызывает трудности -- vi выглядит... никак. Хотя, для преодоления испуга, можно попробовать привести пример более "дружелюбных" и удобных модификаций vi, оснащенных GUI (одна из удачных разработок vi-последователей, Elvis, доступна чуть ли не для всех ОС).

Второй вопрос, с ответом на который следует определиться раз и навсегда, трудно даже сформулировать. Скажем так: чем отличается работа по редактированию текста в vi (и отличается ли вообще) от аналогичных действий в более привычных, пользовательско-ориентированных редакторах? И здесь уместна (даже целесообразна) вполне допустимая аналогия со... стилем поведения хорошо знакомых экранных персонажей. Действия пользователя обычного ("дружелюбного") GUI-ориентированного текстового редактора напоминают... поведение персонажей Сталлоне -- вот он целится курсором мыши, нажимает на курок (извините, на кнопку), производит "выстрел". В vi все не так -- здесь пользователь, скорее, Коломбо, и даже если у него есть "пистолет" (курсор мыши), применить его, вероятно, не придется (короче говоря, забудьте его дома -- руки болеть не будут, это без шуток: туннельный синдром и vi -- понятия несовместимые).

Как бы продолжая отвечать на второй вопрос, хочется отметить самую важную особенность vi, подтверждающую точность аналогии "пользователь-Коломбо": vi -- командный редактор, требующий развитого алгоритмического мышления. Собственно говоря, основная прелесть vi как раз и заключается в этом "алгоритмизме", становящимся явным по мере освоения редактора. Пользователь vi не просто вынужден думать, он вынужден думать как программист (естественно, допустим и примитивный подход, но... то, что годится для Коломбо, Рэмбо подходит с трудом). Далее это утверждение будет понятно.



И наконец, последнее. vi -- важнейший интеграционный механизм ОС Unix, позволяющий достаточно "прозрачно" и эффективно создавать новые сущности при необходимости (и упорно мешающий желающим делать это просто так, нарушая основной закон Оккама). В этом утверждении кроются два важных следствия. Во-первых, несмотря на наличие нескольких очень мощных реализаций vi-совместимых современных редакторов, например для ОС Windows, одного только vi слишком мало, для полноценной работы желающим "юниксфицировать" Windows понадобится какая-либо программная "прослойка" -- имитатор Unix. Во-вторых, здесь кроется ответ на некоторые возмущенные письма читателей, содержащие следующие ключевые фразы: "...я программист...поставил Unix такой-то...в нем даже нет интегрированной среды разработки...удалил и вернулся к Borland C++ Builder...". Простонародным языком это переводится как "а слона-то я и не приметил...". Unix и есть интегрированная среда разработки, в которой vi играет далеко не последнюю роль.

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

повторитель команда ограничитель-указатель

Повторитель -- это число, указывающее, сколько раз должна быть выполнена команда. Например, передвижение курсора на начало третьего после текущего слова можно осуществить "по-Рэмбовски" -- удержанием стрелки клавиатуры и "выцеливанием" момента совпадения курсора и начала слова, а можно "по-Коломбовски": "3 W". Если в этом случае достоинства Коломбо неочевидны, то при необходимости отредактировать текст программы с шестого слова, начинающегося со строки ClassDef, Рэмбо проигрывает очевидно -- ему предстоит продолжительное "путешествие стрелками", Коломбо же ограничится "6/ClassDef".

Перечень команд vi достаточно обширен и включает в себя всевозможные перемещения курсора (побуквенно, пословно, построчно, по предложениям, по абзацам, с поиском подстроки, в начало/конец строки, в первый отображаемый символ строки и т. д.), команды изменения текста, копирования/вставки и пр. Запоминаются они достаточно просто, единственный способ их выучить -- пользоваться vi, а к числу полезных правил относится "регистровая инверсия" (если команда "z" выполняет определенное действие, то команда "Z" -- как правило, обратное действие). Например, если команда "x" удаляет символ "после" курсора (на экране -- под курсором), то "X" -- перед курсором.



Ограничитель-указатель (ОУ) используют многие команды vi ( в тех из них, что допускают одновременно наличие и повторителя, и ограничителя-указателя, последний является частью или параметром команды). Смысловое значение -- специфицирование объекта, над которым будет выполнена команда. В его роли обычно выступает... одна из команд перемещения курсора.

Среди всех команд vi особо выделяется одна -- "!", позволяющая передать указанный следующим за ней ОУ фрагмент текста на вход любой программы X Unix и заменяющая этот фрагмент результатом выполнения "X". С помощью "!" можно по-настоящему "тесно" интегрировать vi с остальными утилитами ОС -- в заботливых руках vi умеет, например, проводить проверку правописания "на лету" (с использованием внешней независимой программы-spellchecker), очень красиво форматировать обычный текст (достаточно использовать внешний форматизатор), искать и подставлять синонимы из лингвистической сети WordNet, заменять сложные математические выражения на каком-либо интерпретируемом языке на результат их вычисления и так до бесконечности...

Отдельный и очень выразительный командный язык подсистемы vi -- строкового редактора ex, позволяет с легкостью делать вещи, вообще немыслимые для всяких там "дружелюбных штучек". Аббревиатуры (":abbr имя расширение") дают возможность динамически (или статически) вводить сокращения для часто используемых фрагментов текста, например, определив ":abbr zz Университет Калифорнии в Беркли", в дальнейшем достаточно набрать в тексте слово zz, чтобы получить фразу "Университет Калифорнии в Беркли". Аббревиатуры можно "забывать", если они начинают мешать. Ну а для настоящих профессионалов vi/ex предоставляет просто фантастические средства -- команды ":map" и ":map!", 36 буферов для копирования/удаления фрагментов текста, 26 "закладок"...

Почему мы любим vi?

Два варианта исполнения vi v классический терминальный и более современный (Elvis), с возможностями рендеринга html-страниц

<


Скорее всего, потому, что vi заставляет думать -- а это, как известно, процесс хоть и утомительный, но весьма полезный: в ходе такой "примитивной" работы, как редактирование текста, vi иногда "подсказывает" удивительные по красоте, лаконичности и полезности решения, составляющие, по большому счету, основы мастерства под названием "программирование". И еще потому, что "ухоженный" vi позволяет смело "вывешивать" на экране кнопочку с надписью "Мой компьютер" -- этот компьютер действительно мой, потому что я "сделал его" для себя, под свои задачи, интересы, способности. Ну и, наконец, потому что мы любим ярких, талантливых и удачливых людей, таких, как Билл Джой -- автор культового редактора.


© Издательский Дом ITC. 1993-2002.

Все содержание, включая идеи оформления и стиль, являются объектом авторского права. Копирование и размещение материалов на других сайтах без письменного разрешения ООО "Издательский Дом ¦ТС" не допускается.


Влияние LaTeX


Взаимосвязь между TeXmacs и TeX/LaTeX гораздо более очевидна и бросается в глаза уже при беглом знакомстве с интерфейсом программы. Скажем, в меню мы обнаруживаем подменю , которое позволяет сделать выбор между такими вариантами, как , , , . Что это такое? Да не что иное, как стандартные классы документов LaTeX. Точно так же не вызывает сомнения происхождение большинства пунктов меню , через которое в документ можно включить заголовки разного уровня, а также такие окружения, как , , , , . Здесь же находим команды, управляющие расстановкой отступов между абзацами и разрывов страниц, которые также выдержаны вполне в духе идеологии LaTeX. В общем, сама собой напрашивается аналогия с таким текстовым процессором, как LyX, где доступ к командам LaTeX осуществляется именно с помощью подобных элементов пользовательского интерфейса. Подобно LyX, TeXmacs изначально ориентирован на создание структурированного документа, оформление которого в соответствии с выбранным стилем программа берет на себя. Единственное внешнее отличие (правда, говорящее, на мой взгляд, не в пользу TeXmacs) заключается в том, что здесь можно лишь вставлять различные элементы структуры, но нельзя, например, оформить уже набранный абзац в качестве заголовка того или иного уровня.

На самом же деле разница гораздо глубже, ибо TeXmacs - вовсе не графическая оболочка для LaTeX, а совершенно самостоятельный текстовый процессор. Поэтому наличие аналогов для распространенных команд LaTeX здесь не дань необходимости, а плод сознательного стремления автора создать программу, пригодную для подготовки документов полиграфического качества. Однако решается эта задача совершенно иными средствами. Об этом говорит уже самый формат документов TeXmacs (они имеют расширение .tm), который не имеет с LaTeX ничего общего, ибо основан на SGML. Что, в общем-то, и неудивительно: TeX/LaTeX - язык слишком своеобразный, и к тому же обладающий внутренним совершенством, так что его сложно использовать как основу для новых разработок. Соответственно, TeXmacs не нуждается в каких-либо внешних компиляторах: получив команду распечатать документ, он самостоятельно создает PostScript-файл, который потом и посылается на печать через Ghostscript. А коль скоро одна и та же программа управляет отображением текста на экране и его переводом в формат PostScript, не так уж сложно сделать результаты обоих процессов максимально близкими друг к другу. По этой причине TeXmacs, в отличие от LyX, обеспечивает не некую условную визуализацию, а настоящий режим WYSIWYG. В процессе редактирования не отображаются разве что разрывы страниц. Зато переносы расставляются тут же, причем с учетом выбранного языка.


Надо заметить, что используемый в TeXmacs алгоритм переносов также заимствован из TeX. Сам по себе данный факт не следует считать признаком тесной связи с этой издательской системой: просто файлы переносов TeX хороши тем, что распространяются свободно и дают вполне удовлетворительный результат. А использовать их ныне можно в любом визуальном редакторе - было бы желание. Так что в этом плане TeXmacs мог бы послужить образцом для всех разработчиков некоммерческих текстовых процессоров. Однако есть одна область, где TeXmacs по-настоящему зависим от TeX: для оформления текста в нем по умолчанию используются шрифты в формате METAFONT. Некоторые из них имеются в комплекте программы, но недостающие приходится брать из дерева каталогов TeX. Кроме того, использование технологии METAFONT, как известно, требует генерации растровых pk-шрифтов, для чего необходимы компиляторы, которые опять-таки не являются частью TeXmacs, а поставляются в составе дистрибутива teTeX. А вот к чему такой выбор приводит - об этом сказ особый.


Внешний вид и основные возможности


Как и большинство приложений, основанных на библиотеке Motif, Nedit управляется исключительно через меню: инструментальная панель отсутствует, что кому-то может показаться и недостатком. Мне - так нет, это компенсируется достаточным количеством комбинаций горячих клавиш и, главное, возможностью создавать собственные макрокоманды.

И так, основными элементами интерфейса редактора NEdit являются строка заголовка, главное меню, строка состояния (Statistic Line, по умолчанию отключена) и собственно рабочее поле.

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

Основные возможности редактора Nedit становятся ясными, если рассмотреть его главное меню. Оно насчитывает, за исключением непременного Help, семь пунктов, для быстрого вызова которых предусмотрена комбинация клавиш Ctrl+подчеркнутая_литера:

File (Ctrl+F); Edit (Ctrl+E); Search (Ctrl+S); Preferences (Ctrl+P); Shell (Ctrl+L); Macro (Ctrl+C); Windows (Ctrl+W).

Большинство действий, соответствующих подпунктам главного меню, также могут быть выполнены с помощью клавишных комбинаций (обычно Ctrl, реже Alt в сочетании с литерой и, иногда, клавишей Shift); что приятно, комбинации эти работают не только при латинской, но и при кириллической раскладке клавиатуры.

Рассмотрим содержание главного меню подробнее. Начиная с пункта первого -



Восстановление данных


Редактор vi работает с копией файла и после завершения редактирования или по команде сохранения содержание копии перемещается в основной файл. Если возникает аварийная ситуация при редактировании, vi сохраняет результаты работы для последующего восстановления. Обратите внимание : при возникновении подобной ситуации, vi посылает e-mail сообщение с инструкциями о восстановлении данных. Параметр -r означает восстановление. Например : команда vi -r vitalinfo используется для восстановления данных после возникновения аварийной ситуации при редактировании файла vitalinfo. После использования параметра -r для восстановления файла необходимо сохранить результат в существующий файл. Параметр -r действителен только один раз после возникновения аварийной ситуации.



Возможности встроенной подсказки.


Emacs предлагает пользователю богатые возможности встроенной подсказки (On-line Help). Чтобы вызвать подсказку нужно нажать C-h. В окне минибуфера появится сообщение:

C-h (Type ? for further options)-

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


Виды доступной справочной информации Emacs.

C-h a (command-apropos)


Выводит список всех команд, содержащих заданный образец. Например, после нажатия C-h a в ответ на запрос Command apropos (regexp): введите слово "macro" в окне минибуфера. На рис. Результат выполнения команды . показан вид окна редактора после выполнения данной команды. Выведен список всех команд, в которых встречается слово "macro". К тем же результатам приводит использование пункта Command Apropos... меню Help.


Результат выполнения команды command-apropos.

C-h k (describe-key)


После нажатия C-h k нажмите ключевую комбинацию, соответствующую какой-либо команде. Данная команда полезна при определении свободных комбинаций клавиш. К тем же результатам приводит использование пункта Describe Key... меню Help.

C-h t (help-with-tutorial)


Запуск интерактивной обучающей программы. Это дает возможность получить обзор свойств редактора Emacs.

C-h v (describe-variable)


Введите имя переменной Emacs, и система справки отобразит текущее значение переменной и любую доступную документацию.

C-h i (info)


Запустите программу информации, управляемую с помощью меню для просмотра документации по Emacs (см. рис. ). Строки со звездочками - пункты меню. Переместите курсор в один из пунктов, и нажмите клавишу Enter. Команда info - хорошая возможность познакомиться со структурой информационного браузера. Самая удобная команда информационного браузера - команда ?, которая выводит важнейшие односимвольные команды. Наиболее важная из них - символ l "last node", которая позволяет вернуться назад даже после выбора ряда узлов Информации (информационных разделов).



Вид экрана info.

Если версия Emacs не может найти файлы справки, добавьте следующую строку в файл .emacs, содержащую соответствующий путь (например, /pathname/emacs/info:

(setq Info-directory-list (cons "/pathname/emacs/info" Info-default-directory-list))
Ввод вопросительного знака после C-h равносилен запросу информации о самой системе справки. После того, как на экран будет выведена информация относительно встроенной подсказки, Emacs все еще будет ожидать ввода одного из ключей (кроме ?), который должен следовать непосредственно за C-h. Таким ключом для команды command-apropos был символ a, а для команды info - i.


Вставка


Команды для вставки "p" и "P". Различие между ними в положении вставляемого текста. Команда "p" вставляет текст из буфера после текущей позиции курсора, "P" - вставляет текст перед текущей позицией курсора. Аргумент count определяет количество повторов вставляемого текста.



Вставка элементов через Меню


Если версия редактора позволяет использовать меню, выберите пункт Insert Element из меню Markup. Появится еще одно меню со списком элементов, доступных для вставки в текущую позицию курсора. Если для вставки доступен только один элемент, то открывшееся меню будет состоять из одного пункта. Если допустимых типов элементов слишком много, то Emacs разобьет их на несколько дополнительных меню.

Чтобы вставить только отрывающий, или только закрывающий, тэг воспользуйтесь пунктом Insert Start-Tag (открывающий тэг) или Insert End-Tag.



Вставка текста


A Добавляет текст в конце строки. I Добавляет текст в начале строки. O (letter oh) Переключает в режим вставки текста и вставляет пустую строку перед текущей строкой. a Переключает в режим вставки текста и добавляет текст после курсора. Аргумент count определяет количество повторений введенного текста. i Переключает в режим вставки текста и добавляет текст перед курсором. Аргумент count определяет количество повторений введенного текста. o Переключает в режим вставки текста и вставляет пустую строку после текущей строки.



Вставка тэгов в существующий текст


При вводе нового текста удобно вставлять пару элементов, начальный и конечный тэги, а курсор помещать между ними. Ниже будет рассмотрено, каким образом можно внести разметку в уже существующий текст. Для этой цели предусмотрены команды sgml-tag-region, sgml-insert-tag и sgml-insert-end-tag, а также соответствующие комбинации клавиш.

Нажмите C-c C-r (команда Sgml-tag-region) или выберите пункт Tag Region меню Markup, после чего PSGML вставит открывающий тэг в начало блока(region) и закрывающий тэг в конец. (Помните, что понятие "блок" (region) аналогично понятию выделенного блока в других текстовых процессорах и текстовых редакторах, и означает фрагмент текста между последним началом выделения и текущим местоположением курсора.)

Некоторые версии редактора Emacs не выделяют цветом блок, поэтому легко забыть, где были поставлены маркеры начала и конца блока. При этом команда sgml-tag-region может вставить открывающий и закрывающий тэги совсем не там, где ожидалось. Чтобы избежать подобной ситуации, нужно помнить о комбинации клавиш C-x C-x (команда exchange-point-and-mark), которая позволяет быстрым перемещением курсора проверить границы блока.

Команды sgml-insert-tag и sgml-insert-end-tag позволяют вставлять открывающий и закрывающий тэги независимо друг от друга. Нажмите C-c < (или выберите Insert Start-Tag в меню SGML), чтобы вставить открывающий тэг. Закрывающий тэг вставляется через нажатие C-c / (или Insert End-Tag в меню SGML).



ВСТАВКА / УДАЛЕНИЕ / РЕДАКТИРОВАНИЕ СТРОКИ


^D Удалить символ Del Забой M-Del Удалить предыдущее слово M-x overwrite-mode Режим замены ^K Удалить конец строки / Удалить начало строки M-d Удалить слово и пробелы за ним M-^ Склеить строки delete-indentation



Встраивание команд оболочки


Для такого встраивания требуется редактирование меню Shell (через выбор Preferences - Default Settings - Customize Menu - Shell Menu). Выбрав соответствующие пункты приведенной последовательности, вызываем панель Shell Commands (рис. 3) и выбираем из списка доступных команд пункт New. Подобно тому, как это проделывалось для макросов, заполняем поля Menu Entry, т. е. имени команды (оно также может быть иерархически построено и привязано к языковому режиму меню), Accelerator (для закрепления комбинаций клавиш) и Mnemonic (для выделения литеры быстрого вызова).

Рис. 3. Панель Shell Commands.

Затем определяемся с входными элементами команды в строке переключателей Command Input. Здесь можно предписать команде исполняться либо для выделенного фрагмента (selection), либо для текущего окна (window), либо для каждого элемента документа (either), либо ни для чего (none). Объяснить смысл каждого переключателя в общем виде я несколько затрудняюсь, но на практике смысл их для каждой конкретной команды обычно достаточно прозрачен.

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

Следующая ниже группа переключателей при установке в положение On предписывает:

замещать элемент ввода элементом вывода (Output replace input); сохранять текущий файл перед выполнением команды (Save file before executing command); перечитывать его после выполнения команды (Re-load file after execute command).

Определившись и с этим, можно непосредственно задавать команду вместе со всеми требуемыми параметрами и их значениями. Это делается в поле ввода команды (Shell Command to Execute), точно так же, как в командной строке консоли или терминального окна.

Однако можно и набрать команду непосредственно в поле редактирования NEdit, после чего просто скопировать ее (с помощью мыши или клавишных комбинаций) в поле ввода команды. Преимущество последнего способа в том, что предварительно (с помощью меню Shell - Execute Command Line) можно проверить работоспособность команды, поскольку она запускает на выполнение ту строку текущего файла, на которой зафиксирован курсор (разумеется, если эта строка имеет смысл и синтаксически правильна). В противном случае в теле документа автоматически появится сообщение об ошибке. Например:

netscape An error occurred running /usr/lib/netscape/netscape-communicator.


Или даже полная справка по использованию команды, как в случае

ispell Usage: ispell [-dfile | -pfile | -wchars | -Wn | -t | -n | -x | -b | -S | -B | -C | -P | -m | -Lcontext | -M | -N | -Ttype | -V] file

Руководствуясь этими сообщениями, создаваемую команду можно отредактировать до работоспособного состояния. Можно, разумеется, и просто скопировать успешно запускаемую команду из окна терминала.

Завершив создание новой команды, принимаем введенные изменения (при помощи экранной кнопки Apply) или выходим из режима редактирования Shell, нажав OK. Затем, проверив правильность созданной команды, сохраняем ситуацию (через Save Defaults) для использования в дальнейшем.

Не могу поручиться, что я внятно изложил возможности NEdit по созданию и редактированию макрокоманд и команд оболочки. И потому попробую проиллюстрировать эти возможности на конкретном примере - создании серии связных директив, превращающих NEdit в самодельный HTML-редактор.


Встречаем XSLT


Прежде всего следует указать, что наш документ использует стилистику XML и импортировать пространство имен XML:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

...

</xsl:stylesheet>

Далее, основным элементом, который мы будем использовать, является xsl:template match. Этот элемент вызывается всякий раз, когда имя xml-узла совпадает со значением атрибута xsl:template match:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/"> <!-- оператор '/' взят из XPath и ассоциируется с корневым элементом --> <!-- выполнить какие либо действия с вложенными узлами --> </xsl:template>

</xsl:stylesheet>

Внутри элемента xsl:template match следует указать вложенные узлы элементом: xsl:value-of select. Давайте для начала создадим xml-документ, содержащий некоторую информацию:

<!-- hello.xml -->

<hello> <text>Hello World!</text> </hello>

Так должно выглядеть xslt-преобразование, которое вынимает узел text из корневого элемента (hello):

<!-- hello.xsl --> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/"> <html> <head> <title> <xsl:value-of select="//text"/> </title> <!-- в данном случае '//text' это: 'hello/text', но, поскольку я ленив сам по себе, я делаю это проще, используя выражение XPath --> </head>

<body> <p> Содержимое узла <b>text</b> корневого элемента: <b><xsl:value-of select="//text"/></b> </p> </body> </html> </xsl:template>

</xsl:stylesheet>

В результате получится следующий HTML-документ:

<!-- hello.html -->

<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8">

<title>Hello World! </title> </head> <body> <p> Содержимое узла <b>text</b> корневого элемента: <b>Hello World!</b> </p> </body> </html>



Встроенные функции


length(arg) - Функция длины arg. Если arg не указан, то выдает длину текущей строки.

exp(),log(),sqrt() - Математические функции экспонента, логарифм и квадратный корень.

int() - Функция целой части числа.

substr(s,m,n) - Возвращает подстроку строки s, начиная с позиции m, всего n символов.

index(s,t) - Возвращает начальную позицию подстроки t в строке s. (Или 0, если t в s не содержится.)

sprintf(fmt,exp1,exp2,...) - Осуществляет форматированную печать (вывод) в строку, идентично PRINTF.

split(s,array,sep) - Помещает поля строки s в массив array и возвращает число заполненных элементов массива. Если указан sep, то при анализе строки он понимается как разделитель.



Существует много мест, где можно


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

Ввод и удаление текста


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

Если при наборе текста вы дошли до конца строки и продолжаете печатать, то в конце строки появится знак перехода на следующую строку. В качестве такого знака перехода некоторые версии Emacs используют обратный слеш ("\"), но это может быть и какой-либо другой знак (например, стрелка).

Returning to the Spouter-Inn from the Chapel, I found Queequeg ther q\ uit alone; he having left the Chapel before the benediction some time.

Знак перехода не означает реального перехода на следующую строку. Данный знак сигнализирует о том, что редактируемая строка имеет слишком большую длину, и поэтому не помещается в окне (или на экране).

Конечно, можно каждый раз нажимать Enter, чтобы начать печатать с новой строки. Однако, многие текстовые процессоры автоматически вставляют символ перевода каретки при приближении редактируемой строки к правой границе. Для того, чтобы задействовать в Emacs аналогичную опцию нужно нажать M-x и набрать в командной строке auto-fill-mode. Данная команда включает режим "Fill", что отображается в строке состояния словом "Fill"(см. рис. Строка состояния Emacs.).


Строка состояния Emacs.

Если по каким-либо причинам, например при редактировании текстов программ, нужно отключить режим "Fill", повторите вышеописанную процедуру. Т.е. в командной строке (M-x) нужно набрать auto-fill-mode, которая работает в режиме переключателя: если "Fill" был включен, то команда auto-fill-mode его выключит, и наоборот.

Чтобы изменить положение правой границы (или, оперируя терминами Emacs, "fill column"), нажмите C-u, затем введите номер позиции, соответствующей новой ширине текста и нажмите C-x f.

Чтобы удалить символ в позиции курсора нажмите клавишу Delete. Это должно сработать, если нет, то используйте комбинацию C-d. Клавиша Backspace должна функционировать нормально.


ПРИМЕЧАНИЕ:При работе с UNIX-системой с PC через программу-эмулятор терминала клавиша Delete может работать не так, как ожидается. Например, при ее нажатии может удаляться символ слева от курсора. В этом случае использование комбинации C-d является вполне оправданным.

Чтобы удалить фрагмент от курсора до конца строки нажмите C-k (kill-line - неудачное название для команды, которая удаляет не всю строку, а только ее часть).

Другое замечательное свойство Emacs - это возможность переформатирования параграфа. Например, в приведенном ниже фрагменте была удалена часть текста в третьей строке, поэтому данная строка заполнена наполовину:

He made me a present of his embalmed head; took out his enormous tobacco wallet, and groping under the tobacco, drew out some thirty dollars in silver; then spreading them on the table, and mechanically dividing them into two equal portions, pushed one of them towards me, and said it was mine.
Чтобы переформатировать параграф, нужно поместить курсор в какую-либо строку параграфа и нажать комбинацию M-q (fill-paragraph). Того же результата можно достичь, если выбрать в меню Edit пункт Fill. Результат будет выглядеть следующим образом:

He made me a present of his embalmed head; took out his enormous tobacco wallet, and groping under the tobacco, drew out some thirty dollars in silver; then spreading them on the table, and mechanically dividing them into two equal portions, pushed one of them towards me, and said it was mine.
Рассмотренная выше ситуация типична при работе с текстовыми процессорами, но никак не для редакторов. Большинство редакторов были разработаны для программистов, оперирующих строками, а не параграфами. fill-paragraph обрабатывает фрагмент текста, заключенного между двумя пустыми строками. Если переформатированный фрагмент не удовлетворяет требованиям, действие можно отменить нажатием C-_ (команда UNDO).

Иногда удобно добавить в текст информацию из уже существующего файла. Чтобы это реализовать, поместите курсор в нужное место и нажмите C-x C-i. В окне минибуфера появится строка:

Insert file: c:\pathname\
и введите в окне минибуфера имя файла.
Если файл находится не в текущей директории, то используя Backspace сотрите предложенный путь и наберите наименование той директории, где лежит файл.


Ввод команд PSGML


Как и любые другие команды Emacs, команды PSGML могут быть запущены из командной строки (через нажатие M-x), через нажатие комбинации клавиш или из меню, если, конечно, используемая версия редактора поддерживает меню.

Комбинации клавиш, как правило, предоставляют самый быстрый способ запуска. Большинство комбинаций клавиш в SGML имеют вид, аналогичный соответствующим комбинациям, выполняющим в режиме простого редактирования похожие функции. Например, в обычном Emacs, M-f перемещает курсор на слово вперед, а M-b перемещает курсор на слово назад. В главе "Перемещение курсора в режиме SGML" будет показано, что комбинации клавиш C-M-f и C-M-b перемещают курсор на элемент вперед и назад соответственно (если, конечно, подобные комбинации клавиш реализованы в используемой версии Emacs). Напомним, что некоторые версии Emacs допускают нажатие клавиши Alt вместо Escape для имитации метаклавиши.

PSGML добавляет в Emacs шесть новых меню: SGML, Modify, Move, Markup, View, DTD. Ниже будет показано, что большинство пунктов меню имеют альтернативный вызов через комбинации клавиш.



Ввод текста.


Команда sgml-insert-element - одна из наиболее часто используемых команд при работе с PSGML. При вводе этой команды из командной строки (или при выборе пункта меню Insert Element из меню Markup, или при нажатии комбинации C-c C-e), PSGML попросит ввести имя элемента в строке минибуфера:

Element:

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

После ввода имени вставляемого элемента, PSGML вставит открывающий и закрывающий тэги, а также, если это необходимо, вложенные элементы. Для реализации данной функции необходимо, чтобы переменным sgml-balanced-tag-edit и sgml-insert-required-elements присвоены ненулевые значения (подробнее см. "Установка значений переменных PSGML"). Если нужно выбрать вставляемый элемент из нескольких аналогичных, PSGML вставит соответствующий SGML-комментарий. И последнее, PSGML установит курсор в конце отрывающего тэга, чтобы можно было сразу начать ввод информации.

Пример. Допустим, нужно вставить рисунок в документ DocBook. Нажмите C-c C-e, В окне минибуфера появится подсказка

Element:


Нужно ввести название элемента. Введите fi и нажмите Tab. Редактор должен допечатать оставшиеся символы, и в результате получится слово "figure". Нажмите ввод. PSGML вставит в текущую позицию курсора текст следующего содержания

<figure> <title></title> <!-- one of (blockquote informalequation informaltable literallayout pr\ ogramlisting screen screenshot graphic synopsis cmdsynopsis funcsynopsis link o\ link ulink) --> </figure>

Обратите внимание, как именно выглядит строка комментариев, вставленная после тэгов заголовка и сообщающая о необходимости вставки одного из перечисленных элементов. Комментарий получился слишком длинным и не уместился целиком на одной строке, поэтому он разбит на несколько кусков, в конце которых стоят символы переноса - обратный слеш "\". Это чисто технический перенос, необходимый для облегчения визуального восприятия. Чтобы убедиться, что это одна строка, поместите курсор в начале комментария и нажмите C-k (команда kill-line).


В этом режиме все, что набирается на клавиатуре отображается на экране терминала и запоминается в буфере редактора.

Нет возможности осуществлять операции редактирования текста, за исключением стирания последнего набранного символа (с помощью комбинации клавиш < Control-H> ).




< Return> - создает пустую строку и переводит курсор в ее начало.

< Control-H> - уничтожает последний введенный символ (это действие не отображается на экране до выхода в командный режим).

< Control-[> или клавиша < Esc> - переводят редактор в командный режим.

В режиме ввода текста стрелочная клавиатура НЕ РАБОТАЕТ!



Ввод/вывод в системе UNIX и локализация.


   Когда-нибудь здесь будет небольшая статься о вводе/выводе в системе UNIX. :-) Пока же читатель может посмотреть кучу специальной литературы. Например :

Робачевский А.М.

"Операционная система Unix"

СПб. Издательство BHV

Санкт-Петербург, 1997

ISBN 5-7791-0057-8

Andrei Robachevsky

Federal Centre RUNNet

e-mail:

phone: +7-812-2388598

fax: +7-812-2327622

    Здесь же кратко коснемся только проблем локализации ввода/вывода UNIX.

    Итак, цитируем :

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

Обычный файл ( regular file )

Каталог ( directory )

Специальный файл устройства ( special device file )

FIFO или именованный канал ( named pipe )

Связь ( link )

Сокет

    Продолжаем цитировать :

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

    Из этого следует, что в общем случае   не существует никакого способа узнать не только кодировку, но даже тип

данных, содержащихся в файле.

    В принципе, существуют два основных способа определения содержимого файла (набора/потока данных) :

In-band - свединия о кодировке содержатся внутри

файла

Out-band - сведения о кодироке содержатся снаружи, где-то в другом месте.

    Самый известный In-band способ - . Здесь кодировки и вид содержимого описываются явно, в полях Content-Type: text/plain; charset=koi8-r и Content-Transfer-Encoding: base64. Концепции MIME (описание типа) используются также в HTTP ().

    Также In-band сведения о содержимом и кодировках содержатся, например, в файлах Microsoft Word .DOC(с включенными OLE объектами), Windows .EXE и .DLL (ресурсы), e.t.c. К In-band методам можно отнести и разнообразные языки разметки (MARK-UP


Languages), например тэг <LANG=> языка HTML 4.0 и XML или спецификацию языка в файлах .RTF.

    Теперь об Out-band (внешних) способах. К сожалению, в UNIX

поддерживается простая однопотоковая концепция организации файла. Нет никаких ресурсных вилок, как в MacOS HFS, нет Meta Info как в OS/2 HPFS. Файл - это просто набор данных, имеющий имя (ну, еще даты создания/изменения/доступа, ну еще права доступа : rwxr-xr-x ). Без всяких "расширенных атрибутов".

    Проблема зашла так далеко, что в UNIX

появилась специальная утилита file, которая "эвристическими методами" пытается определить тип содержимого.

    Единственный более-менее распространенным способом определения типа файла является расширение, то есть несколько конечных символов в имени

файла после точки : ".txt". На самом деле, никакого стандарта на "расширения" в UNIX нет, так как точка : "." является допустимым символом имени. Так что вполне могут встретится имена типа "file.doc.tar.gz", "file............txt" или ".profile".

    Тем не менее, многие программы ориентируются именно на "расширения", особенно при переводе в MIME, например для простановки типа в HTTP ():



(/usr/local/etc/http/mime.types)

(sqiud-1.1.2x/include/mime.table)

(/usr/local/etc/lynx.cfg [SUFFIX])

    Насколько ненадежен этот метод, можно судить например по тому, что текстовый (!) файл "ls-lR.ftp.anu.edu.au" упорно интерпретируется как "audio/basic" и некоторые программы пытаются его "сыграть" ;-))

    Тем не менее, иногда этим можно пользоваться, например задавая определения типов (и многие другие атрибуты) для файлов текущего

каталога, в файле ./.htaccess от apache

( модуль mod_mime ):

AddType text/plain text

AddEncoding    x-compress    Z

AddIconByType        (TXT, icons/text.gif)         text/plain

AddIconByEncoding  (COMP, icons/comp.gif) application/x-compress

e.t.c.
<


    Ну чем не Out-band метод ? Правда доступ к файлу в таком каталоге осуществлять придется только через HTTP от apache. ;-)

    Но продолжаем цитировать :

    Каталог: С помощью каталогов формируется логическое дерево файловой системы. Каталог - это файл, содержащий имена находящихся в нем файлов, а также указатели на дополнительную информацию - метаданные, позволяющие операционной системе производить операции над этими файлами. Каталоги определяют положение файла в дереве файловой системы, поскольку сам файл не содержит информации о своем местонахождении.
    Файл в файловой системе имеет некоторое имя - последовательность символов. Когда-то считалось, что имя файла может состоять только из 7-bit ASCII символов. В случае же использования национальных символов для имени файла возникают проблемы. И в стандарте POSIX решения нет.

Существующие способы определения кодировки символов в имени файла :

Файловая система поддерживает UNICODE, например в UTF-8 или UCS-2 :

JOLIET

NTFS

EXT2FS (Linux)

Кодировка явно указывается (не POSIX

! ) :

При монтировании файловой системы :

Linux mount :

$ mount -t vfat -o umask=002,noexec,gid=100,codepage=866,iocharset=koi8-r /dev/hdb1 /mnt

FreeBSD mount : /etc/fstab

/dev/sd0s1        /dos/c   msdos    rw,-W=koi2dos,-L=ru_RU.KOI8-R  0  0

детальное описание опций -W и -L смотрите в mount_msdos (8)

SAMBA :

client code page = 866

character set = koi8-r

??

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

    Специальный файл устройства обеспечивает доступ к физическому устройству. В UNIX различают символьные

(character) и блочные (block) файлы устройств. Доступ к устройствам осуществляется путем открытия, чтения и записи в специальный файл устройства.
    Блочные файлы устройств позволяют организовать доступ к физическому устройству точно также, как доступ к обычному файлу. И точно также, как при работе с обычным файлом, интерпретация содержимого остается задачей программы. Никакой информации о кодировках содержимого не поддерживается.



    Более неприятна ситуация с симольными

(character) устройствами, где также совершенно не существует определения character set. Другими словами, стандартными

средствами UNIX (POSIX) невозможно ни определить

текущую, ни установить необходимую кодироку символьного устройства (например, терминала).

    Стандартных средств изменения и определения кодировки нет ни для "настоящих" (подключенных через ASYNC-port) терминалов , ни для эмуляторов консоли (SCO, BSD или LINUX console), ни для окна xterm в X-Windows (работающих через псевдотерминалы /dev/pty). Понятий "кодировка"

или "набор символов" нет ни в процедурах управления терминалом : termios (POSIX), ни в базах описания терминалов termcap и terminfo, ни даже в "высокоуровневых" библиотеках управления терминалом curses и ncurses. (TODO: посмотреть slang  ).

    Точно также, нет указателя Charset

у потоков STDIN, STDOUT, STDERR.

* ПРИМЕЧАНИЕ: В настоящее время наметилось несколько путей решения этой проблемы:

login class расширения BSD ( не POSIX

! )

   part 2.13

   (или то же самое, через Linux PAM)

CHARSET-параметр протокола telnet. .

Новые переменные termacp/terminfo,

определяющие charset.

"Последовательности переключения" ISO-2022 у xterm

Реализация консоли с поддержкой UNICODE (в виде UTF-7, UTF-8). .

   FIFO или именованый канал - это файл, используемый для связи между процессами. FIFO впервые появились в System V UNIX, но большинство современных систем поддерживают этот механизм.
    Не вдаваясь в тонкости отличий System V и BSD, скажем о FIFO следующее :

Именованный канал имеет имя. Информацию о именах смотри в пункте .

Функционально FIFO весьма близок к .

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


    Собственно, на имя связи

и на ее содержимое распространяются те же правила, что и на имя в .

  Сокет. Сокет представляет собой двусторонний канал обмена данными между процессами и является одним из механизмов IPC (Inter-Process Communication).
    Механизм сокетов был разработан для унификации межпроцессорного взаимодействия и должен был работать независимо от :

Реального механизма передачи информации (IP, IPX, X.25, e.t.c. )

Формата и схемы адресации (формата адресов) объектов

Сетевого или локального характера взаимодействия

    Для описания характеристик взаимодействия было введено понятие коммуникационный домен (communication domain). Сокеты создаются в рамках определенного коммуникационного домена, и, кроме прочих характеристик, имеют соответствующее имя

(связываемое с сокетом при помощи вызова bind()

).

В коммуникационном домене AF_UNIX сокет связывается с определенным именем файла

в файловой системе. Соответственно, на имя этого файла распространяются все правила именования в .

В коммуникационном домене AF_INET имена являются именами хостов Internet, на которые распространяются правила "Domain names - concepts and facilities".

В коммуникационном домене AF_NS (куда входят IPX/SPX) - ???.

    Не вдаваясь в подробности функционирования Socket API, рассмотрим лишь отношение сокетов и методов кодирования передаваемой информации.

    Сокеты (stream socket), после установления соединения предоставляют процессам чистый 8-ми битный канал обмена информацией (Out-Of-Band данные не рассматриваются). В принципе, пользователь может передавать данные в совершенно произвольном формате. Однако, существуют некоторые "устоявшиеся правила" организации протоколов обмена данными (IPC).

   1. Разделять управляющую информацию и пользовательские данные. Как сказано в "Srtings for humans, Protocols for computers".

    2. Текстовый



управляющий протокол - это "правильная вещь". (c) Eric S. Raymond, разработчик . Для облегчения разработки и сопровождения протокола, управляющие команды и ответы сервера лучше сделать в виде текстовых строк.

   3. Хорошо разработанный протокол содержит в себе созможности Handshake

(или Negotiation)

Language Negotiation, например, поля

    Accept-Language:

        Content-Language:

Type & Charset Negotiation, например, поля

    Accept:

    Accept-Charset:

        Content-Type: text/plain; charset=

        Content-Type: text/html; charset=

Transfer Encoding Negotiation

    Accept-Encoding:

        Content-Transfer-Encoding:

См. например проекта .

Если у вас имеются каие-либо дополнения или исправления, пишите

--

-=AV=-

Содержание

Last change : 11-01-2000