Начальная страница

Генерация символов, отсутствующих на стандартной клавиатуре

На этой странице описан способ генерации произвольных символов с использованием механизма макросов в программах Notepad++ и OpenOffice.

Notepad++

Macro submenuПосле долгих поисков еще простой, но функционально достаточной программы для обработки текстовых файлов, я остановился на Notepad++ (http://notepad-plus.sourceforge.net/). Эта программа обладает некоторыми возможностями для расширения функциональности, в том числе с помощью макросов. Для тех, кто пишет тексты, содержащие символы разных кодировок, может оказаться важной и возможность создания текстовых файлов в формате UTF-8 или Unicode-16. Такой файл, оставаясь сугубо текстовым, то есть не содержа элементов форматирования (кроме стандартных: абзац и табулятор), может одновременно использовать символы разных кодовых страниц, например, кириллицу и умлауты. Причем и те и те будут правильно отображаться.

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

Макросы записываются в файл «shortcuts.xml», который может быть отредактирован вручную. Структуру макроса лучше всего пояснить на примере.

Макрос для вставки знака параграфа (номера строк добавлены здесь):

(1) <Macro name="paragraph" Ctrl="no" Alt="no" Shift="no" Key="0">
(2) <Action type="1" message="2170" wParam="0" lParam="0" sParam="&#xA7;" />
(3) </Macro>

В строчке (1) можно/нужно указать имя макроса (name=""), в том виде, как оно будет отображаться в меню, а также активировать клавиши, используемые в комбинации: Ctrl, Alt, Shift. Key="" содержит номер знаковой клавиши, используемой для вызова макроса. При Key="0" комбинация «горячих» клавиш не назначается и выбор данной команды может производиться исключительно через меню.

Допустимые номера в Key="" (как минимум отчасти) совпадают с десятичными номерами символов в ASCII. Так номера 48..57 соответствуют клавишам с цифрами 0..9; 65..90 – буквам A..Z. Выбранная вами комбинация, однако, не будет активирована, если такая комбинация уже используется самой программой. Например, если комбинация Ctrl+P закреплена для позиции меню Print, то вставки знака параграфа с ее помощью будет невозможна. Переназначение «горячих» клавиш можно произвести в «Settings-> Shortcut Mapper...».

В строчке (2) нас интересует код символа, содержащийся в sParam="&#xA7;". В данном случае это «A7»(шестнадцатерично) или «167»(десятично), что соответствует в кодировке ISO 8859-1 и Windows знаку параграфа «§». Таким образом можно вставлять символы с номерами 0..255 (00..FF). Однако значение символов с номерами 128..255 может зависеть от выбранной кодовой страницы; для знака параграфа и некоторых других, это, однако, в большинстве случаев значения не имеет, а вот для кириллицы или умлаутов совсем напротив.

Format menu itemNotepad++ позволяет выбирать между разными способами кодирования, например, ANSI и UTF-8. ANSI/Windows – клаcсическое кодирование с кодовыми страницами, каждый символ кодируется одним байтом. UTF-8 использует в зависимости от символа от 1 до 4 байт. ANSI вполне достаточно для отображения знаков кириллицы на компьютере с русской версией Windows, или умлаутов – на компьютере с немецкой версией.

Для того, чтобы отображать умлауты с русской ОС (без дополнительной перенастройки) или наоборот, а также для одновременного отображения символов разных алфавитов необходимо многобайтовое кодирование, то есть вставка нескольких байт вместо одного. В системе UTF-8 символы с номерами 0..127 остаются однобайтовыми, их коды совпадают с кодами ASCII. Символы, которые в ANSI оказываются во второй половине (128..255), кодируются двумя байтами. Сюда попадает кириллица и специфические символы национальных европейских алфавитов (немецкий, французский, испанский и т.д.). Подробнее про UTF-8 можно посмотреть, например: http://ru.wikipedia.org/wiki/UTF-8 (рекомендуются также статьи на эту тему на других языках).

Для написания макросов вручную полезна информация о кодах UTF-8:
http://www.utf8-chartable.de/ (и далее по ссылкам)

Например, мы хотим генерировать с помощью комбинации Alt+C знак французского алфавита «ç» (ц седиль строчная). В строке (1) мы указываем отображаемое имя макроса, ставим Alt="yes", и номер клавиши Key="67". Не забываем отключить комбинацию Alt+C, если она уже используется программой. Далее мы ищем по таблицам описание нужного знака и находим следующее:

Unicode
code point
characterUTF-8
(hex.)
name
............
U+00E7 ç c3 a7LATIN SMALL LETTER C WITH CEDILLA

Нас интересует столбик UTF-8, содержащий значение «C3 A7». Первое число «C3» должно быть вставлено в команде (2), а второе число – «A7» – в команде (3). Итого получаем:

(1) <Macro name="c cedille: UTF-8" Ctrl="no" Alt="yes" Shift="no" Key="67">
(2) <Action type="1" message="2170" wParam="0" lParam="0" sParam="&#xC3;"/>
(3) <Action type="1" message="2170" wParam="0" lParam="0" sParam="&#xA7;"/>
(4) </Macro>

Для того, чтобы седиль и умлауты действительно отображались, в меню Format должно быть выбрано UTF-8 (или аналогичное, если вы знаете, почему).

Пример файла «shortcuts.xml», содержащего команды для генерации знака параграфа, франко-русских кавычек (все три в кодировке ANSI) и специфических знаков немецкого алфавита (UTF-8).

OpenOffice

OpenOffice (http://www.openoffice.org/) является бесплатной и в чем-то даже лучшей альтернативой пока еще самому распространенному редактору текстов. Для расширения функциональности в OpenOfficе может использоваться механизм макросов на основе встроенного варианта языка BASIC – StarBASIC.

На практике первый макрос лучше записать с использованием команды «Tools-> Macros->Record Macro». Действия, которые необходимо записать, состоят в выборе команды «Insert->Special Character->[вставка нужного знака]».

Полученный макрос будет выглядеть примерно так (номера строк добавлены здесь):

(1) sub a_uml_gross
(2) rem ----------------------------------------------------------------------
(3) rem define variables
(4) dim document as object
(5) dim dispatcher as object
(6) rem ----------------------------------------------------------------------
(7) rem get access to the document
(8) document = ThisComponent.CurrentController.Frame
(9) dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

(10) rem ----------------------------------------------------------------------
(11) dim args1(1) as new com.sun.star.beans.PropertyValue
(12) args1(0).Name = "Symbols"
(13) args1(0).Value = "Ä"
(14) rem args1(1).Name = "FontName"
(15) rem args1(1).Value = "Times New Roman"

(16) dispatcher.executeDispatch(document, ".uno:InsertSymbol", "", 0, args1())

(17) end sub

Сгенерированный макрос имеет смысл чуть изменить («Tools-> Macros-> Organize Macros-> OpenOffice.org Basic-> Edit»), а именно убрать или закоментировать строчки (14) и (15), иначе символы будут вставляться с использованием указанного там шрифта. Записывать другие макросы вручную необязательно, достаточно скопировать полученный, изменив в строчке (13) вставляемый символ. Каждый макрос должен, естественно, получить свое уникальное имя, строчка (1). После этого макросам для их вызова могут быть присвоены комбинации «горячих» клавиш либо кнопки тулбаров, в том числе созданных пользователем («Tools-> Customize-> Keyboard/Toolbars»; в диалоге Keyboard список макросов расположен в окне Category, позиция OpenOffice.org Macros; если у вас не установлен JRE и выдается соответствующее сообщение об ошибке, то несколько нажатий на кнопку OK месседж-бокса позволяет преодолеть это препятствие).

 

Copyright А. Г. Румянцев, 2009 MailBox