Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
VPS/VDS серверы. 30 локаций на выбор

Серверы VPS/VDS с большим диском

Хорошие условия для реселлеров

4VPS.SU - VPS в 17-ти странах

2Gbit/s безлимит

Современное железо!

Бесплатный конструктор сайтов и Landing Page

Хостинг с DDoS защитой от 2.5$ + Бесплатный SSL и Домен

SSD VPS в Нидерландах под различные задачи от 2.6$

✅ Дешевый VPS-хостинг на AMD EPYC: 1vCore, 3GB DDR4, 15GB NVMe всего за €3,50!

🔥 Anti-DDoS защита 12 Тбит/с!

Назад Содержание Вперед
Вниз

Введение в POSIX'ивизм

(C) Алексей Федорчук, 2005
Опубликовано на сайте LinuxCenter

Глава 16. Текстовые редакторы

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

Содержание

Вводные замечания

Пользователи Windows в качестве универсального средства для работы с текстами в большинстве случаев используют программы, именуемые word-процессорами. Однако в POSIX-системах именно редакторы - традиционный инструмент всех Unix-систем.

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

Разделение редакторов на командные и меню-ориентированные, отчетливо выраженное для консольных представителей этого семейства, несколько сглаживается при переходе к работе в графическом режиме. Потому что в Иксах даже типичные командные редакторы обретают часто (при соответствующих опциях сборки) элементы визуального интерфейса. Однако командная сущность gvim или kvim не меняется от того, что они обретают меню в стиле Gtk или KDE, соответственно. А, например, NEdit являет собой вполне гармоничное сочетание командного и визуального стилей редактирования - хотя без соответствующих настроек об этом можно и не догадаться.

Текстовые редакторы обладают рядом преимуществ перед процессорами - по крайней мере, в той области, для которой они предназначены, то есть при создании и обработке текстов. Главное из них - это универсальность. Поскольку выходной материал в редакторах представляет по определению чистый ASCII-файл, он может быть прочитан в любой среде и на любой платформе, не требуя специальных конвертеров (и, тем более, программ, в которых этот материал создавался). Что особенно важно для документов с символами кириллицы. Кроме того, с помощью редакторов можно готовить html-страницы, осуществлять верстку документов для TeX, править конфигурационные файлы, писать исходники программ и многое другое.

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

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

Следует заметить, что большинство традиционных Unix-редакторов принадлежат к командному классу. Среди его представителей, с одной стороны, - наиболее простые и легковесные (с точки зрения требований к ресурсам) программы. К ним принадлежит, например, редакторы nano и ee, описанные в ближайших разделах.

С другой стороны, именно командными редакторами являются наиболее мощные инструменты комплексной обработки текста, такие, как vi (вернее, его современная модификация - vim) и emacs.

Наконец, существует категория редакторов, занимающих по своей функциональности промежуточное положение между мощными средствами типа vim и emacs, и совсем простыми редакторами класса nano. Среди них - типично командный редактор для консоли - joe.

Чем же руководствоваться при выборе редактора? Как известно, всякому овощу - свой фрукт. И если стоит задача достижения максимальной функциональности - с emacs или vim мало кто в состоянии конкурировать (не зря же emacs удостоился звания операционной среды - того же титула, который некогда присвоила Microsoft своему перлу, Windows 3.x). При потребностях более скромных (и преимущественно - не программерских) есть смысл присмотреться к редакторам промежуточной группы. А вот если основная задача выбираемого редактора - правка конфигурационных файлов, возникает вопрос - а почему бы не ограничиться программами легчайшей весовой категории?

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

Поэтому в настоящей главе будут кратко охарактеризованы простейшие редакторы nano и ee, выполняющие роль инструментов конфигурации во многих дистрибутивах Linux и в BSD-системах-соответственно. Столь же кратким будет введение в работу с vim - потому что это то средство, которое гарантированно будет под рукой в любой Unix-системе. И, наконец, подробному рассмотрению подвергнется joe - самый мощный из консольный редакторов промежуточной категории.

Nano: входной билет к мир редакторов

Редактор nano вполне может сыграть роль своего рода амортизатора для начинающего пользователя. Да, это не emacs, и даже не joe. Но с задачей конфигурирования справляется успешно. А в освоении и`обращении - прост, как грабли. Не случайно во многих Source Based дистрибутивах он предлагается в качестве общесистемного. В Gentoo Linux же, где при установке необходимость в ручном редактировании конфигурационных файлов возникает весьма часто - так это просто единственный редактор, доступный на стадии инсталляции системы.

Итак, представляю: редактор nano, или, точнее, GNU nano. Официальным местопребыванием имеет сайт http://www.nano-editor.org. Генетически связан с pico - текстовым редактором, входящим в почтовый пакет pine, но, в отличие от него, распространяется на условиях лицензии GPL (и, что немаловажно, не тянет за собой почтовой системы - возможно, не всем нужной). Характеризуется авторами как маленький и дружелюбный. Что в целом соответствует истине.

Редактор nano чисто консольный и запускается из строки шелла одноименной командой, можно - с указанием имени файла, существующего или нового (в последнем случае, как обычно, файл с таким именем будет создан). Поддерживается несколько опций командной строки, как то: -T #, устанавливающей величину (в символах) табуляции, -i, включающей автоматические отступы, -w, отключающей режим переноса строк на границе экрана (что очень важно при редактировании конфигурационных файлов), и так далее. Полный их список можно посмотреть посредством

$ man 1 nano

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

Область между титульной строкой и зоной подсказки - рабочая, в ней осуществляется ввод и редактирование текста. В nano предусмотрен (в отличие, например, от vi и vim) только один режим работы. То есть текст вводится обычным образом, а для вызова команд предусмотрены управляющие последовательности.

В nano существует два вида управляющих последовательностей - Control+литера и Meta+литера. Посредством первых (частично дублируемых функциональными клавишами F1-F12) осуществляется редактирование текста и операции с файлами. Meta-последовательности предназначены для изменения настроек редактора (тот же результат достигается и опциями командной строки).

Напомню, что на клавиатуре PC роль Meta-клавиши выполняет обычно нажатие клавиши Alt (в некоторых раскладках - конкретно Alt'а правого, или, напротив, левого), или нажатие и отпуск клавиши Escape.

Control-последовательности - следующие (в скобках - дублирующие функциональные клавиши и, иногда, Meta-последовательности):

  • Control+G (F1) - вызов меню полной подсказки;
  • Control+X (F2) - выход из программы;
  • Control+O (F3) - запись текущего файла;
  • Control+R (F5) - вставка файла в текущий;
  • Control+W (F6) - поиск текста в текущем файле;
  • Control+(F14 или Meta+R) - замена текста в текущем файле;
  • Control+Y (F7 или PgUp) - перемещение на предыдущий экран;
  • Control+V (F8 или PgDwn) - перемещение на следующий экран;
  • Control+K (F9) = удаление (Cut, вырезать) строку в позиции курсора с сохранением ее в буфере (cutbuffer);
  • Control+U - (F10) - вставка содержимого cutbuffer'а в строку в позиции курсора; если последняя не менялась - выполняет роль Undo (отмены), штатно не предусмотренной;
  • Control+C (F11) - вывод информации о положении курсора в форме вроде
  • 	[ строка 4 из 81 (4%), символ 117 из 3092 (3%) ]
    	
  • Control+T (F12) - проверка орфографии (посредством установленной программы спеллинга, например, ispell);
  • Control+P - перемещение курсора на одну строку вверх;
  • Control+N - перемещение курсора на одну строку вниз;
  • Control+F - перемещение курсора на один символ вперед;
  • Control+B - перемещение курсора на один символ назад;
  • Control+A - перемещение курсора в начало текущей строки;
  • Control+E - перемещение курсора в конец текущей строки;
  • Control+L - перерисовка текущего экрана;
  • Control+^ (Meta+A) - выделение (и помещение в буфер) текста, начиная с текущей позиции курсора;
  • Control+D - удаление символа в позиции курсора;
  • Control+H - удаление символа слева от курсора;
  • Control+I - вставка символа табуляции;
  • Control+J (F4) автозаполнение текущего абзаца;
  • Control+M вставка символа перевода строки (CR) в позиции курсора;
  • Control+_ (F13 или Meta+G) - переход на указанный номер строки.

Meta-последовательности работают обычно как переключатели. С их помощью выполняются следующие действия:

  • Meta+C - включение/выключение постоянного положения курсора;
  • Meta+I - включение/выключение автоотступов;
  • Meta+Z - включение/выключение приостановки;
  • Meta+X - включение/выключение вывода зоны подсказки;
  • Meta+P - включение/выключение режима эмуляции редактора pico;
  • Meta+W - включение/выключение режима переноса слов;
  • Meta+M - включение/выключение поддержки мыши (только при сборке с поддержкой gpm;
  • Meta+K - разрешить/запретить вырезание до конца;
  • Meta+E - включение/выключение использования регулярных выражений (regexp).

Собственно, это и все. Функциональные возможности nano отнюдь не производят впечатления исключительно богатых. Однако со своей ролью - несложной правкой небольших конфигурационных файлов, - он вполне вполне справляется. И, к тому же, в нем предусмотрено еще и внешнее средство конфигурирования - пользовательский конфиг ~/nanorc. Выполнив в нем некоторые манипуляции, можно несколько расширить функциональность редактора, в частности, обеспечить подсветку синтаксиса.

Несколько слов о ee

Редактор ee (Easy Editor) - прост и незатейлив, и именно поэтому рекомендуется как базовый во FreeBSD. Он входит в состав базовой системы (Distributions) и, собственно, является там чуть не единственным представителем этого семейства. Не считая, конечно vim, но в базовой системе он замаскирован под классический vi, и потому а) функционально ограничен и б) поначалу не особенно легок в использовании. Так что на первом этапе освоения FreeBSD (и DragonFlyBSD) ee может быть столь же естественным выбором, как и nano для начинающего пользователя Linux.

Запускается ee одноименной командой

$ ee file

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

Навигация по тексту осуществляется или обычным способом - клавишами управления курсора, PageUp, PageDown, Home, End и т.д., либо - специфичными для ee управляющими (или командными) комбинациями клавиши Control с какой-либо из литерных. Так, комбинация Control+f (от forward) перемещает курсор на один символ вправо (т.е. вперед), Control+b (от backward) - на один символ влево (т.е. назад), и так далее. Причем возможности управляющих комбинаций шире - например, они позволяют перейти к следующему слову (Control+z), перейти в начало (Control+t) или конец (Control+u) экрана.

Аналогично и редактирование текста можно выполнять двояким образом: посредством клавиш редактирования (Backspace, Delete) или такими же управляющими комбинациями. Причем последний способ, как и в случае навигации, - более эффективен, позволяя удалить не только отдельный символ (Control+d), но и целиком слово (Control+w) или строку (Control+k).

Редактор ee не является истинно командным, и основные действия в нем осуществляются через меню, вызываемое нажатием клавиши Escape. Пункты главного меню - следующие:

+------------------------+
| a) выйти из редактора  |
| b) подсказка           |
| c) операции с файлами  |
| d) обновить экран      |
| e) параметры           |
| f) поиск               |
| g) разное              |
+------------------------+

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

+------------------------+
| Файл изменён!          |
|                        |
| a) сохранить и выйти   |
| b) не сохранять        |
|                        |
| для отмены нажмите Esc |
+------------------------+

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

vi и Vim: введение в тему

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

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

Существует несколько редакторов, основанных на vi, включающих дополнительные возможности, но полностью совместимых с ним по системе базовых команд. И потому знание vi обеспечит возможность работы с любым из его клонов. Более того, если в некоей Unix-системе вместо vi используется какой-либо из редакторов-клонов, например, Vim или elvis, в каталоге /usr/bin всегда будет представлен файл vi, являющийся жесткой или символической ссылкой на реальный исполнимый файл этого редактора. Поэтому vi или любой его аналог всегда может быть запущен командой

$ vi имя_файла

хотя реально при этом запускается, например, Vim. Тем более, что сам по себе vi в свободных POSIX-системах не используется из-за лицензионных соображений. Так что далее термины vi и Vim используются как синонимы, но везде имеется в виду Vim (Vi Improved).

Редактор Vim может быть запущен из командной строки оболочки с именем файла в качестве аргумента или без такового. В первом случае открывается файл, если он существует, или создается новый - в текущем каталоге, или в каталоге, определенном в пути к нему. Например, команда

$ vim ~/mytext/newtext.txt

создаст новый текстовый файл в подкаталоге ~/mytetxt домашнего каталога пользователя. Конечно, при этом каталог ~/mytetxt должен уже существовать, иначе при записи файла последует сообщение об ошибке.

Команда vim без имени файла откроет редактор Vim и выведет заставку следующего содержания:

				VIM - Vi IMproved
~
~                              version 6.1b BETA
~                           by Bram Moolenaar et al.
~                 Vim is open source and freely distributable
~
~                        Help poor children in Uganda!
~                type  :help iccf       for information
~
~                type  :q               to exit
~                type  :help  or    for on-line help
~                type  :help version6   for version info

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

Настоятельно рекомендую воспользоваться последней возможностью, так как работа в Vim окажется весьма непривычной для пользователя, привыкшего к текстовым редакторам DOS/Windows. В частности, попытка немедленно начать ввод текста успехом не увенчается. И потому следует сначала ознакомиться с режимами работы vi.

В vi существует три принципиально различных режима работы - командный, или визуальный (visual command mode), именуемый также нормальным, режим ввода (edit mode) и т.н. ex-режим, или режим построчного редактирования (ex mode или colon mode), который по-русски именуется еще и режимом ввода команд. Кроме того, в Vim (но не в классическом vi) дополнительно выделяется еще режим визуального выделения, или выбора.

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

Начнем с того режима, который включается по умолчанию при загрузке vi, почему далее я и буду именовать его нормальным - именно он обеспечивает быстроту перемещения по тексту и его обработки. К тому же из него осуществляется переход во все остальные режимы и возврат из них. В нормальном режиме нажатия клавиш не приводят к вводу символов, а интерпретируются как внутренние команды навигации и редактирования, привязанные к различным алфавитно-цифровых или символьным клавишам и их комбинациям. Например, нажатие клавиши h вызывает перемещение курсора на один символ влево, клавиши l - на один символ вправо, k - на строку вверх, j - на строку вниз, и т.д.).

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

Естественно, создание текста в командном режиме невозможно. Для этого следует перейти во второй режим (будем называть его режимом ввода), для чего служат разнообразные команды (нормального режима!), например, a (от append) и i (от insert). Здесь нажатия клавиш приводят к вводу обычных буквенно-цифровых символов (после текущей позиции курсора в случае первой команды и перед ней - в случае второй), позволяя создавать новый текст или редактировать имеющийся. Хотя последнее более эффективно в командном режиме, возврат в который осуществляется клавишей Escape.

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

  • открытие существующего файла (:edit имя_файла, здесь и далее символ : указывает на принадлежность команды к командному режиму); если какой-либо файл перед этим уже загружен, он будет закрыт и замещен новым; если же изменения в нем не были сохранены - последует сообщение об ошибке;
  • вставка существующего файла в позицию курсора (:read имя_файла);
  • запись файла (:write), в том числе под другим именем (:write имя_файла);
  • выход из редактора (:quit), происходящий, если текущий файл не изменялся или был предварительно сохранен;
  • выход из редактора с предварительным сохранением измененного файла (:xit - от exit).

Одна из возможных причин путаницы нормального и командного режима - то, что в последнем допустимы любые аббревиатуры указанных команд, вплоть до односимвольных (каковые в обиходе, как правило, и используются): :e для открытия файла, :r -для его вставки, :w - для записи, :q и :x - для выхода. Однако это именно сокращения команд, а не клавиши, предопределенные для неких действий, как в нормальном режиме. Возможно совмещение команд командного режима, например, :wq - выход с предварительным сохранением измененного файла (что аналогично команде :x).

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

Действия командного режима частично дублируются в режиме нормальном. Так, в последнем для закрытия же файла (с предварительным сохранением изменений) используется комбинация Z-Z (двойное нажатие клавиши Z - регистр важен!), что является эквивалентом сочетания команд :wq командного режима.

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

В современных версиях Vim предусмотрено нечто вроде индикации режимов - при включении режима ввода в нижней части экрана появляется надпись

-- INSERT --
при переходе в режим выбора - надпись
-- VISUAL --

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

Такая система работы может показаться запутанной начинающему пользователю. Однако она имеет глубокое внутреннее обоснование. Редактор vi создавался изначально как кросс-платформенный, который обязан работать на любых типах реальных и виртуальных терминалов. И потому все действия в нем можно осуществить, не покидая основной, алфавитно-цифровой, части клавиатуры, без обращения к дополнительным клавишам - стрелкам управления курсором, Home, End, PageUp, PageDown, Insert, Delete, Backspace.

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

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

  • команды навигации;
  • команды редактирования;
  • команды перехода (в режим ввода).

Команды навигации служат для перемещения курсора по тексту. В консольном режиме для этого могут быть использованы и обычные клавиши управления курсором (стрелки, PageUp/PageDown, Home/End). Однако уже в различных программах эмуляции терминала в Иксах их поведение неоднозначно (и зависит от настроек). К тому же внутренние команды дают больше возможностей для навигации по тексту, чем клавиши стандартных клавиатур.

Так, уже говорилось, что в vi существуют команды h и l, k и j, действие которых эквивалентно нажатиям клавиш Left и Right, Up и Down, соответственно. Но, кроме того, с помощью парных команд w и W можно переместиться вперед, соответственно, на т.н. "маленькое" слово (то есть отделенное пробелом или любым знаком препинания, символами - или +) и на "большое" (то есть обязательно отделенное пробелом) слово. Пара команд b и B выполняет аналогичное перемещение назад, а команды e и E перемещают курсор в конец следующего "маленького" и "большого" слова.

Вообще, для многих команд vi характерно наличие парных эквивалентов - в нижнем и верхнем регистрах одной клавиши (w и W, e и E); действие второй команды из пары как бы расширяет действие первой.

Возможны также перемещения в предыдущее (символ (, то есть открывающей скобки) и последующее (символ ), закрывающей скобки) предложения, в начало (H) и конец (L) экрана, в начало (0 - ноль) и конец ($) строки и т.д. - список навигационных команд приближается к 30. Иными словами, нажатием одной клавиши или, в крайнем случае, двухклавишной комбинации (Control+f - на следующую экранную страницы, Control+b - на предыдущую) можно переместиться в абсолютно любое заранее определенное место текущего документа.

В дополнение к этому, команды навигации vi могут использоваться с численными аргументами. Например, команда 5h переместит курсор на 5 символов влево (считая символ в позиции курсора), а команда 3k - на три строки вверх.

Далее, для навигации по тексту могут использоваться символы - (минус) для перемещения на одну строку вверх и + (плюс) для перемещения на одну строку вниз. Особенно эффективны они в сочетании с численными аргументами: командой 7+ возможно перемещение на седьмую строку вперед, а командой 13- - на тринадцатую строку назад (в обоих случаях - включая строку в позиции курсора).

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

Так, наряду с удалением единичного символа в позиции курсора (x) или перед ней (X), возможно удаление слова (dw), строки (dd) или ее части перед (dD) или после (dG) курсора, предложения (d)) или абзаца (d}).

Как и навигационные команды, команды редактирования могут использоваться с численными аргументами. Так, команда 5dd удалит текущую строку и еще четыре строки вниз. А с помощью команды 3dw можно удалить три слова подряд (включая то, на котором находится курсор).

Не меньше команд отвечает за копирование фрагментов, их вставку и замену. Например, команда yw копирует "маленькое" слово, yW - "большое", yy - строку, y) - предложение, y} - абзац. Командой же p удаленный или скопированный фрагмент вставляется в позицию курсора.

Действие ошибочно введенных команд редактирования может быть отменено командой u (от undo). Вторичный ввод этой команды приведет к отмене предыдущего действия, и так далее. Для возврата ошибочно отмененной операции используется команда Control+R.

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

Команды перехода могут рассматриваться как подмножество команд редактирования нормального режима, после которых возможен ввод новых символов и их последовательностей. Кроме уже упомянутых a и i (ввод после курсора и в его позиции, соответственно), к ним относятся:

  • A - ввод текста в конец строки;
  • I - ввод в начало строки;
  • o - создание новой строки под текущей с возможностью ввода в нее текста;
  • O - создание новой строки над текущей, в которую также можно ввести текст.

Как и большинство прочих команд редактора vi, команды перехода могут использоваться с числовыми аргументами. Так, если дать команду 3a и после этого ввести некоторую последовательность символов, по выходе в командный режим (клавишей Escape) она будет повторена трижды. Аналогично, ввод текста после команды #O даст # идентичных строк.

Редактор vi располагает средствами поиска и замены текстовых фрагментов, в том числе и с использованием регулярных выражений. Для этого предназначена команда командного режима :s (от substitute). Она дается в форме

:#s/text1/text2/опция

где # - количество строк, в которых операции поиска и замены должны осуществляться (без указания его действие команды распространяется только на текущую строку. Если поиск и замену необходимо выполнить по всему тексту документа, дается команда :%s.

Следует подчеркнуть, что если не указать заменяющего текста (и опций замены), все текстовые фрагменты, указанные в качестве заменяемого текста, будут просто удалены. Во избежание этого используются опции команды :s. Так, опция /c предписывает запрос подтверждения на замену для каждого найденного фрагмента.

И поиск, и замена в vi возможна только для последовательности символов, составляющих одну строку (то есть не содержащей символа LF). Заменяющая последовательность символов также должна образовывать единую строку.

Описанным не исчерпываются возможности редактора vi. В частности, он (вернее, его клон Vim) поддерживает язык макрокоманд и допускает их протоколирование. В комплекте с редактором (в каталоге /usr/local/share/vim/vim###) имеется большое количество таких макросов. Там же - и детальная документация по их применению.

Функциональность редактора Vim в значительной мере зависит от его настроек. Пример конфигурационного файла (vimrc_example.vim) можно обнаружить в том же каталоге (/usr/local/share/vim/vim###). Его следует скопировать в свой домашний каталог под именем ~/.vimrc и отредактировать по потребностям.

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

set langmap=

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

set langmap=ё,Ё~,йq, ... Б<,ю.,Ю>

Правда, чтобы это сработало, Vim должен быть собран с опцией big, задаваемой в командной строке при исполнении сценария ./configure.

А вообще редактированием файла ~/.vimrc Vim может быть адаптирован для задач любого рода, например, работы с html-документами. На сайте http://www.vim.org имеется большое количество примеров конфигурационных файлов такого рода.

Joe: гармония простоты и функциональности

Редактор joe принадлежит к категории public domain, то есть общественного достояния: мало кто помнит, кто и когда написал его первую версию. И долгое время он пребывал в состоянии практической консервации. Пока наконец в этом проекте не наметилась определенная активность, ознаменовавшаяся выходом версий серии 3.X. Которые привнесли несколько кардинальных новшеств, сделавших исходно хороший редактор еще лучше...

Обзор возможностей

Текстовый редактор joe - типичный представитель консольных редакторов командного стиля, то есть ориентированных не на действие через меню, а на управление с помощью прямых директив. Название его можно перевести примерно как "редактор дядюшки Джо". Он создан Джозефом Алленом (Joseph H. Allen) при участии Ларри Форда (Larry Foard) и Гари Грея (Gary Gray). Это - открытая и бесплатная программа, доступная в исходниках на сайте проекта. Она реализована для всех, насколько я знаю, POSIX-совместимых систем. А некоторые конкретные версии были собраны для Windows всякого рода и даже для DOS.

Запускается joe одноименной командой, можно - с именем файла, предназначенного для редактирования. В случае, если этого имени в природе не имеется, создается новый файл. Кроме этого, при запуске joe можно использовать ряд опций командной строки. Представление о них дает чтение страниц экранной документации (man joe).

Сразу после запуска joe выглядит весьма непрезентабельно: черный экран с белым текстом - и все. Что делать дальше - остается пока неясным. Единственно, строка заголовка в верхней части экрана гласит, что с помощью комбинации клавиш Control+K - H можно вывести на экран систему помощи. И далее пролистывать ее с помощью Escape - . (точка) - вперед или Escape - , (запятая) - назад.

Так вот, внимательное знакомство с системой помощи дает представление о возможностях редактора. Каковые неожиданно оказываются весьма богатыми.

Думаю, понятно, что текстовый редактор позволяет вводить текст (в том числе и кириллический) и обеспечивает навигацию по нему, а также редактирование. Последняя осуществляется двояко: либо с помощью собственных клавишных комбинаций (как правило, это Control+литера), о чем подробнее - в следующем разделе, либо - стандартных клавиш управления курсором (стрелок, PageUp, PageDown, End, Home). При этом клавиши эти введут себя обычным (с точки зрения пользователя DOS/Windows) образом, что отнюдь не само собой разумеющееся для консольных Unix-редакторов).

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

Мышь в joe поддерживается стандартным для Unix-консоли образом. То есть она выступает не как указательное устройство, а как средство выделения и копирования текстовых блоков. Это относится как к текстовой консоли, так и к эмуляторам терминалов графического режима.

Разумеется, в соответствие со своим званием joe позволяет и редактирование текстов, то есть: выделение блоков и отдельных знаков, их копирование, перемещение и удаление, форматирование абзацев (центрирование, лево- и правостороннее выравнивание и т.д.), вставку существующих файлов в текущий документ и запись выделенных фрагментов в виде отдельных файлов.

Редактор joe имеет функцию многоуровневой отмены и возврата отмененных операций. Встроенной проверки орфографии нет, однако можно подключить внешнюю программу (такую, как ispell), в том числе и для русскоязычных текстов. Имеются достаточно развитые средства поиска и замены, в том числе с использованием шаблонов и регулярных выражений. Есть возможность создания закладок (Bookmarcs) и перехода к ним, что необходимо при редактировании длинных структурированных документов.

В joe имитируется многооконный режим: поле текущего документа может быть разбито пополам, и далее каждое из них также может делиться сколь угодно дробно (правда, только по горизонтали). Обеспечена также одновременная работа со многими документами, каждый из которых может быть выведен в оконном или полноэкранном виде. Количество одновременно открытых файлов не ограничено ничем, даже, по некоторым сведениям, системной памятью - joe позволяет работать с документами, размер которых превышает объем ВСЕЙ доступной (то есть физической и виртуальной) памяти. Правда, проверить это на современных машинах несколько затруднительно...

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

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

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

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

Система помощи

Ознакомиться практически со всеми возможностями редактора joe можно посредством его системы помощи. Как уже говорилось, она выводится на экран нажатием комбинации клавиш Control+K-H и насчитывает семь секций, каждая из которых занимает собственный экран, перемещение между которыми осуществляется комбинациями клавиш Meta+. (вперед) и Meta+, (назад).

Первая секция, Basic, описывает действия наиболее общего плана: перемещения курсора (субсекция CURSOR), переходы по тексту (субсекция GO TO), операции с текстовыми блоками (субсекция BLOCK), команды удаления символов и текстовых фрагментов (субсекция DELETE), команды поиска, проверки орфографии, форматирования (субсекции SEARCH, SPELL, MISC), операции с файлами (субсекция FILE), а также выход из редактора.

Вторая секция посвящена описанию манипуляций с окнами - расщеплению (split) экрана, скрытию и показу открытых окон, переходу между окнами, изменению их размера.

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

  • работа по протоколированию, записи и воспроизведению макросов (субсекция MACROS);
  • команды для прокрутки текста (субсекция SCROLL);
  • команды для взаимодействия с оболочкой (субсекция SHELL);
  • средства установки закладок, наращиваемого поиска, ввода спецсимволов (секции BOOKMARKS, I-SEARCH, QUOTE) и так далее.

Четвертая секция - расширенные возможности для программистов (команды перехода к регулярным выражениям, компилирования и отладки). В пятой секции дано описание сложных регулярных выражений. И, наконец, шестая секция - операции с командной строкой встроенной в редактор командной оболочки.

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

Если мне удалось убедить читателя, что joe - вещь стоящая, имеет смысл подробнее рассмотреть с его

Характерные особенности

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

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

Полный список встроенных команд и привязанных к ним клавишных комбинаций дан в заключительном разделе этой статьи. Здесь же я приведу только основные примеры. Так, комбинация Control+B (от backward) перемещает курсор на один знак влево, Control+F (от forward) - на один знак вправо, Control+Z - переход к предыдущему слову, Control+X - к последующему слову, и так далее.

В некоторых случаях в качестве управляющей клавиши используется клавиша Meta (напомню, что ее эквивалент - нажатие и отпускание клавиши Escape): если в комбинации с ней набрать литеру W - курсор переместится на строку вверх, литеру Z - на строку вниз. Кроме того, Meta служит для вызова проверки правописания для слова (Meta+N) и всего файла (Meta+L). Нажатие клавиши Meta два раза подряд приводит к установке закладки (bookmark), которая маркируется произвольной цифрой, а Meta+# (где # - эта самая цифра) вызывает переход к установленной закладке. Правда, очевидно, что закладок не может быть больше 10; и к тому же по завершении сеанса они не сохраняются.

Все клавишные комбинации в joe не чувствительны к регистру, причем не только для буквенных, но и символьных клавиш. Так, для отмены последней операции (как уже говорилось, многоуровневой) зарезервирована комбинация Control+_ (знак подчеркивания), а для возврата отмененного действия - Control+^; однако в первом случае работает также комбинация Control+- (дефис или минус), во втором - Control+6.

Кроме того, все двухклавишные комбинации не чувствительны и к раскладке клавиатуры: сочетание клавиш, например, Control+T будет вызывать систему настройки joe и при кириллической раскладке. Интересно, что для пролистывания страниц помощи вперед и назад при кириллической раскладке следует нажимать Escape и точку (или, соответственно, запятую) также в ее положении на русифицированной клавиатуре (то есть в нижнем правом углу для Windows-клавиатур и на верхнем регистре цифр 5 и 7, если мне не изменяет память, - для клавиатур с DOS-маркировкой).

Для более сложных или редких действий используются трехклавишные комбинации. Это почти исключительно одновременно нажатые Control+K, после чего нажимается литерная клавиша. Так, операции с блоками осуществляются следующим образом:

  • Control+K - B отмечает начало выделяемого блока,
  • Control+K - K - его конец,
  • Control+K - C - копирует,
  • Control+K - M - перемещает выделенный блок в позицию курсора,

и так далее. Трехклавишные комбинации также не чувствительны к регистру. И работают также и при кириллической раскладке клавиатуры. В этом случае только необходимо нажимать вторую литерную клавишу вместе с той же клавишей Control: то есть запись текущего файла при включении кириллической раскладки потребует комбинации Control+K - Control+D, вызов нового файла - Control+K - Control+E, и так далее.

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

Кроме того, в joe доступны еще некоторые действия с файлами. Так, комбинация Control+K - R вставляет текст из существующего файла в позицию курсора, Control+K - W - записывает выделенный блок в виде нового файла (разумеется, запросив предварительно его имя). С помощью комбинации Control+K - E можно открыть для редактирования другой существующий файл. При этом следует предложение ввести путь и имя, причем и для того, и для другого работает режим дополнения клавишей табуляции, как в командных средах bash или tcsh.

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

Одновременно открытые файлы могут быть представлены как в полноэкранном виде, так и каждый в своем окне. Для переключения между однооконным и многооконным режимами служит комбинация Control+K - I. Размер каждого из выведенных окон может быть увеличен или уменьшен (Control+K - G и Control+K - T, соответственно), правда, только с шагом в одну экранную строку. Переключение между открытыми документами, вне зависимости от режима, осуществляется комбинациями Control+K - N (вперед или вниз) и Control+K - P (назад или вверх).

К слову сказать, в joe возможен и независимый просмотр разных частей документа в отдельных окнах, для чего предназначена функция расщепления окна (Control+K - O). Ну и, конечно же, фрагменты из одной части файла могут быть легко перенесены в другую.

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

Кроме этого, непосредственно из joe, без выхода, можно обращаться к командам оболочки (shell), причем - различными способами. Так, комбинация Control+K - Z обеспечивает временный выход в оболочку, где можно вводить любые ее команды. А по завершении операций - вернуться в среду joe можно комбинацией fg. То есть в данном случае мы имеем дело с обычной приостановкой текущей задачи.

Кроме этого, есть и более интересная возможность: открытие внутри joe, посредством комбинации Control+K - ' (апостроф), самостоятельного окна с собственной командной оболочкой. Здесь можно выполнять любые команды с выводом их результатов на экран. После чего стандартной командой exit осуществляется выход из среды, а все результаты сохраняются обычным для joe образом в виде текстового файла: возможность неоценимая при создании и редактировании всякого рода скриптов.

Следует подчеркнуть, что в данном случае запускается именно встроенная в joe оболочка, не имеющая никакого отношения к пользовательской (login shell). Она не порождает нового процесса (в чем легко убедиться командой ps) и не наследует никаких переменных окружения от пользовательской оболочки. Интерактивные ее возможности достаточно слабы (не поддерживаются ни автодополнение, ни история команд). Однако она дает возможность интеграции возможностей joe по редактированию и команд оболочки для обработки текста (о которых - см. соответствующую интермедию).

Единичная команда оболочки может быть выполнена после нажатия комбинации клавиш Meta+!. В этом случае внизу экрана появляется приглашение командной строки в форме:

Program to run:

представляющее собой разновидность встроенной оболочки joe.

Наконец, в joe обеспечивается ввод специальных символов. Так, нажатие клавиши ` (обратный апостроф) приводит к предложению ввести первый знак десятичного (0-9), шестнадцатеричного (x) или восьмеричного (o) кода символа. Если же вместо кода нажать Escape - можно ввести любую esc-последовательность. То же самое можно сделать и после нажатия комбинации Control+\.

Специальные символы могут вводиться не только непосредственно в редактируемом тексте, но и в строке поиска. Это позволяет легко находить и глобально заменять лишние разрывы строк и тому подобные нарушения структуры.

Таковы основные возможности joe для редактирования текстов общего характера. Кроме этого, имеется ряд команд специального назначения, используемых при программировании (поиск ошибок, компилирование и прочего). Однако и сказанного достаточно для представления возможностей редактора joe.

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

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

Кроме того, есть еще один простой и эффективный способ изучения макроязыка, совмещающий приятное с полезным, - режим протоколирования макрокоманд. Включается он комбинацией клавиш Control+K - [ (открывающая квадратная скобка), вслед за чем следует ввести номер макроса (от 0 до 9), выступающий как в качестве его имени, так и в роли запускающей клавиши. Далее просто выполняются необходимые действия (например, вводится требуемый тэг html), после чего запись макроса останавливается комбинацией Control+K - ] (закрывающая квадратная скобка). Для воспроизведения запротоколированного макроса используется комбинация Control+K - # (где # - указанный при записи номер макрокоманды).

С помощью протоколирования макросов можно автоматизировать ввод наиболее нужных для конкретной задачи символов и их наборов, не предусмотренных штатным образом. Например, основных тэгов html для разметки web-страниц, таких, как параграф, разрыв строки, заголовки нескольких уровней, таблицы и списки. А заодно - и изучить синтаксис языка. Поскольку в joe предусмотрена возможность помещения запротоколированных в данном сеансе макросов в тело существующего или нового документа (комбинацией клавиш Meta+D).

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

General Structure
insf,"~/blank.html",rtn  ^K .k1    HTML Page
"",ltarw,...,ltarw       .k1     H1
rtn,"",ltarw,...,ltarw       .k2     H2
rtn,"\09","",ltarw,...,ltarw        .k3     H3
rtn,"\09","\09","",ltarw,...,ltarw .k4     H4

Body Text
rtn,"<p>","</p>",ltarw,...,ltarw    .k5     Paragraph
rtn,"<br>"      .k6  Break
rtn,"<pre>",rtn,"</pre>",uparw  .k7     Preformat
"<strong></strong>",ltarw,...,,ltarw .k8     Strong
"<em></em>",ltarw,...,ltarw       .k9     Emphasis
rtn,"<div>",rtn,"</div>",uparw  ^K .k8  Division

Lists and Tables
rtn,rtn,"<ul>",rtn,"</ul>",uparw    ^K .k2  Unordered List
rtn,"<ol>",rtn,"</ol>",uparw    ^K .k3  Ordered List
"<li>,</li>",ltarw,...,ltarw       ^K .k4  List Item
rtn,"",rtn,"<table></table>",uparw      ^K .k5  Table

Из чего вполне можно составить представление о командах языка: в первой колонке следуют разделяемые запятыми (без пробелов!) зарезервированные команды (rtn - Enter, ltarw - Left, uparw - Up и т.д.) и вводимые символьные значения в парных кавычках ("<p>"). Далее идут разделенные табулятором клавишные комбинации (^K 0 - Control+K - 0), закрепленные за макросами, и имена макросов. Последние в оригинале представлены в виде Macro 0, Macro 1 и т.д. Но никто не запрещает при редактировании придать им осмысленные имена. Да и сами макросы могут быть отредактированы должным образом в текстовом редакторе (том же joe, например).

Легко сообразить, что за один прием можно запротоколировать не более 10 макросов (маркированных цифрами от 0 до 9). Более того, они будут действовать только в течении данного сеанса: по выходе из редактора записанные макросы сами собой не сохраняются. Что, казалось бы, напрочь обесценивает данную возможность.

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

Выясняется, что за воспроизведение макросов отвечает конфигурационный файл ~/.joerc, о котором подробнее будет сказано в следующем разделе. И потому достаточно поместить (с помощью Meta+D или из текстового файла) в соответствующую его секцию (какую - также скажу позднее) созданные команды, чтобы обеспечить их исполнение во всех последующих сеансах.

Более того, назначенные по умолчанию клавишные комбинации не являются обязательными. И их можно вручную заменить на любые другие, из числа не использованных ранее. После чего можно начать протоколирование команд сначала, нумеруя их от 0 до 9. Затем - повторить процедуру встраивания их ~/.joerc, и так далее, сколько потребуется (или до исчерпания комбинаторики клавиш). А поскольку количество незадействованных в joe клавишных комбинаций очень велико, то реально число созданных пользователем макрокоманд ограничивается только его фантазией и потребностями.

Таким образом можно легко автоматизировать процесс ввода тэгов HTML или XML, конструкций JavaScript, скриптов командной среды, разметки документов TeX, а также все, что потребуется впредь. Превратив joe в специализированный инструмент для решения почти любых задач.

Настройка joe

Как я уже говорил, некоторые настройки joe можно выполнить интерактивно (вызвав их комбинацией Control+T). Однако они весьма ограничены и к тому же будут иметь силу только в текущем сеансе. Более интересные и богатые возможности открываются при редактировании конфигурационного файла joerc.

Пример такого файла обнаруживается в каталоге /usr/local/etc/joerc. Перво-наперво его надлежит скопировать с свой домашний каталог и переименовать в ~/.joerc - именно этот файл ищется в первую очередь при загрузке редактора. А затем он открывается в любом текстовом редакторе - лучше всего в самом же joe и, после соответствующего изучения, правится вручную.

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

Файл joerc разбит на четыре секции. Первая - это глобальные опции редактора, большая часть которых может быть задана также параметрами командной строки. Все они - односложные и имеют вид -имя_опции (установить данную опцию) или --имя_опции (отменить ее). Опция является установленной (или, напротив, отмененной), если ею начинается строка (первая колонка, в терминологии программы - это относится и ко всем остальным секциям .joerc). Если строка начинается с пробела или табуляции, дальнейшее ее содержание рассматривается как комментарий и не учитывается. Комментарием является и все, отделенное пробелом от имени опции.

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

-asis

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

Полезным представляется также установка опций:

-lightoff

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

-marking

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

-nobackups

или

-backpath path

соответственно.

Интересная возможность - задание количества строк и колонок (знаков в строке) на экране, отличное от определенных для текущего терминала (виртуальной консоли) в целом, что задается опциями

-lines #
-columns #

где # - количество строк и знаков, соответственно.

В этой же секции настраивается вид статусной строки (вывод которой, впрочем, можно и отключить опцией -nosta). Он определяется двумя опциями -lmsg и -rmsg. Первая определяет компоненты, выводимые в левой части строки, вторая - в правой. В любой из них можно вывести индикацию режимов (забивки или вставки, переноса слов, автоотступов), имя файла и показатель его изменения, текущее положение курсора (в строках, колонках или знаках), и т.д. Первый знак левой части статусной строки - escape-последовательность, определяющая ее общий вид: инвертирование цветов, выделение подчеркнутым или полужирным начертанием, мерцание.

Например, строка вида

-lmsg \i%k%T%W%I%X %n %m%R %M

указывает, что в левой части статусной строки в инвертированном виде (черным по белому, \i) должны быть выведены

  • префиксные ключи (%k), маркирующие включение режимов вставки/замены (%T), переноса слов (%W), автоотступа (%I), прямоугольного выделения (%X);
  • имя редактируемого файла (%n);
  • указание на модификацию файла (%m) и на режим "только для чтения" (%R);
  • индикатор включения протоколирования макросов (%M).

Строка же вида

-rmsg  Row %r Col %c %o %O %u

выводит в правой части статусной линии номер текущей строки (Row %r) и колонки (Col %c) файла, смещение от начала в байтах (в десятичной, %o, и шестнадцатеричной, %O, формах, и системное время в 24-часовом формате (%u).

Возможен вывод и иной информации, как то:

  • системного времени в 12-часовом формате (%t);
  • индикации измененного файла символом *;
  • ASCII-кода символа под курсором в десятичной (%a) или шестнадцатеричной (%A) форме;
  • процента просмотра файла до позиции курсора (%p);
  • общего количества строк в файле (%l);
  • индикации запуска встроенной оболочки (%S).

Кроме того, внешний вид статусной строки можно изменить, придав ему, вместо или помимо инверсии, атрибуты подчеркивания (\u), полужирного начертания (\b), мерцания (\f).

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

*	все файлы
*.html	документы HTML
*.c	программы на C
*rc	конфигурационные файлы

и так далее. Напомню здесь, что знак маски (*) должен обязательно начинаться с начала строки, то есть занимать первую колонку.

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

Третья секция описывает вид экранов помощи, выводимых клавишной комбинацией Control+K - H. Экраны эти могут быть изменены как с позиций внешнего вида (инверсия цветов, выделение или подчеркивание и т.д.), так и по существу. В частности, здесь можно задать специальные экраны помощи для собственных макрокоманд. Более того, редактированием этой секции можно выводить и подсказки на русском (или каком-либо еще) языке. В частности, для макросов ввода тэгов html, описанных в одном из предыдущих разделов, можно создать экран помощи вида:

{HTML
\i   Help Screen    turn off with ^KH    more help with ESC . (^[.)
\i \i\uGeneral\u     \uBody Text\u               \uList&Table\u
\u
\i \i^KF1 Blank  F5 P  F7 Pre ^KF8 Div  ^KF2 UL ^KF3 OL ^KF4 LI  F10 Href
^KF9
\i \iF1-F4 H1-H4 F6 Br F8 Strong F9 Em  ^KF5 Tab ^KF6 TR ^KF7 TD ^KF10 Name
}

Каждый такой экран заключается в фигурные скобки, предваряется собственным идентификатором (в примере - HTML), ему придаются атрибуты внешнего вида (в примере - инвертирование рамки, \i), задается строка подсказки, после чего следует просто перечисление клавишных комбинаций и их описание.

Четвертая секция - разного рода ключевые последовательности, или связки (key bindings), в том числе и макрокоманды. Они могут быть определены отдельно для всех окон (субсекция :windows, опять же начиная с первой колонки), окна редактируемого текста (субсекция :main), и так далее.

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

Первый - возможность переопределения клавиатурных комбинаций, назначенных для штатных команд joe по умолчанию. Например, если вам не нравится, что пролистывание экрана осуществляется комбинациями Control+U (назад) и Control+V (вперед), можно присвоить им иные значения (из числа свободных, разумеется).

Второй вывод - штатные команды joe могут быть (почти) неограниченно наращены собственными макрокомандами. Для чего достаточно их запротоколировать и поместить (напомню, посредством Escape - D) в соответствующее место четвертой секции (скорее всего, в раздел :windows или :main) файла ~/joerc. Более того, здесь же им можно присвоить и членораздельные имена (вместо данных по умолчанию Macro 1, Macro 2 и т.д.), во-первых, и изменить закрепленные клавишные комбинации (по умолчанию - Control+K - 0 и т.д.) - во-вторых. То есть полностью индивидуализировать редактор, не прибегая ни к каким сильнодействующим средствам.

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

:def spellfile 
:def spellword

для спеллинга всего текста и отдельных слов, соответственно. Они просто описывают параметры вызова внешней программы проверки орфографии (по умолчанию - ispell). И подключение русского словаря при этом, разумеется, не предусмотрено. Чтобы осуществить это, следует просто добавить к обеим строкам после вызова исполнимой команды ispell опцию -d russian, в результате чего строки эти примут вид:

:def spellfile filt,"cat >ispell.tmp;ispell -d russian ispell.tmp \
</dev/tty >/dev/tty;cat ispell.tmp;/bin/rm ispell.tmp",rtn,retype
:def spellword psh,nextword,markk,prevword,markb,filt,"cat \
>ispell.tmp;ispell -d russian ispell.tmp </dev/tty >/dev/tty;tr -d \<ispell.tmp '\\012';/bin/rm ispell.tmp",rtn,retype,nextword

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

Дополнительные настройки

В начале своего повествования я упоминал, что ныне (начиная с версии 3.0) в joe появилась возможность подсветки синтаксиса для ряда языков программирования и разметки. Чтобы ей воспользоваться, нужно, во-первых включить соответствующую опцию в конфигурационном файле ~/.joerc - она расположена в секции Default local options и имеет вид

-highlight

Далее, требуются файлы описания цветов для синтаксических элементов различных языков. Примеры таких файлов расположены в /usr/local/etc/joe/synatx и охватывают языки Си (c.jsf), Assembler (asm.jsf), Fortran (fortran.jsf) и многие другие. Есть здесь и файлы описания языков командных оболочек (sh.jsf и csh.jsf), diff-файлов (diff.jsf), конфигов (conf.jsf), а также языков разметки (html.jsf и xml.jsf). Единственное, что остается с ними сделать - это отредактировать их в соовтетствие с предпочтительной цветовой гаммой (и сохранить в собственном домашнем каталоге под именами типа ~/.synatx/html.jsf и так далее).

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

-syntax html

и так далее, в предположении их стандартных имен и размещения (в указанных выше каталогах /usr/local/etc/joe/synatx или ~/.synatx/html.jsf.

Заключительные соображения

И так, чем же может привлечь пользователя редактор joe? На мой взгляд, многим. Разумеется, если он, то есть пользователь, вообще испытывает потребность в консольном редакторе.

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

Второй плюс - единообразность модели выполнения команд, особенно отчетливо проступающая в сравнении с emacs. Модель эта логична и легко запоминается, в том числе и благодаря мнемоническому характеру литерных клавиш, сочетающихся с управляющими.

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

Однако подчеркну, что такие навыки появляются достаточно быстро. И, кроме того, имеются альтернативные им, традиционные (для DOS/Windows) приемы навигации по тексту и прочее. Что приближает joe по простоте использования к меню-ориентированным редакторам и делает его пригодным и для эпизодического использования. Чего, в общем случае, нельзя сказать ни о vim, ни о emacs - эффективное их использование возможно только при постоянной практике.

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

Достаточно просто реализована возможность вставки специальных символов, escape-последовательностей и тому подобных вещей. Что гармонично дополняется возможностью определения для joe клавиатурной раскладки, отличной от используемой в консоли по умолчанию.

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

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

К принципиальным упущениям joe можно отнести, пожалуй, только отсутствие режима переноса символов без образования новой строки, подобного умолчальным для vim или emacs: режим word wrapping приводит к разрыву непрерывности абзаца (что в дальнейшем может создать сложности при автоматизированной обработке текста средствами sed или awk), а его отключение - к неудобству набора.

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

Назад Содержание Вперед
Вниз

VPS в России, Европе и США

Бесплатная поддержка и администрирование

Оплата российскими и международными картами

🔥 VPS до 5.7 ГГц под любые задачи с AntiDDoS в 7 локациях

💸 Гифткод CITFORUM (250р на баланс) и попробуйте уже сейчас!

🛒 Скидка 15% на первый платеж (в течение 24ч)

Скидка до 20% на услуги дата-центра. Аренда серверной стойки. Colocation от 1U!

Миграция в облако #SotelCloud. Виртуальный сервер в облаке. Выбрать конфигурацию на сайте!

Виртуальная АТС для вашего бизнеса. Приветственные бонусы для новых клиентов!

Виртуальные VPS серверы в РФ и ЕС

Dedicated серверы в РФ и ЕС

По промокоду CITFORUM скидка 30% на заказ VPS\VDS

Новости мира IT:

Архив новостей

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 7861149
Пресс-релизы — pr@citforum.ru
Обратная связь
Информация для авторов
Rambler's Top100 TopList This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2019 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...