XKB: перенастроим клавиши под себя любимого

    В один прекрасный день надоедает нажимать Shift, чтобы вывелся символ ~ вместо `.
    Надоедает тянуться до Esc, при этом клавишей CapsLock пользуетесь РЕДКО.
    Надоедает смещать кисть вниз и нажимать Ctrl/Cmd/Win слабым мизинчиком, либо, не дай бог, тянуться до них большим пальцем.
    Надоедает лезть за PgUp, PgDn, Home и End, двигая руку каждый раз, чтобы всего лишь промотать страницу вниз.
    Надоедает каждый раз, когда вы делаете опечатку, со злобой смотреть на клавиатуру в поисках кнопки Backspace.



    Сегодня мы узнаем, как навсегда избавиться от этих мучений.

    Зачем это всё?


    Чтобы меньше нажимать клавиши. Чтобы меньше тянуться пальцами до тех клавиш, которые часто нажимаем. Чтобы руки меньше уставали. Чтобы легче запоминать что где. Чтобы быстрее печатать, в конце концов.

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

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

    Первые шаги калеки


    Стандартную раскладку нужно модифицировать под себя. Сделать это можно многими способами. Не думаю, что кто-то здесь пользуется экзотическими ibus, Fcitx, SCIM или UIM, поэтому предположу, что у всех работает стандартный X Keyboard extension, XKB. Стоит заметить, что в грядущем на десктопе Wayland, XKB, скорее всего останется отвечать за клавиатуру, также как и в Xorg. Если вдруг тут есть смельчаки, которые уже работают с XWayland, поделитесь своими впечатлениями, работает ли описанное мной у вас. Про альтернативный Wayland Mir от Canonical ничего сказать не могу, кроме того, что вряд ли они возьмутся переписывать и подсистему взаимодействия с клавиатурой.

    Первое, что приходит в голову — воспользоваться какими-то графическими утилитами. Если честно, то этот этап я пропустил, и сразу воспользовался xmodmap. Чуть ниже я расскажу, что не так с этим подходом и как делать правильно.

    Xmodmap позволяет, например, поменять слоями ; и :, особенно это полезно тем, кто программирует на современном языке, который уже не требует обязательной точки с запятой в конце строки. Даже в JavaScript этого уже делать не нужно. И помогает вот такая простая команда:
    $ xmodmap -e "keycode 47 = colon semicolon Cyrillic_zhe Cyrillic_ZHE"
    

    Запускать её нужно из .xsession или .xinitrc. Последние два аргумента в кавычках помогут не потерять при обмене буквы ж и Ж.

    А вот такая, например, поменяет местами ~ и `:
    $ xmodmap -e "keycode 49 = asciitilde grave Cyrillic_io Cyrillic_IO"
    

    Переключение раскладки


    Часто ли вам приходится пользоваться Alt? Если вдруг нет, а мне, я заметил, приходится это делать только в богатых менюшками интерфейсах, типа Gimp или LibreOffice, то его можно использовать в качестве переключателя правый Alt, известный как AltGr:
    $ setxkbmap -layout us,ru -option grp:toggle
    

    Esc vs CapsLock


    Многие, кто часто пользуются Vim, или используют vi сочетания в консоли, и кто мало ругается на форумах, предпочитают иметь Escape на клавише CapsLock:
     $ xmodmap -e "clear lock"
     $ xmodmap -e "keycode 0x42 = Escape"
    

    То же самое можно сделать ещё немного проще:
      setxkbmap -option caps:escape
    

    Или даже вот так, сохраняя CapsLock на месте старого Escape на случай переписки на повышенных тонах:
      setxkbmap -option caps:swapescape
    

    Откуда эти загадочные параметры, мы с вами узнаем чуть позже.

    Цветочки


    Наверное, удивлю вас, если скажу, что то, что мы делали до этого было не совсем правильно. setxkbmap ещё ничего, а вот xmodmap появился ещё до XKB, и живёт только для совместимости. Мало того, он ничего не знает и о половине клавиш, синтаксис и принцип работы у него более, чем загадочен, он переводит keycode и keysym, а в некоторых случаях и обратно. Разбираться в этом нет никакого смысла, потому что он в какой-то момент отомрёт, и все ваши ухищрения нужно будет повторять, только уже с помощью другой утилиты, а вы расстроитесь и назло всем опять станете печатать двумя указательными пальцами.

    Так вот, всё это работает до одного прекрасного момента, пока не начинаешь понимать, что нужных клавиш много, а пальцы, которые лежат на домашней строке (ASDF JKL;) до всех не дотягиваются.
    Я, например, часто пользуюсь клавишей с обозначением Win, которая является модификатором Mod4. Расположена она на моей клавиатуре не слишком удобно, а именно между левыми Alt и Ctrl.

    Правильный способ


    Правильно всё это делать с помощью xkbcomp. Название у утилиты, как и man к ней дают мало информации о том, чем она занимается. Якобы переводит текстовые описания раскладки клавиатуры в бинарный формат. А на самом деле ещё и загружает их. Давайте попробуем, чтобы понять, как сделать то, что мы уже сделали, только с её помощью.

    Запомните, многие в интернете советуют модифицировать файлы, лежащие в /usr/share/X11/xkb/symbols, а именно us, pc и ru. Не делайте этого. Это файлы, действующие на всю систему сразу. На других пользователей (если вдруг у вас такие есть), и если вы там с чем-то накосячите, то набирать текст, даже логин и пароль, бкдшт труднее. Не стоит даже класть туда и модифицированные файлы, и ничего не нужно прописывать в evdev.xml.

    Важно: если вы вдруг сделаете что-то не так, то перезагрузка X'ов вам поможет. Есть и более простой способ, можно запустить команду setxkbmap без параметров, и она сбросит почти все ваши настройки на раскладку по умолчанию.

    Первым делом нам нужно узнать текущие настройки раскладки, сделать это нужно до всех манипуляций:
    $ setxkbmap -layout us,ru -print
    

    На выходе получим что-то вроде этого:
    xkb_keymap {
      xkb_keycodes  { include "evdev+aliases(qwerty)" };
      xkb_types     { include "complete" };
      xkb_compat    { include "complete" };
      xkb_symbols   { include "pc+us+ru:2+inet(evdev)" };
      xkb_geometry  { include "pc(pc104)" };
    };
    

    Запишем всё это в файл, причем будем следовать указаниям XDG, и положим его в ~/.config/xkb/my.

    В этом файле нас больше всего интересует строка xkb_symbols, остальное оставим без изменений. Развернём фигурные скобки, и поменяем эту строку на следующее:
    xkb_keymap {
      xkb_keycodes  { include "evdev+aliases(qwerty)" };
      xkb_types     { include "complete" };
      xkb_compat    { include "complete" };
      xkb_geometry  { include "pc(pc104)" };
    
      xkb_symbols "my" {
        include "pc+us+ru:2+inet(evdev)"
    
        key <AC10> { [ colon, semicolon ] };
        key <TLDE> { [ asciitilde, grave ] };
      };
    };
    

    Ну, скрестим пальцы, и загрузим эту конфигурацию:
    $ xkbcomp $HOME/.config/xkb/my $DISPLAY
    

    Пробуем. Если при нажатии клавиши, на которой у вас нарисована буква Ж, печатается символ :, а не ;, а при нажатии на Ё печатается тильда ~, а с Shift'ом всё происходит наоборот, то мы на верном пути.

    Стоит заметить, что тут же не нужно заморачиваться с Cyrillic_zhe Cyrillic_ZHE, всё работает и так.

    Идём дальше. Что мы делали? Мы запускали setxkbmap -option с параметром. Давайте посмотрим, что он меняет.
    $ setxkbmap -print | grep symbols
      xkb_symbols   { include "pc+us+ru:2+inet(evdev)" };
    $ setxkbmap -option caps:escape
    $ setxkbmap -print | grep symbols
      xkb_symbols   { include "pc+us+ru:2+inet(evdev)+capslock(escape)" };
    

    Отлично, теперь вроде бы понятно, что меняется раскладка включением каких-то опций.
    В наш файл my добавим следующую строку в секцию xkb_symbols, сразу после уже существующего include:
        include "capslock(escape)"
    

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

        include "pc+us+ru:2+inet(evdev)+capslock(escape)"
    

    При этом первый куда более нагляден.

    Что же это значит? Мы загружаем нашу раскладку, говорим, что у нас qwerty (xkb_keycodes), что у нас 104 клавиши (xkb_geometry), и переопределяем символы. При этом в разделе символов мы включаем целиком несколько конфигурационных файлов, pc, us, ru. Где они лежат, можно ли на них посмотреть? Естественно, все они лежат в /usr/share/X11/xkb/symbols. Посмотреть их полезно, особенно если вы соберётесь сделать что-то более масштабное, чем мы уже сделали.
    Хорошо, а где лежат те файлы, которые определяют, что CapsLock и Escape нужно поменять местами? Да там же. Выглядит это примерно вот так:
    partial hidden modifier_keys
    xkb_symbols "swapescape" {
        key <CAPS> { [ Escape ] };
        key <ESC>  { [ Caps_Lock ] };
    };
    
    partial hidden modifier_keys
    xkb_symbols "escape" {
        key <CAPS> { [ Escape ] };
    };
    

    Что такое partial? Это кусок раскладки, который можно включить в другую раскладку. В некоторых конфигурационных файлах щедрые авторы даже добавили комментарии. Но не во всех.

    Почему мы просто не делаем свой partial, и не включаем его? К стыду своему готов признать, что пытался делать это по описаниям, но у меня не вышло.

    Как это нужно делать в теории
    В файл раскладки не нужно класть целиком xkb_keymap, достаточно только секцию xkb_symbols:

      xkb_symbols "my" {
        include "pc+us+ru:2+inet(evdev)"
    
        key <AC10> { [ colon, semicolon ] };
        key <TLDE> { [ asciitilde, grave ] };
      };
    


    Загрузка должна идти с помощью команды:
    setxkbmap -I$HOME/.config/xkb my -print | xkbcomp - $DISPLAY
    

    Увы, вывод setxkbmap не меняется ни от каких параметров, кроме одного случая:
    setxkbmap -I$HOME/.config/xkb -symbols my -print
    

    Но, увы, в случае передачи этого вывода в xkbcomp, тот выдаёт ошибку.

    Некоторые ещё советуют вместо $DISPLAY писать ${DISPLAY%%.*}

    PS Хабраюзер kodx выяснил, как это делать правильно.

    Ягодки


    Не хочу просто Escape на CapsLock. Хочу чтобы Control тоже.
    Как? Как такое возможно? Пришло время магии.

    Сначала сделаем так, чтобы при нажатии на CapsLock получался LCTL, добавив вот это в секцию xkb_symbols:
        replace key <CAPS> { [ Control_L ] };
        replace key <LCTL> { [ Caps_Lock ] };
    

    Вторая строчка нужна для того, чтобы избавиться от вредной привычки нажимать старый левый Ctrl. Можно чуть смягчить это:
        replace key <LCTL> { [ VoidSymbol ] };
    

    Тепепь нам понадобится глаз дятла утилита xcape, позволяющая назначить модификатору второе действие. Так, что если он нажат в сочетании с какой-то буквенно-циферной клавишей, то он срабатывает как модификатор, а если он нажат и отпущен в одиночку — он срабатывает как-то по-другому, как мы захотим. В бой!
    $ xcape -t 1000 -e "Control_L=Escape"
    

    xcape демонизируется под действием глаза дятла. Стоит ещё заметить интересный параметр -t 1000. Нет, он не призывает терминатора, он говорит о том, что если мы таки нажали левый Ctrl, и продержали его нажатым больше 1000 мс, то Escape не сработает. Отличная опция для нерешительных.

    Из недостатков такого подхода можно назвать то, что Escape будет срабатывать не по нажатию, а по отпусканию клавиши. Кому-то эта задержка не страшна, а кому-то будет критична. А кто-то пойдёт на компромисс.

    Бонус


    Для всяких полезных, но редких символов существует такая вещь, как Compose Key, которая позволяет после её нажатия и отпускания набрать некую последовательность, которая соответствует какому-то Unicode символу, который и появится на экране. Например, последовательность нажатий «Compose o o» выдаст символ °. А «Compose c c c p» выдаст . Забавно? Символов очень много, а сочетания подобраны так, что запонмить их легко, причём в большинстве случаев порядок нажатия не важен, например «Compose e =» и «Compose = e» оба выдают . С полным списком стандартных сочетаний можно ознакомиться тут, а также можно назначать свои в файле ~/.XCompose.
    А сделать так, чтобы в качестве Compose работал правый Ctrl можно добавлением следующей строки в наш файл:
        include "compose(rctrl)"
    

    В путь-дорогу


    Я сознательно не публикую свой конфиг целиком, чтобы читатель захотел поэкспериментировать. Вот вам пару идей в дорогу:
    — нажимая клавишу F, сделайте так, чтобы HJKL работали как обычные стрелки;
    — сделайте так, чтобы левая половина клавиатуры сдвигала регистр только с правым Shift, а правая — с левым. Это очень полезно для рук, хотя и не привычно (подсказка в комментарии);
    — сделайте так, чтобы левый Shift не обязательно было зажимать, а чтобы было достаточно его однократно нажать и отпустить, а следом нажать, например, клавишу 5, так, чтобы напечатался символ % (подсказка: Latch);
    — повесьте два разных модификатора на одну клавишу

    Придумывайте, делитесь. Буду рад услышать интересные идеи.

    PS Если вдруг кто скажет, что потом вот сядешь к кому-нибудь другому за клавиатуру, и сразу всё не так, то скажу так: пересаживаясь из Бентли помочь другу довезти до дома жигули, тоже ругаешься. Тем приятнее садиться обратно в Бентли.

    Печатайте с удовольствием и берегите себя!
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 97

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

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

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

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

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

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

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

                          Буквально на днях я настроил дополнительный «слой» клавиш при помощи 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 знаков в минуту, что меня полносью устраивает. Понятно, что смена раскладки может поднять этот показатель еще выше, но ценой того, что внезапно все остальные компьютеры станут неудобны. Поддерживать навык слепой печати с двумя парами раскладок — это тяжкое бремя, не оправдываемое получаемой разницей в скорости.
                            +4
                            Зачем так сложно?
                            AutoKey достаточно муторен в настройке

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

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

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

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

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

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

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

                                  0

                                  И XKB делает это без особых проблем. Почитайте доки, и примеров в интернете хватает.

                                    0

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

                              0
                              Правильно всё это делать с помощью 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>   : "Ө"
                              
                              
                                0
                                Не совсем понимаю, о чём вы. Про Compose я рассказал. Compose подразумевает нажатие одной клавиши, а потом как минимум ещё одной. А я, в том числе, рассказывал про возможности переноса и совмещения клавиш. В том числе самой клавиши Compose. Вы, например, не задумывались, если часто пользуетесь Compose, перенести её куда поближе, например на левый Shift? Однократное нажатие — Compose. Удержание — Shift.
                                  0
                                  У меня Compose ближе, чем Shift: RightWinKey.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

                                    Блин, как я рад, что «язык Ц» назван «несовременным»!!!
                                    Никак не могу привыкнуть к формальности ставить точку с запятой в конце строки (причём, конкретной диагностики не выдаётся — ошибка, и всё!).
                                      +6
                                      Это ведь сарказм, да?
                                        +2
                                        Нет, это дебилизм (не мой, языка «Ц»).
                                        Он что, тупой??? Не может понять, где конец строки?
                                      +1
                                      При включении конфигурации, идут варнинги:
                                      Конфиг
                                      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)
                                      
                                        +1
                                        Да, всё верно. По умолчанию xkeyboard-config описывает гораздо больше клавиш, чем у вас присутствует на самом деле. Например, XF86Display может идти отдельной кнопкой OUTP, и отвечать за переключение монитора, и наверняка у вас нет такой клавиши по-отдельности. На ноутбуках она обычно где-то на Fn-слое.
                                        Отключить предупреждения можно параметром -w 0.
                                          +1
                                          >… и наверняка у вас нет такой клавиши по-отдельности. На ноутбуках она обычно где-то на Fn-слое.
                                          Отсюда — логичный вопрос: правильно ли обрабатываются Fn-клавиши? (Хотя сейчас проверил — вроде работают).

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

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

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

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

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

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

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

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

                                                А по теме топика и gnome 3+ — да, есть проблемка.
                                                Выполняю
                                                $ xkbcomp $HOME/.config/xkb/my $DISPLAY
                                                вроде изменения вступают в силу, но стОит пару раз раскладку переключить, то все изменения сбрасываются/перестают/работать.
                                                  0
                                                  Тоесть, это в 3.12 такие же проблемы со сбросом настроек?
                                                    0
                                                    Ну раз gnome сам обрабатывает клавиатуру, то в этом нет ничего удивительного. Он свои настройки помнит, а все прочие ему не интересны…
                                                    Но возможно, в 3.10 такого не было — я пользуюсь несколькими гномовскими расширениями. В частности, перенос иконок из странного гномовского трея на панель не очень хорошо работает для иконок, которые иногда меняются — они обратно в трей прячутся — так вот в 3.10 вернуть иконки обратно на панель можно было только через выкл/вкл расширения, либо рестартом gnome-shell, а сейчас в 3.12 они сами восстанавливаются, как будто gnome-shell периодически по каким-то своим соображениям проводит реинициализацию, ну а раз он так делает, то и «посторонние» настройки он сбрасывает.
                                                +1
                                                Непонятно, как через 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)
                                                
                                                  +1
                                                  Из-за кулис подсказывают, что ещё это лечится:
                                                  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
                                                  0
                                                  А как коды кнопок получить, чтоб их потом можно было переназначить?
                                                    +1
                                                    Есть xev, но лучше смотреть на содержание файлов pc, ru и us из /usr/share/X11/xkb/symbols.
                                                      +3
                                                      Ещё есть xkbprint который генерит картинку раскладки м подписью кодов.
                                                      C параметром -label name на кнопках рисуются их названия (формата <LSGT>)

                                                      Соответствие названий кодам хранятся в файле /usr/share/X11/xkb/keycodes/evdev
                                                      (ну или то, что подключено через xkb_keycodes )
                                                      0
                                                      Небольшая подсказка по заданию «сделайте так, чтобы левая половина клавиатуры сдвигала регистр только с правым 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    ] };
                                                      
                                                        0
                                                        Всё это работает, только вот сносит крышу индикатору раскладки lxpanel, выдавая раскладки None и My, вместо Us и Ru. Можно сбросить через
                                                        setxkbmap -layout "us,ru(winkeys)" -option "grp:caps_toggle,grp_led:scroll"
                                                        

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

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

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

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

                                                          Если взглянуть на системные конфигурационные файлы по адресу /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х устройствах.
                                                          Скрипт можно переписать на работу с разными файлами, а не с секциями одного. Мне текущая схема показалось удобнее.

                                                          Надеюсь поможет.
                                                            0
                                                            Не понял — зачем вы всё делаете через setxkbmap | xkbcomp — Если можно просто xkbcomp rjyabu afqk crjhvbnm&
                                                              +1
                                                              Чтобы задать основные настройки переключения раскладок и не указывать их в самом конфиге. По умолчанию у меня вообще не заданы раскладки.
                                                              0
                                                              Спасибо огромное.
                                                              Побольше бы вот таких вдумчивых комментариев.
                                                                +1
                                                                Кстати, стоит заметить, что -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)"	};
                                                                
                                                                  0
                                                                  Про -option "" я знаю, специально вставил, чтобы сбросить то, что там до этого было на всякий случай. С -option тоже экспериментировал, но то что мне надо он не подставлял.
                                                                +1
                                                                PS Если вдруг кто скажет, что потом вот сядешь к кому-нибудь другому за клавиатуру, и сразу всё не так, то скажу так: пересаживаясь из Бентли помочь другу довезти до дома жигули, тоже ругаешься. Тем приятнее садиться обратно в Бентли.

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

                                                                      А настроить чужой ноутбук (на Windows, разумеется, так что свои настройки не притащишь)? Примерно час “работы” (ну или не работы, но назвать “использованием” язык не поворачивается), и набирать приходится тоже больше, чем один адрес сайта.
                                                                        0
                                                                        Для первого придумали всякие teamviewer'ы.
                                                                          0
                                                                          Teamviewer'ы почему-то не всегда нормально работают с нестандартными раскладками (да и не только они – например, Skype и некоторые сайты в Firefox не переваривают у меня “стрелки, поставленные на F+HJKL” (ну или D+JIKL)).
                                                                      0
                                                                      Ну, у кого как:
                                                                      {"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.
                                                                      Выборка не репрезентативна, много в тот день печатал на русском, что для меня не типично, но тем не менее.
                                                                        0
                                                                        Мизинец – самый слабый палец, не надо его нагружать Backspace'ом. Особенно когда на нём уже стоит Ctrl (вместо Caps Lock).

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

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

                                                                            Вот моя статистика за день использования (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).
                                                                            Кроме того, моей основной целью была не оптимизация скорости набора, а снижение нагрузки на мизинец + минимизация движения кистей и особенно лишних сгибов.
                                                                              0
                                                                              Вот моя статистика за день использования (Emacs + чат (на английском) + прочие мелочи)

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

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

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

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

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

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

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

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

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

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

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

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

                                                                              Нажал что именно?

                                                                                0
                                                                                Любую клавишу, скажем RAlt или Menu
                                                                                  0

                                                                                  Можно.

                                                                                    0
                                                                                    Куда копать?
                                                                                      0

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


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

                                                                            Only users with full accounts can post comments. Log in, please.