Pull to refresh

Comments 97

Я как раз пошёл по пути правки системных файлов, то есть, по не правильному пути, ты гляжу гораздо дальше продвинулся.

Задачки интересны, даже не знал, что такое возможно сделать.

Правда сейчас мне уже не актуально, своя клавиатура даёт больше свободы, как захотел, так микроконтроллер и запрограммировал.
/граммар-наци/ «XKB: перенастроим клавиши по себя любимого» — … клавиши ПОД СЕБЯ… ну или НАСТРОИМ СЕБЕ ...! /ЕНД граммар-наци/
Извините, наболело. Русский язык стал забывать.
Я для себя уже однозначно решил — caps lock — английский язык, shift caps lock — русский. Невероятно удобно, потому что позволяет исключить процесс определения текущей раскладки из процесса печати. Просто «указываешь» язык перед началом ввода — и у этого указания нет вариантов или разночтений. И никакого «супер интеллекта» всяких пунтосвитчеров, требующих перепроверки.
У меня CapsLock циклически меняет раскладку, а Shift+CapsLock включает/выключает режим CapsLock.

А как включить режим CapsLock? Он редко, но пригождается.
Цикличность смены — вот это зло. Вы нажимая кнопку не знаете результата, пока не проверите результат. Это и есть моя главная претензия. В принципе, если у меня отберут caps lock, то я просто перевешу раскладки на другие кнопки. Но тоже раздельно.

ЕСЛИ МНЕ ПОНАДОБИТСЯ ПЕЧАТАТЬ КАПС-ЛОКОМ, ТО Я МОГУ ДЕЛАТЬ ЭТО С ЗАЖАТЫМ ШИФТОМ. ЭТО НЕ ТОЛЬКО ПРОИЗВЕДЁТ ДОЛЖНОЕ ВПЕЧАТЛЕНИЕ НА МОЕГО СОБЕСЕДНИКА НО ЕЩЁ И ДАСТ МНЕ ОЩУЩЕНИЕ ДОСТАТОЧНОГО УСИЛИЯ ДЛЯ СОЗДАНИЯ ОЧЕНЬ ГРОМКОЙ РЕЧИ.
А у меня Win = абстрактная европейская латиница, слегка заточенная под себя, Shift-Win = абстрактная кириллица с «и», «щ» и «ъ», набираемыми без AltGr (в основном для ввода русских текстов), AltGr-Win — то же самое, но без AltGr вводятся «і», «ў» и апостроф, а «щ», «и» и «є» — с AltGr (для ввода белорусских и иногда украинских текстов). На клавишу </> при этом замаплены разные кавычки.
А как это будет на языке xkbcomp?
Я через console-setup делал, чтобы оно и в консоли (Ctrl-Alt-F1) работало.
Уже нашёл ISO_First_Group ISO_Last_Group
setxkbmap -option "grp:shift_caps_switch"
Я для себя уже однозначно решил — caps lock — английский язык, shift caps lock — русский.

Ациклическое переключение раскладок — наше все.
Для пользователей Windows, желающих настроить переключение языков подобным образом, есть замечательная утилита под названием keyla.
Ациклическое?… Программисты бы это назвали «идемпотентное». В том смысле, что 1 или 3 раза нажать — ничего не поменяется.
Попробовал ваш метод и запарился.

И таки всё равно, чтобы принять решеине — переключать или не переключать, над знать текущую раскладку.
Ну, лишний раз нажать переключение в нужную сторону — это не ошибочно переключиться не туда, стирать ошибку и переключаться второй раз.
Я не сторонник раздельного переключения, как-то в голове текущая раскладка хранится, очень редко ошибаюсь.
Лишний раз нажимать придётся либо вообще каждый раз при смене контекста, либо получается тоже самое — стирать и перенабирать.
У меня глобальная смена раскладки. Редко нужно печатать в одном окне на русском, а в другом на английском, экономия на глобальном переключении для меня больше, чем на сохранении раскладки в каждом из контекстов.
UFO just landed and posted this here
Топик про *nix. Насколько я помню, в 8ке Alt-Shift — частное, Win-Пробел — глобальное.
UFO just landed and posted this here
Большая просьба поделиться конфигом ациклической раскладки. Я вот пытался настроить, но что-то ни чего не получается.
Зачем так сложно?

Буквально на днях я настроил дополнительный «слой» клавиш при помощи AutoKey (sudo apt-get install autokey). Слой активируется модификатором Win (aka Super), благо, в Linux он практически нигде не задействован.

На правой руке: Left, Right, Up, Down, PageUp, PageDown, Home, End.

На левой руке: Enter, Backspace, Delete, Escape, Insert.

AutoKey достаточно муторен в настройке (пришлось даже написать скрипт, который генерирует AutoKey-скрипты и конфиги), зато совершенно тривиален (не нужны знания кишок Linux, не надо редактировать никакие конфиги, не надо ничего запускать в консоли) и портабелен между компьютерами на Linux (!).

В сочетании с Trackpoint'ом и десятипальцевой печатью, это позволяет мне выполнять любые операции, вообще не меняя положения кистей рук. Эффективность работы выросла значительно.

Плюс купил беспроводную клавиатуру, полную копию ноутбучной. Пользуюсь ей, когда ноутбук стоит в док-станции. Очень удобно работать, откинувшись в кресле и держа клавиатуру на коленях, полностью расслабленным и не нуждаясь в мышке. Мышку использую только для выполнения точных (графика, игры) и рутинных манипуляций курсором.

По сути, получился беспроводной аналог клавиатуры MiniGuru, которая так и осталась штучным изделием.

А вот менять стандартные раскладки букв я не хочу. Скоость набора у меня достигает 350 знаков в минуту, что меня полносью устраивает. Понятно, что смена раскладки может поднять этот показатель еще выше, но ценой того, что внезапно все остальные компьютеры станут неудобны. Поддерживать навык слепой печати с двумя парами раскладок — это тяжкое бремя, не оправдываемое получаемой разницей в скорости.
Зачем так сложно?
AutoKey достаточно муторен в настройке

пришлось даже написать скрипт, который генерирует AutoKey-скрипты и конфиги
не надо редактировать никакие конфиги, не надо ничего запускать в консоли

Вы — виртуоз взаимоисключающих параграфов!

По-моему то, что я описал, досаточно прямолинейно. Создали один файл, в котором ничего лишнего, и две строки в .xinitrc.

Кстати, это удивительно, но конфиг XKB тоже портабелен между компьютерами на Linux. И даже BSD.
Салют.

После переустановки ОС хочу отказаться от Autokey: иногда подтормаживает, иногда пропускает исходные комбинации одновременно с измененными.

Позволяет ли ваш способ перебиндивать одно сочетание клавиш в другое? Например, чтобы Super+Ctrl+Shift+J срабатывало как Ctrl+Shift+Left?
По-моему то, что я описал, досаточно прямолинейно. Создали один файл, в котором ничего лишнего, и две строки в .xinitrc.

А вот как сделать, чтобы Ctrl + M превращался в Enter? AutoKey делает без особых проблем.

Я пробовал и, насколько я понимаю, для того, чтобы Control в комбинации с какой-то ещё клавишей давай какую-то третью клавишу, нужно сделать Contol клавишей, которая активирует дополнительный слой. И тогда Control перестанет работать как Control в других комбинациях. Или я неправильно понял?

Правильно всё это делать с помощью xkbcomp.


Для тех, кто не желает городить дополнительный раскладки для нескольких символов, а предпочитает дополнить существующую, ~/.XCompose вполне достаточно. Вот фрагменты моего:

include "/usr/share/X11/locale/en_US.UTF-8/Compose"

<Multi_key> <minus> <greater>   : "→" U2192 # RIGHT
<Multi_key> <less> <minus>      : "←" U2190 # LEFT
<Multi_key> <period> <period> <period>  : "…" U2026 # HORIZONTAL ELLIPSIS, многоточие

<Multi_key> <Cyrillic_zhe> <Cyrillic_ze>            : ":P" # желаю такой смайл
<Multi_key> <Cyrillic_hardsign> <Cyrillic_hardsign> : ":}" # и такой

<Multi_key> <equal> <4>           : "€" # хочу набирать евро, не переключаясь из русской раскладки
<Multi_key> <Cyrillic_es> <equal> : "€"   EuroSign # EURO SIGN

# нерусская кириллица

<Multi_key> <Cyrillic_SOFTSIGN> <minus> : "Ѣ" U0462 #CYRILLIC CAPITAL LETTER YAT
<Multi_key> <Cyrillic_softsign> <minus> : "ѣ" U0463 #CYRILLIC SMALL LETTER YAT

<Multi_key> <Cyrillic_i>  : "і" U0456
<Multi_key> <Cyrillic_I>  : "І" U0406

<Multi_key> <Cyrillic_ie>  : "є" U454
<Multi_key> <Cyrillic_IE>  : "Є" U404

<Multi_key> <Cyrillic_shorti>  : "ї" U0457
<Multi_key> <Cyrillic_SHORTI>  : "Ї" U0407

<Multi_key> <Cyrillic_ve>  : "ў" U045E
<Multi_key> <Cyrillic_VE>  : "Ў" U040E

<Multi_key> <Cyrillic_be>  : "«"
<Multi_key> <Cyrillic_yu>  : "»"
<Multi_key> <Cyrillic_en>  : "ң"
<Multi_key> <Cyrillic_EN>  : "Ң" U04A2
<Multi_key> <Cyrillic_u>   : "ү"
<Multi_key> <Cyrillic_U>   : "Ү" U04AE
<Multi_key> <Cyrillic_o>   : "ө"
<Multi_key> <Cyrillic_O>   : "Ө"

Не совсем понимаю, о чём вы. Про Compose я рассказал. Compose подразумевает нажатие одной клавиши, а потом как минимум ещё одной. А я, в том числе, рассказывал про возможности переноса и совмещения клавиш. В том числе самой клавиши Compose. Вы, например, не задумывались, если часто пользуетесь Compose, перенести её куда поближе, например на левый Shift? Однократное нажатие — Compose. Удержание — Shift.
У меня Compose ближе, чем Shift: RightWinKey.

Я понимаю, что вы об этом упомянули, я дал пример реального использования. А о ремапировании существующих кнопок я нет, не задумывался, потому что моторные навыки дорогого стоят, не всегда я могу сидеть именно за своей клавиатурой, в общем, это сродни двораку, который хорош только для английского, но не все набирают только на английском. Так или иначе, после различных опытов я пришёл к выводу, что умолчательная раскладка хороша именно своей умолчательностью. Впрочем, я никак не оспариваю опыта других, который может быть позитивнее.
раскладки для печати (Dvorak, Colemak и т.п.) сильно улучшают расположение клавиш, ставя их ближе к тем местам, куда нужно меньше тянуться. Но при этом совершенно забывают о модификаторах, спец. символах и командных клавишах (Enter, Backspace, Tab, Esc, Delete).

Действительно, эту проблему все «оптимизаторы» раскладок игнорируют…
С другой стороны, у пользователей (у меня, к примеру) «вбиты в подкорку» уже стандартные позиции «шифтов» (модификаторов и служебных клавиш), если «тасовать» клавиши (к примеру, менял местами CapsLock и Shift, Enter и Shift), то «слепым методом» печатать получается, а начинаешь «управлять» компьютером НЕвслепую — сразу начинаешь «промахиваться», нажимая клавиши на их «старых» местах…
раскладки для печати (Dvorak, Colemak и т.п.) сильно улучшают расположение клавиш, ставя их ближе к тем местам, куда нужно меньше тянуться.

Не только этот критерий используется :)

Но при этом совершенно забывают о модификаторах, спец. символах и командных клавишах (Enter, Backspace, Tab, Esc, Delete).

А что, если их кое-кто их не трогает специально?

Действительно, эту проблему все «оптимизаторы» раскладок игнорируют…

Да это и не проблема, наверное :) Да и в том же Коулмаке есть версия с бэкспейсом на капслоке.

Процедуре оптимизации все равно, какие символы/модификаторы рассматривать, лишь бы была входная статистика использованных сочетаний (печатаем неделю с включенной Typing Statistics, потом загоняем в какой-нибудь из известных оптимизаторов). Можно вообще перемешать и модификаторы, и буквы, и цифры, и знаки, и функциональные клавиши. Но вряд ли кто-то станет на таком работать. При перестройке раскладки все-таки должны оставаться какие-то признаки общности.

Энтер достаточно удобно расположен, на основном ряду, частота его использования не превышает 0,5-1% при наборе обычного текста. На шифты при наборе текста приходится 2-3% всех нажатий, можно их поближе к центру клавиатуры расположить, а какие-нибудь редкоиспользуемые буквы поставить на их место. Но как-то неэстетично будет выглядеть. Поэтому от таких вариантов обычно отказываются. Менять местами шифт и контрол тоже нет особого смысла — клавиши рядом расположены. От таких косметических изменений эффект не сильно большой.

А вот реализовать стрелки управления курсором и клавиши прокрутки страниц на основной части клавиатуры — весьма полезная затея, не поспоришь (собственно, об этом я узнаю уже не в первый раз: из моих друзей и знакомых кое-кто использует).
Также мысль в правильном направлении — назначить каждую раскладку на какую-то строго определенную комбинацию клавиш.

Еще момент: задача оптимизации положения клавиш-модификаторов не столь сложна, как таковая для буквенно-цифровой (основной) части раскладки (на порядок проще система правил). Каждый может быстро настроить под себя даже без сбора обширной статистики близким к оптимальному способом.
Энтер достаточно удобно расположен, на основном ряду, частота его использования не превышает 0,5-1% при наборе обычного текста. На шифты при наборе текста приходится 2-3% всех нажатий,

Ага, только не надо забывать, что на этой же клаве не только набивать тексты будутЬ, но и управлять компом, а вот тут-то и засада…

Менять местами шифт и контрол тоже нет особого смысла — клавиши рядом расположены. От таких косметических изменений эффект не сильно большой.

ibnteo негодуэ! Если бы сейчас была дискуссия, то он доказал бы, что «двигать» Ctrl — вовсе не такое уж пустое занятие…
Ага, я как поставил Ctrl и Shift на левый большой палец, понял, что стандартное их расположение крайне не эргономично, поставили абы куда, на задворки клавиатуры. Правда ещё и с пробелом нужно разобраться, не нужен такой большой, занимающий оба больших пальца, хватит и небольшой кнопки для правого большого пальца. И никакой путаницы, какой рукой когда жать пробел, шифт, и становится не нужен Caps Lock, ведь шифт большим пальцем можно зажать, и спокойно печатать текст.
Ага, я как поставил Ctrl и Shift на левый большой палец, понял,

Ну это да, на больших пальцах — это вообще бомба, но конкретно здесь я имел в виду твои более ранние опыты — когда менялись местами Ctrl и Alt, к примеру…

что стандартное их расположение крайне не эргономично, поставили абы куда, на задворки клавиатуры.

Да нет, они по краям, потому что изобретена печатная машинка была раньше эргономичного 10-пальцевого метода печати, с краю шифты достаточно удобно другой рукой нажимать, это мы, «скоропечатники», «хотим странного».

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

Это да, важно, чтобы производители и пользователи это поняли, хотя, последним пофигу: что дадут — на том и будут «тыкать»…
Это да, важно, чтобы производители и пользователи это поняли, хотя, последним пофигу: что дадут — на том и будут «тыкать»…

И это печально, конечно…
Ага, только не надо забывать, что на этой же клаве не только набивать тексты будутЬ, но и управлять компом, а вот тут-то и засада…

Да, вроде как, никто и не забывал… Но нормально учесть чтобы, нужна статистика по спецклавишам. Есть же здесь программеры и сисадмины, которые работают под виндой, пусть себе TypingStatistics поставят, погоняют недельку. Я бы с удовольствием посмотрел :)

Если бы сейчас была дискуссия, то он доказал бы, что «двигать» Ctrl — вовсе не такое уж пустое занятие…

Ну так я и говорю, что именно менять их местами (Ctrl и Shift) смысла нет особого, а переносить… конечно, можно :)
Другое дело, что под большие пальцы их перенести можно, только если клавиатура нестандартная. А то на обычной большими пальцами кроме пробела другие клавиши бить неудобно.
Пробел, да, длинный, с этим я согласен. Лучше бы всегда делали раздельный.
пусть себе TypingStatistics поставят, погоняют недельку. Я бы с удовольствием посмотрел

Я не сисадмини не программист, но, действительно, поставлю, посмотрю…
Кстати, ставил TypingStatistics, только выкладывать бздю, там же и пароли мои все «отметились»…
Кто знает, как в файлах поменять пароли на что-либо ещё?
Тогда бы я выложил… Правда, я под виндой.
особенно это полезно тем, кто программирует на современном языке, который уже не требует обязательной точки с запятой в конце строки.

Блин, как я рад, что «язык Ц» назван «несовременным»!!!
Никак не могу привыкнуть к формальности ставить точку с запятой в конце строки (причём, конкретной диагностики не выдаётся — ошибка, и всё!).
Это ведь сарказм, да?
Нет, это дебилизм (не мой, языка «Ц»).
Он что, тупой??? Не может понять, где конец строки?
При включении конфигурации, идут варнинги:
Конфиг
xkb_keymap {
	xkb_keycodes  { include "evdev+aliases(qwerty)"	};
	xkb_types     { include "complete"	};
	xkb_compat    { include "complete"	};
	xkb_geometry  { include "pc(pc105)"	};

	xkb_symbols "my" {
		include "pc+us+ru:2+inet(evdev)"
		include "capslock(grouplock)"
		include "compose(ralt)"

		key <AC10> { [ colon, semicolon ] };
		key <TLDE> { [ asciitilde, grave ] };

	};

};

Вывод консоли
Warning:          Multiple default components in keypad
                  Using x11, ignoring pointerkeys
Warning:          Key <OUTP> not found in evdev+aliases(qwerty) keycodes
                  Symbols ignored
Warning:          Key <KITG> not found in evdev+aliases(qwerty) keycodes
                  Symbols ignored
Warning:          Key <KIDN> not found in evdev+aliases(qwerty) keycodes
                  Symbols ignored
Warning:          Key <KIUP> not found in evdev+aliases(qwerty) keycodes
                  Symbols ignored
Warning:          Key <RO> not found in evdev+aliases(qwerty) keycodes
                  Symbols ignored
Warning:          Key <I192> not found in evdev+aliases(qwerty) keycodes
                  Symbols ignored
Warning:          Key <I193> not found in evdev+aliases(qwerty) keycodes
                  Symbols ignored
Warning:          Key <I194> not found in evdev+aliases(qwerty) keycodes
                  Symbols ignored
Warning:          Key <I195> not found in evdev+aliases(qwerty) keycodes
                  Symbols ignored
Warning:          Key <I196> not found in evdev+aliases(qwerty) keycodes
                  Symbols ignored
Warning:          Key <I255> not found in evdev+aliases(qwerty) keycodes
                  Symbols ignored
Warning:          No symbols defined for <AB11> (keycode 97)
Warning:          No symbols defined for <JPCM> (keycode 103)
Warning:          No symbols defined for <I120> (keycode 120)
Warning:          No symbols defined for <AE13> (keycode 132)
Warning:          No symbols defined for <I149> (keycode 149)
Warning:          No symbols defined for <I154> (keycode 154)
Warning:          No symbols defined for <I161> (keycode 161)
Warning:          No symbols defined for <I168> (keycode 168)
Warning:          No symbols defined for <I178> (keycode 178)
Warning:          No symbols defined for <I183> (keycode 183)
Warning:          No symbols defined for <I184> (keycode 184)
Warning:          No symbols defined for <FK19> (keycode 197)
Warning:          No symbols defined for <FK24> (keycode 202)
Warning:          No symbols defined for <I217> (keycode 217)
Warning:          No symbols defined for <I219> (keycode 219)
Warning:          No symbols defined for <I221> (keycode 221)
Warning:          No symbols defined for <I222> (keycode 222)
Warning:          No symbols defined for <I230> (keycode 230)
Warning:          No symbols defined for <I247> (keycode 247)
Warning:          No symbols defined for <I248> (keycode 248)
Warning:          No symbols defined for <I249> (keycode 249)
Warning:          No symbols defined for <I250> (keycode 250)
Warning:          No symbols defined for <I251> (keycode 251)
Warning:          No symbols defined for <I252> (keycode 252)
Warning:          No symbols defined for <I253> (keycode 253)
Да, всё верно. По умолчанию xkeyboard-config описывает гораздо больше клавиш, чем у вас присутствует на самом деле. Например, XF86Display может идти отдельной кнопкой OUTP, и отвечать за переключение монитора, и наверняка у вас нет такой клавиши по-отдельности. На ноутбуках она обычно где-то на Fn-слое.
Отключить предупреждения можно параметром -w 0.
>… и наверняка у вас нет такой клавиши по-отдельности. На ноутбуках она обычно где-то на Fn-слое.
Отсюда — логичный вопрос: правильно ли обрабатываются Fn-клавиши? (Хотя сейчас проверил — вроде работают).

>Отключить предупреждения можно параметром -w 0.
Или перенаправить в /dev/null
Вопрос не в этом, а в том — насколько они критичны?
Или скажем так. На ноутбуке этой клавиши нет (или есть, но через fn), а на полной внешней клавиатуре — есть. Будет ли она подхватываться и обрабатываться корректно?
Увы, с внешней клавиатурой не пробовал. Ранее, с setxkbmap, приходилось для внешней клавиатуры добавлять параметр -model:
setxkbmap -model face -layout us,ru -option grp:toggle

У xkbcomp тоже есть параметр -i , думаю, что здесь нужно просто поэкспериментировать.
Спасибо, до сих пор пользуюсь setxkbmap. Попробую использовать xkbcomp или autokey.
Некоторое время ставил на CapsLock отправку Escape, потом поставил Ctrl. В vim отправлять Escape не намного сложнее, «Ctrl-[», а в остальных случаях полезнее, много где нужен Ctrl. Раскладку переключаю по Win.
полезно тем, кто программирует на современном языке, который уже не требует обязательной точки с запятой в конце строки. Даже в JavaScript этого уже делать не нужно.

Холиварообразующая фраза, я бы сказал. В Rust к примеру есть точки с запятой. Насчёт JavaScript: я в нём не специалист, но насколько слышал, поведение при наличии точки с запятой и при её отсутствии разнится, нужно быть осторожным.
Всё это хорошо до тех пор, пока вы, привыкший к своей раскладке, однажды не сядете за чужой комп :(
То чувство, когда автор полезной статьи внезапно получает дефис из-за моей невнимательности… Исправлюсь, честно.
Полезнейшая PDF'ка, замечательное пополнение примеров к топику. Где же были такие человеческие описания, когда я рылся по запутанной документации XKB, блогам её коммиттеров (В том числе Ивана Паскаля и Daniel O'Donnell'а), примерам на GitHub'е, так в итоге практически ничего полезного оттуда и не почерпнув?
Странно, глава 6 — пустая.
Однако, всё же стоит быть очень осторожным с модификацией маппингов прямо в /usr/share/X11/xkb.
Думаю, тут стоит упомянуть, что в gnome-3 переделывают работу с клавиатурой, и в gnome-3.8 переключение раскладки штатным методом, или ещё при каких-то переключениях окон, все кастомизации сносятся нахрен.

А «штатным» методом не получится настроить переключение по капс или перемапить Win/Menu.

Лечится выпиливанием файла /usr/lib/gnome-settings-daemon-3.0/libkeyboard.so

При этом индикатор раскладки не работает, зато работают кастомизации.

Возможно, это касается только кастомизаций через xmodmap, а через xkbcomp всё будет работать.
Так ведь давно уже есть gnome 3.12
image
Переключение на капс настраивается штатно. По-моему оно и в 3.10 уже заработало, но это было давно, так что точно не помню.

Win раньше можно было перемапить через dconf-editor, но это уже сложно назвать «штатно», да и делал я это в 3.8, а это тоже было давно.

А по теме топика и gnome 3+ — да, есть проблемка.
Выполняю
$ xkbcomp $HOME/.config/xkb/my $DISPLAY
вроде изменения вступают в силу, но стОит пару раз раскладку переключить, то все изменения сбрасываются/перестают/работать.
Тоесть, это в 3.12 такие же проблемы со сбросом настроек?
Ну раз gnome сам обрабатывает клавиатуру, то в этом нет ничего удивительного. Он свои настройки помнит, а все прочие ему не интересны…
Но возможно, в 3.10 такого не было — я пользуюсь несколькими гномовскими расширениями. В частности, перенос иконок из странного гномовского трея на панель не очень хорошо работает для иконок, которые иногда меняются — они обратно в трей прячутся — так вот в 3.10 вернуть иконки обратно на панель можно было только через выкл/вкл расширения, либо рестартом gnome-shell, а сейчас в 3.12 они сами восстанавливаются, как будто gnome-shell периодически по каким-то своим соображениям проводит реинициализацию, ну а раз он так делает, то и «посторонние» настройки он сбрасывает.
Непонятно, как через xkb сделать xmodmap-аналог "clear Mod4"

pc(pc105) ничтоже сумняшеся суёт в Mod4 и Hyper_L и Super_L прикрученные к псевдо-кнопкам <SUPR> и <HYPR>

Это инклюдится и переписать modifier_map Mod4 { Super_L, Super_R } не помогает.

Лечится
replace key <SUPR> {  [ NoSymbol, NoSymbol ] };
replace key <HYPR> {  [ NoSymbol, NoSymbol ] };


Но при этом старый добрый xmodmap пишет
mod3        Hyper_R (0x87)
mod4        Super_L (0x85),  Super_R (0x86),  BadKey (0xce),  BadKey (0xcf)
Из-за кулис подсказывают, что ещё это лечится:
modifier_map none { <HYPR> };
modifier_map none { <SUPR> };


Но при этом выкидывает ошибку:
Error:            Key <HYPR> added to map for multiple modifiers
                  Using none, ignoring Mod4.
Error:            Key <SUPR> added to map for multiple modifiers
                  Using none, ignoring Mod4.

Хотя статус завершения 0
А как коды кнопок получить, чтоб их потом можно было переназначить?
Есть xev, но лучше смотреть на содержание файлов pc, ru и us из /usr/share/X11/xkb/symbols.
Ещё есть xkbprint который генерит картинку раскладки м подписью кодов.
C параметром -label name на кнопках рисуются их названия (формата <LSGT>)

Соответствие названий кодам хранятся в файле /usr/share/X11/xkb/keycodes/evdev
(ну или то, что подключено через xkb_keycodes )
Небольшая подсказка по заданию «сделайте так, чтобы левая половина клавиатуры сдвигала регистр только с правым Shift, а правая — с левым. Это очень полезно для рук, хотя и не привычно» на примере клавиш c и m, где M получается только с левым Shift, а C только с правым:

    key <RTSH> {
      type[Group1]="ONE_LEVEL",
      symbols[Group1] = [ ISO_Level3_Shift ]
    };

    replace key <LVL3> {
      type[Group1] = "ONE_LEVEL",
      symbols[Group1] = [ ISO_Level3_Shift ]
    };
    modifier_map Mod5 { <LVL3> };

    //             Unmodified       LShift          RShift           Both Shifts
    key <AB03> { [ c,               VoidSymbol,     C,               VoidSymbol   ] };
    key <AB07> { [ m,               M,              VoidSymbol,      VoidSymbol    ] };
Всё это работает, только вот сносит крышу индикатору раскладки lxpanel, выдавая раскладки None и My, вместо Us и Ru. Можно сбросить через
setxkbmap -layout "us,ru(winkeys)" -option "grp:caps_toggle,grp_led:scroll"

Пришлось такое делать на старом xmodmap, с ним всё нормально. Подозреваю, что проблема в том, что у этих раскладок не заданы псевдонимы Us и Ru где-то внутри.
У меня бы рука не поднялась назвать его индикатором, потому что он довольно активно сам исполняет команды setxkbmap.

Предположу, что правильнее настраивать не напрямую через xkbcomp, а так как у меня под спойлером. Браво вам, если вы разберётесь с тем, как это правильно делается. А в качестве индикатора всё-таки использовать индикатор, а не ui, который при инициализации частично перетирает то, что вызывается из .xinitrc.
Разбираться в этом особого желания нет, поэтому нашел такое решение.
Убрал индикатор из панели и поставил gxkb linuxhub.ru/viewtopic.php?f=12&t=442
В конфиге указал:
never_modify_config=true

Программа умеет запоминать раскладку для каждого окна и отображать флаг, мне этого хватает.
Теперь работает способ с
xkbcomp $HOME/.config/xkb/my $DISPLAY

в .xinitrc
Разобрался с проблемой, которая была под спойлером.

Если взглянуть на системные конфигурационные файлы по адресу /usr/share/X11/xkb, то нетрудно заметить, что они имеют определенную структуру и конфиги разных секций лежат по соотв. каталогам, как то keymap, symbols и т.д. Тут я подумал, может так и надо класть свой конфиг и прописывать для него корневой каталог.

Если взять приведенный файл my:

xkb_symbols "my" {
    include "pc+us+ru:2+inet(evdev)"

    key <AC10> { [ colon, semicolon ] };
    key <TLDE> { [ asciitilde, grave ] };
};


То он должен быть в $HOME/.config/xkb/symbols/my
Тогда команда для загрузки такого конфига должна выглядеть так:

setxkbmap -symbols my -print | xkbcomp -I"$HOME/.config/xkb" - "${DISPLAY%%.*}"


Можете убрать | xkbcomp -I"$HOME/.config/xkb" - "${DISPLAY%%.*}" и посмотреть что она выводит. Будет видно, что там вместо всех локалей подставляется один ваш my, внутри которого вы уже и наследуете нужные вам раскладки.
В статье Вы почти дошли до этого, просто надо было создать еще один каталог symbols, куда и положить конфиг. Заметьте, что в xkbcomp прописывается "$HOME/.config/xkb", а не полный путь.

Я решил пойти еще немного дальше и сделать так, чтобы конфиг генерировался из системного, лишь немного его дополняя, чтобы не нужно было жестко вписывать include "pc+us+ru:2+inet(evdev)", ведь эта секция может поменяться в будущем.

К тому же, захотелось иметь несколько конфигураций для разных систем и чтобы эти конфигурации грузились в зависимости от системы, на которой запущен скрипт (ведь мы делаем автоматизацию). Вот как выглядит мой конфиг kodx_xkb:

xkb_symbols "default" {
    key <AC10> { [ colon, semicolon ] };
    key <TLDE> { [ asciitilde, grave ] };
};

xkb_symbols "swap_esc" {
    key <CAPS> { [ Escape ] };
    key <ESC>  { [ Caps_Lock ] };
};

xkb_symbols "beast" {
    // (keycode 166) XF86Back -> PageUp
    key <I166>   { [ Prior] };
    // (keycode 167) XF86Forward -> PageDown
    key <I167>   { [ Next ] };
};


Как видно, тут 3 секции — default, swap_esc и beast. Теперь вызов конфигурации с таким конфигом:

setxkbmap -layout "us+kodx_xkb(default),ru(winkeys)" -option "" -option "grp:caps_toggle,grp_led:scroll" -print | xkbcomp -I"$HOME/.config/xkb" - "${DISPLAY%%.*}"


Тут у меня прописано переключение раскладок по Caps Lock и индикатор на Scroll Lock (на всякий случай, у меня на клавиатуре индикаторов нет вообще)

Допустим мы хотим добавить смену местами Esc и Caps Lock, тогда просто вписываем его в строку запуска:

setxkbmap -layout "us+kodx_xkb(default)+kodx_xkb(swap_esc),ru(winkeys)" -option "" -option "grp:caps_toggle,grp_led:scroll" -print | xkbcomp -I"$HOME/.config/xkb" - "${DISPLAY%%.*}"


Можно заметить секцию beast — это особые настройки для моего ноутбука, имя у которого beast. Теперь полный скрипт, который я использую у себя. Смысл скрипта в том, что он подгружает настройки deafult и, если таковые прописаны в kodx_xkb, специальные для конкретного устройства, в зависимости от его hostname.

Привожу свой скрипт полностью:

#!/usr/bin/env bash

XKB_DIR="$HOME/.config/xkb"
XKB_SYMBOL_FILE="kodx_xkb"
# hostname binary with path
HOSTN=$(which hostname)
# grep binary with path
GREPPR=$(which grep)

HOST=""
XKB_ADDON=""
if [ -n "$HOSTN" ]; then
    HOST=$($HOSTN -f)
    if [[ -n $HOST && -n "$($GREPPR $HOST $XKB_DIR/symbols/$XKB_SYMBOL_FILE)" ]]; then
        XKB_ADDON="+$XKB_SYMBOL_FILE($HOST)"
    fi
fi

if [[ -n $(which setxkbmap) && -n $(which xkbcomp) ]]; then
    setxkbmap -layout "us+$XKB_SYMBOL_FILE(default)$XKB_ADDON,ru(winkeys)" \
    -option "" -option "grp:caps_toggle,grp_led:scroll" -print \
    | xkbcomp -I"$XKB_DIR" - "${DISPLAY%%.*}" >/dev/null 2>&1
fi


Проверил работоспособность на 2х устройствах.
Скрипт можно переписать на работу с разными файлами, а не с секциями одного. Мне текущая схема показалось удобнее.

Надеюсь поможет.
Не понял — зачем вы всё делаете через setxkbmap | xkbcomp — Если можно просто xkbcomp rjyabu afqk crjhvbnm&
Чтобы задать основные настройки переключения раскладок и не указывать их в самом конфиге. По умолчанию у меня вообще не заданы раскладки.
Спасибо огромное.
Побольше бы вот таких вдумчивых комментариев.
Кстати, стоит заметить, что -option "" означает сброс предыдущих дополнений:
If you want to replace all previously specified options, use the -option flag with an empty argument first.
Ещё интересно, почему не взаимозаменяемы -options и то, что идёт с плюсом в -layout. В /usr/share/X11/xkb/rules/base есть все соответствия, например:

grp:caps_toggle	=	+capslock(grouplock)

Но при этом, есть разница, выражающаяся в том, что на вторую раскладку переключает, а обратно нет:
$ setxkbmap -layout "us+custom(default),ru(winkeys)" -option "" -option "grp:toggle,compose:rctrl" -print
...
	xkb_symbols   { include "pc+us+custom(default)+ru(winkeys):2+inet(evdev)+group(toggle)+compose(rctrl)"	};
$ setxkbmap -layout "us+custom(default),ru(winkeys)+group(toggle)" -option "" -option "compose:rctrl" -print
...
        xkb_symbols   { include "pc+us+custom(default)+ru(winkeys)+group(toggle):2+inet(evdev)+compose(rctrl)"	};
Про -option "" я знаю, специально вставил, чтобы сбросить то, что там до этого было на всякий случай. С -option тоже экспериментировал, но то что мне надо он не подставлял.
PS Если вдруг кто скажет, что потом вот сядешь к кому-нибудь другому за клавиатуру, и сразу всё не так, то скажу так: пересаживаясь из Бентли помочь другу довезти до дома жигули, тоже ругаешься. Тем приятнее садиться обратно в Бентли.

Скорее, здесь можно провести параллель между Жигули и Жигули на небольшом тюнинге :)
Метод работы один: тыканье по клавишам (причем «тыканий» то же или почти то же количество), принципиального отличия нет, прироста производительности или удобства в разы — тоже.
Но ради некоторого удобства в повседневном использовании сделать, конечно, стоит. И почти все, кто работает много с клавиатурой, с набором, редактированием различного рода текстов, придумывают свои способы упрощения.
Советую ещё поставить Backspace на J (практически самая редко используемая буква латинского алфавита). Побочный эффект: после недели привыкания я начал ненавидеть работать не за своим компьютером.
Не надо работать за чужим компьютером, если это именно работа, а не набор адреса сайта, что можно сделать не спеша зрячим сопособом. Если собираешься именно поработать, то тащи свои настройки, свою клаву, и вообще, нужно сделать ещё и свой профиль, чтобы не портить чужой.
А набрать и отладить кусок кода строчек на тридцать в чужой программе, которая существует только на чужом компьютере в качестве проекта в IDE – это работа или нет?

А настроить чужой ноутбук (на Windows, разумеется, так что свои настройки не притащишь)? Примерно час “работы” (ну или не работы, но назвать “использованием” язык не поворачивается), и набирать приходится тоже больше, чем один адрес сайта.
Для первого придумали всякие teamviewer'ы.
Teamviewer'ы почему-то не всегда нормально работают с нестандартными раскладками (да и не только они – например, Skype и некоторые сайты в Firefox не переваривают у меня “стрелки, поставленные на F+HJKL” (ну или D+JIKL)).
Ну, у кого как:
{"t"=>2163, "a"=>620, "i"=>633, "l"=>1013, " "=>4636, "-"=>232, "f"=>1678, "o"=>691, "k"=>1308, "s"=>1026, "u"=>479, "d"=>1165, "!"=>49, ";"=>321, "<"=>547, "#"=>529, "+"=>515, "">"=>551, ":"=>15, "e"=>1104, "q"=>919, "L"=>61, "8"=>66, "`"=>91, "2"=>199, "0"=>203, "1"=>267, "c"=>1387, "v"=>785, "m"=>563, "j"=>2957, ...

Возможно, потому что у меня QWERTY, и j она же и кириллическая о. Скорее под левый мизинец уж повесить тогда на латинскую a.
Выборка не репрезентативна, много в тот день печатал на русском, что для меня не типично, но тем не менее.
Мизинец – самый слабый палец, не надо его нагружать Backspace'ом. Особенно когда на нём уже стоит Ctrl (вместо Caps Lock).

Так как на русском я печатаю очень редко, я просто переставил ‘о’ в другое место. У меня она вместо ‘а’, но если хочется минимальных изменений, можно поставить её на ‘ш’, а ‘ш’ убрать ну хоть на тот же освободившийся Backspace.
Интересная статистика. Ну, пробел, как и ожидалось — самая часто используемая клавиша :)
Конечно, как и ожидалось, сильно отличается от статистики обычных англоязычных текстов обилием символов и значительным изменением в ее буквенной части.
Советую ещё поставить Backspace на J (практически самая редко используемая буква латинского алфавита).

Оригинально :) это первый шаг к полностью перемешанным буквам и сервисным клавишам/модификаторам. Видать, кто-то такое практикует все-таки. А куда J? На место Backspace, видимо?
Не мешает работать при наборе текстов? Хотя, вроде не должно, т.к. даже в почти идеальном случае ошибок при наборе будет не менее 0,5-1%.
это первый шаг к полностью перемешанным буквам и сервисным клавишам/модификаторам

Вот моя статистика за день использования (Emacs + чат (на английском) + прочие мелочи):

image

(Caps Lock = Ctrl. Оригинальные Ctrl и Alt не использую. Shift почему-то не включается в статистику.)

Как видите, Backspace у меня востребован больше, чем все буквы. Идеально было бы, если бы пробел был разделён на две части – левая была бы пробелом, правая – Backspace. (Кстати, у меня сейчас возникла идея поставить пробел на J, а Backspace – на Spacebar… А нет, иногда Backspace приходится держать несколько секунд, а Spacebar несколько секунд держать не очень удобно. Оставлю как есть.)

Второй шаг – я поставил кнопку третьего уровня на D. Получилось, что третьим уровнем пользоваться удобнее, чем шифтом (Shift я не поставил на D, потому что тогда надо было бы ещё искать место для симметричного шифта с другой стороны, а места нет). Теперь на третьем уровне живут скобки (D+90), тире, двоеточие и точка с запятой (на место точки с запятой я перенёс D), восклицательный и вопросительный знаки (D+,.), а также вертикальная черта (потому что я её часто использую).

Третий шаг – стрелки ушли на D+IJKL. К этому я привык за день, и обычными стрелками перестал пользоваться вообще.

А куда J? На место Backspace, видимо?

На левую квадратную скобку. (До Backspace у меня палец без движения кисти не дотягивается.) Квадратные скобки ушли на Shift+90.

Не мешает работать при наборе текстов?

Совершенно не мешает. Даже на русском, где изменения более существенные (пришлось немного подвигать клавиши, чтобы оставить О под указательным пальцем – в частности, Ж ушло на Shift+J).
Кроме того, моей основной целью была не оптимизация скорости набора, а снижение нагрузки на мизинец + минимизация движения кистей и особенно лишних сгибов.
Вот моя статистика за день использования (Emacs + чат (на английском) + прочие мелочи)

В псевдоцветах все-таки недостаточно ясно видно, что чаще, а что реже использовалось (в особенности — насколько чаще или реже). Я так понял, что красный — самый редкий, тогда синий — наиболее частый. А фиолетовый тогда как? Лучше табличку прицепить. Или мне на мыло: t-p-l@inbox.ru. Заранее благодарю.

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

Очевидно, что эта цель выполнена :) Еще какие-нибудь мешающие сочетания остались?
Я так понял, что красный — самый редкий, тогда синий — наиболее частый.

Ой. Наоборот, разумеется.

Псевдоцвета приведены исключительно наглядности ради (делал не сам, взял скриншот из WhatPulse). Вот статистика за последний месяц в формате CSV, всего 359322 нажатия (Enter и ` почему-то не учлись). В последний месяц я не менял свою раскладку (но зато поменял сегодня, и, скорее всего, ещё буду менять в ближайшие дни).

Топ-5 приложений:

1. Skype – 218k нажатий
2. Emacs – 85k
3. Firefox – 59k
4. Thunderbird – 13k
5. Terminal – 8k

Еще какие-нибудь мешающие сочетания остались?

Остались, но они все связаны с тем фактом, что Ctrl используется чересчур концентрированно – после часа работы в Emacs мизинец начинает ныть. Сейчас нашёл, как поставить его на правый Win, посмотрю, что получится.
Ой. Наоборот, разумеется.

Да, конечно ) Я сам напутал в письме )

Плохо, что статистика собирается только по нажатиям на клавиши, а различить, какой символ был набран этой клавишей (если их несколько), уже не получается. Ну хоть такая статистика, уже кое-что ) Благодарю!
Готов поставить любую программу для сбора “хорошей” статистики – только посоветуйте, какую.
Вообще, для анализа набираемых сочетаний используют Typing Statistics, но из записанного файла (клавограммы) нужно убирать конфиденциальную информацию — пароли и пр. Т.е. чистить перед тем, как кому-то давать результаты набора. И программа только под винду.

Кстати, установил себе WhatPulse — хорошая штуковина для сбора статистики от сервисных клавиш. И не только.
Не дописал: т.к. ошибок не менее 0,5-1%, то Backspace, конечно, гораздо более востребован, чем J. И чем многие другие буквы тоже.
Любую клавишу, скажем RAlt или Menu

Можно вот это посмотреть как пример:


xkb_symbols "default" {
    key <AC10> { [ colon, semicolon ] };
    key <TLDE> { [ asciitilde, grave ] };
};
Sign up to leave a comment.

Articles