С изучением языков возникает проблема переключения раскладок клавиатуры. Когда два языка все просто, жамкаешь ALT+SHIFT (или что там у вас) и переключаешься на следующий язык. И ты всегда знаешь на какой именно язык переключился. Когда раскладок становится хотя бы 3 это уже вызывает проблемы. Потому что нажать ALT+SHIFT нужно один или несколько раз и непонятно сколько именно, не посмотрев в угол экрана

Я использую 6 языков, но раскладок у меня 4. Потому что для английского, испанского и немецкого, используется одна English international with AltGR dead keys. Скриншот из Ubuntu. В Windows она тоже есть.

По сути это просто английская раскладка, но и использованием правого ALT'а можно печатать дополнительные символы: ñáúéí¡¿ из испанского и äöüß из немецкого.

Таким образом вместо 6 раскладок у меня 4, но это все равно много.

Я долго мучался. Одно время вешал разные раскладки на разные комбинации клавиш например ALT+1 - английкский, ALT+2 - русский, ALT + 3 польский и так далее. Но это было неудобно по двум причинам. Во-первых, эти сочетания клавиш уже задействованы в IDE, а во-вторых, ALT+SHIFT как-то поудобнее чем ALT + 1. Поэтому я отказался от этого и продолжил мучаться с ALT+SHIFT, никогда не зная, на какой следующий язык я переключусь.

Потом я стал думать в направлении того, как разделить сочетания клавиш для основных и дополнительных языков. Т.е. например между en / ru я переключаюсь и использованием левых ALT+SHIFT, а между pl / uk с помощью правых ALT+SHIFT.

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

Я использую Ubuntu, поэтому мое решение работает под этой ОС. Сначала я поискал библиотеки для перехвата горячих клавиш.

  1. https://github.com/boppreh/keyboard (python) - не подошла, т.к. требует root.

  2. https://github.com/timeyyy/system_hotkey (python) - умеет ловить хоткеи, но кроме ALT/CTRL/SHIFT в сочетании всегда должен быть какой-то символ например CTRL+A. Мне хотелось именно привычного ALT+SHIFT.

  3. https://github.com/jamesbirtles/hotkey-rs (rust) - такая же проблема, как у предыдущей плюс на одном компе она работала, а на втором нет.

  4. https://github.com/golang-design/hotkey (go) - судя по документации у нее такая же проблема как у предыдущих двух.

  5. https://crates.io/crates/inputbot (rust) - требует root.

  6. https://github.com/moses-palmer/pynput (python) - сначала я подумал, что наконец то нашел, то что нужно. Но с ней был ряд проблем. Во-первых, не работает правый ALT (есть даже issue на эту тему). Но эту проблему удалось победить. Но с левым альтом было еще хуже. В зависимости от того нажат сначала ALT или SHIFT выдаются разные коды (назовем их ALT и WTF_ALT), поэтому сочетания клавиш работает через раз. Я частично решил эту проблему, забиндив 3 комбинации клавиш ALT+SHIFT, WTF_ALT+SHIFT и ALT+WTF_ALT+SHIFT. Но там возникли дополнительные проблемы - для WTF_ALT срабатывает событие PRESSED но нет события RELEASED. Это тоже можно было победить. Но мне надоело городить костыли вокруг этой библиотеки и я пошел искать дальше.

А дальше никакой волшебной библиотеки я не нашел, зато нашел пример кода на stackoverflow. Я конечно уже видел его раньше, но после всех мучений с библиотеками решил попробовать его. Там нет готовых функций для отслеживания комбинаций клавиш, зато можно вручную отследить события PRESSSED и RELEASED. Далее нужно уже самостоятельно куда-то складывать нажатые клавиши, удалять их и сравнивать с образцами.

Еще оставалось выяснить как получить список языков и как их переключать. Ответ нашелся все там же)

Получить текущий индекс языка:

gdbus call --session \
--dest org.gnome.Shell \
--object-path /org/gnome/Shell \
--method org.gnome.Shell.Eval \
"imports.ui.status.keyboard.getInputSourceManager().currentSource.index"

Активировать язык по индексу:

gdbus call --session \
--dest org.gnome.Shell  \
--object-path /org/gnome/Shell  \
--method org.gnome.Shell.Eval \
"imports.ui.status.keyboard.getInputSourceManager().inputSources[0].activate()"

Этого хватило, чтобы написать прототип, захардкодив языки в переменных и вызывая эти команды через subprocess:

cmd = "gdbus call --session --dest ....
subprocess.call(cmd, shell=True).

Далее нужно было немного обработать напильником.

Еще нужно поместить скрипт в автозагрузку, можно сделать это через GUI или создав файлик нужного формата в директорию ~/.config/autostart/

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

Комментарии (42)


  1. ZiggiPop
    11.01.2022 15:12
    +3

    В Linux я использую два языка — английский и украинский, русский держать излишне, его «дополнительные» ЭЫЪ прекрасно вызываются с AltGr.


    1. un1t Автор
      11.01.2022 15:19

      А какую расскладку вы используете? Стандартная украинская вроде такое не поддерживает. Я видел где-то на гитхабе раскладку которую надо отдельно качать и устанавливать.

      Я скажу так, что AltGr это хорошо для редко используемого языка. Но для быстрой слепой печати это не подходит.


      1. ZiggiPop
        11.01.2022 15:40
        +4

        Именно стандартная

        Но для быстрой слепой печати это не подходит.

        Вопрос привычки, владею десятипальцевым слепым методом (спасибо Шахиджаняну), и русский с AltGr стал настолько естественным, что это даже вызывает некоторые сложности там, где этой возможности нет: постоянно пытаюсь набирать AltGr+Ы, а в ответ — тишина. Для букв в левой части вообще нет проблем вообще — клавиши буквы и AltGr используются разными руками. Для правой части нужно привыкнуть к не очень естественному подвороту большого пальца правой руки, но особо эргономику слепого набора это не разрушает. Русский и украинский использую примерно 50/50.


        1. un1t Автор
          11.01.2022 15:49

          Проверил, действительно работает. Только мне бы наоборот, по умолчанию русскую, а через AltGr украинскую. Не знаю, есть ли такое.


          1. ZiggiPop
            11.01.2022 15:56
            +1

            Когда-то делал пакет для своей убунты, который добавлял такой лайаут, но потом перешел с убунты на другой дистр и забил — во-первых стал больше использовать украинский, во-вторых, эта привычка нарабатывается очень быстро, буквально за несколько дней. Хотя в актуальном для меня дистре автоматическое исправление установленного лайаута вообще тривиальная задача.


            1. un1t Автор
              11.01.2022 20:29

              Интересно, что за дистр?


          1. netch80
            12.01.2022 00:40
            +1

            > Только мне бы наоборот, по умолчанию русскую, а через AltGr украинскую. Не знаю, есть ли такое.

            ru(ruu) в стандартных иксах.


            1. un1t Автор
              12.01.2022 09:15

              ru(ruu) в стандартных иксах.

              Как полностью называется?


              1. netch80
                12.01.2022 09:21

                Russian (with Ukrainian-Belorussian layout)


                1. un1t Автор
                  12.01.2022 09:37

                  В стандартных настойках такую не нашел.

                  Но нашел статью http://wiki.opennet.ru/RUU

                  И вот такой командой она загрузилась.

                  setxkbmap -layout us,ru -variant ,ruu

                  С учетом моих текущих расладок. Посмотрел

                  $ setxkbmap -query
                  rules: evdev
                  model: pc105
                  layout: us,ru,pl,us
                  variant: altgr-intl,,,
                  options: grp_led:scroll

                  Итоговая команда получилась такой

                  setxkbmap -layout us,ru,pl -variant altgr-intl,ruu,

                  Вы тоже через setxkbmap настраивали? Или есть вариант через GUI?


                  1. netch80
                    12.01.2022 09:52

                    Я могу ставить через setxkbmap 'us,ru(ruu)' (скобки, очевидно, работают, как тот variant).
                    Но штатно у меня
                    1) Kubuntu. (Тот DE что в «умолчательной» Ubuntu с Unity у меня вызывает тошноту за его корявость и неадекватность вообще всему.)
                    2) Режим раскладки:

                    По факту получается, что через Win+F2...Win+F4 я одновременно включаю кириллическую раскладку и выбираю, какая вторая будет для данного окна (до следующего такого задания), а Caps переключает между латинской и кириллической. Это так чуть странно в KDE работает ограничение переключения раскладок первыми двумя. Но меня это устраивает сейчас.

                    До этого пробовал ещё такие варианты (и в KDE и в Gnome, пока Ubuntu ещё был с гномом): Caps переключает две раскладки, а на клавиши назначено переключение, что это за раскладки, типа:
                    Win+F2 => setxkbmap us,ru
                    Win+F3 => setxkbmap us,ua
                    Win+F4 => setxkbmap 'us,ru(ruu)'


                    1. un1t Автор
                      12.01.2022 10:01

                      А все. Нашел в тойже статье что в Ubuntu нужно выполнить команду

                      gsettings set org.gnome.desktop.input-sources show-all-sources true

                      чтобы можно было выбрать эту раскладку


        1. alpik
          11.01.2022 22:31

          Век живи - век учись!

          Интересно, как через setxbmap такое поставить.. попробовал разные варианты раскладки, не выходит. Модификатор AltGr что-ли отдельно нужно как-то сделать?


          1. un1t Автор
            12.01.2022 09:22

            Нет это просто стандартная украинская раскладка. Про setxbmap не в курсе. Я через GUI добавлял. Settings -> Region & Language -> Input Sources -> "+" -> Ukrainian -> Ukarainian


            1. alpik
              12.01.2022 21:43

              у меня нет GUI, да и уже привык к переключению одна кнопка - один язык.

              но интересно было узнать про такую возможность. спасибо.


    1. vtb_k
      12.01.2022 22:09

      Тоже использую анг и укр. раскладку для 4 языков. Англ/нем. на капс а укр/рус. на шрифт-капс. Не надо думать, где какая сейчас раскладка, даже на индикатор не смотрю


  1. woozle
    11.01.2022 16:32
    +2

    Использую на макоси две раскладки - русскую и ABC-расширенную. На этих раскладках есть возможность вызывать дополнительные символы длительным нажатием клавиши (й-j, a-ä, s-ß, n-ñ и др.), а также печатать дополнительные символы с альтом и его комбинациями с другими буквами (Alt+l + d => đ, Alt+e + e => é, Alt+Shift+2 => € и пр.).

    Таким образом, всего две раскладки позволяют мне свободно печатать на русском, сербской кириллице, сербской латинице, чешском, немецком, французском и испанском. Как видно, основные символы любого достаточно популярного языка, использующего латиницу/кириллицу можно набрать.

    Это одна из самых удобных фишек макоси и отличный пример хорошего юзабилити из коробки.


    1. un1t Автор
      11.01.2022 20:23
      +1

      В Ubuntu тоже есть похожая называется English (Macintosh).

      А та, котоую я использую (English international with AltGR dead keys) тоже позволяет писать например чешские буквы типа ž. (alt+shift+> затем z)

      И также есть раскладка "Serbian (Russia)" которая похоже подйдет для русского и себрской киррилицы.

      Так что похоже, что в Ubuntu вам бы тоже хватило двух раскладок. Говорить о преимуществах макоси в данном вопросе преждевременно)


  1. snp
    11.01.2022 17:27
    +1

    xkb «из коробки» умеет 4 раскладки без всяких внешних программ. У меня настроено 3 раскладки, переключение:


    L-Ctrl — английская
    Menu — русская
    AltGr+Menu — тибетская


  1. amarao
    11.01.2022 19:06
    +2

    Всё-таки прямое переключение на раскладку удобнее, чем 'toggle'. Мне приходится работать с тремя.

    Вот мои хоткеи:

    caps - English
    shift-caps - Russian
    μενου - Greek


    1. Danik-ik
      11.01.2022 20:17
      +1

      Я на прямом переключении почему-то часто упорно, раза по три, жму не тот язык, когда по нескольку раз переключаюсь в одном предложении. В таких ситуациях лично мне удобно переключаль одной и той же кнопкой на «парный» язык. Настроил русский на правый ctrl, английский на левый, японский на win+menu, а на капслоке русский и английский по кругу без японского. Mint + cinnamon, переключение на скриптах там, где не хватает штатного функционала.


    1. un1t Автор
      11.01.2022 20:26

      μενου - Greek

      это что за клавиша?


      1. aelaa
        11.01.2022 20:27

        слева от right ctrl, для вызова контекстного меню


    1. Lynn
      11.01.2022 20:45
      +2

      Надо бы написать шифт-капс или регистр-вверх (или как там эти кнопки по русски называются) ????


  1. Amikko
    11.01.2022 20:58
    +1

    У меня три повседневно используемые раскладки - русский (Shift + пробел), английский (Ctrl + пробел), эсперанто (Ctrl + Alt + пробел).

    У меня Убунту с Гномом. Настроил через стандартный редактор горячих клавиш так:

    Имя: Переключиться на эсперанто-раскладку
    Комбинация клавиш: Ctrl + Alt + Space
    Команда: gdbus call --session --dest org.gnome.Shell --object-path /org/gnome/Shell --method org.gnome.Shell.Eval "imports.ui.status.keyboard.getInputSourceManager().inputSources[2].activate()"
    
    Имя: Переключиться на русскую раскладку клавиатуры
    Комбинация клавиш: Shift + Space
    Команда: gdbus call --session --dest org.gnome.Shell --object-path /org/gnome/Shell --method org.gnome.Shell.Eval "imports.ui.status.keyboard.getInputSourceManager().inputSources[1].activate()"
    
    Имя: Переключиться на английскую раскладку клавиатуры
    Комбинация клавиш: Ctrl + Space
    Команда: gdbus call --session --dest org.gnome.Shell --object-path /org/gnome/Shell --method org.gnome.Shell.Eval "imports.ui.status.keyboard.getInputSourceManager().inputSources[0].activate()"
    

    Остаётся нерешённая проблема: такие кастомные комбинации не работают на экране входа в систему. Но там работает обычная комбинация, которая переключает раскладки по кругу, у меня Windows + Space, так что это не особо беспокоит.


    1. amarao
      12.01.2022 13:49

      Вы неправильно настроили. Настраивайте уровнем ниже.

      https://github.com/amarao/home/blob/master/locale_and_keyboard.yaml


    1. mattint
      13.01.2022 07:52

      Мне очень интересно, чем ты таким занимаешься, что тебе надо что-то печатать на эсперанто?


      1. Amikko
        13.01.2022 08:36
        +1

        • Учусь (по направлению интерлингвистики — что подразумевает написание объёмных текстов на эсперанто, по сути это эсперанто-филология).

        • Переписываюсь в соцсетях — основная часть моих интернетных контактов сейчас это эсперантисты.

        • Занимаюсь бюрократической деятельностью в РоСЭ (где на эсперанто все внутренние документы и взаимодействия).


  1. alpik
    11.01.2022 22:34
    +1

    Забиндил 3 кнопки, которыми обычно не пользовался, под каждую раскладку. i3wm:

    # Right_Shift > English
    bindcode 62 exec --no-startup-id "xkbgroup set num 0"
    
    # Right_Alt > Russian
    bindcode 108 exec --no-startup-id "xkbgroup set num 1"
    
    # Right_Ctrl > Ukrainian
    bindcode 105 exec --no-startup-id "xkbgroup set num 2"


  1. DabjeilQutwyngo
    11.01.2022 22:43
    +1

    Я эту проблему лет 10 назад решил в винде средствами ОС: английский – Shift+Ctrl+9, русский – Shift+Ctrl+0. Осталось ещё минимум 8 цифр для включения других языков. Применяются пальцы обеих рук: по правилам десятипальцевого метода слепой печати. Shift и Ctrl нажимаю безымянным и мизинцем левой руки соответственно. 9 и 0 – соответственно правой. В MS Word для установки языка выделенному блоку текста добавил ещё и Alt к этим комбинациям. Как обычно, в Windows 10 с этим проблема: сбрасывает эти настройки пользователю при подключении по RDP. Лечится прописыванием (копированием) этих настроек для экрана блокировки (дефолтному или системному пользователю, не помню уже точно). Ещё некоторые программы любят сбрасывать, типа PuntoSwitcher.

    Цель подхода – выставлять требуемый язык независимо от текущего. Панель задач не использую: скрыта под окнами, по наведению мыши тоже не вылазит. Т.е. системного трея тоже не видно. Вызываю меню "Пуск" по клавише "Win", когда требуется. Только начиная с Windows 8 с полным скрытием панели задач проблема: дизайнеры-идиоты в Microsoft почему-то решили, что так нельзя, и что панель всегда должна показываться. Т.е. автоскрытие панели можно, а прятать под окнами всегда, пока не вызовут принудительно по нажатию клавиши, – нет.

    А ещё эти идиоты не понимают, что панель задач может быть помещена на левой стороне экрана, а не внизу, чтобы видеть заголовки сразу без наведения мыши. Поэтому группировка пунктов панели на задач – зло. Прочие дизайнерские изыски, ориентированное на располжение панели задач внизу, – зло. Это некоторые из причин, почему до сих пор использую Windows 7: там нормально работает 7+TaskBarTweaker. А ещё, потому что в Windows 7 можно выключить ClearType и размывание контуров глифов шрифтов, а Segoe UI заменить на Verdana. В результате все глифы чёткие, никакой меняющейся толщины начертания, никаких "хинтов" для размывания. Только со стандартными размерами шрифтов там уже тоже проблема, которой не было в предыдущих версиях.

    Нельзя применять субпиксельный рендериг к шрифтам, если размер пиксела больше 0.027 мм, т.е. разрешение меньше 300 dpi. А ещё – никакого субпиксельного рендеринга в браузерах, за что нужно нищадно карать, когда навязывают такие шрифты без спроса пользователя. И вообще, дизайнеров необходимо научить уважать пользовательские и системные настройки, чтобы даже не думали создавать и прописывать свои шрифты и их размеры, как и фиксировать прочие размеры графических элементов: в общем случае не известно, какой физический размер пиксела будет, и к какому шрифту привык глаз пользователя.


  1. shoorick
    12.01.2022 03:44
    +1

    У меня Debian плюс кое-где Ubuntu — хватает обычных раскладок English (US) и Русской. Но с дополнительными («типографскими») символами в третьем-четвёртом слое (вызывается через AltGr — правый Alt).

    Американская раскладка
    Американская раскладка
    Русская раскладка
    Русская раскладка

    Для остального, что недоступно через правый Alt, есть клавиша Compose — у меня её роль выполняет правая клавиша Win. С её помощью можно вводить буквы языков с латинским алфавитом: испанские ¡ñá, немецкие ßäöü, французские ôç, итальянскую ù, польские łą, литовские čėįšū, можно и кириллицу: ѣәєҗҙқҡѵѳўѳ.

    Под мои задачи (преимущественно русский и английский ввод, остальные языки — гораздо реже) мне вполне хватает двух раскладок. Переключаю капслоком либо сочетанием Win+пробел.


  1. Keyten
    12.01.2022 07:47

    На маке поставил Karabiner и переключение раскладки – английская на левый Cmd, русская на правый. Мегаудобно, теперь сложно представить, как без этого жить.

    Ещё установил эксперимента ради Universal Layout, 4 месяц с ним. Набирать без шифта запятую и !@#;%:?*()'" очень приятно. Угловые скобки <> без перескакиваний на английский тоже сильно упрощают рисование стрелочек типа <- в ноушенах.

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

    Ну и встроенная в неё раскладка Бирмана, само собой, это здорово.


  1. sheshanaag
    12.01.2022 09:03

    org.gnome.Shell.Eval больше недоступен в Gnome 41, вам будет нужно написать Gnome extension


    1. un1t Автор
      12.01.2022 10:48

      печально


      1. sheshanaag
        12.01.2022 11:03
        +1

        Он достаточно простой, если хотите, можете взять из https://github.com/lyokha/g3kb-switch, в директории extension, названия путей к объекту можете переименовать на свой вкус.


    1. kovserg
      12.01.2022 12:53

      А вообще где искать документацию, по этому бардаку с переключением раскладки клавиатуры в linux? И почему они постоянно deprecatе-ят способы переключения и изобретают новые?

      gsettings set org.gnome.desktop.input-sources current 0
      
      image

      gdbus call --session --dest org.gnome.Shell \
          --object-path /org/gnome/Shell \
          --method org.gnome.Shell.Eval \
          "imports.ui.status.keyboard.getInputSourceManager().inputSources[0].activate()"
      
      gdbus introspect --session --dest org.gnome.Shell --object-path /org/gnome/Shell
      
      «The `Eval` interface is not available anymore due to security issues»


  1. serge-sb
    12.01.2022 16:07

    Просто спасибо вам огромное за фокус с раскладкой "США (международная)"! Невероятное ощущение, когда узнаёшь впервые что-то очень базовое, что существовало лет -дцать сколько. Приходилось держать три языка (en, de, ru) и переключаться по-кругу со всеми вытекающими удобствами.


    1. serge-sb
      13.01.2022 15:06

      Дополню. В Windows при выборе США (международная) помимо AltGr-сочетаний, модификаторами (dead-keys) становятся ещё несколько клавиш:

      ' single quote key = acute accent

      " double quote key = umlauts

      ` grave accent key = grave accent

      ^ caret (Shift-6) = circumflex accent

      ~ tilde (Shift-`) = tilde accent

      ... что может стать некоторым сюрпризом. Например, #include ünit.h... ой

      Как вариант - сделать свою раскладку (или модифицировать системныю) с помощью Microsoft Keyboard Layout Creator.


  1. AmdY
    12.01.2022 16:34

    Что только люди не придумают, лишь бы не пользоваться нормальным DM. Ставите KDE, в настройках Layouts выставляете переключение на Caps Lock, добавляете нужные расскладки и вешаете на них Shortcut, чтобы не париться об очеродности.

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


    1. un1t Автор
      14.01.2022 14:31

      Meta+E

      Meta - это что за кнопка такая?


  1. DmitriyGordinskiy
    13.01.2022 07:52

    Тоже почувствовал такую проблему когда активно работал с тремя языками. Был полностью удовлетворен прямым переключением через комбинации Ctrl + 1/2/3. На эти хоткеи почти всегда уже что-то привязано в приложениях, но пока ни разу не встречал там функций, быстрого доступа к которым было бы жалко лишиться.

    Даже сейчас, работая только с двумя языками, всё еще предпочитаю отдельные хоткеи для каждой раскладки - начинать набор текста с указания конкретного языка, как будто проще и быстрее чем проверять что там сейчас выбрано и переключаться по необходимости.


  1. Tolik-5
    13.01.2022 19:41

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

    Раньше для этой цели использовал хорошую программу Type It Easy, но она на винде 10 глючит, а обновлений давно не было.

    Пробовал ставить раскладку Ильи Бирмана - она плохо дружит с Punto Switcher, а без него уже как без рук (использую не только как переключалку, но и для автозамены).

    Попробовал US International - она, конечно, не глючит, но непривычно, что некоторые символы (' " ^ ~) не выводятся на экран сразу, а только после нажатия другой клавиши (и иногда вылазит не то, что нужно).

    Короче, вернулся к стандартным US и ЙЦУКЕН, не без труда... Подскажите что-нибудь...