Zmiana klawiszy modyfikatora z wiersza poleceń

13

Jako intensywny użytkownik Emacsa lubię mapować klawisz Caps Lock, aby działał jak klawisz Ctrl. Aby to zrobić, w okienku preferencji klawiatury znajduje się wygodne okno dialogowe. Problem polega jednak na tym, że to ustawienie zostaje utracone, gdy ktoś zaloguje się na inne konto, które nie ma ustawionej preferencji.

Czy jest jakiś sposób zrobić to samo, co okno dialogowe preferencji z wiersza poleceń?

pantulis
źródło
2
Możliwe duplikowanie aktualizacji mapowania klawiszy modyfikatora za pomocą domyślnego narzędzia polecenia . Chociaż drugie pytanie jest historycznie nowsze, ma lepszą (faktycznie działającą) odpowiedź.
techraf

Odpowiedzi:

6

Zmiana preferencji i uruchomienie defaults -currentHost read -gpokazuje, jakie zmiany są zapisywane. Zamierzałem napisać krótki skrypt bash, aby go zautomatyzować, ale wygląda na to, że zostałem pobity:

#!/bin/bash                                                                      

mappingplist=com.apple.keyboard.modifiermapping

if [ $1 == "emacs" ]; then
    echo "Switching to emacs modifiers"
    defaults -currentHost write -g $mappingplist '(                              
                {                                                                
            HIDKeyboardModifierMappingDst = 4;                                   
            HIDKeyboardModifierMappingSrc = 2; },                                
                {                                                                
            HIDKeyboardModifierMappingDst = 12;                                  
            HIDKeyboardModifierMappingSrc = 10;                                  
        },                                                                       
                {                                                                
            HIDKeyboardModifierMappingDst = 2;                                   
            HIDKeyboardModifierMappingSrc = 4;                                   
        },                                                                       
                {                                                                
            HIDKeyboardModifierMappingDst = 10;                                  
            HIDKeyboardModifierMappingSrc = 12;                                  
        })'


else
    echo "Switching to default modifiers"
    defaults -currentHost delete -g $mappingplist
fi

Skrypt przyjmuje jeden argument, jeśli argumentem jest emacs, wówczas zamienia polecenie i kontrolę, jeśli argumentem jest coś innego, przywraca wartości domyślne.

http://forums.macrumors.com/showthread.php?t=949280

bezlitowy
źródło
Wydaje mi się, że nie działa tutaj ze Snow Leopardem, ale wyraźnie jest to krok we właściwym kierunku.
pantulis,
@pith ... co -grobi flaga? Nie widziałem tego na stronie podręcznika dla defaults. Wygląda na to, że zamienia dwa zestawy wartości: 4 z 2 i 10 z 12, ale zmieniają się tylko dwa modyfikatory. Czy możesz opracować, czy po prostu spojrzałeś na wyniki, ale nie wiesz, co one właściwie przedstawiają? (Na początku podejrzewałem cztery kody kluczy - dwa po lewej, dwa po prawej - ale nie wydają się być kodami kluczowymi, przynajmniej nie tak, jak zgłosił sterownik klawiatury.)
MarqueIV,
Robię mapowania, jak sugerujesz, ale wydaje się, że to nie działa, chociaż w interfejsie wygląda na zmapowane. Wydaje się, że działa to tylko za pomocą interfejsu użytkownika ... Jakieś pomysły?
SimonW,
3

Możesz użyć KeyRemap4MacBook z PCKeyBoardHack . Pozwala także używać kluczy Emacsa w dowolnej aplikacji Mac, w tym także tych, które nie używają Cocoa, takich jak aplikacje MS.

Matti Pastell
źródło
1

Z „Aktualizowanie mapowania klawiszy modyfikatora poprzez domyślne narzędzie poleceń” :

defaults -currentHost write -g com.apple.keyboard.modifiermapping.1133-50475-0 -array '<dict><key>HIDKeyboardModifierMappingSrc</key><integer>0</integer><key>HIDKeyboardModifierMappingDst</key><integer>2</integer></dict>

Zmień 1133oraz 50475na identyfikatory dostawcy i produktu pokazane przez ioreg -n IOHIDKeyboard -r. src 0i dst -1wyłączy się caps lock.

defaults -currentHost write -g modyfikuje:

~/Library/Preferences/ByHost/.GlobalPreferences.*.plist

Musisz się wylogować i zalogować ponownie, aby zastosować zmiany. Jeśli wartości są łańcuchami (jak w odpowiedzi @pithyless), zmiany są pokazane w Preferencjach systemowych, ale nie mają żadnego efektu.

Wartości kluczy :

-1 none
0 caps lock
1 left shift
2 left control
3 left option
4 left command
5 keypad 0
6 help
9 right shift
10 right control
11 right option
12 right command
Lri
źródło
0

Łącząc kilka odpowiedzi razem, wymyśliłem ten skrypt, który wydaje się działać ( mapowanie Caps-lock na Control ).

$ keyboard_id = "$(ioreg -n IOHIDKeyboard -r | grep -e VendorID\" -e ProductID | tr -d \"\|[:blank:] | cut -d\= -f2 | tr '\n' -)"
$ defaults -currentHost write -g "com.apple.keyboard.modifiermapping.${keyboard_id}0" '(
{
  HIDKeyboardModifierMappingDst = 2;
  HIDKeyboardModifierMappingSrc = 0;
})'

Jedyny problem, że wydaje się, że nie ma to żadnego wpływu ... :(

Zaktualizuję, jeśli go uruchomię.

SimonW
źródło
0

Chciałem zamienić prawe polecenie tylko za pomocą odpowiednich klawiszy opcji .

Kiedy konfiguruję globalną wymianę poleceń i opcji w Preferencjach systemowych ...> Klawiatura> Klawisze modyfikujące ..., w systemie jest następująca konfiguracja (która działa zgodnie z oczekiwaniami):

$ defaults -currentHost read -g com.apple.keyboard.modifiermapping.1452-591-0
(
        {
        HIDKeyboardModifierMappingDst = 30064771299;
        HIDKeyboardModifierMappingSrc = 30064771298;
    },
        {
        HIDKeyboardModifierMappingDst = 30064771303;
        HIDKeyboardModifierMappingSrc = 30064771302;
    },
        {
        HIDKeyboardModifierMappingDst = 30064771298;
        HIDKeyboardModifierMappingSrc = 30064771299;
    },
        {
        HIDKeyboardModifierMappingDst = 30064771302;
        HIDKeyboardModifierMappingSrc = 30064771303;
    }
)

Ale kiedy go modyfikuję, zamieniam tylko prawą stronę jak poniżej - to nie działa:

$ defaults -currentHost write -g com.apple.keyboard.modifiermapping.1452-591-0 '(
        {
        HIDKeyboardModifierMappingDst = 30064771303;
        HIDKeyboardModifierMappingSrc = 30064771302;
    },
        {
        HIDKeyboardModifierMappingDst = 30064771302;
        HIDKeyboardModifierMappingSrc = 30064771303;
    }
)'

Jest tak, ponieważ wartości są zapisywane jako ciągi, a nie liczby całkowite. Możesz to zobaczyć za pomocą:

$ plutil -convert xml1 -o - ~/Library/Preferences/ByHost/.GlobalPreferences.*.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>com.apple.keyboard.modifiermapping.1452-591-0</key>
    <array>
        <dict>
            <key>HIDKeyboardModifierMappingDst</key>
            <string>30064771303</string>
            <key>HIDKeyboardModifierMappingSrc</key>
            <string>30064771302</string>
        </dict>
        <dict>
            <key>HIDKeyboardModifierMappingDst</key>
            <string>30064771302</string>
            <key>HIDKeyboardModifierMappingSrc</key>
            <string>30064771303</string>
        </dict>
    </array>
</dict>
</plist>

Tak więc właściwym sposobem aktualizacji ustawienia jest użycie formatu XML:

$ defaults -currentHost write -g com.apple.keyboard.modifiermapping.1452-591-0 -array \
'<dict>
    <key>HIDKeyboardModifierMappingDst</key>
    <integer>30064771303</integer>
    <key>HIDKeyboardModifierMappingSrc</key>
    <integer>30064771302</integer>
</dict>' \
'<dict>
    <key>HIDKeyboardModifierMappingDst</key>
    <integer>30064771302</integer>
    <key>HIDKeyboardModifierMappingSrc</key>
    <integer>30064771303</integer>
</dict>'

Na koniec musisz się wylogować i zalogować ponownie.

Wirus_7
źródło
Czy dostałeś to do pracy, którego nie mogę powiedzieć? Czy może wymagane jest ponowne uruchomienie komputera?
William
O tak. Musisz się wylogować i zalogować ponownie.
Virus_7,
Próbuję odpowiedzieć na to pytanie apple.stackexchange.com/questions/280855/... Czy możesz porozmawiać na czacie? chat.stackexchange.com/rooms/38/ask-different-chat Próbowałem uruchomić twoje ostatnie polecenie i nic to dla mnie nie zmienia.
William
Przede wszystkim usuń Karabiner-Elements i dostosuj kod klawiatury (1452-591-0) i kody klawiszy (30064771302, 30064771303) do swojego systemu.
Virus_7,