Смена клавиш-модификаторов из командной строки

13

Как опытный пользователь Emacs, я хотел бы переназначить свою клавишу Caps Lock, чтобы она функционировала как клавиша Ctrl. Для этого есть удобный диалог на панели настроек клавиатуры. Но проблема в том, что этот параметр теряется после того, как кто-то войдет в другую учетную запись, для которой этот параметр не установлен.

Так есть ли способ сделать то же самое, что диалоговое окно панели настроек из командной строки?

pantulis
источник
2
Возможные дубликаты Обновления сопоставлений клавиш модификатора через командный инструмент по умолчанию . Хотя другой вопрос исторически более новый, у него есть лучший (фактически работающий) ответ.
techraf

Ответы:

7

Изменение настроек и запуск, defaults -currentHost read -gпоказывает, какие изменения пишутся. Я собирался написать короткий скрипт bash, чтобы автоматизировать его, но похоже, что я потерпел поражение:

#!/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

Сценарий принимает один аргумент, если аргумент является emacs, то он заменяет команду и элемент управления, если аргумент является чем-то еще, он восстанавливает значения по умолчанию.

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

pithyless
источник
С Snow Leopard у меня не получилось, но это шаг в правильном направлении.
pantulis
@pith ... что -gделает флаг? Я не видел этого в справочной странице для defaults. Кроме того, похоже, что он меняет два набора значений: 4 на 2 и 10 на 12, но есть только два модификатора, которые меняются. Можете ли вы уточнить, или вы просто посмотрели на результаты, но не знаете, что они на самом деле представляют? (Сначала я заподозрил четыре кода клавиш - два слева, два справа - но они не являются кодами клавиш, по крайней мере, так, как сообщал драйвер клавиатуры.)
Марк А. Донохо,
Я делаю сопоставления, как вы предлагаете, но, похоже, они не вступают в силу, хотя в интерфейсе они отображаются сопоставленными. Кажется, работает только через интерфейс ... Есть идеи?
SimonW
3

Вы можете использовать KeyRemap4MacBook с PCKeyBoardHack . Это также позволяет вам использовать ключи Emacs в любом приложении Mac, включая те, которые не используют Какао, такие как приложения MS.

Матти Пастелл
источник
2

От «Обновления сопоставлений клавиш модификатора до командного инструмента по умолчанию» :

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>

Измените 1133и 50475на поставщиков и идентификаторы продуктов, показанные ioreg -n IOHIDKeyboard -r. src 0и dst -1отключил бы caps lock.

defaults -currentHost write -g модифицирует:

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

Вы должны выйти и снова войти, чтобы применить изменения. Если значения являются строками (как в ответе @pithyless), изменения отображаются в Системных настройках, но они не оказывают никакого влияния.

Значения ключей :

-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
источник
0

Объединив несколько ответов, я разработал сценарий, который, кажется, работает ( отображение Caps-lock на 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;
})'

Единственная проблема в том, что это, похоже, не дает никакого эффекта ... :(

Я обновлю, если это я заставлю это работать.

SimonW
источник
0

Я хотел поменять местами правую команду только с правыми клавишами.

Когда установка I глобальной команды и опции подкачки в System Preferences ...> Клавиатура> Modifier Keys ..., есть следующие конфигурации в системе (которая работает , как ожидалось):

$ 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;
    }
)

Но когда я изменяю его, меняя местами только правую сторону, как показано ниже - это не работает:

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

Это потому, что значения пишутся как строки, а не как целые числа. Вы можете увидеть это используя:

$ 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>

Таким образом, правильный способ обновить настройку - использовать формат 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>'

В конце вы должны выйти из системы и войти снова.

Virus_7
источник
Ты получил это на работу, я не могу сказать? Может быть, требуется перезагрузка?
Уильям
О да. Вы должны выйти и войти снова.
Virus_7
Я пытаюсь ответить на этот вопрос apple.stackexchange.com/questions/280855/… Можете ли вы пообщаться? chat.stackexchange.com/rooms/38/ask-different-chat Я попытался выполнить вашу последнюю команду, и она ничего не меняет для меня.
Уильям
Прежде всего удалите элементы Karabiner-Elements и адаптируйте код клавиатуры (1452-591-0) и коды клавиш (30064771302, 30064771303) к вашей системе.
Virus_7