Jak zmienić przypisanie klucza w systemie macOS Sierra, np. Right Alt to Right Control?

45

Kiedyś użyłem Karabinera do zmiany mapowania Right Alt na Right Control (jako użytkownik Emacsa używam Control DUŻO więcej niż Alt), ale aktualizacja Sierra spowodowała to. Obniżenie nie jest opcją.

Jak ręcznie mapować klucze w Sierra? W szczególności chciałbym zmienić mapowanie Right Alt na Right Control.

Steven C. Howell
źródło

Odpowiedzi:

40

Uwaga techniczna Apple TN2450 opisuje sposób mapowania kluczy. Uruchomienie następującego polecenia spowoduje ponowne mapowanie Right Alt na Right Control.

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

Zauważ, że powyższe polecenie nie przełącza prawego Alt i Right Control. Obaj będą mieli Prawą Kontrolę. Jeśli masz MacBooka, nie zauważysz tego, dopóki nie podłączysz zewnętrznej klawiatury. Jeśli chcesz przełączyć Right Alt i Right Control, musisz dodać drugie polecenie przełączania, takie jak poniżej.

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

Tabela u dołu Noty technicznej zawiera listę wartości szesnastkowych dla każdego klucza. Aby uogólnić powyższą odpowiedź na zamianę dowolnego klucza, musisz orwraz z nią podać wartość szesnastkową z tej listy 0x700000000. Poniższy kod Python pokazuje jeden ze sposobów na to.

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
Steven C. Howell
źródło
Fajnie dzięki! Czy istnieje sposób przywrócenia domyślnych mapowań za pomocą tego polecenia?
2017
1
@ Cᴀʟʟᴏᴅᴀᴄɪᴛʏ, aby zresetować dowolny klawisz, wystarczy ponownie uruchomić polecenie z wartością tego klawisza zarówno w, jak Srci Dst.
Steven C. Howell,
Spowoduje to przywrócenie podczas ponownego uruchamiania. Mogę ponownie uruchomić to polecenie przy każdym uruchomieniu, ale wolałbym tego nie robić. Czy istnieje sposób, aby uczynić to trwałym?
firebush,
2
@firebush Ten post sugeruje użycie haka do logowania w celu wykonania takich poleceń: stackoverflow.com/a/46460200/629530
firebush
1
@ StevenC.Howell Co z kombinacjami modyfikatorów funkcji? Na przykład ukośnik \ w mojej klawiaturze jest tym, Shift+Option+7który chciałbym zastąpić czymś prostszym, na przykład z Option+.którego prawie nie korzystam. W jaki sposób mogę to zrobić? Dzięki za pomoc.
Nanashi No Gombe
15

Bardziej ogólne i przyjazne dla użytkownika podejście to użycie Karabiner-Elements , która jest wersją Karabinera, która działa na Sierra.

mikaraento
źródło
2
Szybka aktualizacja Karabiner-Elements . Działa na macOS High Sierra 10.13.3 (17D102) Z powodzeniem zamieniłem swoje prawe klawisze Command i Option.
Steve Clement
Aplikacje innych firm nigdy nie są „bardziej ogólne”. Dlaczego ktokolwiek miałby zaśmiecać swój system aplikacjami robiącymi rzeczy wbudowane bezpośrednio w system operacyjny?
Bachsau
1
@ Bachsau jest bardziej ogólny, ponieważ pozwala ci robić wiele innych rzeczy, np. Konfigurować kombinacje klawiszy, makra i profile, lub używać wspólnych i / lub podzielonych konfiguracji mapowania dla dowolnej klawiatury wewnętrznej i zewnętrznej.
Janosch
@ Bachsau Trzymam różne profile dla każdej klawiatury, więc działają one tak samo. Bardzo ładna aplikacja
AlexG
9

To jest uzupełnienie odpowiedzi Stevena C. Howella.

Mam nowego MacBooka Pro ze skandynawską klawiaturą. Ten nowy model nie ma już klawisza Esc, co jest dla mnie znaczącym utrudnieniem.

Odkryłem, że następujące słowa będą tłumaczyć klawisz § (lewy górny, lewy 1 i powyżej klawisza tab) - co, jak sądzę, nigdy wcześniej nie używałem do niczego - do utworzenia Esc.

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

W dokumentacji Apple'a (połączonej z odpowiedzią Stevena) jest to oznaczone jako „Klawiatura poza USA \ i |” (0x64).

Kilka „nie-amerykańskich” klawiszy jest trudnych do wykrycia, ponieważ zazwyczaj odnoszą się do klawiszy, które mają inną etykietę na używanej klawiaturze. (Odkryłem również, że „poważny akcent i tylda” odnosi się do klawisza między lewym shiftem a z, który wytwarza się na mojej klawiaturze <. Nie byłem w stanie ustalić, który klawisz odpowiada „Non-US #and ~” i nie eksperymentowałem dalej, gdy znalazłem mój klucz.) Jeśli chcesz eksperymentować, spróbuj uruchomić skrypt w terminalu, aż znajdziesz klucz, którego potrzebujesz:

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

Powoduje to zapętlenie klawiszy i zmienia je pojedynczo, w nadziei, że dzięki próbom i błędom znajdziesz klucz, który nie jest szczególnie przydatny. Spróbuj wpisać coś, gdy o to poprosi - jeśli otrzymasz gzamiast tego, czego się spodziewałeś, znalazłeś odpowiedni kod klucza. (Zmień 0x70000000ana coś innego, jeśli gnie jest to dla ciebie wygodny wybór. Może chcesz ponownie przypisać gklucz?) Po zakończeniu pisania naciśnij Enter, aby przejść do następnego klawisza.

Jeśli chodzi o wartość, ostatnim poleceniem w pętli jest sposób zapełniania wszystkich UserKeyMappingustawień:

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

Po uruchomieniu uruchamia hidutil property --get UserKeyMappingsię

(null)

ale wygląda na to, że nie możesz podać tej wartości, aby zmienić ustawienie (a raczej akceptuje, ale ignoruje to wejście).

(Jeśli nie jesteś zaznajomiony z terminalem, po prostu skopiuj / wklej rzecz od fordo momentu, gdy zostaniesz doneo to bash$poproszony lub podobny.)

Zgodnie z tym powiązanym pytaniem Przepełnienie stosu możesz umieścić polecenie w pliku skryptu w katalogu domowym i dodać je do launchdkonfiguracji, aby ta zmiana była trwała.

W przypadku, gdy niektórzy czytelnicy nie czują się komfortowo, robiąc to samodzielnie, oto krótki skrypt, który zrobi to za Ciebie. Ponownie po prostu skopiuj / wklej to w wierszu polecenia Terminal.

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

Oczywiście, jeśli skończyłeś z innym kluczem niż 0x700000064musisz to zmienić w skrypcie lub w pliku, "$HOME"/bin/userkeymappingto kończy się tworzenie, jeśli już uruchomiłeś powyższe.

potrójny
źródło
Wcześniejsza wersja tej odpowiedzi zalecał używając LoginHookale to nie działa na mnie, a na podstawie stackoverflow.com/a/22872222/874188 przeszedłem do launchdpodejścia zamiast.
tripleee
Jako zagorzały fan vi / vim właśnie tego szukałem. Dziękuję Ci.
Philip Kearns
7

Jeśli wszystko, co chcesz zrobić, to zmienić przypisanie jednego klucza

Przykład: Jak zmienić przypisanie klawisza Escape na komputerze Mac

  1. Przejdź do  menu Apple i wybierz „Preferencje systemowe”, a następnie przejdź do panelu preferencji „Klawiatura” i wybierz kartę „Klawiatura”

  2. Kliknij przycisk „Klawisze modyfikujące” w prawym dolnym rogu

  3. Wybierz klucz, który chcesz mapować i zmodyfikować, aby wykonać funkcję Escape: Caps Lock (nasza rekomendacja), Control, Opcja lub Command
  4. Wybierz „Escape” z rozwijanej listy odpowiadającej kluczowi, który chcesz mapować jako sprzętowy klawisz Escape, a następnie kliknij „OK”, aby ustawić zmianę

odniesienie

jasonleonhard
źródło
2
Daje to tylko kontrolę nad czterema kluczami wymienionymi w tej odpowiedzi.
tripleee
Prawidłowe i bardzo pomocne. Jeśli ktoś chce przemapować dodatkowe klucze, rozważ karabinek
jasonleonhard
Wygląda na to, że nie ma sposobu, aby określić konkretny klucz, na przykład „prawy ⌥”. Najbardziej specyficzny, jaki można uzyskać, to sygnał, jak w „dowolnym”.
Merchako
Zgadza się, ale dobrą stroną jest to, że nie musisz niczego instalować, to po prostu działa.
jasonleonhard
0

Jeśli chcesz przywrócić ustawienia domyślne:

# setting it to 'null' does not work on my MBP High Sierra
hidutil property --set '{"UserKeyMapping":[]}'
clarkttfu
źródło