Linux для всех

индекс
247,21

Ввод произвольных символов при помощи Compose Key: настройка

Многие знают, что в Linux есть специальная кнопка: Compose. Её действие аналогично виндовым сочетаниям Alt+NumPad (Например, нажатие Alt+0169 даёт символ ©), но не требует хранить перед глазами таблицу кодов символов :) Если настроить правый Alt как Compose Key, то нажав RAlt+O+C получаем тот же значок копирайта: ©.

В статье я опишу способ назначения произвольных сочетаний клавиш для символов. Это будет удобно в первую очередь математикам: не нужно будет лазить в таблицу символов чтобы ввести «∀ε>0 ∃δ(ε)≕δ>0: ∀x∈O(x₀) |f(x)<A|» в любом приложении, поддерживающем юникод. Кроме математических символов, будут доступны всевозможные стрелочки (→↗⇖⇔⟲⟽), галочки (✘✔), буллеты (•‣★), кавычки («»), длинное тире (—), дроби(⅓, ⅞), диа⃫кр͎е̃ти⃰ческие зн⃫аки и всё что душе угодно в необъятном юникоде! :)

Включаем

Первое что нужно сделать чтобы получить доступ к Compose Key – включить его :) Достаточно удобно установить правый Alt в качестве составной кнопки: вряд ли он часто используется. Примеры будут для Ubuntu, в других дистрибутивах не должно быть большого отличия.

Есть три способа включить Compose Key:
  1. xorg.conf: Compose Key можно назначить в секции «InputDevice» конфига /etc/X11/xorg.conf. Например, так:
    Section "InputDevice"
    Driver "kbd"
    Option "CoreKeyboard"
    Option "XkbRules" "xorg"
    Option "XkbModel" "pc105"
    Option "XkbLayout" "us,ru"
    Option "XkbOptions" "grp:alt_shift_toggle,grp_led:scroll,compose:ralt"
    EndSection
  2. Если у вас установлен Gnome, топаем по меню в System→Preferences→Keyboard→Layouts→[Layout Options] и устанавливаем «Compose key position» на правый Alt. У меня нет Gnome под рукой, списал отсюда :)
  3. Если у вас KDE4, то в System Settings→Regional&Language→Keyboard Layout→[Advanced] и в секции «Compose key position» ставим галку напротив «Right Alt»
  4. John_Minority подсказывает, что можно в файле ~/.xinitrc указать следующее: setxkbmap -options "compose:ralt..."

Может потребоваться перезапуск X сервера. Если всё сделано правильно, проверяем: жмём RAlt, отпускаем, потом (с шифтом) O и C. Должен получиться значок копирайта ©.

Конфиг

В инете полно списков доступных сочетаний, но ни один не описывает их полностью. Мы же будет умнее и не будет ничего запоминать: настроим всё под себя :)
Сочетания по умолчанию лежат в гигантском файле /usr/share/X11/locale/en_US.UTF-8/Compose. Его можно использовать как шпаргалку :) Трогать там ничего не надо: в домашней папке создаём файл ~/.XCompose и будем описывать там свои сочетания клавиш, которые отменят все стандартные.
Синтаксис файла прост: каждая строка описывает сочетание, комментарии начинаются с символа '#'. Рассмотрим на примере: добавляем в пустой файл ~/.XCompose строку:
<Multi_key> <o> <C> : "℃" U2103 # DEGREE CELSIUS и сохраняем файл.

В угловых скобках подряд описывается сочетание клавиш. Compose в терминах X-сервера называется «Multi_key». Дальше идёт двоеточие, и в кавычках указывается символ (или строка!), получающийся при нажатии этих клавиш. Последний – Unicode код символа, его вводить не обязательно. Хорошим тоном считается в комментарии дать оригинальное название символа, которое можно подсмотреть в таблице символов.
Добавленный символ будет доступен без перезагрузки иксов, но – только в новых приложениях. Поэтому запускаем новый текстовый редактор, и проверяем, нажимая и сразу же отпуская сочетания: RAlt, o, Shift+c. Ура :)

Важный момент: все названия клавиш в конфиге регистрозависимы: так, <Multi_key> и <Multi_Key> – разные клавиши, причём, второй вариант не будет распознан иксами. Внимательно!
Имена клавиш для литиницы и цифр совпадают с одиночной буквой: <a>-<z>,<A>-<Z>,<0>-<9> нам доступны. Стрелки <Left>,<Right>,<Up>,<Down> (первая буква – большая!) – тоже можно использовать. Но как же догадаться, что тильда называется <asciitilde> и никак иначе?

Узнаём названия клавиш

Открываем консоль, и выполняем следующее:
xev | fgrep "keysym"
Откроется окно xev. Делаем его активным, проверяем текущую раскладку и нежно нажимаем тильду (да, с шифтом). В консоли теперь видно название клавиши:
state 0x11, keycode 49 (keysym 0x7e, asciitilde), same_screen YES,
Для русских букв тоже есть названия:
state 0x2010, keycode 47 (keysym 0x6d6, Cyrillic_zhe), same_screen YES,

Настраиваем

Вооружившись всей этой информацией, можно сразу легко забацать целое семейство стрелочек, вводимых кнопкой «минус» и двойным нажатием стрелки в нужном направлении:
<Multi_key> <minus> <Right> <Right> : "→"
<Multi_key> <minus> <Left> <Left> : "←"
<Multi_key> <minus> <Up> <Up> : "↑"
<Multi_key> <minus> <Down> <Down> : "↓"

Однако сразу будет видно, что «минус» на цифровой клавиатуре не работает. Лезем в xev, и обнаруживаем, что он называется иначе: «KP_Subtract». Внимательно!
Можно добавить ещё алиасов для NumPad:
<Multi_key> <KP_Subtract> <Right> <Right> : "→"
<Multi_key> <KP_Subtract> <Left> <Left> : "←"
<Multi_key> <KP_Subtract> <Up> <Up> : "↑"
<Multi_key> <KP_Subtract> <Down> <Down> : "↓"

Теперь всё работает.
Есть ещё одни грабли: допустим, мы запишем в файл следующее:
<Multi_key> <minus> <minus> : "–" U2013 # EN DASH
<Multi_key> <minus> <minus> <minus> : "—" U2014 # EM DASH

И попробуем ввести EM-DASH (длинное тире): уже на втором нажатии минуса выдастся короткое тире. Причина в том, что X-сервер выбирает первую удавшуюся последовательность (EN DASH) и пишет её. При составлении файла нужно внимально следить чтобы ни одно сочетание не перекрывало другие!
Поэтому делаем так: для короткого тире добавляет точку:
<Multi_key> <minus> <minus> <period> : "–" U2013 # EN DASH
<Multi_key> <minus> <minus> <minus> : "—" U2014 # EM DASH


И последнее: если хочется просто расширить существующий набор символов и ничего не менять, в начале файла инклюдим стандартный:
include "/usr/share/X11/locale/en_US.UTF-8/Compose"

Готовое решение

Не буду приводить всю таблицу и расписывать её создание, лишь дам ссылку на проект на гуглокоде где можно скачать моё творение и подправить под себя. Файл будет обновляться в процесса расширения набора символов и поиска багов :)
Уклон выбранных символов весьма хабрахабровский: IT и математика :)

Enjoy!

UPD: исправил баг с пересекающимися © и Ⓒ. На гуглокоде лежит обновлённый файл и пхп скрипт, проверяющий все последовательности на пересечения.
+42
6 января 2010, 07:13
67

комментарии (50)

+1
avsej #
В vim для таких целей есть удобная фича digraph (:help digraph).
Посмотреть таблицу символом с их кодами и мнемоническими сокращениями можно командой :digraph.
Символ копирайта можно вставить либо по коду CTRL+V 169 либо по мнемоническму сокращению CTRL+K Co.

Я думаю так будет проще, тем более что ввод таких символов чаще нужен при наборе текста, чем в чатах или браузере
+2
Cancel #
Вовсе не проще, XCompose работает везде, а это — только в vim.
+1
avsej #
vim есть везде :) а XCompose? а X?
0
Mezomish #
Ну, допустим, у меня есть вим, да. Как мне сделать, чтобы эта вимовская фича работала, скажем, в ФФ?
–1
avsej #
написать в вим и вставить в ФФ, вим — текстовый редактор, а ФФ браузер
+1
Mezomish #
Этот комментарий Вы написали в виме, после чего вставили в браузер?
0
avsej #
нет. но если бы хотел вводить спецсимволы, то воспользовался привычным способом
0
Mezomish #
Т.е. если Вам понадобится в комментарии на форуме (или в IM-клиенте, или ещё где-нибудь) поставить знак ©, или ⇔, или €, то Вы откроете вим, наберёте текст там, а потом скопипастите туда, куда нужно?
0
avsej #
так как мне это надо очень редко, мне проще и быстрее запустить вим, чем настраивать и запоминать новые сочетания
0
Fragster #
я кавычки типа « и » использую очень часто в комментах, и делаю это именно через compose-key. также ©, ° и € достаточно часто используются… да, и переключение на другую раскладку пока нажата правая вин-клавиша (grp:rwin_switch) — очень удобно
0
avsej #
ну да, это дело привычки. мне больше по душе обычные кавычки, а лапки и длииные тире больше уместны в типографики, но и даже там удобнее использовать более безопасные комбинации. Hапример TeX автоматически преобразует "<<" или "---" и в этом случае — опять же vim :). Кстати хабр три тире обрабатывает.
0
Fragster #
тем более, что как правило, сочетания логичны: "<< "=> "«", "---" =>"—", «e=»€"—" и т.п.
0
o_O_Tync #
Никто не мешает настроить XCompose так, чтобы сочетания повторяли vim :)
0
o_O_Tync #
ФФ содержит в себе текстовый редактор. Вот если бы присобачить vim'овские фичи в пола ввода – да, вы бы были правы. А переключение приложений ради пары символов с трудом можно назвать удобным :)
0
avsej #
vim у меня настроен на горячую клавишу и запускается оочень быстро
+1
AlexcYeCu #
В настоящее время использовать compose крайне неудобно. Во-первых, поддержка .XCompose сошла на нет (если раньше приходилось в gtk-приложениях переставлять im-метод на xim, то теперь и qt4-софт не понимает .XCompose). Во-сторых, недавно добавился занятный баг: MultiKey+.+. стал выдавать ˙ вместо …
Так что мой выбор — iBus. Очень просто создавать свои раскладки, работает надёжно.
0
dema #
А ткните в какой-нить мануал?.. В гугле не могу найти…
+1
AlexcYeCu #
Там всё просто. Ставите ibus, к нему пакеты с нужными раскладками. Греческий, эсперанто — это есть в репах обычно. В /usr/share/m17n и /usr/share/ibus смотрите какие файлы есть и по аналогии делаете свою раскладку. Я добавил раскладку с типографскими знаками, фонетическими (английская и международная транскрипция) и всякую фигню вроде смайлов, значков радиации и прочего. Запускается как ibus-daemon -x -d. Появляется значок в трее. По ctrl+space вкл/выкл., по ctrl+alt меняет набор символов.
0
o_O_Tync #
Любопытно, спасибо! Только раскладка – это всё же не сочетания. Сложно себе представить удобную раскладку для ввода стрелочек :)
+1
AlexcYeCu #
Объясняю. сtrl+space: появляется индикатор раскладки. жмёте, к примеру, b затем u (они подсвечиваются), затем * и получаем ★. Ну вот я, к примеру, на bu* этот символ повесил. Для того, чтоб набрать æ — соотв. a и e в режиме ibus. Смайл я на sm повесиил: ☺. Можно на любую другую комбинацию. Раскладок сколько угодно и каких угодно. Хоть всё в 1 — включили-набрали-отключили. Сочетания ставите любые удобные. Да, Multi-Key ИНОГДА НЕМНОГО быстрее, скажем, кавычки-ёлочки, длинное тире, дроби — через MK всё же побыстрее, но чечётка на пальцах то ещё удовольствие, да и кривая поддержка .XCompose напрягает.
Что до поддержки в qt4 — вы путаете поддержку MultiKey и .XCompose. С первой всё ок, со второй — увы. xim надо включать потому, что обычно для gtk-приложений дефолтный im не держит толи .XCompose, толи вообще MultiKey. Ес-но можно xim зарегистрировать как системный im-метод для GTK.
Особенность дистрибутива: в Fedora9 и Fedora10 до какого-то апдейта с xim было всё нормально, затем дистростроители взяли курс на ibus. Впрочем, не только дистростроители — баг с многоточием появился во всех дистрах с очередным обновлением и я не вижу особой спешки в деле его исправления, хотя его закоммитили уже и в Ubuntu, и в Fedora, и в багтрекере иксов.
0
o_O_Tync #
Очень интересно, спасибо! Compose'у не хватает именно логического разделения символов на категории ИМХО. В моём файле это заметно :) С удовольствием поковыряюсь, может даже опишу в статье. Или, может, вы сделаете это раньше? ;)
0
AlexcYeCu #
Отписать я врядли смогу: у меня комменты-то раз в пять минут. Так что пишите. Будут вопросы, постараюсь подсказать, но там вроде просто всё.
0
o_O_Tync #
Qt4 поддерживает Compose: иначе не было бы возможности выбора клавиши, да и у меня всё отлично работает :) В GTKшных приложениях тоже. Нуобходимость переключения ввода на XIM где-то видел, но, кажется, он стоит по умолчанию. Особенность дистрибутива?
+4
gildor #
Ⓒ — не символ копирайта. А буква C в круге. Символ копирайта — © (у меня кстати по умолчанию висит на той же последовательности, что и у вас: RAlt+O+C)
0
Cancel #
Почему минусы? Очень и очень правильное замечание!
0
rypy #
К тому же, по alt+0169 выдает ©, а не Ⓒ (который у меня, например, не отображается правильно).
0
o_O_Tync #
Спасибо, исправил :) Был перехлёст последовательностей для копирайта и буквы в круге.
0
Dolfer #
> ∀ε>0 ∃δ(ε)≕δ>0: ∀x∈O(x₀) |f(x)<A|

Это что? Может так:

{ lim f(x) = A } ⇔ { ∀ε>0 ∃δ>0: ∀x∈U(a) → f(x) ∈ U(A) }
x→a
(предел функции по Коши, в первом случае δ-окрестность, во втором — ε, обе проколотые)
0
o_O_Tync #
Именно он. Способов определения много, а здесь главное – пример :)
0
Cancel #
Всё, конечно, здорово. Но на разных раскладках разные комбинации. Например, на русской раскладке невозможно напечатать символ «č». А вот символ евро (€) вполне можно, поскольку для него есть явная запись (<Multi_key> <Cyrillic_ES> <equal>). Однако и тут грабли: сочетение «Comp с =» (с — кириллическая) не работает, а сочетание «Comp С =» (С — заглавная кириллическая С) работает. Другими словами, в стандартном наборе там всё на соплях подвешено и более-менее устойчиво работает только на английской раскладке. А юзерский .XCompose можно считать, что и не работает.

Однако XCompose отлично подходит, когда нужно вставить символы, которых нет на текущей раскладке, а переключаться лень, например, символ «]» вставляется комбинацией <Multi_key> <parenright> <parenright>
0
o_O_Tync #
Вы это зря. Нужно либо тренировать стабильность ввода (запомнить регистр сочетаний), либо кропотливо указать все варианты чтоб не путаться :)
0
Fragster #
настроил временное переключение на другую раскладку пока нажата правая вин-клавиша (grp:rwin_switch) — очень удобно
+2
temujin #
Спасибо за полезную статью. Вот только советую теги поставить по делу. Хотя бы, «linux», «Xorg», «unicode». Я вот подписан на тег «linux» по RSS-у, может не я 1.
А в HAL пробовали настроить Compose кнопку? Думаю отличий быть не должно.
0
mishunika #
очень полезная статья! спасибо большое, теперь будет удобнее %)
0
fsqcds #
А еще в Gnome вводить unicode-символы можно с помощью комбинации Ctrl+Shift+U, [код символа], Return. Также есть удобный апплет на гном-панель.
0
fsqcds #
Ссылка почему-то не добавилась library.gnome.org/users/char-palette/2.28/charpick-introduction.html.ru
0
nanodust #
поддерживаю, самый правильный способ.
  ▲
▲ ▲
0
silvansky #
Не работает если смена раскладки клавиатуры по Ctrl+Shift настроена.
0
koct9i #
ӸӸӸ
0
DukeGlukem #
Пользуюсь compose уже года два, очень удобно. Раньше приходилось ради пары символов (ö,ü,ä,õ) держать третью эстонскую раскладку, помимо русской и английской. Правда я повесил эту фичу на capslock, которым никогда не пользовался и плевался при случайном нажатии.
0
glazs #
О, а я Caps Lock переключаю раскладку. А Compose повесил на Scroll Lock.
+1
John_Minority #
Я в овсуме запихал в .xinitrc «setxkbmap -options «compose:ralt...»
+3
sigizmund #
Справедливости ради стоит заметить, что математик скорее напишет:

\forall \epsilon > 0 \exists \delta(\epsilon)=\delta > 0: \forall x \in O(x_{\alpha}) | f(x) < A| 

Как правило такие сложные выражения уже символами не вводят.
0
o_O_Tync #
Верно. А вам не приходилось писать в аське решение задачи, а потом объяснять что такое sqrt и что значит символ ^? :))
0
sigizmund #
Боюсь что нет ;-)
+1
Fragster #
у меня в kopete есть модуль, который сам заменяет latex'ные формулы на их графическое отображение
0
o_O_Tync #
Интересно! А название модуля? :)
0
Fragster #
kopetex называется
+1
John_Minority #
! у нас курсовые некоторые преподователи только в бимере принимают)
Так что я с вами абсолютно согласен. Хоть я только полукровка)
0
dobry_kolbasnik #
работает =) спасибо

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