Как переназначить кнопку 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.

Вернемся к команде. Вывод должен быть примерно таким:

frpaaoloyhfyymtcjls-pze2rze.png

Это и есть коды функциональных и медиа клавиш. В левом столбике идут коды функциональных клавиш (F1, F2, F3 и т.д.), в правом медиа клавиш.

Нам нужна медиа клавиша, которая на кнопке F5. Это будет пятый код сверху в правом столбике:

zomvu3cb2gp8e-fu99jh8inh1me.png

Далее нужно перевести этот код из 32 битного числа в 64 битный. Для этого нужно заполнить число незначащими нулями 0x000c00cf0x000c000000cf.

Отлично. Теперь мы можем переназначить эту клавишу.

Мапинг через 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 тоже. Также при каждой новой сборке вам нужно будет удалять права в настройках и после запуска приложения добавлять их снова.

Полезные ссылки

© Habrahabr.ru