Как переназначить кнопку dictation на macOS (без стороннего софта)
Если вам нужны конкретные инструкции по переназначению клавиш стандартными методами и код программы для прослушки нажатия клавиш, то все это лежит в разделе инструкций.
Немного предистории
Год назад я купил Mac с функциональными клавишами и столкнулся с кнопкой dictation
, которая вызывает стандартную программу для диктовки текста. Перед покупкой я предположил что это кнопка с значком микрофона должна включать и выключать микрофон, каково же было мое разочарование, когда вместо функционала включения и выключения микрофона я получил запуск dictation
. Меня это не устроило и я начал поиски.
Первой программой, которую я нагулил, была Karabiner-Elements. Но она показалась мне слишком громоздкой для такой небольшой задачи.
Далее я нашел Ukelele, которая позволяет создать свою раскладку клавиатуру. Уже лучше, более нативно, но это все еще не то что нужно.
Потом я наткнулся на статью. В ней довольно подробно описывается как переназначить клавиши через утилиту hidutil
встроенную в MacOS.
Тут появилась идея переназначить клавишу dictation
на клавишу, которая не используется на клавиатуре, но поддерживается системой. Т.е. переназначить код, который отправляет эта клавиша в систему. Я это сделал через hidutil
, плюс написал небольшую программу, которая слушает события с клавиатуры и запускает скрипт по нажатию на клавишу F18.
В принципе можно сделать через обычный скрипт Apple, который запускается на шорткат, но хотелось бы видеть состояние микрофона в StatusBar.
Инструкции по настройке
Получение кода клавиши dictation
Перед тем как переназначить клавиши нам нужно получить код клавиши dictation
. Для этого нужно вызвать в терминале команду:
ioreg -l|grep FnFunctionUsageMap|grep -Eo "0x[0-9a-fA-F]+,0x[0-9a-fA-F]+"
Эта команда фильтрует вывод
ioreg
через утилитуgrep
, так что если вдруг у вас не будет работать эта команда, вы можете сохранить вывод командыioreg -l
в текстовый документ и найти определение переменнойFnFunctionUsageMap
.
Вернемся к команде. Вывод должен быть примерно таким:
Это и есть коды функциональных и медиа клавиш. В левом столбике идут коды функциональных клавиш (F1, F2, F3 и т.д.), в правом медиа клавиш.
Нам нужна медиа клавиша, которая на кнопке F5. Это будет пятый код сверху в правом столбике:
Далее нужно перевести этот код из 32 битного числа в 64 битный. Для этого нужно заполнить число незначащими нулями 0x000c00cf
→ 0x000c000000cf
.
Отлично. Теперь мы можем переназначить эту клавишу.
Мапинг через hidutil
Чтобы смапить клавишу dictation
на F18 нужно вызвать команду в терминале:
hidutil property --set '{"UserKeyMapping": [{"HIDKeyboardModifierMappingSrc":0x000c000000cf,"HIDKeyboardModifierMappingDst":0x70000006D}]}'
Более подробно о том как работает
hidutil
можно найти в Tech Note от Apple.
Плюс нам нужно добавить запуск этого скрипта при запуске системы. Для этого нужно создать файл ~/Library/LaunchAgents/com.nanoant.KeyRemapping.plist
с таким содержанием:
Label
com.nanoant.KeyRemapping
ProgramArguments
/usr/bin/hidutil
property
--set
{"UserKeyMapping":[{"HIDKeyboardModifierMappingSrc":0x000C000000CF,"HIDKeyboardModifierMappingDst": 0x70000006D}]}
RunAtLoad
Теперь при нажатии на клавишу dictation
должна срабатывать клавиша F18.
Программа для отключения микрофона
Ссылка на программу.
Принцип работы программы в том, что она слушает события с клавиатуры и хранит состояние микрофона. При первом запуске, она сбрасывает состояние микрофона в включенное состояние. Далее, когда происходит событие, она запускает AppleScript, изменяет переменную состояния и иконку в StatusBar.
Для того чтобы слушать события с клавиатуры приложению нужны права Accessibility и Input Monitoring. Они проставляются в настройках.
Собранное приложение можно найти в релизах в Гитхабе, либо собрать самостоятельно из исходного кода.
Обратите внимание на то, что если вы собираете приложение через XCode и запускаете сборку, то вам нужно будет дать права на Accessibility и Input Monitoring XCode тоже. Также при каждой новой сборке вам нужно будет удалять права в настройках и после запуска приложения добавлять их снова.