Зачастую, в ответ на вопрос «Как переназначить клавиши на macOS?» советуют использовать сторонний софт, например, Karabiner-Elements, но простое переназначение клавиш возможно и нативными средствами.
Задача
Уже много лет я переназначаю Esc
на CapsLock
во всех ОС, которыми пользуюсь (писал об этом в Не мучайте свой мизинец). В macOS это можно сделать прямо в настройках. Для macOS Ventura это System Settings > Keyboard > Keyboard Shortcuts... > Modifier Keys
. Получается, освобождается клавиша Esc
, которую можно было бы чем-то занять.
Для macOS есть популярный аналог Terminal — iTerm2. Одна из его фишек — Hotkey Window
— выпадающее окно терминала (как в Quake, где оно появляется по нажатию на ~
), которое вызывается по горячей клавише, заданной пользователем. Отличная возможность для освободившейся клавиши Esc
!
В итоге, на CapsLock
должен быть Esc
, а по нажатию на Esc
— выпадать терминал.
Решение
Переназначим CapsLock
на Esc
, а Esc
на F13
. В настройках iTrem2
укажем F13
как клавишу для активации Hotkey Window
.
Почему F13
, а не тот же CapsLock
или что-то ещё? Просто это неиспользуемая клавиша, а использование CapsLock
может поменять нам регистр в самый неподходящий момент, если iTerm2
не запущен.
Почему не сторонний софт
Можно было бы использовать Karabiner-Elements (я проверял — работает), но это сторонний софт, который требует доступ к Accessibility
, а ещё он размазан по системе так, что его не так-то просто удалить (это я тоже проверил на себе). Да и зачем это всё, когда можно воспользоваться нативными механизмами ОС?
hidutil
Согласно Technical Note TN2450, для переназначения клавиш в macOS можно воспользоваться инструментом командной строки hidutil
. Ниже пример кода для того чтобы поменять местами клавиши A
и B
:
$ hidutil property --set '{"UserKeyMapping":[{"HIDKeyboardModifierMappingSrc":0x700000004,"HIDKeyboardModifierMappingDst":0x700000005},{"HIDKeyboardModifierMappingSrc":0x700000005,"HIDKeyboardModifierMappingDst":0x700000004}]}'
В этом примере мы устанавливаем значение свойства UserKeyMapping
— это массив из пар HIDKeyboardModifierMappingSrc
и HIDKeyboardModifierMappingDst
. HIDKeyboardModifierMappingSrc
— это какую клавишу мы переопределяем, а HIDKeyboardModifierMappingDst
— та клавиша, код которой мы хотим воспроизвести. Код клавиши — это шестнадцетиричное число полученное путём применения операции ИЛИ
к числу 0x700000000
и значению клавиши. Таблицу значений для клавиш можно посмотреть тут.
В нашем случае, нужно поменять CapsLock
(0x700000039
) на Esc
(0x700000029
), а Esc
(0x700000029
) на F13
(0x700000068
):
hidutil property --set '{"UserKeyMapping":[{"HIDKeyboardModifierMappingSrc":0x700000039,"HIDKeyboardModifierMappingDst":0x700000029},{"HIDKeyboardModifierMappingSrc":0x700000029,"HIDKeyboardModifierMappingDst":0x700000068}]}'
Теперь в настройках iTerm2
выбираем профиль, который хотим использовать в выпадающей консоли. Ставим галочку A hotkey opens a dedicated window with this profile
в настройках профиля (Preferences > Profiles > Ваш профайл > Keys)
назначаем F13
в качестве горячей клавиши для Hotkey Window
(Preferences > Profiles > Ваш профайл > Keys > Configure Hotkey Window > Hotkey
).
Внимание: если у вас в настройках клавиатуры macOS (для macOS Ventura этоSystem Settings > Keyboard > Keyboard Shortcuts... > Modifier Keys
) CapsLock
уже переназначен, то это не заработает. Необходимо убрать это переназначение.
Запуск при логине
Настройки сделанные с помощью hidutil будут сброшены после перезагрузки. Чтобы этого не случилось, настроим запуск этой команды при логине.
Есть несколько способов это сделать. Я использовал LaunchAgent. Для этого в директории ~/Library/LaunchAgents/
создадим plist
файл (в моём случае ris58h.KeyRemapping.plist
). Содержимое файла:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>ris58h.KeyRemapping</string> <key>ProgramArguments</key> <array> <string>/usr/bin/hidutil</string> <string>property</string> <string>--set</string> <string>{"UserKeyMapping":[ { "HIDKeyboardModifierMappingSrc": 0x700000039, "HIDKeyboardModifierMappingDst": 0x700000029 }, { "HIDKeyboardModifierMappingSrc": 0x700000029, "HIDKeyboardModifierMappingDst": 0x700000068 } ]}</string> </array> <key>RunAtLoad</key> <true/> </dict> </plist>
Label
— некоторый уникальный идентификатор LaunchAgent-а.
ProgramArguments
— массив из элементов команды, которую мы хотим выполнить.
RunAtLoad
— флаг для запуска при загрузке.
Теперь наши настройки будут применены даже после перезагрузки.
UPDATES:
-
Для создания
plist
файла можно использовать https://hidutil-generator.netlify.app/ -
На SO есть пример с тем, как переназначить клавиши конкретной клавиатуры, если у вас их несколько (к вызову
hidutil
нужно добавить параметр с идентификатором устройства:--matching '{"ProductID":0x123}'
) https://stackoverflow.com/a/58981641/9137155
ссылка на оригинал статьи https://habr.com/ru/post/695620/
Добавить комментарий