चूक कमांड टूल के माध्यम से संशोधक कुंजी मैपिंग को अद्यतन करना


16

मैं अपनी मैकबुक के इनबिल्ट सेटअप को स्वचालित करने की कोशिश कर रहा हूं, जिसमें सॉफ़्टवेयर स्थापित करना और मेरी आवश्यकताओं के लिए ओएस एक्स कॉन्फ़िगरेशन बदलना शामिल है।

मैंने चूक के साथ संशोधक कुंजियों को अपडेट करने की कोशिश की है, कोड इस प्रकार है:

# The apple keyboard id (1452-567-0) should probably be modified in case you use other different model 
COMPUTER_UUID=`ioreg -rd1 -c IOPlatformExpertDevice | grep -E '(UUID)' | awk '{print $3}' | tr -d \"`
defaults write ~/Library/Preferences/ByHost/.GlobalPreferences.$COMPUTER_UUID com.apple.keyboard.modifiermapping.1452-567-0 '( { HIDKeyboardModifierMappingDst = 2;   HIDKeyboardModifierMappingSrc = 0; } )'

समस्या यह है कि भले ही पैटर्न बदल गया हो सिस्टम वरीयताएँ अपडेट को पकड़ती नहीं हैं, कंप्यूटर को पुनरारंभ भी नहीं करती हैं।

क्या स्नो लेपर्ड में इस ऑपरेशन को करने का कोई तरीका है?

धन्यवाद।


defaults -currentHost write -g key 'value'इसके बजाय उपयोग करें । हालांकि अभी भी काम नहीं करता है।
डैनियल बेक

1
यह आदमी कुछ इसी तरह का प्रयास करता है और असफल भी हुआ। क्या AppleScript GUI स्क्रिप्टिंग आपके लिए एक व्यवहार्य विकल्प होगा?
डैनियल बेक

जवाबों:


13

यह defaultsकमांड के लिए कुंजी में सही "कीबोर्ड आईडी" का उपयोग करना महत्वपूर्ण है, ऐसा लगता है:com.apple.keyboard.modifiermapping.$VendorID-$ProductID-0

उदाहरण के लिए मेरे मैकबुक एयर के लिए आंतरिक कीबोर्ड का उपयोग करता है: com.apple.keyboard.modifiermapping.1452-579-0जबकि मेरे आईमैक पर बाहरी कीबोर्ड का उपयोग करता हैcom.apple.keyboard.modifiermapping.1118-219-0

सही "कीबोर्ड आईडी" कैसे प्राप्त करें? कमांड लाइन पर आप उपयोग कर सकते हैं:

ioreg -p IOUSB -c IOUSBDevice | grep -e class -e idVendor -e idProduct

प्रासंगिक मापदंडों के साथ अपने USB उपकरणों की सूची प्राप्त करने के लिए:

  [...]
  +-o Natural® Ergonomic Keyboard 4000@fa140000  <class IOUSBDevice, id 0x100000452, registered, matched, active, busy 0 (115 ms), retain 12>
        "idProduct" = 219
        "idVendor" = 1118

मेरा अनुमान है कि तीसरा पैरामीटर ("-0" भाग) एक "काउंटर" है, यदि आपके पास एक ही प्रकार का एक से अधिक कीबोर्ड है।

इसलिए, अपने बाहरी कीबोर्ड पर कैप्सलॉक कुंजी को बंद करने के लिए मैं अब उपयोग कर सकता हूं:

defaults -currentHost write -g com.apple.keyboard.modifiermapping.1118-219-0 -array-add '<dict><key>HIDKeyboardModifierMappingDst</key><integer>-1</integer><key>HIDKeyboardModifierMappingSrc</key><integer>0</integer></dict>'

और, पूर्णता के लिए, यहां ( मैक ओएस एक्स संकेत से ) उपयोग करने के लिए संभावित कुंजी कोडों की एक सूची दी गई है :

  • कोई नहीं - १
  • कैप्स लॉक - 0
  • शिफ्ट (बाएं) - 1
  • नियंत्रण (बाएं) - 2
  • विकल्प (बाएं) - 3
  • आज्ञा (वाम) - ४
  • कीपैड 0 - 5
  • सहायता - ६
  • शिफ्ट (दाएं) - 9
  • नियंत्रण (दाएं) - 10
  • विकल्प (दाएं) - 11
  • आज्ञा (अधिकार) - १२

अद्यतन: लॉरी रांटा के लिए धन्यवाद यहां एक कमांड है जो ब्लूटूथ और यूएसबी कीबोर्ड के लिए काम करता है:

ioreg -n IOHIDKeyboard -r | grep -e 'class IOHIDKeyboard' -e VendorID\" -e Product

जो आपको थोड़ा अलग आउटपुट देता है:

+-o IOHIDKeyboard  <class IOHIDKeyboard, id 0x100000489, registered, matched, active, busy 0 (0 ms), retain 8>
  |   "Product" = "Apple Wireless Keyboard"
  |   "VendorID" = 1452
  |   "ProductID" = 570

करो नहीं चूक मूल्य का छोटा संस्करण '{ HIDKeyboardModifierMappingDst = -1; HIDKeyboardModifierMappingSrc = 0; }'है कि आप, कुछ वेबसाइटों पर पा सकते हैं मेरे लिए कम से कम "-1" और "0" शब्दकोष के मूल्यों में तो तार, नहीं पूर्णांक के रूप में समझा जाता है। यह एक अजीब स्थिति की ओर जाता है जहां वरीयताएँ परिवर्तित संशोधक कुंजियों को दिखाती हैं, लेकिन कीबोर्ड वास्तव में उस तरह का व्यवहार नहीं करता है।
ओरनजेनहिन

1
ioreg -n IOHIDKeyboard -rइसमें ब्लूटूथ कीबोर्ड भी शामिल होंगे।
लैरी

मैंने ऐसा किया लेकिन इसका कोई असर नहीं हुआ। क्या मुझे काम करने के लिए कुछ पुनः आरंभ करने की आवश्यकता है?
सिमॉन

1
@SimonW मैंने वही अनुभव किया। मैंने पाया कि बस फिर से लॉग आउट और बैक करने से सेटिंग प्रभावी हो जाती है।
रियान लॉन्ग

यह मजेदार नहीं है :(
शमौन डब्ल्यू

2

मुझे जो समस्या हो रही है वह यह है कि हर बार जब मैं अपना कीबोर्ड प्लग इन करता हूं, तो उसे आईओआरजी में एक अलग आईडी मिलती है। मुझे बस इतना करना है कि कमांड और ऐप्पल कीज को स्वैप करें।

मैंने अपने मामले में AppleScript और सिस्टम वरीयताएँ GUI का उपयोग करके "गलत तरीके" से इसे हल करने का निर्णय लिया। यह एक बदसूरत हैक है, लेकिन यह काम करता है! आपकी माइलेज भिन्न हो सकती है।

--The beginning of the name of the target keyboard (to type into the drop-down selection list)
set keyboardName to "natural"

--reboot system preferences to make GUI state more predictable
tell application "System Preferences"
    quit
    delay 1
    activate
    delay 1
    activate
end tell

tell application "System Events"

    --Bring up keyboard prefs
    key code 53 --escape
    keystroke "f" using command down
    delay 0.5
    key code 53 --escape
    keystroke "keyboard"
    delay 0.5
    key code 36 --return
    delay 1

    --Open modifier keys submenu
    repeat 4 times
        keystroke tab using shift down
        --delay 0.1
    end repeat
    --delay 0.1
    keystroke space
    delay 0.1

    --Select keyboard
    keystroke space
    keystroke keyboardName
    keystroke return
    delay 0.1

    --Select "option key" drop-down
    repeat 3 times
        keystroke tab
    end repeat

    delay 0.5

    --Open drop-down and go to top
    keystroke space
    delay 0.1
    repeat 4 times
        key code 126 --up arrow
    end repeat

    --Select "command" option
    repeat 3 times
        key code 125 --down arrow
    end repeat
    delay 0.1

    keystroke return

    -- Select "command key" drop-down
    keystroke tab
    delay 0.1

    --Open drop-down and go to top
    keystroke space
    delay 0.1
    repeat 4 times
        key code 126 --up arrow
    end repeat

    --Select "command" option
    repeat 2 times
        key code 125 --down arrow
    end repeat
    delay 0.1

    keystroke return
    delay 0.1

    --Commit changes! phew.
    keystroke return
end tell

1

मैं, भी, defaults writeअपने HIDKeyboardModifierMappingSrc और HIDKeyboardModifierMappingDapping सेटिंग्स को प्रभावित करने के लिए हिम तेंदुए के तहत (या .plist फ़ाइलें) अपडेट करने में असमर्थ रहा हूं ।

मैं अपने PS2-USB कीबोर्ड का समर्थन करने के लिए अपने अतिथि खाते को "पूर्व-आबाद" करने की कोशिश कर रहा हूं (जिसमें स्पष्ट रूप से विकल्प और कमांड अदला-बदली है।) अन्य पृष्ठों के सुझाव "लॉग आउट करने और वापस लॉग इन करने में मदद नहीं करते हैं"; अतिथि खाते का "लॉग आउट करना" मेरे सभी परिवर्तनों को हटा देता है।

(मैं है सफलतापूर्वक मेरी "com.apple.dock" और "com.apple.menuextra.clock" plist फ़ाइलें गोदी और 24-घंटे घड़ी को अनुकूलित करने के क्रमश: अद्यतन है, जो इसे और भी अधिक निराशा होती है कि कीबोर्ड संशोधक जीता 'बनाता है टी वर्क ...)

मैंने "सिस्टम प्रेफरेंस .app" की तुलना करने के लिए "dtruss -asf" का उपयोग करने की कोशिश की है, जो कि "चूक" कर रहा है (जो स्पष्ट रूप से काम करता है) कर रहा है। निकटतम मैं आंकड़ा कर सकता हूं, मैं संदेश यहां देख रहा हूं:

   Foundation`+[__NSOperationInternal _observeValueForKeyPath:ofObject:changeKind:oldValue:newValue:indexes:context:]+0x151
   Foundation`NSKeyValueNotifyObserver+0x81
   Foundation`NSKeyValueDidChange+0x1ca
   Foundation`-[NSObject(NSKeyValueObservingPrivate) _changeValueForKey:usingBlock:]+0x176

अगर किसी को एक उपाय सूझा, जो स्नो लेपर्ड के तहत काम करता है, तो मुझे यह सुनकर खुशी होगी ...


0
  • क्या आप diffइस बात की पुष्टि करने के लिए दौड़ चुके हैं कि आप इस फाइल को बिल्कुल यूआई के रूप में बना रहे हैं?
  • भागो fs_usageया lsofऔर क्या किया जा रहा है जब आप UI का उपयोग पता लगाने के लिए।

fs_usageदिलचस्प AFAICT कुछ भी नहीं दिखाता है, और मैंने सत्यापित किया (प्रश्न में टिप्पणी में मेरी संशोधित कमांड के साथ) जो कि परिणाम वही दिखाएगा जो कोई अपेक्षा करेगा।
डैनियल बेक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.