Как мне переназначить ключ в macOS Sierra, например, Right Alt to Right Control?

42

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

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

Стивен Хоуэлл
источник

Ответы:

37

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

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

Обратите внимание, что вышеприведенная команда не переключает правый Alt и правый контроль. Они оба будут правы. Если у вас есть 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
Стивен Хоуэлл
источник
Приятно - спасибо! Можно ли с помощью этой команды восстановить сопоставления по умолчанию?
17
1
@ Cᴀʟʟᴏᴅᴀᴄɪᴛʏ, чтобы сбросить любую клавишу, вы просто запускаете команду снова со значением этой клавиши в обоих Srcи Dst.
Стивен Хоуэлл,
Это возвращается при перезагрузке. Я могу перезапустить эту команду при каждой загрузке, но я бы предпочел не делать этого. Есть ли способ сделать это постоянным?
firebush
2
@firebush В этом посте предлагается использовать хук входа в систему, чтобы сделать такие команды постоянными: stackoverflow.com/a/46460200/629530
firebush
1
@ StevenC.Howell Как насчет комбинаций модификаторов функций? Например, обратная косая черта \ в моей клавиатуре - это то, Shift+Option+7что я хотел бы заменить на что-то более простое, например, Option+.которое я почти не использую. Как мне это сделать? Спасибо за вашу помощь.
Nanashi No Gombe
13

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

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

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

У меня новый 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 "$HOME"/bin
printf '%s\n' '#!/bin/sh' \
    'hidutil property --set '{"UserKeyMapping":[{"HIDKeyboardModifierMappingSrc":0x700000064,"HIDKeyboardModifierMappingDst":0x700000029}]}' \
    >"$HOME"/bin/userkeymapping
chmod 755 "$HOME"/bin/userkeymapping
cat<<: >"$HOME"/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 "$HOME"/Library/LaunchAgents/userkeymapping.plist

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

tripleee
источник
Более ранняя версия этого ответа рекомендовала использовать, LoginHookно он не работал для меня, и, основываясь на stackoverflow.com/a/22872222/874188, я переключился на launchdподход.
tripleee
Как горячий поклонник vi / vim, это именно то, что я искал. Спасибо.
Филипп Кернс
5

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

Пример: как переназначить Escape Key на Mac

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

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

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

ссылка

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

В случае, если вы хотите восстановить значения по умолчанию:

# setting it to 'null' does not work on my MBP High Sierra
hidutil property --set '{"UserKeyMapping":[]}'
clarkttfu
источник