магія ijkl

| комп'ютери, клавіатура, підказки

за два роки з компактною клавіатурою я дуже звик рухати курсор комбінацією fn+ijkl. а оскільки fn на pok3r'і можна призначити на capslock, то й для навігації текстом чи веб-сторінкою не доводиться відривати пальці від основного положення…

…проблема виникає тоді, коли треба бодай трішки щось зробити на іншій клавіатурі. отже, давня мрія: переналаштувати обробника клавіатури linux так, щоби capslock+ijkl (і кілька інших комбінацій) працювали, як на pok3r'і.

щойно подужав… але поки що не впетраю, як це до ладу автоматизувати. поки що просто занотую, як робиться руцями.

capslock

спершу я спробував зробити справу за допомогою xmodmap — вийшло лише частково. але принаймні переналаштування capslock працює:

! ----------------------------------------
! CapsLock працюватиме як ISO_Level3_Shift
! (третій рівень, зазвичай правий Alt)
! ----------------------------------------
clear lock
clear mod5
add mod5 = Caps_Lock ISO_Level3_Shift
keycode 66 = ISO_Level3_Shift Caps_Lock

це треба зберегти до текстового файлу (приміром, capslock.xmodmap) і завантажити:

xmodmap capslock.xmodmap

після цього capslock дублює функцію правого alt'а (який на моїх обох розкладках, канадській багатомовній та українській unicode, дає доступ до «третього шару» — символів на кшалт µ, {} ы тощо), але разом із shift'ом працює як звичайний capslock.

ijkl та латинка

в канадській багатомовній отримати навігацію з altr+ijkl можна так само за допомогою xmodmap. по-перше, можна експортувати поточну розкладку (xmodmap -pke) і підглянути налаштування саме для цих клавіш (grep):

xmodmap -pke | grep -e "^.*=\ *[ijkl]" > ijkl.xmodmap

маю щось таке у файлі ijkl.xmodmap:

keycode  31 = i I Cyrillic_sha Cyrillic_SHA NoSymbol NoSymbol rightarrow idotless
keycode  44 = j J Cyrillic_o Cyrillic_O NoSymbol NoSymbol U0133 U0132
keycode  45 = k K Cyrillic_el Cyrillic_EL NoSymbol NoSymbol kra NoSymbol NoSymbol NoSymbol Cyrillic_lje Cyrillic_LJE
keycode  46 = l L Cyrillic_de Cyrillic_DE NoSymbol NoSymbol U0140 U013F NoSymbol NoSymbol Serbian_dje Serbian_DJE

ліворуч (від =) коди клавіш на вході обробника клавіатури xorg. праворуч — те, що обробник подає на вихід, залежно від стану (shift, ctrl тощо). приміром, j та J — це символи (насправді псевдоніми) при нормальному натисканні та з shift'ом. далі — другий рівень (в моєму випадку українська розкладка), нормально та з shift'ом; тут вже добре видно, що це псевдоніми: cyrillic_sha (ш) та cyrillic_SHA (Ш).

емпіричним шляхом виявляю, що наступні два псевдоніми (NoSymbol NoSymbol) — це третій рівень першої розкладки, саме те, що вмикає правий alt: так само нормальний ввід та з shift'ом. міняю на псевдоніми потрібних дій:

keycode  31 = i I Cyrillic_sha Cyrillic_SHA Up Up rightarrow idotless
keycode  44 = j J Cyrillic_o Cyrillic_O Left Left U0133 U0132
keycode  45 = k K Cyrillic_el Cyrillic_EL Down Down kra NoSymbol NoSymbol NoSymbol Cyrillic_lje Cyrillic_LJE
keycode  46 = l L Cyrillic_de Cyrillic_DE Right Right U0140 U013F NoSymbol NoSymbol Serbian_dje Serbian_DJE

згодовую xmodmap'ові й маю бажану навігацію capslock+ijkl, але лише на першій розкладці, канадській:

xmodmap ijkl.xmodmap

 

ijkl та кирилиця

коли я спробував той самий фокус для української розкладки, здогадуючись (див. псевдоніми в рядках keycode 45 та 46), що 11-й та 12-й псевдоніми мають відповідати за третій рівень (altr) другої розкладки — виявилося, що [k] та [l] працюють, а от [i] та [о] — дзуськи. після не дуже результативного гугління поліз глибше — в налаштування xkb, і знайшов.

щоби вивантажити налаштування xkb до файлу layout.xkbcomp:

xkbcomp $DISPLAY layout.xkbcomp

по-перше, аліаси потрібних клавіш (коди 31, 44, 45 та 46):

<AD08> = 31;
...
<AC07> = 44;
<AC08> = 45;
<AC09> = 46;

тут A — основна частина клавіатури, D та C — ряди (знизу вгору), 07 — номер клавіші. далі шукаю налаштування для кожної клавіші. ось моя j:

key <AD08> {
  type[group1]= "EIGHT_LEVEL_SEMIALPHABETIC",
  type[group2]= "ALPHABETIC",
  symbols[Group1]= [ i, I, Up, Up, rightarrow,  idotless, NoSymbol, NoSymbol ],
  symbols[Group2]= [  Cyrillic_sha, Cyrillic_SHA ]

порівнюючи це з одним рядком виводу xmodmap для клавіші [i] (код 31), здогадуюсь: це мої розкладки (type[groupX]) і відповідний набір псевдонімів (symbols[groupX]). українська для j відформатована за шаблоном "alphabetic", котрий містить (це видно вище у файлі) лише два символи: нормальний та з shift'ом (оті cyrillic_sha та cyrillic_SHA). ось шаблон:

type "ALPHABETIC" {
  modifiers= Shift+Lock;
  map[Shift]= Level2;
  map[Lock]= Level2;
  level_name[Level1]= "Base";
  level_name[Level2]= "Caps";

};

так само [j] має лише два символи в українській розкладці. натомість, клавіші [k] та [l] в українській розкладці відформатовано за іншим шаблоном, в якому визначено чотири символи (і після спроби редагування xmodmap'ом тут вже є потрібні псевдоніми down):

key  {
type[group1]= "EIGHT_LEVEL_SEMIALPHABETIC",
type[group2]= "FOUR_LEVEL_ALPHABETIC",
symbols[Group1]= [ k, K, Down, Down, kra, NoSymbol, NoSymbol, NoSymbol ],
symbols[Group2]= [ Cyrillic_el, Cyrillic_EL,
Down, Down ]

шаблон «four_level_alphabetic»:

type "FOUR_LEVEL_ALPHABETIC" {
modifiers= Shift+Lock+LevelThree;
map[Shift]= Level2;
map[Lock]= Level2;
map[LevelThree]= Level3;
map[Shift+LevelThree]= Level4;
map[Lock+LevelThree]= Level4;
map[Shift+Lock+LevelThree]= Level3;
level_name[Level1]= "Base";
level_name[Level2]= "Shift";
level_name[Level3]= "Alt Base";
level_name[Level4]= "Shift Alt";

};

отже, щоби навігація працювала і в українській розкладці, треба «поремонтувати» налаштування клавіш [i] (AD08) та [j] (AC07) — замінити шаблон і додати по два псердоніми:

key <AD08> {
type[group1]= "EIGHT_LEVEL_SEMIALPHABETIC",
type[group2]= "FOUR_LEVEL_ALPHABETIC",
symbols[Group1]= [ i, I, Up, Up, rightarrow, idotless, NoSymbol, NoSymbol ],
symbols[Group2]= [ Cyrillic_sha, Cyrillic_SHA, Up, Up ]
};
...
key <AC07> {
type[group1]= "EIGHT_LEVEL_SEMIALPHABETIC",
type[group2]= "FOUR_LEVEL_ALPHABETIC",
symbols[Group1]= [ j, J, Left, Left, U0133, U0132, NoSymbol, NoSymbol ],
symbols[Group2]= [ Cyrillic_o, Cyrillic_O, Left, Left ]
};

після цього завантажую налаштування:

xkbcomp layout.xkbcomp $DISPLAY

і навігація capslock+ijkl працює з обома розкладками.

 

проблеми

на жаль, налаштування працюють до перезавантаження, перелогінення, ба навіть перепідключення зовнішньої клавіатури. можливе вирішення —
  • модифіковані розкладки вже з потрібними налаштуваннями (але доведеться щоразу після поновлення системи їх відновлювати, мабуть);
  • або ж якийсь скрипт для вивантаження налаштувань xkbcomp, автоматичного редагування і зворотнього завантаження.
окрім того, треба додати home, end, pgdn, pgup та insert, як це зроблено на pok3r'і. але принаймні це вже зрозуміло як зробити.