Як перезавантажити ключ у macOS Sierra, наприклад, правий Alt на правий контроль?


45

Раніше я використовував Karabiner, щоб перевстановити правий Alt to Right Control (як користувач Emacs, я використовую Control набагато більше Alt), але оновлення до Sierra порушило це. Пониження рівня - це не варіант.

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

Відповіді:


40

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

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

Зауважте, що вищевказана команда не перемикає правий Alt і Right Control. Вони обидва будуть правильним контролем. Якщо у вас MacBook, ви не помітите цього, доки не підключите зовнішню клавіатуру. Якщо ви хочете переключити правий клавіш 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

Приємно - спасибі! Чи є спосіб відновити відображення за замовчуванням за допомогою цієї команди?
жовтня

1
@ Cᴀʟʟᴏᴅᴀᴄɪᴛʏ, щоб скинути будь-яку клавішу, ви просто запустіть команду ще раз зі значенням цього ключа в обох Srcі Dst.
Стівен К. Хоуелл

Це повертається при перезавантаженні. Я можу повторно запустити цю команду на кожному завантаженні, але я вважаю за краще не робити цього. Чи є спосіб зробити це постійним?
firebush

2
@firebush Це повідомлення пропонує використовувати для входу в гак , щоб команди , як цей персистуючої: stackoverflow.com/a/46460200/629530
firebush

1
@ StevenC.Howell Як щодо комбінацій модифікаторів функцій? Наприклад, зворотний косий рядок \ на моїй клавіатурі - це те, Shift+Option+7що я хотів би замінити чимось більш простим, таким, Option+.яким я навряд чи користуюся. Як це зробити? Спасибі за вашу допомогу.
Nanashi No Gombe

15

Більш загальним та зручним для користувачів підходом є використання Karabiner-Elements , що є версією Karabiner, яка працює на Сьєррі.


2
Швидке оновлення на Karabiner-Elements . Він працює на macOS High Sierra 10.13.3 (17D102). Я успішно поміняв свої праві клавіші Command та Option.
Стів Клімент

Сторонні програми ніколи не є "загальнішими". Чому хтось захаращує свою систему додатками, які роблять речі, вбудовані прямо в ОС?
Бахсау

1
@Bachsau, це загальне те, що дозволяє робити багато інших речей, наприклад, налаштування комбінацій клавіш, макросів і профілів, або використання спільних та / або розділених конфігурацій відображення для будь-яких внутрішніх і зовнішніх клавіатур.
Янош

@Bachsau Я зберігаю різні профілі для кожної моєї клавіатури, тому вони функціонують однаково. Дуже приємний додаток
AlexG

9

Це доповнення до відповіді Стівена К. Хоуелла.

У мене новий MacBook Pro зі скандинавською клавіатурою. У цій новій моделі більше немає клавіші Esc, що є для мене значним недоліком.

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

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

У документації Apple (пов'язаної з відповіддю Стівена) це позначено як "Клавіатура, яка не належить США та |" (0х64).

Деякі "не американські" клавіші важко знайти, оскільки вони, як правило, відносяться до клавіш, які мають іншу мітку на клавіатурі, яку ви використовуєте. (Я також виявив , що «Гравіс і тильда» відносяться до ключу між зрушенням вліво і г, що на моїй клавіатурі виробляє <. Мені не вдалося встановити , який ключ відповідає «Non-US #і ~» і не експериментувати далі , коли я виявив мій ключ.) Якщо ви хочете експериментувати, спробуйте запустити скрипт у терміналі, поки не знайдете потрібний вам ключ:

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він закінчується створенням, якщо ви вже виконали вище.


Більш рання версія цієї відповіді виступала за використання, LoginHookале вона не працювала для мене, і на основі stackoverflow.com/a/22872222/874188 я перейшов на launchdпідхід.
трійка

Як гарячий фанат vi / vim, саме це я шукав. Дякую.
Філіп Кірнс

7

Якщо все, що ви хочете зробити, це перевстановити один ключ

Приклад: Як перезапустити клавішу втечі на Mac

  1. Перейдіть до меню Apple, виберіть "Налаштування системи", а потім перейдіть на панель налаштувань "Клавіатура" та виберіть вкладку "Клавіатура".

  2. Клацніть на кнопку «Клавіші модифікатора» у правому нижньому куті

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

довідник


2
Це дає лише контроль над чотирма клавішами, переліченими у цій відповіді.
трійчатка

Правильно, і дуже корисно. Якщо хтось хоче перезаписати додаткові ключі, подумайте про карабін
Jasonleonhard

Схоже, немає жодного способу вказати конкретний ключ, наприклад "правильний ⌥". Найбільш специфічний ви можете отримати сигнал, як у "будь-якому ⌥".
Мерчако

Правильно, але добре, що вам не доведеться встановлювати нічого, воно просто працює.
Jasonleonhard

0

У випадку, якщо ви можете відновити налаштування за замовчуванням:

# setting it to 'null' does not work on my MBP High Sierra
hidutil property --set '{"UserKeyMapping":[]}'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.