Как стать автором
Обновить

Переназначение клавиш в macOS без стороннего софта и консоль как в Quake

Время на прочтение4 мин
Количество просмотров12K

Зачастую, в ответ на вопрос "Как переназначить клавиши на 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. В настройках iTerm2 укажем 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 > General) назначаем F13 в качестве горячей клавиши для Hotkey Window (Preferences > Profiles > Ваш профайл > Keys > General > Configure Hotkey Window > Hotkey).

Результат работы: выпадающий терминал по нажатию Esc.
Результат работы: выпадающий терминал по нажатию Esc.

Внимание: если у вас в настройках клавиатуры 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

  • @legos в комментарии указал на настройки внешнего вида консоли в iTerm2

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Переназначаете клавиши на macOS?
29.03% Да (любой способ)27
48.39% Нет45
18.28% Да, с помощью Karabiner-Elements17
4.3% Да, с помощью hidutil4
Проголосовали 93 пользователя. Воздержались 7 пользователей.
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Используете iTerm2?
54.17% Да52
8.33% Да, и выпадающую консоль8
37.5% Нет36
Проголосовали 96 пользователей. Воздержались 4 пользователя.
Теги:
Хабы:
Всего голосов 10: ↑8 и ↓2+7
Комментарии19

Публикации

Истории

Ближайшие события

27 августа – 7 октября
Премия digital-кейсов «Проксима»
МоскваОнлайн
28 сентября – 5 октября
О! Хакатон
Онлайн
3 – 18 октября
Kokoc Hackathon 2024
Онлайн
10 – 11 октября
HR IT & Team Lead конференция «Битва за IT-таланты»
МоскваОнлайн
25 октября
Конференция по росту продуктов EGC’24
МоскваОнлайн
7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн