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

       

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


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

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

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

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

  • набирать текст в текстовом процессоре (типа StarWriter из комплекта StarOffice) с дальнейшим экспортом в формат html; тем, кто видел html-код, генерируемый текстовыми процессорами, ясно, почему этот вариант я обсуждать далее не желаю;
  • набирать текст в визуальном web-редакторе типа Netscape Composer; однако замечание из пункта первого имеет место быть и здесь (не говоря уже о личной антипатии к Netscape как средству редактирования 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. После чего завершаем протоколирование (через меню Macro - Finish Learn или повторным нажатием Alt+K), через меню Macro Replay Keystrokes (или - комбинацию Ctrl+K) проверяем правильность исполнения и переходим в меню Preferences - Default Settings - Customize Menu - Macro 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()


Поскольку проверку правильности макрокоманды мы уже произвели, нажимаем Apply для ее включения в список и переходим к следующему пункту нашей программы. Конечно, можно повторить протоколирование набора для тэгов заголовков всех уровней последовательно. Но проще - с помощью экранной клавиши Copy скопировать только что созднанный макрос, изменить в поле Menu Entry ее название с header1 на header2, закремить за ней клавишу F2 и в поле Paste Learn/Reply Macro отредактировать код вручную, заменив строки insert_string("1") на insert_string("2")
И подобную процедуру повторить для заголовков всех потребных уровней (вряд ли число их превысит четыре).
Затем переходим к созданию макросов для наиболее часто требующихся при наборе тэгов параграфа и разрыва строки. Порядок действий - идентичный: протоколирование ввода тэга, вызов панели Macro Commands, описание имени команды (с учетом ее положения в иерархическом меню), закрепление свободной комбинации горячих клавиш, помещение "заученного" кода макроса в поле команд для исполнения, включение новой макрокоманды в список доступных. И так - для всех тэгов, которые представляются нам требуемыми при повседневном использовании...
Завершив создание макросов, следует не забыть увековечить их в меню с помощью Preferences - Save Defaults. Псоле чего они будут доступны в последующих сеансах NEdit, поскольку размещаются в секции nedit.macroCommands: файла .nedit.
В приложении 2 я привожу содержимое этой секции после того, как я разработал серию макросов для своих личных целей. Не судите строго: с точки зрения программиста-профессионала, ничего замечательного там не содержится. Но а) этот процесс занял у меня считанные минуты, и б) результатов его мне вполне хватает в 90 случаях из 100.
Что, опять-таки, подтверждает величие и силу редактора NEdit: можно представить себе, как способен настроить его для своих задач человек с достаточной программистской квалификацией...
Чего еще хотелось бы от несложного html-редактора? Ну конечно, визуализации производимых изменений в каком-либо внешнем браузере. Каковым, с большой долей вероятности, будет Netscape Navigator текущей версии.
Для этого мы прибегнем к настройке меню Shell (Preferences - Default Settings - Customize Menu - Shell Menu). В соотвествтующей панели определяем, как рассказывалось ранее, поле имени команды; если есть желание просматривать плоды своих трудов в разных браузерах, можно создать иерархическое меню вроде Browser>netscape Browser>lynx Browser>opera


оставляя, скорее всего, пустыми поля Accelerator и Mnemonic (не столь это частая процедура, вызов внешнего браузера, чтобы тратить на нее драгоценную клавишную комбинацию, коих и так не в избытке).
А затем вводим в поле Shell Command to Execute строку konsole -e netscape %
или иную любимую терминальную программу в качестве первого элемента (xterm. rxvt, etc.). И ни в коем случае не забыв параметр %, предписывающией Netscape отображать именно редактируемый в NEdit файл.
Теперь разбираемся с переключателями. В линейке Command Input логично отметить значение None (иначе есть риск получить по закрытии Netscape пустой файл), в линейке Command Output - значение same window. Кроме того, не худо включить также опцию записи текущего файла перед выполнением команды (Save file before executing command).
Все, принимаем изменения (экранной клавишей Apply) и проверяем действие команды. Если все нормально, выбор из меню Shell пункта netscape должен вызвать появление сначала терминального окна, а затем - окна браузера Netscape Navigator, отображающего редактируемый файл в текущем его состоянии. Если да - сохраняем ситуацию (через меню Preferences - Save Defaults) и с гордым и независимым видом пользуемся собственноручно созданным html-редактором...

Содержание раздела