ฉันจะตั้งค่าคีย์ใหม่ใน macOS Sierra ได้อย่างไรเช่นปุ่มควบคุมขวาไปขวา


44

ฉันเคยใช้Karabinerเพื่อทำการแมป Alt ขวาเพื่อควบคุมขวา (ในฐานะผู้ใช้ Emacs ฉันใช้การควบคุมมากขึ้นว่า Alt) แต่การอัปเดตเป็น Sierra ทำให้เกิดปัญหานี้ การดาวน์เกรดไม่ใช่ตัวเลือก

ฉันจะทำการแมปคีย์ด้วยตนเองในเซียได้อย่างไร ฉันต้องการตั้งค่าใหม่ Alt ขวาเพื่อควบคุมขวา

คำตอบ:


38

หมายเหตุด้านเทคนิคของ Apple TN2450อธิบายวิธีการแมปคีย์ใหม่ การรันคำสั่งต่อไปนี้จะทำการแมป Alt ขวาเพื่อเป็นการควบคุมขวา

hidutil property --set '{"UserKeyMapping":
    [{"HIDKeyboardModifierMappingSrc":0x7000000e6,
      "HIDKeyboardModifierMappingDst":0x7000000e4}]
}'

โปรดทราบว่าคำสั่งดังกล่าวไม่ได้เปลี่ยน Alt ขวาและการควบคุมที่เหมาะสม พวกเขาทั้งสองจะได้รับการควบคุมที่ถูกต้อง หากคุณมี MacBook คุณจะไม่สังเกตเห็นสิ่งนี้จนกว่าจะเชื่อมต่อกับแป้นพิมพ์ภายนอก หากคุณต้องการเปลี่ยน Alt ขวาและการควบคุมขวาคุณต้องเพิ่มคำสั่งสวิตช์ที่สองเช่นต่อไปนี้

hidutil property --set '{"UserKeyMapping":
    [{"HIDKeyboardModifierMappingSrc":0x7000000e4,
      "HIDKeyboardModifierMappingDst":0x7000000e6},
     {"HIDKeyboardModifierMappingSrc":0x7000000e6,
      "HIDKeyboardModifierMappingDst":0x7000000e4}]
}'

ตารางที่ด้านล่างของหมายเหตุด้านเทคนิคมีรายการค่าฐานสิบหกสำหรับแต่ละคีย์ ที่จะพูดคุยคำตอบข้างต้นเพื่อสลับคีย์ใดคุณต้องค่าฐานสิบหกจากกันในรายการว่าor 0x700000000รหัส Python ต่อไปนี้แสดงวิธีหนึ่งในการทำเช่นนี้

In [1]: def convert(val):
   ...:     int_val = int(val, 16)
   ...:     int_ref = 0x700000000
   ...:
   ...:     return hex(int_ref | int_val)
   ...:

In [2]: r_alt = '0xE6'

In [3]: print(convert(r_alt))
0x7000000e6

ดีมาก - ขอบคุณ! มีวิธีใดที่จะกู้คืนการแม็พกลับไปเป็นค่าดีฟอลต์ด้วยคำสั่งนี้?
Aᴄʜᴇʀᴏɴғᴀɪʟ

1
@ Cᴀʟʟᴏᴅᴀᴄɪᴛʏเพื่อตั้งค่าปุ่มใด ๆ คุณก็เรียกใช้คำสั่งอีกครั้งกับมูลค่าที่สำคัญที่ทั้งในและSrc Dst
สตีเวนซีโฮเวล

สิ่งนี้จะเปลี่ยนเมื่อรีบูต ฉันสามารถเรียกใช้คำสั่งนี้อีกครั้งในการบู๊ตแต่ละครั้ง แต่ฉันไม่ต้องการทำสิ่งนี้ มีวิธีทำให้ถาวรหรือไม่
firebush

2
@firebush โพสต์นี้แนะนำให้ใช้ hook การเข้าสู่ระบบเพื่อทำคำสั่งเช่นนี้แบบถาวร: stackoverflow.com/a/46460200/629530
firebush

1
@ StevenC.Howell วิธีการเกี่ยวกับการรวมกันของฟังก์ชั่นการปรับเปลี่ยน? ตัวอย่างเช่นเครื่องหมายแบ็คสแลช\ ในแป้นพิมพ์ของฉันคือShift+Option+7สิ่งที่ฉันต้องการแทนที่ด้วยสิ่งที่ง่ายกว่าเช่นOption+.ที่ฉันใช้แทบจะไม่ ฉันจะทำอย่างไร ขอบคุณสำหรับความช่วยเหลือของคุณ.
Nanashi No Gombe

15

วิธีการทั่วไปที่ใช้งานง่ายกว่าคือการใช้Karabiner-Elementsซึ่งเป็นเวอร์ชั่นของ Karabiner ที่ใช้งานได้ในเซียร์รา


2
การปรับปรุงอย่างรวดเร็วในKarabiner องค์ประกอบ มันทำงานบน macOS High Sierra 10.13.3 (17D102) ฉันสลับแป้นคำสั่งและตัวเลือกทางขวาได้สำเร็จ
Steve Clement

แอพของบุคคลที่สามจะไม่ "กว้างกว่านี้" ทำไมทุกคนถึงไม่เกะกะระบบของพวกเขาด้วยแอพทำสิ่งต่าง ๆ ที่ติดตั้งไว้ในระบบปฏิบัติการ?
Bachsau

1
@Bachsau เป็นเรื่องทั่วไปที่ช่วยให้คุณทำสิ่งอื่น ๆ ได้มากมายเช่นการตั้งค่าคีย์ผสมมาโครและโปรไฟล์หรือการใช้การแชร์และ / หรือการกำหนดค่าการแมปแบบแบ่งสำหรับแป้นพิมพ์ภายในและภายนอก
Janosch

@Bachsau ฉันเก็บโปรไฟล์ที่แตกต่างกันสำหรับคีย์บอร์ดแต่ละอันของฉันดังนั้นมันจึงทำงานเหมือนกัน แอ
AlexG

9

นี่คือภาคผนวกของคำตอบของ Steven C. Howell

ฉันมี MacBook Pro ใหม่พร้อมแป้นพิมพ์สแกนดิเนเวียน รุ่นใหม่นี้ไม่มีปุ่ม Esc ซึ่งเป็นแต้มต่อสำคัญสำหรับฉัน

ฉันค้นพบว่าสิ่งต่อไปนี้จะแปลคีย์ ((ซ้ายบนซ้ายของ 1 และคีย์แท็บด้านบน) - ซึ่งฉันคิดว่าฉันไม่เคยใช้อะไรมาก่อนเลยในวันนี้ - เพื่อผลิต Esc

hidutil property --set '{"UserKeyMapping":[{"HIDKeyboardModifierMappingSrc":0x700000064,"HIDKeyboardModifierMappingDst":0x700000029}]}'

ในเอกสารประกอบของ Apple (เชื่อมโยงจากคำตอบของ Steven) สิ่งนี้มีชื่อเป็น "Keyboard Non-US \ and |" (0x64)

คีย์ "ที่ไม่ใช่ของสหรัฐ" หลายตัวนั้นหายากเพราะโดยทั่วไปแล้วจะอ้างถึงคีย์ที่มีป้ายกำกับต่าง ๆ บนแป้นพิมพ์ที่คุณใช้ (ฉันค้นพบด้วยว่า "สำเนียงหลุมฝังศพและตัวหนอน" หมายถึงคีย์ระหว่างการเลื่อนซ้ายและ z ซึ่งบนคีย์บอร์ดของฉันสร้าง<ขึ้นฉันไม่สามารถกำหนดได้ว่าคีย์ใดสอดคล้องกับ "ไม่ใช่สหรัฐอเมริกา#และ~" และไม่ได้ทดลองเพิ่มเติมเมื่อพบ กุญแจของฉัน) หากคุณต้องการทดลองลองใช้งานสคริปต์ในเครื่องจนกว่าคุณจะพบกุญแจที่คุณต้องการ:

for ((i=1;i<=128;++i)); do
    printf '0x7000000%0x\n' "$i"
    printf '{"UserKeyMapping":[{"HIDKeyboardModifierMappingSrc":0x7000000%0x,"HIDKeyboardModifierMappingDst":0x70000000a}]}' "$i" |
    xargs -0 hidutil property --set >/dev/null
    read -p "Type some stuff: "
    hidutil property --set '{"UserKeyMapping":[{}]}' >/dev/null
done

สิ่งนี้จะวนซ้ำรหัสและเปลี่ยนแปลงทีละครั้งด้วยความหวังว่าคุณจะสามารถค้นพบผ่านการลองผิดลองถูกซึ่งเป็นกุญแจที่ไม่มีประโยชน์สำหรับคุณโดยเฉพาะ ลองพิมพ์บางสิ่งเมื่อมันขอให้คุณ - ถ้าคุณได้รับgแทนที่จะเป็นอย่างที่คุณคาดไว้คุณจะพบรหัสกุญแจที่ถูกต้อง (เปลี่ยน0x70000000aเป็นอย่างอื่นหากgไม่ใช่ตัวเลือกที่สะดวกสำหรับคุณคุณอาจต้องการตั้งค่าgคีย์ใหม่หรือไม่) เมื่อคุณพิมพ์เสร็จให้กด Enter เพื่อดำเนินการต่อไปยังคีย์ถัดไป

สำหรับสิ่งที่คุ้มค่าคำสั่งสุดท้ายในลูปคือวิธีที่คุณปะทะUserKeyMappingการตั้งค่าทั้งหมด:

hidutil property --set '{"UserKeyMapping":[{}]}'

เมื่อคุณเริ่มเรียกใช้hidutil property --get UserKeyMappingมันผลิต

(null)

แต่ดูเหมือนว่าคุณไม่สามารถดึงกลับค่านี้เพื่อ zap การตั้งค่า (หรือมากกว่าก็ยอมรับ แต่ไม่สนใจอินพุตนี้)

(หากคุณไม่คุ้นเคยกับเทอร์มินัลเพียงแค่คัดลอก / วางสิ่งของจากforจนกว่าจะถึงพร้อมท์doneของคุณbash$หรือคล้ายกัน)

ตามคำถาม Stack Overflow ที่เกี่ยวข้องคุณสามารถวางคำสั่งในไฟล์สคริปต์ในโฮมไดเร็กตอรี่ของคุณและเพิ่มลงในlaunchdการกำหนดค่าของคุณเพื่อทำการเปลี่ยนแปลงนี้แบบถาวร

ในกรณีที่ผู้อ่านบางคนไม่สะดวกที่จะทำด้วยตัวเองนี่คือสคริปต์สั้น ๆ ที่ใช้สำหรับคุณ อีกครั้งเพียงคัดลอก / วางที่พรอมต์เทอร์มินัล

mkdir -p "$HOME"/bin
printf '%s\n' '#!/bin/sh' \
    'hidutil property --set '{"UserKeyMapping":[{"HIDKeyboardModifierMappingSrc":0x700000064,"HIDKeyboardModifierMappingDst":0x700000029}]}' \
    >"$HOME"/bin/userkeymapping
chmod 755 "$HOME"/bin/userkeymapping
cat<<: >"$HOME"/Library/LaunchAgents/userkeymapping.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>Label</key>
    <string>userkeymapping</string>
    <key>ProgramArguments</key>
    <array>
        <string>$HOME/bin/userkeymapping</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>
:
launchctl load "$HOME"/Library/LaunchAgents/userkeymapping.plist

เห็นได้ชัดว่าถ้าคุณลงเอยด้วยคีย์อื่นที่ไม่ใช่0x700000064คุณจำเป็นต้องเปลี่ยนมันในสคริปต์หรือในไฟล์"$HOME"/bin/userkeymappingมันจบลงด้วยการสร้างถ้าคุณวิ่งไปด้านบนแล้ว


รุ่นก่อนหน้าของคำตอบนี้สนับสนุนการใช้LoginHookแต่มันไม่ได้ผลสำหรับฉันและจากstackoverflow.com/a/22872222/874188ฉันเปลี่ยนไปใช้launchdวิธีการแทน
tripleee

ในฐานะที่เป็นแฟนตัวยงของ vi / vim แฟนนี่คือสิ่งที่ฉันกำลังมองหา ขอขอบคุณ.
Philip Kearns

7

หากสิ่งที่คุณต้องการทำคือทำการแมปคีย์เดียว

ตัวอย่าง: วิธีการ Remap Escape Key บน Mac

  1. ไปที่เมนู Apple และเลือก“ การตั้งค่าระบบ” จากนั้นไปที่แผงการตั้งค่า“ คีย์บอร์ด” และเลือกแท็บ“ คีย์บอร์ด”

  2. คลิกที่ปุ่ม“ ตัวปรับเปลี่ยนคีย์” ที่มุมล่างขวา

  3. เลือกคีย์ที่คุณต้องการทำการแมปใหม่และปรับเปลี่ยนเพื่อใช้ฟังก์ชัน Escape: Caps Lock (คำแนะนำของเรา) การควบคุมตัวเลือกหรือคำสั่ง
  4. เลือก“ Escape” จากรายการดรอปดาวน์ที่สอดคล้องกับคีย์ที่คุณต้องการทำการแมปใหม่เป็นคีย์ Escape ของฮาร์ดแวร์จากนั้นคลิก“ OK” เพื่อตั้งค่าการเปลี่ยนแปลง

การอ้างอิง


2
สิ่งนี้ช่วยให้คุณควบคุมปุ่มทั้งสี่ที่ระบุในคำตอบนี้เท่านั้น
tripleee

ถูกต้องและมีประโยชน์มาก หากใครบางคนต้องการที่จะทำการแมปกุญแจเพิ่มเติมพิจารณา
karabiner

ดูเหมือนว่าจะไม่มีวิธีระบุคีย์เฉพาะเช่น "right ⌥" อย่างใดอย่างหนึ่ง สิ่งที่คุณจะได้รับมากที่สุดคือสัญญาณเช่นเดียวกับใน "any ⌥"
Merchako

ถูกต้อง แต่ส่วนที่ดีคือคุณไม่ต้องติดตั้งอะไรก็ใช้งานได้
jasonleonhard

1

ในกรณีที่คุณอาจต้องการคืนค่าเริ่มต้น:

# setting it to 'null' does not work on my MBP High Sierra
hidutil property --set '{"UserKeyMapping":[]}'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.