Xorg (Українська)/Keyboard configuration (Українська)

From ArchWiki

У цій статті мова йде про налаштування клавіатури для Xorg. Щоб дізнатись про складніші теми, на зразок модифікування розкладки чи перевизначення клавіш, прочитайте X keyboard extension та Extra keyboard keys відповідно.

Xorg сервер використовує X keyboard extension (Клавіатурне розширення X) (XKB) для визначення розкладок клавіатури. Також, можна використати xmodmap щоб отримати прямий доступ до внутрішньої таблиці кодів клавіш, проте її не варто використовувати для складних робіт. Окрім цього, можна використати localectl із systemd щоб визначити розкладку клавіатури як для Xorg, так і для віртуальної консолі.

Примітка: Деякі середовища стільниці, як-от GNOME та KDE можуть перезаписувати параметри XKB.

Перегляд налаштувань клавіатури

Ви можете використати цю команду, щоб дізнатись, які налаштування XKB дійсні на даний момент:

$ setxkbmap -print -verbose 10
Setting verbose level to 10
locale is C
Applied rules from evdev:
model:      evdev
layout:     us
options:    terminate:ctrl_alt_bksp
Trying to build keymap using the following components:
keycodes:   evdev+aliases(qwerty)
types:      complete
compat:     complete
symbols:    pc+us+inet(evdev)+terminate(ctrl_alt_bksp)
geometry:   pc(pc104)
xkb_keymap {
        xkb_keycodes  { include "evdev+aliases(qwerty)" };
        xkb_types     { include "complete"      };
        xkb_compat    { include "complete"      };
        xkb_symbols   { include "pc+us+inet(evdev)+terminate(ctrl_alt_bksp)"    };
        xkb_geometry  { include "pc(pc104)"     };
};

Сторонні допоміжні програми

Існують „неофіційні“ програми, які займаються виводом інформації про розкладку клавіатури.

$ xkb-switch
us
$ xkblayout-state print "%s"
de

Вибір розкладки

Keyboard layout in Xorg can be set in multiple ways. Here is an explanation of used options:

  • XkbModel обирає модель клавіатури. Вона має вплив на роботу лише кількох додаткових клавіш, які може мати ваша клавіатура. У разі чого, завжди можна виставити значення pc104 або pc105. Але, наприклад, ноутбуки, зазвичай, мають додаткові клавіші, і щоб заставити їх робити, іноді, достатньо просто вказати правильну модель клавіатури.
  • XkbLayout обирає розкладку. Можна вказати декілька розкладок, через кому.
  • XkbVariant обирає конкретний різновид розкладки для XkbLayout. Наприклад, за замовчуванням sk (Словацька) використовує qwertz, але її можна явно змінити на qwerty, і так далі.
  • XkbOptions містить додаткові налаштування (через кому). Тут можна визначити: як перемикати розкладку, роботу світлодіодів, комбінації клавіш, тощо. У розділі #Широковживані параметри XKB наведені приклади.
Примітка: Потрібно визначити стільки ж видів розкладки, скільки й розкладок. Якщо вам потрібна звичайна розкладка, впишіть пропуск (але залиште коми). Наприклад, щоб вашою основною розкладкою була звичайна us а другорядною — такий вид us розкладки як dvorak, задайте us,us як XkbLayout і ,dvorak як XkbVariant.

Назва розкладки — це, зазвичай, код країни із двох літер. Щоб побачити весь список моделей клавіатур, розкладок, їх підвидів та додаткових налаштувань, разом із коротким описом, відкрийте /usr/share/X11/xkb/rules/base.lst. Або ж, Ви можете скористатись цими командами, щоб отримати списки без описів:

  • localectl list-x11-keymap-models
  • localectl list-x11-keymap-layouts
  • localectl list-x11-keymap-variants [layout]
  • localectl list-x11-keymap-options

Ось що робить приклад з наступного розділу: він визначає модель клавіатури як pc104, cz — як основну розкладку, us — як другорядну, використовує такий різновид розкладки us як dvorak, та дозволяє перемикати розкладки клавішами Win+Space. Дізнайтеся більше: xkeyboard-config(7).

Примітка: В користувачів Fcitx або IBus цей спосіб може не спрацювати, або працювати недовго, так як ці програми контролюють розкладку. Користувачам Fcitx потрібно встановити перший спосіб вводу як Keyboard - layout. Прочитайте Fcitx#Input methods configuration. Натомість, користувачі IBus мають увімкнути параметр "Use system keyboard layout" в Preference -> Advanced якщо вони користуються файлами налаштувань X, або ж виставити розкладку вручну через setxkbmap.

Використання setxkbmap

Tango-view-fullscreen.pngThis article or section needs expansion.Tango-view-fullscreen.png

Reason: Udev також відміняє зміни зроблені setxkbmap (наприклад, якщо підключити нову клавіатуру) (Discuss in Talk:Xorg (Українська)/Keyboard configuration (Українська)#Persisting layout when USB keyboard connected)

Зміни, зроблені setxkbmap стосуються лише одного сеансу роботи X, їх можна зробити постійними в xinitrc або в xprofile. Цим ви перезапишете загальносистемні налаштування, задавання яких описане в розділі #Використання файлів налаштування X. Проте, налаштування сторонніх клавіатур усе одно не будуть зберігатись якщо не задати їх id в setxkbmap. Або ж якщо це основна клавіатура X сервера.

Використовується він ось так (див. setxkbmap(1)):

$ setxkbmap [-model xkb_model] [-layout xkb_layout] [-variant xkb_variant] [-option xkb_options]
Примітка: setxkbmap додає обрані параметри до тих, що були задані раніше (вони зберігаються як властивості кореневого вікна). Якщо ви хочете замінити всі попередньо задані параметри, використайте ключ -option з пустими аргументами.

Щоб просто поміняти розкладку (-layout — це ключ за замовчуванням):

$ setxkbmap xkb_layout

Для множинного налаштування:

$ setxkbmap -model pc104 -layout cz,us -variant ,dvorak -option grp:win_space_toggle

Використання файлів налаштування X

Примітка: xorg.conf читається X сервером на початку його роботи. Щоб ваші зміни набули чинності перезавантажте X.

Синтаксис файлів X пояснено в Xorg#Configuration. Вони задають параметри, які зберігаються після завершення роботи.

Приклад такого файлу:

/etc/X11/xorg.conf.d/00-keyboard.conf
Section "InputClass"
        Identifier "system-keyboard"
        MatchIsKeyboard "on"
        Option "XkbLayout" "cz,us"
        Option "XkbModel" "pc104"
        Option "XkbVariant" ",dvorak"
        Option "XkbOptions" "grp:win_space_toggle"
EndSection

Використання localectl

Для зручності, можна використати localectl замість того, щоб вручну переписувати файли налаштувань X. Ця команда зберігає налаштування в /etc/X11/xorg.conf.d/00-keyboard.conf. Цей файл не потрібно міняти самотужки бо localectl перезапише його щойно ви її запустите.

Її можна викликати ось так:

# localectl [--no-convert] set-x11-keymap layout [model [variant [options]]]

Якщо ви хочете задати model, variant чи options, вам потрібно задати всі перелічені поля, хоча ви можете їх пропустити вказавши пропуск "". Якщо ключ --no-convert не вказаний, то найбільш схожий до заданої клавіатури, варіант консольної клавіатури, буде використаний в налаштуваннях консолі в vconsole.conf. Дізнайтеся більше в localectl(1).

Створити /etc/X11/xorg.conf.d/00-keyboard.conf можна так:

# localectl --no-convert set-x11-keymap cz,us pc104 ,dvorak grp:win_space_toggle

Широковживані параметри XKB

Зміна розкладки

Щоб мати змогу швидко змінювати розкладку, спершу, вкажіть всі ці розкладки (перша з них буде основною). А потім — клавішу (або комбінацію клавіш) якою вони будуть перемикатись. Наприклад, щоб перемикатись між англійською та шведською розкладками використовуючи клавішу CapsLock, передайте аргумент us,se до XkbLayout і grp:caps_toggle як аргумент до XkbOptions. В XkbLayout потрібно вказати стільки ж розкладок, скільки і їх різновидів у XkbVariant. А якщо ви хочете переключатись між різними видами однієї розкладки, вкажіть її двічі (de,de).

Якщо вам хочеться перемикати розкладки іншими клавішами окрім CapsLock, то доступні варіанти перелічені в /usr/share/X11/xkb/rules/base.lst, починаються на grp: і закінчуються на toggle. Щоб отримати повний список, запустіть команду:

$ grep "grp:.*toggle" /usr/share/X11/xkb/rules/base.lst

Зверніть увагу: параметр grp:alts_toggle не надійний і навряд чи коли його виправлять; виберіть щось інше!

Зупинка Xorg з Ctrl+Alt+Backspace

За замовчуванням, комбінація клавіш Ctrl+Alt+Backspace вимкнена. Ми можете увімкнути її передавши terminate:ctrl_alt_bksp в XkbOptions. Це також можна зробити прив'язавши до певної клавіші функцію Terminate_Server в xmodmap (який відмінить усі налаштування зроблені XkbOptions). Щоб ці способи спрацювали, параметр DontZap в ServerFlags повинен мати значення "off". Хоча, з версії R6.8.0 (2004 рік) [1] воно стоїть за замовчуванням.

Зміна місцями лівого Control і Caps Lock

Щоб поміняти Caps Lock з лівим Control, додайте ctrl:swapcaps до XkbOptions. Ця команда дасть вам список схожих параметрів з описами:

$ grep -E "(ctrl|caps):" /usr/share/X11/xkb/rules/base.lst

Кнопки переміщення курсора

Кнопки переміщення курсора (ті що на цифровій клавіатурі а не на мишці), вимкнені за замовчуванням. Виправити це можна додавши keypad:pointerkeys до XkbOptions. Цим ви заставити комбінацію Shift+NumLock вмикати/вимикати кнопки переміщення курсора.

Більше інформації є у статті X keyboard extension#Mouse control.

Налаштування клавіші compose

Хоч більшість клавіатур і не мають клавіші Compose, її функціонал можна назначити іншій клавіші.

Клавіша Compose дозволяє вводити складні та рідковживані символи, які не передбачені розробником клавіатури, які не можна ввести з натиснутою AltGr. Вони вводяться почерговим натисненням групи клавіш, перша з яких — Compose. Наприклад: Compose ' e напише é, а Compose - - - напише „довге тире“: .

Примітка: На українській розкладці тире можна ввести просто через AltGr -.

Хоч деякі незвичайні клавіатури й мають клавішу Compose, зазвичай, використовують інші клавіші в якості неї. Наприклад, щоб клавіша Menu працювала як Compose використайте налаштування середовища стільниці, або передайте compose:menu до XkbOptions (чи setxkbmap: setxkbmap -option compose:menu). Дозволені заміни клавіш визначені в /usr/share/X11/xkb/rules/base.lst:

$ grep "compose:" /usr/share/X11/xkb/rules/base.lst

Якщо потрібної вам клавіші немає в списку, скористайтесь xmodmap щоб перевизначити ту клавішу на Multi_key, яка працює як Compose (зверніть увагу: setxkbmap стирає зміни, зроблені xmodmap ).

Комбінації клавіш

Стандартні комбінації клавіш залежать від мови системи і зберігаються в /usr/share/X11/locale/використана_мова/Compose, де використана_мова це, наприклад, en_US.UTF-8.

Ви можете додати свої власні комбінації для compose, скопіювавши файл зі списком комбінацій в ~/.XCompose та зробивши допис до нього. Інакше, створіть пустий файл ~/.XCompose та додайте до нього загальний список командою include "%L", наприклад:

~/.XCompose
include "%L"

<Multi_key> <g> <a> : "α"
<Multi_key> <g> <b> : "β"
<Multi_key> <g> <g> : "γ"

Клавіша compose (названа <Multi_key> у файлі ~/.XCompose) з будь-яким із тисяч символів юнікоду, включно з тими, які знаходяться за межами базової багатомовної площини. Перегляньте сторінку посібника Compose(5), там описаний формат файлу XCompose.

GTK не використовує XIM а тому не сприймає клавіші, визначені в ~/.XCompose. це можна виправити й заставити GTK використовувати XIM якщо додати export GTK_IM_MODULE=xim і/або export XMODIFIERS="@im=none" до ~/.xprofile.

Порада: XIM дуже старий, вам варто спробувати інші способи: SCIM, Uim, IBus, тощо. Подробиці в статті Input method.
Примітка: XIM забере можливість вводити символи Unicode через Ctrl+Shift+u.

Символ валюти на іншій клавіші

Більшість європейських розкладок мають символ євро (€) намальований на клавіші 5. Щоб мати змогу вводити його через Alt+5, використайте lv3:lalt_switch та eurosign:5.

Таким же чином можна використати знак рупії (₹) rupeesign:4.

Примітка: Українська розкладка вже має символи валют: долара ($) на Alt+4, євро (€) на Alt+Shift+4 і гривні (₴) — на Alt+Shift+3

Миттєва зміна стану при натисненні на Caps Lock

Ті, хто любить писати великі літери з Caps Lock'ом можуть стикатись із короткою затримкою при зміні стану Caps Lock, через що великими стануть дві чи більше літер (АЛе, ХОча, ЛІнукс). Так стається, бо Caps Lock вмикається миттєво, щойно клавіша натиснута, але вимикається лише коли вдруге натиснута клавіша буде відпущена. Така поведінка — це спадок друкарських машинок, в яких для набору великими літерами фізично затискались клавіші зміни регістру, і для того, щоб звільнити їх, потрібно було відпустити клавішу замка

Деякі більш популярні операційні системи прибрали цю особливість або свідомо (бо вона може збивати з пантелику), або випадково, але все це питання смаку. На трекер Xserver'а приходила купа скарг на неполадки, так як на данай момент немає простого способу перевести систему, щоб вона працювала так, як інші ОС. Для всіх, хто хоче спробувати: скарги та здійснену роботу можна знайти на [2] й [3].

Спосіб обійти проблему

Спершу, вивантажте ваші налаштування клавіатури до файлу:

$ xkbcomp -xkb $DISPLAY xkbmap

У файлі xkbmap, знайдіть розділ Caps Lock. Він починається з key <CAPS>:

 key <CAPS> {         [       Caps_Lock ] };

І замініть увесь розділ на цей код:

key <CAPS> {
    repeat=no,
    type[group1]="ALPHABETIC",
    symbols[group1]=[ Caps_Lock, Caps_Lock],
    actions[group1]=[ LockMods(modifiers=Lock), Private(type=3,data[0]=1,data[1]=3,data[2]=3)]
};

Збережіть та перезавантажте налаштування клавіатури:

$ xkbcomp -w 0 xkbmap $DISPLAY

Налаштування не зберігаються після перезавантаження комп'ютера, тому вам варто зробити так, щоб вони запускались відразу кожного разу після початку роботи X.

Одноклавішні функції

Щоб назначити клавіші функцію, скористайтесь xcape. Для прикладу, можна зробити так, щоб CapsLock робив як Escape якщо натиснути його самого, але як Control якщо його зажати і натиснути на іншу клавішу. Спершу поставте заміну Control скориставшись setxkbmap як було вже сказано раніше, і та призначте клавіші функцію Escape з xcape:

 $ xcape -e 'Caps_Lock=Escape'

Ви можете призначити декілька функцій через кому: Caps_Lock=Escape;Shift_L=Escape.

Якщо ви триматимете клавішу довше встановленого проміжку часу (500мс за замовчуванням), xcape не оброблятиме натиск кнопки (вона вважатиметься затисненою).

Налагодження затримки друку

Затримка друку (typematic delay) визначає як довго (в мілісекундах) потрібно тримати кнопку щоб вона спрацювала повторно. Щойно це станеться, новий символ буде вводитись із частотою (в герцах) заданою темпом друку (typematic rate). Ці два параметри налагоджуються окремо для Xorg і для віртуальної консолі.

Використовуючи xset

Затримку і темп друку для запущеного X сервера можна задати з xset, деякі дії із сервером X можуть заставити його відмінити зміни й повернутись до звичайних налаштувань.

Використання:

$ xset r rate delay [rate]

Щоб виставити затримку 200мс і темп 30гц, скористайтесь командою (додайте її до xinitrc щоб зробити постійною):

$ xset r rate 200 30

Запуск команди без заданих параметрів відкотить їх до стандартних: затримку до 660мс і темп — до 25гц:

$ xset r rate

Використовуючи налаштування запуску X сервера

Надійніший спосіб задати затримку й темп друку — зробити їх звичайними налаштуваннями передавши бажані значення, як параметри, до сервера, на старті:

  • -ardelay мілісекунди - задає затримку автоповтору (проміжок часу в мілісекундах, який треба тримати клавішу щоб запустити автоповтор).
  • -arinterval мілісекунди - задає період автоповтору (проміжок часу в мілісекундах, який який проходить між введенням символу).

У посібнику Xserver(1) є список всіх параметрів запуску сервера X. Дізнайтесь, як передаються ці параметри у вашому менеджері входу.

Див. також