NEdit — текстовый редактор для Иксов

Алексей Федорчук
2001-2002 гг

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

Содержание

Общая характеристика

Текстовый редактор NEdit (Nirvana Editor) — единственный, кто по своей функциональности и настраиваемости может состязаться с самыми мощными редакторами консольного режима, такими, как vim и emacs. И если титул лучшего редактора для консоли — предмет длительных, чуть ни религиозных дискуссий, то в графическом режиме пальма первенства, по моему мнению, — несомненно за NEdit. Хотя последнее время и kate движется в этом направлении семимильными шагами, реализуя некоторые уникальные аспекты интеграции редактора, терминала и файлового визуализатора.
Редактор Nedit реализован для всех Unix- и Unix-подобных систем, как коммерческих, так и свободных. В числе разработчиков его — большой коллектив, включающий Марка Эдела (Mark Edel), Джо Кирьякопулоса (Joy Kyriakopulos), Кристофера Конрада (Christopher Conrad) и многих других.

Официальный сайт проекта — http://www.nedit.org. На нем всегда можно найти последнюю версию этого редактора, как в виде исходных текстов, так и прекомпилированную для основных операционных систем (rpm, deb и tgz пакеты для Linux, бинарники для FreeBSD, и так далее).

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

По назначению Nedit — текстовый редактор для программистов. Однако, кроме этого, он может быть использован для множества целей — от элементарного набора текстов до разработки web-страниц и верстки оригинал-макетов в TeX.

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

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

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

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

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

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

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

  1. File (Control+F);
  2. Edit (Control+E);
  3. Search (Control+S);
  4. Preferences (Control+P);
  5. Shell (Control+L);
  6. Macro (Control+C);
  7. Windows (Control+W).

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

Рассмотрим содержание главного меню подробнее.

File

Он включает в себя в основном обычные файловые операции, как то:

  • создание файла (New, Control+N), сопровождаемое открытием нового окна, относящегося, тем не менее, к текущему сеансу NEdit;
  • открытие файла (Open, Control+O), в том числе из списка последних (Open Previous),
    количество которых настраиваемо (см. далее); чрезвычайно полезная опция
    — открытие файла путем выделения его имени (при необходимости — и
    полного пути) в редактируемом тексте (Open Selected, Control+Y); как и при создании файла, каждый документ открывается в своем собственном окне;
  • закрытие файла (Close,
    Control+W); в случае его модификации по умолчанию следует запрос на
    запись изменений, а также установок по умолчанию, если они изменялись;
  • сохранение файла (Save Control+C), в том числе и под другим именем (Save as); последняя опция позволяет сохранить текстовый файл не только в формате Unix (с LF в качестве символа возврата каретки), но и формате DOS (он же Windows), где в этом качестве применяется CR-LF; возможно также дополнение строк, оборванных при включении переноса слов (о чем будет разговор в разделе
    о настройках), до полного абзаца, завершаемого нажатием клавиши Enter (Add line breaks where wrapped);
  • уникальная опция отмены изменений в уже записанном файле (Revert to
    Saved
    );
  • вставка некоего существующего файла в текущий документ (Include File, Alt+I), осуществляемая в позиции курсора;
  • открытие файла макросов или тэгов (Load Macro File и Load Tags File, соответственно), о чем подробнее — ниже;
  • печать текущего файла (Print, Control+P) или выделенного фрагмента (Print Selection);
  • выход из программы (Exit, Control+Q).

Edit

Содержание пункта Edit также достаточно тривиально, это:

  • отмена нескольких последних операций и возврат отмененных действий (Undo, Control+Z, и Redo, Shift+Controll+Z, соответственно);
  • вставка;
  • вырезание (Cut), копирование (Copy) и вставка (Paste) выделенного фрагмента; закрепленные за этими операциями комбинации клавиш — привычны пользователям Windows: Control+X, Control+C и Control+V, соответственно;
  • вставка выделенного фрагмента в виде колонки (Paste Column, Control+Shift+V); вставляемый фрагмент в этом случае как бы вклинивается в существующий текст;
  • удаление выделенного фрагмента (Delete, клавиша Del);
  • выделение всего документа (Select All, Control+A);
  • выделение текста слева (Shift Left, [Shift]Control+9) или справа (Shift Right, [Shift]Control+0) от позиции курсора;
  • конвертация букв выделенного фрагмента из верхнего регистра в нижний, и наоборот (Lower Case, Shift+Control+6, и Upper Case, Control+6, соответственно);
  • подпункт Fill Paragraph (Control+J) конденсирует абзацы в соответствие с принятыми в Preferences правилами переноса слов (о чем подробнее расскажу в разделе о настройках редактора);
  • наконец, пункты Insert Form Feed (Alt+Control+L) и Insert Control Code (Alt+Control+I)
    позволяют вставлять всякого рода управляющие символы; в частности, во
    втором случае вызывается панель с предложением ввести ASCII-код
    желаемого символа в десятичном исчислении.

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

Традиционно в NEdit с помощью мыши можно многократно вставлять выделенный фрагмент, так как после первой вставки щелчком средней кнопки выделение не снимается, и процедуру можно повторять (или — удалить выделенный фрагмент, нажав клавишу Del, не меняя положения курсора) до фиксации курсора в новой позиции; таковая происходит после нажатия любой из клавиш управления курсором, но не при перемещении по телу документа с помощью линейки скроллинга.

Вообще говоря, в терминологии NEdit различается два типа выделения: первичное (primary, highlighted text) и вторичное (secondary, underlined text), действия над которыми различны.

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

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

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

Если описанную операцию выполнить при нажатой клавише Shift, произойдет перемещение выделенного фрагмента. То есть — точно так же, как и при перетаскивании мышью в Windows (drag’n’drop). Прием, насколько мне известно, не имеющий аналогов в других приложениях для X Window, далеко не все из которых не поддерживают и обычный drag’n’drop как таковой.

Search

Опции поиска в NEdit вполне заслуживают отдельного положения в главном меню, поскольку возможности поиска и замены в NEdit чрезвычайно широки. Здесь и поиск введенной последовательности символов ([Shift]Control+F), и повторный поиск ([Shift]Control+G), и поиск фрагмента, идентичного выделенному ([Shift]Control+H). Возможен поиск как буквенных последовательностей (Literal), в том числе и с чувствительностью к регистру (Case Sensitive Literal), так и регулярных выражений (Regular Expression), поиск вперед и назад (Search Forward и Search Backward, соответственно). При этом поддерживается история поиска: клавиша управления курсором Up вызывает появление предыдущей искомой последовательности, клавиша Down — последующей.

Следует отметить, что строка для ввода искомой последовательности может быть выведена не только в диалоговой панели по вызову соответствующего пункта меню, но и включена в верхней части окна программы, между строкой меню и строкой состояния (с помощью команды Find Incremental, [Shift]Control+I). В обоих случаях кириллица в строке поиска не отображается, заменяясь знакомой пользователям Windows псевдо-грекофранцузской абракадаброй; тем не менее, самому по себе поиску это отнюдь не мешает — кириллические символы в теле документа находятся исправно.

Разумеется, возможна и замена найденных фрагментов (Replace, [Shift]Control+R), и повторная замена (Replace Again, [Shift]Control+T). Опции замены — те же, что и для поиска: с чувствительностью к регистру, с использованием регулярных выражений, вперед и назад, и так далее.

В пункте же Search — переход к строке по ее номеру (Goto Line Number, Control+L) и к выделенному фрагменту (Goto Selected, Control+E), установка закладок (Mark, Alt+M), в качестве которых могут использоваться буквы латинского алфавита (от A до Z), и переход к ранее установленным закладкам (Goto Mark,[Shift]Alt+G) и еще пара пунктов, содержания которых я не очень понял. Это, во-первых, Goto Matching (…) ([Shift]Control+M), не вызывающий никаких действий, и, во-вторых, Find Definition (Control+D), не активизированный вообще.

Preferences

Содержание данного пункта меню вполне понятно, что это настройки, среди которых:

  • включение/выключение строки состояния (Statistic Line, Alt+A) и строки поиска (Incremental Search Line);
  • выведение/скрытие нумерации строк (Show Line Number);
  • выбор языкового режима (Launguage Mode, в смысле — языка программирования, а не человечьего);
  • включение/выключение автоматических отступов в тексте (Auto Indent);
  • настройка режима переноса строк (Wrap);
  • установка величины табуляции (Tabs);
  • выбор экранного шрифта (Text Font);
  • включение/выключение подсветки синтаксиса (Highlight Suntax);
  • разрешение (или запрещение) создания резервных копий редактируемого документа при записи (Make Backup Copy, *.bck);
  • включение/выключение специальных возможностей — Incremental Backup и Show Matching (…);
  • включение/выключения забоя при наборе (Overtype, Control+B);
  • установка запрета изменения (Read Only) текущего документа.

Уже из этого краткого перечня можно представить себе возможности настройки редактора NEdit, о чем я подробнее буду говорить в следующем разделе. Пока же отмечу только, что все эти настройки имеют силу только в текущем сеансе. Чтобы сделать их перманентными, требуется внести соответствующие изменения в пунктах Default Setting (о чем — ниже), и сохранить их (Save Default).

Shell

Shell — достаточно необычный пункт меню текстового редактора. Через него можно, во-первых, запустить на исполнение любую команду или программу. Это делается с помощью подпункта Execute Command (Alt+X), который вызывает нечто вроде минитерминала. В нем может быть введена соответствующая команда оболочки (или любая другая) с любыми требующимися параметрами. Поддерживается, посредством клавиш управления курсором Up и Down, история команд, правда, только данных в текущем сеансе.

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

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 .....

и так далее. Разумеется, эта опция наиболее полезна для программистов. Однако и простым смертным она будет весьма нелишней при отладке сценариев командной оболочки. Необходимость в чем может возникнуть при желании нарастить функциональные возможности NEdit.Дело в том, что сценарии эти могут быть встроены в меню Shell. Некий их набор включен в последнее по умолчанию. Это проверка правописания (spell), статистика (wc, от word count — подсчет строк, слов и знаков), сортировка строк и их нумерация, а также сугубо программистские сценарии — например, make для сборки программы из набранного исходного текста. Однако ничто не мешает пополнять меню Shell своими сценариями любого назначения, освободив его от ненужных лично вам элементов. Как — расскажу в одном из следующих разделов.

Macro

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

  • включение режима протоколирования макросов (Learn Keystrokes, Alt+K);
  • нормальное завершение (Finish Learn, повторное Alt+K) и прерывание
    (Cansel Learn, Control+.) протоколирования;
  • воспроизведение (Replay Keystrokes, Control+K) и повторение (Repeat, Control+.) запротоколированных макрокоманд.

Вторая секция — настраиваемая, в нее можно включить макрокоманды, как идущие в комплекте, так и созданные собственноручно. Например, с помощью протоколирования — иначе они не сохраняться по завершении текущего сеанса.В комплекте с NEdit идет несколько макросов — дополнение частично напечатанных слов путем сопоставления их со словарем (Complete Word, Alt+D), или ответы на письма — с цитированием (Quote Mail Reply) и без оного (Unquote Mail Reply).

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

Windows

Понимается под этим, как нетрудно догадаться, управление окнами, правда, довольно ограниченное. Во-первых, можно разделить окно с текущим документом на две независимо скроллируемые части (Split Window, Control+2). Только по горизонтали, но зато сколько угодно раз: исходное окно делится ровно пополам, затем каждая половина — еще пополам, и так далее, насколько хватит разрешения экрана.Для снятия разделения предназначен пункт Close Pane (Control+1). При этом закрывается та часть окна, в которой находится курсор.Наконец, в пункте Windows содержится список открытых в текущем сеансе документов. Каждый из них открывается или создается (через пункты меню File — Open или File — New, соответственно) в своем окне с полным набором его атрибутов (управляющими элементами, меню, строкой состояния и так далее). Однако все они принадлежат текущему сеансу, и, скажем, изменение настроек сказывается на них всех. А переключение между окнами, кроме принятого в данном оконном менеджере, можно осуществить и через их список в пункте меню Windows.

Help

Встроенная помощь редактора NEdit весьма богата, что можно видеть из простого перечисления содержания этого пункта меню. Он содержит:

  • Getting Started — краткое описание основных особенностей программы;
  • Basic operations, где описаны приемы выделения текста (Selecting Text), поиска и замены фрагментов (Finding and Replacing Text), их вырезания и вставки (Cut и Paste), использование мыши (Using the Mouse), комбинации горячих клавиш (Keyboard Shortcuts), а также формат файлов NEdit (File Format);
  • Features for Programming, то есть фичи для программеров; не будучи таковым, задерживаться здесь не буду;
  • Regular Expressions, на что также распространяется вышесказанное; здесь весьма подробно описаны синтаксис регулярных выражений и прочие их особенности, а также приведены примеры; с этим надеюсь разобраться в будущем;
  • Macro/Shell Extensions, напротив, заслуживает всяческого внимания; именно здесь подробно описаны: использование скриптов оболочки командной строки, процесс протоколирования макрокоманд, синтаксис встроенного макроязыка NEdit и прочее;
  • Customizing — не менее интересная позиция; под этой рубрикой приведены сведения о всех видах настройки NEdit; что составит предмет следующего раздела;
  • NEdit Command Line — описание параметров для запуска NEdit; большая их часть достигаемых таким путем опций может быть реализована также и через настройки;
  • Server mode and nc — описание использования NEdit в режиме клиент/сервер;
  • Crash recovery — описание действий в экстремальных ситуациях.

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

Пора, однако, заканчивать с рассмотрением главного меню. Поскольку в NEdit существует еще и меню контекстное (в терминологии NEdit — Window Background Menu), вызываемое, как положено, щелчком правой клавишей мыши на выделенном фрагменте текста. Правда, оно достаточно простое, содержат лишь пункты Undo и Redo, Cut, Copy и Paste, что в комментариях не нуждается. Однако, как будет показано ниже, и оно может быть наращено.

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

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

Еще в Nedit нет штатных средств управления проектом. Хотя бы в элементарном исполнении, то есть в виде открытия и сохранения группы связанных файлов (глав книги, например, или серии web-страниц). Тем не менее, все это не перечеркивает высоких достоинств редактора.Однако мало было бы проку от богатства возможностей редактирования, если бы они не сопровождались адекватным богатством настроек. Что же, посмотрим, каковы они, возможности настройки.

Настройка NEdit

Я уже говорил, большая часть настроек редактора NEdit сконцентрирована в пункте Preference главного меню. И даже кратко перечислил возможности настройки текущей сессии. Однако нас больше интересует не сиюминутный результат настройки, но ее долгосрочная перспектива. Для чего следует рассмотреть подпункт Preference — Default Settings. Содержание его близко подпунктам меню Preference и включает установки:

  • языкового режима (Language Modes);
  • включения/выключения автоматических отступов (Auto Indent);
  • режима переноса слов (Wrap);
  • Tag Collisions;
  • величины табуляции (Tabs);
  • экранного шрифта (Text Fonts);
  • настройки меню (Customize Menus);
  • режима поиска (Searching);
  • подсветки синтаксиса (Syntax Highlighting);
  • переключателей вывода строки состояния (Statistics Line), строки поиска
    (Incremental Search Line) и нумерации строк (Show Line Numbers);
  • резервного копирования (Make Backup Copy);
  • Show Matching (…)
  • Sort Open Prev. Menu;
  • Popups Under Pointer;
  • выдачи предупреждающих сообщений (Warning);
  • начального размера окна при запуске NEdit (Initial Window Size).

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

Language Modes

Как уже говорилось, под этим подразумевается язык не человеческий, а программистский. И список поддерживаемых режимов включает, не считая чисто текстового (Plain), почти все известные мне (и многие неизвестные) языки программирования и разметки. Здесь и C и C++, Java и JavaScript, Ada, Fortran, Pascal, Python, Tcl, awk, языки командных оболочек линии sh и линии csh, языки разметки SGML/HTML и LaTeX, PostScript, SQL и прочая, и прочая, и прочая. Разумеется, есть и режим собственного языка NEdit Macro.

Кроме языков, поддерживаемых в штатном комплекте, можно ввести поддержку любого иного языка программирования, в том числе и самоизобретенных. Для этого достаточно выбрать в списке яхыков пункт New, определеить для нового языка его имя, закрепленное расщирение имени файла и прочие параметры.Первое видимое следствие переключения языкового режима — появление подсветки синтаксиса соответствующего языка (если, конечно, эта опция включена, о чем — ниже). Так, по умолчанию в NEdit задействован режим Plain text. В этом случае, скажем, тэги в html-документе показываются теми же черными (для примера) буквами, что и его содержание. Если же переключиться в режим SGML/HTML, тэги, их аргументы и значения последних заиграют различными цветами. Впрочем, при открытии файла определение его типа обычно происходит автоматически, по расширению (и обычно — правильно), и соответствующий языковый режим включается сам собой.Однако различие между языковыми режимами не исчерпывается цветовой гаммой. Многие макросы (о которых — в следующем разделе) имеют языковую привязку. И появляются в меню Macro только тогда, когда включается соответствующий их языку режим.

Auto Indent, Wrap и Tabs

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

Так, Auto Indent — это просто включение или выключение (Off/On) возможности создания автоматических абзацных отступов. Поясню на примере: если вам нужно набрать серию абзацев с общим отступом 7 пунктов от левого края, вы задаете (например, клавишей табулятора) отступ только первого абзаца — во всех остальных при включении (On) опции Auto Indent будет появляться автоматически, до его уничтожения вручную.

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

А вот величина отступа, задаваемого клавишей табуляции, и определяется в пункте Tabs. Здесь нужно просто задать (в знаках) величину отступа при табуляции. Правда с оговоркой — for hardware space, поскольку тут же присутствует и опция — emulate tabs, то есть предполагается и некая программная табуляция — для терминалов, клавиши Tab не имеющих.

Опция Wrap важна, так как она отражается на ряде других параметров набора текста. Для нее возможны варианты:

  • None, то есть каждый абзац набирается в одну строку вплоть до нажатия клавиши Enter; это вполне приемлемо для исходных текстов программ, но вряд ли очень удобно для набора текстов просто, так как строка «убегает за горизонт»;
  • Auto Newline — выбор этой позиции приводит к тому, что каждая строка обрывается на границе окна, в результате чего сплошной текст (вроде этого, например) приобретает читабельность; однако при экспорте его в какой-либо текстовый процессор обнаруживается, что каждая строка заканчивается символом возврата каретки (то есть образует самостоятельный абзац), искоренение которых, например, в MS Word — занятие не из самых веселых;
  • Continuous — оптимальный выбор для набора длинных связных текстов; в этом случае при достижении границы окна происходит разрыв экранной (не истинной!) строки без появления лишнего символа возврата каретки и, соответственно, без образования нового абзаца; каковой появляется только по нажатии клавиши Enter; это аналогично условиям переноса строк по умолчанию в emacs; в последнем, в отличие от NEdit, разрыв экранной строки маркируется обратным слэшем (\), что, конечно, наглядно показывает отличие строк экранных и истинных, но, с другой стороны, загромождает текст;
  • Wrap Margin, последняя из опций переноса слов, позволяет явным образом задать длину строки в знаках, после чего происходит ее разрыв символом возврата каретки.

Я столь подробно остановился на параметрах переноса слов, потому что они представляются мне одними из наиболее существенных при наборе текста. Особенно если в дальнейшем предполагается экспорт его в текстовый процессор или какую-либо программу верстки. К тому же именно установками пункта Warp определяется реакция на команду меню Edit — Fill Paragraph (Control+J): при установке в позиции Continuous текст в NEdit, независимо от того, в каком режиме переноса слов был набран, будет сконденсирован в единые абзацы, разделами между которыми будут только явные нажатия клавиши Enter.

Не уверен, что выразился вполне внятно, поэтому поясню на примере: некий текст был набран в режиме Auto Newline, после чего выяснилось, что его следует экспортировать в MS Word; чтобы избавить себя в дальнейшем от ручного искоренения символов возврата каретки или головной боли по измышлению автоматизации этого процесса, достаточно просто пройтись по всем абзацам текста, нажимая Control+J — и при включенной опции Continuous мы получим его аккуратно поделенным именно тем образом, что и требуется.

Text Fonts

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

При вызове пункта Text Fonts возникает панель с предложением определить основную гарнитуру (по умолчанию — нормального, то есть не курсивного и не полужирного, начертания) и отдельно — гарнитуры для каждого из начертаний (опять же, курсивного, полужирного, и полужирного курсивного). Впрочем, можно нажать экранную клавишу Fill Highlight Fonts from Primary — и тогда все прочие, кроме нормального, начертания унаследуют его гарнитуру.

В строке Primary Font (как, впрочем, и в любой другой) определить гарнитуру (и прочие параметры) экранного шрифта можно вводом вручную, с указанием всех требуемых атрибутов. Однако проще нажать экранную клавишу Browse и выбрать из списка всех доступных системе шрифтов. Каковой осуществляется в панели о трех колонках; в них необходимо явным образом отметить все три доступные для выбора атрибута — Font (то есть гарнитуру), Style (начертание, но нашему) и Size (сиречь кегль), иначе последует сообщение о некорректном определении шрифта.Что характерно (вернее, не характерно для большинства текстовых редакторов, оперирующих обычно только моноширинными гарнитурами): хотя по умолчанию в списке присутствуют моноширинные шрифты, можно включить также показ шрифтов пропорциональных, и использовать их в свое удовольствие.

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

Customize Menus

Этот подпункт дает возможность настроить три элемента — пункты Shell и Macro главного меню, а также контекстное, или, в терминологии NEdit, фоновое, меню (Window Background Menu), вызываемое правой кнопкой мыши.

При настройке пункта Shell вызывается панель со списком имеющихся команд, которые с помощью соответствующих экранных клавиш могут быть удалены (клавиша Delete), скопированы (клавиша Copy) или перемещены вверх или вниз по списку (клавиши Move^ и Move , соответственно). В расположенном ниже поле командной строки (Shell Command to Execute) содержится собственно код скрипта командной оболочки. Здесь можно непосредственно руками отредактировать соответствующую команду. Например, в комплекте NEdit предусмотрен скрипт для проверки орфографии (пункт spell). Каковой, вызывая стандартную программу ispell в окне терминала, имеет вид

cat>spellTmp; xterm -e ispell -x spellTmp; cat spellTmp; rm spellTmp

и, естественно, понимает только английский язык. Однако обучить его русскому языку (или любому другому, при наличии соответствующего словаря) — трудов не составит. Для этого достаточно указать в командной строке параметр -d russian (предписывающий обращаться при спеллинге именно к русскому, а не какому другому словарю) — и все в порядке.

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

cat>spellTmp; rxvt -e ispell -d
russian -x spellTmp; cat spellTmp; rm spellTmp

Кроме того, в строке Menu Entry можно изменить название скрипта (именно содержимое этой строки и выступает в качестве пункта меню) или организовать иерархическое меню (с помощью знака >), а также привязать скрипт к какому-либо языку (для чего имя его маркируется знаком @ с указанием на последний, например @C++); в последнем случае скрипт будет фигурировать в меню только в том случае, если выбрать соответствующий языковый режим.

Кроме того, в поле Accelerator за скриптом можно закрепить некую комбинацию горячих клавиш. А поле Mnemonic предназначено для ввода литеры, которая будет в меню выделена и послужит для быстрого доступа к команде (с помощью комбинации Alt+литера). Можно изменить и ряд условий исполнения команды, о чем будет разговор в соответствующем разделе.

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

Разумеется, в меню Shell можно включить и скрипты собственного изготовления, для чего в списке имеется пункт New. Однако это будет нашим занятием в одном из следующих разделов. Сходным образом настраивается и меню Macro. На предназначенной для этого панели также имеется список макрокоманд с кнопками для их удаления, копирования и перемещения вверх и вниз, поле имени (Menu Entry) с возможностью создания многоуровневых иерархических меню (посредством того же знака >), привязкой к языковому режиму и закрепленной клавишной комбинации, а также обширное поле, предназначенное для кода макроса. Доступное для непосредственного редактирования.

Выбрав из списка макросов пункт New, можно нарастить меню собственными командами на языке NEdit Macro. Во-первых, написав в поле Macro Command Execute соответствующий код вручную, во-вторых, посредством клавиши Paste Learn/Replay Macro поместив туда запротоколированную (с помощью пунктов меню Macro — Learn Keystrokes или клавишной комбинации Alt+K) последовательность действий. Впрочем, создание макросов будет подробно рассмотрено в следующем разделе.

Абсолютно аналогичным образом можно настроить и контекстное (или фоновое) меню, вызываемое щелчком правой кнопки мыши на выделенном фрагменте. Как уже говорилось, по умолчанию оно включает привычные для Windows-мигранта пункты Undo, Redo, Cut, Copy и Paste, которые с помощью экранных клавиш Delete, Copy, Move^ и Move можно удалить, скопировать и переместить.

А избрав в списке пункт New, можно пополнить контекстное меню собственными командами, написанными на языке NEdit Macro вручную или посредством протоколирования действий.

Searching

Покончив с настройками меню, можно заняться определениями параметров поиска. Я уже говорил, что возможности для этого в редакторе NEdit весьма обширны. А настраиваемость придает им еще и гибкость. В пункте Searching присутствует два переключателя:

  • Verbose, то есть включение поиска многословных фрагментов, и
  • Keep Dialogs Up, включение которой позволяет осуществлять непрерывный поиск последующих вхождений (по умолчанию для поиска следующего вхождения требуется выбрать в главном меню Search — Find Again).

Третий пункт настройки поиска — режим по умолчанию: Literal (то есть когда искомое значение рассматривается как буквенная последовательность), Case Sensitive (то же, но с чувствительностью к регистру) и Regular Expression (то есть поиск регулярных выражений, представление о синтаксисе которых можно получить из соответствующего пункта меню Help).

Syntax Highlighting, Statistics Line, Incremental Search Line
и Show Line Numbers

Эта группа настроек — просто переключатели, с помощью которых можно показать или скрыть:

  • подсветку синтаксиса (Syntax Highlighting) языка, соответствующего данному режиму;
  • строку состояния (Statistics Line);
  • строку поиска (Incremental Search Line);
  • нумерацию строк (Show Line Numbers).

Правда, для пункта Syntax Highlighting настройке поддается также Recognition Patterns и Text Drawing Styles. Что такое первое — я пока не разобрался, а второе — это приписывание каждому элементу языковых конструкций цвета и шрифтоначертания. Для языка HTML, например, можно определить различные цвета тэгов, их атрибутов и значений последних, комментариев, метатэгов и так далее.

Make Backup Copy и Sort Open Prev. Menu

Это также простые переключатели. Первый разрешает или запрещает создание резервных копий редактируемого файла. Включение его приводит к тому, что при перезаписи измененного документа предыдущая его версия сохраняется в виде файла с расширением *.bck. С помощью Sort Open Prev. Menu можно включить алфавитную сортировку ранее открывавшихся файлов, входящих в список File — Open Previous. При выключении этой опции файлы в нем следуют в хронологическом порядке.

Warning

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

Initial Window Size

Как нетрудно понять, здесь задается размер окна по умолчанию, возникающего при запуске NEdit. Предусмотрено пять вариантов такового:

  • 24 на 80 знаков;
  • 40 на 80 знаков;
  • 60 на 80 знаков;
  • 80 на 80 знаков;
  • настройка геометрии (Custom…).

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

Конфигурирование .Xdefaults

Надеюсь, из приведенного описания становится ясно, что через меню Preferences — Defaults Settings в NEdit можно настроить почти все. Единственно, следует не забыть сохранить сделанные изменения, дабы сделать их перманентными (через Preferences — Save Defaults).Однако способов изменения некоторых параметров через меню обнаружить не удается. Так, в первозданном (и, возможно, не отвечающем вашему эстетическому идеалу) остались цвета фона и курсора, шрифт надписей меню и цвет его линейки, положение полосы скроллирования и еще кое-что. Отчаиваться не следует — на сей предмет существует метод левой резьбы. То есть — ручной правки конфигурационного файла /$HOME/.Xdefaults, описывающего особенности X-приложений.

Секции для NEdit в нем нет. Однако создать ее (хотя бы собственными средствами этого редактора) труда не составит. Для этого достаточно вставить такие строки:

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! Nedit
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

где строки с восклицательными знаками, естественно, не обязательны, служа всего-навсего ограничителями секции, а строка ! Nedit — комментарий, дабы не забыть, о чем, собственно, идет речь.

Теперь дело за малым — нужно создать наполнение секции. Это можно сделать по наитию — и методом проб и ошибок. А можно обратиться к системе помощи — тому самому ее пункту, где говорится о конфигурировании NEdit и, в частности, о ресурсах X Window (Help — Customizing — X Resources).Здесь можно найти список почти всех параметров, которые не подлежат изменению через меню Preferences, но которые в принципе можно (хотя и не все — нужно) изменить:

Nedit.shell: /bin/csh

Указание на оболочку командной строки, скрипты которой выполняются через меню Shell.

Nedit.wordDelimiters: .,/`'!@#%^&*()-=+{}[]":;<>?

Знаки, маркирующие (в дополнение к пробелам и табуляции) границы между словами при их выделении мышью (двойным щелчком на слове) или перемещении курсора комбинацией клавиш Control+Стрелки

Nedit.remapDeleteKey: False

Указание значения True переопределяет клавишу Delete как Backspace.

Nedit.stdOpenDialog: False

Возвращение значения True устанавливает стандартный для приложений, основанных на Motif, стиль диалоговых панелей.

Nedit.bgMenuButton: [Shift][Control][Meta][Alt][Btn3Down]

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

Nedit.maxPrevOpenFiles: 30

Максимальное количество файлов в списке, вызываемом через меню File — Open Previous (то есть ранее открывавшихся или создававшихся). Насколько мне удалось понять, значение это сверху ограничено только размерами дисплея и его разрешением — при большом количестве список уходит за пределы видимости. Список открывавшихся ранее документов хранится в конфигурационном файле /$HOME/.Neditdb.

Nedit.printCommand: (system specific)

Этот параметр и серия следующих за ним (начинающихся с Nedit.print) определяют условия печати документов из редактора NEdit. По умолчанию все они используют системные установки. Насколько я понимаю, лучше их таковыми и оставить, если нет веских причин для иного решения.

Nedit.multiClickTime: (system specific)

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

Nedit*scrollBarPlacement: BOTTOM_LEFT

Эта строка описывает положение и вид полосы прокрутки. При значении в примере (как ни странно, это не значение по умолчанию — уже при первом запуске NEdit полоса прокрутки располагается справа) она должна располагаться вдоль левой границы окна и прокручиваться вперед смещением ползунка сверху вниз. Другие возможные значения: BOTTOM_RIGHT, TOP_LEFT и TOP_RIGHT; в двух последних случаях прямой скроллинг осуществляется движением ползунка снизу вверх.

Nedit*text.autoWrapPastedText: False

По умолчанию запрещает автоматический перенос слов при наборе текста. Лучше так и оставить — различные опции переноса слов для каждого конкретного случая проще настроить через меню Preferences — Wrap (или Preferences — Default Settings — Wrap), как было описано выше.

Nedit*text.foreground: black

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

Nedit*text.background: white

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

Nedit*text.selectForeground: black

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

Nedit*text.selectBackground: gray80

Определение цвета фона выделенного первичным способом фрагмента. Следует заметить только, что число после наименования цвета обозначает яркость (saturation) его в процентах. То есть gray80 — это светло-серый, а, скажем, gray20 — темно-серый. Во всех относящихся к цветовой гамме пунктах возможны также значения имени цвета с прилагательными — light или dark.

Nedit*text.highlightBackground: red

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

Nedit*text.cursorForeground: black

Ну, понятно, просто цвет курсора.

Nedit*text.lineNumForeground: gray47

Цвет, которым передается нумерация строк (если эта опция включена).

Nedit*text.blinkRate: 600

А это частота мерцания курсора в миллисекундах. Если установить значение 0, курсор, к счастью, мерцать не будет вообще.

Nedit*foreground: black

Задает цвет текста меню и диалоговых панелей.

Nedit*background: gray70

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

Nedit*fontList: helvetica-bold-14

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

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

Nedit.statsForm

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

Nedit*statsForm*background: gray

задает для них единый серый цвет фона.

Nedit*menuBar

В этой и нижеследующих строках можно по той же модели определить характеристики линии главного меню,

Nedit*textHorScrollBar

… полосы горизонтальной…

Nedit*textVertScrollBar

… и вертикальной прокрутки.

Nedit*helpText

Эта строка, якобы, позволяет определить характеристики окна системы помощи. Однако у меня она на шрифт сообщений Help’а никакого действия не оказала.

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

Nedit*font: -cronyx-fixed-medium-r-*-*-20-*-*-*-*-*-koi8-r

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

Таким образом, в секцию !Nedit файла /$HOME/.Xdefaults можно внести изрядное количество строк. Но можно — не значит нужно. Достаточно ограничиться только теми строками, определяющими характеристики, не устраивающие вас по умолчанию.

Файлы .Nedit и .Neditdb

Редактированием файла /$HOME/.Xdefaults удается настроить то немногое, что не получается настроить через главное меню. Однако в домашнем каталоге пользователя можно обнаружить еще два конфигурационных файла, имеющих отношение к NEdit.Nedit и .Neditdb.

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

Содержание файла .Nedit составляет описание тех самых параметров, которые настраиваются через главное меню Preferences — Default Settings. К коему и следует, как гласит комментарий, прибегать для его изменения. Тем не менее, он доступен и для ручного редактирования, что, как и всякую свободу выбора, следует расценить только положительно.

Начальная (после комментариев) строка файла — указание на номер версии:

Nedit.fileVersion: 5.1

Затем следуют секции описания настраиваемых меню Shell, Macro и контекстного:

Nedit.shellCommands:
 spell:Alt+B:s:EX:n
 ...
Nedit.macroCommands:
 Headers>header1:F1::: {n
 ...
Nedit.bgMenuCommands:
 Undo:::: {n
 ...

соответственно. Описывать их содержимое я не буду. Скажу только, что первая строка после заглавия секции содержит название скрипта или макроса (в том самом виде, как оно отображается в соответствующем меню (так, для приведенного макроса — двухуровневом, Headers>header1). Затем, разделяясь двоеточиями, следуют всякого рода дополнительные сведения, такие, как закрепленная клавишная комбинация или мнемоническое обозначение.

Следующие секции

Nedit.highlightPatterns: C:Defaultn
 C++:Defaultn
 ...
Nedit.languageModes:     C:.c .h::::::".,/`'!|@#%^&*()-=+{}[]"":;<>?~"n
 C++:.cc .hh .C .H .i .cxx
 ...
Nedit.styles:     Plain:black:Plainn
 Comment:gray20:Italicn
 ...

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

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

Ну а файл .Neditdb — это просто список (задумчиво называемый базой данных) ранее открывавшихся файлов с указанием полных абсолютных путей. Что характерно, в списке пункта меню File — Open Previous они даются без дублирования — все же буквы db в названии присутствуют не зря.

Макросы и Shell

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

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

  • включить режим протоколирования (через меню MacroLearn Keystrokes или через комбинацию Alt+K);
  • произвести посредством клавиатуры (но не с помощью мыши!) все необходимые действия в той последовательности, в какой мы хотим их сохранить на будущее;
  • завершить режим протоколирования (через меню MacroFinish Learn или повторным нажатием комбинации клавиш Alt+K);
  • в случае ошибки при наборе команд — прервать протоколирование (через меню MacroCansel Learn) и, включив протоколирование по новой, повторить требуемые действия уже без ошибок.

Запротоколированная последовательность действий будет функционировать в течение данного сеанса работы с NEdit. И может быть вызвана первый раз через меню MacroReply Keystrokes и, в дальнейшем, через MacroRepeat. Однако при следующем запуске NEdit будет утрачена.

Чтобы этого не случилось, следует сохранить ее в меню для потомства. Для этого, успешно завершив протоколирование данного макроса, отправляемся в меню Preferences, выбираем там пункт Default Settings, а в нем — опцию Customize Menu. Каковая, в свою очередь обнаруживает, как уже говорилось, пункт Macro Menu, вызывающий панель Macro Commands.

В списке доступных команд (в левой части панели) фиксируемся на пункте New. В поле Menu Entry

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

Group commands>Command1

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

Group commands>Command1@SGML/HTML

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

Затем заполняем поле Accelerator. Здесь за нашей командой можно закрепить какую-либо клавишу (из числа, например, функциональных, или Windows-клавиш) или их комбинацию: например, сочетание клавиш Alt или Control, возможно, в сочетании с Shift, с какой-либо буквой, желательно, имеющей мнемонический смысл.

Для этого достаточно просто зафиксировать курсор в поле Accelerator и нажать требуемую клавишу (например, F12) или их комбинацию (скажем, Control+литера). Следует только внимательно следить, чтобы эта клавишная комбинация не использовалась для вызова штатных функций NEdit: в этом случае приоритет в любом случае будет за последними, а, возможно, клавишная комбинация не будет вызывать ни старого, ни нового закрепленного действия.

Вслед за этим можно заполнить поле Mnemonic, введя в него какую-либо букву из имени нашей команды (как оно указано в поле Menu Entry).

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

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

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

А вот теперь нажимаем экранную клавишу Paste Learn/Replay Macro (правой части панели). И текст макроса волшебным образом появляется в поле Macro Command to Execute. Где может быть любым образом отредактирован, дополнен, сокращен и т.д. После чего жмем клавишу OK, выходя их режима редактирования Macro Menu — и с удовольствием и пользой применяем новую функцию на практике. Если все работает нормально — сохраняем текущую ситуацию через PreferencesSave Defaults для увековечивания внесенных нами изменений.

Каковые, как уже говорилось, фиксируются в секции

Nedit.macroCommands:

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

Однако и этого может показаться недостаточным для полного счастья. Например, возникнет потребность в систематическом исполнении каких-либо внешних программ. Например, команд оболочки. Конечно, на сей предмет можно прибегнуть к стандартному окну терминала — во-первых, к строке минитерминала (вызываемой через меню ShellExecute Command, или клавишной комбинацией (Alt+X) — во-вторых, и к непосредственному вводу команд в поле редактирования NEdit с последующим их запуском (через меню ShellExecute Command Line) — в третьих. Однако все это — не предел комфорта.

К тому же подчас необходимо, чтобы команда оболочки выполнялась в отношении редактируемого в данный момент в NEdit документа. Примером чего служит приведенная в прошлом разделе команда ispell для проверки орфографии. И тут нам на помощь приходит возможность редактирования меню Shell (через PreferencesDefault SettingsCustomize MenuShell Menu).

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

Затем определяемся c входными элементами команды в строке переключателей 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) можно проверить работоспособность команды и, руководствуясь сообщениями об ошибках, ее отредактировать. Можно, разумеется, и просто скопировать успешно запускаемую команду и окна терминала…

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

Пример применения: HTML-редактор своими руками

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

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

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

Путей — несколько. Можно:

  • набирать текст в текстовом процессоре (типа OpenWriter из комплекта OpenOffice) с дальнейшим экспортом в формат html; тем, кто видел html-код, генерируемый текстовыми процессорами, ясно, почему этот вариант я обсуждать далее не желаю;
  • набирать текст в визуальном web-редакторе типа Mozilla Composer; однако замечание из пункта первого имеет место быть и здесь (не говоря уже о личной антипатии к Mozilla как средству редактирования web-страниц);
  • набирать текст в любом симпатичном и подходящем по возможностям html-редакторе с одновременным расставлением требуемых тэгов штатными его средствами; однако далеко не всегда такие редакторы хорошо приспособлены для столь «примитивной» работы; к тому же, подобно тому, как изобилие форматирующих возможностей текстового процессора нарушает течение оригинальной творческой мысли, всякого рода панели к кнопками тэгов не способствуют концентрации мысли на содержательной стороне документа; к тому же оба известных мне полнофункциональных html-редактора под Linux обладают одним общим недостатком: они позволяют набирать текст либо в одну строку (что неудобно визуально), либо с переносом слов через фиксированное количество знаков с образованием символа возврата каретки (что отнюдь не полезно при импорте в текстовый процессор);
  • набирать текст в обычном текстовом редакторе с последующим помещением в редактор кода html, где и осуществляется его (текста) разметка; что, помимо сложностей с двухэтапным созданием документа, приводит к появлению двух содержательно идентичных (по идее) файлов, какой из которых является более актуальным — удается вспомнить не всегда.

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

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

  • во-первых, заголовки нескольких (скорее всего первого-третьего) уровней;
  • во-вторых, тэги образования абзаца (<p>) и разрыва строки (<br>);
  • в третьих, структурные тэги <strong>, <emphasis> и <preformatted text>;
  • в четвертых, всякого рода списки (маркированные, нумерованные, списки с определениями) и их элементы;
  • ну и в пятых, естественно, гиперссылки и именованные якоря (<a href> и <a name>, соответственно).

Вот в такой последовательности и будем создавать соответствующие макросы. Включаем режим протоколирования (через меню Macro — Learn Keystrokes или комбинацию Alt+K) и просто-напросто набираем с клавиатуры последовательность символов

<h1></h1>

Для обеспечения непрерывности набора логично вернуть курсор в позицию между открывающим и закрывающим тэгами, для чего соответствующее количество раз нажимаем клавишу Left. После чего завершаем протоколирование (через меню MacroFinish Learn или повторным нажатием Alt+K), через меню Macro Replay Keystrokes (или — комбинацию Control+K) проверяем правильность исполнения и переходим в меню PreferencesDefault SettingsCustomize MenuMacro Menu.

В появившейся панели Macro Commands указываем в поле Menu Entry

Headers>header1

в поле Accelerator приписываем команде клавишу вызова (например, F1,
благо она не закреплена за вызовом помощи), при желании определяем мнемоническую литеру (хотя большого смысла в этом я не вижу) и смело жмем на экранную кнопку Paste Learn/Reply Macro. В результате в поле Macro Command to Execute появляется код вроде следующего:

insert_string("<")
insert_string("h")
insert_string("1")
insert_string(">")
insert_string("<")
insert_string("/")
insert_string("h")
insert_string("1")
insert_string(">")
backward_character()
backward_character()
backward_character()
backward_character()
backward_character()

Разумеется, никто не заставляет нас оставлять в неприкосновенности столь неуклюжую конструкцию. Заглянув в Help, то его раздел, где рассказывается о синтаксисе макроязыка NEdit, нетрудно сообразить, что insert_string означает просто вставку некоей символьной последовательности. И написать проще и короче: insert_string("<h1></h1>". Что и будет означать вставку тэга заголовка первого уровня.

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

Поскольку проверку правильности макрокоманды мы уже произвели, нажимаем Apply для ее включения в список и переходим к следующему пункту нашей программы. Конечно, можно повторить протоколирование набора для тэгов заголовков всех уровней последовательно. Но проще — с помощью экранной клавиши Copy скопировать только что созданный макрос, изменить в поле Menu Entry ее название с header1 на header2, закрепить за ней клавишу F2 и в поле Paste Learn/Reply Macro отредактировать код вручную, заменив строки

insert_string("<h1></h1>")

на

insert_string("<h3></h3>")

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

Затем переходим к созданию макросов для наиболее часто требующихся при наборе тэгов параграфа и разрыва строки. Порядок действий — идентичный: протоколирование ввода тэга, вызов панели Macro Commands, описание имени команды (с учетом ее положения в иерархическом меню), закрепление свободной комбинации горячих клавиш, помещение «заученного» кода макроса в поле команд для исполнения, включение новой макрокоманды в список доступных. И так — для всех тэгов, которые представляются нам требуемыми при повседневном использовании…

Завершив создание макросов, следует не забыть увековечить их в меню с помощью Preferences — Save Defaults. После чего они будут доступны в последующих сеансах NEdit, поскольку размещаются в секции Nedit.macroCommands: файла .Nedit.

Описанный процесс создания макросов, которых хватает в 90 случаях из 100, занимает считанные минуты. Что, опять-таки, подтверждает величие и силу редактора NEdit: можно представить себе, как способен настроить его для своих задач человек с достаточной программистской квалификацией…

Не трудно настроить по собственному желанию и контекстное меню. Чего в нем недостает? Да тех команд, которые все равно требуют обязательного выделения мышью. Например, вставки гиперссылки. Добавляем их по тому же сценарию (через меню PreferencesDefault SettongsCustomize MenuWindow Background Menu).

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

Чего еще хотелось бы от несложного html-редактора? Ну конечно, визуализации производимых изменений в каком-либо внешнем браузере. Каковым, с большой долей вероятности, будет Mozilla текущей версии.

Для этого мы прибегнем к настройке меню Shell (PreferencesDefault SettingsCustomize MenuShell Menu).

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

Browser>netscape Browser>links Browser>opera

оставляя, скорее всего, пустыми поля Accelerator и Mnemonic (не столь это частая процедура, вызов внешнего браузера, чтобы тратить на нее драгоценную клавишную комбинацию, коих и так не в избытке). А затем вводим в поле Shell Command to Execute строку

xterm -e mozilla %

или иную любимую терминальную программу в качестве первого элемента. И ни в коем случае не забыв параметр %, предписывающей Netscape отображать именно редактируемый в NEdit файл.

Теперь разбираемся с переключателями. В линейке Command Input логично отметить значение None (иначе есть риск получить по закрытии Netscape пустой файл), в линейке Command Output — значение same window. Кроме того, не худо включить также опцию записи текущего файла перед выполнением команды (Save file before executing command).

Все, принимаем изменения (экранной клавишей Apply) и проверяем действие команды. Если все нормально, выбор из меню Shell пункта netscape должен вызвать появление сначала терминального окна, а затем — окна браузера Netscape Navigator, отображающего редактируемый файл в текущем его состоянии. Если да — сохраняем ситуацию (через меню PreferencesSave Defaults) и с гордым и независимым видом пользуемся собственноручно созданным html-редактором…

Подводя итоги, можно сказать, что по своим возможностям и настраиваемости NEdit вплотную приближается к Vin или emacs (а учитывая возможность сколь угодно широкого наращивания функциональности пунктов меню Shell и Macro — возможно, и не уступает). В то же время он предоставляет пользователю удобный и привычный интерфейс, лишенный архаических особенностей как emacs, так и vim.

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

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