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

На 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.US
com.apple.keylayout.Russian

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

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

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

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

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

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

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

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

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