Я много пишу по работе. В чате обсуждаю задачу по-русски, затем переключаюсь в консоль и набираю команду на английском. После консоли открываю почту, потом документацию, снова чат. Раскладку приходится менять постоянно.
На 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.
iddi
а я поставил переключение языка по caps lock. долгое нажатие - caps lock, короткое - смена языка. все без меню и очень удобно. полностью системная функция.
lookfortheroot
Переключение языков без однозначного понимания, какой язык прямо сейчас и на какой переключится - это исключительно утомительный процесс, заставляющий много раз в день отслеживать текущий статус.
Я себе сделал так - одним тапом английская, двойным тапом кириллическая раскладка. Теперь вообще не отвлекаюсь на это и точно знаю, с какой сейчас буду печатать.
Даже если примерно помню, что раскладка уже выставлена какая надо, всё равно привычно жму один или два раза. По ощущениям когнитивная нагрузка снизилась просто колоссально.
iddi
хорошая идея.
у меня сейчас сложно все организовано (я не очень хорошо вижу) - при переключении языков компьютер говорит рус/лат, также когда секунд 10 ничего не печатал при печати напоминает вслух текущую раскладку. также у меня для каждой раскладки свой звук нажатия клавиш (это все я сам написал https://github.com/Old-iddi/KeySay). и еще в последних версиях macos раскладка при смене показывается под текстовым курсором (это системная функция).
Yak-AV
Согласен. Поэтому сделал тап по левому шифту - русская, а по правому - английская.
aamonster
Только она с какой-то версии системы тоже начала лагать (если начать печатать сразу после переключения – оно может не сработать).
JerryI
Да. решение всегда было!
CapsLock
kit_oz
Жаль системное переключение языков на капслоке точно так же сломано. Интересно, через карабинер можно настроить переключение по капслоку