Как переназначить клавишу в macOS Sierra, например, правый Alt на правый элемент управления?

Раньше я использовал Karabiner для переназначения Right Alt на Right Control (как пользователь Emacs я использую Control НАМНОГО чаще, чем Alt), но обновление до Sierra сломало это. Понижение не вариант.

Как вручную переназначить ключи в Sierra? Я специально хотел бы переназначить Right Alt на Right Control.

Ответы (4)

Техническая заметка Apple TN2450 описывает, как переназначить клавиши. Выполнение следующей команды переназначит Right Alt на Right Control.

hidutil property --set '{"UserKeyMapping":
    [{"HIDKeyboardModifierMappingSrc":0x7000000e6,
      "HIDKeyboardModifierMappingDst":0x7000000e4}]
}'

Обратите внимание, что приведенная выше команда не переключает правый Alt и правый элемент управления. Они оба будут Right Control. Если у вас MacBook, вы не заметите этого, пока не подключите внешнюю клавиатуру. Если вы хотите переключить Right Alt и Right Control, вам нужно добавить вторую команду переключения, как показано ниже.

hidutil property --set '{"UserKeyMapping":
    [{"HIDKeyboardModifierMappingSrc":0x7000000e4,
      "HIDKeyboardModifierMappingDst":0x7000000e6},
     {"HIDKeyboardModifierMappingSrc":0x7000000e6,
      "HIDKeyboardModifierMappingDst":0x7000000e4}]
}'

В таблице внизу Технической заметки есть список шестнадцатеричных значений для каждого ключа. Чтобы обобщить приведенный выше ответ для переключения любых клавиш, вы должны orиспользовать шестнадцатеричное значение из этого списка вместе с 0x700000000. Следующий код Python демонстрирует один из способов сделать это.

In [1]: def convert(val):
   ...:     int_val = int(val, 16)
   ...:     int_ref = 0x700000000
   ...:
   ...:     return hex(int_ref | int_val)
   ...:

In [2]: r_alt = '0xE6'

In [3]: print(convert(r_alt))
0x7000000e6
Красиво - спасибо! Есть ли способ восстановить сопоставления по умолчанию с помощью этой команды?
@ Cᴀʟʟᴏᴅᴀᴄɪᴛʏ, чтобы сбросить любой ключ, вы просто снова запускаете команду со значением этого ключа в обоих Srcи Dst.
Это возвращается при перезагрузке. Я могу повторно запускать эту команду при каждой загрузке, но я бы предпочел этого не делать. Есть ли способ сделать это постоянным?
@firebush В этом посте предлагается использовать хук входа в систему, чтобы сделать такие команды постоянными: stackoverflow.com/a/46460200/629530
@StevenC.Howell Как насчет комбинаций модификаторов функций? Например, обратную косую черту \ в моей клавиатуре Shift+Option+7я хотел бы заменить чем-то более простым, Option+.чем я практически не пользуюсь. Как мне это сделать? Спасибо за вашу помощь.
@StevenC.Howell Я также ищу способ переназначить комбинацию ключей на один ключ. В моем случае (по-испански - ISO): ¡ (and ¿)быть fn+ Delete Forward. Это возможно?
@NanashiNoGombe Я не думаю, что это конкретное средство работает на этом уровне, это довольно низкоуровневая утилита для сопоставления отдельных клавиш на клавиатуре. Похоже, он не обеспечивает никакого контроля над комбинациями клавиш.
Я попробовал это с кодами клавиш, которые я получил с сайта manytricks.com/keycodes . Не работает.
@Bachsau, попробуйте коды клавиш из Tichnical Note, TN2450 .
@StevenC.Howell К сожалению, этот список неполный. Я хочу переназначить клавишу меню на клавиатуре Windows, чтобы она работала как вторая командная клавиша.
@Bachsau, возможно, код клавиши для клавиши меню отличается от этой ссылки. Технические примечания ссылаются на Спецификацию таблиц использования USB HID, раздел 10 Страница клавиатуры/клавиатуры, с неработающей ссылкой. Я нашел упомянутый pdf здесь . Возможно, в этом документе есть ключевой код, который вы ищете.
В случае, если вы захотите восстановить значения по умолчанию: ``` # установка значения 'null' не работает с моим свойством MBP High Sierra hidutil --set '{"UserKeyMapping":[]}' ```
@Bachsau, я думаю, вы можете найти ключ, который ищете, в списке «Клавиатурное приложение — 0x65».
@Mandark Это сработало! Спасибо. Я действительно должен был немного глубже изучить спецификации HID и их названия клавиш.
Кажется, это не сработает для меня - я хочу, чтобы кнопка ⏏ на моей клавиатуре делала что-то полезное, но это не указано в связанной документации 😔
Я сопоставлял свой Caps Lock с F10 на всех своих компьютерах в течение последних 10 лет. В OS X/macOS я всегда использовал для этого Karabiner. Но я всегда находил это решение несовершенным, и я обнаруживал все больше и больше проблем, которые вызывает Karabiner, хотя это само по себе очень мощное программное обеспечение. Наконец, я нашел это решение, и я могу переназначить несколько клавиш (все, для чего я использовал Karabiner!), не оставляя ничего работающим в фоновом режиме!

Более общий и удобный подход — использовать Karabiner-Elements , версию Karabiner, которая работает на Sierra.

Быстрый обзор Karabiner-Elements . Он работает на macOS High Sierra 10.13.3 (17D102). Я успешно поменял местами правые клавиши Command и Option.
Сторонние приложения никогда не бывают «более общими». Зачем кому-то загромождать свою систему приложениями, которые делают то, что встроено прямо в ОС?
@Bachsau носит более общий характер, поскольку позволяет вам делать множество других вещей, например, настраивать комбинации клавиш, макросы и профили или использовать общие и / или разделенные конфигурации сопоставления для любых внутренних и внешних клавиатур.
@Bachsau У меня разные профили для каждой из моих клавиатур, поэтому они работают одинаково. Очень хорошее приложение
Фантастическое приложение. Работает на Биг Сюр как шарм.

Это дополнение к ответу Стивена С. Хауэлла.

У меня новый MacBook Pro со скандинавской клавиатурой. В этой новой модели больше нет клавиши Esc, что для меня является существенным недостатком.

Я обнаружил, что следующее будет переводить клавишу § (вверху слева, слева от 1 и выше клавиши табуляции), которую я не думаю, что когда-либо использовал для чего-либо до сегодняшнего дня, для создания Esc.

hidutil property --set '{"UserKeyMapping":[{"HIDKeyboardModifierMappingSrc":0x700000064,"HIDKeyboardModifierMappingDst":0x700000029}]}'

В документации Apple (ссылка на ответ Стивена) это помечено как «Клавиатура не для США \ и |» (0x64).

Некоторые «неамериканские» клавиши трудно обнаружить, потому что они обычно относятся к клавишам, которые имеют другую маркировку на используемой вами клавиатуре. (Я также обнаружил, что «Серьезный ударение и тильда» относится к клавише между левым сдвигом и z, которая на моей клавиатуре производит <. Я не смог установить, какая клавиша соответствует «неамериканской #и ~», и не стал больше экспериментировать, как только обнаружил мой ключ.) Если хотите поэкспериментировать, попробуйте запустить скрипт в терминале, пока не найдете нужный ключ:

for ((i=1;i<=128;++i)); do
    printf '0x7000000%0x\n' "$i"
    printf '{"UserKeyMapping":[{"HIDKeyboardModifierMappingSrc":0x7000000%0x,"HIDKeyboardModifierMappingDst":0x70000000a}]}' "$i" |
    xargs -0 hidutil property --set >/dev/null
    read -p "Type some stuff: "
    hidutil property --set '{"UserKeyMapping":[{}]}' >/dev/null
done

Это перебирает коды клавиш и изменяет их по одному, в надежде, что вы сможете методом проб и ошибок найти ключ, который не особенно полезен для вас. Попробуйте ввести что-нибудь, когда вас попросят — если вы получите gвместо того, что ожидали, значит, вы нашли правильный код клавиши. (Измените 0x70000000aна что-то другое, если gэто не удобный выбор для вас. Может быть, вы хотите переназначить gклавишу?) Когда вы закончите печатать, просто нажмите Enter, чтобы перейти к следующей клавише.

Что бы это ни стоило, последняя команда внутри цикла — это то, как вы удаляете все UserKeyMappingнастройки:

hidutil property --set '{"UserKeyMapping":[{}]}'

Когда вы сначала запускаете hidutil property --get UserKeyMapping, он производит

(null)

но кажется, что вы не можете вернуть это значение, чтобы отключить настройку (точнее, оно принимает, но игнорирует этот ввод).

(Если вы не знакомы с Терминалом, просто скопируйте/вставьте что-то из forдо doneпо вашему bash$ запросу или подобное.)

В соответствии с этим связанным вопросом о переполнении стека вы можете поместить команду в файл сценария в своем домашнем каталоге и добавить ее в свою launchdконфигурацию, чтобы сделать это изменение постоянным.

Если некоторым читателям неудобно делать это самостоятельно, вот быстрый скрипт, который сделает это за вас. Опять же, просто скопируйте/вставьте это в командную строку терминала.

mkdir -p ~/bin
printf '%s\n' '#!/bin/sh' \
    'hidutil property --set '"'"'{"UserKeyMapping":[{"HIDKeyboardModifierMappingSrc":0x700000064,"HIDKeyboardModifierMappingDst":0x700000029}]}'"'" \
    >~/bin/userkeymapping
chmod 755 ~/bin/userkeymapping
mkdir -p ~/Library/LaunchAgents
cat<<: >~/Library/LaunchAgents/userkeymapping.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>userkeymapping</string>
    <key>ProgramArguments</key>
    <array>
        <string>$HOME/bin/userkeymapping</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>
:
launchctl load ~/Library/LaunchAgents/userkeymapping.plist

Очевидно, что если вы получили какой-то другой ключ, 0x700000064вам нужно изменить его в сценарии или в файле , который ~/bin/userkeymappingон создает, если вы уже выполнили вышеуказанное.

В более ранней версии этого ответа предлагалось использовать LoginHook, но это не сработало для меня, и на основе stackoverflow.com/a/22872222/874188 вместо этого я переключился на launchdподход.
Как ярый поклонник vi/vim, это именно то, что я искал. Спасибо.
Я считаю, что это тоже должно работать zsh, но остаюсь сбитым с толку тем, что Apple переключилась на эту злую оболочку по умолчанию для новых пользователей.

Если все, что вы хотите сделать, это переназначить один ключ

Пример: как переназначить клавишу Escape на Mac

  1. Перейдите в меню Apple и выберите «Системные настройки», затем перейдите на панель настроек «Клавиатура» и выберите вкладку «Клавиатура».

  2. Нажмите на кнопку «Ключи-модификаторы» в правом нижнем углу.

  3. Выберите клавишу, которую вы хотите переназначить и изменить для выполнения функции Escape: Caps Lock (наша рекомендация), Control, Option или Command.
  4. Выберите «Escape» из раскрывающегося списка, соответствующего клавише, которую вы хотите переназначить в качестве аппаратной клавиши Escape, затем нажмите «ОК», чтобы установить изменение.

Справка

Это дает вам контроль только над четырьмя ключами, перечисленными в этом ответе.
Правильно и очень полезно. Если кто-то хочет переназначить дополнительные клавиши, обратите внимание на карабин
Похоже, что нет возможности указать конкретную клавишу, например «правый ⌥». Самое конкретное, что вы можете получить, — это сигнал, например, «любой ⌥».
Правильно, но хорошо то, что вам не нужно ничего устанавливать, он просто работает.
Это отличный ответ, потому что большинство людей, которые хотят перепривязать ключи, хотят перепривязать эти конкретные ключи.