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