LINUX.ORG.RU

Использование AltGr для третьего (после без-shift'а и с shift'ом) набора символов в раскладке


0

0

Здравствуй, All!

Эта тема переползла сюда из
http://www.linux.org.ru/view-message.jsp?msgid=3918784&lastmod=1249302299796

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

Обычно в раскладке используются 2 набора символов.
Первый набор — это всё то, что мы можем вводить без shift'а (не переключая раскладки).
Второй набор — это то, что мы вводим, зажав shift.

В терминологии xkb эти наборы называются уровнями.
Так вот, меня приятно удивило то, что кроме первого и второго уровня Иксы позволяют организовать третий и даже четвёртый.

Третий набор оказался очень удобен для ввода всяких не часто, но и не очень редко используемых символов типа «·», «„», «“», «°», «§», «±», «≈», «⌀», стрелок.

На второй уровень мы переходим удерживанием shift'а. На третий уровень я перехожу удерживанием правого Альта, также известного как AltGr. Можно настроить использование другой клавиши.
ВНИМАНИЕ! Возможно, это глюк Иксов. При использовании для перехода на третий уровень правого альта оба альта почему-то перестают работать в важных сочетаниях Ctrl-Alt-Fn (n=1...12) и Ctrl-Alt-Backspace.

Для использования уровня 3 редактируются 2 файла:
/etc/X11/xkb/symbols/ru
/etc/X11/xorg.conf

В файле .../ru определяется соответствие «коды клавиш — вводимые ими символы».
В этом файле определена общеизвестная раскладка ru с вариантом winkeys и ещё всякие варианты.

Ниже я приведу свой вариант раскладки. Он вряд ли кому-то подойдёт, потому что сильно отличается от winkeys. Но на его основе легко сделать свой собственный. Надеюсь, меня не накажут за слишком длинное сообщение, разбитое на 2 части :-)

Я дописал в конец файла /etc/X11/xkb/symbols/ru свой вариант раскладки ru — feo:

----- BEGIN -----
partial alphanumeric_keys
xkb_symbols "feo" {
include "ru(basic)"
name[Group1]= "Russia - Feo";

// Unicode U+NNNN can be written here as 0x0100NNNN.

key <TLDE> { [ question, asterisk, periodcentered ] };

key <AE01> { [ exclam, 1, 0x01000301 ] };
key <AE02> { [ guillemotleft, 2, doublelowquotemark ] };
key <AE03> { [ guillemotright, 3, leftdoublequotemark ] };
key <AE04> { [ semicolon, 4, quotedbl ] };
key <AE05> { [ colon, 5, percent ] };
key <AE06> { [ comma, 6, apostrophe ] };
key <AE07> { [ period, 7, degree ] };
key <AE08> { [ underscore, 8, asciicircum ] };
key <AE09> { [ parenleft, 9, bracketleft ] };
key <AE10> { [ parenright, 0, bracketright ] };
key <AE11> { [ minus, 0x01002212, section ] };
key <AE12> { [ equal, plus, plusminus ] };

key <BKSL> { [ emdash, slash, numerosign ] };

key <AB10> { [ Cyrillic_io, Cyrillic_IO ] };

// TODO: вынести маленькие цифры на доп клаву на уровни 2 и 3.
//⁰⁴⁵⁶⁷⁸⁹⁻
//₀₉

key <AD01> { [ Cyrillic_shorti, Cyrillic_SHORTI, 0x01002196 ] };
key <AD02> { [ Cyrillic_tse, Cyrillic_TSE, 0x01002191 ] };
key <AD03> { [ Cyrillic_u, Cyrillic_U, 0x01002197 ] };
key <AD04> { [ Cyrillic_ka, Cyrillic_KA ] };
key <AD05> { [ Cyrillic_ie, Cyrillic_IE ] };
key <AD06> { [ Cyrillic_en, Cyrillic_EN ] };
key <AD07> { [ Cyrillic_ghe, Cyrillic_GHE ] };
key <AD08> { [ Cyrillic_sha, Cyrillic_SHA ] };
key <AD09> { [ Cyrillic_shcha, Cyrillic_SHCHA ] };
key <AD10> { [ Cyrillic_ze, Cyrillic_ZE ] };
key <AD11> { [ Cyrillic_ha, Cyrillic_HA, 0x01002717 ] };
key <AD12> { [Cyrillic_hardsign,Cyrillic_HARDSIGN, 0x01002713 ] };
key <AC01> { [ Cyrillic_ef, Cyrillic_EF, 0x01002190 ] };
key <AC02> { [ Cyrillic_yeru, Cyrillic_YERU, 0x010021BB ] };
key <AC03> { [ Cyrillic_ve, Cyrillic_VE, 0x01002192 ] };
key <AC04> { [ Cyrillic_a, Cyrillic_A ] };
key <AC05> { [ Cyrillic_pe, Cyrillic_PE, 0x01002248 ] };
key <AC06> { [ Cyrillic_er, Cyrillic_ER ] };
key <AC07> { [ Cyrillic_o, Cyrillic_O ] };
key <AC08> { [ Cyrillic_el, Cyrillic_EL ] };
key <AC09> { [ Cyrillic_de, Cyrillic_DE, 0x01002300 ] };
key <AC10> { [ Cyrillic_zhe, Cyrillic_ZHE ] };
key <AC11> { [ Cyrillic_e, Cyrillic_E ] };
key <AB01> { [ Cyrillic_ya, Cyrillic_YA, 0x01002199 ] };
key <AB02> { [ Cyrillic_che, Cyrillic_CHE, 0x01002193 ] };
key <AB03> { [ Cyrillic_es, Cyrillic_ES, 0x01002198 ] };
key <AB04> { [ Cyrillic_em, Cyrillic_EM ] };
key <AB05> { [ Cyrillic_i, Cyrillic_I ] };
key <AB06> { [ Cyrillic_te, Cyrillic_TE, 0x010021C4 ] };
key <AB07> { [Cyrillic_softsign,Cyrillic_SOFTSIGN ] };
key <AB08> { [ Cyrillic_be, Cyrillic_BE ] };
key <AB09> { [ Cyrillic_yu, Cyrillic_YU ] };

//key <KPSU> { [ minus, 0x0100207B, 0x0100208B ] };
//key <KPDL> { [ period, comma ] };
//key <KP0> { [ 0, 0x01002070, 0x01002080 ] };
//key <KP1> { [ 1, 0x010000B9, 0x01002081 ] };
//key <KP2> { [ 2, 0x010000B2, 0x01002082 ] };
//key <KP3> { [ 3, 0x010000B3, 0x01002083 ] };
//key <KP4> { [ 4, 0x01002074, 0x01002084 ] };
//key <KP5> { [ 5, 0x01002075, 0x01002085 ] };
//key <KP6> { [ 6, 0x01002076, 0x01002086 ] };
//key <KP7> { [ 7, 0x01002077, 0x01002087 ] };
//key <KP8> { [ 8, 0x01002078, 0x01002088 ] };
//key <KP9> { [ 9, 0x01002079, 0x01002089 ] };

include "level3(ralt_switch)"
};
----- END -----

Синтаксис файла .../ru может быть довольно хитёр, но в данном случае всё просто.
Рассмотрим для примера строку
key <AE01> { [ exclam, 1, 0x01000301 ] };

В ней определяется, что вводит клавиша <AE01> на разных уровнях.
<AE01> — это условное название клавиши в Иксах. Оно не зависит от раскладок. Вот бы Емаксу научиться использовать эти коды в конфигах. Ненаглядно, зато работало бы вне зависимости от раскладки :-)

Клавиша <AE01> — это кнопка, на которой нарисованы «!» и «1».
Вводимые клавишей <AE01> символы заданы несколькими разными способами.
exclam — восклицательный знак,
1 — цифра «1»,
0x01000301 — символ Юникода U+0301 (ударение).

exclam и 1 — это условные Иксовые имена символов. Я не нашёл документа, описывающего их, и пытался выцепить их из файла
/usr/lib/libX11.so.6.2.0
Можете поискать там по слову «exclam». Найти там получилось далеко не все нужные символы. Кстати, оказалось, что просматривать файл удобнее всего в кодировке CP1251.

Оставшиеся символы я ввёл просто в форме 0x0100NNNN, где NNNN — четырёхзначный номер символа (кодовой точки) в Юникоде. Вроде бы вводить можно и прямо в форме «U+NNNN», но я не пробовал.

В файле xorg.conf я изменил секцию «InputDevice» для клавиатуры. Теперь в ней прописано использование описанной в файле .../ru раскладки ru в варианте feo:

----- BEGIN -----
Section "InputDevice"
Identifier "Keyboard0"
Driver "kbd"
Option "XkbModel" "pc104"
Option "XkbLayout" "us,ru(feo)"
Option "XkbOptions" "grp:ctrl_shift_toggle,grp_led:scroll"
EndSection
----- END -----

Здесь всё просто:
Option "XkbLayout" "us,ru(feo)"
говорит, что будут использоваться 2 раскладки: us и ru в варианте feo.

Метод работает в Xandros на EeePC 900 и в Slackware 12.1. Сделать свою раскладку помог документ http://www.xfree86.org/current/XKB-Enhancing.pdf.

Опробовать свой вариант раскладки можно в kedit или OpenOffice или Firefox и ещё почти во всех программах, кроме Емакса. Он умудряется перехватывать правый Альт и говорит, что что-то не так нажимается с его Метой.

Надеюсь, описанное кому-нибудь пригодится :-)

sergey_feo
() автор топика
Ответ на: комментарий от sergey_feo

P.S. Использование правого Альта задаётся строкой
include "level3(ralt_switch)"
Другие варианты можно найти в /etc/X11/xkb/symbols/level3.

P.P.S. Если уж делать свою собственную раскладку — то и под Windows тоже. Там она делается с помощью программы «Microsoft Keyboard Layout Creator» (требует .NET Framework). Скачивается прямо с сайта MS.

sergey_feo
() автор топика
Ответ на: комментарий от sergey_feo

P.P.P.S.
Строчки про дополнительную клавиатуру (//key <KP0>...) закоментированы, потому что её я не осилил :-) Там всё как-то похитрее, чем с основной частью клавиатуры.

sergey_feo
() автор топика

Форвардни куда-нибудь, на руникс или yellowleaf.

Igron ★★★★★
()

Для желающих иметь в X-ах одновременно (переключение или Ctrl-Shift, или AltGr) несколько кодировок можно попробовать такие настройки:
Driver "kbd"
Option "XkbRules" "xorg"
Option "XkbModel" "pc104"
Option "XkbLayout" "lv,ru"
Option "XkbOptions"
"grp:ctrl_shift_toggle,grp_led:scroll,compose:lwin"

Результат таков:
обычная раскладка
qwertyuiop[]\
asdfghjkl;'
zxcvbnm,./
QWERTYUIOP{}|
ASDFGHJKL:»
ZXCVBNM<>?
1234567890-=
!@#$%^&*()_+

Ctrl-Shift
йцукенгшщзхъ\
фывапролджэ
ячсмитьбю/
ЙЦУКЕНГШЩЗХЪ|
ФЫВАПРОЛДЖЭ
ЯЧСМИТЬБЮ?
1234567890-=
!»#*:,.;()_+

AltGr
qwēŗtyūīōp«»`
āšdfģhjķļ;“
žxčvbņm─·/
QWĒŖTYŪĪŌP“”˘
ĀŠDFĢHJĶĻ:„
ŽXČVBŅM×÷˙
¹²³€½¾{[]}\–
¡⅛£¢⅜⅝⅞™±°¿—

habital
()
Ответ на: комментарий от sergey_feo

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

opium_inside
()

Великолепно, огромное спасибо!

Deleted
()
Ответ на: комментарий от AreS

Можно вставлять символ U0301, работает после любой буквы. Естественно, только в юникоде. Если нужны уже скомбинированные символы — можно и их на раскладку добавить..

x3al ★★★★★
()
18 сентября 2009 г.
Ответ на: комментарий от sergey_feo

Внимание! Описанный мной метод не работает на Slackware 13.0 (xorg-server 1.6.3).

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

После 2-х часов ковыряний я нашёл 3 места, которые надо поправить, чтобы заработало.

Первое место — файл xorg.conf. Новые Искы по умолчанию игнорируют настройки клавиатуры, прописанные в xorg.conf, и берут их у HAL'а. Поэтому можно либо попросить Иксы работать как раньше, либо засовывать настройки клавиатуры в Иксы через HAL, либо использовать команду setxkbmap в какой-нибудь автозагрузке. Я пошёл по пути «заставить работать как раньше». Для этого в начало xorg.conf добавляется:

Section "ServerFlags"
  Option   "AutoAddDevices"    "False"
  Option   "AllowEmptyInput"   "False"
  Option   "AutoEnableDevices" "False"
EndSection

Строка

Option   "AllowEmptyInput"   "False" 
не даёт Иксам игнорировать настройки клавиатуры в xorg.conf. Если игнорирование есть, то оно сопровождается надписью типа

(WW) Disabling Keyboard0

в логе Иксов.

Строка

  Option   "AutoAddDevices"    "False"
отключает дублирование (и даже троирование) событий от старого варианта ввода с клавиатуры и от варианта через HAL. Без этого у меня вводилось по 3 символа вместо одного.

Строка

  Option   "AutoEnableDevices" "False"
не знаю, что означает. Полагается согласно комментарию в /usr/share/hal/fdi/policy/10osvendor/10-keymap.fdi :-)

Теоретически можно попробовать задать настройки клавиатуры и через HAL. Тогда вроде бы надо скопировать /usr/share/hal/fdi/policy/10osvendor/10-keymap.fdi в /etc/hal/fdi/policy и подредактировать его, а xorg.conf может вообще отсутствовать. Это я не проверял.

Второе место — нетронутые строчки в файле /etc/X11/xkb/symbols/ru. Если взять этот файл со Слаки 12.1, то он не будет работать в Слаке 13.0. Поэтому этот файл должен быть из новой системы, а в конце, как и раньше, должна быть приписана своя раскладка.

Третье место — описание своей раскладки в /etc/X11/xkb/symbols/ru. Там вместо include «ru(basic)» по новой моде надо писать include «ru(common)».

sergey_feo
() автор топика
Ответ на: комментарий от sergey_feo

В общем, в сумме:

/etc/X11/xorg.conf у меня теперь кроме прочего содержит

Section "ServerFlags"
  Option   "AutoAddDevices"    "False"
  Option   "AllowEmptyInput"   "False"
  Option   "AutoEnableDevices" "False"
EndSection

и

Section "InputDevice"
  Identifier "Keyboard0"
  Driver "kbd"
  Option "XkbModel" "pc104"
  Option "XkbLayout" "us,ru(feo)"
  Option "XkbOptions" "grp:ctrl_shift_toggle,grp_led:scroll"
EndSection

А в файле /etc/X11/xkb/symbols/ru, взятом из новой системы, среди прочего теперь есть:

xkb_symbols "feo" {
    include "ru(common)"
    name[Group1]= "Russia - Feo";

    // Unicode U+NNNN can be written here as 0x0100NNNN.

    key	<TLDE> {	[        question,        asterisk,        periodcentered	]	};
    
    key	<AE01> {	[          exclam,               1,            0x01000301    	]	};
    key	<AE02> {	[   guillemotleft,	         2,    doublelowquotemark	]	};
    key	<AE03> {	[  guillemotright,               3,   leftdoublequotemark  	]	};
    key	<AE04> {	[	semicolon,               4,              quotedbl	]	};
    key	<AE05> {	[	    colon,	         5,               percent     	]	};
    key	<AE06> {	[	    comma,               6,            apostrophe 	]	};
    key	<AE07> {	[	   period,               7,                degree 	]	};
    key	<AE08> {	[      underscore,               8,           asciicircum       ]	};
    key	<AE09> {	[	parenleft,       	 9,           bracketleft	]	};
    key	<AE10> {	[      parenright,               0,          bracketright	]	};
    key	<AE11> {	[           minus,      0x01002212,               section	]	};
    key	<AE12> {	[	    equal,	      plus,             plusminus	]	};

    key	<BKSL> {	[	   emdash,           slash,            numerosign	]	};

    key	<AB10> {	[     Cyrillic_io,     Cyrillic_IO    				]	};


    key	<AD01> {	[ Cyrillic_shorti, Cyrillic_SHORTI,            0x01002196	]	};
    key	<AD02> {	[    Cyrillic_tse,    Cyrillic_TSE,            0x01002191	]	};
    key	<AD03> {	[      Cyrillic_u,	Cyrillic_U,            0x01002197	]	};
    key	<AD04> {	[     Cyrillic_ka,     Cyrillic_KA	]	};
    key	<AD05> {	[     Cyrillic_ie,     Cyrillic_IE	]	};
    key	<AD06> {	[     Cyrillic_en,     Cyrillic_EN	]	};
    key	<AD07> {	[    Cyrillic_ghe,    Cyrillic_GHE	]	};
    key	<AD08> {	[    Cyrillic_sha,    Cyrillic_SHA	]	};
    key	<AD09> {	[  Cyrillic_shcha,  Cyrillic_SHCHA	]	};
    key	<AD10> {	[     Cyrillic_ze,     Cyrillic_ZE	]	};
    key	<AD11> {	[     Cyrillic_ha,     Cyrillic_HA,            0x01002717	]	};
    key	<AD12> {	[Cyrillic_hardsign,Cyrillic_HARDSIGN,          0x01002713	]	};
    key	<AC01> {	[     Cyrillic_ef,     Cyrillic_EF,            0x01002190	]	};
    key	<AC02> {	[   Cyrillic_yeru,   Cyrillic_YERU,            0x010021BB	]	};
    key	<AC03> {	[     Cyrillic_ve,     Cyrillic_VE,            0x01002192	]       };
    key	<AC04> {	[      Cyrillic_a,	Cyrillic_A	]	};
    key	<AC05> {	[     Cyrillic_pe,     Cyrillic_PE,            0x01002248	]	};
    key	<AC06> {	[     Cyrillic_er,     Cyrillic_ER	]	};
    key	<AC07> {	[      Cyrillic_o,	Cyrillic_O	]	};
    key	<AC08> {	[     Cyrillic_el,     Cyrillic_EL	]	};
    key	<AC09> {	[     Cyrillic_de,     Cyrillic_DE,            0x01002300	]	};
    key	<AC10> {	[    Cyrillic_zhe,    Cyrillic_ZHE	]	};
    key	<AC11> {	[      Cyrillic_e,	Cyrillic_E	]	};
    key	<AB01> {	[     Cyrillic_ya,     Cyrillic_YA,            0x01002199	]	};
    key	<AB02> {	[    Cyrillic_che,    Cyrillic_CHE,            0x01002193	]	};
    key	<AB03> {	[     Cyrillic_es,     Cyrillic_ES,            0x01002198	]	};
    key	<AB04> {	[     Cyrillic_em,     Cyrillic_EM	]	};
    key	<AB05> {	[      Cyrillic_i,	Cyrillic_I	]	};
    key	<AB06> {	[     Cyrillic_te,     Cyrillic_TE,            0x010021C4	]	};
    key	<AB07> {	[Cyrillic_softsign,Cyrillic_SOFTSIGN	]	};
    key	<AB08> {	[     Cyrillic_be,     Cyrillic_BE	]	};
    key	<AB09> {	[     Cyrillic_yu,     Cyrillic_YU	]	};
       
    include "level3(ralt_switch)"        
};

sergey_feo
() автор топика

Удивительные люди слакварщики. Вроде, во всем разбираются, но предлагаемые ими решения потрясают своей неоптимальностью.

Есть же XkbOption misc:typo

svu ★★★★★
()
Ответ на: комментарий от sergey_feo

> Option "AutoAddDevices" "False"
> Option "AllowEmptyInput" "False"

> Option "AutoEnableDevices" "False"

Ну если не нужно подключать устройства на лету - конечно, можно и помучаться...

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

Уже перемалывали. Если старые возможности создавали сложности, их делают новыми опциями

svu ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.