Zmiana funkcja przypisanej do klawisza pod macOS za pomocą shell skryptu, bez Karabiner / Karabiner-Elements

16/11/2021, 13:25 · · · 4

Jeśli śledzicie moje wpisy na temat przenosiny z NLEstation 2020 na MacBooka Pro 14” z M1 Pro, to wiecie, że ostatnio kilka rzeczy idzie mi jak krew z nosa. Dzisiaj planowałem kolejny długi wpis, ale przytkałem się na jednej rzeczy, którą w końcu uruchomiłem. Jak? Nie mam pojęcia.

W pierwszym wpisie pt „Moje Aplikacje (cześć 1)” wspominałem o programie, z którego korzystam od lat – Karabiner-Elements. Jan w komentarzach zwrócił mi uwagę na nowe podejście do remappingu w macOS Monterey, więc postanowiłem sprawdzić, jak to wygląda w praktyce.

MacBook Pro 14” z M1 Pro (late 2021) – Moje aplikacje (część 1)

Apple opublikowało Technical Note TN2450, w którym opisują jak pod macOS Monterey można zmienić zachowanie poszczególnych klawiszy, zmieniając ich mappowanie. Proste? Proste! A potem na przeszkodzie stanął macOS Monterey. W końcu ruszyło, ale szczerze mówiąc to nie wiem dlaczego…

Przepis

Zależało mi na zmianie zachowania trzech klawiszy:

  • Caps Lock → Lewy Control
  • Prawy Command → Prawy Alt/Option
  • Prawy Alt/Option → Prawy Command

Do tego potrzebna jest tabela Usage ID dla klawiatur USB [link do PDF]. Od razu podpowiem, że interesuje nas strona 82, sekcja 10, czyli Keyboard/Keypad Page (0x07).

Szybko zlokalizowałem kody interesujących mnie klawiszy:

  • Caps Lock – 39
  • Prawy Command / Right GUI – E7
  • Prawy Alt/Option / RightAlt – E6

Teraz pozostało napisanie skryptu do tego…

  1. Stworzyłem nowy plik moridin_mac_keyboard_remap.sh w folderze z moimi skryptami. Możecie go umieścić tam, gdzie Wam wygodnie. Sam umieściłem go w moim iCloud w folderze /Common/Scripts, przy okazji tworząc symlinka do iClouda, żeby mieć prostszy dostęp z Terminala: ln -s "/Users/moridin/Library/Mobile Documents/com~apple~CloudDocs/" /Users/moridin/iCloud.
  2. Teraz trzeba wpisać chmod 775 moridin_mac_keyboard_remap.sh, aby można było go uruchamiać.
  3. Następnie umieściłem w nim następujący kod i go zapisałem:
    #!/bin/sh
    hidutil property --set '{"UserKeyMapping":[{"HIDKeyboardModifierMappingSrc":0x7000000E7,"HIDKeyboardModifierMappingDst":0x7000000E6},{"HIDKeyboardModifierMappingSrc":0x7000000E6,"HIDKeyboardModifierMappingDst":0x7000000E7},{"HIDKeyboardModifierMappingSrc":0x700000039,"HIDKeyboardModifierMappingDst":0x7000000E0}]}'
  4. Teraz należy utworzyć plista, w folderze /Library/LaunchAgents/ który będzie uruchamiał powyższy shell skrypt automatycznie, podczas uruchamiania macOS. Nazwałem go com.moridin.moridin_mac_keyboard_remap.plist, a w środku wygląda tak:
    <?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>com.moridin.moridin_mac_keyboard_remap</string>
    <key>UserName</key>
    <string>moridin</string>
    <key>Program</key>
    <string>/Users/moridin/Library/Mobile Documents/com~apple~CloudDocs/Common/Scripts/moridin_mac_keyboard_remap.sh</string>
    <key>RunAtLoad</key>
    <true/>
    </dict>
    </plist>
  5. Teraz zaczęły się schody, bo nie mogłem za nic w świecie go uruchomić. W końcu się udało, ale musiałem dać mu roota: sudo chown root:wheel com.moridin.moridin_mac_keyboard_remap.plist.
  6. Następnie trzeba aktywować plist za pomocą sudo launchctl enable com.moridin.moridin_mac_keyboard_remap.plist.
  7. Potem trzeba go załadować: sudo launchctl load com.moridin.moridin_mac_keyboard_remap.plist.
  8. Teraz czas na reboot macOS i na koniec, dla weryfikacji, wpisałem w Terminalu launchctl list | grep moridin, co potwierdziło, że całość się załadowała prawidłowo.

Pierwotnie próbowałem załadować plist z ~/Library/LaunchAgents, ale poległem. Walczyłem tylko z tym ponad 2 godziny. Pisząc to zdanie, mija równo 4 godziny od rozpoczęcia przepisania klawiszy. Ech. Z jednej strony cieszę się, że Apple dodatkowo zabezpieczenia OS przed różnymi rzeczami, ale szlag mnie trafia, gdy nie ma odpowiedniej dokumentacji (lub ja nie potrafiłem jej znaleźć) lub gdy komenda nie wyrzuca błędu, który doprowadziłby do rozwiązania problemu, zamiast tego generując randomowy tekst, który można oznaczać wszystko. Tak po prawdzie, to nie wiem czemu powyższe ruszyło, bo launchctl load lub launchctl enable  wyrzucił mi błąd, po którym mnie trafił szlag i postanowiłem zrobić restart macOS. A po restarcie wszystko ruszyło… nie rozumiem dlaczego, ale już nie dociekam. Ważne, że działa.

Tymczasem Karabiner-Elements wyleciał z listy potrzebnych mi aplikacji…



4

Wojtek Pietrusiewicz

Wydawca, fotograf, podróżnik, podcaster – niekoniecznie w tej kolejności. Lubię espresso, mechaniczne zegarki, mechaniczne klawiatury i zwinne samochody.