Zmiana funkcja przypisanej do klawisza pod macOS za pomocą shell skryptu, bez Karabiner / Karabiner-Elements
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…
- 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
. - Teraz trzeba wpisać
chmod 775 moridin_mac_keyboard_remap.sh
, aby można było go uruchamiać. - 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}]}' - Teraz należy utworzyć plista, w folderze
/Library/LaunchAgents/
który będzie uruchamiał powyższy shell skrypt automatycznie, podczas uruchamiania macOS. Nazwałem gocom.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> - 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
. - Następnie trzeba aktywować plist za pomocą
sudo launchctl enable com.moridin.moridin_mac_keyboard_remap.plist
. - Potem trzeba go załadować:
sudo launchctl load com.moridin.moridin_mac_keyboard_remap.plist
. - 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…
Komentarze: 5
Pomijając ewentualne walory poznawcze – chodzi tylko o nie używanie Karabiner-a? Czy jest jakiś powód techniczny?
No tak, ten sposób nie jest tak przyjemny jak Karabiner a dokumentacja słaba 😬
Może można nieco prościej, przynajmniej jak zamieniałem tylko jeden klawisz udało mi się to zrobić samym plikiem plist (local.RemapRightCmdToRightOpt.plist w /Library/LaunchAgents), bez skryptu.
Tak wygląda plik plist:
https://pastebin.com/ySktpZfX
Kontynuując, jakoś tak by plik plist wyglądał:
https://pastebin.com/TGHZLFEP
Robie wg intrukcji:
takes a form of / specifiers.
1) sudo launchctl enable com.marcin.kb_remap.plist
Unrecognized target specifier.
Usage: launchctl enable
Please refer to `man launchctl` for explanation of the
2) przy sudo launchctl load com.marcin.kb_remap.plist
Warning: Expecting a LaunchDaemons path since the command was ran as root. Got LaunchAgents instead.
`launchctl bootstrap` is a recommended alternative.
Gdzie jest problem? Prawa roota przydzielone.
jedyne co ja robiłem to wrzuciłem plik plist do /Library/LaunchAgents i restart 🤔
PS. sorry, późno piszę, bo nie mam tu żadnych powiadomień a znalezienie artykułu na iMagazine nie jest proste, same się url-e zmieniają przy scrollowaniu