Как переключать язык в macOS по клавише (Глобус) без задержки и не потерять Fn

от автора

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

На Mac для этого есть отдельная клавиша 🌐. Идея хорошая, реализация мешает печатать: после нажатия появляется меню языков, переключение происходит с паузой, а иногда клавишу приходится нажимать повторно.

Я хотел получить простое поведение:

  • коротко нажал 🌐 — язык сразу поменялся

  • удерживаю 🌐 — работает Fn

  • никаких всплывашек

Сделал это через Karabiner-Elements. Ниже готовое правило и инструкция для быстрого запуска. Настройку я проверил на macOS 26.5.2 и Karabiner-Elements 16.1.0. Использую две стандартные раскладки: US и RU. Обращаю внимание тех, у кого больше двух языков в системе, вероятно вам правило не подойдёт, на трёх и более я не тестировал.

Почему я не оставил обычный Control + Space

Сначала я настроил Karabiner так, чтобы клавиша 🌐 отправляла системное сочетание Control + Space.

Работало плохо. Иногда язык менялся с первого раза, иногда со второго или третьего. Скорости тоже не прибавилось: Karabiner просто нажимал за меня ту же системную комбинацию со всеми её задержками. Надёжнее оказалось выбирать нужную раскладку напрямую. Для этого в Karabiner есть команда select_input_source. Когда включён английский, правило выбирает русский. Когда включён русский — английский.

Что понадобится

Нужен Karabiner-Elements — бесплатная программа для переназначения клавиш в macOS.

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

Отключаем штатное действие клавиши 🌐

Сначала нужно убрать системное переключение:

Системные настройки → Клавиатура → Нажатие клавиши 🌐 → Ничего не делать

Теперь клавишу будет обрабатывать только Karabiner. Если оставить штатное действие, macOS продолжит показывать меню языков или начнёт переключать раскладку одновременно с нашим правилом.

Добавляем правило

Открываем Karabiner-Elements:

Complex Modifications → Add your own rule

Удаляем пример из редактора и вставляем этот JSON:

{  "description": "Globe tap: switch US and Russian; hold: Fn",  "manipulators": [    {      "conditions": [        {          "input_sources": [            {              "input_source_id": "^com\\.apple\\.keylayout\\.US$"            }          ],          "type": "input_source_if"        }      ],      "from": {        "key_code": "fn"      },      "parameters": {        "basic.to_if_alone_timeout_milliseconds": 500,        "basic.to_if_held_down_threshold_milliseconds": 100      },      "to": [        {          "key_code": "fn",          "lazy": true        }      ],      "to_if_alone": [        {          "select_input_source": {            "input_source_id": "^com\\.apple\\.keylayout\\.Russian$"          }        }      ],      "to_if_held_down": [        {          "key_code": "fn"        }      ],      "to_if_other_key_pressed": [        {          "other_keys": [            {              "any": "key_code"            },            {              "any": "consumer_key_code"            }          ],          "to": [            {              "key_code": "fn"            }          ]        }      ],      "type": "basic"    },    {      "conditions": [        {          "input_sources": [            {              "input_source_id": "^com\\.apple\\.keylayout\\.Russian$"            }          ],          "type": "input_source_if"        }      ],      "from": {        "key_code": "fn"      },      "parameters": {        "basic.to_if_alone_timeout_milliseconds": 500,        "basic.to_if_held_down_threshold_milliseconds": 100      },      "to": [        {          "key_code": "fn",          "lazy": true        }      ],      "to_if_alone": [        {          "select_input_source": {            "input_source_id": "^com\\.apple\\.keylayout\\.US$"          }        }      ],      "to_if_held_down": [        {          "key_code": "fn"        }      ],      "to_if_other_key_pressed": [        {          "other_keys": [            {              "any": "key_code"            },            {              "any": "consumer_key_code"            }          ],          "to": [            {              "key_code": "fn"            }          ]        }      ],      "type": "basic"    }  ]}

Нажимаем Save. Перезапускать Mac или Karabiner не нужно.

Что получилось

Теперь короткое нажатие 🌐 переключает US и Russian сразу после отпускания клавиши. Меню выбора языка не появляется.

При удержании 🌐 клавиша работает как Fn. Можно пользоваться Fn + ↑, Fn + Delete и другими привычными сочетаниями.

За разделение короткого и длинного нажатия отвечает эта настройка:

"basic.to_if_held_down_threshold_milliseconds": 100

Karabiner ждёт 100 мс. Если клавишу отпустили раньше, меняется язык. Если продолжаем удерживать, включается Fn.

Если короткое нажатие иногда превращается в Fn

Я использую порог 100 мс: с ним Fn срабатывает быстро, а обычного короткого нажатия хватает для смены языка. Если вы нажимаете 🌐 чуть дольше, поставьте 150 вместо 100. Значение нужно поменять в двух местах. Если Fn ощущается медленным, можно попробовать 80. В общем, всё на вкус и цвет.

Если язык вообще не меняется

Чаще всего проблема в названии раскладки.

Правило рассчитано на:

com.apple.keylayout.UScom.apple.keylayout.Russian

Если у вас установлены ABC, British, Russian PC или сторонняя раскладка, идентификаторы будут другими.

Откройте Karabiner-EventViewer → Variables и найдите input_source_id. Затем подставьте показанные значения в правило.

Также проверьте три вещи:

  • для клавиши 🌐 в macOS выбрано «Ничего не делать»

  • Karabiner получил все запрошенные разрешения

  • в Complex Modifications нет второго правила для Fn или 🌐

Ограничения и нюансы

  • Готовое правило рассчитано на два языка. Если раскладок три или больше, логику придётся расширить.

  • С китайскими, японскими, корейскими и вьетнамскими методами ввода прямой выбор источника может работать нестабильно. Об этом предупреждают сами разработчики Karabiner.

ссылка на оригинал статьи https://habr.com/ru/articles/1064984/